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