@titan-design/react-ui 0.11.0 → 0.12.1

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 (152) hide show
  1. package/dist/bodymap.js +173 -343
  2. package/dist/bodymap.js.map +1 -1
  3. package/dist/bodymap.mjs +173 -343
  4. package/dist/bodymap.mjs.map +1 -1
  5. package/dist/index.d.mts +27 -22
  6. package/dist/index.d.ts +27 -22
  7. package/dist/index.js +366 -561
  8. package/dist/index.js.map +1 -1
  9. package/dist/index.mjs +360 -553
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/pages.js +242 -407
  12. package/dist/pages.js.map +1 -1
  13. package/dist/pages.mjs +242 -407
  14. package/dist/pages.mjs.map +1 -1
  15. package/dist/theme/index.d.mts +250 -1157
  16. package/dist/theme/index.d.ts +250 -1157
  17. package/dist/theme/index.js +234 -408
  18. package/dist/theme/index.js.map +1 -1
  19. package/dist/theme/index.mjs +227 -399
  20. package/dist/theme/index.mjs.map +1 -1
  21. package/dist/theme/tokens-css.js +141 -140
  22. package/dist/theme/tokens-css.js.map +1 -1
  23. package/dist/theme/tokens-css.mjs +141 -140
  24. package/dist/theme/tokens-css.mjs.map +1 -1
  25. package/dist/theme/tokens.d.mts +904 -0
  26. package/dist/theme/tokens.d.ts +904 -0
  27. package/dist/theme/tokens.js +856 -0
  28. package/dist/theme/tokens.js.map +1 -0
  29. package/dist/theme/tokens.mjs +833 -0
  30. package/dist/theme/tokens.mjs.map +1 -0
  31. package/package.json +7 -1
  32. package/src/arch/Architecture.stories.tsx +9 -9
  33. package/src/components/custom/DateTime/DateTime.stories.tsx +1 -1
  34. package/src/components/custom/Fatigue/DualGhostSpark.stories.tsx +3 -3
  35. package/src/components/custom/Fatigue/FatigueLights.stories.tsx +2 -2
  36. package/src/components/custom/Fatigue/GhostSpark.stories.tsx +3 -3
  37. package/src/components/custom/Fatigue/LiveFatigueCard.tsx +1 -1
  38. package/src/components/custom/Fatigue/LiveFatiguePanel.stories.tsx +2 -2
  39. package/src/components/custom/Fatigue/RomProgressionChart.stories.tsx +2 -2
  40. package/src/components/custom/Fatigue/SilverRedPalette.stories.tsx +4 -4
  41. package/src/components/custom/Fatigue/VelocityHero.stories.tsx +3 -3
  42. package/src/components/custom/Fatigue/VerdictHero.stories.tsx +2 -2
  43. package/src/components/custom/Fatigue/fatigue-tokens.ts +12 -12
  44. package/src/components/custom/Sidebar/Sidebar.tsx +4 -4
  45. package/src/components/custom/Table/Table.tsx +2 -2
  46. package/src/components/custom/Workout/ActiveWorkoutPage.tsx +3 -3
  47. package/src/components/custom/Workout/BaseBadge.test.tsx +6 -1
  48. package/src/components/custom/Workout/BaseBadge.tsx +1 -1
  49. package/src/components/custom/Workout/BodyMap.tsx +2 -2
  50. package/src/components/custom/Workout/BodyMapDetailPanel.tsx +2 -2
  51. package/src/components/custom/Workout/DeviationBar.test.tsx +2 -1
  52. package/src/components/custom/Workout/DeviationBar.tsx +3 -2
  53. package/src/components/custom/Workout/ExerciseCard.test.tsx +3 -3
  54. package/src/components/custom/Workout/ExerciseCard.tsx +2 -2
  55. package/src/components/custom/Workout/ExerciseDetailPage.tsx +4 -4
  56. package/src/components/custom/Workout/InputBar.tsx +2 -2
  57. package/src/components/custom/Workout/LiveAuraFrame.stories.tsx +1 -1
  58. package/src/components/custom/Workout/LiveAuraFrame.test.tsx +1 -1
  59. package/src/components/custom/Workout/LiveAuraFrame.tsx +3 -3
  60. package/src/components/custom/Workout/MesoCard.tsx +3 -1
  61. package/src/components/custom/Workout/MuscleGroupChip.tsx +4 -3
  62. package/src/components/custom/Workout/PrHistoryModal.tsx +2 -2
  63. package/src/components/custom/Workout/ProgramPlanningPage.tsx +1 -1
  64. package/src/components/custom/Workout/README.md +1 -1
  65. package/src/components/custom/Workout/ReadinessCheck.tsx +2 -2
  66. package/src/components/custom/Workout/RestTimer.tsx +2 -2
  67. package/src/components/custom/Workout/S3SetTypes.stories.tsx +3 -3
  68. package/src/components/custom/Workout/SessionHeader.stories.tsx +2 -2
  69. package/src/components/custom/Workout/SessionHeader.tsx +1 -1
  70. package/src/components/custom/Workout/SessionRail.stories.tsx +2 -2
  71. package/src/components/custom/Workout/SessionRail.tsx +13 -5
  72. package/src/components/custom/Workout/SetBar.tsx +3 -3
  73. package/src/components/custom/Workout/SetRow.test.tsx +6 -3
  74. package/src/components/custom/Workout/StatusDot.tsx +5 -4
  75. package/src/components/custom/Workout/StrengthTrendChart.tsx +1 -1
  76. package/src/components/custom/Workout/TrainingStatusPage.tsx +2 -2
  77. package/src/components/custom/Workout/VelocityStrip.test.tsx +5 -2
  78. package/src/components/custom/Workout/VelocityStrip.tsx +4 -4
  79. package/src/components/custom/Workout/VolumeLandmarkBar.tsx +3 -3
  80. package/src/components/custom/Workout/WeightBadge.test.tsx +6 -1
  81. package/src/components/custom/Workout/WeightBadge.tsx +2 -1
  82. package/src/components/custom/Workout/WorkoutCard.tsx +3 -1
  83. package/src/components/custom/Workout/WorkoutPill.tsx +5 -2
  84. package/src/components/custom/Workout/ZoneTrack.tsx +4 -4
  85. package/src/components/custom/Workout/setHeadingKit.tsx +14 -8
  86. package/src/components/custom/Workout/velocity-story-kit.tsx +2 -2
  87. package/src/components/custom/charts/SetBarChart.tsx +3 -3
  88. package/src/components/custom/stepper/Stepper.stories.tsx +1 -1
  89. package/src/components/custom/stepper/Stepper.tsx +3 -3
  90. package/src/components/shell/DeviceMenu.tsx +2 -2
  91. package/src/components/shell/README.md +1 -1
  92. package/src/components/shell/SessionRailSpecimen.stories.tsx +1 -1
  93. package/src/components/shell/SideNav.tsx +1 -1
  94. package/src/components/shell/TopBar.tsx +1 -1
  95. package/src/components/ui/autocomplete/Autocomplete.stories.tsx +1 -1
  96. package/src/components/ui/autocomplete/Autocomplete.tsx +1 -1
  97. package/src/components/ui/avatar/Avatar.tsx +2 -2
  98. package/src/components/ui/badge/Badge.tsx +2 -2
  99. package/src/components/ui/card/Card.tsx +3 -3
  100. package/src/components/ui/checkbox/Checkbox.tsx +1 -1
  101. package/src/components/ui/collapse/Collapse.tsx +1 -1
  102. package/src/components/ui/data-row/DataRow.stories.tsx +1 -1
  103. package/src/components/ui/drawer/Drawer.tsx +3 -3
  104. package/src/components/ui/form-field/FormField.tsx +1 -1
  105. package/src/components/ui/help-tip/HelpTip.tsx +1 -1
  106. package/src/components/ui/menu/Menu.tsx +2 -2
  107. package/src/components/ui/pill/Pill.tsx +2 -2
  108. package/src/components/ui/popover/Popover.stories.tsx +2 -2
  109. package/src/components/ui/popover/Popover.tsx +1 -1
  110. package/src/components/ui/progress/Progress.tsx +3 -3
  111. package/src/components/ui/radio/Radio.stories.tsx +1 -1
  112. package/src/components/ui/radio/Radio.tsx +4 -4
  113. package/src/components/ui/select/Select.tsx +3 -3
  114. package/src/components/ui/surface/Surface.stories.tsx +3 -3
  115. package/src/components/ui/surface/Surface.test.tsx +32 -19
  116. package/src/components/ui/surface/Surface.tsx +3 -3
  117. package/src/components/ui/surface/SurfaceContext.ts +19 -29
  118. package/src/components/ui/surface/surface.contract.test.ts +58 -45
  119. package/src/components/ui/switch/Switch.tsx +1 -1
  120. package/src/components/ui/tabs/Tabs.tsx +2 -2
  121. package/src/components/ui/toolbar-button/ToolbarButton.stories.tsx +5 -5
  122. package/src/components/ui/toolbar-button/ToolbarButton.test.tsx +1 -1
  123. package/src/components/ui/toolbar-button/ToolbarButton.tsx +36 -22
  124. package/src/stories/PresetShowcase.stories.tsx +21 -21
  125. package/src/theme/ColorPalettes.stories.tsx +41 -38
  126. package/src/theme/ColorPrimitives.stories.tsx +89 -41
  127. package/src/theme/Depth.stories.tsx +312 -0
  128. package/src/theme/DepthCalibration.stories.tsx +655 -0
  129. package/src/theme/ThemeProvider.tsx +1 -1
  130. package/src/theme/barrel.ts +7 -14
  131. package/src/theme/color-stories.coverage.test.ts +15 -20
  132. package/src/theme/color-story-kit.tsx +1 -1
  133. package/src/theme/color-utils.ts +197 -0
  134. package/src/theme/config.ts +0 -8
  135. package/src/theme/depth-calibration.test.tsx +97 -0
  136. package/src/theme/elevation.test.ts +62 -1
  137. package/src/theme/elevation.ts +34 -8
  138. package/src/theme/global.css +47 -53
  139. package/src/theme/grey-ramp.test.ts +166 -0
  140. package/src/theme/materials.test.ts +106 -0
  141. package/src/theme/materials.ts +211 -0
  142. package/src/theme/presets/audiobook.ts +4 -4
  143. package/src/theme/presets/types.ts +3 -3
  144. package/src/theme/semantic-contrast.test.ts +83 -0
  145. package/src/theme/token-export-guard.test.ts +104 -0
  146. package/src/theme/tokens/primitives.ts +63 -116
  147. package/src/theme/tokens/semantic.ts +130 -82
  148. package/src/utils/colors.ts +1 -1
  149. package/tailwind.config.js +2 -5
  150. package/src/theme/bar-paper.ts +0 -59
  151. package/src/theme/shadows.stories.tsx +0 -523
  152. package/src/theme/shadows.ts +0 -439
