@titan-design/react-ui 0.12.1 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (531) hide show
  1. package/README.md +60 -47
  2. package/dist/bodymap.js +856 -736
  3. package/dist/bodymap.js.map +1 -1
  4. package/dist/bodymap.mjs +858 -738
  5. package/dist/bodymap.mjs.map +1 -1
  6. package/dist/index.d.mts +1431 -237
  7. package/dist/index.d.ts +1431 -237
  8. package/dist/index.js +6506 -4781
  9. package/dist/index.js.map +1 -1
  10. package/dist/index.mjs +6280 -4642
  11. package/dist/index.mjs.map +1 -1
  12. package/dist/{pages-B1hqnGIC.d.ts → pages-CsjsUn0G.d.ts} +51 -16
  13. package/dist/{pages-CvsFqNtx.d.mts → pages-ZbT_pD_U.d.mts} +51 -16
  14. package/dist/pages.d.mts +1 -1
  15. package/dist/pages.d.ts +1 -1
  16. package/dist/pages.js +1919 -1937
  17. package/dist/pages.js.map +1 -1
  18. package/dist/pages.mjs +1927 -1945
  19. package/dist/pages.mjs.map +1 -1
  20. package/dist/theme/index.d.mts +225 -140
  21. package/dist/theme/index.d.ts +225 -140
  22. package/dist/theme/index.js +298 -319
  23. package/dist/theme/index.js.map +1 -1
  24. package/dist/theme/index.mjs +283 -315
  25. package/dist/theme/index.mjs.map +1 -1
  26. package/dist/theme/tokens-css.js +145 -24
  27. package/dist/theme/tokens-css.js.map +1 -1
  28. package/dist/theme/tokens-css.mjs +145 -24
  29. package/dist/theme/tokens-css.mjs.map +1 -1
  30. package/dist/theme/tokens.d.mts +128 -11
  31. package/dist/theme/tokens.d.ts +128 -11
  32. package/dist/theme/tokens.js +126 -26
  33. package/dist/theme/tokens.js.map +1 -1
  34. package/dist/theme/tokens.mjs +124 -27
  35. package/dist/theme/tokens.mjs.map +1 -1
  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/docs/render-testing-pattern.md +130 -0
  40. package/package.json +1 -1
  41. package/src/arch/Architecture.stories.tsx +3 -1
  42. package/src/arch/arch-graph.freshness.test.ts +52 -0
  43. package/src/arch/arch-graph.json +4989 -1583
  44. package/src/components/custom/ActiveWork/CoChangeChip.stories.tsx +44 -0
  45. package/src/components/custom/ActiveWork/CoChangeChip.test.tsx +29 -0
  46. package/src/components/custom/ActiveWork/CoChangeChip.tsx +48 -0
  47. package/src/components/custom/ActiveWork/Eyebrow.stories.tsx +25 -0
  48. package/src/components/custom/ActiveWork/Eyebrow.test.tsx +16 -0
  49. package/src/components/custom/ActiveWork/Eyebrow.tsx +26 -0
  50. package/src/components/custom/ActiveWork/FileActivityDetail.stories.tsx +50 -0
  51. package/src/components/custom/ActiveWork/FileActivityDetail.test.tsx +66 -0
  52. package/src/components/custom/ActiveWork/FileActivityDetail.tsx +202 -0
  53. package/src/components/custom/ActiveWork/FileActivityRow.stories.tsx +70 -0
  54. package/src/components/custom/ActiveWork/FileActivityRow.test.tsx +67 -0
  55. package/src/components/custom/ActiveWork/FileActivityRow.tsx +130 -0
  56. package/src/components/custom/ActiveWork/FileHistoryExplorer.stories.tsx +84 -0
  57. package/src/components/custom/ActiveWork/FileHistoryExplorer.test.tsx +99 -0
  58. package/src/components/custom/ActiveWork/FileHistoryExplorer.tsx +138 -0
  59. package/src/components/custom/ActiveWork/FilePathLabel.stories.tsx +39 -0
  60. package/src/components/custom/ActiveWork/FilePathLabel.test.tsx +53 -0
  61. package/src/components/custom/ActiveWork/FilePathLabel.tsx +63 -0
  62. package/src/components/custom/ActiveWork/InitiativeBrief.stories.tsx +50 -0
  63. package/src/components/custom/ActiveWork/InitiativeBrief.test.tsx +62 -0
  64. package/src/components/custom/ActiveWork/InitiativeBrief.tsx +182 -0
  65. package/src/components/custom/ActiveWork/InitiativeCard.stories.tsx +73 -0
  66. package/src/components/custom/ActiveWork/InitiativeCard.test.tsx +68 -0
  67. package/src/components/custom/ActiveWork/InitiativeCard.tsx +136 -0
  68. package/src/components/custom/ActiveWork/InitiativeHeader.stories.tsx +59 -0
  69. package/src/components/custom/ActiveWork/InitiativeHeader.test.tsx +40 -0
  70. package/src/components/custom/ActiveWork/InitiativeHeader.tsx +73 -0
  71. package/src/components/custom/ActiveWork/InitiativeReader.stories.tsx +145 -0
  72. package/src/components/custom/ActiveWork/OpenLoops.stories.tsx +58 -0
  73. package/src/components/custom/ActiveWork/OpenLoops.test.tsx +61 -0
  74. package/src/components/custom/ActiveWork/OpenLoops.tsx +107 -0
  75. package/src/components/custom/ActiveWork/PortfolioOverview.stories.tsx +101 -0
  76. package/src/components/custom/ActiveWork/PortfolioOverview.test.tsx +81 -0
  77. package/src/components/custom/ActiveWork/PortfolioOverview.tsx +83 -0
  78. package/src/components/custom/ActiveWork/README.md +305 -0
  79. package/src/components/custom/ActiveWork/SessionDetail.stories.tsx +71 -0
  80. package/src/components/custom/ActiveWork/SessionDetail.test.tsx +84 -0
  81. package/src/components/custom/ActiveWork/SessionDetail.tsx +180 -0
  82. package/src/components/custom/ActiveWork/SessionList.stories.tsx +69 -0
  83. package/src/components/custom/ActiveWork/SessionList.test.tsx +78 -0
  84. package/src/components/custom/ActiveWork/SessionList.tsx +103 -0
  85. package/src/components/custom/ActiveWork/SessionListItem.stories.tsx +64 -0
  86. package/src/components/custom/ActiveWork/SessionListItem.test.tsx +62 -0
  87. package/src/components/custom/ActiveWork/SessionListItem.tsx +152 -0
  88. package/src/components/custom/ActiveWork/SessionReader.stories.tsx +113 -0
  89. package/src/components/custom/ActiveWork/SeverityLabel.stories.tsx +51 -0
  90. package/src/components/custom/ActiveWork/SeverityLabel.test.tsx +68 -0
  91. package/src/components/custom/ActiveWork/SeverityLabel.tsx +97 -0
  92. package/src/components/custom/ActiveWork/TaskRow.stories.tsx +63 -0
  93. package/src/components/custom/ActiveWork/TaskRow.test.tsx +112 -0
  94. package/src/components/custom/ActiveWork/TaskRow.tsx +176 -0
  95. package/src/components/custom/ActiveWork/TaskTable.stories.tsx +123 -0
  96. package/src/components/custom/ActiveWork/TaskTable.test.tsx +233 -0
  97. package/src/components/custom/ActiveWork/TaskTable.tsx +321 -0
  98. package/src/components/custom/ActiveWork/active-work-depth.test.tsx +102 -0
  99. package/src/components/custom/ActiveWork/file-history-fixture.ts +91 -0
  100. package/src/components/custom/ActiveWork/format-time.test.ts +23 -0
  101. package/src/components/custom/ActiveWork/format-time.ts +32 -0
  102. package/src/components/custom/ActiveWork/index.ts +19 -0
  103. package/src/components/custom/ActiveWork/initiative-fixture.ts +104 -0
  104. package/src/components/custom/ActiveWork/session-fixture.ts +267 -0
  105. package/src/components/custom/ActiveWork/session-linkers.ts +56 -0
  106. package/src/components/custom/ActiveWork/task-list-fixture.ts +97 -0
  107. package/src/components/custom/CircularTimer/CircularTimer.stories.tsx +12 -6
  108. package/src/components/custom/DateTime/DateTime.stories.tsx +2 -1
  109. package/src/components/custom/DateTime/DateTime.test.tsx +3 -1
  110. package/src/components/custom/EmptyState/EmptyState.stories.tsx +22 -9
  111. package/src/components/custom/EmptyState/EmptyState.test.tsx +7 -13
  112. package/src/components/custom/EmptyState/EmptyState.tsx +4 -18
  113. package/src/components/custom/Fatigue/DualGhostSpark.stories.tsx +4 -3
  114. package/src/components/custom/Fatigue/FatigueLights.stories.tsx +2 -2
  115. package/src/components/custom/Fatigue/GhostSpark.stories.tsx +4 -3
  116. package/src/components/custom/Fatigue/LiveFatigueCard.stories.tsx +2 -2
  117. package/src/components/custom/Fatigue/LiveFatigueCard.tsx +8 -4
  118. package/src/components/custom/Fatigue/LiveFatiguePanel.stories.tsx +116 -6
  119. package/src/components/custom/Fatigue/LiveFatiguePanel.test.tsx +134 -0
  120. package/src/components/custom/Fatigue/LiveFatiguePanel.tsx +54 -83
  121. package/src/components/custom/Fatigue/README.md +40 -3
  122. package/src/components/custom/Fatigue/RomProgressionChart.stories.tsx +2 -2
  123. package/src/components/custom/Fatigue/SilverRedPalette.stories.tsx +2 -1
  124. package/src/components/custom/Fatigue/VelocityHero.stories.tsx +4 -3
  125. package/src/components/custom/Fatigue/VerdictHero.stories.tsx +2 -2
  126. package/src/components/custom/Fatigue/fatigue-mock.test.ts +0 -5
  127. package/src/components/custom/Fatigue/fatigue-mock.ts +2 -10
  128. package/src/components/custom/Fatigue/fatigue-tokens.ts +12 -0
  129. package/src/components/custom/Fatigue/index.ts +17 -5
  130. package/src/components/custom/Fatigue/panel-layout.test.ts +149 -0
  131. package/src/components/custom/Fatigue/panel-layout.ts +185 -0
  132. package/src/components/custom/Gauge/Gauge.stories.tsx +6 -3
  133. package/src/components/custom/Gauge/Gauge.test.tsx +1 -1
  134. package/src/components/custom/Gauge/Gauge.tsx +7 -2
  135. package/src/components/custom/Metric/Metric.stories.tsx +10 -1
  136. package/src/components/custom/Metric/Metric.test.tsx +1 -3
  137. package/src/components/custom/Metric/Metric.tsx +5 -20
  138. package/src/components/custom/Prose/MarkdownProse.stories.tsx +88 -0
  139. package/src/components/custom/Prose/MarkdownProse.test.tsx +87 -0
  140. package/src/components/custom/Prose/MarkdownProse.tsx +201 -0
  141. package/src/components/custom/Prose/README.md +58 -0
  142. package/src/components/custom/Prose/index.ts +1 -0
  143. package/src/components/custom/Scatter/Scatter.stories.tsx +55 -14
  144. package/src/components/custom/Scatter/Scatter.test.tsx +2 -2
  145. package/src/components/custom/Scatter/Scatter.tsx +122 -18
  146. package/src/components/custom/Sidebar/Sidebar.stories.tsx +41 -8
  147. package/src/components/custom/Sidebar/Sidebar.test.tsx +5 -1
  148. package/src/components/custom/Sidebar/Sidebar.tsx +16 -33
  149. package/src/components/custom/Table/Table.stories.tsx +99 -16
  150. package/src/components/custom/Table/Table.test.tsx +273 -86
  151. package/src/components/custom/Table/Table.tsx +159 -67
  152. package/src/components/custom/Table/column-fit.test.ts +75 -0
  153. package/src/components/custom/Table/column-fit.ts +116 -0
  154. package/src/components/custom/Table/index.ts +9 -0
  155. package/src/components/custom/TimerReadout/TimerReadout.stories.tsx +8 -6
  156. package/src/components/custom/Treemap/Treemap.stories.tsx +15 -12
  157. package/src/components/custom/Treemap/Treemap.test.tsx +1 -1
  158. package/src/components/custom/Treemap/Treemap.tsx +11 -3
  159. package/src/components/custom/Typography/Typography.stories.tsx +28 -1
  160. package/src/components/custom/Typography/Typography.test.tsx +34 -0
  161. package/src/components/custom/Typography/Typography.tsx +6 -0
  162. package/src/components/custom/Typography/index.ts +1 -8
  163. package/src/components/custom/Workout/ActiveWorkoutPage.stories.tsx +11 -2
  164. package/src/components/custom/Workout/BaseBadge.stories.tsx +27 -11
  165. package/src/components/custom/Workout/BaseBadge.test.tsx +31 -11
  166. package/src/components/custom/Workout/BaseBadge.tsx +6 -2
  167. package/src/components/custom/Workout/BodyMap.stories.tsx +4 -1
  168. package/src/components/custom/Workout/BodyMap.tsx +8 -4
  169. package/src/components/custom/Workout/BodyMapDetailPanel.stories.tsx +28 -6
  170. package/src/components/custom/Workout/BodyMapDetailPanel.test.tsx +11 -15
  171. package/src/components/custom/Workout/BodyMapDetailPanel.tsx +50 -12
  172. package/src/components/custom/Workout/CapacityBandChart.stories.tsx +12 -9
  173. package/src/components/custom/Workout/CapacityBandChart.test.tsx +24 -51
  174. package/src/components/custom/Workout/CapacityBandChart.tsx +144 -111
  175. package/src/components/custom/Workout/DeviationBar.stories.tsx +1 -1
  176. package/src/components/custom/Workout/DeviationBar.test.tsx +10 -4
  177. package/src/components/custom/Workout/DeviationBar.tsx +24 -16
  178. package/src/components/custom/Workout/DualVelocityStrip.stories.tsx +183 -0
  179. package/src/components/custom/Workout/DualVelocityStrip.test.tsx +32 -18
  180. package/src/components/custom/Workout/ExerciseCard.stories.tsx +12 -11
  181. package/src/components/custom/Workout/ExerciseCard.test.tsx +52 -22
  182. package/src/components/custom/Workout/ExerciseCard.tsx +99 -183
  183. package/src/components/custom/Workout/ExerciseCardHeading.stories.tsx +95 -12
  184. package/src/components/custom/Workout/ExerciseCardHeading.test.tsx +189 -1
  185. package/src/components/custom/Workout/ExerciseCardHeading.tsx +167 -18
  186. package/src/components/custom/Workout/ExerciseDetailPage.stories.tsx +9 -1
  187. package/src/components/custom/Workout/ExerciseDetailPage.tsx +3 -2
  188. package/src/components/custom/Workout/ExerciseHeading.stories.tsx +8 -8
  189. package/src/components/custom/Workout/ExerciseHeading.tsx +194 -46
  190. package/src/components/custom/Workout/ExerciseIndicator.stories.tsx +12 -9
  191. package/src/components/custom/Workout/ExerciseIndicator.test.tsx +27 -11
  192. package/src/components/custom/Workout/ExerciseIndicator.tsx +14 -15
  193. package/src/components/custom/Workout/FatigueMeter.stories.tsx +5 -5
  194. package/src/components/custom/Workout/InputBar.stories.tsx +4 -5
  195. package/src/components/custom/Workout/InputBar.tsx +4 -2
  196. package/src/components/custom/Workout/IntensityBar.stories.tsx +1 -1
  197. package/src/components/custom/Workout/IntensityBar.test.tsx +5 -1
  198. package/src/components/custom/Workout/IntensityBar.tsx +8 -3
  199. package/src/components/custom/Workout/LiveAuraFrame.stories.tsx +5 -4
  200. package/src/components/custom/Workout/MesoCard.stories.tsx +4 -1
  201. package/src/components/custom/Workout/MesoCard.test.tsx +7 -18
  202. package/src/components/custom/Workout/MesoCard.tsx +14 -10
  203. package/src/components/custom/Workout/MesoProgressBar.stories.tsx +1 -1
  204. package/src/components/custom/Workout/MesoProgressBar.test.tsx +18 -11
  205. package/src/components/custom/Workout/MesoProgressBar.tsx +15 -13
  206. package/src/components/custom/Workout/MesoStatusCard.stories.tsx +2 -1
  207. package/src/components/custom/Workout/MesoStatusCard.test.tsx +14 -44
  208. package/src/components/custom/Workout/MesoStatusCard.tsx +20 -33
  209. package/src/components/custom/Workout/MetricTiles.stories.tsx +3 -2
  210. package/src/components/custom/Workout/MuscleGroupChip.stories.tsx +2 -8
  211. package/src/components/custom/Workout/MuscleGroupChip.test.tsx +23 -31
  212. package/src/components/custom/Workout/MuscleGroupChip.tsx +28 -67
  213. package/src/components/custom/Workout/PlaceholderStrip.stories.tsx +9 -4
  214. package/src/components/custom/Workout/PlaceholderStrip.test.tsx +17 -10
  215. package/src/components/custom/Workout/PlaceholderStrip.tsx +9 -8
  216. package/src/components/custom/Workout/PrBadge.stories.tsx +2 -1
  217. package/src/components/custom/Workout/PrBadge.test.tsx +3 -9
  218. package/src/components/custom/Workout/PrBadge.tsx +13 -17
  219. package/src/components/custom/Workout/PrHistoryModal.stories.tsx +16 -3
  220. package/src/components/custom/Workout/PrHistoryModal.test.tsx +13 -36
  221. package/src/components/custom/Workout/PrHistoryModal.tsx +8 -4
  222. package/src/components/custom/Workout/ProgramPlanningPage.stories.tsx +6 -1
  223. package/src/components/custom/Workout/README.md +68 -17
  224. package/src/components/custom/Workout/ReadinessCheck.stories.tsx +3 -2
  225. package/src/components/custom/Workout/ReadinessCheck.test.tsx +12 -18
  226. package/src/components/custom/Workout/ReadinessCheck.tsx +22 -4
  227. package/src/components/custom/Workout/RestTimer.stories.tsx +16 -4
  228. package/src/components/custom/Workout/RestTimer.tsx +4 -2
  229. package/src/components/custom/Workout/ScheduleTiles.stories.tsx +3 -2
  230. package/src/components/custom/Workout/ScheduleTiles.test.tsx +3 -4
  231. package/src/components/custom/Workout/ScheduleTiles.tsx +4 -7
  232. package/src/components/custom/Workout/SegmentedBar.stories.tsx +21 -17
  233. package/src/components/custom/Workout/SegmentedBar.tsx +10 -5
  234. package/src/components/custom/Workout/SegmentedProgressBar.stories.tsx +5 -5
  235. package/src/components/custom/Workout/SessionHeader.stories.tsx +6 -6
  236. package/src/components/custom/Workout/SessionHeader.tsx +12 -12
  237. package/src/components/custom/Workout/SessionRail.stories.tsx +12 -11
  238. package/src/components/custom/Workout/SessionRail.tsx +7 -9
  239. package/src/components/custom/Workout/SetBar.stories.tsx +10 -6
  240. package/src/components/custom/Workout/SetBar.test.tsx +49 -4
  241. package/src/components/custom/Workout/SetBar.tsx +38 -12
  242. package/src/components/custom/Workout/SetRow.stories.tsx +3 -2
  243. package/src/components/custom/Workout/SetRow.test.tsx +16 -2
  244. package/src/components/custom/Workout/SetRow.tsx +61 -23
  245. package/src/components/custom/Workout/SetStrip.stories.tsx +63 -7
  246. package/src/components/custom/Workout/SetStrip.test.tsx +25 -0
  247. package/src/components/custom/Workout/SetStrip.tsx +24 -4
  248. package/src/components/custom/Workout/SetTableHeader.stories.tsx +6 -6
  249. package/src/components/custom/Workout/SetTableHeader.tsx +9 -12
  250. package/src/components/custom/Workout/SetsRepsLoad.stories.tsx +7 -7
  251. package/src/components/custom/Workout/SetsRepsLoad.tsx +24 -12
  252. package/src/components/custom/Workout/Sparkline.stories.tsx +14 -11
  253. package/src/components/custom/Workout/Sparkline.test.tsx +37 -19
  254. package/src/components/custom/Workout/Sparkline.tsx +14 -18
  255. package/src/components/custom/Workout/StatusDot.stories.tsx +1 -1
  256. package/src/components/custom/Workout/StatusDot.test.tsx +44 -5
  257. package/src/components/custom/Workout/StatusDot.tsx +93 -63
  258. package/src/components/custom/Workout/StatusPill.stories.tsx +1 -1
  259. package/src/components/custom/Workout/StatusPill.test.tsx +6 -15
  260. package/src/components/custom/Workout/StatusPill.tsx +27 -38
  261. package/src/components/custom/Workout/StrengthTrendChart.stories.tsx +11 -4
  262. package/src/components/custom/Workout/StrengthTrendChart.test.tsx +15 -37
  263. package/src/components/custom/Workout/StrengthTrendChart.tsx +39 -36
  264. package/src/components/custom/Workout/SupersetWrapper.stories.tsx +27 -64
  265. package/src/components/custom/Workout/SupersetWrapper.test.tsx +16 -14
  266. package/src/components/custom/Workout/SupersetWrapper.tsx +17 -21
  267. package/src/components/custom/Workout/TempoDisplay.stories.tsx +26 -10
  268. package/src/components/custom/Workout/TempoDisplay.test.tsx +18 -4
  269. package/src/components/custom/Workout/TempoDisplay.tsx +2 -0
  270. package/src/components/custom/Workout/TrainingStatusPage.stories.tsx +9 -1
  271. package/src/components/custom/Workout/VelocityStrip.compact.stories.tsx +4 -1
  272. package/src/components/custom/Workout/VelocityStrip.dual.stories.tsx +10 -6
  273. package/src/components/custom/Workout/VelocityStrip.expanded.stories.tsx +5 -2
  274. package/src/components/custom/Workout/VelocityStrip.hero.stories.tsx +44 -1
  275. package/src/components/custom/Workout/VelocityStrip.stories.tsx +12 -6
  276. package/src/components/custom/Workout/VelocityStrip.test.tsx +48 -6
  277. package/src/components/custom/Workout/VelocityStrip.tsx +26 -14
  278. package/src/components/custom/Workout/VolumeLandmarkBar.stories.tsx +6 -7
  279. package/src/components/custom/Workout/VolumeLandmarkBar.tsx +15 -6
  280. package/src/components/custom/Workout/WeekRow.stories.tsx +4 -1
  281. package/src/components/custom/Workout/WeekRow.test.tsx +18 -15
  282. package/src/components/custom/Workout/WeekRow.tsx +23 -16
  283. package/src/components/custom/Workout/WeightBadge.stories.tsx +2 -1
  284. package/src/components/custom/Workout/WeightBadge.test.tsx +50 -19
  285. package/src/components/custom/Workout/WeightBadge.tsx +28 -27
  286. package/src/components/custom/Workout/WorkoutCard.stories.tsx +6 -1
  287. package/src/components/custom/Workout/WorkoutCard.test.tsx +18 -0
  288. package/src/components/custom/Workout/WorkoutCard.tsx +35 -57
  289. package/src/components/custom/Workout/WorkoutPill.stories.tsx +5 -2
  290. package/src/components/custom/Workout/WorkoutPill.test.tsx +39 -7
  291. package/src/components/custom/Workout/WorkoutPill.tsx +88 -57
  292. package/src/components/custom/Workout/ZoneTrack.stories.tsx +10 -7
  293. package/src/components/custom/Workout/ZoneTrack.tsx +10 -9
  294. package/src/components/custom/Workout/exerciseRowState.ts +29 -0
  295. package/src/components/custom/Workout/index.ts +17 -2
  296. package/src/components/custom/Workout/metricText.stories.tsx +15 -13
  297. package/src/components/custom/Workout/metricText.tsx +8 -2
  298. package/src/components/custom/Workout/setHeadingKit.tsx +219 -36
  299. package/src/components/custom/Workout/velocity-story-kit.tsx +2 -2
  300. package/src/components/custom/charts/README.md +66 -0
  301. package/src/components/custom/charts/SetBarChart.test.tsx +46 -1
  302. package/src/components/custom/charts/SetBarChart.tsx +56 -9
  303. package/src/components/custom/charts/SparkBars.stories.tsx +55 -0
  304. package/src/components/custom/charts/SparkBars.test.tsx +69 -0
  305. package/src/components/custom/charts/SparkBars.tsx +85 -0
  306. package/src/components/custom/charts/flatBarGeometry.test.ts +41 -0
  307. package/src/components/custom/charts/flatBarGeometry.ts +32 -0
  308. package/src/components/custom/charts/index.ts +3 -0
  309. package/src/components/custom/index.ts +3 -0
  310. package/src/components/custom/stepper/Stepper.stories.tsx +13 -10
  311. package/src/components/custom/stepper/Stepper.test.tsx +1 -7
  312. package/src/components/custom/stepper/Stepper.tsx +21 -34
  313. package/src/components/icons/icons.stories.tsx +1 -1
  314. package/src/components/icons/icons.tsx +51 -0
  315. package/src/components/shell/AppShell.stories.tsx +150 -0
  316. package/src/components/shell/AppShell.test.tsx +70 -0
  317. package/src/components/shell/AppShell.tsx +90 -0
  318. package/src/components/shell/BrandLockup.stories.tsx +66 -5
  319. package/src/components/shell/BrandLockup.test.tsx +34 -1
  320. package/src/components/shell/BrandLockup.tsx +27 -11
  321. package/src/components/shell/NavItem.stories.tsx +4 -4
  322. package/src/components/shell/NavItem.test.tsx +17 -0
  323. package/src/components/shell/NavItem.tsx +17 -5
  324. package/src/components/shell/README.md +89 -26
  325. package/src/components/shell/SideNav.stories.tsx +38 -7
  326. package/src/components/shell/SideNav.test.tsx +16 -8
  327. package/src/components/shell/SideNav.tsx +17 -17
  328. package/src/components/shell/TopBar.stories.tsx +44 -19
  329. package/src/components/shell/TopBar.test.tsx +34 -12
  330. package/src/components/shell/TopBar.tsx +61 -40
  331. package/src/components/shell/brands.tsx +66 -0
  332. package/src/components/shell/index.ts +9 -8
  333. package/src/components/shell/{DeviceIndicator.stories.tsx → workout/DeviceIndicator.stories.tsx} +2 -2
  334. package/src/components/shell/{DeviceIndicator.tsx → workout/DeviceIndicator.tsx} +2 -2
  335. package/src/components/shell/{DeviceMenu.stories.tsx → workout/DeviceMenu.stories.tsx} +2 -2
  336. package/src/components/shell/{DeviceMenu.tsx → workout/DeviceMenu.tsx} +3 -3
  337. package/src/components/shell/{DeviceRow.stories.tsx → workout/DeviceRow.stories.tsx} +2 -2
  338. package/src/components/shell/{DeviceRow.tsx → workout/DeviceRow.tsx} +3 -3
  339. package/src/components/shell/{SessionStatePill.stories.tsx → workout/SessionStatePill.stories.tsx} +2 -2
  340. package/src/components/shell/{SessionStatePill.tsx → workout/SessionStatePill.tsx} +5 -3
  341. package/src/components/shell/workout/WorkoutShell.stories.tsx +71 -0
  342. package/src/components/shell/{DashboardShell.test.tsx → workout/WorkoutShell.test.tsx} +19 -8
  343. package/src/components/shell/workout/WorkoutShell.tsx +77 -0
  344. package/src/components/shell/workout/WorkoutTopBar.stories.tsx +58 -0
  345. package/src/components/shell/workout/WorkoutTopBar.test.tsx +39 -0
  346. package/src/components/shell/workout/WorkoutTopBar.tsx +52 -0
  347. package/src/components/shell/workout/index.ts +9 -0
  348. package/src/components/shell/workout/workoutNavItems.tsx +16 -0
  349. package/src/components/ui/README.md +110 -0
  350. package/src/components/ui/alert/Alert.stories.tsx +15 -5
  351. package/src/components/ui/alert/Alert.tsx +24 -3
  352. package/src/components/ui/autocomplete/Autocomplete.stories.tsx +11 -13
  353. package/src/components/ui/autocomplete/Autocomplete.test.tsx +7 -25
  354. package/src/components/ui/autocomplete/Autocomplete.tsx +21 -28
  355. package/src/components/ui/avatar/Avatar.stories.tsx +1 -1
  356. package/src/components/ui/avatar/Avatar.tsx +2 -10
  357. package/src/components/ui/badge/Badge.stories.tsx +83 -28
  358. package/src/components/ui/badge/Badge.test.tsx +19 -3
  359. package/src/components/ui/badge/Badge.tsx +48 -55
  360. package/src/components/ui/breadcrumbs/Breadcrumbs.stories.tsx +1 -1
  361. package/src/components/ui/breadcrumbs/Breadcrumbs.tsx +4 -16
  362. package/src/components/ui/button/Button.stories.tsx +46 -12
  363. package/src/components/ui/button/Button.tsx +44 -37
  364. package/src/components/ui/card/Card.stories.tsx +90 -94
  365. package/src/components/ui/card/Card.test.tsx +80 -6
  366. package/src/components/ui/card/Card.tsx +150 -203
  367. package/src/components/ui/checkbox/Checkbox.stories.tsx +1 -1
  368. package/src/components/ui/checkbox/Checkbox.tsx +7 -27
  369. package/src/components/ui/chip/Chip.stories.tsx +37 -13
  370. package/src/components/ui/chip/Chip.test.tsx +10 -6
  371. package/src/components/ui/chip/Chip.tsx +76 -91
  372. package/src/components/ui/collapse/Collapse.stories.tsx +23 -23
  373. package/src/components/ui/collapse/Collapse.tsx +6 -11
  374. package/src/components/ui/data-row/DataRow.stories.tsx +14 -3
  375. package/src/components/ui/data-row/DataRow.test.tsx +5 -15
  376. package/src/components/ui/data-row/DataRow.tsx +18 -7
  377. package/src/components/ui/divider/Divider.stories.tsx +1 -1
  378. package/src/components/ui/divider/Divider.tsx +1 -5
  379. package/src/components/ui/drawer/Drawer.stories.tsx +5 -16
  380. package/src/components/ui/drawer/Drawer.tsx +13 -27
  381. package/src/components/ui/floating-overlay-depth.test.tsx +143 -0
  382. package/src/components/ui/form-field/FormField.stories.tsx +6 -20
  383. package/src/components/ui/form-field/FormField.test.tsx +1 -5
  384. package/src/components/ui/form-field/FormField.tsx +10 -46
  385. package/src/components/ui/help-tip/HelpTip.stories.tsx +8 -19
  386. package/src/components/ui/help-tip/HelpTip.test.tsx +1 -3
  387. package/src/components/ui/help-tip/HelpTip.tsx +21 -22
  388. package/src/components/ui/help-tip/index.ts +7 -1
  389. package/src/components/ui/icon-box/IconBox.stories.tsx +1 -1
  390. package/src/components/ui/icon-box/IconBox.test.tsx +1 -7
  391. package/src/components/ui/icon-box/IconBox.tsx +10 -18
  392. package/src/components/ui/indicator/Indicator.stories.tsx +5 -4
  393. package/src/components/ui/indicator/Indicator.tsx +20 -14
  394. package/src/components/ui/input/Input.stories.tsx +3 -11
  395. package/src/components/ui/input/Input.test.tsx +2 -10
  396. package/src/components/ui/input/Input.tsx +10 -25
  397. package/src/components/ui/input/index.ts +7 -1
  398. package/src/components/ui/link/Link.stories.tsx +19 -7
  399. package/src/components/ui/list-item/ListItem.stories.tsx +17 -5
  400. package/src/components/ui/list-item/ListItem.tsx +2 -9
  401. package/src/components/ui/menu/Menu.stories.tsx +21 -15
  402. package/src/components/ui/menu/Menu.test.tsx +2 -11
  403. package/src/components/ui/menu/Menu.tsx +12 -14
  404. package/src/components/ui/menu/index.ts +8 -1
  405. package/src/components/ui/modal/Modal.stories.tsx +2 -2
  406. package/src/components/ui/modal/Modal.tsx +31 -19
  407. package/src/components/ui/pill/Pill.stories.tsx +111 -23
  408. package/src/components/ui/pill/Pill.test.tsx +101 -3
  409. package/src/components/ui/pill/Pill.tsx +168 -49
  410. package/src/components/ui/pill/index.ts +1 -1
  411. package/src/components/ui/popover/Popover.stories.tsx +6 -8
  412. package/src/components/ui/popover/Popover.test.tsx +1 -6
  413. package/src/components/ui/popover/Popover.tsx +20 -15
  414. package/src/components/ui/popover/index.ts +7 -1
  415. package/src/components/ui/progress/Progress.stories.tsx +3 -12
  416. package/src/components/ui/progress/Progress.test.tsx +1 -5
  417. package/src/components/ui/progress/Progress.tsx +9 -6
  418. package/src/components/ui/radio/Radio.stories.tsx +42 -21
  419. package/src/components/ui/radio/Radio.test.tsx +6 -2
  420. package/src/components/ui/radio/Radio.tsx +23 -22
  421. package/src/components/ui/section/Section.stories.tsx +12 -21
  422. package/src/components/ui/section/Section.test.tsx +1 -6
  423. package/src/components/ui/section/Section.tsx +1 -3
  424. package/src/components/ui/section/index.ts +1 -5
  425. package/src/components/ui/select/Select.stories.tsx +3 -13
  426. package/src/components/ui/select/Select.test.tsx +2 -11
  427. package/src/components/ui/select/Select.tsx +16 -15
  428. package/src/components/ui/skeleton/Skeleton.stories.tsx +3 -11
  429. package/src/components/ui/skeleton/Skeleton.tsx +3 -14
  430. package/src/components/ui/skeleton/index.ts +1 -7
  431. package/src/components/ui/spinner/Spinner.stories.tsx +1 -1
  432. package/src/components/ui/spinner/Spinner.tsx +4 -5
  433. package/src/components/ui/stack/Stack.stories.tsx +8 -8
  434. package/src/components/ui/stack/Stack.tsx +1 -1
  435. package/src/components/ui/surface/Surface.stories.tsx +92 -33
  436. package/src/components/ui/surface/Surface.test.tsx +88 -28
  437. package/src/components/ui/surface/Surface.tsx +37 -87
  438. package/src/components/ui/surface/SurfaceContext.ts +22 -62
  439. package/src/components/ui/surface/index.ts +8 -0
  440. package/src/components/ui/surface/resolveSurface.ts +98 -0
  441. package/src/components/ui/surface/surface.contract.test.ts +6 -1
  442. package/src/components/ui/switch/Switch.stories.tsx +1 -1
  443. package/src/components/ui/switch/Switch.tsx +7 -6
  444. package/src/components/ui/tabs/Tabs.stories.tsx +1 -1
  445. package/src/components/ui/tabs/Tabs.tsx +8 -21
  446. package/src/components/ui/tabs/index.ts +1 -7
  447. package/src/components/ui/tile/Tile.stories.tsx +1 -1
  448. package/src/components/ui/tile/Tile.tsx +3 -0
  449. package/src/components/ui/toast/Toast.stories.tsx +1 -1
  450. package/src/components/ui/toast/Toast.test.tsx +2 -8
  451. package/src/components/ui/toast/Toast.tsx +49 -57
  452. package/src/components/ui/toast/index.ts +0 -1
  453. package/src/components/ui/toolbar-button/ToolbarButton.stories.tsx +92 -71
  454. package/src/components/ui/toolbar-button/ToolbarButton.test.tsx +3 -18
  455. package/src/components/ui/toolbar-button/ToolbarButton.tsx +38 -49
  456. package/src/components/ui/tooltip/Tooltip.stories.tsx +12 -3
  457. package/src/components/ui/tooltip/Tooltip.test.tsx +21 -3
  458. package/src/components/ui/tooltip/Tooltip.tsx +55 -36
  459. package/src/components/ui/tooltip/index.ts +1 -1
  460. package/src/components/ui/trigger/TriggerSurface.test.tsx +215 -0
  461. package/src/components/ui/trigger/TriggerSurface.tsx +81 -0
  462. package/src/components/ui/trigger/index.ts +2 -0
  463. package/src/stories/PresetShowcase.stories.tsx +101 -48
  464. package/src/test/no-device-internals.test.ts +3 -3
  465. package/src/test/no-raw-color.test.ts +39 -0
  466. package/src/theme/Alpha.stories.tsx +103 -0
  467. package/src/theme/ChoosingTokens.stories.tsx +48 -0
  468. package/src/theme/ColorPalettes.stories.tsx +62 -45
  469. package/src/theme/ColorPrimitives.stories.tsx +35 -35
  470. package/src/theme/Depth.stories.tsx +132 -65
  471. package/src/theme/DepthCalibration.stories.tsx +23 -21
  472. package/src/theme/ProposedTokensVW82.stories.tsx +414 -0
  473. package/src/theme/ThemeProvider.test.tsx +4 -4
  474. package/src/theme/barrel.ts +7 -6
  475. package/src/theme/color-stories.coverage.test.ts +1 -1
  476. package/src/theme/color-utils.ts +41 -29
  477. package/src/theme/config.completeness.test.ts +1 -1
  478. package/src/theme/config.ts +40 -0
  479. package/src/theme/elevation.test.ts +82 -56
  480. package/src/theme/elevation.ts +77 -561
  481. package/src/theme/global.css +45 -5
  482. package/src/theme/grey-ramp.test.ts +24 -8
  483. package/src/theme/lift.test.ts +39 -0
  484. package/src/theme/lift.ts +102 -0
  485. package/src/theme/materials.test.ts +5 -2
  486. package/src/theme/materials.ts +38 -4
  487. package/src/theme/native-theming-guard.test.ts +5 -5
  488. package/src/theme/presets/apply.ts +4 -0
  489. package/src/theme/presets/audiobook.ts +5 -2
  490. package/src/theme/presets/default.ts +4 -0
  491. package/src/theme/presets/index.ts +14 -1
  492. package/src/theme/presets/types.ts +1 -1
  493. package/src/theme/semantic-contrast.test.ts +13 -4
  494. package/src/theme/status-distinctness.test.ts +66 -0
  495. package/src/theme/subtle-tone-weight.test.ts +163 -0
  496. package/src/theme/surface-planes.test.ts +37 -0
  497. package/src/theme/surface-planes.ts +68 -0
  498. package/src/theme/tailwind-var-opacity.test.ts +163 -0
  499. package/src/theme/token-export-guard.test.ts +1 -3
  500. package/src/theme/tokens/primitives.test.ts +15 -7
  501. package/src/theme/tokens/primitives.ts +98 -33
  502. package/src/theme/tokens/semantic-hex-guard.test.ts +322 -0
  503. package/src/theme/tokens/semantic.ts +124 -54
  504. package/src/theme/wash-ladder.test.ts +58 -0
  505. package/src/theme/workout-tokens.ts +1 -7
  506. package/src/types/jest-axe.d.ts +2 -6
  507. package/src/types/raw-md.d.ts +5 -0
  508. package/src/utils/colors.alpha-adoption.test.ts +408 -0
  509. package/src/utils/colors.ts +4 -4
  510. package/src/utils/form.ts +1 -3
  511. package/src/utils/index.ts +2 -7
  512. package/src/utils/number-format.ts +17 -0
  513. package/src/utils/workout-format.ts +15 -6
  514. package/src/web-jsx/jsx-runtime.ts +1 -5
  515. package/tailwind.config.js +55 -9
  516. package/src/components/custom/Workout/ExerciseCardUnified.stories.tsx +0 -151
  517. package/src/components/custom/Workout/RowInventory.stories.tsx +0 -408
  518. package/src/components/custom/Workout/S3FullRail.stories.tsx +0 -46
  519. package/src/components/custom/Workout/S3SessionPace.stories.tsx +0 -95
  520. package/src/components/custom/Workout/S3SessionRailHeading.stories.tsx +0 -61
  521. package/src/components/custom/Workout/S3SetTypes.stories.tsx +0 -176
  522. package/src/components/custom/Workout/S3WorkoutExpansion.stories.tsx +0 -240
  523. package/src/components/shell/DashboardShell.stories.tsx +0 -65
  524. package/src/components/shell/DashboardShell.tsx +0 -75
  525. package/src/components/shell/SessionRailSpecimen.stories.tsx +0 -753
  526. package/src/theme/elevation.stories.tsx +0 -346
  527. package/src/utils/useTheme.ts +0 -72
  528. /package/src/components/shell/{DeviceIndicator.test.tsx → workout/DeviceIndicator.test.tsx} +0 -0
  529. /package/src/components/shell/{DeviceMenu.test.tsx → workout/DeviceMenu.test.tsx} +0 -0
  530. /package/src/components/shell/{DeviceRow.test.tsx → workout/DeviceRow.test.tsx} +0 -0
  531. /package/src/components/shell/{SessionStatePill.test.tsx → workout/SessionStatePill.test.tsx} +0 -0
