Evidence type: [inference]
Time horizon: Later
Files: frontend/src/components/ui/Button.tsx, frontend/src/pages/Messages.tsx:1-1105, frontend/src/pages/Absences.tsx:352
What's happening: Tables, tabs, modals, dropdowns, badges, calendars are all hand-built inline per page; seven pages independently hand-roll the same table-wrapper pattern. This is the common root of UX-H2, UX-H5, UX-M1, UX-M6, and UX-M10.
Why it matters: Every finding above scales with page count under the current structure, and consistency will keep degrading as features are added.
Recommendation: Extract recurring patterns already present across pages (DataTable, Tabs, PageHeader, Badge, EmptyState, Modal) into ui/, adopted page by page during the UX-B7 data-wiring work.
Expected impact: Cross-cutting fixes become one-file changes.
Effort estimate: XL
Finding ID: UX-S1
Source: docs/agents/pre-launch-report.md
Evidence type: [inference]
Time horizon: Later
Files: frontend/src/components/ui/Button.tsx, frontend/src/pages/Messages.tsx:1-1105, frontend/src/pages/Absences.tsx:352
What's happening: Tables, tabs, modals, dropdowns, badges, calendars are all hand-built inline per page; seven pages independently hand-roll the same table-wrapper pattern. This is the common root of UX-H2, UX-H5, UX-M1, UX-M6, and UX-M10.
Why it matters: Every finding above scales with page count under the current structure, and consistency will keep degrading as features are added.
Recommendation: Extract recurring patterns already present across pages (DataTable, Tabs, PageHeader, Badge, EmptyState, Modal) into
ui/, adopted page by page during the UX-B7 data-wiring work.Expected impact: Cross-cutting fixes become one-file changes.
Effort estimate: XL
Finding ID: UX-S1
Source: docs/agents/pre-launch-report.md