FN-7195: keep model names readable in token table

Keep Summary token-usage model labels readable in narrow task detail layouts.

- Add a desktop token table minimum width so right-dock layouts scroll instead of collapsing model labels.
- Restore normal model-name wrapping while preserving mobile stacked-card behavior.
- Cover the responsive CSS contract and add a patch changeset for the published package.

Files changed:
 .changeset/fn-7195-model-name-wrap.md                       |  7 +++++++
 packages/dashboard/app/components/TaskDetailModal.css       |  8 +++++++-
 .../__tests__/TaskDetailModal.summary-tab.test.tsx          | 13 ++++++++++++-
 3 files changed, 26 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-7195

Fusion-Task-Lineage: 97f972f6-ac6e-4632-86ed-b3184c7abbc2

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
This commit is contained in:
gsxdsm
2026-06-28 09:47:07 -07:00
parent 631e8fc675
commit f0b3003c0a
3 changed files with 26 additions and 2 deletions

View File

@@ -0,0 +1,7 @@
---
"@runfusion/fusion": patch
---
summary: Keep Summary token table model names readable in narrow task detail panels.
category: fix
dev: Adds token-table CSS min-width and wrap-contract regression coverage for right-dock layouts.

View File

@@ -1645,6 +1645,9 @@ The done-task Summary tab is a scrollable overview composed from existing detail
/* /*
FNXC:TaskDetailSummaryTokenCost 2026-06-27-00:00: FNXC:TaskDetailSummaryTokenCost 2026-06-27-00:00:
The done-task Summary token-cost section must reuse task-summary card hierarchy while showing per-model counts and cost without hardcoded colors or spacing. Mobile converts table rows to stacked cards so the modal and right dock do not trap horizontal scrolling. The done-task Summary token-cost section must reuse task-summary card hierarchy while showing per-model counts and cost without hardcoded colors or spacing. Mobile converts table rows to stacked cards so the modal and right dock do not trap horizontal scrolling.
FNXC:TaskDetailSummaryTokenCost 2026-06-28-00:00:
The desktop table needs a token-scale min-width and non-anywhere model-name wrapping so narrow right-dock containers scroll horizontally instead of collapsing MODEL values to one character per line.
*/ */
.task-summary-token-table-wrap { .task-summary-token-table-wrap {
width: 100%; width: 100%;
@@ -1653,6 +1656,7 @@ The done-task Summary token-cost section must reuse task-summary card hierarchy
.task-summary-token-table { .task-summary-token-table {
width: 100%; width: 100%;
min-width: calc(var(--space-2xl) * 16);
border-collapse: collapse; border-collapse: collapse;
color: var(--text); color: var(--text);
} }
@@ -1693,7 +1697,8 @@ The done-task Summary token-cost section must reuse task-summary card hierarchy
} }
.task-summary-model-label span:last-child { .task-summary-model-label span:last-child {
overflow-wrap: anywhere; overflow-wrap: normal;
word-break: normal;
} }
.task-summary-cost-unavailable { .task-summary-cost-unavailable {
@@ -1801,6 +1806,7 @@ The done-task Summary token-cost section must reuse task-summary card hierarchy
.task-summary-token-table th, .task-summary-token-table th,
.task-summary-token-table td { .task-summary-token-table td {
display: block; display: block;
min-width: 0;
} }
.task-summary-token-table thead { .task-summary-token-table thead {

View File

@@ -387,9 +387,20 @@ describe("TaskDetailModal Summary tab", () => {
it("keeps token-cost summary styling responsive without hardcoded colors", () => { it("keeps token-cost summary styling responsive without hardcoded colors", () => {
const css = readDashboardStylesSource(); const css = readDashboardStylesSource();
const tokenTableRule = css.match(/\.task-summary-token-table\s*\{[^}]*\}/)?.[0] ?? "";
const modelNameRule = css.match(/\.task-summary-model-label span:last-child\s*\{[^}]*\}/)?.[0] ?? "";
const mobileTokenBlock = css.slice(css.indexOf("@media (max-width: 768px)"), css.indexOf("/* Spec tab layout"));
expect(css).toContain(".task-summary-token-table"); expect(css).toContain(".task-summary-token-table");
expect(tokenTableRule).toMatch(/min-width:\s*calc\(var\(--space-2xl\)\s*\*\s*16\)/);
expect(modelNameRule).toContain("overflow-wrap: normal");
expect(modelNameRule).toContain("word-break: normal");
expect(modelNameRule).not.toContain("overflow-wrap: anywhere");
expect(css).toContain("@media (max-width: 768px)"); expect(css).toContain("@media (max-width: 768px)");
expect(css).toContain(".task-summary-token-table td::before"); expect(mobileTokenBlock).toContain(".task-summary-token-table-wrap");
expect(mobileTokenBlock).toContain("overflow-x: visible");
expect(mobileTokenBlock).toContain(".task-summary-token-table td::before");
expect(mobileTokenBlock).toContain("min-width: 0");
expect(css).toContain("var(--color-warning)"); expect(css).toContain("var(--color-warning)");
expect(css).not.toMatch(/task-summary-token[^{}]*#[0-9a-fA-F]{3,8}/); expect(css).not.toMatch(/task-summary-token[^{}]*#[0-9a-fA-F]{3,8}/);
}); });