@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.
Files changed (509) hide show
  1. package/README.md +46 -47
  2. package/dist/bodymap.js +768 -701
  3. package/dist/bodymap.js.map +1 -1
  4. package/dist/bodymap.mjs +770 -703
  5. package/dist/bodymap.mjs.map +1 -1
  6. package/dist/index.d.mts +1320 -215
  7. package/dist/index.d.ts +1320 -215
  8. package/dist/index.js +5996 -4498
  9. package/dist/index.js.map +1 -1
  10. package/dist/index.mjs +5773 -4357
  11. package/dist/index.mjs.map +1 -1
  12. package/dist/{pages-CvsFqNtx.d.mts → pages-CpW3OB3g.d.mts} +21 -3
  13. package/dist/{pages-B1hqnGIC.d.ts → pages-_3Ajpiqu.d.ts} +21 -3
  14. package/dist/pages.d.mts +1 -1
  15. package/dist/pages.d.ts +1 -1
  16. package/dist/pages.js +1435 -1428
  17. package/dist/pages.js.map +1 -1
  18. package/dist/pages.mjs +1443 -1436
  19. package/dist/pages.mjs.map +1 -1
  20. package/dist/theme/index.d.mts +202 -1042
  21. package/dist/theme/index.d.ts +202 -1042
  22. package/dist/theme/index.js +215 -300
  23. package/dist/theme/index.js.map +1 -1
  24. package/dist/theme/index.mjs +202 -296
  25. package/dist/theme/index.mjs.map +1 -1
  26. package/dist/theme/tokens-css.js +62 -5
  27. package/dist/theme/tokens-css.js.map +1 -1
  28. package/dist/theme/tokens-css.mjs +62 -5
  29. package/dist/theme/tokens-css.mjs.map +1 -1
  30. package/dist/theme/tokens.d.mts +972 -0
  31. package/dist/theme/tokens.d.ts +972 -0
  32. package/dist/theme/tokens.js +904 -0
  33. package/dist/theme/tokens.js.map +1 -0
  34. package/dist/theme/tokens.mjs +880 -0
  35. package/dist/theme/tokens.mjs.map +1 -0
  36. package/docs/audits/2026-09-08-critique-addenda.md +51 -0
  37. package/docs/audits/2026-09-08-library-critique.md +212 -0
  38. package/docs/library-roadmap.md +99 -0
  39. package/package.json +7 -1
  40. package/src/arch/arch-graph.freshness.test.ts +52 -0
  41. package/src/arch/arch-graph.json +5021 -1617
  42. package/src/components/custom/ActiveWork/CoChangeChip.stories.tsx +44 -0
  43. package/src/components/custom/ActiveWork/CoChangeChip.test.tsx +29 -0
  44. package/src/components/custom/ActiveWork/CoChangeChip.tsx +48 -0
  45. package/src/components/custom/ActiveWork/Eyebrow.stories.tsx +25 -0
  46. package/src/components/custom/ActiveWork/Eyebrow.test.tsx +16 -0
  47. package/src/components/custom/ActiveWork/Eyebrow.tsx +26 -0
  48. package/src/components/custom/ActiveWork/FileActivityDetail.stories.tsx +50 -0
  49. package/src/components/custom/ActiveWork/FileActivityDetail.test.tsx +66 -0
  50. package/src/components/custom/ActiveWork/FileActivityDetail.tsx +202 -0
  51. package/src/components/custom/ActiveWork/FileActivityRow.stories.tsx +70 -0
  52. package/src/components/custom/ActiveWork/FileActivityRow.test.tsx +67 -0
  53. package/src/components/custom/ActiveWork/FileActivityRow.tsx +130 -0
  54. package/src/components/custom/ActiveWork/FileHistoryExplorer.stories.tsx +84 -0
  55. package/src/components/custom/ActiveWork/FileHistoryExplorer.test.tsx +99 -0
  56. package/src/components/custom/ActiveWork/FileHistoryExplorer.tsx +138 -0
  57. package/src/components/custom/ActiveWork/FilePathLabel.stories.tsx +39 -0
  58. package/src/components/custom/ActiveWork/FilePathLabel.test.tsx +53 -0
  59. package/src/components/custom/ActiveWork/FilePathLabel.tsx +63 -0
  60. package/src/components/custom/ActiveWork/InitiativeBrief.stories.tsx +50 -0
  61. package/src/components/custom/ActiveWork/InitiativeBrief.test.tsx +62 -0
  62. package/src/components/custom/ActiveWork/InitiativeBrief.tsx +181 -0
  63. package/src/components/custom/ActiveWork/InitiativeCard.stories.tsx +73 -0
  64. package/src/components/custom/ActiveWork/InitiativeCard.test.tsx +68 -0
  65. package/src/components/custom/ActiveWork/InitiativeCard.tsx +136 -0
  66. package/src/components/custom/ActiveWork/InitiativeHeader.stories.tsx +59 -0
  67. package/src/components/custom/ActiveWork/InitiativeHeader.test.tsx +40 -0
  68. package/src/components/custom/ActiveWork/InitiativeHeader.tsx +73 -0
  69. package/src/components/custom/ActiveWork/InitiativeReader.stories.tsx +145 -0
  70. package/src/components/custom/ActiveWork/OpenLoops.stories.tsx +58 -0
  71. package/src/components/custom/ActiveWork/OpenLoops.test.tsx +61 -0
  72. package/src/components/custom/ActiveWork/OpenLoops.tsx +107 -0
  73. package/src/components/custom/ActiveWork/PortfolioOverview.stories.tsx +101 -0
  74. package/src/components/custom/ActiveWork/PortfolioOverview.test.tsx +81 -0
  75. package/src/components/custom/ActiveWork/PortfolioOverview.tsx +83 -0
  76. package/src/components/custom/ActiveWork/README.md +305 -0
  77. package/src/components/custom/ActiveWork/SessionDetail.stories.tsx +71 -0
  78. package/src/components/custom/ActiveWork/SessionDetail.test.tsx +84 -0
  79. package/src/components/custom/ActiveWork/SessionDetail.tsx +180 -0
  80. package/src/components/custom/ActiveWork/SessionList.stories.tsx +69 -0
  81. package/src/components/custom/ActiveWork/SessionList.test.tsx +78 -0
  82. package/src/components/custom/ActiveWork/SessionList.tsx +103 -0
  83. package/src/components/custom/ActiveWork/SessionListItem.stories.tsx +64 -0
  84. package/src/components/custom/ActiveWork/SessionListItem.test.tsx +62 -0
  85. package/src/components/custom/ActiveWork/SessionListItem.tsx +152 -0
  86. package/src/components/custom/ActiveWork/SessionReader.stories.tsx +113 -0
  87. package/src/components/custom/ActiveWork/SeverityLabel.stories.tsx +51 -0
  88. package/src/components/custom/ActiveWork/SeverityLabel.test.tsx +68 -0
  89. package/src/components/custom/ActiveWork/SeverityLabel.tsx +97 -0
  90. package/src/components/custom/ActiveWork/TaskRow.stories.tsx +63 -0
  91. package/src/components/custom/ActiveWork/TaskRow.test.tsx +112 -0
  92. package/src/components/custom/ActiveWork/TaskRow.tsx +176 -0
  93. package/src/components/custom/ActiveWork/TaskTable.stories.tsx +123 -0
  94. package/src/components/custom/ActiveWork/TaskTable.test.tsx +233 -0
  95. package/src/components/custom/ActiveWork/TaskTable.tsx +321 -0
  96. package/src/components/custom/ActiveWork/active-work-depth.test.tsx +102 -0
  97. package/src/components/custom/ActiveWork/file-history-fixture.ts +91 -0
  98. package/src/components/custom/ActiveWork/format-time.test.ts +23 -0
  99. package/src/components/custom/ActiveWork/format-time.ts +32 -0
  100. package/src/components/custom/ActiveWork/index.ts +19 -0
  101. package/src/components/custom/ActiveWork/initiative-fixture.ts +104 -0
  102. package/src/components/custom/ActiveWork/session-fixture.ts +267 -0
  103. package/src/components/custom/ActiveWork/session-linkers.ts +56 -0
  104. package/src/components/custom/ActiveWork/task-list-fixture.ts +97 -0
  105. package/src/components/custom/CircularTimer/CircularTimer.stories.tsx +4 -3
  106. package/src/components/custom/DateTime/DateTime.stories.tsx +2 -1
  107. package/src/components/custom/DateTime/DateTime.test.tsx +3 -1
  108. package/src/components/custom/EmptyState/EmptyState.stories.tsx +22 -9
  109. package/src/components/custom/EmptyState/EmptyState.test.tsx +7 -13
  110. package/src/components/custom/EmptyState/EmptyState.tsx +4 -18
  111. package/src/components/custom/Fatigue/DualGhostSpark.stories.tsx +4 -3
  112. package/src/components/custom/Fatigue/FatigueLights.stories.tsx +2 -2
  113. package/src/components/custom/Fatigue/GhostSpark.stories.tsx +4 -3
  114. package/src/components/custom/Fatigue/LiveFatigueCard.stories.tsx +2 -2
  115. package/src/components/custom/Fatigue/LiveFatigueCard.tsx +8 -4
  116. package/src/components/custom/Fatigue/LiveFatiguePanel.stories.tsx +116 -6
  117. package/src/components/custom/Fatigue/LiveFatiguePanel.test.tsx +134 -0
  118. package/src/components/custom/Fatigue/LiveFatiguePanel.tsx +54 -83
  119. package/src/components/custom/Fatigue/README.md +40 -3
  120. package/src/components/custom/Fatigue/RomProgressionChart.stories.tsx +2 -2
  121. package/src/components/custom/Fatigue/SilverRedPalette.stories.tsx +2 -1
  122. package/src/components/custom/Fatigue/VelocityHero.stories.tsx +4 -3
  123. package/src/components/custom/Fatigue/VerdictHero.stories.tsx +2 -2
  124. package/src/components/custom/Fatigue/fatigue-mock.test.ts +0 -5
  125. package/src/components/custom/Fatigue/fatigue-mock.ts +2 -10
  126. package/src/components/custom/Fatigue/fatigue-tokens.ts +12 -0
  127. package/src/components/custom/Fatigue/index.ts +17 -5
  128. package/src/components/custom/Fatigue/panel-layout.test.ts +149 -0
  129. package/src/components/custom/Fatigue/panel-layout.ts +185 -0
  130. package/src/components/custom/Gauge/Gauge.stories.tsx +2 -2
  131. package/src/components/custom/Gauge/Gauge.test.tsx +1 -1
  132. package/src/components/custom/Gauge/Gauge.tsx +4 -1
  133. package/src/components/custom/Metric/Metric.stories.tsx +10 -1
  134. package/src/components/custom/Metric/Metric.test.tsx +1 -3
  135. package/src/components/custom/Metric/Metric.tsx +5 -20
  136. package/src/components/custom/Prose/MarkdownProse.stories.tsx +88 -0
  137. package/src/components/custom/Prose/MarkdownProse.test.tsx +87 -0
  138. package/src/components/custom/Prose/MarkdownProse.tsx +201 -0
  139. package/src/components/custom/Prose/README.md +58 -0
  140. package/src/components/custom/Prose/index.ts +1 -0
  141. package/src/components/custom/Scatter/Scatter.stories.tsx +46 -8
  142. package/src/components/custom/Scatter/Scatter.test.tsx +2 -2
  143. package/src/components/custom/Scatter/Scatter.tsx +116 -14
  144. package/src/components/custom/Sidebar/Sidebar.stories.tsx +40 -7
  145. package/src/components/custom/Sidebar/Sidebar.test.tsx +5 -1
  146. package/src/components/custom/Sidebar/Sidebar.tsx +16 -33
  147. package/src/components/custom/Table/Table.stories.tsx +98 -15
  148. package/src/components/custom/Table/Table.test.tsx +273 -86
  149. package/src/components/custom/Table/Table.tsx +159 -67
  150. package/src/components/custom/Table/column-fit.test.ts +75 -0
  151. package/src/components/custom/Table/column-fit.ts +116 -0
  152. package/src/components/custom/Table/index.ts +9 -0
  153. package/src/components/custom/TimerReadout/TimerReadout.stories.tsx +8 -6
  154. package/src/components/custom/Treemap/Treemap.stories.tsx +2 -2
  155. package/src/components/custom/Treemap/Treemap.test.tsx +1 -1
  156. package/src/components/custom/Treemap/Treemap.tsx +7 -2
  157. package/src/components/custom/Typography/Typography.stories.tsx +28 -1
  158. package/src/components/custom/Typography/Typography.test.tsx +34 -0
  159. package/src/components/custom/Typography/Typography.tsx +6 -0
  160. package/src/components/custom/Typography/index.ts +1 -8
  161. package/src/components/custom/Workout/ActiveWorkoutPage.stories.tsx +9 -1
  162. package/src/components/custom/Workout/BaseBadge.stories.tsx +19 -7
  163. package/src/components/custom/Workout/BaseBadge.test.tsx +31 -11
  164. package/src/components/custom/Workout/BaseBadge.tsx +3 -0
  165. package/src/components/custom/Workout/BodyMap.stories.tsx +4 -1
  166. package/src/components/custom/Workout/BodyMap.tsx +3 -1
  167. package/src/components/custom/Workout/BodyMapDetailPanel.stories.tsx +16 -4
  168. package/src/components/custom/Workout/BodyMapDetailPanel.test.tsx +11 -15
  169. package/src/components/custom/Workout/BodyMapDetailPanel.tsx +45 -9
  170. package/src/components/custom/Workout/CapacityBandChart.stories.tsx +10 -8
  171. package/src/components/custom/Workout/CapacityBandChart.test.tsx +24 -51
  172. package/src/components/custom/Workout/CapacityBandChart.tsx +139 -108
  173. package/src/components/custom/Workout/DeviationBar.stories.tsx +1 -1
  174. package/src/components/custom/Workout/DeviationBar.test.tsx +5 -2
  175. package/src/components/custom/Workout/DeviationBar.tsx +21 -16
  176. package/src/components/custom/Workout/DualVelocityStrip.stories.tsx +182 -0
  177. package/src/components/custom/Workout/DualVelocityStrip.test.tsx +3 -2
  178. package/src/components/custom/Workout/ExerciseCard.stories.tsx +8 -7
  179. package/src/components/custom/Workout/ExerciseCard.test.tsx +13 -3
  180. package/src/components/custom/Workout/ExerciseCard.tsx +42 -51
  181. package/src/components/custom/Workout/ExerciseCardHeading.stories.tsx +7 -7
  182. package/src/components/custom/Workout/ExerciseDetailPage.stories.tsx +9 -1
  183. package/src/components/custom/Workout/ExerciseHeading.stories.tsx +8 -8
  184. package/src/components/custom/Workout/ExerciseHeading.tsx +8 -5
  185. package/src/components/custom/Workout/ExerciseIndicator.stories.tsx +6 -4
  186. package/src/components/custom/Workout/ExerciseIndicator.test.tsx +27 -11
  187. package/src/components/custom/Workout/ExerciseIndicator.tsx +14 -15
  188. package/src/components/custom/Workout/FatigueMeter.stories.tsx +5 -5
  189. package/src/components/custom/Workout/InputBar.stories.tsx +4 -5
  190. package/src/components/custom/Workout/IntensityBar.stories.tsx +1 -1
  191. package/src/components/custom/Workout/IntensityBar.test.tsx +5 -1
  192. package/src/components/custom/Workout/IntensityBar.tsx +4 -2
  193. package/src/components/custom/Workout/LiveAuraFrame.stories.tsx +5 -4
  194. package/src/components/custom/Workout/MesoCard.stories.tsx +4 -1
  195. package/src/components/custom/Workout/MesoCard.test.tsx +7 -18
  196. package/src/components/custom/Workout/MesoCard.tsx +12 -9
  197. package/src/components/custom/Workout/MesoProgressBar.stories.tsx +1 -1
  198. package/src/components/custom/Workout/MesoProgressBar.test.tsx +18 -11
  199. package/src/components/custom/Workout/MesoProgressBar.tsx +15 -13
  200. package/src/components/custom/Workout/MesoStatusCard.stories.tsx +2 -1
  201. package/src/components/custom/Workout/MesoStatusCard.test.tsx +14 -44
  202. package/src/components/custom/Workout/MesoStatusCard.tsx +9 -23
  203. package/src/components/custom/Workout/MetricTiles.stories.tsx +3 -2
  204. package/src/components/custom/Workout/MuscleGroupChip.stories.tsx +2 -8
  205. package/src/components/custom/Workout/MuscleGroupChip.test.tsx +23 -31
  206. package/src/components/custom/Workout/MuscleGroupChip.tsx +28 -67
  207. package/src/components/custom/Workout/PlaceholderStrip.stories.tsx +1 -1
  208. package/src/components/custom/Workout/PlaceholderStrip.test.tsx +17 -10
  209. package/src/components/custom/Workout/PlaceholderStrip.tsx +9 -8
  210. package/src/components/custom/Workout/PrBadge.stories.tsx +2 -1
  211. package/src/components/custom/Workout/PrBadge.test.tsx +3 -9
  212. package/src/components/custom/Workout/PrBadge.tsx +13 -17
  213. package/src/components/custom/Workout/PrHistoryModal.stories.tsx +4 -1
  214. package/src/components/custom/Workout/PrHistoryModal.test.tsx +13 -36
  215. package/src/components/custom/Workout/PrHistoryModal.tsx +8 -4
  216. package/src/components/custom/Workout/ProgramPlanningPage.stories.tsx +6 -1
  217. package/src/components/custom/Workout/README.md +12 -7
  218. package/src/components/custom/Workout/ReadinessCheck.stories.tsx +3 -2
  219. package/src/components/custom/Workout/ReadinessCheck.test.tsx +12 -18
  220. package/src/components/custom/Workout/ReadinessCheck.tsx +19 -3
  221. package/src/components/custom/Workout/RestTimer.stories.tsx +3 -2
  222. package/src/components/custom/Workout/ScheduleTiles.stories.tsx +3 -2
  223. package/src/components/custom/Workout/ScheduleTiles.test.tsx +3 -4
  224. package/src/components/custom/Workout/ScheduleTiles.tsx +4 -7
  225. package/src/components/custom/Workout/SegmentedBar.stories.tsx +5 -5
  226. package/src/components/custom/Workout/SegmentedBar.tsx +6 -2
  227. package/src/components/custom/Workout/SegmentedProgressBar.stories.tsx +5 -5
  228. package/src/components/custom/Workout/SessionHeader.stories.tsx +6 -6
  229. package/src/components/custom/Workout/SessionHeader.tsx +12 -12
  230. package/src/components/custom/Workout/SessionRail.stories.tsx +12 -11
  231. package/src/components/custom/Workout/SessionRail.tsx +7 -9
  232. package/src/components/custom/Workout/SetBar.stories.tsx +10 -6
  233. package/src/components/custom/Workout/SetBar.test.tsx +49 -4
  234. package/src/components/custom/Workout/SetBar.tsx +38 -12
  235. package/src/components/custom/Workout/SetRow.stories.tsx +3 -2
  236. package/src/components/custom/Workout/SetRow.test.tsx +16 -2
  237. package/src/components/custom/Workout/SetRow.tsx +61 -23
  238. package/src/components/custom/Workout/SetStrip.stories.tsx +60 -5
  239. package/src/components/custom/Workout/SetStrip.test.tsx +25 -0
  240. package/src/components/custom/Workout/SetStrip.tsx +24 -4
  241. package/src/components/custom/Workout/SetTableHeader.stories.tsx +6 -6
  242. package/src/components/custom/Workout/SetTableHeader.tsx +9 -12
  243. package/src/components/custom/Workout/SetsRepsLoad.stories.tsx +7 -7
  244. package/src/components/custom/Workout/SetsRepsLoad.tsx +3 -5
  245. package/src/components/custom/Workout/Sparkline.stories.tsx +1 -1
  246. package/src/components/custom/Workout/Sparkline.test.tsx +37 -19
  247. package/src/components/custom/Workout/Sparkline.tsx +14 -18
  248. package/src/components/custom/Workout/StatusDot.stories.tsx +1 -1
  249. package/src/components/custom/Workout/StatusDot.test.tsx +44 -5
  250. package/src/components/custom/Workout/StatusDot.tsx +93 -63
  251. package/src/components/custom/Workout/StatusPill.stories.tsx +1 -1
  252. package/src/components/custom/Workout/StatusPill.test.tsx +6 -15
  253. package/src/components/custom/Workout/StatusPill.tsx +27 -38
  254. package/src/components/custom/Workout/StrengthTrendChart.stories.tsx +9 -3
  255. package/src/components/custom/Workout/StrengthTrendChart.test.tsx +15 -37
  256. package/src/components/custom/Workout/StrengthTrendChart.tsx +31 -30
  257. package/src/components/custom/Workout/SupersetWrapper.stories.tsx +27 -64
  258. package/src/components/custom/Workout/SupersetWrapper.test.tsx +16 -14
  259. package/src/components/custom/Workout/SupersetWrapper.tsx +17 -21
  260. package/src/components/custom/Workout/TempoDisplay.stories.tsx +22 -7
  261. package/src/components/custom/Workout/TempoDisplay.test.tsx +18 -4
  262. package/src/components/custom/Workout/TrainingStatusPage.stories.tsx +9 -1
  263. package/src/components/custom/Workout/VelocityStrip.compact.stories.tsx +4 -1
  264. package/src/components/custom/Workout/VelocityStrip.dual.stories.tsx +7 -4
  265. package/src/components/custom/Workout/VelocityStrip.expanded.stories.tsx +4 -1
  266. package/src/components/custom/Workout/VelocityStrip.hero.stories.tsx +4 -1
  267. package/src/components/custom/Workout/VelocityStrip.stories.tsx +12 -6
  268. package/src/components/custom/Workout/VelocityStrip.tsx +3 -0
  269. package/src/components/custom/Workout/VolumeLandmarkBar.stories.tsx +6 -7
  270. package/src/components/custom/Workout/VolumeLandmarkBar.tsx +15 -6
  271. package/src/components/custom/Workout/WeekRow.stories.tsx +4 -1
  272. package/src/components/custom/Workout/WeekRow.test.tsx +18 -15
  273. package/src/components/custom/Workout/WeekRow.tsx +23 -16
  274. package/src/components/custom/Workout/WeightBadge.stories.tsx +2 -1
  275. package/src/components/custom/Workout/WeightBadge.test.tsx +50 -19
  276. package/src/components/custom/Workout/WeightBadge.tsx +28 -27
  277. package/src/components/custom/Workout/WorkoutCard.stories.tsx +6 -1
  278. package/src/components/custom/Workout/WorkoutCard.test.tsx +18 -0
  279. package/src/components/custom/Workout/WorkoutCard.tsx +35 -57
  280. package/src/components/custom/Workout/WorkoutPill.stories.tsx +5 -2
  281. package/src/components/custom/Workout/WorkoutPill.test.tsx +39 -7
  282. package/src/components/custom/Workout/WorkoutPill.tsx +88 -57
  283. package/src/components/custom/Workout/ZoneTrack.stories.tsx +7 -6
  284. package/src/components/custom/Workout/ZoneTrack.tsx +10 -9
  285. package/src/components/custom/Workout/index.ts +5 -0
  286. package/src/components/custom/Workout/metricText.stories.tsx +6 -5
  287. package/src/components/custom/Workout/metricText.tsx +4 -0
  288. package/src/components/custom/Workout/setHeadingKit.tsx +207 -26
  289. package/src/components/custom/charts/README.md +61 -0
  290. package/src/components/custom/charts/SetBarChart.test.tsx +30 -1
  291. package/src/components/custom/charts/SetBarChart.tsx +42 -4
  292. package/src/components/custom/charts/SparkBars.stories.tsx +55 -0
  293. package/src/components/custom/charts/SparkBars.test.tsx +69 -0
  294. package/src/components/custom/charts/SparkBars.tsx +85 -0
  295. package/src/components/custom/charts/index.ts +3 -0
  296. package/src/components/custom/index.ts +3 -0
  297. package/src/components/custom/stepper/Stepper.stories.tsx +13 -10
  298. package/src/components/custom/stepper/Stepper.test.tsx +1 -7
  299. package/src/components/custom/stepper/Stepper.tsx +13 -28
  300. package/src/components/icons/icons.stories.tsx +1 -1
  301. package/src/components/icons/icons.tsx +51 -0
  302. package/src/components/shell/AppShell.stories.tsx +150 -0
  303. package/src/components/shell/AppShell.test.tsx +70 -0
  304. package/src/components/shell/AppShell.tsx +90 -0
  305. package/src/components/shell/BrandLockup.stories.tsx +66 -5
  306. package/src/components/shell/BrandLockup.test.tsx +34 -1
  307. package/src/components/shell/BrandLockup.tsx +27 -11
  308. package/src/components/shell/NavItem.stories.tsx +4 -4
  309. package/src/components/shell/NavItem.test.tsx +17 -0
  310. package/src/components/shell/NavItem.tsx +17 -5
  311. package/src/components/shell/README.md +90 -27
  312. package/src/components/shell/SideNav.stories.tsx +38 -7
  313. package/src/components/shell/SideNav.test.tsx +16 -8
  314. package/src/components/shell/SideNav.tsx +17 -17
  315. package/src/components/shell/TopBar.stories.tsx +44 -19
  316. package/src/components/shell/TopBar.test.tsx +34 -12
  317. package/src/components/shell/TopBar.tsx +61 -40
  318. package/src/components/shell/brands.tsx +66 -0
  319. package/src/components/shell/index.ts +9 -8
  320. package/src/components/shell/{DeviceIndicator.stories.tsx → workout/DeviceIndicator.stories.tsx} +2 -2
  321. package/src/components/shell/{DeviceIndicator.tsx → workout/DeviceIndicator.tsx} +2 -2
  322. package/src/components/shell/{DeviceMenu.stories.tsx → workout/DeviceMenu.stories.tsx} +2 -2
  323. package/src/components/shell/{DeviceMenu.tsx → workout/DeviceMenu.tsx} +3 -3
  324. package/src/components/shell/{DeviceRow.stories.tsx → workout/DeviceRow.stories.tsx} +2 -2
  325. package/src/components/shell/{DeviceRow.tsx → workout/DeviceRow.tsx} +3 -3
  326. package/src/components/shell/{SessionStatePill.stories.tsx → workout/SessionStatePill.stories.tsx} +2 -2
  327. package/src/components/shell/{SessionStatePill.tsx → workout/SessionStatePill.tsx} +5 -3
  328. package/src/components/shell/workout/WorkoutShell.stories.tsx +71 -0
  329. package/src/components/shell/{DashboardShell.test.tsx → workout/WorkoutShell.test.tsx} +19 -8
  330. package/src/components/shell/workout/WorkoutShell.tsx +77 -0
  331. package/src/components/shell/workout/WorkoutTopBar.stories.tsx +58 -0
  332. package/src/components/shell/workout/WorkoutTopBar.test.tsx +39 -0
  333. package/src/components/shell/workout/WorkoutTopBar.tsx +52 -0
  334. package/src/components/shell/workout/index.ts +9 -0
  335. package/src/components/shell/workout/workoutNavItems.tsx +16 -0
  336. package/src/components/ui/README.md +110 -0
  337. package/src/components/ui/alert/Alert.stories.tsx +1 -1
  338. package/src/components/ui/autocomplete/Autocomplete.stories.tsx +11 -13
  339. package/src/components/ui/autocomplete/Autocomplete.test.tsx +7 -25
  340. package/src/components/ui/autocomplete/Autocomplete.tsx +21 -28
  341. package/src/components/ui/avatar/Avatar.stories.tsx +1 -1
  342. package/src/components/ui/avatar/Avatar.tsx +2 -10
  343. package/src/components/ui/badge/Badge.stories.tsx +83 -28
  344. package/src/components/ui/badge/Badge.test.tsx +19 -3
  345. package/src/components/ui/badge/Badge.tsx +48 -55
  346. package/src/components/ui/breadcrumbs/Breadcrumbs.stories.tsx +1 -1
  347. package/src/components/ui/breadcrumbs/Breadcrumbs.tsx +4 -16
  348. package/src/components/ui/button/Button.stories.tsx +46 -12
  349. package/src/components/ui/button/Button.tsx +32 -25
  350. package/src/components/ui/card/Card.stories.tsx +90 -94
  351. package/src/components/ui/card/Card.test.tsx +80 -6
  352. package/src/components/ui/card/Card.tsx +150 -203
  353. package/src/components/ui/checkbox/Checkbox.stories.tsx +1 -1
  354. package/src/components/ui/checkbox/Checkbox.tsx +6 -26
  355. package/src/components/ui/chip/Chip.stories.tsx +37 -13
  356. package/src/components/ui/chip/Chip.test.tsx +10 -6
  357. package/src/components/ui/chip/Chip.tsx +76 -91
  358. package/src/components/ui/collapse/Collapse.stories.tsx +23 -23
  359. package/src/components/ui/collapse/Collapse.tsx +6 -11
  360. package/src/components/ui/data-row/DataRow.stories.tsx +9 -2
  361. package/src/components/ui/data-row/DataRow.test.tsx +5 -15
  362. package/src/components/ui/data-row/DataRow.tsx +18 -7
  363. package/src/components/ui/divider/Divider.stories.tsx +1 -1
  364. package/src/components/ui/divider/Divider.tsx +1 -5
  365. package/src/components/ui/drawer/Drawer.stories.tsx +5 -16
  366. package/src/components/ui/drawer/Drawer.tsx +13 -30
  367. package/src/components/ui/floating-overlay-depth.test.tsx +143 -0
  368. package/src/components/ui/form-field/FormField.stories.tsx +6 -20
  369. package/src/components/ui/form-field/FormField.test.tsx +1 -5
  370. package/src/components/ui/form-field/FormField.tsx +10 -46
  371. package/src/components/ui/help-tip/HelpTip.stories.tsx +8 -19
  372. package/src/components/ui/help-tip/HelpTip.test.tsx +1 -3
  373. package/src/components/ui/help-tip/HelpTip.tsx +21 -22
  374. package/src/components/ui/help-tip/index.ts +7 -1
  375. package/src/components/ui/icon-box/IconBox.stories.tsx +1 -1
  376. package/src/components/ui/icon-box/IconBox.test.tsx +1 -7
  377. package/src/components/ui/icon-box/IconBox.tsx +2 -12
  378. package/src/components/ui/indicator/Indicator.stories.tsx +1 -1
  379. package/src/components/ui/indicator/Indicator.tsx +20 -14
  380. package/src/components/ui/input/Input.stories.tsx +3 -11
  381. package/src/components/ui/input/Input.test.tsx +2 -10
  382. package/src/components/ui/input/Input.tsx +10 -25
  383. package/src/components/ui/input/index.ts +7 -1
  384. package/src/components/ui/link/Link.stories.tsx +19 -7
  385. package/src/components/ui/list-item/ListItem.stories.tsx +11 -2
  386. package/src/components/ui/list-item/ListItem.tsx +2 -9
  387. package/src/components/ui/menu/Menu.stories.tsx +21 -15
  388. package/src/components/ui/menu/Menu.test.tsx +2 -11
  389. package/src/components/ui/menu/Menu.tsx +12 -14
  390. package/src/components/ui/menu/index.ts +8 -1
  391. package/src/components/ui/modal/Modal.stories.tsx +2 -2
  392. package/src/components/ui/modal/Modal.tsx +29 -19
  393. package/src/components/ui/pill/Pill.stories.tsx +58 -23
  394. package/src/components/ui/pill/Pill.test.tsx +101 -3
  395. package/src/components/ui/pill/Pill.tsx +164 -49
  396. package/src/components/ui/pill/index.ts +1 -1
  397. package/src/components/ui/popover/Popover.stories.tsx +5 -7
  398. package/src/components/ui/popover/Popover.test.tsx +1 -6
  399. package/src/components/ui/popover/Popover.tsx +20 -15
  400. package/src/components/ui/popover/index.ts +7 -1
  401. package/src/components/ui/progress/Progress.stories.tsx +3 -12
  402. package/src/components/ui/progress/Progress.test.tsx +1 -5
  403. package/src/components/ui/radio/Radio.stories.tsx +42 -21
  404. package/src/components/ui/radio/Radio.test.tsx +6 -2
  405. package/src/components/ui/radio/Radio.tsx +23 -22
  406. package/src/components/ui/section/Section.stories.tsx +5 -14
  407. package/src/components/ui/section/Section.test.tsx +1 -6
  408. package/src/components/ui/section/Section.tsx +1 -3
  409. package/src/components/ui/section/index.ts +1 -5
  410. package/src/components/ui/select/Select.stories.tsx +3 -13
  411. package/src/components/ui/select/Select.test.tsx +2 -11
  412. package/src/components/ui/select/Select.tsx +14 -14
  413. package/src/components/ui/skeleton/Skeleton.stories.tsx +3 -11
  414. package/src/components/ui/skeleton/Skeleton.tsx +3 -14
  415. package/src/components/ui/skeleton/index.ts +1 -7
  416. package/src/components/ui/spinner/Spinner.stories.tsx +1 -1
  417. package/src/components/ui/spinner/Spinner.tsx +1 -4
  418. package/src/components/ui/stack/Stack.stories.tsx +1 -1
  419. package/src/components/ui/stack/Stack.tsx +1 -1
  420. package/src/components/ui/surface/Surface.stories.tsx +17 -5
  421. package/src/components/ui/surface/Surface.test.tsx +88 -28
  422. package/src/components/ui/surface/Surface.tsx +37 -87
  423. package/src/components/ui/surface/SurfaceContext.ts +22 -62
  424. package/src/components/ui/surface/index.ts +8 -0
  425. package/src/components/ui/surface/resolveSurface.ts +98 -0
  426. package/src/components/ui/surface/surface.contract.test.ts +6 -1
  427. package/src/components/ui/switch/Switch.stories.tsx +1 -1
  428. package/src/components/ui/switch/Switch.tsx +7 -6
  429. package/src/components/ui/tabs/Tabs.stories.tsx +1 -1
  430. package/src/components/ui/tabs/Tabs.tsx +7 -22
  431. package/src/components/ui/tabs/index.ts +1 -7
  432. package/src/components/ui/tile/Tile.stories.tsx +1 -1
  433. package/src/components/ui/tile/Tile.tsx +3 -0
  434. package/src/components/ui/toast/Toast.stories.tsx +1 -1
  435. package/src/components/ui/toast/Toast.test.tsx +2 -8
  436. package/src/components/ui/toast/Toast.tsx +43 -53
  437. package/src/components/ui/toast/index.ts +0 -1
  438. package/src/components/ui/toolbar-button/ToolbarButton.stories.tsx +92 -71
  439. package/src/components/ui/toolbar-button/ToolbarButton.test.tsx +3 -18
  440. package/src/components/ui/toolbar-button/ToolbarButton.tsx +25 -43
  441. package/src/components/ui/tooltip/Tooltip.stories.tsx +12 -3
  442. package/src/components/ui/tooltip/Tooltip.test.tsx +21 -3
  443. package/src/components/ui/tooltip/Tooltip.tsx +55 -36
  444. package/src/components/ui/tooltip/index.ts +1 -1
  445. package/src/components/ui/trigger/TriggerSurface.test.tsx +215 -0
  446. package/src/components/ui/trigger/TriggerSurface.tsx +81 -0
  447. package/src/components/ui/trigger/index.ts +2 -0
  448. package/src/stories/PresetShowcase.stories.tsx +100 -47
  449. package/src/test/no-device-internals.test.ts +3 -3
  450. package/src/theme/ChoosingTokens.stories.tsx +48 -0
  451. package/src/theme/ColorPalettes.stories.tsx +62 -45
  452. package/src/theme/ColorPrimitives.stories.tsx +35 -35
  453. package/src/theme/Depth.stories.tsx +132 -65
  454. package/src/theme/DepthCalibration.stories.tsx +24 -22
  455. package/src/theme/ThemeProvider.test.tsx +4 -4
  456. package/src/theme/barrel.ts +7 -6
  457. package/src/theme/color-stories.coverage.test.ts +1 -1
  458. package/src/theme/color-utils.ts +41 -29
  459. package/src/theme/config.completeness.test.ts +1 -1
  460. package/src/theme/config.ts +28 -0
  461. package/src/theme/elevation.test.ts +82 -56
  462. package/src/theme/elevation.ts +77 -561
  463. package/src/theme/global.css +30 -2
  464. package/src/theme/grey-ramp.test.ts +24 -8
  465. package/src/theme/lift.test.ts +39 -0
  466. package/src/theme/lift.ts +102 -0
  467. package/src/theme/materials.test.ts +5 -2
  468. package/src/theme/materials.ts +38 -4
  469. package/src/theme/native-theming-guard.test.ts +5 -5
  470. package/src/theme/presets/apply.ts +4 -0
  471. package/src/theme/presets/audiobook.ts +5 -2
  472. package/src/theme/presets/default.ts +4 -0
  473. package/src/theme/presets/index.ts +14 -1
  474. package/src/theme/presets/types.ts +1 -1
  475. package/src/theme/semantic-contrast.test.ts +13 -4
  476. package/src/theme/status-distinctness.test.ts +66 -0
  477. package/src/theme/surface-planes.test.ts +37 -0
  478. package/src/theme/surface-planes.ts +68 -0
  479. package/src/theme/token-export-guard.test.ts +102 -0
  480. package/src/theme/tokens/primitives.test.ts +15 -7
  481. package/src/theme/tokens/primitives.ts +67 -35
  482. package/src/theme/tokens/semantic.ts +71 -37
  483. package/src/theme/wash-ladder.test.ts +58 -0
  484. package/src/theme/workout-tokens.ts +1 -7
  485. package/src/types/jest-axe.d.ts +2 -6
  486. package/src/types/raw-md.d.ts +5 -0
  487. package/src/utils/colors.ts +4 -4
  488. package/src/utils/form.ts +1 -3
  489. package/src/utils/index.ts +2 -7
  490. package/src/utils/number-format.ts +17 -0
  491. package/src/utils/workout-format.ts +15 -6
  492. package/src/web-jsx/jsx-runtime.ts +1 -5
  493. package/tailwind.config.js +5 -0
  494. package/src/components/custom/Workout/ExerciseCardUnified.stories.tsx +0 -151
  495. package/src/components/custom/Workout/RowInventory.stories.tsx +0 -408
  496. package/src/components/custom/Workout/S3FullRail.stories.tsx +0 -46
  497. package/src/components/custom/Workout/S3SessionPace.stories.tsx +0 -95
  498. package/src/components/custom/Workout/S3SessionRailHeading.stories.tsx +0 -61
  499. package/src/components/custom/Workout/S3SetTypes.stories.tsx +0 -176
  500. package/src/components/custom/Workout/S3WorkoutExpansion.stories.tsx +0 -240
  501. package/src/components/shell/DashboardShell.stories.tsx +0 -65
  502. package/src/components/shell/DashboardShell.tsx +0 -75
  503. package/src/components/shell/SessionRailSpecimen.stories.tsx +0 -753
  504. package/src/theme/elevation.stories.tsx +0 -346
  505. package/src/utils/useTheme.ts +0 -72
  506. /package/src/components/shell/{DeviceIndicator.test.tsx → workout/DeviceIndicator.test.tsx} +0 -0
  507. /package/src/components/shell/{DeviceMenu.test.tsx → workout/DeviceMenu.test.tsx} +0 -0
  508. /package/src/components/shell/{DeviceRow.test.tsx → workout/DeviceRow.test.tsx} +0 -0
  509. /package/src/components/shell/{SessionStatePill.test.tsx → workout/SessionStatePill.test.tsx} +0 -0
