@david-richard/notify-ds 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.
package/tokens.css ADDED
@@ -0,0 +1,519 @@
1
+ /**
2
+ * notify-ds — tokens.css
3
+ * Qu Notify Design System — complete CSS custom properties
4
+ *
5
+ * Structure:
6
+ * 1. Font imports (Google Fonts + @font-face for Zilla Slab)
7
+ * 2. :root — Primitives --p-*
8
+ * 3. :root — Semantic --color-*, --shadow-*, --gradient-*
9
+ * 4. :root — Radius --radius-*
10
+ * 5. :root — Spacing --space-*
11
+ * 6. :root — Typography --font-*, --text-*, --weight-*
12
+ * 7. :root — Type roles --type-* (composite role tokens)
13
+ * 8. :root — Component --button-*, --input-*, --tile-*, --nav-*
14
+ * 9. @theme block Tailwind v4 utility mapping
15
+ *
16
+ * Usage:
17
+ * @import 'notify-ds/tokens.css'; CSS/PostCSS
18
+ * import 'notify-ds/tokens.css' Vite / webpack
19
+ *
20
+ * For Tailwind v3, use tailwind.config.js instead of the @theme block.
21
+ */
22
+
23
+
24
+ /* ─────────────────────────────────────────────────────────────────────────────
25
+ 1. FONT IMPORTS
26
+ Inter + Red Hat Text + Red Hat Display from Google Fonts.
27
+ Zilla Slab loaded locally from ./fonts/ (not fully on GFonts).
28
+ ───────────────────────────────────────────────────────────────────────────── */
29
+
30
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&family=Red+Hat+Text:ital,wght@0,300;0,400;0,500;0,600;0,700;1,400&family=Red+Hat+Display:wght@400;500;600;700;800;900&display=swap');
31
+
32
+ @font-face {
33
+ font-family: 'Zilla Slab';
34
+ src: url('./fonts/ZillaSlab-Light.ttf') format('truetype');
35
+ font-weight: 300; font-style: normal; font-display: swap;
36
+ }
37
+ @font-face {
38
+ font-family: 'Zilla Slab';
39
+ src: url('./fonts/ZillaSlab-LightItalic.ttf') format('truetype');
40
+ font-weight: 300; font-style: italic; font-display: swap;
41
+ }
42
+ @font-face {
43
+ font-family: 'Zilla Slab';
44
+ src: url('./fonts/ZillaSlab-Regular.ttf') format('truetype');
45
+ font-weight: 400; font-style: normal; font-display: swap;
46
+ }
47
+ @font-face {
48
+ font-family: 'Zilla Slab';
49
+ src: url('./fonts/ZillaSlab-Italic.ttf') format('truetype');
50
+ font-weight: 400; font-style: italic; font-display: swap;
51
+ }
52
+ @font-face {
53
+ font-family: 'Zilla Slab';
54
+ src: url('./fonts/ZillaSlab-Medium.ttf') format('truetype');
55
+ font-weight: 500; font-style: normal; font-display: swap;
56
+ }
57
+ @font-face {
58
+ font-family: 'Zilla Slab';
59
+ src: url('./fonts/ZillaSlab-MediumItalic.ttf') format('truetype');
60
+ font-weight: 500; font-style: italic; font-display: swap;
61
+ }
62
+ @font-face {
63
+ font-family: 'Zilla Slab';
64
+ src: url('./fonts/ZillaSlab-SemiBold.ttf') format('truetype');
65
+ font-weight: 600; font-style: normal; font-display: swap;
66
+ }
67
+ @font-face {
68
+ font-family: 'Zilla Slab';
69
+ src: url('./fonts/ZillaSlab-SemiBoldItalic.ttf') format('truetype');
70
+ font-weight: 600; font-style: italic; font-display: swap;
71
+ }
72
+ @font-face {
73
+ font-family: 'Zilla Slab';
74
+ src: url('./fonts/ZillaSlab-Bold.ttf') format('truetype');
75
+ font-weight: 700; font-style: normal; font-display: swap;
76
+ }
77
+ @font-face {
78
+ font-family: 'Zilla Slab';
79
+ src: url('./fonts/ZillaSlab-BoldItalic.ttf') format('truetype');
80
+ font-weight: 700; font-style: italic; font-display: swap;
81
+ }
82
+
83
+
84
+ /* ─────────────────────────────────────────────────────────────────────────────
85
+ 2. PRIMITIVES --p-*
86
+ Raw values. Never consume these directly in components — use semantic tokens.
87
+ ───────────────────────────────────────────────────────────────────────────── */
88
+
89
+ :root {
90
+
91
+ /* Brand */
92
+ --p-brand-tech-blue: #40CCF2; /* Primary CTA: buttons, input focus, selectors, checkboxes */
93
+ --p-brand-teal: #339FB8; /* Secondary interactive: outlines, links, action labels */
94
+ --p-brand-red: #EF2149; /* Error borders, toasts, required asterisk */
95
+ --p-brand-confidence: #B4002F; /* Strong destructive — reserved */
96
+ --p-brand-stable-blue: #0D2A4B; /* KI gradient anchor — reserved */
97
+ --p-brand-quick-serve: #E4ECEF; /* Reserved */
98
+ --p-brand-gray-300: #6B7280; /* Secondary/inactive text, unselected nav labels */
99
+
100
+ /* Neutrals */
101
+ --p-neutral-black: #000000; /* Primary text, tab/nav selected fill */
102
+ --p-neutral-near-black: #0A0A0A;
103
+ --p-neutral-white: #FFFFFF; /* Card backgrounds, text on dark fills */
104
+ --p-neutral-gray-50: #F4F4F4; /* App screen background — ALWAYS use, never white */
105
+ --p-neutral-gray-100: #DEDEDE; /* Tab container, switcher container, inactive button bg */
106
+ --p-neutral-gray-200: #C9C9C9; /* Input border (normal), disabled borders */
107
+ --p-neutral-gray-400: #B1B1B1; /* Placeholder text, captions */
108
+
109
+ /* Dark surfaces (Kitchen Intelligence) */
110
+ --p-surface-dark-from: #252934;
111
+ --p-surface-dark-to: #16171A;
112
+
113
+ /* Accents — semantic (bold) */
114
+ --p-accent-green: #16A34A;
115
+ --p-accent-green-vivid: #00C16A;
116
+ --p-accent-blue: #2F80ED;
117
+ --p-accent-yellow: #EDC948;
118
+ --p-accent-orange: #FA6A0A;
119
+
120
+ /* Accents — soft backgrounds */
121
+ --p-accent-green-soft: #B3F5D1; /* Mint */
122
+ --p-accent-blue-soft: #BEDBFF; /* Mist */
123
+ --p-accent-red-soft: #FFC9C9; /* Rose */
124
+ --p-accent-yellow-soft: #FFF085; /* Pollen */
125
+ --p-accent-orange-soft: #EAC1C3; /* Peel */
126
+
127
+ /* Motion */
128
+ --p-duration-fast: 120ms; /* Color transitions, hover */
129
+ --p-duration-medium: 180ms; /* Toggle slide, tab selection */
130
+ --p-easing-standard: cubic-bezier(0.2, 0, 0, 1);
131
+
132
+ /* Opacity */
133
+ --p-opacity-disabled: 0.5; /* Applied to whole component — never swap colors for disabled */
134
+
135
+
136
+ /* ─────────────────────────────────────────────────────────────────────────────
137
+ 3. SEMANTIC COLORS --color-*
138
+ Alias layer. All component styles should consume these.
139
+ ───────────────────────────────────────────────────────────────────────────── */
140
+
141
+ /* Surfaces */
142
+ --color-bg-app: var(--p-neutral-gray-50); /* Page-level background */
143
+ --color-bg-card: var(--p-neutral-white); /* Cards, tiles, sheets */
144
+ --color-bg-input: var(--p-neutral-white);
145
+ --color-bg-input-disabled:var(--p-neutral-gray-50);
146
+
147
+ /* Text hierarchy */
148
+ --color-text-primary: var(--p-neutral-black);
149
+ --color-text-secondary: var(--p-brand-gray-300); /* Secondary text — gray, not teal */
150
+ --color-text-tertiary: var(--p-brand-gray-300);
151
+ --color-text-disabled: var(--p-neutral-gray-400);
152
+ --color-text-inverse: var(--p-neutral-white);
153
+ --color-text-on-brand: var(--p-neutral-black); /* Text on cyan bg */
154
+ --color-text-link: var(--p-accent-blue);
155
+
156
+ /* Interactive — secondary uses teal (not gray) */
157
+ --color-interactive-secondary: var(--p-brand-teal); /* Links, action labels, check numbers */
158
+
159
+ /* Borders */
160
+ --color-border: var(--p-neutral-gray-200);
161
+ --color-border-focus: var(--p-brand-tech-blue);
162
+ --color-border-error: var(--p-brand-red);
163
+ --color-ring: var(--p-brand-tech-blue);
164
+
165
+ /* Primary button/CTA */
166
+ --color-primary: var(--p-brand-tech-blue); /* Cyan — NOT black */
167
+ --color-primary-foreground: var(--p-neutral-black); /* Black text on cyan bg */
168
+ --color-primary-hover: var(--p-brand-teal);
169
+ --color-primary-pressed: var(--p-brand-stable-blue);
170
+
171
+ /* Secondary button */
172
+ --color-secondary-border: var(--p-brand-teal);
173
+ --color-secondary-foreground: var(--p-brand-teal);
174
+ --color-secondary-hover: rgba(51, 159, 184, 0.08);
175
+ --color-secondary-pressed: rgba(51, 159, 184, 0.16);
176
+
177
+ /* Tertiary button */
178
+ --color-tertiary-foreground: var(--p-brand-teal);
179
+ --color-tertiary-hover: rgba(51, 159, 184, 0.06);
180
+
181
+ /* Link */
182
+ --color-link-foreground: var(--p-accent-blue);
183
+
184
+ /* Nav/tab selected state — BLACK, not cyan */
185
+ --color-nav-selected: var(--p-neutral-black);
186
+ --color-nav-selected-text: var(--p-neutral-white);
187
+
188
+ /* Inactive */
189
+ --color-inactive: var(--p-neutral-gray-100);
190
+ --color-inactive-foreground: var(--p-brand-gray-300);
191
+ --color-inactive-border: var(--p-neutral-gray-200);
192
+
193
+ /* Selector (context bar) */
194
+ --color-selector-primary-bg: var(--p-brand-tech-blue);
195
+ --color-selector-primary-text: var(--p-neutral-black);
196
+ --color-selector-secondary-border: var(--p-brand-teal);
197
+ --color-selector-secondary-text: var(--p-brand-teal);
198
+
199
+ /* Input-specific */
200
+ --color-input-border: var(--p-neutral-gray-200);
201
+ --color-input-border-active: var(--p-brand-tech-blue);
202
+ --color-input-border-error: var(--p-brand-red);
203
+ --color-input-placeholder: var(--p-neutral-gray-400);
204
+ --color-input-icon: var(--p-neutral-gray-400);
205
+ --color-input-icon-active: var(--p-brand-tech-blue);
206
+ --color-input-icon-error: var(--p-brand-red);
207
+ --color-input-required-mark: var(--p-brand-red);
208
+
209
+ /* Status — semantic */
210
+ --color-destructive: var(--p-brand-red);
211
+ --color-destructive-strong: var(--p-brand-confidence);
212
+ --color-success: var(--p-accent-green);
213
+ --color-success-vivid: var(--p-accent-green-vivid);
214
+ --color-success-soft: var(--p-accent-green-soft);
215
+ --color-info: var(--p-accent-blue);
216
+ --color-info-soft: var(--p-accent-blue-soft);
217
+ --color-error: var(--p-brand-red);
218
+ --color-error-soft: var(--p-accent-red-soft);
219
+ --color-warning: var(--p-accent-yellow);
220
+ --color-warning-soft: var(--p-accent-yellow-soft);
221
+ --color-alert: var(--p-accent-orange);
222
+ --color-alert-soft: var(--p-accent-orange-soft);
223
+
224
+
225
+ /* ─────────────────────────────────────────────────────────────────────────────
226
+ SHADOWS --shadow-*
227
+ ───────────────────────────────────────────────────────────────────────────── */
228
+
229
+ --shadow-card: 0px 4px 4px 0px rgba(0, 0, 0, 0.06); /* Metric tiles, data cards */
230
+ --shadow-nav: 0px 4px 4px 0px rgba(0, 0, 0, 0.14); /* Bottom nav pill */
231
+ --shadow-modal: 0px 4px 4px 0px rgba(0, 0, 0, 0.25); /* Modal sheets */
232
+
233
+
234
+ /* ─────────────────────────────────────────────────────────────────────────────
235
+ GRADIENTS --gradient-*
236
+ ───────────────────────────────────────────────────────────────────────────── */
237
+
238
+ --gradient-ki-bg:
239
+ linear-gradient(180deg, #252934 0%, #16171A 100%); /* Kitchen Intelligence dark bg */
240
+
241
+ --gradient-nav-glass:
242
+ linear-gradient(180deg, rgba(220,220,220,0.20) 0%, rgba(118,118,118,0.20) 87%); /* Bottom nav */
243
+
244
+ --gradient-glass:
245
+ linear-gradient(180deg, rgba(255,255,255,0.10) 10%, rgba(153,153,153,0.10) 100%); /* Menu overlay */
246
+
247
+ --gradient-brand-divider:
248
+ linear-gradient(90deg, #40CCF2 0%, #EF2149 100%); /* Brand accent divider line */
249
+
250
+
251
+ /* ─────────────────────────────────────────────────────────────────────────────
252
+ 4. RADIUS --radius-*
253
+ ───────────────────────────────────────────────────────────────────────────── */
254
+
255
+ --radius-xs: 2px; /* Subtle rounding */
256
+ --radius-sm: 4px;
257
+ --radius-md: 6px;
258
+ --radius-lg: 8px; /* Switcher container and segments */
259
+ --radius-xl: 12px; /* Filters */
260
+ --radius-2xl: 16px; /* Metric tiles, nav icon labels */
261
+ --radius-3xl: 24px; /* Modals, card containers */
262
+ --radius-menu: 60px; /* Menu bottom sheet, bottom nav pill */
263
+ --radius-full: 9999px; /* Inputs, buttons, pills, selectors, tags */
264
+
265
+
266
+ /* ─────────────────────────────────────────────────────────────────────────────
267
+ 5. SPACING --space-* (8px base rhythm)
268
+ ───────────────────────────────────────────────────────────────────────────── */
269
+
270
+ --space-xs: 4px;
271
+ --space-sm: 8px;
272
+ --space-md: 10px; /* Compact UI exception */
273
+ --space-lg: 16px; /* Standard horizontal screen padding */
274
+ --space-xl: 18px;
275
+ --space-2xl: 22px;
276
+ --space-3xl: 24px;
277
+ --space-4xl: 26px;
278
+ --space-5xl: 30px;
279
+ --space-6xl: 40px;
280
+ --space-7xl: 48px;
281
+ --space-8xl: 60px;
282
+
283
+
284
+ /* ─────────────────────────────────────────────────────────────────────────────
285
+ 6. TYPOGRAPHY --font-*, --text-*, --weight-*
286
+ ───────────────────────────────────────────────────────────────────────────── */
287
+
288
+ /* Families */
289
+ --font-primary: 'Inter', system-ui, sans-serif;
290
+ --font-secondary: 'Red Hat Text', 'Red Hat Display', system-ui, sans-serif;
291
+ --font-display: 'Zilla Slab', Georgia, serif;
292
+ --font-display-heading: 'Red Hat Display', system-ui, sans-serif;
293
+ --font-system: -apple-system, 'SF Pro', system-ui, sans-serif;
294
+
295
+ /* Sizes */
296
+ --text-2xs: 10px; /* Nav item labels */
297
+ --text-xs: 12px; /* Captions, help text, pills, tag labels */
298
+ --text-sm: 14px; /* Filters, tabs, table items, small buttons, menu items */
299
+ --text-md: 16px; /* Body text, placeholder text */
300
+ --text-lg: 18px; /* Page headers, input labels, medium buttons */
301
+ --text-xl: 20px; /* Rarely used */
302
+ --text-2xl: 24px; /* Metric tile values, login headers */
303
+ --text-3xl: 26px; /* Modal headers */
304
+ --text-4xl: 30px; /* Rarely used */
305
+ --text-5xl: 34px; /* Day-part selector (Kitchen Intelligence) */
306
+ --text-6xl: 40px; /* Display */
307
+ --text-7xl: 72px; /* Kitchen Intelligence score */
308
+
309
+ /* Weights */
310
+ --weight-light: 300;
311
+ --weight-normal: 400;
312
+ --weight-medium: 500;
313
+ --weight-semibold: 600;
314
+ --weight-bold: 700;
315
+ --weight-extrabold: 800;
316
+
317
+
318
+ /* ─────────────────────────────────────────────────────────────────────────────
319
+ 7. TYPE ROLES --type-*
320
+ Composite shorthand tokens for recurring text patterns.
321
+ Usage: font-family: var(--type-metric-font); font-size: var(--type-metric-size);
322
+ ───────────────────────────────────────────────────────────────────────────── */
323
+
324
+ /* Metric value — large number on dashboard tiles */
325
+ --type-metric-font: var(--font-primary);
326
+ --type-metric-size: var(--text-2xl);
327
+ --type-metric-weight: var(--weight-semibold);
328
+
329
+ /* Page header — centered title on detail screens */
330
+ --type-page-header-font: var(--font-secondary);
331
+ --type-page-header-size: var(--text-lg);
332
+ --type-page-header-weight: var(--weight-medium);
333
+
334
+ /* Section label — bold left-aligned section titles (Totals, Checks, Tools) */
335
+ --type-section-label-font: var(--font-secondary);
336
+ --type-section-label-size: var(--text-md);
337
+ --type-section-label-weight: var(--weight-semibold);
338
+
339
+ /* ALL CAPS section category — KITCHEN, NETWORK, NOTIFY wordmark */
340
+ --type-section-caps-font: var(--font-secondary);
341
+ --type-section-caps-size: var(--text-lg);
342
+ --type-section-caps-weight: var(--weight-semibold);
343
+ --type-section-caps-ls: 0.08em;
344
+
345
+ /* Body */
346
+ --type-body-font: var(--font-primary);
347
+ --type-body-size: var(--text-md);
348
+ --type-body-weight: var(--weight-normal);
349
+
350
+ /* Label — input label, menu item text */
351
+ --type-label-font: var(--font-secondary);
352
+ --type-label-size: var(--text-lg);
353
+ --type-label-weight: var(--weight-medium);
354
+
355
+ /* Caption / helper text */
356
+ --type-caption-font: var(--font-primary);
357
+ --type-caption-size: var(--text-xs);
358
+ --type-caption-weight: var(--weight-normal);
359
+
360
+ /* Button label */
361
+ --type-btn-font: var(--font-secondary); /* Red Hat Text per spec */
362
+ --type-btn-size: var(--text-sm);
363
+ --type-btn-weight: var(--weight-medium);
364
+
365
+ /* Tab / filter label */
366
+ --type-tab-font: var(--font-primary);
367
+ --type-tab-size: var(--text-sm);
368
+ --type-tab-weight: var(--weight-medium);
369
+
370
+ /* Nav item label */
371
+ --type-nav-font: var(--font-primary);
372
+ --type-nav-size: var(--text-2xs);
373
+ --type-nav-weight-default: var(--weight-normal);
374
+ --type-nav-weight-selected: var(--weight-semibold);
375
+
376
+ /* Display heading — Zilla Slab only */
377
+ --type-display-font: var(--font-display);
378
+ --type-display-size: var(--text-4xl);
379
+ --type-display-weight: var(--weight-bold);
380
+
381
+
382
+ /* ─────────────────────────────────────────────────────────────────────────────
383
+ 8. COMPONENT GEOMETRY --button-*, --input-*, --tile-*, --nav-*
384
+ ───────────────────────────────────────────────────────────────────────────── */
385
+
386
+ /* Button */
387
+ --button-radius: var(--radius-full);
388
+ --button-icon-radius: var(--radius-md); /* Icon-only button — square-ish corners */
389
+
390
+ --button-xsm-h: 24px; --button-xsm-px: 12px; --button-xsm-gap: 4px;
391
+ --button-xsm-fs: var(--text-xs); --button-xsm-lh: 16px;
392
+
393
+ --button-sm-h: 32px; --button-sm-px: 14px; --button-sm-gap: 6px;
394
+ --button-sm-fs: var(--text-sm); --button-sm-lh: 18px;
395
+
396
+ --button-md-h: 40px; --button-md-px: 16px; --button-md-gap: 8px;
397
+ --button-md-fs: var(--text-sm); --button-md-lh: 20px;
398
+
399
+ --button-lg-h: 48px; --button-lg-px: 20px; --button-lg-gap: 8px;
400
+ --button-lg-fs: var(--text-md); --button-lg-lh: 24px;
401
+
402
+ /* Input */
403
+ --input-height: 48px;
404
+ --input-radius: var(--radius-full);
405
+ --input-padding-x: 16px;
406
+ --input-border-width: 1.5px;
407
+
408
+ /* Metric tile */
409
+ --tile-radius: var(--radius-2xl); /* 16px */
410
+ --tile-padding: 16px;
411
+ --tile-shadow: var(--shadow-card);
412
+
413
+ /* Bottom nav */
414
+ --nav-height: 72px;
415
+ --nav-radius: var(--radius-menu); /* 60px */
416
+ --nav-max-width: 360px;
417
+ --nav-shadow: var(--shadow-nav);
418
+
419
+ /* Tab bar */
420
+ --tab-bar-radius: var(--radius-full);
421
+ --tab-bar-padding: 4px;
422
+ --tab-radius: var(--radius-full);
423
+ --tab-padding-x: 16px;
424
+ --tab-padding-y: 7px;
425
+
426
+ /* Switcher */
427
+ --switcher-radius: var(--radius-lg); /* 8px — not pill, distinguishes from TabBar */
428
+ --switcher-padding: 3px;
429
+ --switcher-seg-radius: var(--radius-md); /* 6px */
430
+
431
+ /* Selector */
432
+ --selector-radius: var(--radius-full);
433
+ --selector-padding-x: 14px;
434
+ --selector-padding-y: 8px;
435
+ --selector-border-width: 1.5px;
436
+
437
+ }
438
+
439
+
440
+ /* ─────────────────────────────────────────────────────────────────────────────
441
+ 9. TAILWIND v4 @theme
442
+ Exposes tokens as Tailwind utility classes (bg-primary, text-foreground, etc.)
443
+ For Tailwind v3: use tailwind.config.js instead.
444
+ ───────────────────────────────────────────────────────────────────────────── */
445
+
446
+ @theme {
447
+ /* Colors */
448
+ --color-background: var(--color-bg-card);
449
+ --color-foreground: var(--color-text-primary);
450
+ --color-muted: var(--p-neutral-gray-50);
451
+ --color-muted-foreground: var(--color-text-secondary);
452
+ --color-border: var(--color-border);
453
+ --color-ring: var(--color-ring);
454
+
455
+ --color-primary: var(--color-primary);
456
+ --color-primary-foreground: var(--color-primary-foreground);
457
+ --color-secondary: var(--color-secondary-foreground);
458
+ --color-secondary-foreground: var(--color-secondary-foreground);
459
+
460
+ --color-destructive: var(--color-destructive);
461
+ --color-success: var(--color-success);
462
+ --color-warning: var(--color-warning);
463
+ --color-info: var(--color-info);
464
+ --color-alert: var(--color-alert);
465
+ --color-error: var(--color-error);
466
+
467
+ --color-inactive: var(--color-inactive);
468
+ --color-inactive-foreground: var(--color-inactive-foreground);
469
+
470
+ /* Radius */
471
+ --radius-xs: var(--radius-xs);
472
+ --radius-sm: var(--radius-sm);
473
+ --radius-md: var(--radius-md);
474
+ --radius-lg: var(--radius-lg);
475
+ --radius-xl: var(--radius-xl);
476
+ --radius-2xl: var(--radius-2xl);
477
+ --radius-3xl: var(--radius-3xl);
478
+ --radius-menu: var(--radius-menu);
479
+ --radius-full: var(--radius-full);
480
+
481
+ /* Fonts */
482
+ --font-sans: var(--font-primary);
483
+ --font-ui: var(--font-secondary);
484
+ --font-display: var(--font-display);
485
+
486
+ /* Shadows */
487
+ --shadow-card: var(--shadow-card);
488
+ --shadow-nav: var(--shadow-nav);
489
+ --shadow-modal: var(--shadow-modal);
490
+ }
491
+
492
+
493
+ /*
494
+ * ── NOTES ────────────────────────────────────────────────────────────────────
495
+ *
496
+ * PRIMARY BUTTON COLOR
497
+ * --color-primary is #40CCF2 (cyan), not black. Confirmed by production
498
+ * screenshots. Black (#000) is the nav/tab selected-state color (--color-nav-selected).
499
+ * These are separate roles.
500
+ *
501
+ * SECONDARY TEXT vs SECONDARY INTERACTIVE
502
+ * --color-text-secondary = #6B7280 (gray-300) — for passive secondary text labels.
503
+ * --color-interactive-secondary = #339FB8 (teal) — for interactive secondary elements
504
+ * (links, action labels, check numbers in Check Search). Don't conflate these.
505
+ *
506
+ * DISABLED STATES
507
+ * Always opacity: var(--p-opacity-disabled) = 0.5 on the entire component.
508
+ * Never swap fill colors for disabled. The underlying variant colors stay intact.
509
+ *
510
+ * ZILLA SLAB
511
+ * Display-only. Never body copy or UI labels.
512
+ * @font-face above loads from ./fonts/ (relative to this CSS file).
513
+ * Update the path if your bundler resolves assets differently.
514
+ *
515
+ * TAILWIND v4 @theme
516
+ * The @theme block above is for Tailwind v4's CSS-first config.
517
+ * For Tailwind v3, import tailwind.config.js as a preset instead.
518
+ * Both can coexist — @theme is ignored by v3 PostCSS pipelines.
519
+ */