@nebutra/design-tokens 2.0.0 → 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.
@@ -112,8 +112,93 @@ export const TrackingDisplay: string;
112
112
  export const TrackingHeading: string;
113
113
  /** Body emphasis */
114
114
  export const TrackingTight: string;
115
+ /** Uppercase micro-labels. 0.07em is Vercel's measured eyebrow value (0.071em); open tracking keeps small caps legible. */
116
+ export const TrackingLabel: string;
115
117
  export const LeadingDisplay: string;
116
118
  export const LeadingHeading: string;
119
+ export const Type2xsSize: string;
120
+ export const Type2xsLeading: string;
121
+ export const Type2xsTracking: string;
122
+ export const TypeXsSize: string;
123
+ export const TypeXsLeading: string;
124
+ export const TypeXsTracking: string;
125
+ export const TypeUiSize: string;
126
+ export const TypeUiLeading: string;
127
+ export const TypeUiTracking: string;
128
+ export const TypeSmSize: string;
129
+ export const TypeSmLeading: string;
130
+ export const TypeSmTracking: string;
131
+ export const TypeBaseSize: string;
132
+ export const TypeBaseLeading: string;
133
+ export const TypeBaseTracking: string;
134
+ export const TypeLgSize: string;
135
+ export const TypeLgLeading: string;
136
+ export const TypeLgTracking: string;
137
+ export const TypeXlSize: string;
138
+ export const TypeXlLeading: string;
139
+ export const TypeXlTracking: string;
140
+ export const Type2xlSize: string;
141
+ export const Type2xlLeading: string;
142
+ export const Type2xlTracking: string;
143
+ export const Type3xlSize: string;
144
+ export const Type3xlLeading: string;
145
+ export const Type3xlTracking: string;
146
+ export const Type4xlSize: string;
147
+ export const Type4xlLeading: string;
148
+ export const Type4xlTracking: string;
149
+ export const Type5xlSize: string;
150
+ export const Type5xlLeading: string;
151
+ export const Type5xlTracking: string;
152
+ export const Type6xlSize: string;
153
+ export const Type6xlLeading: string;
154
+ export const Type6xlTracking: string;
155
+ export const Type7xlSize: string;
156
+ export const Type7xlLeading: string;
157
+ export const Type7xlTracking: string;
158
+ export const Type8xlSize: string;
159
+ export const Type8xlLeading: string;
160
+ export const Type8xlTracking: string;
161
+ export const Type9xlSize: string;
162
+ export const Type9xlLeading: string;
163
+ export const Type9xlTracking: string;
164
+ export const TypeDisplaySize: string;
165
+ export const TypeDisplayLeading: string;
166
+ export const TypeDisplayTracking: string;
167
+ export const TypeBodySize: string;
168
+ export const TypeBodyLeading: string;
169
+ export const TypeBodyTracking: string;
170
+ export const TypeLabelSize: string;
171
+ export const TypeLabelLeading: string;
172
+ export const TypeLabelTracking: string;
173
+ export const TypeMetaSize: string;
174
+ export const TypeMetaLeading: string;
175
+ export const TypeMetaTracking: string;
176
+ /** Within a component: an element lifted over its siblings. */
177
+ export const LayerRaised: string;
178
+ /** Sticky headers and table heads. */
179
+ export const LayerSticky: string;
180
+ /** Floating toolbars and canvas chrome anchored to content. */
181
+ export const LayerFloating: string;
182
+ /** App navigation and the shell's top bar. */
183
+ export const LayerNav: string;
184
+ /** Mobile navigation drawers and their toggles. */
185
+ export const LayerDrawer: string;
186
+ /** Page-level banners: cookie consent, announcements. */
187
+ export const LayerBanner: string;
188
+ /** The skip link — above page chrome whenever it is focused. */
189
+ export const LayerSkipLink: string;
190
+ /** App-owned floating panels that are not overlays (locale switcher, search flyouts). */
191
+ export const LayerPanel: string;
192
+ /** Overlay tier. Mirrors overlayZIndex in @nebutra/ui; a test keeps them equal. */
193
+ export const LayerBackdrop: string;
194
+ /** Dialogs and sheets. */
195
+ export const LayerModal: string;
196
+ /** Popovers, menus, selects. */
197
+ export const LayerPopover: string;
198
+ /** Tooltips. */
199
+ export const LayerTooltip: string;
200
+ /** Developer and debug surfaces only — never product UI. */
201
+ export const LayerDevtools: string;
117
202
  /** Hairline override — more visible on dark background */
