@titan-design/react-ui 0.12.1 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (531) hide show
  1. package/README.md +60 -47
  2. package/dist/bodymap.js +856 -736
  3. package/dist/bodymap.js.map +1 -1
  4. package/dist/bodymap.mjs +858 -738
  5. package/dist/bodymap.mjs.map +1 -1
  6. package/dist/index.d.mts +1431 -237
  7. package/dist/index.d.ts +1431 -237
  8. package/dist/index.js +6506 -4781
  9. package/dist/index.js.map +1 -1
  10. package/dist/index.mjs +6280 -4642
  11. package/dist/index.mjs.map +1 -1
  12. package/dist/{pages-B1hqnGIC.d.ts → pages-CsjsUn0G.d.ts} +51 -16
  13. package/dist/{pages-CvsFqNtx.d.mts → pages-ZbT_pD_U.d.mts} +51 -16
  14. package/dist/pages.d.mts +1 -1
  15. package/dist/pages.d.ts +1 -1
  16. package/dist/pages.js +1919 -1937
  17. package/dist/pages.js.map +1 -1
  18. package/dist/pages.mjs +1927 -1945
  19. package/dist/pages.mjs.map +1 -1
  20. package/dist/theme/index.d.mts +225 -140
  21. package/dist/theme/index.d.ts +225 -140
  22. package/dist/theme/index.js +298 -319
  23. package/dist/theme/index.js.map +1 -1
  24. package/dist/theme/index.mjs +283 -315
  25. package/dist/theme/index.mjs.map +1 -1
  26. package/dist/theme/tokens-css.js +145 -24
  27. package/dist/theme/tokens-css.js.map +1 -1
  28. package/dist/theme/tokens-css.mjs +145 -24
  29. package/dist/theme/tokens-css.mjs.map +1 -1
  30. package/dist/theme/tokens.d.mts +128 -11
  31. package/dist/theme/tokens.d.ts +128 -11
  32. package/dist/theme/tokens.js +126 -26
  33. package/dist/theme/tokens.js.map +1 -1
  34. package/dist/theme/tokens.mjs +124 -27
  35. package/dist/theme/tokens.mjs.map +1 -1
  36. package/docs/audits/2026-09-08-critique-addenda.md +51 -0
  37. package/docs/audits/2026-09-08-library-critique.md +212 -0
  38. package/docs/library-roadmap.md +99 -0
  39. package/docs/render-testing-pattern.md +130 -0
  40. package/package.json +1 -1
  41. package/src/arch/Architecture.stories.tsx +3 -1
  42. package/src/arch/arch-graph.freshness.test.ts +52 -0
  43. package/src/arch/arch-graph.json +4989 -1583
  44. package/src/components/custom/ActiveWork/CoChangeChip.stories.tsx +44 -0
  45. package/src/components/custom/ActiveWork/CoChangeChip.test.tsx +29 -0
  46. package/src/components/custom/ActiveWork/CoChangeChip.tsx +48 -0
  47. package/src/components/custom/ActiveWork/Eyebrow.stories.tsx +25 -0
  48. package/src/components/custom/ActiveWork/Eyebrow.test.tsx +16 -0
  49. package/src/components/custom/ActiveWork/Eyebrow.tsx +26 -0
  50. package/src/components/custom/ActiveWork/FileActivityDetail.stories.tsx +50 -0
  51. package/src/components/custom/ActiveWork/FileActivityDetail.test.tsx +66 -0
  52. package/src/components/custom/ActiveWork/FileActivityDetail.tsx +202 -0
  53. package/src/components/custom/ActiveWork/FileActivityRow.stories.tsx +70 -0
  54. package/src/components/custom/ActiveWork/FileActivityRow.test.tsx +67 -0
  55. package/src/components/custom/ActiveWork/FileActivityRow.tsx +130 -0
  56. package/src/components/custom/ActiveWork/FileHistoryExplorer.stories.tsx +84 -0
  57. package/src/components/custom/ActiveWork/FileHistoryExplorer.test.tsx +99 -0
  58. package/src/components/custom/ActiveWork/FileHistoryExplorer.tsx +138 -0
  59. package/src/components/custom/ActiveWork/FilePathLabel.stories.tsx +39 -0
  60. package/src/components/custom/ActiveWork/FilePathLabel.test.tsx +53 -0
  61. package/src/components/custom/ActiveWork/FilePathLabel.tsx +63 -0
  62. package/src/components/custom/ActiveWork/InitiativeBrief.stories.tsx +50 -0
  63. package/src/components/custom/ActiveWork/InitiativeBrief.test.tsx +62 -0
  64. package/src/components/custom/ActiveWork/InitiativeBrief.tsx +182 -0
  65. package/src/components/custom/ActiveWork/InitiativeCard.stories.tsx +73 -0
  66. package/src/components/custom/ActiveWork/InitiativeCard.test.tsx +68 -0
  67. package/src/components/custom/ActiveWork/InitiativeCard.tsx +136 -0
  68. package/src/components/custom/ActiveWork/InitiativeHeader.stories.tsx +59 -0
  69. package/src/components/custom/ActiveWork/InitiativeHeader.test.tsx +40 -0
  70. package/src/components/custom/ActiveWork/InitiativeHeader.tsx +73 -0
  71. package/src/components/custom/ActiveWork/InitiativeReader.stories.tsx +145 -0
  72. package/src/components/custom/ActiveWork/OpenLoops.stories.tsx +58 -0
  73. package/src/components/custom/ActiveWork/OpenLoops.test.tsx +61 -0
  74. package/src/components/custom/ActiveWork/OpenLoops.tsx +107 -0
  75. package/src/components/custom/ActiveWork/PortfolioOverview.stories.tsx +101 -0
  76. package/src/components/custom/ActiveWork/PortfolioOverview.test.tsx +81 -0
  77. package/src/components/custom/ActiveWork/PortfolioOverview.tsx +83 -0
  78. package/src/components/custom/ActiveWork/README.md +305 -0
  79. package/src/components/custom/ActiveWork/SessionDetail.stories.tsx +71 -0
  80. package/src/components/custom/ActiveWork/SessionDetail.test.tsx +84 -0
  81. package/src/components/custom/ActiveWork/SessionDetail.tsx +180 -0
  82. package/src/components/custom/ActiveWork/SessionList.stories.tsx +69 -0
  83. package/src/components/custom/ActiveWork/SessionList.test.tsx +78 -0
  84. package/src/components/custom/ActiveWork/SessionList.tsx +103 -0
  85. package/src/components/custom/ActiveWork/SessionListItem.stories.tsx +64 -0
  86. package/src/components/custom/ActiveWork/SessionListItem.test.tsx +62 -0
  87. package/src/components/custom/ActiveWork/SessionListItem.tsx +152 -0
  88. package/src/components/custom/ActiveWork/SessionReader.stories.tsx +113 -0
  89. package/src/components/custom/ActiveWork/SeverityLabel.stories.tsx +51 -0
  90. package/src/components/custom/ActiveWork/SeverityLabel.test.tsx +68 -0
  91. package/src/components/custom/ActiveWork/SeverityLabel.tsx +97 -0
  92. package/src/components/custom/ActiveWork/TaskRow.stories.tsx +63 -0
  93. package/src/components/custom/ActiveWork/TaskRow.test.tsx +112 -0
  94. package/src/components/custom/ActiveWork/TaskRow.tsx +176 -0
  95. package/src/components/custom/ActiveWork/TaskTable.stories.tsx +123 -0
  96. package/src/components/custom/ActiveWork/TaskTable.test.tsx +233 -0
  97. package/src/components/custom/ActiveWork/TaskTable.tsx +321 -0
  98. package/src/components/custom/ActiveWork/active-work-depth.test.tsx +102 -0
  99. package/src/components/custom/ActiveWork/file-history-fixture.ts +91 -0
  100. package/src/components/custom/ActiveWork/format-time.test.ts +23 -0
  101. package/src/components/custom/ActiveWork/format-time.ts +32 -0
  102. package/src/components/custom/ActiveWork/index.ts +19 -0
  103. package/src/components/custom/ActiveWork/initiative-fixture.ts +104 -0
  104. package/src/components/custom/ActiveWork/session-fixture.ts +267 -0
  105. package/src/components/custom/ActiveWork/session-linkers.ts +56 -0
  106. package/src/components/custom/ActiveWork/task-list-fixture.ts +97 -0
  107. package/src/components/custom/CircularTimer/CircularTimer.stories.tsx +12 -6
  108. package/src/components/custom/DateTime/DateTime.stories.tsx +2 -1
  109. package/src/components/custom/DateTime/DateTime.test.tsx +3 -1
  110. package/src/components/custom/EmptyState/EmptyState.stories.tsx +22 -9
  111. package/src/components/custom/EmptyState/EmptyState.test.tsx +7 -13
  112. package/src/components/custom/EmptyState/EmptyState.tsx +4 -18
  113. package/src/components/custom/Fatigue/DualGhostSpark.stories.tsx +4 -3
  114. package/src/components/custom/Fatigue/FatigueLights.stories.tsx +2 -2
  115. package/src/components/custom/Fatigue/GhostSpark.stories.tsx +4 -3
  116. package/src/components/custom/Fatigue/LiveFatigueCard.stories.tsx +2 -2
  117. package/src/components/custom/Fatigue/LiveFatigueCard.tsx +8 -4
  118. package/src/components/custom/Fatigue/LiveFatiguePanel.stories.tsx +116 -6
  119. package/src/components/custom/Fatigue/LiveFatiguePanel.test.tsx +134 -0
  120. package/src/components/custom/Fatigue/LiveFatiguePanel.tsx +54 -83
  121. package/src/components/custom/Fatigue/README.md +40 -3
  122. package/src/components/custom/Fatigue/RomProgressionChart.stories.tsx +2 -2
  123. package/src/components/custom/Fatigue/SilverRedPalette.stories.tsx +2 -1
  124. package/src/components/custom/Fatigue/VelocityHero.stories.tsx +4 -3
  125. package/src/components/custom/Fatigue/VerdictHero.stories.tsx +2 -2
  126. package/src/components/custom/Fatigue/fatigue-mock.test.ts +0 -5
  127. package/src/components/custom/Fatigue/fatigue-mock.ts +2 -10
  128. package/src/components/custom/Fatigue/fatigue-tokens.ts +12 -0
  129. package/src/components/custom/Fatigue/index.ts +17 -5
  130. package/src/components/custom/Fatigue/panel-layout.test.ts +149 -0
  131. package/src/components/custom/Fatigue/panel-layout.ts +185 -0
  132. package/src/components/custom/Gauge/Gauge.stories.tsx +6 -3
  133. package/src/components/custom/Gauge/Gauge.test.tsx +1 -1
  134. package/src/components/custom/Gauge/Gauge.tsx +7 -2
  135. package/src/components/custom/Metric/Metric.stories.tsx +10 -1
  136. package/src/components/custom/Metric/Metric.test.tsx +1 -3
  137. package/src/components/custom/Metric/Metric.tsx +5 -20
  138. package/src/components/custom/Prose/MarkdownProse.stories.tsx +88 -0
  139. package/src/components/custom/Prose/MarkdownProse.test.tsx +87 -0
  140. package/src/components/custom/Prose/MarkdownProse.tsx +201 -0
  141. package/src/components/custom/Prose/README.md +58 -0
  142. package/src/components/custom/Prose/index.ts +1 -0
  143. package/src/components/custom/Scatter/Scatter.stories.tsx +55 -14
  144. package/src/components/custom/Scatter/Scatter.test.tsx +2 -2
  145. package/src/components/custom/Scatter/Scatter.tsx +122 -18
  146. package/src/components/custom/Sidebar/Sidebar.stories.tsx +41 -8
  147. package/src/components/custom/Sidebar/Sidebar.test.tsx +5 -1
  148. package/src/components/custom/Sidebar/Sidebar.tsx +16 -33
  149. package/src/components/custom/Table/Table.stories.tsx +99 -16
  150. package/src/components/custom/Table/Table.test.tsx +273 -86
  151. package/src/components/custom/Table/Table.tsx +159 -67
  152. package/src/components/custom/Table/column-fit.test.ts +75 -0
  153. package/src/components/custom/Table/column-fit.ts +116 -0
  154. package/src/components/custom/Table/index.ts +9 -0
  155. package/src/components/custom/TimerReadout/TimerReadout.stories.tsx +8 -6
  156. package/src/components/custom/Treemap/Treemap.stories.tsx +15 -12
  157. package/src/components/custom/Treemap/Treemap.test.tsx +1 -1
  158. package/src/components/custom/Treemap/Treemap.tsx +11 -3
  159. package/src/components/custom/Typography/Typography.stories.tsx +28 -1
  160. package/src/components/custom/Typography/Typography.test.tsx +34 -0
  161. package/src/components/custom/Typography/Typography.tsx +6 -0
  162. package/src/components/custom/Typography/index.ts +1 -8
  163. package/src/components/custom/Workout/ActiveWorkoutPage.stories.tsx +11 -2
  164. package/src/components/custom/Workout/BaseBadge.stories.tsx +27 -11
  165. package/src/components/custom/Workout/BaseBadge.test.tsx +31 -11
  166. package/src/components/custom/Workout/BaseBadge.tsx +6 -2
  167. package/src/components/custom/Workout/BodyMap.stories.tsx +4 -1
  168. package/src/components/custom/Workout/BodyMap.tsx +8 -4
  169. package/src/components/custom/Workout/BodyMapDetailPanel.stories.tsx +28 -6
  170. package/src/components/custom/Workout/BodyMapDetailPanel.test.tsx +11 -15
  171. package/src/components/custom/Workout/BodyMapDetailPanel.tsx +50 -12
  172. package/src/components/custom/Workout/CapacityBandChart.stories.tsx +12 -9
  173. package/src/components/custom/Workout/CapacityBandChart.test.tsx +24 -51
  174. package/src/components/custom/Workout/CapacityBandChart.tsx +144 -111
  175. package/src/components/custom/Workout/DeviationBar.stories.tsx +1 -1
  176. package/src/components/custom/Workout/DeviationBar.test.tsx +10 -4
  177. package/src/components/custom/Workout/DeviationBar.tsx +24 -16
  178. package/src/components/custom/Workout/DualVelocityStrip.stories.tsx +183 -0
  179. package/src/components/custom/Workout/DualVelocityStrip.test.tsx +32 -18
  180. package/src/components/custom/Workout/ExerciseCard.stories.tsx +12 -11
  181. package/src/components/custom/Workout/ExerciseCard.test.tsx +52 -22
  182. package/src/components/custom/Workout/ExerciseCard.tsx +99 -183
  183. package/src/components/custom/Workout/ExerciseCardHeading.stories.tsx +95 -12
  184. package/src/components/custom/Workout/ExerciseCardHeading.test.tsx +189 -1
  185. package/src/components/custom/Workout/ExerciseCardHeading.tsx +167 -18
  186. package/src/components/custom/Workout/ExerciseDetailPage.stories.tsx +9 -1
  187. package/src/components/custom/Workout/ExerciseDetailPage.tsx +3 -2
  188. package/src/components/custom/Workout/ExerciseHeading.stories.tsx +8 -8
  189. package/src/components/custom/Workout/ExerciseHeading.tsx +194 -46
  190. package/src/components/custom/Workout/ExerciseIndicator.stories.tsx +12 -9
  191. package/src/components/custom/Workout/ExerciseIndicator.test.tsx +27 -11
  192. package/src/components/custom/Workout/ExerciseIndicator.tsx +14 -15
  193. package/src/components/custom/Workout/FatigueMeter.stories.tsx +5 -5
  194. package/src/components/custom/Workout/InputBar.stories.tsx +4 -5
  195. package/src/components/custom/Workout/InputBar.tsx +4 -2
  196. package/src/components/custom/Workout/IntensityBar.stories.tsx +1 -1
  197. package/src/components/custom/Workout/IntensityBar.test.tsx +5 -1
  198. package/src/components/custom/Workout/IntensityBar.tsx +8 -3
  199. package/src/components/custom/Workout/LiveAuraFrame.stories.tsx +5 -4
  200. package/src/components/custom/Workout/MesoCard.stories.tsx +4 -1
  201. package/src/components/custom/Workout/MesoCard.test.tsx +7 -18
  202. package/src/components/custom/Workout/MesoCard.tsx +14 -10
  203. package/src/components/custom/Workout/MesoProgressBar.stories.tsx +1 -1
  204. package/src/components/custom/Workout/MesoProgressBar.test.tsx +18 -11
  205. package/src/components/custom/Workout/MesoProgressBar.tsx +15 -13
  206. package/src/components/custom/Workout/MesoStatusCard.stories.tsx +2 -1
  207. package/src/components/custom/Workout/MesoStatusCard.test.tsx +14 -44
  208. package/src/components/custom/Workout/MesoStatusCard.tsx +20 -33
  209. package/src/components/custom/Workout/MetricTiles.stories.tsx +3 -2
  210. package/src/components/custom/Workout/MuscleGroupChip.stories.tsx +2 -8
  211. package/src/components/custom/Workout/MuscleGroupChip.test.tsx +23 -31
  212. package/src/components/custom/Workout/MuscleGroupChip.tsx +28 -67
  213. package/src/components/custom/Workout/PlaceholderStrip.stories.tsx +9 -4
  214. package/src/components/custom/Workout/PlaceholderStrip.test.tsx +17 -10
  215. package/src/components/custom/Workout/PlaceholderStrip.tsx +9 -8
  216. package/src/components/custom/Workout/PrBadge.stories.tsx +2 -1
  217. package/src/components/custom/Workout/PrBadge.test.tsx +3 -9
  218. package/src/components/custom/Workout/PrBadge.tsx +13 -17
  219. package/src/components/custom/Workout/PrHistoryModal.stories.tsx +16 -3
  220. package/src/components/custom/Workout/PrHistoryModal.test.tsx +13 -36
  221. package/src/components/custom/Workout/PrHistoryModal.tsx +8 -4
  222. package/src/components/custom/Workout/ProgramPlanningPage.stories.tsx +6 -1
  223. package/src/components/custom/Workout/README.md +68 -17
  224. package/src/components/custom/Workout/ReadinessCheck.stories.tsx +3 -2
  225. package/src/components/custom/Workout/ReadinessCheck.test.tsx +12 -18
  226. package/src/components/custom/Workout/ReadinessCheck.tsx +22 -4
  227. package/src/components/custom/Workout/RestTimer.stories.tsx +16 -4
  228. package/src/components/custom/Workout/RestTimer.tsx +4 -2
  229. package/src/components/custom/Workout/ScheduleTiles.stories.tsx +3 -2
  230. package/src/components/custom/Workout/ScheduleTiles.test.tsx +3 -4
  231. package/src/components/custom/Workout/ScheduleTiles.tsx +4 -7
  232. package/src/components/custom/Workout/SegmentedBar.stories.tsx +21 -17
  233. package/src/components/custom/Workout/SegmentedBar.tsx +10 -5
  234. package/src/components/custom/Workout/SegmentedProgressBar.stories.tsx +5 -5
  235. package/src/components/custom/Workout/SessionHeader.stories.tsx +6 -6
  236. package/src/components/custom/Workout/SessionHeader.tsx +12 -12
  237. package/src/components/custom/Workout/SessionRail.stories.tsx +12 -11
  238. package/src/components/custom/Workout/SessionRail.tsx +7 -9
  239. package/src/components/custom/Workout/SetBar.stories.tsx +10 -6
  240. package/src/components/custom/Workout/SetBar.test.tsx +49 -4
  241. package/src/components/custom/Workout/SetBar.tsx +38 -12
  242. package/src/components/custom/Workout/SetRow.stories.tsx +3 -2
  243. package/src/components/custom/Workout/SetRow.test.tsx +16 -2
  244. package/src/components/custom/Workout/SetRow.tsx +61 -23
  245. package/src/components/custom/Workout/SetStrip.stories.tsx +63 -7
  246. package/src/components/custom/Workout/SetStrip.test.tsx +25 -0
  247. package/src/components/custom/Workout/SetStrip.tsx +24 -4
  248. package/src/components/custom/Workout/SetTableHeader.stories.tsx +6 -6
  249. package/src/components/custom/Workout/SetTableHeader.tsx +9 -12
  250. package/src/components/custom/Workout/SetsRepsLoad.stories.tsx +7 -7
  251. package/src/components/custom/Workout/SetsRepsLoad.tsx +24 -12
  252. package/src/components/custom/Workout/Sparkline.stories.tsx +14 -11
  253. package/src/components/custom/Workout/Sparkline.test.tsx +37 -19
  254. package/src/components/custom/Workout/Sparkline.tsx +14 -18
  255. package/src/components/custom/Workout/StatusDot.stories.tsx +1 -1
  256. package/src/components/custom/Workout/StatusDot.test.tsx +44 -5
  257. package/src/components/custom/Workout/StatusDot.tsx +93 -63
  258. package/src/components/custom/Workout/StatusPill.stories.tsx +1 -1
  259. package/src/components/custom/Workout/StatusPill.test.tsx +6 -15
  260. package/src/components/custom/Workout/StatusPill.tsx +27 -38
  261. package/src/components/custom/Workout/StrengthTrendChart.stories.tsx +11 -4
  262. package/src/components/custom/Workout/StrengthTrendChart.test.tsx +15 -37
  263. package/src/components/custom/Workout/StrengthTrendChart.tsx +39 -36
  264. package/src/components/custom/Workout/SupersetWrapper.stories.tsx +27 -64
  265. package/src/components/custom/Workout/SupersetWrapper.test.tsx +16 -14
  266. package/src/components/custom/Workout/SupersetWrapper.tsx +17 -21
  267. package/src/components/custom/Workout/TempoDisplay.stories.tsx +26 -10
  268. package/src/components/custom/Workout/TempoDisplay.test.tsx +18 -4
  269. package/src/components/custom/Workout/TempoDisplay.tsx +2 -0
  270. package/src/components/custom/Workout/TrainingStatusPage.stories.tsx +9 -1
  271. package/src/components/custom/Workout/VelocityStrip.compact.stories.tsx +4 -1
  272. package/src/components/custom/Workout/VelocityStrip.dual.stories.tsx +10 -6
  273. package/src/components/custom/Workout/VelocityStrip.expanded.stories.tsx +5 -2
  274. package/src/components/custom/Workout/VelocityStrip.hero.stories.tsx +44 -1
  275. package/src/components/custom/Workout/VelocityStrip.stories.tsx +12 -6
  276. package/src/components/custom/Workout/VelocityStrip.test.tsx +48 -6
  277. package/src/components/custom/Workout/VelocityStrip.tsx +26 -14
  278. package/src/components/custom/Workout/VolumeLandmarkBar.stories.tsx +6 -7
  279. package/src/components/custom/Workout/VolumeLandmarkBar.tsx +15 -6
  280. package/src/components/custom/Workout/WeekRow.stories.tsx +4 -1
  281. package/src/components/custom/Workout/WeekRow.test.tsx +18 -15
  282. package/src/components/custom/Workout/WeekRow.tsx +23 -16
  283. package/src/components/custom/Workout/WeightBadge.stories.tsx +2 -1
  284. package/src/components/custom/Workout/WeightBadge.test.tsx +50 -19
  285. package/src/components/custom/Workout/WeightBadge.tsx +28 -27
  286. package/src/components/custom/Workout/WorkoutCard.stories.tsx +6 -1
  287. package/src/components/custom/Workout/WorkoutCard.test.tsx +18 -0
  288. package/src/components/custom/Workout/WorkoutCard.tsx +35 -57
  289. package/src/components/custom/Workout/WorkoutPill.stories.tsx +5 -2
  290. package/src/components/custom/Workout/WorkoutPill.test.tsx +39 -7
  291. package/src/components/custom/Workout/WorkoutPill.tsx +88 -57
  292. package/src/components/custom/Workout/ZoneTrack.stories.tsx +10 -7
  293. package/src/components/custom/Workout/ZoneTrack.tsx +10 -9
  294. package/src/components/custom/Workout/exerciseRowState.ts +29 -0
  295. package/src/components/custom/Workout/index.ts +17 -2
  296. package/src/components/custom/Workout/metricText.stories.tsx +15 -13
  297. package/src/components/custom/Workout/metricText.tsx +8 -2
  298. package/src/components/custom/Workout/setHeadingKit.tsx +219 -36
  299. package/src/components/custom/Workout/velocity-story-kit.tsx +2 -2
  300. package/src/components/custom/charts/README.md +66 -0
  301. package/src/components/custom/charts/SetBarChart.test.tsx +46 -1
  302. package/src/components/custom/charts/SetBarChart.tsx +56 -9
  303. package/src/components/custom/charts/SparkBars.stories.tsx +55 -0
  304. package/src/components/custom/charts/SparkBars.test.tsx +69 -0
  305. package/src/components/custom/charts/SparkBars.tsx +85 -0
  306. package/src/components/custom/charts/flatBarGeometry.test.ts +41 -0
  307. package/src/components/custom/charts/flatBarGeometry.ts +32 -0
  308. package/src/components/custom/charts/index.ts +3 -0
  309. package/src/components/custom/index.ts +3 -0
  310. package/src/components/custom/stepper/Stepper.stories.tsx +13 -10
  311. package/src/components/custom/stepper/Stepper.test.tsx +1 -7
  312. package/src/components/custom/stepper/Stepper.tsx +21 -34
  313. package/src/components/icons/icons.stories.tsx +1 -1
  314. package/src/components/icons/icons.tsx +51 -0
  315. package/src/components/shell/AppShell.stories.tsx +150 -0
  316. package/src/components/shell/AppShell.test.tsx +70 -0
  317. package/src/components/shell/AppShell.tsx +90 -0
  318. package/src/components/shell/BrandLockup.stories.tsx +66 -5
  319. package/src/components/shell/BrandLockup.test.tsx +34 -1
  320. package/src/components/shell/BrandLockup.tsx +27 -11
  321. package/src/components/shell/NavItem.stories.tsx +4 -4
  322. package/src/components/shell/NavItem.test.tsx +17 -0
  323. package/src/components/shell/NavItem.tsx +17 -5
  324. package/src/components/shell/README.md +89 -26
  325. package/src/components/shell/SideNav.stories.tsx +38 -7
  326. package/src/components/shell/SideNav.test.tsx +16 -8
  327. package/src/components/shell/SideNav.tsx +17 -17
  328. package/src/components/shell/TopBar.stories.tsx +44 -19
  329. package/src/components/shell/TopBar.test.tsx +34 -12
  330. package/src/components/shell/TopBar.tsx +61 -40
  331. package/src/components/shell/brands.tsx +66 -0
  332. package/src/components/shell/index.ts +9 -8
  333. package/src/components/shell/{DeviceIndicator.stories.tsx → workout/DeviceIndicator.stories.tsx} +2 -2
  334. package/src/components/shell/{DeviceIndicator.tsx → workout/DeviceIndicator.tsx} +2 -2
  335. package/src/components/shell/{DeviceMenu.stories.tsx → workout/DeviceMenu.stories.tsx} +2 -2
  336. package/src/components/shell/{DeviceMenu.tsx → workout/DeviceMenu.tsx} +3 -3
  337. package/src/components/shell/{DeviceRow.stories.tsx → workout/DeviceRow.stories.tsx} +2 -2
  338. package/src/components/shell/{DeviceRow.tsx → workout/DeviceRow.tsx} +3 -3
  339. package/src/components/shell/{SessionStatePill.stories.tsx → workout/SessionStatePill.stories.tsx} +2 -2
  340. package/src/components/shell/{SessionStatePill.tsx → workout/SessionStatePill.tsx} +5 -3
  341. package/src/components/shell/workout/WorkoutShell.stories.tsx +71 -0
  342. package/src/components/shell/{DashboardShell.test.tsx → workout/WorkoutShell.test.tsx} +19 -8
  343. package/src/components/shell/workout/WorkoutShell.tsx +77 -0
  344. package/src/components/shell/workout/WorkoutTopBar.stories.tsx +58 -0
  345. package/src/components/shell/workout/WorkoutTopBar.test.tsx +39 -0
  346. package/src/components/shell/workout/WorkoutTopBar.tsx +52 -0
  347. package/src/components/shell/workout/index.ts +9 -0
  348. package/src/components/shell/workout/workoutNavItems.tsx +16 -0
  349. package/src/components/ui/README.md +110 -0
  350. package/src/components/ui/alert/Alert.stories.tsx +15 -5
  351. package/src/components/ui/alert/Alert.tsx +24 -3
  352. package/src/components/ui/autocomplete/Autocomplete.stories.tsx +11 -13
  353. package/src/components/ui/autocomplete/Autocomplete.test.tsx +7 -25
  354. package/src/components/ui/autocomplete/Autocomplete.tsx +21 -28
  355. package/src/components/ui/avatar/Avatar.stories.tsx +1 -1
  356. package/src/components/ui/avatar/Avatar.tsx +2 -10
  357. package/src/components/ui/badge/Badge.stories.tsx +83 -28
  358. package/src/components/ui/badge/Badge.test.tsx +19 -3
  359. package/src/components/ui/badge/Badge.tsx +48 -55
  360. package/src/components/ui/breadcrumbs/Breadcrumbs.stories.tsx +1 -1
  361. package/src/components/ui/breadcrumbs/Breadcrumbs.tsx +4 -16
  362. package/src/components/ui/button/Button.stories.tsx +46 -12
  363. package/src/components/ui/button/Button.tsx +44 -37
  364. package/src/components/ui/card/Card.stories.tsx +90 -94
  365. package/src/components/ui/card/Card.test.tsx +80 -6
  366. package/src/components/ui/card/Card.tsx +150 -203
  367. package/src/components/ui/checkbox/Checkbox.stories.tsx +1 -1
  368. package/src/components/ui/checkbox/Checkbox.tsx +7 -27
  369. package/src/components/ui/chip/Chip.stories.tsx +37 -13
  370. package/src/components/ui/chip/Chip.test.tsx +10 -6
  371. package/src/components/ui/chip/Chip.tsx +76 -91
  372. package/src/components/ui/collapse/Collapse.stories.tsx +23 -23
  373. package/src/components/ui/collapse/Collapse.tsx +6 -11
  374. package/src/components/ui/data-row/DataRow.stories.tsx +14 -3
  375. package/src/components/ui/data-row/DataRow.test.tsx +5 -15
  376. package/src/components/ui/data-row/DataRow.tsx +18 -7
  377. package/src/components/ui/divider/Divider.stories.tsx +1 -1
  378. package/src/components/ui/divider/Divider.tsx +1 -5
  379. package/src/components/ui/drawer/Drawer.stories.tsx +5 -16
  380. package/src/components/ui/drawer/Drawer.tsx +13 -27
  381. package/src/components/ui/floating-overlay-depth.test.tsx +143 -0
  382. package/src/components/ui/form-field/FormField.stories.tsx +6 -20
  383. package/src/components/ui/form-field/FormField.test.tsx +1 -5
  384. package/src/components/ui/form-field/FormField.tsx +10 -46
  385. package/src/components/ui/help-tip/HelpTip.stories.tsx +8 -19
  386. package/src/components/ui/help-tip/HelpTip.test.tsx +1 -3
  387. package/src/components/ui/help-tip/HelpTip.tsx +21 -22
  388. package/src/components/ui/help-tip/index.ts +7 -1
  389. package/src/components/ui/icon-box/IconBox.stories.tsx +1 -1
  390. package/src/components/ui/icon-box/IconBox.test.tsx +1 -7
  391. package/src/components/ui/icon-box/IconBox.tsx +10 -18
  392. package/src/components/ui/indicator/Indicator.stories.tsx +5 -4
  393. package/src/components/ui/indicator/Indicator.tsx +20 -14
  394. package/src/components/ui/input/Input.stories.tsx +3 -11
  395. package/src/components/ui/input/Input.test.tsx +2 -10
  396. package/src/components/ui/input/Input.tsx +10 -25
  397. package/src/components/ui/input/index.ts +7 -1
  398. package/src/components/ui/link/Link.stories.tsx +19 -7
  399. package/src/components/ui/list-item/ListItem.stories.tsx +17 -5
  400. package/src/components/ui/list-item/ListItem.tsx +2 -9
  401. package/src/components/ui/menu/Menu.stories.tsx +21 -15
  402. package/src/components/ui/menu/Menu.test.tsx +2 -11
  403. package/src/components/ui/menu/Menu.tsx +12 -14
  404. package/src/components/ui/menu/index.ts +8 -1
  405. package/src/components/ui/modal/Modal.stories.tsx +2 -2
  406. package/src/components/ui/modal/Modal.tsx +31 -19
  407. package/src/components/ui/pill/Pill.stories.tsx +111 -23
  408. package/src/components/ui/pill/Pill.test.tsx +101 -3
  409. package/src/components/ui/pill/Pill.tsx +168 -49
  410. package/src/components/ui/pill/index.ts +1 -1
  411. package/src/components/ui/popover/Popover.stories.tsx +6 -8
  412. package/src/components/ui/popover/Popover.test.tsx +1 -6
  413. package/src/components/ui/popover/Popover.tsx +20 -15
  414. package/src/components/ui/popover/index.ts +7 -1
  415. package/src/components/ui/progress/Progress.stories.tsx +3 -12
  416. package/src/components/ui/progress/Progress.test.tsx +1 -5
  417. package/src/components/ui/progress/Progress.tsx +9 -6
  418. package/src/components/ui/radio/Radio.stories.tsx +42 -21
  419. package/src/components/ui/radio/Radio.test.tsx +6 -2
  420. package/src/components/ui/radio/Radio.tsx +23 -22
  421. package/src/components/ui/section/Section.stories.tsx +12 -21
  422. package/src/components/ui/section/Section.test.tsx +1 -6
  423. package/src/components/ui/section/Section.tsx +1 -3
  424. package/src/components/ui/section/index.ts +1 -5
  425. package/src/components/ui/select/Select.stories.tsx +3 -13
  426. package/src/components/ui/select/Select.test.tsx +2 -11
  427. package/src/components/ui/select/Select.tsx +16 -15
  428. package/src/components/ui/skeleton/Skeleton.stories.tsx +3 -11
  429. package/src/components/ui/skeleton/Skeleton.tsx +3 -14
  430. package/src/components/ui/skeleton/index.ts +1 -7
  431. package/src/components/ui/spinner/Spinner.stories.tsx +1 -1
  432. package/src/components/ui/spinner/Spinner.tsx +4 -5
  433. package/src/components/ui/stack/Stack.stories.tsx +8 -8
  434. package/src/components/ui/stack/Stack.tsx +1 -1
  435. package/src/components/ui/surface/Surface.stories.tsx +92 -33
  436. package/src/components/ui/surface/Surface.test.tsx +88 -28
  437. package/src/components/ui/surface/Surface.tsx +37 -87
  438. package/src/components/ui/surface/SurfaceContext.ts +22 -62
  439. package/src/components/ui/surface/index.ts +8 -0
  440. package/src/components/ui/surface/resolveSurface.ts +98 -0
  441. package/src/components/ui/surface/surface.contract.test.ts +6 -1
  442. package/src/components/ui/switch/Switch.stories.tsx +1 -1
  443. package/src/components/ui/switch/Switch.tsx +7 -6
  444. package/src/components/ui/tabs/Tabs.stories.tsx +1 -1
  445. package/src/components/ui/tabs/Tabs.tsx +8 -21
  446. package/src/components/ui/tabs/index.ts +1 -7
  447. package/src/components/ui/tile/Tile.stories.tsx +1 -1
  448. package/src/components/ui/tile/Tile.tsx +3 -0
  449. package/src/components/ui/toast/Toast.stories.tsx +1 -1
  450. package/src/components/ui/toast/Toast.test.tsx +2 -8
  451. package/src/components/ui/toast/Toast.tsx +49 -57
  452. package/src/components/ui/toast/index.ts +0 -1
  453. package/src/components/ui/toolbar-button/ToolbarButton.stories.tsx +92 -71
  454. package/src/components/ui/toolbar-button/ToolbarButton.test.tsx +3 -18
  455. package/src/components/ui/toolbar-button/ToolbarButton.tsx +38 -49
  456. package/src/components/ui/tooltip/Tooltip.stories.tsx +12 -3
  457. package/src/components/ui/tooltip/Tooltip.test.tsx +21 -3
  458. package/src/components/ui/tooltip/Tooltip.tsx +55 -36
  459. package/src/components/ui/tooltip/index.ts +1 -1
  460. package/src/components/ui/trigger/TriggerSurface.test.tsx +215 -0
  461. package/src/components/ui/trigger/TriggerSurface.tsx +81 -0
  462. package/src/components/ui/trigger/index.ts +2 -0
  463. package/src/stories/PresetShowcase.stories.tsx +101 -48
  464. package/src/test/no-device-internals.test.ts +3 -3
  465. package/src/test/no-raw-color.test.ts +39 -0
  466. package/src/theme/Alpha.stories.tsx +103 -0
  467. package/src/theme/ChoosingTokens.stories.tsx +48 -0
  468. package/src/theme/ColorPalettes.stories.tsx +62 -45
  469. package/src/theme/ColorPrimitives.stories.tsx +35 -35
  470. package/src/theme/Depth.stories.tsx +132 -65
  471. package/src/theme/DepthCalibration.stories.tsx +23 -21
  472. package/src/theme/ProposedTokensVW82.stories.tsx +414 -0
  473. package/src/theme/ThemeProvider.test.tsx +4 -4
  474. package/src/theme/barrel.ts +7 -6
  475. package/src/theme/color-stories.coverage.test.ts +1 -1
  476. package/src/theme/color-utils.ts +41 -29
  477. package/src/theme/config.completeness.test.ts +1 -1
  478. package/src/theme/config.ts +40 -0
  479. package/src/theme/elevation.test.ts +82 -56
  480. package/src/theme/elevation.ts +77 -561
  481. package/src/theme/global.css +45 -5
  482. package/src/theme/grey-ramp.test.ts +24 -8
  483. package/src/theme/lift.test.ts +39 -0
  484. package/src/theme/lift.ts +102 -0
  485. package/src/theme/materials.test.ts +5 -2
  486. package/src/theme/materials.ts +38 -4
  487. package/src/theme/native-theming-guard.test.ts +5 -5
  488. package/src/theme/presets/apply.ts +4 -0
  489. package/src/theme/presets/audiobook.ts +5 -2
  490. package/src/theme/presets/default.ts +4 -0
  491. package/src/theme/presets/index.ts +14 -1
  492. package/src/theme/presets/types.ts +1 -1
  493. package/src/theme/semantic-contrast.test.ts +13 -4
  494. package/src/theme/status-distinctness.test.ts +66 -0
  495. package/src/theme/subtle-tone-weight.test.ts +163 -0
  496. package/src/theme/surface-planes.test.ts +37 -0
  497. package/src/theme/surface-planes.ts +68 -0
  498. package/src/theme/tailwind-var-opacity.test.ts +163 -0
  499. package/src/theme/token-export-guard.test.ts +1 -3
  500. package/src/theme/tokens/primitives.test.ts +15 -7
  501. package/src/theme/tokens/primitives.ts +98 -33
  502. package/src/theme/tokens/semantic-hex-guard.test.ts +322 -0
  503. package/src/theme/tokens/semantic.ts +124 -54
  504. package/src/theme/wash-ladder.test.ts +58 -0
  505. package/src/theme/workout-tokens.ts +1 -7
  506. package/src/types/jest-axe.d.ts +2 -6
  507. package/src/types/raw-md.d.ts +5 -0
  508. package/src/utils/colors.alpha-adoption.test.ts +408 -0
  509. package/src/utils/colors.ts +4 -4
  510. package/src/utils/form.ts +1 -3
  511. package/src/utils/index.ts +2 -7
  512. package/src/utils/number-format.ts +17 -0
  513. package/src/utils/workout-format.ts +15 -6
  514. package/src/web-jsx/jsx-runtime.ts +1 -5
  515. package/tailwind.config.js +55 -9
  516. package/src/components/custom/Workout/ExerciseCardUnified.stories.tsx +0 -151
  517. package/src/components/custom/Workout/RowInventory.stories.tsx +0 -408
  518. package/src/components/custom/Workout/S3FullRail.stories.tsx +0 -46
  519. package/src/components/custom/Workout/S3SessionPace.stories.tsx +0 -95
  520. package/src/components/custom/Workout/S3SessionRailHeading.stories.tsx +0 -61
  521. package/src/components/custom/Workout/S3SetTypes.stories.tsx +0 -176
  522. package/src/components/custom/Workout/S3WorkoutExpansion.stories.tsx +0 -240
  523. package/src/components/shell/DashboardShell.stories.tsx +0 -65
  524. package/src/components/shell/DashboardShell.tsx +0 -75
  525. package/src/components/shell/SessionRailSpecimen.stories.tsx +0 -753
  526. package/src/theme/elevation.stories.tsx +0 -346
  527. package/src/utils/useTheme.ts +0 -72
  528. /package/src/components/shell/{DeviceIndicator.test.tsx → workout/DeviceIndicator.test.tsx} +0 -0
  529. /package/src/components/shell/{DeviceMenu.test.tsx → workout/DeviceMenu.test.tsx} +0 -0
  530. /package/src/components/shell/{DeviceRow.test.tsx → workout/DeviceRow.test.tsx} +0 -0
  531. /package/src/components/shell/{SessionStatePill.test.tsx → workout/SessionStatePill.test.tsx} +0 -0
