@24vlh/vds 0.1.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 (65) hide show
  1. package/LICENSE.txt +201 -0
  2. package/README.md +147 -0
  3. package/dist/components/accordion.css +170 -0
  4. package/dist/components/accordion.min.css +1 -0
  5. package/dist/components/authoring.css +332 -0
  6. package/dist/components/authoring.min.css +1 -0
  7. package/dist/components/buttons.css +683 -0
  8. package/dist/components/buttons.min.css +1 -0
  9. package/dist/components/charts.css +502 -0
  10. package/dist/components/charts.min.css +1 -0
  11. package/dist/components/command.css +521 -0
  12. package/dist/components/command.min.css +1 -0
  13. package/dist/components/content-blocks.css +944 -0
  14. package/dist/components/content-blocks.min.css +1 -0
  15. package/dist/components/doc-block.css +782 -0
  16. package/dist/components/doc-block.min.css +1 -0
  17. package/dist/components/feedback.css +657 -0
  18. package/dist/components/feedback.min.css +1 -0
  19. package/dist/components/flows.css +1101 -0
  20. package/dist/components/flows.min.css +1 -0
  21. package/dist/components/forms-advanced.css +462 -0
  22. package/dist/components/forms-advanced.min.css +1 -0
  23. package/dist/components/forms.css +1831 -0
  24. package/dist/components/forms.min.css +1 -0
  25. package/dist/components/header-footer.css +348 -0
  26. package/dist/components/header-footer.min.css +1 -0
  27. package/dist/components/hero.css +498 -0
  28. package/dist/components/hero.min.css +1 -0
  29. package/dist/components/icons.css +937 -0
  30. package/dist/components/icons.min.css +1 -0
  31. package/dist/components/navigation.css +900 -0
  32. package/dist/components/navigation.min.css +1 -0
  33. package/dist/components/overlays.css +498 -0
  34. package/dist/components/overlays.min.css +1 -0
  35. package/dist/components/sections.css +450 -0
  36. package/dist/components/sections.min.css +1 -0
  37. package/dist/components/skeleton.css +385 -0
  38. package/dist/components/skeleton.min.css +1 -0
  39. package/dist/components/tables.css +591 -0
  40. package/dist/components/tables.min.css +1 -0
  41. package/dist/components/tabs.css +307 -0
  42. package/dist/components/tabs.min.css +1 -0
  43. package/dist/components/toasts.css +421 -0
  44. package/dist/components/toasts.min.css +1 -0
  45. package/dist/components/tooltips-popovers.css +447 -0
  46. package/dist/components/tooltips-popovers.min.css +1 -0
  47. package/dist/components/typography.css +250 -0
  48. package/dist/components/typography.min.css +1 -0
  49. package/dist/components/utilities.css +3434 -0
  50. package/dist/components/utilities.min.css +1 -0
  51. package/dist/core.css +866 -0
  52. package/dist/core.min.css +1 -0
  53. package/dist/identity.css +266 -0
  54. package/dist/identity.min.css +1 -0
  55. package/dist/themes/carbon.css +658 -0
  56. package/dist/themes/carbon.min.css +1 -0
  57. package/dist/themes/graphite.css +658 -0
  58. package/dist/themes/graphite.min.css +1 -0
  59. package/dist/themes/navy.css +657 -0
  60. package/dist/themes/navy.min.css +1 -0
  61. package/dist/themes/slate.css +659 -0
  62. package/dist/themes/slate.min.css +1 -0
  63. package/dist/vds.css +20313 -0
  64. package/dist/vds.min.css +1 -0
  65. package/package.json +64 -0
