diff --git a/packages/dashboard/app/components/MemoryView.css b/packages/dashboard/app/components/MemoryView.css index 1750f6b7ca..e3a45af888 100644 --- a/packages/dashboard/app/components/MemoryView.css +++ b/packages/dashboard/app/components/MemoryView.css @@ -10,11 +10,16 @@ The title row now comes from the shared .view-header (which supplies the --space overflow: hidden; } +/* +FNXC:Navigation 2026-06-22-02:30: +After the header migrated to the shared .view-header (which is flex-shrink:0), the sibling description and tab bar must also be flex-shrink:0. Without it they collapse under the flex column at constrained heights, letting .memory-view-content overlap the header/tabs. The scroll owner is the active tab pane (.memory-*-tab, flex:1 + min-height:0 + overflow-y:auto); the editor container keeps min-height:0 through the chain so CodeMirror bounds itself and never overruns the action bar. +*/ .memory-view-description { color: var(--text-muted); font-size: 13px; margin: 0; padding: 0 var(--space-lg); + flex-shrink: 0; } .memory-view-tabs { @@ -24,6 +29,7 @@ The title row now comes from the shared .view-header (which supplies the --space border-bottom: 1px solid var(--border); margin: var(--space-md) 0 var(--space-lg); padding: 0 var(--space-lg); + flex-shrink: 0; } .memory-view-tab { diff --git a/packages/dashboard/app/components/__tests__/WorkflowNodeEditor.css.test.ts b/packages/dashboard/app/components/__tests__/WorkflowNodeEditor.css.test.ts index 2e761da5ef..231d692587 100644 --- a/packages/dashboard/app/components/__tests__/WorkflowNodeEditor.css.test.ts +++ b/packages/dashboard/app/components/__tests__/WorkflowNodeEditor.css.test.ts @@ -173,7 +173,14 @@ describe("WorkflowNodeEditor mobile CSS contract", () => { expect(baseCss).toMatch(/\.wf-editor-modal\s*\{[^}]*min-width\s*:\s*640px\s*;/); - const editorModalRule = findRule(mobileBlocks, /\.wf-editor-modal,\s*\.wf-create-modal\s*\{[^}]*\}/); + // FN-6: the mobile viewport-takeover rule is scoped to the dialog presentation + // via :not(.wf-editor-modal--embedded) so the embedded main-view variant keeps its + // 100%-of-pane sizing. Match the scoped selector; .wf-create-modal has no embedded + // variant and stays unscoped. + const editorModalRule = findRule( + mobileBlocks, + /\.wf-editor-modal:not\(\.wf-editor-modal--embedded\),\s*\.wf-create-modal\s*\{[^}]*\}/, + ); expect(editorModalRule).toMatch(/width\s*:\s*100vw\s*;/); expect(editorModalRule).toMatch(/height\s*:\s*100dvh\s*;/); expect(editorModalRule).toMatch(/border-radius\s*:\s*0\s*;/); @@ -344,7 +351,13 @@ describe("WorkflowNodeEditor mobile CSS contract", () => { const editorCss = readComponentCss("WorkflowNodeEditor.css"); const mobileBlocks = extractMediaBlocks(editorCss, "(max-width: 768px)"); - const overlayRule = findRule(mobileBlocks, /\.modal-overlay:has\(\.wf-editor-modal\),\s*\.modal-overlay:has\(\.wf-create-modal\)\s*\{[^}]*\}/); + // FN-6: overlay stretch is likewise scoped to the dialog editor via + // :not(.wf-editor-modal--embedded) so the embedded variant's overlay-less main view + // isn't forced full-bleed. .wf-create-modal stays unscoped. + const overlayRule = findRule( + mobileBlocks, + /\.modal-overlay:has\(\.wf-editor-modal:not\(\.wf-editor-modal--embedded\)\),\s*\.modal-overlay:has\(\.wf-create-modal\)\s*\{[^}]*\}/, + ); expect(overlayRule).toMatch(/padding-top\s*:\s*0\s*;/); expect(overlayRule).toMatch(/align-items\s*:\s*stretch\s*;/); diff --git a/packages/dashboard/app/components/settings/sections/GeneralSection.tsx b/packages/dashboard/app/components/settings/sections/GeneralSection.tsx index 5474de89c7..d9cf656db0 100644 --- a/packages/dashboard/app/components/settings/sections/GeneralSection.tsx +++ b/packages/dashboard/app/components/settings/sections/GeneralSection.tsx @@ -190,7 +190,15 @@ export function GeneralSection({ scopeBanner, form, setForm, projectId, addToast {t("settings.general.controlsWhetherNewlyCreatedTasksHaveGitHubIssue", " Controls whether newly created tasks have GitHub issue tracking enabled by default. Individual tasks can still override this from the task detail modal. ")} - {t("settings.general.trackingIssuesUseThisTaskAposSTitle", " Tracking issues use this task's title. If a task has no title yet, Fusion can summarize its description using the title summarization model in Project Models. ")}{!form.autoSummarizeTitles && !form.useAiMergeCommitSummary && !form.githubTrackingEnabledByDefault + {/* + FNXC:SettingsGeneral 2026-06-22-03:20: + Tracking-issue helper copy. The FN-6771 JSX→t() extraction left a raw HTML + entity ("'") in this default string. As a t() argument the string is a + plain JS value (not JSX-decoded), so the entity rendered verbatim as the + literal "'" instead of an apostrophe. Use a real apostrophe so the copy + reads correctly in both modal and embedded presentations. + */} + {t("settings.general.trackingIssuesUseThisTaskAposSTitle", " Tracking issues use this task's title. If a task has no title yet, Fusion can summarize its description using the title summarization model in Project Models. ")}{!form.autoSummarizeTitles && !form.useAiMergeCommitSummary && !form.githubTrackingEnabledByDefault ? t("settings.general.enableSummarizationInProjectModelsToConfigureThatModel", " Enable summarization in Project Models to configure that model.") : ""} diff --git a/packages/i18n/locales/en/app.json b/packages/i18n/locales/en/app.json index 29045d0813..db8d1005c1 100644 --- a/packages/i18n/locales/en/app.json +++ b/packages/i18n/locales/en/app.json @@ -5741,7 +5741,7 @@ "showTheFloatingChatButtonInTheDashboard": "Show the floating chat button in the dashboard. Chat is still accessible from the Chat tab in the mobile navigation.", "taskPrefix": "Task Prefix", "todoThreshold": "Todo threshold", - "trackingIssuesUseThisTaskAposSTitle": " Tracking issues use this task's title. If a task has no title yet, Fusion can summarize its description using the title summarization model in Project Models. ", + "trackingIssuesUseThisTaskAposSTitle": " Tracking issues use this task's title. If a task has no title yet, Fusion can summarize its description using the title summarization model in Project Models. ", "updateAvailablePrefix": "v{{version}} available", "updateCheckFailed": "Failed to check for updates", "updateFailed": "Update failed",