@@ -3,7 +3,7 @@ import { View } from 'react-native'
3
3
  import { WorkoutPill } from './WorkoutPill'
4
4
 
5
5
  const meta: Meta<typeof WorkoutPill> = {
6
- title: 'Workout/WorkoutPill',
6
+ title: 'Custom/Workout/WorkoutPill',
7
7
  component: WorkoutPill,
8
8
  tags: ['autodocs'],
9
9
  argTypes: {
@@ -14,7 +14,10 @@ const meta: Meta<typeof WorkoutPill> = {
14
14
  description: 'Pill status',
15
15
  },
16
16
  pulse: { control: 'boolean', description: 'Pulsing animation (independent of status)' },
17
- highlighted: { control: 'boolean', description: 'Highlighted with thicker border and slight scale' },
17
+ highlighted: {
18
+ control: 'boolean',
19
+ description: 'Highlighted with thicker border and slight scale',
20
+ },
18
21
  },
19
22
  }
20
23
 
@@ -2,6 +2,7 @@ import { describe, it, expect, vi } from 'vitest'
2
2
  import { render, screen, fireEvent } from '@testing-library/react'
3
3
  import { axe } from 'jest-axe'
4
4
  import { WorkoutPill } from './WorkoutPill'
5
+ import { resolveColor } from '../../../theme/resolve-color'
5
6
 