@@ -0,0 +1,900 @@
1
+ /************************************************************
2
+ * VLAH DESIGN SYSTEM (VDS) - Navigation
3
+ *
4
+ * Responsibilities:
5
+ * - Provide the entire navigation architecture: primary/secondary nav,
6
+ * mobile nav, vertical nav, sidebar, pills, tabs, pagination,
7
+ * breadcrumbs, toolbars, and announcement bars
8
+ * - Define interactive states: hover, active, disabled, focus-visible,
9
+ * depth indentation, collapsed/expanded sections
10
+ * - Expose brand/logo slots and action areas for headers & sidebars
11
+ * - Supply panel + backdrop patterns for mobile overlay navigation
12
+ *
13
+ * System Notes:
14
+ * - Fully token-driven: spacing, radii, borders, colours, z-index, motion
15
+ * - Pure CSS; JS only toggles `.nav-panel--open` and `.nav-backdrop--visible`
16
+ * - Safe namespacing: can embed in header/footer/sidebars without collisions
17
+ ************************************************************/
18
+
19
+ /* ---------------------------------------------------------
20
+ 1. CORE NAV PRIMITIVES
21
+ --------------------------------------------------------- */
22
+
23
+ .nav {
24
+ display: flex;
25
+ align-items: center;
26
+ gap: var(--space-6);
27
+ }
28
+
29
+ .nav__item,
30
+ .nav__link {
31
+ position: relative;
32
+ display: inline-flex;
33
+ align-items: center;
34
+
35
+ font-size: var(--text-sm);
36
+ color: var(--color-text);
37
+ -webkit-text-decoration: none;
38
+ text-decoration: none;
39
+
40
+ padding: var(--space-1) 0;
41
+ gap: var(--space-2);
42
+
43
+ cursor: pointer;
44
+
45
+ transition: color 0.15s ease, background-color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease;
46
+ }
47
+
48
+ .nav__item:hover,
49
+ .nav__link:hover {
50
+ color: var(--color-text-muted);
51
+ }
52
+
53
+ .nav__item:active,
54
+ .nav__link:active {
55
+ color: var(--color-text);
56
+ background-color: var(--color-surface-subtle);
57
+ }
58
+
59
+ .nav__item:focus-visible,
60
+ .nav__link:focus-visible {
61
+ outline: none;
62
+ box-shadow: 0 0 0 1px var(--color-surface),
63
+ 0 0 0 3px var(--focus-ring-color);
64
+ border-radius: var(--radius-sm);
65
+ }
66
+
67
+ .nav__item--active,
68
+ .nav__link--active,
69
+ .nav__item--active:hover,
70
+ .nav__link--active:hover {
71
+ font-weight: 600;
72
+ color: var(--link-text-hover);
73
+ -webkit-text-decoration: none;
74
+ text-decoration: none;
75
+ }
76
+
77
+ .nav__item--disabled,
78
+ .nav__link--disabled {
79
+ opacity: 0.45;
80
+ cursor: not-allowed;
81
+ pointer-events: none;
82
+ }
83
+
84
+ .nav__item svg,
85
+ .nav__link svg {
86
+ width: 1em;
87
+ height: 1em;
88
+ stroke: currentColor;
89
+ fill: currentColor;
90
+ }
91
+
92
+ .nav--a .nav__item,
93
+ .nav--a .nav__link {
94
+ padding: var(--space-2) var(--space-2);
95
+ }
96
+
97
+ .nav--b .nav__item,
98
+ .nav--b .nav__link {
99
+ padding: var(--space-1) var(--space-1);
100
+ }
101
+
102
+ .nav--c .nav__item,
103
+ .nav--c .nav__link {
104
+ padding: 0 var(--space-1);
105
+ font-size: var(--text-xs);
106
+ gap: var(--space-1);
107
+ }
108
+
109
+ .nav--c .nav__item svg,
110
+ .nav--c .nav__link svg {
111
+ width: 0.875em;
112
+ height: 0.875em;
113
+ }
114
+
115
+ .nav-section {
116
+ display: inline-flex;
117
+ align-items: center;
118
+ gap: var(--space-6);
119
+ }
120
+
121
+ /* ---------------------------------------------------------
122
+ 2. BRAND / LOGO / ACTION SLOTS
123
+ --------------------------------------------------------- */
124
+
125
+ .nav__brand {
126
+ display: inline-flex;
127
+ align-items: center;
128
+ gap: var(--space-3);
129
+ }
130
+
131
+ .nav__brand--compact {
132
+ gap: var(--space-2);
133
+ }
134
+
135
+ .nav__logo {
136
+ display: inline-flex;
137
+ align-items: center;
138
+ justify-content: center;
139
+ }
140
+
141
+ .nav__logo .logo {
142
+ padding: 0;
143
+ }
144
+
145
+ .nav__actions {
146
+ display: inline-flex;
147
+ align-items: center;
148
+ gap: var(--space-3);
149
+ }
150
+
151
+ /* ---------------------------------------------------------
152
+ 3. NAV TOGGLE (MOBILE HAMBURGER)
153
+ --------------------------------------------------------- */
154
+
155
+ .nav__toggle {
156
+ display: none;
157
+ cursor: pointer;
158
+ padding: var(--space-2);
159
+ border-radius: var(--radius-sm);
160
+
161
+ color: var(--color-text);
162
+ background-color: transparent;
163
+ border: var(--border-width) solid transparent;
164
+
165
+ transition: background-color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease;
166
+ }
167
+
168
+ .nav__toggle svg {
169
+ width: 24px;
170
+ height: 24px;
171
+ stroke: currentColor;
172
+ }
173
+
174
+ .nav__toggle:hover {
175
+ background-color: var(--color-surface-subtle);
176
+ border-color: var(--color-border-subtle);
177
+ }
178
+
179
+ .nav__toggle:active {
180
+ background-color: var(--color-muted-bg);
181
+ }
182
+
183
+ .nav__toggle:focus-visible {
184
+ outline: none;
185
+ box-shadow: 0 0 0 1px var(--color-surface),
186
+ 0 0 0 3px var(--focus-ring-color);
187
+ }
188
+
189
+ .nav__toggle--active {
190
+ background-color: var(--color-accent-soft);
191
+ border-color: var(--color-accent);
192
+ color: var(--color-text);
193
+ }
194
+
195
+ /* ---------------------------------------------------------
196
+ 4. HORIZONTAL / PRIMARY NAV
197
+ --------------------------------------------------------- */
198
+
199
+ .nav--primary {
200
+ display: flex;
201
+ align-items: center;
202
+ gap: var(--space-6);
203
+ }
204
+
205
+ .nav--primary .nav__item,
206
+ .nav--primary .nav__link {
207
+ padding: var(--space-2) var(--space-2);
208
+ border-radius: var(--radius-sm);
209
+ }
210
+
211
+ .nav--primary .nav__item:hover,
212
+ .nav--primary .nav__link:hover {
213
+ background-color: var(--color-surface-subtle);
214
+ }
215
+
216
+ .nav--primary .nav__item--active,
217
+ .nav--primary .nav__link--active {
218
+ background-color: var(--color-accent-soft);
219
+ color: var(--color-text);
220
+ }
221
+
222
+ /* ---------------------------------------------------------
223
+ 5. SUB NAV (TABS) + PILL NAV
224
+ --------------------------------------------------------- */
225
+
226
+ .nav--sub {
227
+ display: flex;
228
+ gap: var(--space-6);
229
+ border-bottom: var(--border-width) solid var(--color-border-subtle);
230
+ padding-bottom: var(--space-2);
231
+ margin-bottom: var(--space-8);
232
+ }
233
+
234
+ .nav--sub .nav__item,
235
+ .nav--sub .nav__link {
236
+ padding-bottom: var(--space-2);
237
+ }
238
+
239
+ .nav--sub .nav__item--active::after,
240
+ .nav--sub .nav__link--active::after {
241
+ content: "";
242
+ position: absolute;
243
+ bottom: calc(var(--border-width) * -1);
244
+ left: 0;
245
+ height: var(--tab-indicator-height);
246
+ width: 100%;
247
+ background-color: var(--color-accent);
248
+ }
249
+
250
+ .nav--sub .nav__item--disabled,
251
+ .nav--sub .nav__link--disabled {
252
+ opacity: 0.45;
253
+ pointer-events: none;
254
+ }
255
+
256
+ .nav--sub .nav__item:focus-visible,
257
+ .nav--sub .nav__link:focus-visible {
258
+ outline: none;
259
+ box-shadow: 0 0 0 1px var(--color-surface),
260
+ 0 0 0 3px var(--focus-ring-color);
261
+ border-radius: var(--radius-sm);
262
+ }
263
+
264
+ .nav--pills {
265
+ display: flex;
266
+ flex-wrap: wrap;
267
+ gap: var(--space-2);
268
+ }
269
+
270
+ .nav--pills .nav__item,
271
+ .nav--pills .nav__link {
272
+ padding: var(--space-1) var(--space-3);
273
+ border-radius: 999px;
274
+ border: var(--border-width) solid var(--color-border-subtle);
275
+ background-color: var(--color-surface);
276
+ font-size: var(--text-xs);
277
+ }
278
+
279
+ .nav--pills .nav__item:hover,
280
+ .nav--pills .nav__link:hover {
281
+ background-color: var(--color-surface-subtle);
282
+ border-color: var(--color-border-subtle);
283
+ }
284
+
285
+ .nav--pills .nav__item--active,
286
+ .nav--pills .nav__link--active {
287
+ border-color: var(--color-accent);
288
+ background-color: var(--color-accent-soft);
289
+ color: var(--color-text);
290
+ }
291
+
292
+ .nav--pills .nav__item--disabled,
293
+ .nav--pills .nav__link--disabled {
294
+ opacity: 0.45;
295
+ pointer-events: none;
296
+ }
297
+
298
+ .nav--pills .nav__item:focus-visible,
299
+ .nav--pills .nav__link:focus-visible {
300
+ outline: none;
301
+ box-shadow: 0 0 0 1px var(--color-surface),
302
+ 0 0 0 3px var(--focus-ring-color);
303
+ }
304
+
305
+ /* ---------------------------------------------------------
306
+ 6. VERTICAL NAV + SIDEBAR
307
+ --------------------------------------------------------- */
308
+
309
+ .nav--vertical {
310
+ display: flex;
311
+ flex-direction: column;
312
+ gap: var(--space-2);
313
+ }
314
+
315
+ .nav--vertical .nav__item,
316
+ .nav--vertical .nav__link {
317
+ padding: var(--space-1) 0;
318
+ }
319
+
320
+ .nav--vertical .nav__item--depth-2,
321
+ .nav--vertical .nav__link--depth-2 {
322
+ padding-left: var(--space-4);
323
+ }
324
+
325
+ .nav--vertical .nav__item--depth-3,
326
+ .nav--vertical .nav__link--depth-3 {
327
+ padding-left: var(--space-6);
328
+ }
329
+
330
+ .sidebar {
331
+ display: flex;
332
+ flex-direction: column;
333
+ gap: var(--space-4);
334
+ }
335
+
336
+ .sidebar__section {
337
+ display: flex;
338
+ flex-direction: column;
339
+ gap: var(--space-2);
340
+ }
341
+
342
+ .sidebar__section--collapsible .sidebar__section-header {
343
+ display: flex;
344
+ align-items: center;
345
+ justify-content: space-between;
346
+ gap: var(--space-2);
347
+ cursor: pointer;
348
+ }
349
+
350
+ .sidebar__section-title {
351
+ font-size: var(--text-xs);
352
+ text-transform: uppercase;
353
+ letter-spacing: 0.04em;
354
+ color: var(--color-text-muted);
355
+ }
356
+
357
+ .sidebar__section-toggle-icon {
358
+ display: inline-flex;
359
+ align-items: center;
360
+ justify-content: center;
361
+ transition: transform 0.15s ease;
362
+ }
363
+
364
+ .sidebar__section--expanded .sidebar__section-toggle-icon {
365
+ transform: rotate(90deg);
366
+ }
367
+
368
+ .sidebar__section--collapsed .sidebar__nav {
369
+ display: none;
370
+ }
371
+
372
+ .sidebar__nav {
373
+ display: flex;
374
+ flex-direction: column;
375
+ gap: var(--space-1);
376
+ }
377
+
378
+ .sidebar__nav .nav__item,
379
+ .sidebar__nav .nav__link {
380
+ font-size: var(--text-sm);
381
+ padding: var(--space-1) 0;
382
+ border-radius: var(--radius-sm);
383
+ cursor: pointer;
384
+ -webkit-text-decoration: underline;
385
+ text-decoration: underline;
386
+ color: var(--color-text);
387
+ }
388
+
389
+ .sidebar__nav .nav__item:hover,
390
+ .sidebar__nav .nav__link:hover {
391
+ background-color: var(--color-surface-subtle);
392
+ color: var(--color-text-muted);
393
+ -webkit-text-decoration: none;
394
+ text-decoration: none;
395
+ }
396
+
397
+ .sidebar__nav .nav__item--active,
398
+ .sidebar__nav .nav__link--active {
399
+ font-weight: 600;
400
+ color: var(--color-accent);
401
+ }
402
+
403
+ .sidebar__section--collapsible .sidebar__section-header {
404
+ cursor: pointer;
405
+ }
406
+
407
+ .sidebar__nav .nav__item:focus-visible,
408
+ .sidebar__nav .nav__link:focus-visible {
409
+ outline: 2px solid var(--focus-ring-color, var(--color-accent-soft));
410
+ outline-offset: var(--space-1);
411
+ }
412
+
413
+ /* ---------------------------------------------------------
414
+ 7. ANNOUNCEMENT BAR
415
+ --------------------------------------------------------- */
416
+
417
+ .announcement {
418
+ width: 100%;
419
+ background-color: var(--color-muted-bg);
420
+ color: var(--color-text-muted);
421
+ border-bottom: var(--border-width) solid var(--color-muted-border);
422
+ padding: var(--space-2) 0;
423
+ }
424
+
425
+ .announcement__inner {
426
+ max-width: var(--content-width-xl);
427
+ margin: 0 auto;
428
+ padding: 0 var(--space-6);
429
+
430
+ display: flex;
431
+ align-items: center;
432
+ justify-content: space-between;
433
+ gap: var(--space-4);
434
+ }
435
+
436
+ .announcement__content {
437
+ display: flex;
438
+ align-items: center;
439
+ gap: var(--space-2);
440
+ }
441
+
442
+ .announcement__icon {
443
+ display: inline-flex;
444
+ align-items: center;
445
+ justify-content: center;
446
+ font-size: var(--text-sm);
447
+ }
448
+
449
+ .announcement__text {
450
+ font-size: var(--text-xs);
451
+ }
452
+
453
+ .announcement__link {
454
+ font-size: var(--text-xs);
455
+ -webkit-text-decoration: none;
456
+ text-decoration: none;
457
+ color: var(--color-text);
458
+ }
459
+
460
+ .announcement__link:hover {
461
+ -webkit-text-decoration: underline;
462
+ text-decoration: underline;
463
+ }
464
+
465
+ .announcement__close {
466
+ display: inline-flex;
467
+ align-items: center;
468
+ justify-content: center;
469
+ cursor: pointer;
470
+
471
+ border-radius: var(--radius-sm);
472
+ padding: var(--space-1);
473
+
474
+ border: var(--border-width) solid transparent;
475
+ background-color: transparent;
476
+
477
+ transition: background-color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease;
478
+ }
479
+
480
+ .announcement__close:hover {
481
+ background-color: var(--color-surface-subtle);
482
+ border-color: var(--color-border-subtle);
483
+ }
484
+
485
+ .announcement__close:focus-visible {
486
+ outline: none;
487
+ box-shadow: 0 0 0 1px var(--color-surface),
488
+ 0 0 0 3px var(--focus-ring-color);
489
+ }
490
+
491
+ .announcement--info {
492
+ background-color: var(--color-info-soft);
493
+ color: var(--color-info-strong);
494
+ }
495
+
496
+ .announcement--success {
497
+ background-color: var(--color-success-soft);
498
+ color: var(--color-success-strong);
499
+ }
500
+
501
+ .announcement--warning {
502
+ background-color: var(--color-warning-soft);
503
+ color: var(--color-warning-strong);
504
+ }
505
+
506
+ .announcement--danger {
507
+ background-color: var(--color-danger-soft);
508
+ color: var(--color-danger-strong);
509
+ }
510
+
511
+ /* ---------------------------------------------------------
512
+ 8. BREADCRUMBS
513
+ --------------------------------------------------------- */
514
+
515
+ .breadcrumbs {
516
+ display: flex;
517
+ align-items: center;
518
+ gap: var(--space-2);
519
+ font-size: var(--text-xs);
520
+ color: var(--color-text-muted);
521
+ flex-wrap: wrap;
522
+ }
523
+
524
+ .breadcrumbs__item {
525
+ display: inline-flex;
526
+ align-items: center;
527
+ gap: var(--space-1);
528
+ max-width: 100%;
529
+ }
530
+
531
+ .breadcrumbs__link {
532
+ color: var(--color-text);
533
+ -webkit-text-decoration: underline;
534
+ text-decoration: underline;
535
+ max-width: 16rem;
536
+ overflow: hidden;
537
+ text-overflow: ellipsis;
538
+ white-space: nowrap;
539
+ }
540
+
541
+ .breadcrumbs__link:hover {
542
+ color: var(--color-text-muted);
543
+ }
544
+
545
+ .breadcrumbs__link:focus-visible {
546
+ outline: none;
547
+ box-shadow: 0 0 0 1px var(--color-surface),
548
+ 0 0 0 3px var(--focus-ring-color);
549
+ border-radius: var(--radius-sm);
550
+ }
551
+
552
+ .breadcrumbs__separator {
553
+ color: var(--color-text-soft);
554
+ }
555
+
556
+ /* ---------------------------------------------------------
557
+ 9. PAGINATION
558
+ --------------------------------------------------------- */
559
+
560
+ .pagination {
561
+ display: inline-flex;
562
+ align-items: center;
563
+ gap: var(--space-1);
564
+ font-size: var(--text-xs);
565
+ }
566
+
567
+ .pagination__item {
568
+ min-width: 2rem;
569
+ height: 2rem;
570
+ padding: 0 var(--space-2);
571
+
572
+ display: inline-flex;
573
+ align-items: center;
574
+ justify-content: center;
575
+
576
+ border-radius: var(--radius-sm);
577
+ border: var(--border-width) solid var(--color-border-subtle);
578
+ background-color: var(--color-surface);
579
+ color: var(--color-text);
580
+
581
+ cursor: pointer;
582
+ -webkit-text-decoration: none;
583
+ text-decoration: none;
584
+
585
+ transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease, box-shadow 0.15s ease;
586
+ }
587
+
588
+ .pagination__item:hover {
589
+ background-color: var(--color-surface-subtle);
590
+ border-color: var(--color-border-subtle);
591
+ color: var(--color-text);
592
+ }
593
+
594
+ .pagination__item:active {
595
+ background-color: var(--color-muted-bg);
596
+ }
597
+
598
+ .pagination__item:focus-visible {
599
+ outline: none;
600
+ box-shadow: 0 0 0 1px var(--color-surface),
601
+ 0 0 0 3px var(--focus-ring-color);
602
+ }
603
+
604
+ .pagination__item--active {
605
+ border-color: var(--color-accent);
606
+ background-color: var(--color-accent-soft);
607
+ color: var(--color-text);
608
+ }
609
+
610
+ .pagination__item--disabled {
611
+ opacity: 0.4;
612
+ cursor: not-allowed;
613
+ pointer-events: none;
614
+ }
615
+
616
+ .pagination__prev,
617
+ .pagination__next {
618
+ min-width: auto;
619
+ padding: 0 var(--space-2);
620
+ }
621
+
622
+ .pagination__ellipsis {
623
+ min-width: auto;
624
+ border: none;
625
+ background-color: transparent;
626
+ cursor: default;
627
+ }
628
+
629
+ /* ---------------------------------------------------------
630
+ 10. TOOLBAR
631
+ --------------------------------------------------------- */
632
+
633
+ .toolbar {
634
+ display: flex;
635
+ align-items: center;
636
+ justify-content: space-between;
637
+ gap: var(--space-4);
638
+
639
+ padding: var(--space-3) var(--space-4);
640
+ border-radius: var(--radius-md);
641
+ background-color: var(--color-surface);
642
+ border: var(--border-width) solid var(--color-border-subtle);
643
+ }
644
+
645
+ .toolbar--dense {
646
+ padding: var(--space-2) var(--space-3);
647
+ }
648
+
649
+ .toolbar--spacious {
650
+ padding: var(--space-4) var(--space-5);
651
+ }
652
+
653
+ .toolbar__section {
654
+ display: flex;
655
+ align-items: center;
656
+ gap: var(--space-3);
657
+ }
658
+
659
+ .toolbar__title {
660
+ font-size: var(--text-sm);
661
+ font-weight: 500;
662
+ }
663
+
664
+ .toolbar__actions {
665
+ display: inline-flex;
666
+ align-items: center;
667
+ gap: var(--space-3);
668
+ }
669
+
670
+ /* ---------------------------------------------------------
671
+ 11. FOOTER NAV CONTEXT
672
+ --------------------------------------------------------- */
673
+
674
+ .footer .nav {
675
+ display: flex;
676
+ flex-direction: column;
677
+ gap: var(--space-2);
678
+ }
679
+
680
+ .footer .nav.nav--vertical {
681
+ align-items: flex-start;
682
+ }
683
+
684
+ .footer .nav__item,
685
+ .footer .nav__link {
686
+ color: var(--color-footer-text);
687
+ opacity: 0.85;
688
+ font-size: var(--text-sm);
689
+ text-align: left;
690
+ padding-left: 0;
691
+ padding-right: 0;
692
+ }
693
+
694
+ .footer .nav__item:hover,
695
+ .footer .nav__link:hover {
696
+ opacity: 1;
697
+ }
698
+
699
+ .footer .nav__item--active,
700
+ .footer .nav__link--active {
701
+ opacity: 1;
702
+ font-weight: 500;
703
+ }
704
+
705
+ /* ---------------------------------------------------------
706
+ 12. MOBILE NAV (OVERLAY / PANEL PATTERN)
707
+ --------------------------------------------------------- */
708
+
709
+ .nav-panel {
710
+ position: fixed;
711
+ top: 0;
712
+ right: 0;
713
+ bottom: 0;
714
+
715
+ width: 18rem;
716
+ max-width: 100%;
717
+
718
+ background-color: var(--color-bg-elevated);
719
+ border-left: var(--border-width) solid var(--color-border-subtle);
720
+ box-shadow: var(--shadow-2);
721
+
722
+ transform: translateX(100%);
723
+ opacity: 0;
724
+ pointer-events: none;
725
+
726
+ display: flex;
727
+ flex-direction: column;
728
+ gap: var(--space-4);
729
+ padding: var(--space-4);
730
+
731
+ transition: transform 0.2s ease, opacity 0.2s ease;
732
+ z-index: 40;
733
+ }
734
+
735
+ .nav-panel--open {
736
+ transform: translateX(0);
737
+ opacity: 1;
738
+ pointer-events: auto;
739
+ }
740
+
741
+ .nav-backdrop {
742
+ position: fixed;
743
+ top: 0;
744
+ right: 0;
745
+ bottom: 0;
746
+ left: 0;
747
+ background-color: var(--overlay-backdrop-default);
748
+ opacity: 0;
749
+ pointer-events: none;
750
+ transition: opacity 0.2s ease;
751
+ z-index: 30;
752
+ }
753
+
754
+ .nav-backdrop--visible {
755
+ opacity: 1;
756
+ pointer-events: auto;
757
+ }
758
+
759
+ .nav--mobile {
760
+ display: flex;
761
+ flex-direction: column;
762
+ gap: var(--space-4);
763
+ }
764
+
765
+ .nav--mobile .nav__item,
766
+ .nav--mobile .nav__link {
767
+ font-size: var(--text-md);
768
+ padding: var(--space-2) 0;
769
+ }
770
+
771
+ @media (max-width: 768px) {
772
+ .nav__toggle {
773
+ display: inline-flex;
774
+ align-items: center;
775
+ }
776
+ }
777
+
778
+ /* ---------------------------------------------------------
779
+ TABS (Standalone Component)
780
+ --------------------------------------------------------- */
781
+
782
+ .nav-tabs {
783
+ display: flex;
784
+ align-items: center;
785
+ gap: var(--space-6);
786
+ border-bottom: var(--border-width) solid var(--color-border-subtle);
787
+ padding-bottom: var(--space-2);
788
+ }
789
+
790
+ .nav-tabs__item {
791
+ position: relative;
792
+ display: inline-flex;
793
+ align-items: center;
794
+ justify-content: center;
795
+
796
+ padding: var(--space-1) var(--space-2);
797
+ font-size: var(--text-sm);
798
+ font-weight: 500;
799
+
800
+ background: none;
801
+ border: none;
802
+ cursor: pointer;
803
+
804
+ color: var(--color-text);
805
+ -webkit-text-decoration: none;
806
+ text-decoration: none;
807
+
808
+ transition: color 0.15s ease, background-color 0.15s ease, box-shadow 0.15s ease;
809
+ }
810
+
811
+ .nav-tabs__item:hover {
812
+ color: var(--color-text-muted);
813
+ }
814
+
815
+ .nav-tabs__item:focus-visible {
816
+ outline: none;
817
+ box-shadow: 0 0 0 1px var(--color-surface),
818
+ 0 0 0 3px var(--focus-ring-color);
819
+ border-radius: var(--radius-sm);
820
+ }
821
+
822
+ .nav-tabs__item--active,
823
+ .nav-tabs__item[aria-selected="true"] {
824
+ color: var(--color-text);
825
+ font-weight: 600;
826
+ }
827
+
828
+ .nav-tabs__item--active::after,
829
+ .nav-tabs__item[aria-selected="true"]::after {
830
+ content: "";
831
+ position: absolute;
832
+ bottom: calc(var(--border-width) * -1);
833
+ left: 0;
834
+ width: 100%;
835
+ height: var(--tab-indicator-height); /* already used in nav--sub */
836
+ background-color: var(--color-accent);
837
+ }
838
+
839
+ .nav-tabs__item--disabled,
840
+ .nav-tabs__item[disabled] {
841
+ opacity: 0.45;
842
+ cursor: not-allowed;
843
+ pointer-events: none;
844
+ }
845
+
846
+ .nav-tabs__item:hover:not(.nav-tabs__item--active):not([aria-selected="true"]) {
847
+ color: var(--color-text);
848
+ background-color: var(--color-surface-subtle);
849
+ border-radius: var(--radius-sm);
850
+ }
851
+
852
+ .nav-tabs--compact {
853
+ gap: var(--space-4);
854
+ padding-bottom: var(--space-1);
855
+ }
856
+
857
+ .nav-tabs--compact .nav-tabs__item {
858
+ padding: var(--space-0_5) 0;
859
+ font-size: var(--text-xs);
860
+ }
861
+
862
+ .nav-tabs__item {
863
+ gap: var(--space-2);
864
+ }
865
+
866
+ .nav-tabs__icon {
867
+ width: var(--icon-sm);
868
+ height: var(--icon-sm);
869
+ flex-shrink: 0;
870
+ }
871
+
872
+ .nav-tabs__badge {
873
+ display: inline-flex;
874
+ align-items: center;
875
+ justify-content: center;
876
+
877
+ min-width: 1.25rem;
878
+ height: 1.25rem;
879
+
880
+ padding-left: var(--space-1);
881
+
882
+ padding-right: var(--space-1);
883
+
884
+ background-color: var(--accent-soft-surface, var(--color-accent-soft));
885
+ color: var(--accent-soft-on, var(--color-on-accent));
886
+
887
+ font-size: var(--text-xs);
888
+ font-weight: 500;
889
+
890
+ border-radius: var(--radius-pill);
891
+
892
+ line-height: 1;
893
+ flex-shrink: 0;
894
+ }
895
+
896
+ .nav-tabs__item--active .nav-tabs__badge,
897
+ .nav-tabs__item[aria-selected="true"] .nav-tabs__badge {
898
+ background-color: var(--accent-soft-surface-strong, var(--accent-soft-surface));
899
+ color: var(--accent-soft-on, var(--color-on-accent));
900
+ }