118
203
  export const RingHairline: string;
119
204
  /** Dark-mode faint overlay (6% white) — inverted from light */
@@ -234,13 +319,14 @@ export const ScaleCyan11: string;
234
319
  export const ScaleCyan12: string;
235
320
  /** Label ink for the bright fill tier. Absolute near-black, identical in both modes. 10.35:1 on step 9, 11.34:1 on step 10. */
236
321
  export const ScaleCyanContrast: string;
322
+ /** 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). */
237
323
  export const ShadcnBackground: string;
238
324
  export const ShadcnForeground: string;
239
325
  export const ShadcnCard: string;
240
326
  export const ShadcnCardForeground: string;
241
327
  export const ShadcnPopover: string;
242
328
  export const ShadcnPopoverForeground: string;
243
- /** Dark-mode action blue, paired with the near-black --primary-foreground, not white. #396ae2 keeps the VI hue and sits at L*55.9 C0.191. */
329
+ /** 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. */
244
330
  export const ShadcnPrimary: string;
245
331
  /** White, matching light mode and matching --blue-contrast. It was near-black (222 14% 9%) when --primary was a LIGHT fill at L* 68.3, where dark ink read 6.20:1. Once --primary became a deep fill at L* 55.9 the pairing inverted and measured 3.74:1, below AA — the fill moved and the ink did not. The deep-fill tier takes white in both modes; --blue-contrast says the same thing, and they must agree because --primary and --blue-9 are now the same value. */
246
332
  export const ShadcnPrimaryForeground: string;
@@ -266,10 +352,11 @@ export const ShadcnInfo: string;
266
352
  export const ShadcnInfoForeground: string;
267
353
  export const ShadcnBorder: string;
268
354
  export const ShadcnInput: string;
269
- /** Focus ring (dark mode) — neutral light gray. Mirrors light-mode neutral foreground choice. */
355
+ /** The House blue. Focus rings, selection and links — the one saturated hue on a product screen. #2e65ee light / #6b93f5 dark. */
270
356
  export const ShadcnRing: string;
271
357
  export const ShadcnSidebar: string;
272
358
  export const ShadcnSidebarForeground: string;
359
+ /** Current-page accent in the sidebar. = blue-11 (#89aaee, L* 74.0, C 0.106), the ramp's measured secondary-text tier on dark (8.62:1 on step 1). Was 228 95% 72% — 95% chroma sat outside every measured band and matched no ramp step. */
273
360
  export const ShadcnSidebarPrimary: string;
274
361
  export const ShadcnSidebarPrimaryForeground: string;
275
362
  export const ShadcnSidebarAccent: string;
package/build/ts/dark.js CHANGED
@@ -24,17 +24,17 @@ export const ColorNebutraCyan700 = "#07a183";
24
24
  export const ColorNebutraCyan800 = "#057963";
25
25
  export const ColorNebutraCyan900 = "#035143";
26
26
  export const ColorNebutraCyan950 = "#012923";
