@titan-design/react-ui 0.9.2 → 0.10.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 (53) hide show
  1. package/dist/bodymap.js +78 -24
  2. package/dist/bodymap.js.map +1 -1
  3. package/dist/bodymap.mjs +78 -24
  4. package/dist/bodymap.mjs.map +1 -1
  5. package/dist/index.d.mts +215 -123
  6. package/dist/index.d.ts +215 -123
  7. package/dist/index.js +408 -259
  8. package/dist/index.js.map +1 -1
  9. package/dist/index.mjs +258 -121
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/pages.js +214 -157
  12. package/dist/pages.js.map +1 -1
  13. package/dist/pages.mjs +214 -157
  14. package/dist/pages.mjs.map +1 -1
  15. package/dist/theme/index.d.mts +895 -795
  16. package/dist/theme/index.d.ts +895 -795
  17. package/dist/theme/index.js +101 -20
  18. package/dist/theme/index.js.map +1 -1
  19. package/dist/theme/index.mjs +99 -22
  20. package/dist/theme/index.mjs.map +1 -1
  21. package/dist/theme/tokens-css.js +88 -24
  22. package/dist/theme/tokens-css.js.map +1 -1
  23. package/dist/theme/tokens-css.mjs +88 -24
  24. package/dist/theme/tokens-css.mjs.map +1 -1
  25. package/package.json +1 -1
  26. package/src/components/custom/Workout/BaseBadge.tsx +5 -5
  27. package/src/components/custom/Workout/RowInventory.stories.tsx +5 -2
  28. package/src/components/custom/Workout/S3FullRail.stories.tsx +13 -1
  29. package/src/components/custom/Workout/SessionHeader.tsx +11 -13
  30. package/src/components/custom/Workout/SessionRail.stories.tsx +4 -1
  31. package/src/components/custom/Workout/SessionRail.tsx +16 -14
  32. package/src/components/custom/Workout/SupersetWrapper.stories.tsx +16 -25
  33. package/src/components/custom/Workout/SupersetWrapper.tsx +1 -1
  34. package/src/components/custom/Workout/TempoDisplay.tsx +3 -7
  35. package/src/components/custom/Workout/VolumeLandmarkBar.stories.tsx +4 -1
  36. package/src/components/custom/Workout/WorkoutPill.tsx +2 -2
  37. package/src/components/shell/DashboardShell.tsx +6 -3
  38. package/src/components/ui/surface/Surface.stories.tsx +244 -1
  39. package/src/components/ui/surface/Surface.test.tsx +244 -1
  40. package/src/components/ui/surface/Surface.tsx +98 -20
  41. package/src/components/ui/surface/SurfaceContext.ts +126 -0
  42. package/src/components/ui/surface/index.ts +13 -0
  43. package/src/components/ui/surface/surface.contract.test.ts +283 -0
  44. package/src/test/nativewind-stub.ts +13 -0
  45. package/src/theme/ColorSystem.stories.tsx +232 -47
  46. package/src/theme/ThemeProvider.test.tsx +24 -0
  47. package/src/theme/ThemeProvider.tsx +23 -6
  48. package/src/theme/config.ts +12 -0
  49. package/src/theme/elevation.ts +90 -67
  50. package/src/theme/global.css +35 -9
  51. package/src/theme/tokens/primitives.ts +40 -0
  52. package/src/theme/tokens/semantic.ts +63 -14
  53. package/tailwind.config.js +8 -0
@@ -1,517 +1,328 @@
1
1
  import { ViewStyle, ViewProps } from 'react-native';
2
2
 
3
3
  /**
4
- * Elevation System
5
- *
6
- * A unified depth system where each elevation level corresponds to:
7
- * - Calculated surface color (derived from base using lighten)
8
- * - Shadow intensity and style (raised/pressed)
9
- * - Dynamically calculated shadow colors (derived from surface color)
10
- * - Semantic name for reference
11
- *
12
- * Elevation range: -2 (deep inset) to +5 (floating overlay)
13
- *
14
- * Negative elevations: Inset/pressed elements (sunken into surface)
15
- * Zero elevation: Base surface (background/page level)
16
- * Positive elevations: Raised elements (floating above surface)
17
- *
18
- * All colors are calculated dynamically from a base surface color,
19
- * allowing for custom surfaces and consistent color relationships.
20
- *
21
- * Lighting Model: Light source from upper-right corner
22
- * - Raised elements are always lighter than base (consistent across themes)
23
- * - Base colors must allow sufficient lightening in both themes
24
- */
25
-
26
- type ElevationLevel = -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5;
27
- interface ElevationConfig {
28
- /** Semantic name for this elevation level */
29
- name: string;
30
- /** Amount to lighten base color (0-1) */
31
- colorAdjustment: number;
32
- /** Shadow intensity */
33
- shadowIntensity: 'subtle' | 'medium' | 'strong';
34
- /** Shadow style: raised (floating) or pressed (inset) */
35
- shadowStyle: 'raised' | 'pressed';
36
- /** Description of use case */
37
- description: string;
38
- }
39
- declare const elevationSystem: Record<ElevationLevel, ElevationConfig>;
40
- /**
41
- * Get elevation configuration for a given level
42
- */
43
- declare function getElevationConfig(level: ElevationLevel): ElevationConfig;
44
- /**
45
- * Calculate surface color for an elevation level from a base color.
46
- * Results are cached to avoid redundant calculations.
47
- *
48
- * @param baseColor - Base surface color (hex)
49
- * @param level - Elevation level
50
- * @param theme - Current theme ('light' or 'dark')
51
- * @returns Calculated surface color (hex)
52
- */
53
- declare function getElevationSurface(baseColor: string, level: ElevationLevel, theme: 'light' | 'dark'): string;
54
- /**
55
- * Get shadow style for an elevation level, calculated dynamically from surface color.
56
- * Results are cached to avoid redundant calculations.
57
- *
58
- * @param baseColor - Base surface color (hex)
59
- * @param level - Elevation level
60
- * @param theme - Current theme ('light' or 'dark')
61
- * @param isHovered - Whether element is hovered
62
- * @returns ViewStyle with shadow properties
63
- */
64
- declare function getElevationShadow(baseColor: string, level: ElevationLevel, theme: 'light' | 'dark', isHovered?: boolean): ViewStyle;
65
- /**
66
- * Get base surface color from theme.
67
- * This is the foundation color that all elevations are calculated from.
68
- *
69
- * IMPORTANT: Base colors must be chosen to allow sufficient lightening.
70
- *
71
- * **Light Mode**: Cannot use `#FFFFFF` (white) - cannot lighten white!
72
- * - Use `#F3F4F6` (neutral[100]) - can lighten to `#FAFAFA` → `#FFFFFF`
73
- * - This allows raised elevations to be lighter (closer to white)
4
+ * Semantic Design Tokens
74
5
  *
75
- * **Dark Mode**: Need lighter base to allow sufficient lightening
76
- * - Use `#191919` (charcoal[600]) - allows lightening to `#2A2A2A` at max elevation
6
+ * Meaningful tokens following DTCG (Design Tokens Community Group) naming conventions.
7
+ * Pattern: {category}-{intent}-{variant?}-{state?}
77
8
  *
78
- * Can be overridden to use custom base colors for special cases.
79
- */
80
- declare function getBaseSurfaceColor(theme: 'light' | 'dark'): string;
81
- /**
82
- * Component-specific elevation ranges
83
- * Defines which elevation levels each component type can use
9
+ * Categories:
10
+ * - brand-* : Brand colors (primary, secondary, accent)
11
+ * - status-* : Feedback colors (success, error, warning, info)
12
+ * - result-* : Outcome indicators (improve, degrade, inconclusive, neutral)
13
+ * - data-* : Data visualization colors (chart series)
14
+ * - on-* : Text on colored backgrounds
15
+ * - surface-* : Elevated containers (NOT "paper")
16
+ * - background-* : Page backgrounds
17
+ * - text-* : Text colors
18
+ * - border-* : Border colors
19
+ * - interactive-* : Hover/focus/active/disabled states
84
20
  */
