@titan-design/react-ui 0.12.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (509) hide show
  1. package/README.md +46 -47
  2. package/dist/bodymap.js +768 -701
  3. package/dist/bodymap.js.map +1 -1
  4. package/dist/bodymap.mjs +770 -703
  5. package/dist/bodymap.mjs.map +1 -1
  6. package/dist/index.d.mts +1320 -215
  7. package/dist/index.d.ts +1320 -215
  8. package/dist/index.js +5996 -4498
  9. package/dist/index.js.map +1 -1
  10. package/dist/index.mjs +5773 -4357
  11. package/dist/index.mjs.map +1 -1
  12. package/dist/{pages-CvsFqNtx.d.mts → pages-CpW3OB3g.d.mts} +21 -3
  13. package/dist/{pages-B1hqnGIC.d.ts → pages-_3Ajpiqu.d.ts} +21 -3
  14. package/dist/pages.d.mts +1 -1
  15. package/dist/pages.d.ts +1 -1
  16. package/dist/pages.js +1435 -1428
  17. package/dist/pages.js.map +1 -1
  18. package/dist/pages.mjs +1443 -1436
  19. package/dist/pages.mjs.map +1 -1
  20. package/dist/theme/index.d.mts +202 -1042
  21. package/dist/theme/index.d.ts +202 -1042
  22. package/dist/theme/index.js +215 -300
  23. package/dist/theme/index.js.map +1 -1
  24. package/dist/theme/index.mjs +202 -296
  25. package/dist/theme/index.mjs.map +1 -1
  26. package/dist/theme/tokens-css.js +62 -5
  27. package/dist/theme/tokens-css.js.map +1 -1
  28. package/dist/theme/tokens-css.mjs +62 -5
  29. package/dist/theme/tokens-css.mjs.map +1 -1
  30. package/dist/theme/tokens.d.mts +972 -0
  31. package/dist/theme/tokens.d.ts +972 -0
  32. package/dist/theme/tokens.js +904 -0
  33. package/dist/theme/tokens.js.map +1 -0
  34. package/dist/theme/tokens.mjs +880 -0
  35. package/dist/theme/tokens.mjs.map +1 -0
  36. package/docs/audits/2026-09-08-critique-addenda.md +51 -0
  37. package/docs/audits/2026-09-08-library-critique.md +212 -0
  38. package/docs/library-roadmap.md +99 -0
  39. package/package.json +7 -1
  40. package/src/arch/arch-graph.freshness.test.ts +52 -0
  41. package/src/arch/arch-graph.json +5021 -1617
  42. package/src/components/custom/ActiveWork/CoChangeChip.stories.tsx +44 -0
  43. package/src/components/custom/ActiveWork/CoChangeChip.test.tsx +29 -0
  44. package/src/components/custom/ActiveWork/CoChangeChip.tsx +48 -0
  45. package/src/components/custom/ActiveWork/Eyebrow.stories.tsx +25 -0
  46. package/src/components/custom/ActiveWork/Eyebrow.test.tsx +16 -0
  47. package/src/components/custom/ActiveWork/Eyebrow.tsx +26 -0
  48. package/src/components/custom/ActiveWork/FileActivityDetail.stories.tsx +50 -0
  49. package/src/components/custom/ActiveWork/FileActivityDetail.test.tsx +66 -0
  50. package/src/components/custom/ActiveWork/FileActivityDetail.tsx +202 -0
  51. package/src/components/custom/ActiveWork/FileActivityRow.stories.tsx +70 -0
  52. package/src/components/custom/ActiveWork/FileActivityRow.test.tsx +67 -0
  53. package/src/components/custom/ActiveWork/FileActivityRow.tsx +130 -0
  54. package/src/components/custom/ActiveWork/FileHistoryExplorer.stories.tsx +84 -0
  55. package/src/components/custom/ActiveWork/FileHistoryExplorer.test.tsx +99 -0
  56. package/src/components/custom/ActiveWork/FileHistoryExplorer.tsx +138 -0
  57. package/src/components/custom/ActiveWork/FilePathLabel.stories.tsx +39 -0
  58. package/src/components/custom/ActiveWork/FilePathLabel.test.tsx +53 -0
  59. package/src/components/custom/ActiveWork/FilePathLabel.tsx +63 -0
  60. package/src/components/custom/ActiveWork/InitiativeBrief.stories.tsx +50 -0
  61. package/src/components/custom/ActiveWork/InitiativeBrief.test.tsx +62 -0
  62. package/src/components/custom/ActiveWork/InitiativeBrief.tsx +181 -0
  63. package/src/components/custom/ActiveWork/InitiativeCard.stories.tsx +73 -0
  64. package/src/components/custom/ActiveWork/InitiativeCard.test.tsx +68 -0
  65. package/src/components/custom/ActiveWork/InitiativeCard.tsx +136 -0
  66. package/src/components/custom/ActiveWork/InitiativeHeader.stories.tsx +59 -0
  67. package/src/components/custom/ActiveWork/InitiativeHeader.test.tsx +40 -0
  68. package/src/components/custom/ActiveWork/InitiativeHeader.tsx +73 -0
  69. package/src/components/custom/ActiveWork/InitiativeReader.stories.tsx +145 -0
  70. package/src/components/custom/ActiveWork/OpenLoops.stories.tsx +58 -0
  71. package/src/components/custom/ActiveWork/OpenLoops.test.tsx +61 -0
  72. package/src/components/custom/ActiveWork/OpenLoops.tsx +107 -0
  73. package/src/components/custom/ActiveWork/PortfolioOverview.stories.tsx +101 -0
  74. package/src/components/custom/ActiveWork/PortfolioOverview.test.tsx +81 -0
  75. package/src/components/custom/ActiveWork/PortfolioOverview.tsx +83 -0
  76. package/src/components/custom/ActiveWork/README.md +305 -0
  77. package/src/components/custom/ActiveWork/SessionDetail.stories.tsx +71 -0
  78. package/src/components/custom/ActiveWork/SessionDetail.test.tsx +84 -0
  79. package/src/components/custom/ActiveWork/SessionDetail.tsx +180 -0
  80. package/src/components/custom/ActiveWork/SessionList.stories.tsx +69 -0
  81. package/src/components/custom/ActiveWork/SessionList.test.tsx +78 -0
  82. package/src/components/custom/ActiveWork/SessionList.tsx +103 -0
  83. package/src/components/custom/ActiveWork/SessionListItem.stories.tsx +64 -0
  84. package/src/components/custom/ActiveWork/SessionListItem.test.tsx +62 -0
  85. package/src/components/custom/ActiveWork/SessionListItem.tsx +152 -0
  86. package/src/components/custom/ActiveWork/SessionReader.stories.tsx +113 -0
  87. package/src/components/custom/ActiveWork/SeverityLabel.stories.tsx +51 -0
  88. package/src/components/custom/ActiveWork/SeverityLabel.test.tsx +68 -0
  89. package/src/components/custom/ActiveWork/SeverityLabel.tsx +97 -0
  90. package/src/components/custom/ActiveWork/TaskRow.stories.tsx +63 -0
  91. package/src/components/custom/ActiveWork/TaskRow.test.tsx +112 -0
  92. package/src/components/custom/ActiveWork/TaskRow.tsx +176 -0
  93. package/src/components/custom/ActiveWork/TaskTable.stories.tsx +123 -0
  94. package/src/components/custom/ActiveWork/TaskTable.test.tsx +233 -0
  95. package/src/components/custom/ActiveWork/TaskTable.tsx +321 -0
  96. package/src/components/custom/ActiveWork/active-work-depth.test.tsx +102 -0
  97. package/src/components/custom/ActiveWork/file-history-fixture.ts +91 -0
  98. package/src/components/custom/ActiveWork/format-time.test.ts +23 -0
  99. package/src/components/custom/ActiveWork/format-time.ts +32 -0
  100. package/src/components/custom/ActiveWork/index.ts +19 -0
  101. package/src/components/custom/ActiveWork/initiative-fixture.ts +104 -0
  102. package/src/components/custom/ActiveWork/session-fixture.ts +267 -0
  103. package/src/components/custom/ActiveWork/session-linkers.ts +56 -0
  104. package/src/components/custom/ActiveWork/task-list-fixture.ts +97 -0
  105. package/src/components/custom/CircularTimer/CircularTimer.stories.tsx +4 -3
  106. package/src/components/custom/DateTime/DateTime.stories.tsx +2 -1
  107. package/src/components/custom/DateTime/DateTime.test.tsx +3 -1
  108. package/src/components/custom/EmptyState/EmptyState.stories.tsx +22 -9
  109. package/src/components/custom/EmptyState/EmptyState.test.tsx +7 -13
  110. package/src/components/custom/EmptyState/EmptyState.tsx +4 -18
  111. package/src/components/custom/Fatigue/DualGhostSpark.stories.tsx +4 -3
  112. package/src/components/custom/Fatigue/FatigueLights.stories.tsx +2 -2
  113. package/src/components/custom/Fatigue/GhostSpark.stories.tsx +4 -3
  114. package/src/components/custom/Fatigue/LiveFatigueCard.stories.tsx +2 -2
  115. package/src/components/custom/Fatigue/LiveFatigueCard.tsx +8 -4
  116. package/src/components/custom/Fatigue/LiveFatiguePanel.stories.tsx +116 -6
  117. package/src/components/custom/Fatigue/LiveFatiguePanel.test.tsx +134 -0
  118. package/src/components/custom/Fatigue/LiveFatiguePanel.tsx +54 -83
  119. package/src/components/custom/Fatigue/README.md +40 -3
  120. package/src/components/custom/Fatigue/RomProgressionChart.stories.tsx +2 -2
  121. package/src/components/custom/Fatigue/SilverRedPalette.stories.tsx +2 -1
  122. package/src/components/custom/Fatigue/VelocityHero.stories.tsx +4 -3
  123. package/src/components/custom/Fatigue/VerdictHero.stories.tsx +2 -2
  124. package/src/components/custom/Fatigue/fatigue-mock.test.ts +0 -5
  125. package/src/components/custom/Fatigue/fatigue-mock.ts +2 -10
  126. package/src/components/custom/Fatigue/fatigue-tokens.ts +12 -0
  127. package/src/components/custom/Fatigue/index.ts +17 -5
  128. package/src/components/custom/Fatigue/panel-layout.test.ts +149 -0
  129. package/src/components/custom/Fatigue/panel-layout.ts +185 -0
  130. package/src/components/custom/Gauge/Gauge.stories.tsx +2 -2
  131. package/src/components/custom/Gauge/Gauge.test.tsx +1 -1
  132. package/src/components/custom/Gauge/Gauge.tsx +4 -1
  133. package/src/components/custom/Metric/Metric.stories.tsx +10 -1
  134. package/src/components/custom/Metric/Metric.test.tsx +1 -3
  135. package/src/components/custom/Metric/Metric.tsx +5 -20
  136. package/src/components/custom/Prose/MarkdownProse.stories.tsx +88 -0
  137. package/src/components/custom/Prose/MarkdownProse.test.tsx +87 -0
  138. package/src/components/custom/Prose/MarkdownProse.tsx +201 -0
  139. package/src/components/custom/Prose/README.md +58 -0
  140. package/src/components/custom/Prose/index.ts +1 -0
  141. package/src/components/custom/Scatter/Scatter.stories.tsx +46 -8
  142. package/src/components/custom/Scatter/Scatter.test.tsx +2 -2
  143. package/src/components/custom/Scatter/Scatter.tsx +116 -14
  144. package/src/components/custom/Sidebar/Sidebar.stories.tsx +40 -7
  145. package/src/components/custom/Sidebar/Sidebar.test.tsx +5 -1
  146. package/src/components/custom/Sidebar/Sidebar.tsx +16 -33
  147. package/src/components/custom/Table/Table.stories.tsx +98 -15
  148. package/src/components/custom/Table/Table.test.tsx +273 -86
  149. package/src/components/custom/Table/Table.tsx +159 -67
  150. package/src/components/custom/Table/column-fit.test.ts +75 -0
  151. package/src/components/custom/Table/column-fit.ts +116 -0
  152. package/src/components/custom/Table/index.ts +9 -0
  153. package/src/components/custom/TimerReadout/TimerReadout.stories.tsx +8 -6
  154. package/src/components/custom/Treemap/Treemap.stories.tsx +2 -2
  155. package/src/components/custom/Treemap/Treemap.test.tsx +1 -1
  156. package/src/components/custom/Treemap/Treemap.tsx +7 -2
  157. package/src/components/custom/Typography/Typography.stories.tsx +28 -1
  158. package/src/components/custom/Typography/Typography.test.tsx +34 -0
  159. package/src/components/custom/Typography/Typography.tsx +6 -0
  160. package/src/components/custom/Typography/index.ts +1 -8
  161. package/src/components/custom/Workout/ActiveWorkoutPage.stories.tsx +9 -1
  162. package/src/components/custom/Workout/BaseBadge.stories.tsx +19 -7
  163. package/src/components/custom/Workout/BaseBadge.test.tsx +31 -11
  164. package/src/components/custom/Workout/BaseBadge.tsx +3 -0
  165. package/src/components/custom/Workout/BodyMap.stories.tsx +4 -1
  166. package/src/components/custom/Workout/BodyMap.tsx +3 -1
  167. package/src/components/custom/Workout/BodyMapDetailPanel.stories.tsx +16 -4
  168. package/src/components/custom/Workout/BodyMapDetailPanel.test.tsx +11 -15
  169. package/src/components/custom/Workout/BodyMapDetailPanel.tsx +45 -9
  170. package/src/components/custom/Workout/CapacityBandChart.stories.tsx +10 -8
  171. package/src/components/custom/Workout/CapacityBandChart.test.tsx +24 -51
  172. package/src/components/custom/Workout/CapacityBandChart.tsx +139 -108
  173. package/src/components/custom/Workout/DeviationBar.stories.tsx +1 -1
  174. package/src/components/custom/Workout/DeviationBar.test.tsx +5 -2
  175. package/src/components/custom/Workout/DeviationBar.tsx +21 -16
  176. package/src/components/custom/Workout/DualVelocityStrip.stories.tsx +182 -0
  177. package/src/components/custom/Workout/DualVelocityStrip.test.tsx +3 -2
  178. package/src/components/custom/Workout/ExerciseCard.stories.tsx +8 -7
  179. package/src/components/custom/Workout/ExerciseCard.test.tsx +13 -3
  180. package/src/components/custom/Workout/ExerciseCard.tsx +42 -51
  181. package/src/components/custom/Workout/ExerciseCardHeading.stories.tsx +7 -7
  182. package/src/components/custom/Workout/ExerciseDetailPage.stories.tsx +9 -1
  183. package/src/components/custom/Workout/ExerciseHeading.stories.tsx +8 -8
  184. package/src/components/custom/Workout/ExerciseHeading.tsx +8 -5
  185. package/src/components/custom/Workout/ExerciseIndicator.stories.tsx +6 -4
  186. package/src/components/custom/Workout/ExerciseIndicator.test.tsx +27 -11
  187. package/src/components/custom/Workout/ExerciseIndicator.tsx +14 -15
  188. package/src/components/custom/Workout/FatigueMeter.stories.tsx +5 -5
  189. package/src/components/custom/Workout/InputBar.stories.tsx +4 -5
  190. package/src/components/custom/Workout/IntensityBar.stories.tsx +1 -1
  191. package/src/components/custom/Workout/IntensityBar.test.tsx +5 -1
  192. package/src/components/custom/Workout/IntensityBar.tsx +4 -2
  193. package/src/components/custom/Workout/LiveAuraFrame.stories.tsx +5 -4
  194. package/src/components/custom/Workout/MesoCard.stories.tsx +4 -1
  195. package/src/components/custom/Workout/MesoCard.test.tsx +7 -18
  196. package/src/components/custom/Workout/MesoCard.tsx +12 -9
  197. package/src/components/custom/Workout/MesoProgressBar.stories.tsx +1 -1
  198. package/src/components/custom/Workout/MesoProgressBar.test.tsx +18 -11
  199. package/src/components/custom/Workout/MesoProgressBar.tsx +15 -13
  200. package/src/components/custom/Workout/MesoStatusCard.stories.tsx +2 -1
  201. package/src/components/custom/Workout/MesoStatusCard.test.tsx +14 -44
  202. package/src/components/custom/Workout/MesoStatusCard.tsx +9 -23
  203. package/src/components/custom/Workout/MetricTiles.stories.tsx +3 -2
  204. package/src/components/custom/Workout/MuscleGroupChip.stories.tsx +2 -8
  205. package/src/components/custom/Workout/MuscleGroupChip.test.tsx +23 -31
  206. package/src/components/custom/Workout/MuscleGroupChip.tsx +28 -67
  207. package/src/components/custom/Workout/PlaceholderStrip.stories.tsx +1 -1
  208. package/src/components/custom/Workout/PlaceholderStrip.test.tsx +17 -10
  209. package/src/components/custom/Workout/PlaceholderStrip.tsx +9 -8
  210. package/src/components/custom/Workout/PrBadge.stories.tsx +2 -1
  211. package/src/components/custom/Workout/PrBadge.test.tsx +3 -9
  212. package/src/components/custom/Workout/PrBadge.tsx +13 -17
  213. package/src/components/custom/Workout/PrHistoryModal.stories.tsx +4 -1
  214. package/src/components/custom/Workout/PrHistoryModal.test.tsx +13 -36
  215. package/src/components/custom/Workout/PrHistoryModal.tsx +8 -4
  216. package/src/components/custom/Workout/ProgramPlanningPage.stories.tsx +6 -1
  217. package/src/components/custom/Workout/README.md +12 -7
  218. package/src/components/custom/Workout/ReadinessCheck.stories.tsx +3 -2
  219. package/src/components/custom/Workout/ReadinessCheck.test.tsx +12 -18
  220. package/src/components/custom/Workout/ReadinessCheck.tsx +19 -3
  221. package/src/components/custom/Workout/RestTimer.stories.tsx +3 -2
  222. package/src/components/custom/Workout/ScheduleTiles.stories.tsx +3 -2
  223. package/src/components/custom/Workout/ScheduleTiles.test.tsx +3 -4
  224. package/src/components/custom/Workout/ScheduleTiles.tsx +4 -7
  225. package/src/components/custom/Workout/SegmentedBar.stories.tsx +5 -5
  226. package/src/components/custom/Workout/SegmentedBar.tsx +6 -2
  227. package/src/components/custom/Workout/SegmentedProgressBar.stories.tsx +5 -5
  228. package/src/components/custom/Workout/SessionHeader.stories.tsx +6 -6
  229. package/src/components/custom/Workout/SessionHeader.tsx +12 -12
  230. package/src/components/custom/Workout/SessionRail.stories.tsx +12 -11
  231. package/src/components/custom/Workout/SessionRail.tsx +7 -9
  232. package/src/components/custom/Workout/SetBar.stories.tsx +10 -6
  233. package/src/components/custom/Workout/SetBar.test.tsx +49 -4
  234. package/src/components/custom/Workout/SetBar.tsx +38 -12
  235. package/src/components/custom/Workout/SetRow.stories.tsx +3 -2
  236. package/src/components/custom/Workout/SetRow.test.tsx +16 -2
  237. package/src/components/custom/Workout/SetRow.tsx +61 -23
  238. package/src/components/custom/Workout/SetStrip.stories.tsx +60 -5
  239. package/src/components/custom/Workout/SetStrip.test.tsx +25 -0
  240. package/src/components/custom/Workout/SetStrip.tsx +24 -4
  241. package/src/components/custom/Workout/SetTableHeader.stories.tsx +6 -6
  242. package/src/components/custom/Workout/SetTableHeader.tsx +9 -12
  243. package/src/components/custom/Workout/SetsRepsLoad.stories.tsx +7 -7
  244. package/src/components/custom/Workout/SetsRepsLoad.tsx +3 -5
  245. package/src/components/custom/Workout/Sparkline.stories.tsx +1 -1
  246. package/src/components/custom/Workout/Sparkline.test.tsx +37 -19
  247. package/src/components/custom/Workout/Sparkline.tsx +14 -18
  248. package/src/components/custom/Workout/StatusDot.stories.tsx +1 -1
  249. package/src/components/custom/Workout/StatusDot.test.tsx +44 -5
  250. package/src/components/custom/Workout/StatusDot.tsx +93 -63
  251. package/src/components/custom/Workout/StatusPill.stories.tsx +1 -1
  252. package/src/components/custom/Workout/StatusPill.test.tsx +6 -15
  253. package/src/components/custom/Workout/StatusPill.tsx +27 -38
  254. package/src/components/custom/Workout/StrengthTrendChart.stories.tsx +9 -3
  255. package/src/components/custom/Workout/StrengthTrendChart.test.tsx +15 -37
  256. package/src/components/custom/Workout/StrengthTrendChart.tsx +31 -30
  257. package/src/components/custom/Workout/SupersetWrapper.stories.tsx +27 -64
  258. package/src/components/custom/Workout/SupersetWrapper.test.tsx +16 -14
  259. package/src/components/custom/Workout/SupersetWrapper.tsx +17 -21
  260. package/src/components/custom/Workout/TempoDisplay.stories.tsx +22 -7
  261. package/src/components/custom/Workout/TempoDisplay.test.tsx +18 -4
  262. package/src/components/custom/Workout/TrainingStatusPage.stories.tsx +9 -1
  263. package/src/components/custom/Workout/VelocityStrip.compact.stories.tsx +4 -1
  264. package/src/components/custom/Workout/VelocityStrip.dual.stories.tsx +7 -4
  265. package/src/components/custom/Workout/VelocityStrip.expanded.stories.tsx +4 -1
  266. package/src/components/custom/Workout/VelocityStrip.hero.stories.tsx +4 -1
  267. package/src/components/custom/Workout/VelocityStrip.stories.tsx +12 -6
  268. package/src/components/custom/Workout/VelocityStrip.tsx +3 -0
  269. package/src/components/custom/Workout/VolumeLandmarkBar.stories.tsx +6 -7
  270. package/src/components/custom/Workout/VolumeLandmarkBar.tsx +15 -6
  271. package/src/components/custom/Workout/WeekRow.stories.tsx +4 -1
  272. package/src/components/custom/Workout/WeekRow.test.tsx +18 -15
  273. package/src/components/custom/Workout/WeekRow.tsx +23 -16
  274. package/src/components/custom/Workout/WeightBadge.stories.tsx +2 -1
  275. package/src/components/custom/Workout/WeightBadge.test.tsx +50 -19
  276. package/src/components/custom/Workout/WeightBadge.tsx +28 -27
  277. package/src/components/custom/Workout/WorkoutCard.stories.tsx +6 -1
  278. package/src/components/custom/Workout/WorkoutCard.test.tsx +18 -0
  279. package/src/components/custom/Workout/WorkoutCard.tsx +35 -57
  280. package/src/components/custom/Workout/WorkoutPill.stories.tsx +5 -2
  281. package/src/components/custom/Workout/WorkoutPill.test.tsx +39 -7
  282. package/src/components/custom/Workout/WorkoutPill.tsx +88 -57
  283. package/src/components/custom/Workout/ZoneTrack.stories.tsx +7 -6
  284. package/src/components/custom/Workout/ZoneTrack.tsx +10 -9
  285. package/src/components/custom/Workout/index.ts +5 -0
  286. package/src/components/custom/Workout/metricText.stories.tsx +6 -5
  287. package/src/components/custom/Workout/metricText.tsx +4 -0
  288. package/src/components/custom/Workout/setHeadingKit.tsx +207 -26
  289. package/src/components/custom/charts/README.md +61 -0
  290. package/src/components/custom/charts/SetBarChart.test.tsx +30 -1
  291. package/src/components/custom/charts/SetBarChart.tsx +42 -4
  292. package/src/components/custom/charts/SparkBars.stories.tsx +55 -0
  293. package/src/components/custom/charts/SparkBars.test.tsx +69 -0
  294. package/src/components/custom/charts/SparkBars.tsx +85 -0
  295. package/src/components/custom/charts/index.ts +3 -0
  296. package/src/components/custom/index.ts +3 -0
  297. package/src/components/custom/stepper/Stepper.stories.tsx +13 -10
  298. package/src/components/custom/stepper/Stepper.test.tsx +1 -7
  299. package/src/components/custom/stepper/Stepper.tsx +13 -28
  300. package/src/components/icons/icons.stories.tsx +1 -1
  301. package/src/components/icons/icons.tsx +51 -0
  302. package/src/components/shell/AppShell.stories.tsx +150 -0
  303. package/src/components/shell/AppShell.test.tsx +70 -0
  304. package/src/components/shell/AppShell.tsx +90 -0
  305. package/src/components/shell/BrandLockup.stories.tsx +66 -5
  306. package/src/components/shell/BrandLockup.test.tsx +34 -1
  307. package/src/components/shell/BrandLockup.tsx +27 -11
  308. package/src/components/shell/NavItem.stories.tsx +4 -4
  309. package/src/components/shell/NavItem.test.tsx +17 -0
  310. package/src/components/shell/NavItem.tsx +17 -5
  311. package/src/components/shell/README.md +90 -27
  312. package/src/components/shell/SideNav.stories.tsx +38 -7
  313. package/src/components/shell/SideNav.test.tsx +16 -8
  314. package/src/components/shell/SideNav.tsx +17 -17
  315. package/src/components/shell/TopBar.stories.tsx +44 -19
  316. package/src/components/shell/TopBar.test.tsx +34 -12
  317. package/src/components/shell/TopBar.tsx +61 -40
  318. package/src/components/shell/brands.tsx +66 -0
  319. package/src/components/shell/index.ts +9 -8
  320. package/src/components/shell/{DeviceIndicator.stories.tsx → workout/DeviceIndicator.stories.tsx} +2 -2
  321. package/src/components/shell/{DeviceIndicator.tsx → workout/DeviceIndicator.tsx} +2 -2
  322. package/src/components/shell/{DeviceMenu.stories.tsx → workout/DeviceMenu.stories.tsx} +2 -2
  323. package/src/components/shell/{DeviceMenu.tsx → workout/DeviceMenu.tsx} +3 -3
  324. package/src/components/shell/{DeviceRow.stories.tsx → workout/DeviceRow.stories.tsx} +2 -2
  325. package/src/components/shell/{DeviceRow.tsx → workout/DeviceRow.tsx} +3 -3
  326. package/src/components/shell/{SessionStatePill.stories.tsx → workout/SessionStatePill.stories.tsx} +2 -2
  327. package/src/components/shell/{SessionStatePill.tsx → workout/SessionStatePill.tsx} +5 -3
  328. package/src/components/shell/workout/WorkoutShell.stories.tsx +71 -0
  329. package/src/components/shell/{DashboardShell.test.tsx → workout/WorkoutShell.test.tsx} +19 -8
  330. package/src/components/shell/workout/WorkoutShell.tsx +77 -0
  331. package/src/components/shell/workout/WorkoutTopBar.stories.tsx +58 -0
  332. package/src/components/shell/workout/WorkoutTopBar.test.tsx +39 -0
  333. package/src/components/shell/workout/WorkoutTopBar.tsx +52 -0
  334. package/src/components/shell/workout/index.ts +9 -0
  335. package/src/components/shell/workout/workoutNavItems.tsx +16 -0
  336. package/src/components/ui/README.md +110 -0
  337. package/src/components/ui/alert/Alert.stories.tsx +1 -1
  338. package/src/components/ui/autocomplete/Autocomplete.stories.tsx +11 -13
  339. package/src/components/ui/autocomplete/Autocomplete.test.tsx +7 -25
  340. package/src/components/ui/autocomplete/Autocomplete.tsx +21 -28
  341. package/src/components/ui/avatar/Avatar.stories.tsx +1 -1
  342. package/src/components/ui/avatar/Avatar.tsx +2 -10
  343. package/src/components/ui/badge/Badge.stories.tsx +83 -28
  344. package/src/components/ui/badge/Badge.test.tsx +19 -3
  345. package/src/components/ui/badge/Badge.tsx +48 -55
  346. package/src/components/ui/breadcrumbs/Breadcrumbs.stories.tsx +1 -1
  347. package/src/components/ui/breadcrumbs/Breadcrumbs.tsx +4 -16
  348. package/src/components/ui/button/Button.stories.tsx +46 -12
  349. package/src/components/ui/button/Button.tsx +32 -25
  350. package/src/components/ui/card/Card.stories.tsx +90 -94
  351. package/src/components/ui/card/Card.test.tsx +80 -6
  352. package/src/components/ui/card/Card.tsx +150 -203
  353. package/src/components/ui/checkbox/Checkbox.stories.tsx +1 -1
  354. package/src/components/ui/checkbox/Checkbox.tsx +6 -26
  355. package/src/components/ui/chip/Chip.stories.tsx +37 -13
  356. package/src/components/ui/chip/Chip.test.tsx +10 -6
  357. package/src/components/ui/chip/Chip.tsx +76 -91
  358. package/src/components/ui/collapse/Collapse.stories.tsx +23 -23
  359. package/src/components/ui/collapse/Collapse.tsx +6 -11
  360. package/src/components/ui/data-row/DataRow.stories.tsx +9 -2
  361. package/src/components/ui/data-row/DataRow.test.tsx +5 -15
  362. package/src/components/ui/data-row/DataRow.tsx +18 -7
  363. package/src/components/ui/divider/Divider.stories.tsx +1 -1
  364. package/src/components/ui/divider/Divider.tsx +1 -5
  365. package/src/components/ui/drawer/Drawer.stories.tsx +5 -16
  366. package/src/components/ui/drawer/Drawer.tsx +13 -30
  367. package/src/components/ui/floating-overlay-depth.test.tsx +143 -0
  368. package/src/components/ui/form-field/FormField.stories.tsx +6 -20
  369. package/src/components/ui/form-field/FormField.test.tsx +1 -5
  370. package/src/components/ui/form-field/FormField.tsx +10 -46
  371. package/src/components/ui/help-tip/HelpTip.stories.tsx +8 -19
  372. package/src/components/ui/help-tip/HelpTip.test.tsx +1 -3
  373. package/src/components/ui/help-tip/HelpTip.tsx +21 -22
  374. package/src/components/ui/help-tip/index.ts +7 -1
  375. package/src/components/ui/icon-box/IconBox.stories.tsx +1 -1
  376. package/src/components/ui/icon-box/IconBox.test.tsx +1 -7
  377. package/src/components/ui/icon-box/IconBox.tsx +2 -12
  378. package/src/components/ui/indicator/Indicator.stories.tsx +1 -1
  379. package/src/components/ui/indicator/Indicator.tsx +20 -14
  380. package/src/components/ui/input/Input.stories.tsx +3 -11
  381. package/src/components/ui/input/Input.test.tsx +2 -10
  382. package/src/components/ui/input/Input.tsx +10 -25
  383. package/src/components/ui/input/index.ts +7 -1
  384. package/src/components/ui/link/Link.stories.tsx +19 -7
  385. package/src/components/ui/list-item/ListItem.stories.tsx +11 -2
  386. package/src/components/ui/list-item/ListItem.tsx +2 -9
  387. package/src/components/ui/menu/Menu.stories.tsx +21 -15
  388. package/src/components/ui/menu/Menu.test.tsx +2 -11
  389. package/src/components/ui/menu/Menu.tsx +12 -14
  390. package/src/components/ui/menu/index.ts +8 -1
  391. package/src/components/ui/modal/Modal.stories.tsx +2 -2
  392. package/src/components/ui/modal/Modal.tsx +29 -19
  393. package/src/components/ui/pill/Pill.stories.tsx +58 -23
  394. package/src/components/ui/pill/Pill.test.tsx +101 -3
  395. package/src/components/ui/pill/Pill.tsx +164 -49
  396. package/src/components/ui/pill/index.ts +1 -1
  397. package/src/components/ui/popover/Popover.stories.tsx +5 -7
  398. package/src/components/ui/popover/Popover.test.tsx +1 -6
  399. package/src/components/ui/popover/Popover.tsx +20 -15
  400. package/src/components/ui/popover/index.ts +7 -1
  401. package/src/components/ui/progress/Progress.stories.tsx +3 -12
  402. package/src/components/ui/progress/Progress.test.tsx +1 -5
  403. package/src/components/ui/radio/Radio.stories.tsx +42 -21
  404. package/src/components/ui/radio/Radio.test.tsx +6 -2
  405. package/src/components/ui/radio/Radio.tsx +23 -22
  406. package/src/components/ui/section/Section.stories.tsx +5 -14
  407. package/src/components/ui/section/Section.test.tsx +1 -6
  408. package/src/components/ui/section/Section.tsx +1 -3
  409. package/src/components/ui/section/index.ts +1 -5
  410. package/src/components/ui/select/Select.stories.tsx +3 -13
  411. package/src/components/ui/select/Select.test.tsx +2 -11
  412. package/src/components/ui/select/Select.tsx +14 -14
  413. package/src/components/ui/skeleton/Skeleton.stories.tsx +3 -11
  414. package/src/components/ui/skeleton/Skeleton.tsx +3 -14
  415. package/src/components/ui/skeleton/index.ts +1 -7
  416. package/src/components/ui/spinner/Spinner.stories.tsx +1 -1
  417. package/src/components/ui/spinner/Spinner.tsx +1 -4
  418. package/src/components/ui/stack/Stack.stories.tsx +1 -1
  419. package/src/components/ui/stack/Stack.tsx +1 -1
  420. package/src/components/ui/surface/Surface.stories.tsx +17 -5
  421. package/src/components/ui/surface/Surface.test.tsx +88 -28
  422. package/src/components/ui/surface/Surface.tsx +37 -87
  423. package/src/components/ui/surface/SurfaceContext.ts +22 -62
  424. package/src/components/ui/surface/index.ts +8 -0
  425. package/src/components/ui/surface/resolveSurface.ts +98 -0
  426. package/src/components/ui/surface/surface.contract.test.ts +6 -1
  427. package/src/components/ui/switch/Switch.stories.tsx +1 -1
  428. package/src/components/ui/switch/Switch.tsx +7 -6
  429. package/src/components/ui/tabs/Tabs.stories.tsx +1 -1
  430. package/src/components/ui/tabs/Tabs.tsx +7 -22
  431. package/src/components/ui/tabs/index.ts +1 -7
  432. package/src/components/ui/tile/Tile.stories.tsx +1 -1
  433. package/src/components/ui/tile/Tile.tsx +3 -0
  434. package/src/components/ui/toast/Toast.stories.tsx +1 -1
  435. package/src/components/ui/toast/Toast.test.tsx +2 -8
  436. package/src/components/ui/toast/Toast.tsx +43 -53
  437. package/src/components/ui/toast/index.ts +0 -1
  438. package/src/components/ui/toolbar-button/ToolbarButton.stories.tsx +92 -71
  439. package/src/components/ui/toolbar-button/ToolbarButton.test.tsx +3 -18
  440. package/src/components/ui/toolbar-button/ToolbarButton.tsx +25 -43
  441. package/src/components/ui/tooltip/Tooltip.stories.tsx +12 -3
  442. package/src/components/ui/tooltip/Tooltip.test.tsx +21 -3
  443. package/src/components/ui/tooltip/Tooltip.tsx +55 -36
  444. package/src/components/ui/tooltip/index.ts +1 -1
  445. package/src/components/ui/trigger/TriggerSurface.test.tsx +215 -0
  446. package/src/components/ui/trigger/TriggerSurface.tsx +81 -0
  447. package/src/components/ui/trigger/index.ts +2 -0
  448. package/src/stories/PresetShowcase.stories.tsx +100 -47
  449. package/src/test/no-device-internals.test.ts +3 -3
  450. package/src/theme/ChoosingTokens.stories.tsx +48 -0
  451. package/src/theme/ColorPalettes.stories.tsx +62 -45
  452. package/src/theme/ColorPrimitives.stories.tsx +35 -35
  453. package/src/theme/Depth.stories.tsx +132 -65
  454. package/src/theme/DepthCalibration.stories.tsx +24 -22
  455. package/src/theme/ThemeProvider.test.tsx +4 -4
  456. package/src/theme/barrel.ts +7 -6
  457. package/src/theme/color-stories.coverage.test.ts +1 -1
  458. package/src/theme/color-utils.ts +41 -29
  459. package/src/theme/config.completeness.test.ts +1 -1
  460. package/src/theme/config.ts +28 -0
  461. package/src/theme/elevation.test.ts +82 -56
  462. package/src/theme/elevation.ts +77 -561
  463. package/src/theme/global.css +30 -2
  464. package/src/theme/grey-ramp.test.ts +24 -8
  465. package/src/theme/lift.test.ts +39 -0
  466. package/src/theme/lift.ts +102 -0
  467. package/src/theme/materials.test.ts +5 -2
  468. package/src/theme/materials.ts +38 -4
  469. package/src/theme/native-theming-guard.test.ts +5 -5
  470. package/src/theme/presets/apply.ts +4 -0
  471. package/src/theme/presets/audiobook.ts +5 -2
  472. package/src/theme/presets/default.ts +4 -0
  473. package/src/theme/presets/index.ts +14 -1
  474. package/src/theme/presets/types.ts +1 -1
  475. package/src/theme/semantic-contrast.test.ts +13 -4
  476. package/src/theme/status-distinctness.test.ts +66 -0
  477. package/src/theme/surface-planes.test.ts +37 -0
  478. package/src/theme/surface-planes.ts +68 -0
  479. package/src/theme/token-export-guard.test.ts +102 -0
  480. package/src/theme/tokens/primitives.test.ts +15 -7
  481. package/src/theme/tokens/primitives.ts +67 -35
  482. package/src/theme/tokens/semantic.ts +71 -37
  483. package/src/theme/wash-ladder.test.ts +58 -0
  484. package/src/theme/workout-tokens.ts +1 -7
  485. package/src/types/jest-axe.d.ts +2 -6
  486. package/src/types/raw-md.d.ts +5 -0
  487. package/src/utils/colors.ts +4 -4
  488. package/src/utils/form.ts +1 -3
  489. package/src/utils/index.ts +2 -7
  490. package/src/utils/number-format.ts +17 -0
  491. package/src/utils/workout-format.ts +15 -6
  492. package/src/web-jsx/jsx-runtime.ts +1 -5
  493. package/tailwind.config.js +5 -0
  494. package/src/components/custom/Workout/ExerciseCardUnified.stories.tsx +0 -151
  495. package/src/components/custom/Workout/RowInventory.stories.tsx +0 -408
  496. package/src/components/custom/Workout/S3FullRail.stories.tsx +0 -46
  497. package/src/components/custom/Workout/S3SessionPace.stories.tsx +0 -95
  498. package/src/components/custom/Workout/S3SessionRailHeading.stories.tsx +0 -61
  499. package/src/components/custom/Workout/S3SetTypes.stories.tsx +0 -176
  500. package/src/components/custom/Workout/S3WorkoutExpansion.stories.tsx +0 -240
  501. package/src/components/shell/DashboardShell.stories.tsx +0 -65
  502. package/src/components/shell/DashboardShell.tsx +0 -75
  503. package/src/components/shell/SessionRailSpecimen.stories.tsx +0 -753
  504. package/src/theme/elevation.stories.tsx +0 -346
  505. package/src/utils/useTheme.ts +0 -72
  506. /package/src/components/shell/{DeviceIndicator.test.tsx → workout/DeviceIndicator.test.tsx} +0 -0
  507. /package/src/components/shell/{DeviceMenu.test.tsx → workout/DeviceMenu.test.tsx} +0 -0
  508. /package/src/components/shell/{DeviceRow.test.tsx → workout/DeviceRow.test.tsx} +0 -0
  509. /package/src/components/shell/{SessionStatePill.test.tsx → workout/SessionStatePill.test.tsx} +0 -0