package/dist/index.mjs CHANGED
@@ -261,93 +261,50 @@ function AlertDescription({ children, className }) {
261
261
 
262
262
  // src/theme/tokens/primitives.ts
263
263
  var primitiveColors = {
264
- // Blue scale
265
- blue: {
266
- 50: "#EFF6FF",
267
- 100: "#DBEAFE",
268
- 200: "#BFDBFE",
269
- 300: "#93C5FD",
270
- 400: "#60A5FA",
271
- 500: "#3B82F6",
272
- 600: "#5048E5",
273
- 700: "#3832A0",
274
- 800: "#1E40AF",
275
- 900: "#1E3A8A"
276
- },
277
- // Red scale
278
- red: {
279
- 50: "#FEF2F2",
280
- 100: "#FEE2E2",
281
- 200: "#FECACA",
282
- 300: "#FCA5A5",
283
- 400: "#DA6868",
284
- 500: "#EF4444",
285
- 600: "#D14343",
286
- 700: "#922E2E",
287
- 800: "#991B1B",
288
- 900: "#7F1D1D"
289
- },
290
- // Vivid red scale
291
- redVivid: {
292
- 50: "#FFECEE",
293
- 100: "#FFD6DB",
294
- 200: "#FFB3BC",
295
- 300: "#FF8593",
296
- 400: "#FF6070",
297
- 500: "#FF4757",
298
- 600: "#E63548",
299
- 700: "#C42539",
300
- 800: "#9E1C2C",
301
- 900: "#7A1520"
302
- },
303
- // Neutral/Gray scale
304
- neutral: {
305
- 50: "#FAFAFA",
306
- 100: "#F3F4F6",
307
- 200: "#E5E7EB",
308
- 300: "#D1D5DB",
309
- 400: "#9CA3AF",
310
- 500: "#6B7280",
311
- 600: "#4B5563",
312
- 700: "#374151",
313
- 800: "#1F2937",
314
- 900: "#111827",
315
- 950: "#030712"
316
- },
317
- // Charcoal scale (dark backgrounds)
318
- charcoal: {
319
- 0: "#6E6E6E",
320
- 50: "#5D5D5D",
321
- 100: "#4C4C4C",
322
- 200: "#3C3C3C",
323
- 300: "#2C2C2C",
324
- 400: "#1F1F1F",
325
- 500: "#1C1C1C",
326
- 600: "#191919",
327
- 700: "#161616",
328
- 800: "#131313",
329
- 900: "#101010"
330
- },
331
- // Pure colors
332
264
  white: "#FFFFFF",
333
265
  black: "#000000",
334
266
  transparent: "transparent"
335
267
  };
336
- var surfaceRampDark = {
337
- inset: "#13100D",
338
- // L*4.5 — sub-shell well / pressed
339
- background: "#1C1916",
340
- // L*9 — shell / frame
341
- base: "#252321",
342
- // L*13.5 main content plane
343
- elevated: "#2C2A28",
344
- // L*17 — nav / rail
345
- raised: "#31302F",
346
- // L*20 — cards
347
- overlay: "#373635"
348
- // L*22.5 — hero / popover
349
- };
350
- var backgroundFrameDark = "#100D0A";
268
+ var greyRamp = {
269
+ 50: "#F9F6F3",
270
+ // L*97.0 W6
271
+ 100: "#EDEAE7",
272
+ // L*92.8 W6
273
+ 200: "#D4D1CE",
274
+ // L*84.0 W6 warm silver
275
+ 300: "#BDBAB7",
276
+ // L*75.7 W6
277
+ 400: "#A29F9D",
278
+ // L*65.7 W5
279
+ 500: "#888684",
280
+ // L*56.0 W4
281
+ 600: "#72716F",
282
+ // L*47.7 W3
283
+ 700: "#5A5958",
284
+ // L*37.9 W2
285
+ 800: "#424140",
286
+ // L*27.6 W2 — generated bridge
287
+ 850: "#373635",
288
+ // L*22.7 W2 — surface overlay
289
+ 875: "#31302F",
290
+ // L*19.9 W2 — surface raised
291
+ 900: "#2C2A28",
292
+ // L*17.2 W4 — surface elevated
293
+ 925: "#252321",
294
+ // L*13.9 W4 — surface base
295
+ 950: "#1C1916",
296
+ // L*9.0 W6 — background base / shell
297
+ 975: "#100D0A"
298
+ // L*3.8 W6 — background frame / bezel
299
+ };
300
+ var SURFACE_PLANE_STEPS = {
301
+ frame: 975,
302
+ background: 950,
303
+ base: 925,
304
+ elevated: 900,
305
+ raised: 875,
306
+ overlay: 850
307
+ };
351
308
  var primitiveRamps = {
352
309
  red: {
353
310
  50: "#FFF4F4",
@@ -498,8 +455,8 @@ var sequentialEffort = [
498
455
  ];
499
456
  function bestTextColor(hex) {
500
457
  const [r, g, b] = [0, 2, 4].map((i) => {
501
- const c = parseInt(hex.replace("#", "").slice(i, i + 2), 16) / 255;
502
- return c >= 0.04045 ? ((c + 0.055) / 1.055) ** 2.4 : c / 12.92;
458
+ const c2 = parseInt(hex.replace("#", "").slice(i, i + 2), 16) / 255;
459
+ return c2 >= 0.04045 ? ((c2 + 0.055) / 1.055) ** 2.4 : c2 / 12.92;
503
460
  });
504
461
  const l = 0.2126 * r + 0.7152 * g + 0.0722 * b;
505
462
  return (l + 0.05) / 0.05 >= 1.05 / (l + 0.05) ? "#000000" : "#FFFFFF";
@@ -675,16 +632,6 @@ var primitiveBorderRadius = {
675
632
  "2xl": "24px",
676
633
  full: "9999px"
677
634
  };
678
- var primitiveShadows = {
679
- none: "none",
680
- sm: "0px 1px 2px rgba(100, 116, 139, 0.12)",
681
- DEFAULT: "0px 1px 3px rgba(100, 116, 139, 0.12), 0px 1px 2px rgba(100, 116, 139, 0.24)",
682
- md: "0px 4px 6px rgba(100, 116, 139, 0.12)",
683
- lg: "0px 10px 15px rgba(100, 116, 139, 0.12)",
684
- xl: "0px 20px 25px rgba(100, 116, 139, 0.12)",
685
- "2xl": "0px 25px 50px rgba(100, 116, 139, 0.25)",
686
- inner: "inset 0 2px 4px 0 rgba(0, 0, 0, 0.06)"
687
- };
688
635
  var primitiveBreakpoints = {
689
636
  xs: 0,
690
637
  sm: 600,
@@ -740,10 +687,10 @@ var semanticColorsLight = {
740
687
  "status-error-light": primitiveRamps.red[500],
741
688
  "status-error-dark": primitiveRamps.red[700],
742
689
  "status-error-subtle": primitiveRamps.red[50],
743
- "status-error-vivid": primitiveColors.redVivid[500],
690
+ "status-error-vivid": primitiveRamps.red[600],
744
691
  // vivid alert red
745
- "status-error-vivid-light": primitiveColors.redVivid[400],
746
- "status-error-vivid-dark": primitiveColors.redVivid[700],
692
+ "status-error-vivid-light": primitiveRamps.red[500],
693
+ "status-error-vivid-dark": primitiveRamps.red[700],
747
694
  "status-error-vivid-subtle": "rgba(255, 71, 87, 0.12)",
748
695
  "status-warning": primitiveRamps.amber[300],
749
696
  "status-warning-light": primitiveRamps.amber[200],
@@ -770,7 +717,7 @@ var semanticColorsLight = {
770
717
  "result-inconclusive": "#9E9A97",
771
718
  // Gray - no clear result
772
719
  "result-inconclusive-light": "rgba(158, 154, 151, 0.12)",
773
- "result-neutral": primitiveColors.neutral[500],
720
+ "result-neutral": greyRamp[600],
774
721
  // Neutral baseline
775
722
  // Text on result backgrounds (on-result-*)
776
723
  "on-result-improve": primitiveColors.white,
@@ -801,47 +748,38 @@ var semanticColorsLight = {
801
748
  // Text colors (text-*)
802
749
  "text-primary": "#121828",
803
750
  "text-secondary": "#65748B",
804
- "text-tertiary": primitiveColors.neutral[400],
751
+ "text-tertiary": greyRamp[400],
805
752
  "text-disabled": "rgba(55, 65, 81, 0.48)",
806
753
  "text-inverse": primitiveColors.white,
807
- "text-link": primitiveColors.blue[600],
808
- "text-link-hover": primitiveColors.blue[700],
754
+ "text-link": primitiveRamps.blue[600],
755
+ "text-link-hover": primitiveRamps.blue[700],
809
756
  // Surface colors (surface-*) - for elevated containers
810
757
  "surface-base": primitiveColors.white,
811
- "surface-elevated": primitiveColors.neutral[50],
758
+ "surface-elevated": greyRamp[50],
812
759
  // slightly off-white for elevated cards
813
- "surface-raised": primitiveColors.neutral[100],
760
+ "surface-raised": greyRamp[100],
814
761
  // light gray for raised cards
815
762
  "surface-overlay": primitiveColors.white,
816
- "surface-input": primitiveColors.neutral[50],
763
+ "surface-input": greyRamp[50],
817
764
  // Input field background (filled variant)
818
- // Deepest pressed pit (TD-surface-tokens, S-3) — light-mode counterpart of
819
- // the dark ramp's `inset` plane; a placeholder pairing, not part of the
820
- // dark-ramp investigation (surface.contract.test.ts is dark-mode only).
821
- "surface-inset": primitiveColors.neutral[300],
822
765
  // Background colors (background-*)
823
766
  "background-base": "#EBEBEB",
824
767
  "background-default": primitiveColors.white,
825
- "background-subtle": primitiveColors.neutral[50],
826
- // Frame/bezel chrome (TD-surface-tokens, S-3) — top bar + side nav shell,
827
- // one step below `background-base` (darker still than `surface-inset`
828
- // above, mirroring the dark-mode ordering). Placeholder pairing for light
829
- // mode (see dark-mode note on `surface-inset` above).
830
- "background-frame": primitiveColors.neutral[400],
768
+ "background-subtle": greyRamp[50],
769
+ // Frame/bezel chrome — top bar + side nav shell, one step below
770
+ // `background-base`. Placeholder pairing for light mode, which is deferred.
771
+ "background-frame": greyRamp[400],
831
772
  // Border colors (border-*)
832
- "border-default": "#E8E9EB",
833
- "border-subtle": primitiveColors.neutral[100],
834
- "border-strong": primitiveColors.neutral[300],
835
- "border-prominent": primitiveColors.neutral[400],
773
+ "border-prominent": greyRamp[400],
836
774
  // high-visibility divider
837
- "border-focus": primitiveColors.blue[600],
838
- "border-input": primitiveColors.neutral[300],
775
+ "border-focus": primitiveRamps.blue[600],
776
+ "border-input": greyRamp[200],
839
777
  // Input field border
840
- "border-input-hover": primitiveColors.neutral[400],
778
+ "border-input-hover": greyRamp[400],
841
779
  // Input field border on hover
842
- "border-input-focus": primitiveColors.blue[600],
780
+ "border-input-focus": primitiveRamps.blue[600],
843
781
  // Input field border on focus
844
- "border-input-error": primitiveColors.red[600],
782
+ "border-input-error": primitiveRamps.red[600],
845
783
  // Input field border on error
846
784
  // Alpha hairline separators (surface-independent — composite toward black on
847
785
  // light surfaces, mirroring the dark-mode white-alpha family). See §4/S-2.
@@ -858,7 +796,7 @@ var semanticColorsLight = {
858
796
  // Divider
859
797
  "divider": "#E8E9EB",
860
798
  // Avatar default
861
- "avatar-background": primitiveColors.neutral[500],
799
+ "avatar-background": greyRamp[600],
862
800
  "avatar-text": primitiveColors.white
863
801
  };
864
802
  var semanticColorsDark = {
@@ -890,9 +828,9 @@ var semanticColorsDark = {
890
828
  "status-error-light": primitiveRamps.red[500],
891
829
  "status-error-dark": primitiveRamps.red[700],
892
830
  "status-error-subtle": "rgba(209, 67, 67, 0.12)",
893
- "status-error-vivid": primitiveColors.redVivid[500],
894
- "status-error-vivid-light": primitiveColors.redVivid[400],
895
- "status-error-vivid-dark": primitiveColors.redVivid[700],
831
+ "status-error-vivid": primitiveRamps.red[600],
832
+ "status-error-vivid-light": primitiveRamps.red[500],
833
+ "status-error-vivid-dark": primitiveRamps.red[700],
896
834
  "status-error-vivid-subtle": "rgba(255, 71, 87, 0.12)",
897
835
  "status-warning": primitiveRamps.amber[300],
898
836
  "status-warning-light": primitiveRamps.amber[200],
@@ -916,7 +854,7 @@ var semanticColorsDark = {
916
854
  "result-degrade-dark": "#b30000",
917
855
  "result-inconclusive": "#9E9A97",
918
856
  "result-inconclusive-light": "rgba(158, 154, 151, 0.16)",
919
- "result-neutral": primitiveColors.neutral[400],
857
+ "result-neutral": greyRamp[400],
920
858
  // Text on result backgrounds
921
859
  "on-result-improve": primitiveColors.white,
922
860
  "on-result-degrade": primitiveColors.white,
@@ -933,74 +871,106 @@ var semanticColorsDark = {
933
871
  "data-9": discreteRainbow[3],
934
872
  "data-10": discreteRainbow[22],
935
873
  // Text colors - inverted for dark mode
936
- "text-primary": primitiveColors.neutral[100],
937
- "text-secondary": primitiveColors.neutral[400],
938
- "text-tertiary": primitiveColors.neutral[500],
874
+ "text-primary": greyRamp[50],
875
+ "text-secondary": greyRamp[400],
876
+ // Deliberately ONE step lighter than the L*-nearest match (`greyRamp[600]`).
877
+ // The colour this replaced failed WCAG large-text outright on the three
878
+ // lightest planes — 2.96 / 2.72 / 2.49 against elevated / raised / overlay —
879
+ // and `600` carried that failure forward almost exactly (2.93 / 2.70 / 2.47).
880
+ // `500` clears 3:1 everywhere (3.32–5.34). Contrast beats colour fidelity for
881
+ // text roles; borders and surfaces still use strict L*-nearest. See
882
+ // semantic-contrast.test.ts, which fails if this is moved back down.
883
+ "text-tertiary": greyRamp[500],
939
884
  "text-disabled": "rgba(255, 255, 255, 0.38)",
940
- "text-inverse": primitiveColors.neutral[900],
885
+ "text-inverse": greyRamp[950],
941
886
  "text-link": "#828DF8",
942
- "text-link-hover": primitiveColors.blue[400],
887
+ "text-link-hover": primitiveRamps.blue[400],
943
888
  // Surface colors - dark backgrounds — warm-tapered DERIVED ramp (TD-surface-tokens,
944
889
  // S-1, re-spaced S-3). Shipped verbatim from `deriveSurfaceRamp()` — see
945
890
  // `surfaceRampDark` in primitives.ts for the full derivation note. `surface-overlay`
946
891
  // and `surface-elevated` are distinct (were both #191919 pre-S-1); `surface-input`
947
892
  // tracks one plane above `surface-base`, same relative position as before the remap.
948
893
  // `background-base` backs `Surface level="background"` (SurfaceContext.SURFACE_LEVEL_TOKEN),
949
- // so it takes the ramp's `background` (shell/frame) role, NOT `inset`. The ramp's
950
- // deepest `inset` plane is now promoted to `surface-inset` below (S-3) still no
951
- // `SurfaceLevel` member for it (follow-up, alongside the elevation.ts -1/-2 pressed
952
- // levels — parallel workstream, not this branch).
953
- "surface-base": surfaceRampDark.base,
954
- // main surface (#252321, L*13.5)
955
- "surface-elevated": surfaceRampDark.elevated,
956
- // elevated surface (#2C2A28, L*17 nav/rail)
957
- "surface-raised": surfaceRampDark.raised,
958
- // raised surface (#31302F, L*20 cards)
959
- "surface-overlay": surfaceRampDark.overlay,
960
- // overlay surface (#373635, L*22.5 — hero/popover)
961
- "surface-input": surfaceRampDark.elevated,
894
+ // so it takes the ramp's shell role. The deepest plane is `background-frame`,
895
+ // which is also the `SurfaceLevel` floor a pressed surface clamps at.
896
+ "surface-base": greyRamp[925],
897
+ // main surface (#252321, L*13.9)
898
+ "surface-elevated": greyRamp[900],
899
+ // elevated surface (#2C2A28, L*17.2 — nav/rail)
900
+ "surface-raised": greyRamp[875],
901
+ // raised surface (#31302F, L*19.9 cards)
902
+ "surface-overlay": greyRamp[850],
903
+ // overlay surface (#373635, L*22.7 hero/popover)
904
+ "surface-input": greyRamp[900],
962
905
  // input surface (#2C2A28 — one plane above base)
963
- "surface-inset": surfaceRampDark.inset,
964
- // deepest pressed pit (#13100D, L*4.5 — sub-shell well)
965
906
  // Background colors — same ramp, the frame/shell end of it.
966
- "background-base": surfaceRampDark.background,
967
- // shell / frame (#1C1916, L*9 — Surface level="background")
968
- "background-default": surfaceRampDark.base,
969
- // main background (#252321, L*13.5 — matches surface-base)
970
- "background-subtle": surfaceRampDark.elevated,
971
- // subtle background (#2C2A28, L*17 — matches surface-elevated)
972
- // Frame/bezel chrome (S-3) — the top bar + side nav shell; one step BELOW
973
- // `background-base`, darker even than `surface-inset` it exits the content
974
- // ramp entirely rather than sitting in it. See `backgroundFrameDark` in
975
- // primitives.ts.
976
- "background-frame": backgroundFrameDark,
977
- // frame / bezel (#100D0A, L*3.79)
978
- // Border colors `border-subtle` (#1C1C1C) previously collided with
979
- // `surface-raised` (also #1C1C1C, an invisible border on raised cards). The
980
- // re-spaced ramp above moved `surface-raised` to #2D2C2B, so this value is now
981
- // distinct from every surface hex without needing to change it see
982
- // `surface.contract.test.ts` R2/R4.
983
- "border-default": primitiveColors.charcoal[400],
984
- // default border
985
- "border-subtle": primitiveColors.charcoal[500],
986
- // subtle border
987
- "border-strong": primitiveColors.charcoal[300],
988
- // strong border
989
- "border-prominent": primitiveColors.charcoal[200],
907
+ "background-base": greyRamp[950],
908
+ // shell (#1C1916, L*9 — Surface level="background")
909
+ "background-default": greyRamp[925],
910
+ // main background (#252321, L*13.9 — matches surface-base)
911
+ "background-subtle": greyRamp[900],
912
+ // subtle background (#2C2A28, L*17.2 — matches surface-elevated)
913
+ // Frame/bezel chrome — the top bar + side nav shell, one step BELOW
914
+ // `background-base`. It used to be described as sitting OUTSIDE the ramp; it
915
+ // is simply the ramp's last step now, and the floor `<Surface pressed>` clamps at.
916
+ "background-frame": greyRamp[975],
917
+ // frame / bezel (#100D0A, L*3.8)
918
+ // Border colors — solid dark borders are RETIRED (TD-07.14). Not a preference — a structural
919
+ // consequence of one ramp. Every step from 850 to 975 is now a surface plane,
920
+ // so a solid border dark enough to read as a border necessarily equals some
921
+ // plane's fill, which is exactly the collision `surface.contract.test.ts` R2
922
+ // forbids. The only non-plane steps left in that band are 800 and 700, and
923
+ // borders there jump from L*~10-25 to L*~28-38 — a restyle, not a migration.
924
+ //
925
+ // So separation moves to the alpha hairlines, which dark mode already called
926
+ // "the primary separation cue". Being alpha, they composite against whatever
927
+ // plane they land on and cannot collide with any of them — the problem stops
928
+ // existing rather than being re-solved per plane. The three solid tokens were
929
+ // deleted outright; consumers point at the `hairline-*` family below.
930
+ //
931
+ // `border-prominent` stays SOLID: it is the one border meant to be seen
932
+ // outright (4 call sites, high-visibility dividers), and grey-800 is not a
933
+ // plane, so it keeps its job without collision.
934
+ "border-prominent": greyRamp[800],
990
935
  // high-visibility divider
991
936
  "border-focus": "#828DF8",
992
- "border-input": primitiveColors.neutral[600],
993
- "border-input-hover": primitiveColors.neutral[500],
937
+ "border-input": greyRamp[700],
938
+ "border-input-hover": greyRamp[600],
994
939
  "border-input-focus": "#828DF8",
995
- "border-input-error": primitiveColors.red[500],
940
+ "border-input-error": primitiveRamps.red[500],
996
941
  // Alpha hairline separators — the primary separation cue (§4/S-2). Self-
997
942
  // normalizing: composites toward white by ~the same amount on ANY plane, so
998
943
  // one family works at every elevation instead of per-surface border tokens.
999
944
  // Shadows are demoted to floating-overlay use only (not shipped as a fill
1000
945
  // separator here — see elevation.ts, follow-up S-4).
1001
- "hairline-subtle": "rgba(255, 255, 255, 0.06)",
1002
- "hairline-default": "rgba(255, 255, 255, 0.09)",
1003
- "hairline-strong": "rgba(255, 255, 255, 0.14)",
946
+ //
947
+ // RETUNED on the wall (VW-99, S-6). The original .06/.09/.14 were set at a
948
+ // desk. On the panel at ~3 m `subtle` rendered but was indiscernible, and
949
+ // `default` — the load-bearing one, with no solid-border fallback since
950
+ // TD-07.14 — went weak on the lightest plane. `strong` read cleanly with room
951
+ // to spare, which is what made raising the whole family viable.
952
+ //
953
+ // Each tier steps up onto the next MEASURED-GOOD rung rather than an
954
+ // interpolated one: the new `subtle` is the old `default`, and the new
955
+ // `default` is the old `strong` — a value just confirmed legible on all four
956
+ // planes. Spacing goes 1 : 1.56 : 2.33, against the original 1 : 1.5 : 2.33.
957
+ //
958
+ // RUN 2 (VW-99): all three tiers were seen on all four planes — the retune
959
+ // worked — but `subtle` was still "a bit hard to read", so the whole family
960
+ // took a further +.01. That is a comfort margin on a passing row, not a fix
961
+ // for a failing one, which is why it is a flat offset: the 1 : 1.56 : 2.33
962
+ // spacing that the run validated is preserved rather than re-derived.
963
+ //
964
+ // Keep these to TWO decimals. react-native-web quantises alpha to 8 bits, so
965
+ // a 3-decimal value silently rounds on the way to the DOM (.135 renders as
966
+ // .13) — the token would say one thing and paint another.
967
+ //
968
+ // DARK ONLY. The light family above composites toward BLACK on light planes,
969
+ // which this run says nothing about — do not mirror these numbers into it
970
+ // without its own verification.
971
+ "hairline-subtle": "rgba(255, 255, 255, 0.10)",
972
+ "hairline-default": "rgba(255, 255, 255, 0.15)",
973
+ "hairline-strong": "rgba(255, 255, 255, 0.22)",
1004
974
  // Interactive states
1005
975
  "interactive-hover": "rgba(255, 255, 255, 0.04)",
1006
976
  "interactive-focus": "rgba(255, 255, 255, 0.12)",
@@ -1009,10 +979,9 @@ var semanticColorsDark = {
1009
979
  "interactive-disabled": "rgba(255, 255, 255, 0.12)",
1010
980
  "interactive-disabled-text": "rgba(255, 255, 255, 0.26)",
1011
981
  // Divider
1012
- "divider": primitiveColors.charcoal[400],
1013
- // divider color
982
+ "divider": "rgba(255, 255, 255, 0.09)",
1014
983
  // Avatar default
1015
- "avatar-background": primitiveColors.neutral[600],
984
+ "avatar-background": greyRamp[700],
1016
985
  "avatar-text": primitiveColors.white
1017
986
  };
1018
987
  var semanticTypography = {
@@ -1530,14 +1499,10 @@ var lightThemeCSSVars = {
1530
1499
  "--color-surface-base": semanticColorsLight["surface-base"],
1531
1500
  "--color-surface-elevated": semanticColorsLight["surface-elevated"],
1532
1501
  "--color-surface-raised": semanticColorsLight["surface-raised"],
1533
- "--color-surface-inset": semanticColorsLight["surface-inset"],
1534
1502
  "--color-background-base": semanticColorsLight["background-base"],
1535
1503
  "--color-background-default": semanticColorsLight["background-default"],
1536
1504
  "--color-background-subtle": semanticColorsLight["background-subtle"],
1537
1505
  "--color-background-frame": semanticColorsLight["background-frame"],
1538
- "--color-border-default": semanticColorsLight["border-default"],
1539
- "--color-border-subtle": semanticColorsLight["border-subtle"],
1540
- "--color-border-strong": semanticColorsLight["border-strong"],
1541
1506
  "--color-border-prominent": semanticColorsLight["border-prominent"],
1542
1507
  "--color-border-focus": semanticColorsLight["border-focus"],
1543
1508
  "--color-interactive-hover": semanticColorsLight["interactive-hover"],
@@ -1633,14 +1598,10 @@ var darkThemeCSSVars = {
1633
1598
  "--color-surface-base": semanticColorsDark["surface-base"],
1634
1599
  "--color-surface-elevated": semanticColorsDark["surface-elevated"],
1635
1600
  "--color-surface-raised": semanticColorsDark["surface-raised"],
1636
- "--color-surface-inset": semanticColorsDark["surface-inset"],
1637
1601
  "--color-background-base": semanticColorsDark["background-base"],
1638
1602
  "--color-background-default": semanticColorsDark["background-default"],
1639
1603
  "--color-background-subtle": semanticColorsDark["background-subtle"],
1640
1604
  "--color-background-frame": semanticColorsDark["background-frame"],
1641
- "--color-border-default": semanticColorsDark["border-default"],
1642
- "--color-border-subtle": semanticColorsDark["border-subtle"],
1643
- "--color-border-strong": semanticColorsDark["border-strong"],
1644
1605
  "--color-border-prominent": semanticColorsDark["border-prominent"],
1645
1606
  "--color-border-focus": semanticColorsDark["border-focus"],
1646
1607
  "--color-interactive-hover": semanticColorsDark["interactive-hover"],
@@ -1773,6 +1734,54 @@ var gluestackConfig = {
1773
1734
  rounded: "borderRadius"
1774
1735
  }
1775
1736
  };
1737
+
1738
+ // src/theme/materials.ts
1739
+ var c = getSemanticColors("dark");
1740
+ function parseHex(hex) {
1741
+ const h = hex.replace("#", "");
1742
+ const full = h.length === 3 ? h.split("").map((ch) => ch + ch).join("") : h;
1743
+ const rgb = [
1744
+ parseInt(full.slice(0, 2), 16),
1745
+ parseInt(full.slice(2, 4), 16),
1746
+ parseInt(full.slice(4, 6), 16)
1747
+ ];
1748
+ return rgb.some(Number.isNaN) ? null : rgb;
1749
+ }
1750
+ function perceivedLuminance(hex) {
1751
+ const rgb = parseHex(hex);
1752
+ if (!rgb) return 0.5;
1753
+ const [r, g, b] = rgb;
1754
+ return (0.299 * r + 0.587 * g + 0.114 * b) / 255;
1755
+ }
1756
+ function grainOpacityForTone(baseColor) {
1757
+ return Math.min(0.24, Math.max(0.04, 0.02 + 0.31 * perceivedLuminance(baseColor)));
1758
+ }
1759
+ function grainForTone(baseColor) {
1760
+ const op = grainOpacityForTone(baseColor).toFixed(3);
1761
+ return `url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='120' height='120' filter='url(%23n)' opacity='${op}'/%3E%3C/svg%3E")`;
1762
+ }
1763
+ function paperSheet(tone = c["surface-raised"]) {
1764
+ return {
1765
+ backgroundColor: tone,
1766
+ // Grain alone. The dither went with the gradient it protected — see header.
1767
+ backgroundImage: grainForTone(tone),
1768
+ boxShadow: "inset 0 1px 0 rgba(255,255,255,0.20), 0 8px 22px rgba(0,0,0,0.50)"
1769
+ };
1770
+ }
1771
+ function insetWell(tone = c["surface-input"]) {
1772
+ return {
1773
+ backgroundColor: tone,
1774
+ boxShadow: "inset 0 2px 6px rgba(0,0,0,0.55), inset 0 -1px 0 rgba(255,255,255,0.12)"
1775
+ };
1776
+ }
1777
+ function barPaper(color, flip = false) {
1778
+ return {
1779
+ backgroundImage: grainForTone(color),
1780
+ 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)"
1781
+ };
1782
+ }
1783
+
1784
+ // src/theme/color-utils.ts
1776
1785
  function hexToRgb(hex) {
1777
1786
  const cleaned = hex.replace("#", "");
1778
1787
  let r, g, b;
@@ -1812,32 +1821,32 @@ function rgbToHsv(r, g, b) {
1812
1821
  return { h, s, v };
1813
1822
  }
1814
1823
  function hsvToRgb(h, s, v) {
1815
- const c = v * s;
1816
- const x = c * (1 - Math.abs(h / 60 % 2 - 1));
1817
- const m = v - c;
1824
+ const c2 = v * s;
1825
+ const x = c2 * (1 - Math.abs(h / 60 % 2 - 1));
1826
+ const m = v - c2;
1818
1827
  let rPrime, gPrime, bPrime;
1819
1828
  if (h >= 0 && h < 60) {
1820
- rPrime = c;
1829
+ rPrime = c2;
1821
1830
  gPrime = x;
1822
1831
  bPrime = 0;
1823
1832
  } else if (h >= 60 && h < 120) {
1824
1833
  rPrime = x;
1825
- gPrime = c;
1834
+ gPrime = c2;
1826
1835
  bPrime = 0;
1827
1836
  } else if (h >= 120 && h < 180) {
1828
1837
  rPrime = 0;
1829
- gPrime = c;
1838
+ gPrime = c2;
1830
1839
  bPrime = x;
1831
1840
  } else if (h >= 180 && h < 240) {
1832
1841
  rPrime = 0;
1833
1842
  gPrime = x;
1834
- bPrime = c;
1843
+ bPrime = c2;
1835
1844
  } else if (h >= 240 && h < 300) {
1836
1845
  rPrime = x;
1837
1846
  gPrime = 0;
1838
- bPrime = c;
1847
+ bPrime = c2;
1839
1848
  } else {
1840
- rPrime = c;
1849
+ rPrime = c2;
1841
1850
  gPrime = 0;
1842
1851
  bPrime = x;
1843
1852
  }
@@ -1890,194 +1899,6 @@ function isDark(hex) {
1890
1899
  const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b);
1891
1900
  return hsv.v < 0.6;
1892
1901
  }
1893
- var shadowColors = {
1894
- // For charcoal surfaces (~#2C2C2C to #3C3C3C)
1895
- charcoal: {
1896
- dark: "rgba(0, 0, 0, 0.5)",
1897
- light: "rgba(255, 255, 255, 0.12)",
1898
- // brighter for crisp rim light
1899
- darker: "rgba(0, 0, 0, 0.6)"
1900
- },
1901
- // For neutral dark surfaces (~#1F2937)
1902
- neutralDark: {
1903
- dark: "rgba(0, 0, 0, 0.4)",
1904
- light: "rgba(255, 255, 255, 0.08)",
1905
- darker: "rgba(0, 0, 0, 0.5)"
1906
- },
1907
- // For light surfaces (white/light gray backgrounds)
1908
- neutralLight: {
1909
- dark: "rgba(0, 0, 0, 0.15)",
1910
- // Visible dark shadow for depth on light backgrounds
1911
- light: "rgba(255, 255, 255, 1)",
1912
- // Bright highlight for raised effect (visible on light gray)
1913
- darker: "rgba(0, 0, 0, 0.2)"
1914
- // Deeper shadow for pressed states
1915
- }
1916
- };
1917
- var intensityConfig = {
1918
- subtle: { offset: 1, blur: 2 },
1919
- // very light, barely visible
1920
- medium: { offset: 2, blur: 4 },
1921
- // noticeable but restrained
1922
- strong: { offset: 2, blur: 5 }
1923
- // slightly deeper blur, same offset as medium
1924
- };
1925
- function createRaisedShadow(surface = "charcoal", intensity = "medium") {
1926
- const colors = shadowColors[surface];
1927
- const { offset, blur } = intensityConfig[intensity];
1928
- const rimBlur = 1;
1929
- return Platform.select({
1930
- web: {
1931
- boxShadow: `${offset}px ${offset}px ${blur}px ${colors.dark}, -${offset}px -${offset}px ${rimBlur}px ${colors.light}`
1932
- },
1933
- default: {
1934
- // React Native shadow approximation (limited compared to web)
1935
- shadowColor: "#000",
1936
- shadowOffset: { width: offset, height: offset },
1937
- shadowOpacity: 0.3,
1938
- shadowRadius: blur / 2,
1939
- elevation: offset
1940
- }
1941
- });
1942
- }
1943
- function createPressedShadow(surface = "charcoal", intensity = "medium") {
1944
- const colors = shadowColors[surface];
1945
- const { offset, blur } = intensityConfig[intensity];
1946
- const rimOffset = 1;
1947
- const rimBlur = 1;
1948
- return Platform.select({
1949
- web: {
1950
- boxShadow: `inset ${offset}px ${offset}px ${blur}px ${colors.darker}, inset -${rimOffset}px -${rimOffset}px ${rimBlur}px ${colors.light}`
1951
- },
1952
- default: {
1953
- // React Native doesn't support inset shadows, approximate with darker bg
1954
- shadowOpacity: 0,
1955
- elevation: 0
1956
- }
1957
- });
1958
- }
1959
- function createFlatShadow() {
1960
- return Platform.select({
1961
- web: {
1962
- boxShadow: "none"
1963
- },
1964
- default: {
1965
- shadowOpacity: 0,
1966
- elevation: 0
1967
- }
1968
- });
1969
- }
1970
- function createRaisedHoverShadow(surface = "charcoal", intensity = "medium") {
1971
- const colors = shadowColors[surface];
1972
- const { offset, blur } = intensityConfig[intensity];
1973
- const hoverOffset = Math.max(1, Math.round(offset / 2));
1974
- const hoverBlur = Math.max(1, Math.round(blur / 2));
1975
- const rimBlur = 1;
1976
- return Platform.select({
1977
- web: {
1978
- // Keep same offsets as normal state for rim to prevent "shrinking" effect
1979
- boxShadow: `${hoverOffset}px ${hoverOffset}px ${hoverBlur}px ${colors.dark}, -${offset}px -${offset}px ${rimBlur}px ${colors.light}`
1980
- },
1981
- default: {
1982
- shadowColor: "#000",
1983
- shadowOffset: { width: hoverOffset, height: hoverOffset },
1984
- shadowOpacity: 0.2,
1985
- shadowRadius: hoverBlur / 2,
1986
- elevation: hoverOffset
1987
- }
1988
- });
1989
- }
1990
- function createPressedHoverShadow(surface = "charcoal", intensity = "medium") {
1991
- const colors = shadowColors[surface];
1992
- const { offset, blur } = intensityConfig[intensity];
1993
- const hoverOffset = Math.max(1, Math.round(offset / 2));
1994
- const hoverBlur = Math.max(1, Math.round(blur / 2));
1995
- const rimBlur = 1;
1996
- return Platform.select({
1997
- web: {
1998
- // Keep rim offset at 1px (same as pressed normal) to prevent "shrinking" effect
1999
- boxShadow: `inset ${hoverOffset}px ${hoverOffset}px ${hoverBlur}px ${colors.darker}, inset -1px -1px ${rimBlur}px ${colors.light}`
2000
- },
2001
- default: {
2002
- shadowOpacity: 0,
2003
- elevation: 0
2004
- }
2005
- });
2006
- }
2007
- var neumorphicShadows = {
2008
- // Charcoal surface shadows (for dark toolbars, cards)
2009
- charcoal: {
2010
- raised: {
2011
- subtle: createRaisedShadow("charcoal", "subtle"),
2012
- medium: createRaisedShadow("charcoal", "medium"),
2013
- strong: createRaisedShadow("charcoal", "strong")
2014
- },
2015
- raisedHover: {
2016
- subtle: createRaisedHoverShadow("charcoal", "subtle"),
2017
- medium: createRaisedHoverShadow("charcoal", "medium"),
2018
- strong: createRaisedHoverShadow("charcoal", "strong")
2019
- },
2020
- pressed: {
2021
- subtle: createPressedShadow("charcoal", "subtle"),
2022
- medium: createPressedShadow("charcoal", "medium"),
2023
- strong: createPressedShadow("charcoal", "strong")
2024
- },
2025
- pressedHover: {
2026
- subtle: createPressedHoverShadow("charcoal", "subtle"),
2027
- medium: createPressedHoverShadow("charcoal", "medium"),
2028
- strong: createPressedHoverShadow("charcoal", "strong")
2029
- },
2030
- flat: createFlatShadow()
2031
- },
2032
- // Neutral dark surface shadows
2033
- neutralDark: {
2034
- raised: {
2035
- subtle: createRaisedShadow("neutralDark", "subtle"),
2036
- medium: createRaisedShadow("neutralDark", "medium"),
2037
- strong: createRaisedShadow("neutralDark", "strong")
2038
- },
2039
- raisedHover: {
2040
- subtle: createRaisedHoverShadow("neutralDark", "subtle"),
2041
- medium: createRaisedHoverShadow("neutralDark", "medium"),
2042
- strong: createRaisedHoverShadow("neutralDark", "strong")
2043
- },
2044
- pressed: {
2045
- subtle: createPressedShadow("neutralDark", "subtle"),
2046
- medium: createPressedShadow("neutralDark", "medium"),
2047
- strong: createPressedShadow("neutralDark", "strong")
2048
- },
2049
- pressedHover: {
2050
- subtle: createPressedHoverShadow("neutralDark", "subtle"),
2051
- medium: createPressedHoverShadow("neutralDark", "medium"),
2052
- strong: createPressedHoverShadow("neutralDark", "strong")
2053
- },
2054
- flat: createFlatShadow()
2055
- },
2056
- // Neutral light surface shadows
2057
- neutralLight: {
2058
- raised: {
2059
- subtle: createRaisedShadow("neutralLight", "subtle"),
2060
- medium: createRaisedShadow("neutralLight", "medium"),
2061
- strong: createRaisedShadow("neutralLight", "strong")
2062
- },
2063
- raisedHover: {
2064
- subtle: createRaisedHoverShadow("neutralLight", "subtle"),
2065
- medium: createRaisedHoverShadow("neutralLight", "medium"),
2066
- strong: createRaisedHoverShadow("neutralLight", "strong")
2067
- },
2068
- pressed: {
2069
- subtle: createPressedShadow("neutralLight", "subtle"),
2070
- medium: createPressedShadow("neutralLight", "medium"),
2071
- strong: createPressedShadow("neutralLight", "strong")
2072
- },
2073
- pressedHover: {
2074
- subtle: createPressedHoverShadow("neutralLight", "subtle"),
2075
- medium: createPressedHoverShadow("neutralLight", "medium"),
2076
- strong: createPressedHoverShadow("neutralLight", "strong")
2077
- },
2078
- flat: createFlatShadow()
2079
- }
2080
- };
2081
1902
  var elevationSystem = {
2082
1903
  // Deep inset (recessed input fields, deeply pressed buttons)
2083
1904
  [-2]: {
@@ -2106,7 +1927,13 @@ var elevationSystem = {
2106
1927
  // Level 1: Subtle elevation (outline cards, subtle containers)
2107
1928
  [1]: {
2108
1929
  name: "subtle",
2109
- colorAdjustment: 0.01,
1930
+ // The whole ladder was re-spaced in TD-07.16. It used to run
1931
+ // 0.01/0.02/0.04/0.06/0.08, where the first step was ~2 RGB values — under
1932
+ // the perceptual floor, so level 1 existed in the type system and nowhere on
1933
+ // screen. With drop-shadow now gated off below FLOATING_ELEVATION_MIN, TONE
1934
+ // is the only thing separating 0-3, so every step has to actually land.
1935
+ // Even 0.025 spacing, verified in elevation.test.ts as ΔL* > 1 per step.
1936
+ colorAdjustment: 0.025,
2110
1937
  shadowIntensity: "subtle",
2111
1938
  shadowStyle: "raised",
2112
1939
  description: "Subtle elevation (outline cards, subtle containers)"
@@ -2114,7 +1941,7 @@ var elevationSystem = {
2114
1941
  // Level 2: Standard elevation (default cards, buttons)
2115
1942
  [2]: {
2116
1943
  name: "standard",
2117
- colorAdjustment: 0.02,
1944
+ colorAdjustment: 0.05,
2118
1945
  shadowIntensity: "medium",
2119
1946
  shadowStyle: "raised",
2120
1947
  description: "Standard elevation (default cards, raised buttons)"
@@ -2122,7 +1949,7 @@ var elevationSystem = {
2122
1949
  // Level 3: Prominent elevation (important cards, modals)
2123
1950
  [3]: {
2124
1951
  name: "prominent",
2125
- colorAdjustment: 0.04,
1952
+ colorAdjustment: 0.075,
2126
1953
  shadowIntensity: "strong",
2127
1954
  shadowStyle: "raised",
2128
1955
  description: "Prominent elevation (important cards, modals, dropdowns)"
@@ -2130,7 +1957,7 @@ var elevationSystem = {
2130
1957
  // Level 4: High elevation (overlays, popovers)
2131
1958
  [4]: {
2132
1959
  name: "high",
2133
- colorAdjustment: 0.06,
1960
+ colorAdjustment: 0.1,
2134
1961
  shadowIntensity: "strong",
2135
1962
  shadowStyle: "raised",
2136
1963
  description: "High elevation (overlays, popovers, tooltips)"
@@ -2138,7 +1965,7 @@ var elevationSystem = {
2138
1965
  // Level 5: Floating (toasts, floating action buttons)
2139
1966
  [5]: {
2140
1967
  name: "floating",
2141
- colorAdjustment: 0.08,
1968
+ colorAdjustment: 0.13,
2142
1969
  shadowIntensity: "strong",
2143
1970
  shadowStyle: "raised",
2144
1971
  description: "Floating elevation (toasts, floating action buttons, highest z-index)"
@@ -2257,12 +2084,12 @@ function calculateElevationShadow(baseColor, level, theme, isHovered = false) {
2257
2084
  const elevatedSurfaceColor = calculateElevationSurface(baseColor, level);
2258
2085
  const rimLightColor = calculateRimLightColor(baseColor, level);
2259
2086
  const darkShadowColors = calculateDarkShadowColors(elevatedSurfaceColor);
2260
- const intensityConfig2 = {
2087
+ const intensityConfig = {
2261
2088
  subtle: { offset: 1, blur: 2 },
2262
2089
  medium: { offset: 2, blur: 4 },
2263
2090
  strong: { offset: 2, blur: 5 }
2264
2091
  };
2265
- const { offset, blur } = intensityConfig2[config.shadowIntensity];
2092
+ const { offset, blur } = intensityConfig[config.shadowIntensity];
2266
2093
  const rimConfig = getRimLightConfig();
2267
2094
  if (config.shadowStyle === "pressed") {
2268
2095
  if (isHovered) {
@@ -2318,12 +2145,13 @@ function calculateElevationShadow(baseColor, level, theme, isHovered = false) {
2318
2145
  });
2319
2146
  }
2320
2147
  }
2148
+ var FLOATING_ELEVATION_MIN = 4;
2321
2149
  function getElevationShadow(baseColor, level, theme, isHovered = false) {
2322
2150
  const cacheKey = getShadowCacheKey(baseColor, level, theme, isHovered);
2323
2151
  if (elevationShadowCache.has(cacheKey)) {
2324
2152
  return elevationShadowCache.get(cacheKey);
2325
2153
  }
2326
- const result = calculateElevationShadow(baseColor, level, theme, isHovered);
2154
+ const result = level > 0 && level < FLOATING_ELEVATION_MIN ? {} : calculateElevationShadow(baseColor, level, theme, isHovered);
2327
2155
  if (elevationShadowCache.size >= MAX_SHADOW_CACHE_SIZE) {
2328
2156
  const firstKey = elevationShadowCache.keys().next().value;
2329
2157
  elevationShadowCache.delete(firstKey);
@@ -2593,7 +2421,7 @@ var audiobookPreset = {
2593
2421
  "text-primary": "#f4f3f1",
2594
2422
  "text-secondary": "#b5b3af",
2595
2423
  "text-tertiary": "#7a7875",
2596
- // Surfaces: warm charcoals (not pure gray)
2424
+ // Surfaces: warm greys (not pure gray)
2597
2425
  "surface-base": "#101114",
2598
2426
  "surface-elevated": "#15171c",
2599
2427
  "surface-raised": "#1a1d24",
@@ -2604,9 +2432,9 @@ var audiobookPreset = {
2604
2432
  "background-default": "#101114",
2605
2433
  "background-subtle": "#1a1d24",
2606
2434
  // Borders
2607
- "border-default": "rgba(255, 255, 255, 0.06)",
2608
- "border-subtle": "rgba(255, 255, 255, 0.03)",
2609
- "border-strong": "#2d323d",
2435
+ "hairline-default": "rgba(255, 255, 255, 0.06)",
2436
+ "hairline-subtle": "rgba(255, 255, 255, 0.03)",
2437
+ "hairline-strong": "#2d323d",
2610
2438
  "border-focus": "#d4782a",
2611
2439
  "border-input": "#2d323d",
2612
2440
  "border-input-hover": "#454c5c",
@@ -2631,13 +2459,14 @@ var audiobookPreset = {
2631
2459
  rootClasses: ["atmosphere-warm", "grain"]
2632
2460
  };
2633
2461
  var SURFACE_LEVEL_TOKEN = {
2462
+ frame: "background-frame",
2634
2463
  background: "background-base",
2635
2464
  base: "surface-base",
2636
2465
  elevated: "surface-elevated",
2637
2466
  raised: "surface-raised",
2638
2467
  overlay: "surface-overlay"
2639
2468
  };
2640
- var PRESSED_RAMP = ["inset", "background", "base", "elevated", "raised", "overlay"];
2469
+ var PRESSED_RAMP = ["frame", "background", "base", "elevated", "raised", "overlay"];
2641
2470
  var ON_SURFACE_TOKEN = {
2642
2471
  primary: "text-primary",
2643
2472
  secondary: "text-secondary",
@@ -2652,22 +2481,17 @@ function useSurfaceMode() {
2652
2481
  return useContext(SurfaceContext).mode;
2653
2482
  }
2654
2483
  function onSurfaceColors(mode) {
2655
- const c = getSemanticColors(mode);
2484
+ const c2 = getSemanticColors(mode);
2656
2485
  return {
2657
- primary: c[ON_SURFACE_TOKEN.primary],
2658
- secondary: c[ON_SURFACE_TOKEN.secondary],
2659
- tertiary: c[ON_SURFACE_TOKEN.tertiary]
2486
+ primary: c2[ON_SURFACE_TOKEN.primary],
2487
+ secondary: c2[ON_SURFACE_TOKEN.secondary],
2488
+ tertiary: c2[ON_SURFACE_TOKEN.tertiary]
2660
2489
  };
2661
2490
  }
2662
2491
  function useOnSurfaceColor(role = "primary") {
2663
2492
  return getSemanticColors(useSurfaceMode())[ON_SURFACE_TOKEN[role]];
2664
2493
  }
2665
- function insetFloor(mode) {
2666
- const colors = getSemanticColors(mode);
2667
- return colors["surface-inset"] ?? surfaceRampDark.inset;
2668
- }
2669
2494
  function surfaceBackground(level, mode) {
2670
- if (level === "inset") return insetFloor(mode);
2671
2495
  return getSemanticColors(mode)[SURFACE_LEVEL_TOKEN[level]];
2672
2496
  }
2673
2497
  function pressedLevel(parent) {
@@ -2718,12 +2542,12 @@ function useTheme() {
2718
2542
  var variantStyles3 = {
2719
2543
  elevated: "",
2720
2544
  // Will be set dynamically via elevation system
2721
- outline: "border-2 border-border-strong",
2545
+ outline: "border-2 border-hairline-strong",
2722
2546
  // Thicker border with stronger contrast
2723
2547
  filled: "",
2724
2548
  // Will be set dynamically via elevation system
2725
- accent: "border border-border",
2726
- subtle: "border border-border-subtle"
2549
+ accent: "border border-hairline",
2550
+ subtle: "border border-hairline-subtle"
2727
2551
  };
2728
2552
  function Card({
2729
2553
  variant = "elevated",
@@ -2958,7 +2782,7 @@ function Indicator({
2958
2782
  // src/components/ui/badge/Badge.tsx
2959
2783
  var variantColorStyles = {
2960
2784
  solid: {
2961
- default: "bg-border-strong text-text-inverse",
2785
+ default: "bg-hairline-strong text-text-inverse",
2962
2786
  primary: "bg-brand-primary text-text-inverse",
2963
2787
  secondary: "bg-brand-secondary text-text-inverse",
2964
2788
  success: "bg-status-success text-text-inverse",
@@ -2976,7 +2800,7 @@ var variantColorStyles = {
2976
2800
  info: "bg-status-info-subtle text-status-info"
2977
2801
  },
2978
2802
  outline: {
2979
- default: "border border-border-strong text-text-secondary",
2803
+ default: "border border-hairline-strong text-text-secondary",
2980
2804
  primary: "border border-brand-primary text-brand-primary",
2981
2805
  secondary: "border border-brand-secondary text-brand-secondary",
2982
2806
  success: "border border-status-success text-status-success",
@@ -3122,7 +2946,7 @@ function Avatar({
3122
2946
  accessibilityLabel: alt || resolvedFallback || "Avatar",
3123
2947
  className: cn(
3124
2948
  "items-center justify-center rounded-full overflow-hidden",
3125
- !nameColor && "bg-border-strong",
2949
+ !nameColor && "bg-hairline-strong",
3126
2950
  styles2.container,
3127
2951
  className
3128
2952
  ),
@@ -3143,7 +2967,7 @@ var badgeColors = {
3143
2967
  success: "bg-status-success",
3144
2968
  error: "bg-status-error",
3145
2969
  warning: "bg-status-warning",
3146
- default: "bg-border-strong"
2970
+ default: "bg-hairline-strong"
3147
2971
  };
3148
2972
  function AvatarBadge({ color = "success", className }) {
3149
2973
  return /* @__PURE__ */ jsx(
@@ -3261,7 +3085,7 @@ var Checkbox = forwardRef(function Checkbox2({
3261
3085
  className: cn(
3262
3086
  "items-center justify-center rounded border-2 transition-colors",
3263
3087
  styles2.box,
3264
- isChecked || isIndeterminate ? "bg-brand-primary border-brand-primary" : "bg-transparent border-border",
3088
+ isChecked || isIndeterminate ? "bg-brand-primary border-brand-primary" : "bg-transparent border-hairline",
3265
3089
  isInvalid && "border-status-error",
3266
3090
  !isDisabled && "web:hover:border-brand-primary"
3267
3091
  ),
@@ -3325,7 +3149,7 @@ var Switch = forwardRef(function Switch2({
3325
3149
  className: cn(
3326
3150
  "rounded-full p-0.5 transition-colors",
3327
3151
  styles2.track,
3328
- isChecked ? "bg-brand-primary" : "bg-border-strong"
3152
+ isChecked ? "bg-brand-primary" : "bg-hairline-strong"
3329
3153
  ),
3330
3154
  children: /* @__PURE__ */ jsx(
3331
3155
  View,
@@ -3645,7 +3469,7 @@ function Tabs({
3645
3469
  function TabList({ children, className }) {
3646
3470
  const { variant, orientation } = useContext(TabsContext);
3647
3471
  const variantStyles5 = {
3648
- line: orientation === "horizontal" ? "border-b border-border" : "border-r border-border",
3472
+ line: orientation === "horizontal" ? "border-b border-hairline" : "border-r border-hairline",
3649
3473
  enclosed: "bg-surface-raised rounded-lg p-1",
3650
3474
  "soft-rounded": "bg-surface-raised rounded-full p-1"
3651
3475
  };
@@ -4131,7 +3955,7 @@ function Accordion({
4131
3955
  return newSet;
4132
3956
  });
4133
3957
  };
4134
- return /* @__PURE__ */ jsx(AccordionContext.Provider, { value: { openIndices, toggleIndex, allowMultiple }, children: /* @__PURE__ */ jsx(View, { className: cn("w-full divide-y divide-border", className), ...props, children: React25.Children.map(children, (child, index) => {
3958
+ return /* @__PURE__ */ jsx(AccordionContext.Provider, { value: { openIndices, toggleIndex, allowMultiple }, children: /* @__PURE__ */ jsx(View, { className: cn("w-full divide-y divide-hairline", className), ...props, children: React25.Children.map(children, (child, index) => {
4135
3959
  if (React25.isValidElement(child)) {
4136
3960
  return React25.cloneElement(child, { index });
4137
3961
  }
@@ -4361,7 +4185,7 @@ function PopoverContent({ children, className }) {
4361
4185
  {
4362
4186
  className: cn(
4363
4187
  "absolute z-50 min-w-[200px]",
4364
- "bg-surface-elevated rounded-lg shadow-lg border border-border",
4188
+ "bg-surface-elevated rounded-lg shadow-lg border border-hairline",
4365
4189
  "p-4",
4366
4190
  placementStyles3[placement],
4367
4191
  className
@@ -4455,7 +4279,7 @@ function MenuList({ children, className }) {
4455
4279
  {
4456
4280
  className: cn(
4457
4281
  "absolute z-50 top-full left-0 mt-1 min-w-[160px]",
4458
- "bg-surface-elevated rounded-lg shadow-lg border border-border",
4282
+ "bg-surface-elevated rounded-lg shadow-lg border border-hairline",
4459
4283
  "py-1 overflow-hidden",
4460
4284
  className
4461
4285
  ),
@@ -4509,7 +4333,7 @@ function MenuItem({
4509
4333
  );
4510
4334
  }
4511
4335
  function MenuDivider({ className }) {
4512
- return /* @__PURE__ */ jsx(View, { className: cn("h-px bg-border my-1", className) });
4336
+ return /* @__PURE__ */ jsx(View, { className: cn("h-px bg-hairline my-1", className) });
4513
4337
  }
4514
4338
  function MenuGroup({ label, children, className }) {
4515
4339
  return /* @__PURE__ */ jsxs(View, { className, children: [
@@ -4587,7 +4411,7 @@ function Select({
4587
4411
  className: cn(
4588
4412
  "flex-row items-center justify-between px-4 py-2.5 rounded-md border",
4589
4413
  variant === "filled" ? "bg-black/30" : "bg-surface-base",
4590
- isInvalid ? "border-border-input-error" : variant === "filled" ? "border-border-subtle" : "border-border-input",
4414
+ isInvalid ? "border-border-input-error" : variant === "filled" ? "border-hairline-subtle" : "border-border-input",
4591
4415
  !isDisabled && !isInvalid && "web:hover:border-border-input-hover",
4592
4416
  isOpen && "border-border-input-focus",
4593
4417
  isDisabled && "opacity-50 cursor-not-allowed"
@@ -4634,7 +4458,7 @@ function Select({
4634
4458
  {
4635
4459
  className: cn(
4636
4460
  "absolute z-50 top-full left-0 right-0 mt-1",
4637
- "bg-surface-elevated rounded-md shadow-lg border border-border",
4461
+ "bg-surface-elevated rounded-md shadow-lg border border-hairline",
4638
4462
  "max-h-60 overflow-hidden"
4639
4463
  ),
4640
4464
  children: /* @__PURE__ */ jsx(ScrollView, { className: "py-1", children: options.map((option) => /* @__PURE__ */ jsx(SelectOption, { option }, option.value)) })
@@ -4665,7 +4489,7 @@ function SelectOption({ option }) {
4665
4489
  {
4666
4490
  className: cn(
4667
4491
  "w-4 h-4 mr-3 rounded border",
4668
- selected ? "bg-brand-primary border-brand-primary" : "border-border-strong"
4492
+ selected ? "bg-brand-primary border-brand-primary" : "border-hairline-strong"
4669
4493
  ),
4670
4494
  children: selected && /* @__PURE__ */ jsx(Text, { className: "text-white text-xs text-center", children: "\u2713" })
4671
4495
  }
@@ -4680,8 +4504,11 @@ var ToolbarButtonContext = createContext({
4680
4504
  setIsOpen: () => {
4681
4505
  }
4682
4506
  });
4683
- var BUTTON_BG = "#3C3C3C";
4684
- var MENU_BG = "#2C2C2C";
4507
+ var SEMANTIC = getSemanticColors("dark");
4508
+ var BUTTON_BG = greyRamp[800];
4509
+ var MENU_BG = greyRamp[900];
4510
+ var EDGE = { borderWidth: 1, borderColor: SEMANTIC["hairline-default"] };
4511
+ var EDGE_PRESSED = { borderWidth: 1, borderColor: SEMANTIC["hairline-strong"] };
4685
4512
  var hoverColors = getHoverColors(BUTTON_BG, "medium");
4686
4513
  var sizeStyles10 = {
4687
4514
  sm: "px-2 py-1 min-h-[26px]",
@@ -4699,7 +4526,7 @@ function ToolbarButton({
4699
4526
  isActive,
4700
4527
  isDisabled = false,
4701
4528
  size = "md",
4702
- variant = "neumorphic",
4529
+ variant = "raised",
4703
4530
  tooltip,
4704
4531
  showLabel = true,
4705
4532
  onPress,
@@ -4726,22 +4553,20 @@ function ToolbarButton({
4726
4553
  if (isActive === true) return resolveColor("brand-primary");
4727
4554
  return showActive ? "#FFFFFF" : "#D1D1D1";
4728
4555
  };
4729
- const getNeumorphicStyle = () => {
4556
+ const getRaisedStyle = () => {
4730
4557
  if (isDisabled) {
4731
4558
  return styles.disabledBg;
4732
4559
  }
4733
- const shadows = neumorphicShadows.charcoal;
4734
4560
  if (showActive) {
4735
4561
  return {
4736
- backgroundColor: isHovered ? hoverColors.pressed : BUTTON_BG,
4737
- ...isHovered ? shadows.pressedHover.subtle : shadows.pressed.subtle
4738
- };
4739
- } else {
4740
- return {
4741
- backgroundColor: isHovered ? hoverColors.raised : BUTTON_BG,
4742
- ...isHovered ? shadows.raisedHover.subtle : shadows.raised.subtle
4562
+ backgroundColor: isHovered ? hoverColors.pressed : greyRamp[900],
4563
+ ...EDGE_PRESSED
4743
4564
  };
4744
4565
  }
4566
+ return {
4567
+ backgroundColor: isHovered ? hoverColors.raised : BUTTON_BG,
4568
+ ...EDGE
4569
+ };
4745
4570
  };
4746
4571
  return /* @__PURE__ */ jsx(ToolbarButtonContext.Provider, { value: { isOpen, setIsOpen }, children: /* @__PURE__ */ jsxs(View, { className: "relative", ...props, children: [
4747
4572
  /* @__PURE__ */ jsxs(
@@ -4766,9 +4591,9 @@ function ToolbarButton({
4766
4591
  className
4767
4592
  ),
4768
4593
  style: [
4769
- variant === "neumorphic" && getNeumorphicStyle(),
4594
+ variant === "raised" && getRaisedStyle(),
4770
4595
  variant === "default" && {
4771
- backgroundColor: showActive ? BUTTON_BG : "#6E6E6E"
4596
+ backgroundColor: showActive ? BUTTON_BG : greyRamp[600]
4772
4597
  }
4773
4598
  ],
4774
4599
  children: [
@@ -4813,7 +4638,7 @@ function ToolbarButton({
4813
4638
  {
4814
4639
  className: cn(
4815
4640
  "absolute z-50 top-full left-0 mt-1",
4816
- "rounded-lg shadow-lg border border-border",
4641
+ "rounded-lg shadow-lg border border-hairline",
4817
4642
  "min-w-[150px] overflow-hidden",
4818
4643
  `bg-[${MENU_BG}]`
4819
4644
  ),
@@ -4912,10 +4737,10 @@ var sizeConfig = {
4912
4737
  lg: { outer: "w-6 h-6", inner: "w-3 h-3", text: "text-lg" }
4913
4738
  };
4914
4739
  var colorStyles4 = {
4915
- primary: { checked: "border-brand-primary bg-brand-primary", unchecked: "border-border-strong" },
4916
- secondary: { checked: "border-brand-secondary bg-brand-secondary", unchecked: "border-border-strong" },
4917
- success: { checked: "border-status-success bg-status-success", unchecked: "border-border-strong" },
4918
- error: { checked: "border-status-error bg-status-error", unchecked: "border-border-strong" }
4740
+ primary: { checked: "border-brand-primary bg-brand-primary", unchecked: "border-hairline-strong" },
4741
+ secondary: { checked: "border-brand-secondary bg-brand-secondary", unchecked: "border-hairline-strong" },
4742
+ success: { checked: "border-status-success bg-status-success", unchecked: "border-hairline-strong" },
4743
+ error: { checked: "border-status-error bg-status-error", unchecked: "border-hairline-strong" }
4919
4744
  };
4920
4745
  function Radio({
4921
4746
  value,
@@ -5055,7 +4880,7 @@ function Drawer({
5055
4880
  accessibilityRole: "dialog",
5056
4881
  ...props,
5057
4882
  children: [
5058
- (title || showCloseButton) && /* @__PURE__ */ jsxs(View, { className: "flex-row items-center justify-between px-4 py-3 border-b border-border", children: [
4883
+ (title || showCloseButton) && /* @__PURE__ */ jsxs(View, { className: "flex-row items-center justify-between px-4 py-3 border-b border-hairline", children: [
5059
4884
  title && /* @__PURE__ */ jsx(Text, { className: "text-lg font-semibold text-text-primary", children: title }),
5060
4885
  showCloseButton && /* @__PURE__ */ jsx(
5061
4886
  Pressable,
@@ -5079,7 +4904,7 @@ function DrawerHeader({ className, children, ...props }) {
5079
4904
  return /* @__PURE__ */ jsx(
5080
4905
  View,
5081
4906
  {
5082
- className: cn("px-4 py-3 border-b border-border", className),
4907
+ className: cn("px-4 py-3 border-b border-hairline", className),
5083
4908
  ...props,
5084
4909
  children
5085
4910
  }
@@ -5104,7 +4929,7 @@ function DrawerFooter({ className, children, ...props }) {
5104
4929
  {
5105
4930
  className: cn(
5106
4931
  "flex-row items-center justify-end gap-3",
5107
- "px-4 py-3 border-t border-border",
4932
+ "px-4 py-3 border-t border-hairline",
5108
4933
  className
5109
4934
  ),
5110
4935
  ...props,
@@ -5243,7 +5068,7 @@ function CircularProgress({
5243
5068
  cy: center,
5244
5069
  r: radius,
5245
5070
  fill: "none",
5246
- stroke: "var(--color-border-default)",
5071
+ stroke: "var(--color-hairline-default)",
5247
5072
  strokeWidth
5248
5073
  }
5249
5074
  ),
@@ -5312,7 +5137,7 @@ function ProgressSteps({
5312
5137
  className: cn(
5313
5138
  "rounded-full",
5314
5139
  dot,
5315
- index <= currentStep ? colorStyles5[color] : "bg-border-strong"
5140
+ index <= currentStep ? colorStyles5[color] : "bg-hairline-strong"
5316
5141
  )
5317
5142
  }
5318
5143
  ),
@@ -5322,7 +5147,7 @@ function ProgressSteps({
5322
5147
  className: cn(
5323
5148
  "flex-1 mx-1",
5324
5149
  connector,
5325
- index < currentStep ? colorStyles5[color] : "bg-border-strong"
5150
+ index < currentStep ? colorStyles5[color] : "bg-hairline-strong"
5326
5151
  )
5327
5152
  }
5328
5153
  )
@@ -5656,7 +5481,7 @@ function Autocomplete({
5656
5481
  {
5657
5482
  className: cn(
5658
5483
  "absolute z-50 top-full left-0 right-0 mt-1",
5659
- "bg-surface-elevated rounded-md shadow-lg border border-border",
5484
+ "bg-surface-elevated rounded-md shadow-lg border border-hairline",
5660
5485
  "max-h-60 overflow-hidden"
5661
5486
  ),
5662
5487
  children: /* @__PURE__ */ jsxs(ScrollView, { className: "py-1", children: [
@@ -5809,7 +5634,7 @@ function HelpTip({
5809
5634
  className: cn(
5810
5635
  "absolute z-50",
5811
5636
  "bg-surface-elevated rounded-lg shadow-lg",
5812
- "border border-border",
5637
+ "border border-hairline",
5813
5638
  "px-3 py-2",
5814
5639
  placementStyles2[placement],
5815
5640
  tooltipClassName
@@ -5985,7 +5810,7 @@ function FormActions({
5985
5810
  {
5986
5811
  className: cn(
5987
5812
  "flex-row items-center gap-3 pt-4",
5988
- "border-t border-border mt-4",
5813
+ "border-t border-hairline mt-4",
5989
5814
  alignStyles[align],
5990
5815
  className
5991
5816
  ),
@@ -6204,7 +6029,7 @@ function ListItemDivider({ inset = true, className, ...props }) {
6204
6029
  }
6205
6030
  var variantColorStyles2 = {
6206
6031
  subtle: {
6207
- default: "bg-surface-raised border-border-subtle text-text-secondary",
6032
+ default: "bg-surface-raised border-hairline-subtle text-text-secondary",
6208
6033
  primary: "bg-brand-primary/10 border-brand-primary/25 text-brand-primary",
6209
6034
  secondary: "bg-brand-secondary/10 border-brand-secondary/25 text-brand-secondary",
6210
6035
  success: "bg-status-success/10 border-status-success/25 text-status-success",
@@ -6213,7 +6038,7 @@ var variantColorStyles2 = {
6213
6038
  info: "bg-status-info/10 border-status-info/25 text-status-info"
6214
6039
  },
6215
6040
  outline: {
6216
- default: "border-border text-text-secondary",
6041
+ default: "border-hairline text-text-secondary",
6217
6042
  primary: "border-brand-primary text-brand-primary",
6218
6043
  secondary: "border-brand-secondary text-brand-secondary",
6219
6044
  success: "border-status-success text-status-success",
@@ -6424,7 +6249,7 @@ function Sidebar({
6424
6249
  {
6425
6250
  style: { width: currentWidth },
6426
6251
  className: cn(
6427
- "h-full flex-col bg-surface-base border-r border-border transition-all duration-200",
6252
+ "h-full flex-col bg-surface-base border-r border-hairline transition-all duration-200",
6428
6253
  className
6429
6254
  ),
6430
6255
  ...props,
@@ -6433,7 +6258,7 @@ function Sidebar({
6433
6258
  ) });
6434
6259
  }
6435
6260
  function SidebarHeader({ children, className }) {
6436
- return /* @__PURE__ */ jsx(View, { className: cn("px-4 py-4 border-b border-border-subtle", className), children });
6261
+ return /* @__PURE__ */ jsx(View, { className: cn("px-4 py-4 border-b border-hairline-subtle", className), children });
6437
6262
  }
6438
6263
  function SidebarContent({ children, className }) {
6439
6264
  return /* @__PURE__ */ jsx(
@@ -6446,7 +6271,7 @@ function SidebarContent({ children, className }) {
6446
6271
  );
6447
6272
  }
6448
6273
  function SidebarFooter({ children, className }) {
6449
- return /* @__PURE__ */ jsx(View, { className: cn("px-2 py-4 border-t border-border-subtle", className), children });
6274
+ return /* @__PURE__ */ jsx(View, { className: cn("px-2 py-4 border-t border-hairline-subtle", className), children });
6450
6275
  }
6451
6276
  function SidebarSection({ title, children, className }) {
6452
6277
  const { isCollapsed } = useContext(SidebarContext);
@@ -6516,7 +6341,7 @@ function SidebarItem({
6516
6341
  );
6517
6342
  }
6518
6343
  function SidebarDivider({ className }) {
6519
- return /* @__PURE__ */ jsx(View, { className: cn("h-px mx-4 my-2 bg-border-subtle", className) });
6344
+ return /* @__PURE__ */ jsx(View, { className: cn("h-px mx-4 my-2 bg-hairline-subtle", className) });
6520
6345
  }
6521
6346
  var TableContext = createContext({
6522
6347
  sortDirection: null,
@@ -6913,7 +6738,7 @@ function StepConnector({ index }) {
6913
6738
  {
6914
6739
  className: cn(
6915
6740
  "flex-1 h-0.5 mx-2",
6916
- isCompleted ? "bg-brand-primary" : "bg-border"
6741
+ isCompleted ? "bg-brand-primary" : "bg-hairline"
6917
6742
  )
6918
6743
  }
6919
6744
  );
@@ -6923,7 +6748,7 @@ function StepConnector({ index }) {
6923
6748
  {
6924
6749
  className: cn(
6925
6750
  "w-0.5 h-8 ml-4 my-1",
6926
- isCompleted ? "bg-brand-primary" : "bg-border"
6751
+ isCompleted ? "bg-brand-primary" : "bg-hairline"
6927
6752
  )
6928
6753
  }
6929
6754
  );
@@ -6959,7 +6784,7 @@ function StepIndicator({
6959
6784
  const statusStyles2 = {
6960
6785
  completed: "bg-brand-primary border-brand-primary",
6961
6786
  active: "bg-brand-primary border-brand-primary",
6962
- upcoming: "bg-surface-base border-border-strong",
6787
+ upcoming: "bg-surface-base border-hairline-strong",
6963
6788
  error: "bg-status-error border-status-error"
6964
6789
  };
6965
6790
  return /* @__PURE__ */ jsx(
@@ -7357,7 +7182,7 @@ var baseBadgeSizeConfig = {
7357
7182
  lg: { fontSize: 12, paddingH: 10, paddingV: 4, iconSize: 14 }
7358
7183
  };
7359
7184
  var variantColors = {
7360
- plain: { backgroundColor: t["surface-raised"], borderColor: "#1F1F1F" },
7185
+ plain: { backgroundColor: t["surface-raised"], borderColor: t["hairline-default"] },
7361
7186
  pr: {
7362
7187
  backgroundColor: "rgba(255, 121, 0, 0.12)",
7363
7188
  borderColor: "rgba(255, 121, 0, 0.3)"
@@ -7441,7 +7266,7 @@ function WeightBadge({
7441
7266
  ...props
7442
7267
  }) {
7443
7268
  const config = baseBadgeSizeConfig[size];
7444
- const textColor = isPr ? getSemanticColors("dark")["brand-primary"] : "#9CA3AF";
7269
+ const textColor = isPr ? getSemanticColors("dark")["brand-primary"] : greyRamp[400];
7445
7270
  const iconColor = textColor;
7446
7271
  const repMaxClause = reps != null ? `${reps} rep max` : "Estimated one rep max";
7447
7272
  const deltaLabel = delta != null ? `, ${delta >= 0 ? "+" : ""}${delta}% change` : "";
@@ -7602,7 +7427,7 @@ var solidVariantColors = {
7602
7427
  success: t2["status-success"],
7603
7428
  warning: t2["status-warning"],
7604
7429
  error: t2["status-error"],
7605
- neutral: "#6B7280"
7430
+ neutral: greyRamp[500]
7606
7431
  };
7607
7432
  var ringVariantStyles = {
7608
7433
  "on-track": {
@@ -7640,10 +7465,10 @@ var iconColors2 = {
7640
7465
  success: "#0A5C52",
7641
7466
  warning: "#6B4000",
7642
7467
  error: "#5C1A1A",
7643
- neutral: "#D1D5DB",
7468
+ neutral: greyRamp[200],
7644
7469
  "on-track": t2["status-success"],
7645
7470
  deviation: t2["status-warning"],
7646
- future: "#6B7280"
7471
+ future: greyRamp[500]
7647
7472
  };
7648
7473
  var sizeDimensions = {
7649
7474
  sm: { size: 8, showIcon: false },
@@ -7712,7 +7537,7 @@ function StatusDot({
7712
7537
  /* @__PURE__ */ jsx(
7713
7538
  Text,
7714
7539
  {
7715
- style: { fontSize: 12, lineHeight: 16, color: "#9CA3AF" },
7540
+ style: { fontSize: 12, lineHeight: 16, color: greyRamp[400] },
7716
7541
  accessibilityElementsHidden: true,
7717
7542
  children: label
7718
7543
  }
@@ -8044,7 +7869,7 @@ function LiveTempoCell({
8044
7869
  alignItems: "center",
8045
7870
  justifyContent: "center"
8046
7871
  };
8047
- const num = (c, text) => /* @__PURE__ */ jsx(Text, { style: { fontFamily: MONO, fontSize, color: c, fontWeight: "700" }, children: text });
7872
+ const num = (c2, text) => /* @__PURE__ */ jsx(Text, { style: { fontFamily: MONO, fontSize, color: c2, fontWeight: "700" }, children: text });
8048
7873
  if (status === "upcoming") {
8049
7874
  const targetText = targetMs != null ? (targetMs / 1e3).toFixed(1) : String(value);
8050
7875
  return /* @__PURE__ */ jsx(View, { style: wrap, children: num(color, targetText) });
@@ -8257,7 +8082,7 @@ var t4 = getSemanticColors("dark");
8257
8082
  function getDotColor(deviation) {
8258
8083
  const abs = Math.abs(deviation);
8259
8084
  if (deviation < -0.3) return t4["status-success"];
8260
- if (abs <= 0.3) return "#6B7280";
8085
+ if (abs <= 0.3) return greyRamp[500];
8261
8086
  if (abs <= 0.7) return t4["status-warning"];
8262
8087
  return t4["status-error"];
8263
8088
  }
@@ -8314,7 +8139,7 @@ function DeviationBar({
8314
8139
  height: dotSize,
8315
8140
  borderRadius: 9999,
8316
8141
  borderWidth: 1.5,
8317
- borderColor: "#F3F4F6",
8142
+ borderColor: greyRamp[50],
8318
8143
  boxShadow: "0 0 4px rgba(0,0,0,0.5)",
8319
8144
  backgroundColor: getDotColor(clamped),
8320
8145
  left: Math.max(0, Math.min(dotPosition - dotSize / 2, resolvedWidth - dotSize)),
@@ -8508,6 +8333,7 @@ var MESO_ACCENT_GRADIENT_LIGHT = primitiveRamps.orange[300];
8508
8333
  var WORKOUT_PILL_DELOAD = primitiveRamps.magenta[600];
8509
8334
 
8510
8335
  // src/components/custom/Workout/WorkoutPill.tsx
8336
+ var HAIRLINE_DEFAULT = getSemanticColors("dark")["hairline-default"];
8511
8337
  var t6 = getSemanticColors("dark");
8512
8338
  var statusBgColors = {
8513
8339
  completed: "rgba(46,213,115,0.15)",
@@ -8521,7 +8347,7 @@ var statusBorderStyles = {
8521
8347
  completed: { borderWidth: 1, borderColor: "rgba(46,213,115,0.3)" },
8522
8348
  current: { borderWidth: 1, borderColor: "rgba(255,121,0,0.3)" },
8523
8349
  next: { borderWidth: 1, borderColor: "rgba(255,121,0,0.4)" },
8524
- upcoming: { borderWidth: 1, borderColor: "#1F1F1F" },
8350
+ upcoming: { borderWidth: 1, borderColor: HAIRLINE_DEFAULT },
8525
8351
  missed: { borderWidth: 1, borderColor: "rgba(209,67,67,0.25)" },
8526
8352
  deload: { borderWidth: 1, borderColor: "rgba(186,41,150,0.3)" }
8527
8353
  };
@@ -8529,7 +8355,7 @@ var textColors = {
8529
8355
  completed: t6["status-success"],
8530
8356
  current: t6["brand-primary"],
8531
8357
  next: t6["brand-primary"],
8532
- upcoming: "#6B7280",
8358
+ upcoming: greyRamp[500],
8533
8359
  missed: "rgba(209,67,67,0.7)",
8534
8360
  deload: WORKOUT_PILL_DELOAD
8535
8361
  };
@@ -8661,28 +8487,6 @@ function WorkoutPill({
8661
8487
  }
8662
8488
  return pill;
8663
8489
  }
8664
-
8665
- // src/theme/bar-paper.ts
8666
- function grainOpacityForColor(hex) {
8667
- const h = hex.replace("#", "");
8668
- const full = h.length === 3 ? h.split("").map((ch) => ch + ch).join("") : h;
8669
- const r = parseInt(full.slice(0, 2), 16);
8670
- const g = parseInt(full.slice(2, 4), 16);
8671
- const b = parseInt(full.slice(4, 6), 16);
8672
- if ([r, g, b].some(Number.isNaN)) return 0.14;
8673
- const lum = (0.299 * r + 0.587 * g + 0.114 * b) / 255;
8674
- return Math.min(0.24, Math.max(0.04, 0.02 + 0.31 * lum));
8675
- }
8676
- function barGrain(color) {
8677
- const op = grainOpacityForColor(color).toFixed(3);
8678
- return `url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='120' height='120' filter='url(%23n)' opacity='${op}'/%3E%3C/svg%3E")`;
8679
- }
8680
- function barPaper(color, flip = false) {
8681
- return {
8682
- backgroundImage: barGrain(color),
8683
- 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)"
8684
- };
8685
- }
8686
8490
  var ANIMATION_EASING = Easing.bezier(0.22, 1, 0.36, 1);
8687
8491
  var PEAK_OVERSHOOT = 1.12;
8688
8492
  function getReducedMotionPreference() {
@@ -9222,7 +9026,7 @@ function setAccessibilityLabel(set, repCount) {
9222
9026
  }
9223
9027
  var EXPANDED_HEIGHT = 60;
9224
9028
  var COMPACT_HEIGHT = 8;
9225
- var HERO_REFERENCE_COLOR = primitiveColors.charcoal[0];
9029
+ var HERO_REFERENCE_COLOR = greyRamp[600];
9226
9030
  function DashedReferenceLine({
9227
9031
  anchor,
9228
9032
  offset,
@@ -9894,7 +9698,7 @@ function VelocityStrip({
9894
9698
  }
9895
9699
  var t7 = getSemanticColors("dark");
9896
9700
  var dotColorMap = {
9897
- untrained: "#2C2C2C",
9701
+ untrained: greyRamp[900],
9898
9702
  behind: t7["brand-secondary"],
9899
9703
  ontrack: t7["status-success"],
9900
9704
  target: t7["brand-primary"],
@@ -9907,12 +9711,12 @@ function MuscleGroupChip({
9907
9711
  className,
9908
9712
  ...props
9909
9713
  }) {
9910
- const dotColor = volumeStatus ? dotColorMap[volumeStatus] : "#2C2C2C";
9714
+ const dotColor = volumeStatus ? dotColorMap[volumeStatus] : greyRamp[900];
9911
9715
  const statusLabel = volumeStatus ?? "no status";
9912
9716
  const content = /* @__PURE__ */ jsxs(
9913
9717
  View,
9914
9718
  {
9915
- className: ["bg-surface-raised border-border", className].filter(Boolean).join(" "),
9719
+ className: ["bg-surface-raised border-hairline", className].filter(Boolean).join(" "),
9916
9720
  style: {
9917
9721
  flexDirection: "row",
9918
9722
  alignItems: "center",
@@ -10213,7 +10017,7 @@ function SetRow(set) {
10213
10017
  );
10214
10018
  }
10215
10019
  var BRAND_PRIMARY3 = getSemanticColors("dark")["brand-primary"];
10216
- var INPUT_CLASSNAME = "bg-surface-raised border-border-strong text-text-primary";
10020
+ var INPUT_CLASSNAME = "bg-surface-raised border-hairline-strong text-text-primary";
10217
10021
  var inputStyle = {
10218
10022
  fontSize: 14,
10219
10023
  fontWeight: "600",
@@ -10246,7 +10050,7 @@ function InputBar({
10246
10050
  style: {
10247
10051
  width: "100%",
10248
10052
  borderTopWidth: 1,
10249
- borderTopColor: resolveColor("border-default"),
10053
+ borderTopColor: resolveColor("hairline-default"),
10250
10054
  paddingTop: 10,
10251
10055
  paddingHorizontal: 16,
10252
10056
  paddingBottom: 12,
@@ -10509,7 +10313,7 @@ function RestTimer({
10509
10313
  style: {
10510
10314
  width: "100%",
10511
10315
  borderTopWidth: 1,
10512
- borderTopColor: resolveColor("border-default"),
10316
+ borderTopColor: resolveColor("hairline-default"),
10513
10317
  paddingVertical: 12,
10514
10318
  paddingHorizontal: 16
10515
10319
  },
@@ -10578,7 +10382,7 @@ function RestTimer({
10578
10382
  /* @__PURE__ */ jsx(
10579
10383
  View,
10580
10384
  {
10581
- className: "bg-border",
10385
+ className: "bg-hairline",
10582
10386
  style: {
10583
10387
  height: 3,
10584
10388
  borderRadius: 2,
@@ -10839,7 +10643,7 @@ var SET_STRIP_ZONES = {
10839
10643
  fast: primitiveRamps.amber[300],
10840
10644
  fastest: primitiveRamps.green[300]
10841
10645
  };
10842
- var TODO_COLOR = primitiveColors.charcoal[300];
10646
+ var TODO_COLOR = greyRamp[900];
10843
10647
  var SET_STRIP_VARIABLE_COLOR = primitiveRamps.cyan[900];
10844
10648
  var NOTCH_GAP = 2;
10845
10649
  var CLUSTER_GAP = 3;
@@ -11289,7 +11093,7 @@ function CollapsedCard({
11289
11093
  );
11290
11094
  }
11291
11095
  var DARK2 = getSemanticColors("dark");
11292
- var BODY_DIVIDER = DARK2["border-subtle"];
11096
+ var BODY_DIVIDER = DARK2["hairline-subtle"];
11293
11097
  function deriveHeaderSetStates(sets) {
11294
11098
  return sets.map((set) => {
11295
11099
  switch (set.state) {
@@ -11323,7 +11127,7 @@ function ExpandedCard({
11323
11127
  return /* @__PURE__ */ jsxs(
11324
11128
  View,
11325
11129
  {
11326
- className: "bg-surface-elevated border-border",
11130
+ className: "bg-surface-elevated border-hairline",
11327
11131
  style: {
11328
11132
  borderWidth: 1,
11329
11133
  ...borderRadius,
@@ -11555,7 +11359,8 @@ function SessionHeader({
11555
11359
  }
11556
11360
  );
11557
11361
  }
11558
- var DIVIDER = primitiveColors.charcoal[300];
11362
+ var SEMANTIC2 = getSemanticColors("dark");
11363
+ var DIVIDER = greyRamp[875];
11559
11364
  var DEFAULT_WIDTH = 246;
11560
11365
  function SessionRail({
11561
11366
  title,
@@ -11599,8 +11404,8 @@ function SessionRail({
11599
11404
  /* @__PURE__ */ jsx(
11600
11405
  Surface,
11601
11406
  {
11602
- level: "elevated",
11603
- style: [{ flex: 1 }, neumorphicShadows.charcoal.pressed.subtle],
11407
+ level: "base",
11408
+ style: [{ flex: 1 }, insetWell(SEMANTIC2["surface-base"])],
11604
11409
  testID: "session-rail-list",
11605
11410
  children: exercises.map((ex, i) => /* @__PURE__ */ jsx(
11606
11411
  View,
@@ -11913,11 +11718,12 @@ function WeekRow({
11913
11718
  }
11914
11719
  );
11915
11720
  }
11721
+ var HAIRLINE_DEFAULT2 = getSemanticColors("dark")["hairline-default"];
11916
11722
  var t10 = getSemanticColors("dark");
11917
11723
  var COLORS = {
11918
11724
  statusSuccess: t10["status-success"],
11919
11725
  brandPrimary: t10["brand-primary"],
11920
- borderDefault: "#1F1F1F",
11726
+ borderDefault: HAIRLINE_DEFAULT2,
11921
11727
  brandPrimarySubtle: "rgba(255,121,0,0.06)"
11922
11728
  };
11923
11729
  var statusBorderColors = {
@@ -12058,10 +11864,11 @@ function WorkoutCard({
12058
11864
  }
12059
11865
  );
12060
11866
  }
11867
+ var HAIRLINE_DEFAULT3 = getSemanticColors("dark")["hairline-default"];
12061
11868
  var BRAND_PRIMARY7 = getSemanticColors("dark")["brand-primary"];
12062
11869
  var BRAND_PRIMARY_DARK = MESO_ACCENT_GRADIENT_DARK;
12063
11870
  var BRAND_PRIMARY_LIGHT = MESO_ACCENT_GRADIENT_LIGHT;
12064
- var BORDER_DEFAULT = "#1F1F1F";
11871
+ var BORDER_DEFAULT = HAIRLINE_DEFAULT3;
12065
11872
  var ACCENT_STOPS = [BRAND_PRIMARY_DARK, BRAND_PRIMARY7, BRAND_PRIMARY_LIGHT];
12066
11873
  function heatmapColor(percentage) {
12067
11874
  const clamped = Math.max(0, Math.min(100, percentage));
@@ -12217,7 +12024,7 @@ function MesoCard({
12217
12024
  var BRAND_PRIMARY8 = getSemanticColors("dark")["brand-primary"];
12218
12025
  var RECENT_BORDER = "rgba(249,180,21,0.3)";
12219
12026
  var RECENT_GLOW = "0 0 12px rgba(249,180,21,0.06)";
12220
- var BORDER_DEFAULT2 = resolveColor("border-default");
12027
+ var BORDER_DEFAULT2 = resolveColor("hairline-default");
12221
12028
  var TYPE_LABELS = {
12222
12029
  e1rm: "e1RM",
12223
12030
  weight: "Weight",
@@ -12330,7 +12137,7 @@ function PrHistoryModal({
12330
12137
  View,
12331
12138
  {
12332
12139
  accessibilityElementsHidden: true,
12333
- className: "bg-border",
12140
+ className: "bg-hairline",
12334
12141
  style: {
12335
12142
  alignSelf: "center",
12336
12143
  width: 40,
@@ -12462,7 +12269,7 @@ function EmojiSlider({ factor }) {
12462
12269
  accessibilityLabel: `${factor.label} level ${level} of 5`,
12463
12270
  "aria-checked": selected,
12464
12271
  testID: "readiness-check-emoji",
12465
- className: selected ? void 0 : "border-border bg-surface-raised",
12272
+ className: selected ? void 0 : "border-hairline bg-surface-raised",
12466
12273
  style: ({ pressed }) => ({
12467
12274
  flex: 1,
12468
12275
  alignItems: "center",
@@ -12517,7 +12324,7 @@ function WarmUpCard({ validation }) {
12517
12324
  return /* @__PURE__ */ jsxs(
12518
12325
  View,
12519
12326
  {
12520
- className: "border-border bg-surface-raised",
12327
+ className: "border-hairline bg-surface-raised",
12521
12328
  style: {
12522
12329
  marginTop: 16,
12523
12330
  padding: 12,
@@ -13052,11 +12859,11 @@ function ChartLine({
13052
12859
  dashed,
13053
12860
  testID
13054
12861
  }) {
13055
- return /* @__PURE__ */ jsx(Fragment, { children: coords.map((c, i) => {
12862
+ return /* @__PURE__ */ jsx(Fragment, { children: coords.map((c2, i) => {
13056
12863
  if (i === 0) return null;
13057
12864
  const prev = coords[i - 1];
13058
- const dx = c.x - prev.x;
13059
- const dy = c.y - prev.y;
12865
+ const dx = c2.x - prev.x;
12866
+ const dy = c2.y - prev.y;
13060
12867
  const length = Math.sqrt(dx * dx + dy * dy);
13061
12868
  const angle = Math.atan2(dy, dx) * (180 / Math.PI);
13062
12869
  return /* @__PURE__ */ jsx(
@@ -13259,21 +13066,21 @@ function StrengthTrendChart({
13259
13066
  }
13260
13067
  ),
13261
13068
  geometry.actual.map(
13262
- (c) => c.point.isPR ? /* @__PURE__ */ jsx(
13069
+ (c2) => c2.point.isPR ? /* @__PURE__ */ jsx(
13263
13070
  Text,
13264
13071
  {
13265
13072
  accessibilityElementsHidden: true,
13266
13073
  testID: "strength-trend-chart-pr-star",
13267
13074
  style: {
13268
13075
  position: "absolute",
13269
- left: c.x - 7,
13270
- top: c.y - 20,
13076
+ left: c2.x - 7,
13077
+ top: c2.y - 20,
13271
13078
  fontSize: 12,
13272
13079
  color: STATUS_WARNING3
13273
13080
  },
13274
13081
  children: "\u2605"
13275
13082
  },
13276
- `star-${c.index}`
13083
+ `star-${c2.index}`
13277
13084
  ) : null
13278
13085
  )
13279
13086
  ]
@@ -13284,29 +13091,29 @@ function StrengthTrendChart({
13284
13091
  {
13285
13092
  style: { position: "absolute", top: 0, left: 0, width, height },
13286
13093
  testID: "strength-trend-chart-points",
13287
- children: geometry.actual.map((c) => {
13288
- const label = c.point.sessionLabel ?? c.point.date;
13094
+ children: geometry.actual.map((c2) => {
13095
+ const label = c2.point.sessionLabel ?? c2.point.date;
13289
13096
  return /* @__PURE__ */ jsx(
13290
13097
  Pressable,
13291
13098
  {
13292
13099
  testID: "strength-trend-chart-point",
13293
13100
  accessibilityRole: "button",
13294
- accessibilityLabel: `${label}: ${formatValue(c.point.e1rm)} ${unit}${c.point.isPR ? ", personal record" : ""}`,
13101
+ accessibilityLabel: `${label}: ${formatValue(c2.point.e1rm)} ${unit}${c2.point.isPR ? ", personal record" : ""}`,
13295
13102
  onPress: () => {
13296
- setSelected(c.index);
13297
- onPointPress?.(c.point);
13103
+ setSelected(c2.index);
13104
+ onPointPress?.(c2.point);
13298
13105
  },
13299
13106
  style: {
13300
13107
  position: "absolute",
13301
- left: c.x - 4,
13302
- top: c.y - 4,
13108
+ left: c2.x - 4,
13109
+ top: c2.y - 4,
13303
13110
  width: 8,
13304
13111
  height: 8,
13305
13112
  borderRadius: 1,
13306
13113
  backgroundColor: BRAND_PRIMARY11
13307
13114
  }
13308
13115
  },
13309
- `point-${c.index}`
13116
+ `point-${c2.index}`
13310
13117
  );
13311
13118
  })
13312
13119
  }
@@ -13316,7 +13123,7 @@ function StrengthTrendChart({
13316
13123
  {
13317
13124
  testID: "strength-trend-chart-tooltip",
13318
13125
  accessibilityElementsHidden: true,
13319
- className: "bg-surface-elevated border-border-strong",
13126
+ className: "bg-surface-elevated border-hairline-strong",
13320
13127
  style: {
13321
13128
  position: "absolute",
13322
13129
  left: Math.max(
@@ -13843,7 +13650,7 @@ var t14 = getSemanticColors("dark");
13843
13650
  function glowShadow(color) {
13844
13651
  return `0 0 5px 1px ${alpha(color, 0.3)}, 0 0 10px 3px ${alpha(color, 0.12)}`;
13845
13652
  }
13846
- var DEFAULT_TRACK_COLOR = primitiveColors.charcoal[200];
13653
+ var DEFAULT_TRACK_COLOR = greyRamp[800];
13847
13654
  var DEFAULT_MARKER_COLOR2 = primitiveColors.white;
13848
13655
  var TICK_COLOR = t14["text-tertiary"];
13849
13656
  var ZONE_SIZES = {
@@ -14142,7 +13949,7 @@ function FatigueMeter({
14142
13949
  );
14143
13950
  }
14144
13951
  var HEAT = WORKOUT_TOKENS.heatmap;
14145
- var NEUTRAL_TRACK = primitiveColors.charcoal[200];
13952
+ var NEUTRAL_TRACK = greyRamp[800];
14146
13953
  var MONO2 = "monospace";
14147
13954
  var HEAT_BY_ZONE = {
14148
13955
  under: HEAT.under,
@@ -14339,7 +14146,7 @@ function LiveAuraFrame({
14339
14146
  borderRadius: 10,
14340
14147
  backgroundColor: t16["background-base"],
14341
14148
  borderWidth: 1,
14342
- borderColor: t16["border-default"]
14149
+ borderColor: t16["hairline-default"]
14343
14150
  },
14344
14151
  style
14345
14152
  ],
@@ -14399,32 +14206,32 @@ var STATE_LABEL = {
14399
14206
  var PHASE_AXIS_COLOR = {
14400
14207
  eccentric: primitiveRamps.magenta[800],
14401
14208
  concentric: primitiveRamps.cyan[800],
14402
- hold: primitiveColors.charcoal[100],
14403
- idle: primitiveColors.charcoal[200]
14209
+ hold: greyRamp[700],
14210
+ idle: greyRamp[800]
14404
14211
  };
14405
14212
  var PHASE_AXIS_BASE_COLOR = {
14406
14213
  eccentric: primitiveRamps.magenta[950],
14407
14214
  concentric: primitiveRamps.cyan[950],
14408
- hold: primitiveColors.charcoal[300],
14409
- idle: primitiveColors.charcoal[200]
14215
+ hold: greyRamp[900],
14216
+ idle: greyRamp[800]
14410
14217
  };
14411
14218
  var PACING_TONE = {
14412
14219
  ahead: primitiveRamps.amber[300],
14413
14220
  onPace: primitiveRamps.green[300],
14414
14221
  over: primitiveRamps.red[300]
14415
14222
  };
14416
- var SILVER = primitiveColors.neutral[300];
14223
+ var SILVER = greyRamp[200];
14417
14224
  var RED_LIGHT = primitiveRamps.red[400];
14418
14225
  var RED_MID = primitiveRamps.red[600];
14419
14226
  var RED_DEEP = primitiveRamps.red[800];
14420
14227
  var GRIND_THRESHOLD = 0.35;
14421
- var DRIFT_GREY = primitiveColors.neutral[600];
14228
+ var DRIFT_GREY = greyRamp[700];
14422
14229
  function clamp012(v) {
14423
14230
  return Math.min(1, Math.max(0, v));
14424
14231
  }
14425
14232
  function hexToRgb2(hex) {
14426
14233
  const h = hex.replace("#", "");
14427
- const f = h.length === 3 ? h.split("").map((c) => c + c).join("") : h;
14234
+ const f = h.length === 3 ? h.split("").map((c2) => c2 + c2).join("") : h;
14428
14235
  return [parseInt(f.slice(0, 2), 16), parseInt(f.slice(2, 4), 16), parseInt(f.slice(4, 6), 16)];
14429
14236
  }
14430
14237
  function mixHex2(a, b, ratio) {
@@ -14932,9 +14739,9 @@ function GhostSpark({
14932
14739
  ) }) });
14933
14740
  }
14934
14741
  const cur = curves[curves.length - 1];
14935
- const allSamples = curves.flatMap((c) => c.samples);
14742
+ const allSamples = curves.flatMap((c2) => c2.samples);
14936
14743
  const vmax = Math.max(0.01, ...allSamples.map((s) => s.velocityMps)) * 1.06;
14937
- const axisMaxT = Math.max(1, ...curves.map((c) => c.samples[c.samples.length - 1]?.tMs ?? 0)) * 1.04;
14744
+ const axisMaxT = Math.max(1, ...curves.map((c2) => c2.samples[c2.samples.length - 1]?.tMs ?? 0)) * 1.04;
14938
14745
  const bandBottom = h - padBot;
14939
14746
  const bandTop = bandBottom - BAND_H;
14940
14747
  const baseline = bandTop - BAND_GAP;
@@ -14943,7 +14750,7 @@ function GhostSpark({
14943
14750
  const mag = (v) => clamp012(v / vmax) * plotH;
14944
14751
  const lineTint = ghostLineColor(cur.tempoDeviation, cur.grindSignature);
14945
14752
  const curPts = cur.samples.map((s) => [x(s.tMs), mag(s.velocityMps)]);
14946
- const ghostPts = curves.slice(0, -1).map((c) => c.samples.map((s) => [x(s.tMs), mag(s.velocityMps)]));
14753
+ const ghostPts = curves.slice(0, -1).map((c2) => c2.samples.map((s) => [x(s.tMs), mag(s.velocityMps)]));
14947
14754
  return /* @__PURE__ */ jsx(View, { testID: "ghost-spark", style: { paddingHorizontal: 4 }, children: /* @__PURE__ */ jsxs("svg", { width: w, height: h, children: [
14948
14755
  /* @__PURE__ */ jsx(
14949
14756
  GhostBloom,
@@ -15153,7 +14960,7 @@ function mergePhaseSegments(a, b) {
15153
14960
  return out;
15154
14961
  }
15155
14962
  function lastTMs(curves) {
15156
- return Math.max(0, ...curves.map((c) => c.samples[c.samples.length - 1]?.tMs ?? 0));
14963
+ return Math.max(0, ...curves.map((c2) => c2.samples[c2.samples.length - 1]?.tMs ?? 0));
15157
14964
  }
15158
14965
  function DualGhostSpark({
15159
14966
  left,
@@ -15179,12 +14986,12 @@ function DualGhostSpark({
15179
14986
  const baseUp = bandTop - BAND_GAP;
15180
14987
  const baseDown = mid + BAND_H / 2 + BAND_GAP;
15181
14988
  const wingH = Math.max(1, Math.min(baseUp - padTop, h - padBot - baseDown));
15182
- const allSamples = [...left, ...right].flatMap((c) => c.samples);
14989
+ const allSamples = [...left, ...right].flatMap((c2) => c2.samples);
15183
14990
  const vmax = Math.max(0.01, ...allSamples.map((s) => s.velocityMps)) * 1.06;
15184
14991
  const axisMaxT = Math.max(1, lastTMs(left), lastTMs(right)) * 1.04;
15185
14992
  const x = (ms) => padL + ms / axisMaxT * (w - padL - padR);
15186
14993
  const mag = (v) => clamp012(v / vmax) * wingH;
15187
- const toPts = (c) => c.samples.map((s) => [x(s.tMs), mag(s.velocityMps)]);
14994
+ const toPts = (c2) => c2.samples.map((s) => [x(s.tMs), mag(s.velocityMps)]);
15188
14995
  const wing = (curves) => {
15189
14996
  const cur = curves[curves.length - 1];
15190
14997
  return {
@@ -15770,7 +15577,7 @@ function DeviceMenu({
15770
15577
  const availCount = devices.filter((d) => !d.slot).length;
15771
15578
  return /* @__PURE__ */ jsxs(Popover, { placement: "bottom", isOpen, onOpenChange, className, children: [
15772
15579
  /* @__PURE__ */ jsx(PopoverTrigger, { children: /* @__PURE__ */ jsx(DeviceIndicator, { status }) }),
15773
- /* @__PURE__ */ jsxs(PopoverContent, { className: "right-0 left-auto mt-[10px] w-[326px] bg-surface-elevated border border-border-strong rounded-[10px] p-[7px]", children: [
15580
+ /* @__PURE__ */ jsxs(PopoverContent, { className: "right-0 left-auto mt-[10px] w-[326px] bg-surface-elevated border border-hairline-strong rounded-[10px] p-[7px]", children: [
15774
15581
  /* @__PURE__ */ jsxs(
15775
15582
  Typography,
15776
15583
  {
@@ -15786,7 +15593,7 @@ function DeviceMenu({
15786
15593
  ]
15787
15594
  }
15788
15595
  ),
15789
- devices.map((device, i) => /* @__PURE__ */ jsx(View, { className: cn(i > 0 && "border-t border-border"), children: /* @__PURE__ */ jsx(
15596
+ devices.map((device, i) => /* @__PURE__ */ jsx(View, { className: cn(i > 0 && "border-t border-hairline"), children: /* @__PURE__ */ jsx(
15790
15597
  DeviceRow,
15791
15598
  {
15792
15599
  device,
@@ -15818,7 +15625,7 @@ function TopBar({
15818
15625
  onLayout,
15819
15626
  style: surfaceGradient.chrome(),
15820
15627
  className: cn(
15821
- "h-[46px] flex-row items-center gap-[14px] px-4 bg-surface-elevated border-b border-border",
15628
+ "h-[46px] flex-row items-center gap-[14px] px-4 bg-surface-elevated border-b border-hairline",
15822
15629
  className
15823
15630
  ),
15824
15631
  children: [
@@ -15917,7 +15724,7 @@ function SideNav({
15917
15724
  {
15918
15725
  accessibilityRole: "tablist",
15919
15726
  className: cn(
15920
- "w-[60px] items-center gap-[6px] border-r border-border bg-background-base py-3",
15727
+ "w-[60px] items-center gap-[6px] border-r border-hairline bg-background-base py-3",
15921
15728
  className
15922
15729
  ),
15923
15730
  children: items.map((item) => /* @__PURE__ */ jsx(
@@ -16057,6 +15864,6 @@ function composeValidators(...validators) {
16057
15864
  };
16058
15865
  }
16059
15866
 
16060
- export { Accordion, AccordionButton, AccordionItem, AccordionPanel, ActivityIcon, Alert, AlertDescription, AlertTitle, AlertTriangleIcon, Autocomplete, Avatar, AvatarBadge, AvatarGroup, AwardIcon, BAND_GAP, BAND_H, Badge, BadgeText, BaseBadge, BluetoothIcon, BrandLockup, BreadcrumbItem, Breadcrumbs, Button, ButtonIcon, ButtonSpinner, ButtonText, CATEGORICAL_CVD_SAFE_MAX, CapacityBandChart, Caption, Card, CardContent, CardDescription, CardFooter, CardHeader, CardSkeleton, CardTitle, Checkbox, CheckboxGroup, Chip, CircleSlashIcon, CircularProgress, CircularTimer, Collapse, CollapseButton, CollapseContent, DRIFT_GREY, DashboardShell, DataRow, DateTime, DeviationBar, DeviceIndicator, DeviceMenu, DeviceRow, Divider, Drawer, DrawerBody, DrawerFooter, DrawerHeader, DualGhostSpark, DualVelocityStrip, DumbbellIcon, EmptyState, ExerciseCard, ExerciseCardHeading, ExerciseHeading, ExerciseIndicator, FatigueLights, FatigueMeter, FormActions, FormField, FormRow, FormSection, GRIND_THRESHOLD, Gauge2 as Gauge, GhostBand, GhostBloom, GhostSpark, HStack, Heading, HelpTip, HistoryIcon, INDICATOR_PRECEDENCE, IconBox, Indicator, InfoIcon, Input, InputBar, InputGroup, IntensityBar, Label, LabelWithHelp, LayersIcon, Link, ListItem, ListItemContent, ListItemDivider, ListItemIcon, ListItemTrailing, LiveAuraFrame, LiveFatigueCard, LiveFatiguePanel, METRIC_FONT, Menu, MenuDivider, MenuGroup, MenuItem, MenuList, MenuTrigger, MesoCard, MesoProgressBar, MesoStatusCard, Metric, MetricCell, MetricGroup, MetricTiles, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalTitle, MuscleGroupChip, NavItem, Overline, PHASE_AXIS_COLOR, PRESSED_ELEVATION_LEVEL, Paragraph, PasswordInput, PersonStandingIcon, Pill, PlaceholderStrip, Popover, PopoverCloseButton, PopoverContent, PopoverTrigger, PrBadge, PrHistoryModal, Progress, ProgressSteps, RED_DEEP, RED_LIGHT, RED_MID, Radio, RadioGroup, ReadinessCheck, RestTimer, RomProgressionChart, SET_STRIP_VARIABLE_COLOR, SET_STRIP_ZONES, SILVER, STATE_LABEL, SURFACE_LEVEL_TOKEN, ScaleIcon, Scatter, ScheduleTiles, Section, SectionContent, SectionHeader, SegmentedBar, SegmentedProgressBar, Select, SessionHeader, SessionRail, SessionStatePill, SetBar, SetRow, SetStrip, SetTableHeader, SetsRepsLoad, SideNav, Sidebar, SidebarContent, SidebarDivider, SidebarFooter, SidebarHeader, SidebarItem, SidebarSection, Skeleton, SkeletonCard, SkeletonCircle, SkeletonListItem, SkeletonText, Sparkline, Spinner, Stack, StarIcon, StatusDot, StatusPill2 as StatusPill, StepContent, StepIndicator, StepLabel, Stepper, Step as StepperStep, StrengthTrendChart, SupersetWrapper, Surface, SurfaceContext, SvgIcon, Switch, TONE_COLOR, Tab, TabList, TabPanel, TabPanels, Table, TableBody, TableCell, TableHeader, TableHeaderCell, TablePagination, TableRow, Tabs, TempoDisplay, Tile, TimerReadout, Toast, ToastProvider, ToolbarButton, ToolbarButtonGroup, Tooltip, TopBar, Treemap, TrendingDownIcon, Typography, VStack, VelocityHero, VelocityStrip, VerdictHero, VoltrasMark, VolumeLandmarkBar, WeekRow, WeightBadge, WorkoutCard, WorkoutPill, ZoneTrack, alpha, applyThemePreset, audiobookPreset, auraForVerdict, backgroundFrameDark, bestTextColor, buttonSizes, calculateMeanVelocity, calculateVelocityLoss, categoricalPalette, cn, componentElevationRanges, composeValidators, createFieldId, createFlatShadow, createPressedHoverShadow, createPressedShadow, createRaisedHoverShadow, createRaisedShadow, darkThemeCSSVars, darken, defaultNavItems, defaultPreset, discreteRainbow, divergingScale, elevationSystem, formatDateTime, formatDuration, formatPrescription, formatSignedPct, formatVelocity, getBaseSurfaceColor, getCategoricalColor, getContrastText, getDiscreteRainbowColor, getElevationConfig, getElevationShadow, getElevationSurface, getFieldAriaProps, getFieldValidationProps, getGlowShadow, getHoverColors, getLuminance, getPressedRecessShadow, getResultColor, getSemanticColors, getStatusColor, getThemeCSSVars, getValidatedElevation, getVelocityZoneColor, getVelocityZoneName, ghostLineColor, gluestackConfig, hasMaxLength, hasMinLength, hexToRgb, hsvToRgb, isCssPropertyManifest, isDark, isEmpty, isValidEmail, lightThemeCSSVars, lighten, linearGradient, liveAuraColor, mergePhaseSegments, neumorphicShadows, onSurfaceColors, paceTone, paceToneColor, pressedLevel, primitiveBorderRadius, primitiveBreakpoints, primitiveColors, primitiveRamps, primitiveShadows, primitiveSpacing, primitiveTypography, primitiveZIndex, resolveColor, resolveIndicator, rgbToHex, rgbToHsv, roundRpe, roundTempo, roundWeight, rpeColor, semanticColorsDark, semanticColorsLight, semanticTypography, sequentialEffort, shadowColors, smoothPath, statusPillColor, surfaceBackground, surfaceGradient, surfaceRampDark, useOnSurfaceColor, useSurface, useSurfaceMode, useTable, useTimer, useToast, useToolbarButton, validateCssPropertyManifest, validationRules, velocityZoneColor };
15867
+ export { Accordion, AccordionButton, AccordionItem, AccordionPanel, ActivityIcon, Alert, AlertDescription, AlertTitle, AlertTriangleIcon, Autocomplete, Avatar, AvatarBadge, AvatarGroup, AwardIcon, BAND_GAP, BAND_H, Badge, BadgeText, BaseBadge, BluetoothIcon, BrandLockup, BreadcrumbItem, Breadcrumbs, Button, ButtonIcon, ButtonSpinner, ButtonText, CATEGORICAL_CVD_SAFE_MAX, CapacityBandChart, Caption, Card, CardContent, CardDescription, CardFooter, CardHeader, CardSkeleton, CardTitle, Checkbox, CheckboxGroup, Chip, CircleSlashIcon, CircularProgress, CircularTimer, Collapse, CollapseButton, CollapseContent, DRIFT_GREY, DashboardShell, DataRow, DateTime, DeviationBar, DeviceIndicator, DeviceMenu, DeviceRow, Divider, Drawer, DrawerBody, DrawerFooter, DrawerHeader, DualGhostSpark, DualVelocityStrip, DumbbellIcon, EmptyState, ExerciseCard, ExerciseCardHeading, ExerciseHeading, ExerciseIndicator, FLOATING_ELEVATION_MIN, FatigueLights, FatigueMeter, FormActions, FormField, FormRow, FormSection, GRIND_THRESHOLD, Gauge2 as Gauge, GhostBand, GhostBloom, GhostSpark, HStack, Heading, HelpTip, HistoryIcon, INDICATOR_PRECEDENCE, IconBox, Indicator, InfoIcon, Input, InputBar, InputGroup, IntensityBar, Label, LabelWithHelp, LayersIcon, Link, ListItem, ListItemContent, ListItemDivider, ListItemIcon, ListItemTrailing, LiveAuraFrame, LiveFatigueCard, LiveFatiguePanel, METRIC_FONT, Menu, MenuDivider, MenuGroup, MenuItem, MenuList, MenuTrigger, MesoCard, MesoProgressBar, MesoStatusCard, Metric, MetricCell, MetricGroup, MetricTiles, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalTitle, MuscleGroupChip, NavItem, Overline, PHASE_AXIS_COLOR, PRESSED_ELEVATION_LEVEL, Paragraph, PasswordInput, PersonStandingIcon, Pill, PlaceholderStrip, Popover, PopoverCloseButton, PopoverContent, PopoverTrigger, PrBadge, PrHistoryModal, Progress, ProgressSteps, RED_DEEP, RED_LIGHT, RED_MID, Radio, RadioGroup, ReadinessCheck, RestTimer, RomProgressionChart, SET_STRIP_VARIABLE_COLOR, SET_STRIP_ZONES, SILVER, STATE_LABEL, SURFACE_LEVEL_TOKEN, SURFACE_PLANE_STEPS, ScaleIcon, Scatter, ScheduleTiles, Section, SectionContent, SectionHeader, SegmentedBar, SegmentedProgressBar, Select, SessionHeader, SessionRail, SessionStatePill, SetBar, SetRow, SetStrip, SetTableHeader, SetsRepsLoad, SideNav, Sidebar, SidebarContent, SidebarDivider, SidebarFooter, SidebarHeader, SidebarItem, SidebarSection, Skeleton, SkeletonCard, SkeletonCircle, SkeletonListItem, SkeletonText, Sparkline, Spinner, Stack, StarIcon, StatusDot, StatusPill2 as StatusPill, StepContent, StepIndicator, StepLabel, Stepper, Step as StepperStep, StrengthTrendChart, SupersetWrapper, Surface, SurfaceContext, SvgIcon, Switch, TONE_COLOR, Tab, TabList, TabPanel, TabPanels, Table, TableBody, TableCell, TableHeader, TableHeaderCell, TablePagination, TableRow, Tabs, TempoDisplay, Tile, TimerReadout, Toast, ToastProvider, ToolbarButton, ToolbarButtonGroup, Tooltip, TopBar, Treemap, TrendingDownIcon, Typography, VStack, VelocityHero, VelocityStrip, VerdictHero, VoltrasMark, VolumeLandmarkBar, WeekRow, WeightBadge, WorkoutCard, WorkoutPill, ZoneTrack, alpha, applyThemePreset, audiobookPreset, auraForVerdict, barPaper, bestTextColor, buttonSizes, calculateMeanVelocity, calculateVelocityLoss, categoricalPalette, cn, componentElevationRanges, composeValidators, createFieldId, darkThemeCSSVars, darken, defaultNavItems, defaultPreset, discreteRainbow, divergingScale, elevationSystem, formatDateTime, formatDuration, formatPrescription, formatSignedPct, formatVelocity, getBaseSurfaceColor, getCategoricalColor, getContrastText, getDiscreteRainbowColor, getElevationConfig, getElevationShadow, getElevationSurface, getFieldAriaProps, getFieldValidationProps, getGlowShadow, getHoverColors, getLuminance, getPressedRecessShadow, getResultColor, getSemanticColors, getStatusColor, getThemeCSSVars, getValidatedElevation, getVelocityZoneColor, getVelocityZoneName, ghostLineColor, gluestackConfig, grainForTone, grainOpacityForTone, greyRamp, hasMaxLength, hasMinLength, hexToRgb, hsvToRgb, insetWell, isCssPropertyManifest, isDark, isEmpty, isValidEmail, lightThemeCSSVars, lighten, linearGradient, liveAuraColor, mergePhaseSegments, onSurfaceColors, paceTone, paceToneColor, paperSheet, pressedLevel, primitiveBorderRadius, primitiveBreakpoints, primitiveColors, primitiveRamps, primitiveSpacing, primitiveTypography, primitiveZIndex, resolveColor, resolveIndicator, rgbToHex, rgbToHsv, roundRpe, roundTempo, roundWeight, rpeColor, semanticColorsDark, semanticColorsLight, semanticTypography, sequentialEffort, smoothPath, statusPillColor, surfaceBackground, surfaceGradient, useOnSurfaceColor, useSurface, useSurfaceMode, useTable, useTimer, useToast, useToolbarButton, validateCssPropertyManifest, validationRules, velocityZoneColor };
16061
15868
  //# sourceMappingURL=index.mjs.map
16062
15869
  //# sourceMappingURL=index.mjs.map