@titan-design/react-ui 0.12.1 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (509) hide show
  1. package/README.md +46 -47
  2. package/dist/bodymap.js +768 -701
  3. package/dist/bodymap.js.map +1 -1
  4. package/dist/bodymap.mjs +770 -703
  5. package/dist/bodymap.mjs.map +1 -1
  6. package/dist/index.d.mts +1319 -216
  7. package/dist/index.d.ts +1319 -216
  8. package/dist/index.js +5996 -4498
  9. package/dist/index.js.map +1 -1
  10. package/dist/index.mjs +5773 -4357
  11. package/dist/index.mjs.map +1 -1
  12. package/dist/{pages-CvsFqNtx.d.mts → pages-CpW3OB3g.d.mts} +21 -3
  13. package/dist/{pages-B1hqnGIC.d.ts → pages-_3Ajpiqu.d.ts} +21 -3
  14. package/dist/pages.d.mts +1 -1
  15. package/dist/pages.d.ts +1 -1
  16. package/dist/pages.js +1435 -1428
  17. package/dist/pages.js.map +1 -1
  18. package/dist/pages.mjs +1443 -1436
  19. package/dist/pages.mjs.map +1 -1
  20. package/dist/theme/index.d.mts +195 -134
  21. package/dist/theme/index.d.ts +195 -134
  22. package/dist/theme/index.js +215 -300
  23. package/dist/theme/index.js.map +1 -1
  24. package/dist/theme/index.mjs +202 -296
  25. package/dist/theme/index.mjs.map +1 -1
  26. package/dist/theme/tokens-css.js +62 -5
  27. package/dist/theme/tokens-css.js.map +1 -1
  28. package/dist/theme/tokens-css.mjs +62 -5
  29. package/dist/theme/tokens-css.mjs.map +1 -1
  30. package/dist/theme/tokens.d.mts +73 -5
  31. package/dist/theme/tokens.d.ts +73 -5
  32. package/dist/theme/tokens.js +55 -7
  33. package/dist/theme/tokens.js.map +1 -1
  34. package/dist/theme/tokens.mjs +55 -8
  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/package.json +1 -1
  40. package/src/arch/arch-graph.freshness.test.ts +52 -0
  41. package/src/arch/arch-graph.json +5021 -1617
  42. package/src/components/custom/ActiveWork/CoChangeChip.stories.tsx +44 -0
  43. package/src/components/custom/ActiveWork/CoChangeChip.test.tsx +29 -0
  44. package/src/components/custom/ActiveWork/CoChangeChip.tsx +48 -0
  45. package/src/components/custom/ActiveWork/Eyebrow.stories.tsx +25 -0
  46. package/src/components/custom/ActiveWork/Eyebrow.test.tsx +16 -0
  47. package/src/components/custom/ActiveWork/Eyebrow.tsx +26 -0
  48. package/src/components/custom/ActiveWork/FileActivityDetail.stories.tsx +50 -0
  49. package/src/components/custom/ActiveWork/FileActivityDetail.test.tsx +66 -0
  50. package/src/components/custom/ActiveWork/FileActivityDetail.tsx +202 -0
  51. package/src/components/custom/ActiveWork/FileActivityRow.stories.tsx +70 -0
  52. package/src/components/custom/ActiveWork/FileActivityRow.test.tsx +67 -0
  53. package/src/components/custom/ActiveWork/FileActivityRow.tsx +130 -0
  54. package/src/components/custom/ActiveWork/FileHistoryExplorer.stories.tsx +84 -0
  55. package/src/components/custom/ActiveWork/FileHistoryExplorer.test.tsx +99 -0
  56. package/src/components/custom/ActiveWork/FileHistoryExplorer.tsx +138 -0
  57. package/src/components/custom/ActiveWork/FilePathLabel.stories.tsx +39 -0
  58. package/src/components/custom/ActiveWork/FilePathLabel.test.tsx +53 -0
  59. package/src/components/custom/ActiveWork/FilePathLabel.tsx +63 -0
  60. package/src/components/custom/ActiveWork/InitiativeBrief.stories.tsx +50 -0
  61. package/src/components/custom/ActiveWork/InitiativeBrief.test.tsx +62 -0
  62. package/src/components/custom/ActiveWork/InitiativeBrief.tsx +181 -0
  63. package/src/components/custom/ActiveWork/InitiativeCard.stories.tsx +73 -0
  64. package/src/components/custom/ActiveWork/InitiativeCard.test.tsx +68 -0
  65. package/src/components/custom/ActiveWork/InitiativeCard.tsx +136 -0
  66. package/src/components/custom/ActiveWork/InitiativeHeader.stories.tsx +59 -0
  67. package/src/components/custom/ActiveWork/InitiativeHeader.test.tsx +40 -0
  68. package/src/components/custom/ActiveWork/InitiativeHeader.tsx +73 -0
  69. package/src/components/custom/ActiveWork/InitiativeReader.stories.tsx +145 -0
  70. package/src/components/custom/ActiveWork/OpenLoops.stories.tsx +58 -0
  71. package/src/components/custom/ActiveWork/OpenLoops.test.tsx +61 -0
  72. package/src/components/custom/ActiveWork/OpenLoops.tsx +107 -0
  73. package/src/components/custom/ActiveWork/PortfolioOverview.stories.tsx +101 -0
  74. package/src/components/custom/ActiveWork/PortfolioOverview.test.tsx +81 -0
  75. package/src/components/custom/ActiveWork/PortfolioOverview.tsx +83 -0
  76. package/src/components/custom/ActiveWork/README.md +305 -0
  77. package/src/components/custom/ActiveWork/SessionDetail.stories.tsx +71 -0
  78. package/src/components/custom/ActiveWork/SessionDetail.test.tsx +84 -0
  79. package/src/components/custom/ActiveWork/SessionDetail.tsx +180 -0
  80. package/src/components/custom/ActiveWork/SessionList.stories.tsx +69 -0
  81. package/src/components/custom/ActiveWork/SessionList.test.tsx +78 -0
  82. package/src/components/custom/ActiveWork/SessionList.tsx +103 -0
  83. package/src/components/custom/ActiveWork/SessionListItem.stories.tsx +64 -0
  84. package/src/components/custom/ActiveWork/SessionListItem.test.tsx +62 -0
  85. package/src/components/custom/ActiveWork/SessionListItem.tsx +152 -0
  86. package/src/components/custom/ActiveWork/SessionReader.stories.tsx +113 -0
  87. package/src/components/custom/ActiveWork/SeverityLabel.stories.tsx +51 -0
  88. package/src/components/custom/ActiveWork/SeverityLabel.test.tsx +68 -0
  89. package/src/components/custom/ActiveWork/SeverityLabel.tsx +97 -0
  90. package/src/components/custom/ActiveWork/TaskRow.stories.tsx +63 -0
  91. package/src/components/custom/ActiveWork/TaskRow.test.tsx +112 -0
  92. package/src/components/custom/ActiveWork/TaskRow.tsx +176 -0
  93. package/src/components/custom/ActiveWork/TaskTable.stories.tsx +123 -0
  94. package/src/components/custom/ActiveWork/TaskTable.test.tsx +233 -0
  95. package/src/components/custom/ActiveWork/TaskTable.tsx +321 -0
  96. package/src/components/custom/ActiveWork/active-work-depth.test.tsx +102 -0
  97. package/src/components/custom/ActiveWork/file-history-fixture.ts +91 -0
  98. package/src/components/custom/ActiveWork/format-time.test.ts +23 -0
  99. package/src/components/custom/ActiveWork/format-time.ts +32 -0
  100. package/src/components/custom/ActiveWork/index.ts +19 -0
  101. package/src/components/custom/ActiveWork/initiative-fixture.ts +104 -0
  102. package/src/components/custom/ActiveWork/session-fixture.ts +267 -0
  103. package/src/components/custom/ActiveWork/session-linkers.ts +56 -0
  104. package/src/components/custom/ActiveWork/task-list-fixture.ts +97 -0
  105. package/src/components/custom/CircularTimer/CircularTimer.stories.tsx +4 -3
  106. package/src/components/custom/DateTime/DateTime.stories.tsx +2 -1
  107. package/src/components/custom/DateTime/DateTime.test.tsx +3 -1
  108. package/src/components/custom/EmptyState/EmptyState.stories.tsx +22 -9
  109. package/src/components/custom/EmptyState/EmptyState.test.tsx +7 -13
  110. package/src/components/custom/EmptyState/EmptyState.tsx +4 -18
  111. package/src/components/custom/Fatigue/DualGhostSpark.stories.tsx +4 -3
  112. package/src/components/custom/Fatigue/FatigueLights.stories.tsx +2 -2
  113. package/src/components/custom/Fatigue/GhostSpark.stories.tsx +4 -3
  114. package/src/components/custom/Fatigue/LiveFatigueCard.stories.tsx +2 -2
  115. package/src/components/custom/Fatigue/LiveFatigueCard.tsx +8 -4
  116. package/src/components/custom/Fatigue/LiveFatiguePanel.stories.tsx +116 -6
  117. package/src/components/custom/Fatigue/LiveFatiguePanel.test.tsx +134 -0
  118. package/src/components/custom/Fatigue/LiveFatiguePanel.tsx +54 -83
  119. package/src/components/custom/Fatigue/README.md +40 -3
  120. package/src/components/custom/Fatigue/RomProgressionChart.stories.tsx +2 -2
  121. package/src/components/custom/Fatigue/SilverRedPalette.stories.tsx +2 -1
  122. package/src/components/custom/Fatigue/VelocityHero.stories.tsx +4 -3
  123. package/src/components/custom/Fatigue/VerdictHero.stories.tsx +2 -2
  124. package/src/components/custom/Fatigue/fatigue-mock.test.ts +0 -5
  125. package/src/components/custom/Fatigue/fatigue-mock.ts +2 -10
  126. package/src/components/custom/Fatigue/fatigue-tokens.ts +12 -0
  127. package/src/components/custom/Fatigue/index.ts +17 -5
  128. package/src/components/custom/Fatigue/panel-layout.test.ts +149 -0
  129. package/src/components/custom/Fatigue/panel-layout.ts +185 -0
  130. package/src/components/custom/Gauge/Gauge.stories.tsx +2 -2
  131. package/src/components/custom/Gauge/Gauge.test.tsx +1 -1
  132. package/src/components/custom/Gauge/Gauge.tsx +4 -1
  133. package/src/components/custom/Metric/Metric.stories.tsx +10 -1
  134. package/src/components/custom/Metric/Metric.test.tsx +1 -3
  135. package/src/components/custom/Metric/Metric.tsx +5 -20
  136. package/src/components/custom/Prose/MarkdownProse.stories.tsx +88 -0
  137. package/src/components/custom/Prose/MarkdownProse.test.tsx +87 -0
  138. package/src/components/custom/Prose/MarkdownProse.tsx +201 -0
  139. package/src/components/custom/Prose/README.md +58 -0
  140. package/src/components/custom/Prose/index.ts +1 -0
  141. package/src/components/custom/Scatter/Scatter.stories.tsx +46 -8
  142. package/src/components/custom/Scatter/Scatter.test.tsx +2 -2
  143. package/src/components/custom/Scatter/Scatter.tsx +116 -14
  144. package/src/components/custom/Sidebar/Sidebar.stories.tsx +40 -7
  145. package/src/components/custom/Sidebar/Sidebar.test.tsx +5 -1
  146. package/src/components/custom/Sidebar/Sidebar.tsx +16 -33
  147. package/src/components/custom/Table/Table.stories.tsx +98 -15
  148. package/src/components/custom/Table/Table.test.tsx +273 -86
  149. package/src/components/custom/Table/Table.tsx +159 -67
  150. package/src/components/custom/Table/column-fit.test.ts +75 -0
  151. package/src/components/custom/Table/column-fit.ts +116 -0
  152. package/src/components/custom/Table/index.ts +9 -0
  153. package/src/components/custom/TimerReadout/TimerReadout.stories.tsx +8 -6
  154. package/src/components/custom/Treemap/Treemap.stories.tsx +2 -2
  155. package/src/components/custom/Treemap/Treemap.test.tsx +1 -1
  156. package/src/components/custom/Treemap/Treemap.tsx +7 -2
  157. package/src/components/custom/Typography/Typography.stories.tsx +28 -1
  158. package/src/components/custom/Typography/Typography.test.tsx +34 -0
  159. package/src/components/custom/Typography/Typography.tsx +6 -0
  160. package/src/components/custom/Typography/index.ts +1 -8
  161. package/src/components/custom/Workout/ActiveWorkoutPage.stories.tsx +9 -1
  162. package/src/components/custom/Workout/BaseBadge.stories.tsx +19 -7
  163. package/src/components/custom/Workout/BaseBadge.test.tsx +31 -11
  164. package/src/components/custom/Workout/BaseBadge.tsx +3 -0
  165. package/src/components/custom/Workout/BodyMap.stories.tsx +4 -1
  166. package/src/components/custom/Workout/BodyMap.tsx +3 -1
  167. package/src/components/custom/Workout/BodyMapDetailPanel.stories.tsx +16 -4
  168. package/src/components/custom/Workout/BodyMapDetailPanel.test.tsx +11 -15
  169. package/src/components/custom/Workout/BodyMapDetailPanel.tsx +45 -9
  170. package/src/components/custom/Workout/CapacityBandChart.stories.tsx +10 -8
  171. package/src/components/custom/Workout/CapacityBandChart.test.tsx +24 -51
  172. package/src/components/custom/Workout/CapacityBandChart.tsx +139 -108
  173. package/src/components/custom/Workout/DeviationBar.stories.tsx +1 -1
  174. package/src/components/custom/Workout/DeviationBar.test.tsx +5 -2
  175. package/src/components/custom/Workout/DeviationBar.tsx +21 -16
  176. package/src/components/custom/Workout/DualVelocityStrip.stories.tsx +182 -0
  177. package/src/components/custom/Workout/DualVelocityStrip.test.tsx +3 -2
  178. package/src/components/custom/Workout/ExerciseCard.stories.tsx +8 -7
  179. package/src/components/custom/Workout/ExerciseCard.test.tsx +13 -3
  180. package/src/components/custom/Workout/ExerciseCard.tsx +42 -51
  181. package/src/components/custom/Workout/ExerciseCardHeading.stories.tsx +7 -7
  182. package/src/components/custom/Workout/ExerciseDetailPage.stories.tsx +9 -1
  183. package/src/components/custom/Workout/ExerciseHeading.stories.tsx +8 -8
  184. package/src/components/custom/Workout/ExerciseHeading.tsx +8 -5
  185. package/src/components/custom/Workout/ExerciseIndicator.stories.tsx +6 -4
  186. package/src/components/custom/Workout/ExerciseIndicator.test.tsx +27 -11
  187. package/src/components/custom/Workout/ExerciseIndicator.tsx +14 -15
  188. package/src/components/custom/Workout/FatigueMeter.stories.tsx +5 -5
  189. package/src/components/custom/Workout/InputBar.stories.tsx +4 -5
  190. package/src/components/custom/Workout/IntensityBar.stories.tsx +1 -1
  191. package/src/components/custom/Workout/IntensityBar.test.tsx +5 -1
  192. package/src/components/custom/Workout/IntensityBar.tsx +4 -2
  193. package/src/components/custom/Workout/LiveAuraFrame.stories.tsx +5 -4
  194. package/src/components/custom/Workout/MesoCard.stories.tsx +4 -1
  195. package/src/components/custom/Workout/MesoCard.test.tsx +7 -18
  196. package/src/components/custom/Workout/MesoCard.tsx +12 -9
  197. package/src/components/custom/Workout/MesoProgressBar.stories.tsx +1 -1
  198. package/src/components/custom/Workout/MesoProgressBar.test.tsx +18 -11
  199. package/src/components/custom/Workout/MesoProgressBar.tsx +15 -13
  200. package/src/components/custom/Workout/MesoStatusCard.stories.tsx +2 -1
  201. package/src/components/custom/Workout/MesoStatusCard.test.tsx +14 -44
  202. package/src/components/custom/Workout/MesoStatusCard.tsx +9 -23
  203. package/src/components/custom/Workout/MetricTiles.stories.tsx +3 -2
  204. package/src/components/custom/Workout/MuscleGroupChip.stories.tsx +2 -8
  205. package/src/components/custom/Workout/MuscleGroupChip.test.tsx +23 -31
  206. package/src/components/custom/Workout/MuscleGroupChip.tsx +28 -67
  207. package/src/components/custom/Workout/PlaceholderStrip.stories.tsx +1 -1
  208. package/src/components/custom/Workout/PlaceholderStrip.test.tsx +17 -10
  209. package/src/components/custom/Workout/PlaceholderStrip.tsx +9 -8
  210. package/src/components/custom/Workout/PrBadge.stories.tsx +2 -1
  211. package/src/components/custom/Workout/PrBadge.test.tsx +3 -9
  212. package/src/components/custom/Workout/PrBadge.tsx +13 -17
  213. package/src/components/custom/Workout/PrHistoryModal.stories.tsx +4 -1
  214. package/src/components/custom/Workout/PrHistoryModal.test.tsx +13 -36
  215. package/src/components/custom/Workout/PrHistoryModal.tsx +8 -4
  216. package/src/components/custom/Workout/ProgramPlanningPage.stories.tsx +6 -1
  217. package/src/components/custom/Workout/README.md +11 -6
  218. package/src/components/custom/Workout/ReadinessCheck.stories.tsx +3 -2
  219. package/src/components/custom/Workout/ReadinessCheck.test.tsx +12 -18
  220. package/src/components/custom/Workout/ReadinessCheck.tsx +19 -3
  221. package/src/components/custom/Workout/RestTimer.stories.tsx +3 -2
  222. package/src/components/custom/Workout/ScheduleTiles.stories.tsx +3 -2
  223. package/src/components/custom/Workout/ScheduleTiles.test.tsx +3 -4
  224. package/src/components/custom/Workout/ScheduleTiles.tsx +4 -7
  225. package/src/components/custom/Workout/SegmentedBar.stories.tsx +5 -5
  226. package/src/components/custom/Workout/SegmentedBar.tsx +6 -2
  227. package/src/components/custom/Workout/SegmentedProgressBar.stories.tsx +5 -5
  228. package/src/components/custom/Workout/SessionHeader.stories.tsx +6 -6
  229. package/src/components/custom/Workout/SessionHeader.tsx +12 -12
  230. package/src/components/custom/Workout/SessionRail.stories.tsx +12 -11
  231. package/src/components/custom/Workout/SessionRail.tsx +7 -9
  232. package/src/components/custom/Workout/SetBar.stories.tsx +10 -6
  233. package/src/components/custom/Workout/SetBar.test.tsx +49 -4
  234. package/src/components/custom/Workout/SetBar.tsx +38 -12
  235. package/src/components/custom/Workout/SetRow.stories.tsx +3 -2
  236. package/src/components/custom/Workout/SetRow.test.tsx +16 -2
  237. package/src/components/custom/Workout/SetRow.tsx +61 -23
  238. package/src/components/custom/Workout/SetStrip.stories.tsx +60 -5
  239. package/src/components/custom/Workout/SetStrip.test.tsx +25 -0
  240. package/src/components/custom/Workout/SetStrip.tsx +24 -4
  241. package/src/components/custom/Workout/SetTableHeader.stories.tsx +6 -6
  242. package/src/components/custom/Workout/SetTableHeader.tsx +9 -12
  243. package/src/components/custom/Workout/SetsRepsLoad.stories.tsx +7 -7
  244. package/src/components/custom/Workout/SetsRepsLoad.tsx +3 -5
  245. package/src/components/custom/Workout/Sparkline.stories.tsx +1 -1
  246. package/src/components/custom/Workout/Sparkline.test.tsx +37 -19
  247. package/src/components/custom/Workout/Sparkline.tsx +14 -18
  248. package/src/components/custom/Workout/StatusDot.stories.tsx +1 -1
  249. package/src/components/custom/Workout/StatusDot.test.tsx +44 -5
  250. package/src/components/custom/Workout/StatusDot.tsx +93 -63
  251. package/src/components/custom/Workout/StatusPill.stories.tsx +1 -1
  252. package/src/components/custom/Workout/StatusPill.test.tsx +6 -15
  253. package/src/components/custom/Workout/StatusPill.tsx +27 -38
  254. package/src/components/custom/Workout/StrengthTrendChart.stories.tsx +9 -3
  255. package/src/components/custom/Workout/StrengthTrendChart.test.tsx +15 -37
  256. package/src/components/custom/Workout/StrengthTrendChart.tsx +31 -30
  257. package/src/components/custom/Workout/SupersetWrapper.stories.tsx +27 -64
  258. package/src/components/custom/Workout/SupersetWrapper.test.tsx +16 -14
  259. package/src/components/custom/Workout/SupersetWrapper.tsx +17 -21
  260. package/src/components/custom/Workout/TempoDisplay.stories.tsx +22 -7
  261. package/src/components/custom/Workout/TempoDisplay.test.tsx +18 -4
  262. package/src/components/custom/Workout/TrainingStatusPage.stories.tsx +9 -1
  263. package/src/components/custom/Workout/VelocityStrip.compact.stories.tsx +4 -1
  264. package/src/components/custom/Workout/VelocityStrip.dual.stories.tsx +7 -4
  265. package/src/components/custom/Workout/VelocityStrip.expanded.stories.tsx +4 -1
  266. package/src/components/custom/Workout/VelocityStrip.hero.stories.tsx +4 -1
  267. package/src/components/custom/Workout/VelocityStrip.stories.tsx +12 -6
  268. package/src/components/custom/Workout/VelocityStrip.tsx +3 -0
  269. package/src/components/custom/Workout/VolumeLandmarkBar.stories.tsx +6 -7
  270. package/src/components/custom/Workout/VolumeLandmarkBar.tsx +15 -6
  271. package/src/components/custom/Workout/WeekRow.stories.tsx +4 -1
  272. package/src/components/custom/Workout/WeekRow.test.tsx +18 -15
  273. package/src/components/custom/Workout/WeekRow.tsx +23 -16
  274. package/src/components/custom/Workout/WeightBadge.stories.tsx +2 -1
  275. package/src/components/custom/Workout/WeightBadge.test.tsx +50 -19
  276. package/src/components/custom/Workout/WeightBadge.tsx +28 -27
  277. package/src/components/custom/Workout/WorkoutCard.stories.tsx +6 -1
  278. package/src/components/custom/Workout/WorkoutCard.test.tsx +18 -0
  279. package/src/components/custom/Workout/WorkoutCard.tsx +35 -57
  280. package/src/components/custom/Workout/WorkoutPill.stories.tsx +5 -2
  281. package/src/components/custom/Workout/WorkoutPill.test.tsx +39 -7
  282. package/src/components/custom/Workout/WorkoutPill.tsx +88 -57
  283. package/src/components/custom/Workout/ZoneTrack.stories.tsx +7 -6
  284. package/src/components/custom/Workout/ZoneTrack.tsx +10 -9
  285. package/src/components/custom/Workout/index.ts +5 -0
  286. package/src/components/custom/Workout/metricText.stories.tsx +6 -5
  287. package/src/components/custom/Workout/metricText.tsx +4 -0
  288. package/src/components/custom/Workout/setHeadingKit.tsx +207 -26
  289. package/src/components/custom/charts/README.md +61 -0
  290. package/src/components/custom/charts/SetBarChart.test.tsx +30 -1
  291. package/src/components/custom/charts/SetBarChart.tsx +42 -4
  292. package/src/components/custom/charts/SparkBars.stories.tsx +55 -0
  293. package/src/components/custom/charts/SparkBars.test.tsx +69 -0
  294. package/src/components/custom/charts/SparkBars.tsx +85 -0
  295. package/src/components/custom/charts/index.ts +3 -0
  296. package/src/components/custom/index.ts +3 -0
  297. package/src/components/custom/stepper/Stepper.stories.tsx +13 -10
  298. package/src/components/custom/stepper/Stepper.test.tsx +1 -7
  299. package/src/components/custom/stepper/Stepper.tsx +13 -28
  300. package/src/components/icons/icons.stories.tsx +1 -1
  301. package/src/components/icons/icons.tsx +51 -0
  302. package/src/components/shell/AppShell.stories.tsx +150 -0
  303. package/src/components/shell/AppShell.test.tsx +70 -0
  304. package/src/components/shell/AppShell.tsx +90 -0
  305. package/src/components/shell/BrandLockup.stories.tsx +66 -5
  306. package/src/components/shell/BrandLockup.test.tsx +34 -1
  307. package/src/components/shell/BrandLockup.tsx +27 -11
  308. package/src/components/shell/NavItem.stories.tsx +4 -4
  309. package/src/components/shell/NavItem.test.tsx +17 -0
  310. package/src/components/shell/NavItem.tsx +17 -5
  311. package/src/components/shell/README.md +89 -26
  312. package/src/components/shell/SideNav.stories.tsx +38 -7
  313. package/src/components/shell/SideNav.test.tsx +16 -8
  314. package/src/components/shell/SideNav.tsx +17 -17
  315. package/src/components/shell/TopBar.stories.tsx +44 -19
  316. package/src/components/shell/TopBar.test.tsx +34 -12
  317. package/src/components/shell/TopBar.tsx +61 -40
  318. package/src/components/shell/brands.tsx +66 -0
  319. package/src/components/shell/index.ts +9 -8
  320. package/src/components/shell/{DeviceIndicator.stories.tsx → workout/DeviceIndicator.stories.tsx} +2 -2
  321. package/src/components/shell/{DeviceIndicator.tsx → workout/DeviceIndicator.tsx} +2 -2
  322. package/src/components/shell/{DeviceMenu.stories.tsx → workout/DeviceMenu.stories.tsx} +2 -2
  323. package/src/components/shell/{DeviceMenu.tsx → workout/DeviceMenu.tsx} +3 -3
  324. package/src/components/shell/{DeviceRow.stories.tsx → workout/DeviceRow.stories.tsx} +2 -2
  325. package/src/components/shell/{DeviceRow.tsx → workout/DeviceRow.tsx} +3 -3
  326. package/src/components/shell/{SessionStatePill.stories.tsx → workout/SessionStatePill.stories.tsx} +2 -2
  327. package/src/components/shell/{SessionStatePill.tsx → workout/SessionStatePill.tsx} +5 -3
  328. package/src/components/shell/workout/WorkoutShell.stories.tsx +71 -0
  329. package/src/components/shell/{DashboardShell.test.tsx → workout/WorkoutShell.test.tsx} +19 -8
  330. package/src/components/shell/workout/WorkoutShell.tsx +77 -0
  331. package/src/components/shell/workout/WorkoutTopBar.stories.tsx +58 -0
  332. package/src/components/shell/workout/WorkoutTopBar.test.tsx +39 -0
  333. package/src/components/shell/workout/WorkoutTopBar.tsx +52 -0
  334. package/src/components/shell/workout/index.ts +9 -0
  335. package/src/components/shell/workout/workoutNavItems.tsx +16 -0
  336. package/src/components/ui/README.md +110 -0
  337. package/src/components/ui/alert/Alert.stories.tsx +1 -1
  338. package/src/components/ui/autocomplete/Autocomplete.stories.tsx +11 -13
  339. package/src/components/ui/autocomplete/Autocomplete.test.tsx +7 -25
  340. package/src/components/ui/autocomplete/Autocomplete.tsx +21 -28
  341. package/src/components/ui/avatar/Avatar.stories.tsx +1 -1
  342. package/src/components/ui/avatar/Avatar.tsx +2 -10
  343. package/src/components/ui/badge/Badge.stories.tsx +83 -28
  344. package/src/components/ui/badge/Badge.test.tsx +19 -3
  345. package/src/components/ui/badge/Badge.tsx +48 -55
  346. package/src/components/ui/breadcrumbs/Breadcrumbs.stories.tsx +1 -1
  347. package/src/components/ui/breadcrumbs/Breadcrumbs.tsx +4 -16
  348. package/src/components/ui/button/Button.stories.tsx +46 -12
  349. package/src/components/ui/button/Button.tsx +32 -25
  350. package/src/components/ui/card/Card.stories.tsx +90 -94
  351. package/src/components/ui/card/Card.test.tsx +80 -6
  352. package/src/components/ui/card/Card.tsx +150 -203
  353. package/src/components/ui/checkbox/Checkbox.stories.tsx +1 -1
  354. package/src/components/ui/checkbox/Checkbox.tsx +6 -26
  355. package/src/components/ui/chip/Chip.stories.tsx +37 -13
  356. package/src/components/ui/chip/Chip.test.tsx +10 -6
  357. package/src/components/ui/chip/Chip.tsx +76 -91
  358. package/src/components/ui/collapse/Collapse.stories.tsx +23 -23
  359. package/src/components/ui/collapse/Collapse.tsx +6 -11
  360. package/src/components/ui/data-row/DataRow.stories.tsx +9 -2
  361. package/src/components/ui/data-row/DataRow.test.tsx +5 -15
  362. package/src/components/ui/data-row/DataRow.tsx +18 -7
  363. package/src/components/ui/divider/Divider.stories.tsx +1 -1
  364. package/src/components/ui/divider/Divider.tsx +1 -5
  365. package/src/components/ui/drawer/Drawer.stories.tsx +5 -16
  366. package/src/components/ui/drawer/Drawer.tsx +13 -30
  367. package/src/components/ui/floating-overlay-depth.test.tsx +143 -0
  368. package/src/components/ui/form-field/FormField.stories.tsx +6 -20
  369. package/src/components/ui/form-field/FormField.test.tsx +1 -5
  370. package/src/components/ui/form-field/FormField.tsx +10 -46
  371. package/src/components/ui/help-tip/HelpTip.stories.tsx +8 -19
  372. package/src/components/ui/help-tip/HelpTip.test.tsx +1 -3
  373. package/src/components/ui/help-tip/HelpTip.tsx +21 -22
  374. package/src/components/ui/help-tip/index.ts +7 -1
  375. package/src/components/ui/icon-box/IconBox.stories.tsx +1 -1
  376. package/src/components/ui/icon-box/IconBox.test.tsx +1 -7
  377. package/src/components/ui/icon-box/IconBox.tsx +2 -12
  378. package/src/components/ui/indicator/Indicator.stories.tsx +1 -1
  379. package/src/components/ui/indicator/Indicator.tsx +20 -14
  380. package/src/components/ui/input/Input.stories.tsx +3 -11
  381. package/src/components/ui/input/Input.test.tsx +2 -10
  382. package/src/components/ui/input/Input.tsx +10 -25
  383. package/src/components/ui/input/index.ts +7 -1
  384. package/src/components/ui/link/Link.stories.tsx +19 -7
  385. package/src/components/ui/list-item/ListItem.stories.tsx +11 -2
  386. package/src/components/ui/list-item/ListItem.tsx +2 -9
  387. package/src/components/ui/menu/Menu.stories.tsx +21 -15
  388. package/src/components/ui/menu/Menu.test.tsx +2 -11
  389. package/src/components/ui/menu/Menu.tsx +12 -14
  390. package/src/components/ui/menu/index.ts +8 -1
  391. package/src/components/ui/modal/Modal.stories.tsx +2 -2
  392. package/src/components/ui/modal/Modal.tsx +29 -19
  393. package/src/components/ui/pill/Pill.stories.tsx +58 -23
  394. package/src/components/ui/pill/Pill.test.tsx +101 -3
  395. package/src/components/ui/pill/Pill.tsx +164 -49
  396. package/src/components/ui/pill/index.ts +1 -1
  397. package/src/components/ui/popover/Popover.stories.tsx +5 -7
  398. package/src/components/ui/popover/Popover.test.tsx +1 -6
  399. package/src/components/ui/popover/Popover.tsx +20 -15
  400. package/src/components/ui/popover/index.ts +7 -1
  401. package/src/components/ui/progress/Progress.stories.tsx +3 -12
  402. package/src/components/ui/progress/Progress.test.tsx +1 -5
  403. package/src/components/ui/radio/Radio.stories.tsx +42 -21
  404. package/src/components/ui/radio/Radio.test.tsx +6 -2
  405. package/src/components/ui/radio/Radio.tsx +23 -22
  406. package/src/components/ui/section/Section.stories.tsx +5 -14
  407. package/src/components/ui/section/Section.test.tsx +1 -6
  408. package/src/components/ui/section/Section.tsx +1 -3
  409. package/src/components/ui/section/index.ts +1 -5
  410. package/src/components/ui/select/Select.stories.tsx +3 -13
  411. package/src/components/ui/select/Select.test.tsx +2 -11
  412. package/src/components/ui/select/Select.tsx +14 -14
  413. package/src/components/ui/skeleton/Skeleton.stories.tsx +3 -11
  414. package/src/components/ui/skeleton/Skeleton.tsx +3 -14
  415. package/src/components/ui/skeleton/index.ts +1 -7
  416. package/src/components/ui/spinner/Spinner.stories.tsx +1 -1
  417. package/src/components/ui/spinner/Spinner.tsx +1 -4
  418. package/src/components/ui/stack/Stack.stories.tsx +1 -1
  419. package/src/components/ui/stack/Stack.tsx +1 -1
  420. package/src/components/ui/surface/Surface.stories.tsx +17 -5
  421. package/src/components/ui/surface/Surface.test.tsx +88 -28
  422. package/src/components/ui/surface/Surface.tsx +37 -87
  423. package/src/components/ui/surface/SurfaceContext.ts +22 -62
  424. package/src/components/ui/surface/index.ts +8 -0
  425. package/src/components/ui/surface/resolveSurface.ts +98 -0
  426. package/src/components/ui/surface/surface.contract.test.ts +6 -1
  427. package/src/components/ui/switch/Switch.stories.tsx +1 -1
  428. package/src/components/ui/switch/Switch.tsx +7 -6
  429. package/src/components/ui/tabs/Tabs.stories.tsx +1 -1
  430. package/src/components/ui/tabs/Tabs.tsx +7 -22
  431. package/src/components/ui/tabs/index.ts +1 -7
  432. package/src/components/ui/tile/Tile.stories.tsx +1 -1
  433. package/src/components/ui/tile/Tile.tsx +3 -0
  434. package/src/components/ui/toast/Toast.stories.tsx +1 -1
  435. package/src/components/ui/toast/Toast.test.tsx +2 -8
  436. package/src/components/ui/toast/Toast.tsx +43 -53
  437. package/src/components/ui/toast/index.ts +0 -1
  438. package/src/components/ui/toolbar-button/ToolbarButton.stories.tsx +92 -71
  439. package/src/components/ui/toolbar-button/ToolbarButton.test.tsx +3 -18
  440. package/src/components/ui/toolbar-button/ToolbarButton.tsx +25 -43
  441. package/src/components/ui/tooltip/Tooltip.stories.tsx +12 -3
  442. package/src/components/ui/tooltip/Tooltip.test.tsx +21 -3
  443. package/src/components/ui/tooltip/Tooltip.tsx +55 -36
  444. package/src/components/ui/tooltip/index.ts +1 -1
  445. package/src/components/ui/trigger/TriggerSurface.test.tsx +215 -0
  446. package/src/components/ui/trigger/TriggerSurface.tsx +81 -0
  447. package/src/components/ui/trigger/index.ts +2 -0
  448. package/src/stories/PresetShowcase.stories.tsx +100 -47
  449. package/src/test/no-device-internals.test.ts +3 -3
  450. package/src/theme/ChoosingTokens.stories.tsx +48 -0
  451. package/src/theme/ColorPalettes.stories.tsx +62 -45
  452. package/src/theme/ColorPrimitives.stories.tsx +35 -35
  453. package/src/theme/Depth.stories.tsx +132 -65
  454. package/src/theme/DepthCalibration.stories.tsx +23 -21
  455. package/src/theme/ThemeProvider.test.tsx +4 -4
  456. package/src/theme/barrel.ts +7 -6
  457. package/src/theme/color-stories.coverage.test.ts +1 -1
  458. package/src/theme/color-utils.ts +41 -29
  459. package/src/theme/config.completeness.test.ts +1 -1
  460. package/src/theme/config.ts +28 -0
  461. package/src/theme/elevation.test.ts +82 -56
  462. package/src/theme/elevation.ts +77 -561
  463. package/src/theme/global.css +30 -2
  464. package/src/theme/grey-ramp.test.ts +24 -8
  465. package/src/theme/lift.test.ts +39 -0
  466. package/src/theme/lift.ts +102 -0
  467. package/src/theme/materials.test.ts +5 -2
  468. package/src/theme/materials.ts +38 -4
  469. package/src/theme/native-theming-guard.test.ts +5 -5
  470. package/src/theme/presets/apply.ts +4 -0
  471. package/src/theme/presets/audiobook.ts +5 -2
  472. package/src/theme/presets/default.ts +4 -0
  473. package/src/theme/presets/index.ts +14 -1
  474. package/src/theme/presets/types.ts +1 -1
  475. package/src/theme/semantic-contrast.test.ts +13 -4
  476. package/src/theme/status-distinctness.test.ts +66 -0
  477. package/src/theme/surface-planes.test.ts +37 -0
  478. package/src/theme/surface-planes.ts +68 -0
  479. package/src/theme/token-export-guard.test.ts +1 -3
  480. package/src/theme/tokens/primitives.test.ts +15 -7
  481. package/src/theme/tokens/primitives.ts +65 -33
  482. package/src/theme/tokens/semantic.ts +71 -37
  483. package/src/theme/wash-ladder.test.ts +58 -0
  484. package/src/theme/workout-tokens.ts +1 -7
  485. package/src/types/jest-axe.d.ts +2 -6
  486. package/src/types/raw-md.d.ts +5 -0
  487. package/src/utils/colors.ts +4 -4
  488. package/src/utils/form.ts +1 -3
  489. package/src/utils/index.ts +2 -7
  490. package/src/utils/number-format.ts +17 -0
  491. package/src/utils/workout-format.ts +15 -6
  492. package/src/web-jsx/jsx-runtime.ts +1 -5
  493. package/tailwind.config.js +5 -0
  494. package/src/components/custom/Workout/ExerciseCardUnified.stories.tsx +0 -151
  495. package/src/components/custom/Workout/RowInventory.stories.tsx +0 -408
  496. package/src/components/custom/Workout/S3FullRail.stories.tsx +0 -46
  497. package/src/components/custom/Workout/S3SessionPace.stories.tsx +0 -95
  498. package/src/components/custom/Workout/S3SessionRailHeading.stories.tsx +0 -61
  499. package/src/components/custom/Workout/S3SetTypes.stories.tsx +0 -176
  500. package/src/components/custom/Workout/S3WorkoutExpansion.stories.tsx +0 -240
  501. package/src/components/shell/DashboardShell.stories.tsx +0 -65
  502. package/src/components/shell/DashboardShell.tsx +0 -75
  503. package/src/components/shell/SessionRailSpecimen.stories.tsx +0 -753
  504. package/src/theme/elevation.stories.tsx +0 -346
  505. package/src/utils/useTheme.ts +0 -72
  506. /package/src/components/shell/{DeviceIndicator.test.tsx → workout/DeviceIndicator.test.tsx} +0 -0
  507. /package/src/components/shell/{DeviceMenu.test.tsx → workout/DeviceMenu.test.tsx} +0 -0
  508. /package/src/components/shell/{DeviceRow.test.tsx → workout/DeviceRow.test.tsx} +0 -0
  509. /package/src/components/shell/{SessionStatePill.test.tsx → workout/SessionStatePill.test.tsx} +0 -0
