@titan-design/react-ui 0.12.1 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +60 -47
- package/dist/bodymap.js +856 -736
- package/dist/bodymap.js.map +1 -1
- package/dist/bodymap.mjs +858 -738
- package/dist/bodymap.mjs.map +1 -1
- package/dist/index.d.mts +1431 -237
- package/dist/index.d.ts +1431 -237
- package/dist/index.js +6506 -4781
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +6280 -4642
- package/dist/index.mjs.map +1 -1
- package/dist/{pages-B1hqnGIC.d.ts → pages-CsjsUn0G.d.ts} +51 -16
- package/dist/{pages-CvsFqNtx.d.mts → pages-ZbT_pD_U.d.mts} +51 -16
- package/dist/pages.d.mts +1 -1
- package/dist/pages.d.ts +1 -1
- package/dist/pages.js +1919 -1937
- package/dist/pages.js.map +1 -1
- package/dist/pages.mjs +1927 -1945
- package/dist/pages.mjs.map +1 -1
- package/dist/theme/index.d.mts +225 -140
- package/dist/theme/index.d.ts +225 -140
- package/dist/theme/index.js +298 -319
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/index.mjs +283 -315
- package/dist/theme/index.mjs.map +1 -1
- package/dist/theme/tokens-css.js +145 -24
- package/dist/theme/tokens-css.js.map +1 -1
- package/dist/theme/tokens-css.mjs +145 -24
- package/dist/theme/tokens-css.mjs.map +1 -1
- package/dist/theme/tokens.d.mts +128 -11
- package/dist/theme/tokens.d.ts +128 -11
- package/dist/theme/tokens.js +126 -26
- package/dist/theme/tokens.js.map +1 -1
- package/dist/theme/tokens.mjs +124 -27
- package/dist/theme/tokens.mjs.map +1 -1
- package/docs/audits/2026-09-08-critique-addenda.md +51 -0
- package/docs/audits/2026-09-08-library-critique.md +212 -0
- package/docs/library-roadmap.md +99 -0
- package/docs/render-testing-pattern.md +130 -0
- package/package.json +1 -1
- package/src/arch/Architecture.stories.tsx +3 -1
- package/src/arch/arch-graph.freshness.test.ts +52 -0
- package/src/arch/arch-graph.json +4989 -1583
- package/src/components/custom/ActiveWork/CoChangeChip.stories.tsx +44 -0
- package/src/components/custom/ActiveWork/CoChangeChip.test.tsx +29 -0
- package/src/components/custom/ActiveWork/CoChangeChip.tsx +48 -0
- package/src/components/custom/ActiveWork/Eyebrow.stories.tsx +25 -0
- package/src/components/custom/ActiveWork/Eyebrow.test.tsx +16 -0
- package/src/components/custom/ActiveWork/Eyebrow.tsx +26 -0
- package/src/components/custom/ActiveWork/FileActivityDetail.stories.tsx +50 -0
- package/src/components/custom/ActiveWork/FileActivityDetail.test.tsx +66 -0
- package/src/components/custom/ActiveWork/FileActivityDetail.tsx +202 -0
- package/src/components/custom/ActiveWork/FileActivityRow.stories.tsx +70 -0
- package/src/components/custom/ActiveWork/FileActivityRow.test.tsx +67 -0
- package/src/components/custom/ActiveWork/FileActivityRow.tsx +130 -0
- package/src/components/custom/ActiveWork/FileHistoryExplorer.stories.tsx +84 -0
- package/src/components/custom/ActiveWork/FileHistoryExplorer.test.tsx +99 -0
- package/src/components/custom/ActiveWork/FileHistoryExplorer.tsx +138 -0
- package/src/components/custom/ActiveWork/FilePathLabel.stories.tsx +39 -0
- package/src/components/custom/ActiveWork/FilePathLabel.test.tsx +53 -0
- package/src/components/custom/ActiveWork/FilePathLabel.tsx +63 -0
- package/src/components/custom/ActiveWork/InitiativeBrief.stories.tsx +50 -0
- package/src/components/custom/ActiveWork/InitiativeBrief.test.tsx +62 -0
- package/src/components/custom/ActiveWork/InitiativeBrief.tsx +182 -0
- package/src/components/custom/ActiveWork/InitiativeCard.stories.tsx +73 -0
- package/src/components/custom/ActiveWork/InitiativeCard.test.tsx +68 -0
- package/src/components/custom/ActiveWork/InitiativeCard.tsx +136 -0
- package/src/components/custom/ActiveWork/InitiativeHeader.stories.tsx +59 -0
- package/src/components/custom/ActiveWork/InitiativeHeader.test.tsx +40 -0
- package/src/components/custom/ActiveWork/InitiativeHeader.tsx +73 -0
- package/src/components/custom/ActiveWork/InitiativeReader.stories.tsx +145 -0
- package/src/components/custom/ActiveWork/OpenLoops.stories.tsx +58 -0
- package/src/components/custom/ActiveWork/OpenLoops.test.tsx +61 -0
- package/src/components/custom/ActiveWork/OpenLoops.tsx +107 -0
- package/src/components/custom/ActiveWork/PortfolioOverview.stories.tsx +101 -0
- package/src/components/custom/ActiveWork/PortfolioOverview.test.tsx +81 -0
- package/src/components/custom/ActiveWork/PortfolioOverview.tsx +83 -0
- package/src/components/custom/ActiveWork/README.md +305 -0
- package/src/components/custom/ActiveWork/SessionDetail.stories.tsx +71 -0
- package/src/components/custom/ActiveWork/SessionDetail.test.tsx +84 -0
- package/src/components/custom/ActiveWork/SessionDetail.tsx +180 -0
- package/src/components/custom/ActiveWork/SessionList.stories.tsx +69 -0
- package/src/components/custom/ActiveWork/SessionList.test.tsx +78 -0
- package/src/components/custom/ActiveWork/SessionList.tsx +103 -0
- package/src/components/custom/ActiveWork/SessionListItem.stories.tsx +64 -0
- package/src/components/custom/ActiveWork/SessionListItem.test.tsx +62 -0
- package/src/components/custom/ActiveWork/SessionListItem.tsx +152 -0
- package/src/components/custom/ActiveWork/SessionReader.stories.tsx +113 -0
- package/src/components/custom/ActiveWork/SeverityLabel.stories.tsx +51 -0
- package/src/components/custom/ActiveWork/SeverityLabel.test.tsx +68 -0
- package/src/components/custom/ActiveWork/SeverityLabel.tsx +97 -0
- package/src/components/custom/ActiveWork/TaskRow.stories.tsx +63 -0
- package/src/components/custom/ActiveWork/TaskRow.test.tsx +112 -0
- package/src/components/custom/ActiveWork/TaskRow.tsx +176 -0
- package/src/components/custom/ActiveWork/TaskTable.stories.tsx +123 -0
- package/src/components/custom/ActiveWork/TaskTable.test.tsx +233 -0
- package/src/components/custom/ActiveWork/TaskTable.tsx +321 -0
- package/src/components/custom/ActiveWork/active-work-depth.test.tsx +102 -0
- package/src/components/custom/ActiveWork/file-history-fixture.ts +91 -0
- package/src/components/custom/ActiveWork/format-time.test.ts +23 -0
- package/src/components/custom/ActiveWork/format-time.ts +32 -0
- package/src/components/custom/ActiveWork/index.ts +19 -0
- package/src/components/custom/ActiveWork/initiative-fixture.ts +104 -0
- package/src/components/custom/ActiveWork/session-fixture.ts +267 -0
- package/src/components/custom/ActiveWork/session-linkers.ts +56 -0
- package/src/components/custom/ActiveWork/task-list-fixture.ts +97 -0
- package/src/components/custom/CircularTimer/CircularTimer.stories.tsx +12 -6
- package/src/components/custom/DateTime/DateTime.stories.tsx +2 -1
- package/src/components/custom/DateTime/DateTime.test.tsx +3 -1
- package/src/components/custom/EmptyState/EmptyState.stories.tsx +22 -9
- package/src/components/custom/EmptyState/EmptyState.test.tsx +7 -13
- package/src/components/custom/EmptyState/EmptyState.tsx +4 -18
- package/src/components/custom/Fatigue/DualGhostSpark.stories.tsx +4 -3
- package/src/components/custom/Fatigue/FatigueLights.stories.tsx +2 -2
- package/src/components/custom/Fatigue/GhostSpark.stories.tsx +4 -3
- package/src/components/custom/Fatigue/LiveFatigueCard.stories.tsx +2 -2
- package/src/components/custom/Fatigue/LiveFatigueCard.tsx +8 -4
- package/src/components/custom/Fatigue/LiveFatiguePanel.stories.tsx +116 -6
- package/src/components/custom/Fatigue/LiveFatiguePanel.test.tsx +134 -0
- package/src/components/custom/Fatigue/LiveFatiguePanel.tsx +54 -83
- package/src/components/custom/Fatigue/README.md +40 -3
- package/src/components/custom/Fatigue/RomProgressionChart.stories.tsx +2 -2
- package/src/components/custom/Fatigue/SilverRedPalette.stories.tsx +2 -1
- package/src/components/custom/Fatigue/VelocityHero.stories.tsx +4 -3
- package/src/components/custom/Fatigue/VerdictHero.stories.tsx +2 -2
- package/src/components/custom/Fatigue/fatigue-mock.test.ts +0 -5
- package/src/components/custom/Fatigue/fatigue-mock.ts +2 -10
- package/src/components/custom/Fatigue/fatigue-tokens.ts +12 -0
- package/src/components/custom/Fatigue/index.ts +17 -5
- package/src/components/custom/Fatigue/panel-layout.test.ts +149 -0
- package/src/components/custom/Fatigue/panel-layout.ts +185 -0
- package/src/components/custom/Gauge/Gauge.stories.tsx +6 -3
- package/src/components/custom/Gauge/Gauge.test.tsx +1 -1
- package/src/components/custom/Gauge/Gauge.tsx +7 -2
- package/src/components/custom/Metric/Metric.stories.tsx +10 -1
- package/src/components/custom/Metric/Metric.test.tsx +1 -3
- package/src/components/custom/Metric/Metric.tsx +5 -20
- package/src/components/custom/Prose/MarkdownProse.stories.tsx +88 -0
- package/src/components/custom/Prose/MarkdownProse.test.tsx +87 -0
- package/src/components/custom/Prose/MarkdownProse.tsx +201 -0
- package/src/components/custom/Prose/README.md +58 -0
- package/src/components/custom/Prose/index.ts +1 -0
- package/src/components/custom/Scatter/Scatter.stories.tsx +55 -14
- package/src/components/custom/Scatter/Scatter.test.tsx +2 -2
- package/src/components/custom/Scatter/Scatter.tsx +122 -18
- package/src/components/custom/Sidebar/Sidebar.stories.tsx +41 -8
- package/src/components/custom/Sidebar/Sidebar.test.tsx +5 -1
- package/src/components/custom/Sidebar/Sidebar.tsx +16 -33
- package/src/components/custom/Table/Table.stories.tsx +99 -16
- package/src/components/custom/Table/Table.test.tsx +273 -86
- package/src/components/custom/Table/Table.tsx +159 -67
- package/src/components/custom/Table/column-fit.test.ts +75 -0
- package/src/components/custom/Table/column-fit.ts +116 -0
- package/src/components/custom/Table/index.ts +9 -0
- package/src/components/custom/TimerReadout/TimerReadout.stories.tsx +8 -6
- package/src/components/custom/Treemap/Treemap.stories.tsx +15 -12
- package/src/components/custom/Treemap/Treemap.test.tsx +1 -1
- package/src/components/custom/Treemap/Treemap.tsx +11 -3
- package/src/components/custom/Typography/Typography.stories.tsx +28 -1
- package/src/components/custom/Typography/Typography.test.tsx +34 -0
- package/src/components/custom/Typography/Typography.tsx +6 -0
- package/src/components/custom/Typography/index.ts +1 -8
- package/src/components/custom/Workout/ActiveWorkoutPage.stories.tsx +11 -2
- package/src/components/custom/Workout/BaseBadge.stories.tsx +27 -11
- package/src/components/custom/Workout/BaseBadge.test.tsx +31 -11
- package/src/components/custom/Workout/BaseBadge.tsx +6 -2
- package/src/components/custom/Workout/BodyMap.stories.tsx +4 -1
- package/src/components/custom/Workout/BodyMap.tsx +8 -4
- package/src/components/custom/Workout/BodyMapDetailPanel.stories.tsx +28 -6
- package/src/components/custom/Workout/BodyMapDetailPanel.test.tsx +11 -15
- package/src/components/custom/Workout/BodyMapDetailPanel.tsx +50 -12
- package/src/components/custom/Workout/CapacityBandChart.stories.tsx +12 -9
- package/src/components/custom/Workout/CapacityBandChart.test.tsx +24 -51
- package/src/components/custom/Workout/CapacityBandChart.tsx +144 -111
- package/src/components/custom/Workout/DeviationBar.stories.tsx +1 -1
- package/src/components/custom/Workout/DeviationBar.test.tsx +10 -4
- package/src/components/custom/Workout/DeviationBar.tsx +24 -16
- package/src/components/custom/Workout/DualVelocityStrip.stories.tsx +183 -0
- package/src/components/custom/Workout/DualVelocityStrip.test.tsx +32 -18
- package/src/components/custom/Workout/ExerciseCard.stories.tsx +12 -11
- package/src/components/custom/Workout/ExerciseCard.test.tsx +52 -22
- package/src/components/custom/Workout/ExerciseCard.tsx +99 -183
- package/src/components/custom/Workout/ExerciseCardHeading.stories.tsx +95 -12
- package/src/components/custom/Workout/ExerciseCardHeading.test.tsx +189 -1
- package/src/components/custom/Workout/ExerciseCardHeading.tsx +167 -18
- package/src/components/custom/Workout/ExerciseDetailPage.stories.tsx +9 -1
- package/src/components/custom/Workout/ExerciseDetailPage.tsx +3 -2
- package/src/components/custom/Workout/ExerciseHeading.stories.tsx +8 -8
- package/src/components/custom/Workout/ExerciseHeading.tsx +194 -46
- package/src/components/custom/Workout/ExerciseIndicator.stories.tsx +12 -9
- package/src/components/custom/Workout/ExerciseIndicator.test.tsx +27 -11
- package/src/components/custom/Workout/ExerciseIndicator.tsx +14 -15
- package/src/components/custom/Workout/FatigueMeter.stories.tsx +5 -5
- package/src/components/custom/Workout/InputBar.stories.tsx +4 -5
- package/src/components/custom/Workout/InputBar.tsx +4 -2
- package/src/components/custom/Workout/IntensityBar.stories.tsx +1 -1
- package/src/components/custom/Workout/IntensityBar.test.tsx +5 -1
- package/src/components/custom/Workout/IntensityBar.tsx +8 -3
- package/src/components/custom/Workout/LiveAuraFrame.stories.tsx +5 -4
- package/src/components/custom/Workout/MesoCard.stories.tsx +4 -1
- package/src/components/custom/Workout/MesoCard.test.tsx +7 -18
- package/src/components/custom/Workout/MesoCard.tsx +14 -10
- package/src/components/custom/Workout/MesoProgressBar.stories.tsx +1 -1
- package/src/components/custom/Workout/MesoProgressBar.test.tsx +18 -11
- package/src/components/custom/Workout/MesoProgressBar.tsx +15 -13
- package/src/components/custom/Workout/MesoStatusCard.stories.tsx +2 -1
- package/src/components/custom/Workout/MesoStatusCard.test.tsx +14 -44
- package/src/components/custom/Workout/MesoStatusCard.tsx +20 -33
- package/src/components/custom/Workout/MetricTiles.stories.tsx +3 -2
- package/src/components/custom/Workout/MuscleGroupChip.stories.tsx +2 -8
- package/src/components/custom/Workout/MuscleGroupChip.test.tsx +23 -31
- package/src/components/custom/Workout/MuscleGroupChip.tsx +28 -67
- package/src/components/custom/Workout/PlaceholderStrip.stories.tsx +9 -4
- package/src/components/custom/Workout/PlaceholderStrip.test.tsx +17 -10
- package/src/components/custom/Workout/PlaceholderStrip.tsx +9 -8
- package/src/components/custom/Workout/PrBadge.stories.tsx +2 -1
- package/src/components/custom/Workout/PrBadge.test.tsx +3 -9
- package/src/components/custom/Workout/PrBadge.tsx +13 -17
- package/src/components/custom/Workout/PrHistoryModal.stories.tsx +16 -3
- package/src/components/custom/Workout/PrHistoryModal.test.tsx +13 -36
- package/src/components/custom/Workout/PrHistoryModal.tsx +8 -4
- package/src/components/custom/Workout/ProgramPlanningPage.stories.tsx +6 -1
- package/src/components/custom/Workout/README.md +68 -17
- package/src/components/custom/Workout/ReadinessCheck.stories.tsx +3 -2
- package/src/components/custom/Workout/ReadinessCheck.test.tsx +12 -18
- package/src/components/custom/Workout/ReadinessCheck.tsx +22 -4
- package/src/components/custom/Workout/RestTimer.stories.tsx +16 -4
- package/src/components/custom/Workout/RestTimer.tsx +4 -2
- package/src/components/custom/Workout/ScheduleTiles.stories.tsx +3 -2
- package/src/components/custom/Workout/ScheduleTiles.test.tsx +3 -4
- package/src/components/custom/Workout/ScheduleTiles.tsx +4 -7
- package/src/components/custom/Workout/SegmentedBar.stories.tsx +21 -17
- package/src/components/custom/Workout/SegmentedBar.tsx +10 -5
- package/src/components/custom/Workout/SegmentedProgressBar.stories.tsx +5 -5
- package/src/components/custom/Workout/SessionHeader.stories.tsx +6 -6
- package/src/components/custom/Workout/SessionHeader.tsx +12 -12
- package/src/components/custom/Workout/SessionRail.stories.tsx +12 -11
- package/src/components/custom/Workout/SessionRail.tsx +7 -9
- package/src/components/custom/Workout/SetBar.stories.tsx +10 -6
- package/src/components/custom/Workout/SetBar.test.tsx +49 -4
- package/src/components/custom/Workout/SetBar.tsx +38 -12
- package/src/components/custom/Workout/SetRow.stories.tsx +3 -2
- package/src/components/custom/Workout/SetRow.test.tsx +16 -2
- package/src/components/custom/Workout/SetRow.tsx +61 -23
- package/src/components/custom/Workout/SetStrip.stories.tsx +63 -7
- package/src/components/custom/Workout/SetStrip.test.tsx +25 -0
- package/src/components/custom/Workout/SetStrip.tsx +24 -4
- package/src/components/custom/Workout/SetTableHeader.stories.tsx +6 -6
- package/src/components/custom/Workout/SetTableHeader.tsx +9 -12
- package/src/components/custom/Workout/SetsRepsLoad.stories.tsx +7 -7
- package/src/components/custom/Workout/SetsRepsLoad.tsx +24 -12
- package/src/components/custom/Workout/Sparkline.stories.tsx +14 -11
- package/src/components/custom/Workout/Sparkline.test.tsx +37 -19
- package/src/components/custom/Workout/Sparkline.tsx +14 -18
- package/src/components/custom/Workout/StatusDot.stories.tsx +1 -1
- package/src/components/custom/Workout/StatusDot.test.tsx +44 -5
- package/src/components/custom/Workout/StatusDot.tsx +93 -63
- package/src/components/custom/Workout/StatusPill.stories.tsx +1 -1
- package/src/components/custom/Workout/StatusPill.test.tsx +6 -15
- package/src/components/custom/Workout/StatusPill.tsx +27 -38
- package/src/components/custom/Workout/StrengthTrendChart.stories.tsx +11 -4
- package/src/components/custom/Workout/StrengthTrendChart.test.tsx +15 -37
- package/src/components/custom/Workout/StrengthTrendChart.tsx +39 -36
- package/src/components/custom/Workout/SupersetWrapper.stories.tsx +27 -64
- package/src/components/custom/Workout/SupersetWrapper.test.tsx +16 -14
- package/src/components/custom/Workout/SupersetWrapper.tsx +17 -21
- package/src/components/custom/Workout/TempoDisplay.stories.tsx +26 -10
- package/src/components/custom/Workout/TempoDisplay.test.tsx +18 -4
- package/src/components/custom/Workout/TempoDisplay.tsx +2 -0
- package/src/components/custom/Workout/TrainingStatusPage.stories.tsx +9 -1
- package/src/components/custom/Workout/VelocityStrip.compact.stories.tsx +4 -1
- package/src/components/custom/Workout/VelocityStrip.dual.stories.tsx +10 -6
- package/src/components/custom/Workout/VelocityStrip.expanded.stories.tsx +5 -2
- package/src/components/custom/Workout/VelocityStrip.hero.stories.tsx +44 -1
- package/src/components/custom/Workout/VelocityStrip.stories.tsx +12 -6
- package/src/components/custom/Workout/VelocityStrip.test.tsx +48 -6
- package/src/components/custom/Workout/VelocityStrip.tsx +26 -14
- package/src/components/custom/Workout/VolumeLandmarkBar.stories.tsx +6 -7
- package/src/components/custom/Workout/VolumeLandmarkBar.tsx +15 -6
- package/src/components/custom/Workout/WeekRow.stories.tsx +4 -1
- package/src/components/custom/Workout/WeekRow.test.tsx +18 -15
- package/src/components/custom/Workout/WeekRow.tsx +23 -16
- package/src/components/custom/Workout/WeightBadge.stories.tsx +2 -1
- package/src/components/custom/Workout/WeightBadge.test.tsx +50 -19
- package/src/components/custom/Workout/WeightBadge.tsx +28 -27
- package/src/components/custom/Workout/WorkoutCard.stories.tsx +6 -1
- package/src/components/custom/Workout/WorkoutCard.test.tsx +18 -0
- package/src/components/custom/Workout/WorkoutCard.tsx +35 -57
- package/src/components/custom/Workout/WorkoutPill.stories.tsx +5 -2
- package/src/components/custom/Workout/WorkoutPill.test.tsx +39 -7
- package/src/components/custom/Workout/WorkoutPill.tsx +88 -57
- package/src/components/custom/Workout/ZoneTrack.stories.tsx +10 -7
- package/src/components/custom/Workout/ZoneTrack.tsx +10 -9
- package/src/components/custom/Workout/exerciseRowState.ts +29 -0
- package/src/components/custom/Workout/index.ts +17 -2
- package/src/components/custom/Workout/metricText.stories.tsx +15 -13
- package/src/components/custom/Workout/metricText.tsx +8 -2
- package/src/components/custom/Workout/setHeadingKit.tsx +219 -36
- package/src/components/custom/Workout/velocity-story-kit.tsx +2 -2
- package/src/components/custom/charts/README.md +66 -0
- package/src/components/custom/charts/SetBarChart.test.tsx +46 -1
- package/src/components/custom/charts/SetBarChart.tsx +56 -9
- package/src/components/custom/charts/SparkBars.stories.tsx +55 -0
- package/src/components/custom/charts/SparkBars.test.tsx +69 -0
- package/src/components/custom/charts/SparkBars.tsx +85 -0
- package/src/components/custom/charts/flatBarGeometry.test.ts +41 -0
- package/src/components/custom/charts/flatBarGeometry.ts +32 -0
- package/src/components/custom/charts/index.ts +3 -0
- package/src/components/custom/index.ts +3 -0
- package/src/components/custom/stepper/Stepper.stories.tsx +13 -10
- package/src/components/custom/stepper/Stepper.test.tsx +1 -7
- package/src/components/custom/stepper/Stepper.tsx +21 -34
- package/src/components/icons/icons.stories.tsx +1 -1
- package/src/components/icons/icons.tsx +51 -0
- package/src/components/shell/AppShell.stories.tsx +150 -0
- package/src/components/shell/AppShell.test.tsx +70 -0
- package/src/components/shell/AppShell.tsx +90 -0
- package/src/components/shell/BrandLockup.stories.tsx +66 -5
- package/src/components/shell/BrandLockup.test.tsx +34 -1
- package/src/components/shell/BrandLockup.tsx +27 -11
- package/src/components/shell/NavItem.stories.tsx +4 -4
- package/src/components/shell/NavItem.test.tsx +17 -0
- package/src/components/shell/NavItem.tsx +17 -5
- package/src/components/shell/README.md +89 -26
- package/src/components/shell/SideNav.stories.tsx +38 -7
- package/src/components/shell/SideNav.test.tsx +16 -8
- package/src/components/shell/SideNav.tsx +17 -17
- package/src/components/shell/TopBar.stories.tsx +44 -19
- package/src/components/shell/TopBar.test.tsx +34 -12
- package/src/components/shell/TopBar.tsx +61 -40
- package/src/components/shell/brands.tsx +66 -0
- package/src/components/shell/index.ts +9 -8
- package/src/components/shell/{DeviceIndicator.stories.tsx → workout/DeviceIndicator.stories.tsx} +2 -2
- package/src/components/shell/{DeviceIndicator.tsx → workout/DeviceIndicator.tsx} +2 -2
- package/src/components/shell/{DeviceMenu.stories.tsx → workout/DeviceMenu.stories.tsx} +2 -2
- package/src/components/shell/{DeviceMenu.tsx → workout/DeviceMenu.tsx} +3 -3
- package/src/components/shell/{DeviceRow.stories.tsx → workout/DeviceRow.stories.tsx} +2 -2
- package/src/components/shell/{DeviceRow.tsx → workout/DeviceRow.tsx} +3 -3
- package/src/components/shell/{SessionStatePill.stories.tsx → workout/SessionStatePill.stories.tsx} +2 -2
- package/src/components/shell/{SessionStatePill.tsx → workout/SessionStatePill.tsx} +5 -3
- package/src/components/shell/workout/WorkoutShell.stories.tsx +71 -0
- package/src/components/shell/{DashboardShell.test.tsx → workout/WorkoutShell.test.tsx} +19 -8
- package/src/components/shell/workout/WorkoutShell.tsx +77 -0
- package/src/components/shell/workout/WorkoutTopBar.stories.tsx +58 -0
- package/src/components/shell/workout/WorkoutTopBar.test.tsx +39 -0
- package/src/components/shell/workout/WorkoutTopBar.tsx +52 -0
- package/src/components/shell/workout/index.ts +9 -0
- package/src/components/shell/workout/workoutNavItems.tsx +16 -0
- package/src/components/ui/README.md +110 -0
- package/src/components/ui/alert/Alert.stories.tsx +15 -5
- package/src/components/ui/alert/Alert.tsx +24 -3
- package/src/components/ui/autocomplete/Autocomplete.stories.tsx +11 -13
- package/src/components/ui/autocomplete/Autocomplete.test.tsx +7 -25
- package/src/components/ui/autocomplete/Autocomplete.tsx +21 -28
- package/src/components/ui/avatar/Avatar.stories.tsx +1 -1
- package/src/components/ui/avatar/Avatar.tsx +2 -10
- package/src/components/ui/badge/Badge.stories.tsx +83 -28
- package/src/components/ui/badge/Badge.test.tsx +19 -3
- package/src/components/ui/badge/Badge.tsx +48 -55
- package/src/components/ui/breadcrumbs/Breadcrumbs.stories.tsx +1 -1
- package/src/components/ui/breadcrumbs/Breadcrumbs.tsx +4 -16
- package/src/components/ui/button/Button.stories.tsx +46 -12
- package/src/components/ui/button/Button.tsx +44 -37
- package/src/components/ui/card/Card.stories.tsx +90 -94
- package/src/components/ui/card/Card.test.tsx +80 -6
- package/src/components/ui/card/Card.tsx +150 -203
- package/src/components/ui/checkbox/Checkbox.stories.tsx +1 -1
- package/src/components/ui/checkbox/Checkbox.tsx +7 -27
- package/src/components/ui/chip/Chip.stories.tsx +37 -13
- package/src/components/ui/chip/Chip.test.tsx +10 -6
- package/src/components/ui/chip/Chip.tsx +76 -91
- package/src/components/ui/collapse/Collapse.stories.tsx +23 -23
- package/src/components/ui/collapse/Collapse.tsx +6 -11
- package/src/components/ui/data-row/DataRow.stories.tsx +14 -3
- package/src/components/ui/data-row/DataRow.test.tsx +5 -15
- package/src/components/ui/data-row/DataRow.tsx +18 -7
- package/src/components/ui/divider/Divider.stories.tsx +1 -1
- package/src/components/ui/divider/Divider.tsx +1 -5
- package/src/components/ui/drawer/Drawer.stories.tsx +5 -16
- package/src/components/ui/drawer/Drawer.tsx +13 -27
- package/src/components/ui/floating-overlay-depth.test.tsx +143 -0
- package/src/components/ui/form-field/FormField.stories.tsx +6 -20
- package/src/components/ui/form-field/FormField.test.tsx +1 -5
- package/src/components/ui/form-field/FormField.tsx +10 -46
- package/src/components/ui/help-tip/HelpTip.stories.tsx +8 -19
- package/src/components/ui/help-tip/HelpTip.test.tsx +1 -3
- package/src/components/ui/help-tip/HelpTip.tsx +21 -22
- package/src/components/ui/help-tip/index.ts +7 -1
- package/src/components/ui/icon-box/IconBox.stories.tsx +1 -1
- package/src/components/ui/icon-box/IconBox.test.tsx +1 -7
- package/src/components/ui/icon-box/IconBox.tsx +10 -18
- package/src/components/ui/indicator/Indicator.stories.tsx +5 -4
- package/src/components/ui/indicator/Indicator.tsx +20 -14
- package/src/components/ui/input/Input.stories.tsx +3 -11
- package/src/components/ui/input/Input.test.tsx +2 -10
- package/src/components/ui/input/Input.tsx +10 -25
- package/src/components/ui/input/index.ts +7 -1
- package/src/components/ui/link/Link.stories.tsx +19 -7
- package/src/components/ui/list-item/ListItem.stories.tsx +17 -5
- package/src/components/ui/list-item/ListItem.tsx +2 -9
- package/src/components/ui/menu/Menu.stories.tsx +21 -15
- package/src/components/ui/menu/Menu.test.tsx +2 -11
- package/src/components/ui/menu/Menu.tsx +12 -14
- package/src/components/ui/menu/index.ts +8 -1
- package/src/components/ui/modal/Modal.stories.tsx +2 -2
- package/src/components/ui/modal/Modal.tsx +31 -19
- package/src/components/ui/pill/Pill.stories.tsx +111 -23
- package/src/components/ui/pill/Pill.test.tsx +101 -3
- package/src/components/ui/pill/Pill.tsx +168 -49
- package/src/components/ui/pill/index.ts +1 -1
- package/src/components/ui/popover/Popover.stories.tsx +6 -8
- package/src/components/ui/popover/Popover.test.tsx +1 -6
- package/src/components/ui/popover/Popover.tsx +20 -15
- package/src/components/ui/popover/index.ts +7 -1
- package/src/components/ui/progress/Progress.stories.tsx +3 -12
- package/src/components/ui/progress/Progress.test.tsx +1 -5
- package/src/components/ui/progress/Progress.tsx +9 -6
- package/src/components/ui/radio/Radio.stories.tsx +42 -21
- package/src/components/ui/radio/Radio.test.tsx +6 -2
- package/src/components/ui/radio/Radio.tsx +23 -22
- package/src/components/ui/section/Section.stories.tsx +12 -21
- package/src/components/ui/section/Section.test.tsx +1 -6
- package/src/components/ui/section/Section.tsx +1 -3
- package/src/components/ui/section/index.ts +1 -5
- package/src/components/ui/select/Select.stories.tsx +3 -13
- package/src/components/ui/select/Select.test.tsx +2 -11
- package/src/components/ui/select/Select.tsx +16 -15
- package/src/components/ui/skeleton/Skeleton.stories.tsx +3 -11
- package/src/components/ui/skeleton/Skeleton.tsx +3 -14
- package/src/components/ui/skeleton/index.ts +1 -7
- package/src/components/ui/spinner/Spinner.stories.tsx +1 -1
- package/src/components/ui/spinner/Spinner.tsx +4 -5
- package/src/components/ui/stack/Stack.stories.tsx +8 -8
- package/src/components/ui/stack/Stack.tsx +1 -1
- package/src/components/ui/surface/Surface.stories.tsx +92 -33
- package/src/components/ui/surface/Surface.test.tsx +88 -28
- package/src/components/ui/surface/Surface.tsx +37 -87
- package/src/components/ui/surface/SurfaceContext.ts +22 -62
- package/src/components/ui/surface/index.ts +8 -0
- package/src/components/ui/surface/resolveSurface.ts +98 -0
- package/src/components/ui/surface/surface.contract.test.ts +6 -1
- package/src/components/ui/switch/Switch.stories.tsx +1 -1
- package/src/components/ui/switch/Switch.tsx +7 -6
- package/src/components/ui/tabs/Tabs.stories.tsx +1 -1
- package/src/components/ui/tabs/Tabs.tsx +8 -21
- package/src/components/ui/tabs/index.ts +1 -7
- package/src/components/ui/tile/Tile.stories.tsx +1 -1
- package/src/components/ui/tile/Tile.tsx +3 -0
- package/src/components/ui/toast/Toast.stories.tsx +1 -1
- package/src/components/ui/toast/Toast.test.tsx +2 -8
- package/src/components/ui/toast/Toast.tsx +49 -57
- package/src/components/ui/toast/index.ts +0 -1
- package/src/components/ui/toolbar-button/ToolbarButton.stories.tsx +92 -71
- package/src/components/ui/toolbar-button/ToolbarButton.test.tsx +3 -18
- package/src/components/ui/toolbar-button/ToolbarButton.tsx +38 -49
- package/src/components/ui/tooltip/Tooltip.stories.tsx +12 -3
- package/src/components/ui/tooltip/Tooltip.test.tsx +21 -3
- package/src/components/ui/tooltip/Tooltip.tsx +55 -36
- package/src/components/ui/tooltip/index.ts +1 -1
- package/src/components/ui/trigger/TriggerSurface.test.tsx +215 -0
- package/src/components/ui/trigger/TriggerSurface.tsx +81 -0
- package/src/components/ui/trigger/index.ts +2 -0
- package/src/stories/PresetShowcase.stories.tsx +101 -48
- package/src/test/no-device-internals.test.ts +3 -3
- package/src/test/no-raw-color.test.ts +39 -0
- package/src/theme/Alpha.stories.tsx +103 -0
- package/src/theme/ChoosingTokens.stories.tsx +48 -0
- package/src/theme/ColorPalettes.stories.tsx +62 -45
- package/src/theme/ColorPrimitives.stories.tsx +35 -35
- package/src/theme/Depth.stories.tsx +132 -65
- package/src/theme/DepthCalibration.stories.tsx +23 -21
- package/src/theme/ProposedTokensVW82.stories.tsx +414 -0
- package/src/theme/ThemeProvider.test.tsx +4 -4
- package/src/theme/barrel.ts +7 -6
- package/src/theme/color-stories.coverage.test.ts +1 -1
- package/src/theme/color-utils.ts +41 -29
- package/src/theme/config.completeness.test.ts +1 -1
- package/src/theme/config.ts +40 -0
- package/src/theme/elevation.test.ts +82 -56
- package/src/theme/elevation.ts +77 -561
- package/src/theme/global.css +45 -5
- package/src/theme/grey-ramp.test.ts +24 -8
- package/src/theme/lift.test.ts +39 -0
- package/src/theme/lift.ts +102 -0
- package/src/theme/materials.test.ts +5 -2
- package/src/theme/materials.ts +38 -4
- package/src/theme/native-theming-guard.test.ts +5 -5
- package/src/theme/presets/apply.ts +4 -0
- package/src/theme/presets/audiobook.ts +5 -2
- package/src/theme/presets/default.ts +4 -0
- package/src/theme/presets/index.ts +14 -1
- package/src/theme/presets/types.ts +1 -1
- package/src/theme/semantic-contrast.test.ts +13 -4
- package/src/theme/status-distinctness.test.ts +66 -0
- package/src/theme/subtle-tone-weight.test.ts +163 -0
- package/src/theme/surface-planes.test.ts +37 -0
- package/src/theme/surface-planes.ts +68 -0
- package/src/theme/tailwind-var-opacity.test.ts +163 -0
- package/src/theme/token-export-guard.test.ts +1 -3
- package/src/theme/tokens/primitives.test.ts +15 -7
- package/src/theme/tokens/primitives.ts +98 -33
- package/src/theme/tokens/semantic-hex-guard.test.ts +322 -0
- package/src/theme/tokens/semantic.ts +124 -54
- package/src/theme/wash-ladder.test.ts +58 -0
- package/src/theme/workout-tokens.ts +1 -7
- package/src/types/jest-axe.d.ts +2 -6
- package/src/types/raw-md.d.ts +5 -0
- package/src/utils/colors.alpha-adoption.test.ts +408 -0
- package/src/utils/colors.ts +4 -4
- package/src/utils/form.ts +1 -3
- package/src/utils/index.ts +2 -7
- package/src/utils/number-format.ts +17 -0
- package/src/utils/workout-format.ts +15 -6
- package/src/web-jsx/jsx-runtime.ts +1 -5
- package/tailwind.config.js +55 -9
- package/src/components/custom/Workout/ExerciseCardUnified.stories.tsx +0 -151
- package/src/components/custom/Workout/RowInventory.stories.tsx +0 -408
- package/src/components/custom/Workout/S3FullRail.stories.tsx +0 -46
- package/src/components/custom/Workout/S3SessionPace.stories.tsx +0 -95
- package/src/components/custom/Workout/S3SessionRailHeading.stories.tsx +0 -61
- package/src/components/custom/Workout/S3SetTypes.stories.tsx +0 -176
- package/src/components/custom/Workout/S3WorkoutExpansion.stories.tsx +0 -240
- package/src/components/shell/DashboardShell.stories.tsx +0 -65
- package/src/components/shell/DashboardShell.tsx +0 -75
- package/src/components/shell/SessionRailSpecimen.stories.tsx +0 -753
- package/src/theme/elevation.stories.tsx +0 -346
- package/src/utils/useTheme.ts +0 -72
- /package/src/components/shell/{DeviceIndicator.test.tsx → workout/DeviceIndicator.test.tsx} +0 -0
- /package/src/components/shell/{DeviceMenu.test.tsx → workout/DeviceMenu.test.tsx} +0 -0
- /package/src/components/shell/{DeviceRow.test.tsx → workout/DeviceRow.test.tsx} +0 -0
- /package/src/components/shell/{SessionStatePill.test.tsx → workout/SessionStatePill.test.tsx} +0 -0
|
@@ -17,7 +17,15 @@
|
|
|
17
17
|
* - interactive-* : Hover/focus/active/disabled states
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
|
-
import {
|
|
20
|
+
import {
|
|
21
|
+
primitiveColors as p,
|
|
22
|
+
primitiveRamps as ramp,
|
|
23
|
+
greyRamp,
|
|
24
|
+
discreteRainbow,
|
|
25
|
+
alertRedVivid,
|
|
26
|
+
resultPaletteColors,
|
|
27
|
+
semanticPins,
|
|
28
|
+
} from './primitives'
|
|
21
29
|
|
|
22
30
|
/**
|
|
23
31
|
* GREY MAPPING (TD-07.14) — how the old cool scales resolved onto `greyRamp`.
|
|
@@ -53,6 +61,8 @@ export const semanticColorsLight = {
|
|
|
53
61
|
'brand-primary-light': ramp.orange[300],
|
|
54
62
|
'brand-primary-dark': ramp.orange[500],
|
|
55
63
|
'brand-primary-subtle': 'rgba(255, 121, 0, 0.08)',
|
|
64
|
+
'brand-primary-muted': 'rgba(255, 121, 0, 0.30)',
|
|
65
|
+
'brand-primary-strong': 'rgba(255, 121, 0, 0.50)',
|
|
56
66
|
'brand-primary-hover': ramp.orange[500],
|
|
57
67
|
'brand-primary-active': ramp.orange[600],
|
|
58
68
|
|
|
@@ -60,6 +70,8 @@ export const semanticColorsLight = {
|
|
|
60
70
|
'brand-secondary-light': ramp.cyan[500],
|
|
61
71
|
'brand-secondary-dark': ramp.cyan[700],
|
|
62
72
|
'brand-secondary-subtle': 'rgba(48, 123, 155, 0.08)',
|
|
73
|
+
'brand-secondary-muted': 'rgba(48, 123, 155, 0.30)',
|
|
74
|
+
'brand-secondary-strong': 'rgba(48, 123, 155, 0.50)',
|
|
63
75
|
'brand-secondary-hover': ramp.cyan[700],
|
|
64
76
|
'brand-secondary-active': ramp.cyan[800],
|
|
65
77
|
|
|
@@ -67,11 +79,20 @@ export const semanticColorsLight = {
|
|
|
67
79
|
'on-brand-primary': p.white,
|
|
68
80
|
'on-brand-secondary': p.white,
|
|
69
81
|
|
|
82
|
+
// Text ON a `-subtle` fill. Light mode keeps today's pairing (the base token) so
|
|
83
|
+
// nothing moves here: light has the same disease mirrored — a light rung on a
|
|
84
|
+
// near-white ramp[50] fill — but correcting it belongs with the light-mode pass
|
|
85
|
+
// in AW-121, not this one.
|
|
86
|
+
'on-brand-primary-subtle': ramp.orange[400],
|
|
87
|
+
'on-brand-secondary-subtle': ramp.cyan[600],
|
|
88
|
+
|
|
70
89
|
// Status colors (status-*)
|
|
71
90
|
'status-success': ramp.green[300],
|
|
72
91
|
'status-success-light': ramp.green[200],
|
|
73
92
|
'status-success-dark': ramp.green[600],
|
|
74
93
|
'status-success-subtle': ramp.green[50],
|
|
94
|
+
'status-success-muted': 'rgba(46, 213, 115, 0.30)',
|
|
95
|
+
'status-success-strong': 'rgba(46, 213, 115, 0.50)',
|
|
75
96
|
|
|
76
97
|
// Live-session accent — its OWN role, decoupled from success so the two can diverge
|
|
77
98
|
'status-live': ramp.green[300],
|
|
@@ -81,21 +102,35 @@ export const semanticColorsLight = {
|
|
|
81
102
|
'status-error-light': ramp.red[500],
|
|
82
103
|
'status-error-dark': ramp.red[700],
|
|
83
104
|
'status-error-subtle': ramp.red[50],
|
|
105
|
+
'status-error-muted': 'rgba(209, 67, 67, 0.30)',
|
|
106
|
+
'status-error-strong': 'rgba(209, 67, 67, 0.50)',
|
|
84
107
|
|
|
85
|
-
'status-error-vivid':
|
|
108
|
+
'status-error-vivid': alertRedVivid, // NOT red[600], that is status-error
|
|
86
109
|
'status-error-vivid-light': ramp.red[500],
|
|
87
110
|
'status-error-vivid-dark': ramp.red[700],
|
|
88
111
|
'status-error-vivid-subtle': 'rgba(255, 71, 87, 0.12)',
|
|
112
|
+
'status-error-vivid-muted': 'rgba(255, 71, 87, 0.30)',
|
|
113
|
+
'status-error-vivid-strong': 'rgba(255, 71, 87, 0.50)',
|
|
89
114
|
|
|
90
115
|
'status-warning': ramp.amber[300],
|
|
91
116
|
'status-warning-light': ramp.amber[200],
|
|
92
117
|
'status-warning-dark': ramp.amber[500],
|
|
93
118
|
'status-warning-subtle': ramp.amber[50],
|
|
119
|
+
'status-warning-muted': 'rgba(249, 180, 21, 0.30)',
|
|
120
|
+
'status-warning-strong': 'rgba(249, 180, 21, 0.50)',
|
|
94
121
|
|
|
95
122
|
'status-info': ramp.blue[500],
|
|
96
123
|
'status-info-light': ramp.blue[300],
|
|
97
124
|
'status-info-dark': ramp.blue[600],
|
|
98
125
|
'status-info-subtle': ramp.blue[50],
|
|
126
|
+
'status-info-muted': 'rgba(33, 150, 243, 0.30)',
|
|
127
|
+
'status-info-strong': 'rgba(33, 150, 243, 0.50)',
|
|
128
|
+
|
|
129
|
+
// Text ON a `-subtle` fill — see the on-brand-*-subtle note above.
|
|
130
|
+
'on-status-success-subtle': ramp.green[300],
|
|
131
|
+
'on-status-error-subtle': ramp.red[600],
|
|
132
|
+
'on-status-warning-subtle': ramp.amber[300],
|
|
133
|
+
'on-status-info-subtle': ramp.blue[500],
|
|
99
134
|
|
|
100
135
|
// Text on status backgrounds (on-status-*)
|
|
101
136
|
'on-status-success': p.white,
|
|
@@ -104,15 +139,15 @@ export const semanticColorsLight = {
|
|
|
104
139
|
'on-status-info': p.white,
|
|
105
140
|
|
|
106
141
|
// Result/outcome indicators (result-*)
|
|
107
|
-
'result-improve':
|
|
142
|
+
'result-improve': resultPaletteColors.improve, // Green - positive outcome
|
|
108
143
|
'result-improve-light': 'rgba(76, 175, 80, 0.12)',
|
|
109
|
-
'result-improve-dark':
|
|
110
|
-
'result-degrade':
|
|
144
|
+
'result-improve-dark': resultPaletteColors.improveDark,
|
|
145
|
+
'result-degrade': resultPaletteColors.degrade, // Red - negative outcome
|
|
111
146
|
'result-degrade-light': 'rgba(239, 83, 80, 0.12)',
|
|
112
|
-
'result-degrade-dark':
|
|
113
|
-
'result-inconclusive':
|
|
147
|
+
'result-degrade-dark': resultPaletteColors.degradeDark,
|
|
148
|
+
'result-inconclusive': resultPaletteColors.inconclusive, // Gray - no clear result
|
|
114
149
|
'result-inconclusive-light': 'rgba(158, 154, 151, 0.12)',
|
|
115
|
-
'result-neutral': greyRamp[600],
|
|
150
|
+
'result-neutral': greyRamp[600], // Neutral baseline
|
|
116
151
|
|
|
117
152
|
// Text on result backgrounds (on-result-*)
|
|
118
153
|
'on-result-improve': p.white,
|
|
@@ -121,20 +156,20 @@ export const semanticColorsLight = {
|
|
|
121
156
|
|
|
122
157
|
// Data visualization colors (data-*)
|
|
123
158
|
// First 10 colors from discrete rainbow optimized for charts
|
|
124
|
-
'data-1': discreteRainbow[9],
|
|
125
|
-
'data-2': discreteRainbow[14],
|
|
126
|
-
'data-3': discreteRainbow[17],
|
|
127
|
-
'data-4': discreteRainbow[25],
|
|
128
|
-
'data-5': discreteRainbow[8],
|
|
129
|
-
'data-6': discreteRainbow[20],
|
|
130
|
-
'data-7': discreteRainbow[13],
|
|
131
|
-
'data-8': discreteRainbow[15],
|
|
132
|
-
'data-9': discreteRainbow[3],
|
|
133
|
-
'data-10': discreteRainbow[22],
|
|
159
|
+
'data-1': discreteRainbow[9], // Blue
|
|
160
|
+
'data-2': discreteRainbow[14], // Green
|
|
161
|
+
'data-3': discreteRainbow[17], // Yellow
|
|
162
|
+
'data-4': discreteRainbow[25], // Red
|
|
163
|
+
'data-5': discreteRainbow[8], // Purple
|
|
164
|
+
'data-6': discreteRainbow[20], // Orange
|
|
165
|
+
'data-7': discreteRainbow[13], // Light Blue
|
|
166
|
+
'data-8': discreteRainbow[15], // Light Green
|
|
167
|
+
'data-9': discreteRainbow[3], // Lavender
|
|
168
|
+
'data-10': discreteRainbow[22], // Dark Orange
|
|
134
169
|
|
|
135
170
|
// Text colors (text-*)
|
|
136
|
-
'text-primary':
|
|
137
|
-
'text-secondary':
|
|
171
|
+
'text-primary': semanticPins.textPrimaryLight,
|
|
172
|
+
'text-secondary': semanticPins.textSecondaryLight,
|
|
138
173
|
'text-tertiary': greyRamp[400],
|
|
139
174
|
'text-disabled': 'rgba(55, 65, 81, 0.48)',
|
|
140
175
|
'text-inverse': p.white,
|
|
@@ -143,13 +178,13 @@ export const semanticColorsLight = {
|
|
|
143
178
|
|
|
144
179
|
// Surface colors (surface-*) - for elevated containers
|
|
145
180
|
'surface-base': p.white,
|
|
146
|
-
'surface-elevated': greyRamp[50],
|
|
147
|
-
'surface-raised': greyRamp[100],
|
|
181
|
+
'surface-elevated': greyRamp[50], // slightly off-white for elevated cards
|
|
182
|
+
'surface-raised': greyRamp[100], // light gray for raised cards
|
|
148
183
|
'surface-overlay': p.white,
|
|
149
|
-
'surface-input': greyRamp[50],
|
|
184
|
+
'surface-input': greyRamp[50], // Input field background (filled variant)
|
|
150
185
|
|
|
151
186
|
// Background colors (background-*)
|
|
152
|
-
'background-base':
|
|
187
|
+
'background-base': semanticPins.backgroundBaseLight,
|
|
153
188
|
'background-default': p.white,
|
|
154
189
|
'background-subtle': greyRamp[50],
|
|
155
190
|
// Frame/bezel chrome — top bar + side nav shell, one step below
|
|
@@ -157,12 +192,12 @@ export const semanticColorsLight = {
|
|
|
157
192
|
'background-frame': greyRamp[400],
|
|
158
193
|
|
|
159
194
|
// Border colors (border-*)
|
|
160
|
-
'border-prominent': greyRamp[400],
|
|
195
|
+
'border-prominent': greyRamp[400], // high-visibility divider
|
|
161
196
|
'border-focus': ramp.blue[600],
|
|
162
|
-
'border-input': greyRamp[200],
|
|
163
|
-
'border-input-hover': greyRamp[400],
|
|
164
|
-
'border-input-focus': ramp.blue[600],
|
|
165
|
-
'border-input-error': ramp.red[600],
|
|
197
|
+
'border-input': greyRamp[200], // Input field border
|
|
198
|
+
'border-input-hover': greyRamp[400], // Input field border on hover
|
|
199
|
+
'border-input-focus': ramp.blue[600], // Input field border on focus
|
|
200
|
+
'border-input-error': ramp.red[600], // Input field border on error
|
|
166
201
|
|
|
167
202
|
// Alpha hairline separators (surface-independent — composite toward black on
|
|
168
203
|
// light surfaces, mirroring the dark-mode white-alpha family). See §4/S-2.
|
|
@@ -179,7 +214,7 @@ export const semanticColorsLight = {
|
|
|
179
214
|
'interactive-disabled-text': 'rgba(55, 65, 81, 0.26)',
|
|
180
215
|
|
|
181
216
|
// Divider
|
|
182
|
-
|
|
217
|
+
divider: semanticPins.dividerLight,
|
|
183
218
|
|
|
184
219
|
// Avatar default
|
|
185
220
|
'avatar-background': greyRamp[600],
|
|
@@ -193,13 +228,17 @@ export const semanticColorsDark = {
|
|
|
193
228
|
'brand-primary-light': ramp.orange[300],
|
|
194
229
|
'brand-primary-dark': ramp.orange[500],
|
|
195
230
|
'brand-primary-subtle': 'rgba(255, 121, 0, 0.12)',
|
|
231
|
+
'brand-primary-muted': 'rgba(255, 121, 0, 0.30)',
|
|
232
|
+
'brand-primary-strong': 'rgba(255, 121, 0, 0.50)',
|
|
196
233
|
'brand-primary-hover': ramp.orange[300],
|
|
197
234
|
'brand-primary-active': ramp.orange[200],
|
|
198
235
|
|
|
199
236
|
'brand-secondary': ramp.cyan[600],
|
|
200
237
|
'brand-secondary-light': ramp.cyan[500],
|
|
201
238
|
'brand-secondary-dark': ramp.cyan[700],
|
|
202
|
-
'brand-secondary-subtle': 'rgba(
|
|
239
|
+
'brand-secondary-subtle': 'rgba(34, 211, 238, 0.12)',
|
|
240
|
+
'brand-secondary-muted': 'rgba(48, 123, 155, 0.30)',
|
|
241
|
+
'brand-secondary-strong': 'rgba(48, 123, 155, 0.50)',
|
|
203
242
|
'brand-secondary-hover': ramp.cyan[500],
|
|
204
243
|
'brand-secondary-active': ramp.cyan[400],
|
|
205
244
|
|
|
@@ -207,11 +246,22 @@ export const semanticColorsDark = {
|
|
|
207
246
|
'on-brand-primary': p.white,
|
|
208
247
|
'on-brand-secondary': p.white,
|
|
209
248
|
|
|
249
|
+
// Text ON a `-subtle` fill. Its own role: `brand-primary` and friends are tuned to
|
|
250
|
+
// carry a white label as a solid fill, which makes the two deepest of them
|
|
251
|
+
// (cyan[600], red[600]) too dark to read as text on a dark plane. Levelling the
|
|
252
|
+
// family at rung 300 puts every tone within OKLCH L 0.769-0.813 instead of
|
|
253
|
+
// 0.550-0.813. Brand is deliberately left at its own orange[400] (operator, AW-133)
|
|
254
|
+
// so the Voltras tone never drifts; it is the one tone under AA on a raised card.
|
|
255
|
+
'on-brand-primary-subtle': ramp.orange[400],
|
|
256
|
+
'on-brand-secondary-subtle': ramp.cyan[300],
|
|
257
|
+
|
|
210
258
|
// Status colors
|
|
211
259
|
'status-success': ramp.green[300],
|
|
212
260
|
'status-success-light': ramp.green[200],
|
|
213
261
|
'status-success-dark': ramp.green[600],
|
|
214
262
|
'status-success-subtle': 'rgba(46, 213, 115, 0.12)',
|
|
263
|
+
'status-success-muted': 'rgba(46, 213, 115, 0.30)',
|
|
264
|
+
'status-success-strong': 'rgba(46, 213, 115, 0.50)',
|
|
215
265
|
|
|
216
266
|
// Live-session accent — its OWN role, decoupled from success so the two can diverge
|
|
217
267
|
'status-live': ramp.green[300],
|
|
@@ -220,22 +270,33 @@ export const semanticColorsDark = {
|
|
|
220
270
|
'status-error': ramp.red[600],
|
|
221
271
|
'status-error-light': ramp.red[500],
|
|
222
272
|
'status-error-dark': ramp.red[700],
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
273
|
+
// Alpha 0.08, not the family's 0.12: error's label is red[400], a rung darker than
|
|
274
|
+
// its siblings so it reads RED rather than pink (rung 300 has only 0.121 chroma).
|
|
275
|
+
// Thinning the fill buys back the contrast that extra darkness costs. See AW-133.
|
|
276
|
+
'status-error-subtle': 'rgba(247, 113, 117, 0.08)',
|
|
277
|
+
'status-error-muted': 'rgba(209, 67, 67, 0.30)',
|
|
278
|
+
'status-error-strong': 'rgba(209, 67, 67, 0.50)',
|
|
279
|
+
|
|
280
|
+
'status-error-vivid': alertRedVivid,
|
|
226
281
|
'status-error-vivid-light': ramp.red[500],
|
|
227
282
|
'status-error-vivid-dark': ramp.red[700],
|
|
228
283
|
'status-error-vivid-subtle': 'rgba(255, 71, 87, 0.12)',
|
|
284
|
+
'status-error-vivid-muted': 'rgba(255, 71, 87, 0.30)',
|
|
285
|
+
'status-error-vivid-strong': 'rgba(255, 71, 87, 0.50)',
|
|
229
286
|
|
|
230
287
|
'status-warning': ramp.amber[300],
|
|
231
288
|
'status-warning-light': ramp.amber[200],
|
|
232
289
|
'status-warning-dark': ramp.amber[500],
|
|
233
290
|
'status-warning-subtle': 'rgba(249, 180, 21, 0.12)',
|
|
291
|
+
'status-warning-muted': 'rgba(249, 180, 21, 0.30)',
|
|
292
|
+
'status-warning-strong': 'rgba(249, 180, 21, 0.50)',
|
|
234
293
|
|
|
235
294
|
'status-info': ramp.blue[500],
|
|
236
295
|
'status-info-light': ramp.blue[300],
|
|
237
296
|
'status-info-dark': ramp.blue[600],
|
|
238
|
-
'status-info-subtle': 'rgba(
|
|
297
|
+
'status-info-subtle': 'rgba(120, 194, 255, 0.12)',
|
|
298
|
+
'status-info-muted': 'rgba(33, 150, 243, 0.30)',
|
|
299
|
+
'status-info-strong': 'rgba(33, 150, 243, 0.50)',
|
|
239
300
|
|
|
240
301
|
// Text on status backgrounds
|
|
241
302
|
'on-status-success': p.white,
|
|
@@ -243,14 +304,23 @@ export const semanticColorsDark = {
|
|
|
243
304
|
'on-status-warning': p.white,
|
|
244
305
|
'on-status-info': p.white,
|
|
245
306
|
|
|
307
|
+
// Text ON a `-subtle` fill — see the on-brand-*-subtle note above. Error is the
|
|
308
|
+
// second deliberate exception to the rung-300 rule (operator, AW-133): red[300]
|
|
309
|
+
// levelled perfectly but read PINK, because a red that light can only hold 0.121
|
|
310
|
+
// chroma. red[400] carries 0.165 and reads red; its fill is thinned to compensate.
|
|
311
|
+
'on-status-success-subtle': ramp.green[300],
|
|
312
|
+
'on-status-error-subtle': ramp.red[400],
|
|
313
|
+
'on-status-warning-subtle': ramp.amber[300],
|
|
314
|
+
'on-status-info-subtle': ramp.blue[300],
|
|
315
|
+
|
|
246
316
|
// Result/outcome indicators (result-*)
|
|
247
|
-
'result-improve':
|
|
317
|
+
'result-improve': resultPaletteColors.improve,
|
|
248
318
|
'result-improve-light': 'rgba(76, 175, 80, 0.16)',
|
|
249
|
-
'result-improve-dark':
|
|
250
|
-
'result-degrade':
|
|
319
|
+
'result-improve-dark': resultPaletteColors.improveDark,
|
|
320
|
+
'result-degrade': resultPaletteColors.degrade,
|
|
251
321
|
'result-degrade-light': 'rgba(239, 83, 80, 0.16)',
|
|
252
|
-
'result-degrade-dark':
|
|
253
|
-
'result-inconclusive':
|
|
322
|
+
'result-degrade-dark': resultPaletteColors.degradeDark,
|
|
323
|
+
'result-inconclusive': resultPaletteColors.inconclusive,
|
|
254
324
|
'result-inconclusive-light': 'rgba(158, 154, 151, 0.16)',
|
|
255
325
|
'result-neutral': greyRamp[400],
|
|
256
326
|
|
|
@@ -284,7 +354,7 @@ export const semanticColorsDark = {
|
|
|
284
354
|
'text-tertiary': greyRamp[500],
|
|
285
355
|
'text-disabled': 'rgba(255, 255, 255, 0.38)',
|
|
286
356
|
'text-inverse': greyRamp[950],
|
|
287
|
-
'text-link':
|
|
357
|
+
'text-link': semanticPins.focusIndigoDark,
|
|
288
358
|
'text-link-hover': ramp.blue[400],
|
|
289
359
|
|
|
290
360
|
// Surface colors - dark backgrounds — warm-tapered DERIVED ramp (TD-surface-tokens,
|
|
@@ -295,20 +365,20 @@ export const semanticColorsDark = {
|
|
|
295
365
|
// `background-base` backs `Surface level="background"` (SurfaceContext.SURFACE_LEVEL_TOKEN),
|
|
296
366
|
// so it takes the ramp's shell role. The deepest plane is `background-frame`,
|
|
297
367
|
// which is also the `SurfaceLevel` floor a pressed surface clamps at.
|
|
298
|
-
'surface-base': greyRamp[925],
|
|
299
|
-
'surface-elevated': greyRamp[900],
|
|
300
|
-
'surface-raised': greyRamp[875],
|
|
301
|
-
'surface-overlay': greyRamp[850],
|
|
302
|
-
'surface-input': greyRamp[900],
|
|
368
|
+
'surface-base': greyRamp[925], // main surface (#252321, L*13.9)
|
|
369
|
+
'surface-elevated': greyRamp[900], // elevated surface (#2C2A28, L*17.2 — nav/rail)
|
|
370
|
+
'surface-raised': greyRamp[875], // raised surface (#31302F, L*19.9 — cards)
|
|
371
|
+
'surface-overlay': greyRamp[850], // overlay surface (#373635, L*22.7 — hero/popover)
|
|
372
|
+
'surface-input': greyRamp[900], // input surface (#2C2A28 — one plane above base)
|
|
303
373
|
|
|
304
374
|
// Background colors — same ramp, the frame/shell end of it.
|
|
305
|
-
'background-base': greyRamp[950],
|
|
306
|
-
'background-default': greyRamp[925],
|
|
307
|
-
'background-subtle': greyRamp[900],
|
|
375
|
+
'background-base': greyRamp[950], // shell (#1C1916, L*9 — Surface level="background")
|
|
376
|
+
'background-default': greyRamp[925], // main background (#252321, L*13.9 — matches surface-base)
|
|
377
|
+
'background-subtle': greyRamp[900], // subtle background (#2C2A28, L*17.2 — matches surface-elevated)
|
|
308
378
|
// Frame/bezel chrome — the top bar + side nav shell, one step BELOW
|
|
309
379
|
// `background-base`. It used to be described as sitting OUTSIDE the ramp; it
|
|
310
380
|
// is simply the ramp's last step now, and the floor `<Surface pressed>` clamps at.
|
|
311
|
-
'background-frame': greyRamp[975],
|
|
381
|
+
'background-frame': greyRamp[975], // frame / bezel (#100D0A, L*3.8)
|
|
312
382
|
|
|
313
383
|
// Border colors — solid dark borders are RETIRED (TD-07.14). Not a preference — a structural
|
|
314
384
|
// consequence of one ramp. Every step from 850 to 975 is now a surface plane,
|
|
@@ -326,11 +396,11 @@ export const semanticColorsDark = {
|
|
|
326
396
|
// `border-prominent` stays SOLID: it is the one border meant to be seen
|
|
327
397
|
// outright (4 call sites, high-visibility dividers), and grey-800 is not a
|
|
328
398
|
// plane, so it keeps its job without collision.
|
|
329
|
-
'border-prominent': greyRamp[800],
|
|
330
|
-
'border-focus':
|
|
399
|
+
'border-prominent': greyRamp[800], // high-visibility divider
|
|
400
|
+
'border-focus': semanticPins.focusIndigoDark,
|
|
331
401
|
'border-input': greyRamp[700],
|
|
332
402
|
'border-input-hover': greyRamp[600],
|
|
333
|
-
'border-input-focus':
|
|
403
|
+
'border-input-focus': semanticPins.focusIndigoDark,
|
|
334
404
|
'border-input-error': ramp.red[500],
|
|
335
405
|
|
|
336
406
|
// Alpha hairline separators — the primary separation cue (§4/S-2). Self-
|
|
@@ -376,7 +446,7 @@ export const semanticColorsDark = {
|
|
|
376
446
|
'interactive-disabled-text': 'rgba(255, 255, 255, 0.26)',
|
|
377
447
|
|
|
378
448
|
// Divider
|
|
379
|
-
|
|
449
|
+
divider: 'rgba(255, 255, 255, 0.09)',
|
|
380
450
|
|
|
381
451
|
// Avatar default
|
|
382
452
|
'avatar-background': greyRamp[700],
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import { semanticColorsDark, semanticColorsLight } from './tokens/semantic'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Status and brand roles publish three wash rungs. They exist so a component can
|
|
6
|
+
* express a weight ramp without hand-mixing alpha: MesoProgressBar's segment
|
|
7
|
+
* track collapsed to one weight in three hues when only `-subtle` was available.
|
|
8
|
+
*
|
|
9
|
+
* A rung that drifts out of order silently flattens every consumer, and the
|
|
10
|
+
* consumer's own test cannot catch it — under the RNW vitest alias the rendered
|
|
11
|
+
* value is a `var(...)` reference, not an rgba triplet.
|
|
12
|
+
*/
|
|
13
|
+
const WASH_ROLES = [
|
|
14
|
+
'brand-primary',
|
|
15
|
+
'brand-secondary',
|
|
16
|
+
'status-success',
|
|
17
|
+
'status-error',
|
|
18
|
+
'status-error-vivid',
|
|
19
|
+
'status-warning',
|
|
20
|
+
'status-info',
|
|
21
|
+
] as const
|
|
22
|
+
|
|
23
|
+
const RUNGS = ['subtle', 'muted', 'strong'] as const
|
|
24
|
+
|
|
25
|
+
function alphaOf(value: string): number {
|
|
26
|
+
const parts = value.match(/rgba?\(([^)]+)\)/)?.[1].split(',')
|
|
27
|
+
if (!parts) return 1 // a solid ramp pin is fully opaque
|
|
28
|
+
return parts.length === 4 ? Number(parts[3].trim()) : 1
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
describe('wash ladder', () => {
|
|
32
|
+
for (const [mode, palette] of [
|
|
33
|
+
['dark', semanticColorsDark],
|
|
34
|
+
['light', semanticColorsLight],
|
|
35
|
+
] as const) {
|
|
36
|
+
describe(mode, () => {
|
|
37
|
+
for (const role of WASH_ROLES) {
|
|
38
|
+
it(`${role} publishes all three rungs`, () => {
|
|
39
|
+
for (const rung of RUNGS) {
|
|
40
|
+
expect(palette, `${role}-${rung} is missing`).toHaveProperty(`${role}-${rung}`)
|
|
41
|
+
}
|
|
42
|
+
})
|
|
43
|
+
}
|
|
44
|
+
})
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Light mode's `-subtle` is still a solid ramp tint rather than a wash, so its
|
|
48
|
+
// ladder is not comparable yet. AW-121 owns bringing light onto this model.
|
|
49
|
+
for (const role of WASH_ROLES) {
|
|
50
|
+
it(`${role} rungs ascend in weight (dark)`, () => {
|
|
51
|
+
const [subtle, muted, strong] = RUNGS.map((r) =>
|
|
52
|
+
alphaOf(semanticColorsDark[`${role}-${r}` as keyof typeof semanticColorsDark] as string)
|
|
53
|
+
)
|
|
54
|
+
expect(muted, `${role}-muted must outweigh -subtle`).toBeGreaterThan(subtle)
|
|
55
|
+
expect(strong, `${role}-strong must outweigh -muted`).toBeGreaterThan(muted)
|
|
56
|
+
})
|
|
57
|
+
}
|
|
58
|
+
})
|
|
@@ -48,13 +48,7 @@ export const WORKOUT_TOKENS = {
|
|
|
48
48
|
over2: ramp.red[700],
|
|
49
49
|
over3: ramp.red[800],
|
|
50
50
|
targetLine: 'rgba(33, 150, 243, 0.5)',
|
|
51
|
-
atTargetGlow:
|
|
52
|
-
'0 0 5px 1px rgba(33, 150, 243, 0.35), 0 0 10px 3px rgba(33, 150, 243, 0.15)',
|
|
53
|
-
},
|
|
54
|
-
|
|
55
|
-
// Placeholder strip
|
|
56
|
-
placeholder: {
|
|
57
|
-
fill: '#3A3A3A',
|
|
51
|
+
atTargetGlow: '0 0 5px 1px rgba(33, 150, 243, 0.35), 0 0 10px 3px rgba(33, 150, 243, 0.15)',
|
|
58
52
|
},
|
|
59
53
|
|
|
60
54
|
// Deviation bar
|
package/src/types/jest-axe.d.ts
CHANGED
|
@@ -5,12 +5,8 @@ declare module 'jest-axe' {
|
|
|
5
5
|
): Promise<{ violations: unknown[] }>
|
|
6
6
|
|
|
7
7
|
export const toHaveNoViolations: {
|
|
8
|
-
toHaveNoViolations(
|
|
9
|
-
results: { violations: unknown[] }
|
|
10
|
-
): { pass: boolean; message(): string }
|
|
8
|
+
toHaveNoViolations(results: { violations: unknown[] }): { pass: boolean; message(): string }
|
|
11
9
|
}
|
|
12
10
|
|
|
13
|
-
export function configureAxe(
|
|
14
|
-
options?: Record<string, unknown>
|
|
15
|
-
): typeof axe
|
|
11
|
+
export function configureAxe(options?: Record<string, unknown>): typeof axe
|
|
16
12
|
}
|