@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,10 +1,13 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite'
2
2
  import { Treemap, type TreemapDatum } from './Treemap'
3
+ import { getSemanticColors } from '../../../theme/tokens/semantic'
4
+
5
+ const t = getSemanticColors('dark')
3
6
 
4
7
  const meta: Meta<typeof Treemap> = {
5
- title: 'Components/DataViz/Treemap',
8
+ title: 'Custom/Charts/Treemap',
6
9
  component: Treemap,
7
- tags: ['autodocs'],
10
+ tags: ['autodocs', 'status:candidate', '!status:review'],
8
11
  argTypes: {
9
12
  width: { control: { type: 'range', min: 200, max: 900, step: 20 } },
10
13
  height: { control: { type: 'range', min: 120, max: 600, step: 20 } },
@@ -16,14 +19,14 @@ export default meta
16
19
  type Story = StoryObj<typeof Treemap>
17
20
 
18
21
  const sample: TreemapDatum[] = [
19
- { id: 'router', value: 5035, color: '#F83030', label: 'router.ts' },
20
- { id: 'engine', value: 4378, color: '#F83030', label: 'engine.ts' },
21
- { id: 'linker', value: 1695, color: '#F4A736', label: 'linker.ts' },
22
- { id: 'validate', value: 1288, color: '#F4A736', label: 'validate.ts' },
23
- { id: 'hook', value: 1050, color: '#F4A736', label: 'hook.ts' },
24
- { id: 'update', value: 890, color: '#5B9BD5', label: 'update.ts' },
25
- { id: 'pool', value: 504, color: '#5B9BD5', label: 'pool.ts' },
26
- { id: 'log', value: 342, color: '#5B9BD5', label: 'log.ts' },
22
+ { id: 'router', value: 5035, color: t['data-4'], label: 'router.ts' },
23
+ { id: 'engine', value: 4378, color: t['data-4'], label: 'engine.ts' },
24
+ { id: 'linker', value: 1695, color: t['data-6'], label: 'linker.ts' },
25
+ { id: 'validate', value: 1288, color: t['data-6'], label: 'validate.ts' },
26
+ { id: 'hook', value: 1050, color: t['data-6'], label: 'hook.ts' },
27
+ { id: 'update', value: 890, color: t['data-7'], label: 'update.ts' },
28
+ { id: 'pool', value: 504, color: t['data-7'], label: 'pool.ts' },
29
+ { id: 'log', value: 342, color: t['data-7'], label: 'log.ts' },
27
30
  ]
28
31
 
29
32
  export const Default: Story = {
@@ -33,7 +36,7 @@ export const Default: Story = {
33
36
  /** A single outlier under a linear scale swallows the canvas... */
34
37
  export const OutlierLinear: Story = {
35
38
  args: {
36
- data: [{ id: 'mega', value: 205422, color: '#F83030', label: 'mega.ts' }, ...sample],
39
+ data: [{ id: 'mega', value: 205422, color: t['data-4'], label: 'mega.ts' }, ...sample],
37
40
  width: 560,
38
41
  height: 300,
39
42
  scale: 'linear',
@@ -43,7 +46,7 @@ export const OutlierLinear: Story = {
43
46
  /** ...the same data with a sqrt scale keeps every tile legible. */
44
47
  export const OutlierSqrt: Story = {
45
48
  args: {
46
- data: [{ id: 'mega', value: 205422, color: '#F83030', label: 'mega.ts' }, ...sample],
49
+ data: [{ id: 'mega', value: 205422, color: t['data-4'], label: 'mega.ts' }, ...sample],
47
50
  width: 560,
48
51
  height: 300,
49
52
  scale: 'sqrt',
@@ -47,7 +47,7 @@ describe('Treemap', () => {
47
47
 
48
48
  it('assigns fallback palette colors when omitted', () => {
49
49
  const { container } = render(
50
- <Treemap data={[{ id: 'x', value: 1 }]} width={100} height={100} />,
50
+ <Treemap data={[{ id: 'x', value: 1 }]} width={100} height={100} />
51
51
  )
52
52
  expect(container.firstChild).toBeInTheDocument()
53
53
  })
@@ -2,6 +2,7 @@ import React from 'react'
2
2
  import { View, Text, Pressable, type ViewProps } from 'react-native'
3
3
  import { cn } from '../../../utils/cn'
4
4
  import { DATAVIZ_CATEGORICAL_PALETTE } from '../../../theme/extracted-colors-dataviz'
5
+ import { primitiveColors } from '../../../theme/tokens/primitives'
5
6
 
6
7
  export interface TreemapDatum {
7
8
  /** Stable identity — returned by onPress and used as the React key. */
@@ -100,7 +101,7 @@ function squarify(data: TreemapDatum[], w: number, h: number): Rect[] {
100
101
  out.push(
101
102
  vertical
102
103
  ? { x: rx, y: along, w: thickness, h: len, datum: r.datum }
103
- : { x: along, y: ry, w: len, h: thickness, datum: r.datum },
104
+ : { x: along, y: ry, w: len, h: thickness, datum: r.datum }
104
105
  )
105
106
  along += len
106
107
  }
@@ -143,7 +144,13 @@ export function Treemap({
143
144
  const restValue = clean.slice(maxTiles - 1).reduce((s, d) => s + d.value, 0)
144
145
  tiles = [
145
146
  ...head,
146
- { id: '__more__', value: restValue, color: '#3a3a3a', label: `+${clean.length - (maxTiles - 1)} more` },
147
+ {
148
+ id: '__more__',
149
+ value: restValue,
150
+ // VW-82: no token at this value (nearest surface-overlay #373635); proposed, not swapped.
151
+ color: '#3a3a3a',
152
+ label: `+${clean.length - (maxTiles - 1)} more`,
153
+ },
147
154
  ]
148
155
  }
149
156
 
@@ -172,12 +179,13 @@ export function Treemap({
172
179
  borderRadius: 3,
173
180
  opacity: selected ? 1 : 0.9,
174
181
  borderWidth: selected ? 2 : 0,
175
- borderColor: '#ffffff',
182
+ borderColor: primitiveColors.white,
176
183
  padding: 4,
177
184
  overflow: 'hidden',
178
185
  }}
179
186
  >
180
187
  {labelFits && (
188
+ // VW-82: label on a data-coloured tile; no on-data token exists yet.
181
189
  <Text numberOfLines={2} className="text-[10px] font-semibold text-[#0b0b0b]">
182
190
  {r.datum.label ?? r.datum.id}
183
191
  </Text>
@@ -5,7 +5,7 @@ import { Typography, Heading, Paragraph, Caption, Label, Overline } from './Typo
5
5
  const meta: Meta<typeof Typography> = {
6
6
  title: 'Foundations/Typography',
7
7
  component: Typography,
8
- tags: ['autodocs'],
8
+ tags: ['autodocs', 'status:candidate', '!status:review'],
9
9
  argTypes: {
10
10
  variant: {
11
11
  control: 'select',
@@ -25,6 +25,8 @@ const meta: Meta<typeof Typography> = {
25
25
  'button',
26
26
  'mono',
27
27
  'monoLabel',
28
+ 'microLabel',
29
+ 'boldLabel',
28
30
  ],
29
31
  },
30
32
  color: {
@@ -111,6 +113,31 @@ export const Mono: Story = {
111
113
  ),
112
114
  }
113
115
 
116
+ /** The sans label pair, shown against the variants they sit between on the scale. */
117
+ export const Labels: Story = {
118
+ render: () => (
119
+ <View style={{ gap: 16 }}>
120
+ <Typography variant="microLabel">microLabel — SET · PREV · REPS · LBS · RPE</Typography>
121
+ <Typography variant="overline">overline — 12PX FONT-BODY MICRO LABEL</Typography>
122
+ <Typography variant="boldLabel">boldLabel — PR e1RM</Typography>
123
+ <Typography variant="caption">caption — 12px font-body, regular weight</Typography>
124
+ </View>
125
+ ),
126
+ }
127
+
128
+ /** microLabel is the only 10px step; every other label variant is 12px. */
129
+ export const MicroLabelInATableHeader: Story = {
130
+ render: () => (
131
+ <View style={{ flexDirection: 'row', gap: 24 }}>
132
+ {['SET', 'PREV', 'REPS', 'LBS', 'RPE'].map((label) => (
133
+ <Typography key={label} variant="microLabel" color="tertiary">
134
+ {label}
135
+ </Typography>
136
+ ))}
137
+ </View>
138
+ ),
139
+ }
140
+
114
141
  export const AllColors: Story = {
115
142
  render: () => (
116
143
  <View style={{ gap: 8 }}>
@@ -89,6 +89,40 @@ describe('Typography', () => {
89
89
  })
90
90
  })
91
91
 
92
+ describe('label variants', () => {
93
+ it('renders the microLabel variant', () => {
94
+ render(<Typography variant="microLabel">SET</Typography>)
95
+ expect(screen.getByText('SET')).toBeInTheDocument()
96
+ })
97
+
98
+ it('renders the boldLabel variant', () => {
99
+ render(<Typography variant="boldLabel">PR e1RM</Typography>)
100
+ expect(screen.getByText('PR e1RM')).toBeInTheDocument()
101
+ })
102
+
103
+ it('keeps both label variants out of the heading tree', () => {
104
+ render(
105
+ <>
106
+ <Typography variant="microLabel">REPS</Typography>
107
+ <Typography variant="boldLabel">PR Weight</Typography>
108
+ </>
109
+ )
110
+ expect(screen.queryByRole('heading')).not.toBeInTheDocument()
111
+ })
112
+
113
+ it('label variants have no accessibility violations', async () => {
114
+ const { container } = render(
115
+ <div>
116
+ <Typography variant="microLabel">RPE</Typography>
117
+ <Typography variant="boldLabel">PR Volume</Typography>
118
+ </div>
119
+ )
120
+
121
+ const results = await axe(container)
122
+ expect(results).toHaveNoViolations()
123
+ })
124
+ })
125
+
92
126
  describe('accessibility', () => {
93
127
  it('headings have no accessibility violations', async () => {
94
128
  const { container } = render(
@@ -18,6 +18,8 @@ export type TypographyVariant =
18
18
  | 'button'
19
19
  | 'mono'
20
20
  | 'monoLabel'
21
+ | 'microLabel'
22
+ | 'boldLabel'
21
23
 
22
24
  export type TypographyColor =
23
25
  | 'primary'
@@ -75,6 +77,10 @@ const variantStyles: Record<TypographyVariant, string> = {
75
77
  // Monospace technical readouts (clocks, ids, metrics) and their all-caps label form.
76
78
  mono: 'font-mono text-xs font-normal leading-normal',
77
79
  monoLabel: 'font-mono text-xs font-bold uppercase tracking-wide leading-normal',
80
+ // The sans (Inter) label pair: 10px for dense table/column headers, 12px bold for
81
+ // badge and row labels. `overline` is the 12px font-body form of the same idea.
82
+ microLabel: 'font-sans text-2xs font-semibold uppercase tracking-widest leading-normal',
83
+ boldLabel: 'font-sans text-xs font-bold leading-normal',
78
84
  }
79
85
 
80
86
  const colorStyles: Record<TypographyColor, string> = {
@@ -1,11 +1,4 @@
1
- export {
2
- Typography,
3
- Heading,
4
- Paragraph,
5
- Caption,
6
- Label,
7
- Overline,
8
- } from './Typography'
1
+ export { Typography, Heading, Paragraph, Caption, Label, Overline } from './Typography'
9
2
  export type {
10
3
  TypographyProps,
11
4
  TypographyVariant,
@@ -1,6 +1,7 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite'
2
2
  import { ActiveWorkoutPage, type ActiveWorkoutExercise } from './ActiveWorkoutPage'
3
3
  import type { SetRowProps } from './SetRow'
4
+ import { primitiveRamps } from '../../../theme/tokens/primitives'
4
5
 
5
6
  const velocities = (base: number): number[] =>
6
7
  Array.from({ length: 8 }, (_, i) => Number((base - i * 0.03).toFixed(2)))
@@ -95,13 +96,21 @@ const exercises: ActiveWorkoutExercise[] = [
95
96
  const meta: Meta<typeof ActiveWorkoutPage> = {
96
97
  title: 'Pages/Active Workout',
97
98
  component: ActiveWorkoutPage,
98
- parameters: { layout: 'fullscreen' },
99
+ parameters: {
100
+ layout: 'fullscreen',
101
+ docs: {
102
+ description: {
103
+ component:
104
+ 'Composes **ExerciseCard** · **InputBar** · **RestTimer** · **SupersetWrapper**.',
105
+ },
106
+ },
107
+ },
99
108
  tags: ['autodocs'],
100
109
  args: {
101
110
  title: 'Push Day A',
102
111
  subtitle: 'Hypertrophy · Week 6 of 8',
103
112
  exercises,
104
- supersets: [{ id: 'ss1', label: 'SS1', color: '#22D3EE' }],
113
+ supersets: [{ id: 'ss1', label: 'SS1', color: primitiveRamps.cyan[300] }],
105
114
  input: { reps: '8', weight: '195' },
106
115
  rest: { totalSeconds: 120, elapsedMs: 42_000, nextSetInfo: 'Set 3 · 8 × 195 lbs' },
107
116
  },
@@ -2,9 +2,13 @@ import type { Meta, StoryObj } from '@storybook/react-vite'
2
2
  import { View, Text } from 'react-native'
3
3
  import { DumbbellIcon } from './icons'
4
4
  import { BaseBadge } from './BaseBadge'
5
+ import { greyRamp } from '../../../theme/tokens/primitives'
6
+ import { getSemanticColors } from '../../../theme/tokens/semantic'
7
+
8
+ const t = getSemanticColors('dark')
5
9
 
6
10
  const meta: Meta<typeof BaseBadge> = {
7
- title: 'Components/Atoms/BaseBadge',
11
+ title: 'Custom/Workout/BaseBadge',
8
12
  component: BaseBadge,
9
13
  tags: ['autodocs'],
10
14
  argTypes: {
@@ -17,7 +21,7 @@ const meta: Meta<typeof BaseBadge> = {
17
21
  export default meta
18
22
  type Story = StoryObj<typeof BaseBadge>
19
23
 
20
- const Label = ({ children, color = '#9CA3AF' }: { children: string; color?: string }) => (
24
+ const Label = ({ children, color = greyRamp[400] }: { children: string; color?: string }) => (
21
25
  <Text
22
26
  style={{
23
27
  fontFamily: '"Space Grotesk", sans-serif',
@@ -40,14 +44,14 @@ export const Plain: Story = {
40
44
  export const Pr: Story = {
41
45
  args: {
42
46
  variant: 'pr',
43
- children: <Label color="#FF7900">PR</Label>,
47
+ children: <Label color={t['brand-primary']}>PR</Label>,
44
48
  },
45
49
  }
46
50
 
47
51
  export const WithIcon: Story = {
48
52
  args: {
49
53
  variant: 'plain',
50
- icon: <DumbbellIcon size={12} color="#9CA3AF" strokeWidth={2} />,
54
+ icon: <DumbbellIcon size={12} color={greyRamp[400]} strokeWidth={2} />,
51
55
  children: <Label>225 lbs</Label>,
52
56
  },
53
57
  }
@@ -56,17 +60,29 @@ export const AllVariants: Story = {
56
60
  render: () => (
57
61
  <View style={{ gap: 12 }}>
58
62
  <View style={{ flexDirection: 'row', gap: 12, alignItems: 'center' }}>
59
- <BaseBadge size="sm"><Label>225 lbs</Label></BaseBadge>
60
- <BaseBadge size="md"><Label>225 lbs</Label></BaseBadge>
61
- <BaseBadge size="lg"><Label>225 lbs</Label></BaseBadge>
63
+ <BaseBadge size="sm">
64
+ <Label>225 lbs</Label>
65
+ </BaseBadge>
66
+ <BaseBadge size="md">
67
+ <Label>225 lbs</Label>
68
+ </BaseBadge>
69
+ <BaseBadge size="lg">
70
+ <Label>225 lbs</Label>
71
+ </BaseBadge>
62
72
  </View>
63
73
  <View style={{ flexDirection: 'row', gap: 12, alignItems: 'center' }}>
64
- <BaseBadge variant="pr" size="sm"><Label color="#FF7900">PR</Label></BaseBadge>
65
- <BaseBadge variant="pr" size="md"><Label color="#FF7900">PR</Label></BaseBadge>
66
- <BaseBadge variant="pr" size="lg"><Label color="#FF7900">PR</Label></BaseBadge>
74
+ <BaseBadge variant="pr" size="sm">
75
+ <Label color={t['brand-primary']}>PR</Label>
76
+ </BaseBadge>
77
+ <BaseBadge variant="pr" size="md">
78
+ <Label color={t['brand-primary']}>PR</Label>
79
+ </BaseBadge>
80
+ <BaseBadge variant="pr" size="lg">
81
+ <Label color={t['brand-primary']}>PR</Label>
82
+ </BaseBadge>
67
83
  </View>
68
84
  <View style={{ flexDirection: 'row', gap: 12, alignItems: 'center' }}>
69
- <BaseBadge icon={<DumbbellIcon size={12} color="#9CA3AF" strokeWidth={2} />}>
85
+ <BaseBadge icon={<DumbbellIcon size={12} color={greyRamp[400]} strokeWidth={2} />}>
70
86
  <Label>225 lbs</Label>
71
87
  </BaseBadge>
72
88
  </View>
@@ -11,12 +11,20 @@ const T = getSemanticColors('dark')
11
11
 
12
12
  describe('BaseBadge', () => {
13
13
  it('renders children', () => {
14
- render(<BaseBadge testID="bb"><Text>Hello</Text></BaseBadge>)
14
+ render(
15
+ <BaseBadge testID="bb">
16
+ <Text>Hello</Text>
17
+ </BaseBadge>
18
+ )
15
19
  expect(screen.getByText('Hello')).toBeInTheDocument()
16
20
  })
17
21
 
18
22
  it('defaults to the plain variant border color', () => {
19
- render(<BaseBadge testID="bb"><Text>x</Text></BaseBadge>)
23
+ render(
24
+ <BaseBadge testID="bb">
25
+ <Text>x</Text>
26
+ </BaseBadge>
27
+ )
20
28
  expect(screen.getByTestId('bb')).toHaveStyle({ borderTopColor: T['hairline-default'] })
21
29
  })
22
30
 
@@ -24,7 +32,7 @@ describe('BaseBadge', () => {
24
32
  render(
25
33
  <BaseBadge variant="pr" testID="bb">
26
34
  <Text>x</Text>
27
- </BaseBadge>,
35
+ </BaseBadge>
28
36
  )
29
37
  expect(screen.getByTestId('bb')).toHaveStyle({
30
38
  borderTopColor: 'rgba(255, 121, 0, 0.3)',
@@ -36,14 +44,18 @@ describe('BaseBadge', () => {
36
44
  render(
37
45
  <BaseBadge icon={<View testID="my-icon" />}>
38
46
  <Text>x</Text>
39
- </BaseBadge>,
47
+ </BaseBadge>
40
48
  )
41
49
  expect(screen.getByTestId('base-badge-icon')).toBeInTheDocument()
42
50
  expect(screen.getByTestId('my-icon')).toBeInTheDocument()
43
51
  })
44
52
 
45
53
  it('does not render an icon wrapper when no icon is provided', () => {
46
- render(<BaseBadge><Text>x</Text></BaseBadge>)
54
+ render(
55
+ <BaseBadge>
56
+ <Text>x</Text>
57
+ </BaseBadge>
58
+ )
47
59
  expect(screen.queryByTestId('base-badge-icon')).not.toBeInTheDocument()
48
60
  })
49
61
  })
@@ -54,7 +66,7 @@ describe('BaseBadge', () => {
54
66
  render(
55
67
  <BaseBadge onPress={onPress} accessibilityLabel="Press me">
56
68
  <Text>x</Text>
57
- </BaseBadge>,
69
+ </BaseBadge>
58
70
  )
59
71
  const pressable = screen.getByTestId('base-badge-pressable')
60
72
  fireEvent.click(pressable)
@@ -62,7 +74,11 @@ describe('BaseBadge', () => {
62
74
  })
63
75
 
64
76
  it('does not render a Pressable when onPress is omitted', () => {
65
- render(<BaseBadge><Text>x</Text></BaseBadge>)
77
+ render(
78
+ <BaseBadge>
79
+ <Text>x</Text>
80
+ </BaseBadge>
81
+ )
66
82
  expect(screen.queryByTestId('base-badge-pressable')).not.toBeInTheDocument()
67
83
  })
68
84
 
@@ -70,7 +86,7 @@ describe('BaseBadge', () => {
70
86
  render(
71
87
  <BaseBadge onPress={() => {}} accessibilityLabel="Press me">
72
88
  <Text>x</Text>
73
- </BaseBadge>,
89
+ </BaseBadge>
74
90
  )
75
91
  expect(screen.getByRole('button')).toBeInTheDocument()
76
92
  })
@@ -78,7 +94,11 @@ describe('BaseBadge', () => {
78
94
 
79
95
  describe('size', () => {
80
96
  it.each(['sm', 'md', 'lg'] as const)('renders %s size', (size) => {
81
- render(<BaseBadge size={size} testID="bb"><Text>x</Text></BaseBadge>)
97
+ render(
98
+ <BaseBadge size={size} testID="bb">
99
+ <Text>x</Text>
100
+ </BaseBadge>
101
+ )
82
102
  expect(screen.getByTestId('bb')).toBeInTheDocument()
83
103
  })
84
104
  })
@@ -88,7 +108,7 @@ describe('BaseBadge', () => {
88
108
  const { container } = render(
89
109
  <BaseBadge accessibilityLabel="Static badge">
90
110
  <Text>x</Text>
91
- </BaseBadge>,
111
+ </BaseBadge>
92
112
  )
93
113
  const results = await axe(container)
94
114
  expect(results).toHaveNoViolations()
@@ -98,7 +118,7 @@ describe('BaseBadge', () => {
98
118
  const { container } = render(
99
119
  <BaseBadge onPress={() => {}} accessibilityLabel="Pressable badge">
100
120
  <Text>x</Text>
101
- </BaseBadge>,
121
+ </BaseBadge>
102
122
  )
103
123
  const results = await axe(container)
104
124
  expect(results).toHaveNoViolations()
@@ -2,6 +2,7 @@
2
2
  import { useState, type ReactNode } from 'react'
3
3
  import { View, Pressable, Animated, type ViewProps } from 'react-native'
4
4
  import { getSemanticColors } from '../../../theme/tokens/semantic'
5
+ import { alpha } from '../../../utils/colors'
5
6
 
6
7
  const t = getSemanticColors('dark')
7
8
 
@@ -32,11 +33,14 @@ export const baseBadgeSizeConfig: Record<
32
33
  const variantColors: Record<BaseBadgeVariant, { backgroundColor: string; borderColor: string }> = {
33
34
  plain: { backgroundColor: t['surface-raised'], borderColor: t['hairline-default'] },
34
35
  pr: {
35
- backgroundColor: 'rgba(255, 121, 0, 0.12)',
36
- borderColor: 'rgba(255, 121, 0, 0.3)',
36
+ backgroundColor: alpha(t['brand-primary'], 0.12),
37
+ borderColor: alpha(t['brand-primary'], 0.3),
37
38
  },
38
39
  }
39
40
 
41
+ /**
42
+ * @deprecated Use `<Pill tone="…" variant="…">` — removed after AW-127 consumer migration.
43
+ */
40
44
  export function BaseBadge({
41
45
  variant = 'plain',
42
46
  size = 'md',
@@ -51,8 +51,11 @@ const backData: BodyMapData[] = [
51
51
  ]
52
52
 
53
53
  const meta: Meta<typeof BodyMap> = {
54
- title: 'Workout/DataViz/BodyMap',
54
+ title: 'Custom/Workout/DataViz/BodyMap',
55
55
  component: BodyMap,
56
+ parameters: {
57
+ docs: { description: { component: 'Composes **MuscleGroup** · **SimpleMuscleGroup**.' } },
58
+ },
56
59
  tags: ['autodocs'],
57
60
  argTypes: {
58
61
  view: { control: 'inline-radio', options: ['front', 'back'] },
@@ -5,6 +5,9 @@ import BodyHighlighter, { type ExtendedBodyPart, type Slug } from 'react-native-
5
5
  import { cn } from '../../../utils/cn'
6
6
  import { resolveColor } from '../../../theme/resolve-color'
7
7
  import { getSemanticColors } from '../../../theme/tokens/semantic'
8
+ import { primitiveColors } from '../../../theme/tokens/primitives'
9
+ import { alpha } from '../../../utils/colors'
10
+ import { getGlowShadow } from '../../../theme/elevation'
8
11
  import {
9
12
  MuscleGroup,
10
13
  SimpleMuscleGroup,
@@ -28,8 +31,8 @@ const Body = ((BodyHighlighter as unknown as { default?: typeof BodyHighlighter
28
31
 
29
32
  const BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']
30
33
 
31
- const OUTLINE_FILL = 'rgba(255,255,255,0.08)'
32
- const OUTLINE_BORDER = 'rgba(255,255,255,0.12)'
34
+ const OUTLINE_FILL = alpha(primitiveColors.white, 0.08)
35
+ const OUTLINE_BORDER = alpha(primitiveColors.white, 0.12)
33
36
  const BODY_SCALE = 0.8 // 200x400 intrinsic -> ~160x320 px
34
37
 
35
38
  export interface BodyMapData {
@@ -197,7 +200,8 @@ export function BodyMap({
197
200
  alignSelf: 'center',
198
201
  transform: [{ scale }],
199
202
  },
200
- glowColor ? { boxShadow: `0 0 14px 2px ${glowColor}` } : undefined,
203
+ // The highlight halo is emphasis, not depth.
204
+ glowColor ? getGlowShadow(glowColor, 'medium') : undefined,
201
205
  ]}
202
206
  // The SVG is decorative; the accessible muscle legend below is the
203
207
  // screen-reader / keyboard interface.
@@ -276,7 +280,7 @@ function ViewToggle({ view, onViewChange }: ViewToggleProps) {
276
280
  paddingHorizontal: 12,
277
281
  paddingVertical: 4,
278
282
  borderRadius: 9999,
279
- backgroundColor: active ? 'rgba(255,121,0,0.16)' : 'transparent',
283
+ backgroundColor: active ? alpha(BRAND_PRIMARY, 0.16) : 'transparent',
280
284
  borderWidth: 1,
281
285
  borderColor: active ? BRAND_PRIMARY : resolveColor('hairline-strong'),
282
286
  }}
@@ -7,6 +7,11 @@ import {
7
7
  type UpcomingExercise,
8
8
  } from './BodyMapDetailPanel'
9
9
  import { MuscleGroup } from './muscleTaxonomy'
10
+ import { Surface } from '../../ui/surface'
11
+ import { primitiveColors } from '../../../theme/tokens/primitives'
12
+ import { getSemanticColors } from '../../../theme/tokens/semantic'
13
+
14
+ const t = getSemanticColors('dark')
10
15
 
11
16
  const contributing: ContributingExercise[] = [
12
17
  { name: 'Barbell Bench Press', sets: 4, contributionWeight: 1 },
@@ -21,14 +26,17 @@ const upcoming: UpcomingExercise[] = [
21
26
  ]
22
27
 
23
28
  const meta: Meta<typeof BodyMapDetailPanel> = {
24
- title: 'Workout/DataViz/BodyMapDetailPanel',
29
+ title: 'Custom/Workout/DataViz/BodyMapDetailPanel',
25
30
  component: BodyMapDetailPanel,
31
+ parameters: {
32
+ docs: { description: { component: 'Composes **Badge** · **Sparkline** · **MuscleGroup**.' } },
33
+ },
26
34
  tags: ['autodocs'],
27
35
  decorators: [
28
36
  (Story) => (
29
- <View style={{ position: 'relative', height: 640, width: 380, backgroundColor: '#0E0E0E' }}>
37
+ <Surface level="base" style={{ position: 'relative', height: 640, width: 380 }}>
30
38
  <Story />
31
- </View>
39
+ </Surface>
32
40
  ),
33
41
  ],
34
42
  argTypes: {
@@ -132,19 +140,33 @@ export const WithoutUpcoming: Story = {
132
140
  function InteractiveBodyMapDetailPanel() {
133
141
  const [open, setOpen] = useState(false)
134
142
  return (
135
- <View style={{ position: 'relative', height: 640, width: 380, backgroundColor: '#0E0E0E', padding: 16 }}>
143
+ <View
144
+ style={{
145
+ position: 'relative',
146
+ height: 640,
147
+ width: 380,
148
+ backgroundColor: t['background-frame'],
149
+ padding: 16,
150
+ }}
151
+ >
136
152
  <Pressable
137
153
  onPress={() => setOpen(true)}
138
154
  accessibilityRole="button"
139
155
  style={{
140
156
  alignSelf: 'flex-start',
141
- backgroundColor: '#FF7900',
157
+ backgroundColor: t['brand-primary'],
142
158
  paddingVertical: 10,
143
159
  paddingHorizontal: 20,
144
160
  borderRadius: 8,
145
161
  }}
146
162
  >
147
- <Text style={{ color: '#FFFFFF', fontWeight: '700', fontFamily: 'Inter, sans-serif' }}>
163
+ <Text
164
+ style={{
165
+ color: primitiveColors.white,
166
+ fontWeight: '700',
167
+ fontFamily: 'Inter, sans-serif',
168
+ }}
169
+ >
148
170
  Tap Chest
149
171
  </Text>
150
172
  </Pressable>