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