diff --git a/packages/dashboard/app/__tests__/browser-layout-smoke-fixture.test.ts b/packages/dashboard/app/__tests__/browser-layout-smoke-fixture.test.ts index 525bab7b75..dbc6340f83 100644 --- a/packages/dashboard/app/__tests__/browser-layout-smoke-fixture.test.ts +++ b/packages/dashboard/app/__tests__/browser-layout-smoke-fixture.test.ts @@ -11,4 +11,19 @@ describe("browser layout smoke fixture", () => { expect(html).toContain("pr-panel-check-chip--error"); expect(html).toContain("pr-checks__details-link"); }); + + it("includes localized Quick Add Save fixtures for Board and List composers", () => { + const html = createSmokeHtml(); + expect(html).toContain('data-smoke="quick-add-save-fixtures"'); + expect(html).toContain('data-smoke="quick-add-save-board-minimum-fr"'); + expect(html).toContain('data-smoke="quick-add-save-list-minimum-fr"'); + expect(html).toContain("quick-entry--single-line"); + expect(html).toContain('data-smoke="quick-add-save-row"'); + expect(html).toContain('data-smoke="quick-add-save-button"'); + expect(html).toContain('data-testid="quick-entry-session-advisor-toggle"'); + expect(html.match(/data-testid="quick-entry-(?:attach|github-toggle|session-advisor-toggle|priority-button|fast-toggle)"/g)).toHaveLength(120); + for (const label of ["Save", "Guardar", "Enregistrer", "저장", "保存", "儲存"]) { + expect(html).toContain(label); + } + }); }); diff --git a/packages/dashboard/app/components/QuickEntryBox.css b/packages/dashboard/app/components/QuickEntryBox.css index a7171ced28..09e141c195 100644 --- a/packages/dashboard/app/components/QuickEntryBox.css +++ b/packages/dashboard/app/components/QuickEntryBox.css @@ -247,7 +247,7 @@ line is strictly better than a clipped label. align-items: center; flex-wrap: wrap; justify-content: flex-end; - gap: var(--space-sm); + gap: var(--space-xs); flex: 0 0 auto; margin-left: auto; } @@ -309,6 +309,13 @@ the mobile touch-target block below (FN-5751: never a breakpoint-only fix). FNXC:QuickAddActionRow 2026-07-16-14:00: FN-8147 replaces the spacing-derived fixed height with a pinned literal root token so every shadcn theme retains the default 28px desktop control height. + +FNXC:QuickAddActionRow 2026-07-18-11:22: +FN-8299 requires Save and all five production icon controls, including Session +Advisor, to fit within a 300px Board column without clipping or horizontal +overflow. Use the compact token gap at desktop widths too; the mobile rule +already has this value, while the previous desktop gap left the localized Save +label short of the available content width. */ .quick-entry-actions .btn, .quick-entry-actions .wf-optional-steps-dropdown-trigger { diff --git a/packages/dashboard/scripts/browser-layout-smoke.mjs b/packages/dashboard/scripts/browser-layout-smoke.mjs index 007344292b..e2907f7654 100644 --- a/packages/dashboard/scripts/browser-layout-smoke.mjs +++ b/packages/dashboard/scripts/browser-layout-smoke.mjs @@ -116,6 +116,49 @@ export function createSmokeHtml() { `) .join(""); + /* + FNXC:QuickAddActionRow 2026-07-17-12:00: + FN-8299 protects the localized Quick Add Save label with a production-CSS browser fixture. + The Board column's 300px effective minimum content width is the supported boundary: below it, + a fixed-height single-line action cannot promise an unbreakable label without changing the UX. + Render every supported translation here so the smoke measures the widest emitted-font label + instead of assuming French is widest from character count. + + FNXC:QuickAddActionRow 2026-07-18-11:22: + The fixture must include all five production icon controls before Save, including the session + advisor toggle. Omitting it understates the primary group's minimum width and could conceal a + 300px overflow or wrap regression on either Board or List. + */ + const localizedSaveLabels = [ + ["en", "Save"], + ["es", "Guardar"], + ["fr", "Enregistrer"], + ["ko", "저장"], + ["zh-CN", "保存"], + ["zh-TW", "儲存"], + ]; + const quickAddComposerFixtures = [ + ["board", "", "minimum", "300px", "disabled"], + ["board", "", "wide", "600px", "disabled"], + ["list", "quick-entry--single-line", "minimum", "300px", "enabled"], + ["list", "quick-entry--single-line", "wide", "600px", "enabled"], + ].flatMap(([surface, modifier, width, maxWidth, state]) => localizedSaveLabels.map(([locale, label]) => ` +
+
+
+
+ + + + + + +
+
+
+
+ `)).join(""); + return ` @@ -191,6 +234,10 @@ export function createSmokeHtml() { +
+ ${quickAddComposerFixtures} +
+