@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
@@ -1,6 +1,15 @@
1
1
  import React, { useState, useCallback, useMemo } from 'react'
2
- import { View, Text, TextInput, Pressable, ScrollView, type ViewProps, type TextInputProps } from 'react-native'
2
+ import {
3
+ View,
4
+ Text,
5
+ TextInput,
6
+ Pressable,
7
+ ScrollView,
8
+ type ViewProps,
9
+ type TextInputProps,
10
+ } from 'react-native'
3
11
  import { cn } from '../../../utils/cn'
12
+ import { Surface } from '../surface'
4
13
 
5
14
  export interface AutocompleteOption<T = string> {
6
15
  value: T
@@ -115,10 +124,7 @@ export function Autocomplete<T extends string = string>({
115
124
  const [highlightedIndex, setHighlightedIndex] = useState(-1)
116
125
 
117
126
  // Get the label for the selected value
118
- const selectedOption = useMemo(
119
- () => options.find((o) => o.value === value),
120
- [options, value]
121
- )
127
+ const selectedOption = useMemo(() => options.find((o) => o.value === value), [options, value])
122
128
 
123
129
  // Filter options based on input
124
130
  const filteredOptions = useMemo(() => {
@@ -206,21 +212,14 @@ export function Autocomplete<T extends string = string>({
206
212
  onBlur={handleBlur}
207
213
  placeholder={placeholder}
208
214
  editable={!isDisabled}
209
- className={cn(
210
- 'flex-1 px-3 py-2 text-text-primary',
211
- 'placeholder:text-text-tertiary'
212
- )}
215
+ className={cn('flex-1 px-3 py-2 text-text-primary', 'placeholder:text-text-tertiary')}
213
216
  accessibilityLabel={label}
214
217
  {...inputProps}
215
218
  />
216
219
 
217
220
  {/* Clear button */}
218
221
  {isClearable && value && !isDisabled && (
219
- <Pressable
220
- onPress={handleClear}
221
- className="p-2"
222
- accessibilityLabel="Clear selection"
223
- >
222
+ <Pressable onPress={handleClear} className="p-2" accessibilityLabel="Clear selection">
224
223
  <Text className="text-text-tertiary">×</Text>
225
224
  </Pressable>
226
225
  )}
@@ -235,11 +234,12 @@ export function Autocomplete<T extends string = string>({
235
234
 
236
235
  {/* Dropdown */}
237
236
  {isOpen && (
238
- <View
237
+ <Surface
238
+ elevation={4}
239
+ rounded={false}
239
240
  className={cn(
240
241
  'absolute z-50 top-full left-0 right-0 mt-1',
241
- 'bg-surface-elevated rounded-md shadow-lg border border-hairline',
242
- 'max-h-60 overflow-hidden'
242
+ 'rounded-md max-h-60 overflow-hidden'
243
243
  )}
244
244
  >
245
245
  <ScrollView className="py-1">
@@ -252,16 +252,12 @@ export function Autocomplete<T extends string = string>({
252
252
 
253
253
  {/* Loading message */}
254
254
  {isLoading && (
255
- <Text className="px-3 py-2 text-sm text-text-tertiary">
256
- {loadingText}
257
- </Text>
255
+ <Text className="px-3 py-2 text-sm text-text-tertiary">{loadingText}</Text>
258
256
  )}
259
257
 
260
258
  {/* No results */}
261
259
  {showNoResults && (
262
- <Text className="px-3 py-2 text-sm text-text-tertiary">
263
- {noOptionsText}
264
- </Text>
260
+ <Text className="px-3 py-2 text-sm text-text-tertiary">{noOptionsText}</Text>
265
261
  )}
266
262
 
267
263
  {/* Options */}
@@ -312,17 +308,14 @@ export function Autocomplete<T extends string = string>({
312
308
  )
313
309
  })}
314
310
  </ScrollView>
315
- </View>
311
+ </Surface>
316
312
  )}
317
313
  </View>
318
314
 
319
315
  {/* Helper/Error text */}
320
316
  {(helperText || errorMessage) && (
321
317
  <Text
322
- className={cn(
323
- 'text-xs mt-1',
324
- isInvalid ? 'text-status-error' : 'text-text-tertiary'
325
- )}
318
+ className={cn('text-xs mt-1', isInvalid ? 'text-status-error' : 'text-text-tertiary')}
326
319
  >
327
320
  {errorMessage || helperText}
328
321
  </Text>
@@ -5,7 +5,7 @@ import { Avatar, AvatarBadge, AvatarGroup } from './Avatar'
5
5
  const meta: Meta<typeof Avatar> = {
6
6
  title: 'Components/Atoms/Avatar',
7
7
  component: Avatar,
8
- tags: ['autodocs'],
8
+ tags: ['autodocs', 'status:stable', '!status:review'],
9
9
  argTypes: {
10
10
  size: {
11
11
  control: 'select',
@@ -133,12 +133,7 @@ export interface AvatarGroupProps {
133
133
  /**
134
134
  * Group of avatars with stacking effect.
135
135
  */
136
- export function AvatarGroup({
137
- children,
138
- max,
139
- size = 'md',
140
- className,
141
- }: AvatarGroupProps) {
136
+ export function AvatarGroup({ children, max, size = 'md', className }: AvatarGroupProps) {
142
137
  const childArray = React.Children.toArray(children)
143
138
  const visibleChildren = max ? childArray.slice(0, max) : childArray
144
139
  const remainingCount = max ? Math.max(0, childArray.length - max) : 0
@@ -148,10 +143,7 @@ export function AvatarGroup({
148
143
  {visibleChildren.map((child, index) => (
149
144
  <View
150
145
  key={index}
151
- className={cn(
152
- 'border-2 border-surface-base rounded-full',
153
- index > 0 && '-ml-2'
154
- )}
146
+ className={cn('border-2 border-surface-base rounded-full', index > 0 && '-ml-2')}
155
147
  >
156
148
  {React.isValidElement(child)
157
149
  ? React.cloneElement(child as React.ReactElement<any>, { size })
@@ -5,7 +5,8 @@ import { Badge, BadgeText } from './Badge'
5
5
  const meta: Meta<typeof Badge> = {
6
6
  title: 'Components/Atoms/Badge',
7
7
  component: Badge,
8
- tags: ['autodocs'],
8
+ parameters: { docs: { description: { component: 'Composes **Indicator**.' } } },
9
+ tags: ['autodocs', 'status:stable', '!status:review'],
9
10
  argTypes: {
10
11
  variant: {
11
12
  control: 'select',
@@ -40,9 +41,15 @@ export const Default: Story = {
40
41
  export const AllVariants: Story = {
41
42
  render: () => (
42
43
  <View style={{ flexDirection: 'row', gap: 8, flexWrap: 'wrap' }}>
43
- <Badge variant="solid" color="primary">Solid</Badge>
44
- <Badge variant="subtle" color="primary">Subtle</Badge>
45
- <Badge variant="outline" color="primary">Outline</Badge>
44
+ <Badge variant="solid" color="primary">
45
+ Solid
46
+ </Badge>
47
+ <Badge variant="subtle" color="primary">
48
+ Subtle
49
+ </Badge>
50
+ <Badge variant="outline" color="primary">
51
+ Outline
52
+ </Badge>
46
53
  </View>
47
54
  ),
48
55
  }
@@ -51,31 +58,73 @@ export const AllColors: Story = {
51
58
  render: () => (
52
59
  <View style={{ gap: 12 }}>
53
60
  <View style={{ flexDirection: 'row', gap: 8, flexWrap: 'wrap' }}>
54
- <Badge variant="solid" color="default">Default</Badge>
55
- <Badge variant="solid" color="primary">Primary</Badge>
56
- <Badge variant="solid" color="secondary">Secondary</Badge>
57
- <Badge variant="solid" color="success">Success</Badge>
58
- <Badge variant="solid" color="error">Error</Badge>
59
- <Badge variant="solid" color="warning">Warning</Badge>
60
- <Badge variant="solid" color="info">Info</Badge>
61
+ <Badge variant="solid" color="default">
62
+ Default
63
+ </Badge>
64
+ <Badge variant="solid" color="primary">
65
+ Primary
66
+ </Badge>
67
+ <Badge variant="solid" color="secondary">
68
+ Secondary
69
+ </Badge>
70
+ <Badge variant="solid" color="success">
71
+ Success
72
+ </Badge>
73
+ <Badge variant="solid" color="error">
74
+ Error
75
+ </Badge>
76
+ <Badge variant="solid" color="warning">
77
+ Warning
78
+ </Badge>
79
+ <Badge variant="solid" color="info">
80
+ Info
81
+ </Badge>
61
82
  </View>
62
83
  <View style={{ flexDirection: 'row', gap: 8, flexWrap: 'wrap' }}>
63
- <Badge variant="subtle" color="default">Default</Badge>
64
- <Badge variant="subtle" color="primary">Primary</Badge>
65
- <Badge variant="subtle" color="secondary">Secondary</Badge>
66
- <Badge variant="subtle" color="success">Success</Badge>
67
- <Badge variant="subtle" color="error">Error</Badge>
68
- <Badge variant="subtle" color="warning">Warning</Badge>
69
- <Badge variant="subtle" color="info">Info</Badge>
84
+ <Badge variant="subtle" color="default">
85
+ Default
86
+ </Badge>
87
+ <Badge variant="subtle" color="primary">
88
+ Primary
89
+ </Badge>
90
+ <Badge variant="subtle" color="secondary">
91
+ Secondary
92
+ </Badge>
93
+ <Badge variant="subtle" color="success">
94
+ Success
95
+ </Badge>
96
+ <Badge variant="subtle" color="error">
97
+ Error
98
+ </Badge>
99
+ <Badge variant="subtle" color="warning">
100
+ Warning
101
+ </Badge>
102
+ <Badge variant="subtle" color="info">
103
+ Info
104
+ </Badge>
70
105
  </View>
71
106
  <View style={{ flexDirection: 'row', gap: 8, flexWrap: 'wrap' }}>
72
- <Badge variant="outline" color="default">Default</Badge>
73
- <Badge variant="outline" color="primary">Primary</Badge>
74
- <Badge variant="outline" color="secondary">Secondary</Badge>
75
- <Badge variant="outline" color="success">Success</Badge>
76
- <Badge variant="outline" color="error">Error</Badge>
77
- <Badge variant="outline" color="warning">Warning</Badge>
78
- <Badge variant="outline" color="info">Info</Badge>
107
+ <Badge variant="outline" color="default">
108
+ Default
109
+ </Badge>
110
+ <Badge variant="outline" color="primary">
111
+ Primary
112
+ </Badge>
113
+ <Badge variant="outline" color="secondary">
114
+ Secondary
115
+ </Badge>
116
+ <Badge variant="outline" color="success">
117
+ Success
118
+ </Badge>
119
+ <Badge variant="outline" color="error">
120
+ Error
121
+ </Badge>
122
+ <Badge variant="outline" color="warning">
123
+ Warning
124
+ </Badge>
125
+ <Badge variant="outline" color="info">
126
+ Info
127
+ </Badge>
79
128
  </View>
80
129
  </View>
81
130
  ),
@@ -84,9 +133,15 @@ export const AllColors: Story = {
84
133
  export const AllSizes: Story = {
85
134
  render: () => (
86
135
  <View style={{ flexDirection: 'row', gap: 8, alignItems: 'center' }}>
87
- <Badge size="sm" color="primary">Small</Badge>
88
- <Badge size="md" color="primary">Medium</Badge>
89
- <Badge size="lg" color="primary">Large</Badge>
136
+ <Badge size="sm" color="primary">
137
+ Small
138
+ </Badge>
139
+ <Badge size="md" color="primary">
140
+ Medium
141
+ </Badge>
142
+ <Badge size="lg" color="primary">
143
+ Large
144
+ </Badge>
90
145
  </View>
91
146
  ),
92
147
  }
@@ -33,7 +33,15 @@ describe('Badge', () => {
33
33
  })
34
34
 
35
35
  it('renders with all color options', () => {
36
- const colors = ['default', 'primary', 'secondary', 'success', 'error', 'warning', 'info'] as const
36
+ const colors = [
37
+ 'default',
38
+ 'primary',
39
+ 'secondary',
40
+ 'success',
41
+ 'error',
42
+ 'warning',
43
+ 'info',
44
+ ] as const
37
45
  colors.forEach((color) => {
38
46
  const { unmount } = render(<Badge color={color}>Test</Badge>)
39
47
  expect(screen.getByText('Test')).toBeInTheDocument()
@@ -74,12 +82,20 @@ describe('Badge', () => {
74
82
 
75
83
  describe('dot indicator', () => {
76
84
  it('renders dot when dot prop is true', () => {
77
- const { container } = render(<Badge dot color="success">Active</Badge>)
85
+ const { container } = render(
86
+ <Badge dot color="success">
87
+ Active
88
+ </Badge>
89
+ )
78
90
  expect(container.firstChild).toBeInTheDocument()
79
91
  })
80
92
 
81
93
  it('renders dot with explicit dotColor', () => {
82
- const { container } = render(<Badge dot dotColor="warning">Pending</Badge>)
94
+ const { container } = render(
95
+ <Badge dot dotColor="warning">
96
+ Pending
97
+ </Badge>
98
+ )
83
99
  expect(container.firstChild).toBeInTheDocument()
84
100
  })
85
101
 
@@ -1,10 +1,18 @@
1
1
  import React from 'react'
2
- import { View, Text, type ViewProps } from 'react-native'
2
+ import { Text, type ViewProps } from 'react-native'
3
3
  import { cn } from '../../../utils/cn'
4
4
  import { Indicator, type IndicatorColor } from '../indicator'
5
+ import { Pill, type PillTone, type PillVariant } from '../pill'
5
6
 
6
7
  export type BadgeVariant = 'solid' | 'subtle' | 'outline'
7
- export type BadgeColor = 'default' | 'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'info'
8
+ export type BadgeColor =
9
+ | 'default'
10
+ | 'primary'
11
+ | 'secondary'
12
+ | 'success'
13
+ | 'error'
14
+ | 'warning'
15
+ | 'info'
8
16
  export type BadgeSize = 'sm' | 'md' | 'lg'
9
17
 
10
18
  export interface BadgeProps extends ViewProps {
@@ -23,44 +31,36 @@ export interface BadgeProps extends ViewProps {
23
31
  children?: React.ReactNode
24
32
  }
25
33
 
26
- const variantColorStyles: Record<BadgeVariant, Record<BadgeColor, string>> = {
27
- solid: {
28
- default: 'bg-hairline-strong text-text-inverse',
29
- primary: 'bg-brand-primary text-text-inverse',
30
- secondary: 'bg-brand-secondary text-text-inverse',
31
- success: 'bg-status-success text-text-inverse',
32
- error: 'bg-status-error text-text-inverse',
33
- warning: 'bg-status-warning text-text-inverse',
34
- info: 'bg-status-info text-text-inverse',
35
- },
36
- subtle: {
37
- default: 'bg-surface-raised text-text-secondary',
38
- primary: 'bg-brand-primary-subtle text-brand-primary',
39
- secondary: 'bg-brand-secondary-subtle text-brand-secondary',
40
- success: 'bg-status-success-subtle text-status-success',
41
- error: 'bg-status-error-subtle text-status-error',
42
- warning: 'bg-status-warning-subtle text-status-warning',
43
- info: 'bg-status-info-subtle text-status-info',
44
- },
45
- outline: {
46
- default: 'border border-hairline-strong text-text-secondary',
47
- primary: 'border border-brand-primary text-brand-primary',
48
- secondary: 'border border-brand-secondary text-brand-secondary',
49
- success: 'border border-status-success text-status-success',
50
- error: 'border border-status-error text-status-error',
51
- warning: 'border border-status-warning text-status-warning',
52
- info: 'border border-status-info text-status-info',
53
- },
34
+ const colorToTone: Record<BadgeColor, PillTone> = {
35
+ default: 'neutral',
36
+ primary: 'brand',
37
+ secondary: 'brand-secondary',
38
+ success: 'success',
39
+ error: 'error',
40
+ warning: 'warning',
41
+ info: 'info',
54
42
  }
55
43
 
44
+ /** Badge keeps its own geometry; Pill supplies structure, tone and the slots. */
56
45
  const sizeStyles: Record<BadgeSize, string> = {
57
- sm: 'px-1.5 py-0.5 text-xs',
58
- md: 'px-2 py-0.5 text-xs',
59
- lg: 'px-2.5 py-1 text-sm',
46
+ sm: 'px-1.5 py-0.5',
47
+ md: 'px-2 py-0.5',
48
+ lg: 'px-2.5 py-1',
49
+ }
50
+
51
+ const textSizeStyles: Record<BadgeSize, string> = {
52
+ sm: 'text-xs',
53
+ md: 'text-xs',
54
+ lg: 'text-sm',
55
+ }
56
+
57
+ function dotIndicatorColor(color: BadgeColor, dotColor?: IndicatorColor): IndicatorColor {
58
+ if (dotColor) return dotColor
59
+ return color === 'default' || color === 'secondary' ? 'default' : (color as IndicatorColor)
60
60
  }
61
61
 
62
62
  /**
63
- * Badge component for status indicators and labels.
63
+ * Badge a `Pill` preset for status indicators and labels.
64
64
  *
65
65
  * @example
66
66
  * <Badge color="success">Active</Badge>
@@ -77,28 +77,25 @@ export function Badge({
77
77
  ...props
78
78
  }: BadgeProps) {
79
79
  return (
80
- <View
80
+ <Pill
81
+ variant={variant as PillVariant}
82
+ tone={colorToTone[color]}
83
+ leading={
84
+ dot ? (
85
+ <Indicator size="xs" color={dotIndicatorColor(color, dotColor)} className="mr-0.5" />
86
+ ) : undefined
87
+ }
81
88
  className={cn(
82
- 'inline-flex items-center justify-center rounded-full font-medium',
83
- variantColorStyles[variant][color],
89
+ 'justify-center self-auto gap-0',
90
+ variant === 'outline' ? 'border' : 'border-0',
84
91
  sizeStyles[size],
85
92
  className
86
93
  )}
94
+ textClassName={cn('font-sans font-medium', textSizeStyles[size])}
87
95
  {...props}
88
96
  >
89
- {dot && (
90
- <Indicator
91
- size="xs"
92
- color={dotColor ?? (color === 'default' || color === 'secondary' ? 'default' : color as IndicatorColor)}
93
- className="mr-0.5"
94
- />
95
- )}
96
- {typeof children === 'string' ? (
97
- <Text className="text-inherit font-medium">{children}</Text>
98
- ) : (
99
- children
100
- )}
101
- </View>
97
+ {children}
98
+ </Pill>
102
99
  )
103
100
  }
104
101
 
@@ -111,9 +108,5 @@ export interface BadgeTextProps {
111
108
  * Text component for Badge content.
112
109
  */
113
110
  export function BadgeText({ children, className }: BadgeTextProps) {
114
- return (
115
- <Text className={cn('text-inherit font-medium', className)}>
116
- {children}
117
- </Text>
118
- )
111
+ return <Text className={cn('text-inherit font-medium', className)}>{children}</Text>
119
112
  }
@@ -5,7 +5,7 @@ import { Breadcrumbs, BreadcrumbItem } from './Breadcrumbs'
5
5
  const meta: Meta<typeof Breadcrumbs> = {
6
6
  title: 'Components/Molecules/Breadcrumbs',
7
7
  component: Breadcrumbs,
8
- tags: ['autodocs'],
8
+ tags: ['autodocs', 'status:stable', '!status:review'],
9
9
  argTypes: {
10
10
  maxItems: {
11
11
  control: 'number',
@@ -36,11 +36,7 @@ export function Breadcrumbs({
36
36
  if (maxItems && items.length > maxItems) {
37
37
  const firstItem = items[0]
38
38
  const lastItems = items.slice(-Math.floor(maxItems / 2))
39
- displayItems = [
40
- firstItem,
41
- <BreadcrumbEllipsis key="ellipsis" />,
42
- ...lastItems,
43
- ]
39
+ displayItems = [firstItem, <BreadcrumbEllipsis key="ellipsis" />, ...lastItems]
44
40
  }
45
41
 
46
42
  return (
@@ -53,9 +49,7 @@ export function Breadcrumbs({
53
49
  <View key={index} className="flex-row items-center">
54
50
  {child}
55
51
  {index < displayItems.length - 1 && (
56
- <Text className="mx-2 text-text-tertiary text-sm">
57
- {separator}
58
- </Text>
52
+ <Text className="mx-2 text-text-tertiary text-sm">{separator}</Text>
59
53
  )}
60
54
  </View>
61
55
  ))}
@@ -98,11 +92,7 @@ export function BreadcrumbItem({
98
92
  }
99
93
 
100
94
  return (
101
- <Pressable
102
- onPress={onPress}
103
- accessibilityRole="link"
104
- accessibilityHint={href}
105
- >
95
+ <Pressable onPress={onPress} accessibilityRole="link" accessibilityHint={href}>
106
96
  <Text
107
97
  className={cn(
108
98
  'text-sm text-text-secondary',
@@ -121,7 +111,5 @@ export function BreadcrumbItem({
121
111
  * Ellipsis for collapsed breadcrumbs.
122
112
  */
123
113
  function BreadcrumbEllipsis() {
124
- return (
125
- <Text className="text-sm text-text-tertiary">...</Text>
126
- )
114
+ return <Text className="text-sm text-text-tertiary">...</Text>
127
115
  }
@@ -5,7 +5,7 @@ import { Button, ButtonText, ButtonIcon } from './Button'
5
5
  const meta: Meta<typeof Button> = {
6
6
  title: 'Components/Molecules/Button',
7
7
  component: Button,
8
- tags: ['autodocs'],
8
+ tags: ['autodocs', 'status:stable', '!status:review'],
9
9
  argTypes: {
10
10
  variant: {
11
11
  control: 'select',
@@ -158,12 +158,24 @@ export const AllColors: Story = {
158
158
  render: () => (
159
159
  <View style={{ gap: 8 }}>
160
160
  <View style={{ flexDirection: 'row', gap: 8, flexWrap: 'wrap' }}>
161
- <Button color="primary"><ButtonText>Primary</ButtonText></Button>
162
- <Button color="secondary"><ButtonText>Secondary</ButtonText></Button>
163
- <Button color="success"><ButtonText>Success</ButtonText></Button>
164
- <Button color="error"><ButtonText>Error</ButtonText></Button>
165
- <Button color="warning"><ButtonText>Warning</ButtonText></Button>
166
- <Button color="info"><ButtonText>Info</ButtonText></Button>
161
+ <Button color="primary">
162
+ <ButtonText>Primary</ButtonText>
163
+ </Button>
164
+ <Button color="secondary">
165
+ <ButtonText>Secondary</ButtonText>
166
+ </Button>
167
+ <Button color="success">
168
+ <ButtonText>Success</ButtonText>
169
+ </Button>
170
+ <Button color="error">
171
+ <ButtonText>Error</ButtonText>
172
+ </Button>
173
+ <Button color="warning">
174
+ <ButtonText>Warning</ButtonText>
175
+ </Button>
176
+ <Button color="info">
177
+ <ButtonText>Info</ButtonText>
178
+ </Button>
167
179
  </View>
168
180
  </View>
169
181
  ),
@@ -172,9 +184,15 @@ export const AllColors: Story = {
172
184
  export const AllSizes: Story = {
173
185
  render: () => (
174
186
  <View style={{ flexDirection: 'row', gap: 8, alignItems: 'center' }}>
175
- <Button size="sm"><ButtonText>Small</ButtonText></Button>
176
- <Button size="md"><ButtonText>Medium</ButtonText></Button>
177
- <Button size="lg"><ButtonText>Large</ButtonText></Button>
187
+ <Button size="sm">
188
+ <ButtonText>Small</ButtonText>
189
+ </Button>
190
+ <Button size="md">
191
+ <ButtonText>Medium</ButtonText>
192
+ </Button>
193
+ <Button size="lg">
194
+ <ButtonText>Large</ButtonText>
195
+ </Button>
178
196
  </View>
179
197
  ),
180
198
  }
@@ -183,8 +201,24 @@ export const AllSizes: Story = {
183
201
  function PlusIcon({ size = 16 }: { size?: number }) {
184
202
  return (
185
203
  <View style={{ width: size, height: size, justifyContent: 'center', alignItems: 'center' }}>
186
- <View style={{ position: 'absolute', width: size * 0.6, height: 2, backgroundColor: 'currentColor', borderRadius: 1 }} />
187
- <View style={{ position: 'absolute', width: 2, height: size * 0.6, backgroundColor: 'currentColor', borderRadius: 1 }} />
204
+ <View
205
+ style={{
206
+ position: 'absolute',
207
+ width: size * 0.6,
208
+ height: 2,
209
+ backgroundColor: 'currentColor',
210
+ borderRadius: 1,
211
+ }}
212
+ />
213
+ <View
214
+ style={{
215
+ position: 'absolute',
216
+ width: 2,
217
+ height: size * 0.6,
218
+ backgroundColor: 'currentColor',
219
+ borderRadius: 1,
220
+ }}
221
+ />
188
222
  </View>
189
223
  )
190
224
  }