@titan-design/react-ui 0.12.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (509) hide show
  1. package/README.md +46 -47
  2. package/dist/bodymap.js +768 -701
  3. package/dist/bodymap.js.map +1 -1
  4. package/dist/bodymap.mjs +770 -703
  5. package/dist/bodymap.mjs.map +1 -1
  6. package/dist/index.d.mts +1320 -215
  7. package/dist/index.d.ts +1320 -215
  8. package/dist/index.js +5996 -4498
  9. package/dist/index.js.map +1 -1
  10. package/dist/index.mjs +5773 -4357
  11. package/dist/index.mjs.map +1 -1
  12. package/dist/{pages-CvsFqNtx.d.mts → pages-CpW3OB3g.d.mts} +21 -3
  13. package/dist/{pages-B1hqnGIC.d.ts → pages-_3Ajpiqu.d.ts} +21 -3
  14. package/dist/pages.d.mts +1 -1
  15. package/dist/pages.d.ts +1 -1
  16. package/dist/pages.js +1435 -1428
  17. package/dist/pages.js.map +1 -1
  18. package/dist/pages.mjs +1443 -1436
  19. package/dist/pages.mjs.map +1 -1
  20. package/dist/theme/index.d.mts +202 -1042
  21. package/dist/theme/index.d.ts +202 -1042
  22. package/dist/theme/index.js +215 -300
  23. package/dist/theme/index.js.map +1 -1
  24. package/dist/theme/index.mjs +202 -296
  25. package/dist/theme/index.mjs.map +1 -1
  26. package/dist/theme/tokens-css.js +62 -5
  27. package/dist/theme/tokens-css.js.map +1 -1
  28. package/dist/theme/tokens-css.mjs +62 -5
  29. package/dist/theme/tokens-css.mjs.map +1 -1
  30. package/dist/theme/tokens.d.mts +972 -0
  31. package/dist/theme/tokens.d.ts +972 -0
  32. package/dist/theme/tokens.js +904 -0
  33. package/dist/theme/tokens.js.map +1 -0
  34. package/dist/theme/tokens.mjs +880 -0
  35. package/dist/theme/tokens.mjs.map +1 -0
  36. package/docs/audits/2026-09-08-critique-addenda.md +51 -0
  37. package/docs/audits/2026-09-08-library-critique.md +212 -0
  38. package/docs/library-roadmap.md +99 -0
  39. package/package.json +7 -1
  40. package/src/arch/arch-graph.freshness.test.ts +52 -0
  41. package/src/arch/arch-graph.json +5021 -1617
  42. package/src/components/custom/ActiveWork/CoChangeChip.stories.tsx +44 -0
  43. package/src/components/custom/ActiveWork/CoChangeChip.test.tsx +29 -0
  44. package/src/components/custom/ActiveWork/CoChangeChip.tsx +48 -0
  45. package/src/components/custom/ActiveWork/Eyebrow.stories.tsx +25 -0
  46. package/src/components/custom/ActiveWork/Eyebrow.test.tsx +16 -0
  47. package/src/components/custom/ActiveWork/Eyebrow.tsx +26 -0
  48. package/src/components/custom/ActiveWork/FileActivityDetail.stories.tsx +50 -0
  49. package/src/components/custom/ActiveWork/FileActivityDetail.test.tsx +66 -0
  50. package/src/components/custom/ActiveWork/FileActivityDetail.tsx +202 -0
  51. package/src/components/custom/ActiveWork/FileActivityRow.stories.tsx +70 -0
  52. package/src/components/custom/ActiveWork/FileActivityRow.test.tsx +67 -0
  53. package/src/components/custom/ActiveWork/FileActivityRow.tsx +130 -0
  54. package/src/components/custom/ActiveWork/FileHistoryExplorer.stories.tsx +84 -0
  55. package/src/components/custom/ActiveWork/FileHistoryExplorer.test.tsx +99 -0
  56. package/src/components/custom/ActiveWork/FileHistoryExplorer.tsx +138 -0
  57. package/src/components/custom/ActiveWork/FilePathLabel.stories.tsx +39 -0
  58. package/src/components/custom/ActiveWork/FilePathLabel.test.tsx +53 -0
  59. package/src/components/custom/ActiveWork/FilePathLabel.tsx +63 -0
  60. package/src/components/custom/ActiveWork/InitiativeBrief.stories.tsx +50 -0
  61. package/src/components/custom/ActiveWork/InitiativeBrief.test.tsx +62 -0
  62. package/src/components/custom/ActiveWork/InitiativeBrief.tsx +181 -0
  63. package/src/components/custom/ActiveWork/InitiativeCard.stories.tsx +73 -0
  64. package/src/components/custom/ActiveWork/InitiativeCard.test.tsx +68 -0
  65. package/src/components/custom/ActiveWork/InitiativeCard.tsx +136 -0
  66. package/src/components/custom/ActiveWork/InitiativeHeader.stories.tsx +59 -0
  67. package/src/components/custom/ActiveWork/InitiativeHeader.test.tsx +40 -0
  68. package/src/components/custom/ActiveWork/InitiativeHeader.tsx +73 -0
  69. package/src/components/custom/ActiveWork/InitiativeReader.stories.tsx +145 -0
  70. package/src/components/custom/ActiveWork/OpenLoops.stories.tsx +58 -0
  71. package/src/components/custom/ActiveWork/OpenLoops.test.tsx +61 -0
  72. package/src/components/custom/ActiveWork/OpenLoops.tsx +107 -0
  73. package/src/components/custom/ActiveWork/PortfolioOverview.stories.tsx +101 -0
  74. package/src/components/custom/ActiveWork/PortfolioOverview.test.tsx +81 -0
  75. package/src/components/custom/ActiveWork/PortfolioOverview.tsx +83 -0
  76. package/src/components/custom/ActiveWork/README.md +305 -0
  77. package/src/components/custom/ActiveWork/SessionDetail.stories.tsx +71 -0
  78. package/src/components/custom/ActiveWork/SessionDetail.test.tsx +84 -0
  79. package/src/components/custom/ActiveWork/SessionDetail.tsx +180 -0
  80. package/src/components/custom/ActiveWork/SessionList.stories.tsx +69 -0
  81. package/src/components/custom/ActiveWork/SessionList.test.tsx +78 -0
  82. package/src/components/custom/ActiveWork/SessionList.tsx +103 -0
  83. package/src/components/custom/ActiveWork/SessionListItem.stories.tsx +64 -0
  84. package/src/components/custom/ActiveWork/SessionListItem.test.tsx +62 -0
  85. package/src/components/custom/ActiveWork/SessionListItem.tsx +152 -0
  86. package/src/components/custom/ActiveWork/SessionReader.stories.tsx +113 -0
  87. package/src/components/custom/ActiveWork/SeverityLabel.stories.tsx +51 -0
  88. package/src/components/custom/ActiveWork/SeverityLabel.test.tsx +68 -0
  89. package/src/components/custom/ActiveWork/SeverityLabel.tsx +97 -0
  90. package/src/components/custom/ActiveWork/TaskRow.stories.tsx +63 -0
  91. package/src/components/custom/ActiveWork/TaskRow.test.tsx +112 -0
  92. package/src/components/custom/ActiveWork/TaskRow.tsx +176 -0
  93. package/src/components/custom/ActiveWork/TaskTable.stories.tsx +123 -0
  94. package/src/components/custom/ActiveWork/TaskTable.test.tsx +233 -0
  95. package/src/components/custom/ActiveWork/TaskTable.tsx +321 -0
  96. package/src/components/custom/ActiveWork/active-work-depth.test.tsx +102 -0
  97. package/src/components/custom/ActiveWork/file-history-fixture.ts +91 -0
  98. package/src/components/custom/ActiveWork/format-time.test.ts +23 -0
  99. package/src/components/custom/ActiveWork/format-time.ts +32 -0
  100. package/src/components/custom/ActiveWork/index.ts +19 -0
  101. package/src/components/custom/ActiveWork/initiative-fixture.ts +104 -0
  102. package/src/components/custom/ActiveWork/session-fixture.ts +267 -0
  103. package/src/components/custom/ActiveWork/session-linkers.ts +56 -0
  104. package/src/components/custom/ActiveWork/task-list-fixture.ts +97 -0
  105. package/src/components/custom/CircularTimer/CircularTimer.stories.tsx +4 -3
  106. package/src/components/custom/DateTime/DateTime.stories.tsx +2 -1
  107. package/src/components/custom/DateTime/DateTime.test.tsx +3 -1
  108. package/src/components/custom/EmptyState/EmptyState.stories.tsx +22 -9
  109. package/src/components/custom/EmptyState/EmptyState.test.tsx +7 -13
  110. package/src/components/custom/EmptyState/EmptyState.tsx +4 -18
  111. package/src/components/custom/Fatigue/DualGhostSpark.stories.tsx +4 -3
  112. package/src/components/custom/Fatigue/FatigueLights.stories.tsx +2 -2
  113. package/src/components/custom/Fatigue/GhostSpark.stories.tsx +4 -3
  114. package/src/components/custom/Fatigue/LiveFatigueCard.stories.tsx +2 -2
  115. package/src/components/custom/Fatigue/LiveFatigueCard.tsx +8 -4
  116. package/src/components/custom/Fatigue/LiveFatiguePanel.stories.tsx +116 -6
  117. package/src/components/custom/Fatigue/LiveFatiguePanel.test.tsx +134 -0
  118. package/src/components/custom/Fatigue/LiveFatiguePanel.tsx +54 -83
  119. package/src/components/custom/Fatigue/README.md +40 -3
  120. package/src/components/custom/Fatigue/RomProgressionChart.stories.tsx +2 -2
  121. package/src/components/custom/Fatigue/SilverRedPalette.stories.tsx +2 -1
  122. package/src/components/custom/Fatigue/VelocityHero.stories.tsx +4 -3
  123. package/src/components/custom/Fatigue/VerdictHero.stories.tsx +2 -2
  124. package/src/components/custom/Fatigue/fatigue-mock.test.ts +0 -5
  125. package/src/components/custom/Fatigue/fatigue-mock.ts +2 -10
  126. package/src/components/custom/Fatigue/fatigue-tokens.ts +12 -0
  127. package/src/components/custom/Fatigue/index.ts +17 -5
  128. package/src/components/custom/Fatigue/panel-layout.test.ts +149 -0
  129. package/src/components/custom/Fatigue/panel-layout.ts +185 -0
  130. package/src/components/custom/Gauge/Gauge.stories.tsx +2 -2
  131. package/src/components/custom/Gauge/Gauge.test.tsx +1 -1
  132. package/src/components/custom/Gauge/Gauge.tsx +4 -1
  133. package/src/components/custom/Metric/Metric.stories.tsx +10 -1
  134. package/src/components/custom/Metric/Metric.test.tsx +1 -3
  135. package/src/components/custom/Metric/Metric.tsx +5 -20
  136. package/src/components/custom/Prose/MarkdownProse.stories.tsx +88 -0
  137. package/src/components/custom/Prose/MarkdownProse.test.tsx +87 -0
  138. package/src/components/custom/Prose/MarkdownProse.tsx +201 -0
  139. package/src/components/custom/Prose/README.md +58 -0
  140. package/src/components/custom/Prose/index.ts +1 -0
  141. package/src/components/custom/Scatter/Scatter.stories.tsx +46 -8
  142. package/src/components/custom/Scatter/Scatter.test.tsx +2 -2
  143. package/src/components/custom/Scatter/Scatter.tsx +116 -14
  144. package/src/components/custom/Sidebar/Sidebar.stories.tsx +40 -7
  145. package/src/components/custom/Sidebar/Sidebar.test.tsx +5 -1
  146. package/src/components/custom/Sidebar/Sidebar.tsx +16 -33
  147. package/src/components/custom/Table/Table.stories.tsx +98 -15
  148. package/src/components/custom/Table/Table.test.tsx +273 -86
  149. package/src/components/custom/Table/Table.tsx +159 -67
  150. package/src/components/custom/Table/column-fit.test.ts +75 -0
  151. package/src/components/custom/Table/column-fit.ts +116 -0
  152. package/src/components/custom/Table/index.ts +9 -0
  153. package/src/components/custom/TimerReadout/TimerReadout.stories.tsx +8 -6
  154. package/src/components/custom/Treemap/Treemap.stories.tsx +2 -2
  155. package/src/components/custom/Treemap/Treemap.test.tsx +1 -1
  156. package/src/components/custom/Treemap/Treemap.tsx +7 -2
  157. package/src/components/custom/Typography/Typography.stories.tsx +28 -1
  158. package/src/components/custom/Typography/Typography.test.tsx +34 -0
  159. package/src/components/custom/Typography/Typography.tsx +6 -0
  160. package/src/components/custom/Typography/index.ts +1 -8
  161. package/src/components/custom/Workout/ActiveWorkoutPage.stories.tsx +9 -1
  162. package/src/components/custom/Workout/BaseBadge.stories.tsx +19 -7
  163. package/src/components/custom/Workout/BaseBadge.test.tsx +31 -11
  164. package/src/components/custom/Workout/BaseBadge.tsx +3 -0
  165. package/src/components/custom/Workout/BodyMap.stories.tsx +4 -1
  166. package/src/components/custom/Workout/BodyMap.tsx +3 -1
  167. package/src/components/custom/Workout/BodyMapDetailPanel.stories.tsx +16 -4
  168. package/src/components/custom/Workout/BodyMapDetailPanel.test.tsx +11 -15
  169. package/src/components/custom/Workout/BodyMapDetailPanel.tsx +45 -9
  170. package/src/components/custom/Workout/CapacityBandChart.stories.tsx +10 -8
  171. package/src/components/custom/Workout/CapacityBandChart.test.tsx +24 -51
  172. package/src/components/custom/Workout/CapacityBandChart.tsx +139 -108
  173. package/src/components/custom/Workout/DeviationBar.stories.tsx +1 -1
  174. package/src/components/custom/Workout/DeviationBar.test.tsx +5 -2
  175. package/src/components/custom/Workout/DeviationBar.tsx +21 -16
  176. package/src/components/custom/Workout/DualVelocityStrip.stories.tsx +182 -0
  177. package/src/components/custom/Workout/DualVelocityStrip.test.tsx +3 -2
  178. package/src/components/custom/Workout/ExerciseCard.stories.tsx +8 -7
  179. package/src/components/custom/Workout/ExerciseCard.test.tsx +13 -3
  180. package/src/components/custom/Workout/ExerciseCard.tsx +42 -51
  181. package/src/components/custom/Workout/ExerciseCardHeading.stories.tsx +7 -7
  182. package/src/components/custom/Workout/ExerciseDetailPage.stories.tsx +9 -1
  183. package/src/components/custom/Workout/ExerciseHeading.stories.tsx +8 -8
  184. package/src/components/custom/Workout/ExerciseHeading.tsx +8 -5
  185. package/src/components/custom/Workout/ExerciseIndicator.stories.tsx +6 -4
  186. package/src/components/custom/Workout/ExerciseIndicator.test.tsx +27 -11
  187. package/src/components/custom/Workout/ExerciseIndicator.tsx +14 -15
  188. package/src/components/custom/Workout/FatigueMeter.stories.tsx +5 -5
  189. package/src/components/custom/Workout/InputBar.stories.tsx +4 -5
  190. package/src/components/custom/Workout/IntensityBar.stories.tsx +1 -1
  191. package/src/components/custom/Workout/IntensityBar.test.tsx +5 -1
  192. package/src/components/custom/Workout/IntensityBar.tsx +4 -2
  193. package/src/components/custom/Workout/LiveAuraFrame.stories.tsx +5 -4
  194. package/src/components/custom/Workout/MesoCard.stories.tsx +4 -1
  195. package/src/components/custom/Workout/MesoCard.test.tsx +7 -18
  196. package/src/components/custom/Workout/MesoCard.tsx +12 -9
  197. package/src/components/custom/Workout/MesoProgressBar.stories.tsx +1 -1
  198. package/src/components/custom/Workout/MesoProgressBar.test.tsx +18 -11
  199. package/src/components/custom/Workout/MesoProgressBar.tsx +15 -13
  200. package/src/components/custom/Workout/MesoStatusCard.stories.tsx +2 -1
  201. package/src/components/custom/Workout/MesoStatusCard.test.tsx +14 -44
  202. package/src/components/custom/Workout/MesoStatusCard.tsx +9 -23
  203. package/src/components/custom/Workout/MetricTiles.stories.tsx +3 -2
  204. package/src/components/custom/Workout/MuscleGroupChip.stories.tsx +2 -8
  205. package/src/components/custom/Workout/MuscleGroupChip.test.tsx +23 -31
  206. package/src/components/custom/Workout/MuscleGroupChip.tsx +28 -67
  207. package/src/components/custom/Workout/PlaceholderStrip.stories.tsx +1 -1
  208. package/src/components/custom/Workout/PlaceholderStrip.test.tsx +17 -10
  209. package/src/components/custom/Workout/PlaceholderStrip.tsx +9 -8
  210. package/src/components/custom/Workout/PrBadge.stories.tsx +2 -1
  211. package/src/components/custom/Workout/PrBadge.test.tsx +3 -9
  212. package/src/components/custom/Workout/PrBadge.tsx +13 -17
  213. package/src/components/custom/Workout/PrHistoryModal.stories.tsx +4 -1
  214. package/src/components/custom/Workout/PrHistoryModal.test.tsx +13 -36
  215. package/src/components/custom/Workout/PrHistoryModal.tsx +8 -4
  216. package/src/components/custom/Workout/ProgramPlanningPage.stories.tsx +6 -1
  217. package/src/components/custom/Workout/README.md +12 -7
  218. package/src/components/custom/Workout/ReadinessCheck.stories.tsx +3 -2
  219. package/src/components/custom/Workout/ReadinessCheck.test.tsx +12 -18
  220. package/src/components/custom/Workout/ReadinessCheck.tsx +19 -3
  221. package/src/components/custom/Workout/RestTimer.stories.tsx +3 -2
  222. package/src/components/custom/Workout/ScheduleTiles.stories.tsx +3 -2
  223. package/src/components/custom/Workout/ScheduleTiles.test.tsx +3 -4
  224. package/src/components/custom/Workout/ScheduleTiles.tsx +4 -7
  225. package/src/components/custom/Workout/SegmentedBar.stories.tsx +5 -5
  226. package/src/components/custom/Workout/SegmentedBar.tsx +6 -2
  227. package/src/components/custom/Workout/SegmentedProgressBar.stories.tsx +5 -5
  228. package/src/components/custom/Workout/SessionHeader.stories.tsx +6 -6
  229. package/src/components/custom/Workout/SessionHeader.tsx +12 -12
  230. package/src/components/custom/Workout/SessionRail.stories.tsx +12 -11
  231. package/src/components/custom/Workout/SessionRail.tsx +7 -9
  232. package/src/components/custom/Workout/SetBar.stories.tsx +10 -6
  233. package/src/components/custom/Workout/SetBar.test.tsx +49 -4
  234. package/src/components/custom/Workout/SetBar.tsx +38 -12
  235. package/src/components/custom/Workout/SetRow.stories.tsx +3 -2
  236. package/src/components/custom/Workout/SetRow.test.tsx +16 -2
  237. package/src/components/custom/Workout/SetRow.tsx +61 -23
  238. package/src/components/custom/Workout/SetStrip.stories.tsx +60 -5
  239. package/src/components/custom/Workout/SetStrip.test.tsx +25 -0
  240. package/src/components/custom/Workout/SetStrip.tsx +24 -4
  241. package/src/components/custom/Workout/SetTableHeader.stories.tsx +6 -6
  242. package/src/components/custom/Workout/SetTableHeader.tsx +9 -12
  243. package/src/components/custom/Workout/SetsRepsLoad.stories.tsx +7 -7
  244. package/src/components/custom/Workout/SetsRepsLoad.tsx +3 -5
  245. package/src/components/custom/Workout/Sparkline.stories.tsx +1 -1
  246. package/src/components/custom/Workout/Sparkline.test.tsx +37 -19
  247. package/src/components/custom/Workout/Sparkline.tsx +14 -18
  248. package/src/components/custom/Workout/StatusDot.stories.tsx +1 -1
  249. package/src/components/custom/Workout/StatusDot.test.tsx +44 -5
  250. package/src/components/custom/Workout/StatusDot.tsx +93 -63
  251. package/src/components/custom/Workout/StatusPill.stories.tsx +1 -1
  252. package/src/components/custom/Workout/StatusPill.test.tsx +6 -15
  253. package/src/components/custom/Workout/StatusPill.tsx +27 -38
  254. package/src/components/custom/Workout/StrengthTrendChart.stories.tsx +9 -3
  255. package/src/components/custom/Workout/StrengthTrendChart.test.tsx +15 -37
  256. package/src/components/custom/Workout/StrengthTrendChart.tsx +31 -30
  257. package/src/components/custom/Workout/SupersetWrapper.stories.tsx +27 -64
  258. package/src/components/custom/Workout/SupersetWrapper.test.tsx +16 -14
  259. package/src/components/custom/Workout/SupersetWrapper.tsx +17 -21
  260. package/src/components/custom/Workout/TempoDisplay.stories.tsx +22 -7
  261. package/src/components/custom/Workout/TempoDisplay.test.tsx +18 -4
  262. package/src/components/custom/Workout/TrainingStatusPage.stories.tsx +9 -1
  263. package/src/components/custom/Workout/VelocityStrip.compact.stories.tsx +4 -1
  264. package/src/components/custom/Workout/VelocityStrip.dual.stories.tsx +7 -4
  265. package/src/components/custom/Workout/VelocityStrip.expanded.stories.tsx +4 -1
  266. package/src/components/custom/Workout/VelocityStrip.hero.stories.tsx +4 -1
  267. package/src/components/custom/Workout/VelocityStrip.stories.tsx +12 -6
  268. package/src/components/custom/Workout/VelocityStrip.tsx +3 -0
  269. package/src/components/custom/Workout/VolumeLandmarkBar.stories.tsx +6 -7
  270. package/src/components/custom/Workout/VolumeLandmarkBar.tsx +15 -6
  271. package/src/components/custom/Workout/WeekRow.stories.tsx +4 -1
  272. package/src/components/custom/Workout/WeekRow.test.tsx +18 -15
  273. package/src/components/custom/Workout/WeekRow.tsx +23 -16
  274. package/src/components/custom/Workout/WeightBadge.stories.tsx +2 -1
  275. package/src/components/custom/Workout/WeightBadge.test.tsx +50 -19
  276. package/src/components/custom/Workout/WeightBadge.tsx +28 -27
  277. package/src/components/custom/Workout/WorkoutCard.stories.tsx +6 -1
  278. package/src/components/custom/Workout/WorkoutCard.test.tsx +18 -0
  279. package/src/components/custom/Workout/WorkoutCard.tsx +35 -57
  280. package/src/components/custom/Workout/WorkoutPill.stories.tsx +5 -2
  281. package/src/components/custom/Workout/WorkoutPill.test.tsx +39 -7
  282. package/src/components/custom/Workout/WorkoutPill.tsx +88 -57
  283. package/src/components/custom/Workout/ZoneTrack.stories.tsx +7 -6
  284. package/src/components/custom/Workout/ZoneTrack.tsx +10 -9
  285. package/src/components/custom/Workout/index.ts +5 -0
  286. package/src/components/custom/Workout/metricText.stories.tsx +6 -5
  287. package/src/components/custom/Workout/metricText.tsx +4 -0
  288. package/src/components/custom/Workout/setHeadingKit.tsx +207 -26
  289. package/src/components/custom/charts/README.md +61 -0
  290. package/src/components/custom/charts/SetBarChart.test.tsx +30 -1
  291. package/src/components/custom/charts/SetBarChart.tsx +42 -4
  292. package/src/components/custom/charts/SparkBars.stories.tsx +55 -0
  293. package/src/components/custom/charts/SparkBars.test.tsx +69 -0
  294. package/src/components/custom/charts/SparkBars.tsx +85 -0
  295. package/src/components/custom/charts/index.ts +3 -0
  296. package/src/components/custom/index.ts +3 -0
  297. package/src/components/custom/stepper/Stepper.stories.tsx +13 -10
  298. package/src/components/custom/stepper/Stepper.test.tsx +1 -7
  299. package/src/components/custom/stepper/Stepper.tsx +13 -28
  300. package/src/components/icons/icons.stories.tsx +1 -1
  301. package/src/components/icons/icons.tsx +51 -0
  302. package/src/components/shell/AppShell.stories.tsx +150 -0
  303. package/src/components/shell/AppShell.test.tsx +70 -0
  304. package/src/components/shell/AppShell.tsx +90 -0
  305. package/src/components/shell/BrandLockup.stories.tsx +66 -5
  306. package/src/components/shell/BrandLockup.test.tsx +34 -1
  307. package/src/components/shell/BrandLockup.tsx +27 -11
  308. package/src/components/shell/NavItem.stories.tsx +4 -4
  309. package/src/components/shell/NavItem.test.tsx +17 -0
  310. package/src/components/shell/NavItem.tsx +17 -5
  311. package/src/components/shell/README.md +90 -27
  312. package/src/components/shell/SideNav.stories.tsx +38 -7
  313. package/src/components/shell/SideNav.test.tsx +16 -8
  314. package/src/components/shell/SideNav.tsx +17 -17
  315. package/src/components/shell/TopBar.stories.tsx +44 -19
  316. package/src/components/shell/TopBar.test.tsx +34 -12
  317. package/src/components/shell/TopBar.tsx +61 -40
  318. package/src/components/shell/brands.tsx +66 -0
  319. package/src/components/shell/index.ts +9 -8
  320. package/src/components/shell/{DeviceIndicator.stories.tsx → workout/DeviceIndicator.stories.tsx} +2 -2
  321. package/src/components/shell/{DeviceIndicator.tsx → workout/DeviceIndicator.tsx} +2 -2
  322. package/src/components/shell/{DeviceMenu.stories.tsx → workout/DeviceMenu.stories.tsx} +2 -2
  323. package/src/components/shell/{DeviceMenu.tsx → workout/DeviceMenu.tsx} +3 -3
  324. package/src/components/shell/{DeviceRow.stories.tsx → workout/DeviceRow.stories.tsx} +2 -2
  325. package/src/components/shell/{DeviceRow.tsx → workout/DeviceRow.tsx} +3 -3
  326. package/src/components/shell/{SessionStatePill.stories.tsx → workout/SessionStatePill.stories.tsx} +2 -2
  327. package/src/components/shell/{SessionStatePill.tsx → workout/SessionStatePill.tsx} +5 -3
  328. package/src/components/shell/workout/WorkoutShell.stories.tsx +71 -0
  329. package/src/components/shell/{DashboardShell.test.tsx → workout/WorkoutShell.test.tsx} +19 -8
  330. package/src/components/shell/workout/WorkoutShell.tsx +77 -0
  331. package/src/components/shell/workout/WorkoutTopBar.stories.tsx +58 -0
  332. package/src/components/shell/workout/WorkoutTopBar.test.tsx +39 -0
  333. package/src/components/shell/workout/WorkoutTopBar.tsx +52 -0
  334. package/src/components/shell/workout/index.ts +9 -0
  335. package/src/components/shell/workout/workoutNavItems.tsx +16 -0
  336. package/src/components/ui/README.md +110 -0
  337. package/src/components/ui/alert/Alert.stories.tsx +1 -1
  338. package/src/components/ui/autocomplete/Autocomplete.stories.tsx +11 -13
  339. package/src/components/ui/autocomplete/Autocomplete.test.tsx +7 -25
  340. package/src/components/ui/autocomplete/Autocomplete.tsx +21 -28
  341. package/src/components/ui/avatar/Avatar.stories.tsx +1 -1
  342. package/src/components/ui/avatar/Avatar.tsx +2 -10
  343. package/src/components/ui/badge/Badge.stories.tsx +83 -28
  344. package/src/components/ui/badge/Badge.test.tsx +19 -3
  345. package/src/components/ui/badge/Badge.tsx +48 -55
  346. package/src/components/ui/breadcrumbs/Breadcrumbs.stories.tsx +1 -1
  347. package/src/components/ui/breadcrumbs/Breadcrumbs.tsx +4 -16
  348. package/src/components/ui/button/Button.stories.tsx +46 -12
  349. package/src/components/ui/button/Button.tsx +32 -25
  350. package/src/components/ui/card/Card.stories.tsx +90 -94
  351. package/src/components/ui/card/Card.test.tsx +80 -6
  352. package/src/components/ui/card/Card.tsx +150 -203
  353. package/src/components/ui/checkbox/Checkbox.stories.tsx +1 -1
  354. package/src/components/ui/checkbox/Checkbox.tsx +6 -26
  355. package/src/components/ui/chip/Chip.stories.tsx +37 -13
  356. package/src/components/ui/chip/Chip.test.tsx +10 -6
  357. package/src/components/ui/chip/Chip.tsx +76 -91
  358. package/src/components/ui/collapse/Collapse.stories.tsx +23 -23
  359. package/src/components/ui/collapse/Collapse.tsx +6 -11
  360. package/src/components/ui/data-row/DataRow.stories.tsx +9 -2
  361. package/src/components/ui/data-row/DataRow.test.tsx +5 -15
  362. package/src/components/ui/data-row/DataRow.tsx +18 -7
  363. package/src/components/ui/divider/Divider.stories.tsx +1 -1
  364. package/src/components/ui/divider/Divider.tsx +1 -5
  365. package/src/components/ui/drawer/Drawer.stories.tsx +5 -16
  366. package/src/components/ui/drawer/Drawer.tsx +13 -30
  367. package/src/components/ui/floating-overlay-depth.test.tsx +143 -0
  368. package/src/components/ui/form-field/FormField.stories.tsx +6 -20
  369. package/src/components/ui/form-field/FormField.test.tsx +1 -5
  370. package/src/components/ui/form-field/FormField.tsx +10 -46
  371. package/src/components/ui/help-tip/HelpTip.stories.tsx +8 -19
  372. package/src/components/ui/help-tip/HelpTip.test.tsx +1 -3
  373. package/src/components/ui/help-tip/HelpTip.tsx +21 -22
  374. package/src/components/ui/help-tip/index.ts +7 -1
  375. package/src/components/ui/icon-box/IconBox.stories.tsx +1 -1
  376. package/src/components/ui/icon-box/IconBox.test.tsx +1 -7
  377. package/src/components/ui/icon-box/IconBox.tsx +2 -12
  378. package/src/components/ui/indicator/Indicator.stories.tsx +1 -1
  379. package/src/components/ui/indicator/Indicator.tsx +20 -14
  380. package/src/components/ui/input/Input.stories.tsx +3 -11
  381. package/src/components/ui/input/Input.test.tsx +2 -10
  382. package/src/components/ui/input/Input.tsx +10 -25
  383. package/src/components/ui/input/index.ts +7 -1
  384. package/src/components/ui/link/Link.stories.tsx +19 -7
  385. package/src/components/ui/list-item/ListItem.stories.tsx +11 -2
  386. package/src/components/ui/list-item/ListItem.tsx +2 -9
  387. package/src/components/ui/menu/Menu.stories.tsx +21 -15
  388. package/src/components/ui/menu/Menu.test.tsx +2 -11
  389. package/src/components/ui/menu/Menu.tsx +12 -14
  390. package/src/components/ui/menu/index.ts +8 -1
  391. package/src/components/ui/modal/Modal.stories.tsx +2 -2
  392. package/src/components/ui/modal/Modal.tsx +29 -19
  393. package/src/components/ui/pill/Pill.stories.tsx +58 -23
  394. package/src/components/ui/pill/Pill.test.tsx +101 -3
  395. package/src/components/ui/pill/Pill.tsx +164 -49
  396. package/src/components/ui/pill/index.ts +1 -1
  397. package/src/components/ui/popover/Popover.stories.tsx +5 -7
  398. package/src/components/ui/popover/Popover.test.tsx +1 -6
  399. package/src/components/ui/popover/Popover.tsx +20 -15
  400. package/src/components/ui/popover/index.ts +7 -1
  401. package/src/components/ui/progress/Progress.stories.tsx +3 -12
  402. package/src/components/ui/progress/Progress.test.tsx +1 -5
  403. package/src/components/ui/radio/Radio.stories.tsx +42 -21
  404. package/src/components/ui/radio/Radio.test.tsx +6 -2
  405. package/src/components/ui/radio/Radio.tsx +23 -22
  406. package/src/components/ui/section/Section.stories.tsx +5 -14
  407. package/src/components/ui/section/Section.test.tsx +1 -6
  408. package/src/components/ui/section/Section.tsx +1 -3
  409. package/src/components/ui/section/index.ts +1 -5
  410. package/src/components/ui/select/Select.stories.tsx +3 -13
  411. package/src/components/ui/select/Select.test.tsx +2 -11
  412. package/src/components/ui/select/Select.tsx +14 -14
  413. package/src/components/ui/skeleton/Skeleton.stories.tsx +3 -11
  414. package/src/components/ui/skeleton/Skeleton.tsx +3 -14
  415. package/src/components/ui/skeleton/index.ts +1 -7
  416. package/src/components/ui/spinner/Spinner.stories.tsx +1 -1
  417. package/src/components/ui/spinner/Spinner.tsx +1 -4
  418. package/src/components/ui/stack/Stack.stories.tsx +1 -1
  419. package/src/components/ui/stack/Stack.tsx +1 -1
  420. package/src/components/ui/surface/Surface.stories.tsx +17 -5
  421. package/src/components/ui/surface/Surface.test.tsx +88 -28
  422. package/src/components/ui/surface/Surface.tsx +37 -87
  423. package/src/components/ui/surface/SurfaceContext.ts +22 -62
  424. package/src/components/ui/surface/index.ts +8 -0
  425. package/src/components/ui/surface/resolveSurface.ts +98 -0
  426. package/src/components/ui/surface/surface.contract.test.ts +6 -1
  427. package/src/components/ui/switch/Switch.stories.tsx +1 -1
  428. package/src/components/ui/switch/Switch.tsx +7 -6
  429. package/src/components/ui/tabs/Tabs.stories.tsx +1 -1
  430. package/src/components/ui/tabs/Tabs.tsx +7 -22
  431. package/src/components/ui/tabs/index.ts +1 -7
  432. package/src/components/ui/tile/Tile.stories.tsx +1 -1
  433. package/src/components/ui/tile/Tile.tsx +3 -0
  434. package/src/components/ui/toast/Toast.stories.tsx +1 -1
  435. package/src/components/ui/toast/Toast.test.tsx +2 -8
  436. package/src/components/ui/toast/Toast.tsx +43 -53
  437. package/src/components/ui/toast/index.ts +0 -1
  438. package/src/components/ui/toolbar-button/ToolbarButton.stories.tsx +92 -71
  439. package/src/components/ui/toolbar-button/ToolbarButton.test.tsx +3 -18
  440. package/src/components/ui/toolbar-button/ToolbarButton.tsx +25 -43
  441. package/src/components/ui/tooltip/Tooltip.stories.tsx +12 -3
  442. package/src/components/ui/tooltip/Tooltip.test.tsx +21 -3
  443. package/src/components/ui/tooltip/Tooltip.tsx +55 -36
  444. package/src/components/ui/tooltip/index.ts +1 -1
  445. package/src/components/ui/trigger/TriggerSurface.test.tsx +215 -0
  446. package/src/components/ui/trigger/TriggerSurface.tsx +81 -0
  447. package/src/components/ui/trigger/index.ts +2 -0
  448. package/src/stories/PresetShowcase.stories.tsx +100 -47
  449. package/src/test/no-device-internals.test.ts +3 -3
  450. package/src/theme/ChoosingTokens.stories.tsx +48 -0
  451. package/src/theme/ColorPalettes.stories.tsx +62 -45
  452. package/src/theme/ColorPrimitives.stories.tsx +35 -35
  453. package/src/theme/Depth.stories.tsx +132 -65
  454. package/src/theme/DepthCalibration.stories.tsx +24 -22
  455. package/src/theme/ThemeProvider.test.tsx +4 -4
  456. package/src/theme/barrel.ts +7 -6
  457. package/src/theme/color-stories.coverage.test.ts +1 -1
  458. package/src/theme/color-utils.ts +41 -29
  459. package/src/theme/config.completeness.test.ts +1 -1
  460. package/src/theme/config.ts +28 -0
  461. package/src/theme/elevation.test.ts +82 -56
  462. package/src/theme/elevation.ts +77 -561
  463. package/src/theme/global.css +30 -2
  464. package/src/theme/grey-ramp.test.ts +24 -8
  465. package/src/theme/lift.test.ts +39 -0
  466. package/src/theme/lift.ts +102 -0
  467. package/src/theme/materials.test.ts +5 -2
  468. package/src/theme/materials.ts +38 -4
  469. package/src/theme/native-theming-guard.test.ts +5 -5
  470. package/src/theme/presets/apply.ts +4 -0
  471. package/src/theme/presets/audiobook.ts +5 -2
  472. package/src/theme/presets/default.ts +4 -0
  473. package/src/theme/presets/index.ts +14 -1
  474. package/src/theme/presets/types.ts +1 -1
  475. package/src/theme/semantic-contrast.test.ts +13 -4
  476. package/src/theme/status-distinctness.test.ts +66 -0
  477. package/src/theme/surface-planes.test.ts +37 -0
  478. package/src/theme/surface-planes.ts +68 -0
  479. package/src/theme/token-export-guard.test.ts +102 -0
  480. package/src/theme/tokens/primitives.test.ts +15 -7
  481. package/src/theme/tokens/primitives.ts +67 -35
  482. package/src/theme/tokens/semantic.ts +71 -37
  483. package/src/theme/wash-ladder.test.ts +58 -0
  484. package/src/theme/workout-tokens.ts +1 -7
  485. package/src/types/jest-axe.d.ts +2 -6
  486. package/src/types/raw-md.d.ts +5 -0
  487. package/src/utils/colors.ts +4 -4
  488. package/src/utils/form.ts +1 -3
  489. package/src/utils/index.ts +2 -7
  490. package/src/utils/number-format.ts +17 -0
  491. package/src/utils/workout-format.ts +15 -6
  492. package/src/web-jsx/jsx-runtime.ts +1 -5
  493. package/tailwind.config.js +5 -0
  494. package/src/components/custom/Workout/ExerciseCardUnified.stories.tsx +0 -151
  495. package/src/components/custom/Workout/RowInventory.stories.tsx +0 -408
  496. package/src/components/custom/Workout/S3FullRail.stories.tsx +0 -46
  497. package/src/components/custom/Workout/S3SessionPace.stories.tsx +0 -95
  498. package/src/components/custom/Workout/S3SessionRailHeading.stories.tsx +0 -61
  499. package/src/components/custom/Workout/S3SetTypes.stories.tsx +0 -176
  500. package/src/components/custom/Workout/S3WorkoutExpansion.stories.tsx +0 -240
  501. package/src/components/shell/DashboardShell.stories.tsx +0 -65
  502. package/src/components/shell/DashboardShell.tsx +0 -75
  503. package/src/components/shell/SessionRailSpecimen.stories.tsx +0 -753
  504. package/src/theme/elevation.stories.tsx +0 -346
  505. package/src/utils/useTheme.ts +0 -72
  506. /package/src/components/shell/{DeviceIndicator.test.tsx → workout/DeviceIndicator.test.tsx} +0 -0
  507. /package/src/components/shell/{DeviceMenu.test.tsx → workout/DeviceMenu.test.tsx} +0 -0
  508. /package/src/components/shell/{DeviceRow.test.tsx → workout/DeviceRow.test.tsx} +0 -0
  509. /package/src/components/shell/{SessionStatePill.test.tsx → workout/SessionStatePill.test.tsx} +0 -0
