@titan-design/react-ui 0.12.0 → 0.13.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 +46 -47
- package/dist/bodymap.js +768 -701
- package/dist/bodymap.js.map +1 -1
- package/dist/bodymap.mjs +770 -703
- package/dist/bodymap.mjs.map +1 -1
- package/dist/index.d.mts +1320 -215
- package/dist/index.d.ts +1320 -215
- package/dist/index.js +5996 -4498
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +5773 -4357
- package/dist/index.mjs.map +1 -1
- package/dist/{pages-CvsFqNtx.d.mts → pages-CpW3OB3g.d.mts} +21 -3
- package/dist/{pages-B1hqnGIC.d.ts → pages-_3Ajpiqu.d.ts} +21 -3
- package/dist/pages.d.mts +1 -1
- package/dist/pages.d.ts +1 -1
- package/dist/pages.js +1435 -1428
- package/dist/pages.js.map +1 -1
- package/dist/pages.mjs +1443 -1436
- package/dist/pages.mjs.map +1 -1
- package/dist/theme/index.d.mts +202 -1042
- package/dist/theme/index.d.ts +202 -1042
- package/dist/theme/index.js +215 -300
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/index.mjs +202 -296
- package/dist/theme/index.mjs.map +1 -1
- package/dist/theme/tokens-css.js +62 -5
- package/dist/theme/tokens-css.js.map +1 -1
- package/dist/theme/tokens-css.mjs +62 -5
- package/dist/theme/tokens-css.mjs.map +1 -1
- package/dist/theme/tokens.d.mts +972 -0
- package/dist/theme/tokens.d.ts +972 -0
- package/dist/theme/tokens.js +904 -0
- package/dist/theme/tokens.js.map +1 -0
- package/dist/theme/tokens.mjs +880 -0
- package/dist/theme/tokens.mjs.map +1 -0
- 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/package.json +7 -1
- package/src/arch/arch-graph.freshness.test.ts +52 -0
- package/src/arch/arch-graph.json +5021 -1617
- 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 +181 -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 +4 -3
- 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 +2 -2
- package/src/components/custom/Gauge/Gauge.test.tsx +1 -1
- package/src/components/custom/Gauge/Gauge.tsx +4 -1
- 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 +46 -8
- package/src/components/custom/Scatter/Scatter.test.tsx +2 -2
- package/src/components/custom/Scatter/Scatter.tsx +116 -14
- package/src/components/custom/Sidebar/Sidebar.stories.tsx +40 -7
- 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 +98 -15
- 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 +2 -2
- package/src/components/custom/Treemap/Treemap.test.tsx +1 -1
- package/src/components/custom/Treemap/Treemap.tsx +7 -2
- 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 +9 -1
- package/src/components/custom/Workout/BaseBadge.stories.tsx +19 -7
- package/src/components/custom/Workout/BaseBadge.test.tsx +31 -11
- package/src/components/custom/Workout/BaseBadge.tsx +3 -0
- package/src/components/custom/Workout/BodyMap.stories.tsx +4 -1
- package/src/components/custom/Workout/BodyMap.tsx +3 -1
- package/src/components/custom/Workout/BodyMapDetailPanel.stories.tsx +16 -4
- package/src/components/custom/Workout/BodyMapDetailPanel.test.tsx +11 -15
- package/src/components/custom/Workout/BodyMapDetailPanel.tsx +45 -9
- package/src/components/custom/Workout/CapacityBandChart.stories.tsx +10 -8
- package/src/components/custom/Workout/CapacityBandChart.test.tsx +24 -51
- package/src/components/custom/Workout/CapacityBandChart.tsx +139 -108
- package/src/components/custom/Workout/DeviationBar.stories.tsx +1 -1
- package/src/components/custom/Workout/DeviationBar.test.tsx +5 -2
- package/src/components/custom/Workout/DeviationBar.tsx +21 -16
- package/src/components/custom/Workout/DualVelocityStrip.stories.tsx +182 -0
- package/src/components/custom/Workout/DualVelocityStrip.test.tsx +3 -2
- package/src/components/custom/Workout/ExerciseCard.stories.tsx +8 -7
- package/src/components/custom/Workout/ExerciseCard.test.tsx +13 -3
- package/src/components/custom/Workout/ExerciseCard.tsx +42 -51
- package/src/components/custom/Workout/ExerciseCardHeading.stories.tsx +7 -7
- package/src/components/custom/Workout/ExerciseDetailPage.stories.tsx +9 -1
- package/src/components/custom/Workout/ExerciseHeading.stories.tsx +8 -8
- package/src/components/custom/Workout/ExerciseHeading.tsx +8 -5
- package/src/components/custom/Workout/ExerciseIndicator.stories.tsx +6 -4
- 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/IntensityBar.stories.tsx +1 -1
- package/src/components/custom/Workout/IntensityBar.test.tsx +5 -1
- package/src/components/custom/Workout/IntensityBar.tsx +4 -2
- 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 +12 -9
- 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 +9 -23
- 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 +1 -1
- 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 +4 -1
- 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 +12 -7
- 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 +19 -3
- package/src/components/custom/Workout/RestTimer.stories.tsx +3 -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 +5 -5
- package/src/components/custom/Workout/SegmentedBar.tsx +6 -2
- 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 +60 -5
- 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 +3 -5
- package/src/components/custom/Workout/Sparkline.stories.tsx +1 -1
- 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 +9 -3
- package/src/components/custom/Workout/StrengthTrendChart.test.tsx +15 -37
- package/src/components/custom/Workout/StrengthTrendChart.tsx +31 -30
- 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 +22 -7
- package/src/components/custom/Workout/TempoDisplay.test.tsx +18 -4
- 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 +7 -4
- package/src/components/custom/Workout/VelocityStrip.expanded.stories.tsx +4 -1
- package/src/components/custom/Workout/VelocityStrip.hero.stories.tsx +4 -1
- package/src/components/custom/Workout/VelocityStrip.stories.tsx +12 -6
- package/src/components/custom/Workout/VelocityStrip.tsx +3 -0
- 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 +7 -6
- package/src/components/custom/Workout/ZoneTrack.tsx +10 -9
- package/src/components/custom/Workout/index.ts +5 -0
- package/src/components/custom/Workout/metricText.stories.tsx +6 -5
- package/src/components/custom/Workout/metricText.tsx +4 -0
- package/src/components/custom/Workout/setHeadingKit.tsx +207 -26
- package/src/components/custom/charts/README.md +61 -0
- package/src/components/custom/charts/SetBarChart.test.tsx +30 -1
- package/src/components/custom/charts/SetBarChart.tsx +42 -4
- 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/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 +13 -28
- 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 +90 -27
- 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 +1 -1
- 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 +32 -25
- 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 +6 -26
- 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 +9 -2
- 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 -30
- 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 +2 -12
- package/src/components/ui/indicator/Indicator.stories.tsx +1 -1
- 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 +11 -2
- 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 +29 -19
- package/src/components/ui/pill/Pill.stories.tsx +58 -23
- package/src/components/ui/pill/Pill.test.tsx +101 -3
- package/src/components/ui/pill/Pill.tsx +164 -49
- package/src/components/ui/pill/index.ts +1 -1
- package/src/components/ui/popover/Popover.stories.tsx +5 -7
- 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/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 +5 -14
- 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 +14 -14
- 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 +1 -4
- package/src/components/ui/stack/Stack.stories.tsx +1 -1
- package/src/components/ui/stack/Stack.tsx +1 -1
- package/src/components/ui/surface/Surface.stories.tsx +17 -5
- 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 +7 -22
- 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 +43 -53
- 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 +25 -43
- 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 +100 -47
- package/src/test/no-device-internals.test.ts +3 -3
- 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 +24 -22
- 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 +28 -0
- package/src/theme/elevation.test.ts +82 -56
- package/src/theme/elevation.ts +77 -561
- package/src/theme/global.css +30 -2
- 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/surface-planes.test.ts +37 -0
- package/src/theme/surface-planes.ts +68 -0
- package/src/theme/token-export-guard.test.ts +102 -0
- package/src/theme/tokens/primitives.test.ts +15 -7
- package/src/theme/tokens/primitives.ts +67 -35
- package/src/theme/tokens/semantic.ts +71 -37
- 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.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 +5 -0
- 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
|
@@ -6,7 +6,7 @@ import { Radio, RadioGroup } from './Radio'
|
|
|
6
6
|
const meta: Meta<typeof RadioGroup> = {
|
|
7
7
|
title: 'Components/Molecules/Radio',
|
|
8
8
|
component: RadioGroup,
|
|
9
|
-
tags: ['autodocs'],
|
|
9
|
+
tags: ['autodocs', 'status:stable', '!status:review'],
|
|
10
10
|
argTypes: {
|
|
11
11
|
size: {
|
|
12
12
|
control: 'select',
|
|
@@ -60,12 +60,7 @@ export const Horizontal: Story = {
|
|
|
60
60
|
render: function Render() {
|
|
61
61
|
const [value, setValue] = useState<string | null>('monthly')
|
|
62
62
|
return (
|
|
63
|
-
<RadioGroup
|
|
64
|
-
value={value}
|
|
65
|
-
onChange={setValue}
|
|
66
|
-
orientation="horizontal"
|
|
67
|
-
label="Billing Cycle"
|
|
68
|
-
>
|
|
63
|
+
<RadioGroup value={value} onChange={setValue} orientation="horizontal" label="Billing Cycle">
|
|
69
64
|
<Radio value="monthly">Monthly</Radio>
|
|
70
65
|
<Radio value="quarterly">Quarterly</Radio>
|
|
71
66
|
<Radio value="yearly">Yearly</Radio>
|
|
@@ -79,7 +74,7 @@ export const AllSizes: Story = {
|
|
|
79
74
|
const [small, setSmall] = useState<string | null>('a')
|
|
80
75
|
const [medium, setMedium] = useState<string | null>('a')
|
|
81
76
|
const [large, setLarge] = useState<string | null>('a')
|
|
82
|
-
|
|
77
|
+
|
|
83
78
|
return (
|
|
84
79
|
<View className="gap-6">
|
|
85
80
|
<View>
|
|
@@ -114,22 +109,46 @@ export const AllColors: Story = {
|
|
|
114
109
|
const [secondary, setSecondary] = useState<string | null>('a')
|
|
115
110
|
const [success, setSuccess] = useState<string | null>('a')
|
|
116
111
|
const [error, setError] = useState<string | null>('a')
|
|
117
|
-
|
|
112
|
+
|
|
118
113
|
return (
|
|
119
114
|
<View className="gap-6">
|
|
120
|
-
<RadioGroup
|
|
115
|
+
<RadioGroup
|
|
116
|
+
value={primary}
|
|
117
|
+
onChange={setPrimary}
|
|
118
|
+
color="primary"
|
|
119
|
+
orientation="horizontal"
|
|
120
|
+
label="Primary"
|
|
121
|
+
>
|
|
121
122
|
<Radio value="a">Option A</Radio>
|
|
122
123
|
<Radio value="b">Option B</Radio>
|
|
123
124
|
</RadioGroup>
|
|
124
|
-
<RadioGroup
|
|
125
|
+
<RadioGroup
|
|
126
|
+
value={secondary}
|
|
127
|
+
onChange={setSecondary}
|
|
128
|
+
color="secondary"
|
|
129
|
+
orientation="horizontal"
|
|
130
|
+
label="Secondary"
|
|
131
|
+
>
|
|
125
132
|
<Radio value="a">Option A</Radio>
|
|
126
133
|
<Radio value="b">Option B</Radio>
|
|
127
134
|
</RadioGroup>
|
|
128
|
-
<RadioGroup
|
|
135
|
+
<RadioGroup
|
|
136
|
+
value={success}
|
|
137
|
+
onChange={setSuccess}
|
|
138
|
+
color="success"
|
|
139
|
+
orientation="horizontal"
|
|
140
|
+
label="Success"
|
|
141
|
+
>
|
|
129
142
|
<Radio value="a">Option A</Radio>
|
|
130
143
|
<Radio value="b">Option B</Radio>
|
|
131
144
|
</RadioGroup>
|
|
132
|
-
<RadioGroup
|
|
145
|
+
<RadioGroup
|
|
146
|
+
value={error}
|
|
147
|
+
onChange={setError}
|
|
148
|
+
color="error"
|
|
149
|
+
orientation="horizontal"
|
|
150
|
+
label="Error"
|
|
151
|
+
>
|
|
133
152
|
<Radio value="a">Option A</Radio>
|
|
134
153
|
<Radio value="b">Option B</Radio>
|
|
135
154
|
</RadioGroup>
|
|
@@ -154,7 +173,9 @@ export const Disabled: Story = {
|
|
|
154
173
|
<Text className="text-text-secondary text-sm mb-2">Individual option disabled</Text>
|
|
155
174
|
<RadioGroup value={value} onChange={setValue}>
|
|
156
175
|
<Radio value="option1">Option 1 (enabled)</Radio>
|
|
157
|
-
<Radio value="option2" isDisabled>
|
|
176
|
+
<Radio value="option2" isDisabled>
|
|
177
|
+
Option 2 (disabled)
|
|
178
|
+
</Radio>
|
|
158
179
|
<Radio value="option3">Option 3 (enabled)</Radio>
|
|
159
180
|
</RadioGroup>
|
|
160
181
|
</View>
|
|
@@ -167,27 +188,27 @@ export const FormExample: Story = {
|
|
|
167
188
|
render: function Render() {
|
|
168
189
|
const [plan, setPlan] = useState<string | null>('pro')
|
|
169
190
|
const [billing, setBilling] = useState<string | null>('monthly')
|
|
170
|
-
|
|
191
|
+
|
|
171
192
|
return (
|
|
172
193
|
<View className="gap-6 p-4 bg-surface-base rounded-lg max-w-md">
|
|
173
194
|
<Text className="text-lg font-semibold text-text-primary">Subscription Settings</Text>
|
|
174
|
-
|
|
195
|
+
|
|
175
196
|
<RadioGroup value={plan} onChange={setPlan} label="Select Plan">
|
|
176
197
|
<Radio value="free">Free - Basic features</Radio>
|
|
177
198
|
<Radio value="pro">Pro - Advanced features</Radio>
|
|
178
199
|
<Radio value="enterprise">Enterprise - Custom solutions</Radio>
|
|
179
200
|
</RadioGroup>
|
|
180
|
-
|
|
181
|
-
<RadioGroup
|
|
182
|
-
value={billing}
|
|
183
|
-
onChange={setBilling}
|
|
201
|
+
|
|
202
|
+
<RadioGroup
|
|
203
|
+
value={billing}
|
|
204
|
+
onChange={setBilling}
|
|
184
205
|
orientation="horizontal"
|
|
185
206
|
label="Billing Frequency"
|
|
186
207
|
>
|
|
187
208
|
<Radio value="monthly">Monthly</Radio>
|
|
188
209
|
<Radio value="yearly">Yearly (save 20%)</Radio>
|
|
189
210
|
</RadioGroup>
|
|
190
|
-
|
|
211
|
+
|
|
191
212
|
<View className="pt-4 border-t border-hairline">
|
|
192
213
|
<Text className="text-sm text-text-secondary">
|
|
193
214
|
Selected: {plan} plan, billed {billing}
|
|
@@ -68,7 +68,9 @@ describe('Radio', () => {
|
|
|
68
68
|
render(
|
|
69
69
|
<RadioGroup value="a" onChange={onChange}>
|
|
70
70
|
<Radio value="a">A</Radio>
|
|
71
|
-
<Radio value="b" isDisabled>
|
|
71
|
+
<Radio value="b" isDisabled>
|
|
72
|
+
B
|
|
73
|
+
</Radio>
|
|
72
74
|
</RadioGroup>
|
|
73
75
|
)
|
|
74
76
|
const radios = screen.getAllByRole('radio')
|
|
@@ -134,7 +136,9 @@ describe('Radio', () => {
|
|
|
134
136
|
it('allows Radio to override group size and color', () => {
|
|
135
137
|
render(
|
|
136
138
|
<RadioGroup value="a" onChange={() => {}} size="sm" color="primary">
|
|
137
|
-
<Radio value="a" size="lg" color="error">
|
|
139
|
+
<Radio value="a" size="lg" color="error">
|
|
140
|
+
A
|
|
141
|
+
</Radio>
|
|
138
142
|
</RadioGroup>
|
|
139
143
|
)
|
|
140
144
|
expect(screen.getByRole('radio')).toBeInTheDocument()
|
|
@@ -78,11 +78,7 @@ export function RadioGroup({
|
|
|
78
78
|
accessibilityLabel={label}
|
|
79
79
|
{...props}
|
|
80
80
|
>
|
|
81
|
-
{label &&
|
|
82
|
-
<Text className="text-sm font-medium text-text-primary mb-2">
|
|
83
|
-
{label}
|
|
84
|
-
</Text>
|
|
85
|
-
)}
|
|
81
|
+
{label && <Text className="text-sm font-medium text-text-primary mb-2">{label}</Text>}
|
|
86
82
|
<View
|
|
87
83
|
className={cn(
|
|
88
84
|
orientation === 'horizontal' ? 'flex-row flex-wrap' : 'flex-col',
|
|
@@ -117,9 +113,18 @@ const sizeConfig: Record<RadioSize, { outer: string; inner: string; text: string
|
|
|
117
113
|
}
|
|
118
114
|
|
|
119
115
|
const colorStyles: Record<RadioColor, { checked: string; unchecked: string }> = {
|
|
120
|
-
primary: {
|
|
121
|
-
|
|
122
|
-
|
|
116
|
+
primary: {
|
|
117
|
+
checked: 'border-brand-primary bg-brand-primary',
|
|
118
|
+
unchecked: 'border-hairline-strong',
|
|
119
|
+
},
|
|
120
|
+
secondary: {
|
|
121
|
+
checked: 'border-brand-secondary bg-brand-secondary',
|
|
122
|
+
unchecked: 'border-hairline-strong',
|
|
123
|
+
},
|
|
124
|
+
success: {
|
|
125
|
+
checked: 'border-status-success bg-status-success',
|
|
126
|
+
unchecked: 'border-hairline-strong',
|
|
127
|
+
},
|
|
123
128
|
error: { checked: 'border-status-error bg-status-error', unchecked: 'border-hairline-strong' },
|
|
124
129
|
}
|
|
125
130
|
|
|
@@ -144,7 +149,13 @@ export function Radio({
|
|
|
144
149
|
throw new Error('Radio must be used within a RadioGroup')
|
|
145
150
|
}
|
|
146
151
|
|
|
147
|
-
const {
|
|
152
|
+
const {
|
|
153
|
+
value: selectedValue,
|
|
154
|
+
onChange,
|
|
155
|
+
isDisabled: groupDisabled,
|
|
156
|
+
size: groupSize,
|
|
157
|
+
color: groupColor,
|
|
158
|
+
} = context
|
|
148
159
|
|
|
149
160
|
const isDisabled = radioDisabled ?? groupDisabled ?? false
|
|
150
161
|
const size = radioSize ?? groupSize ?? 'md'
|
|
@@ -166,11 +177,7 @@ export function Radio({
|
|
|
166
177
|
disabled={isDisabled}
|
|
167
178
|
accessibilityRole="radio"
|
|
168
179
|
accessibilityState={{ checked: isChecked, disabled: isDisabled }}
|
|
169
|
-
className={cn(
|
|
170
|
-
'flex-row items-center',
|
|
171
|
-
isDisabled && 'opacity-50',
|
|
172
|
-
className
|
|
173
|
-
)}
|
|
180
|
+
className={cn('flex-row items-center', isDisabled && 'opacity-50', className)}
|
|
174
181
|
{...props}
|
|
175
182
|
>
|
|
176
183
|
{/* Radio circle */}
|
|
@@ -184,17 +191,11 @@ export function Radio({
|
|
|
184
191
|
)}
|
|
185
192
|
>
|
|
186
193
|
{/* Inner dot */}
|
|
187
|
-
{isChecked && (
|
|
188
|
-
<View className={cn('rounded-full bg-white', inner)} />
|
|
189
|
-
)}
|
|
194
|
+
{isChecked && <View className={cn('rounded-full bg-white', inner)} />}
|
|
190
195
|
</View>
|
|
191
196
|
|
|
192
197
|
{/* Label */}
|
|
193
|
-
{children && (
|
|
194
|
-
<Text className={cn('ml-2 text-text-primary', text)}>
|
|
195
|
-
{children}
|
|
196
|
-
</Text>
|
|
197
|
-
)}
|
|
198
|
+
{children && <Text className={cn('ml-2 text-text-primary', text)}>{children}</Text>}
|
|
198
199
|
</Pressable>
|
|
199
200
|
)
|
|
200
201
|
}
|
|
@@ -5,7 +5,7 @@ import { Section, SectionHeader, SectionContent } from './Section'
|
|
|
5
5
|
const meta: Meta<typeof Section> = {
|
|
6
6
|
title: 'Components/Atoms/Section',
|
|
7
7
|
component: Section,
|
|
8
|
-
tags: ['autodocs'],
|
|
8
|
+
tags: ['autodocs', 'status:stable', '!status:review'],
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
export default meta
|
|
@@ -25,10 +25,7 @@ export const Default: Story = {
|
|
|
25
25
|
export const WithSubtitle: Story = {
|
|
26
26
|
render: () => (
|
|
27
27
|
<Section>
|
|
28
|
-
<SectionHeader
|
|
29
|
-
title="Workout Stats"
|
|
30
|
-
subtitle="Last 7 days"
|
|
31
|
-
/>
|
|
28
|
+
<SectionHeader title="Workout Stats" subtitle="Last 7 days" />
|
|
32
29
|
<SectionContent>
|
|
33
30
|
<Text style={{ color: '#a0a0a0' }}>Stats content</Text>
|
|
34
31
|
</SectionContent>
|
|
@@ -41,9 +38,7 @@ export const WithTrailingAction: Story = {
|
|
|
41
38
|
<Section>
|
|
42
39
|
<SectionHeader
|
|
43
40
|
title="Exercises"
|
|
44
|
-
trailing={
|
|
45
|
-
<Text style={{ color: '#6366f1', fontSize: 13 }}>View All</Text>
|
|
46
|
-
}
|
|
41
|
+
trailing={<Text style={{ color: '#6366f1', fontSize: 13 }}>View All</Text>}
|
|
47
42
|
/>
|
|
48
43
|
<SectionContent>
|
|
49
44
|
<Text style={{ color: '#a0a0a0' }}>Exercise list</Text>
|
|
@@ -58,9 +53,7 @@ export const FullExample: Story = {
|
|
|
58
53
|
<SectionHeader
|
|
59
54
|
title="Performance"
|
|
60
55
|
subtitle="Average velocity by set"
|
|
61
|
-
trailing={
|
|
62
|
-
<Text style={{ color: '#6366f1', fontSize: 13 }}>Details</Text>
|
|
63
|
-
}
|
|
56
|
+
trailing={<Text style={{ color: '#6366f1', fontSize: 13 }}>Details</Text>}
|
|
64
57
|
/>
|
|
65
58
|
<SectionContent className="rounded-lg bg-surface-elevated p-4">
|
|
66
59
|
<Text style={{ color: '#a0a0a0' }}>Chart or data visualization</Text>
|
|
@@ -83,9 +76,7 @@ export const MultipleSections: Story = {
|
|
|
83
76
|
<SectionHeader
|
|
84
77
|
title="This Week"
|
|
85
78
|
subtitle="12 sets completed"
|
|
86
|
-
trailing={
|
|
87
|
-
<Text style={{ color: '#6366f1', fontSize: 13 }}>See All</Text>
|
|
88
|
-
}
|
|
79
|
+
trailing={<Text style={{ color: '#6366f1', fontSize: 13 }}>See All</Text>}
|
|
89
80
|
/>
|
|
90
81
|
<SectionContent className="rounded-lg bg-surface-elevated p-4">
|
|
91
82
|
<Text style={{ color: '#a0a0a0' }}>Weekly summary</Text>
|
|
@@ -42,12 +42,7 @@ describe('SectionHeader', () => {
|
|
|
42
42
|
})
|
|
43
43
|
|
|
44
44
|
it('renders trailing action when provided', () => {
|
|
45
|
-
render(
|
|
46
|
-
<SectionHeader
|
|
47
|
-
title="Title"
|
|
48
|
-
trailing={<Text>View All</Text>}
|
|
49
|
-
/>
|
|
50
|
-
)
|
|
45
|
+
render(<SectionHeader title="Title" trailing={<Text>View All</Text>} />)
|
|
51
46
|
expect(screen.getByText('View All')).toBeInTheDocument()
|
|
52
47
|
})
|
|
53
48
|
|
|
@@ -29,9 +29,7 @@ export function SectionHeader({ title, subtitle, trailing, className }: SectionH
|
|
|
29
29
|
<Text className="text-sm font-semibold text-text-secondary uppercase tracking-wider">
|
|
30
30
|
{title}
|
|
31
31
|
</Text>
|
|
32
|
-
{subtitle &&
|
|
33
|
-
<Text className="text-xs text-text-tertiary mt-0.5">{subtitle}</Text>
|
|
34
|
-
)}
|
|
32
|
+
{subtitle && <Text className="text-xs text-text-tertiary mt-0.5">{subtitle}</Text>}
|
|
35
33
|
</View>
|
|
36
34
|
{trailing && <View>{trailing}</View>}
|
|
37
35
|
</View>
|
|
@@ -101,12 +101,7 @@ export const Disabled: Story = {
|
|
|
101
101
|
</View>
|
|
102
102
|
<View style={{ gap: 4 }}>
|
|
103
103
|
<Text className="text-sm text-text-secondary">Disabled with value</Text>
|
|
104
|
-
<Select
|
|
105
|
-
value="banana"
|
|
106
|
-
onChange={() => {}}
|
|
107
|
-
options={basicOptions}
|
|
108
|
-
isDisabled
|
|
109
|
-
/>
|
|
104
|
+
<Select value="banana" onChange={() => {}} options={basicOptions} isDisabled />
|
|
110
105
|
</View>
|
|
111
106
|
</View>
|
|
112
107
|
),
|
|
@@ -235,16 +230,11 @@ export const Controlled: Story = {
|
|
|
235
230
|
</Text>
|
|
236
231
|
</View>
|
|
237
232
|
))}
|
|
238
|
-
<Text
|
|
239
|
-
className="text-sm text-status-error underline"
|
|
240
|
-
onPress={() => setValue(null)}
|
|
241
|
-
>
|
|
233
|
+
<Text className="text-sm text-status-error underline" onPress={() => setValue(null)}>
|
|
242
234
|
Clear
|
|
243
235
|
</Text>
|
|
244
236
|
</View>
|
|
245
|
-
<Text className="text-sm text-text-secondary">
|
|
246
|
-
Current value: {value ?? 'null'}
|
|
247
|
-
</Text>
|
|
237
|
+
<Text className="text-sm text-text-secondary">Current value: {value ?? 'null'}</Text>
|
|
248
238
|
</View>
|
|
249
239
|
)
|
|
250
240
|
},
|
|
@@ -94,14 +94,7 @@ describe('Select', () => {
|
|
|
94
94
|
|
|
95
95
|
it('calls onChangeMulti when toggling options', () => {
|
|
96
96
|
const onChangeMulti = vi.fn()
|
|
97
|
-
render(
|
|
98
|
-
<Select
|
|
99
|
-
options={defaultOptions}
|
|
100
|
-
isMulti
|
|
101
|
-
values={[]}
|
|
102
|
-
onChangeMulti={onChangeMulti}
|
|
103
|
-
/>
|
|
104
|
-
)
|
|
97
|
+
render(<Select options={defaultOptions} isMulti values={[]} onChangeMulti={onChangeMulti} />)
|
|
105
98
|
|
|
106
99
|
fireEvent.click(screen.getByRole('combobox'))
|
|
107
100
|
fireEvent.click(screen.getByText('Option 1'))
|
|
@@ -163,9 +156,7 @@ describe('Select', () => {
|
|
|
163
156
|
|
|
164
157
|
describe('accessibility', () => {
|
|
165
158
|
it('has no accessibility violations', async () => {
|
|
166
|
-
const { container } = render(
|
|
167
|
-
<Select options={defaultOptions} value="1" />
|
|
168
|
-
)
|
|
159
|
+
const { container } = render(<Select options={defaultOptions} value="1" />)
|
|
169
160
|
const results = await axe(container, {
|
|
170
161
|
rules: {
|
|
171
162
|
'aria-input-field-name': { enabled: false },
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React, { useState, createContext, useContext } from 'react'
|
|
2
2
|
import { View, Text, Pressable, ScrollView, type ViewProps } from 'react-native'
|
|
3
3
|
import { cn } from '../../../utils/cn'
|
|
4
|
+
import { Surface } from '../surface'
|
|
4
5
|
|
|
5
6
|
export interface SelectOption<T = string> {
|
|
6
7
|
value: T
|
|
@@ -91,9 +92,7 @@ export function Select<T extends string = string>({
|
|
|
91
92
|
|
|
92
93
|
const selectValue = (val: T) => {
|
|
93
94
|
if (isMulti) {
|
|
94
|
-
const newValues = values.includes(val)
|
|
95
|
-
? values.filter((v) => v !== val)
|
|
96
|
-
: [...values, val]
|
|
95
|
+
const newValues = values.includes(val) ? values.filter((v) => v !== val) : [...values, val]
|
|
97
96
|
onChangeMulti?.(newValues)
|
|
98
97
|
} else {
|
|
99
98
|
onChange?.(val)
|
|
@@ -152,12 +151,7 @@ export function Select<T extends string = string>({
|
|
|
152
151
|
isDisabled && 'opacity-50 cursor-not-allowed'
|
|
153
152
|
)}
|
|
154
153
|
>
|
|
155
|
-
<Text
|
|
156
|
-
className={cn(
|
|
157
|
-
'flex-1',
|
|
158
|
-
hasValue ? 'text-text-primary' : 'text-text-tertiary'
|
|
159
|
-
)}
|
|
160
|
-
>
|
|
154
|
+
<Text className={cn('flex-1', hasValue ? 'text-text-primary' : 'text-text-tertiary')}>
|
|
161
155
|
{getDisplayValue()}
|
|
162
156
|
</Text>
|
|
163
157
|
<View className="flex-row items-center gap-2">
|
|
@@ -184,11 +178,12 @@ export function Select<T extends string = string>({
|
|
|
184
178
|
className="fixed inset-0 z-40"
|
|
185
179
|
style={{ position: 'absolute' }}
|
|
186
180
|
/>
|
|
187
|
-
<
|
|
181
|
+
<Surface
|
|
182
|
+
elevation={4}
|
|
183
|
+
rounded={false}
|
|
188
184
|
className={cn(
|
|
189
185
|
'absolute z-50 top-full left-0 right-0 mt-1',
|
|
190
|
-
'
|
|
191
|
-
'max-h-60 overflow-hidden'
|
|
186
|
+
'rounded-md max-h-60 overflow-hidden'
|
|
192
187
|
)}
|
|
193
188
|
>
|
|
194
189
|
<ScrollView className="py-1">
|
|
@@ -196,7 +191,7 @@ export function Select<T extends string = string>({
|
|
|
196
191
|
<SelectOption key={option.value} option={option} />
|
|
197
192
|
))}
|
|
198
193
|
</ScrollView>
|
|
199
|
-
</
|
|
194
|
+
</Surface>
|
|
200
195
|
</>
|
|
201
196
|
)}
|
|
202
197
|
</View>
|
|
@@ -235,7 +230,12 @@ function SelectOption<T>({ option }: SelectOptionComponentProps<T>) {
|
|
|
235
230
|
{selected && <Text className="text-white text-xs text-center">✓</Text>}
|
|
236
231
|
</View>
|
|
237
232
|
)}
|
|
238
|
-
<Text
|
|
233
|
+
<Text
|
|
234
|
+
className={cn(
|
|
235
|
+
'text-sm',
|
|
236
|
+
selected && !isMulti ? 'text-brand-primary font-medium' : 'text-text-primary'
|
|
237
|
+
)}
|
|
238
|
+
>
|
|
239
239
|
{option.label}
|
|
240
240
|
</Text>
|
|
241
241
|
</Pressable>
|
|
@@ -1,17 +1,11 @@
|
|
|
1
1
|
import type { Meta, StoryObj } from '@storybook/react-vite'
|
|
2
2
|
import { View } from 'react-native'
|
|
3
|
-
import {
|
|
4
|
-
Skeleton,
|
|
5
|
-
SkeletonText,
|
|
6
|
-
SkeletonCircle,
|
|
7
|
-
SkeletonCard,
|
|
8
|
-
SkeletonListItem,
|
|
9
|
-
} from './Skeleton'
|
|
3
|
+
import { Skeleton, SkeletonText, SkeletonCircle, SkeletonCard, SkeletonListItem } from './Skeleton'
|
|
10
4
|
|
|
11
5
|
const meta: Meta<typeof Skeleton> = {
|
|
12
6
|
title: 'Components/Atoms/Skeleton',
|
|
13
7
|
component: Skeleton,
|
|
14
|
-
tags: ['autodocs'],
|
|
8
|
+
tags: ['autodocs', 'status:stable', '!status:review'],
|
|
15
9
|
argTypes: {
|
|
16
10
|
variant: {
|
|
17
11
|
control: 'select',
|
|
@@ -64,9 +58,7 @@ export const RectVariant: Story = {
|
|
|
64
58
|
}
|
|
65
59
|
|
|
66
60
|
export const RoundedVariant: Story = {
|
|
67
|
-
render: () =>
|
|
68
|
-
<Skeleton variant="rounded" width={300} height={200} />
|
|
69
|
-
),
|
|
61
|
+
render: () => <Skeleton variant="rounded" width={300} height={200} />,
|
|
70
62
|
}
|
|
71
63
|
|
|
72
64
|
export const TextBlock: Story = {
|
|
@@ -136,11 +136,7 @@ export interface SkeletonCircleProps {
|
|
|
136
136
|
/**
|
|
137
137
|
* Circle skeleton for avatars.
|
|
138
138
|
*/
|
|
139
|
-
export function SkeletonCircle({
|
|
140
|
-
size = 40,
|
|
141
|
-
animation = 'pulse',
|
|
142
|
-
className,
|
|
143
|
-
}: SkeletonCircleProps) {
|
|
139
|
+
export function SkeletonCircle({ size = 40, animation = 'pulse', className }: SkeletonCircleProps) {
|
|
144
140
|
return (
|
|
145
141
|
<Skeleton
|
|
146
142
|
variant="circle"
|
|
@@ -179,12 +175,7 @@ export function SkeletonCard({
|
|
|
179
175
|
return (
|
|
180
176
|
<View className={cn('rounded-lg overflow-hidden bg-surface-elevated', className)}>
|
|
181
177
|
{hasImage && (
|
|
182
|
-
<Skeleton
|
|
183
|
-
variant="rect"
|
|
184
|
-
width="100%"
|
|
185
|
-
height={imageHeight}
|
|
186
|
-
animation={animation}
|
|
187
|
-
/>
|
|
178
|
+
<Skeleton variant="rect" width="100%" height={imageHeight} animation={animation} />
|
|
188
179
|
)}
|
|
189
180
|
<View className="p-4 gap-3">
|
|
190
181
|
<Skeleton variant="text" width="70%" animation={animation} />
|
|
@@ -218,9 +209,7 @@ export function SkeletonListItem({
|
|
|
218
209
|
}: SkeletonListItemProps) {
|
|
219
210
|
return (
|
|
220
211
|
<View className={cn('flex-row items-center gap-3 p-3', className)}>
|
|
221
|
-
{hasAvatar &&
|
|
222
|
-
<SkeletonCircle size={avatarSize} animation={animation} />
|
|
223
|
-
)}
|
|
212
|
+
{hasAvatar && <SkeletonCircle size={avatarSize} animation={animation} />}
|
|
224
213
|
<View className="flex-1">
|
|
225
214
|
<SkeletonText lines={lines} animation={animation} />
|
|
226
215
|
</View>
|
|
@@ -1,10 +1,4 @@
|
|
|
1
|
-
export {
|
|
2
|
-
Skeleton,
|
|
3
|
-
SkeletonText,
|
|
4
|
-
SkeletonCircle,
|
|
5
|
-
SkeletonCard,
|
|
6
|
-
SkeletonListItem,
|
|
7
|
-
} from './Skeleton'
|
|
1
|
+
export { Skeleton, SkeletonText, SkeletonCircle, SkeletonCard, SkeletonListItem } from './Skeleton'
|
|
8
2
|
export type {
|
|
9
3
|
SkeletonProps,
|
|
10
4
|
SkeletonTextProps,
|
|
@@ -64,10 +64,7 @@ export function Spinner({
|
|
|
64
64
|
className={cn('items-center justify-center', containerSizes[size], className)}
|
|
65
65
|
{...props}
|
|
66
66
|
>
|
|
67
|
-
<ActivityIndicator
|
|
68
|
-
size={sizeMap[size]}
|
|
69
|
-
color={colorMap[color]}
|
|
70
|
-
/>
|
|
67
|
+
<ActivityIndicator size={sizeMap[size]} color={colorMap[color]} />
|
|
71
68
|
</View>
|
|
72
69
|
)
|
|
73
70
|
}
|
|
@@ -7,21 +7,30 @@ import type { ElevationLevel } from '../../../theme/elevation'
|
|
|
7
7
|
const meta: Meta<typeof Surface> = {
|
|
8
8
|
title: 'Components/Atoms/Surface',
|
|
9
9
|
component: Surface,
|
|
10
|
-
tags: ['autodocs'],
|
|
10
|
+
tags: ['autodocs', 'status:stable', '!status:review'],
|
|
11
11
|
argTypes: {
|
|
12
12
|
elevation: {
|
|
13
13
|
control: { type: 'range', min: -2, max: 5, step: 1 },
|
|
14
|
-
description:
|
|
14
|
+
description:
|
|
15
|
+
'Depth relative to the enclosing Surface: <0 recess, 0 flat, 1–3 lift a plane each, 4–5 float',
|
|
16
|
+
},
|
|
17
|
+
raise: {
|
|
18
|
+
control: { type: 'range', min: 1, max: 3, step: 1 },
|
|
19
|
+
description: 'Planes to step UP from the enclosing Surface, with the lift treatment',
|
|
15
20
|
},
|
|
16
21
|
level: {
|
|
17
22
|
control: 'select',
|
|
18
23
|
options: ['frame', 'background', 'base', 'elevated', 'raised', 'overlay'],
|
|
19
|
-
description: '
|
|
24
|
+
description: 'Absolute grey plane for a shell root (flat, no lift)',
|
|
20
25
|
},
|
|
21
26
|
pressed: {
|
|
22
27
|
control: 'boolean',
|
|
23
28
|
description: 'Sunken well: one ramp step DOWN from the parent level + inner-shadow recess',
|
|
24
29
|
},
|
|
30
|
+
lift: {
|
|
31
|
+
control: 'boolean',
|
|
32
|
+
description: 'Force the rim + shadow treatment on or off',
|
|
33
|
+
},
|
|
25
34
|
theme: {
|
|
26
35
|
control: 'select',
|
|
27
36
|
options: ['light', 'dark'],
|
|
@@ -54,15 +63,18 @@ export const Default: Story = {
|
|
|
54
63
|
),
|
|
55
64
|
}
|
|
56
65
|
|
|
66
|
+
// Every level is a ramp plane. Negative levels recess, 0 sits flat on the page,
|
|
67
|
+
// 1–3 climb one plane each with the lift treatment, 4–5 float on overlay with a
|
|
68
|
+
// larger shadow. Rendered on a `base` page so the relative model has a host.
|
|
57
69
|
export const ElevationLevels: Story = {
|
|
58
70
|
render: () => (
|
|
59
|
-
<
|
|
71
|
+
<Surface level="base" style={{ gap: 16, padding: 24 }}>
|
|
60
72
|
{([-2, -1, 0, 1, 2, 3, 4, 5] as ElevationLevel[]).map((level) => (
|
|
61
73
|
<Surface key={level} elevation={level} style={{ padding: 16 }}>
|
|
62
74
|
<Text style={{ color: '#fff' }}>Elevation {level}</Text>
|
|
63
75
|
</Surface>
|
|
64
76
|
))}
|
|
65
|
-
</
|
|
77
|
+
</Surface>
|
|
66
78
|
),
|
|
67
79
|
}
|
|
68
80
|
|