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]) => `
+