6
7
  describe('WorkoutPill', () => {
7
8
  it('renders the workout name', () => {
@@ -80,6 +81,41 @@ describe('WorkoutPill', () => {
80
81
  }
81
82
  })
82
83
 
84
+ // The rim is a whole rung above the wash. Asserting both rules out the
85
+ // flattening that collapses a two-step pill onto one `-subtle`.
86
+ describe('wash ladder', () => {
87
+ it.each([
88
+ ['completed', 'status-success'],
89
+ ['current', 'brand-primary'],
90
+ ['missed', 'status-error'],
91
+ ] as const)('washes the %s pill with %s -subtle inside a -muted rim', (status, role) => {
92
+ render(<WorkoutPill name="Upper A" status={status} />)
93
+ const pill = screen.getByLabelText(`Upper A workout, ${status}`)
94
+ expect(pill).toHaveStyle({ backgroundColor: resolveColor(`${role}-subtle`) })
95
+ expect(pill.style.borderTopColor).toBe(resolveColor(`${role}-muted`))
96
+ })
97
+
98
+ it('gives the washless next pill the -strong rim, a rung above current', () => {
99
+ render(<WorkoutPill name="Upper A" status="next" />)
100
+ const pill = screen.getByLabelText('Upper A workout, next')
101
+ // jsdom normalises the `transparent` keyword to its rgba() form.
102
+ expect(pill.style.backgroundColor).toBe('rgba(0, 0, 0, 0)')
103
+ expect(pill.style.borderTopColor).toBe(resolveColor('brand-primary-strong'))
104
+ })
105
+
106
+ it.each([
107
+ ['completed', 'status-success'],
108
+ ['current', 'brand-primary'],
109
+ ['upcoming', 'text-tertiary'],
110
+ ['missed', 'status-error-dark'],
111
+ ] as const)('labels the %s pill from the %s token', (status, token) => {
112
+ render(<WorkoutPill name="Upper A" status={status} />)
113
+ expect(screen.getByTestId('workout-pill-name')).toHaveStyle({
114
+ color: resolveColor(token),
115
+ })
116
+ })
117
+ })
118
+
83
119
  describe('pulse', () => {
84
120
  it('pulses by default on current status', () => {
85
121
  render(<WorkoutPill name="Upper A" status="current" />)
@@ -128,16 +164,14 @@ describe('WorkoutPill', () => {
128
164
  })
129
165
 
130
166
  it('has no accessibility violations as static pill', async () => {
131
- const { container } = render(
132
- <WorkoutPill name="Lower B" status="upcoming" />,
133
- )
167
+ const { container } = render(<WorkoutPill name="Lower B" status="upcoming" />)
134
168
  const results = await axe(container)
135
169
  expect(results).toHaveNoViolations()
136
170
  })
137
171
 
138
172
  it('has no accessibility violations for missed status', async () => {
139
173
  const { container } = render(
140
- <WorkoutPill name="Rest Day" status="missed" onPress={() => {}} />,
174
+ <WorkoutPill name="Rest Day" status="missed" onPress={() => {}} />
141
175
  )
142
176
  const results = await axe(container)
143
177
  expect(results).toHaveNoViolations()
@@ -145,9 +179,7 @@ describe('WorkoutPill', () => {
145
179
 
146
180
  it('pressable has correct accessibility label', () => {
147
181
  render(<WorkoutPill name="Upper A" status="completed" onPress={() => {}} />)
148
- expect(
149
- screen.getByLabelText('Upper A workout, completed'),
150
- ).toBeInTheDocument()
182
+ expect(screen.getByLabelText('Upper A workout, completed')).toBeInTheDocument()
151
183
  })
152
184
  })
153
185
  })
@@ -1,13 +1,17 @@
1
1
  // Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)
2
2
  import { useEffect, useState } from 'react'
3
- import { View, Text, Pressable, Animated, Easing, type ViewProps } from 'react-native'
4
- import { getSemanticColors } from '../../../theme/tokens/semantic'
3
+ import { View, Pressable, Animated, Easing, type ViewProps } from 'react-native'
4
+ import { Typography } from '../Typography'
5
+ import { resolveColor } from '../../../theme/resolve-color'
5
6
  import { WORKOUT_PILL_DELOAD } from '../../../theme/extracted-colors-dataviz'
6
- import { greyRamp } from '../../../theme/tokens/primitives'
7
+ import { alpha } from '../../../utils/colors'
7
8
 
8
- const HAIRLINE_DEFAULT = getSemanticColors('dark')['hairline-default']
9
-
10
- const t = getSemanticColors('dark')
9
+ // The deload role has no semantic tokens at all, so its wash and rim are derived from
10
+ // the same ramp pin WeekRow reads, at the LADDER'S rungs (0.12 subtle, 0.30 muted)
11
+ // rather than the frozen demo's hand-mixed 0.15. FINDING for E3: deload needs the
12
+ // wash ladder like every other role — its values already sit on one.
13
+ const DELOAD_WASH = alpha(WORKOUT_PILL_DELOAD, 0.12)
14
+ const DELOAD_RIM = alpha(WORKOUT_PILL_DELOAD, 0.3)
11
15
 
12
16
  /**
13
17
  * Spec statuses: completed | current | upcoming | deload.
@@ -25,31 +29,57 @@ export interface WorkoutPillProps extends ViewProps {
25
29
  className?: string
26
30
  }
27
31
 
28
- const statusBgColors: Record<WorkoutPillStatus, string> = {
29
- completed: 'rgba(46,213,115,0.15)',
30
- current: 'rgba(255,121,0,0.15)',
31
- next: 'transparent',
32
- upcoming: t['surface-raised'],
33
- missed: 'rgba(209,67,67,0.1)',
34
- deload: 'rgba(186,41,150,0.15)',
35
- }
36
-
37
- const statusBorderStyles: Record<WorkoutPillStatus, Record<string, unknown>> = {
38
- completed: { borderWidth: 1, borderColor: 'rgba(46,213,115,0.3)' },
39
- current: { borderWidth: 1, borderColor: 'rgba(255,121,0,0.3)' },
40
- next: { borderWidth: 1, borderColor: 'rgba(255,121,0,0.4)' },
41
- upcoming: { borderWidth: 1, borderColor: HAIRLINE_DEFAULT },
42
- missed: { borderWidth: 1, borderColor: 'rgba(209,67,67,0.25)' },
43
- deload: { borderWidth: 1, borderColor: 'rgba(186,41,150,0.3)' },
32
+ /** A pill's three colours: the wash, the rim a rung above it, and the label. */
33
+ interface PillPaint {
34
+ background: string
35
+ border: string
36
+ text: string
44
37
  }
45
38
 
46
- const textColors: Record<WorkoutPillStatus, string> = {
47
- completed: t['status-success'],
48
- current: t['brand-primary'],
49
- next: t['brand-primary'],
50
- upcoming: greyRamp[500],
51
- missed: 'rgba(209,67,67,0.7)',
52
- deload: WORKOUT_PILL_DELOAD,
39
+ /**
40
+ * Every status on the wash ladder: `-subtle` (0.12) inside a `-muted` (0.30) rim.
41
+ *
42
+ * Two do not fit a rung exactly. `next` is deliberately the strongest rim — it is
43
+ * the only status with no wash — so it takes `-strong` (0.50) rather than collapsing
44
+ * onto `current`'s 0.30 and losing the distinction; it was 0.4. `missed`'s label was
45
+ * a 0.7 alpha, which no rung expresses; `status-error-dark` composites to within a
46
+ * hair of it on the dark planes and needs no alpha at all.
47
+ */
48
+ function paintFor(status: WorkoutPillStatus): PillPaint {
49
+ switch (status) {
50
+ case 'completed':
51
+ return {
52
+ background: resolveColor('status-success-subtle'),
53
+ border: resolveColor('status-success-muted'),
54
+ text: resolveColor('status-success'),
55
+ }
56
+ case 'current':
57
+ return {
58
+ background: resolveColor('brand-primary-subtle'),
59
+ border: resolveColor('brand-primary-muted'),
60
+ text: resolveColor('brand-primary'),
61
+ }
62
+ case 'next':
63
+ return {
64
+ background: 'transparent',
65
+ border: resolveColor('brand-primary-strong'),
66
+ text: resolveColor('brand-primary'),
67
+ }
68
+ case 'upcoming':
69
+ return {
70
+ background: resolveColor('surface-raised'),
71
+ border: resolveColor('hairline-default'),
72
+ text: resolveColor('text-tertiary'),
73
+ }
74
+ case 'missed':
75
+ return {
76
+ background: resolveColor('status-error-subtle'),
77
+ border: resolveColor('status-error-muted'),
78
+ text: resolveColor('status-error-dark'),
79
+ }
80
+ case 'deload':
81
+ return { background: DELOAD_WASH, border: DELOAD_RIM, text: WORKOUT_PILL_DELOAD }
82
+ }
53
83
  }
54
84
 
55
85
  function usePulse(enabled: boolean) {
@@ -85,6 +115,9 @@ function usePulse(enabled: boolean) {
85
115
  return opacity
86
116
  }
87
117
 
118
+ /**
119
+ * @deprecated Use `<Pill tone="…" leading="dot">` — removed after AW-127 consumer migration.
120
+ */
88
121
  export function WorkoutPill({
89
122
  name,
90
123
  status,
@@ -98,6 +131,11 @@ export function WorkoutPill({
98
131
  const pulseOpacity = usePulse(shouldPulse)
99
132
  const isCompleted = status === 'completed'
100
133
  const isMissed = status === 'missed'
134
+ const paint = paintFor(status)
135
+
136
+ // 11px sat between scale steps. `caption` rounds it UP to the 12px `xs` step, the
137
+ // same call B2 made when MuscleGroupChip became a Pill preset at size md.
138
+ const labelClass = 'font-semibold leading-[normal]'
101
139
 
102
140
  const pill = (
103
141
  <Animated.View
@@ -113,56 +151,49 @@ export function WorkoutPill({
113
151
  paddingHorizontal: 10,
114
152
  paddingVertical: 4,
115
153
  borderRadius: 6,
116
- backgroundColor: statusBgColors[status],
154
+ backgroundColor: paint.background,
155
+ borderWidth: 1,
156
+ borderColor: paint.border,
117
157
  },
118
- statusBorderStyles[status] as Record<string, unknown>,
119
158
  highlighted ? { borderWidth: 2, transform: [{ scale: 1.02 }] } : undefined,
120
159
  ]}
121
160
  accessibilityLabel={onPress ? undefined : `${name} workout, ${status}`}
122
161
  {...props}
123
162
  >
124
163
  {isCompleted && (
125
- <Text
126
- style={{
127
- fontWeight: '600',
128
- fontFamily: '"Nunito Sans", sans-serif',
129
- fontSize: 11,
130
- color: textColors[status],
131
- marginRight: 4,
132
- }}
164
+ <Typography
165
+ variant="caption"
166
+ color="inherit"
167
+ className={labelClass}
168
+ style={{ color: paint.text, marginRight: 4 }}
133
169
  accessibilityElementsHidden
134
170
  testID="workout-pill-check"
135
171
  >
136
172
  {'\u2713'}
137
- </Text>
173
+ </Typography>
138
174
  )}
139
175
  {isMissed && (
140
- <Text
141
- style={{
142
- fontWeight: '600',
143
- fontFamily: '"Nunito Sans", sans-serif',
144
- fontSize: 11,
145
- color: textColors[status],
146
- marginRight: 4,
147
- }}
176
+ <Typography
177
+ variant="caption"
178
+ color="inherit"
179
+ className={labelClass}
180
+ style={{ color: paint.text, marginRight: 4 }}
148
181
  accessibilityElementsHidden
149
182
  testID="workout-pill-dash"
150
183
  >
151
184
  {'\u2014'}
152
- </Text>
185
+ </Typography>
153
186
  )}
154
- <Text
155
- style={{
156
- fontWeight: '600',
157
- fontFamily: '"Nunito Sans", sans-serif',
158
- fontSize: 11,
159
- color: textColors[status],
160
- }}
187
+ <Typography
188
+ variant="caption"
189
+ color="inherit"
190
+ className={labelClass}
191
+ style={{ color: paint.text }}
161
192
  accessibilityElementsHidden={onPress != null}
162
193
  testID="workout-pill-name"
163
194
  >
164
195
  {name}
165
- </Text>
196
+ </Typography>
166
197
  </View>
167
198
  </Animated.View>
168
199
  )
@@ -1,8 +1,8 @@
1
1
  // Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)
2
2
  import type { Meta, StoryObj } from '@storybook/react-vite'
3
- import { View } from 'react-native'
4
3
  import { ZoneTrack, type ZoneTrackZone } from './ZoneTrack'
5
4
  import { WORKOUT_TOKENS } from '../../../theme/workout-tokens'
5
+ import { Surface } from '../../ui/surface'
6
6
 
7
7
  const { green, yellow, orange, red } = WORKOUT_TOKENS.scale
8
8
 
@@ -22,7 +22,7 @@ const FATIGUE_TICKS = [
22
22
  ]
23
23
 
24
24
  const meta: Meta<typeof ZoneTrack> = {
25
- title: 'Workout/DataViz/ZoneTrack',
25
+ title: 'Custom/Workout/DataViz/ZoneTrack',
26
26
  component: ZoneTrack,
27
27
  tags: ['autodocs'],
28
28
  parameters: {
@@ -32,17 +32,18 @@ const meta: Meta<typeof ZoneTrack> = {
32
32
  '**Primitive.** The shared linear-gauge base: a pill track with an N-band zone ' +
33
33
  'gradient, optional tick marks + labels, and a single value marker — a `needle` line ' +
34
34
  'or a left-anchored `fill` (clip-reveal gradient, or solid trend colour). Used-by ↓ ' +
35
- '[FatigueMeter](?path=/docs/workout-dataviz-fatiguemeter--docs); the target base for ' +
35
+ '[FatigueMeter](?path=/docs/custom-workout-dataviz-fatiguemeter--docs); the target base for ' +
36
36
  'TrainingLoadGauge (ACWR) + RpeCalibration (band + marker). Zone colours are literal ' +
37
- 'ramp-token hex.',
37
+ 'ramp-token hex.' +
38
+ ' Composes **Tooltip**.',
38
39
  },
39
40
  },
40
41
  },
41
42
  decorators: [
42
43
  (Story) => (
43
- <View style={{ width: 360, padding: 20, backgroundColor: '#131313' }}>
44
+ <Surface level="base" style={{ width: 360, padding: 20 }}>
44
45
  <Story />
45
- </View>
46
+ </Surface>
46
47
  ),
47
48
  ],
48
49
  }
@@ -1,18 +1,19 @@
1
1
  // Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)
2
2
  import { useState } from 'react'
3
- import { View, Text, type ViewProps, type DimensionValue, type LayoutChangeEvent } from 'react-native'
3
+ import {
4
+ View,
5
+ Text,
6
+ type ViewProps,
7
+ type DimensionValue,
8
+ type LayoutChangeEvent,
9
+ } from 'react-native'
4
10
  import { getSemanticColors } from '../../../theme/tokens/semantic'
5
11
  import { primitiveColors, greyRamp } from '../../../theme/tokens/primitives'
6
- import { alpha } from '../../../utils/colors'
12
+ import { getGlowShadow } from '../../../theme/elevation'
7
13
  import { Tooltip } from '../../ui/tooltip/Tooltip'
8
14
 
9
15
  const t = getSemanticColors('dark')
10
16
 
11
- /** Soft two-stop glow in `color`, for a marker's optional `glow`. */
12
- function glowShadow(color: string): string {
13
- return `0 0 5px 1px ${alpha(color, 0.3)}, 0 0 10px 3px ${alpha(color, 0.12)}`
14
- }
15
-
16
17
  /** Muted, un-reached track colour — a grey step, matches the IntensityBar track family. */
17
18
  const DEFAULT_TRACK_COLOR = greyRamp[800]
18
19
  /** Default needle / fill-marker colour. */
@@ -230,9 +231,9 @@ export function ZoneTrack({
230
231
  overflow: 'hidden',
231
232
  flexDirection: 'row',
232
233
  // The pill's own box-shadow renders outside its overflow:hidden, so
233
- // `glow` haloes the whole track in the marker colour.
234
+ // `glow` haloes the whole track in the marker colour. Emphasis, not depth.
234
235
  ...(marker?.glow
235
- ? { boxShadow: glowShadow(marker.color ?? DEFAULT_MARKER_COLOR) }
236
+ ? getGlowShadow(marker.color ?? DEFAULT_MARKER_COLOR, 'subtle')
236
237
  : null),
237
238
  }}
238
239
  >
@@ -6,6 +6,11 @@ export {
6
6
  } from './BaseBadge'
7
7
  export { WeightBadge, type WeightBadgeProps, type WeightBadgeSize } from './WeightBadge'
8
8
  export { PrBadge, type PrBadgeProps, type PRType } from './PrBadge'
9
+ /**
10
+ * @deprecated Use `Indicator` (roadmap decision 10) — removed after AW-127
11
+ * consumer migration. Marked on the barrel, not the module: `StatusDot.tsx` is
12
+ * being edited under E1 this hour.
13
+ */
9
14
  export { StatusDot, type StatusDotVariant, type StatusDotProps } from './StatusDot'
10
15
  export { PlaceholderStrip, type PlaceholderStripProps } from './PlaceholderStrip'
11
16
  export {
@@ -1,6 +1,7 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite'
2
2
  import { View } from 'react-native'
3
3
  import { MetricCell } from './metricText'
4
+ import { Surface } from '../../ui/surface'
4
5
 
5
6
  /**
6
7
  * `MetricCell` — the shared "segmented metric" typography primitive (Inter · 600 ·
@@ -8,7 +9,7 @@ import { MetricCell } from './metricText'
8
9
  * single source of the value/separator look shared by SetsRepsLoad and TempoDisplay.
9
10
  */
10
11
  const meta: Meta<typeof MetricCell> = {
11
- title: 'Workout/MetricCell',
12
+ title: 'Custom/Workout/MetricCell',
12
13
  component: MetricCell,
13
14
  tags: ['autodocs'],
14
15
  parameters: {
@@ -18,8 +19,8 @@ const meta: Meta<typeof MetricCell> = {
18
19
  '**Primitive.** The shared Inter·600·letter-spacing-1 value/separator cell. ' +
19
20
  'Extracted so the two prescription readouts read as one visual language instead of ' +
20
21
  'drifting copies. Used-by ↑ ' +
21
- '[SetsRepsLoad](?path=/docs/workout-setsrepsload--docs) + ' +
22
- '[TempoDisplay](?path=/docs/workout-tempodisplay--docs).',
22
+ '[SetsRepsLoad](?path=/docs/custom-workout-setsrepsload--docs) + ' +
23
+ '[TempoDisplay](?path=/docs/custom-workout-tempodisplay--docs).',
23
24
  },
24
25
  },
25
26
  },
@@ -29,9 +30,9 @@ const meta: Meta<typeof MetricCell> = {
29
30
  },
30
31
  decorators: [
31
32
  (Story) => (
32
- <View style={{ padding: 20, backgroundColor: '#131313' }}>
33
+ <Surface level="base" style={{ padding: 20 }}>
33
34
  <Story />
34
- </View>
35
+ </Surface>
35
36
  ),
36
37
  ],
37
38
  }
@@ -17,6 +17,10 @@ export interface MetricCellProps {
17
17
  fontSize?: number
18
18
  }
19
19
 
20
+ /**
21
+ * @deprecated Use `<Metric size="…" align="…">` (roadmap decision 11) — removed
22
+ * after AW-127 consumer migration.
23
+ */
20
24
  export function MetricCell({ children, color, fontSize = 11 }: MetricCellProps) {
21
25
  return (
22
26
  <Text