@@ -100,7 +100,7 @@ function squarify(data: TreemapDatum[], w: number, h: number): Rect[] {
100
100
  out.push(
101
101
  vertical
102
102
  ? { x: rx, y: along, w: thickness, h: len, datum: r.datum }
103
- : { x: along, y: ry, w: len, h: thickness, datum: r.datum },
103
+ : { x: along, y: ry, w: len, h: thickness, datum: r.datum }
104
104
  )
105
105
  along += len
106
106
  }
@@ -143,7 +143,12 @@ export function Treemap({
143
143
  const restValue = clean.slice(maxTiles - 1).reduce((s, d) => s + d.value, 0)
144
144
  tiles = [
145
145
  ...head,
146
- { id: '__more__', value: restValue, color: '#3a3a3a', label: `+${clean.length - (maxTiles - 1)} more` },
146
+ {
147
+ id: '__more__',
148
+ value: restValue,
149
+ color: '#3a3a3a',
150
+ label: `+${clean.length - (maxTiles - 1)} more`,
151
+ },
147
152
  ]
148
153
  }
149
154
 
@@ -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,
@@ -95,7 +95,15 @@ const exercises: ActiveWorkoutExercise[] = [
95
95
  const meta: Meta<typeof ActiveWorkoutPage> = {
96
96
  title: 'Pages/Active Workout',
97
97
  component: ActiveWorkoutPage,
98
- parameters: { layout: 'fullscreen' },
98
+ parameters: {
99
+ layout: 'fullscreen',
100
+ docs: {
101
+ description: {
102
+ component:
103
+ 'Composes **ExerciseCard** · **InputBar** · **RestTimer** · **SupersetWrapper**.',
104
+ },
105
+ },
106
+ },
99
107
  tags: ['autodocs'],
100
108
  args: {
101
109
  title: 'Push Day A',
@@ -4,7 +4,7 @@ import { DumbbellIcon } from './icons'
4
4
  import { BaseBadge } from './BaseBadge'
5
5
 
6
6
  const meta: Meta<typeof BaseBadge> = {
7
- title: 'Components/Atoms/BaseBadge',
7
+ title: 'Custom/Workout/BaseBadge',
8
8
  component: BaseBadge,
9
9
  tags: ['autodocs'],
10
10
  argTypes: {
@@ -56,14 +56,26 @@ export const AllVariants: Story = {
56
56
  render: () => (
57
57
  <View style={{ gap: 12 }}>
58
58
  <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>
59
+ <BaseBadge size="sm">
60
+ <Label>225 lbs</Label>
61
+ </BaseBadge>
62
+ <BaseBadge size="md">
63
+ <Label>225 lbs</Label>
64
+ </BaseBadge>
65
+ <BaseBadge size="lg">
66
+ <Label>225 lbs</Label>
67
+ </BaseBadge>
62
68
  </View>
63
69
  <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>
70
+ <BaseBadge variant="pr" size="sm">
71
+ <Label color="#FF7900">PR</Label>
72
+ </BaseBadge>
73
+ <BaseBadge variant="pr" size="md">
74
+ <Label color="#FF7900">PR</Label>
75
+ </BaseBadge>
76
+ <BaseBadge variant="pr" size="lg">
77
+ <Label color="#FF7900">PR</Label>
78
+ </BaseBadge>
67
79
  </View>
68
80
  <View style={{ flexDirection: 'row', gap: 12, alignItems: 'center' }}>
69
81
  <BaseBadge icon={<DumbbellIcon size={12} color="#9CA3AF" strokeWidth={2} />}>
@@ -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()
@@ -37,6 +37,9 @@ const variantColors: Record<BaseBadgeVariant, { backgroundColor: string; borderC
37
37
  },
38
38
  }
39
39
 
40
+ /**
41
+ * @deprecated Use `<Pill tone="…" variant="…">` — removed after AW-127 consumer migration.
42
+ */
40
43
  export function BaseBadge({
41
44
  variant = 'plain',
42
45
  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,7 @@ 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 { getGlowShadow } from '../../../theme/elevation'
8
9
  import {
9
10
  MuscleGroup,
10
11
  SimpleMuscleGroup,
@@ -197,7 +198,8 @@ export function BodyMap({
197
198
  alignSelf: 'center',
198
199
  transform: [{ scale }],
199
200
  },
200
- glowColor ? { boxShadow: `0 0 14px 2px ${glowColor}` } : undefined,
201
+ // The highlight halo is emphasis, not depth.
202
+ glowColor ? getGlowShadow(glowColor, 'medium') : undefined,
201
203
  ]}
202
204
  // The SVG is decorative; the accessible muscle legend below is the
203
205
  // screen-reader / keyboard interface.
@@ -7,6 +7,7 @@ import {
7
7
  type UpcomingExercise,
8
8
  } from './BodyMapDetailPanel'
9
9
  import { MuscleGroup } from './muscleTaxonomy'
10
+ import { Surface } from '../../ui/surface'
10
11
 
11
12
  const contributing: ContributingExercise[] = [
12
13
  { name: 'Barbell Bench Press', sets: 4, contributionWeight: 1 },
@@ -21,14 +22,17 @@ const upcoming: UpcomingExercise[] = [
21
22
  ]
22
23
 
23
24
  const meta: Meta<typeof BodyMapDetailPanel> = {
24
- title: 'Workout/DataViz/BodyMapDetailPanel',
25
+ title: 'Custom/Workout/DataViz/BodyMapDetailPanel',
25
26
  component: BodyMapDetailPanel,
27
+ parameters: {
28
+ docs: { description: { component: 'Composes **Badge** · **Sparkline** · **MuscleGroup**.' } },
29
+ },
26
30
  tags: ['autodocs'],
27
31
  decorators: [
28
32
  (Story) => (
29
- <View style={{ position: 'relative', height: 640, width: 380, backgroundColor: '#0E0E0E' }}>
33
+ <Surface level="base" style={{ position: 'relative', height: 640, width: 380 }}>
30
34
  <Story />
31
- </View>
35
+ </Surface>
32
36
  ),
33
37
  ],
34
38
  argTypes: {
@@ -132,7 +136,15 @@ export const WithoutUpcoming: Story = {
132
136
  function InteractiveBodyMapDetailPanel() {
133
137
  const [open, setOpen] = useState(false)
134
138
  return (
135
- <View style={{ position: 'relative', height: 640, width: 380, backgroundColor: '#0E0E0E', padding: 16 }}>
139
+ <View
140
+ style={{
141
+ position: 'relative',
142
+ height: 640,
143
+ width: 380,
144
+ backgroundColor: '#0E0E0E',
145
+ padding: 16,
146
+ }}
147
+ >
136
148
  <Pressable
137
149
  onPress={() => setOpen(true)}
138
150
  accessibilityRole="button"
@@ -13,9 +13,7 @@ const contributing: ContributingExercise[] = [
13
13
  { name: 'Cable Fly', sets: 3, contributionWeight: 0.75 },
14
14
  ]
15
15
 
16
- const upcoming: UpcomingExercise[] = [
17
- { name: 'Dips', workoutName: 'Push B', sets: 3 },
18
- ]
16
+ const upcoming: UpcomingExercise[] = [{ name: 'Dips', workoutName: 'Push B', sets: 3 }]
19
17
 
20
18
  const baseProps = {
21
19
  muscleGroup: MuscleGroup.CHEST,
@@ -54,10 +52,10 @@ describe('BodyMapDetailPanel', () => {
54
52
  render(<BodyMapDetailPanel {...baseProps} />)
55
53
  expect(screen.getByTestId('body-map-detail-panel-handle')).toBeInTheDocument()
56
54
  expect(screen.getByTestId('body-map-detail-panel-status-badge')).toHaveTextContent(
57
- 'productive',
55
+ 'productive'
58
56
  )
59
57
  expect(screen.getByTestId('body-map-detail-panel-last-trained')).toHaveTextContent(
60
- 'Last trained 2 days ago',
58
+ 'Last trained 2 days ago'
61
59
  )
62
60
  })
63
61
 
@@ -101,13 +99,13 @@ describe('BodyMapDetailPanel', () => {
101
99
  it('renders contributing exercises with sets and contribution', () => {
102
100
  render(<BodyMapDetailPanel {...baseProps} />)
103
101
  expect(screen.getByTestId('body-map-detail-panel-contributing-0-name')).toHaveTextContent(
104
- 'Barbell Bench Press',
102
+ 'Barbell Bench Press'
105
103
  )
106
104
  expect(screen.getByTestId('body-map-detail-panel-contributing-0-detail')).toHaveTextContent(
107
- '4 sets · 100%',
105
+ '4 sets · 100%'
108
106
  )
109
107
  expect(screen.getByTestId('body-map-detail-panel-contributing-1-detail')).toHaveTextContent(
110
- '3 sets · 75%',
108
+ '3 sets · 75%'
111
109
  )
112
110
  })
113
111
 
@@ -115,7 +113,7 @@ describe('BodyMapDetailPanel', () => {
115
113
  render(<BodyMapDetailPanel {...baseProps} />)
116
114
  expect(screen.getByTestId('body-map-detail-panel-upcoming-0-name')).toHaveTextContent('Dips')
117
115
  expect(screen.getByTestId('body-map-detail-panel-upcoming-0-detail')).toHaveTextContent(
118
- 'Push B · 3 sets',
116
+ 'Push B · 3 sets'
119
117
  )
120
118
  })
121
119
 
@@ -131,7 +129,7 @@ describe('BodyMapDetailPanel', () => {
131
129
  contributingExercises={[]}
132
130
  upcomingExercises={[]}
133
131
  weeklyHistory={[]}
134
- />,
132
+ />
135
133
  )
136
134
  expect(screen.getByTestId('body-map-detail-panel')).toBeInTheDocument()
137
135
  expect(screen.queryByTestId('body-map-detail-panel-contributing')).not.toBeInTheDocument()
@@ -190,9 +188,7 @@ describe('BodyMapDetailPanel', () => {
190
188
  })
191
189
 
192
190
  it('has no accessibility violations with full content', async () => {
193
- const { container } = render(
194
- <BodyMapDetailPanel {...baseProps} onViewExercises={vi.fn()} />,
195
- )
191
+ const { container } = render(<BodyMapDetailPanel {...baseProps} onViewExercises={vi.fn()} />)
196
192
  expect(await axe(container)).toHaveNoViolations()
197
193
  })
198
194
 
@@ -200,7 +196,7 @@ describe('BodyMapDetailPanel', () => {
200
196
  const statuses = ['under', 'maintenance', 'productive', 'over'] as const
201
197
  for (const volumeStatus of statuses) {
202
198
  const { container, unmount } = render(
203
- <BodyMapDetailPanel {...baseProps} volumeStatus={volumeStatus} />,
199
+ <BodyMapDetailPanel {...baseProps} volumeStatus={volumeStatus} />
204
200
  )
205
201
  expect(await axe(container)).toHaveNoViolations()
206
202
  unmount()
@@ -217,7 +213,7 @@ describe('BodyMapDetailPanel', () => {
217
213
  volumeStatus="maintenance"
218
214
  isOpen
219
215
  onClose={vi.fn()}
220
- />,
216
+ />
221
217
  )
222
218
  expect(await axe(container)).toHaveNoViolations()
223
219
  })
@@ -19,6 +19,7 @@ import {
19
19
  type VolumeStatus,
20
20
  } from './muscleTaxonomy'
21
21
  import { getSemanticColors } from '../../../theme/tokens/semantic'
22
+ import { liftStyle } from '../../../theme/lift'
22
23
 
23
24
  const t = getSemanticColors('dark')
24
25
 
@@ -173,7 +174,14 @@ export function BodyMapDetailPanel({
173
174
 
174
175
  return (
175
176
  <View
176
- style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, justifyContent: 'flex-end' }}
177
+ style={{
178
+ position: 'absolute',
179
+ top: 0,
180
+ left: 0,
181
+ right: 0,
182
+ bottom: 0,
183
+ justifyContent: 'flex-end',
184
+ }}
177
185
  testID="body-map-detail-panel-root"
178
186
  >
179
187
  <Animated.View
@@ -266,7 +274,9 @@ export function BodyMapDetailPanel({
266
274
  style={{ padding: 4, margin: -4 }}
267
275
  testID="body-map-detail-panel-close"
268
276
  >
269
- <Text className="text-text-secondary" style={{ fontSize: 22, lineHeight: 22 }}>{'×'}</Text>
277
+ <Text className="text-text-secondary" style={{ fontSize: 22, lineHeight: 22 }}>
278
+ {'×'}
279
+ </Text>
270
280
  </Pressable>
271
281
  </View>
272
282
 
@@ -286,10 +296,16 @@ export function BodyMapDetailPanel({
286
296
  style={{ marginBottom: 6 }}
287
297
  accessibilityElementsHidden
288
298
  >
289
- <Text className="text-text-tertiary" style={{ fontSize: 10, fontFamily: 'Inter, sans-serif', fontWeight: '600' }}>
299
+ <Text
300
+ className="text-text-tertiary"
301
+ style={{ fontSize: 10, fontFamily: 'Inter, sans-serif', fontWeight: '600' }}
302
+ >
290
303
  {`MEV ${landmarks.mev}`}
291
304
  </Text>
292
- <Text className="text-text-tertiary" style={{ fontSize: 10, fontFamily: 'Inter, sans-serif', fontWeight: '600' }}>
305
+ <Text
306
+ className="text-text-tertiary"
307
+ style={{ fontSize: 10, fontFamily: 'Inter, sans-serif', fontWeight: '600' }}
308
+ >
293
309
  {`MRV ${landmarks.mrv}`}
294
310
  </Text>
295
311
  </View>
@@ -304,7 +320,9 @@ export function BodyMapDetailPanel({
304
320
  testID="body-map-detail-panel-volume-bar"
305
321
  >
306
322
  <View
307
- style={{ height: 8, borderRadius: 4, backgroundImage: VOLUME_GRADIENT } as ViewStyle}
323
+ style={
324
+ { height: 8, borderRadius: 4, backgroundImage: VOLUME_GRADIENT } as ViewStyle
325
+ }
308
326
  accessibilityElementsHidden
309
327
  />
310
328
  <View
@@ -317,7 +335,8 @@ export function BodyMapDetailPanel({
317
335
  height: 14,
318
336
  borderRadius: 7,
319
337
  borderWidth: 2,
320
- boxShadow: '0 0 4px rgba(0,0,0,0.5)',
338
+ // A knob resting on the volume bar: lift, with the ring as its edge.
339
+ ...liftStyle(1, 'dark', { rim: 0 }),
321
340
  }}
322
341
  accessibilityElementsHidden
323
342
  testID="body-map-detail-panel-volume-marker"
@@ -393,7 +412,12 @@ export function BodyMapDetailPanel({
393
412
  >
394
413
  <Text
395
414
  className="text-text-primary"
396
- style={{ flex: 1, fontSize: 13, fontFamily: 'Inter, sans-serif', fontWeight: '600' }}
415
+ style={{
416
+ flex: 1,
417
+ fontSize: 13,
418
+ fontFamily: 'Inter, sans-serif',
419
+ fontWeight: '600',
420
+ }}
397
421
  testID={`body-map-detail-panel-contributing-${index}-name`}
398
422
  >
399
423
  {exercise.name}
@@ -432,7 +456,12 @@ export function BodyMapDetailPanel({
432
456
  >
433
457
  <Text
434
458
  className="text-text-primary"
435
- style={{ flex: 1, fontSize: 13, fontFamily: 'Inter, sans-serif', fontWeight: '600' }}
459
+ style={{
460
+ flex: 1,
461
+ fontSize: 13,
462
+ fontFamily: 'Inter, sans-serif',
463
+ fontWeight: '600',
464
+ }}
436
465
  testID={`body-map-detail-panel-upcoming-${index}-name`}
437
466
  >
438
467
  {exercise.name}
@@ -465,7 +494,14 @@ export function BodyMapDetailPanel({
465
494
  }}
466
495
  testID="body-map-detail-panel-view-exercises"
467
496
  >
468
- <Text style={{ fontSize: 13, fontFamily: 'Inter, sans-serif', fontWeight: '700', color: BRAND_PRIMARY }}>
497
+ <Text
498
+ style={{
499
+ fontSize: 13,
500
+ fontFamily: 'Inter, sans-serif',
501
+ fontWeight: '700',
502
+ color: BRAND_PRIMARY,
503
+ }}
504
+ >
469
505
  {'View exercises'}
470
506
  </Text>
471
507
  </Pressable>
@@ -2,11 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react-vite'
2
2
  import { useState } from 'react'
3
3
  import { View, Text } from 'react-native'
4
4
  import { CapacityBandChart } from './CapacityBandChart'
5
- import type {
6
- CapacityBandDataPoint,
7
- CapacityBandProjection,
8
- WorkoutDot,
9
- } from './CapacityBandChart'
5
+ import type { CapacityBandDataPoint, CapacityBandProjection, WorkoutDot } from './CapacityBandChart'
10
6
 
11
7
  const band: CapacityBandDataPoint[] = [
12
8
  { date: '2026-06-01', bandLow: 40, bandHigh: 70 },
@@ -39,12 +35,18 @@ const projection: CapacityBandProjection = {
39
35
  }
40
36
 
41
37
  const meta: Meta<typeof CapacityBandChart> = {
42
- title: 'Workout/DataViz/CapacityBandChart',
38
+ title: 'Custom/Workout/DataViz/CapacityBandChart',
43
39
  component: CapacityBandChart,
44
40
  tags: ['autodocs'],
45
41
  argTypes: {
46
- width: { control: { type: 'range', min: 240, max: 480, step: 10 }, description: 'Chart width in px' },
47
- height: { control: { type: 'range', min: 120, max: 280, step: 10 }, description: 'Chart height in px' },
42
+ width: {
43
+ control: { type: 'range', min: 240, max: 480, step: 10 },
44
+ description: 'Chart width in px',
45
+ },
46
+ height: {
47
+ control: { type: 'range', min: 120, max: 280, step: 10 },
48
+ description: 'Chart height in px',
49
+ },
48
50
  band: { description: 'Capacity band shape over time' },
49
51
  workouts: { description: 'Workout sessions plotted as load dots' },
50
52
  projection: { description: 'Optional dashed forward projection (training vs rest)' },