From dafcf8ecb4cebc1ed859b50e7df8ed874442e9b5 Mon Sep 17 00:00:00 2001 From: Pigway Date: Thu, 8 Oct 2026 19:40:05 +0800 Subject: [PATCH] Enlarge image viewer with fit and actual-size modes --- pigway_frame_flow/web/app.js | 14 +++++++++++++- pigway_frame_flow/web/i18n.js | 3 +++ pigway_frame_flow/web/style.css | 9 +++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/pigway_frame_flow/web/app.js b/pigway_frame_flow/web/app.js index f7468fe..07b345e 100644 --- a/pigway_frame_flow/web/app.js +++ b/pigway_frame_flow/web/app.js @@ -42,7 +42,19 @@ function login(){ $('#main').innerHTML=`
${buttons('modal-cancel','cancel')}${buttons('modal-confirm','confirm',true)}
`);bind('modal-confirm',async()=>{await fn();$('#modal').close();});} function detail(label,value){return `
${t(label)}${esc(value)}
`;} function liveWriteAllowed(){return state.settings?.mock||state.settings?.write_enabled;} diff --git a/pigway_frame_flow/web/i18n.js b/pigway_frame_flow/web/i18n.js index 0f2f6ed..798b94d 100644 --- a/pigway_frame_flow/web/i18n.js +++ b/pigway_frame_flow/web/i18n.js @@ -40,3 +40,6 @@ Object.assign(window.MESSAGES.zh,{cloudKeepLatest:'随机任务云端仅保留 Object.assign(window.MESSAGES.en,{cloudKeepLatest:'Each random task keeps its latest confirmed cloud image. Uploaded local favorites stay. Failed replacements never evict the last good image.',taskOrigin:'Task generated',originFilter:'Filter by origin',origin_all:'All origins',origin_manual:'Manual upload',origin_task:'Task generated',origin_external:'External push',origin_template:'Template generated',origin_unknown:'Unknown origin',allTasks:'All tasks',selectImage:'Select image',selectAll:'Select / deselect all',deleteSelected:'Delete selected',selectImagesFirst:'Select images first',deleteSelectedConfirm:'Delete selected local images? NAS originals remain untouched.',batchFailed:'Failed items:'}); Object.assign(window.MESSAGES.zh,{previousPage:'上一页',nextPage:'下一页'});Object.assign(window.MESSAGES.en,{previousPage:'Previous page',nextPage:'Next page'}); + +Object.assign(window.MESSAGES.zh,{fitScreen:'适应屏幕',actualSize:'原始尺寸(1:1)'}); +Object.assign(window.MESSAGES.en,{fitScreen:'Fit to screen',actualSize:'Actual size (1:1)'}); diff --git a/pigway_frame_flow/web/style.css b/pigway_frame_flow/web/style.css index b1523bf..4d9574d 100644 --- a/pigway_frame_flow/web/style.css +++ b/pigway_frame_flow/web/style.css @@ -54,3 +54,12 @@ input[type="file"]::file-selector-button{margin-inline-end:12px} .source-items button small{display:block;margin-top:8px;color:var(--muted)} .history-table [data-reconcile]{white-space:nowrap;overflow-wrap:normal;margin-top:8px} + +/* Image dialogs use the viewport; forms keep their existing compact width. */ +dialog.image-viewer{width:calc(100vw - 32px);max-width:1600px;max-height:calc(100dvh - 32px);padding:20px;overflow:auto} +.image-viewer-toolbar{margin:12px 0} +.image-viewer-toolbar button[aria-pressed="true"]{background:var(--accent);color:var(--panel)} +.image-viewer-viewport{max-height:calc(100dvh - 220px);overflow:auto;text-align:center;background:var(--soft);border-radius:12px} +.image-viewer-viewport img{display:block;width:auto;height:auto;max-width:100%;max-height:calc(100dvh - 220px);object-fit:contain;margin:0 auto} +.image-viewer-viewport.actual-size img{width:auto;height:auto;max-width:none;max-height:none;margin:0} +@media(max-width:600px){dialog.image-viewer{width:calc(100vw - 16px);padding:12px}.image-viewer-viewport,.image-viewer-viewport img{max-height:calc(100dvh - 240px)}.image-viewer-viewport.actual-size img{max-height:none}}