@nebutra/design-tokens 0.1.2 → 3.0.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/README.md +1 -1
- package/build/css/dark.css +179 -92
- package/build/css/light.css +172 -85
- package/build/css/styles.generated.css +837 -219
- package/build/css/theme-inline.css +153 -15
- package/build/tailwind/dark.preset.cjs +178 -79
- package/build/tailwind/light.preset.cjs +172 -73
- package/build/ts/dark.d.ts +167 -10
- package/build/ts/dark.js +189 -92
- package/build/ts/light.d.ts +164 -14
- package/build/ts/light.js +182 -85
- package/package.json +18 -1
- package/scripts/css-var-name.d.mts +2 -0
- package/scripts/css-var-name.mjs +98 -0
- package/scripts/derive-border-tier.d.mts +36 -0
- package/scripts/derive-border-tier.mjs +346 -0
- package/style-dictionary.config.mjs +243 -89
- package/tokens/core.json +395 -30
- package/tokens/semantic.json +0 -12
- package/tokens/themes/dark.json +599 -112
- package/tokens/themes/light.json +542 -109
package/build/css/light.css
CHANGED
|
@@ -26,17 +26,17 @@
|
|
|
26
26
|
--nebutra-cyan-800: #057963;
|
|
27
27
|
--nebutra-cyan-900: #035143;
|
|
28
28
|
--nebutra-cyan-950: #012923;
|
|
29
|
-
--nebutra-neutral-50: #
|
|
30
|
-
--nebutra-neutral-100: #
|
|
31
|
-
--nebutra-neutral-200: #
|
|
32
|
-
--nebutra-neutral-300: #
|
|
33
|
-
--nebutra-neutral-400: #
|
|
34
|
-
--nebutra-neutral-500: #
|
|
35
|
-
--nebutra-neutral-600: #
|
|
36
|
-
--nebutra-neutral-700: #
|
|
37
|
-
--nebutra-neutral-800: #
|
|
38
|
-
--nebutra-neutral-900: #
|
|
39
|
-
--nebutra-neutral-950: #
|
|
29
|
+
--nebutra-neutral-50: #f9fafb;
|
|
30
|
+
--nebutra-neutral-100: #f3f4f6;
|
|
31
|
+
--nebutra-neutral-200: #e4e5e8;
|
|
32
|
+
--nebutra-neutral-300: #d2d4d8;
|
|
33
|
+
--nebutra-neutral-400: #9fa1a5;
|
|
34
|
+
--nebutra-neutral-500: #717377;
|
|
35
|
+
--nebutra-neutral-600: #515357;
|
|
36
|
+
--nebutra-neutral-700: #3f4044;
|
|
37
|
+
--nebutra-neutral-800: #26272a;
|
|
38
|
+
--nebutra-neutral-900: #18191c;
|
|
39
|
+
--nebutra-neutral-950: #0b0c0d;
|
|
40
40
|
--nebutra-gray-50: #fafafa;
|
|
41
41
|
--nebutra-gray-100: #f5f5f5;
|
|
42
42
|
--nebutra-gray-200: #e5e5e5;
|
|
@@ -52,39 +52,109 @@
|
|
|
52
52
|
--breakpoint-tight: 67.5rem; /** 1080px — dense dashboard header horizontal */
|
|
53
53
|
--breakpoint-shell: 73.75rem; /** 1180px — three-pane shell threshold */
|
|
54
54
|
--breakpoint-3xl: 112.5rem; /** 1800px — 4K / Studio Display friendliness */
|
|
55
|
-
--radius-none: 0;
|
|
56
|
-
--radius-
|
|
57
|
-
--radius-
|
|
58
|
-
--radius-
|
|
59
|
-
--radius-
|
|
60
|
-
--radius-
|
|
61
|
-
--radius-
|
|
62
|
-
--radius-
|
|
63
|
-
--radius-
|
|
64
|
-
--radius-
|
|
65
|
-
--radius-
|
|
55
|
+
--radius-none: 0; /** Job: flush. Edge-to-edge surfaces — a full-bleed table row, a segment welded to its neighbour, an inset that must not round twice. */
|
|
56
|
+
--radius-xs: 0.125rem; /** Job: swatch. The smallest corner that still reads as intentional at 8-12px: chart legend keys, mark highlights, progress and sparkline bar caps. Added because 18 call sites had hand-written 1px, 2px and 3px corners with no step to reach for. Matches the bottom of the Tailwind scale, so rounded-xs and var(--radius-xs) agree. */
|
|
57
|
+
--radius-sm: 0.25rem; /** Job: inner. The corner of something nested inside a control — a thumbnail inside a chip, a swatch inside a tile, a code span inside a paragraph. One step inside md. */
|
|
58
|
+
--radius-md: 0.375rem; /** Job: control. The default for anything you can click or type into at text height: input, select trigger, small button, menu item, badge with square corners. The most-used step on the ladder. */
|
|
59
|
+
--radius-lg: 0.5rem; /** Job: container. Things that hold controls rather than being one: popover, dropdown surface, tooltip, toolbar, inline code block. Aliased as radius-button. */
|
|
60
|
+
--radius-xl: 0.75rem; /** Job: card. A discrete surface in a list or grid that carries its own padding and elevation. Aliased as radius-card. */
|
|
61
|
+
--radius-2xl: 1rem; /** Job: panel. A region that holds cards — bento cell, dialog, sheet, dashboard section. Aliased as radius-panel. */
|
|
62
|
+
--radius-3xl: 1.5rem; /** Job: frame. The outermost shell of a marketing or docs composition — mockup window, hero frame, screenshot chrome. The top of the ladder. */
|
|
63
|
+
--radius-full: 9999px; /** Job: pill. Fully round by intent, not by size: avatar, dot, toggle track, tag. Kept as one step, not a pair, so there is exactly one way to say round. */
|
|
64
|
+
--radius-button: 0.5rem; /** Intent alias for the container step. Reach for this in product code instead of lg so the shape can be re-tuned in one place. */
|
|
65
|
+
--radius-card: 0.75rem; /** Intent alias for the card step. Reach for this in product code instead of xl. */
|
|
66
|
+
--radius-panel: 1rem; /** Intent alias for the panel step. Reach for this in product code instead of 2xl. */
|
|
66
67
|
--duration-micro: 100ms; /** Micro-feedback: hover, focus, toggle, button press */
|
|
67
68
|
--duration-flow: 200ms; /** State flow: modal open, dropdown reveal, tab switch, default page transition */
|
|
68
69
|
--duration-reveal: 300ms; /** Content unveil: slide-in, expand, accordion, drawer */
|
|
69
70
|
--duration-cinematic: 500ms; /** Hero-grade entrance: landing reveal, large delight moments */
|
|
70
71
|
--ease-in: cubic-bezier(0.4, 0, 1, 1);
|
|
71
|
-
--ease-out: cubic-bezier(0,
|
|
72
|
+
--ease-out: cubic-bezier(0.16, 1, 0.3, 1);
|
|
72
73
|
--ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
|
|
73
74
|
--ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
|
|
74
75
|
--tracking-display: -0.04em; /** Hero H1 */
|
|
75
76
|
--tracking-heading: -0.03em; /** Section H2/H3 */
|
|
76
77
|
--tracking-tight: -0.015em; /** Body emphasis */
|
|
78
|
+
--tracking-label: 0.07em; /** Uppercase micro-labels. 0.07em is Vercel's measured eyebrow value (0.071em); open tracking keeps small caps legible. */
|
|
77
79
|
--leading-display: 1.05;
|
|
78
80
|
--leading-heading: 1.15;
|
|
81
|
+
--type-2xs-size: 0.6875rem;
|
|
82
|
+
--type-2xs-leading: 1.45;
|
|
83
|
+
--type-2xs-tracking: 0.01em;
|
|
84
|
+
--type-xs-size: 0.75rem;
|
|
85
|
+
--type-xs-leading: 1.4;
|
|
86
|
+
--type-xs-tracking: 0.005em;
|
|
87
|
+
--type-ui-size: 0.8125rem;
|
|
88
|
+
--type-ui-leading: 1.45;
|
|
89
|
+
--type-ui-tracking: 0em;
|
|
90
|
+
--type-sm-size: 0.875rem;
|
|
91
|
+
--type-sm-leading: 1.5;
|
|
92
|
+
--type-sm-tracking: 0em;
|
|
93
|
+
--type-base-size: 1rem;
|
|
94
|
+
--type-base-leading: 1.6;
|
|
95
|
+
--type-base-tracking: -0.005em;
|
|
96
|
+
--type-lg-size: 1.125rem;
|
|
97
|
+
--type-lg-leading: 1.55;
|
|
98
|
+
--type-lg-tracking: -0.01em;
|
|
99
|
+
--type-xl-size: 1.25rem;
|
|
100
|
+
--type-xl-leading: 1.45;
|
|
101
|
+
--type-xl-tracking: -0.012em;
|
|
102
|
+
--type-2xl-size: 1.5rem;
|
|
103
|
+
--type-2xl-leading: 1.33;
|
|
104
|
+
--type-2xl-tracking: -0.015em;
|
|
105
|
+
--type-3xl-size: 1.875rem;
|
|
106
|
+
--type-3xl-leading: 1.25;
|
|
107
|
+
--type-3xl-tracking: -0.02em;
|
|
108
|
+
--type-4xl-size: 2.25rem;
|
|
109
|
+
--type-4xl-leading: 1.15;
|
|
110
|
+
--type-4xl-tracking: -0.022em;
|
|
111
|
+
--type-5xl-size: 3rem;
|
|
112
|
+
--type-5xl-leading: 1.08;
|
|
113
|
+
--type-5xl-tracking: -0.028em;
|
|
114
|
+
--type-6xl-size: 3.75rem;
|
|
115
|
+
--type-6xl-leading: 1.04;
|
|
116
|
+
--type-6xl-tracking: -0.032em;
|
|
117
|
+
--type-7xl-size: 4.5rem;
|
|
118
|
+
--type-7xl-leading: 1;
|
|
119
|
+
--type-7xl-tracking: -0.035em;
|
|
120
|
+
--type-8xl-size: 6rem;
|
|
121
|
+
--type-8xl-leading: 1;
|
|
122
|
+
--type-8xl-tracking: -0.04em;
|
|
123
|
+
--type-9xl-size: 8rem;
|
|
124
|
+
--type-9xl-leading: 1;
|
|
125
|
+
--type-9xl-tracking: -0.045em;
|
|
126
|
+
--type-display-size: 1.25rem;
|
|
127
|
+
--type-display-leading: 1.45;
|
|
128
|
+
--type-display-tracking: -0.012em;
|
|
129
|
+
--type-body-size: 0.875rem;
|
|
130
|
+
--type-body-leading: 1.5;
|
|
131
|
+
--type-body-tracking: 0em;
|
|
132
|
+
--type-label-size: 0.75rem;
|
|
133
|
+
--type-label-leading: 1.4;
|
|
134
|
+
--type-label-tracking: 0.005em;
|
|
135
|
+
--type-meta-size: 0.6875rem;
|
|
136
|
+
--type-meta-leading: 1.45;
|
|
137
|
+
--type-meta-tracking: 0.01em;
|
|
138
|
+
--layer-raised: 10; /** Within a component: an element lifted over its siblings. */
|
|
139
|
+
--layer-sticky: 20; /** Sticky headers and table heads. */
|
|
140
|
+
--layer-floating: 30; /** Floating toolbars and canvas chrome anchored to content. */
|
|
141
|
+
--layer-nav: 40; /** App navigation and the shell's top bar. */
|
|
142
|
+
--layer-drawer: 60; /** Mobile navigation drawers and their toggles. */
|
|
143
|
+
--layer-banner: 90; /** Page-level banners: cookie consent, announcements. */
|
|
144
|
+
--layer-skip-link: 100; /** The skip link — above page chrome whenever it is focused. */
|
|
145
|
+
--layer-panel: 200; /** App-owned floating panels that are not overlays (locale switcher, search flyouts). */
|
|
146
|
+
--layer-backdrop: 1040; /** Overlay tier. Mirrors overlayZIndex in @nebutra/ui; a test keeps them equal. */
|
|
147
|
+
--layer-modal: 1050; /** Dialogs and sheets. */
|
|
148
|
+
--layer-popover: 1060; /** Popovers, menus, selects. */
|
|
149
|
+
--layer-tooltip: 1070; /** Tooltips. */
|
|
150
|
+
--layer-devtools: 9999; /** Developer and debug surfaces only — never product UI. */
|
|
79
151
|
--ring-hairline: inset 0 0 0 1px rgb(255 255 255 / 0.04); /** Etched-glass hairline (light mode value, dark mode override in themes/dark.json) */
|
|
80
152
|
--overlay-faint: rgb(0 0 0 / 0.06); /** Light-mode faint overlay (6% black) */
|
|
81
|
-
--font-sans: var(--font-geist-sans), "Geist",
|
|
82
|
-
--font-cn: "
|
|
83
|
-
--font-display: var(--font-
|
|
84
|
-
--font-heading: var(--font-
|
|
153
|
+
--font-sans: var(--font-geist-sans), "Geist", var(--font-misans, "MiSans"), "PingFang SC", "Microsoft YaHei", -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
|
|
154
|
+
--font-cn: var(--font-geist-sans), "Geist", var(--font-misans, "MiSans"), "PingFang SC", "Microsoft YaHei", sans-serif; /** CJK-locale stack — same order as sans, minus the Latin-only system faces */
|
|
155
|
+
--font-display: var(--font-dm-sans), "DM Sans", var(--font-misans, "MiSans"), "PingFang SC", sans-serif;
|
|
156
|
+
--font-heading: var(--font-dm-sans), "DM Sans", var(--font-misans, "MiSans"), "PingFang SC", sans-serif;
|
|
85
157
|
--font-mono: var(--font-geist-mono), "Geist Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace;
|
|
86
|
-
--transition-duration: 200ms; /** Default transition duration — 200ms flow rail. */
|
|
87
|
-
--transition-easing: ease-out; /** ease-out keyword form (CSS-friendly). Equivalent to cubic-bezier(0,0,0.2,1). */
|
|
88
158
|
--brand-primary: #0033fe; /** Brand primary — 云毓蓝 */
|
|
89
159
|
--brand-accent: #0bf1c3; /** Brand accent — 云毓青 */
|
|
90
160
|
--brand-tertiary: #8b5cf6;
|
|
@@ -110,74 +180,79 @@
|
|
|
110
180
|
--motion-duration-cinematic: 500ms;
|
|
111
181
|
--focus-ring: 0 0 0 2px hsl(var(--ring) / 0.4); /** Single-layer translucent focus ring (2026 pattern). Legacy box-shadow consumers stay compatible; modern surfaces should prefer the global :focus-visible outline rule in static/base.css. */
|
|
112
182
|
--neutral-1: #ffffff; /** app background */
|
|
113
|
-
--neutral-2: #
|
|
114
|
-
--neutral-3: #
|
|
115
|
-
--neutral-4: #
|
|
116
|
-
--neutral-5: #
|
|
117
|
-
--neutral-6: #
|
|
118
|
-
--neutral-7: #
|
|
119
|
-
--neutral-8: #
|
|
120
|
-
--neutral-9: #
|
|
121
|
-
--neutral-10: #
|
|
122
|
-
--neutral-11: #
|
|
123
|
-
--neutral-12: #
|
|
124
|
-
--blue-1: #
|
|
125
|
-
--blue-2: #
|
|
126
|
-
--blue-3: #
|
|
127
|
-
--blue-4: #
|
|
128
|
-
--blue-5: #
|
|
129
|
-
--blue-6: #
|
|
130
|
-
--blue-7: #
|
|
131
|
-
--blue-8: #
|
|
132
|
-
--blue-9: #
|
|
133
|
-
--blue-10: #
|
|
134
|
-
--blue-11: #
|
|
135
|
-
--blue-12: #
|
|
136
|
-
--
|
|
137
|
-
--cyan-
|
|
138
|
-
--cyan-
|
|
139
|
-
--cyan-
|
|
140
|
-
--cyan-
|
|
141
|
-
--cyan-
|
|
142
|
-
--cyan-
|
|
143
|
-
--cyan-
|
|
144
|
-
--cyan-
|
|
145
|
-
--cyan-
|
|
146
|
-
--cyan-
|
|
147
|
-
--cyan-
|
|
148
|
-
--
|
|
149
|
-
--
|
|
183
|
+
--neutral-2: #f9fafb; /** subtle background */
|
|
184
|
+
--neutral-3: #f3f4f6; /** component bg default */
|
|
185
|
+
--neutral-4: #e4e5e8; /** component bg hover */
|
|
186
|
+
--neutral-5: #d2d4d8; /** component bg active */
|
|
187
|
+
--neutral-6: #b9bbbf; /** subtle border — DERIVED at build time (scripts/derive-border-tier.mjs): OKLab lerp step5 → step9 at t=0.25. The $value here is a placeholder anchor only; the preprocessor overwrites it. */
|
|
188
|
+
--neutral-7: #a0a2a6; /** default border — DERIVED: OKLab lerp step5 → step9 at t=0.50. */
|
|
189
|
+
--neutral-8: #888a8e; /** hovered border — DERIVED: OKLab lerp step5 → step9 at t=0.75. */
|
|
190
|
+
--neutral-9: #717377; /** solid fill */
|
|
191
|
+
--neutral-10: #515357; /** solid fill hover */
|
|
192
|
+
--neutral-11: #3f4044; /** secondary text */
|
|
193
|
+
--neutral-12: #18191c; /** primary text */
|
|
194
|
+
--blue-1: #fafcfe; /** app tint — L* 99.01, C 0.003, hue 264. Radix blue-1 sits at L* 99.31 C 0.003. */
|
|
195
|
+
--blue-2: #f2f6fd; /** subtle background — L* 97.21, C 0.010. */
|
|
196
|
+
--blue-3: #e7eefc; /** component background default — L* 94.79, C 0.020. */
|
|
197
|
+
--blue-4: #d8e4fb; /** component background hover — L* 91.69, C 0.034. */
|
|
198
|
+
--blue-5: #c6d7fa; /** component background active — L* 87.77, C 0.052. Anchor for the derived border tier. */
|
|
199
|
+
--blue-6: #9fbcf9; /** subtle border — DERIVED at build time (scripts/derive-border-tier.mjs): OKLab lerp of step 5 toward step9 (deep scale, span 32.3 L*) at t=0.25. The value here is a placeholder anchor only; the preprocessor overwrites it. Lands at L* 79.61, C 0.093. */
|
|
200
|
+
--blue-7: #79a1f7; /** default border — DERIVED at build time (scripts/derive-border-tier.mjs): OKLab lerp of step 5 toward step9 (deep scale, span 32.3 L*) at t=0.50. The value here is a placeholder anchor only; the preprocessor overwrites it. Lands at L* 71.63, C 0.134. */
|
|
201
|
+
--blue-8: #5384f3; /** hovered border — DERIVED at build time (scripts/derive-border-tier.mjs): OKLab lerp of step 5 toward step9 (deep scale, span 32.3 L*) at t=0.75. The value here is a placeholder anchor only; the preprocessor overwrites it. Lands at L* 63.47, C 0.175. */
|
|
202
|
+
--blue-9: #2e65ee; /** solid fill — L* 55.50, C 0.215, hue 264.0. White label 4.99:1, inside the 4.7-5.4 band comparable products ship. Same value as shadcn --primary so the deep solid fill has one source, not two. The VI hex #0033FE (C 0.290, L* 48.4) stays the identity token --brand-primary and is deliberately NOT pinned into this ramp slot: pinning it left steps 6-9 only 3.5 L* apart with chroma climbing to 0.290. */
|
|
203
|
+
--blue-10: #2253d4; /** solid fill hover — L* 49.52, C 0.205. White label 6.45:1. */
|
|
204
|
+
--blue-11: #1740ad; /** secondary text — L* 42.04, C 0.180. 8.60:1 on step 1. */
|
|
205
|
+
--blue-12: #031654; /** primary text — L* 23.91, C 0.115. 16.38:1 on step 1. */
|
|
206
|
+
--blue-contrast: #ffffff; /** Label ink for the solid fill tier. Absolute value, identical in both modes: a deep fill always takes white, never the scale's own step 12, which is light in dark mode. 4.99:1 on step 9, 6.45:1 on step 10. */
|
|
207
|
+
--cyan-1: #f9fdfb; /** app tint — L* 99.05, C 0.005, hue 172. */
|
|
208
|
+
--cyan-2: #effbf7; /** subtle background — L* 97.81, C 0.014. */
|
|
209
|
+
--cyan-3: #daf9ee; /** component background default — L* 95.68, C 0.035. */
|
|
210
|
+
--cyan-4: #c3f6e4; /** component background hover — L* 93.29, C 0.058. */
|
|
211
|
+
--cyan-5: #a3f2d8; /** component background active — L* 90.27, C 0.086. Anchor for the derived border tier. */
|
|
212
|
+
--cyan-6: #8eefd1; /** subtle border — DERIVED at build time (scripts/derive-border-tier.mjs): OKLab lerp of step 5 toward step10 (bright scale: |L9-L5| = 4.9 L* < 6.0, so the tier continues toward step 10) at t=0.25. The value here is a placeholder anchor only; the preprocessor overwrites it. Lands at L* 88.38, C 0.102. */
|
|
213
|
+
--cyan-7: #77ecc9; /** default border — DERIVED at build time (scripts/derive-border-tier.mjs): OKLab lerp of step 5 toward step10 (bright scale: |L9-L5| = 4.9 L* < 6.0, so the tier continues toward step 10) at t=0.50. The value here is a placeholder anchor only; the preprocessor overwrites it. Lands at L* 86.50, C 0.119. */
|
|
214
|
+
--cyan-8: #5be8c2; /** hovered border — DERIVED at build time (scripts/derive-border-tier.mjs): OKLab lerp of step 5 toward step10 (bright scale: |L9-L5| = 4.9 L* < 6.0, so the tier continues toward step 10) at t=0.75. The value here is a placeholder anchor only; the preprocessor overwrites it. Lands at L* 84.42, C 0.134. */
|
|
215
|
+
--cyan-9: #0bf1c3; /** solid fill — bright scale, so the fill is LIGHT and takes dark ink: L* 85.41, C 0.164, hue 172.1. Ink 10.35:1 against --cyan-contrast. Step 9 legitimately sits above step 8 on a bright scale, exactly as Radix mint does (8 at L* 72.2, 9 at L* 87.0). */
|
|
216
|
+
--cyan-10: #33e5bb; /** solid fill hover — L* 82.61, C 0.150. 2.80 L* below step 9, matching Radix mint's own 2.95 L* step9-to-step10 drop, so hovering the bright fill deepens it slightly instead of collapsing past its own border tier. The previous value was 10.87 L* below step 9 and landed DARKER than step 8. Ink 9.40:1. */
|
|
217
|
+
--cyan-11: #027a61; /** secondary text — L* 51.64, C 0.100. 5.17:1 on step 1. */
|
|
218
|
+
--cyan-12: #004133; /** primary text — L* 33.45, C 0.065. 11.35:1 on step 1. */
|
|
219
|
+
--cyan-contrast: #0d2b25; /** Label ink for the bright fill tier. Absolute near-black, identical in both modes, carrying a trace of the scale hue. A bright fill needs an explicit dark ink; comparing white against the scale's own step 12 picks white in dark mode, where step 12 is light, and measures 1.52:1. 10.35:1 on step 9, 9.40:1 on step 10. */
|
|
220
|
+
--background: 210 20% 98%; /** House canvas. Light is gray-50 under white cards (two-surface layering, as Vercel #fafafa/#fff); dark is OKLCH L 0.16, inside the near-black band every reference measures (Linear L 0.14, Raycast #040506). */
|
|
221
|
+
--foreground: 225 7.7% 10.2%;
|
|
150
222
|
--card: 0 0% 100%;
|
|
151
|
-
--card-foreground:
|
|
223
|
+
--card-foreground: 225 7.7% 10.2%;
|
|
152
224
|
--popover: 0 0% 100%;
|
|
153
|
-
--popover-foreground:
|
|
154
|
-
--primary:
|
|
225
|
+
--popover-foreground: 225 7.7% 10.2%;
|
|
226
|
+
--primary: 225 7.7% 10.2%; /** House action fill = ink, not blue (owner decision 2026-09-24). Every measured reference ships a solid near-black primary (Vercel #171717, Figma #000) and keeps its one saturated hue for a single signal. Blue now lives on --ring (focus, selection) only. */
|
|
155
227
|
--primary-foreground: 0 0% 100%;
|
|
156
|
-
--secondary:
|
|
157
|
-
--secondary-foreground:
|
|
158
|
-
--muted:
|
|
159
|
-
--muted-foreground:
|
|
160
|
-
--accent:
|
|
161
|
-
--accent-foreground:
|
|
228
|
+
--secondary: 220 14.3% 95.9%;
|
|
229
|
+
--secondary-foreground: 225 7.7% 10.2%;
|
|
230
|
+
--muted: 220 14.3% 95.9%;
|
|
231
|
+
--muted-foreground: 220 2.6% 45.5%;
|
|
232
|
+
--accent: 220 14.3% 95.9%;
|
|
233
|
+
--accent-foreground: 225 7.7% 10.2%; /** Softer brand blue — desaturated to match --primary, avoids 100% saturation glare on focus/accent */
|
|
162
234
|
--destructive: 0 84% 45%;
|
|
163
235
|
--destructive-foreground: 0 0% 100%;
|
|
236
|
+
--destructive-strong: 0 84% 45%; /** Red as FOREGROUND. In light mode --destructive already passes (5.42:1 on white), so this equals it; the token exists so consumers reference one name across themes. In DARK, --destructive is 0 63% 38% = 2.15:1 on --card, unreadable as text — see dark.json. Mirrors --warning-strong. */
|
|
164
237
|
--success: 142 71% 29%;
|
|
165
238
|
--success-foreground: 0 0% 100%;
|
|
239
|
+
--success-strong: 142 71% 27%; /** Green as FOREGROUND. --success (142 71% 29%) is 5.15:1 on white but only 4.49:1 as ink on its own 10% tint — one hundredth under AA, which is where badge green-subtle sat. Darkened two points: 5.71:1 on white, 4.99:1 on the tint, alongside --warning-strong (5.40) and --destructive-strong (5.42) so the three status foregrounds read with the same weight. Completes the trio; use --success for fills with --success-foreground on top. */
|
|
166
240
|
--warning: 38 92% 50%;
|
|
167
241
|
--warning-foreground: 222 47% 11%;
|
|
242
|
+
--warning-strong: 38 92% 30%; /** Amber as FOREGROUND on a light surface. --warning is a fill: at 38 92% 50% it is 2.04:1 against --neutral-2, so it is unreadable as text or as an icon stroke. This darkened step is 5.17:1, which sits between --success (4.92) and --destructive (5.19) so the three status colours read with the same weight. Use --warning for fills with --warning-foreground on top; use this for amber text and icons. Destructive and success need no equivalent — they already pass AA as foreground. */
|
|
168
243
|
--info: 228 85% 56%;
|
|
169
244
|
--info-foreground: 0 0% 100%;
|
|
170
|
-
--border:
|
|
171
|
-
--input:
|
|
172
|
-
--ring: 222
|
|
173
|
-
--sidebar: 210
|
|
174
|
-
--sidebar-foreground:
|
|
175
|
-
--sidebar-primary: 228 85% 56
|
|
245
|
+
--border: 225 8% 90.2%;
|
|
246
|
+
--input: 225 8% 90.2%;
|
|
247
|
+
--ring: 222.8 85% 55.7%; /** The House blue. Focus rings, selection and links — the one saturated hue on a product screen. #2e65ee light / #6b93f5 dark. */
|
|
248
|
+
--sidebar: 210 20% 98%;
|
|
249
|
+
--sidebar-foreground: 225 7.7% 10.2%;
|
|
250
|
+
--sidebar-primary: 225 7.7% 10.2%; /** Current-page accent in the sidebar (icon tint + edge). Same value as --primary: the sidebar carried the superseded 228 85% 56% (#2f56ee, C 0.232), which the action-blue measurement trimmed to C 0.215. */
|
|
176
251
|
--sidebar-primary-foreground: 0 0% 100%;
|
|
177
|
-
--sidebar-accent:
|
|
178
|
-
--sidebar-accent-foreground:
|
|
179
|
-
--sidebar-border:
|
|
180
|
-
--sidebar-ring:
|
|
252
|
+
--sidebar-accent: 220 14.3% 95.9%;
|
|
253
|
+
--sidebar-accent-foreground: 225 7.7% 10.2%;
|
|
254
|
+
--sidebar-border: 225 8% 90.2%;
|
|
255
|
+
--sidebar-ring: 222.8 85% 55.7%;
|
|
181
256
|
--chart-1: 228 100% 50%;
|
|
182
257
|
--chart-2: 168 91% 49%;
|
|
183
258
|
--chart-3: 263 70% 66%;
|
|
@@ -223,6 +298,18 @@
|
|
|
223
298
|
--elevation-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);
|
|
224
299
|
--elevation-brand: 0 0 0 1px rgb(0 51 254 / 0.15), 0 4px 20px -2px rgb(0 51 254 / 0.2);
|
|
225
300
|
--elevation-brand-lg: 0 0 0 1px rgb(0 51 254 / 0.2), 0 8px 40px -4px rgb(0 51 254 / 0.3);
|
|
301
|
+
--elevation-ambient-sm: 0 1px 2px -1px hsl(222 47% 11% / 0.06), 0 6px 16px -6px hsl(222 47% 11% / 0.12); /** Ambient elevation, small. Contact layer plus a wide soft pool — the marketing-surface counterpart to the tight xs..2xl product ramp. */
|
|
302
|
+
--elevation-ambient-md: 0 2px 4px -2px hsl(222 47% 11% / 0.06), 0 12px 32px -10px hsl(222 47% 11% / 0.14); /** Ambient elevation, medium. Default resting depth for a floating marketing card. */
|
|
303
|
+
--elevation-ambient-lg: 0 4px 8px -4px hsl(222 47% 11% / 0.06), 0 24px 56px -18px hsl(222 47% 11% / 0.16); /** Ambient elevation, large. One step up from md; use for hover of a md surface, not as a resting default. */
|
|
304
|
+
--elevation-glass-sm: inset 0 1px 0 rgb(255 255 255 / 0.5), 0 1px 2px -1px hsl(222 47% 11% / 0.06), 0 6px 16px -6px hsl(222 47% 11% / 0.12); /** Ambient-sm plus a lit top edge, for translucent panels over a blurred backdrop. */
|
|
305
|
+
--elevation-glass-md: inset 0 1px 0 rgb(255 255 255 / 0.5), 0 2px 4px -2px hsl(222 47% 11% / 0.06), 0 12px 32px -10px hsl(222 47% 11% / 0.14); /** Ambient-md plus a lit top edge. */
|
|
306
|
+
--elevation-glass-lg: inset 0 1px 0 rgb(255 255 255 / 0.5), 0 4px 8px -4px hsl(222 47% 11% / 0.06), 0 24px 56px -18px hsl(222 47% 11% / 0.16); /** Ambient-lg plus a lit top edge. */
|
|
307
|
+
--elevation-sheen: inset 0 1px 0 rgb(255 255 255 / 0.2); /** Top-edge sheen for solid inverted fills (bg-foreground). Lifts with light on a dark fill, with shade on a light one. */
|
|
308
|
+
--elevation-ambient-glow: 0 0 80px hsl(222 47% 11% / 0.1); /** Centred offsetless halo — the only non-directional step on the ramp. For a translucent panel that needs separation from its backdrop without reading as lifted off a surface. In dark mode this inverts to a low-alpha light halo, because a black halo cannot read against a dark surround. */
|
|
309
|
+
--elevation-glow-accent: 0 8px 32px rgb(0 0 0 / 0.4), 0 0 60px color-mix(in srgb, var(--brand-accent) 8%, transparent); /** Directional pool plus a wide brand-accent halo, for fixed dark-glass surfaces. The pool is theme-invariant black on purpose: the surfaces that carry an accent halo present the same dark glass in both themes, so a theme-flipping pool would lighten in light mode exactly where the panel needs the most separation. Accent sourced from --brand-accent, so it follows the light and dark accent values. */
|
|
310
|
+
--elevation-glow-accent-lg: 0 12px 48px rgb(0 0 0 / 0.5), 0 0 80px color-mix(in srgb, var(--brand-accent) 12%, transparent); /** Hover escalation of glow-accent. Deeper pool, wider and stronger accent halo. */
|
|
311
|
+
--elevation-glow-accent-sm: 0 0 20px color-mix(in srgb, var(--brand-accent) 10%, transparent); /** Accent halo alone, no pool. For a small accent-tinted chip or icon plate inside a glow-accent surface. */
|
|
312
|
+
--elevation-glow-primary: 0 20px 25px -5px hsl(var(--primary) / 0.05), 0 8px 10px -6px hsl(var(--primary) / 0.05); /** xl geometry tinted with the action fill at 5 percent. For the emphasised card in a set (a highlighted plan) where the lift should read as coloured rather than neutral. */
|
|
226
313
|
}
|
|
227
314
|
|
|
228
315
|
:root {
|