27
- export const ColorNebutraNeutral50 = "#f8fafc";
28
- export const ColorNebutraNeutral100 = "#f1f5f9";
29
- export const ColorNebutraNeutral200 = "#e2e8f0";
30
- export const ColorNebutraNeutral300 = "#cbd5e1";
31
- export const ColorNebutraNeutral400 = "#94a3b8";
32
- export const ColorNebutraNeutral500 = "#64748b";
33
- export const ColorNebutraNeutral600 = "#475569";
34
- export const ColorNebutraNeutral700 = "#334155";
35
- export const ColorNebutraNeutral800 = "#1e293b";
36
- export const ColorNebutraNeutral900 = "#0f172a";
37
- export const ColorNebutraNeutral950 = "#020617";
27
+ export const ColorNebutraNeutral50 = "#f9fafb";
28
+ export const ColorNebutraNeutral100 = "#f3f4f6";
29
+ export const ColorNebutraNeutral200 = "#e4e5e8";
30
+ export const ColorNebutraNeutral300 = "#d2d4d8";
31
+ export const ColorNebutraNeutral400 = "#9fa1a5";
32
+ export const ColorNebutraNeutral500 = "#717377";
33
+ export const ColorNebutraNeutral600 = "#515357";
34
+ export const ColorNebutraNeutral700 = "#3f4044";
35
+ export const ColorNebutraNeutral800 = "#26272a";
36
+ export const ColorNebutraNeutral900 = "#18191c";
37
+ export const ColorNebutraNeutral950 = "#0b0c0d";
38
38
  export const ColorNebutraGray50 = "#fafafa";
39
39
  export const ColorNebutraGray100 = "#f5f5f5";
40
40
  export const ColorNebutraGray200 = "#e5e5e5";
@@ -82,18 +82,89 @@ export const EasingSpring = "cubic-bezier(0.175, 0.885, 0.32, 1.275)";
82
82
  export const TrackingDisplay = "-0.04em"; // Hero H1
83
83
  export const TrackingHeading = "-0.03em"; // Section H2/H3
84
84
  export const TrackingTight = "-0.015em"; // Body emphasis
85
+ export const TrackingLabel = "0.07em"; // Uppercase micro-labels. 0.07em is Vercel's measured eyebrow value (0.071em); open tracking keeps small caps legible.
85
86
  export const LeadingDisplay = "1.05";
86
87
  export const LeadingHeading = "1.15";
88
+ export const Type2xsSize = "0.6875rem";
89
+ export const Type2xsLeading = "1.45";
90
+ export const Type2xsTracking = "0.01em";
91
+ export const TypeXsSize = "0.75rem";
92
+ export const TypeXsLeading = "1.4";
93
+ export const TypeXsTracking = "0.005em";
94
+ export const TypeUiSize = "0.8125rem";
95
+ export const TypeUiLeading = "1.45";
96
+ export const TypeUiTracking = "0em";
97
+ export const TypeSmSize = "0.875rem";
98
+ export const TypeSmLeading = "1.5";
99
+ export const TypeSmTracking = "0em";
100
+ export const TypeBaseSize = "1rem";
101
+ export const TypeBaseLeading = "1.6";
102
+ export const TypeBaseTracking = "-0.005em";
103
+ export const TypeLgSize = "1.125rem";
104
+ export const TypeLgLeading = "1.55";
105
+ export const TypeLgTracking = "-0.01em";
106
+ export const TypeXlSize = "1.25rem";
107
+ export const TypeXlLeading = "1.45";
108
+ export const TypeXlTracking = "-0.012em";
109
+ export const Type2xlSize = "1.5rem";
110
+ export const Type2xlLeading = "1.33";
111
+ export const Type2xlTracking = "-0.015em";
112
+ export const Type3xlSize = "1.875rem";
113
+ export const Type3xlLeading = "1.25";
114
+ export const Type3xlTracking = "-0.02em";
115
+ export const Type4xlSize = "2.25rem";
116
+ export const Type4xlLeading = "1.15";
117
+ export const Type4xlTracking = "-0.022em";
118
+ export const Type5xlSize = "3rem";
119
+ export const Type5xlLeading = "1.08";
120
+ export const Type5xlTracking = "-0.028em";
121
+ export const Type6xlSize = "3.75rem";
122
+ export const Type6xlLeading = "1.04";
123
+ export const Type6xlTracking = "-0.032em";
124
+ export const Type7xlSize = "4.5rem";
125
+ export const Type7xlLeading = "1";
126
+ export const Type7xlTracking = "-0.035em";
127
+ export const Type8xlSize = "6rem";
128
+ export const Type8xlLeading = "1";
129
+ export const Type8xlTracking = "-0.04em";
130
+ export const Type9xlSize = "8rem";
131
+ export const Type9xlLeading = "1";
132
+ export const Type9xlTracking = "-0.045em";
133
+ export const TypeDisplaySize = "1.25rem";
134
+ export const TypeDisplayLeading = "1.45";
135
+ export const TypeDisplayTracking = "-0.012em";
136
+ export const TypeBodySize = "0.875rem";
137
+ export const TypeBodyLeading = "1.5";
138
+ export const TypeBodyTracking = "0em";
139
+ export const TypeLabelSize = "0.75rem";
140
+ export const TypeLabelLeading = "1.4";
141
+ export const TypeLabelTracking = "0.005em";
142
+ export const TypeMetaSize = "0.6875rem";
143
+ export const TypeMetaLeading = "1.45";
144
+ export const TypeMetaTracking = "0.01em";
145
+ export const LayerRaised = "10"; // Within a component: an element lifted over its siblings.
146
+ export const LayerSticky = "20"; // Sticky headers and table heads.
147
+ export const LayerFloating = "30"; // Floating toolbars and canvas chrome anchored to content.
148
+ export const LayerNav = "40"; // App navigation and the shell's top bar.
149
+ export const LayerDrawer = "60"; // Mobile navigation drawers and their toggles.
150
+ export const LayerBanner = "90"; // Page-level banners: cookie consent, announcements.
151
+ export const LayerSkipLink = "100"; // The skip link — above page chrome whenever it is focused.
152
+ export const LayerPanel = "200"; // App-owned floating panels that are not overlays (locale switcher, search flyouts).
153
+ export const LayerBackdrop = "1040"; // Overlay tier. Mirrors overlayZIndex in @nebutra/ui; a test keeps them equal.
154
+ export const LayerModal = "1050"; // Dialogs and sheets.
155
+ export const LayerPopover = "1060"; // Popovers, menus, selects.
156
+ export const LayerTooltip = "1070"; // Tooltips.
157
+ export const LayerDevtools = "9999"; // Developer and debug surfaces only — never product UI.
87
158
  export const RingHairline = "inset 0 0 0 1px rgb(255 255 255 / 0.06)"; // Hairline override — more visible on dark background
