@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
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
import type { Meta, StoryObj } from '@storybook/react-vite'
|
|
2
2
|
import { View, Text } from 'react-native'
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
categoricalPalette,
|
|
5
|
+
getCategoricalColor,
|
|
6
|
+
CATEGORICAL_CVD_SAFE_MAX,
|
|
7
|
+
divergingScale,
|
|
8
|
+
sequentialEffort,
|
|
9
|
+
discreteRainbow,
|
|
10
|
+
bestTextColor,
|
|
11
|
+
greyRamp,
|
|
12
|
+
} from './tokens/primitives'
|
|
4
13
|
import { semanticColorsLight, semanticColorsDark } from './tokens/semantic'
|
|
5
14
|
import { WORKOUT_TOKENS } from './workout-tokens'
|
|
6
15
|
import { WORKOUT_PILL_DELOAD } from './extracted-colors-dataviz'
|
|
@@ -52,7 +61,12 @@ export default meta
|
|
|
52
61
|
* `Foundations/Color/Primitives`.
|
|
53
62
|
*/
|
|
54
63
|
const SURFACE_PLANES = [
|
|
55
|
-
{
|
|
64
|
+
{
|
|
65
|
+
step: 975,
|
|
66
|
+
hex: greyRamp[975],
|
|
67
|
+
lStar: 3.8,
|
|
68
|
+
role: 'Frame / bezel — chrome the ramp sits inside',
|
|
69
|
+
},
|
|
56
70
|
{ step: 950, hex: greyRamp[950], lStar: 9, role: 'Shell' },
|
|
57
71
|
{ step: 925, hex: greyRamp[925], lStar: 13.9, role: 'Main content plane' },
|
|
58
72
|
{ step: 900, hex: greyRamp[900], lStar: 17.2, role: 'Nav / rail' },
|
|
@@ -113,12 +127,12 @@ export const SurfaceRamp: StoryObj = {
|
|
|
113
127
|
<View style={{ padding: 24 }}>
|
|
114
128
|
<Text className="text-2xl font-bold text-text-primary mb-2">Surface Ramp (Dark Mode)</Text>
|
|
115
129
|
<SectionIntro>
|
|
116
|
-
The v0.10.0 surface foundation, and the assignment the most surfaces depend on. Depth is
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
130
|
+
The v0.10.0 surface foundation, and the assignment the most surfaces depend on. Depth is an{' '}
|
|
131
|
+
<Text className="font-semibold">ordered ramp</Text>, not a set of unrelated fills — planes
|
|
132
|
+
are spaced by perceptual lightness (L*) on a diminishing taper, so "one step up"
|
|
133
|
+
is the same visual distance anywhere in the stack. Listed darkest first. Several semantic
|
|
134
|
+
tokens deliberately share a plane (shown per row); that aliasing is what lets a component
|
|
135
|
+
say what it <Text className="italic">is</Text> rather than how deep it sits.
|
|
122
136
|
</SectionIntro>
|
|
123
137
|
|
|
124
138
|
<View style={{ gap: 14 }}>
|
|
@@ -132,9 +146,9 @@ export const SurfaceRamp: StoryObj = {
|
|
|
132
146
|
scales — the greys it is built from are in Foundations/Color/Primitives. To apply it at
|
|
133
147
|
runtime use <Text className="font-semibold text-text-primary"><Surface level></Text>{' '}
|
|
134
148
|
and <Text className="font-semibold text-text-primary">useOnSurfaceColor</Text> rather than
|
|
135
|
-
reading tokens directly — see Components/Atoms/Surface.
|
|
136
|
-
|
|
137
|
-
in Foundations/
|
|
149
|
+
reading tokens directly — see Components/Atoms/Surface. How a plane says it is ABOVE its
|
|
150
|
+
neighbour (tone, lift, hairline, material) and how the elevation levels map onto these steps
|
|
151
|
+
are in Foundations/Depth.
|
|
138
152
|
</Text>
|
|
139
153
|
</View>
|
|
140
154
|
),
|
|
@@ -188,16 +202,14 @@ export const CategoricalPalette: StoryObj = {
|
|
|
188
202
|
<SectionIntro>
|
|
189
203
|
Seven hues in one canonical order —{' '}
|
|
190
204
|
<Text className="font-semibold">blue → magenta → red → orange → green → cyan → amber</Text>{' '}
|
|
191
|
-
— expressed as references into the tonal ramps. The sequence is nested-stable: a chart
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
{CATEGORICAL_CVD_SAFE_MAX} (
|
|
195
|
-
|
|
196
|
-
wants a legend or a second encoding. Two variants ship:{' '}
|
|
205
|
+
— expressed as references into the tonal ramps. The sequence is nested-stable: a chart with
|
|
206
|
+
N series takes the first N colors and a series' index does not shift as N changes. The
|
|
207
|
+
worst-case deuteranopia/protanopia ΔE floor of 8 holds through the first{' '}
|
|
208
|
+
{CATEGORICAL_CVD_SAFE_MAX} (<Text className="font-semibold">CATEGORICAL_CVD_SAFE_MAX</Text>
|
|
209
|
+
); the 7th is extended and wants a legend or a second encoding. Two variants ship:{' '}
|
|
197
210
|
<Text className="font-semibold">default</Text> (vivid, for neutral/light surfaces, legible
|
|
198
|
-
under black text) and <Text className="font-semibold">dark</Text> (deeper, for white text
|
|
199
|
-
|
|
200
|
-
it.
|
|
211
|
+
under black text) and <Text className="font-semibold">dark</Text> (deeper, for white text on
|
|
212
|
+
a filled swatch). A third "light" variant was dropped — `default` doubles as it.
|
|
201
213
|
</SectionIntro>
|
|
202
214
|
|
|
203
215
|
<CategoricalRow name="Default (black text)" colors={categoricalPalette.default} />
|
|
@@ -394,8 +406,8 @@ export const FatigueRomPalette: StoryObj = {
|
|
|
394
406
|
</Text>{' '}
|
|
395
407
|
One scheme shared by the two live-quality readouts — the ROM progression bars and the
|
|
396
408
|
ghost-spark current line. Deliberately no greens and no ambers: those languages belong to
|
|
397
|
-
the verdict tones and the velocity-loss bands (stories 3 and 4), and reusing them here
|
|
398
|
-
|
|
409
|
+
the verdict tones and the velocity-loss bands (stories 3 and 4), and reusing them here would
|
|
410
|
+
make "fine" and "fast" look like the same claim. Every stop is a
|
|
399
411
|
reference into the tonal ramps.
|
|
400
412
|
</SectionIntro>
|
|
401
413
|
|
|
@@ -426,8 +438,8 @@ export const FatigueRomPalette: StoryObj = {
|
|
|
426
438
|
<Text className="text-text-secondary text-xs mb-3">
|
|
427
439
|
A controlled rep (grind signature below GRIND_THRESHOLD = {GRIND_THRESHOLD}) stays in the
|
|
428
440
|
silver family, dimming toward DRIFT_GREY with tempo deviation — a "drifting but not
|
|
429
|
-
failing" cue that never becomes a color. At or above the threshold the line runs
|
|
430
|
-
|
|
441
|
+
failing" cue that never becomes a color. At or above the threshold the line runs light
|
|
442
|
+
→ mid → deep by severity.
|
|
431
443
|
</Text>
|
|
432
444
|
<View style={{ flexDirection: 'row', gap: 32 }}>
|
|
433
445
|
<FatigueRampStrip
|
|
@@ -442,8 +454,8 @@ export const FatigueRomPalette: StoryObj = {
|
|
|
442
454
|
DRIFT_GREY is `neutral[600]` #4B5563, and the unified warm grey ramp assigns it no
|
|
443
455
|
destination — the 15-row fold maps the other greys but skips this one. It needs an
|
|
444
456
|
assignment before that migration lands. Note that the recovered spec records DRIFT_GREY as
|
|
445
|
-
`grey[500]` #1C1C1C; that is stale, `fatigue-tokens.ts` on main reads `neutral[600]`,
|
|
446
|
-
|
|
457
|
+
`grey[500]` #1C1C1C; that is stale, `fatigue-tokens.ts` on main reads `neutral[600]`, which
|
|
458
|
+
puts it in the expensive half of the fold rather than the cheap one.
|
|
447
459
|
</Text>
|
|
448
460
|
</View>
|
|
449
461
|
),
|
|
@@ -461,7 +473,9 @@ export const FatigueRomPalette: StoryObj = {
|
|
|
461
473
|
* buries. Columns are derived from the shipped tokens, so a new modifier shows
|
|
462
474
|
* up here without editing the story.
|
|
463
475
|
*/
|
|
464
|
-
|
|
476
|
+
// Wash rungs run subtle -> muted -> strong (0.12 / 0.30 / 0.50) so the matrix
|
|
477
|
+
// reads as the ramp it is.
|
|
478
|
+
const VARIANT_SUFFIXES = ['light', 'dark', 'subtle', 'muted', 'strong', 'hover', 'active'] as const
|
|
465
479
|
|
|
466
480
|
function variantsOf(base: string, palette: Record<string, string>) {
|
|
467
481
|
return [
|
|
@@ -513,12 +527,12 @@ export const StatusColors: StoryObj = {
|
|
|
513
527
|
<Text className="text-2xl font-bold text-text-primary mb-2">Status Colors</Text>
|
|
514
528
|
<SectionIntro>
|
|
515
529
|
Status roles and their modifiers. <Text className="font-semibold">status-error-vivid</Text>{' '}
|
|
516
|
-
is a separate role (not a modifier of status-error) reserved for destructive
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
530
|
+
is a separate role (not a modifier of status-error) reserved for destructive emphasis. It
|
|
531
|
+
used to be the one status family sourced from the `redVivid` support scale rather than the
|
|
532
|
+
OKLCH ramps; TD-07.14 deleted that scale, so the family now resolves to the same
|
|
533
|
+
red[600]/[500]/[700] steps as status-error. The two are therefore identical in value today —
|
|
534
|
+
the role is kept distinct because emphasis is meant to come from a glow derived from
|
|
535
|
+
red[500], not from a second, higher-chroma red.
|
|
522
536
|
</SectionIntro>
|
|
523
537
|
<VariantMatrix
|
|
524
538
|
bases={[
|
|
@@ -557,8 +571,8 @@ export const ResultColors: StoryObj = {
|
|
|
557
571
|
<Text className="text-2xl font-bold text-text-primary mb-2">Result / Outcome Colors</Text>
|
|
558
572
|
<SectionIntro>
|
|
559
573
|
Colors for indicating positive, negative, or neutral outcomes. Distinct from status: these
|
|
560
|
-
encode the <Text className="italic">direction of a change</Text> (did this get better?),
|
|
561
|
-
|
|
574
|
+
encode the <Text className="italic">direction of a change</Text> (did this get better?), not
|
|
575
|
+
a system state.
|
|
562
576
|
</SectionIntro>
|
|
563
577
|
<VariantMatrix
|
|
564
578
|
bases={['result-improve', 'result-degrade', 'result-inconclusive', 'result-neutral']}
|
|
@@ -574,11 +588,11 @@ export const TextAndBorderColors: StoryObj = {
|
|
|
574
588
|
<View style={{ padding: 24 }}>
|
|
575
589
|
<Text className="text-2xl font-bold text-text-primary mb-2">Text & Border Colors</Text>
|
|
576
590
|
<SectionIntro>
|
|
577
|
-
The dark-mode text and border roles. Today the border family is the grey grey ramp
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
591
|
+
The dark-mode text and border roles. Today the border family is the grey grey ramp assigned
|
|
592
|
+
to line-work, and text-tertiary and the link colors come from the neutral and blue support
|
|
593
|
+
scales — all three of which are pending migration (TD-07.14): the greys fold into one warm
|
|
594
|
+
grey ramp and the links move to the OKLCH blue. These are the roles that will move most,
|
|
595
|
+
because the mid-grey text steps shift furthest. Prefer{' '}
|
|
582
596
|
<Text className="font-semibold">useOnSurfaceColor</Text> for text sitting on a{' '}
|
|
583
597
|
<Text className="font-semibold"><Surface></Text> — it picks the right text role for
|
|
584
598
|
the plane instead of hardcoding one, which is also what makes the migration survivable.
|
|
@@ -782,7 +796,10 @@ export const RolesInUse: StoryObj = {
|
|
|
782
796
|
<Demo label="IntensityBar · effort">
|
|
783
797
|
<View style={{ flexDirection: 'row', gap: 2, width: 132 }}>
|
|
784
798
|
{sequentialEffort.map((hex, i) => (
|
|
785
|
-
<View
|
|
799
|
+
<View
|
|
800
|
+
key={i}
|
|
801
|
+
style={{ flex: 1, height: 20, backgroundColor: hex, borderRadius: 2 }}
|
|
802
|
+
/>
|
|
786
803
|
))}
|
|
787
804
|
</View>
|
|
788
805
|
</Demo>
|
|
@@ -832,10 +849,10 @@ export const LegacyDataVisualizationColors: StoryObj = {
|
|
|
832
849
|
</Text>
|
|
833
850
|
<SectionIntro>
|
|
834
851
|
<Text className="font-semibold">Do not use for new work.</Text> Paul Tol's
|
|
835
|
-
discrete-rainbow scale behind the `data-1..10` tokens — no longer consumed by any
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
852
|
+
discrete-rainbow scale behind the `data-1..10` tokens — no longer consumed by any component.
|
|
853
|
+
Use the Categorical Palette (story 2) for charts and qualitative series. This story exists
|
|
854
|
+
because the tokens are still shipped, and a shipped token without a swatch is the drift the
|
|
855
|
+
coverage test guards against; it goes away when the tokens do.
|
|
839
856
|
</SectionIntro>
|
|
840
857
|
|
|
841
858
|
<View style={{ gap: 16 }}>
|
|
@@ -66,7 +66,9 @@ const PLANE_BY_STEP: Record<number, string> = Object.fromEntries(
|
|
|
66
66
|
/** Steps whose value is byte-identical to what shipped in v0.10.0. */
|
|
67
67
|
const ANCHOR_STEPS = new Set<number>(Object.values(SURFACE_PLANE_STEPS))
|
|
68
68
|
|
|
69
|
-
const GREY_STEPS = Object.keys(greyRamp)
|
|
69
|
+
const GREY_STEPS = Object.keys(greyRamp)
|
|
70
|
+
.map(Number)
|
|
71
|
+
.sort((a, b) => a - b)
|
|
70
72
|
|
|
71
73
|
/**
|
|
72
74
|
* The grey ramp, rendered as a numbered scale with its plane aliases.
|
|
@@ -92,7 +94,10 @@ function GreyRampRow() {
|
|
|
92
94
|
borderColor: ANCHOR_STEPS.has(step) ? '#FF7900' : SWATCH_BORDER,
|
|
93
95
|
}}
|
|
94
96
|
/>
|
|
95
|
-
<Text
|
|
97
|
+
<Text
|
|
98
|
+
className="text-text-primary"
|
|
99
|
+
style={{ fontSize: 10, fontWeight: '600', marginTop: 3 }}
|
|
100
|
+
>
|
|
96
101
|
{step}
|
|
97
102
|
{ANCHOR_STEPS.has(step) ? ' ★' : ''}
|
|
98
103
|
</Text>
|
|
@@ -115,11 +120,10 @@ export const Ramps: StoryObj = {
|
|
|
115
120
|
<View style={{ padding: 24 }}>
|
|
116
121
|
<Text className="text-2xl font-bold text-text-primary mb-2">Ramps</Text>
|
|
117
122
|
<SectionIntro>
|
|
118
|
-
Every raw colour value titan ships, as ordered scales. Nothing here carries meaning — a
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
this page is current and safe to pick.
|
|
123
|
+
Every raw colour value titan ships, as ordered scales. Nothing here carries meaning — a ramp
|
|
124
|
+
step becomes a border or a status only when a semantic token or a palette references it,
|
|
125
|
+
which is what <Text className="font-semibold">Foundations/Color/Palettes</Text> documents.
|
|
126
|
+
Everything on this page is current and safe to pick.
|
|
123
127
|
</SectionIntro>
|
|
124
128
|
|
|
125
129
|
<Text className="text-text-tertiary text-xs mb-6">
|
|
@@ -127,21 +131,20 @@ export const Ramps: StoryObj = {
|
|
|
127
131
|
<Text className="font-semibold">neutral</Text>,{' '}
|
|
128
132
|
<Text className="font-semibold">redVivid</Text> or the support{' '}
|
|
129
133
|
<Text className="font-semibold">blue</Text>/<Text className="font-semibold">red</Text>{' '}
|
|
130
|
-
scales? All five were DELETED in TD-07.14, not shelved. The two grey scales folded into
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
sources/design/foundations/warm-grey-ramp/.
|
|
134
|
+
scales? All five were DELETED in TD-07.14, not shelved. The two grey scales folded into the
|
|
135
|
+
warm ramp below — they were cold (neutral ran R−B down to −26) while the surfaces had been
|
|
136
|
+
warm since v0.10.0, and nothing ever reconciled the two. The chromatics moved to the OKLCH
|
|
137
|
+
ramps above. Spec and generator: sources/design/foundations/warm-grey-ramp/.
|
|
135
138
|
</Text>
|
|
136
139
|
|
|
137
140
|
<SectionTitle>Chromatic — OKLCH tonal ramps</SectionTitle>
|
|
138
141
|
<Text className="text-text-secondary text-xs mb-4">
|
|
139
|
-
Seven OKLCH-generated hue ramps, 11 perceptual steps each (50 → 950), built with
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
142
|
+
Seven OKLCH-generated hue ramps, 11 perceptual steps each (50 → 950), built with hue-torsion
|
|
143
|
+
and a chroma arc anchored through the brand/semantic hexes. These are the source of truth
|
|
144
|
+
for chromatic hexes: the categorical, diverging, effort and fatigue palettes are all
|
|
145
|
+
references into these steps rather than duplicated values, so re-tuning a ramp moves them
|
|
146
|
+
together. Amber absorbs the former yellow (lemon → warm body) and cyan absorbs the former
|
|
147
|
+
steel.
|
|
145
148
|
</Text>
|
|
146
149
|
{CHROMATIC_RAMPS.map(([key, name]) => (
|
|
147
150
|
<ScaleRow key={key} name={name} scale={primitiveRamps[key]} />
|
|
@@ -157,16 +160,15 @@ export const Ramps: StoryObj = {
|
|
|
157
160
|
set of names.
|
|
158
161
|
</Text>
|
|
159
162
|
<Text className="text-text-secondary text-xs mb-4">
|
|
160
|
-
Two things about the numbering, both deliberate.{' '}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
<Text className="font-semibold">
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
pressed></Text> kept collapsing into it.
|
|
163
|
+
Two things about the numbering, both deliberate. <Text className="font-semibold">975</Text>{' '}
|
|
164
|
+
sits past the end of the shared grid: the canonical L* ladder — the median of the seven
|
|
165
|
+
chromatic ramps — stops at L*10.3, which is step 950, and the bezel is L*3.8. There was no
|
|
166
|
+
number left for it. <Text className="font-semibold">850</Text> and{' '}
|
|
167
|
+
<Text className="font-semibold">875</Text> are quarter-steps because overlay, raised and
|
|
168
|
+
elevated sit only ~2.7 L* apart and all three collide on 900 at normal resolution. There is
|
|
169
|
+
deliberately no <Text className="font-semibold">inset</Text>: at ΔE 1.10 from the frame it
|
|
170
|
+
was an imperceptible duplicate, which is why{' '}
|
|
171
|
+
<Text className="font-semibold"><Surface pressed></Text> kept collapsing into it.
|
|
170
172
|
</Text>
|
|
171
173
|
<GreyRampRow />
|
|
172
174
|
<Text className="text-text-tertiary text-xs mb-4">
|
|
@@ -258,8 +260,8 @@ export const Accessibility: StoryObj = {
|
|
|
258
260
|
<SectionIntro>
|
|
259
261
|
How the raw material behaves for viewers who cannot separate the hues, and under text.
|
|
260
262
|
Dichromacy is simulated with the Machado-2009 matrices at severity 1.0. Converging strips
|
|
261
|
-
across two swatches mean those two are the same colour to that viewer — which is a
|
|
262
|
-
|
|
263
|
+
across two swatches mean those two are the same colour to that viewer — which is a problem
|
|
264
|
+
only where hue is carrying the meaning on its own.
|
|
263
265
|
</SectionIntro>
|
|
264
266
|
|
|
265
267
|
<SectionTitle>Ramp mid-steps (500)</SectionTitle>
|
|
@@ -269,9 +271,7 @@ export const Accessibility: StoryObj = {
|
|
|
269
271
|
below fans its picks across lightness instead of taking all seven at 500, and why the
|
|
270
272
|
ordered scales in Palettes encode magnitude in lightness rather than hue.
|
|
271
273
|
</Text>
|
|
272
|
-
<View
|
|
273
|
-
style={{ flexDirection: 'row', gap: 6, marginBottom: 6, paddingLeft: CVD_LABEL_WIDTH }}
|
|
274
|
-
>
|
|
274
|
+
<View style={{ flexDirection: 'row', gap: 6, marginBottom: 6, paddingLeft: CVD_LABEL_WIDTH }}>
|
|
275
275
|
{RAMP_MIDS.map(({ name, hex }) => (
|
|
276
276
|
<View key={name} style={{ alignItems: 'center' }}>
|
|
277
277
|
<View
|
|
@@ -297,8 +297,8 @@ export const Accessibility: StoryObj = {
|
|
|
297
297
|
<SectionTitle>Categorical series — in-place text contrast</SectionTitle>
|
|
298
298
|
<Text className="text-text-secondary text-xs mb-3">
|
|
299
299
|
The palette that has to survive this test in production. All pairs hold ΔE ≥ 8 through the
|
|
300
|
-
first {CATEGORICAL_CVD_SAFE_MAX}; the 7th is extended and wants a legend. The palette
|
|
301
|
-
|
|
300
|
+
first {CATEGORICAL_CVD_SAFE_MAX}; the 7th is extended and wants a legend. The palette itself
|
|
301
|
+
is documented in Palettes — this is the validation of it.
|
|
302
302
|
</Text>
|
|
303
303
|
{(['default', 'dark'] as const).map((variant) => {
|
|
304
304
|
const colors = categoricalPalette[variant]
|