@titan-design/react-ui 0.12.1 → 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 +1319 -216
  7. package/dist/index.d.ts +1319 -216
  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 +195 -134
  21. package/dist/theme/index.d.ts +195 -134
  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 +73 -5
  31. package/dist/theme/tokens.d.ts +73 -5
  32. package/dist/theme/tokens.js +55 -7
  33. package/dist/theme/tokens.js.map +1 -1
  34. package/dist/theme/tokens.mjs +55 -8
  35. package/dist/theme/tokens.mjs.map +1 -1
  36. package/docs/audits/2026-09-08-critique-addenda.md +51 -0
  37. package/docs/audits/2026-09-08-library-critique.md +212 -0
  38. package/docs/library-roadmap.md +99 -0
  39. package/package.json +1 -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 +11 -6
  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 +89 -26
  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 +23 -21
  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 +1 -3
  480. package/src/theme/tokens/primitives.test.ts +15 -7
  481. package/src/theme/tokens/primitives.ts +65 -33
  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
@@ -11,6 +11,7 @@ var primitiveColors = {
11
11
  black: "#000000",
12
12
  transparent: "transparent"
13
13
  };
14
+ var alertRedVivid = "#FF4757";
14
15
  var greyRamp = {
15
16
  50: "#F9F6F3",
16
17
  // L*97.0 W6
@@ -272,12 +273,30 @@ function getDiscreteRainbowColor(index, size) {
272
273
  }
273
274
  var primitiveTypography = {
274
275
  fontFamilies: {
275
- sans: ["Inter", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "Helvetica", "Arial", "sans-serif"],
276
+ sans: [
277
+ "Inter",
278
+ "-apple-system",
279
+ "BlinkMacSystemFont",
280
+ "Segoe UI",
281
+ "Helvetica",
282
+ "Arial",
283
+ "sans-serif"
284
+ ],
276
285
  body: ["Nunito Sans", "sans-serif"],
277
286
  heading: ["Space Grotesk", "sans-serif"],
278
- mono: ["SF Mono", "Monaco", "Inconsolata", "Fira Mono", "Droid Sans Mono", "Source Code Pro", "monospace"]
287
+ mono: [
288
+ "SF Mono",
289
+ "Monaco",
290
+ "Inconsolata",
291
+ "Fira Mono",
292
+ "Droid Sans Mono",
293
+ "Source Code Pro",
294
+ "monospace"
295
+ ]
279
296
  },
280
297
  fontSizes: {
298
+ "2xs": "0.625rem",
299
+ // 10px
281
300
  xs: "0.75rem",
282
301
  // 12px
283
302
  sm: "0.875rem",
@@ -410,12 +429,16 @@ var semanticColorsLight = {
410
429
  "brand-primary-light": primitiveRamps.orange[300],
411
430
  "brand-primary-dark": primitiveRamps.orange[500],
412
431
  "brand-primary-subtle": "rgba(255, 121, 0, 0.08)",
432
+ "brand-primary-muted": "rgba(255, 121, 0, 0.30)",
433
+ "brand-primary-strong": "rgba(255, 121, 0, 0.50)",
413
434
  "brand-primary-hover": primitiveRamps.orange[500],
414
435
  "brand-primary-active": primitiveRamps.orange[600],
415
436
  "brand-secondary": primitiveRamps.cyan[600],
416
437
  "brand-secondary-light": primitiveRamps.cyan[500],
417
438
  "brand-secondary-dark": primitiveRamps.cyan[700],
418
439
  "brand-secondary-subtle": "rgba(48, 123, 155, 0.08)",
440
+ "brand-secondary-muted": "rgba(48, 123, 155, 0.30)",
441
+ "brand-secondary-strong": "rgba(48, 123, 155, 0.50)",
419
442
  "brand-secondary-hover": primitiveRamps.cyan[700],
420
443
  "brand-secondary-active": primitiveRamps.cyan[800],
421
444
  // Text on brand backgrounds (on-*)
@@ -426,6 +449,8 @@ var semanticColorsLight = {
426
449
  "status-success-light": primitiveRamps.green[200],
427
450
  "status-success-dark": primitiveRamps.green[600],
428
451
  "status-success-subtle": primitiveRamps.green[50],
452
+ "status-success-muted": "rgba(46, 213, 115, 0.30)",
453
+ "status-success-strong": "rgba(46, 213, 115, 0.50)",
429
454
  // Live-session accent — its OWN role, decoupled from success so the two can diverge
430
455
  "status-live": primitiveRamps.green[300],
431
456
  "status-live-muted": primitiveRamps.green[500],
@@ -433,19 +458,27 @@ var semanticColorsLight = {
433
458
  "status-error-light": primitiveRamps.red[500],
434
459
  "status-error-dark": primitiveRamps.red[700],
435
460
  "status-error-subtle": primitiveRamps.red[50],
436
- "status-error-vivid": primitiveRamps.red[600],
437
- // vivid alert red
461
+ "status-error-muted": "rgba(209, 67, 67, 0.30)",
462
+ "status-error-strong": "rgba(209, 67, 67, 0.50)",
463
+ "status-error-vivid": alertRedVivid,
464
+ // NOT red[600], that is status-error
438
465
  "status-error-vivid-light": primitiveRamps.red[500],
439
466
  "status-error-vivid-dark": primitiveRamps.red[700],
440
467
  "status-error-vivid-subtle": "rgba(255, 71, 87, 0.12)",
468
+ "status-error-vivid-muted": "rgba(255, 71, 87, 0.30)",
469
+ "status-error-vivid-strong": "rgba(255, 71, 87, 0.50)",
441
470
  "status-warning": primitiveRamps.amber[300],
442
471
  "status-warning-light": primitiveRamps.amber[200],
443
472
  "status-warning-dark": primitiveRamps.amber[500],
444
473
  "status-warning-subtle": primitiveRamps.amber[50],
474
+ "status-warning-muted": "rgba(249, 180, 21, 0.30)",
475
+ "status-warning-strong": "rgba(249, 180, 21, 0.50)",
445
476
  "status-info": primitiveRamps.blue[500],
446
477
  "status-info-light": primitiveRamps.blue[300],
447
478
  "status-info-dark": primitiveRamps.blue[600],
448
479
  "status-info-subtle": primitiveRamps.blue[50],
480
+ "status-info-muted": "rgba(33, 150, 243, 0.30)",
481
+ "status-info-strong": "rgba(33, 150, 243, 0.50)",
449
482
  // Text on status backgrounds (on-status-*)
450
483
  "on-status-success": primitiveColors.white,
451
484
  "on-status-error": primitiveColors.white,
@@ -540,7 +573,7 @@ var semanticColorsLight = {
540
573
  "interactive-disabled": "rgba(55, 65, 81, 0.12)",
541
574
  "interactive-disabled-text": "rgba(55, 65, 81, 0.26)",
542
575
  // Divider
543
- "divider": "#E8E9EB",
576
+ divider: "#E8E9EB",
544
577
  // Avatar default
545
578
  "avatar-background": greyRamp[600],
546
579
  "avatar-text": primitiveColors.white
@@ -551,12 +584,16 @@ var semanticColorsDark = {
551
584
  "brand-primary-light": primitiveRamps.orange[300],
552
585
  "brand-primary-dark": primitiveRamps.orange[500],
553
586
  "brand-primary-subtle": "rgba(255, 121, 0, 0.12)",
587
+ "brand-primary-muted": "rgba(255, 121, 0, 0.30)",
588
+ "brand-primary-strong": "rgba(255, 121, 0, 0.50)",
554
589
  "brand-primary-hover": primitiveRamps.orange[300],
555
590
  "brand-primary-active": primitiveRamps.orange[200],
556
591
  "brand-secondary": primitiveRamps.cyan[600],
557
592
  "brand-secondary-light": primitiveRamps.cyan[500],
558
593
  "brand-secondary-dark": primitiveRamps.cyan[700],
559
594
  "brand-secondary-subtle": "rgba(48, 123, 155, 0.12)",
595
+ "brand-secondary-muted": "rgba(48, 123, 155, 0.30)",
596
+ "brand-secondary-strong": "rgba(48, 123, 155, 0.50)",
560
597
  "brand-secondary-hover": primitiveRamps.cyan[500],
561
598
  "brand-secondary-active": primitiveRamps.cyan[400],
562
599
  // Text on brand backgrounds
@@ -567,6 +604,8 @@ var semanticColorsDark = {
567
604
  "status-success-light": primitiveRamps.green[200],
568
605
  "status-success-dark": primitiveRamps.green[600],
569
606
  "status-success-subtle": "rgba(46, 213, 115, 0.12)",
607
+ "status-success-muted": "rgba(46, 213, 115, 0.30)",
608
+ "status-success-strong": "rgba(46, 213, 115, 0.50)",
570
609
  // Live-session accent — its OWN role, decoupled from success so the two can diverge
571
610
  "status-live": primitiveRamps.green[300],
572
611
  "status-live-muted": primitiveRamps.green[500],
@@ -574,18 +613,26 @@ var semanticColorsDark = {
574
613
  "status-error-light": primitiveRamps.red[500],
575
614
  "status-error-dark": primitiveRamps.red[700],
576
615
  "status-error-subtle": "rgba(209, 67, 67, 0.12)",
577
- "status-error-vivid": primitiveRamps.red[600],
616
+ "status-error-muted": "rgba(209, 67, 67, 0.30)",
617
+ "status-error-strong": "rgba(209, 67, 67, 0.50)",
618
+ "status-error-vivid": alertRedVivid,
578
619
  "status-error-vivid-light": primitiveRamps.red[500],
579
620
  "status-error-vivid-dark": primitiveRamps.red[700],
580
621
  "status-error-vivid-subtle": "rgba(255, 71, 87, 0.12)",
622
+ "status-error-vivid-muted": "rgba(255, 71, 87, 0.30)",
623
+ "status-error-vivid-strong": "rgba(255, 71, 87, 0.50)",
581
624
  "status-warning": primitiveRamps.amber[300],
582
625
  "status-warning-light": primitiveRamps.amber[200],
583
626
  "status-warning-dark": primitiveRamps.amber[500],
584
627
  "status-warning-subtle": "rgba(249, 180, 21, 0.12)",
628
+ "status-warning-muted": "rgba(249, 180, 21, 0.30)",
629
+ "status-warning-strong": "rgba(249, 180, 21, 0.50)",
585
630
  "status-info": primitiveRamps.blue[500],
586
631
  "status-info-light": primitiveRamps.blue[300],
587
632
  "status-info-dark": primitiveRamps.blue[600],
588
633
  "status-info-subtle": "rgba(33, 150, 243, 0.12)",
634
+ "status-info-muted": "rgba(33, 150, 243, 0.30)",
635
+ "status-info-strong": "rgba(33, 150, 243, 0.50)",
589
636
  // Text on status backgrounds
590
637
  "on-status-success": primitiveColors.white,
591
638
  "on-status-error": primitiveColors.white,
@@ -725,7 +772,7 @@ var semanticColorsDark = {
725
772
  "interactive-disabled": "rgba(255, 255, 255, 0.12)",
726
773
  "interactive-disabled-text": "rgba(255, 255, 255, 0.26)",
727
774
  // Divider
728
- "divider": "rgba(255, 255, 255, 0.09)",
775
+ divider: "rgba(255, 255, 255, 0.09)",
729
776
  // Avatar default
730
777
  "avatar-background": greyRamp[700],
731
778
  "avatar-text": primitiveColors.white
@@ -864,26 +911,40 @@ var lightThemeCSSVars = {
864
911
  "--color-brand-primary-light": semanticColorsLight["brand-primary-light"],
865
912
  "--color-brand-primary-dark": semanticColorsLight["brand-primary-dark"],
866
913
  "--color-brand-primary-subtle": semanticColorsLight["brand-primary-subtle"],
914
+ "--color-brand-primary-muted": semanticColorsLight["brand-primary-muted"],
915
+ "--color-brand-primary-strong": semanticColorsLight["brand-primary-strong"],
867
916
  "--color-brand-secondary": semanticColorsLight["brand-secondary"],
868
917
  "--color-brand-secondary-light": semanticColorsLight["brand-secondary-light"],
869
918
  "--color-brand-secondary-dark": semanticColorsLight["brand-secondary-dark"],
870
919
  "--color-brand-secondary-subtle": semanticColorsLight["brand-secondary-subtle"],
920
+ "--color-brand-secondary-muted": semanticColorsLight["brand-secondary-muted"],
921
+ "--color-brand-secondary-strong": semanticColorsLight["brand-secondary-strong"],
871
922
  "--color-on-brand-primary": semanticColorsLight["on-brand-primary"],
872
923
  "--color-on-brand-secondary": semanticColorsLight["on-brand-secondary"],
873
924
  "--color-status-success": semanticColorsLight["status-success"],
874
925
  "--color-status-success-subtle": semanticColorsLight["status-success-subtle"],
926
+ "--color-status-success-muted": semanticColorsLight["status-success-muted"],
927
+ "--color-status-success-strong": semanticColorsLight["status-success-strong"],
875
928
  "--color-status-live": semanticColorsLight["status-live"],
876
929
  "--color-status-live-muted": semanticColorsLight["status-live-muted"],
877
930
  "--color-status-error": semanticColorsLight["status-error"],
878
931
  "--color-status-error-subtle": semanticColorsLight["status-error-subtle"],
932
+ "--color-status-error-muted": semanticColorsLight["status-error-muted"],
933
+ "--color-status-error-strong": semanticColorsLight["status-error-strong"],
879
934
  "--color-status-warning": semanticColorsLight["status-warning"],
880
935
  "--color-status-warning-subtle": semanticColorsLight["status-warning-subtle"],
936
+ "--color-status-warning-muted": semanticColorsLight["status-warning-muted"],
937
+ "--color-status-warning-strong": semanticColorsLight["status-warning-strong"],
881
938
  "--color-status-info": semanticColorsLight["status-info"],
882
939
  "--color-status-info-subtle": semanticColorsLight["status-info-subtle"],
940
+ "--color-status-info-muted": semanticColorsLight["status-info-muted"],
941
+ "--color-status-info-strong": semanticColorsLight["status-info-strong"],
883
942
  "--color-status-error-vivid": semanticColorsLight["status-error-vivid"],
884
943
  "--color-status-error-vivid-light": semanticColorsLight["status-error-vivid-light"],
885
944
  "--color-status-error-vivid-dark": semanticColorsLight["status-error-vivid-dark"],
886
945
  "--color-status-error-vivid-subtle": semanticColorsLight["status-error-vivid-subtle"],
946
+ "--color-status-error-vivid-muted": semanticColorsLight["status-error-vivid-muted"],
947
+ "--color-status-error-vivid-strong": semanticColorsLight["status-error-vivid-strong"],
887
948
  "--color-text-primary": semanticColorsLight["text-primary"],
888
949
  "--color-text-secondary": semanticColorsLight["text-secondary"],
889
950
  "--color-text-tertiary": semanticColorsLight["text-tertiary"],
@@ -963,26 +1024,40 @@ var darkThemeCSSVars = {
963
1024
  "--color-brand-primary-light": semanticColorsDark["brand-primary-light"],
964
1025
  "--color-brand-primary-dark": semanticColorsDark["brand-primary-dark"],
965
1026
  "--color-brand-primary-subtle": semanticColorsDark["brand-primary-subtle"],
1027
+ "--color-brand-primary-muted": semanticColorsDark["brand-primary-muted"],
1028
+ "--color-brand-primary-strong": semanticColorsDark["brand-primary-strong"],
966
1029
  "--color-brand-secondary": semanticColorsDark["brand-secondary"],
967
1030
  "--color-brand-secondary-light": semanticColorsDark["brand-secondary-light"],
968
1031
  "--color-brand-secondary-dark": semanticColorsDark["brand-secondary-dark"],
969
1032
  "--color-brand-secondary-subtle": semanticColorsDark["brand-secondary-subtle"],
1033
+ "--color-brand-secondary-muted": semanticColorsDark["brand-secondary-muted"],
1034
+ "--color-brand-secondary-strong": semanticColorsDark["brand-secondary-strong"],
970
1035
  "--color-on-brand-primary": semanticColorsDark["on-brand-primary"],
971
1036
  "--color-on-brand-secondary": semanticColorsDark["on-brand-secondary"],
972
1037
  "--color-status-success": semanticColorsDark["status-success"],
973
1038
  "--color-status-success-subtle": semanticColorsDark["status-success-subtle"],
1039
+ "--color-status-success-muted": semanticColorsDark["status-success-muted"],
1040
+ "--color-status-success-strong": semanticColorsDark["status-success-strong"],
974
1041
  "--color-status-live": semanticColorsDark["status-live"],
975
1042
  "--color-status-live-muted": semanticColorsDark["status-live-muted"],
976
1043
  "--color-status-error": semanticColorsDark["status-error"],
977
1044
  "--color-status-error-subtle": semanticColorsDark["status-error-subtle"],
1045
+ "--color-status-error-muted": semanticColorsDark["status-error-muted"],
1046
+ "--color-status-error-strong": semanticColorsDark["status-error-strong"],
978
1047
  "--color-status-warning": semanticColorsDark["status-warning"],
979
1048
  "--color-status-warning-subtle": semanticColorsDark["status-warning-subtle"],
1049
+ "--color-status-warning-muted": semanticColorsDark["status-warning-muted"],
1050
+ "--color-status-warning-strong": semanticColorsDark["status-warning-strong"],
980
1051
  "--color-status-info": semanticColorsDark["status-info"],
981
1052
  "--color-status-info-subtle": semanticColorsDark["status-info-subtle"],
1053
+ "--color-status-info-muted": semanticColorsDark["status-info-muted"],
1054
+ "--color-status-info-strong": semanticColorsDark["status-info-strong"],
982
1055
  "--color-status-error-vivid": semanticColorsDark["status-error-vivid"],
983
1056
  "--color-status-error-vivid-light": semanticColorsDark["status-error-vivid-light"],
984
1057
  "--color-status-error-vivid-dark": semanticColorsDark["status-error-vivid-dark"],
985
1058
  "--color-status-error-vivid-subtle": semanticColorsDark["status-error-vivid-subtle"],
1059
+ "--color-status-error-vivid-muted": semanticColorsDark["status-error-vivid-muted"],
1060
+ "--color-status-error-vivid-strong": semanticColorsDark["status-error-vivid-strong"],
986
1061
  "--color-text-primary": semanticColorsDark["text-primary"],
987
1062
  "--color-text-secondary": semanticColorsDark["text-secondary"],
988
1063
  "--color-text-tertiary": semanticColorsDark["text-tertiary"],
@@ -1174,6 +1249,19 @@ function barPaper(color, flip = false) {
1174
1249
  boxShadow: flip ? "0 -6px 16px rgba(0,0,0,0.45)" : "inset 0 1.5px 0 rgba(255,255,255,0.22), 0 6px 16px rgba(0,0,0,0.45)"
1175
1250
  };
1176
1251
  }
1252
+ function postIt(tone = c["surface-raised"], deg = -1.5) {
1253
+ return {
1254
+ backgroundColor: tone,
1255
+ backgroundImage: grainForTone(tone),
1256
+ boxShadow: "inset 0 1px 0 rgba(255,255,255,0.12), 0 6px 14px rgba(0,0,0,0.45)",
1257
+ transform: [{ rotate: `${deg}deg` }]
1258
+ };
1259
+ }
1260
+ var debossLabel = {
1261
+ textShadowColor: "rgba(255,255,255,0.11)",
1262
+ textShadowOffset: { width: 0, height: 1 },
1263
+ textShadowRadius: 0
1264
+ };
1177
1265
 
1178
1266
  // src/theme/color-utils.ts
1179
1267
  function hexToRgb(hex) {
@@ -1293,306 +1381,124 @@ function isDark(hex) {
1293
1381
  const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b);
1294
1382
  return hsv.v < 0.6;
1295
1383
  }
1296
- var elevationSystem = {
1297
- // Deep inset (recessed input fields, deeply pressed buttons)
1298
- [-2]: {
1299
- name: "deep-inset",
1300
- colorAdjustment: 0,
1301
- shadowIntensity: "strong",
1302
- shadowStyle: "pressed",
1303
- description: "Deeply recessed elements (e.g., input fields, deeply pressed buttons)"
1304
- },
1305
- // Shallow inset (pressed buttons, sunken panels)
1306
- [-1]: {
1307
- name: "inset",
1308
- colorAdjustment: 0,
1309
- shadowIntensity: "medium",
1310
- shadowStyle: "pressed",
1311
- description: "Shallow inset elements (e.g., pressed buttons, sunken panels within cards)"
1312
- },
1313
- // Base level (page background, default surface)
1314
- [0]: {
1315
- name: "base",
1316
- colorAdjustment: 0,
1317
- shadowIntensity: "subtle",
1318
- shadowStyle: "raised",
1319
- description: "Base surface level (page background, default containers)"
1320
- },
1321
- // Level 1: Subtle elevation (outline cards, subtle containers)
1322
- [1]: {
1323
- name: "subtle",
1324
- // The whole ladder was re-spaced in TD-07.16. It used to run
1325
- // 0.01/0.02/0.04/0.06/0.08, where the first step was ~2 RGB values — under
1326
- // the perceptual floor, so level 1 existed in the type system and nowhere on
1327
- // screen. With drop-shadow now gated off below FLOATING_ELEVATION_MIN, TONE
1328
- // is the only thing separating 0-3, so every step has to actually land.
1329
- // Even 0.025 spacing, verified in elevation.test.ts as ΔL* > 1 per step.
1330
- colorAdjustment: 0.025,
1331
- shadowIntensity: "subtle",
1332
- shadowStyle: "raised",
1333
- description: "Subtle elevation (outline cards, subtle containers)"
1334
- },
1335
- // Level 2: Standard elevation (default cards, buttons)
1336
- [2]: {
1337
- name: "standard",
1338
- colorAdjustment: 0.05,
1339
- shadowIntensity: "medium",
1340
- shadowStyle: "raised",
1341
- description: "Standard elevation (default cards, raised buttons)"
1342
- },
1343
- // Level 3: Prominent elevation (important cards, modals)
1344
- [3]: {
1345
- name: "prominent",
1346
- colorAdjustment: 0.075,
1347
- shadowIntensity: "strong",
1348
- shadowStyle: "raised",
1349
- description: "Prominent elevation (important cards, modals, dropdowns)"
1350
- },
1351
- // Level 4: High elevation (overlays, popovers)
1352
- [4]: {
1353
- name: "high",
1354
- colorAdjustment: 0.1,
1355
- shadowIntensity: "strong",
1356
- shadowStyle: "raised",
1357
- description: "High elevation (overlays, popovers, tooltips)"
1358
- },
1359
- // Level 5: Floating (toasts, floating action buttons)
1360
- [5]: {
1361
- name: "floating",
1362
- colorAdjustment: 0.13,
1363
- shadowIntensity: "strong",
1364
- shadowStyle: "raised",
1365
- description: "Floating elevation (toasts, floating action buttons, highest z-index)"
1366
- }
1384
+ var FLOATING_LIFT_MIN = 4;
1385
+ var LIFT_RIM_ALPHA = { dark: 0.12, light: 0.9 };
1386
+ var AMBIENT = {
1387
+ 1: [
1388
+ { y: 1, blur: 2, alpha: 0.35 },
1389
+ { y: 2, blur: 6, alpha: 0.3 }
1390
+ ],
1391
+ 2: [
1392
+ { y: 1, blur: 2, alpha: 0.35 },
1393
+ { y: 4, blur: 12, alpha: 0.32 }
1394
+ ],
1395
+ 3: [
1396
+ { y: 2, blur: 4, alpha: 0.35 },
1397
+ { y: 8, blur: 22, alpha: 0.35 }
1398
+ ],
1399
+ 4: [
1400
+ { y: 1, blur: 2, alpha: 0.35 },
1401
+ { y: 10, blur: 24, alpha: 0.3 },
1402
+ { y: 24, blur: 48, alpha: 0.2 }
1403
+ ],
1404
+ 5: [
1405
+ { y: 2, blur: 4, alpha: 0.4 },
1406
+ { y: 16, blur: 32, alpha: 0.35 },
1407
+ { y: 32, blur: 64, alpha: 0.25 }
1408
+ ]
1367
1409
  };
1368
- function calculateRimLightColor(baseColor, level) {
1369
- const rgb = hexToRgb(baseColor);
1370
- if (!rgb) {
1371
- return "rgba(255, 255, 255, 0.5)";
1372
- }
1373
- const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b);
1374
- const isLight = hsv.v > 0.6;
1375
- const isSaturated = hsv.s > 0.3;
1376
- const absLevel = Math.abs(level);
1377
- const opacityBoost = Math.max(0, (absLevel - 1) * 0.05);
1378
- if (isSaturated) {
1379
- const rimLightValue = 0.95;
1380
- const rimLightRgb = hsvToRgb(hsv.h, hsv.s * 0.3, rimLightValue);
1381
- const baseOpacity = isLight ? 0.9 : 0.5;
1382
- const finalOpacity = Math.min(1, baseOpacity + opacityBoost);
1383
- return `rgba(${rimLightRgb.r}, ${rimLightRgb.g}, ${rimLightRgb.b}, ${finalOpacity.toFixed(2)})`;
1384
- } else {
1385
- const baseOpacity = isLight ? 0.9 : 0.12;
1386
- const finalOpacity = Math.min(1, baseOpacity + opacityBoost);
1387
- return `rgba(255, 255, 255, ${finalOpacity.toFixed(2)})`;
1388
- }
1389
- }
1390
- function calculateDarkShadowColors(surfaceColor) {
1391
- const rgb = hexToRgb(surfaceColor);
1392
- if (!rgb) {
1393
- return {
1394
- dark: "rgba(0, 0, 0, 0.3)",
1395
- darker: "rgba(0, 0, 0, 0.4)"
1396
- };
1397
- }
1398
- const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b);
1399
- const isLight = hsv.v > 0.6;
1400
- const isSaturated = hsv.s > 0.3;
1401
- if (isSaturated) {
1402
- const darkShadowValue = 0.15;
1403
- const darkShadowRgb = hsvToRgb(hsv.h, hsv.s, darkShadowValue);
1404
- if (isLight) {
1405
- return {
1406
- dark: `rgba(${darkShadowRgb.r}, ${darkShadowRgb.g}, ${darkShadowRgb.b}, 0.3)`,
1407
- darker: `rgba(${darkShadowRgb.r}, ${darkShadowRgb.g}, ${darkShadowRgb.b}, 0.4)`
1408
- };
1409
- } else {
1410
- return {
1411
- dark: `rgba(${darkShadowRgb.r}, ${darkShadowRgb.g}, ${darkShadowRgb.b}, 0.5)`,
1412
- darker: `rgba(${darkShadowRgb.r}, ${darkShadowRgb.g}, ${darkShadowRgb.b}, 0.6)`
1413
- };
1414
- }
1415
- } else {
1416
- if (isLight) {
1417
- return {
1418
- dark: "rgba(0, 0, 0, 0.2)",
1419
- darker: "rgba(0, 0, 0, 0.3)"
1420
- };
1421
- } else {
1422
- return {
1423
- dark: "rgba(0, 0, 0, 0.5)",
1424
- darker: "rgba(0, 0, 0, 0.6)"
1425
- };
1426
- }
1427
- }
1428
- }
1429
- function getRimLightConfig() {
1430
- return {
1431
- offset: 1,
1432
- // Fixed 1px for crisp rim
1433
- blur: 1
1434
- // Tight blur for crisp edge
1435
- };
1436
- }
1437
- function getElevationConfig(level) {
1438
- return elevationSystem[level];
1410
+ var AMBIENT_ALPHA_SCALE = { dark: 1, light: 0.4 };
1411
+ function ambientLayers(step, mode) {
1412
+ const scale = AMBIENT_ALPHA_SCALE[mode];
1413
+ return AMBIENT[step].map(
1414
+ ({ y, blur, alpha }) => `0 ${y}px ${blur}px rgba(0,0,0,${(alpha * scale).toFixed(2)})`
1415
+ );
1439
1416
  }
1440
- var elevationSurfaceCache = /* @__PURE__ */ new Map();
1441
- var MAX_CACHE_SIZE = 100;
1442
- function getCacheKey(baseColor, level, theme) {
1443
- return `${baseColor}-${level}-${theme}`;
1417
+ function liftShadow(step, mode = "dark", opts = {}) {
1418
+ const rim = opts.rim ?? LIFT_RIM_ALPHA[mode];
1419
+ const layers = ambientLayers(step, mode);
1420
+ if (rim > 0) layers.unshift(`inset 0 1px 0 rgba(255,255,255,${rim.toFixed(2)})`);
1421
+ return layers.join(", ");
1444
1422
  }
1445
- function calculateElevationSurface(baseColor, level, theme) {
1446
- const config = elevationSystem[level];
1447
- if (config.colorAdjustment === 0) {
1448
- return baseColor;
1449
- }
1450
- if (level < 0) {
1451
- return baseColor;
1452
- }
1453
- return lighten(baseColor, config.colorAdjustment);
1423
+ function liftStyle(step, mode = "dark", opts = {}) {
1424
+ const deepest = AMBIENT[step][AMBIENT[step].length - 1];
1425
+ return reactNative.Platform.select({
1426
+ web: { boxShadow: liftShadow(step, mode, opts) },
1427
+ default: {
1428
+ shadowColor: "#000",
1429
+ shadowOffset: { width: 0, height: Math.round(deepest.y / 2) },
1430
+ shadowOpacity: deepest.alpha * AMBIENT_ALPHA_SCALE[mode],
1431
+ shadowRadius: deepest.blur / 2,
1432
+ elevation: step
1433
+ }
1434
+ });
1454
1435
  }
1455
- function getElevationSurface(baseColor, level, theme) {
1456
- const cacheKey = getCacheKey(baseColor, level, theme);
1457
- if (elevationSurfaceCache.has(cacheKey)) {
1458
- return elevationSurfaceCache.get(cacheKey);
1459
- }
1460
- const result = calculateElevationSurface(baseColor, level);
1461
- if (elevationSurfaceCache.size >= MAX_CACHE_SIZE) {
1462
- const firstKey = elevationSurfaceCache.keys().next().value;
1463
- elevationSurfaceCache.delete(firstKey);
1464
- }
1465
- elevationSurfaceCache.set(cacheKey, result);
1466
- return result;
1436
+
1437
+ // src/theme/surface-planes.ts
1438
+ var SURFACE_LEVEL_TOKEN = {
1439
+ frame: "background-frame",
1440
+ background: "background-base",
1441
+ base: "surface-base",
1442
+ elevated: "surface-elevated",
1443
+ raised: "surface-raised",
1444
+ overlay: "surface-overlay"
1445
+ };
1446
+ var PLANE_ORDER = [
1447
+ "frame",
1448
+ "background",
1449
+ "base",
1450
+ "elevated",
1451
+ "raised",
1452
+ "overlay"
1453
+ ];
1454
+ function surfaceBackground(level, mode) {
1455
+ return getSemanticColors(mode)[SURFACE_LEVEL_TOKEN[level]];
1467
1456
  }
1468
- var elevationShadowCache = /* @__PURE__ */ new Map();
1469
- var MAX_SHADOW_CACHE_SIZE = 50;
1470
- function getShadowCacheKey(baseColor, level, theme, isHovered) {
1471
- return `${baseColor}-${level}-${theme}-${isHovered}`;
1457
+ function stepPlane(from, delta) {
1458
+ const index = PLANE_ORDER.indexOf(from);
1459
+ const clamped = Math.min(PLANE_ORDER.length - 1, Math.max(0, index + delta));
1460
+ return PLANE_ORDER[clamped];
1472
1461
  }
1473
- function calculateElevationShadow(baseColor, level, theme, isHovered = false) {
1474
- const config = elevationSystem[level];
1475
- if (level === 0) {
1476
- return {};
1477
- }
1478
- const elevatedSurfaceColor = calculateElevationSurface(baseColor, level);
1479
- const rimLightColor = calculateRimLightColor(baseColor, level);
1480
- const darkShadowColors = calculateDarkShadowColors(elevatedSurfaceColor);
1481
- const intensityConfig = {
1482
- subtle: { offset: 1, blur: 2 },
1483
- medium: { offset: 2, blur: 4 },
1484
- strong: { offset: 2, blur: 5 }
1485
- };
1486
- const { offset, blur } = intensityConfig[config.shadowIntensity];
1487
- const rimConfig = getRimLightConfig();
1488
- if (config.shadowStyle === "pressed") {
1489
- if (isHovered) {
1490
- const hoverOffset = Math.max(1, Math.round(offset / 2));
1491
- const hoverBlur = Math.max(1, Math.round(blur / 2));
1492
- return reactNative.Platform.select({
1493
- web: {
1494
- boxShadow: `inset ${hoverOffset}px ${hoverOffset}px ${hoverBlur}px ${darkShadowColors.darker}, inset -${rimConfig.offset}px -${rimConfig.offset}px ${rimConfig.blur}px ${rimLightColor}`
1495
- },
1496
- default: {
1497
- shadowOpacity: 0,
1498
- elevation: 0
1499
- }
1500
- });
1501
- }
1502
- return reactNative.Platform.select({
1503
- web: {
1504
- boxShadow: `inset ${offset}px ${offset}px ${blur}px ${darkShadowColors.darker}, inset -${rimConfig.offset}px -${rimConfig.offset}px ${rimConfig.blur}px ${rimLightColor}`
1505
- },
1506
- default: {
1507
- shadowOpacity: 0,
1508
- elevation: 0
1509
- }
1510
- });
1511
- } else {
1512
- if (isHovered) {
1513
- const hoverOffset = Math.max(1, Math.round(offset / 2));
1514
- const hoverBlur = Math.max(1, Math.round(blur / 2));
1515
- return reactNative.Platform.select({
1516
- web: {
1517
- boxShadow: `${hoverOffset}px ${hoverOffset}px ${hoverBlur}px ${darkShadowColors.dark}, -${rimConfig.offset}px -${rimConfig.offset}px ${rimConfig.blur}px ${rimLightColor}`
1518
- },
1519
- default: {
1520
- shadowColor: "#000",
1521
- shadowOffset: { width: hoverOffset, height: hoverOffset },
1522
- shadowOpacity: 0.2,
1523
- shadowRadius: hoverBlur / 2,
1524
- elevation: hoverOffset
1525
- }
1526
- });
1527
- }
1528
- return reactNative.Platform.select({
1529
- web: {
1530
- boxShadow: `${offset}px ${offset}px ${blur}px ${darkShadowColors.dark}, -${rimConfig.offset}px -${rimConfig.offset}px ${rimConfig.blur}px ${rimLightColor}`
1531
- },
1532
- default: {
1533
- shadowColor: "#000",
1534
- shadowOffset: { width: offset, height: offset },
1535
- shadowOpacity: 0.3,
1536
- shadowRadius: blur / 2,
1537
- elevation: offset
1538
- }
1539
- });
1540
- }
1462
+ function pressedLevel(parent) {
1463
+ return stepPlane(parent, -1);
1541
1464
  }
1542
- var FLOATING_ELEVATION_MIN = 4;
1543
- function getElevationShadow(baseColor, level, theme, isHovered = false) {
1544
- const cacheKey = getShadowCacheKey(baseColor, level, theme, isHovered);
1545
- if (elevationShadowCache.has(cacheKey)) {
1546
- return elevationShadowCache.get(cacheKey);
1547
- }
1548
- const result = level > 0 && level < FLOATING_ELEVATION_MIN ? {} : calculateElevationShadow(baseColor, level, theme, isHovered);
1549
- if (elevationShadowCache.size >= MAX_SHADOW_CACHE_SIZE) {
1550
- const firstKey = elevationShadowCache.keys().next().value;
1551
- elevationShadowCache.delete(firstKey);
1552
- }
1553
- elevationShadowCache.set(cacheKey, result);
1554
- return result;
1465
+ function raisedLevel(parent, steps) {
1466
+ return stepPlane(parent, Math.max(0, steps));
1555
1467
  }
1468
+
1469
+ // src/theme/elevation.ts
1470
+ var ELEVATION_PLANE = {
1471
+ [-2]: "frame",
1472
+ [-1]: "background",
1473
+ [0]: "base",
1474
+ [1]: "elevated",
1475
+ [2]: "raised",
1476
+ [3]: "overlay",
1477
+ [4]: "overlay",
1478
+ [5]: "overlay"
1479
+ };
1480
+ var FLOATING_ELEVATION_MIN = FLOATING_LIFT_MIN;
1556
1481
  var PRESSED_ELEVATION_LEVEL = -1;
1557
- function getPressedRecessShadow(fillColor, theme) {
1558
- return getElevationShadow(fillColor, PRESSED_ELEVATION_LEVEL, theme);
1482
+ function elevationPlane(level) {
1483
+ return ELEVATION_PLANE[level];
1559
1484
  }
1560
- function getBaseSurfaceColor(theme) {
1561
- return theme === "light" ? semanticColorsLight["surface-raised"] : semanticColorsDark["surface-elevated"];
1485
+ function getElevationSurface(level, mode = "dark") {
1486
+ return surfaceBackground(ELEVATION_PLANE[level], mode);
1562
1487
  }
1563
- var componentElevationRanges = {
1564
- button: {
1565
- allowed: [2],
1566
- default: 2,
1567
- hover: 3
1568
- },
1569
- card: {
1570
- allowed: [1, 2, 3],
1571
- default: 2,
1572
- hover: 3
1573
- },
1574
- input: {
1575
- allowed: [-2, -1, 0],
1576
- default: -1
1577
- },
1578
- overlay: {
1579
- allowed: [4, 5],
1580
- default: 4
1581
- }
1582
- };
1583
- function getValidatedElevation(component, requested) {
1584
- const range = componentElevationRanges[component];
1585
- if (range.allowed.includes(requested)) {
1586
- return requested;
1587
- }
1588
- const sorted = [...range.allowed].sort((a, b) => a - b);
1589
- if (requested < sorted[0]) return sorted[0];
1590
- if (requested > sorted[sorted.length - 1]) return sorted[sorted.length - 1];
1591
- return sorted.reduce(
1592
- (prev, curr) => Math.abs(curr - requested) < Math.abs(prev - requested) ? curr : prev
1593
- );
1488
+ function getPressedRecessShadow(fillColor, _mode = "dark") {
1489
+ const { boxShadow } = insetWell(fillColor);
1490
+ return reactNative.Platform.select({
1491
+ web: { boxShadow },
1492
+ default: {}
1493
+ });
1494
+ }
1495
+ function getElevationShadow(level, mode = "dark", opts = {}) {
1496
+ if (level < 0) return getPressedRecessShadow(getElevationSurface(level, mode), mode);
1497
+ if (level === 0) return {};
1498
+ return liftStyle(level, mode, opts);
1594
1499
  }
1595
1500
  var glowConfig = {
1501
+ tight: { blur: 4, spread: 0, opacity: 0.4 },
1596
1502
  subtle: { blur: 12, spread: 0, opacity: 0.25 },
1597
1503
  medium: { blur: 20, spread: 2, opacity: 0.4 },
1598
1504
  strong: { blur: 30, spread: 4, opacity: 0.55 }
@@ -1839,7 +1745,7 @@ var audiobookPreset = {
1839
1745
  "interactive-focus": "rgba(255, 255, 255, 0.12)",
1840
1746
  "interactive-active": "rgba(255, 255, 255, 0.16)",
1841
1747
  "interactive-selected": "rgba(255, 255, 255, 0.08)",
1842
- "divider": "rgba(255, 255, 255, 0.06)",
1748
+ divider: "rgba(255, 255, 255, 0.06)",
1843
1749
  // Glow RGB values for shadow utilities
1844
1750
  "brand-primary-rgb": "212, 120, 42",
1845
1751
  "brand-secondary-rgb": "58, 155, 138",
@@ -1888,27 +1794,31 @@ function ThemeProvider({
1888
1794
  }
1889
1795
 
1890
1796
  exports.CATEGORICAL_CVD_SAFE_MAX = CATEGORICAL_CVD_SAFE_MAX;
1797
+ exports.ELEVATION_PLANE = ELEVATION_PLANE;
1891
1798
  exports.FLOATING_ELEVATION_MIN = FLOATING_ELEVATION_MIN;
1799
+ exports.FLOATING_LIFT_MIN = FLOATING_LIFT_MIN;
1800
+ exports.LIFT_RIM_ALPHA = LIFT_RIM_ALPHA;
1801
+ exports.PLANE_ORDER = PLANE_ORDER;
1892
1802
  exports.PRESSED_ELEVATION_LEVEL = PRESSED_ELEVATION_LEVEL;
1803
+ exports.SURFACE_LEVEL_TOKEN = SURFACE_LEVEL_TOKEN;
1893
1804
  exports.SURFACE_PLANE_STEPS = SURFACE_PLANE_STEPS;
1894
1805
  exports.ThemeProvider = ThemeProvider;
1806
+ exports.alertRedVivid = alertRedVivid;
1895
1807
  exports.applyThemePreset = applyThemePreset;
1896
1808
  exports.audiobookPreset = audiobookPreset;
1897
1809
  exports.barPaper = barPaper;
1898
1810
  exports.bestTextColor = bestTextColor;
1899
1811
  exports.buttonSizes = buttonSizes;
1900
1812
  exports.categoricalPalette = categoricalPalette;
1901
- exports.componentElevationRanges = componentElevationRanges;
1902
1813
  exports.darkThemeCSSVars = darkThemeCSSVars;
1903
1814
  exports.darken = darken;
1815
+ exports.debossLabel = debossLabel;
1904
1816
  exports.defaultPreset = defaultPreset;
1905
1817
  exports.discreteRainbow = discreteRainbow;
1906
1818
  exports.divergingScale = divergingScale;
1907
- exports.elevationSystem = elevationSystem;
1908
- exports.getBaseSurfaceColor = getBaseSurfaceColor;
1819
+ exports.elevationPlane = elevationPlane;
1909
1820
  exports.getCategoricalColor = getCategoricalColor;
1910
1821
  exports.getDiscreteRainbowColor = getDiscreteRainbowColor;
1911
- exports.getElevationConfig = getElevationConfig;
1912
1822
  exports.getElevationShadow = getElevationShadow;
1913
1823
  exports.getElevationSurface = getElevationSurface;
1914
1824
  exports.getGlowShadow = getGlowShadow;
@@ -1916,7 +1826,6 @@ exports.getHoverColors = getHoverColors;
1916
1826
  exports.getPressedRecessShadow = getPressedRecessShadow;
1917
1827
  exports.getSemanticColors = getSemanticColors;
1918
1828
  exports.getThemeCSSVars = getThemeCSSVars;
1919
- exports.getValidatedElevation = getValidatedElevation;
1920
1829
  exports.gluestackConfig = gluestackConfig;
1921
1830
  exports.grainForTone = grainForTone;
1922
1831
  exports.grainOpacityForTone = grainOpacityForTone;
@@ -1926,10 +1835,14 @@ exports.hsvToRgb = hsvToRgb;
1926
1835
  exports.insetWell = insetWell;
1927
1836
  exports.isCssPropertyManifest = isCssPropertyManifest;
1928
1837
  exports.isDark = isDark;
1838
+ exports.liftShadow = liftShadow;
1839
+ exports.liftStyle = liftStyle;
1929
1840
  exports.lightThemeCSSVars = lightThemeCSSVars;
1930
1841
  exports.lighten = lighten;
1931
1842
  exports.linearGradient = linearGradient;
1932
1843
  exports.paperSheet = paperSheet;
1844
+ exports.postIt = postIt;
1845
+ exports.pressedLevel = pressedLevel;
1933
1846
  exports.primitiveBorderRadius = primitiveBorderRadius;
1934
1847
  exports.primitiveBreakpoints = primitiveBreakpoints;
1935
1848
  exports.primitiveColors = primitiveColors;
@@ -1937,6 +1850,7 @@ exports.primitiveRamps = primitiveRamps;
1937
1850
  exports.primitiveSpacing = primitiveSpacing;
1938
1851
  exports.primitiveTypography = primitiveTypography;
1939
1852
  exports.primitiveZIndex = primitiveZIndex;
1853
+ exports.raisedLevel = raisedLevel;
1940
1854
  exports.resolveColor = resolveColor;
1941
1855
  exports.rgbToHex = rgbToHex;
1942
1856
  exports.rgbToHsv = rgbToHsv;
@@ -1944,6 +1858,7 @@ exports.semanticColorsDark = semanticColorsDark;
1944
1858
  exports.semanticColorsLight = semanticColorsLight;
1945
1859
  exports.semanticTypography = semanticTypography;
1946
1860
  exports.sequentialEffort = sequentialEffort;
1861
+ exports.surfaceBackground = surfaceBackground;
1947
1862
  exports.surfaceGradient = surfaceGradient;
1948
1863
  exports.validateCssPropertyManifest = validateCssPropertyManifest;
1949
1864
  //# sourceMappingURL=index.js.map