@titan-design/react-ui 0.5.0 → 0.7.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 (307) hide show
  1. package/dist/bodymap.js +241 -189
  2. package/dist/bodymap.js.map +1 -1
  3. package/dist/bodymap.mjs +241 -189
  4. package/dist/bodymap.mjs.map +1 -1
  5. package/dist/index.d.mts +1017 -130
  6. package/dist/index.d.ts +1017 -130
  7. package/dist/index.js +3058 -1090
  8. package/dist/index.js.map +1 -1
  9. package/dist/index.mjs +2992 -1091
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/{pages-MO0JCySL.d.mts → pages-8u_4WbL-.d.mts} +280 -57
  12. package/dist/{pages-D7Jlssvp.d.ts → pages-DaWiBOGa.d.ts} +280 -57
  13. package/dist/pages.d.mts +1 -1
  14. package/dist/pages.d.ts +1 -1
  15. package/dist/pages.js +1797 -1292
  16. package/dist/pages.js.map +1 -1
  17. package/dist/pages.mjs +1797 -1292
  18. package/dist/pages.mjs.map +1 -1
  19. package/dist/theme/index.d.mts +464 -268
  20. package/dist/theme/index.d.ts +464 -268
  21. package/dist/theme/index.js +303 -191
  22. package/dist/theme/index.js.map +1 -1
  23. package/dist/theme/index.mjs +295 -192
  24. package/dist/theme/index.mjs.map +1 -1
  25. package/dist/theme/tokens-css.js +160 -143
  26. package/dist/theme/tokens-css.js.map +1 -1
  27. package/dist/theme/tokens-css.mjs +160 -143
  28. package/dist/theme/tokens-css.mjs.map +1 -1
  29. package/package.json +3 -1
  30. package/src/arch/Architecture.stories.tsx +870 -0
  31. package/src/arch/annotations.json +48 -0
  32. package/src/arch/arch-graph.json +4301 -0
  33. package/src/components/custom/DateTime/DateTime.stories.tsx +83 -7
  34. package/src/components/custom/DateTime/DateTime.test.tsx +29 -3
  35. package/src/components/custom/DateTime/DateTime.tsx +55 -15
  36. package/src/components/custom/EmptyState/EmptyState.stories.tsx +1 -1
  37. package/src/components/custom/Gauge/Gauge.stories.tsx +1 -1
  38. package/src/components/custom/Gauge/Gauge.test.tsx +2 -2
  39. package/src/components/custom/Gauge/Gauge.tsx +6 -3
  40. package/src/components/custom/Metric/Metric.stories.tsx +1 -1
  41. package/src/components/custom/Scatter/Scatter.stories.tsx +1 -1
  42. package/src/components/custom/Scatter/Scatter.tsx +3 -5
  43. package/src/components/custom/Sidebar/Sidebar.stories.tsx +1 -1
  44. package/src/components/custom/Table/Table.stories.tsx +1 -1
  45. package/src/components/custom/TimerReadout/TimerReadout.stories.tsx +62 -0
  46. package/src/components/custom/TimerReadout/TimerReadout.test.tsx +72 -0
  47. package/src/components/custom/TimerReadout/TimerReadout.tsx +75 -0
  48. package/src/components/custom/TimerReadout/index.ts +1 -0
  49. package/src/components/custom/Treemap/Treemap.stories.tsx +1 -1
  50. package/src/components/custom/Treemap/Treemap.tsx +3 -5
  51. package/src/components/custom/Typography/Typography.stories.tsx +46 -28
  52. package/src/components/custom/Typography/Typography.test.tsx +13 -3
  53. package/src/components/custom/Typography/Typography.tsx +5 -0
  54. package/src/components/custom/Workout/ActiveWorkoutPage.stories.tsx +21 -13
  55. package/src/components/custom/Workout/ActiveWorkoutPage.test.tsx +16 -13
  56. package/src/components/custom/Workout/ActiveWorkoutPage.tsx +11 -16
  57. package/src/components/custom/Workout/BaseBadge.stories.tsx +1 -1
  58. package/src/components/custom/Workout/BodyMap.stories.tsx +1 -1
  59. package/src/components/custom/Workout/BodyMap.tsx +6 -3
  60. package/src/components/custom/Workout/BodyMapDetailPanel.stories.tsx +1 -1
  61. package/src/components/custom/Workout/BodyMapDetailPanel.tsx +6 -3
  62. package/src/components/custom/Workout/CapacityBandChart.stories.tsx +1 -1
  63. package/src/components/custom/Workout/CapacityBandChart.test.tsx +2 -2
  64. package/src/components/custom/Workout/CapacityBandChart.tsx +9 -6
  65. package/src/components/custom/Workout/DeviationBar.stories.tsx +1 -1
  66. package/src/components/custom/Workout/DeviationBar.test.tsx +1 -1
  67. package/src/components/custom/Workout/DeviationBar.tsx +7 -4
  68. package/src/components/custom/Workout/ExerciseCard.stories.tsx +51 -66
  69. package/src/components/custom/Workout/ExerciseCard.test.tsx +146 -143
  70. package/src/components/custom/Workout/ExerciseCard.tsx +176 -198
  71. package/src/components/custom/Workout/ExerciseCardHeading.stories.tsx +99 -0
  72. package/src/components/custom/Workout/ExerciseCardHeading.test.tsx +72 -0
  73. package/src/components/custom/Workout/ExerciseCardHeading.tsx +43 -0
  74. package/src/components/custom/Workout/ExerciseCardUnified.stories.tsx +151 -0
  75. package/src/components/custom/Workout/ExerciseDetailPage.stories.tsx +5 -3
  76. package/src/components/custom/Workout/ExerciseDetailPage.test.tsx +4 -4
  77. package/src/components/custom/Workout/ExerciseDetailPage.tsx +6 -6
  78. package/src/components/custom/Workout/ExerciseHeading.stories.tsx +81 -0
  79. package/src/components/custom/Workout/ExerciseHeading.test.tsx +77 -0
  80. package/src/components/custom/Workout/ExerciseHeading.tsx +85 -0
  81. package/src/components/custom/Workout/ExerciseIndicator.stories.tsx +110 -0
  82. package/src/components/custom/Workout/ExerciseIndicator.test.tsx +93 -0
  83. package/src/components/custom/Workout/ExerciseIndicator.tsx +120 -0
  84. package/src/components/custom/Workout/FatigueMeter.stories.tsx +51 -0
  85. package/src/components/custom/Workout/FatigueMeter.test.tsx +73 -0
  86. package/src/components/custom/Workout/FatigueMeter.tsx +82 -0
  87. package/src/components/custom/Workout/InputBar.stories.tsx +1 -1
  88. package/src/components/custom/Workout/InputBar.tsx +2 -1
  89. package/src/components/custom/Workout/IntensityBar.stories.tsx +1 -1
  90. package/src/components/custom/Workout/IntensityBar.test.tsx +8 -8
  91. package/src/components/custom/Workout/IntensityBar.tsx +10 -6
  92. package/src/components/custom/Workout/LiveAuraFrame.stories.tsx +153 -0
  93. package/src/components/custom/Workout/LiveAuraFrame.test.tsx +74 -0
  94. package/src/components/custom/Workout/LiveAuraFrame.tsx +105 -0
  95. package/src/components/custom/Workout/MesoCard.stories.tsx +1 -1
  96. package/src/components/custom/Workout/MesoCard.tsx +8 -3
  97. package/src/components/custom/Workout/MesoProgressBar.stories.tsx +1 -1
  98. package/src/components/custom/Workout/MesoProgressBar.test.tsx +1 -1
  99. package/src/components/custom/Workout/MesoProgressBar.tsx +3 -2
  100. package/src/components/custom/Workout/MesoStatusCard.stories.tsx +1 -1
  101. package/src/components/custom/Workout/MesoStatusCard.tsx +20 -13
  102. package/src/components/custom/Workout/MetricTiles.stories.tsx +60 -0
  103. package/src/components/custom/Workout/MetricTiles.test.tsx +58 -0
  104. package/src/components/custom/Workout/MetricTiles.tsx +48 -0
  105. package/src/components/custom/Workout/MuscleGroupChip.stories.tsx +1 -1
  106. package/src/components/custom/Workout/MuscleGroupChip.tsx +7 -4
  107. package/src/components/custom/Workout/PlaceholderStrip.stories.tsx +1 -1
  108. package/src/components/custom/Workout/PrBadge.stories.tsx +1 -1
  109. package/src/components/custom/Workout/PrBadge.tsx +5 -2
  110. package/src/components/custom/Workout/PrHistoryModal.stories.tsx +1 -1
  111. package/src/components/custom/Workout/PrHistoryModal.tsx +4 -3
  112. package/src/components/custom/Workout/ProgramPlanningPage.stories.tsx +4 -16
  113. package/src/components/custom/Workout/ProgramPlanningPage.tsx +10 -7
  114. package/src/components/custom/Workout/README.md +146 -4
  115. package/src/components/custom/Workout/ReadinessCheck.stories.tsx +1 -1
  116. package/src/components/custom/Workout/ReadinessCheck.tsx +7 -4
  117. package/src/components/custom/Workout/RestTimer.stories.tsx +1 -1
  118. package/src/components/custom/Workout/RestTimer.tsx +17 -11
  119. package/src/components/custom/Workout/RowInventory.stories.tsx +405 -0
  120. package/src/components/custom/Workout/S3FullRail.stories.tsx +34 -0
  121. package/src/components/custom/Workout/S3SessionPace.stories.tsx +95 -0
  122. package/src/components/custom/Workout/S3SessionRailHeading.stories.tsx +61 -0
  123. package/src/components/custom/Workout/S3SetTypes.stories.tsx +176 -0
  124. package/src/components/custom/Workout/S3WorkoutExpansion.stories.tsx +240 -0
  125. package/src/components/custom/Workout/ScheduleTiles.stories.tsx +40 -0
  126. package/src/components/custom/Workout/ScheduleTiles.test.tsx +34 -0
  127. package/src/components/custom/Workout/ScheduleTiles.tsx +70 -0
  128. package/src/components/custom/Workout/SegmentedBar.stories.tsx +99 -0
  129. package/src/components/custom/Workout/SegmentedBar.test.tsx +77 -0
  130. package/src/components/custom/Workout/SegmentedBar.tsx +172 -0
  131. package/src/components/custom/Workout/SegmentedProgressBar.stories.tsx +50 -0
  132. package/src/components/custom/Workout/SegmentedProgressBar.test.tsx +80 -0
  133. package/src/components/custom/Workout/SegmentedProgressBar.tsx +67 -0
  134. package/src/components/custom/Workout/SessionHeader.stories.tsx +121 -0
  135. package/src/components/custom/Workout/SessionHeader.test.tsx +122 -0
  136. package/src/components/custom/Workout/SessionHeader.tsx +152 -0
  137. package/src/components/custom/Workout/SessionRail.stories.tsx +153 -0
  138. package/src/components/custom/Workout/SessionRail.test.tsx +86 -0
  139. package/src/components/custom/Workout/SessionRail.tsx +126 -0
  140. package/src/components/custom/Workout/SetBar.stories.tsx +124 -0
  141. package/src/components/custom/Workout/SetBar.test.tsx +123 -0
  142. package/src/components/custom/Workout/SetBar.tsx +171 -0
  143. package/src/components/custom/Workout/SetRow.stories.tsx +50 -100
  144. package/src/components/custom/Workout/SetRow.test.tsx +94 -166
  145. package/src/components/custom/Workout/SetRow.tsx +170 -232
  146. package/src/components/custom/Workout/SetStrip.stories.tsx +154 -0
  147. package/src/components/custom/Workout/SetStrip.test.tsx +109 -0
  148. package/src/components/custom/Workout/SetStrip.tsx +71 -0
  149. package/src/components/custom/Workout/SetTableHeader.stories.tsx +66 -0
  150. package/src/components/custom/Workout/SetTableHeader.test.tsx +47 -0
  151. package/src/components/custom/Workout/SetTableHeader.tsx +88 -0
  152. package/src/components/custom/Workout/SetsRepsLoad.stories.tsx +47 -0
  153. package/src/components/custom/Workout/SetsRepsLoad.test.tsx +44 -0
  154. package/src/components/custom/Workout/SetsRepsLoad.tsx +52 -0
  155. package/src/components/custom/Workout/Sparkline.stories.tsx +1 -1
  156. package/src/components/custom/Workout/Sparkline.tsx +2 -1
  157. package/src/components/custom/Workout/StatusDot.stories.tsx +1 -1
  158. package/src/components/custom/Workout/StatusDot.test.tsx +2 -2
  159. package/src/components/custom/Workout/StatusDot.tsx +12 -9
  160. package/src/components/custom/Workout/StatusPill.stories.tsx +59 -0
  161. package/src/components/custom/Workout/StatusPill.test.tsx +63 -0
  162. package/src/components/custom/Workout/StatusPill.tsx +88 -0
  163. package/src/components/custom/Workout/StrengthTrendChart.stories.tsx +1 -1
  164. package/src/components/custom/Workout/StrengthTrendChart.tsx +9 -6
  165. package/src/components/custom/Workout/SupersetWrapper.stories.tsx +1 -1
  166. package/src/components/custom/Workout/SupersetWrapper.tsx +2 -1
  167. package/src/components/custom/Workout/TempoBar.stories.tsx +1 -1
  168. package/src/components/custom/Workout/TempoDisplay.stories.tsx +12 -1
  169. package/src/components/custom/Workout/TempoDisplay.tsx +29 -36
  170. package/src/components/custom/Workout/TrainingStatusPage.stories.tsx +1 -1
  171. package/src/components/custom/Workout/VelocityStrip.modalities.stories.tsx +254 -0
  172. package/src/components/custom/Workout/VelocityStrip.responsive.stories.tsx +145 -0
  173. package/src/components/custom/Workout/VelocityStrip.stories.tsx +129 -66
  174. package/src/components/custom/Workout/VelocityStrip.test.tsx +379 -144
  175. package/src/components/custom/Workout/VelocityStrip.tsx +508 -120
  176. package/src/components/custom/Workout/VolumeLandmarkBar.stories.tsx +73 -0
  177. package/src/components/custom/Workout/VolumeLandmarkBar.test.tsx +119 -0
  178. package/src/components/custom/Workout/VolumeLandmarkBar.tsx +154 -0
  179. package/src/components/custom/Workout/WeekRow.stories.tsx +1 -1
  180. package/src/components/custom/Workout/WeekRow.tsx +3 -2
  181. package/src/components/custom/Workout/WeightBadge.stories.tsx +1 -1
  182. package/src/components/custom/Workout/WeightBadge.tsx +6 -2
  183. package/src/components/custom/Workout/WorkoutCard.stories.tsx +2 -6
  184. package/src/components/custom/Workout/WorkoutCard.test.tsx +13 -46
  185. package/src/components/custom/Workout/WorkoutCard.tsx +5 -2
  186. package/src/components/custom/Workout/WorkoutPill.stories.tsx +1 -1
  187. package/src/components/custom/Workout/WorkoutPill.tsx +12 -8
  188. package/src/components/custom/Workout/ZoneTrack.stories.tsx +140 -0
  189. package/src/components/custom/Workout/ZoneTrack.test.tsx +200 -0
  190. package/src/components/custom/Workout/ZoneTrack.tsx +315 -0
  191. package/src/components/custom/Workout/icons.tsx +6 -67
  192. package/src/components/custom/Workout/index.ts +55 -2
  193. package/src/components/custom/Workout/metricText.stories.tsx +69 -0
  194. package/src/components/custom/Workout/metricText.tsx +34 -0
  195. package/src/components/custom/Workout/paceTone.test.ts +29 -0
  196. package/src/components/custom/Workout/paceTone.ts +27 -0
  197. package/src/components/custom/Workout/setHeadingKit.tsx +177 -0
  198. package/src/components/custom/index.ts +1 -0
  199. package/src/components/custom/stepper/Stepper.stories.tsx +1 -1
  200. package/src/components/icons/SvgIcon.tsx +50 -0
  201. package/src/components/icons/icons.stories.tsx +122 -0
  202. package/src/components/icons/icons.test.tsx +73 -0
  203. package/src/components/icons/icons.tsx +153 -0
  204. package/src/components/icons/index.ts +4 -0
  205. package/src/components/index.ts +6 -0
  206. package/src/components/shell/BrandLockup.stories.tsx +27 -0
  207. package/src/components/shell/BrandLockup.test.tsx +23 -0
  208. package/src/components/shell/BrandLockup.tsx +47 -0
  209. package/src/components/shell/DashboardShell.stories.tsx +65 -0
  210. package/src/components/shell/DashboardShell.test.tsx +42 -0
  211. package/src/components/shell/DashboardShell.tsx +74 -0
  212. package/src/components/shell/DeviceIndicator.stories.tsx +28 -0
  213. package/src/components/shell/DeviceIndicator.test.tsx +26 -0
  214. package/src/components/shell/DeviceIndicator.tsx +52 -0
  215. package/src/components/shell/DeviceMenu.stories.tsx +47 -0
  216. package/src/components/shell/DeviceMenu.test.tsx +40 -0
  217. package/src/components/shell/DeviceMenu.tsx +65 -0
  218. package/src/components/shell/DeviceRow.stories.tsx +38 -0
  219. package/src/components/shell/DeviceRow.test.tsx +37 -0
  220. package/src/components/shell/DeviceRow.tsx +58 -0
  221. package/src/components/shell/NavItem.stories.tsx +52 -0
  222. package/src/components/shell/NavItem.test.tsx +35 -0
  223. package/src/components/shell/NavItem.tsx +75 -0
  224. package/src/components/shell/README.md +116 -0
  225. package/src/components/shell/SessionRailSpecimen.stories.tsx +753 -0
  226. package/src/components/shell/SessionStatePill.stories.tsx +27 -0
  227. package/src/components/shell/SessionStatePill.test.tsx +25 -0
  228. package/src/components/shell/SessionStatePill.tsx +46 -0
  229. package/src/components/shell/SideNav.stories.tsx +81 -0
  230. package/src/components/shell/SideNav.test.tsx +51 -0
  231. package/src/components/shell/SideNav.tsx +74 -0
  232. package/src/components/shell/TopBar.stories.tsx +49 -0
  233. package/src/components/shell/TopBar.test.tsx +36 -0
  234. package/src/components/shell/TopBar.tsx +89 -0
  235. package/src/components/shell/index.ts +13 -0
  236. package/src/components/ui/alert/Alert.stories.tsx +1 -1
  237. package/src/components/ui/autocomplete/Autocomplete.stories.tsx +1 -1
  238. package/src/components/ui/avatar/Avatar.stories.tsx +1 -1
  239. package/src/components/ui/badge/Badge.stories.tsx +1 -1
  240. package/src/components/ui/breadcrumbs/Breadcrumbs.stories.tsx +1 -1
  241. package/src/components/ui/button/Button.stories.tsx +1 -1
  242. package/src/components/ui/card/Card.stories.tsx +1 -1
  243. package/src/components/ui/checkbox/Checkbox.stories.tsx +1 -1
  244. package/src/components/ui/chip/Chip.stories.tsx +1 -1
  245. package/src/components/ui/collapse/Collapse.stories.tsx +1 -1
  246. package/src/components/ui/data-row/DataRow.stories.tsx +1 -1
  247. package/src/components/ui/divider/Divider.stories.tsx +1 -1
  248. package/src/components/ui/drawer/Drawer.stories.tsx +1 -1
  249. package/src/components/ui/form-field/FormField.stories.tsx +1 -1
  250. package/src/components/ui/help-tip/HelpTip.stories.tsx +1 -1
  251. package/src/components/ui/icon-box/IconBox.stories.tsx +1 -1
  252. package/src/components/ui/index.ts +1 -0
  253. package/src/components/ui/indicator/Indicator.stories.tsx +38 -2
  254. package/src/components/ui/indicator/Indicator.test.tsx +20 -1
  255. package/src/components/ui/indicator/Indicator.tsx +50 -6
  256. package/src/components/ui/indicator/index.ts +1 -1
  257. package/src/components/ui/input/Input.stories.tsx +1 -1
  258. package/src/components/ui/link/Link.stories.tsx +1 -1
  259. package/src/components/ui/list-item/ListItem.stories.tsx +1 -1
  260. package/src/components/ui/menu/Menu.stories.tsx +1 -1
  261. package/src/components/ui/modal/Modal.stories.tsx +1 -1
  262. package/src/components/ui/pill/Pill.stories.tsx +1 -1
  263. package/src/components/ui/popover/Popover.stories.tsx +1 -1
  264. package/src/components/ui/progress/Progress.stories.tsx +1 -1
  265. package/src/components/ui/radio/Radio.stories.tsx +1 -1
  266. package/src/components/ui/section/Section.stories.tsx +1 -1
  267. package/src/components/ui/select/Select.stories.tsx +1 -1
  268. package/src/components/ui/skeleton/Skeleton.stories.tsx +1 -1
  269. package/src/components/ui/spinner/Spinner.stories.tsx +1 -1
  270. package/src/components/ui/spinner/Spinner.tsx +3 -2
  271. package/src/components/ui/stack/Stack.stories.tsx +1 -1
  272. package/src/components/ui/surface/Surface.stories.tsx +1 -1
  273. package/src/components/ui/switch/Switch.stories.tsx +1 -1
  274. package/src/components/ui/tabs/Tabs.stories.tsx +1 -1
  275. package/src/components/ui/tile/Tile.stories.tsx +79 -0
  276. package/src/components/ui/tile/Tile.test.tsx +48 -0
  277. package/src/components/ui/tile/Tile.tsx +64 -0
  278. package/src/components/ui/tile/index.ts +2 -0
  279. package/src/components/ui/toast/Toast.stories.tsx +1 -1
  280. package/src/components/ui/toolbar-button/ToolbarButton.stories.tsx +1 -1
  281. package/src/components/ui/toolbar-button/ToolbarButton.tsx +2 -1
  282. package/src/components/ui/tooltip/Tooltip.stories.tsx +1 -1
  283. package/src/examples/react-hook-form/ReactHookForm.stories.tsx +1 -1
  284. package/src/hooks/index.ts +2 -0
  285. package/src/hooks/useTimer.test.ts +150 -0
  286. package/src/hooks/useTimer.ts +77 -0
  287. package/src/index.ts +3 -0
  288. package/src/pages.ts +1 -1
  289. package/src/stories/PresetShowcase.stories.tsx +1 -1
  290. package/src/stories/ThemePresets.stories.tsx +1 -1
  291. package/src/theme/ColorSystem.stories.tsx +323 -0
  292. package/src/theme/Colors.stories.tsx +74 -9
  293. package/src/theme/barrel.ts +1 -0
  294. package/src/theme/config.ts +20 -3
  295. package/src/theme/elevation.stories.tsx +1 -1
  296. package/src/theme/extracted-colors-dataviz.ts +21 -0
  297. package/src/theme/extracted-colors-ui.ts +20 -0
  298. package/src/theme/global.css +69 -53
  299. package/src/theme/gradients.test.ts +25 -0
  300. package/src/theme/gradients.ts +36 -0
  301. package/src/theme/shadows.stories.tsx +1 -1
  302. package/src/theme/tokens/primitives.test.ts +232 -0
  303. package/src/theme/tokens/primitives.ts +238 -87
  304. package/src/theme/tokens/semantic.ts +101 -81
  305. package/src/theme/workout-tokens.ts +26 -21
  306. package/src/utils/avatar-color.ts +3 -3
  307. package/tailwind.config.js +15 -3
