@titan-design/react-ui 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) 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 +24 -21
  6. package/dist/index.d.ts +24 -21
  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 +409 -415
  16. package/dist/theme/index.d.ts +409 -415
  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/package.json +1 -1
  26. package/src/arch/Architecture.stories.tsx +9 -9
  27. package/src/components/custom/DateTime/DateTime.stories.tsx +1 -1
  28. package/src/components/custom/Fatigue/DualGhostSpark.stories.tsx +3 -3
  29. package/src/components/custom/Fatigue/FatigueLights.stories.tsx +2 -2
  30. package/src/components/custom/Fatigue/GhostSpark.stories.tsx +3 -3
  31. package/src/components/custom/Fatigue/LiveFatigueCard.tsx +1 -1
  32. package/src/components/custom/Fatigue/LiveFatiguePanel.stories.tsx +2 -2
  33. package/src/components/custom/Fatigue/RomProgressionChart.stories.tsx +2 -2
  34. package/src/components/custom/Fatigue/SilverRedPalette.stories.tsx +4 -4
  35. package/src/components/custom/Fatigue/VelocityHero.stories.tsx +3 -3
  36. package/src/components/custom/Fatigue/VerdictHero.stories.tsx +2 -2
  37. package/src/components/custom/Fatigue/fatigue-tokens.ts +12 -12
  38. package/src/components/custom/Sidebar/Sidebar.tsx +4 -4
  39. package/src/components/custom/Table/Table.tsx +2 -2
  40. package/src/components/custom/Workout/ActiveWorkoutPage.tsx +3 -3
  41. package/src/components/custom/Workout/BaseBadge.test.tsx +6 -1
  42. package/src/components/custom/Workout/BaseBadge.tsx +1 -1
  43. package/src/components/custom/Workout/BodyMap.tsx +2 -2
  44. package/src/components/custom/Workout/BodyMapDetailPanel.tsx +2 -2
  45. package/src/components/custom/Workout/DeviationBar.test.tsx +2 -1
  46. package/src/components/custom/Workout/DeviationBar.tsx +3 -2
  47. package/src/components/custom/Workout/ExerciseCard.test.tsx +3 -3
  48. package/src/components/custom/Workout/ExerciseCard.tsx +2 -2
  49. package/src/components/custom/Workout/ExerciseDetailPage.tsx +4 -4
  50. package/src/components/custom/Workout/InputBar.tsx +2 -2
  51. package/src/components/custom/Workout/LiveAuraFrame.stories.tsx +1 -1
  52. package/src/components/custom/Workout/LiveAuraFrame.test.tsx +1 -1
  53. package/src/components/custom/Workout/LiveAuraFrame.tsx +3 -3
  54. package/src/components/custom/Workout/MesoCard.tsx +3 -1
  55. package/src/components/custom/Workout/MuscleGroupChip.tsx +4 -3
  56. package/src/components/custom/Workout/PrHistoryModal.tsx +2 -2
  57. package/src/components/custom/Workout/ProgramPlanningPage.tsx +1 -1
  58. package/src/components/custom/Workout/ReadinessCheck.tsx +2 -2
  59. package/src/components/custom/Workout/RestTimer.tsx +2 -2
  60. package/src/components/custom/Workout/S3SetTypes.stories.tsx +3 -3
  61. package/src/components/custom/Workout/SessionHeader.stories.tsx +2 -2
  62. package/src/components/custom/Workout/SessionHeader.tsx +1 -1
  63. package/src/components/custom/Workout/SessionRail.stories.tsx +2 -2
  64. package/src/components/custom/Workout/SessionRail.tsx +13 -5
  65. package/src/components/custom/Workout/SetBar.tsx +3 -3
  66. package/src/components/custom/Workout/SetRow.test.tsx +6 -3
  67. package/src/components/custom/Workout/StatusDot.tsx +5 -4
  68. package/src/components/custom/Workout/StrengthTrendChart.tsx +1 -1
  69. package/src/components/custom/Workout/TrainingStatusPage.tsx +2 -2
  70. package/src/components/custom/Workout/VelocityStrip.test.tsx +5 -2
  71. package/src/components/custom/Workout/VelocityStrip.tsx +4 -4
  72. package/src/components/custom/Workout/VolumeLandmarkBar.tsx +3 -3
  73. package/src/components/custom/Workout/WeightBadge.test.tsx +6 -1
  74. package/src/components/custom/Workout/WeightBadge.tsx +2 -1
  75. package/src/components/custom/Workout/WorkoutCard.tsx +3 -1
  76. package/src/components/custom/Workout/WorkoutPill.tsx +5 -2
  77. package/src/components/custom/Workout/ZoneTrack.tsx +4 -4
  78. package/src/components/custom/Workout/setHeadingKit.tsx +14 -8
  79. package/src/components/custom/Workout/velocity-story-kit.tsx +2 -2
  80. package/src/components/custom/charts/SetBarChart.tsx +3 -3
  81. package/src/components/custom/stepper/Stepper.stories.tsx +1 -1
  82. package/src/components/custom/stepper/Stepper.tsx +3 -3
  83. package/src/components/shell/DeviceMenu.tsx +2 -2
  84. package/src/components/shell/SideNav.tsx +1 -1
  85. package/src/components/shell/TopBar.tsx +1 -1
  86. package/src/components/ui/autocomplete/Autocomplete.stories.tsx +1 -1
  87. package/src/components/ui/autocomplete/Autocomplete.tsx +1 -1
  88. package/src/components/ui/avatar/Avatar.tsx +2 -2
  89. package/src/components/ui/badge/Badge.tsx +2 -2
  90. package/src/components/ui/card/Card.tsx +3 -3
  91. package/src/components/ui/checkbox/Checkbox.tsx +1 -1
  92. package/src/components/ui/collapse/Collapse.tsx +1 -1
  93. package/src/components/ui/data-row/DataRow.stories.tsx +1 -1
  94. package/src/components/ui/drawer/Drawer.tsx +3 -3
  95. package/src/components/ui/form-field/FormField.tsx +1 -1
  96. package/src/components/ui/help-tip/HelpTip.tsx +1 -1
  97. package/src/components/ui/menu/Menu.tsx +2 -2
  98. package/src/components/ui/pill/Pill.tsx +2 -2
  99. package/src/components/ui/popover/Popover.stories.tsx +2 -2
  100. package/src/components/ui/popover/Popover.tsx +1 -1
  101. package/src/components/ui/progress/Progress.tsx +3 -3
  102. package/src/components/ui/radio/Radio.stories.tsx +1 -1
  103. package/src/components/ui/radio/Radio.tsx +4 -4
  104. package/src/components/ui/select/Select.tsx +3 -3
  105. package/src/components/ui/surface/Surface.stories.tsx +3 -3
  106. package/src/components/ui/surface/Surface.test.tsx +32 -19
  107. package/src/components/ui/surface/Surface.tsx +3 -3
  108. package/src/components/ui/surface/SurfaceContext.ts +19 -29
  109. package/src/components/ui/surface/surface.contract.test.ts +57 -44
  110. package/src/components/ui/switch/Switch.tsx +1 -1
  111. package/src/components/ui/tabs/Tabs.tsx +2 -2
  112. package/src/components/ui/toolbar-button/ToolbarButton.stories.tsx +5 -5
  113. package/src/components/ui/toolbar-button/ToolbarButton.test.tsx +1 -1
  114. package/src/components/ui/toolbar-button/ToolbarButton.tsx +36 -22
  115. package/src/stories/PresetShowcase.stories.tsx +21 -21
  116. package/src/theme/ColorPalettes.stories.tsx +41 -38
  117. package/src/theme/ColorPrimitives.stories.tsx +89 -41
  118. package/src/theme/Depth.stories.tsx +312 -0
  119. package/src/theme/DepthCalibration.stories.tsx +655 -0
  120. package/src/theme/ThemeProvider.tsx +1 -1
  121. package/src/theme/barrel.ts +7 -14
  122. package/src/theme/color-stories.coverage.test.ts +15 -20
  123. package/src/theme/color-story-kit.tsx +1 -1
  124. package/src/theme/color-utils.ts +197 -0
  125. package/src/theme/config.ts +0 -8
  126. package/src/theme/depth-calibration.test.tsx +97 -0
  127. package/src/theme/elevation.test.ts +62 -1
  128. package/src/theme/elevation.ts +34 -8
  129. package/src/theme/global.css +47 -53
  130. package/src/theme/grey-ramp.test.ts +166 -0
  131. package/src/theme/materials.test.ts +106 -0
  132. package/src/theme/materials.ts +211 -0
  133. package/src/theme/presets/audiobook.ts +4 -4
  134. package/src/theme/presets/types.ts +3 -3
  135. package/src/theme/semantic-contrast.test.ts +83 -0
  136. package/src/theme/tokens/primitives.ts +62 -115
  137. package/src/theme/tokens/semantic.ts +130 -82
  138. package/src/utils/colors.ts +1 -1
  139. package/tailwind.config.js +2 -5
  140. package/src/theme/bar-paper.ts +0 -59
  141. package/src/theme/shadows.stories.tsx +0 -523
  142. package/src/theme/shadows.ts +0 -439
@@ -18,6 +18,32 @@ import { ViewStyle, ViewProps } from 'react-native';
18
18
  * - border-* : Border colors
19
19
  * - interactive-* : Hover/focus/active/disabled states
20
20
  */