88
159
  export const OverlayFaint = "rgb(255 255 255 / 0.06)"; // Dark-mode faint overlay (6% white) — inverted from light
89
160
  export const FontFamilySans =
90
- 'var(--font-geist-sans), "Geist", var(--font-noto-sans-sc, "Noto Sans SC"), "PingFang SC", "Microsoft YaHei", -apple-system, BlinkMacSystemFont, system-ui, sans-serif';
161
+ 'var(--font-geist-sans), "Geist", var(--font-misans, "MiSans"), "PingFang SC", "Microsoft YaHei", -apple-system, BlinkMacSystemFont, system-ui, sans-serif';
91
162
  export const FontFamilyCn =
92
- 'var(--font-geist-sans), "Geist", var(--font-noto-sans-sc, "Noto Sans SC"), "PingFang SC", "Microsoft YaHei", sans-serif'; // CJK-locale stack — same order as sans, minus the Latin-only system faces
163
+ '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
93
164
  export const FontFamilyDisplay =
94
- 'var(--font-geist-sans), "Geist", var(--font-noto-sans-sc, "Noto Sans SC"), sans-serif';
165
+ 'var(--font-dm-sans), "DM Sans", var(--font-misans, "MiSans"), "PingFang SC", sans-serif';
95
166
  export const FontFamilyHeading =
96
- 'var(--font-geist-sans), "Geist", var(--font-noto-sans-sc, "Noto Sans SC"), sans-serif';
167
+ 'var(--font-dm-sans), "DM Sans", var(--font-misans, "MiSans"), "PingFang SC", sans-serif';
97
168
  export const FontFamilyMono =
98
169
  'var(--font-geist-mono), "Geist Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace';
