@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.
- package/dist/bodymap.js +78 -24
- package/dist/bodymap.js.map +1 -1
- package/dist/bodymap.mjs +78 -24
- package/dist/bodymap.mjs.map +1 -1
- package/dist/index.d.mts +215 -123
- package/dist/index.d.ts +215 -123
- package/dist/index.js +408 -259
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +258 -121
- package/dist/index.mjs.map +1 -1
- package/dist/pages.js +214 -157
- package/dist/pages.js.map +1 -1
- package/dist/pages.mjs +214 -157
- package/dist/pages.mjs.map +1 -1
- package/dist/theme/index.d.mts +895 -795
- package/dist/theme/index.d.ts +895 -795
- package/dist/theme/index.js +101 -20
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/index.mjs +99 -22
- package/dist/theme/index.mjs.map +1 -1
- package/dist/theme/tokens-css.js +88 -24
- package/dist/theme/tokens-css.js.map +1 -1
- package/dist/theme/tokens-css.mjs +88 -24
- package/dist/theme/tokens-css.mjs.map +1 -1
- package/package.json +1 -1
- package/src/components/custom/Workout/BaseBadge.tsx +5 -5
- package/src/components/custom/Workout/RowInventory.stories.tsx +5 -2
- package/src/components/custom/Workout/S3FullRail.stories.tsx +13 -1
- package/src/components/custom/Workout/SessionHeader.tsx +11 -13
- package/src/components/custom/Workout/SessionRail.stories.tsx +4 -1
- package/src/components/custom/Workout/SessionRail.tsx +16 -14
- package/src/components/custom/Workout/SupersetWrapper.stories.tsx +16 -25
- package/src/components/custom/Workout/SupersetWrapper.tsx +1 -1
- package/src/components/custom/Workout/TempoDisplay.tsx +3 -7
- package/src/components/custom/Workout/VolumeLandmarkBar.stories.tsx +4 -1
- package/src/components/custom/Workout/WorkoutPill.tsx +2 -2
- package/src/components/shell/DashboardShell.tsx +6 -3
- package/src/components/ui/surface/Surface.stories.tsx +244 -1
- package/src/components/ui/surface/Surface.test.tsx +244 -1
- package/src/components/ui/surface/Surface.tsx +98 -20
- package/src/components/ui/surface/SurfaceContext.ts +126 -0
- package/src/components/ui/surface/index.ts +13 -0
- package/src/components/ui/surface/surface.contract.test.ts +283 -0
- package/src/test/nativewind-stub.ts +13 -0
- package/src/theme/ColorSystem.stories.tsx +232 -47
- package/src/theme/ThemeProvider.test.tsx +24 -0
- package/src/theme/ThemeProvider.tsx +23 -6
- package/src/theme/config.ts +12 -0
- package/src/theme/elevation.ts +90 -67
- package/src/theme/global.css +35 -9
- package/src/theme/tokens/primitives.ts +40 -0
- package/src/theme/tokens/semantic.ts +63 -14
- package/tailwind.config.js +8 -0
package/dist/theme/index.d.ts
CHANGED
|
@@ -1,517 +1,328 @@
|
|
|
1
1
|
import { ViewStyle, ViewProps } from 'react-native';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
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
|
-
*
|
|
76
|
-
*
|
|
6
|
+
* Meaningful tokens following DTCG (Design Tokens Community Group) naming conventions.
|
|
7
|
+
* Pattern: {category}-{intent}-{variant?}-{state?}
|
|
77
8
|
*
|
|
78
|
-
*
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
*
|
|
83
|
-
*
|
|
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
|
|
86
|
-
readonly
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
readonly
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
readonly
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
readonly
|
|
101
|
-
|
|
102
|
-
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
readonly
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
readonly
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
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
|
|
158
|
-
readonly
|
|
159
|
-
readonly
|
|
160
|
-
readonly
|
|
161
|
-
readonly
|
|
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
|
|
170
|
-
readonly
|
|
171
|
-
readonly
|
|
172
|
-
readonly
|
|
173
|
-
readonly
|
|
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
|
|
183
|
-
readonly
|
|
184
|
-
readonly
|
|
185
|
-
readonly
|
|
186
|
-
readonly
|
|
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
|
|
196
|
-
|
|
197
|
-
|
|
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
|
|
224
|
-
readonly
|
|
225
|
-
readonly
|
|
226
|
-
readonly
|
|
227
|
-
readonly
|
|
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
|
|
237
|
-
readonly
|
|
238
|
-
readonly
|
|
239
|
-
readonly
|
|
240
|
-
readonly
|
|
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
|
|
250
|
-
readonly
|
|
251
|
-
readonly
|
|
252
|
-
readonly
|
|
253
|
-
readonly
|
|
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
|
|
263
|
-
readonly
|
|
264
|
-
readonly
|
|
265
|
-
readonly
|
|
266
|
-
readonly
|
|
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
|
|
276
|
-
readonly
|
|
277
|
-
readonly
|
|
278
|
-
readonly
|
|
279
|
-
readonly
|
|
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
|
|
289
|
-
readonly
|
|
290
|
-
readonly
|
|
291
|
-
readonly
|
|
292
|
-
readonly
|
|
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
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
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
|
|
392
|
-
readonly
|
|
393
|
-
readonly
|
|
394
|
-
readonly
|
|
395
|
-
readonly
|
|
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
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
readonly
|
|
406
|
-
readonly
|
|
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
|
|
409
|
-
readonly
|
|
410
|
-
readonly
|
|
411
|
-
readonly
|
|
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
|
|
417
|
-
readonly
|
|
418
|
-
readonly
|
|
419
|
-
readonly
|
|
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
|
-
|
|
426
|
-
|
|
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': "#
|
|
682
|
-
readonly 'surface-elevated': "#
|
|
683
|
-
readonly 'surface-raised': "#
|
|
684
|
-
readonly 'surface-overlay': "#
|
|
685
|
-
readonly 'surface-input': "#
|
|
686
|
-
readonly '
|
|
687
|
-
readonly 'background-
|
|
688
|
-
readonly 'background-
|
|
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
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
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
|
|
728
|
-
readonly
|
|
729
|
-
readonly
|
|
730
|
-
readonly
|
|
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
|
|
734
|
-
readonly
|
|
735
|
-
readonly
|
|
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
|
|
740
|
-
readonly
|
|
741
|
-
readonly
|
|
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
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
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
|
|
752
|
-
readonly
|
|
753
|
-
readonly
|
|
754
|
-
readonly
|
|
755
|
-
readonly
|
|
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
|
|
758
|
-
readonly
|
|
759
|
-
readonly
|
|
760
|
-
readonly
|
|
761
|
-
readonly
|
|
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
|
|
764
|
-
readonly
|
|
765
|
-
readonly
|
|
766
|
-
readonly
|
|
767
|
-
readonly
|
|
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
|
|
770
|
-
readonly
|
|
771
|
-
readonly
|
|
772
|
-
readonly
|
|
773
|
-
readonly
|
|
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
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
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
|
|
784
|
-
readonly
|
|
785
|
-
readonly
|
|
786
|
-
readonly
|
|
787
|
-
readonly
|
|
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
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
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
|
|
797
|
-
readonly
|
|
798
|
-
readonly
|
|
799
|
-
readonly
|
|
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
|
|
802
|
-
readonly
|
|
803
|
-
readonly
|
|
804
|
-
readonly
|
|
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
|
-
|
|
808
|
-
|
|
809
|
-
readonly
|
|
810
|
-
readonly
|
|
811
|
-
readonly
|
|
812
|
-
readonly
|
|
813
|
-
readonly
|
|
814
|
-
readonly
|
|
815
|
-
readonly
|
|
816
|
-
readonly
|
|
817
|
-
readonly
|
|
818
|
-
readonly
|
|
819
|
-
readonly
|
|
820
|
-
readonly
|
|
821
|
-
readonly
|
|
822
|
-
readonly
|
|
823
|
-
readonly
|
|
824
|
-
readonly
|
|
825
|
-
readonly
|
|
826
|
-
readonly
|
|
827
|
-
readonly
|
|
828
|
-
readonly
|
|
829
|
-
readonly
|
|
830
|
-
readonly
|
|
831
|
-
readonly
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
readonly
|
|
835
|
-
readonly
|
|
836
|
-
readonly
|
|
837
|
-
readonly
|
|
838
|
-
readonly
|
|
839
|
-
readonly
|
|
840
|
-
readonly '
|
|
841
|
-
readonly
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
readonly
|
|
845
|
-
readonly
|
|
846
|
-
readonly
|
|
847
|
-
readonly
|
|
848
|
-
readonly
|
|
849
|
-
readonly
|
|
850
|
-
readonly '
|
|
851
|
-
readonly
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
readonly
|
|
855
|
-
readonly
|
|
856
|
-
readonly
|
|
857
|
-
readonly
|
|
858
|
-
readonly
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
readonly
|
|
862
|
-
readonly
|
|
863
|
-
readonly
|
|
864
|
-
readonly
|
|
865
|
-
readonly
|
|
866
|
-
readonly
|
|
867
|
-
readonly
|
|
868
|
-
readonly
|
|
869
|
-
readonly
|
|
870
|
-
readonly
|
|
871
|
-
readonly
|
|
872
|
-
readonly
|
|
873
|
-
readonly
|
|
874
|
-
readonly
|
|
875
|
-
readonly
|
|
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': "#
|
|
1174
|
-
readonly '--color-surface-elevated': "#
|
|
1175
|
-
readonly '--color-surface-raised': "#
|
|
1176
|
-
readonly '--color-
|
|
1177
|
-
readonly '--color-background-
|
|
1178
|
-
readonly '--color-background-
|
|
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': "#
|
|
1230
|
-
readonly '--color-surface-input': "#
|
|
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': "#
|
|
1403
|
-
readonly '--color-surface-elevated': "#
|
|
1404
|
-
readonly '--color-surface-raised': "#
|
|
1405
|
-
readonly '--color-
|
|
1406
|
-
readonly '--color-background-
|
|
1407
|
-
readonly '--color-background-
|
|
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': "#
|
|
1459
|
-
readonly '--color-surface-input': "#
|
|
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
|
-
|
|
1923
|
+
/** `'system'` follows nativewind's `useColorScheme()` (mobile light/dark flip). */
|
|
1924
|
+
type ThemeProviderMode = 'dark' | 'light' | 'system';
|
|
1829
1925
|
interface ThemeProviderProps extends ViewProps {
|
|
1830
|
-
/**
|
|
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 };
|