85
- declare const componentElevationRanges: {
86
- readonly button: {
87
- readonly allowed: readonly [2];
88
- readonly default: 2;
89
- readonly hover: 3;
90
- };
91
- readonly card: {
92
- readonly allowed: readonly [1, 2, 3];
93
- readonly default: 2;
94
- readonly hover: 3;
95
- };
96
- readonly input: {
97
- readonly allowed: readonly [-2, -1, 0];
98
- readonly default: -1;
99
- };
100
- readonly overlay: {
101
- readonly allowed: readonly [4, 5];
102
- readonly default: 4;
103
- };
21
+ declare const semanticColorsLight: {
22
+ readonly 'brand-primary': "#FF7900";
23
+ readonly 'brand-primary-light': "#FFA063";
24
+ readonly 'brand-primary-dark': "#DA5F00";
25
+ readonly 'brand-primary-subtle': "rgba(255, 121, 0, 0.08)";
26
+ readonly 'brand-primary-hover': "#DA5F00";
27
+ readonly 'brand-primary-active': "#B94A00";
28
+ readonly 'brand-secondary': "#307B9B";
29
+ readonly 'brand-secondary-light': "#2697B7";
30
+ readonly 'brand-secondary-dark': "#2A617F";
31
+ readonly 'brand-secondary-subtle': "rgba(48, 123, 155, 0.08)";
32
+ readonly 'brand-secondary-hover': "#2A617F";
33
+ readonly 'brand-secondary-active': "#22465F";
34
+ readonly 'on-brand-primary': "#FFFFFF";
35
+ readonly 'on-brand-secondary': "#FFFFFF";
36
+ readonly 'status-success': "#2ED573";
37
+ readonly 'status-success-light': "#58F69E";
38
+ readonly 'status-success-dark': "#298732";
39
+ readonly 'status-success-subtle': "#E3FFEE";
40
+ readonly 'status-live': "#2ED573";
41
+ readonly 'status-live-muted': "#22A444";
42
+ readonly 'status-error': "#D14343";
43
+ readonly 'status-error-light': "#E05254";
44
+ readonly 'status-error-dark': "#A4221C";
45
+ 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";
49
+ readonly 'status-error-vivid-subtle': "rgba(255, 71, 87, 0.12)";
50
+ readonly 'status-warning': "#F9B415";
51
+ readonly 'status-warning-light': "#FFD352";
52
+ readonly 'status-warning-dark': "#C27400";
53
+ readonly 'status-warning-subtle': "#FFF7DD";
54
+ readonly 'status-info': "#2196F3";
55
+ readonly 'status-info-light': "#78C2FF";
56
+ readonly 'status-info-dark': "#1072CB";
57
+ readonly 'status-info-subtle': "#EFF8FF";
58
+ readonly 'on-status-success': "#FFFFFF";
59
+ readonly 'on-status-error': "#FFFFFF";
60
+ readonly 'on-status-warning': "#FFFFFF";
61
+ readonly 'on-status-info': "#FFFFFF";
62
+ readonly 'result-improve': "#4caf50";
63
+ readonly 'result-improve-light': "rgba(76, 175, 80, 0.12)";
64
+ readonly 'result-improve-dark': "#248a24";
65
+ readonly 'result-degrade': "#ef5350";
66
+ readonly 'result-degrade-light': "rgba(239, 83, 80, 0.12)";
67
+ readonly 'result-degrade-dark': "#b30000";
68
+ readonly 'result-inconclusive': "#9E9A97";
69
+ readonly 'result-inconclusive-light': "rgba(158, 154, 151, 0.12)";
70
+ readonly 'result-neutral': "#6B7280";
71
+ readonly 'on-result-improve': "#FFFFFF";
72
+ readonly 'on-result-degrade': "#FFFFFF";
73
+ readonly 'on-result-inconclusive': "#FFFFFF";
74
+ readonly 'data-1': "#1965B0";
75
+ readonly 'data-2': "#4EB265";
76
+ readonly 'data-3': "#F7F056";
77
+ readonly 'data-4': "#DC050C";
78
+ readonly 'data-5': "#882E72";
79
+ readonly 'data-6': "#F4A736";
80
+ readonly 'data-7': "#7BAFDE";
81
+ readonly 'data-8': "#90C987";
82
+ readonly 'data-9': "#CAACCB";
83
+ readonly 'data-10': "#EE8026";
84
+ readonly 'text-primary': "#121828";
85
+ readonly 'text-secondary': "#65748B";
86
+ readonly 'text-tertiary': "#9CA3AF";
87
+ readonly 'text-disabled': "rgba(55, 65, 81, 0.48)";
88
+ readonly 'text-inverse': "#FFFFFF";
89
+ readonly 'text-link': "#5048E5";
90
+ readonly 'text-link-hover': "#3832A0";
91
+ readonly 'surface-base': "#FFFFFF";
92
+ readonly 'surface-elevated': "#FAFAFA";
93
+ readonly 'surface-raised': "#F3F4F6";
94
+ readonly 'surface-overlay': "#FFFFFF";
95
+ readonly 'surface-input': "#FAFAFA";
96
+ readonly 'surface-inset': "#D1D5DB";
97
+ readonly 'background-base': "#EBEBEB";
98
+ 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";
109
+ readonly 'border-input-error': "#D14343";
110
+ readonly 'hairline-subtle': "rgba(0, 0, 0, 0.06)";
111
+ readonly 'hairline-default': "rgba(0, 0, 0, 0.09)";
112
+ readonly 'hairline-strong': "rgba(0, 0, 0, 0.14)";
113
+ readonly 'interactive-hover': "rgba(55, 65, 81, 0.04)";
114
+ readonly 'interactive-focus': "rgba(55, 65, 81, 0.12)";
115
+ readonly 'interactive-active': "rgba(55, 65, 81, 0.16)";
116
+ readonly 'interactive-selected': "rgba(55, 65, 81, 0.08)";
117
+ readonly 'interactive-disabled': "rgba(55, 65, 81, 0.12)";
118
+ readonly 'interactive-disabled-text': "rgba(55, 65, 81, 0.26)";
119
+ readonly divider: "#E8E9EB";
120
+ readonly 'avatar-background': "#6B7280";
121
+ readonly 'avatar-text': "#FFFFFF";
104
122
  };
105
- type ComponentType = keyof typeof componentElevationRanges;
106
- /**
107
- * Validate and clamp elevation to component's allowed range
108
- */
109
- declare function getValidatedElevation(component: ComponentType, requested: ElevationLevel): ElevationLevel;
110
- type GlowIntensity = 'subtle' | 'medium' | 'strong';
111
- /**
112
- * Get a glow shadow style for emphasis/active states.
113
- *
114
- * Creates a colored radial glow around an element, useful for:
115
- * - Active recording indicators (orange glow)
116
- * - Success states (green glow)
117
- * - Error/danger indicators (red glow)
118
- * - Focus rings and attention-drawing elements
119
- *
120
- * @param color - Glow color (hex string, e.g. '#FF7900')
121
- * @param intensity - Glow intensity level
122
- * @returns ViewStyle with platform-specific shadow properties
123
- */
124
- declare function getGlowShadow(color: string, intensity?: GlowIntensity): ViewStyle;
125
-
126
- /**
127
- * Primitive Design Tokens
128
- *
129
- * Raw values with no semantic meaning. These are the foundation of the design system
130
- * and should rarely be used directly in components. Use semantic tokens instead.
131
- */
132
- declare const primitiveColors: {
133
- readonly blue: {
134
- readonly 50: "#EFF6FF";
135
- readonly 100: "#DBEAFE";
136
- readonly 200: "#BFDBFE";
137
- readonly 300: "#93C5FD";
138
- readonly 400: "#60A5FA";
139
- readonly 500: "#3B82F6";
140
- readonly 600: "#5048E5";
141
- readonly 700: "#3832A0";
142
- readonly 800: "#1E40AF";
143
- readonly 900: "#1E3A8A";
144
- };
145
- readonly red: {
146
- readonly 50: "#FEF2F2";
147
- readonly 100: "#FEE2E2";
148
- readonly 200: "#FECACA";
149
- readonly 300: "#FCA5A5";
150
- readonly 400: "#DA6868";
151
- readonly 500: "#EF4444";
152
- readonly 600: "#D14343";
153
- readonly 700: "#922E2E";
154
- readonly 800: "#991B1B";
155
- readonly 900: "#7F1D1D";
123
+ declare const semanticColorsDark: {
124
+ readonly 'brand-primary': "#FF7900";
125
+ readonly 'brand-primary-light': "#FFA063";
126
+ readonly 'brand-primary-dark': "#DA5F00";
127
+ readonly 'brand-primary-subtle': "rgba(255, 121, 0, 0.12)";
128
+ readonly 'brand-primary-hover': "#FFA063";
129
+ readonly 'brand-primary-active': "#FFC7A2";
130
+ readonly 'brand-secondary': "#307B9B";
131
+ readonly 'brand-secondary-light': "#2697B7";
132
+ readonly 'brand-secondary-dark': "#2A617F";
133
+ readonly 'brand-secondary-subtle': "rgba(48, 123, 155, 0.12)";
134
+ readonly 'brand-secondary-hover': "#2697B7";
135
+ readonly 'brand-secondary-active': "#01B5D1";
136
+ readonly 'on-brand-primary': "#FFFFFF";
137
+ readonly 'on-brand-secondary': "#FFFFFF";
138
+ readonly 'status-success': "#2ED573";
139
+ readonly 'status-success-light': "#58F69E";
140
+ readonly 'status-success-dark': "#298732";
141
+ readonly 'status-success-subtle': "rgba(46, 213, 115, 0.12)";
142
+ readonly 'status-live': "#2ED573";
143
+ readonly 'status-live-muted': "#22A444";
144
+ readonly 'status-error': "#D14343";
145
+ readonly 'status-error-light': "#E05254";
146
+ readonly 'status-error-dark': "#A4221C";
147
+ 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";
151
+ readonly 'status-error-vivid-subtle': "rgba(255, 71, 87, 0.12)";
152
+ readonly 'status-warning': "#F9B415";
153
+ readonly 'status-warning-light': "#FFD352";
154
+ readonly 'status-warning-dark': "#C27400";
155
+ readonly 'status-warning-subtle': "rgba(249, 180, 21, 0.12)";
156
+ readonly 'status-info': "#2196F3";
157
+ readonly 'status-info-light': "#78C2FF";
158
+ readonly 'status-info-dark': "#1072CB";
159
+ readonly 'status-info-subtle': "rgba(33, 150, 243, 0.12)";
160
+ readonly 'on-status-success': "#FFFFFF";
161
+ readonly 'on-status-error': "#FFFFFF";
162
+ readonly 'on-status-warning': "#FFFFFF";
163
+ readonly 'on-status-info': "#FFFFFF";
164
+ readonly 'result-improve': "#4caf50";
165
+ readonly 'result-improve-light': "rgba(76, 175, 80, 0.16)";
166
+ readonly 'result-improve-dark': "#248a24";
167
+ readonly 'result-degrade': "#ef5350";
168
+ readonly 'result-degrade-light': "rgba(239, 83, 80, 0.16)";
169
+ readonly 'result-degrade-dark': "#b30000";
170
+ readonly 'result-inconclusive': "#9E9A97";
171
+ readonly 'result-inconclusive-light': "rgba(158, 154, 151, 0.16)";
172
+ readonly 'result-neutral': "#9CA3AF";
173
+ readonly 'on-result-improve': "#FFFFFF";
174
+ readonly 'on-result-degrade': "#FFFFFF";
175
+ readonly 'on-result-inconclusive': "#FFFFFF";
176
+ readonly 'data-1': "#1965B0";
177
+ readonly 'data-2': "#4EB265";
178
+ readonly 'data-3': "#F7F056";
179
+ readonly 'data-4': "#DC050C";
180
+ readonly 'data-5': "#882E72";
181
+ readonly 'data-6': "#F4A736";
182
+ readonly 'data-7': "#7BAFDE";
183
+ readonly 'data-8': "#90C987";
184
+ readonly 'data-9': "#CAACCB";
185
+ readonly 'data-10': "#EE8026";
186
+ readonly 'text-primary': "#F3F4F6";
187
+ readonly 'text-secondary': "#9CA3AF";
188
+ readonly 'text-tertiary': "#6B7280";
189
+ readonly 'text-disabled': "rgba(255, 255, 255, 0.38)";
190
+ readonly 'text-inverse': "#111827";
191
+ readonly 'text-link': "#828DF8";
192
+ readonly 'text-link-hover': "#60A5FA";
193
+ readonly 'surface-base': "#252321";
194
+ readonly 'surface-elevated': "#2C2A28";
195
+ readonly 'surface-raised': "#31302F";
196
+ readonly 'surface-overlay': "#373635";
197
+ readonly 'surface-input': "#2C2A28";
198
+ readonly 'surface-inset': "#13100D";
199
+ readonly 'background-base': "#1C1916";
200
+ readonly 'background-default': "#252321";
201
+ readonly 'background-subtle': "#2C2A28";
202
+ readonly 'background-frame': "#100D0A";
203
+ readonly 'border-default': "#1F1F1F";
204
+ readonly 'border-subtle': "#1C1C1C";
205
+ readonly 'border-strong': "#2C2C2C";
206
+ readonly 'border-prominent': "#3C3C3C";
207
+ readonly 'border-focus': "#828DF8";
208
+ readonly 'border-input': "#4B5563";
209
+ readonly 'border-input-hover': "#6B7280";
210
+ 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)";
215
+ readonly 'interactive-hover': "rgba(255, 255, 255, 0.04)";
216
+ readonly 'interactive-focus': "rgba(255, 255, 255, 0.12)";
217
+ readonly 'interactive-active': "rgba(255, 255, 255, 0.16)";
218
+ readonly 'interactive-selected': "rgba(255, 255, 255, 0.08)";
219
+ readonly 'interactive-disabled': "rgba(255, 255, 255, 0.12)";
220
+ readonly 'interactive-disabled-text': "rgba(255, 255, 255, 0.26)";
221
+ readonly divider: "#1F1F1F";
222
+ readonly 'avatar-background': "#4B5563";
223
+ readonly 'avatar-text': "#FFFFFF";
224
+ };
225
+ declare const semanticTypography: {
226
+ readonly h1: {
227
+ readonly fontFamily: "heading";
228
+ readonly fontSize: "3.5rem";
229
+ readonly fontWeight: 700;
230
+ readonly lineHeight: 1.375;
156
231
  };
157
- readonly redVivid: {
158
- readonly 50: "#FFECEE";
159
- readonly 100: "#FFD6DB";
160
- readonly 200: "#FFB3BC";
161
- readonly 300: "#FF8593";
162
- readonly 400: "#FF6070";
163
- readonly 500: "#FF4757";
164
- readonly 600: "#E63548";
165
- readonly 700: "#C42539";
166
- readonly 800: "#9E1C2C";
167
- readonly 900: "#7A1520";
232
+ readonly h2: {
233
+ readonly fontFamily: "heading";
234
+ readonly fontSize: "3rem";
235
+ readonly fontWeight: 700;
236
+ readonly lineHeight: 1.375;
168
237
  };
169
- readonly neutral: {
170
- readonly 50: "#FAFAFA";
171
- readonly 100: "#F3F4F6";
172
- readonly 200: "#E5E7EB";
173
- readonly 300: "#D1D5DB";
174
- readonly 400: "#9CA3AF";
175
- readonly 500: "#6B7280";
176
- readonly 600: "#4B5563";
177
- readonly 700: "#374151";
178
- readonly 800: "#1F2937";
179
- readonly 900: "#111827";
180
- readonly 950: "#030712";
238
+ readonly h3: {
239
+ readonly fontFamily: "heading";
240
+ readonly fontSize: "2.25rem";
241
+ readonly fontWeight: 700;
242
+ readonly lineHeight: 1.375;
181
243
  };
182
- readonly charcoal: {
183
- readonly 0: "#6E6E6E";
184
- readonly 50: "#5D5D5D";
185
- readonly 100: "#4C4C4C";
186
- readonly 200: "#3C3C3C";
187
- readonly 300: "#2C2C2C";
188
- readonly 400: "#1F1F1F";
189
- readonly 500: "#1C1C1C";
190
- readonly 600: "#191919";
191
- readonly 700: "#161616";
192
- readonly 800: "#131313";
193
- readonly 900: "#101010";
244
+ readonly h4: {
245
+ readonly fontFamily: "heading";
246
+ readonly fontSize: "2rem";
247
+ readonly fontWeight: 700;
248
+ readonly lineHeight: 1.375;
194
249
  };
195
- readonly white: "#FFFFFF";
196
- readonly black: "#000000";
197
- readonly transparent: "transparent";
198
- };
199
- /**
200
- * Derived tonal ramps (TD-05.09 color foundations)
201
- *
202
- * Seven OKLCH-generated hue ramps, 11 perceptual lightness steps each (50 -> 950).
203
- * Built with hue-torsion + a chroma arc, anchored through existing brand/semantic
204
- * hexes. `pin` marks the step each ramp flows through its anchor.
205
- * This is the single source of truth for chromatic hexes — the categorical palette
206
- * below references these steps rather than duplicating values.
207
- * See coordination/design-explorations/foundations.
208
- */
209
- declare const primitiveRamps: {
210
- readonly red: {
211
- readonly 50: "#FFF4F4";
212
- readonly 100: "#FFE3E5";
213
- readonly 200: "#FFC2C5";
214
- readonly 300: "#FF9A9D";
215
- readonly 400: "#F77175";
216
- readonly 500: "#E05254";
217
- readonly 600: "#D14343";
218
- readonly 700: "#A4221C";
219
- readonly 800: "#7E1002";
220
- readonly 900: "#5A0900";
221
- readonly 950: "#3D0400";
250
+ readonly h5: {
251
+ readonly fontFamily: "heading";
252
+ readonly fontSize: "1.5rem";
253
+ readonly fontWeight: 600;
254
+ readonly lineHeight: 1.375;
222
255
  };
223
- readonly orange: {
224
- readonly 50: "#FFF5ED";
225
- readonly 100: "#FFE6D4";
226
- readonly 200: "#FFC7A2";
227
- readonly 300: "#FFA063";
228
- readonly 400: "#FF7900";
229
- readonly 500: "#DA5F00";
230
- readonly 600: "#B94A00";
231
- readonly 700: "#983804";
232
- readonly 800: "#6F290F";
233
- readonly 900: "#4E1C0C";
234
- readonly 950: "#331107";
256
+ readonly h6: {
257
+ readonly fontFamily: "heading";
258
+ readonly fontSize: "1.125rem";
259
+ readonly fontWeight: 600;
260
+ readonly lineHeight: 1.375;
235
261
  };
236
- readonly amber: {
237
- readonly 50: "#FFF7DD";
238
- readonly 100: "#FFEAA9";
239
- readonly 200: "#FFD352";
240
- readonly 300: "#F9B415";
241
- readonly 400: "#E08C00";
242
- readonly 500: "#C27400";
243
- readonly 600: "#A45E00";
244
- readonly 700: "#814D14";
245
- readonly 800: "#5B3A1A";
246
- readonly 900: "#442503";
247
- readonly 950: "#301500";
262
+ readonly body1: {
263
+ readonly fontFamily: "body";
264
+ readonly fontSize: "1rem";
265
+ readonly fontWeight: 400;
266
+ readonly lineHeight: 1.5;
248
267
  };
249
- readonly green: {
250
- readonly 50: "#E3FFEE";
251
- readonly 100: "#B5FFD2";
252
- readonly 200: "#58F69E";
253
- readonly 300: "#2ED573";
254
- readonly 400: "#21C05D";
255
- readonly 500: "#22A444";
256
- readonly 600: "#298732";
257
- readonly 700: "#2B6B25";
258
- readonly 800: "#264D1C";
259
- readonly 900: "#1B3515";
260
- readonly 950: "#11220D";
268
+ readonly body2: {
269
+ readonly fontFamily: "body";
270
+ readonly fontSize: "0.875rem";
271
+ readonly fontWeight: 400;
272
+ readonly lineHeight: 1.57;
261
273
  };
262
- readonly cyan: {
263
- readonly 50: "#E6FBFF";
264
- readonly 100: "#C2F6FF";
265
- readonly 200: "#62EAFF";
266
- readonly 300: "#22D3EE";
267
- readonly 400: "#01B5D1";
268
- readonly 500: "#2697B7";
269
- readonly 600: "#307B9B";
270
- readonly 700: "#2A617F";
271
- readonly 800: "#22465F";
272
- readonly 900: "#0B3149";
273
- readonly 950: "#001F36";
274
+ readonly subtitle1: {
275
+ readonly fontFamily: "body";
276
+ readonly fontSize: "1rem";
277
+ readonly fontWeight: 500;
278
+ readonly lineHeight: 1.75;
274
279
  };
275
- readonly blue: {
276
- readonly 50: "#EFF8FF";
277
- readonly 100: "#D9EFFF";
278
- readonly 200: "#ACDBFF";
279
- readonly 300: "#78C2FF";
280
- readonly 400: "#3CA8FF";
281
- readonly 500: "#2196F3";
282
- readonly 600: "#1072CB";
283
- readonly 700: "#135AA8";
284
- readonly 800: "#14407E";
285
- readonly 900: "#112C5A";
286
- readonly 950: "#091B3C";
280
+ readonly subtitle2: {
281
+ readonly fontFamily: "body";
282
+ readonly fontSize: "0.875rem";
283
+ readonly fontWeight: 500;
284
+ readonly lineHeight: 1.57;
287
285
  };
288
- readonly magenta: {
289
- readonly 50: "#FFF3F9";
290
- readonly 100: "#FFE2F1";
291
- readonly 200: "#FFBDE2";
292
- readonly 300: "#FF8FD5";
293
- readonly 400: "#ED69C3";
294
- readonly 500: "#D548AF";
295
- readonly 600: "#BA2996";
296
- readonly 700: "#9C0D7A";
297
- readonly 800: "#77005A";
298
- readonly 900: "#56003F";
299
- readonly 950: "#3B0029";
286
+ readonly caption: {
287
+ readonly fontFamily: "body";
288
+ readonly fontSize: "0.75rem";
289
+ readonly fontWeight: 400;
290
+ readonly lineHeight: 1.66;
300
291
  };
301
- };
302
- /**
303
- * Categorical (qualitative) palette — an ordered, CVD-safe series expressed as
304
- * references into {@link primitiveRamps} (one source of truth; the palette moves
305
- * with the ramps).
306
- *
307
- * Design: a single canonical hue order (blue, magenta, red, orange, green, cyan,
308
- * amber), with steps chosen vivid-midtone-first and fanned lighter/darker as the
309
- * series grows to preserve separation. The sequence is nested-stable — a chart
310
- * with N series uses the first N colors, and the series index is stable as N
311
- * changes. Colorblind-safe worst-case deuteranopia/protanopia floor 8 holds
312
- * through {@link CATEGORICAL_CVD_SAFE_MAX} colors; the 7th is an extended color
313
- * that should be paired with a legend or other secondary encoding.
314
- *
315
- * Two variants: `default` (vivid, sits on neutral/light surfaces, legible under
316
- * black text) and `dark` (deeper shades legible under white text on a fill). A
317
- * separate "light" variant was dropped — the vivid `default` picks already clear
318
- * black-text contrast, so it doubles as the light-context palette.
319
- */
320
- declare const categoricalPalette: {
321
- readonly default: readonly ["#2196F3", "#D548AF", "#E05254", "#FF7900", "#2ED573", "#22D3EE", "#A45E00"];
322
- readonly dark: readonly ["#1072CB", "#BA2996", "#E05254", "#B94A00", "#264D1C", "#22465F", "#C27400"];
323
- };
324
- /** Largest series count that holds the CVD floor without a legend. */
325
- declare const CATEGORICAL_CVD_SAFE_MAX = 6;
326
- /**
327
- * Categorical palette variant.
328
- * - `default` : vivid; neutral/light surfaces, legible under black text
329
- * - `dark` : deeper shades, legible under white text on a filled swatch
330
- */
331
- type CategoricalVariant = keyof typeof categoricalPalette;
332
- /**
333
- * Get a color from the ordered categorical palette by series index.
334
- * The palette is nested-stable, so the color for a given index does not change
335
- * with the total series count; `index` simply wraps past the end.
336
- *
337
- * @param index - 0-based series index (wraps past the end)
338
- * @param variant - `default` (black-text / light surfaces) or `dark` (white text)
339
- * @returns The hex color string
340
- */
341
- declare function getCategoricalColor(index: number, variant?: CategoricalVariant): string;
342
- /**
343
- * Diverging status scale (BodyMap training-status: under → optimal → over) as
344
- * references into {@link primitiveRamps}. A true diverging shape — `optimal` is
345
- * the lightest center, the extremes go darker — so the signal reads in lightness
346
- * (colorblind-robust; worst-case deut/protanopia min ΔE ~10.9) and the direction
347
- * reads in the blue↔red axis (the CVD-safe hue pair).
348
- *
349
- * Tuned so every stop is dark enough for the fill yet light enough that BLACK
350
- * text clears 4.5:1 on all five — no per-cell white/black flipping. The value
351
- * valley is symmetric: the two mid-arms (maintenance / approaching) sit at equal
352
- * lightness (both ~0.53 relative luminance), the ends darker.
353
- */
354
- declare const divergingScale: readonly ["#2196F3", "#22D3EE", "#58F69E", "#F9B415", "#D14343"];
355
- /**
356
- * Sequential "effort" scale (low → high intensity: green → yellow → orange → red)
357
- * as references into {@link primitiveRamps}. A 6-stop ordinal palette; the
358
- * velocity/RPE strip sub-samples it. Every adjacent pair clears the CVD floor
359
- * (min deut/protan ΔE ≥ 4.5), and within that the hue walk is kept smooth —
360
- * the amber-200 → amber-300 → orange-400 run steps the yellow→orange transition
361
- * gradually rather than lurching. Order encodes magnitude, so it tolerates the
362
- * green↔red CVD pair. Stops 0–3 take black text; the dark reds take white.
363
- */
364
- declare const sequentialEffort: readonly ["#2ED573", "#FFD352", "#F9B415", "#FF7900", "#D14343", "#A4221C"];
365
- /**
366
- * Best-contrast text color (black or white) for a solid fill — for labels sitting
367
- * on categorical/diverging/effort swatches. Uses the WCAG relative-luminance ratio.
368
- */
369
- declare function bestTextColor(hex: string): '#000000' | '#FFFFFF';
370
- /**
371
- * Discrete rainbow palette for data visualization
372
- * Based on Paul Tol's color schemes: https://personal.sron.nl/~pault/#fig:scheme_rainbow_discrete
373
- */
374
- declare const discreteRainbow: readonly ["#E8ECFB", "#D9CCE3", "#D1BBD7", "#CAACCB", "#BA8DB4", "#AE76A3", "#AA6F9E", "#994F88", "#882E72", "#1965B0", "#437DBF", "#5289C7", "#6195CF", "#7BAFDE", "#4EB265", "#90C987", "#CAE0AB", "#F7F056", "#F7CB45", "#F6C141", "#F4A736", "#F1932D", "#EE8026", "#E8601C", "#E65518", "#DC050C", "#A5170E", "#72190E", "#42150A"];
375
- /**
376
- * Get a color from the discrete rainbow palette for a given index and palette size.
377
- * Colors are optimized for visual distinction at each palette size.
378
- *
379
- * @param index - The index of the color in the series (0-based)
380
- * @param size - The total number of colors needed (1-23)
381
- * @returns The hex color string
382
- */
383
- declare function getDiscreteRainbowColor(index: number, size: number): string;
384
- declare const primitiveTypography: {
385
- readonly fontFamilies: {
386
- readonly sans: readonly ["Inter", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "Helvetica", "Arial", "sans-serif"];
387
- readonly body: readonly ["Nunito Sans", "sans-serif"];
388
- readonly heading: readonly ["Space Grotesk", "sans-serif"];
389
- readonly mono: readonly ["SF Mono", "Monaco", "Inconsolata", "Fira Mono", "Droid Sans Mono", "Source Code Pro", "monospace"];
292
+ readonly overline: {
293
+ readonly fontFamily: "body";
294
+ readonly fontSize: "0.75rem";
295
+ readonly fontWeight: 600;
296
+ readonly lineHeight: 2.5;
297
+ readonly letterSpacing: "0.5px";
298
+ readonly textTransform: "uppercase";
390
299
  };
391
- readonly fontSizes: {
392
- readonly xs: "0.75rem";
393
- readonly sm: "0.875rem";
394
- readonly base: "1rem";
395
- readonly lg: "1.125rem";
396
- readonly xl: "1.5rem";
397
- readonly '2xl': "2rem";
398
- readonly '3xl': "2.25rem";
399
- readonly '4xl': "3rem";
400
- readonly '5xl': "3.5rem";
300
+ readonly button: {
301
+ readonly fontFamily: "sans";
302
+ readonly fontSize: "0.875rem";
303
+ readonly fontWeight: 600;
304
+ readonly lineHeight: 1.75;
401
305
  };
402
- readonly fontWeights: {
403
- readonly normal: 400;
404
- readonly medium: 500;
405
- readonly semibold: 600;
406
- readonly bold: 700;
306
+ };
307
+ declare const buttonSizes: {
308
+ readonly sm: {
309
+ readonly paddingX: "16px";
310
+ readonly paddingY: "6px";
311
+ readonly fontSize: "0.875rem";
407
312
  };
408
- readonly lineHeights: {
409
- readonly none: 1;
410
- readonly tight: 1.375;
411
- readonly snug: 1.5;
412
- readonly normal: 1.57;
413
- readonly relaxed: 1.66;
414
- readonly loose: 1.75;
313
+ readonly md: {
314
+ readonly paddingX: "20px";
315
+ readonly paddingY: "8px";
316
+ readonly fontSize: "0.875rem";
415
317
  };
416
- readonly letterSpacing: {
417
- readonly tighter: "-0.05em";
418
- readonly tight: "-0.025em";
419
- readonly normal: "0em";
420
- readonly wide: "0.025em";
421
- readonly wider: "0.05em";
422
- readonly widest: "0.5px";
318
+ readonly lg: {
319
+ readonly paddingX: "24px";
320
+ readonly paddingY: "11px";
321
+ readonly fontSize: "1rem";
423
322
  };
424
323
  };
425
- declare const primitiveSpacing: {
426
- readonly 0: "0";
427
- readonly px: "1px";
428
- readonly 0.5: "0.125rem";
429
- readonly 1: "0.25rem";
430
- readonly 1.5: "0.375rem";
431
- readonly 2: "0.5rem";
432
- readonly 2.5: "0.625rem";
433
- readonly 3: "0.75rem";
434
- readonly 3.5: "0.875rem";
435
- readonly 4: "1rem";
436
- readonly 5: "1.25rem";
437
- readonly 6: "1.5rem";
438
- readonly 7: "1.75rem";
439
- readonly 8: "2rem";
440
- readonly 9: "2.25rem";
441
- readonly 10: "2.5rem";
442
- readonly 11: "2.75rem";
443
- readonly 12: "3rem";
444
- readonly 14: "3.5rem";
445
- readonly 16: "4rem";
446
- readonly 20: "5rem";
447
- readonly 24: "6rem";
448
- readonly 28: "7rem";
449
- readonly 32: "8rem";
450
- };
451
- declare const primitiveBorderRadius: {
452
- readonly none: "0";
453
- readonly sm: "4px";
454
- readonly DEFAULT: "8px";
455
- readonly md: "8px";
456
- readonly lg: "12px";
457
- readonly xl: "16px";
458
- readonly '2xl': "24px";
459
- readonly full: "9999px";
460
- };
461
- declare const primitiveShadows: {
462
- readonly none: "none";
463
- readonly sm: "0px 1px 2px rgba(100, 116, 139, 0.12)";
464
- readonly DEFAULT: "0px 1px 3px rgba(100, 116, 139, 0.12), 0px 1px 2px rgba(100, 116, 139, 0.24)";
465
- readonly md: "0px 4px 6px rgba(100, 116, 139, 0.12)";
466
- readonly lg: "0px 10px 15px rgba(100, 116, 139, 0.12)";
467
- readonly xl: "0px 20px 25px rgba(100, 116, 139, 0.12)";
468
- readonly '2xl': "0px 25px 50px rgba(100, 116, 139, 0.25)";
469
- readonly inner: "inset 0 2px 4px 0 rgba(0, 0, 0, 0.06)";
470
- };
471
- declare const primitiveBreakpoints: {
472
- readonly xs: 0;
473
- readonly sm: 600;
474
- readonly md: 1000;
475
- readonly lg: 1200;
476
- readonly xl: 1920;
477
- };
478
- declare const primitiveZIndex: {
479
- readonly hide: -1;
480
- readonly auto: "auto";
481
- readonly base: 0;
482
- readonly docked: 10;
483
- readonly dropdown: 1000;
484
- readonly sticky: 1100;
485
- readonly drawer: 1100;
486
- readonly banner: 1200;
487
- readonly appBar: 1200;
488
- readonly overlay: 1300;
489
- readonly modal: 1400;
490
- readonly popover: 1500;
491
- readonly skipLink: 1600;
492
- readonly toast: 1700;
493
- readonly tooltip: 1800;
494
- };
495
-
496
- /**
497
- * Semantic Design Tokens
498
- *
499
- * Meaningful tokens following DTCG (Design Tokens Community Group) naming conventions.
500
- * Pattern: {category}-{intent}-{variant?}-{state?}
501
- *
502
- * Categories:
503
- * - brand-* : Brand colors (primary, secondary, accent)
504
- * - status-* : Feedback colors (success, error, warning, info)
505
- * - result-* : Outcome indicators (improve, degrade, inconclusive, neutral)
506
- * - data-* : Data visualization colors (chart series)
507
- * - on-* : Text on colored backgrounds
508
- * - surface-* : Elevated containers (NOT "paper")
509
- * - background-* : Page backgrounds
510
- * - text-* : Text colors
511
- * - border-* : Border colors
512
- * - interactive-* : Hover/focus/active/disabled states
513
- */
514
- declare const semanticColorsLight: {
324
+ type ThemeMode = 'light' | 'dark';
325
+ declare function getSemanticColors(mode: ThemeMode): {
515
326
  readonly 'brand-primary': "#FF7900";
516
327
  readonly 'brand-primary-light': "#FFA063";
517
328
  readonly 'brand-primary-dark': "#DA5F00";
@@ -586,9 +397,11 @@ declare const semanticColorsLight: {
586
397
  readonly 'surface-raised': "#F3F4F6";
587
398
  readonly 'surface-overlay': "#FFFFFF";
588
399
  readonly 'surface-input': "#FAFAFA";
400
+ readonly 'surface-inset': "#D1D5DB";
589
401
  readonly 'background-base': "#EBEBEB";
590
402
  readonly 'background-default': "#FFFFFF";
591
403
  readonly 'background-subtle': "#FAFAFA";
404
+ readonly 'background-frame': "#9CA3AF";
592
405
  readonly 'border-default': "#E8E9EB";
593
406
  readonly 'border-subtle': "#F3F4F6";
594
407
  readonly 'border-strong': "#D1D5DB";
@@ -598,6 +411,9 @@ declare const semanticColorsLight: {
598
411
  readonly 'border-input-hover': "#9CA3AF";
599
412
  readonly 'border-input-focus': "#5048E5";
600
413
  readonly 'border-input-error': "#D14343";
414
+ readonly 'hairline-subtle': "rgba(0, 0, 0, 0.06)";
415
+ readonly 'hairline-default': "rgba(0, 0, 0, 0.09)";
416
+ readonly 'hairline-strong': "rgba(0, 0, 0, 0.14)";
601
417
  readonly 'interactive-hover': "rgba(55, 65, 81, 0.04)";
602
418
  readonly 'interactive-focus': "rgba(55, 65, 81, 0.12)";
603
419
  readonly 'interactive-active': "rgba(55, 65, 81, 0.16)";
@@ -607,8 +423,7 @@ declare const semanticColorsLight: {
607
423
  readonly divider: "#E8E9EB";
608
424
  readonly 'avatar-background': "#6B7280";
609
425
  readonly 'avatar-text': "#FFFFFF";
610
- };
611
- declare const semanticColorsDark: {
426
+ } | {
612
427
  readonly 'brand-primary': "#FF7900";
613
428
  readonly 'brand-primary-light': "#FFA063";
614
429
  readonly 'brand-primary-dark': "#DA5F00";
@@ -678,14 +493,16 @@ declare const semanticColorsDark: {
678
493
  readonly 'text-inverse': "#111827";
679
494
  readonly 'text-link': "#828DF8";
680
495
  readonly 'text-link-hover': "#60A5FA";
681
- readonly 'surface-base': "#161616";
682
- readonly 'surface-elevated': "#191919";
683
- readonly 'surface-raised': "#1C1C1C";
684
- readonly 'surface-overlay': "#191919";
685
- readonly 'surface-input': "#191919";
686
- readonly 'background-base': "#101010";
687
- readonly 'background-default': "#161616";
688
- readonly 'background-subtle': "#1C1C1C";
496
+ readonly 'surface-base': "#252321";
497
+ readonly 'surface-elevated': "#2C2A28";
498
+ readonly 'surface-raised': "#31302F";
499
+ readonly 'surface-overlay': "#373635";
500
+ readonly 'surface-input': "#2C2A28";
501
+ readonly 'surface-inset': "#13100D";
502
+ readonly 'background-base': "#1C1916";
503
+ readonly 'background-default': "#252321";
504
+ readonly 'background-subtle': "#2C2A28";
505
+ readonly 'background-frame': "#100D0A";
689
506
  readonly 'border-default': "#1F1F1F";
690
507
  readonly 'border-subtle': "#1C1C1C";
691
508
  readonly 'border-strong': "#2C2C2C";
@@ -695,6 +512,9 @@ declare const semanticColorsDark: {
695
512
  readonly 'border-input-hover': "#6B7280";
696
513
  readonly 'border-input-focus': "#828DF8";
697
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)";
698
518
  readonly 'interactive-hover': "rgba(255, 255, 255, 0.04)";
699
519
  readonly 'interactive-focus': "rgba(255, 255, 255, 0.12)";
700
520
  readonly 'interactive-active': "rgba(255, 255, 255, 0.16)";
@@ -705,298 +525,553 @@ declare const semanticColorsDark: {
705
525
  readonly 'avatar-background': "#4B5563";
706
526
  readonly 'avatar-text': "#FFFFFF";
707
527
  };
708
- declare const semanticTypography: {
709
- readonly h1: {
710
- readonly fontFamily: "heading";
711
- readonly fontSize: "3.5rem";
712
- readonly fontWeight: 700;
713
- readonly lineHeight: 1.375;
714
- };
715
- readonly h2: {
716
- readonly fontFamily: "heading";
717
- readonly fontSize: "3rem";
718
- readonly fontWeight: 700;
719
- readonly lineHeight: 1.375;
720
- };
721
- readonly h3: {
722
- readonly fontFamily: "heading";
723
- readonly fontSize: "2.25rem";
724
- readonly fontWeight: 700;
725
- readonly lineHeight: 1.375;
528
+
529
+ /**
530
+ * Elevation System
531
+ *
532
+ * A unified depth system where each elevation level corresponds to:
533
+ * - Calculated surface color (derived from base using lighten)
534
+ * - Shadow intensity and style (raised/pressed)
535
+ * - Dynamically calculated shadow colors (derived from surface color)
536
+ * - Semantic name for reference
537
+ *
538
+ * Elevation range: -2 (deep inset) to +5 (floating overlay)
539
+ *
540
+ * Negative elevations: Inset/pressed elements (sunken into surface)
541
+ * Zero elevation: Base surface (background/page level)
542
+ * Positive elevations: Raised elements (floating above surface)
543
+ *
544
+ * All colors are calculated dynamically from a base surface color,
545
+ * allowing for custom surfaces and consistent color relationships.
546
+ *
547
+ * Lighting Model: Light source from upper-right corner
548
+ * - Raised elements are always lighter than base (consistent across themes)
549
+ * - Base colors must allow sufficient lightening in both themes
550
+ */
551
+
552
+ type ElevationLevel = -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5;
553
+ interface ElevationConfig {
554
+ /** Semantic name for this elevation level */
555
+ name: string;
556
+ /** Amount to lighten base color (0-1) */
557
+ colorAdjustment: number;
558
+ /** Shadow intensity */
559
+ shadowIntensity: 'subtle' | 'medium' | 'strong';
560
+ /** Shadow style: raised (floating) or pressed (inset) */
561
+ shadowStyle: 'raised' | 'pressed';
562
+ /** Description of use case */
563
+ description: string;
564
+ }
565
+ declare const elevationSystem: Record<ElevationLevel, ElevationConfig>;
566
+ /**
567
+ * Get elevation configuration for a given level
568
+ */
569
+ declare function getElevationConfig(level: ElevationLevel): ElevationConfig;
570
+ /**
571
+ * Calculate surface color for an elevation level from a base color.
572
+ * Results are cached to avoid redundant calculations.
573
+ *
574
+ * @param baseColor - Base surface color (hex)
575
+ * @param level - Elevation level
576
+ * @param theme - Current theme ('light' or 'dark')
577
+ * @returns Calculated surface color (hex)
578
+ */
579
+ declare function getElevationSurface(baseColor: string, level: ElevationLevel, theme: 'light' | 'dark'): string;
580
+ /**
581
+ * Get shadow style for an elevation level, calculated dynamically from surface color.
582
+ * Results are cached to avoid redundant calculations.
583
+ *
584
+ * @param baseColor - Base surface color (hex)
585
+ * @param level - Elevation level
586
+ * @param theme - Current theme ('light' or 'dark')
587
+ * @param isHovered - Whether element is hovered
588
+ * @returns ViewStyle with shadow properties
589
+ */
590
+ declare function getElevationShadow(baseColor: string, level: ElevationLevel, theme: 'light' | 'dark', isHovered?: boolean): ViewStyle;
591
+ /**
592
+ * Elevation level backing a `<Surface pressed>` recess: the shallow `inset`
593
+ * (-1) step. Pressed exposes ONE level of depth — pressed-2 is intentionally
594
+ * not surfaced (the deeper `-2` deep-inset stays available to `elevation`).
595
+ */
596
+ declare const PRESSED_ELEVATION_LEVEL: ElevationLevel;
597
+ /**
598
+ * Inner-shadow recess for a pressed (sunken) surface, tuned to the well's own
599
+ * fill colour so the rim/shadow tints track the darker fill. Composes WITH the
600
+ * darker pressed fill: on web it adds an inset boxShadow; on the native path
601
+ * (no inset-shadow support) it's a no-op and the recess reads via the fill
602
+ * alone — so a pressed surface stays legibly sunken with or without the shadow.
603
+ *
604
+ * @param fillColor - The pressed surface's own fill (one ramp step down).
605
+ * @param theme - Current theme ('light' or 'dark').
606
+ */
607
+ declare function getPressedRecessShadow(fillColor: string, theme: 'light' | 'dark'): ViewStyle;
608
+ /**
609
+ * Get base surface color from theme.
610
+ * This is the foundation color that all elevations are calculated from.
611
+ *
612
+ * IMPORTANT: Base colors must be chosen to allow sufficient lightening.
613
+ *
614
+ * **Light Mode**: Cannot use `#FFFFFF` (white) - cannot lighten white!
615
+ * - Use `#F3F4F6` (neutral[100]) - can lighten to `#FAFAFA` → `#FFFFFF`
616
+ * - This allows raised elevations to be lighter (closer to white)
617
+ *
618
+ * **Dark Mode**: Need lighter base to allow sufficient lightening
619
+ * - Use `surface-elevated` (#2A2827, TD-surface-tokens ramp) - allows further lightening
620
+ *
621
+ * Can be overridden to use custom base colors for special cases.
622
+ */
623
+ declare function getBaseSurfaceColor(theme: 'light' | 'dark'): string;
624
+ /**
625
+ * Component-specific elevation ranges
626
+ * Defines which elevation levels each component type can use
627
+ */
628
+ declare const componentElevationRanges: {
629
+ readonly button: {
630
+ readonly allowed: readonly [2];
631
+ readonly default: 2;
632
+ readonly hover: 3;
726
633
  };
727
- readonly h4: {
728
- readonly fontFamily: "heading";
729
- readonly fontSize: "2rem";
730
- readonly fontWeight: 700;
731
- readonly lineHeight: 1.375;
634
+ readonly card: {
635
+ readonly allowed: readonly [1, 2, 3];
636
+ readonly default: 2;
637
+ readonly hover: 3;
732
638
  };
733
- readonly h5: {
734
- readonly fontFamily: "heading";
735
- readonly fontSize: "1.5rem";
736
- readonly fontWeight: 600;
737
- readonly lineHeight: 1.375;
639
+ readonly input: {
640
+ readonly allowed: readonly [-2, -1, 0];
641
+ readonly default: -1;
738
642
  };
739
- readonly h6: {
740
- readonly fontFamily: "heading";
741
- readonly fontSize: "1.125rem";
742
- readonly fontWeight: 600;
743
- readonly lineHeight: 1.375;
643
+ readonly overlay: {
644
+ readonly allowed: readonly [4, 5];
645
+ readonly default: 4;
744
646
  };
745
- readonly body1: {
746
- readonly fontFamily: "body";
747
- readonly fontSize: "1rem";
748
- readonly fontWeight: 400;
749
- readonly lineHeight: 1.5;
647
+ };
648
+ type ComponentType = keyof typeof componentElevationRanges;
649
+ /**
650
+ * Validate and clamp elevation to component's allowed range
651
+ */
652
+ declare function getValidatedElevation(component: ComponentType, requested: ElevationLevel): ElevationLevel;
653
+ type GlowIntensity = 'subtle' | 'medium' | 'strong';
654
+ /**
655
+ * Get a glow shadow style for emphasis/active states.
656
+ *
657
+ * Creates a colored radial glow around an element, useful for:
658
+ * - Active recording indicators (orange glow)
659
+ * - Success states (green glow)
660
+ * - Error/danger indicators (red glow)
661
+ * - Focus rings and attention-drawing elements
662
+ *
663
+ * @param color - Glow color (hex string, e.g. '#FF7900')
664
+ * @param intensity - Glow intensity level
665
+ * @returns ViewStyle with platform-specific shadow properties
666
+ */
667
+ declare function getGlowShadow(color: string, intensity?: GlowIntensity): ViewStyle;
668
+
669
+ /**
670
+ * Primitive Design Tokens
671
+ *
672
+ * Raw values with no semantic meaning. These are the foundation of the design system
673
+ * and should rarely be used directly in components. Use semantic tokens instead.
674
+ */
675
+ 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";
750
687
  };
751
- readonly body2: {
752
- readonly fontFamily: "body";
753
- readonly fontSize: "0.875rem";
754
- readonly fontWeight: 400;
755
- readonly lineHeight: 1.57;
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";
756
699
  };
757
- readonly subtitle1: {
758
- readonly fontFamily: "body";
759
- readonly fontSize: "1rem";
760
- readonly fontWeight: 500;
761
- readonly lineHeight: 1.75;
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";
762
711
  };
763
- readonly subtitle2: {
764
- readonly fontFamily: "body";
765
- readonly fontSize: "0.875rem";
766
- readonly fontWeight: 500;
767
- readonly lineHeight: 1.57;
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";
768
724
  };
769
- readonly caption: {
770
- readonly fontFamily: "body";
771
- readonly fontSize: "0.75rem";
772
- readonly fontWeight: 400;
773
- readonly lineHeight: 1.66;
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";
774
737
  };
775
- readonly overline: {
776
- readonly fontFamily: "body";
777
- readonly fontSize: "0.75rem";
778
- readonly fontWeight: 600;
779
- readonly lineHeight: 2.5;
780
- readonly letterSpacing: "0.5px";
781
- readonly textTransform: "uppercase";
738
+ readonly white: "#FFFFFF";
739
+ readonly black: "#000000";
740
+ readonly transparent: "transparent";
741
+ };
742
+ /**
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.
762
+ */
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";
770
+ };
771
+ /**
772
+ * Frame/bezel primitive — dark mode (TD-surface-tokens, S-3)
773
+ *
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.
778
+ */
779
+ declare const backgroundFrameDark = "#100D0A";
780
+ /**
781
+ * Derived tonal ramps (TD-05.09 color foundations)
782
+ *
783
+ * Seven OKLCH-generated hue ramps, 11 perceptual lightness steps each (50 -> 950).
784
+ * Built with hue-torsion + a chroma arc, anchored through existing brand/semantic
785
+ * hexes. `pin` marks the step each ramp flows through its anchor.
786
+ * This is the single source of truth for chromatic hexes — the categorical palette
787
+ * below references these steps rather than duplicating values.
788
+ * See coordination/design-explorations/foundations.
789
+ */
790
+ declare const primitiveRamps: {
791
+ readonly red: {
792
+ readonly 50: "#FFF4F4";
793
+ readonly 100: "#FFE3E5";
794
+ readonly 200: "#FFC2C5";
795
+ readonly 300: "#FF9A9D";
796
+ readonly 400: "#F77175";
797
+ readonly 500: "#E05254";
798
+ readonly 600: "#D14343";
799
+ readonly 700: "#A4221C";
800
+ readonly 800: "#7E1002";
801
+ readonly 900: "#5A0900";
802
+ readonly 950: "#3D0400";
782
803
  };
783
- readonly button: {
784
- readonly fontFamily: "sans";
785
- readonly fontSize: "0.875rem";
786
- readonly fontWeight: 600;
787
- readonly lineHeight: 1.75;
804
+ readonly orange: {
805
+ readonly 50: "#FFF5ED";
806
+ readonly 100: "#FFE6D4";
807
+ readonly 200: "#FFC7A2";
808
+ readonly 300: "#FFA063";
809
+ readonly 400: "#FF7900";
810
+ readonly 500: "#DA5F00";
811
+ readonly 600: "#B94A00";
812
+ readonly 700: "#983804";
813
+ readonly 800: "#6F290F";
814
+ readonly 900: "#4E1C0C";
815
+ readonly 950: "#331107";
816
+ };
817
+ readonly amber: {
818
+ readonly 50: "#FFF7DD";
819
+ readonly 100: "#FFEAA9";
820
+ readonly 200: "#FFD352";
821
+ readonly 300: "#F9B415";
822
+ readonly 400: "#E08C00";
823
+ readonly 500: "#C27400";
824
+ readonly 600: "#A45E00";
825
+ readonly 700: "#814D14";
826
+ readonly 800: "#5B3A1A";
827
+ readonly 900: "#442503";
828
+ readonly 950: "#301500";
829
+ };
830
+ readonly green: {
831
+ readonly 50: "#E3FFEE";
832
+ readonly 100: "#B5FFD2";
833
+ readonly 200: "#58F69E";
834
+ readonly 300: "#2ED573";
835
+ readonly 400: "#21C05D";
836
+ readonly 500: "#22A444";
837
+ readonly 600: "#298732";
838
+ readonly 700: "#2B6B25";
839
+ readonly 800: "#264D1C";
840
+ readonly 900: "#1B3515";
841
+ readonly 950: "#11220D";
842
+ };
843
+ readonly cyan: {
844
+ readonly 50: "#E6FBFF";
845
+ readonly 100: "#C2F6FF";
846
+ readonly 200: "#62EAFF";
847
+ readonly 300: "#22D3EE";
848
+ readonly 400: "#01B5D1";
849
+ readonly 500: "#2697B7";
850
+ readonly 600: "#307B9B";
851
+ readonly 700: "#2A617F";
852
+ readonly 800: "#22465F";
853
+ readonly 900: "#0B3149";
854
+ readonly 950: "#001F36";
855
+ };
856
+ readonly blue: {
857
+ readonly 50: "#EFF8FF";
858
+ readonly 100: "#D9EFFF";
859
+ readonly 200: "#ACDBFF";
860
+ readonly 300: "#78C2FF";
861
+ readonly 400: "#3CA8FF";
862
+ readonly 500: "#2196F3";
863
+ readonly 600: "#1072CB";
864
+ readonly 700: "#135AA8";
865
+ readonly 800: "#14407E";
866
+ readonly 900: "#112C5A";
867
+ readonly 950: "#091B3C";
868
+ };
869
+ readonly magenta: {
870
+ readonly 50: "#FFF3F9";
871
+ readonly 100: "#FFE2F1";
872
+ readonly 200: "#FFBDE2";
873
+ readonly 300: "#FF8FD5";
874
+ readonly 400: "#ED69C3";
875
+ readonly 500: "#D548AF";
876
+ readonly 600: "#BA2996";
877
+ readonly 700: "#9C0D7A";
878
+ readonly 800: "#77005A";
879
+ readonly 900: "#56003F";
880
+ readonly 950: "#3B0029";
788
881
  };
789
882
  };
790
- declare const buttonSizes: {
791
- readonly sm: {
792
- readonly paddingX: "16px";
793
- readonly paddingY: "6px";
794
- readonly fontSize: "0.875rem";
883
+ /**
884
+ * Categorical (qualitative) palette — an ordered, CVD-safe series expressed as
885
+ * references into {@link primitiveRamps} (one source of truth; the palette moves
886
+ * with the ramps).
887
+ *
888
+ * Design: a single canonical hue order (blue, magenta, red, orange, green, cyan,
889
+ * amber), with steps chosen vivid-midtone-first and fanned lighter/darker as the
890
+ * series grows to preserve separation. The sequence is nested-stable — a chart
891
+ * with N series uses the first N colors, and the series index is stable as N
892
+ * changes. Colorblind-safe worst-case deuteranopia/protanopia floor 8 holds
893
+ * through {@link CATEGORICAL_CVD_SAFE_MAX} colors; the 7th is an extended color
894
+ * that should be paired with a legend or other secondary encoding.
895
+ *
896
+ * Two variants: `default` (vivid, sits on neutral/light surfaces, legible under
897
+ * black text) and `dark` (deeper shades legible under white text on a fill). A
898
+ * separate "light" variant was dropped — the vivid `default` picks already clear
899
+ * black-text contrast, so it doubles as the light-context palette.
900
+ */
901
+ declare const categoricalPalette: {
902
+ readonly default: readonly ["#2196F3", "#D548AF", "#E05254", "#FF7900", "#2ED573", "#22D3EE", "#A45E00"];
903
+ readonly dark: readonly ["#1072CB", "#BA2996", "#E05254", "#B94A00", "#264D1C", "#22465F", "#C27400"];
904
+ };
905
+ /** Largest series count that holds the CVD floor without a legend. */
906
+ declare const CATEGORICAL_CVD_SAFE_MAX = 6;
907
+ /**
908
+ * Categorical palette variant.
909
+ * - `default` : vivid; neutral/light surfaces, legible under black text
910
+ * - `dark` : deeper shades, legible under white text on a filled swatch
911
+ */
912
+ type CategoricalVariant = keyof typeof categoricalPalette;
913
+ /**
914
+ * Get a color from the ordered categorical palette by series index.
915
+ * The palette is nested-stable, so the color for a given index does not change
916
+ * with the total series count; `index` simply wraps past the end.
917
+ *
918
+ * @param index - 0-based series index (wraps past the end)
919
+ * @param variant - `default` (black-text / light surfaces) or `dark` (white text)
920
+ * @returns The hex color string
921
+ */
922
+ declare function getCategoricalColor(index: number, variant?: CategoricalVariant): string;
923
+ /**
924
+ * Diverging status scale (BodyMap training-status: under → optimal → over) as
925
+ * references into {@link primitiveRamps}. A true diverging shape — `optimal` is
926
+ * the lightest center, the extremes go darker — so the signal reads in lightness
927
+ * (colorblind-robust; worst-case deut/protanopia min ΔE ~10.9) and the direction
928
+ * reads in the blue↔red axis (the CVD-safe hue pair).
929
+ *
930
+ * Tuned so every stop is dark enough for the fill yet light enough that BLACK
931
+ * text clears 4.5:1 on all five — no per-cell white/black flipping. The value
932
+ * valley is symmetric: the two mid-arms (maintenance / approaching) sit at equal
933
+ * lightness (both ~0.53 relative luminance), the ends darker.
934
+ */
935
+ declare const divergingScale: readonly ["#2196F3", "#22D3EE", "#58F69E", "#F9B415", "#D14343"];
936
+ /**
937
+ * Sequential "effort" scale (low → high intensity: green → yellow → orange → red)
938
+ * as references into {@link primitiveRamps}. A 6-stop ordinal palette; the
939
+ * velocity/RPE strip sub-samples it. Every adjacent pair clears the CVD floor
940
+ * (min deut/protan ΔE ≥ 4.5), and within that the hue walk is kept smooth —
941
+ * the amber-200 → amber-300 → orange-400 run steps the yellow→orange transition
942
+ * gradually rather than lurching. Order encodes magnitude, so it tolerates the
943
+ * green↔red CVD pair. Stops 0–3 take black text; the dark reds take white.
944
+ */
945
+ declare const sequentialEffort: readonly ["#2ED573", "#FFD352", "#F9B415", "#FF7900", "#D14343", "#A4221C"];
946
+ /**
947
+ * Best-contrast text color (black or white) for a solid fill — for labels sitting
948
+ * on categorical/diverging/effort swatches. Uses the WCAG relative-luminance ratio.
949
+ */
950
+ declare function bestTextColor(hex: string): '#000000' | '#FFFFFF';
951
+ /**
952
+ * Discrete rainbow palette for data visualization
953
+ * Based on Paul Tol's color schemes: https://personal.sron.nl/~pault/#fig:scheme_rainbow_discrete
954
+ */
955
+ declare const discreteRainbow: readonly ["#E8ECFB", "#D9CCE3", "#D1BBD7", "#CAACCB", "#BA8DB4", "#AE76A3", "#AA6F9E", "#994F88", "#882E72", "#1965B0", "#437DBF", "#5289C7", "#6195CF", "#7BAFDE", "#4EB265", "#90C987", "#CAE0AB", "#F7F056", "#F7CB45", "#F6C141", "#F4A736", "#F1932D", "#EE8026", "#E8601C", "#E65518", "#DC050C", "#A5170E", "#72190E", "#42150A"];
956
+ /**
957
+ * Get a color from the discrete rainbow palette for a given index and palette size.
958
+ * Colors are optimized for visual distinction at each palette size.
959
+ *
960
+ * @param index - The index of the color in the series (0-based)
961
+ * @param size - The total number of colors needed (1-23)
962
+ * @returns The hex color string
963
+ */
964
+ declare function getDiscreteRainbowColor(index: number, size: number): string;
965
+ declare const primitiveTypography: {
966
+ readonly fontFamilies: {
967
+ readonly sans: readonly ["Inter", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "Helvetica", "Arial", "sans-serif"];
968
+ readonly body: readonly ["Nunito Sans", "sans-serif"];
969
+ readonly heading: readonly ["Space Grotesk", "sans-serif"];
970
+ readonly mono: readonly ["SF Mono", "Monaco", "Inconsolata", "Fira Mono", "Droid Sans Mono", "Source Code Pro", "monospace"];
795
971
  };
796
- readonly md: {
797
- readonly paddingX: "20px";
798
- readonly paddingY: "8px";
799
- readonly fontSize: "0.875rem";
972
+ readonly fontSizes: {
973
+ readonly xs: "0.75rem";
974
+ readonly sm: "0.875rem";
975
+ readonly base: "1rem";
976
+ readonly lg: "1.125rem";
977
+ readonly xl: "1.5rem";
978
+ readonly '2xl': "2rem";
979
+ readonly '3xl': "2.25rem";
980
+ readonly '4xl': "3rem";
981
+ readonly '5xl': "3.5rem";
800
982
  };
801
- readonly lg: {
802
- readonly paddingX: "24px";
803
- readonly paddingY: "11px";
804
- readonly fontSize: "1rem";
983
+ readonly fontWeights: {
984
+ readonly normal: 400;
985
+ readonly medium: 500;
986
+ readonly semibold: 600;
987
+ readonly bold: 700;
988
+ };
989
+ readonly lineHeights: {
990
+ readonly none: 1;
991
+ readonly tight: 1.375;
992
+ readonly snug: 1.5;
993
+ readonly normal: 1.57;
994
+ readonly relaxed: 1.66;
995
+ readonly loose: 1.75;
996
+ };
997
+ readonly letterSpacing: {
998
+ readonly tighter: "-0.05em";
999
+ readonly tight: "-0.025em";
1000
+ readonly normal: "0em";
1001
+ readonly wide: "0.025em";
1002
+ readonly wider: "0.05em";
1003
+ readonly widest: "0.5px";
805
1004
  };
806
1005
  };
807
- type ThemeMode = 'light' | 'dark';
808
- declare function getSemanticColors(mode: ThemeMode): {
809
- readonly 'brand-primary': "#FF7900";
810
- readonly 'brand-primary-light': "#FFA063";
811
- readonly 'brand-primary-dark': "#DA5F00";
812
- readonly 'brand-primary-subtle': "rgba(255, 121, 0, 0.08)";
813
- readonly 'brand-primary-hover': "#DA5F00";
814
- readonly 'brand-primary-active': "#B94A00";
815
- readonly 'brand-secondary': "#307B9B";
816
- readonly 'brand-secondary-light': "#2697B7";
817
- readonly 'brand-secondary-dark': "#2A617F";
818
- readonly 'brand-secondary-subtle': "rgba(48, 123, 155, 0.08)";
819
- readonly 'brand-secondary-hover': "#2A617F";
820
- readonly 'brand-secondary-active': "#22465F";
821
- readonly 'on-brand-primary': "#FFFFFF";
822
- readonly 'on-brand-secondary': "#FFFFFF";
823
- readonly 'status-success': "#2ED573";
824
- readonly 'status-success-light': "#58F69E";
825
- readonly 'status-success-dark': "#298732";
826
- readonly 'status-success-subtle': "#E3FFEE";
827
- readonly 'status-live': "#2ED573";
828
- readonly 'status-live-muted': "#22A444";
829
- readonly 'status-error': "#D14343";
830
- readonly 'status-error-light': "#E05254";
831
- readonly 'status-error-dark': "#A4221C";
832
- readonly 'status-error-subtle': "#FFF4F4";
833
- readonly 'status-error-vivid': "#FF4757";
834
- readonly 'status-error-vivid-light': "#FF6070";
835
- readonly 'status-error-vivid-dark': "#C42539";
836
- readonly 'status-error-vivid-subtle': "rgba(255, 71, 87, 0.12)";
837
- readonly 'status-warning': "#F9B415";
838
- readonly 'status-warning-light': "#FFD352";
839
- readonly 'status-warning-dark': "#C27400";
840
- readonly 'status-warning-subtle': "#FFF7DD";
841
- readonly 'status-info': "#2196F3";
842
- readonly 'status-info-light': "#78C2FF";
843
- readonly 'status-info-dark': "#1072CB";
844
- readonly 'status-info-subtle': "#EFF8FF";
845
- readonly 'on-status-success': "#FFFFFF";
846
- readonly 'on-status-error': "#FFFFFF";
847
- readonly 'on-status-warning': "#FFFFFF";
848
- readonly 'on-status-info': "#FFFFFF";
849
- readonly 'result-improve': "#4caf50";
850
- readonly 'result-improve-light': "rgba(76, 175, 80, 0.12)";
851
- readonly 'result-improve-dark': "#248a24";
852
- readonly 'result-degrade': "#ef5350";
853
- readonly 'result-degrade-light': "rgba(239, 83, 80, 0.12)";
854
- readonly 'result-degrade-dark': "#b30000";
855
- readonly 'result-inconclusive': "#9E9A97";
856
- readonly 'result-inconclusive-light': "rgba(158, 154, 151, 0.12)";
857
- readonly 'result-neutral': "#6B7280";
858
- readonly 'on-result-improve': "#FFFFFF";
859
- readonly 'on-result-degrade': "#FFFFFF";
860
- readonly 'on-result-inconclusive': "#FFFFFF";
861
- readonly 'data-1': "#1965B0";
862
- readonly 'data-2': "#4EB265";
863
- readonly 'data-3': "#F7F056";
864
- readonly 'data-4': "#DC050C";
865
- readonly 'data-5': "#882E72";
866
- readonly 'data-6': "#F4A736";
867
- readonly 'data-7': "#7BAFDE";
868
- readonly 'data-8': "#90C987";
869
- readonly 'data-9': "#CAACCB";
870
- readonly 'data-10': "#EE8026";
871
- readonly 'text-primary': "#121828";
872
- readonly 'text-secondary': "#65748B";
873
- readonly 'text-tertiary': "#9CA3AF";
874
- readonly 'text-disabled': "rgba(55, 65, 81, 0.48)";
875
- readonly 'text-inverse': "#FFFFFF";
876
- readonly 'text-link': "#5048E5";
877
- readonly 'text-link-hover': "#3832A0";
878
- readonly 'surface-base': "#FFFFFF";
879
- readonly 'surface-elevated': "#FAFAFA";
880
- readonly 'surface-raised': "#F3F4F6";
881
- readonly 'surface-overlay': "#FFFFFF";
882
- readonly 'surface-input': "#FAFAFA";
883
- readonly 'background-base': "#EBEBEB";
884
- readonly 'background-default': "#FFFFFF";
885
- readonly 'background-subtle': "#FAFAFA";
886
- readonly 'border-default': "#E8E9EB";
887
- readonly 'border-subtle': "#F3F4F6";
888
- readonly 'border-strong': "#D1D5DB";
889
- readonly 'border-prominent': "#9CA3AF";
890
- readonly 'border-focus': "#5048E5";
891
- readonly 'border-input': "#D1D5DB";
892
- readonly 'border-input-hover': "#9CA3AF";
893
- readonly 'border-input-focus': "#5048E5";
894
- readonly 'border-input-error': "#D14343";
895
- readonly 'interactive-hover': "rgba(55, 65, 81, 0.04)";
896
- readonly 'interactive-focus': "rgba(55, 65, 81, 0.12)";
897
- readonly 'interactive-active': "rgba(55, 65, 81, 0.16)";
898
- readonly 'interactive-selected': "rgba(55, 65, 81, 0.08)";
899
- readonly 'interactive-disabled': "rgba(55, 65, 81, 0.12)";
900
- readonly 'interactive-disabled-text': "rgba(55, 65, 81, 0.26)";
901
- readonly divider: "#E8E9EB";
902
- readonly 'avatar-background': "#6B7280";
903
- readonly 'avatar-text': "#FFFFFF";
904
- } | {
905
- readonly 'brand-primary': "#FF7900";
906
- readonly 'brand-primary-light': "#FFA063";
907
- readonly 'brand-primary-dark': "#DA5F00";
908
- readonly 'brand-primary-subtle': "rgba(255, 121, 0, 0.12)";
909
- readonly 'brand-primary-hover': "#FFA063";
910
- readonly 'brand-primary-active': "#FFC7A2";
911
- readonly 'brand-secondary': "#307B9B";
912
- readonly 'brand-secondary-light': "#2697B7";
913
- readonly 'brand-secondary-dark': "#2A617F";
914
- readonly 'brand-secondary-subtle': "rgba(48, 123, 155, 0.12)";
915
- readonly 'brand-secondary-hover': "#2697B7";
916
- readonly 'brand-secondary-active': "#01B5D1";
917
- readonly 'on-brand-primary': "#FFFFFF";
918
- readonly 'on-brand-secondary': "#FFFFFF";
919
- readonly 'status-success': "#2ED573";
920
- readonly 'status-success-light': "#58F69E";
921
- readonly 'status-success-dark': "#298732";
922
- readonly 'status-success-subtle': "rgba(46, 213, 115, 0.12)";
923
- readonly 'status-live': "#2ED573";
924
- readonly 'status-live-muted': "#22A444";
925
- readonly 'status-error': "#D14343";
926
- readonly 'status-error-light': "#E05254";
927
- readonly 'status-error-dark': "#A4221C";
928
- readonly 'status-error-subtle': "rgba(209, 67, 67, 0.12)";
929
- readonly 'status-error-vivid': "#FF4757";
930
- readonly 'status-error-vivid-light': "#FF6070";
931
- readonly 'status-error-vivid-dark': "#C42539";
932
- readonly 'status-error-vivid-subtle': "rgba(255, 71, 87, 0.12)";
933
- readonly 'status-warning': "#F9B415";
934
- readonly 'status-warning-light': "#FFD352";
935
- readonly 'status-warning-dark': "#C27400";
936
- readonly 'status-warning-subtle': "rgba(249, 180, 21, 0.12)";
937
- readonly 'status-info': "#2196F3";
938
- readonly 'status-info-light': "#78C2FF";
939
- readonly 'status-info-dark': "#1072CB";
940
- readonly 'status-info-subtle': "rgba(33, 150, 243, 0.12)";
941
- readonly 'on-status-success': "#FFFFFF";
942
- readonly 'on-status-error': "#FFFFFF";
943
- readonly 'on-status-warning': "#FFFFFF";
944
- readonly 'on-status-info': "#FFFFFF";
945
- readonly 'result-improve': "#4caf50";
946
- readonly 'result-improve-light': "rgba(76, 175, 80, 0.16)";
947
- readonly 'result-improve-dark': "#248a24";
948
- readonly 'result-degrade': "#ef5350";
949
- readonly 'result-degrade-light': "rgba(239, 83, 80, 0.16)";
950
- readonly 'result-degrade-dark': "#b30000";
951
- readonly 'result-inconclusive': "#9E9A97";
952
- readonly 'result-inconclusive-light': "rgba(158, 154, 151, 0.16)";
953
- readonly 'result-neutral': "#9CA3AF";
954
- readonly 'on-result-improve': "#FFFFFF";
955
- readonly 'on-result-degrade': "#FFFFFF";
956
- readonly 'on-result-inconclusive': "#FFFFFF";
957
- readonly 'data-1': "#1965B0";
958
- readonly 'data-2': "#4EB265";
959
- readonly 'data-3': "#F7F056";
960
- readonly 'data-4': "#DC050C";
961
- readonly 'data-5': "#882E72";
962
- readonly 'data-6': "#F4A736";
963
- readonly 'data-7': "#7BAFDE";
964
- readonly 'data-8': "#90C987";
965
- readonly 'data-9': "#CAACCB";
966
- readonly 'data-10': "#EE8026";
967
- readonly 'text-primary': "#F3F4F6";
968
- readonly 'text-secondary': "#9CA3AF";
969
- readonly 'text-tertiary': "#6B7280";
970
- readonly 'text-disabled': "rgba(255, 255, 255, 0.38)";
971
- readonly 'text-inverse': "#111827";
972
- readonly 'text-link': "#828DF8";
973
- readonly 'text-link-hover': "#60A5FA";
974
- readonly 'surface-base': "#161616";
975
- readonly 'surface-elevated': "#191919";
976
- readonly 'surface-raised': "#1C1C1C";
977
- readonly 'surface-overlay': "#191919";
978
- readonly 'surface-input': "#191919";
979
- readonly 'background-base': "#101010";
980
- readonly 'background-default': "#161616";
981
- readonly 'background-subtle': "#1C1C1C";
982
- readonly 'border-default': "#1F1F1F";
983
- readonly 'border-subtle': "#1C1C1C";
984
- readonly 'border-strong': "#2C2C2C";
985
- readonly 'border-prominent': "#3C3C3C";
986
- readonly 'border-focus': "#828DF8";
987
- readonly 'border-input': "#4B5563";
988
- readonly 'border-input-hover': "#6B7280";
989
- readonly 'border-input-focus': "#828DF8";
990
- readonly 'border-input-error': "#EF4444";
991
- readonly 'interactive-hover': "rgba(255, 255, 255, 0.04)";
992
- readonly 'interactive-focus': "rgba(255, 255, 255, 0.12)";
993
- readonly 'interactive-active': "rgba(255, 255, 255, 0.16)";
994
- readonly 'interactive-selected': "rgba(255, 255, 255, 0.08)";
995
- readonly 'interactive-disabled': "rgba(255, 255, 255, 0.12)";
996
- readonly 'interactive-disabled-text': "rgba(255, 255, 255, 0.26)";
997
- readonly divider: "#1F1F1F";
998
- readonly 'avatar-background': "#4B5563";
999
- readonly 'avatar-text': "#FFFFFF";
1006
+ declare const primitiveSpacing: {
1007
+ readonly 0: "0";
1008
+ readonly px: "1px";
1009
+ readonly 0.5: "0.125rem";
1010
+ readonly 1: "0.25rem";
1011
+ readonly 1.5: "0.375rem";
1012
+ readonly 2: "0.5rem";
1013
+ readonly 2.5: "0.625rem";
1014
+ readonly 3: "0.75rem";
1015
+ readonly 3.5: "0.875rem";
1016
+ readonly 4: "1rem";
1017
+ readonly 5: "1.25rem";
1018
+ readonly 6: "1.5rem";
1019
+ readonly 7: "1.75rem";
1020
+ readonly 8: "2rem";
1021
+ readonly 9: "2.25rem";
1022
+ readonly 10: "2.5rem";
1023
+ readonly 11: "2.75rem";
1024
+ readonly 12: "3rem";
1025
+ readonly 14: "3.5rem";
1026
+ readonly 16: "4rem";
1027
+ readonly 20: "5rem";
1028
+ readonly 24: "6rem";
1029
+ readonly 28: "7rem";
1030
+ readonly 32: "8rem";
1031
+ };
1032
+ declare const primitiveBorderRadius: {
1033
+ readonly none: "0";
1034
+ readonly sm: "4px";
1035
+ readonly DEFAULT: "8px";
1036
+ readonly md: "8px";
1037
+ readonly lg: "12px";
1038
+ readonly xl: "16px";
1039
+ readonly '2xl': "24px";
1040
+ readonly full: "9999px";
1041
+ };
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
+ declare const primitiveBreakpoints: {
1053
+ readonly xs: 0;
1054
+ readonly sm: 600;
1055
+ readonly md: 1000;
1056
+ readonly lg: 1200;
1057
+ readonly xl: 1920;
1058
+ };
1059
+ declare const primitiveZIndex: {
1060
+ readonly hide: -1;
1061
+ readonly auto: "auto";
1062
+ readonly base: 0;
1063
+ readonly docked: 10;
1064
+ readonly dropdown: 1000;
1065
+ readonly sticky: 1100;
1066
+ readonly drawer: 1100;
1067
+ readonly banner: 1200;
1068
+ readonly appBar: 1200;
1069
+ readonly overlay: 1300;
1070
+ readonly modal: 1400;
1071
+ readonly popover: 1500;
1072
+ readonly skipLink: 1600;
1073
+ readonly toast: 1700;
1074
+ readonly tooltip: 1800;
1000
1075
  };
1001
1076
 
1002
1077
  /**
@@ -1058,9 +1133,11 @@ declare const lightThemeCSSVars: {
1058
1133
  readonly '--color-surface-base': "#FFFFFF";
1059
1134
  readonly '--color-surface-elevated': "#FAFAFA";
1060
1135
  readonly '--color-surface-raised': "#F3F4F6";
1136
+ readonly '--color-surface-inset': "#D1D5DB";
1061
1137
  readonly '--color-background-base': "#EBEBEB";
1062
1138
  readonly '--color-background-default': "#FFFFFF";
1063
1139
  readonly '--color-background-subtle': "#FAFAFA";
1140
+ readonly '--color-background-frame': "#9CA3AF";
1064
1141
  readonly '--color-border-default': "#E8E9EB";
1065
1142
  readonly '--color-border-subtle': "#F3F4F6";
1066
1143
  readonly '--color-border-strong': "#D1D5DB";
@@ -1117,6 +1194,9 @@ declare const lightThemeCSSVars: {
1117
1194
  readonly '--color-border-input-hover': "#9CA3AF";
1118
1195
  readonly '--color-border-input-focus': "#5048E5";
1119
1196
  readonly '--color-border-input-error': "#D14343";
1197
+ readonly '--color-hairline-subtle': "rgba(0, 0, 0, 0.06)";
1198
+ readonly '--color-hairline-default': "rgba(0, 0, 0, 0.09)";
1199
+ readonly '--color-hairline-strong': "rgba(0, 0, 0, 0.14)";
1120
1200
  readonly '--color-interactive-disabled-text': "rgba(55, 65, 81, 0.26)";
1121
1201
  readonly '--color-avatar-background': "#6B7280";
1122
1202
  readonly '--color-avatar-text': "#FFFFFF";
@@ -1170,12 +1250,14 @@ declare const darkThemeCSSVars: {
1170
1250
  readonly '--color-text-disabled': "rgba(255, 255, 255, 0.38)";
1171
1251
  readonly '--color-text-inverse': "#111827";
1172
1252
  readonly '--color-text-link': "#828DF8";
1173
- readonly '--color-surface-base': "#161616";
1174
- readonly '--color-surface-elevated': "#191919";
1175
- readonly '--color-surface-raised': "#1C1C1C";
1176
- readonly '--color-background-base': "#101010";
1177
- readonly '--color-background-default': "#161616";
1178
- readonly '--color-background-subtle': "#1C1C1C";
1253
+ readonly '--color-surface-base': "#252321";
1254
+ readonly '--color-surface-elevated': "#2C2A28";
1255
+ readonly '--color-surface-raised': "#31302F";
1256
+ readonly '--color-surface-inset': "#13100D";
1257
+ readonly '--color-background-base': "#1C1916";
1258
+ readonly '--color-background-default': "#252321";
1259
+ readonly '--color-background-subtle': "#2C2A28";
1260
+ readonly '--color-background-frame': "#100D0A";
1179
1261
  readonly '--color-border-default': "#1F1F1F";
1180
1262
  readonly '--color-border-subtle': "#1C1C1C";
1181
1263
  readonly '--color-border-strong': "#2C2C2C";
@@ -1226,12 +1308,15 @@ declare const darkThemeCSSVars: {
1226
1308
  readonly '--color-data-9': "#CAACCB";
1227
1309
  readonly '--color-data-10': "#EE8026";
1228
1310
  readonly '--color-text-link-hover': "#60A5FA";
1229
- readonly '--color-surface-overlay': "#191919";
1230
- readonly '--color-surface-input': "#191919";
1311
+ readonly '--color-surface-overlay': "#373635";
1312
+ readonly '--color-surface-input': "#2C2A28";
1231
1313
  readonly '--color-border-input': "#4B5563";
1232
1314
  readonly '--color-border-input-hover': "#6B7280";
1233
1315
  readonly '--color-border-input-focus': "#828DF8";
1234
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)";
1235
1320
  readonly '--color-interactive-disabled-text': "rgba(255, 255, 255, 0.26)";
1236
1321
  readonly '--color-avatar-background': "#4B5563";
1237
1322
  readonly '--color-avatar-text': "#FFFFFF";
@@ -1288,9 +1373,11 @@ declare function getThemeCSSVars(mode: ThemeMode): {
1288
1373
  readonly '--color-surface-base': "#FFFFFF";
1289
1374
  readonly '--color-surface-elevated': "#FAFAFA";
1290
1375
  readonly '--color-surface-raised': "#F3F4F6";
1376
+ readonly '--color-surface-inset': "#D1D5DB";
1291
1377
  readonly '--color-background-base': "#EBEBEB";
1292
1378
  readonly '--color-background-default': "#FFFFFF";
1293
1379
  readonly '--color-background-subtle': "#FAFAFA";
1380
+ readonly '--color-background-frame': "#9CA3AF";
1294
1381
  readonly '--color-border-default': "#E8E9EB";
1295
1382
  readonly '--color-border-subtle': "#F3F4F6";
1296
1383
  readonly '--color-border-strong': "#D1D5DB";
@@ -1347,6 +1434,9 @@ declare function getThemeCSSVars(mode: ThemeMode): {
1347
1434
  readonly '--color-border-input-hover': "#9CA3AF";
1348
1435
  readonly '--color-border-input-focus': "#5048E5";
1349
1436
  readonly '--color-border-input-error': "#D14343";
1437
+ readonly '--color-hairline-subtle': "rgba(0, 0, 0, 0.06)";
1438
+ readonly '--color-hairline-default': "rgba(0, 0, 0, 0.09)";
1439
+ readonly '--color-hairline-strong': "rgba(0, 0, 0, 0.14)";
1350
1440
  readonly '--color-interactive-disabled-text': "rgba(55, 65, 81, 0.26)";
1351
1441
  readonly '--color-avatar-background': "#6B7280";
1352
1442
  readonly '--color-avatar-text': "#FFFFFF";
@@ -1399,12 +1489,14 @@ declare function getThemeCSSVars(mode: ThemeMode): {
1399
1489
  readonly '--color-text-disabled': "rgba(255, 255, 255, 0.38)";
1400
1490
  readonly '--color-text-inverse': "#111827";
1401
1491
  readonly '--color-text-link': "#828DF8";
1402
- readonly '--color-surface-base': "#161616";
1403
- readonly '--color-surface-elevated': "#191919";
1404
- readonly '--color-surface-raised': "#1C1C1C";
1405
- readonly '--color-background-base': "#101010";
1406
- readonly '--color-background-default': "#161616";
1407
- readonly '--color-background-subtle': "#1C1C1C";
1492
+ readonly '--color-surface-base': "#252321";
1493
+ readonly '--color-surface-elevated': "#2C2A28";
1494
+ readonly '--color-surface-raised': "#31302F";
1495
+ readonly '--color-surface-inset': "#13100D";
1496
+ readonly '--color-background-base': "#1C1916";
1497
+ readonly '--color-background-default': "#252321";
1498
+ readonly '--color-background-subtle': "#2C2A28";
1499
+ readonly '--color-background-frame': "#100D0A";
1408
1500
  readonly '--color-border-default': "#1F1F1F";
1409
1501
  readonly '--color-border-subtle': "#1C1C1C";
1410
1502
  readonly '--color-border-strong': "#2C2C2C";
@@ -1455,12 +1547,15 @@ declare function getThemeCSSVars(mode: ThemeMode): {
1455
1547
  readonly '--color-data-9': "#CAACCB";
1456
1548
  readonly '--color-data-10': "#EE8026";
1457
1549
  readonly '--color-text-link-hover': "#60A5FA";
1458
- readonly '--color-surface-overlay': "#191919";
1459
- readonly '--color-surface-input': "#191919";
1550
+ readonly '--color-surface-overlay': "#373635";
1551
+ readonly '--color-surface-input': "#2C2A28";
1460
1552
  readonly '--color-border-input': "#4B5563";
1461
1553
  readonly '--color-border-input-hover': "#6B7280";
1462
1554
  readonly '--color-border-input-focus': "#828DF8";
1463
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)";
1464
1559
  readonly '--color-interactive-disabled-text': "rgba(255, 255, 255, 0.26)";
1465
1560
  readonly '--color-avatar-background': "#4B5563";
1466
1561
  readonly '--color-avatar-text': "#FFFFFF";
@@ -1825,9 +1920,14 @@ declare const surfaceGradient: {
1825
1920
  chrome: (mode?: ThemeMode) => GradientStyle;
1826
1921
  };
1827
1922
 
1828
- type ThemeProviderMode = 'dark' | 'light';
1923
+ /** `'system'` follows nativewind's `useColorScheme()` (mobile light/dark flip). */
1924
+ type ThemeProviderMode = 'dark' | 'light' | 'system';
1829
1925
  interface ThemeProviderProps extends ViewProps {
1830
- /** Theme mode to register. Mobile is dark-only today; defaults to `dark`. */
1926
+ /**
1927
+ * Theme mode to register. `'system'` bridges nativewind's `useColorScheme()`
1928
+ * so mobile follows the OS light/dark flip; `'dark'`/`'light'` pin it. Mobile
1929
+ * is dark-only today, so this defaults to `dark`.
1930
+ */
1831
1931
  mode?: ThemeProviderMode;
1832
1932
  }
1833
1933
  /**
@@ -1922,4 +2022,4 @@ declare const defaultPreset: ThemePreset;
1922
2022
  */
1923
2023
  declare const audiobookPreset: ThemePreset;
1924
2024
 
1925
- export { CATEGORICAL_CVD_SAFE_MAX, type CategoricalVariant, type ComponentType, type CssPropertyEntry, type CssPropertyManifest, type ElevationConfig, type ElevationLevel, type GlowIntensity, type GradientStyle, type ManifestValidationResult, 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, bestTextColor, buttonSizes, categoricalPalette, componentElevationRanges, createFlatShadow, createPressedHoverShadow, createPressedShadow, createRaisedHoverShadow, createRaisedShadow, darkThemeCSSVars, darken, defaultPreset, discreteRainbow, divergingScale, elevationSystem, getBaseSurfaceColor, getCategoricalColor, getDiscreteRainbowColor, getElevationConfig, getElevationShadow, getElevationSurface, getGlowShadow, getHoverColors, 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, validateCssPropertyManifest };
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 };