21
+ /**
22
+ * GREY MAPPING (TD-07.14) — how the old cool scales resolved onto `greyRamp`.
23
+ *
24
+ * Every grey below came off `grey` (pure R=G=B) or `neutral` (cool, R−B
25
+ * down to −26). They were snapped by NEAREST L*, not by matching step numbers,
26
+ * because the two old scales were numbered incompatibly: `grey` ran
27
+ * INVERTED and compressed (0 = #6E6E6E lightest, 900 = #101010 darkest), so
28
+ * `grey[400]` and `greyRamp[400]` have nothing to do with each other.
29
+ *
30
+ * grey 200→800 300→900 400→925 500→950
31
+ * neutral 50→50 100→100 300→200 400→400 500→600 600→700 900→950
32
+ *
33
+ * Surfaces move ΔE 1.9–4.8 — at or near imperceptible. The TEXT roles move
34
+ * further (8.6–12.8), and that is the intended part of the change: they are
35
+ * picking up the warmth the surfaces already had.
36
+ *
37
+ * Light gets its own column because strict L*-nearest collapsed `neutral[50]`
38
+ * and `[100]` onto one step, flattening surface-elevated into surface-raised.
39
+ * Light is still deferred as a design question — there is no `surfaceRampLight`.
40
+ *
41
+ * `border-default`, `-subtle` and `-strong` are GONE, replaced by `hairline-*`.
42
+ * Once the planes became ramp steps, every value dark enough to read as a
43
+ * border was also a plane's fill. Alpha composites instead of colliding.
44
+ *
45
+ * `text-tertiary` on dark is the one role that ignores L*-nearest; see it.
46
+ */
21
47
  declare const semanticColorsLight: {
22
48
  readonly 'brand-primary': "#FF7900";
23
49
  readonly 'brand-primary-light': "#FFA063";
@@ -43,9 +69,9 @@ declare const semanticColorsLight: {
43
69
  readonly 'status-error-light': "#E05254";
44
70
  readonly 'status-error-dark': "#A4221C";
45
71
  readonly 'status-error-subtle': "#FFF4F4";
46
- readonly 'status-error-vivid': "#FF4757";
47
- readonly 'status-error-vivid-light': "#FF6070";
48
- readonly 'status-error-vivid-dark': "#C42539";
72
+ readonly 'status-error-vivid': "#D14343";
73
+ readonly 'status-error-vivid-light': "#E05254";
74
+ readonly 'status-error-vivid-dark': "#A4221C";
49
75
  readonly 'status-error-vivid-subtle': "rgba(255, 71, 87, 0.12)";
50
76
  readonly 'status-warning': "#F9B415";
51
77
  readonly 'status-warning-light': "#FFD352";
@@ -67,7 +93,7 @@ declare const semanticColorsLight: {
67
93
  readonly 'result-degrade-dark': "#b30000";
68
94
  readonly 'result-inconclusive': "#9E9A97";
69
95
  readonly 'result-inconclusive-light': "rgba(158, 154, 151, 0.12)";
70
- readonly 'result-neutral': "#6B7280";
96
+ readonly 'result-neutral': "#72716F";
71
97
  readonly 'on-result-improve': "#FFFFFF";
72
98
  readonly 'on-result-degrade': "#FFFFFF";
73
99
  readonly 'on-result-inconclusive': "#FFFFFF";
@@ -83,29 +109,25 @@ declare const semanticColorsLight: {
83
109
  readonly 'data-10': "#EE8026";
84
110
  readonly 'text-primary': "#121828";
85
111
  readonly 'text-secondary': "#65748B";
86
- readonly 'text-tertiary': "#9CA3AF";
112
+ readonly 'text-tertiary': "#A29F9D";
87
113
  readonly 'text-disabled': "rgba(55, 65, 81, 0.48)";
88
114
  readonly 'text-inverse': "#FFFFFF";
89
- readonly 'text-link': "#5048E5";
90
- readonly 'text-link-hover': "#3832A0";
115
+ readonly 'text-link': "#1072CB";
116
+ readonly 'text-link-hover': "#135AA8";
91
117
  readonly 'surface-base': "#FFFFFF";
92
- readonly 'surface-elevated': "#FAFAFA";
93
- readonly 'surface-raised': "#F3F4F6";
118
+ readonly 'surface-elevated': "#F9F6F3";
119
+ readonly 'surface-raised': "#EDEAE7";
94
120
  readonly 'surface-overlay': "#FFFFFF";
95
- readonly 'surface-input': "#FAFAFA";
96
- readonly 'surface-inset': "#D1D5DB";
121
+ readonly 'surface-input': "#F9F6F3";
97
122
  readonly 'background-base': "#EBEBEB";
98
123
  readonly 'background-default': "#FFFFFF";
99
- readonly 'background-subtle': "#FAFAFA";
100
- readonly 'background-frame': "#9CA3AF";
101
- readonly 'border-default': "#E8E9EB";
102
- readonly 'border-subtle': "#F3F4F6";
103
- readonly 'border-strong': "#D1D5DB";
104
- readonly 'border-prominent': "#9CA3AF";
105
- readonly 'border-focus': "#5048E5";
106
- readonly 'border-input': "#D1D5DB";
107
- readonly 'border-input-hover': "#9CA3AF";
108
- readonly 'border-input-focus': "#5048E5";
124
+ readonly 'background-subtle': "#F9F6F3";
125
+ readonly 'background-frame': "#A29F9D";
126
+ readonly 'border-prominent': "#A29F9D";
127
+ readonly 'border-focus': "#1072CB";
128
+ readonly 'border-input': "#D4D1CE";
129
+ readonly 'border-input-hover': "#A29F9D";
130
+ readonly 'border-input-focus': "#1072CB";
109
131
  readonly 'border-input-error': "#D14343";
110
132
  readonly 'hairline-subtle': "rgba(0, 0, 0, 0.06)";
111
133
  readonly 'hairline-default': "rgba(0, 0, 0, 0.09)";
@@ -117,7 +139,7 @@ declare const semanticColorsLight: {
117
139
  readonly 'interactive-disabled': "rgba(55, 65, 81, 0.12)";
118
140
  readonly 'interactive-disabled-text': "rgba(55, 65, 81, 0.26)";
119
141
  readonly divider: "#E8E9EB";
120
- readonly 'avatar-background': "#6B7280";
142
+ readonly 'avatar-background': "#72716F";
121
143
  readonly 'avatar-text': "#FFFFFF";
122
144
  };
123
145
  declare const semanticColorsDark: {
@@ -145,9 +167,9 @@ declare const semanticColorsDark: {
145
167
  readonly 'status-error-light': "#E05254";
146
168
  readonly 'status-error-dark': "#A4221C";
147
169
  readonly 'status-error-subtle': "rgba(209, 67, 67, 0.12)";
148
- readonly 'status-error-vivid': "#FF4757";
149
- readonly 'status-error-vivid-light': "#FF6070";
150
- readonly 'status-error-vivid-dark': "#C42539";
170
+ readonly 'status-error-vivid': "#D14343";
171
+ readonly 'status-error-vivid-light': "#E05254";
172
+ readonly 'status-error-vivid-dark': "#A4221C";
151
173
  readonly 'status-error-vivid-subtle': "rgba(255, 71, 87, 0.12)";
152
174
  readonly 'status-warning': "#F9B415";
153
175
  readonly 'status-warning-light': "#FFD352";
@@ -169,7 +191,7 @@ declare const semanticColorsDark: {
169
191
  readonly 'result-degrade-dark': "#b30000";
170
192
  readonly 'result-inconclusive': "#9E9A97";
171
193
  readonly 'result-inconclusive-light': "rgba(158, 154, 151, 0.16)";
172
- readonly 'result-neutral': "#9CA3AF";
194
+ readonly 'result-neutral': "#A29F9D";
173
195
  readonly 'on-result-improve': "#FFFFFF";
174
196
  readonly 'on-result-degrade': "#FFFFFF";
175
197
  readonly 'on-result-inconclusive': "#FFFFFF";
@@ -183,43 +205,39 @@ declare const semanticColorsDark: {
183
205
  readonly 'data-8': "#90C987";
184
206
  readonly 'data-9': "#CAACCB";
185
207
  readonly 'data-10': "#EE8026";
186
- readonly 'text-primary': "#F3F4F6";
187
- readonly 'text-secondary': "#9CA3AF";
188
- readonly 'text-tertiary': "#6B7280";
208
+ readonly 'text-primary': "#F9F6F3";
209
+ readonly 'text-secondary': "#A29F9D";
210
+ readonly 'text-tertiary': "#888684";
189
211
  readonly 'text-disabled': "rgba(255, 255, 255, 0.38)";
190
- readonly 'text-inverse': "#111827";
212
+ readonly 'text-inverse': "#1C1916";
191
213
  readonly 'text-link': "#828DF8";
192
- readonly 'text-link-hover': "#60A5FA";
214
+ readonly 'text-link-hover': "#3CA8FF";
193
215
  readonly 'surface-base': "#252321";
194
216
  readonly 'surface-elevated': "#2C2A28";
195
217
  readonly 'surface-raised': "#31302F";
196
218
  readonly 'surface-overlay': "#373635";
197
219
  readonly 'surface-input': "#2C2A28";
198
- readonly 'surface-inset': "#13100D";
199
220
  readonly 'background-base': "#1C1916";
200
221
  readonly 'background-default': "#252321";
201
222
  readonly 'background-subtle': "#2C2A28";
202
223
  readonly 'background-frame': "#100D0A";
203
- readonly 'border-default': "#1F1F1F";
204
- readonly 'border-subtle': "#1C1C1C";
205
- readonly 'border-strong': "#2C2C2C";
206
- readonly 'border-prominent': "#3C3C3C";
224
+ readonly 'border-prominent': "#424140";
207
225
  readonly 'border-focus': "#828DF8";
208
- readonly 'border-input': "#4B5563";
209
- readonly 'border-input-hover': "#6B7280";
226
+ readonly 'border-input': "#5A5958";
227
+ readonly 'border-input-hover': "#72716F";
210
228
  readonly 'border-input-focus': "#828DF8";
211
- readonly 'border-input-error': "#EF4444";
212
- readonly 'hairline-subtle': "rgba(255, 255, 255, 0.06)";
213
- readonly 'hairline-default': "rgba(255, 255, 255, 0.09)";
214
- readonly 'hairline-strong': "rgba(255, 255, 255, 0.14)";
229
+ readonly 'border-input-error': "#E05254";
230
+ readonly 'hairline-subtle': "rgba(255, 255, 255, 0.10)";
231
+ readonly 'hairline-default': "rgba(255, 255, 255, 0.15)";
232
+ readonly 'hairline-strong': "rgba(255, 255, 255, 0.22)";
215
233
  readonly 'interactive-hover': "rgba(255, 255, 255, 0.04)";
216
234
  readonly 'interactive-focus': "rgba(255, 255, 255, 0.12)";
217
235
  readonly 'interactive-active': "rgba(255, 255, 255, 0.16)";
218
236
  readonly 'interactive-selected': "rgba(255, 255, 255, 0.08)";
219
237
  readonly 'interactive-disabled': "rgba(255, 255, 255, 0.12)";
220
238
  readonly 'interactive-disabled-text': "rgba(255, 255, 255, 0.26)";
221
- readonly divider: "#1F1F1F";
222
- readonly 'avatar-background': "#4B5563";
239
+ readonly divider: "rgba(255, 255, 255, 0.09)";
240
+ readonly 'avatar-background': "#5A5958";
223
241
  readonly 'avatar-text': "#FFFFFF";
224
242
  };
225
243
  declare const semanticTypography: {
@@ -347,9 +365,9 @@ declare function getSemanticColors(mode: ThemeMode): {
347
365
  readonly 'status-error-light': "#E05254";
348
366
  readonly 'status-error-dark': "#A4221C";
349
367
  readonly 'status-error-subtle': "#FFF4F4";
350
- readonly 'status-error-vivid': "#FF4757";
351
- readonly 'status-error-vivid-light': "#FF6070";
352
- readonly 'status-error-vivid-dark': "#C42539";
368
+ readonly 'status-error-vivid': "#D14343";
369
+ readonly 'status-error-vivid-light': "#E05254";
370
+ readonly 'status-error-vivid-dark': "#A4221C";
353
371
  readonly 'status-error-vivid-subtle': "rgba(255, 71, 87, 0.12)";
354
372
  readonly 'status-warning': "#F9B415";
355
373
  readonly 'status-warning-light': "#FFD352";
@@ -371,7 +389,7 @@ declare function getSemanticColors(mode: ThemeMode): {
371
389
  readonly 'result-degrade-dark': "#b30000";
372
390
  readonly 'result-inconclusive': "#9E9A97";
373
391
  readonly 'result-inconclusive-light': "rgba(158, 154, 151, 0.12)";
374
- readonly 'result-neutral': "#6B7280";
392
+ readonly 'result-neutral': "#72716F";
375
393
  readonly 'on-result-improve': "#FFFFFF";
376
394
  readonly 'on-result-degrade': "#FFFFFF";
377
395
  readonly 'on-result-inconclusive': "#FFFFFF";
@@ -387,29 +405,25 @@ declare function getSemanticColors(mode: ThemeMode): {
387
405
  readonly 'data-10': "#EE8026";
388
406
  readonly 'text-primary': "#121828";
389
407
  readonly 'text-secondary': "#65748B";
390
- readonly 'text-tertiary': "#9CA3AF";
408
+ readonly 'text-tertiary': "#A29F9D";
391
409
  readonly 'text-disabled': "rgba(55, 65, 81, 0.48)";
392
410
  readonly 'text-inverse': "#FFFFFF";
393
- readonly 'text-link': "#5048E5";
394
- readonly 'text-link-hover': "#3832A0";
411
+ readonly 'text-link': "#1072CB";
412
+ readonly 'text-link-hover': "#135AA8";
395
413
  readonly 'surface-base': "#FFFFFF";
396
- readonly 'surface-elevated': "#FAFAFA";
397
- readonly 'surface-raised': "#F3F4F6";
414
+ readonly 'surface-elevated': "#F9F6F3";
415
+ readonly 'surface-raised': "#EDEAE7";
398
416
  readonly 'surface-overlay': "#FFFFFF";
399
- readonly 'surface-input': "#FAFAFA";
400
- readonly 'surface-inset': "#D1D5DB";
417
+ readonly 'surface-input': "#F9F6F3";
401
418
  readonly 'background-base': "#EBEBEB";
402
419
  readonly 'background-default': "#FFFFFF";
403
- readonly 'background-subtle': "#FAFAFA";
404
- readonly 'background-frame': "#9CA3AF";
405
- readonly 'border-default': "#E8E9EB";
406
- readonly 'border-subtle': "#F3F4F6";
407
- readonly 'border-strong': "#D1D5DB";
408
- readonly 'border-prominent': "#9CA3AF";
409
- readonly 'border-focus': "#5048E5";
410
- readonly 'border-input': "#D1D5DB";
411
- readonly 'border-input-hover': "#9CA3AF";
412
- readonly 'border-input-focus': "#5048E5";
420
+ readonly 'background-subtle': "#F9F6F3";
421
+ readonly 'background-frame': "#A29F9D";
422
+ readonly 'border-prominent': "#A29F9D";
423
+ readonly 'border-focus': "#1072CB";
424
+ readonly 'border-input': "#D4D1CE";
425
+ readonly 'border-input-hover': "#A29F9D";
426
+ readonly 'border-input-focus': "#1072CB";
413
427
  readonly 'border-input-error': "#D14343";
414
428
  readonly 'hairline-subtle': "rgba(0, 0, 0, 0.06)";
415
429
  readonly 'hairline-default': "rgba(0, 0, 0, 0.09)";
@@ -421,7 +435,7 @@ declare function getSemanticColors(mode: ThemeMode): {
421
435
  readonly 'interactive-disabled': "rgba(55, 65, 81, 0.12)";
422
436
  readonly 'interactive-disabled-text': "rgba(55, 65, 81, 0.26)";
423
437
  readonly divider: "#E8E9EB";
424
- readonly 'avatar-background': "#6B7280";
438
+ readonly 'avatar-background': "#72716F";
425
439
  readonly 'avatar-text': "#FFFFFF";
426
440
  } | {
427
441
  readonly 'brand-primary': "#FF7900";
@@ -448,9 +462,9 @@ declare function getSemanticColors(mode: ThemeMode): {
448
462
  readonly 'status-error-light': "#E05254";
449
463
  readonly 'status-error-dark': "#A4221C";
450
464
  readonly 'status-error-subtle': "rgba(209, 67, 67, 0.12)";
451
- readonly 'status-error-vivid': "#FF4757";
452
- readonly 'status-error-vivid-light': "#FF6070";
453
- readonly 'status-error-vivid-dark': "#C42539";
465
+ readonly 'status-error-vivid': "#D14343";
466
+ readonly 'status-error-vivid-light': "#E05254";
467
+ readonly 'status-error-vivid-dark': "#A4221C";
454
468
  readonly 'status-error-vivid-subtle': "rgba(255, 71, 87, 0.12)";
455
469
  readonly 'status-warning': "#F9B415";
456
470
  readonly 'status-warning-light': "#FFD352";
@@ -472,7 +486,7 @@ declare function getSemanticColors(mode: ThemeMode): {
472
486
  readonly 'result-degrade-dark': "#b30000";
473
487
  readonly 'result-inconclusive': "#9E9A97";
474
488
  readonly 'result-inconclusive-light': "rgba(158, 154, 151, 0.16)";
475
- readonly 'result-neutral': "#9CA3AF";
489
+ readonly 'result-neutral': "#A29F9D";
476
490
  readonly 'on-result-improve': "#FFFFFF";
477
491
  readonly 'on-result-degrade': "#FFFFFF";
478
492
  readonly 'on-result-inconclusive': "#FFFFFF";
@@ -486,43 +500,39 @@ declare function getSemanticColors(mode: ThemeMode): {
486
500
  readonly 'data-8': "#90C987";
487
501
  readonly 'data-9': "#CAACCB";
488
502
  readonly 'data-10': "#EE8026";
489
- readonly 'text-primary': "#F3F4F6";
490
- readonly 'text-secondary': "#9CA3AF";
491
- readonly 'text-tertiary': "#6B7280";
503
+ readonly 'text-primary': "#F9F6F3";
504
+ readonly 'text-secondary': "#A29F9D";
505
+ readonly 'text-tertiary': "#888684";
492
506
  readonly 'text-disabled': "rgba(255, 255, 255, 0.38)";
493
- readonly 'text-inverse': "#111827";
507
+ readonly 'text-inverse': "#1C1916";
494
508
  readonly 'text-link': "#828DF8";
495
- readonly 'text-link-hover': "#60A5FA";
509
+ readonly 'text-link-hover': "#3CA8FF";
496
510
  readonly 'surface-base': "#252321";
497
511
  readonly 'surface-elevated': "#2C2A28";
498
512
  readonly 'surface-raised': "#31302F";
499
513
  readonly 'surface-overlay': "#373635";
500
514
  readonly 'surface-input': "#2C2A28";
501
- readonly 'surface-inset': "#13100D";
502
515
  readonly 'background-base': "#1C1916";
503
516
  readonly 'background-default': "#252321";
504
517
  readonly 'background-subtle': "#2C2A28";
505
518
  readonly 'background-frame': "#100D0A";
506
- readonly 'border-default': "#1F1F1F";
507
- readonly 'border-subtle': "#1C1C1C";
508
- readonly 'border-strong': "#2C2C2C";
509
- readonly 'border-prominent': "#3C3C3C";
519
+ readonly 'border-prominent': "#424140";
510
520
  readonly 'border-focus': "#828DF8";
511
- readonly 'border-input': "#4B5563";
512
- readonly 'border-input-hover': "#6B7280";
521
+ readonly 'border-input': "#5A5958";
522
+ readonly 'border-input-hover': "#72716F";
513
523
  readonly 'border-input-focus': "#828DF8";
514
- readonly 'border-input-error': "#EF4444";
515
- readonly 'hairline-subtle': "rgba(255, 255, 255, 0.06)";
516
- readonly 'hairline-default': "rgba(255, 255, 255, 0.09)";
517
- readonly 'hairline-strong': "rgba(255, 255, 255, 0.14)";
524
+ readonly 'border-input-error': "#E05254";
525
+ readonly 'hairline-subtle': "rgba(255, 255, 255, 0.10)";
526
+ readonly 'hairline-default': "rgba(255, 255, 255, 0.15)";
527
+ readonly 'hairline-strong': "rgba(255, 255, 255, 0.22)";
518
528
  readonly 'interactive-hover': "rgba(255, 255, 255, 0.04)";
519
529
  readonly 'interactive-focus': "rgba(255, 255, 255, 0.12)";
520
530
  readonly 'interactive-active': "rgba(255, 255, 255, 0.16)";
521
531
  readonly 'interactive-selected': "rgba(255, 255, 255, 0.08)";
522
532
  readonly 'interactive-disabled': "rgba(255, 255, 255, 0.12)";
523
533
  readonly 'interactive-disabled-text': "rgba(255, 255, 255, 0.26)";
524
- readonly divider: "#1F1F1F";
525
- readonly 'avatar-background': "#4B5563";
534
+ readonly divider: "rgba(255, 255, 255, 0.09)";
535
+ readonly 'avatar-background': "#5A5958";
526
536
  readonly 'avatar-text': "#FFFFFF";
527
537
  };
528
538
 
@@ -587,6 +597,20 @@ declare function getElevationSurface(baseColor: string, level: ElevationLevel, t
587
597
  * @param isHovered - Whether element is hovered
588
598
  * @returns ViewStyle with shadow properties
589
599
  */
600
+ /**
601
+ * The lowest elevation that still casts an outward shadow.
602
+ *
603
+ * On a near-black surface a drop-shadow is inert: at levels 1-3 the shadow is
604
+ * dark-on-dark and contributes nothing a viewer can see, while still costing a
605
+ * composite layer. Material dropped shadow-as-hierarchy for the same reason.
606
+ * Inline hierarchy is the hairline's job (`hairline-*`), which composites by a
607
+ * constant amount over any plane.
608
+ *
609
+ * At 4+ the element is genuinely FLOATING over a backdrop — menu, popover,
610
+ * toast — where a large soft shadow describes separation from the page rather
611
+ * than a rank in a stack. Those should also carry a hairline ring.
612
+ */
613
+ declare const FLOATING_ELEVATION_MIN: ElevationLevel;
590
614
  declare function getElevationShadow(baseColor: string, level: ElevationLevel, theme: 'light' | 'dark', isHovered?: boolean): ViewStyle;
591
615
  /**
592
616
  * Elevation level backing a `<Surface pressed>` recess: the shallow `inset`
@@ -672,111 +696,80 @@ declare function getGlowShadow(color: string, intensity?: GlowIntensity): ViewSt
672
696
  * Raw values with no semantic meaning. These are the foundation of the design system
673
697
  * and should rarely be used directly in components. Use semantic tokens instead.
674
698
  */
699
+ /**
700
+ * Absolute colour keywords.
701
+ *
702
+ * This used to hold five scales — `blue`, `red`, `redVivid`, `neutral` and
703
+ * `charcoal`. All five are gone (TD-07.14): the greys folded into `greyRamp`
704
+ * below and the chromatics into the OKLCH `primitiveRamps`. What is left has no
705
+ * scale because these three are not colours you tune, they are keywords.
706
+ */
675
707
  declare const primitiveColors: {
676
- readonly blue: {
677
- readonly 50: "#EFF6FF";
678
- readonly 100: "#DBEAFE";
679
- readonly 200: "#BFDBFE";
680
- readonly 300: "#93C5FD";
681
- readonly 400: "#60A5FA";
682
- readonly 500: "#3B82F6";
683
- readonly 600: "#5048E5";
684
- readonly 700: "#3832A0";
685
- readonly 800: "#1E40AF";
686
- readonly 900: "#1E3A8A";
687
- };
688
- readonly red: {
689
- readonly 50: "#FEF2F2";
690
- readonly 100: "#FEE2E2";
691
- readonly 200: "#FECACA";
692
- readonly 300: "#FCA5A5";
693
- readonly 400: "#DA6868";
694
- readonly 500: "#EF4444";
695
- readonly 600: "#D14343";
696
- readonly 700: "#922E2E";
697
- readonly 800: "#991B1B";
698
- readonly 900: "#7F1D1D";
699
- };
700
- readonly redVivid: {
701
- readonly 50: "#FFECEE";
702
- readonly 100: "#FFD6DB";
703
- readonly 200: "#FFB3BC";
704
- readonly 300: "#FF8593";
705
- readonly 400: "#FF6070";
706
- readonly 500: "#FF4757";
707
- readonly 600: "#E63548";
708
- readonly 700: "#C42539";
709
- readonly 800: "#9E1C2C";
710
- readonly 900: "#7A1520";
711
- };
712
- readonly neutral: {
713
- readonly 50: "#FAFAFA";
714
- readonly 100: "#F3F4F6";
715
- readonly 200: "#E5E7EB";
716
- readonly 300: "#D1D5DB";
717
- readonly 400: "#9CA3AF";
718
- readonly 500: "#6B7280";
719
- readonly 600: "#4B5563";
720
- readonly 700: "#374151";
721
- readonly 800: "#1F2937";
722
- readonly 900: "#111827";
723
- readonly 950: "#030712";
724
- };
725
- readonly charcoal: {
726
- readonly 0: "#6E6E6E";
727
- readonly 50: "#5D5D5D";
728
- readonly 100: "#4C4C4C";
729
- readonly 200: "#3C3C3C";
730
- readonly 300: "#2C2C2C";
731
- readonly 400: "#1F1F1F";
732
- readonly 500: "#1C1C1C";
733
- readonly 600: "#191919";
734
- readonly 700: "#161616";
735
- readonly 800: "#131313";
736
- readonly 900: "#101010";
737
- };
738
708
  readonly white: "#FFFFFF";
739
709
  readonly black: "#000000";
740
710
  readonly transparent: "transparent";
741
711
  };
742
712
  /**
743
- * Surface ramp dark mode (TD-surface-tokens, S-1, re-spaced S-3)
744
- *
745
- * Warm-tapered, DERIVED ramp NOT hand-picked. Shipped verbatim as the output of
746
- * `deriveSurfaceRamp(shellL=9, steps=[4.5,3.5,3,2.5], rbShadow=6, rbHilite=1.5)`
747
- * (see `packages/ui/src/components/ui/surface/surface-lab-shared.tsx` on branch
748
- * `feat/TD-unified-lab`, story `Lab/Surface Exploration -> Surface Ramp System`
749
- * that lab default is `[4.5,2.5,2,1.5]` as of this writing and should be
750
- * updated to match on that branch, follow-up, not done here).
751
- * Lightness is CIELAB L* off the shell, with DIMINISHING steps (4.5/3.5/3/2.5)
752
- * the frame->content jump is biggest, each plane above adds less, but the top
753
- * three planes (elevated/raised/overlay) were re-spaced WIDER (S-3) than the
754
- * original 2.5/2/1.5 taper so they read as distinct planes without leaning on
755
- * the hairline alone. `background`/`base`/`inset` are unchanged by the re-space.
756
- * Warmth (R-B) tapers 6 -> 1.5 from frame to hero so bright content planes stay
757
- * near-neutral.
758
- * Kept separate from the `charcoal` scale above (which several existing
759
- * components reference directly for unrelated shadow/track tints) so this
760
- * change is additive and doesn't ripple into those consumers.
761
- * See coordination/design-explorations/surface-system-north-star.md.
713
+ * Unified warm-neutral grey ramp (TD-07.14)
714
+ *
715
+ * The ONE achromatic scale. Regenerate with `scripts/generate-grey-ramp.mjs`
716
+ * preserve the generator, not just the hexes.
717
+ *
718
+ * The surface planes ARE steps here rather than a parallel object: `850` is
719
+ * overlay, `975` is the bezel. That is the whole point of the ramp. `grey`,
720
+ * `neutral`, `surfaceRampDark` and `backgroundFrameDark` all resolve into it,
721
+ * which is why every plane step below is byte-identical to the value that
722
+ * shipped in v0.10.0 the surfaces do not move, only their names.
723
+ *
724
+ * TWO THINGS ABOUT THE NUMBERING, both deliberate and both previously re-derived
725
+ * from scratch more than once because they were never written down:
726
+ *
727
+ * 1. `975` sits BELOW the standard grid. `canonL` — the median L* of the seven
728
+ * chromatic `primitiveRamps` at each step ends at L*10.3, which is step
729
+ * `950`. The bezel is L*3.8, darker than the grid's last rung, so there is
730
+ * simply no step number left for it and `975` extends past the end.
731
+ * 2. `850`/`875` are quarter-steps because overlay/raised/elevated are only
732
+ * ~2.7 L* apart and all three collide on `900` at normal resolution. `800`
733
+ * is a generated bridge between `700` (L*37.9) and overlay (L*22.7) so the
734
+ * spacing stays even across the join.
735
+ *
736
+ * There is no `inset`. It was retired, not renamed: at ΔE 1.10 from `975` it was
737
+ * an imperceptible duplicate of the frame, which is exactly why `<Surface pressed>`
738
+ * (surface − 1) kept collapsing into it. `975` is the floor.
739
+ *
740
+ * Spec, generator and the rejected v1/v2 cuts:
741
+ * coordination/design-explorations/foundations/warm-grey-ramp/
762
742
  */
763
- declare const surfaceRampDark: {
764
- readonly inset: "#13100D";
765
- readonly background: "#1C1916";
766
- readonly base: "#252321";
767
- readonly elevated: "#2C2A28";
768
- readonly raised: "#31302F";
769
- readonly overlay: "#373635";
743
+ declare const greyRamp: {
744
+ readonly 50: "#F9F6F3";
745
+ readonly 100: "#EDEAE7";
746
+ readonly 200: "#D4D1CE";
747
+ readonly 300: "#BDBAB7";
748
+ readonly 400: "#A29F9D";
749
+ readonly 500: "#888684";
750
+ readonly 600: "#72716F";
751
+ readonly 700: "#5A5958";
752
+ readonly 800: "#424140";
753
+ readonly 850: "#373635";
754
+ readonly 875: "#31302F";
755
+ readonly 900: "#2C2A28";
756
+ readonly 925: "#252321";
757
+ readonly 950: "#1C1916";
758
+ readonly 975: "#100D0A";
770
759
  };
771
760
  /**
772
- * Frame/bezel primitivedark mode (TD-surface-tokens, S-3)
761
+ * The surface planes, as ramp steps the mapping `<Surface level>` resolves through.
773
762
  *
774
- * The chrome that "exits the content ramp" entirely: the top bar + side nav
775
- * shell. Sits ONE STEP BELOW `surfaceRampDark.background` (L*9), darker even
776
- * than `surfaceRampDark.inset` (L*4.5) — it isn't a plane IN the ramp, it's
777
- * the bezel the ramp sits inside. Literal, not `deriveSurfaceRamp()` output.
763
+ * Ordered darkest -> lightest, which is the order `pressedLevel()` walks.
778
764
  */
779
- declare const backgroundFrameDark = "#100D0A";
765
+ declare const SURFACE_PLANE_STEPS: {
766
+ readonly frame: 975;
767
+ readonly background: 950;
768
+ readonly base: 925;
769
+ readonly elevated: 900;
770
+ readonly raised: 875;
771
+ readonly overlay: 850;
772
+ };
780
773
  /**
781
774
  * Derived tonal ramps (TD-05.09 color foundations)
782
775
  *
@@ -1039,16 +1032,6 @@ declare const primitiveBorderRadius: {
1039
1032
  readonly '2xl': "24px";
1040
1033
  readonly full: "9999px";
1041
1034
  };
1042
- declare const primitiveShadows: {
1043
- readonly none: "none";
1044
- readonly sm: "0px 1px 2px rgba(100, 116, 139, 0.12)";
1045
- readonly DEFAULT: "0px 1px 3px rgba(100, 116, 139, 0.12), 0px 1px 2px rgba(100, 116, 139, 0.24)";
1046
- readonly md: "0px 4px 6px rgba(100, 116, 139, 0.12)";
1047
- readonly lg: "0px 10px 15px rgba(100, 116, 139, 0.12)";
1048
- readonly xl: "0px 20px 25px rgba(100, 116, 139, 0.12)";
1049
- readonly '2xl': "0px 25px 50px rgba(100, 116, 139, 0.25)";
1050
- readonly inner: "inset 0 2px 4px 0 rgba(0, 0, 0, 0.06)";
1051
- };
1052
1035
  declare const primitiveBreakpoints: {
1053
1036
  readonly xs: 0;
1054
1037
  readonly sm: 600;
@@ -1120,29 +1103,25 @@ declare const lightThemeCSSVars: {
1120
1103
  readonly '--color-status-warning-subtle': "#FFF7DD";
1121
1104
  readonly '--color-status-info': "#2196F3";
1122
1105
  readonly '--color-status-info-subtle': "#EFF8FF";
1123
- readonly '--color-status-error-vivid': "#FF4757";
1124
- readonly '--color-status-error-vivid-light': "#FF6070";
1125
- readonly '--color-status-error-vivid-dark': "#C42539";
1106
+ readonly '--color-status-error-vivid': "#D14343";
1107
+ readonly '--color-status-error-vivid-light': "#E05254";
1108
+ readonly '--color-status-error-vivid-dark': "#A4221C";
1126
1109
  readonly '--color-status-error-vivid-subtle': "rgba(255, 71, 87, 0.12)";
1127
1110
  readonly '--color-text-primary': "#121828";
1128
1111
  readonly '--color-text-secondary': "#65748B";
1129
- readonly '--color-text-tertiary': "#9CA3AF";
1112
+ readonly '--color-text-tertiary': "#A29F9D";
1130
1113
  readonly '--color-text-disabled': "rgba(55, 65, 81, 0.48)";
1131
1114
  readonly '--color-text-inverse': "#FFFFFF";
1132
- readonly '--color-text-link': "#5048E5";
1115
+ readonly '--color-text-link': "#1072CB";
1133
1116
  readonly '--color-surface-base': "#FFFFFF";
1134
- readonly '--color-surface-elevated': "#FAFAFA";
1135
- readonly '--color-surface-raised': "#F3F4F6";
1136
- readonly '--color-surface-inset': "#D1D5DB";
1117
+ readonly '--color-surface-elevated': "#F9F6F3";
1118
+ readonly '--color-surface-raised': "#EDEAE7";
1137
1119
  readonly '--color-background-base': "#EBEBEB";
1138
1120
  readonly '--color-background-default': "#FFFFFF";
1139
- readonly '--color-background-subtle': "#FAFAFA";
1140
- readonly '--color-background-frame': "#9CA3AF";
1141
- readonly '--color-border-default': "#E8E9EB";
1142
- readonly '--color-border-subtle': "#F3F4F6";
1143
- readonly '--color-border-strong': "#D1D5DB";
1144
- readonly '--color-border-prominent': "#9CA3AF";
1145
- readonly '--color-border-focus': "#5048E5";
1121
+ readonly '--color-background-subtle': "#F9F6F3";
1122
+ readonly '--color-background-frame': "#A29F9D";
1123
+ readonly '--color-border-prominent': "#A29F9D";
1124
+ readonly '--color-border-focus': "#1072CB";
1146
1125
  readonly '--color-interactive-hover': "rgba(55, 65, 81, 0.04)";
1147
1126
  readonly '--color-interactive-focus': "rgba(55, 65, 81, 0.12)";
1148
1127
  readonly '--color-interactive-active': "rgba(55, 65, 81, 0.16)";
@@ -1173,7 +1152,7 @@ declare const lightThemeCSSVars: {
1173
1152
  readonly '--color-result-degrade-dark': "#b30000";
1174
1153
  readonly '--color-result-inconclusive': "#9E9A97";
1175
1154
  readonly '--color-result-inconclusive-light': "rgba(158, 154, 151, 0.12)";
1176
- readonly '--color-result-neutral': "#6B7280";
1155
+ readonly '--color-result-neutral': "#72716F";
1177
1156
  readonly '--color-on-result-improve': "#FFFFFF";
1178
1157
  readonly '--color-on-result-degrade': "#FFFFFF";
1179
1158
  readonly '--color-on-result-inconclusive': "#FFFFFF";
@@ -1187,18 +1166,18 @@ declare const lightThemeCSSVars: {
1187
1166
  readonly '--color-data-8': "#90C987";
1188
1167
  readonly '--color-data-9': "#CAACCB";
1189
1168
  readonly '--color-data-10': "#EE8026";
1190
- readonly '--color-text-link-hover': "#3832A0";
1169
+ readonly '--color-text-link-hover': "#135AA8";
1191
1170
  readonly '--color-surface-overlay': "#FFFFFF";
1192
- readonly '--color-surface-input': "#FAFAFA";
1193
- readonly '--color-border-input': "#D1D5DB";
1194
- readonly '--color-border-input-hover': "#9CA3AF";
1195
- readonly '--color-border-input-focus': "#5048E5";
1171
+ readonly '--color-surface-input': "#F9F6F3";
1172
+ readonly '--color-border-input': "#D4D1CE";
1173
+ readonly '--color-border-input-hover': "#A29F9D";
1174
+ readonly '--color-border-input-focus': "#1072CB";
1196
1175
  readonly '--color-border-input-error': "#D14343";
1197
1176
  readonly '--color-hairline-subtle': "rgba(0, 0, 0, 0.06)";
1198
1177
  readonly '--color-hairline-default': "rgba(0, 0, 0, 0.09)";
1199
1178
  readonly '--color-hairline-strong': "rgba(0, 0, 0, 0.14)";
1200
1179
  readonly '--color-interactive-disabled-text': "rgba(55, 65, 81, 0.26)";
1201
- readonly '--color-avatar-background': "#6B7280";
1180
+ readonly '--color-avatar-background': "#72716F";
1202
1181
  readonly '--color-avatar-text': "#FFFFFF";
1203
1182
  };
1204
1183
  declare const darkThemeCSSVars: {
@@ -1240,35 +1219,31 @@ declare const darkThemeCSSVars: {
1240
1219
  readonly '--color-status-warning-subtle': "rgba(249, 180, 21, 0.12)";
1241
1220
  readonly '--color-status-info': "#2196F3";
1242
1221
  readonly '--color-status-info-subtle': "rgba(33, 150, 243, 0.12)";
1243
- readonly '--color-status-error-vivid': "#FF4757";
1244
- readonly '--color-status-error-vivid-light': "#FF6070";
1245
- readonly '--color-status-error-vivid-dark': "#C42539";
1222
+ readonly '--color-status-error-vivid': "#D14343";
1223
+ readonly '--color-status-error-vivid-light': "#E05254";
1224
+ readonly '--color-status-error-vivid-dark': "#A4221C";
1246
1225
  readonly '--color-status-error-vivid-subtle': "rgba(255, 71, 87, 0.12)";
1247
- readonly '--color-text-primary': "#F3F4F6";
1248
- readonly '--color-text-secondary': "#9CA3AF";
1249
- readonly '--color-text-tertiary': "#6B7280";
1226
+ readonly '--color-text-primary': "#F9F6F3";
1227
+ readonly '--color-text-secondary': "#A29F9D";
1228
+ readonly '--color-text-tertiary': "#888684";
1250
1229
  readonly '--color-text-disabled': "rgba(255, 255, 255, 0.38)";
1251
- readonly '--color-text-inverse': "#111827";
1230
+ readonly '--color-text-inverse': "#1C1916";
1252
1231
  readonly '--color-text-link': "#828DF8";
1253
1232
  readonly '--color-surface-base': "#252321";
1254
1233
  readonly '--color-surface-elevated': "#2C2A28";
1255
1234
  readonly '--color-surface-raised': "#31302F";
1256
- readonly '--color-surface-inset': "#13100D";
1257
1235
  readonly '--color-background-base': "#1C1916";
1258
1236
  readonly '--color-background-default': "#252321";
1259
1237
  readonly '--color-background-subtle': "#2C2A28";
1260
1238
  readonly '--color-background-frame': "#100D0A";
1261
- readonly '--color-border-default': "#1F1F1F";
1262
- readonly '--color-border-subtle': "#1C1C1C";
1263
- readonly '--color-border-strong': "#2C2C2C";
1264
- readonly '--color-border-prominent': "#3C3C3C";
1239
+ readonly '--color-border-prominent': "#424140";
1265
1240
  readonly '--color-border-focus': "#828DF8";
1266
1241
  readonly '--color-interactive-hover': "rgba(255, 255, 255, 0.04)";
1267
1242
  readonly '--color-interactive-focus': "rgba(255, 255, 255, 0.12)";
1268
1243
  readonly '--color-interactive-active': "rgba(255, 255, 255, 0.16)";
1269
1244
  readonly '--color-interactive-selected': "rgba(255, 255, 255, 0.08)";
1270
1245
  readonly '--color-interactive-disabled': "rgba(255, 255, 255, 0.12)";
1271
- readonly '--color-divider': "#1F1F1F";
1246
+ readonly '--color-divider': "rgba(255, 255, 255, 0.09)";
1272
1247
  readonly '--color-brand-primary-hover': "#FFA063";
1273
1248
  readonly '--color-brand-primary-active': "#FFC7A2";
1274
1249
  readonly '--color-brand-secondary-hover': "#2697B7";
@@ -1293,7 +1268,7 @@ declare const darkThemeCSSVars: {
1293
1268
  readonly '--color-result-degrade-dark': "#b30000";
1294
1269
  readonly '--color-result-inconclusive': "#9E9A97";
1295
1270
  readonly '--color-result-inconclusive-light': "rgba(158, 154, 151, 0.16)";
1296
- readonly '--color-result-neutral': "#9CA3AF";
1271
+ readonly '--color-result-neutral': "#A29F9D";
1297
1272
  readonly '--color-on-result-improve': "#FFFFFF";
1298
1273
  readonly '--color-on-result-degrade': "#FFFFFF";
1299
1274
  readonly '--color-on-result-inconclusive': "#FFFFFF";
@@ -1307,18 +1282,18 @@ declare const darkThemeCSSVars: {
1307
1282
  readonly '--color-data-8': "#90C987";
1308
1283
  readonly '--color-data-9': "#CAACCB";
1309
1284
  readonly '--color-data-10': "#EE8026";
1310
- readonly '--color-text-link-hover': "#60A5FA";
1285
+ readonly '--color-text-link-hover': "#3CA8FF";
1311
1286
  readonly '--color-surface-overlay': "#373635";
1312
1287
  readonly '--color-surface-input': "#2C2A28";
1313
- readonly '--color-border-input': "#4B5563";
1314
- readonly '--color-border-input-hover': "#6B7280";
1288
+ readonly '--color-border-input': "#5A5958";
1289
+ readonly '--color-border-input-hover': "#72716F";
1315
1290
  readonly '--color-border-input-focus': "#828DF8";
1316
- readonly '--color-border-input-error': "#EF4444";
1317
- readonly '--color-hairline-subtle': "rgba(255, 255, 255, 0.06)";
1318
- readonly '--color-hairline-default': "rgba(255, 255, 255, 0.09)";
1319
- readonly '--color-hairline-strong': "rgba(255, 255, 255, 0.14)";
1291
+ readonly '--color-border-input-error': "#E05254";
1292
+ readonly '--color-hairline-subtle': "rgba(255, 255, 255, 0.10)";
1293
+ readonly '--color-hairline-default': "rgba(255, 255, 255, 0.15)";
1294
+ readonly '--color-hairline-strong': "rgba(255, 255, 255, 0.22)";
1320
1295
  readonly '--color-interactive-disabled-text': "rgba(255, 255, 255, 0.26)";
1321
- readonly '--color-avatar-background': "#4B5563";
1296
+ readonly '--color-avatar-background': "#5A5958";
1322
1297
  readonly '--color-avatar-text': "#FFFFFF";
1323
1298
  };
1324
1299
  declare function getThemeCSSVars(mode: ThemeMode): {
@@ -1360,29 +1335,25 @@ declare function getThemeCSSVars(mode: ThemeMode): {
1360
1335
  readonly '--color-status-warning-subtle': "#FFF7DD";
1361
1336
  readonly '--color-status-info': "#2196F3";
1362
1337
  readonly '--color-status-info-subtle': "#EFF8FF";
1363
- readonly '--color-status-error-vivid': "#FF4757";
1364
- readonly '--color-status-error-vivid-light': "#FF6070";
1365
- readonly '--color-status-error-vivid-dark': "#C42539";
1338
+ readonly '--color-status-error-vivid': "#D14343";
1339
+ readonly '--color-status-error-vivid-light': "#E05254";
1340
+ readonly '--color-status-error-vivid-dark': "#A4221C";
1366
1341
  readonly '--color-status-error-vivid-subtle': "rgba(255, 71, 87, 0.12)";
1367
1342
  readonly '--color-text-primary': "#121828";
1368
1343
  readonly '--color-text-secondary': "#65748B";
1369
- readonly '--color-text-tertiary': "#9CA3AF";
1344
+ readonly '--color-text-tertiary': "#A29F9D";
1370
1345
  readonly '--color-text-disabled': "rgba(55, 65, 81, 0.48)";
1371
1346
  readonly '--color-text-inverse': "#FFFFFF";
1372
- readonly '--color-text-link': "#5048E5";
1347
+ readonly '--color-text-link': "#1072CB";
1373
1348
  readonly '--color-surface-base': "#FFFFFF";
1374
- readonly '--color-surface-elevated': "#FAFAFA";
1375
- readonly '--color-surface-raised': "#F3F4F6";
1376
- readonly '--color-surface-inset': "#D1D5DB";
1349
+ readonly '--color-surface-elevated': "#F9F6F3";
1350
+ readonly '--color-surface-raised': "#EDEAE7";
1377
1351
  readonly '--color-background-base': "#EBEBEB";
1378
1352
  readonly '--color-background-default': "#FFFFFF";
1379
- readonly '--color-background-subtle': "#FAFAFA";
1380
- readonly '--color-background-frame': "#9CA3AF";
1381
- readonly '--color-border-default': "#E8E9EB";
1382
- readonly '--color-border-subtle': "#F3F4F6";
1383
- readonly '--color-border-strong': "#D1D5DB";
1384
- readonly '--color-border-prominent': "#9CA3AF";
1385
- readonly '--color-border-focus': "#5048E5";
1353
+ readonly '--color-background-subtle': "#F9F6F3";
1354
+ readonly '--color-background-frame': "#A29F9D";
1355
+ readonly '--color-border-prominent': "#A29F9D";
1356
+ readonly '--color-border-focus': "#1072CB";
1386
1357
  readonly '--color-interactive-hover': "rgba(55, 65, 81, 0.04)";
1387
1358
  readonly '--color-interactive-focus': "rgba(55, 65, 81, 0.12)";
1388
1359
  readonly '--color-interactive-active': "rgba(55, 65, 81, 0.16)";
@@ -1413,7 +1384,7 @@ declare function getThemeCSSVars(mode: ThemeMode): {
1413
1384
  readonly '--color-result-degrade-dark': "#b30000";
1414
1385
  readonly '--color-result-inconclusive': "#9E9A97";
1415
1386
  readonly '--color-result-inconclusive-light': "rgba(158, 154, 151, 0.12)";
1416
- readonly '--color-result-neutral': "#6B7280";
1387
+ readonly '--color-result-neutral': "#72716F";
1417
1388
  readonly '--color-on-result-improve': "#FFFFFF";
1418
1389
  readonly '--color-on-result-degrade': "#FFFFFF";
1419
1390
  readonly '--color-on-result-inconclusive': "#FFFFFF";
@@ -1427,18 +1398,18 @@ declare function getThemeCSSVars(mode: ThemeMode): {
1427
1398
  readonly '--color-data-8': "#90C987";
1428
1399
  readonly '--color-data-9': "#CAACCB";
1429
1400
  readonly '--color-data-10': "#EE8026";
1430
- readonly '--color-text-link-hover': "#3832A0";
1401
+ readonly '--color-text-link-hover': "#135AA8";
1431
1402
  readonly '--color-surface-overlay': "#FFFFFF";
1432
- readonly '--color-surface-input': "#FAFAFA";
1433
- readonly '--color-border-input': "#D1D5DB";
1434
- readonly '--color-border-input-hover': "#9CA3AF";
1435
- readonly '--color-border-input-focus': "#5048E5";
1403
+ readonly '--color-surface-input': "#F9F6F3";
1404
+ readonly '--color-border-input': "#D4D1CE";
1405
+ readonly '--color-border-input-hover': "#A29F9D";
1406
+ readonly '--color-border-input-focus': "#1072CB";
1436
1407
  readonly '--color-border-input-error': "#D14343";
1437
1408
  readonly '--color-hairline-subtle': "rgba(0, 0, 0, 0.06)";
1438
1409
  readonly '--color-hairline-default': "rgba(0, 0, 0, 0.09)";
1439
1410
  readonly '--color-hairline-strong': "rgba(0, 0, 0, 0.14)";
1440
1411
  readonly '--color-interactive-disabled-text': "rgba(55, 65, 81, 0.26)";
1441
- readonly '--color-avatar-background': "#6B7280";
1412
+ readonly '--color-avatar-background': "#72716F";
1442
1413
  readonly '--color-avatar-text': "#FFFFFF";
1443
1414
  } | {
1444
1415
  readonly '--color-brand-primary-rgb': "255, 121, 0";
@@ -1479,35 +1450,31 @@ declare function getThemeCSSVars(mode: ThemeMode): {
1479
1450
  readonly '--color-status-warning-subtle': "rgba(249, 180, 21, 0.12)";
1480
1451
  readonly '--color-status-info': "#2196F3";
1481
1452
  readonly '--color-status-info-subtle': "rgba(33, 150, 243, 0.12)";
1482
- readonly '--color-status-error-vivid': "#FF4757";
1483
- readonly '--color-status-error-vivid-light': "#FF6070";
1484
- readonly '--color-status-error-vivid-dark': "#C42539";
1453
+ readonly '--color-status-error-vivid': "#D14343";
1454
+ readonly '--color-status-error-vivid-light': "#E05254";
1455
+ readonly '--color-status-error-vivid-dark': "#A4221C";
1485
1456
  readonly '--color-status-error-vivid-subtle': "rgba(255, 71, 87, 0.12)";
1486
- readonly '--color-text-primary': "#F3F4F6";
1487
- readonly '--color-text-secondary': "#9CA3AF";
1488
- readonly '--color-text-tertiary': "#6B7280";
1457
+ readonly '--color-text-primary': "#F9F6F3";
1458
+ readonly '--color-text-secondary': "#A29F9D";
1459
+ readonly '--color-text-tertiary': "#888684";
1489
1460
  readonly '--color-text-disabled': "rgba(255, 255, 255, 0.38)";
1490
- readonly '--color-text-inverse': "#111827";
1461
+ readonly '--color-text-inverse': "#1C1916";
1491
1462
  readonly '--color-text-link': "#828DF8";
1492
1463
  readonly '--color-surface-base': "#252321";
1493
1464
  readonly '--color-surface-elevated': "#2C2A28";
1494
1465
  readonly '--color-surface-raised': "#31302F";
1495
- readonly '--color-surface-inset': "#13100D";
1496
1466
  readonly '--color-background-base': "#1C1916";
1497
1467
  readonly '--color-background-default': "#252321";
1498
1468
  readonly '--color-background-subtle': "#2C2A28";
1499
1469
  readonly '--color-background-frame': "#100D0A";
1500
- readonly '--color-border-default': "#1F1F1F";
1501
- readonly '--color-border-subtle': "#1C1C1C";
1502
- readonly '--color-border-strong': "#2C2C2C";
1503
- readonly '--color-border-prominent': "#3C3C3C";
1470
+ readonly '--color-border-prominent': "#424140";
1504
1471
  readonly '--color-border-focus': "#828DF8";
1505
1472
  readonly '--color-interactive-hover': "rgba(255, 255, 255, 0.04)";
1506
1473
  readonly '--color-interactive-focus': "rgba(255, 255, 255, 0.12)";
1507
1474
  readonly '--color-interactive-active': "rgba(255, 255, 255, 0.16)";
1508
1475
  readonly '--color-interactive-selected': "rgba(255, 255, 255, 0.08)";
1509
1476
  readonly '--color-interactive-disabled': "rgba(255, 255, 255, 0.12)";
1510
- readonly '--color-divider': "#1F1F1F";
1477
+ readonly '--color-divider': "rgba(255, 255, 255, 0.09)";
1511
1478
  readonly '--color-brand-primary-hover': "#FFA063";
1512
1479
  readonly '--color-brand-primary-active': "#FFC7A2";
1513
1480
  readonly '--color-brand-secondary-hover': "#2697B7";
@@ -1532,7 +1499,7 @@ declare function getThemeCSSVars(mode: ThemeMode): {
1532
1499
  readonly '--color-result-degrade-dark': "#b30000";
1533
1500
  readonly '--color-result-inconclusive': "#9E9A97";
1534
1501
  readonly '--color-result-inconclusive-light': "rgba(158, 154, 151, 0.16)";
1535
- readonly '--color-result-neutral': "#9CA3AF";
1502
+ readonly '--color-result-neutral': "#A29F9D";
1536
1503
  readonly '--color-on-result-improve': "#FFFFFF";
1537
1504
  readonly '--color-on-result-degrade': "#FFFFFF";
1538
1505
  readonly '--color-on-result-inconclusive': "#FFFFFF";
@@ -1546,18 +1513,18 @@ declare function getThemeCSSVars(mode: ThemeMode): {
1546
1513
  readonly '--color-data-8': "#90C987";
1547
1514
  readonly '--color-data-9': "#CAACCB";
1548
1515
  readonly '--color-data-10': "#EE8026";
1549
- readonly '--color-text-link-hover': "#60A5FA";
1516
+ readonly '--color-text-link-hover': "#3CA8FF";
1550
1517
  readonly '--color-surface-overlay': "#373635";
1551
1518
  readonly '--color-surface-input': "#2C2A28";
1552
- readonly '--color-border-input': "#4B5563";
1553
- readonly '--color-border-input-hover': "#6B7280";
1519
+ readonly '--color-border-input': "#5A5958";
1520
+ readonly '--color-border-input-hover': "#72716F";
1554
1521
  readonly '--color-border-input-focus': "#828DF8";
1555
- readonly '--color-border-input-error': "#EF4444";
1556
- readonly '--color-hairline-subtle': "rgba(255, 255, 255, 0.06)";
1557
- readonly '--color-hairline-default': "rgba(255, 255, 255, 0.09)";
1558
- readonly '--color-hairline-strong': "rgba(255, 255, 255, 0.14)";
1522
+ readonly '--color-border-input-error': "#E05254";
1523
+ readonly '--color-hairline-subtle': "rgba(255, 255, 255, 0.10)";
1524
+ readonly '--color-hairline-default': "rgba(255, 255, 255, 0.15)";
1525
+ readonly '--color-hairline-strong': "rgba(255, 255, 255, 0.22)";
1559
1526
  readonly '--color-interactive-disabled-text': "rgba(255, 255, 255, 0.26)";
1560
- readonly '--color-avatar-background': "#4B5563";
1527
+ readonly '--color-avatar-background': "#5A5958";
1561
1528
  readonly '--color-avatar-text': "#FFFFFF";
1562
1529
  };
1563
1530
  declare const gluestackConfig: {
@@ -1630,14 +1597,165 @@ declare const gluestackConfig: {
1630
1597
  type ThemeConfig = typeof gluestackConfig;
1631
1598
 
1632
1599
  /**
1633
- * Neumorphic Shadow Utilities
1600
+ * Surface MATERIALS — the treatments layered on top of the flat grey ramp.
1601
+ *
1602
+ * The ramp says how deep a plane sits. This says what it is made of. Two
1603
+ * materials, deliberately: a matte PAPER sheet for hero surfaces, and a recessed
1604
+ * INSET WELL for grouped or awaiting-data regions.
1605
+ *
1606
+ * SCOPE, and it is a hard rule rather than a preference: paper goes on hero
1607
+ * surfaces only — the live card, the LOAD/verdict chip, the rest hero. The
1608
+ * "everything is a paper card" look is explicitly NOT the model; it was an
1609
+ * over-application built to find the ceiling. There are no LEVELS of paper. One
1610
+ * treatment, used sparingly, or the texture stops meaning anything.
1611
+ *
1612
+ * Second hard rule: paper fills take DEEP/MUTED tones only (a ramp step, or a
1613
+ * categorical `dark` variant). Vivid and neon colours are ink ON paper — never
1614
+ * the paper itself.
1615
+ *
1616
+ * PLATFORM: `backgroundImage` and multi-layer `boxShadow` are web/RNW only. On
1617
+ * native these are ignored and the surface falls back to its flat fill, which is
1618
+ * why every material here keeps `backgroundColor` load-bearing on its own. A
1619
+ * material must never be the only thing carrying meaning.
1620
+ *
1621
+ * ── THE TONAL FILL IS GONE (VW-99, S-6 wall calibration) ───────────────────
1622
+ *
1623
+ * `paperSheet` used to carry a vertical ΔL* 3 gradient, sized "just under seen
1624
+ * as a gradient". On the wall panel at ~3 m it could not be told from a flat
1625
+ * sheet of the same tone, and the full material still read as — the operator's
1626
+ * words — "a flat digital rectangle". It failed its own stated purpose, which
1627
+ * was precisely to stop that.
1628
+ *
1629
+ * Raising it was not available. The design ceiling is ~ΔL* 4 (past that it reads
1630
+ * decorative, which the exploration rejected), and the same run showed why the
1631
+ * headroom would not have helped: the 0.025 ELEVATION step — a comparable ΔL*
1632
+ * — was called instantly, because it sits at a hard edge between two flat
1633
+ * fields. The fill spread the same amount smoothly over ~300 px, where vision is
1634
+ * genuinely poor. It is a spatial-frequency problem, not an amplitude one, so
1635
+ * the band between "invisible" and "decorative" may simply not exist here.
1636
+ *
1637
+ * ── AND THE DITHER WENT WITH IT (VW-99 run 2) ──────────────────────────────
1638
+ *
1639
+ * `ditherTile` was held back one run on the grounds that "probably dead weight"
1640
+ * is not a measurement. Run 1 could not measure it: with the fill invisible
1641
+ * there was no gradient to band, so the panel returned a guaranteed clean sheet.
1642
+ *
1643
+ * Run 2 settled it by adding a hand-quantised REFERENCE beside the smooth
1644
+ * control — the same tone span drawn as five hard-edged 1-level steps, which is
1645
+ * what the artefact looks like when it happens. The reference banded plainly and
1646
+ * the smooth gradient did not. So the panel can resolve banding; this render
1647
+ * path simply does not produce it. A mitigation for an artefact that does not
1648
+ * occur is cost with no benefit, and it is gone.
1649
+ *
1650
+ * That is a claim about THIS display, which is the one the product ships on and
1651
+ * the reason `paperSheet` is hero-surface-only. A phone is a separate question.
1652
+ *
1653
+ * Kept: grain, rim-light, contact shadow.
1654
+ *
1655
+ * See coordination/design-explorations/surface-system-north-star.md §4 and
1656
+ * coordination/validation-runbooks/VW-99-depth-wall-calibration.md.
1657
+ */
1658
+
1659
+ /**
1660
+ * Grain opacity for a tone, scaled by perceived brightness.
1661
+ *
1662
+ * A fixed opacity reads hot on a dark plane and vanishes on a bright one, so
1663
+ * darker tones get a whisper and brighter tones keep full texture. Anchored so a
1664
+ * dark chip (lum ≈ 0.13) lands ≈ 0.06 and a bright bar (lum ≈ 0.58) lands ≈ 0.20.
1665
+ * Above roughly 0.05α on a mid tone it starts reading as "dirty" rather than
1666
+ * matte, which is what the clamp is protecting.
1667
+ *
1668
+ * This is the ONE curve all grain goes through — a card and a bar carry
1669
+ * proportional, not identical, texture. That is what makes them read as the same
1670
+ * material.
1671
+ */
1672
+ declare function grainOpacityForTone(baseColor: string): number;
1673
+ /**
1674
+ * The matte grain tile as a `backgroundImage` url — one shared `feTurbulence`
1675
+ * fractal-noise tile, painted once, NEVER animated. Pair with
1676
+ * `backgroundColor: baseColor`.
1677
+ */
1678
+ declare function grainForTone(baseColor: string): string;
1679
+ /**
1680
+ * A matte PAPER hero sheet: brightness-scaled grain + a crisp top rim-light +
1681
+ * one soft contact shadow.
1634
1682
  *
1635
- * Neumorphism creates soft, extruded UI using dual opposing shadows.
1636
- * - Light source assumed from top-left
1637
- * - Raised elements: dark shadow bottom-right, light highlight top-left
1638
- * - Pressed elements: inverted with `inset` shadows
1683
+ * The contact shadow is the ONE place a drop-shadow is still correct on a dark
1684
+ * surface: it is large, soft, and describes a sheet lying on a plane rather than
1685
+ * trying to encode hierarchy. Inline depth is the hairline's job.
1686
+ *
1687
+ * Defaults to `surface-raised` so a same-toned card laid inside reads as one
1688
+ * continuous sheet rather than a seam.
1689
+ *
1690
+ * THE RIM-LIGHT IS A HAIRLINE. Run 2 of VW-99 called it "weak at distance" on
1691
+ * both the card and the hero sheet, and the reason is visible in the number: it
1692
+ * was `rgba(255,255,255,0.10)`, a 1px white line on a dark plane — physically
1693
+ * the same cue as `hairline-*`, but set BELOW `hairline-default`, which the same
1694
+ * run had just had to raise twice. It is not a subtler species of edge, it was
1695
+ * simply mistuned. Raised to `0.20`, between `hairline-default` and
1696
+ * `hairline-strong`: this edge defines a hero surface, so it earns more than the
1697
+ * default separator, and unlike a separator there is no fallback behind it.
1698
+ *
1699
+ * Deliberately NOT wired to the token, though the values now agree in spirit: a
1700
+ * box-shadow rim and a border hairline are retuned by different evidence, and
1701
+ * coupling them means a hairline run silently restyles every hero sheet.
1702
+ *
1703
+ * HERO SURFACES ONLY, MUTED TONES ONLY — see the module header.
1704
+ */
1705
+ declare function paperSheet(tone?: string): ViewStyle;
1706
+ /**
1707
+ * A recessed INSET WELL: a tone pressed BELOW the surrounding plane, cut in by an
1708
+ * inner top shadow with a faint light line on the floor.
1709
+ *
1710
+ * The bottom rim is the load-bearing half. A dark inset alone just reads as a
1711
+ * darker rectangle; it is the light catching the floor that says "this is below
1712
+ * the surface" — which is why the treatment survives at 16px where a full paper
1713
+ * treatment does not.
1714
+ *
1715
+ * The floor light was `0.04` and is now `0.12`, chosen on the wall in VW-99 run
1716
+ * 2 against a `.04`-vs-`.12`-vs-none forced choice. Worth recording that `.04`
1717
+ * was NOT invisible — the no-line decoy was correctly rejected and both real
1718
+ * values were seen, so this is a preference between two working values, not a
1719
+ * rescue. The rim-light next door was a genuine miss; this one was only thin.
1720
+ *
1721
+ * Note this is a MATERIAL, and independent of the surface LEVEL named `inset`
1722
+ * that was retired in TD-07.14. A well is something you apply; a level is
1723
+ * somewhere you sit.
1639
1724
  */
1725
+ declare function insetWell(tone?: string): ViewStyle;
1726
+ /**
1727
+ * Paper for a COLORED BAR — the same material as {@link paperSheet}, tuned for a
1728
+ * small saturated element: grain + top rim-light + a contact shadow cast past the
1729
+ * bar's leading edge, so a filled bar reads as a physical block that has travelled.
1730
+ *
1731
+ * No tonal fill or dither here: a bar is too narrow for a ΔL* 3 gradient to read,
1732
+ * and too narrow to band.
1733
+ *
1734
+ * `flip` = a vertically mirrored (`scaleY(-1)`) plot, i.e. the `down` wing of a
1735
+ * diverging chart. The contact shadow's y-offset is pre-inverted so the mirror
1736
+ * lands it pointing AWAY from the shared axis rather than up across it, and the
1737
+ * top rim-light is DROPPED — mirrored it would sit on the axis edge and read
1738
+ * wrong, so grain and shadow carry the material alone.
1739
+ */
1740
+ declare function barPaper(color: string, flip?: boolean): ViewStyle;
1640
1741
 
1742
+ /**
1743
+ * Colour math shared by the depth system.
1744
+ *
1745
+ * This file used to be `shadows.ts` and shipped a neumorphic shadow builder —
1746
+ * dual opposing shadows, dark bottom-right and light top-left. That was removed
1747
+ * in TD-07.16. Neumorphism needs a mid-tone background (roughly 75-90%
1748
+ * lightness) so BOTH shadows have somewhere to fall; our surfaces sit near 10%,
1749
+ * which leaves the dark half nothing to fall onto. It collapsed to a one-sided
1750
+ * rim light and read as noise on the wall.
1751
+ *
1752
+ * Inline depth is a hairline now (`hairline-*`, self-normalising alpha), texture
1753
+ * is `materials.ts`, and drop-shadow survives only for genuinely FLOATING
1754
+ * things — see `elevation.ts`.
1755
+ *
1756
+ * What is left here is the HSV/hex maths that `elevation.ts` still uses to
1757
+ * derive rim and shadow tints from whatever surface colour it is handed.
1758
+ */
1641
1759
  /**
1642
1760
  * Parse a hex color to RGB values (0-255).
1643
1761
  * Supports both #RGB and #RRGGBB formats.
@@ -1698,134 +1816,10 @@ declare function getHoverColors(bgColor: string, intensity?: 'subtle' | 'medium'
1698
1816
  */
1699
1817
  declare function isDark(hex: string): boolean;
1700
1818
  /**
1701
- * Shadow configuration for different surface colors.
1702
- * Each surface needs calibrated light/dark shadow colors.
1703
- *
1704
- * - dark: soft shadow for depth (bottom-right)
1705
- * - light: sharp rim highlight (top-left) - higher opacity for crisp edge
1706
- * - darker: deeper shadow for pressed/inset states
1819
+ * Shadow strength tiers. Retained because `elevation.ts` keys its level table on
1820
+ * them; the neumorphic shadow BUILDERS that used to live here are gone.
1707
1821
  */
1708
- declare const shadowColors: {
1709
- charcoal: {
1710
- dark: string;
1711
- light: string;
1712
- darker: string;
1713
- };
1714
- neutralDark: {
1715
- dark: string;
1716
- light: string;
1717
- darker: string;
1718
- };
1719
- neutralLight: {
1720
- dark: string;
1721
- light: string;
1722
- darker: string;
1723
- };
1724
- };
1725
1822
  type ShadowIntensity = 'subtle' | 'medium' | 'strong';
1726
- type ShadowSurface = keyof typeof shadowColors;
1727
- /**
1728
- * Creates a raised (elevated) neumorphic shadow.
1729
- * Element appears to float above the surface.
1730
- *
1731
- * Uses a soft dark shadow (bottom-right) and a sharp rim light (top-left).
1732
- */
1733
- declare function createRaisedShadow(surface?: ShadowSurface, intensity?: ShadowIntensity): ViewStyle;
1734
- /**
1735
- * Creates a pressed (inset) neumorphic shadow.
1736
- * Element appears pushed into the surface.
1737
- *
1738
- * Uses a soft dark inset shadow (top-left) and a thin sharp rim light (bottom-right).
1739
- */
1740
- declare function createPressedShadow(surface?: ShadowSurface, intensity?: ShadowIntensity): ViewStyle;
1741
- /**
1742
- * Creates a flat (no shadow) style for hover states.
1743
- */
1744
- declare function createFlatShadow(): ViewStyle;
1745
- /**
1746
- * Creates a hover shadow for raised elements.
1747
- * Reduces shadow depth but keeps a subtle rim light to maintain visual boundary.
1748
- */
1749
- declare function createRaisedHoverShadow(surface?: ShadowSurface, intensity?: ShadowIntensity): ViewStyle;
1750
- /**
1751
- * Creates a hover shadow for pressed elements.
1752
- * Reduces shadow depth but keeps a subtle rim light to maintain visual boundary.
1753
- */
1754
- declare function createPressedHoverShadow(surface?: ShadowSurface, intensity?: ShadowIntensity): ViewStyle;
1755
- /**
1756
- * Pre-built shadow presets for common use cases.
1757
- */
1758
- declare const neumorphicShadows: {
1759
- charcoal: {
1760
- raised: {
1761
- subtle: ViewStyle;
1762
- medium: ViewStyle;
1763
- strong: ViewStyle;
1764
- };
1765
- raisedHover: {
1766
- subtle: ViewStyle;
1767
- medium: ViewStyle;
1768
- strong: ViewStyle;
1769
- };
1770
- pressed: {
1771
- subtle: ViewStyle;
1772
- medium: ViewStyle;
1773
- strong: ViewStyle;
1774
- };
1775
- pressedHover: {
1776
- subtle: ViewStyle;
1777
- medium: ViewStyle;
1778
- strong: ViewStyle;
1779
- };
1780
- flat: ViewStyle;
1781
- };
1782
- neutralDark: {
1783
- raised: {
1784
- subtle: ViewStyle;
1785
- medium: ViewStyle;
1786
- strong: ViewStyle;
1787
- };
1788
- raisedHover: {
1789
- subtle: ViewStyle;
1790
- medium: ViewStyle;
1791
- strong: ViewStyle;
1792
- };
1793
- pressed: {
1794
- subtle: ViewStyle;
1795
- medium: ViewStyle;
1796
- strong: ViewStyle;
1797
- };
1798
- pressedHover: {
1799
- subtle: ViewStyle;
1800
- medium: ViewStyle;
1801
- strong: ViewStyle;
1802
- };
1803
- flat: ViewStyle;
1804
- };
1805
- neutralLight: {
1806
- raised: {
1807
- subtle: ViewStyle;
1808
- medium: ViewStyle;
1809
- strong: ViewStyle;
1810
- };
1811
- raisedHover: {
1812
- subtle: ViewStyle;
1813
- medium: ViewStyle;
1814
- strong: ViewStyle;
1815
- };
1816
- pressed: {
1817
- subtle: ViewStyle;
1818
- medium: ViewStyle;
1819
- strong: ViewStyle;
1820
- };
1821
- pressedHover: {
1822
- subtle: ViewStyle;
1823
- medium: ViewStyle;
1824
- strong: ViewStyle;
1825
- };
1826
- flat: ViewStyle;
1827
- };
1828
- };
1829
1823
 
1830
1824
  /**
1831
1825
  * TypeScript mirror of css-property-manifest.schema.json.
@@ -1967,9 +1961,9 @@ interface ThemePresetColors {
1967
1961
  'background-base'?: string;
1968
1962
  'background-default'?: string;
1969
1963
  'background-subtle'?: string;
1970
- 'border-default'?: string;
1971
- 'border-subtle'?: string;
1972
- 'border-strong'?: string;
1964
+ 'hairline-default'?: string;
1965
+ 'hairline-subtle'?: string;
1966
+ 'hairline-strong'?: string;
1973
1967
  'border-focus'?: string;
1974
1968
  'divider'?: string;
1975
1969
  [key: `${string}`]: string | undefined;
@@ -2022,4 +2016,4 @@ declare const defaultPreset: ThemePreset;
2022
2016
  */
2023
2017
  declare const audiobookPreset: ThemePreset;
2024
2018
 
2025
- export { CATEGORICAL_CVD_SAFE_MAX, type CategoricalVariant, type ComponentType, type CssPropertyEntry, type CssPropertyManifest, type ElevationConfig, type ElevationLevel, type GlowIntensity, type GradientStyle, type ManifestValidationResult, PRESSED_ELEVATION_LEVEL, type ShadowIntensity, type ShadowSurface, type ThemeConfig, type ThemeMode, type ThemePreset, type ThemePresetColors, type ThemePresetFonts, type ThemePresetRadii, type ThemePresetShadows, ThemeProvider, type ThemeProviderMode, type ThemeProviderProps, type VariantAxes, type VariantOverride, applyThemePreset, audiobookPreset, backgroundFrameDark, bestTextColor, buttonSizes, categoricalPalette, componentElevationRanges, createFlatShadow, createPressedHoverShadow, createPressedShadow, createRaisedHoverShadow, createRaisedShadow, darkThemeCSSVars, darken, defaultPreset, discreteRainbow, divergingScale, elevationSystem, getBaseSurfaceColor, getCategoricalColor, getDiscreteRainbowColor, getElevationConfig, getElevationShadow, getElevationSurface, getGlowShadow, getHoverColors, getPressedRecessShadow, getSemanticColors, getThemeCSSVars, getValidatedElevation, gluestackConfig, hexToRgb, hsvToRgb, isCssPropertyManifest, isDark, lightThemeCSSVars, lighten, linearGradient, neumorphicShadows, primitiveBorderRadius, primitiveBreakpoints, primitiveColors, primitiveRamps, primitiveShadows, primitiveSpacing, primitiveTypography, primitiveZIndex, resolveColor, rgbToHex, rgbToHsv, semanticColorsDark, semanticColorsLight, semanticTypography, sequentialEffort, shadowColors, surfaceGradient, surfaceRampDark, validateCssPropertyManifest };
2019
+ export { CATEGORICAL_CVD_SAFE_MAX, type CategoricalVariant, type ComponentType, type CssPropertyEntry, type CssPropertyManifest, type ElevationConfig, type ElevationLevel, FLOATING_ELEVATION_MIN, type GlowIntensity, type GradientStyle, type ManifestValidationResult, PRESSED_ELEVATION_LEVEL, SURFACE_PLANE_STEPS, type ShadowIntensity, type ThemeConfig, type ThemeMode, type ThemePreset, type ThemePresetColors, type ThemePresetFonts, type ThemePresetRadii, type ThemePresetShadows, ThemeProvider, type ThemeProviderMode, type ThemeProviderProps, type VariantAxes, type VariantOverride, applyThemePreset, audiobookPreset, barPaper, bestTextColor, buttonSizes, categoricalPalette, componentElevationRanges, darkThemeCSSVars, darken, defaultPreset, discreteRainbow, divergingScale, elevationSystem, getBaseSurfaceColor, getCategoricalColor, getDiscreteRainbowColor, getElevationConfig, getElevationShadow, getElevationSurface, getGlowShadow, getHoverColors, getPressedRecessShadow, getSemanticColors, getThemeCSSVars, getValidatedElevation, gluestackConfig, grainForTone, grainOpacityForTone, greyRamp, hexToRgb, hsvToRgb, insetWell, isCssPropertyManifest, isDark, lightThemeCSSVars, lighten, linearGradient, paperSheet, primitiveBorderRadius, primitiveBreakpoints, primitiveColors, primitiveRamps, primitiveSpacing, primitiveTypography, primitiveZIndex, resolveColor, rgbToHex, rgbToHsv, semanticColorsDark, semanticColorsLight, semanticTypography, sequentialEffort, surfaceGradient, validateCssPropertyManifest };