Summary
OverflowTabs.vue (#1114) is the tab primitive — overflowing tabs collapse into a counted "+N more" menu, re-measured on resize (principles 9/10). Three audited surfaces hand-roll tab/nav strips instead, and the raw-color scanner counts 13 overflow-x-auto strips repo-wide that are adoption candidates.
Context
Found by the 2026-07-31 design-system audit (dev@022710dc). The worst case is NavBar: its link row is an overflow-x-auto strip with the scrollbar suppressed, so overflowed links are invisible and undiscoverable — there is no signal that more navigation exists. Settings mitigated its ten-tab overflow by widening the page (#1862) rather than adopting the primitive, so sub-7xl widths still overflow silently.
Acceptance Criteria
Technical Notes
Scanner candidates (overflow-x-auto, tab-nav-shaped) to triage:
src/frontend/src/components/DashboardPanel.vue:283
src/frontend/src/components/FileSharingPanel.vue:55
src/frontend/src/components/LoopsPanel.vue:314
src/frontend/src/components/NeverminedPanel.vue:187
src/frontend/src/components/SharingPanel.vue:232
src/frontend/src/components/process/RoleMatrix.vue:63
src/frontend/src/components/reports/ReportTable.vue:2
src/frontend/src/components/settings/McpKeysTab.vue:34 (+ :260)
src/frontend/src/views/enterprise/Audit.vue:619 (+ :667)
Several of these are bounded tables where horizontal scroll inside the container is correct per principle 7 — triage, don't blanket-convert. Advisory from the audit: src/frontend/src/views/enterprise/Audit.vue:526 hand-rolls a two-tab role="tablist" pill strip (cannot overflow, but diverges from the primitive).
Summary
OverflowTabs.vue(#1114) is the tab primitive — overflowing tabs collapse into a counted "+N more" menu, re-measured on resize (principles 9/10). Three audited surfaces hand-roll tab/nav strips instead, and the raw-color scanner counts 13overflow-x-autostrips repo-wide that are adoption candidates.Context
Found by the 2026-07-31 design-system audit (dev@022710dc). The worst case is NavBar: its link row is an
overflow-x-autostrip with the scrollbar suppressed, so overflowed links are invisible and undiscoverable — there is no signal that more navigation exists. Settings mitigated its ten-tab overflow by widening the page (#1862) rather than adopting the primitive, so sub-7xl widths still overflow silently.Acceptance Criteria
src/frontend/src/views/Settings.vue:23renders its tabs through OverflowTabssrc/frontend/src/views/Operations.vue:22renders its six tabs through OverflowTabs (v-model on activeTab)src/frontend/src/components/NavBar.vue:25nav links use a priority+ pattern: visible links + counted "More ▾" menu, no hidden-scrollbar overflowTechnical Notes
Scanner candidates (
overflow-x-auto, tab-nav-shaped) to triage:src/frontend/src/components/DashboardPanel.vue:283src/frontend/src/components/FileSharingPanel.vue:55src/frontend/src/components/LoopsPanel.vue:314src/frontend/src/components/NeverminedPanel.vue:187src/frontend/src/components/SharingPanel.vue:232src/frontend/src/components/process/RoleMatrix.vue:63src/frontend/src/components/reports/ReportTable.vue:2src/frontend/src/components/settings/McpKeysTab.vue:34(+ :260)src/frontend/src/views/enterprise/Audit.vue:619(+ :667)Several of these are bounded tables where horizontal scroll inside the container is correct per principle 7 — triage, don't blanket-convert. Advisory from the audit:
src/frontend/src/views/enterprise/Audit.vue:526hand-rolls a two-tabrole="tablist"pill strip (cannot overflow, but diverges from the primitive).