@@ -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,10 +1,12 @@
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
+ import { getSemanticColors } from '../../../theme/tokens/semantic'
6
7
 
7
8
  const { green, yellow, orange, red } = WORKOUT_TOKENS.scale
9
+ const t = getSemanticColors('dark')
8
10
 
9
11
  const FATIGUE_ZONES: ZoneTrackZone[] = [
10
12
  { upTo: 10, color: green },
@@ -22,7 +24,7 @@ const FATIGUE_TICKS = [
22
24
  ]
23
25
 
24
26
  const meta: Meta<typeof ZoneTrack> = {
25
- title: 'Workout/DataViz/ZoneTrack',
27
+ title: 'Custom/Workout/DataViz/ZoneTrack',
26
28
  component: ZoneTrack,
27
29
  tags: ['autodocs'],
28
30
  parameters: {
@@ -32,17 +34,18 @@ const meta: Meta<typeof ZoneTrack> = {
32
34
  '**Primitive.** The shared linear-gauge base: a pill track with an N-band zone ' +
33
35
  'gradient, optional tick marks + labels, and a single value marker — a `needle` line ' +
34
36
  '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 ' +
37
+ '[FatigueMeter](?path=/docs/custom-workout-dataviz-fatiguemeter--docs); the target base for ' +
36
38
  'TrainingLoadGauge (ACWR) + RpeCalibration (band + marker). Zone colours are literal ' +
37
- 'ramp-token hex.',
39
+ 'ramp-token hex.' +
40
+ ' Composes **Tooltip**.',
38
41
  },
39
42
  },
40
43
  },
41
44
  decorators: [
42
45
  (Story) => (
43
- <View style={{ width: 360, padding: 20, backgroundColor: '#131313' }}>
46
+ <Surface level="base" style={{ width: 360, padding: 20 }}>
44
47
  <Story />
45
- </View>
48
+ </Surface>
46
49
  ),
47
50
  ],
48
51
  }
