@inversestudio/neptune-components 1.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.
Files changed (42) hide show
  1. package/README.md +2 -0
  2. package/components/data-display/AppPreview.jsx +150 -0
  3. package/components/data-display/DataTable.jsx +65 -0
  4. package/components/data-display/FileTree.jsx +123 -0
  5. package/components/data-display/KpiCard.jsx +57 -0
  6. package/components/data-display/VersionRow.jsx +103 -0
  7. package/components/feedback/Avatar.jsx +28 -0
  8. package/components/feedback/Badge.jsx +32 -0
  9. package/components/feedback/ChatMessage.jsx +42 -0
  10. package/components/feedback/StatusDot.jsx +55 -0
  11. package/components/feedback/StatusIndicator.jsx +40 -0
  12. package/components/inputs/Button.jsx +48 -0
  13. package/components/inputs/Checkbox.jsx +90 -0
  14. package/components/inputs/FilterBar.jsx +64 -0
  15. package/components/inputs/IconButton.jsx +43 -0
  16. package/components/inputs/IconToggle.jsx +44 -0
  17. package/components/inputs/NaiaChatInput.jsx +173 -0
  18. package/components/inputs/NaiaSendButton.jsx +36 -0
  19. package/components/inputs/PillSelect.jsx +175 -0
  20. package/components/inputs/PropertyField.jsx +58 -0
  21. package/components/inputs/SuggestionPill.jsx +28 -0
  22. package/components/inputs/TextInput.jsx +96 -0
  23. package/components/inputs/Toggle.jsx +73 -0
  24. package/components/layout/AppHeader.jsx +56 -0
  25. package/components/layout/BottomBar.jsx +81 -0
  26. package/components/layout/Card.jsx +57 -0
  27. package/components/layout/Panel.jsx +26 -0
  28. package/components/layout/Toolbar.jsx +89 -0
  29. package/components/navigation/Breadcrumb.jsx +43 -0
  30. package/components/navigation/Dropdown.jsx +104 -0
  31. package/components/navigation/SidebarNav.jsx +82 -0
  32. package/components/navigation/SidebarTabs.jsx +99 -0
  33. package/components/navigation/TabBar.jsx +61 -0
  34. package/components/overlays/Modal.jsx +101 -0
  35. package/components/shared/index.jsx +112 -0
  36. package/index.css +3 -0
  37. package/index.js +50 -0
  38. package/neptune-components.css +1771 -0
  39. package/package.json +45 -0
  40. package/registry.json +1215 -0
  41. package/tokens/neptune-design-tokens.css +730 -0
  42. package/tokens/neptune-design-tokens.json +191 -0