99
170
  export const TransitionDefault = {
@@ -127,18 +198,18 @@ export const MotionDurationFlow = "200ms";
127
198
  export const MotionDurationReveal = "300ms";
128
199
  export const MotionDurationCinematic = "500ms";
129
200
  export const FocusRingDefault = "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.
130
- export const ScaleNeutral1 = "#020617";
131
- export const ScaleNeutral2 = "#0f172a";
132
- export const ScaleNeutral3 = "#1e293b";
133
- export const ScaleNeutral4 = "#334155";
134
- export const ScaleNeutral5 = "#475569";
201
+ export const ScaleNeutral1 = "#0b0c0d";
202
+ export const ScaleNeutral2 = "#18191c";
203
+ export const ScaleNeutral3 = "#26272a";
204
+ export const ScaleNeutral4 = "#3f4044";
205
+ export const ScaleNeutral5 = "#515357";
135
206
  export const ScaleNeutral6 = "#666666"; // subtle border — DERIVED: OKLab lerp step5 → step9 at t=0.25, chroma forced to 0. The achromatic result is deliberate and preserves the documented intent of color.nebutra-gray ('used where blue undertone clashes — primarily dark-mode borders, dividers, elevation hairlines'). What was broken was the LIGHTNESS: gray-900/800/700 are darker than the slate background tier they sit above, so the border read as a hole rather than a hairline.
136
- export const ScaleNeutral7 = "#7a7a7a"; // default border — DERIVED: OKLab lerp step5 → step9 at t=0.50, chroma 0.
207
+ export const ScaleNeutral7 = "#797979"; // default border — DERIVED: OKLab lerp step5 → step9 at t=0.50, chroma 0.
137
208
  export const ScaleNeutral8 = "#8d8d8d"; // hovered border — DERIVED: OKLab lerp step5 → step9 at t=0.75, chroma 0.
138
- export const ScaleNeutral9 = "#94a3b8";
139
- export const ScaleNeutral10 = "#cbd5e1";
140
- export const ScaleNeutral11 = "#e2e8f0";
141
- export const ScaleNeutral12 = "#f8fafc";
209
+ export const ScaleNeutral9 = "#9fa1a5";
210
+ export const ScaleNeutral10 = "#d2d4d8";
211
+ export const ScaleNeutral11 = "#e4e5e8";
212
+ export const ScaleNeutral12 = "#f9fafb";
142
213
  export const ScaleBlue1 = "#030815"; // app tint — L* 13.59, C 0.031, hue 264.
143
214
  export const ScaleBlue2 = "#060f25"; // subtle background — L* 17.43, C 0.048.
144
215
  export const ScaleBlue3 = "#09183b"; // component background default — L* 22.04, C 0.071.
@@ -165,20 +236,20 @@ export const ScaleCyan10 = "#5af8ce"; // solid fill hover — L* 88.53, C 0.145,
165
236
  export const ScaleCyan11 = "#90fbdb"; // secondary text — L* 91.46, C 0.110. 15.68:1 on step 1.
166
237
  export const ScaleCyan12 = "#bdfde8"; // primary text — L* 94.54, C 0.070. 16.95:1 on step 1.
167
238
  export const ScaleCyanContrast = "#0d2b25"; // Label ink for the bright fill tier. Absolute near-black, identical in both modes. 10.35:1 on step 9, 11.34:1 on step 10.
168
- export const ShadcnBackground = "222 14% 9%";
169
- export const ShadcnForeground = "210 18% 96%";
170
- export const ShadcnCard = "222 12% 13%";
171
- export const ShadcnCardForeground = "210 18% 96%";
172
- export const ShadcnPopover = "222 12% 13%";
173
- export const ShadcnPopoverForeground = "210 18% 96%";
174
- export const ShadcnPrimary = "222.6 74.4% 55.5%"; // Dark-mode action blue, paired with the near-black --primary-foreground, not white. #396ae2 keeps the VI hue and sits at L*55.9 C0.191.
175
- export const ShadcnPrimaryForeground = "0 0% 100%"; // White, matching light mode and matching --blue-contrast. It was near-black (222 14% 9%) when --primary was a LIGHT fill at L* 68.3, where dark ink read 6.20:1. Once --primary became a deep fill at L* 55.9 the pairing inverted and measured 3.74:1, below AA — the fill moved and the ink did not. The deep-fill tier takes white in both modes; --blue-contrast says the same thing, and they must agree because --primary and --blue-9 are now the same value.
176
- export const ShadcnSecondary = "222 10% 18%";
177
- export const ShadcnSecondaryForeground = "210 18% 96%";
178
- export const ShadcnMuted = "222 10% 17%";
179
- export const ShadcnMutedForeground = "220 8% 65%";
180
- export const ShadcnAccent = "228 38% 22%";
181
- export const ShadcnAccentForeground = "228 95% 80%";
239
+ export const ShadcnBackground = "220 11.1% 5.3%"; // 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).
240
+ export const ShadcnForeground = "228 23.8% 95.9%";
241
+ export const ShadcnCard = "220 7.3% 8%";
242
+ export const ShadcnCardForeground = "228 23.8% 95.9%";
243
+ export const ShadcnPopover = "225 7.7% 10.2%";
244
+ export const ShadcnPopoverForeground = "228 23.8% 95.9%";
245
+ export const ShadcnPrimary = "228 23.8% 95.9%"; // 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.
246
+ export const ShadcnPrimaryForeground = "220 11.1% 5.3%"; // White, matching light mode and matching --blue-contrast. It was near-black (222 14% 9%) when --primary was a LIGHT fill at L* 68.3, where dark ink read 6.20:1. Once --primary became a deep fill at L* 55.9 the pairing inverted and measured 3.74:1, below AA — the fill moved and the ink did not. The deep-fill tier takes white in both modes; --blue-contrast says the same thing, and they must agree because --primary and --blue-9 are now the same value.
247
+ export const ShadcnSecondary = "225 6.2% 12.5%";
248
+ export const ShadcnSecondaryForeground = "228 23.8% 95.9%";
249
+ export const ShadcnMuted = "225 6.2% 12.5%";
250
+ export const ShadcnMutedForeground = "228 2.6% 62.5%";
251
+ export const ShadcnAccent = "225 6.2% 12.5%";
252
+ export const ShadcnAccentForeground = "228 23.8% 95.9%";
182
253
  export const ShadcnDestructive = "0 63% 38%";
183
254
  export const ShadcnDestructiveForeground = "210 18% 96%";
184
255
  export const ShadcnDestructiveStrong = "0 80% 66%"; // Red as FOREGROUND on a dark surface. --destructive (0 63% 38%) is 2.15:1 on --card here — a fill only. Lightened to 5.18:1 on --card / 5.61:1 on --neutral-1, which sits alongside the light-mode 5.42:1 so red reads with the same weight in both themes. Use --destructive for fills with --destructive-foreground on top; use this for red text and icons.
@@ -190,17 +261,17 @@ export const ShadcnWarningForeground = "222 14% 9%";
190
261
  export const ShadcnWarningStrong = "38 80% 52%"; // Amber as foreground on a dark surface. Unlike light mode this needs no adjustment — 38 80% 52% is already 7.98:1 against --neutral-1 — so it deliberately equals --warning. The token exists in both themes so consumers can reference one name.
191
262
  export const ShadcnInfo = "228 95% 72%";
192
263
  export const ShadcnInfoForeground = "222 14% 9%";
193
- export const ShadcnBorder = "220 8% 22%";
194
- export const ShadcnInput = "220 8% 22%";
195
- export const ShadcnRing = "0 0% 88%"; // Focus ring (dark mode) — neutral light gray. Mirrors light-mode neutral foreground choice.
196
- export const ShadcnSidebar = "222 16% 8%";
197
- export const ShadcnSidebarForeground = "210 18% 94%";
198
- export const ShadcnSidebarPrimary = "228 95% 72%";
199
- export const ShadcnSidebarPrimaryForeground = "222 14% 9%";
200
- export const ShadcnSidebarAccent = "228 38% 22%";
201
- export const ShadcnSidebarAccentForeground = "228 95% 80%";
202
- export const ShadcnSidebarBorder = "220 8% 18%";
203
- export const ShadcnSidebarRing = "228 95% 72%";
264
+ export const ShadcnBorder = "220 3.6% 16.3%";
265
+ export const ShadcnInput = "220 3.6% 16.3%";
266
+ export const ShadcnRing = "222.6 87.3% 69%"; // The House blue. Focus rings, selection and links — the one saturated hue on a product screen. #2e65ee light / #6b93f5 dark.
267
+ export const ShadcnSidebar = "220 11.1% 5.3%";
268
+ export const ShadcnSidebarForeground = "228 23.8% 95.9%";
269
+ export const ShadcnSidebarPrimary = "228 23.8% 95.9%"; // Current-page accent in the sidebar. = blue-11 (#89aaee, L* 74.0, C 0.106), the ramp's measured secondary-text tier on dark (8.62:1 on step 1). Was 228 95% 72% — 95% chroma sat outside every measured band and matched no ramp step.
270
+ export const ShadcnSidebarPrimaryForeground = "220 11.1% 5.3%";
271
+ export const ShadcnSidebarAccent = "225 6.2% 12.5%";
272
+ export const ShadcnSidebarAccentForeground = "228 23.8% 95.9%";
273
+ export const ShadcnSidebarBorder = "225 6.2% 12.5%";
274
+ export const ShadcnSidebarRing = "222.6 87.3% 69%";
204
275
  export const ShadcnChart1 = "228 95% 67%";
205
276
  export const ShadcnChart2 = "168 96% 54%";
206
277
  export const ShadcnChart3 = "228 100% 82%";
@@ -112,8 +112,93 @@ export const TrackingDisplay: string;
112
112
  export const TrackingHeading: string;
113
113
  /** Body emphasis */
114
114
  export const TrackingTight: string;
115
+ /** Uppercase micro-labels. 0.07em is Vercel's measured eyebrow value (0.071em); open tracking keeps small caps legible. */
116
+ export const TrackingLabel: string;
115
117
  export const LeadingDisplay: string;
116
118
  export const LeadingHeading: string;
119
+ export const Type2xsSize: string;
120
+ export const Type2xsLeading: string;
121
+ export const Type2xsTracking: string;
122
+ export const TypeXsSize: string;
123
+ export const TypeXsLeading: string;
124
+ export const TypeXsTracking: string;
125
+ export const TypeUiSize: string;
126
+ export const TypeUiLeading: string;
127
+ export const TypeUiTracking: string;
128
+ export const TypeSmSize: string;
129
+ export const TypeSmLeading: string;
130
+ export const TypeSmTracking: string;
131
+ export const TypeBaseSize: string;
132
+ export const TypeBaseLeading: string;
133
+ export const TypeBaseTracking: string;
134
+ export const TypeLgSize: string;
135
+ export const TypeLgLeading: string;
136
+ export const TypeLgTracking: string;
137
+ export const TypeXlSize: string;
138
+ export const TypeXlLeading: string;
139
+ export const TypeXlTracking: string;
140
+ export const Type2xlSize: string;
141
+ export const Type2xlLeading: string;
142
+ export const Type2xlTracking: string;
143
+ export const Type3xlSize: string;
144
+ export const Type3xlLeading: string;
145
+ export const Type3xlTracking: string;
146
+ export const Type4xlSize: string;
147
+ export const Type4xlLeading: string;
148
+ export const Type4xlTracking: string;
149
+ export const Type5xlSize: string;
150
+ export const Type5xlLeading: string;
151
+ export const Type5xlTracking: string;
152
+ export const Type6xlSize: string;
153
+ export const Type6xlLeading: string;
154
+ export const Type6xlTracking: string;
155
+ export const Type7xlSize: string;
156
+ export const Type7xlLeading: string;
157
+ export const Type7xlTracking: string;
158
+ export const Type8xlSize: string;
159
+ export const Type8xlLeading: string;
160
+ export const Type8xlTracking: string;
161
+ export const Type9xlSize: string;
162
+ export const Type9xlLeading: string;
163
+ export const Type9xlTracking: string;
164
+ export const TypeDisplaySize: string;
165
+ export const TypeDisplayLeading: string;
166
+ export const TypeDisplayTracking: string;
167
+ export const TypeBodySize: string;
168
+ export const TypeBodyLeading: string;
169
+ export const TypeBodyTracking: string;
170
+ export const TypeLabelSize: string;
171
+ export const TypeLabelLeading: string;
172
+ export const TypeLabelTracking: string;
173
+ export const TypeMetaSize: string;
174
+ export const TypeMetaLeading: string;
175
+ export const TypeMetaTracking: string;
176
+ /** Within a component: an element lifted over its siblings. */
177
+ export const LayerRaised: string;
178
+ /** Sticky headers and table heads. */
179
+ export const LayerSticky: string;
180
+ /** Floating toolbars and canvas chrome anchored to content. */
181
+ export const LayerFloating: string;
182
+ /** App navigation and the shell's top bar. */
183
+ export const LayerNav: string;
184
+ /** Mobile navigation drawers and their toggles. */
185
+ export const LayerDrawer: string;
186
+ /** Page-level banners: cookie consent, announcements. */
187
+ export const LayerBanner: string;
188
+ /** The skip link — above page chrome whenever it is focused. */
189
+ export const LayerSkipLink: string;
190
+ /** App-owned floating panels that are not overlays (locale switcher, search flyouts). */
191
+ export const LayerPanel: string;
192
+ /** Overlay tier. Mirrors overlayZIndex in @nebutra/ui; a test keeps them equal. */
193
+ export const LayerBackdrop: string;
194
+ /** Dialogs and sheets. */
195
+ export const LayerModal: string;
196
+ /** Popovers, menus, selects. */
197
+ export const LayerPopover: string;
198
+ /** Tooltips. */
199
+ export const LayerTooltip: string;
200
+ /** Developer and debug surfaces only — never product UI. */
201
+ export const LayerDevtools: string;
117
202
  /** Etched-glass hairline (light mode value, dark mode override in themes/dark.json) */
118
203
  export const RingHairline: string;
119
204
  /** Light-mode faint overlay (6% black) */
@@ -243,14 +328,14 @@ export const ScaleCyan11: string;
243
328
  export const ScaleCyan12: string;
244
329
  /** 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. */
245
330
  export const ScaleCyanContrast: string;
246
- /** HSL channel triple — consume via hsl(var(--background)) */
331
+ /** 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). */
247
332
  export const ShadcnBackground: string;
248
333
  export const ShadcnForeground: string;
249
334
  export const ShadcnCard: string;
250
335
  export const ShadcnCardForeground: string;
251
336
  export const ShadcnPopover: string;
252
337
  export const ShadcnPopoverForeground: string;
253
- /** Product action blue. Derived, not borrowed: hue 264 is the VI hue, L* and C were chosen inside the band the industry actually ships (measured OKLCH C 0.167-0.235, L* 54-67 across Vercel, Stripe, Linear, GitHub, Tailwind, Radix, Figma, Notion). #2e65ee = L*55.5 C0.215, white label 4.99:1. The previous 228 85% 56% (#2f56ee, C0.232) also passed at 5.70:1 — this trims it to the middle of the band rather than its top edge. The VI lock --blue-9 (#0033FE, C0.290) is 23% above anything in that band and must never surface on a component. */
338
+ /** 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. */
254
339
  export const ShadcnPrimary: string;
255
340
  export const ShadcnPrimaryForeground: string;
256
341
  export const ShadcnSecondary: string;
@@ -276,10 +361,11 @@ export const ShadcnInfo: string;
276
361
  export const ShadcnInfoForeground: string;
277
362
  export const ShadcnBorder: string;
278
363
  export const ShadcnInput: string;
279
- /** Focus ring — neutral foreground (Vercel/Linear/Cursor 2026 pattern). Brand blue is reserved for selected/active states; focus indication is chrome and stays neutral. Consumed by global :focus-visible outline as hsl(var(--ring) / 0.5). */
364
+ /** The House blue. Focus rings, selection and links — the one saturated hue on a product screen. #2e65ee light / #6b93f5 dark. */
280
365
  export const ShadcnRing: string;
281
366
  export const ShadcnSidebar: string;
282
367
  export const ShadcnSidebarForeground: string;
368
+ /** 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. */
283
369
  export const ShadcnSidebarPrimary: string;
284
370
  export const ShadcnSidebarPrimaryForeground: string;
285
371
  export const ShadcnSidebarAccent: string;