@@ -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
  }
@@ -10,12 +10,12 @@ export type ButtonColor = 'primary' | 'secondary' | 'success' | 'error' | 'warni
10
10
  /** Inline color map for RNW where Tailwind text classes get dropped */
11
11
  const textColorMap: Record<ButtonVariant, Record<ButtonColor, string>> = {
12
12
  solid: {
13
- primary: '#FFFFFF',
14
- secondary: '#FFFFFF',
15
- success: '#FFFFFF',
16
- error: '#FFFFFF',
17
- warning: '#FFFFFF',
18
- info: '#FFFFFF',
13
+ primary: semanticColorsDark['on-brand-primary'],
14
+ secondary: semanticColorsDark['on-brand-secondary'],
15
+ success: semanticColorsDark['on-status-success'],
16
+ error: semanticColorsDark['on-status-error'],
17
+ warning: semanticColorsDark['on-status-warning'],
18
+ info: semanticColorsDark['on-status-info'],
19
19
  },
20
20
  outline: {
21
21
  primary: semanticColorsDark['brand-primary'],
@@ -78,27 +78,42 @@ export interface ButtonProps extends Omit<PressableProps, 'children'> {
78
78
 
79
79
  const variantStyles: Record<ButtonVariant, Record<ButtonColor, string>> = {
80
80
  solid: {
81
- primary: 'bg-brand-primary active:bg-brand-primary-dark active:scale-[0.98] web:hover:bg-brand-primary-dark web:active:scale-[0.98]',
82
- secondary: 'bg-brand-secondary active:bg-brand-secondary-dark active:scale-[0.98] web:hover:bg-brand-secondary-dark web:active:scale-[0.98]',
83
- success: 'bg-status-success active:opacity-90 active:scale-[0.98] web:hover:opacity-90 web:active:scale-[0.98]',
84
- error: 'bg-status-error active:opacity-90 active:scale-[0.98] web:hover:opacity-90 web:active:scale-[0.98]',
85
- warning: 'bg-status-warning active:opacity-90 active:scale-[0.98] web:hover:opacity-90 web:active:scale-[0.98]',
81
+ primary:
82
+ 'bg-brand-primary active:bg-brand-primary-dark active:scale-[0.98] web:hover:bg-brand-primary-dark web:active:scale-[0.98]',
83
+ secondary:
84
+ 'bg-brand-secondary active:bg-brand-secondary-dark active:scale-[0.98] web:hover:bg-brand-secondary-dark web:active:scale-[0.98]',
85
+ success:
86
+ 'bg-status-success active:opacity-90 active:scale-[0.98] web:hover:opacity-90 web:active:scale-[0.98]',
87
+ error:
88
+ 'bg-status-error active:opacity-90 active:scale-[0.98] web:hover:opacity-90 web:active:scale-[0.98]',
89
+ warning:
90
+ 'bg-status-warning active:opacity-90 active:scale-[0.98] web:hover:opacity-90 web:active:scale-[0.98]',
86
91
  info: 'bg-status-info active:opacity-90 active:scale-[0.98] web:hover:opacity-90 web:active:scale-[0.98]',
87
92
  },
88
93
  outline: {
89
- primary: 'border-2 border-brand-primary bg-transparent active:bg-brand-primary-subtle active:scale-[0.98] web:hover:bg-brand-primary-subtle web:active:scale-[0.98]',
90
- secondary: 'border-2 border-brand-secondary bg-transparent active:bg-brand-secondary-subtle active:scale-[0.98] web:hover:bg-brand-secondary-subtle web:active:scale-[0.98]',
91
- success: 'border-2 border-status-success bg-transparent active:bg-status-success-subtle active:scale-[0.98] web:hover:bg-status-success-subtle web:active:scale-[0.98]',
92
- error: 'border-2 border-status-error bg-transparent active:bg-status-error-subtle active:scale-[0.98] web:hover:bg-status-error-subtle web:active:scale-[0.98]',
93
- warning: 'border-2 border-status-warning bg-transparent active:bg-status-warning-subtle active:scale-[0.98] web:hover:bg-status-warning-subtle web:active:scale-[0.98]',
94
+ primary:
95
+ 'border-2 border-brand-primary bg-transparent active:bg-brand-primary-subtle active:scale-[0.98] web:hover:bg-brand-primary-subtle web:active:scale-[0.98]',
96
+ secondary:
97
+ 'border-2 border-brand-secondary bg-transparent active:bg-brand-secondary-subtle active:scale-[0.98] web:hover:bg-brand-secondary-subtle web:active:scale-[0.98]',
98
+ success:
99
+ 'border-2 border-status-success bg-transparent active:bg-status-success-subtle active:scale-[0.98] web:hover:bg-status-success-subtle web:active:scale-[0.98]',
100
+ error:
101
+ 'border-2 border-status-error bg-transparent active:bg-status-error-subtle active:scale-[0.98] web:hover:bg-status-error-subtle web:active:scale-[0.98]',
102
+ warning:
103
+ 'border-2 border-status-warning bg-transparent active:bg-status-warning-subtle active:scale-[0.98] web:hover:bg-status-warning-subtle web:active:scale-[0.98]',
94
104
  info: 'border-2 border-status-info bg-transparent active:bg-status-info-subtle active:scale-[0.98] web:hover:bg-status-info-subtle web:active:scale-[0.98]',
95
105
  },
96
106
  ghost: {
97
- primary: 'bg-transparent active:bg-brand-primary-subtle active:scale-[0.98] web:hover:bg-brand-primary-subtle web:active:scale-[0.98]',
98
- secondary: 'bg-transparent active:bg-brand-secondary-subtle active:scale-[0.98] web:hover:bg-brand-secondary-subtle web:active:scale-[0.98]',
99
- success: 'bg-transparent active:bg-status-success-subtle active:scale-[0.98] web:hover:bg-status-success-subtle web:active:scale-[0.98]',
100
- error: 'bg-transparent active:bg-status-error-subtle active:scale-[0.98] web:hover:bg-status-error-subtle web:active:scale-[0.98]',
101
- warning: 'bg-transparent active:bg-status-warning-subtle active:scale-[0.98] web:hover:bg-status-warning-subtle web:active:scale-[0.98]',
107
+ primary:
108
+ 'bg-transparent active:bg-brand-primary-subtle active:scale-[0.98] web:hover:bg-brand-primary-subtle web:active:scale-[0.98]',
109
+ secondary:
110
+ 'bg-transparent active:bg-brand-secondary-subtle active:scale-[0.98] web:hover:bg-brand-secondary-subtle web:active:scale-[0.98]',
111
+ success:
112
+ 'bg-transparent active:bg-status-success-subtle active:scale-[0.98] web:hover:bg-status-success-subtle web:active:scale-[0.98]',
113
+ error:
114
+ 'bg-transparent active:bg-status-error-subtle active:scale-[0.98] web:hover:bg-status-error-subtle web:active:scale-[0.98]',
115
+ warning:
116
+ 'bg-transparent active:bg-status-warning-subtle active:scale-[0.98] web:hover:bg-status-warning-subtle web:active:scale-[0.98]',
102
117
  info: 'bg-transparent active:bg-status-info-subtle active:scale-[0.98] web:hover:bg-status-info-subtle web:active:scale-[0.98]',
103
118
  },
104
119
  link: {
@@ -113,12 +128,12 @@ const variantStyles: Record<ButtonVariant, Record<ButtonColor, string>> = {
113
128
 
114
129
  const textStyles: Record<ButtonVariant, Record<ButtonColor, string>> = {
115
130
  solid: {
116
- primary: 'text-white',
117
- secondary: 'text-white',
118
- success: 'text-white',
119
- error: 'text-white',
120
- warning: 'text-white',
121
- info: 'text-white',
131
+ primary: 'text-on-brand-primary',
132
+ secondary: 'text-on-brand-secondary',
133
+ success: 'text-on-status-success',
134
+ error: 'text-on-status-error',
135
+ warning: 'text-on-status-warning',
136
+ info: 'text-on-status-info',
122
137
  },
123
138
  outline: {
124
139
  primary: 'text-brand-primary',
@@ -237,11 +252,7 @@ export const Button = forwardRef<View, ButtonProps>(function Button(
237
252
  )}
238
253
  {isLoading && loadingText ? (
239
254
  <Text
240
- className={cn(
241
- 'font-semibold',
242
- textSizeStyles[size],
243
- textStyles[variant][color]
244
- )}
255
+ className={cn('font-semibold', textSizeStyles[size], textStyles[variant][color])}
245
256
  style={{ color: textColorMap[variant][color] }}
246
257
  >
247
258
  {loadingText}
@@ -262,11 +273,7 @@ export interface ButtonTextProps {
262
273
  * Text component for Button. Use inside Button for consistent styling.
263
274
  */
264
275
  export function ButtonText({ children, className }: ButtonTextProps) {
265
- return (
266
- <Text className={cn('font-semibold text-inherit', className)}>
267
- {children}
268
- </Text>
269
- )
276
+ return <Text className={cn('font-semibold text-inherit', className)}>{children}</Text>
270
277
  }
271
278
 
272
279
  export interface ButtonIconProps {