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