@@ -25,13 +25,7 @@ describe('Input', () => {
25
25
  })
26
26
 
27
27
  it('displays error message when isInvalid', () => {
28
- render(
29
- <Input
30
- isInvalid
31
- errorMessage="Invalid input"
32
- helperText="This should not show"
33
- />
34
- )
28
+ render(<Input isInvalid errorMessage="Invalid input" helperText="This should not show" />)
35
29
  expect(screen.getByText('Invalid input')).toBeInTheDocument()
36
30
  expect(screen.queryByText('This should not show')).not.toBeInTheDocument()
37
31
  })
@@ -62,9 +56,7 @@ describe('Input', () => {
62
56
 
63
57
  describe('accessibility', () => {
64
58
  it('has no accessibility violations', async () => {
65
- const { container } = render(
66
- <Input label="Email" placeholder="Enter your email" />
67
- )
59
+ const { container } = render(<Input label="Email" placeholder="Enter your email" />)
68
60
 
69
61
  const results = await axe(container)
70
62
  expect(results).toHaveNoViolations()
@@ -50,7 +50,10 @@ const multilineSizeStyles: Record<InputSize, string> = {
50
50
  lg: 'min-h-[120px] px-4 py-3 text-lg',
51
51
  }
52
52
 
53
- const variantStyles: Record<InputVariant, { base: string; focus: string; hover: string; error: string }> = {
53
+ const variantStyles: Record<
54
+ InputVariant,
55
+ { base: string; focus: string; hover: string; error: string }
56
+ > = {
54
57
  outline: {
55
58
  base: 'border border-border-input rounded-md bg-transparent',
56
59
  hover: 'web:hover:border-border-input-hover',
@@ -146,11 +149,7 @@ export const Input = forwardRef<TextInput, InputProps>(function Input(
146
149
  isDisabled && 'opacity-40 cursor-not-allowed'
147
150
  )}
148
151
  >
149
- {leftElement && (
150
- <View className={cn('pl-3 pr-1', multiline && 'pt-3')}>
151
- {leftElement}
152
- </View>
153
- )}
152
+ {leftElement && <View className={cn('pl-3 pr-1', multiline && 'pt-3')}>{leftElement}</View>}
154
153
 
155
154
  <TextInput
156
155
  ref={ref}
@@ -176,23 +175,13 @@ export const Input = forwardRef<TextInput, InputProps>(function Input(
176
175
  />
177
176
 
178
177
  {rightElement && (
179
- <View className={cn('pl-1 pr-3', multiline && 'pt-3')}>
180
- {rightElement}
181
- </View>
178
+ <View className={cn('pl-1 pr-3', multiline && 'pt-3')}>{rightElement}</View>
182
179
  )}
183
180
  </View>
184
181
 
185
- {showHelper && (
186
- <Text className="mt-1.5 text-xs text-text-secondary">
187
- {helperText}
188
- </Text>
189
- )}
182
+ {showHelper && <Text className="mt-1.5 text-xs text-text-secondary">{helperText}</Text>}
190
183
 
191
- {showError && (
192
- <Text className="mt-1.5 text-xs text-status-error">
193
- {errorMessage}
194
- </Text>
195
- )}
184
+ {showError && <Text className="mt-1.5 text-xs text-status-error">{errorMessage}</Text>}
196
185
  </View>
197
186
  )
198
187
  })
@@ -206,11 +195,7 @@ export interface InputGroupProps {
206
195
  * Container for grouping related inputs.
207
196
  */
208
197
  export function InputGroup({ children, className }: InputGroupProps) {
209
- return (
210
- <View className={cn('flex-col gap-4', className)}>
211
- {children}
212
- </View>
213
- )
198
+ return <View className={cn('flex-col gap-4', className)}>{children}</View>
214
199
  }
215
200
 
216
201
  export interface PasswordInputProps extends Omit<InputProps, 'secureTextEntry' | 'rightElement'> {
@@ -264,7 +249,7 @@ export const PasswordInput = forwardRef<TextInput, PasswordInputProps>(function
264
249
  accessibilityLabel={isVisible ? 'Hide password' : 'Show password'}
265
250
  className="p-1 rounded active:opacity-70"
266
251
  >
267
- {isVisible ? (hideIcon || defaultHideIcon) : (showIcon || defaultShowIcon)}
252
+ {isVisible ? hideIcon || defaultHideIcon : showIcon || defaultShowIcon}
268
253
  </Pressable>
269
254
  }
270
255
  {...props}
@@ -1,2 +1,8 @@
1
1
  export { Input, InputGroup, PasswordInput } from './Input'
2
- export type { InputProps, InputGroupProps, PasswordInputProps, InputSize, InputVariant } from './Input'
2
+ export type {
3
+ InputProps,
4
+ InputGroupProps,
5
+ PasswordInputProps,
6
+ InputSize,
7
+ InputVariant,
8
+ } from './Input'
@@ -5,7 +5,7 @@ import { Link } from './Link'
5
5
  const meta: Meta<typeof Link> = {
6
6
  title: 'Components/Atoms/Link',
7
7
  component: Link,
8
- tags: ['autodocs'],
8
+ tags: ['autodocs', 'status:stable', '!status:review'],
9
9
  argTypes: {
10
10
  color: {
11
11
  control: 'select',
@@ -43,9 +43,15 @@ export const Default: Story = {
43
43
  export const AllColors: Story = {
44
44
  render: () => (
45
45
  <View style={{ flexDirection: 'row', gap: 16 }}>
46
- <Link color="default" onPress={() => {}}>Default</Link>
47
- <Link color="primary" onPress={() => {}}>Primary</Link>
48
- <Link color="secondary" onPress={() => {}}>Secondary</Link>
46
+ <Link color="default" onPress={() => {}}>
47
+ Default
48
+ </Link>
49
+ <Link color="primary" onPress={() => {}}>
50
+ Primary
51
+ </Link>
52
+ <Link color="secondary" onPress={() => {}}>
53
+ Secondary
54
+ </Link>
49
55
  </View>
50
56
  ),
51
57
  }
@@ -53,9 +59,15 @@ export const AllColors: Story = {
53
59
  export const UnderlineStyles: Story = {
54
60
  render: () => (
55
61
  <View style={{ flexDirection: 'row', gap: 16 }}>
56
- <Link underline="always" onPress={() => {}}>Always</Link>
57
- <Link underline="hover" onPress={() => {}}>Hover</Link>
58
- <Link underline="none" onPress={() => {}}>None</Link>
62
+ <Link underline="always" onPress={() => {}}>
63
+ Always
64
+ </Link>
65
+ <Link underline="hover" onPress={() => {}}>
66
+ Hover
67
+ </Link>
68
+ <Link underline="none" onPress={() => {}}>
69
+ None
70
+ </Link>
59
71
  </View>
60
72
  ),
61
73
  }
@@ -10,7 +10,16 @@ import {
10
10
 
11
11
  function UserIcon({ size = 20 }: { size?: number; className?: string }) {
12
12
  return (
13
- <View style={{ width: size, height: size, borderRadius: size / 2, backgroundColor: '#6366f1', justifyContent: 'center', alignItems: 'center' }}>
13
+ <View
14
+ style={{
15
+ width: size,
16
+ height: size,
17
+ borderRadius: size / 2,
18
+ backgroundColor: '#6366f1',
19
+ justifyContent: 'center',
20
+ alignItems: 'center',
21
+ }}
22
+ >
14
23
  <Text style={{ color: '#fff', fontSize: size * 0.5, fontWeight: '600' }}>U</Text>
15
24
  </View>
16
25
  )
@@ -47,7 +56,7 @@ function ChevronRight({ size = 16 }: { size?: number }) {
47
56
  const meta: Meta<typeof ListItem> = {
48
57
  title: 'Components/Molecules/ListItem',
49
58
  component: ListItem,
50
- tags: ['autodocs'],
59
+ tags: ['autodocs', 'status:stable', '!status:review'],
51
60
  }
52
61
 
53
62
  export default meta
@@ -50,9 +50,7 @@ export function ListItemContent({ title, subtitle, className, ...props }: ListIt
50
50
  return (
51
51
  <View className={cn('flex-1 justify-center', className)} {...props}>
52
52
  <Text className="text-sm font-medium text-text-primary">{title}</Text>
53
- {subtitle && (
54
- <Text className="text-xs text-text-secondary mt-0.5">{subtitle}</Text>
55
- )}
53
+ {subtitle && <Text className="text-xs text-text-secondary mt-0.5">{subtitle}</Text>}
56
54
  </View>
57
55
  )
58
56
  }
@@ -80,10 +78,5 @@ export interface ListItemDividerProps extends ViewProps {
80
78
  }
81
79
 
82
80
  export function ListItemDivider({ inset = true, className, ...props }: ListItemDividerProps) {
83
- return (
84
- <View
85
- className={cn('h-px bg-divider', inset ? 'ml-14' : '', className)}
86
- {...props}
87
- />
88
- )
81
+ return <View className={cn('h-px bg-divider', inset ? 'ml-14' : '', className)} {...props} />
89
82
  }
@@ -68,21 +68,15 @@ export const WithGroups: Story = {
68
68
  }
69
69
 
70
70
  function EditIcon({ size = 14 }: { size?: number }) {
71
- return (
72
- <Text style={{ fontSize: size, lineHeight: size }}>&#9998;</Text>
73
- )
71
+ return <Text style={{ fontSize: size, lineHeight: size }}>&#9998;</Text>
74
72
  }
75
73
 
76
74
  function TrashIcon({ size = 14 }: { size?: number }) {
77
- return (
78
- <Text style={{ fontSize: size, lineHeight: size }}>&#128465;</Text>
79
- )
75
+ return <Text style={{ fontSize: size, lineHeight: size }}>&#128465;</Text>
80
76
  }
81
77
 
82
78
  function CopyIcon({ size = 14 }: { size?: number }) {
83
- return (
84
- <Text style={{ fontSize: size, lineHeight: size }}>&#128203;</Text>
85
- )
79
+ return <Text style={{ fontSize: size, lineHeight: size }}>&#128203;</Text>
86
80
  }
87
81
 
88
82
  export const WithIcons: Story = {
@@ -94,10 +88,16 @@ export const WithIcons: Story = {
94
88
  </Button>
95
89
  </MenuTrigger>
96
90
  <MenuList>
97
- <MenuItem icon={<EditIcon />} onPress={() => {}}>Edit</MenuItem>
98
- <MenuItem icon={<CopyIcon />} onPress={() => {}}>Duplicate</MenuItem>
91
+ <MenuItem icon={<EditIcon />} onPress={() => {}}>
92
+ Edit
93
+ </MenuItem>
94
+ <MenuItem icon={<CopyIcon />} onPress={() => {}}>
95
+ Duplicate
96
+ </MenuItem>
99
97
  <MenuDivider />
100
- <MenuItem icon={<TrashIcon />} onPress={() => {}} isDestructive>Delete</MenuItem>
98
+ <MenuItem icon={<TrashIcon />} onPress={() => {}} isDestructive>
99
+ Delete
100
+ </MenuItem>
101
101
  </MenuList>
102
102
  </Menu>
103
103
  ),
@@ -115,7 +115,9 @@ export const DestructiveItem: Story = {
115
115
  <MenuItem onPress={() => {}}>Edit Profile</MenuItem>
116
116
  <MenuItem onPress={() => {}}>Change Password</MenuItem>
117
117
  <MenuDivider />
118
- <MenuItem onPress={() => {}} isDestructive>Delete Account</MenuItem>
118
+ <MenuItem onPress={() => {}} isDestructive>
119
+ Delete Account
120
+ </MenuItem>
119
121
  </MenuList>
120
122
  </Menu>
121
123
  ),
@@ -152,11 +154,15 @@ export const DisabledItems: Story = {
152
154
  </MenuTrigger>
153
155
  <MenuList>
154
156
  <MenuItem onPress={() => {}}>Undo</MenuItem>
155
- <MenuItem onPress={() => {}} isDisabled>Redo</MenuItem>
157
+ <MenuItem onPress={() => {}} isDisabled>
158
+ Redo
159
+ </MenuItem>
156
160
  <MenuDivider />
157
161
  <MenuItem onPress={() => {}}>Cut</MenuItem>
158
162
  <MenuItem onPress={() => {}}>Copy</MenuItem>
159
- <MenuItem onPress={() => {}} isDisabled>Paste</MenuItem>
163
+ <MenuItem onPress={() => {}} isDisabled>
164
+ Paste
165
+ </MenuItem>
160
166
  </MenuList>
161
167
  </Menu>
162
168
  ),
@@ -1,14 +1,7 @@
1
1
  import { describe, it, expect, vi } from 'vitest'
2
2
  import { render, screen, fireEvent } from '@testing-library/react'
3
3
  import { axe } from 'jest-axe'
4
- import {
5
- Menu,
6
- MenuTrigger,
7
- MenuList,
8
- MenuItem,
9
- MenuDivider,
10
- MenuGroup,
11
- } from './Menu'
4
+ import { Menu, MenuTrigger, MenuList, MenuItem, MenuDivider, MenuGroup } from './Menu'
12
5
 
13
6
  describe('Menu', () => {
14
7
  it('renders trigger element', () => {
@@ -198,9 +191,7 @@ describe('Menu', () => {
198
191
  <button>Options</button>
199
192
  </MenuTrigger>
200
193
  <MenuList>
201
- <MenuItem icon={<span data-testid="edit-icon">pencil</span>}>
202
- Edit
203
- </MenuItem>
194
+ <MenuItem icon={<span data-testid="edit-icon">pencil</span>}>Edit</MenuItem>
204
195
  </MenuList>
205
196
  </Menu>
206
197
  )
@@ -1,6 +1,8 @@
1
1
  import React, { useState, createContext, useContext } from 'react'
2
2
  import { View, Text, Pressable, type ViewProps } from 'react-native'
3
3
  import { cn } from '../../../utils/cn'
4
+ import { Surface } from '../surface'
5
+ import { TriggerSurface } from '../trigger'
4
6
 
5
7
  interface MenuContextType {
6
8
  isOpen: boolean
@@ -80,14 +82,14 @@ export function MenuTrigger({ children, className }: MenuTriggerProps) {
80
82
  const { isOpen, setIsOpen } = useContext(MenuContext)
81
83
 
82
84
  return (
83
- <Pressable
84
- onPress={() => setIsOpen(!isOpen)}
85
+ <TriggerSurface
86
+ handlers={{ onPress: () => setIsOpen(!isOpen) }}
85
87
  accessibilityRole="button"
86
88
  accessibilityState={{ expanded: isOpen }}
87
89
  className={className}
88
90
  >
89
91
  {children}
90
- </Pressable>
92
+ </TriggerSurface>
91
93
  )
92
94
  }
93
95
 
@@ -112,18 +114,19 @@ export function MenuList({ children, className }: MenuListProps) {
112
114
  className="fixed inset-0 z-40"
113
115
  style={{ position: 'absolute' }}
114
116
  />
115
- {/* Menu */}
116
- <View
117
+ {/* Menu — floating: overlay plane + lift, no ring. */}
118
+ <Surface
119
+ elevation={4}
120
+ rounded={false}
117
121
  className={cn(
118
122
  'absolute z-50 top-full left-0 mt-1 min-w-[160px]',
119
- 'bg-surface-elevated rounded-lg shadow-lg border border-hairline',
120
- 'py-1 overflow-hidden',
123
+ 'rounded-lg py-1 overflow-hidden',
121
124
  className
122
125
  )}
123
126
  accessibilityRole="menu"
124
127
  >
125
128
  {children}
126
- </View>
129
+ </Surface>
127
130
  </>
128
131
  )
129
132
  }
@@ -175,12 +178,7 @@ export function MenuItem({
175
178
  )}
176
179
  >
177
180
  {icon && <View className="mr-3">{icon}</View>}
178
- <Text
179
- className={cn(
180
- 'text-sm',
181
- isDestructive ? 'text-status-error' : 'text-text-primary'
182
- )}
183
- >
181
+ <Text className={cn('text-sm', isDestructive ? 'text-status-error' : 'text-text-primary')}>
184
182
  {children}
185
183
  </Text>
186
184
  </Pressable>
@@ -1,2 +1,9 @@
1
1
  export { Menu, MenuTrigger, MenuList, MenuItem, MenuDivider, MenuGroup } from './Menu'
2
- export type { MenuProps, MenuTriggerProps, MenuListProps, MenuItemProps, MenuDividerProps, MenuGroupProps } from './Menu'
2
+ export type {
3
+ MenuProps,
4
+ MenuTriggerProps,
5
+ MenuListProps,
6
+ MenuItemProps,
7
+ MenuDividerProps,
8
+ MenuGroupProps,
9
+ } from './Menu'
@@ -194,8 +194,8 @@ export const ScrollableContent: Story = {
194
194
  <Text className="text-text-primary font-semibold mb-1">Section {i + 1}</Text>
195
195
  <Text className="text-text-secondary text-sm">
196
196
  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor
197
- incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
198
- nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
197
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
198
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
199
199
  </Text>
200
200
  </View>
201
201
  ))}
@@ -1,6 +1,14 @@
1
1
  import React, { createContext, useContext } from 'react'
2
- import { Modal as RNModal, View, Text, Pressable, ScrollView, type ModalProps as RNModalProps } from 'react-native'
2
+ import {
3
+ Modal as RNModal,
4
+ View,
5
+ Text,
6
+ Pressable,
7
+ ScrollView,
8
+ type ModalProps as RNModalProps,
9
+ } from 'react-native'
3
10
  import { cn } from '../../../utils/cn'
11
+ import { Surface } from '../surface'
4
12
 
5
13
  export type ModalSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full'
6
14
  export type ModalScrollBehavior = 'inside' | 'outside'
@@ -102,10 +110,7 @@ export function Modal({
102
110
  {...props}
103
111
  >
104
112
  {scrollBehavior === 'outside' ? (
105
- <ScrollView
106
- contentContainerStyle={{ flexGrow: 1 }}
107
- keyboardShouldPersistTaps="handled"
108
- >
113
+ <ScrollView contentContainerStyle={{ flexGrow: 1 }} keyboardShouldPersistTaps="handled">
109
114
  {backdropContent}
110
115
  </ScrollView>
111
116
  ) : (
@@ -132,15 +137,14 @@ export function ModalContent({ children, className }: ModalContentProps) {
132
137
  // Prevent backdrop click from propagating
133
138
  onPress={(e) => e.stopPropagation()}
134
139
  >
135
- <View
136
- className={cn(
137
- 'bg-surface-elevated rounded-lg shadow-xl w-full',
138
- sizeStyles[size],
139
- className
140
- )}
140
+ {/* Floating: overlay plane + the deepest lift, no ring. */}
141
+ <Surface
142
+ elevation={5}
143
+ rounded={false}
144
+ className={cn('rounded-lg w-full', sizeStyles[size], className)}
141
145
  >
142
146
  {children}
143
- </View>
147
+ </Surface>
144
148
  </Pressable>
145
149
  )
146
150
  }
@@ -155,7 +159,12 @@ export interface ModalHeaderProps {
155
159
  */
156
160
  export function ModalHeader({ children, className }: ModalHeaderProps) {
157
161
  return (
158
- <View className={cn('flex-row items-center justify-between px-6 py-4 border-b border-divider', className)}>
162
+ <View
163
+ className={cn(
164
+ 'flex-row items-center justify-between px-6 py-4 border-b border-divider',
165
+ className
166
+ )}
167
+ >
159
168
  {children}
160
169
  </View>
161
170
  )
@@ -230,11 +239,7 @@ export function ModalBody({ children, maxHeight, className }: ModalBodyProps) {
230
239
  )
231
240
  }
232
241
 
233
- return (
234
- <View className={cn('px-6 py-4', className)}>
235
- {children}
236
- </View>
237
- )
242
+ return <View className={cn('px-6 py-4', className)}>{children}</View>
238
243
  }
239
244
 
240
245
  export interface ModalFooterProps {
@@ -247,7 +252,12 @@ export interface ModalFooterProps {
247
252
  */
248
253
  export function ModalFooter({ children, className }: ModalFooterProps) {
249
254
  return (
250
- <View className={cn('flex-row items-center justify-end gap-2 px-6 py-4 border-t border-divider', className)}>
255
+ <View
256
+ className={cn(
257
+ 'flex-row items-center justify-end gap-2 px-6 py-4 border-t border-divider',
258
+ className
259
+ )}
260
+ >
251
261
  {children}
252
262
  </View>
253
263
  )
@@ -6,37 +6,50 @@ import { Indicator } from '../indicator'
6
6
  const meta: Meta<typeof Pill> = {
7
7
  title: 'Components/Atoms/Pill',
8
8
  component: Pill,
9
- tags: ['autodocs'],
9
+ tags: ['autodocs', 'status:stable', '!status:review'],
10
10
  argTypes: {
11
- variant: { control: 'select', options: ['subtle', 'outline'] },
12
- color: { control: 'select', options: ['default', 'primary', 'secondary', 'success', 'error', 'warning', 'info'] },
13
- size: { control: 'select', options: ['xs', 'sm', 'md'] },
11
+ variant: { control: 'select', options: ['solid', 'subtle', 'outline'] },
12
+ tone: {
13
+ control: 'select',
14
+ options: ['neutral', 'brand', 'brand-secondary', 'success', 'warning', 'error', 'info'],
15
+ },
16
+ size: { control: 'select', options: ['xs', 'sm', 'md', 'lg', 'xl'] },
17
+ leading: { control: 'select', options: [undefined, 'dot'] },
14
18
  rounded: { control: 'boolean' },
19
+ isDisabled: { control: 'boolean' },
15
20
  },
16
21
  }
17
22
  export default meta
18
23
  type Story = StoryObj<typeof Pill>
19
24
 
20
- export const Default: Story = { args: { children: 'Label', color: 'primary' } }
25
+ export const Default: Story = { args: { children: 'Label', tone: 'brand' } }
21
26
 
22
27
  export const AllVariants: Story = {
23
28
  render: () => (
24
29
  <View className="flex-row gap-2">
25
- <Pill variant="subtle" color="primary">Subtle</Pill>
26
- <Pill variant="outline" color="primary">Outline</Pill>
30
+ <Pill variant="solid" tone="brand">
31
+ Solid
32
+ </Pill>
33
+ <Pill variant="subtle" tone="brand">
34
+ Subtle
35
+ </Pill>
36
+ <Pill variant="outline" tone="brand">
37
+ Outline
38
+ </Pill>
27
39
  </View>
28
40
  ),
29
41
  }
30
42
 
31
- export const AllColors: Story = {
43
+ export const AllTones: Story = {
32
44
  render: () => (
33
45
  <View className="flex-row gap-2 flex-wrap">
34
- <Pill color="default">Default</Pill>
35
- <Pill color="primary">Primary</Pill>
36
- <Pill color="success">Success</Pill>
37
- <Pill color="error">Error</Pill>
38
- <Pill color="warning">Warning</Pill>
39
- <Pill color="info">Info</Pill>
46
+ <Pill tone="neutral">Neutral</Pill>
47
+ <Pill tone="brand">Brand</Pill>
48
+ <Pill tone="brand-secondary">Accent</Pill>
49
+ <Pill tone="success">Success</Pill>
50
+ <Pill tone="warning">Warning</Pill>
51
+ <Pill tone="error">Error</Pill>
52
+ <Pill tone="info">Info</Pill>
40
53
  </View>
41
54
  ),
42
55
  }
@@ -44,19 +57,37 @@ export const AllColors: Story = {
44
57
  export const AllSizes: Story = {
45
58
  render: () => (
46
59
  <View className="flex-row gap-2 items-center">
47
- <Pill size="xs" color="primary">XS</Pill>
48
- <Pill size="sm" color="primary">SM</Pill>
49
- <Pill size="md" color="primary">MD</Pill>
60
+ <Pill size="xs" tone="brand">
61
+ XS
62
+ </Pill>
63
+ <Pill size="sm" tone="brand">
64
+ SM
65
+ </Pill>
66
+ <Pill size="md" tone="brand">
67
+ MD
68
+ </Pill>
69
+ <Pill size="lg" tone="brand">
70
+ LG
71
+ </Pill>
72
+ <Pill size="xl" tone="brand">
73
+ XL
74
+ </Pill>
50
75
  </View>
51
76
  ),
52
77
  }
53
78
 
54
- export const WithDot: Story = {
79
+ export const LeadingSlot: Story = {
55
80
  render: () => (
56
81
  <View className="flex-row gap-2">
57
- <Pill color="success" leftElement={<Indicator size="xs" color="success" />}>Active</Pill>
58
- <Pill color="error" leftElement={<Indicator size="xs" color="error" />}>Failed</Pill>
59
- <Pill color="warning" leftElement={<Indicator size="xs" color="warning" />}>Pending</Pill>
82
+ <Pill tone="success" leading="dot">
83
+ Active
84
+ </Pill>
85
+ <Pill tone="error" leading="dot">
86
+ Failed
87
+ </Pill>
88
+ <Pill tone="warning" leading={<Indicator size="xs" color="warning" />}>
89
+ Pending
90
+ </Pill>
60
91
  </View>
61
92
  ),
62
93
  }
@@ -64,8 +95,12 @@ export const WithDot: Story = {
64
95
  export const SquareCorners: Story = {
65
96
  render: () => (
66
97
  <View className="flex-row gap-2">
67
- <Pill rounded={false} color="primary">Tag</Pill>
68
- <Pill rounded={false} color="success">Done</Pill>
98
+ <Pill rounded={false} tone="brand">
99
+ Tag
100
+ </Pill>
101
+ <Pill rounded={false} tone="success">
102
+ Done
103
+ </Pill>
69
104
  </View>
70
105
  ),
71
106
  }