@@ -85,7 +88,7 @@ export const BandWithMarker: Story = {
85
88
  ],
86
89
  min: 6,
87
90
  max: 10,
88
- band: { from: 7.2, to: 8.4, color: 'rgba(255,255,255,0.22)' },
91
+ band: { from: 7.2, to: 8.4, color: t['hairline-strong'] },
89
92
  marker: { type: 'needle', value: 8.1 },
90
93
  ticks: [
91
94
  { value: 6, label: '6' },
@@ -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
  >
@@ -0,0 +1,29 @@
1
+ import { getSemanticColors, type ThemeMode } from '../../../theme/tokens/semantic'
2
+
3
+ /** The interaction washes an exercise row can wear, beyond its resting look. */
4
+ export type ExerciseRowState = 'hovered' | 'selected' | 'pressed'
5
+
6
+ const ROW_STATE_TOKEN = {
7
+ hovered: 'interactive-hover',
8
+ selected: 'interactive-selected',
9
+ pressed: 'interactive-active',
10
+ } as const satisfies Record<ExerciseRowState, keyof ReturnType<typeof getSemanticColors>>
11
+
12
+ /**
13
+ * Literal-hex wash for one interaction state, in the same shape as
14
+ * `onSurfaceColors`. Uses `getSemanticColors` rather than `resolveColor` so the
15
+ * value survives where there are no CSS custom properties (the raw-RN wall SPA,
16
+ * native) and stays assertable in tests.
17
+ */
18
+ export function exerciseRowStateColor(state: ExerciseRowState, mode: ThemeMode = 'dark'): string {
19
+ return getSemanticColors(mode)[ROW_STATE_TOKEN[state]]
20
+ }
21
+
22
+ /**
23
+ * The tone for an exercise being performed right now. Static by construction —
24
+ * a live row sits on a wall display, where titan's "the grain never animates"
25
+ * rule applies just as much to a heading.
26
+ */
27
+ export function exerciseLiveColor(mode: ThemeMode = 'dark'): string {
28
+ return getSemanticColors(mode)['status-live']
29
+ }
@@ -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 {
@@ -63,8 +68,18 @@ export {
63
68
  type ExerciseIndicatorProps,
64
69
  type ExerciseIndicatorKind,
65
70
  } from './ExerciseIndicator'
66
- export { ExerciseHeading, type ExerciseHeadingProps } from './ExerciseHeading'
67
- export { ExerciseCardHeading, type ExerciseCardHeadingProps } from './ExerciseCardHeading'
71
+ export {
72
+ ExerciseHeading,
73
+ exerciseHeadingLabel,
74
+ type ExerciseHeadingProps,
75
+ type ExerciseHeadingLayout,
76
+ } from './ExerciseHeading'
77
+ export {
78
+ ExerciseCardHeading,
79
+ type ExerciseCardHeadingProps,
80
+ type ExerciseRowDensity,
81
+ } from './ExerciseCardHeading'
82
+ export { exerciseLiveColor, exerciseRowStateColor, type ExerciseRowState } from './exerciseRowState'
68
83
  export { ExerciseCard, type ExerciseCardProps } from './ExerciseCard'
69
84
  export { SetTableHeader, type SetTableHeaderProps } from './SetTableHeader'
70
85
  export {
@@ -1,6 +1,8 @@
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'
5
+ import { greyRamp } from '../../../theme/tokens/primitives'
4
6
 
5
7
  /**
6
8
  * `MetricCell` — the shared "segmented metric" typography primitive (Inter · 600 ·
@@ -8,7 +10,7 @@ import { MetricCell } from './metricText'
8
10
  * single source of the value/separator look shared by SetsRepsLoad and TempoDisplay.
9
11
  */
10
12
  const meta: Meta<typeof MetricCell> = {
11
- title: 'Workout/MetricCell',
13
+ title: 'Custom/Workout/MetricCell',
12
14
  component: MetricCell,
13
15
  tags: ['autodocs'],
14
16
  parameters: {
@@ -18,8 +20,8 @@ const meta: Meta<typeof MetricCell> = {
18
20
  '**Primitive.** The shared Inter·600·letter-spacing-1 value/separator cell. ' +
19
21
  'Extracted so the two prescription readouts read as one visual language instead of ' +
20
22
  'drifting copies. Used-by ↑ ' +
21
- '[SetsRepsLoad](?path=/docs/workout-setsrepsload--docs) + ' +
22
- '[TempoDisplay](?path=/docs/workout-tempodisplay--docs).',
23
+ '[SetsRepsLoad](?path=/docs/custom-workout-setsrepsload--docs) + ' +
24
+ '[TempoDisplay](?path=/docs/custom-workout-tempodisplay--docs).',
23
25
  },
24
26
  },
25
27
  },
@@ -29,9 +31,9 @@ const meta: Meta<typeof MetricCell> = {
29
31
  },
30
32
  decorators: [
31
33
  (Story) => (
32
- <View style={{ padding: 20, backgroundColor: '#131313' }}>
34
+ <Surface level="base" style={{ padding: 20 }}>
33
35
  <Story />
34
- </View>
36
+ </Surface>
35
37
  ),
36
38
  ],
37
39
  }
@@ -40,23 +42,23 @@ export default meta
40
42
  type Story = StoryObj<typeof MetricCell>
41
43
 
42
44
  export const ValueCell: Story = {
43
- args: { children: '145', color: '#F3F4F6', fontSize: 11 },
45
+ args: { children: '145', color: greyRamp[50], fontSize: 11 },
44
46
  }
45
47
 
46
48
  export const Separator: Story = {
47
- args: { children: '×', color: '#6B7280', fontSize: 11 },
49
+ args: { children: '×', color: greyRamp[600], fontSize: 11 },
48
50
  parameters: { docs: { description: { story: 'A muted separator cell (× / @ / -).' } } },
49
51
  }
50
52
 
51
53
  export const InContext: Story = {
52
54
  render: () => (
53
55
  <View style={{ flexDirection: 'row', alignItems: 'baseline' }}>
54
- <MetricCell color="#F3F4F6">5</MetricCell>
55
- <MetricCell color="#6B7280">&nbsp;×&nbsp;</MetricCell>
56
- <MetricCell color="#F3F4F6">8</MetricCell>
57
- <MetricCell color="#6B7280">&nbsp;@&nbsp;</MetricCell>
58
- <MetricCell color="#F3F4F6">145</MetricCell>
59
- <MetricCell color="#6B7280">&nbsp;lb</MetricCell>
56
+ <MetricCell color={greyRamp[50]}>5</MetricCell>
57
+ <MetricCell color={greyRamp[600]}>&nbsp;×&nbsp;</MetricCell>
58
+ <MetricCell color={greyRamp[50]}>8</MetricCell>
59
+ <MetricCell color={greyRamp[600]}>&nbsp;@&nbsp;</MetricCell>
60
+ <MetricCell color={greyRamp[50]}>145</MetricCell>
61
+ <MetricCell color={greyRamp[600]}>&nbsp;lb</MetricCell>
60
62
  </View>
61
63
  ),
62
64
  parameters: {
@@ -15,16 +15,22 @@ export interface MetricCellProps {
15
15
  /** Cell text color — value cells take a primary color, separators a muted one. */
16
16
  color: string
17
17
  fontSize?: number
18
+ /** Cell font weight. Default 600 (the bold "digital readout" look). */
19
+ weight?: 400 | 600
18
20
  }
19
21
 
20
- export function MetricCell({ children, color, fontSize = 11 }: MetricCellProps) {
22
+ /**
23
+ * @deprecated Use `<Metric size="…" align="…">` (roadmap decision 11) — removed
24
+ * after AW-127 consumer migration.
25
+ */
26
+ export function MetricCell({ children, color, fontSize = 11, weight = 600 }: MetricCellProps) {
21
27
  return (
22
28
  <Text
23
29
  style={{
24
30
  fontFamily: METRIC_FONT,
25
31
  fontSize,
26
32
  color,
27
- fontWeight: '600',
33
+ fontWeight: String(weight) as '400' | '600',
28
34
  letterSpacing: 1,
29
35
  }}
30
36
  >