@@ -0,0 +1,880 @@
1
+ // src/theme/tokens/primitives.ts
2
+ var primitiveColors = {
3
+ white: "#FFFFFF",
4
+ black: "#000000",
5
+ transparent: "transparent"
6
+ };
7
+ var alertRedVivid = "#FF4757";
8
+ var greyRamp = {
9
+ 50: "#F9F6F3",
10
+ // L*97.0 W6
11
+ 100: "#EDEAE7",
12
+ // L*92.8 W6
13
+ 200: "#D4D1CE",
14
+ // L*84.0 W6 — warm silver
15
+ 300: "#BDBAB7",
16
+ // L*75.7 W6
17
+ 400: "#A29F9D",
18
+ // L*65.7 W5
19
+ 500: "#888684",
20
+ // L*56.0 W4
21
+ 600: "#72716F",
22
+ // L*47.7 W3
23
+ 700: "#5A5958",
24
+ // L*37.9 W2
25
+ 800: "#424140",
26
+ // L*27.6 W2 — generated bridge
27
+ 850: "#373635",
28
+ // L*22.7 W2 — surface overlay
29
+ 875: "#31302F",
30
+ // L*19.9 W2 — surface raised
31
+ 900: "#2C2A28",
32
+ // L*17.2 W4 — surface elevated
33
+ 925: "#252321",
34
+ // L*13.9 W4 — surface base
35
+ 950: "#1C1916",
36
+ // L*9.0 W6 — background base / shell
37
+ 975: "#100D0A"
38
+ // L*3.8 W6 — background frame / bezel
39
+ };
40
+ var SURFACE_PLANE_STEPS = {
41
+ frame: 975,
42
+ background: 950,
43
+ base: 925,
44
+ elevated: 900,
45
+ raised: 875,
46
+ overlay: 850
47
+ };
48
+ var primitiveRamps = {
49
+ red: {
50
+ 50: "#FFF4F4",
51
+ 100: "#FFE3E5",
52
+ 200: "#FFC2C5",
53
+ 300: "#FF9A9D",
54
+ 400: "#F77175",
55
+ 500: "#E05254",
56
+ 600: "#D14343",
57
+ // pin
58
+ 700: "#A4221C",
59
+ 800: "#7E1002",
60
+ 900: "#5A0900",
61
+ 950: "#3D0400"
62
+ },
63
+ orange: {
64
+ 50: "#FFF5ED",
65
+ 100: "#FFE6D4",
66
+ 200: "#FFC7A2",
67
+ 300: "#FFA063",
68
+ 400: "#FF7900",
69
+ // pin
70
+ 500: "#DA5F00",
71
+ 600: "#B94A00",
72
+ 700: "#983804",
73
+ 800: "#6F290F",
74
+ 900: "#4E1C0C",
75
+ 950: "#331107"
76
+ },
77
+ amber: {
78
+ 50: "#FFF7DD",
79
+ 100: "#FFEAA9",
80
+ 200: "#FFD352",
81
+ 300: "#F9B415",
82
+ // pin
83
+ 400: "#E08C00",
84
+ 500: "#C27400",
85
+ 600: "#A45E00",
86
+ 700: "#814D14",
87
+ 800: "#5B3A1A",
88
+ 900: "#442503",
89
+ 950: "#301500"
90
+ },
91
+ green: {
92
+ 50: "#E3FFEE",
93
+ 100: "#B5FFD2",
94
+ 200: "#58F69E",
95
+ 300: "#2ED573",
96
+ // pin
97
+ 400: "#21C05D",
98
+ 500: "#22A444",
99
+ 600: "#298732",
100
+ 700: "#2B6B25",
101
+ 800: "#264D1C",
102
+ 900: "#1B3515",
103
+ 950: "#11220D"
104
+ },
105
+ cyan: {
106
+ 50: "#E6FBFF",
107
+ 100: "#C2F6FF",
108
+ 200: "#62EAFF",
109
+ 300: "#22D3EE",
110
+ // pin
111
+ 400: "#01B5D1",
112
+ 500: "#2697B7",
113
+ 600: "#307B9B",
114
+ 700: "#2A617F",
115
+ 800: "#22465F",
116
+ 900: "#0B3149",
117
+ 950: "#001F36"
118
+ },
119
+ blue: {
120
+ 50: "#EFF8FF",
121
+ 100: "#D9EFFF",
122
+ 200: "#ACDBFF",
123
+ 300: "#78C2FF",
124
+ 400: "#3CA8FF",
125
+ 500: "#2196F3",
126
+ // pin
127
+ 600: "#1072CB",
128
+ 700: "#135AA8",
129
+ 800: "#14407E",
130
+ 900: "#112C5A",
131
+ 950: "#091B3C"
132
+ },
133
+ magenta: {
134
+ 50: "#FFF3F9",
135
+ 100: "#FFE2F1",
136
+ 200: "#FFBDE2",
137
+ 300: "#FF8FD5",
138
+ 400: "#ED69C3",
139
+ 500: "#D548AF",
140
+ 600: "#BA2996",
141
+ 700: "#9C0D7A",
142
+ // pin
143
+ 800: "#77005A",
144
+ 900: "#56003F",
145
+ 950: "#3B0029"
146
+ }
147
+ };
148
+ var categoricalPalette = {
149
+ default: [
150
+ primitiveRamps.blue[500],
151
+ primitiveRamps.magenta[500],
152
+ primitiveRamps.red[500],
153
+ primitiveRamps.orange[400],
154
+ primitiveRamps.green[300],
155
+ primitiveRamps.cyan[300],
156
+ primitiveRamps.amber[600]
157
+ // extended (7th) — pair with a legend
158
+ ],
159
+ dark: [
160
+ primitiveRamps.blue[600],
161
+ primitiveRamps.magenta[600],
162
+ primitiveRamps.red[500],
163
+ primitiveRamps.orange[600],
164
+ primitiveRamps.green[800],
165
+ primitiveRamps.cyan[800],
166
+ primitiveRamps.amber[500]
167
+ // extended (7th) — pair with a legend
168
+ ]
169
+ };
170
+ var CATEGORICAL_CVD_SAFE_MAX = 6;
171
+ function getCategoricalColor(index, variant = "default") {
172
+ const palette = categoricalPalette[variant];
173
+ index = Math.max(0, Math.floor(index));
174
+ return palette[index % palette.length];
175
+ }
176
+ var divergingScale = [
177
+ primitiveRamps.blue[500],
178
+ // under
179
+ primitiveRamps.cyan[300],
180
+ // maintenance
181
+ primitiveRamps.green[200],
182
+ // optimal (light center)
183
+ primitiveRamps.amber[300],
184
+ // approaching
185
+ primitiveRamps.red[600]
186
+ // over
187
+ ];
188
+ var sequentialEffort = [
189
+ primitiveRamps.green[300],
190
+ primitiveRamps.amber[200],
191
+ primitiveRamps.amber[300],
192
+ primitiveRamps.orange[400],
193
+ primitiveRamps.red[600],
194
+ primitiveRamps.red[700]
195
+ ];
196
+ function bestTextColor(hex) {
197
+ const [r, g, b] = [0, 2, 4].map((i) => {
198
+ const c = parseInt(hex.replace("#", "").slice(i, i + 2), 16) / 255;
199
+ return c >= 0.04045 ? ((c + 0.055) / 1.055) ** 2.4 : c / 12.92;
200
+ });
201
+ const l = 0.2126 * r + 0.7152 * g + 0.0722 * b;
202
+ return (l + 0.05) / 0.05 >= 1.05 / (l + 0.05) ? "#000000" : "#FFFFFF";
203
+ }
204
+ var discreteRainbow = [
205
+ "#E8ECFB",
206
+ "#D9CCE3",
207
+ "#D1BBD7",
208
+ "#CAACCB",
209
+ "#BA8DB4",
210
+ "#AE76A3",
211
+ "#AA6F9E",
212
+ "#994F88",
213
+ "#882E72",
214
+ "#1965B0",
215
+ "#437DBF",
216
+ "#5289C7",
217
+ "#6195CF",
218
+ "#7BAFDE",
219
+ "#4EB265",
220
+ "#90C987",
221
+ "#CAE0AB",
222
+ "#F7F056",
223
+ "#F7CB45",
224
+ "#F6C141",
225
+ "#F4A736",
226
+ "#F1932D",
227
+ "#EE8026",
228
+ "#E8601C",
229
+ "#E65518",
230
+ "#DC050C",
231
+ "#A5170E",
232
+ "#72190E",
233
+ "#42150A"
234
+ ];
235
+ var discreteRainbowPalettes = [
236
+ [10],
237
+ [10, 26],
238
+ [10, 18, 26],
239
+ [10, 15, 18, 26],
240
+ [10, 14, 15, 18, 26],
241
+ [10, 14, 15, 17, 18, 26],
242
+ [9, 10, 14, 15, 17, 18, 26],
243
+ [9, 10, 14, 15, 17, 18, 23, 26],
244
+ [9, 10, 14, 15, 17, 18, 23, 26, 28],
245
+ [9, 10, 14, 15, 17, 18, 21, 24, 26, 28],
246
+ [9, 10, 12, 14, 15, 17, 18, 21, 24, 26, 28],
247
+ [3, 6, 9, 10, 12, 14, 15, 17, 18, 21, 24, 26],
248
+ [3, 6, 9, 10, 12, 14, 15, 16, 17, 18, 21, 24, 26],
249
+ [3, 6, 9, 10, 12, 14, 15, 16, 17, 18, 20, 22, 24, 26],
250
+ [3, 6, 9, 10, 12, 14, 15, 16, 17, 18, 20, 22, 24, 26, 28],
251
+ [3, 5, 7, 9, 10, 12, 14, 15, 16, 17, 18, 20, 22, 24, 26, 28],
252
+ [3, 5, 7, 8, 9, 10, 12, 14, 15, 16, 17, 18, 20, 22, 24, 26, 28],
253
+ [3, 5, 7, 8, 9, 10, 12, 14, 15, 16, 17, 18, 20, 22, 24, 26, 27, 28],
254
+ [2, 4, 5, 7, 8, 9, 10, 12, 14, 15, 16, 17, 18, 20, 22, 24, 26, 27, 28],
255
+ [2, 4, 5, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 20, 22, 24, 26, 27, 28],
256
+ [2, 4, 5, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 21, 23, 25, 26, 27, 28],
257
+ [2, 4, 5, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 21, 23, 25, 26, 27, 28, 29],
258
+ [1, 2, 4, 5, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 21, 23, 25, 26, 27, 28, 29]
259
+ ];
260
+ function getDiscreteRainbowColor(index, size) {
261
+ index = Math.max(0, index);
262
+ size = Math.min(Math.max(1, size), discreteRainbowPalettes.length);
263
+ const palette = discreteRainbowPalettes[size - 1];
264
+ if (index >= palette.length) index = index % palette.length;
265
+ return discreteRainbow[palette[index] - 1];
266
+ }
267
+ var primitiveTypography = {
268
+ fontFamilies: {
269
+ sans: [
270
+ "Inter",
271
+ "-apple-system",
272
+ "BlinkMacSystemFont",
273
+ "Segoe UI",
274
+ "Helvetica",
275
+ "Arial",
276
+ "sans-serif"
277
+ ],
278
+ body: ["Nunito Sans", "sans-serif"],
279
+ heading: ["Space Grotesk", "sans-serif"],
280
+ mono: [
281
+ "SF Mono",
282
+ "Monaco",
283
+ "Inconsolata",
284
+ "Fira Mono",
285
+ "Droid Sans Mono",
286
+ "Source Code Pro",
287
+ "monospace"
288
+ ]
289
+ },
290
+ fontSizes: {
291
+ "2xs": "0.625rem",
292
+ // 10px
293
+ xs: "0.75rem",
294
+ // 12px
295
+ sm: "0.875rem",
296
+ // 14px
297
+ base: "1rem",
298
+ // 16px
299
+ lg: "1.125rem",
300
+ // 18px
301
+ xl: "1.5rem",
302
+ // 24px
303
+ "2xl": "2rem",
304
+ // 32px
305
+ "3xl": "2.25rem",
306
+ // 36px
307
+ "4xl": "3rem",
308
+ // 48px
309
+ "5xl": "3.5rem"
310
+ // 56px
311
+ },
312
+ fontWeights: {
313
+ normal: 400,
314
+ medium: 500,
315
+ semibold: 600,
316
+ bold: 700
317
+ },
318
+ lineHeights: {
319
+ none: 1,
320
+ tight: 1.375,
321
+ snug: 1.5,
322
+ normal: 1.57,
323
+ relaxed: 1.66,
324
+ loose: 1.75
325
+ },
326
+ letterSpacing: {
327
+ tighter: "-0.05em",
328
+ tight: "-0.025em",
329
+ normal: "0em",
330
+ wide: "0.025em",
331
+ wider: "0.05em",
332
+ widest: "0.5px"
333
+ }
334
+ };
335
+ var primitiveSpacing = {
336
+ 0: "0",
337
+ px: "1px",
338
+ 0.5: "0.125rem",
339
+ // 2px
340
+ 1: "0.25rem",
341
+ // 4px
342
+ 1.5: "0.375rem",
343
+ // 6px
344
+ 2: "0.5rem",
345
+ // 8px
346
+ 2.5: "0.625rem",
347
+ // 10px
348
+ 3: "0.75rem",
349
+ // 12px
350
+ 3.5: "0.875rem",
351
+ // 14px
352
+ 4: "1rem",
353
+ // 16px
354
+ 5: "1.25rem",
355
+ // 20px
356
+ 6: "1.5rem",
357
+ // 24px
358
+ 7: "1.75rem",
359
+ // 28px
360
+ 8: "2rem",
361
+ // 32px
362
+ 9: "2.25rem",
363
+ // 36px
364
+ 10: "2.5rem",
365
+ // 40px
366
+ 11: "2.75rem",
367
+ // 44px
368
+ 12: "3rem",
369
+ // 48px
370
+ 14: "3.5rem",
371
+ // 56px
372
+ 16: "4rem",
373
+ // 64px
374
+ 20: "5rem",
375
+ // 80px
376
+ 24: "6rem",
377
+ // 96px
378
+ 28: "7rem",
379
+ // 112px
380
+ 32: "8rem"
381
+ // 128px
382
+ };
383
+ var primitiveBorderRadius = {
384
+ none: "0",
385
+ sm: "4px",
386
+ DEFAULT: "8px",
387
+ md: "8px",
388
+ lg: "12px",
389
+ xl: "16px",
390
+ "2xl": "24px",
391
+ full: "9999px"
392
+ };
393
+ var primitiveBreakpoints = {
394
+ xs: 0,
395
+ sm: 600,
396
+ md: 1e3,
397
+ lg: 1200,
398
+ xl: 1920
399
+ };
400
+ var primitiveZIndex = {
401
+ hide: -1,
402
+ auto: "auto",
403
+ base: 0,
404
+ docked: 10,
405
+ dropdown: 1e3,
406
+ sticky: 1100,
407
+ drawer: 1100,
408
+ banner: 1200,
409
+ appBar: 1200,
410
+ overlay: 1300,
411
+ modal: 1400,
412
+ popover: 1500,
413
+ skipLink: 1600,
414
+ toast: 1700,
415
+ tooltip: 1800
416
+ };
417
+
418
+ // src/theme/tokens/semantic.ts
419
+ var semanticColorsLight = {
420
+ // Brand colors (brand-*)
421
+ "brand-primary": primitiveRamps.orange[400],
422
+ "brand-primary-light": primitiveRamps.orange[300],
423
+ "brand-primary-dark": primitiveRamps.orange[500],
424
+ "brand-primary-subtle": "rgba(255, 121, 0, 0.08)",
425
+ "brand-primary-muted": "rgba(255, 121, 0, 0.30)",
426
+ "brand-primary-strong": "rgba(255, 121, 0, 0.50)",
427
+ "brand-primary-hover": primitiveRamps.orange[500],
428
+ "brand-primary-active": primitiveRamps.orange[600],
429
+ "brand-secondary": primitiveRamps.cyan[600],
430
+ "brand-secondary-light": primitiveRamps.cyan[500],
431
+ "brand-secondary-dark": primitiveRamps.cyan[700],
432
+ "brand-secondary-subtle": "rgba(48, 123, 155, 0.08)",
433
+ "brand-secondary-muted": "rgba(48, 123, 155, 0.30)",
434
+ "brand-secondary-strong": "rgba(48, 123, 155, 0.50)",
435
+ "brand-secondary-hover": primitiveRamps.cyan[700],
436
+ "brand-secondary-active": primitiveRamps.cyan[800],
437
+ // Text on brand backgrounds (on-*)
438
+ "on-brand-primary": primitiveColors.white,
439
+ "on-brand-secondary": primitiveColors.white,
440
+ // Status colors (status-*)
441
+ "status-success": primitiveRamps.green[300],
442
+ "status-success-light": primitiveRamps.green[200],
443
+ "status-success-dark": primitiveRamps.green[600],
444
+ "status-success-subtle": primitiveRamps.green[50],
445
+ "status-success-muted": "rgba(46, 213, 115, 0.30)",
446
+ "status-success-strong": "rgba(46, 213, 115, 0.50)",
447
+ // Live-session accent — its OWN role, decoupled from success so the two can diverge
448
+ "status-live": primitiveRamps.green[300],
449
+ "status-live-muted": primitiveRamps.green[500],
450
+ "status-error": primitiveRamps.red[600],
451
+ "status-error-light": primitiveRamps.red[500],
452
+ "status-error-dark": primitiveRamps.red[700],
453
+ "status-error-subtle": primitiveRamps.red[50],
454
+ "status-error-muted": "rgba(209, 67, 67, 0.30)",
455
+ "status-error-strong": "rgba(209, 67, 67, 0.50)",
456
+ "status-error-vivid": alertRedVivid,
457
+ // NOT red[600], that is status-error
458
+ "status-error-vivid-light": primitiveRamps.red[500],
459
+ "status-error-vivid-dark": primitiveRamps.red[700],
460
+ "status-error-vivid-subtle": "rgba(255, 71, 87, 0.12)",
461
+ "status-error-vivid-muted": "rgba(255, 71, 87, 0.30)",
462
+ "status-error-vivid-strong": "rgba(255, 71, 87, 0.50)",
463
+ "status-warning": primitiveRamps.amber[300],
464
+ "status-warning-light": primitiveRamps.amber[200],
465
+ "status-warning-dark": primitiveRamps.amber[500],
466
+ "status-warning-subtle": primitiveRamps.amber[50],
467
+ "status-warning-muted": "rgba(249, 180, 21, 0.30)",
468
+ "status-warning-strong": "rgba(249, 180, 21, 0.50)",
469
+ "status-info": primitiveRamps.blue[500],
470
+ "status-info-light": primitiveRamps.blue[300],
471
+ "status-info-dark": primitiveRamps.blue[600],
472
+ "status-info-subtle": primitiveRamps.blue[50],
473
+ "status-info-muted": "rgba(33, 150, 243, 0.30)",
474
+ "status-info-strong": "rgba(33, 150, 243, 0.50)",
475
+ // Text on status backgrounds (on-status-*)
476
+ "on-status-success": primitiveColors.white,
477
+ "on-status-error": primitiveColors.white,
478
+ "on-status-warning": primitiveColors.white,
479
+ "on-status-info": primitiveColors.white,
480
+ // Result/outcome indicators (result-*)
481
+ "result-improve": "#4caf50",
482
+ // Green - positive outcome
483
+ "result-improve-light": "rgba(76, 175, 80, 0.12)",
484
+ "result-improve-dark": "#248a24",
485
+ "result-degrade": "#ef5350",
486
+ // Red - negative outcome
487
+ "result-degrade-light": "rgba(239, 83, 80, 0.12)",
488
+ "result-degrade-dark": "#b30000",
489
+ "result-inconclusive": "#9E9A97",
490
+ // Gray - no clear result
491
+ "result-inconclusive-light": "rgba(158, 154, 151, 0.12)",
492
+ "result-neutral": greyRamp[600],
493
+ // Neutral baseline
494
+ // Text on result backgrounds (on-result-*)
495
+ "on-result-improve": primitiveColors.white,
496
+ "on-result-degrade": primitiveColors.white,
497
+ "on-result-inconclusive": primitiveColors.white,
498
+ // Data visualization colors (data-*)
499
+ // First 10 colors from discrete rainbow optimized for charts
500
+ "data-1": discreteRainbow[9],
501
+ // Blue
502
+ "data-2": discreteRainbow[14],
503
+ // Green
504
+ "data-3": discreteRainbow[17],
505
+ // Yellow
506
+ "data-4": discreteRainbow[25],
507
+ // Red
508
+ "data-5": discreteRainbow[8],
509
+ // Purple
510
+ "data-6": discreteRainbow[20],
511
+ // Orange
512
+ "data-7": discreteRainbow[13],
513
+ // Light Blue
514
+ "data-8": discreteRainbow[15],
515
+ // Light Green
516
+ "data-9": discreteRainbow[3],
517
+ // Lavender
518
+ "data-10": discreteRainbow[22],
519
+ // Dark Orange
520
+ // Text colors (text-*)
521
+ "text-primary": "#121828",
522
+ "text-secondary": "#65748B",
523
+ "text-tertiary": greyRamp[400],
524
+ "text-disabled": "rgba(55, 65, 81, 0.48)",
525
+ "text-inverse": primitiveColors.white,
526
+ "text-link": primitiveRamps.blue[600],
527
+ "text-link-hover": primitiveRamps.blue[700],
528
+ // Surface colors (surface-*) - for elevated containers
529
+ "surface-base": primitiveColors.white,
530
+ "surface-elevated": greyRamp[50],
531
+ // slightly off-white for elevated cards
532
+ "surface-raised": greyRamp[100],
533
+ // light gray for raised cards
534
+ "surface-overlay": primitiveColors.white,
535
+ "surface-input": greyRamp[50],
536
+ // Input field background (filled variant)
537
+ // Background colors (background-*)
538
+ "background-base": "#EBEBEB",
539
+ "background-default": primitiveColors.white,
540
+ "background-subtle": greyRamp[50],
541
+ // Frame/bezel chrome — top bar + side nav shell, one step below
542
+ // `background-base`. Placeholder pairing for light mode, which is deferred.
543
+ "background-frame": greyRamp[400],
544
+ // Border colors (border-*)
545
+ "border-prominent": greyRamp[400],
546
+ // high-visibility divider
547
+ "border-focus": primitiveRamps.blue[600],
548
+ "border-input": greyRamp[200],
549
+ // Input field border
550
+ "border-input-hover": greyRamp[400],
551
+ // Input field border on hover
552
+ "border-input-focus": primitiveRamps.blue[600],
553
+ // Input field border on focus
554
+ "border-input-error": primitiveRamps.red[600],
555
+ // Input field border on error
556
+ // Alpha hairline separators (surface-independent — composite toward black on
557
+ // light surfaces, mirroring the dark-mode white-alpha family). See §4/S-2.
558
+ "hairline-subtle": "rgba(0, 0, 0, 0.06)",
559
+ "hairline-default": "rgba(0, 0, 0, 0.09)",
560
+ "hairline-strong": "rgba(0, 0, 0, 0.14)",
561
+ // Interactive states (interactive-*)
562
+ "interactive-hover": "rgba(55, 65, 81, 0.04)",
563
+ "interactive-focus": "rgba(55, 65, 81, 0.12)",
564
+ "interactive-active": "rgba(55, 65, 81, 0.16)",
565
+ "interactive-selected": "rgba(55, 65, 81, 0.08)",
566
+ "interactive-disabled": "rgba(55, 65, 81, 0.12)",
567
+ "interactive-disabled-text": "rgba(55, 65, 81, 0.26)",
568
+ // Divider
569
+ divider: "#E8E9EB",
570
+ // Avatar default
571
+ "avatar-background": greyRamp[600],
572
+ "avatar-text": primitiveColors.white
573
+ };
574
+ var semanticColorsDark = {
575
+ // Brand colors stay the same in dark mode
576
+ "brand-primary": primitiveRamps.orange[400],
577
+ "brand-primary-light": primitiveRamps.orange[300],
578
+ "brand-primary-dark": primitiveRamps.orange[500],
579
+ "brand-primary-subtle": "rgba(255, 121, 0, 0.12)",
580
+ "brand-primary-muted": "rgba(255, 121, 0, 0.30)",
581
+ "brand-primary-strong": "rgba(255, 121, 0, 0.50)",
582
+ "brand-primary-hover": primitiveRamps.orange[300],
583
+ "brand-primary-active": primitiveRamps.orange[200],
584
+ "brand-secondary": primitiveRamps.cyan[600],
585
+ "brand-secondary-light": primitiveRamps.cyan[500],
586
+ "brand-secondary-dark": primitiveRamps.cyan[700],
587
+ "brand-secondary-subtle": "rgba(48, 123, 155, 0.12)",
588
+ "brand-secondary-muted": "rgba(48, 123, 155, 0.30)",
589
+ "brand-secondary-strong": "rgba(48, 123, 155, 0.50)",
590
+ "brand-secondary-hover": primitiveRamps.cyan[500],
591
+ "brand-secondary-active": primitiveRamps.cyan[400],
592
+ // Text on brand backgrounds
593
+ "on-brand-primary": primitiveColors.white,
594
+ "on-brand-secondary": primitiveColors.white,
595
+ // Status colors
596
+ "status-success": primitiveRamps.green[300],
597
+ "status-success-light": primitiveRamps.green[200],
598
+ "status-success-dark": primitiveRamps.green[600],
599
+ "status-success-subtle": "rgba(46, 213, 115, 0.12)",
600
+ "status-success-muted": "rgba(46, 213, 115, 0.30)",
601
+ "status-success-strong": "rgba(46, 213, 115, 0.50)",
602
+ // Live-session accent — its OWN role, decoupled from success so the two can diverge
603
+ "status-live": primitiveRamps.green[300],
604
+ "status-live-muted": primitiveRamps.green[500],
605
+ "status-error": primitiveRamps.red[600],
606
+ "status-error-light": primitiveRamps.red[500],
607
+ "status-error-dark": primitiveRamps.red[700],
608
+ "status-error-subtle": "rgba(209, 67, 67, 0.12)",
609
+ "status-error-muted": "rgba(209, 67, 67, 0.30)",
610
+ "status-error-strong": "rgba(209, 67, 67, 0.50)",
611
+ "status-error-vivid": alertRedVivid,
612
+ "status-error-vivid-light": primitiveRamps.red[500],
613
+ "status-error-vivid-dark": primitiveRamps.red[700],
614
+ "status-error-vivid-subtle": "rgba(255, 71, 87, 0.12)",
615
+ "status-error-vivid-muted": "rgba(255, 71, 87, 0.30)",
616
+ "status-error-vivid-strong": "rgba(255, 71, 87, 0.50)",
617
+ "status-warning": primitiveRamps.amber[300],
618
+ "status-warning-light": primitiveRamps.amber[200],
619
+ "status-warning-dark": primitiveRamps.amber[500],
620
+ "status-warning-subtle": "rgba(249, 180, 21, 0.12)",
621
+ "status-warning-muted": "rgba(249, 180, 21, 0.30)",
622
+ "status-warning-strong": "rgba(249, 180, 21, 0.50)",
623
+ "status-info": primitiveRamps.blue[500],
624
+ "status-info-light": primitiveRamps.blue[300],
625
+ "status-info-dark": primitiveRamps.blue[600],
626
+ "status-info-subtle": "rgba(33, 150, 243, 0.12)",
627
+ "status-info-muted": "rgba(33, 150, 243, 0.30)",
628
+ "status-info-strong": "rgba(33, 150, 243, 0.50)",
629
+ // Text on status backgrounds
630
+ "on-status-success": primitiveColors.white,
631
+ "on-status-error": primitiveColors.white,
632
+ "on-status-warning": primitiveColors.white,
633
+ "on-status-info": primitiveColors.white,
634
+ // Result/outcome indicators (result-*)
635
+ "result-improve": "#4caf50",
636
+ "result-improve-light": "rgba(76, 175, 80, 0.16)",
637
+ "result-improve-dark": "#248a24",
638
+ "result-degrade": "#ef5350",
639
+ "result-degrade-light": "rgba(239, 83, 80, 0.16)",
640
+ "result-degrade-dark": "#b30000",
641
+ "result-inconclusive": "#9E9A97",
642
+ "result-inconclusive-light": "rgba(158, 154, 151, 0.16)",
643
+ "result-neutral": greyRamp[400],
644
+ // Text on result backgrounds
645
+ "on-result-improve": primitiveColors.white,
646
+ "on-result-degrade": primitiveColors.white,
647
+ "on-result-inconclusive": primitiveColors.white,
648
+ // Data visualization colors (same in dark mode for consistency)
649
+ "data-1": discreteRainbow[9],
650
+ "data-2": discreteRainbow[14],
651
+ "data-3": discreteRainbow[17],
652
+ "data-4": discreteRainbow[25],
653
+ "data-5": discreteRainbow[8],
654
+ "data-6": discreteRainbow[20],
655
+ "data-7": discreteRainbow[13],
656
+ "data-8": discreteRainbow[15],
657
+ "data-9": discreteRainbow[3],
658
+ "data-10": discreteRainbow[22],
659
+ // Text colors - inverted for dark mode
660
+ "text-primary": greyRamp[50],
661
+ "text-secondary": greyRamp[400],
662
+ // Deliberately ONE step lighter than the L*-nearest match (`greyRamp[600]`).
663
+ // The colour this replaced failed WCAG large-text outright on the three
664
+ // lightest planes — 2.96 / 2.72 / 2.49 against elevated / raised / overlay —
665
+ // and `600` carried that failure forward almost exactly (2.93 / 2.70 / 2.47).
666
+ // `500` clears 3:1 everywhere (3.32–5.34). Contrast beats colour fidelity for
667
+ // text roles; borders and surfaces still use strict L*-nearest. See
668
+ // semantic-contrast.test.ts, which fails if this is moved back down.
669
+ "text-tertiary": greyRamp[500],
670
+ "text-disabled": "rgba(255, 255, 255, 0.38)",
671
+ "text-inverse": greyRamp[950],
672
+ "text-link": "#828DF8",
673
+ "text-link-hover": primitiveRamps.blue[400],
674
+ // Surface colors - dark backgrounds — warm-tapered DERIVED ramp (TD-surface-tokens,
675
+ // S-1, re-spaced S-3). Shipped verbatim from `deriveSurfaceRamp()` — see
676
+ // `surfaceRampDark` in primitives.ts for the full derivation note. `surface-overlay`
677
+ // and `surface-elevated` are distinct (were both #191919 pre-S-1); `surface-input`
678
+ // tracks one plane above `surface-base`, same relative position as before the remap.
679
+ // `background-base` backs `Surface level="background"` (SurfaceContext.SURFACE_LEVEL_TOKEN),
680
+ // so it takes the ramp's shell role. The deepest plane is `background-frame`,
681
+ // which is also the `SurfaceLevel` floor a pressed surface clamps at.
682
+ "surface-base": greyRamp[925],
683
+ // main surface (#252321, L*13.9)
684
+ "surface-elevated": greyRamp[900],
685
+ // elevated surface (#2C2A28, L*17.2 — nav/rail)
686
+ "surface-raised": greyRamp[875],
687
+ // raised surface (#31302F, L*19.9 — cards)
688
+ "surface-overlay": greyRamp[850],
689
+ // overlay surface (#373635, L*22.7 — hero/popover)
690
+ "surface-input": greyRamp[900],
691
+ // input surface (#2C2A28 — one plane above base)
692
+ // Background colors — same ramp, the frame/shell end of it.
693
+ "background-base": greyRamp[950],
694
+ // shell (#1C1916, L*9 — Surface level="background")
695
+ "background-default": greyRamp[925],
696
+ // main background (#252321, L*13.9 — matches surface-base)
697
+ "background-subtle": greyRamp[900],
698
+ // subtle background (#2C2A28, L*17.2 — matches surface-elevated)
699
+ // Frame/bezel chrome — the top bar + side nav shell, one step BELOW
700
+ // `background-base`. It used to be described as sitting OUTSIDE the ramp; it
701
+ // is simply the ramp's last step now, and the floor `<Surface pressed>` clamps at.
702
+ "background-frame": greyRamp[975],
703
+ // frame / bezel (#100D0A, L*3.8)
704
+ // Border colors — solid dark borders are RETIRED (TD-07.14). Not a preference — a structural
705
+ // consequence of one ramp. Every step from 850 to 975 is now a surface plane,
706
+ // so a solid border dark enough to read as a border necessarily equals some
707
+ // plane's fill, which is exactly the collision `surface.contract.test.ts` R2
708
+ // forbids. The only non-plane steps left in that band are 800 and 700, and
709
+ // borders there jump from L*~10-25 to L*~28-38 — a restyle, not a migration.
710
+ //
711
+ // So separation moves to the alpha hairlines, which dark mode already called
712
+ // "the primary separation cue". Being alpha, they composite against whatever
713
+ // plane they land on and cannot collide with any of them — the problem stops
714
+ // existing rather than being re-solved per plane. The three solid tokens were
715
+ // deleted outright; consumers point at the `hairline-*` family below.
716
+ //
717
+ // `border-prominent` stays SOLID: it is the one border meant to be seen
718
+ // outright (4 call sites, high-visibility dividers), and grey-800 is not a
719
+ // plane, so it keeps its job without collision.
720
+ "border-prominent": greyRamp[800],
721
+ // high-visibility divider
722
+ "border-focus": "#828DF8",
723
+ "border-input": greyRamp[700],
724
+ "border-input-hover": greyRamp[600],
725
+ "border-input-focus": "#828DF8",
726
+ "border-input-error": primitiveRamps.red[500],
727
+ // Alpha hairline separators — the primary separation cue (§4/S-2). Self-
728
+ // normalizing: composites toward white by ~the same amount on ANY plane, so
729
+ // one family works at every elevation instead of per-surface border tokens.
730
+ // Shadows are demoted to floating-overlay use only (not shipped as a fill
731
+ // separator here — see elevation.ts, follow-up S-4).
732
+ //
733
+ // RETUNED on the wall (VW-99, S-6). The original .06/.09/.14 were set at a
734
+ // desk. On the panel at ~3 m `subtle` rendered but was indiscernible, and
735
+ // `default` — the load-bearing one, with no solid-border fallback since
736
+ // TD-07.14 — went weak on the lightest plane. `strong` read cleanly with room
737
+ // to spare, which is what made raising the whole family viable.
738
+ //
739
+ // Each tier steps up onto the next MEASURED-GOOD rung rather than an
740
+ // interpolated one: the new `subtle` is the old `default`, and the new
741
+ // `default` is the old `strong` — a value just confirmed legible on all four
742
+ // planes. Spacing goes 1 : 1.56 : 2.33, against the original 1 : 1.5 : 2.33.
743
+ //
744
+ // RUN 2 (VW-99): all three tiers were seen on all four planes — the retune
745
+ // worked — but `subtle` was still "a bit hard to read", so the whole family
746
+ // took a further +.01. That is a comfort margin on a passing row, not a fix
747
+ // for a failing one, which is why it is a flat offset: the 1 : 1.56 : 2.33
748
+ // spacing that the run validated is preserved rather than re-derived.
749
+ //
750
+ // Keep these to TWO decimals. react-native-web quantises alpha to 8 bits, so
751
+ // a 3-decimal value silently rounds on the way to the DOM (.135 renders as
752
+ // .13) — the token would say one thing and paint another.
753
+ //
754
+ // DARK ONLY. The light family above composites toward BLACK on light planes,
755
+ // which this run says nothing about — do not mirror these numbers into it
756
+ // without its own verification.
757
+ "hairline-subtle": "rgba(255, 255, 255, 0.10)",
758
+ "hairline-default": "rgba(255, 255, 255, 0.15)",
759
+ "hairline-strong": "rgba(255, 255, 255, 0.22)",
760
+ // Interactive states
761
+ "interactive-hover": "rgba(255, 255, 255, 0.04)",
762
+ "interactive-focus": "rgba(255, 255, 255, 0.12)",
763
+ "interactive-active": "rgba(255, 255, 255, 0.16)",
764
+ "interactive-selected": "rgba(255, 255, 255, 0.08)",
765
+ "interactive-disabled": "rgba(255, 255, 255, 0.12)",
766
+ "interactive-disabled-text": "rgba(255, 255, 255, 0.26)",
767
+ // Divider
768
+ divider: "rgba(255, 255, 255, 0.09)",
769
+ // Avatar default
770
+ "avatar-background": greyRamp[700],
771
+ "avatar-text": primitiveColors.white
772
+ };
773
+ var semanticTypography = {
774
+ // Headings (Space Grotesk)
775
+ h1: {
776
+ fontFamily: "heading",
777
+ fontSize: "3.5rem",
778
+ fontWeight: 700,
779
+ lineHeight: 1.375
780
+ },
781
+ h2: {
782
+ fontFamily: "heading",
783
+ fontSize: "3rem",
784
+ fontWeight: 700,
785
+ lineHeight: 1.375
786
+ },
787
+ h3: {
788
+ fontFamily: "heading",
789
+ fontSize: "2.25rem",
790
+ fontWeight: 700,
791
+ lineHeight: 1.375
792
+ },
793
+ h4: {
794
+ fontFamily: "heading",
795
+ fontSize: "2rem",
796
+ fontWeight: 700,
797
+ lineHeight: 1.375
798
+ },
799
+ h5: {
800
+ fontFamily: "heading",
801
+ fontSize: "1.5rem",
802
+ fontWeight: 600,
803
+ lineHeight: 1.375
804
+ },
805
+ h6: {
806
+ fontFamily: "heading",
807
+ fontSize: "1.125rem",
808
+ fontWeight: 600,
809
+ lineHeight: 1.375
810
+ },
811
+ // Body text (Nunito Sans)
812
+ body1: {
813
+ fontFamily: "body",
814
+ fontSize: "1rem",
815
+ fontWeight: 400,
816
+ lineHeight: 1.5
817
+ },
818
+ body2: {
819
+ fontFamily: "body",
820
+ fontSize: "0.875rem",
821
+ fontWeight: 400,
822
+ lineHeight: 1.57
823
+ },
824
+ subtitle1: {
825
+ fontFamily: "body",
826
+ fontSize: "1rem",
827
+ fontWeight: 500,
828
+ lineHeight: 1.75
829
+ },
830
+ subtitle2: {
831
+ fontFamily: "body",
832
+ fontSize: "0.875rem",
833
+ fontWeight: 500,
834
+ lineHeight: 1.57
835
+ },
836
+ caption: {
837
+ fontFamily: "body",
838
+ fontSize: "0.75rem",
839
+ fontWeight: 400,
840
+ lineHeight: 1.66
841
+ },
842
+ overline: {
843
+ fontFamily: "body",
844
+ fontSize: "0.75rem",
845
+ fontWeight: 600,
846
+ lineHeight: 2.5,
847
+ letterSpacing: "0.5px",
848
+ textTransform: "uppercase"
849
+ },
850
+ button: {
851
+ fontFamily: "sans",
852
+ fontSize: "0.875rem",
853
+ fontWeight: 600,
854
+ lineHeight: 1.75
855
+ }
856
+ };
857
+ var buttonSizes = {
858
+ sm: {
859
+ paddingX: "16px",
860
+ paddingY: "6px",
861
+ fontSize: "0.875rem"
862
+ },
863
+ md: {
864
+ paddingX: "20px",
865
+ paddingY: "8px",
866
+ fontSize: "0.875rem"
867
+ },
868
+ lg: {
869
+ paddingX: "24px",
870
+ paddingY: "11px",
871
+ fontSize: "1rem"
872
+ }
873
+ };
874
+ function getSemanticColors(mode) {
875
+ return mode === "dark" ? semanticColorsDark : semanticColorsLight;
876
+ }
877
+
878
+ export { CATEGORICAL_CVD_SAFE_MAX, SURFACE_PLANE_STEPS, alertRedVivid, bestTextColor, buttonSizes, categoricalPalette, discreteRainbow, divergingScale, getCategoricalColor, getDiscreteRainbowColor, getSemanticColors, greyRamp, primitiveBorderRadius, primitiveBreakpoints, primitiveColors, primitiveRamps, primitiveSpacing, primitiveTypography, primitiveZIndex, semanticColorsDark, semanticColorsLight, semanticTypography, sequentialEffort };
879
+ //# sourceMappingURL=tokens.mjs.map
880
+ //# sourceMappingURL=tokens.mjs.map