@@ -0,0 +1,730 @@
1
+ /* ═══════════════════════════════════════════════════════════════════════════
2
+ NEPTUNE DXP — DESIGN TOKENS v2.1
3
+
4
+ A fine-grained, AA-compliant color system with 19-step palettes for each
5
+ brand color, plus warm plum-tinted neutrals and muted aubergine.
6
+
7
+ Sources:
8
+ - neptune-software.com: 339 CSS vars (--dst-- prefix), brand identity
9
+ - docs.neptune-software.com: Typography, layout, component styles
10
+
11
+ Palette structure: 50 → 950 (19 steps per color, uniform 50-step dark range)
12
+ Theme modes: Light (default) / Dark (class="dark" or data-theme="dark")
13
+
14
+ v2.1 changes:
15
+ - Added steps 650, 750, 850 to all palettes (fills 100-step gaps in darks)
16
+ - Shifted Lavender hue: 256° → 272° (now distinctly blue-violet vs Purple)
17
+ - Shifted Coral hue: 7° → 18° (now distinctly warm salmon vs Red)
18
+ - NEW: Aubergine palette — muted, desaturated plum cousin (H:310°, low S)
19
+
20
+ WCAG 2.1 AA compliance:
21
+ - All text tokens ≥ 4.5:1 on their intended background
22
+ - All interactive accent tokens ≥ 3:1
23
+ - Disabled states & decorative borders: WCAG-exempt (marked)
24
+ ═══════════════════════════════════════════════════════════════════════════ */
25
+
26
+
27
+ /* ─────────────────────────────────────────────────────────────────────────
28
+ 1. COLOR PALETTES — 19 steps each (50–950)
29
+ Never reference these directly in components; use semantic tokens below.
30
+ ───────────────────────────────────────────────────────────────────────── */
31
+
32
+ :root {
33
+ /* ── Plum (brand primary) ── H:322° ── */
34
+ --npt-plum-50: #faf4f8; --npt-plum-100: #f7e9f2;
35
+ --npt-plum-150: #f3d8e9; --npt-plum-200: #efc3df;
36
+ --npt-plum-250: #eaa4d1; --npt-plum-300: #e67fc1;
37
+ --npt-plum-350: #e359b2; --npt-plum-400: #e133a2;
38
+ --npt-plum-450: #cc1e8e; --npt-plum-500: #a61c74;
39
+ --npt-plum-550: #80195b; --npt-plum-600: #601645;
40
+ --npt-plum-650: #52143c; --npt-plum-700: #441232;
41
+ --npt-plum-750: #39102a; --npt-plum-800: #2e0f23;
42
+ --npt-plum-850: #260d1d; --npt-plum-900: #1e0b17;
43
+ --npt-plum-950: #12080e;
44
+
45
+ /* ── Orange (brand accent / CTA) ── H:31° ── */
46
+ --npt-orange-50: #fdf8f2; --npt-orange-100: #fcf0e3;
47
+ --npt-orange-150: #fee7cd; --npt-orange-200: #ffdbb2;
48
+ --npt-orange-250: #ffca8f; --npt-orange-300: #ffb666;
49
+ --npt-orange-350: #ffa33d; --npt-orange-400: #ff8f14;
50
+ --npt-orange-450: #eb7b00; --npt-orange-500: #c26600;
51
+ --npt-orange-550: #995000; --npt-orange-600: #753e00;
52
+ --npt-orange-650: #663600; --npt-orange-700: #572d00;
53
+ --npt-orange-750: #4a2600; --npt-orange-800: #3c2001;
54
+ --npt-orange-850: #301a02; --npt-orange-900: #251503;
55
+ --npt-orange-950: #160d04;
56
+
57
+ /* ── Purple (links / secondary accent) ── H:272° ── */
58
+ --npt-purple-50: #f6f4fb; --npt-purple-100: #e1dbfa;
59
+ --npt-purple-150: #cdc3fb; --npt-purple-200: #b9acfa;
60
+ --npt-purple-250: #a696fd; --npt-purple-300: #8d76f6;
61
+ --npt-purple-350: #8666fc; --npt-purple-400: #7651ed;
62
+ --npt-purple-450: #693ddb; --npt-purple-500: #5d2bc7;
63
+ --npt-purple-550: #511db3; --npt-purple-600: #451b94;
64
+ --npt-purple-650: #39177a; --npt-purple-700: #2f1264;
65
+ --npt-purple-750: #250d4f; --npt-purple-800: #1c093d;
66
+ --npt-purple-850: #15072e; --npt-purple-900: #0e071f;
67
+ --npt-purple-950: #0a0713;
68
+
69
+ /* ── Lavender (decorative / highlights) ── H:275° (shifted from 256°) ── */
70
+ --npt-lavender-50: #f7f2fb; --npt-lavender-100: #f0e4f8;
71
+ --npt-lavender-150: #e7d3f6; --npt-lavender-200: #dcbcf3;
72
+ --npt-lavender-250: #cd9bf1; --npt-lavender-300: #bb75ee;
73
+ --npt-lavender-350: #a747eb; --npt-lavender-400: #9219e8;
74
+ --npt-lavender-450: #7a11c5; --npt-lavender-500: #6410a0;
75
+ --npt-lavender-550: #4e0f7b; --npt-lavender-600: #390e58;
76
+ --npt-lavender-650: #2c0d42; --npt-lavender-700: #200c2f;
77
+ --npt-lavender-750: #180a21; --npt-lavender-800: #110817;
78
+ --npt-lavender-850: #0b060e; --npt-lavender-900: #08050a;
79
+ --npt-lavender-950: #050306;
80
+
81
+ /* ── Green (success / status) ── H:83° ── */
82
+ --npt-green-50: #f9fdf2; --npt-green-100: #f3fce3;
83
+ --npt-green-150: #ebfecd; --npt-green-200: #e2ffb2;
84
+ --npt-green-250: #d4ff8f; --npt-green-300: #c5ff66;
85
+ --npt-green-350: #b5ff3d; --npt-green-400: #a5ff14;
86
+ --npt-green-450: #91eb00; --npt-green-500: #78c200;
87
+ --npt-green-550: #5f9900; --npt-green-600: #487500;
88
+ --npt-green-650: #3f6600; --npt-green-700: #365700;
89
+ --npt-green-750: #2e4a00; --npt-green-800: #263c01;
90
+ --npt-green-850: #1f3002; --npt-green-900: #182503;
91
+ --npt-green-950: #0f1604;
92
+
93
+ /* ── Red (error / danger) ── H:359° ── */
94
+ --npt-red-50: #fbf4f4; --npt-red-100: #f8e8e8;
95
+ --npt-red-150: #f5d6d6; --npt-red-200: #f3bfc0;
96
+ --npt-red-250: #f19d9e; --npt-red-300: #f07577;
97
+ --npt-red-350: #f04c4f; --npt-red-400: #f02326;
98
+ --npt-red-450: #dc0f11; --npt-red-500: #b30f11;
99
+ --npt-red-550: #8a0f11; --npt-red-600: #660f10;
100
+ --npt-red-650: #580e10; --npt-red-700: #490e0f;
101
+ --npt-red-750: #3d0d0e; --npt-red-800: #310c0d;
102
+ --npt-red-850: #280b0c; --npt-red-900: #1f0a0a;
103
+ --npt-red-950: #120707;
104
+
105
+ /* ── Coral (warm decorative) ── H:18° (shifted from 7°) ── */
106
+ --npt-coral-50: #fef5f1; --npt-coral-100: #fde9e0;
107
+ --npt-coral-150: #fdd7c8; --npt-coral-200: #fcc2ab;
108
+ --npt-coral-250: #fba787; --npt-coral-300: #fa8860;
109
+ --npt-coral-350: #f96838; --npt-coral-400: #f54d12;
110
+ --npt-coral-450: #e03c00; --npt-coral-500: #b83200;
111
+ --npt-coral-550: #912800; --npt-coral-600: #6e1e00;
112
+ --npt-coral-650: #561800; --npt-coral-700: #401200;
113
+ --npt-coral-750: #2e0d01; --npt-coral-800: #1f0901;
114
+ --npt-coral-850: #150602; --npt-coral-900: #0e0402;
115
+ --npt-coral-950: #090302;
116
+
117
+ /* ── Neutral (warm plum-tinted grays) ── H:322° S:4-8% ── */
118
+ --npt-neutral-50: #f8f7f7; --npt-neutral-100: #f0eff0;
119
+ --npt-neutral-150: #e7e4e6; --npt-neutral-200: #dbd6d9;
120
+ --npt-neutral-250: #cbc2c8; --npt-neutral-300: #b9acb4;
121
+ --npt-neutral-350: #a696a0; --npt-neutral-400: #93808c;
122
+ --npt-neutral-450: #7e6d77; --npt-neutral-500: #675b62;
123
+ --npt-neutral-550: #51484e; --npt-neutral-600: #3e383b;
124
+ --npt-neutral-650: #363034; --npt-neutral-700: #2e292c;
125
+ --npt-neutral-750: #272326; --npt-neutral-800: #201d1f;
126
+ --npt-neutral-850: #1a181a; --npt-neutral-900: #151315;
127
+ --npt-neutral-950: #0d0c0d;
128
+
129
+ /* ── Aubergine (muted plum cousin) ── H:310° S:low ── NEW ── */
130
+ --npt-aubergine-50: #f8f5f7; --npt-aubergine-100: #f0eaee;
131
+ --npt-aubergine-150: #e5dbe2; --npt-aubergine-200: #d8c9d3;
132
+ --npt-aubergine-250: #c7b0bf; --npt-aubergine-300: #b496aa;
133
+ --npt-aubergine-350: #a07c96; --npt-aubergine-400: #8c6382;
134
+ --npt-aubergine-450: #774b6e; --npt-aubergine-500: #623b5b;
135
+ --npt-aubergine-550: #4e2f49; --npt-aubergine-600: #3c2539;
136
+ --npt-aubergine-650: #301e2e; --npt-aubergine-700: #261824;
137
+ --npt-aubergine-750: #1d131b; --npt-aubergine-800: #160f14;
138
+ --npt-aubergine-850: #100b0f; --npt-aubergine-900: #0b080a;
139
+ --npt-aubergine-950: #070506;
140
+ }
141
+
142
+
143
+ /* ─────────────────────────────────────────────────────────────────────────
144
+ 2. TYPOGRAPHY & LAYOUT PRIMITIVES
145
+ ───────────────────────────────────────────────────────────────────────── */
146
+
147
+ :root {
148
+ /* ── Font Stacks ── */
149
+ --npt-font-sans: "ABC Camera Plain", Arial, sans-serif;
150
+ --npt-font-mono: "Roboto Mono", monospace;
151
+
152
+ /* ── Font Sizes ── */
153
+ --npt-text-xs: 0.75rem; /* 12px */
154
+ --npt-text-sm: 0.875rem; /* 14px */
155
+ --npt-text-base: 1rem; /* 16px */
156
+ --npt-text-md: 1.0625rem; /* 17px — docs body */
157
+ --npt-text-lg: 1.125rem; /* 18px */
158
+ --npt-text-xl: 1.25rem; /* 20px */
159
+ --npt-text-2xl: 1.625rem; /* 26px */
160
+ --npt-text-3xl: 1.875rem; /* 30px */
161
+ --npt-text-4xl: 2.25rem; /* 36px */
162
+ --npt-text-5xl: 2.875rem; /* 46px */
163
+ --npt-text-6xl: 3.25rem; /* 52px */
164
+
165
+ /* ── Font Weights ── */
166
+ --npt-weight-light: 300;
167
+ --npt-weight-regular: 400;
168
+ --npt-weight-medium: 500;
169
+ --npt-weight-semibold: 600;
170
+ --npt-weight-bold: 700;
171
+
172
+ /* ── Line Heights ── */
173
+ --npt-leading-none: 1;
174
+ --npt-leading-tight: 1.2;
175
+ --npt-leading-snug: 1.35;
176
+ --npt-leading-normal: 1.5;
177
+ --npt-leading-relaxed: 1.6;
178
+
179
+ /* ── Letter Spacing ── */
180
+ --npt-tracking-tight: -0.04em;
181
+ --npt-tracking-snug: -0.03em;
182
+ --npt-tracking-normal: normal;
183
+
184
+ /* ── Spacing ── */
185
+ --npt-space-0: 0; --npt-space-1: 4px; --npt-space-2: 8px;
186
+ --npt-space-3: 12px; --npt-space-4: 16px; --npt-space-5: 20px;
187
+ --npt-space-6: 24px; --npt-space-8: 32px; --npt-space-10: 40px;
188
+ --npt-space-12: 48px; --npt-space-16: 64px; --npt-space-20: 80px;
189
+
190
+ /* ── Radius ── */
191
+ --npt-radius-sm: 4px; --npt-radius-md: 8px;
192
+ --npt-radius-lg: 12px; --npt-radius-xl: 16px;
193
+ --npt-radius-2xl: 20px; --npt-radius-pill: 50px;
194
+ --npt-radius-full: 9999px;
195
+
196
+ /* ── Motion ── */
197
+ --npt-duration-fast: 150ms;
198
+ --npt-duration-base: 250ms;
199
+ --npt-duration-slow: 400ms;
200
+ --npt-ease-default: cubic-bezier(0.4, 0, 0.2, 1);
201
+ --npt-ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
202
+
203
+ /* ── Layout ── */
204
+ --npt-container: 1284px;
205
+ --npt-container-wide: 1444px;
206
+ --npt-grid-gutter: 24px;
207
+ }
208
+
209
+
210
+ /* ─────────────────────────────────────────────────────────────────────────
211
+ 3. SEMANTIC TOKENS — LIGHT MODE (default)
212
+
213
+ All text tokens verified ≥ 4.5:1 on their surface.
214
+ All UI accent tokens verified ≥ 3:1.
215
+ ───────────────────────────────────────────────────────────────────────── */
216
+
217
+ :root,
218
+ [data-theme="light"] {
219
+ /* ── Surfaces ── */
220
+ --npt-surface-app: var(--npt-neutral-50); /* #f8f7f7 — warm white */
221
+ --npt-surface-raised: var(--npt-neutral-50); /* #f8f7f7 — lightest neutral */
222
+ --npt-surface-sunken: var(--npt-neutral-100); /* #f0eff0 */
223
+ --npt-surface-overlay: var(--npt-neutral-50); /* #f8f7f7 */
224
+ --npt-surface-elevated: var(--npt-neutral-50); /* same as raised in light */
225
+ --npt-surface-deep: var(--npt-neutral-150); /* #e7e4e6 — deeper inset */
226
+ --npt-surface-brand: var(--npt-plum-750); /* #39102a — plum base */
227
+ --npt-surface-brand-subtle: var(--npt-orange-50); /* #fdf8f2 */
228
+ --npt-surface-brand-muted: var(--npt-orange-150); /* #fee7cd */
229
+ --npt-surface-warm: var(--npt-plum-50); /* #faf4f8 */
230
+
231
+ /* ── Text — AA 4.5:1 verified on surface-app ── */
232
+ --npt-text-primary: var(--npt-neutral-900); /* #151315 — 18.5:1 ✅ */
233
+ --npt-text-secondary: var(--npt-neutral-550); /* #51484e — 8.8:1 ✅ */
234
+ --npt-text-tertiary: var(--npt-neutral-500); /* #675b62 — 6.13:1 on surface-app (was neutral-450 4.22:1 on sunken) */
235
+ --npt-text-disabled: var(--npt-neutral-300); /* #b9acb4 — WCAG exempt */
236
+ --npt-text-inverse: var(--npt-neutral-50); /* #f8f7f7 */
237
+ --npt-text-brand: var(--npt-plum-750); /* #39102a — 16.4:1 ✅ */
238
+ --npt-text-link: var(--npt-purple-500); /* #5d2bc7 — 8.7:1 ✅ */
239
+ --npt-text-link-hover: var(--npt-purple-400); /* #744eea — 4.71:1 on surface-app (was purple-350 3.69:1) */
240
+ --npt-text-on-brand: var(--npt-neutral-50);
241
+ --npt-text-on-accent: var(--npt-neutral-50);
242
+
243
+ /* ── Icons ── */
244
+ --npt-icon-primary: var(--npt-neutral-900);
245
+ --npt-icon-secondary: var(--npt-neutral-550);
246
+ --npt-icon-tertiary: var(--npt-neutral-500); /* cascade from text-tertiary fix */
247
+ --npt-icon-brand: var(--npt-orange-500); /* #c26600 — 4.0:1 ✅ */
248
+ --npt-icon-inverse: var(--npt-neutral-50);
249
+
250
+ /* ── Borders ── */
251
+ --npt-border-default: var(--npt-neutral-200); /* #dbd6d9 — decorative */
252
+ --npt-border-subtle: var(--npt-neutral-100); /* #f0eff0 — decorative */
253
+ --npt-border-strong: var(--npt-neutral-300); /* #b9acb4 — decorative */
254
+ --npt-border-input: var(--npt-neutral-400); /* #93808c — 3.7:1 ✅ */
255
+ --npt-border-focus: var(--npt-purple-400); /* #7651ed */
256
+
257
+ /* ── Accent — ≥ 3:1 on surface-app ── */
258
+ --npt-accent-primary: var(--npt-orange-500); /* #c26600 — 4.0:1 ✅ */
259
+ --npt-accent-primary-hover: var(--npt-orange-550); /* #995000 */
260
+ --npt-accent-primary-vivid: var(--npt-orange-500); /* #c26600 — 3.78:1 on surface-app (was orange-350 1.86:1) */
261
+ --npt-accent-secondary: var(--npt-purple-500); /* #5d2bc7 — 8.7:1 ✅ */
262
+ --npt-accent-secondary-hover:var(--npt-purple-350);
263
+
264
+ /* ── Toggle ── */
265
+ --npt-toggle-active: var(--npt-green-550); /* green when on */
266
+
267
+ /* ── Interactive (buttons, chips — neutral in base, purple in naia) ── */
268
+ --npt-interactive-fg: var(--npt-text-secondary);
269
+ --npt-interactive-fg-hover: var(--npt-text-primary);
270
+ --npt-interactive-border: var(--npt-border-strong);
271
+ --npt-interactive-bg: var(--npt-surface-overlay);
272
+
273
+ /* ── Status — ≥ 3:1 on white ── */
274
+ --npt-status-success: var(--npt-green-550); /* #5f9900 — 4.3:1 ✅ */
275
+ --npt-status-success-subtle: var(--npt-green-50);
276
+ --npt-status-warning: var(--npt-orange-550); /* #995000 — 6.0:1 ✅ */
277
+ --npt-status-warning-subtle: var(--npt-orange-50);
278
+ --npt-status-warning-vivid: var(--npt-orange-350);
279
+ --npt-status-error: var(--npt-red-500); /* #b30f11 — 5.9:1 ✅ */
280
+ --npt-status-error-subtle: var(--npt-red-50);
281
+ --npt-status-error-vivid: var(--npt-red-400);
282
+ --npt-status-info: var(--npt-purple-550); /* #4e16ad — 5.7:1 ✅ */
283
+ --npt-status-info-subtle: var(--npt-purple-50);
284
+ --npt-status-info-vivid: var(--npt-purple-300);
285
+
286
+ /* ── Gradients ── */
287
+ --npt-gradient-brand: linear-gradient(135deg, var(--npt-orange-400), var(--npt-orange-450));
288
+ --npt-gradient-brand-subtle: linear-gradient(135deg, var(--npt-orange-50), var(--npt-orange-150));
289
+ --npt-gradient-warm: linear-gradient(135deg, var(--npt-plum-50), var(--npt-purple-50));
290
+
291
+ /* ── Shadows (plum-tinted) ── */
292
+ --npt-shadow-xs: 0 1px 2px rgba(21, 19, 21, 0.04);
293
+ --npt-shadow-sm: 0 2px 4px rgba(21, 19, 21, 0.06);
294
+ --npt-shadow-md: 0 4px 12px rgba(21, 19, 21, 0.08);
295
+ --npt-shadow-lg: 0 8px 24px rgba(21, 19, 21, 0.10);
296
+ --npt-shadow-xl: 0 16px 48px rgba(21, 19, 21, 0.14);
297
+
298
+ /* ── Scrollbar ── */
299
+ --npt-scrollbar-track: transparent;
300
+ --npt-scrollbar-thumb: var(--npt-neutral-250);
301
+ --npt-scrollbar-thumb-hover: var(--npt-neutral-350);
302
+ }
303
+
304
+
305
+ /* ─────────────────────────────────────────────────────────────────────────
306
+ 4. SEMANTIC TOKENS — DARK MODE
307
+
308
+ All text tokens verified ≥ 4.5:1 on their surface.
309
+ All UI accent tokens verified ≥ 3:1.
310
+ ───────────────────────────────────────────────────────────────────────── */
311
+
312
+ .dark,
313
+ [data-theme="dark"] {
314
+ /* ── Surfaces (aubergine-tinted dark mode — warm plum/purple hues) ── */
315
+ --npt-surface-app: var(--npt-aubergine-700); /* #261824 */
316
+ --npt-surface-raised: var(--npt-aubergine-650); /* #301e2e */
317
+ --npt-surface-sunken: var(--npt-aubergine-750); /* #1d131b */
318
+ --npt-surface-overlay: var(--npt-aubergine-600); /* #3c2539 */
319
+ --npt-surface-elevated: var(--npt-aubergine-700); /* #261824 */
320
+ --npt-surface-deep: var(--npt-aubergine-800); /* #160f14 */
321
+ --npt-surface-brand: var(--npt-plum-750);
322
+ --npt-surface-brand-subtle: rgba(255, 158, 51, 0.06);
323
+ --npt-surface-brand-muted: rgba(255, 219, 178, 0.04);
324
+ --npt-surface-warm: var(--npt-aubergine-650); /* #301e2e */
325
+
326
+ /* ── Text — AA 4.5:1 verified on surface-app (#261824) ── */
327
+ --npt-text-primary: var(--npt-aubergine-100); /* #f0eaee — 15.3:1 ✅ */
328
+ --npt-text-secondary: var(--npt-aubergine-250); /* #c7b0bf — 9.2:1 ✅ */
329
+ --npt-text-tertiary: var(--npt-aubergine-350); /* #a07c96 — 5.4:1 ✅ */
330
+ --npt-text-disabled: var(--npt-aubergine-500); /* #623b5b — WCAG exempt */
331
+ --npt-text-inverse: var(--npt-aubergine-750); /* #1d131b */
332
+ --npt-text-brand: var(--npt-orange-200); /* #ffdbb2 — 14.1:1 ✅ */
333
+ --npt-text-link: var(--npt-purple-250); /* #a596fd — 7.9:1 ✅ */
334
+ --npt-text-link-hover: var(--npt-purple-200); /* #b9acfa */
335
+ --npt-text-on-brand: var(--npt-aubergine-100);
336
+ --npt-text-on-accent: var(--npt-aubergine-750); /* #1d131b */
337
+
338
+ /* ── Icons ── */
339
+ --npt-icon-primary: var(--npt-aubergine-100);
340
+ --npt-icon-secondary: var(--npt-aubergine-250);
341
+ --npt-icon-tertiary: var(--npt-aubergine-350);
342
+ --npt-icon-brand: var(--npt-orange-350); /* #ffa33d — 9.0:1 ✅ */
343
+ --npt-icon-inverse: var(--npt-aubergine-750);
344
+
345
+ /* ── Borders ── */
346
+ --npt-border-default: var(--npt-aubergine-600); /* #3c2539 — decorative */
347
+ --npt-border-subtle: var(--npt-aubergine-650); /* #301e2e — decorative */
348
+ --npt-border-strong: var(--npt-aubergine-550); /* #4e2f49 */
349
+ --npt-border-input: var(--npt-aubergine-400); /* #8c6382 — 3.8:1 ✅ */
350
+ --npt-border-focus: var(--npt-purple-300); /* #9673f2 */
351
+
352
+ /* ── Accent — ≥ 3:1 on surface-app ── */
353
+ --npt-accent-primary: var(--npt-orange-350); /* #ffa33d — 9.0:1 ✅ */
354
+ --npt-accent-primary-hover: var(--npt-orange-300); /* #ffb666 */
355
+ --npt-accent-primary-vivid: var(--npt-orange-350); /* #ffa33d */
356
+ --npt-accent-secondary: var(--npt-purple-250); /* #a596fd — 7.9:1 ✅ */
357
+ --npt-accent-secondary-hover:var(--npt-purple-200);
358
+
359
+ /* ── Toggle ── */
360
+ --npt-toggle-active: var(--npt-green-500); /* green when on (dark) */
361
+
362
+ /* ── Interactive (buttons, chips — neutral in base, purple in naia) ── */
363
+ --npt-interactive-fg: var(--npt-text-secondary);
364
+ --npt-interactive-fg-hover: var(--npt-text-primary);
365
+ --npt-interactive-border: var(--npt-border-strong);
366
+ --npt-interactive-bg: var(--npt-surface-overlay);
367
+
368
+ /* ── Status — ≥ 3:1 on surface-raised ── */
369
+ --npt-status-success: var(--npt-green-400); /* #a5ff14 — 9.6:1 ✅ */
370
+ --npt-status-success-subtle: rgba(74, 222, 128, 0.08);
371
+ --npt-status-warning: var(--npt-orange-300); /* #ffb666 — 10.0:1 ✅ */
372
+ --npt-status-warning-subtle: rgba(251, 191, 36, 0.06);
373
+ --npt-status-warning-vivid: var(--npt-orange-300);
374
+ --npt-status-error: var(--npt-red-300); /* #f07577 — 6.0:1 ✅ */
375
+ --npt-status-error-subtle: rgba(248, 113, 113, 0.06);
376
+ --npt-status-error-vivid: var(--npt-red-300);
377
+ --npt-status-info: var(--npt-purple-250); /* #a596fd — 6.6:1 ✅ */
378
+ --npt-status-info-subtle: rgba(96, 165, 250, 0.06);
379
+ --npt-status-info-vivid: var(--npt-purple-250);
380
+
381
+ /* ── Gradients ── */
382
+ --npt-gradient-brand: linear-gradient(135deg, var(--npt-orange-400), var(--npt-orange-450));
383
+ --npt-gradient-brand-subtle: linear-gradient(135deg, rgba(255,158,51,0.08), rgba(255,185,175,0.05));
384
+ --npt-gradient-warm: linear-gradient(135deg, rgba(56,17,42,0.25), rgba(81,40,191,0.12));
385
+
386
+ /* ── Shadows (deeper in dark mode) ── */
387
+ --npt-shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.15);
388
+ --npt-shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.20);
389
+ --npt-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.30);
390
+ --npt-shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.40);
391
+ --npt-shadow-xl: 0 16px 48px rgba(0, 0, 0, 0.50);
392
+
393
+ /* ── Scrollbar ── */
394
+ --npt-scrollbar-track: transparent;
395
+ --npt-scrollbar-thumb: var(--npt-aubergine-550);
396
+ --npt-scrollbar-thumb-hover: var(--npt-aubergine-500);
397
+ }
398
+
399
+
400
+ /* ─────────────────────────────────────────────────────────────────────────
401
+ 4b. SEMANTIC TOKENS — NAIA THEME (light)
402
+
403
+ The Naia theme overrides accent and related tokens with purple/lavender
404
+ values. Apply via data-theme="naia" on a container. Components inside
405
+ automatically adopt the Naia color scheme — no variant props needed.
406
+
407
+ Inherits all surface, text, status, shadow, and spacing tokens from
408
+ the base light theme. Only accent-related tokens are overridden.
409
+ ───────────────────────────────────────────────────────────────────────── */
410
+
411
+ [data-theme="naia"] {
412
+ /* ── Accent — purple replaces orange ── */
413
+ --npt-accent-primary: var(--npt-purple-500); /* #5d2bc7 — 8.7:1 ✅ */
414
+ --npt-accent-primary-hover: var(--npt-purple-450); /* #6639d7 */
415
+ --npt-accent-primary-vivid: var(--npt-purple-350); /* #8362f9 — for fills/icons */
416
+ --npt-accent-secondary: var(--npt-lavender-400); /* #9219e8 */
417
+ --npt-accent-secondary-hover:var(--npt-lavender-350);
418
+
419
+ /* ── Toggle uses purple ── */
420
+ --npt-toggle-active: var(--npt-purple-400); /* #744eea */
421
+
422
+ /* ── Interactive — purple fg/border for buttons, chips ── */
423
+ --npt-interactive-fg: var(--npt-purple-450); /* #6639d7 — 5.97:1 on surface-app (was purple-250 2.34:1) */
424
+ --npt-interactive-fg-hover: var(--npt-purple-400); /* #744eea */
425
+ --npt-interactive-border: var(--npt-purple-350); /* #8362f9 — 3.69:1 (was purple-300 3.24:1) */
426
+ --npt-interactive-bg: color-mix(in srgb, var(--npt-purple-500) 15%, transparent);
427
+
428
+ /* ── Focus & borders use purple-300 ── */
429
+ --npt-border-focus: var(--npt-purple-300); /* #8d76f6 */
430
+
431
+ /* ── Gradients ── */
432
+ --npt-gradient-brand: linear-gradient(135deg, var(--npt-purple-350), var(--npt-lavender-350));
433
+ --npt-gradient-brand-subtle: linear-gradient(135deg, var(--npt-purple-50), var(--npt-lavender-50));
434
+
435
+ /* ── Text on accent surfaces ── */
436
+ --npt-text-on-accent: var(--npt-neutral-50);
437
+ --npt-text-on-brand: var(--npt-neutral-50);
438
+
439
+ /* ── Icon brand uses purple ── */
440
+ --npt-icon-brand: var(--npt-purple-500); /* #5d2bc7 */
441
+ }
442
+
443
+
444
+ /* ─────────────────────────────────────────────────────────────────────────
445
+ 4c. SEMANTIC TOKENS — NAIA THEME (dark)
446
+
447
+ Same override pattern for dark mode. Activated by combining:
448
+ - [data-theme="naia"].dark (class-based dark)
449
+ - [data-theme="naia-dark"] (attribute-based dark)
450
+ ───────────────────────────────────────────────────────────────────────── */
451
+
452
+ .dark [data-theme="naia"],
453
+ [data-theme="naia"].dark,
454
+ [data-theme="naia"][data-mode="dark"],
455
+ [data-theme="naia-dark"] {
456
+ /* ── Inherit aubergine-tinted dark mode surfaces ── */
457
+ --npt-surface-app: var(--npt-aubergine-700);
458
+ --npt-surface-raised: var(--npt-aubergine-650);
459
+ --npt-surface-sunken: var(--npt-aubergine-750);
460
+ --npt-surface-overlay: var(--npt-aubergine-600);
461
+ --npt-surface-elevated: var(--npt-aubergine-700);
462
+ --npt-surface-deep: var(--npt-aubergine-800);
463
+
464
+ /* ── Text (dark) ── */
465
+ --npt-text-primary: var(--npt-aubergine-100);
466
+ --npt-text-secondary: var(--npt-aubergine-250);
467
+ --npt-text-tertiary: var(--npt-aubergine-350);
468
+ --npt-text-disabled: var(--npt-aubergine-500);
469
+ --npt-text-on-accent: var(--npt-aubergine-100);
470
+ --npt-text-on-brand: var(--npt-aubergine-100);
471
+
472
+ /* ── Accent — purple (light tints for dark bg) ── */
473
+ --npt-accent-primary: var(--npt-purple-250); /* #a596fd — 7.9:1 ✅ */
474
+ --npt-accent-primary-hover: var(--npt-purple-200); /* #b9acfa */
475
+ --npt-accent-primary-vivid: var(--npt-purple-300); /* #8d76f6 */
476
+ --npt-accent-secondary: var(--npt-lavender-300); /* #bb75ee */
477
+ --npt-accent-secondary-hover:var(--npt-lavender-250);
478
+
479
+ /* ── Toggle uses purple ── */
480
+ --npt-toggle-active: var(--npt-purple-300); /* #8d76f6 */
481
+
482
+ /* ── Interactive — lighter purple fg/border in dark naia ── */
483
+ --npt-interactive-fg: var(--npt-purple-200); /* #b9acfa */
484
+ --npt-interactive-fg-hover: var(--npt-purple-150); /* #cdc3fb */
485
+ --npt-interactive-border: var(--npt-purple-250); /* #a596fd */
486
+ --npt-interactive-bg: color-mix(in srgb, var(--npt-purple-350) 16%, transparent);
487
+
488
+ /* ── Focus & borders use purple-300 ── */
489
+ --npt-border-focus: var(--npt-purple-300); /* #8d76f6 */
490
+
491
+ /* ── Borders (dark) ── */
492
+ --npt-border-default: var(--npt-aubergine-600);
493
+ --npt-border-subtle: var(--npt-aubergine-650);
494
+ --npt-border-input: var(--npt-aubergine-400);
495
+
496
+ /* ── Gradients ── */
497
+ --npt-gradient-brand: linear-gradient(135deg, var(--npt-purple-300), var(--npt-lavender-300));
498
+ --npt-gradient-brand-subtle: linear-gradient(135deg, rgba(81,40,191,0.15), rgba(146,25,232,0.08));
499
+
500
+ /* ── Icon brand ── */
501
+ --npt-icon-brand: var(--npt-purple-250);
502
+
503
+ /* ── Shadows ── */
504
+ --npt-shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.15);
505
+ --npt-shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.20);
506
+ --npt-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.30);
507
+ --npt-shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.40);
508
+ --npt-shadow-xl: 0 16px 48px rgba(0, 0, 0, 0.50);
509
+ }
510
+
511
+
512
+ /* ─────────────────────────────────────────────────────────────────────────
513
+ 5. ON-COLOR TOKENS — Auto-computed AA (4.5:1) same-palette pairings
514
+
515
+ Usage: var(--npt-orange-200-on) returns the NEAREST step within the
516
+ orange palette that achieves ≥4.5:1 contrast against orange-200.
517
+ Light steps pair with a darker "on", dark steps pair with a lighter "on".
518
+ ───────────────────────────────────────────────────────────────────────── */
519
+
520
+ :root {
521
+ /* ── Plum on-colors ── */
522
+ --npt-plum-50-on: var(--npt-plum-450); /* → 450 (4.7:1) */
523
+ --npt-plum-100-on: var(--npt-plum-500); /* → 500 (5.9:1) */
524
+ --npt-plum-150-on: var(--npt-plum-500); /* → 500 (5.2:1) */
525
+ --npt-plum-200-on: var(--npt-plum-550); /* → 550 (6.1:1) */
526
+ --npt-plum-250-on: var(--npt-plum-550); /* → 550 (4.9:1) */
527
+ --npt-plum-300-on: var(--npt-plum-600); /* → 600 (4.8:1) */
528
+ --npt-plum-350-on: var(--npt-plum-700); /* → 700 (4.6:1) */
529
+ --npt-plum-400-on: var(--npt-plum-900); /* → 900 (4.7:1) */
530
+ --npt-plum-450-on: var(--npt-plum-50); /* → 50 (4.7:1) */
531
+ --npt-plum-500-on: var(--npt-plum-150); /* → 150 (5.2:1) */
532
+ --npt-plum-550-on: var(--npt-plum-250); /* → 250 (4.9:1) */
533
+ --npt-plum-600-on: var(--npt-plum-300); /* → 300 (4.8:1) */
534
+ --npt-plum-650-on: var(--npt-plum-300); /* → 300 (5.4:1) */
535
+ --npt-plum-700-on: var(--npt-plum-350); /* → 350 (4.6:1) */
536
+ --npt-plum-750-on: var(--npt-plum-350); /* → 350 (4.9:1) */
537
+ --npt-plum-800-on: var(--npt-plum-350); /* → 350 (5.2:1) */
538
+ --npt-plum-850-on: var(--npt-plum-350); /* → 350 (5.5:1) */
539
+ --npt-plum-900-on: var(--npt-plum-400); /* → 400 (4.7:1) */
540
+ --npt-plum-950-on: var(--npt-plum-400); /* → 400 (4.9:1) */
541
+
542
+ /* ── Orange on-colors ── */
543
+ --npt-orange-50-on: var(--npt-orange-550); /* → 550 (5.7:1) */
544
+ --npt-orange-100-on: var(--npt-orange-550); /* → 550 (5.3:1) */
545
+ --npt-orange-150-on: var(--npt-orange-550); /* → 550 (5.0:1) */
546
+ --npt-orange-200-on: var(--npt-orange-550); /* → 550 (4.6:1) */
547
+ --npt-orange-250-on: var(--npt-orange-600); /* → 600 (5.8:1) */
548
+ --npt-orange-300-on: var(--npt-orange-600); /* → 600 (5.0:1) */
549
+ --npt-orange-350-on: var(--npt-orange-650); /* → 650 (5.0:1) */
550
+ --npt-orange-400-on: var(--npt-orange-700); /* → 700 (5.2:1) */
551
+ --npt-orange-450-on: var(--npt-orange-750); /* → 750 (4.7:1) */
552
+ --npt-orange-500-on: var(--npt-orange-950); /* → 950 (4.8:1) */
553
+ --npt-orange-550-on: var(--npt-orange-200); /* → 200 (4.6:1) */
554
+ --npt-orange-600-on: var(--npt-orange-300); /* → 300 (5.0:1) */
555
+ --npt-orange-650-on: var(--npt-orange-350); /* → 350 (5.0:1) */
556
+ --npt-orange-700-on: var(--npt-orange-400); /* → 400 (5.2:1) */
557
+ --npt-orange-750-on: var(--npt-orange-450); /* → 450 (4.7:1) */
558
+ --npt-orange-800-on: var(--npt-orange-450); /* → 450 (5.3:1) */
559
+ --npt-orange-850-on: var(--npt-orange-450); /* → 450 (5.8:1) */
560
+ --npt-orange-900-on: var(--npt-orange-450); /* → 450 (6.2:1) */
561
+ --npt-orange-950-on: var(--npt-orange-500); /* → 500 (4.8:1) */
562
+
563
+ /* ── Purple on-colors ── */
564
+ --npt-purple-50-on: var(--npt-purple-350); /* → 350 (4.8:1) */
565
+ --npt-purple-100-on: var(--npt-purple-400); /* → 400 (5.9:1) */
566
+ --npt-purple-150-on: var(--npt-purple-400); /* → 400 (5.1:1) */
567
+ --npt-purple-200-on: var(--npt-purple-450); /* → 450 (5.1:1) */
568
+ --npt-purple-250-on: var(--npt-purple-500); /* → 500 (4.7:1) */
569
+ --npt-purple-300-on: var(--npt-purple-650); /* → 650 (4.7:1) */
570
+ --npt-purple-350-on: var(--npt-purple-50); /* → 50 (4.8:1) */
571
+ --npt-purple-400-on: var(--npt-purple-150); /* → 150 (5.1:1) */
572
+ --npt-purple-450-on: var(--npt-purple-200); /* → 200 (5.1:1) */
573
+ --npt-purple-500-on: var(--npt-purple-250); /* → 250 (4.7:1) */
574
+ --npt-purple-550-on: var(--npt-purple-250); /* → 250 (5.7:1) */
575
+ --npt-purple-600-on: var(--npt-purple-250); /* → 250 (6.7:1) */
576
+ --npt-purple-650-on: var(--npt-purple-300); /* → 300 (4.7:1) */
577
+ --npt-purple-700-on: var(--npt-purple-300); /* → 300 (5.0:1) */
578
+ --npt-purple-750-on: var(--npt-purple-300); /* → 300 (5.2:1) */
579
+ --npt-purple-800-on: var(--npt-purple-300); /* → 300 (5.3:1) */
580
+ --npt-purple-850-on: var(--npt-purple-300); /* → 300 (5.5:1) */
581
+ --npt-purple-900-on: var(--npt-purple-300); /* → 300 (5.6:1) */
582
+ --npt-purple-950-on: var(--npt-purple-300); /* → 300 (5.7:1) */
583
+
584
+ /* ── Lavender on-colors ── */
585
+ --npt-lavender-50-on: var(--npt-lavender-400); /* → 400 (5.4:1) */
586
+ --npt-lavender-100-on: var(--npt-lavender-400); /* → 400 (4.9:1) */
587
+ --npt-lavender-150-on: var(--npt-lavender-450); /* → 450 (5.5:1) */
588
+ --npt-lavender-200-on: var(--npt-lavender-450); /* → 450 (4.6:1) */
589
+ --npt-lavender-250-on: var(--npt-lavender-550); /* → 550 (5.7:1) */
590
+ --npt-lavender-300-on: var(--npt-lavender-600); /* → 600 (5.0:1) */
591
+ --npt-lavender-350-on: var(--npt-lavender-850); /* → 850 (4.5:1) */
592
+ --npt-lavender-400-on: var(--npt-lavender-100); /* → 100 (4.9:1) */
593
+ --npt-lavender-450-on: var(--npt-lavender-200); /* → 200 (4.6:1) */
594
+ --npt-lavender-500-on: var(--npt-lavender-200); /* → 200 (5.9:1) */
595
+ --npt-lavender-550-on: var(--npt-lavender-250); /* → 250 (5.7:1) */
596
+ --npt-lavender-600-on: var(--npt-lavender-300); /* → 300 (5.0:1) */
597
+ --npt-lavender-650-on: var(--npt-lavender-300); /* → 300 (5.5:1) */
598
+ --npt-lavender-700-on: var(--npt-lavender-300); /* → 300 (6.0:1) */
599
+ --npt-lavender-750-on: var(--npt-lavender-300); /* → 300 (6.2:1) */
600
+ --npt-lavender-800-on: var(--npt-lavender-300); /* → 300 (6.4:1) */
601
+ --npt-lavender-850-on: var(--npt-lavender-350); /* → 350 (4.5:1) */
602
+ --npt-lavender-900-on: var(--npt-lavender-350); /* → 350 (4.6:1) */
603
+ --npt-lavender-950-on: var(--npt-lavender-350); /* → 350 (4.6:1) */
604
+
605
+ /* ── Green on-colors ── */
606
+ --npt-green-50-on: var(--npt-green-600); /* → 600 (5.3:1) */
607
+ --npt-green-100-on: var(--npt-green-600); /* → 600 (5.2:1) */
608
+ --npt-green-150-on: var(--npt-green-600); /* → 600 (5.1:1) */
609
+ --npt-green-200-on: var(--npt-green-600); /* → 600 (5.0:1) */
610
+ --npt-green-250-on: var(--npt-green-600); /* → 600 (4.8:1) */
611
+ --npt-green-300-on: var(--npt-green-600); /* → 600 (4.7:1) */
612
+ --npt-green-350-on: var(--npt-green-600); /* → 600 (4.5:1) */
613
+ --npt-green-400-on: var(--npt-green-650); /* → 650 (5.4:1) */
614
+ --npt-green-450-on: var(--npt-green-650); /* → 650 (4.5:1) */
615
+ --npt-green-500-on: var(--npt-green-750); /* → 750 (4.5:1) */
616
+ --npt-green-550-on: var(--npt-green-900); /* → 900 (4.6:1) */
617
+ --npt-green-600-on: var(--npt-green-350); /* → 350 (4.5:1) */
618
+ --npt-green-650-on: var(--npt-green-450); /* → 450 (4.5:1) */
619
+ --npt-green-700-on: var(--npt-green-450); /* → 450 (5.6:1) */
620
+ --npt-green-750-on: var(--npt-green-500); /* → 500 (4.5:1) */
621
+ --npt-green-800-on: var(--npt-green-500); /* → 500 (5.5:1) */
622
+ --npt-green-850-on: var(--npt-green-500); /* → 500 (6.4:1) */
623
+ --npt-green-900-on: var(--npt-green-550); /* → 550 (4.6:1) */
624
+ --npt-green-950-on: var(--npt-green-550); /* → 550 (5.3:1) */
625
+
626
+ /* ── Red on-colors ── */
627
+ --npt-red-50-on: var(--npt-red-450); /* → 450 (4.7:1) */
628
+ --npt-red-100-on: var(--npt-red-500); /* → 500 (5.9:1) */
629
+ --npt-red-150-on: var(--npt-red-500); /* → 500 (5.2:1) */
630
+ --npt-red-200-on: var(--npt-red-550); /* → 550 (6.0:1) */
631
+ --npt-red-250-on: var(--npt-red-550); /* → 550 (4.7:1) */
632
+ --npt-red-300-on: var(--npt-red-600); /* → 600 (4.6:1) */
633
+ --npt-red-350-on: var(--npt-red-750); /* → 750 (4.6:1) */
634
+ --npt-red-400-on: var(--npt-red-950); /* → 950 (4.7:1) */
635
+ --npt-red-450-on: var(--npt-red-50); /* → 50 (4.7:1) */
636
+ --npt-red-500-on: var(--npt-red-150); /* → 150 (5.2:1) */
637
+ --npt-red-550-on: var(--npt-red-250); /* → 250 (4.7:1) */
638
+ --npt-red-600-on: var(--npt-red-300); /* → 300 (4.6:1) */
639
+ --npt-red-650-on: var(--npt-red-300); /* → 300 (5.1:1) */
640
+ --npt-red-700-on: var(--npt-red-300); /* → 300 (5.6:1) */
641
+ --npt-red-750-on: var(--npt-red-350); /* → 350 (4.6:1) */
642
+ --npt-red-800-on: var(--npt-red-350); /* → 350 (4.9:1) */
643
+ --npt-red-850-on: var(--npt-red-350); /* → 350 (5.1:1) */
644
+ --npt-red-900-on: var(--npt-red-350); /* → 350 (5.3:1) */
645
+ --npt-red-950-on: var(--npt-red-400); /* → 400 (4.7:1) */
646
+
647
+ /* ── Coral on-colors ── */
648
+ --npt-coral-50-on: var(--npt-coral-500); /* → 500 (5.6:1) */
649
+ --npt-coral-100-on: var(--npt-coral-500); /* → 500 (5.1:1) */
650
+ --npt-coral-150-on: var(--npt-coral-500); /* → 500 (4.5:1) */
651
+ --npt-coral-200-on: var(--npt-coral-550); /* → 550 (5.4:1) */
652
+ --npt-coral-250-on: var(--npt-coral-600); /* → 600 (5.9:1) */
653
+ --npt-coral-300-on: var(--npt-coral-600); /* → 600 (4.7:1) */
654
+ --npt-coral-350-on: var(--npt-coral-650); /* → 650 (4.6:1) */
655
+ --npt-coral-400-on: var(--npt-coral-700); /* → 700 (4.6:1) */
656
+ --npt-coral-450-on: var(--npt-coral-850); /* → 850 (4.5:1) */
657
+ --npt-coral-500-on: var(--npt-coral-150); /* → 150 (4.5:1) */
658
+ --npt-coral-550-on: var(--npt-coral-200); /* → 200 (5.4:1) */
659
+ --npt-coral-600-on: var(--npt-coral-300); /* → 300 (4.7:1) */
660
+ --npt-coral-650-on: var(--npt-coral-350); /* → 350 (4.6:1) */
661
+ --npt-coral-700-on: var(--npt-coral-400); /* → 400 (4.6:1) */
662
+ --npt-coral-750-on: var(--npt-coral-400); /* → 400 (5.1:1) */
663
+ --npt-coral-800-on: var(--npt-coral-400); /* → 400 (5.4:1) */
664
+ --npt-coral-850-on: var(--npt-coral-450); /* → 450 (4.5:1) */
665
+ --npt-coral-900-on: var(--npt-coral-450); /* → 450 (4.6:1) */
666
+ --npt-coral-950-on: var(--npt-coral-450); /* → 450 (4.7:1) */
667
+
668
+ /* ── Neutral on-colors ── */
669
+ --npt-neutral-50-on: var(--npt-neutral-450); /* → 450 (4.5:1) */
670
+ --npt-neutral-100-on: var(--npt-neutral-500); /* → 500 (5.6:1) */
671
+ --npt-neutral-150-on: var(--npt-neutral-500); /* → 500 (5.1:1) */
672
+ --npt-neutral-200-on: var(--npt-neutral-500); /* → 500 (4.5:1) */
673
+ --npt-neutral-250-on: var(--npt-neutral-550); /* → 550 (5.1:1) */
674
+ --npt-neutral-300-on: var(--npt-neutral-600); /* → 600 (5.2:1) */
675
+ --npt-neutral-350-on: var(--npt-neutral-650); /* → 650 (4.6:1) */
676
+ --npt-neutral-400-on: var(--npt-neutral-800); /* → 800 (4.5:1) */
677
+ --npt-neutral-450-on: var(--npt-neutral-50); /* → 50 (4.5:1) */
678
+ --npt-neutral-500-on: var(--npt-neutral-200); /* → 200 (4.5:1) */
679
+ --npt-neutral-550-on: var(--npt-neutral-250); /* → 250 (5.1:1) */
680
+ --npt-neutral-600-on: var(--npt-neutral-300); /* → 300 (5.2:1) */
681
+ --npt-neutral-650-on: var(--npt-neutral-350); /* → 350 (4.6:1) */
682
+ --npt-neutral-700-on: var(--npt-neutral-350); /* → 350 (5.1:1) */
683
+ --npt-neutral-750-on: var(--npt-neutral-350); /* → 350 (5.5:1) */
684
+ --npt-neutral-800-on: var(--npt-neutral-400); /* → 400 (4.5:1) */
685
+ --npt-neutral-850-on: var(--npt-neutral-400); /* → 400 (4.8:1) */
686
+ --npt-neutral-900-on: var(--npt-neutral-400); /* → 400 (5.0:1) */
687
+ --npt-neutral-950-on: var(--npt-neutral-400); /* → 400 (5.3:1) */
688
+
689
+ /* ── Aubergine on-colors ── */
690
+ --npt-aubergine-50-on: var(--npt-aubergine-400); /* → 400 (4.6:1) */
691
+ --npt-aubergine-100-on: var(--npt-aubergine-450); /* → 450 (5.9:1) */
692
+ --npt-aubergine-150-on: var(--npt-aubergine-450); /* → 450 (5.2:1) */
693
+ --npt-aubergine-200-on: var(--npt-aubergine-500); /* → 500 (5.8:1) */
694
+ --npt-aubergine-250-on: var(--npt-aubergine-500); /* → 500 (4.5:1) */
695
+ --npt-aubergine-300-on: var(--npt-aubergine-600); /* → 600 (5.2:1) */
696
+ --npt-aubergine-350-on: var(--npt-aubergine-700); /* → 700 (4.7:1) */
697
+ --npt-aubergine-400-on: var(--npt-aubergine-50); /* → 50 (4.6:1) */
698
+ --npt-aubergine-450-on: var(--npt-aubergine-150); /* → 150 (5.2:1) */
699
+ --npt-aubergine-500-on: var(--npt-aubergine-250); /* → 250 (4.5:1) */
700
+ --npt-aubergine-550-on: var(--npt-aubergine-250); /* → 250 (5.7:1) */
701
+ --npt-aubergine-600-on: var(--npt-aubergine-300); /* → 300 (5.2:1) */
702
+ --npt-aubergine-650-on: var(--npt-aubergine-300); /* → 300 (5.8:1) */
703
+ --npt-aubergine-700-on: var(--npt-aubergine-350); /* → 350 (4.7:1) */
704
+ --npt-aubergine-750-on: var(--npt-aubergine-350); /* → 350 (5.0:1) */
705
+ --npt-aubergine-800-on: var(--npt-aubergine-350); /* → 350 (5.2:1) */
706
+ --npt-aubergine-850-on: var(--npt-aubergine-350); /* → 350 (5.4:1) */
707
+ --npt-aubergine-900-on: var(--npt-aubergine-350); /* → 350 (5.5:1) */
708
+ --npt-aubergine-950-on: var(--npt-aubergine-350); /* → 350 (5.6:1) */
709
+ }
710
+
711
+
712
+ /* ─────────────────────────────────────────────────────────────────────────
713
+ 6. COMPONENT TOKENS (from homepage --dst-- button/input/form vars)
714
+ ───────────────────────────────────────────────────────────────────────── */
715
+
716
+ :root {
717
+ --npt-btn-font: var(--npt-font-sans);
718
+ --npt-btn-size: var(--npt-text-base);
719
+ --npt-btn-weight: var(--npt-weight-medium);
720
+ --npt-btn-padding-y: 0.75rem;
721
+ --npt-btn-padding-x: 1.75rem;
722
+ --npt-btn-radius: var(--npt-radius-md);
723
+
724
+ --npt-input-height: 3rem;
725
+ --npt-input-size: var(--npt-text-base);
726
+ --npt-input-weight: var(--npt-weight-regular);
727
+ --npt-input-padding-y: 0.625rem;
728
+ --npt-input-padding-x: 1rem;
729
+ --npt-input-radius: var(--npt-radius-md);
730
+ }