@@ -17,49 +17,58 @@
17
17
  * - interactive-* : Hover/focus/active/disabled states
18
18
  */
19
19
 
20
- import { primitiveColors as p, discreteRainbow } from './primitives'
20
+ import { primitiveColors as p, primitiveRamps as ramp, discreteRainbow } from './primitives'
21
21
 
22
22
  // Light mode semantic colors (default)
23
23
  export const semanticColorsLight = {
24
24
  // Brand colors (brand-*)
25
- 'brand-primary': p.accent[400], // #FF7900
26
- 'brand-primary-light': p.accent[200], // #FF9630
27
- 'brand-primary-dark': p.accent[700], // #D0620C
25
+ 'brand-primary': ramp.orange[400],
26
+ 'brand-primary-light': ramp.orange[300],
27
+ 'brand-primary-dark': ramp.orange[500],
28
28
  'brand-primary-subtle': 'rgba(255, 121, 0, 0.08)',
29
- 'brand-primary-hover': p.accent[500],
30
- 'brand-primary-active': p.accent[600],
29
+ 'brand-primary-hover': ramp.orange[500],
30
+ 'brand-primary-active': ramp.orange[600],
31
31
 
32
- 'brand-secondary': p.steel[500], // #406D87
33
- 'brand-secondary-light': p.steel[300], // #678498
34
- 'brand-secondary-dark': p.steel[700], // #32556D
35
- 'brand-secondary-subtle': 'rgba(64, 109, 135, 0.08)',
36
- 'brand-secondary-hover': p.steel[600],
37
- 'brand-secondary-active': p.steel[700],
32
+ 'brand-secondary': ramp.cyan[600],
33
+ 'brand-secondary-light': ramp.cyan[500],
34
+ 'brand-secondary-dark': ramp.cyan[700],
35
+ 'brand-secondary-subtle': 'rgba(48, 123, 155, 0.08)',
36
+ 'brand-secondary-hover': ramp.cyan[700],
37
+ 'brand-secondary-active': ramp.cyan[800],
38
38
 
39
39
  // Text on brand backgrounds (on-*)
40
40
  'on-brand-primary': p.white,
41
41
  'on-brand-secondary': p.white,
42
42
 
43
43
  // Status colors (status-*)
44
- 'status-success': p.teal[500], // #14B8A6
45
- 'status-success-light': p.teal[400], // #43C6B7
46
- 'status-success-dark': p.teal[700], // #0E8074
47
- 'status-success-subtle': p.teal[50],
48
-
49
- 'status-error': p.red[600], // #D14343
50
- 'status-error-light': p.red[400], // #DA6868
51
- 'status-error-dark': p.red[700], // #922E2E
52
- 'status-error-subtle': p.red[50],
53
-
54
- 'status-warning': p.amber[500], // #FFB020
55
- 'status-warning-light': p.amber[400], // #FFBF4C
56
- 'status-warning-dark': p.amber[600], // #B27B16
57
- 'status-warning-subtle': p.amber[50],
58
-
59
- 'status-info': p.sky[500], // #2196F3
60
- 'status-info-light': p.sky[400], // #64B6F7
61
- 'status-info-dark': p.sky[700], // #0B79D0
62
- 'status-info-subtle': p.sky[50],
44
+ 'status-success': ramp.green[300],
45
+ 'status-success-light': ramp.green[200],
46
+ 'status-success-dark': ramp.green[600],
47
+ 'status-success-subtle': ramp.green[50],
48
+
49
+ // Live-session accent — its OWN role, decoupled from success so the two can diverge
50
+ 'status-live': ramp.green[300],
51
+ 'status-live-muted': ramp.green[500],
52
+
53
+ 'status-error': ramp.red[600],
54
+ 'status-error-light': ramp.red[500],
55
+ 'status-error-dark': ramp.red[700],
56
+ 'status-error-subtle': ramp.red[50],
57
+
58
+ 'status-error-vivid': p.redVivid[500], // vivid alert red
59
+ 'status-error-vivid-light': p.redVivid[400],
60
+ 'status-error-vivid-dark': p.redVivid[700],
61
+ 'status-error-vivid-subtle': 'rgba(255, 71, 87, 0.12)',
62
+
63
+ 'status-warning': ramp.amber[300],
64
+ 'status-warning-light': ramp.amber[200],
65
+ 'status-warning-dark': ramp.amber[500],
66
+ 'status-warning-subtle': ramp.amber[50],
67
+
68
+ 'status-info': ramp.blue[500],
69
+ 'status-info-light': ramp.blue[300],
70
+ 'status-info-dark': ramp.blue[600],
71
+ 'status-info-subtle': ramp.blue[50],
63
72
 
64
73
  // Text on status backgrounds (on-status-*)
65
74
  'on-status-success': p.white,
@@ -85,16 +94,16 @@ export const semanticColorsLight = {
85
94
 
86
95
  // Data visualization colors (data-*)
87
96
  // First 10 colors from discrete rainbow optimized for charts
88
- 'data-1': discreteRainbow[9], // #1965B0 - Blue
89
- 'data-2': discreteRainbow[14], // #4EB265 - Green
90
- 'data-3': discreteRainbow[17], // #F7F056 - Yellow
91
- 'data-4': discreteRainbow[25], // #DC050C - Red
92
- 'data-5': discreteRainbow[8], // #882E72 - Purple
93
- 'data-6': discreteRainbow[20], // #F4A736 - Orange
94
- 'data-7': discreteRainbow[13], // #7BAFDE - Light Blue
95
- 'data-8': discreteRainbow[15], // #90C987 - Light Green
96
- 'data-9': discreteRainbow[3], // #CAACCB - Lavender
97
- 'data-10': discreteRainbow[22], // #EE8026 - Dark Orange
97
+ 'data-1': discreteRainbow[9], // Blue
98
+ 'data-2': discreteRainbow[14], // Green
99
+ 'data-3': discreteRainbow[17], // Yellow
100
+ 'data-4': discreteRainbow[25], // Red
101
+ 'data-5': discreteRainbow[8], // Purple
102
+ 'data-6': discreteRainbow[20], // Orange
103
+ 'data-7': discreteRainbow[13], // Light Blue
104
+ 'data-8': discreteRainbow[15], // Light Green
105
+ 'data-9': discreteRainbow[3], // Lavender
106
+ 'data-10': discreteRainbow[22], // Dark Orange
98
107
 
99
108
  // Text colors (text-*)
100
109
  'text-primary': '#121828',
@@ -107,8 +116,8 @@ export const semanticColorsLight = {
107
116
 
108
117
  // Surface colors (surface-*) - for elevated containers
109
118
  'surface-base': p.white,
110
- 'surface-elevated': p.neutral[50], // #FAFAFA - slightly off-white for elevated cards
111
- 'surface-raised': p.neutral[100], // #F3F4F6 - light gray for raised cards
119
+ 'surface-elevated': p.neutral[50], // slightly off-white for elevated cards
120
+ 'surface-raised': p.neutral[100], // light gray for raised cards
112
121
  'surface-overlay': p.white,
113
122
  'surface-input': p.neutral[50], // Input field background (filled variant)
114
123
 
@@ -121,6 +130,7 @@ export const semanticColorsLight = {
121
130
  'border-default': '#E8E9EB',
122
131
  'border-subtle': p.neutral[100],
123
132
  'border-strong': p.neutral[300],
133
+ 'border-prominent': p.neutral[400], // high-visibility divider
124
134
  'border-focus': p.blue[600],
125
135
  'border-input': p.neutral[300], // Input field border
126
136
  'border-input-hover': p.neutral[400], // Input field border on hover
@@ -146,43 +156,52 @@ export const semanticColorsLight = {
146
156
  // Dark mode semantic colors
147
157
  export const semanticColorsDark = {
148
158
  // Brand colors stay the same in dark mode
149
- 'brand-primary': p.accent[400],
150
- 'brand-primary-light': p.accent[200],
151
- 'brand-primary-dark': p.accent[700],
159
+ 'brand-primary': ramp.orange[400],
160
+ 'brand-primary-light': ramp.orange[300],
161
+ 'brand-primary-dark': ramp.orange[500],
152
162
  'brand-primary-subtle': 'rgba(255, 121, 0, 0.12)',
153
- 'brand-primary-hover': p.accent[300],
154
- 'brand-primary-active': p.accent[200],
163
+ 'brand-primary-hover': ramp.orange[300],
164
+ 'brand-primary-active': ramp.orange[200],
155
165
 
156
- 'brand-secondary': p.steel[500],
157
- 'brand-secondary-light': p.steel[300],
158
- 'brand-secondary-dark': p.steel[700],
159
- 'brand-secondary-subtle': 'rgba(64, 109, 135, 0.12)',
160
- 'brand-secondary-hover': p.steel[400],
161
- 'brand-secondary-active': p.steel[300],
166
+ 'brand-secondary': ramp.cyan[600],
167
+ 'brand-secondary-light': ramp.cyan[500],
168
+ 'brand-secondary-dark': ramp.cyan[700],
169
+ 'brand-secondary-subtle': 'rgba(48, 123, 155, 0.12)',
170
+ 'brand-secondary-hover': ramp.cyan[500],
171
+ 'brand-secondary-active': ramp.cyan[400],
162
172
 
163
173
  // Text on brand backgrounds
164
174
  'on-brand-primary': p.white,
165
175
  'on-brand-secondary': p.white,
166
176
 
167
177
  // Status colors
168
- 'status-success': p.teal[500],
169
- 'status-success-light': p.teal[400],
170
- 'status-success-dark': p.teal[700],
171
- 'status-success-subtle': 'rgba(20, 184, 166, 0.12)',
172
-
173
- 'status-error': p.red[600],
174
- 'status-error-light': p.red[400],
175
- 'status-error-dark': p.red[700],
178
+ 'status-success': ramp.green[300],
179
+ 'status-success-light': ramp.green[200],
180
+ 'status-success-dark': ramp.green[600],
181
+ 'status-success-subtle': 'rgba(46, 213, 115, 0.12)',
182
+
183
+ // Live-session accent — its OWN role, decoupled from success so the two can diverge
184
+ 'status-live': ramp.green[300],
185
+ 'status-live-muted': ramp.green[500],
186
+
187
+ 'status-error': ramp.red[600],
188
+ 'status-error-light': ramp.red[500],
189
+ 'status-error-dark': ramp.red[700],
176
190
  'status-error-subtle': 'rgba(209, 67, 67, 0.12)',
177
191
 
178
- 'status-warning': p.amber[500],
179
- 'status-warning-light': p.amber[400],
180
- 'status-warning-dark': p.amber[600],
181
- 'status-warning-subtle': 'rgba(255, 176, 32, 0.12)',
192
+ 'status-error-vivid': p.redVivid[500],
193
+ 'status-error-vivid-light': p.redVivid[400],
194
+ 'status-error-vivid-dark': p.redVivid[700],
195
+ 'status-error-vivid-subtle': 'rgba(255, 71, 87, 0.12)',
182
196
 
183
- 'status-info': p.sky[500],
184
- 'status-info-light': p.sky[400],
185
- 'status-info-dark': p.sky[700],
197
+ 'status-warning': ramp.amber[300],
198
+ 'status-warning-light': ramp.amber[200],
199
+ 'status-warning-dark': ramp.amber[500],
200
+ 'status-warning-subtle': 'rgba(249, 180, 21, 0.12)',
201
+
202
+ 'status-info': ramp.blue[500],
203
+ 'status-info-light': ramp.blue[300],
204
+ 'status-info-dark': ramp.blue[600],
186
205
  'status-info-subtle': 'rgba(33, 150, 243, 0.12)',
187
206
 
188
207
  // Text on status backgrounds
@@ -229,21 +248,22 @@ export const semanticColorsDark = {
229
248
  'text-link-hover': p.blue[400],
230
249
 
231
250
  // Surface colors - dark backgrounds
232
- 'surface-base': p.charcoal[700], // #161616 - main surface
233
- 'surface-elevated': p.charcoal[600], // #191919 - elevated surface
234
- 'surface-raised': p.charcoal[500], // #1C1C1C - raised surface
235
- 'surface-overlay': p.charcoal[600], // #191919 - overlay surface
236
- 'surface-input': p.charcoal[600], // #191919 - input surface
251
+ 'surface-base': p.charcoal[700], // main surface
252
+ 'surface-elevated': p.charcoal[600], // elevated surface
253
+ 'surface-raised': p.charcoal[500], // raised surface
254
+ 'surface-overlay': p.charcoal[600], // overlay surface
255
+ 'surface-input': p.charcoal[600], // input surface
237
256
 
238
257
  // Background colors
239
- 'background-base': p.charcoal[900], // #101010 - darkest charcoal
240
- 'background-default': p.charcoal[700], // #161616 - main background
241
- 'background-subtle': p.charcoal[500], // #1C1C1C - subtle background
258
+ 'background-base': p.charcoal[900], // darkest charcoal
259
+ 'background-default': p.charcoal[700], // main background
260
+ 'background-subtle': p.charcoal[500], // subtle background
242
261
 
243
262
  // Border colors
244
- 'border-default': p.charcoal[400], // #1F1F1F - default border
245
- 'border-subtle': p.charcoal[500], // #1C1C1C - subtle border
246
- 'border-strong': p.charcoal[300], // #2C2C2C - strong border
263
+ 'border-default': p.charcoal[400], // default border
264
+ 'border-subtle': p.charcoal[500], // subtle border
265
+ 'border-strong': p.charcoal[300], // strong border
266
+ 'border-prominent': p.charcoal[200], // high-visibility divider
247
267
  'border-focus': '#828DF8',
248
268
  'border-input': p.neutral[600],
249
269
  'border-input-hover': p.neutral[500],
@@ -259,7 +279,7 @@ export const semanticColorsDark = {
259
279
  'interactive-disabled-text': 'rgba(255, 255, 255, 0.26)',
260
280
 
261
281
  // Divider
262
- 'divider': p.charcoal[400], // #1F1F1F - divider color
282
+ 'divider': p.charcoal[400], // divider color
263
283
 
264
284
  // Avatar default
265
285
  'avatar-background': p.neutral[600],
@@ -2,31 +2,36 @@
2
2
  * Workout-specific tokens not yet in the main Tailwind config.
3
3
  * Use these inline instead of Tailwind classes.
4
4
  */
5
+ import { divergingScale, sequentialEffort, primitiveRamps as ramp } from './tokens/primitives'
6
+
5
7
  export const WORKOUT_TOKENS = {
6
8
  // Canonical 4-band performance scale — the single source for BOTH the
7
9
  // VelocityStrip zone bars and the SetRow RPE color (TD-03.43). The direction
8
10
  // is intentionally inverted between the two consumers: for velocity, green =
9
- // fastest/best; for RPE, green = easiest. Each component maps its own
10
- // thresholds onto these four colors. Kept as vivid data-viz values (distinct
11
- // from the muted status tokens) and theme-independent, so like the heatmap
12
- // scale below they are consumed inline as a JS import rather than CSS vars.
13
- // A JS import also resolves on native RN, unlike var(--…) strings.
11
+ // fastest/best; for RPE, green = easiest. This is the [0,2,3,4] subsample of
12
+ // the canonical `sequentialEffort` primitive: an EVEN hue walk across the ramp
13
+ // (green gold orange → red). The earlier [0,1,2,4] spent two of its four
14
+ // bands on adjacent yellows (amber-200 + amber-300) and skipped orange, reading
15
+ // yellow-heavy with an abrupt jump to red; sampling amber-300 + orange-400
16
+ // instead gives four cleanly separable bands that hold at 3px strip scale.
17
+ // Consumed inline (RN).
14
18
  scale: {
15
- green: '#2ed573',
16
- yellow: '#ffd43b',
17
- orange: '#ffa502',
18
- red: '#ff4757',
19
+ green: sequentialEffort[0], // green-300
20
+ yellow: sequentialEffort[2], // amber-300 (gold)
21
+ orange: sequentialEffort[3], // orange-400 (true orange)
22
+ red: sequentialEffort[4], // red-600
19
23
  },
20
24
 
21
- // BodyMap volume heatmap scale (drive dynamic SVG fills, so inline values).
22
- // Maps weekly-volume status against MEV/MAV/MRV landmarks to a fill color.
25
+ // BodyMap volume heatmap the canonical `divergingScale` (under optimal
26
+ // over): a true diverging shape with a light green center, cool-blue under-
27
+ // trained end and warm-red over-reaching end (colorblind-robust in lightness).
23
28
  heatmap: {
24
- none: '#E0E0E0', // gray — no training data
25
- under: '#4A90D9', // cool blue — below MEV
26
- maintenance: '#F5C842', // warm yellow — MEV to MAV
27
- productive: '#4CAF50', // green — MAV to MRV
28
- approaching: '#FFA502', // orange — near MRV
29
- over: '#FF6B35', // red-orange — over MRV
29
+ none: '#E0E0E0', // no training data
30
+ under: divergingScale[0], // below MEV
31
+ maintenance: divergingScale[1], // MEV to MAV
32
+ productive: divergingScale[2], // optimal center — MAV to MRV
33
+ approaching: divergingScale[3], // near MRV
34
+ over: divergingScale[4], // over MRV
30
35
  },
31
36
 
32
37
  // Badge border-radius (rounded-sm is 4px, we need 2px)
@@ -36,12 +41,12 @@ export const WORKOUT_TOKENS = {
36
41
  // components use the CSS custom properties (var(--color-surface-*/border-*))
37
42
  // directly. Only theme-independent data-viz values remain below.
38
43
 
39
- // Intensity bar specific
44
+ // Intensity bar specific — over-target tiers deepen along the red ramp.
40
45
  intensity: {
41
46
  track: '#333333',
42
- over1: '#D14343',
43
- over2: '#A62626',
44
- over3: '#7A1C1C',
47
+ over1: ramp.red[600], // matches status-error
48
+ over2: ramp.red[700],
49
+ over3: ramp.red[800],
45
50
  targetLine: 'rgba(33, 150, 243, 0.5)',
46
51
  atTargetGlow:
47
52
  '0 0 5px 1px rgba(33, 150, 243, 0.35), 0 0 10px 3px rgba(33, 150, 243, 0.15)',
@@ -1,6 +1,6 @@
1
- const AVATAR_COLORS = [
2
- '#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FFEAA7', '#DDA0DD', '#98D8C8'
3
- ]
1
+ import { AVATAR_CATEGORICAL_COLORS } from '../theme/extracted-colors-ui'
2
+
3
+ const AVATAR_COLORS = AVATAR_CATEGORICAL_COLORS
4
4
 
5
5
  export function avatarColor(name: string): string {
6
6
  let hash = 0
@@ -38,12 +38,23 @@ module.exports = {
38
38
  dark: 'var(--color-status-success-dark)',
39
39
  subtle: 'var(--color-status-success-subtle)',
40
40
  },
41
+ // Live-session accent — own role, decoupled from success
42
+ live: {
43
+ DEFAULT: 'var(--color-status-live)',
44
+ muted: 'var(--color-status-live-muted)',
45
+ },
41
46
  error: {
42
47
  DEFAULT: 'var(--color-status-error)',
43
48
  light: 'var(--color-status-error-light)',
44
49
  dark: 'var(--color-status-error-dark)',
45
50
  subtle: 'var(--color-status-error-subtle)',
46
51
  },
52
+ 'error-vivid': {
53
+ DEFAULT: 'var(--color-status-error-vivid)',
54
+ light: 'var(--color-status-error-vivid-light)',
55
+ dark: 'var(--color-status-error-vivid-dark)',
56
+ subtle: 'var(--color-status-error-vivid-subtle)',
57
+ },
47
58
  warning: {
48
59
  DEFAULT: 'var(--color-status-warning)',
49
60
  light: 'var(--color-status-warning-light)',
@@ -132,6 +143,7 @@ module.exports = {
132
143
  DEFAULT: 'var(--color-border-default)',
133
144
  subtle: 'var(--color-border-subtle)',
134
145
  strong: 'var(--color-border-strong)',
146
+ prominent: 'var(--color-border-prominent)',
135
147
  focus: 'var(--color-border-focus)',
136
148
  input: {
137
149
  DEFAULT: 'var(--color-border-input)',
@@ -184,10 +196,10 @@ module.exports = {
184
196
  xl: '0px 20px 25px rgba(100, 116, 139, 0.12)',
185
197
  // Glow shadows (colored radial glow for emphasis)
186
198
  'glow-primary': '0 0 20px 2px rgba(var(--color-brand-primary-rgb, 255, 121, 0), 0.4)',
187
- 'glow-secondary': '0 0 20px 2px rgba(var(--color-brand-secondary-rgb, 64, 109, 135), 0.4)',
188
- 'glow-success': '0 0 20px 2px rgba(var(--color-status-success-rgb, 20, 184, 166), 0.35)',
199
+ 'glow-secondary': '0 0 20px 2px rgba(var(--color-brand-secondary-rgb, 48, 123, 155), 0.4)',
200
+ 'glow-success': '0 0 20px 2px rgba(var(--color-status-success-rgb, 46, 213, 115), 0.35)',
189
201
  'glow-error': '0 0 20px 2px rgba(var(--color-status-error-rgb, 209, 67, 67), 0.4)',
190
- 'glow-warning': '0 0 20px 2px rgba(var(--color-status-warning-rgb, 255, 176, 32), 0.35)',
202
+ 'glow-warning': '0 0 20px 2px rgba(var(--color-status-warning-rgb, 249, 180, 21), 0.35)',
191
203
  'glow-info': '0 0 20px 2px rgba(var(--color-status-info-rgb, 33, 150, 243), 0.35)',
192
204
  'glow-sm': '0 0 12px 0px',
193
205
  'glow-md': '0 0 20px 2px',