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}}