@db-vincent/components 0.0.0-stage → 0.1.1

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 (86) hide show
  1. package/package.json +28 -4
  2. package/src/astro/Accordion.astro +37 -0
  3. package/src/astro/Alert.astro +73 -0
  4. package/src/astro/Avatar.astro +88 -0
  5. package/src/astro/AvatarGroup.astro +63 -0
  6. package/src/astro/Badge.astro +23 -0
  7. package/src/astro/Breadcrumbs.astro +45 -0
  8. package/src/astro/Button.astro +125 -0
  9. package/src/astro/Card.astro +63 -0
  10. package/src/astro/Checkbox.astro +61 -0
  11. package/src/astro/Chip.astro +135 -0
  12. package/src/astro/CodeBlock.astro +17 -0
  13. package/src/astro/Drawer.astro +30 -0
  14. package/src/astro/EmptyState.astro +45 -0
  15. package/src/astro/Example.astro +37 -0
  16. package/src/astro/Grid.astro +56 -0
  17. package/src/astro/GridItem.astro +25 -0
  18. package/src/astro/Icon.astro +52 -0
  19. package/src/astro/Menu.astro +151 -0
  20. package/src/astro/MenuItem.astro +57 -0
  21. package/src/astro/Modal.astro +124 -0
  22. package/src/astro/Navbar.astro +756 -0
  23. package/src/astro/PageHeader.astro +34 -0
  24. package/src/astro/Pagination.astro +212 -0
  25. package/src/astro/Popover.astro +51 -0
  26. package/src/astro/Progress.astro +71 -0
  27. package/src/astro/Radio.astro +58 -0
  28. package/src/astro/RadioGroup.astro +25 -0
  29. package/src/astro/Section.astro +25 -0
  30. package/src/astro/Select.astro +420 -0
  31. package/src/astro/Sidebar.astro +215 -0
  32. package/src/astro/Skeleton.astro +41 -0
  33. package/src/astro/Spinner.astro +20 -0
  34. package/src/astro/Stepper.astro +82 -0
  35. package/src/astro/Switch.astro +78 -0
  36. package/src/astro/Table.astro +268 -0
  37. package/src/astro/Tabs.astro +83 -0
  38. package/src/astro/TextField.astro +305 -0
  39. package/src/astro/ThemeToggle.astro +66 -0
  40. package/src/astro/Toast.astro +181 -0
  41. package/src/astro/Tooltip.astro +54 -0
  42. package/src/astro/TopBar.astro +29 -0
  43. package/src/data/icons.ts +120 -0
  44. package/src/scripts/avatar.ts +33 -0
  45. package/src/scripts/menu.ts +218 -0
  46. package/src/scripts/tabs.ts +127 -0
  47. package/src/scripts/toast.ts +565 -0
  48. package/src/scripts/tooltip.ts +127 -0
  49. package/src/styles/accordion.css +79 -0
  50. package/src/styles/alert.css +108 -0
  51. package/src/styles/avatar.css +131 -0
  52. package/src/styles/badge.css +48 -0
  53. package/src/styles/base.css +205 -0
  54. package/src/styles/breadcrumbs.css +54 -0
  55. package/src/styles/button.css +174 -0
  56. package/src/styles/card.css +112 -0
  57. package/src/styles/chip.css +106 -0
  58. package/src/styles/choice.css +143 -0
  59. package/src/styles/code.css +44 -0
  60. package/src/styles/empty.css +59 -0
  61. package/src/styles/example.css +57 -0
  62. package/src/styles/grid.css +64 -0
  63. package/src/styles/input.css +208 -0
  64. package/src/styles/menu.css +151 -0
  65. package/src/styles/modal.css +285 -0
  66. package/src/styles/motion.css +114 -0
  67. package/src/styles/nav.css +232 -0
  68. package/src/styles/navbar.css +658 -0
  69. package/src/styles/page-header.css +62 -0
  70. package/src/styles/pagination.css +81 -0
  71. package/src/styles/popover.css +134 -0
  72. package/src/styles/progress.css +95 -0
  73. package/src/styles/section.css +38 -0
  74. package/src/styles/select.css +246 -0
  75. package/src/styles/skeleton.css +66 -0
  76. package/src/styles/spinner.css +44 -0
  77. package/src/styles/sr-only.css +14 -0
  78. package/src/styles/stepper.css +169 -0
  79. package/src/styles/switch.css +143 -0
  80. package/src/styles/table.css +177 -0
  81. package/src/styles/tabs.css +120 -0
  82. package/src/styles/theme-toggle.css +31 -0
  83. package/src/styles/toast.css +225 -0
  84. package/src/styles/tooltip.css +63 -0
  85. package/src/styles/topbar.css +32 -0
  86. package/README.md +0 -3
@@ -0,0 +1,658 @@
1
+ @layer reset, tokens, base, components, motion, utilities;
2
+
3
+ @layer components {
4
+ /* The bar is a query container: it collapses by its own width, so it works
5
+ the same as a page header, inside a split view or in a demo frame. */
6
+ /* No surface at rest: the bar is just its content on the page. Once a
7
+ sticky bar has content scrolling under it, it gains a light tint that
8
+ blurs what passes beneath, so the row stays legible without becoming a
9
+ slab. This is the one sanctioned blur in the system (AGENTS.md). */
10
+ .ds-navbar {
11
+ background-color: transparent;
12
+ container: ds-navbar / inline-size;
13
+ position: relative;
14
+ transition:
15
+ background-color var(--duration-base) var(--ease-standard),
16
+ backdrop-filter var(--duration-base) var(--ease-standard),
17
+ -webkit-backdrop-filter var(--duration-base) var(--ease-standard);
18
+ }
19
+
20
+ .ds-navbar[data-scrolled="true"] {
21
+ -webkit-backdrop-filter: blur(var(--navbar-blur)) saturate(1.4);
22
+ backdrop-filter: blur(var(--navbar-blur)) saturate(1.4);
23
+ background-color: color-mix(
24
+ in srgb,
25
+ var(--navbar-bg) var(--navbar-tint),
26
+ transparent
27
+ );
28
+ }
29
+
30
+ /* Without backdrop-filter support the tint goes opaque instead. */
31
+ @supports not (
32
+ (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))
33
+ ) {
34
+ .ds-navbar[data-scrolled="true"] {
35
+ background-color: var(--navbar-bg);
36
+ }
37
+ }
38
+
39
+ .ds-navbar--sticky {
40
+ position: sticky;
41
+ top: 0;
42
+ z-index: var(--z-sticky);
43
+ }
44
+
45
+ /* An open panel lifts its bar above later bars and sticky surfaces. */
46
+ .ds-navbar:has(.ds-navbar__viewport:not([hidden])) {
47
+ z-index: var(--z-popover);
48
+ }
49
+
50
+ .ds-navbar__inner {
51
+ align-items: center;
52
+ display: flex;
53
+ gap: var(--navbar-gap);
54
+ min-height: var(--navbar-height);
55
+ padding-inline: var(--navbar-padding-x);
56
+ }
57
+
58
+ /* Brand ------------------------------------------------------------------ */
59
+ .ds-navbar__brand {
60
+ align-items: center;
61
+ border-radius: var(--navbar-link-radius);
62
+ color: var(--navbar-brand-fg);
63
+ display: inline-flex;
64
+ flex: none;
65
+ font-size: var(--navbar-brand-size);
66
+ font-weight: var(--weight-semibold);
67
+ gap: var(--space-2-5);
68
+ letter-spacing: var(--type-heading-tracking);
69
+ text-decoration: none;
70
+ }
71
+
72
+ .ds-navbar__mark {
73
+ align-items: center;
74
+ background: var(--navbar-brand-mark-bg);
75
+ border-radius: var(--radius-md);
76
+ color: var(--navbar-brand-mark-fg);
77
+ display: inline-flex;
78
+ height: var(--space-8);
79
+ justify-content: center;
80
+ width: var(--space-8);
81
+ }
82
+
83
+ .ds-navbar__start {
84
+ align-items: center;
85
+ display: flex;
86
+ flex: 1 1 auto;
87
+ min-width: 0;
88
+ }
89
+
90
+ .ds-navbar__start:empty {
91
+ display: none;
92
+ }
93
+
94
+ .ds-navbar__actions {
95
+ align-items: center;
96
+ display: flex;
97
+ flex: none;
98
+ gap: var(--space-1);
99
+ margin-inline-start: auto;
100
+ }
101
+
102
+ .ds-navbar__actions:empty {
103
+ display: none;
104
+ }
105
+
106
+ /* Row of triggers and links --------------------------------------------- */
107
+ .ds-navbar__nav {
108
+ position: relative;
109
+ }
110
+
111
+ .ds-navbar__list {
112
+ align-items: center;
113
+ display: flex;
114
+ gap: var(--space-0-5);
115
+ list-style: none;
116
+ margin: 0;
117
+ padding: 0;
118
+ }
119
+
120
+ .ds-navbar__trigger {
121
+ align-items: center;
122
+ background: transparent;
123
+ border: 0;
124
+ border-radius: var(--navbar-link-radius);
125
+ color: var(--navbar-link-fg);
126
+ cursor: pointer;
127
+ display: inline-flex;
128
+ font: inherit;
129
+ font-size: var(--navbar-link-size);
130
+ font-weight: var(--weight-medium);
131
+ gap: var(--navbar-link-gap);
132
+ height: var(--navbar-link-height);
133
+ padding-inline: var(--navbar-link-padding-x);
134
+ position: relative;
135
+ text-decoration: none;
136
+ transition:
137
+ background-color var(--duration-fast) var(--ease-standard),
138
+ color var(--duration-fast) var(--ease-standard);
139
+ white-space: nowrap;
140
+ }
141
+
142
+ .ds-navbar__trigger:hover,
143
+ .ds-navbar__trigger[aria-expanded="true"] {
144
+ background: var(--navbar-link-bg-hover);
145
+ color: var(--navbar-link-fg-hover);
146
+ }
147
+
148
+ .ds-navbar__trigger[aria-expanded="true"] {
149
+ background: var(--navbar-link-bg-open);
150
+ }
151
+
152
+ /* Current destination: the same tinted fill the sidebar uses for its
153
+ current item, so "you are here" reads the same everywhere. */
154
+ .ds-navbar__trigger[aria-current="page"],
155
+ .ds-navbar__trigger.is-current {
156
+ background: var(--navbar-link-bg-current);
157
+ color: var(--navbar-link-fg-current);
158
+ }
159
+
160
+ .ds-navbar__trigger[aria-current="page"]:hover,
161
+ .ds-navbar__trigger.is-current:hover,
162
+ .ds-navbar__trigger.is-current[aria-expanded="true"] {
163
+ background: var(--navbar-link-bg-current-hover);
164
+ }
165
+
166
+ .ds-navbar__trigger[aria-current="page"] .ds-icon:not(.ds-navbar__chevron),
167
+ .ds-navbar__trigger.is-current .ds-icon:not(.ds-navbar__chevron) {
168
+ color: var(--navbar-current-icon-fg);
169
+ }
170
+
171
+ .ds-navbar__chevron {
172
+ color: var(--navbar-row-icon-fg);
173
+ transition: transform var(--duration-base) var(--ease-standard);
174
+ }
175
+
176
+ [aria-expanded="true"] > .ds-navbar__chevron,
177
+ .ds-navbar__disclosure[open] > summary .ds-navbar__chevron {
178
+ transform: rotate(180deg);
179
+ }
180
+
181
+ /* Shared viewport -------------------------------------------------------- */
182
+ .ds-navbar__viewport {
183
+ background: var(--navbar-viewport-bg);
184
+ border: 1px solid var(--navbar-viewport-border);
185
+ border-radius: var(--navbar-viewport-radius);
186
+ box-shadow: var(--navbar-viewport-shadow);
187
+ height: var(--ds-navbar-viewport-h, auto);
188
+ left: 0;
189
+ overflow: hidden;
190
+ position: absolute;
191
+ top: calc(100% + var(--navbar-viewport-offset));
192
+ transform: translateX(var(--ds-navbar-viewport-x, 0));
193
+ transition:
194
+ transform var(--duration-slow) var(--ease-standard),
195
+ width var(--duration-slow) var(--ease-standard),
196
+ height var(--duration-slow) var(--ease-standard);
197
+ width: var(--ds-navbar-viewport-w, auto);
198
+ }
199
+
200
+ .ds-navbar__viewport[hidden] {
201
+ display: none;
202
+ }
203
+
204
+ .ds-navbar__viewport[data-instant="true"] {
205
+ animation: ds-navbar-viewport-in var(--duration-base) var(--ease-enter);
206
+ transition: none;
207
+ }
208
+
209
+ .ds-navbar__panel {
210
+ left: 0;
211
+ position: absolute;
212
+ top: 0;
213
+ }
214
+
215
+ .ds-navbar__panel:not([hidden]) {
216
+ animation: ds-navbar-panel-in var(--duration-base) var(--ease-enter);
217
+ display: grid;
218
+ gap: var(--navbar-panel-gap);
219
+ padding: var(--navbar-panel-padding);
220
+ }
221
+
222
+ .ds-navbar__panel--list {
223
+ width: var(--navbar-panel-width-list);
224
+ }
225
+
226
+ .ds-navbar__panel--grid {
227
+ width: var(--navbar-panel-width-grid);
228
+ }
229
+
230
+ .ds-navbar__panel--grid .ds-navbar__rows {
231
+ grid-template-columns: repeat(2, minmax(0, 1fr));
232
+ }
233
+
234
+ .ds-navbar__panel--featured {
235
+ grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr);
236
+ width: var(--navbar-panel-width-grid);
237
+ }
238
+
239
+ .ds-navbar__panel--groups {
240
+ grid-auto-columns: var(--navbar-panel-width-group);
241
+ grid-auto-flow: column;
242
+ }
243
+
244
+ .ds-navbar__panel--groups .ds-navbar__group + .ds-navbar__group {
245
+ border-inline-start: 1px solid var(--navbar-sheet-border);
246
+ padding-inline-start: var(--navbar-panel-gap);
247
+ }
248
+
249
+ .ds-navbar__group {
250
+ display: grid;
251
+ align-content: start;
252
+ gap: var(--space-1);
253
+ }
254
+
255
+ .ds-navbar__eyebrow {
256
+ color: var(--navbar-eyebrow-fg);
257
+ font-size: var(--type-overline-size);
258
+ font-weight: var(--type-overline-weight);
259
+ letter-spacing: var(--type-overline-tracking);
260
+ line-height: var(--type-overline-leading);
261
+ margin: 0;
262
+ padding: var(--space-2) var(--space-3) var(--space-1);
263
+ text-transform: uppercase;
264
+ }
265
+
266
+ .ds-navbar__rows {
267
+ display: grid;
268
+ gap: var(--space-0-5);
269
+ list-style: none;
270
+ margin: 0;
271
+ padding: 0;
272
+ }
273
+
274
+ .ds-navbar__row {
275
+ align-items: flex-start;
276
+ border-radius: var(--navbar-row-radius);
277
+ color: var(--navbar-row-fg);
278
+ display: flex;
279
+ gap: var(--space-3);
280
+ padding: var(--navbar-row-padding);
281
+ text-decoration: none;
282
+ transition: background-color var(--duration-fast) var(--ease-standard);
283
+ }
284
+
285
+ .ds-navbar__row:hover,
286
+ .ds-navbar__row:focus-visible {
287
+ background: var(--navbar-row-bg-hover);
288
+ }
289
+
290
+ .ds-navbar__row[aria-current="page"] {
291
+ background: var(--navbar-row-bg-current);
292
+ }
293
+
294
+ .ds-navbar__row[aria-current="page"]:hover,
295
+ .ds-navbar__row[aria-current="page"]:focus-visible {
296
+ background: var(--navbar-link-bg-current-hover);
297
+ }
298
+
299
+ .ds-navbar__row[aria-current="page"] .ds-navbar__row-icon {
300
+ color: var(--navbar-current-icon-fg);
301
+ }
302
+
303
+ .ds-navbar__row-icon {
304
+ color: var(--navbar-row-icon-fg);
305
+ display: inline-flex;
306
+ flex: none;
307
+ margin-block-start: var(--space-0-5);
308
+ }
309
+
310
+ .ds-navbar__row-body {
311
+ display: grid;
312
+ gap: var(--space-0-5);
313
+ min-width: 0;
314
+ }
315
+
316
+ .ds-navbar__row-title {
317
+ font-size: var(--text-sm);
318
+ font-weight: var(--weight-medium);
319
+ line-height: var(--leading-sm);
320
+ }
321
+
322
+ .ds-navbar__row-desc {
323
+ color: var(--navbar-row-desc-fg);
324
+ display: -webkit-box;
325
+ font-size: var(--text-sm);
326
+ line-height: var(--leading-sm);
327
+ overflow: hidden;
328
+ -webkit-box-orient: vertical;
329
+ -webkit-line-clamp: 2;
330
+ }
331
+
332
+ /* Featured card: the section's front door, on a quiet tint. */
333
+ .ds-navbar__feature {
334
+ align-content: end;
335
+ background: var(--navbar-feature-bg);
336
+ border-radius: var(--navbar-row-radius);
337
+ color: var(--navbar-row-fg);
338
+ display: grid;
339
+ gap: var(--space-1);
340
+ min-height: var(--navbar-feature-min-height);
341
+ padding: var(--space-4);
342
+ text-decoration: none;
343
+ transition: background-color var(--duration-fast) var(--ease-standard);
344
+ }
345
+
346
+ .ds-navbar__feature:hover,
347
+ .ds-navbar__feature:focus-visible {
348
+ background: var(--navbar-feature-bg-hover);
349
+ }
350
+
351
+ .ds-navbar__feature .ds-navbar__eyebrow {
352
+ padding: 0;
353
+ }
354
+
355
+ .ds-navbar__feature-icon {
356
+ align-items: center;
357
+ align-self: start;
358
+ background: var(--navbar-feature-icon-bg);
359
+ border-radius: var(--radius-md);
360
+ color: var(--navbar-feature-icon-fg);
361
+ display: inline-flex;
362
+ height: var(--space-10);
363
+ justify-content: center;
364
+ margin-block-end: auto;
365
+ width: var(--space-10);
366
+ }
367
+
368
+ .ds-navbar__feature-title {
369
+ font-size: var(--text-lg);
370
+ font-weight: var(--weight-semibold);
371
+ letter-spacing: var(--type-heading-tracking);
372
+ line-height: var(--leading-lg);
373
+ }
374
+
375
+ /* Focus ------------------------------------------------------------------ */
376
+ .ds-navbar__brand:focus-visible,
377
+ .ds-navbar__trigger:focus-visible,
378
+ .ds-navbar__row:focus-visible,
379
+ .ds-navbar__feature:focus-visible,
380
+ .ds-navbar__toggle:focus-visible,
381
+ .ds-navbar__sheet-link:focus-visible,
382
+ .ds-navbar__sheet-sublink:focus-visible {
383
+ outline: var(--navbar-focus-width) solid var(--navbar-focus-color);
384
+ outline-offset: var(--navbar-focus-offset);
385
+ }
386
+
387
+ .ds-navbar__row:focus-visible,
388
+ .ds-navbar__feature:focus-visible,
389
+ .ds-navbar__sheet-link:focus-visible,
390
+ .ds-navbar__sheet-sublink:focus-visible {
391
+ outline-offset: calc(-1 * var(--navbar-focus-width));
392
+ }
393
+
394
+ /* Menu button: a plain icon button, like the other bar utilities. ------ */
395
+ .ds-navbar__toggle {
396
+ align-items: center;
397
+ background: transparent;
398
+ border: 0;
399
+ border-radius: var(--navbar-link-radius);
400
+ color: var(--navbar-toggle-fg);
401
+ cursor: pointer;
402
+ display: none;
403
+ flex: none;
404
+ height: var(--space-10);
405
+ justify-content: center;
406
+ margin-inline-end: calc(-1 * var(--space-2));
407
+ transition: background-color var(--duration-fast) var(--ease-standard);
408
+ width: var(--space-10);
409
+ }
410
+
411
+ .ds-navbar__toggle:hover {
412
+ background: var(--navbar-toggle-bg-hover);
413
+ }
414
+
415
+ /* Mobile menu -------------------------------------------------------------
416
+ A floating card inset from the screen edges, not a full-bleed slab: the
417
+ page stays visible around it under a light scrim. It sizes to its
418
+ content and scrolls inside itself when that runs past the viewport. */
419
+ .ds-navbar__sheet {
420
+ background: var(--navbar-sheet-bg);
421
+ border: 1px solid var(--navbar-sheet-border);
422
+ border-radius: var(--navbar-sheet-radius);
423
+ box-shadow: var(--navbar-viewport-shadow);
424
+ color: var(--navbar-row-fg);
425
+ inset: var(--navbar-sheet-inset) var(--navbar-sheet-inset) auto auto;
426
+ margin: 0;
427
+ max-height: calc(100dvh - 2 * var(--navbar-sheet-inset));
428
+ max-width: var(--navbar-sheet-max-width);
429
+ overflow-y: auto;
430
+ overscroll-behavior: contain;
431
+ padding: 0;
432
+ position: fixed;
433
+ transform-origin: top right;
434
+ width: calc(100% - 2 * var(--navbar-sheet-inset));
435
+ }
436
+
437
+ .ds-navbar__sheet[open] {
438
+ animation: ds-navbar-sheet-in var(--duration-base) var(--ease-enter);
439
+ display: flex;
440
+ flex-direction: column;
441
+ }
442
+
443
+ .ds-navbar__sheet::backdrop {
444
+ background: var(--navbar-sheet-backdrop);
445
+ }
446
+
447
+ /* Scroll lock without script: the page cannot scroll behind an open menu. */
448
+ :root:has(.ds-navbar__sheet[open]) {
449
+ overflow: hidden;
450
+ }
451
+
452
+ .ds-navbar__sheet-head {
453
+ align-items: center;
454
+ display: flex;
455
+ justify-content: space-between;
456
+ min-height: var(--space-16);
457
+ padding-inline: var(--navbar-sheet-padding);
458
+ }
459
+
460
+ .ds-navbar__sheet-head form {
461
+ display: contents;
462
+ }
463
+
464
+ .ds-navbar__sheet-head .ds-navbar__toggle {
465
+ display: inline-flex;
466
+ }
467
+
468
+ .ds-navbar__sheet-title {
469
+ font-size: var(--text-sm);
470
+ font-weight: var(--weight-semibold);
471
+ }
472
+
473
+ .ds-navbar__sheet-nav {
474
+ padding: var(--space-2) var(--space-3) var(--space-4);
475
+ }
476
+
477
+ .ds-navbar__sheet-list,
478
+ .ds-navbar__sheet-group ul {
479
+ display: grid;
480
+ gap: var(--space-0-5);
481
+ list-style: none;
482
+ margin: 0;
483
+ padding: 0;
484
+ }
485
+
486
+ .ds-navbar__sheet-link {
487
+ align-items: center;
488
+ border-radius: var(--navbar-row-radius);
489
+ color: var(--navbar-row-fg);
490
+ cursor: pointer;
491
+ display: flex;
492
+ font-size: var(--navbar-sheet-row-size);
493
+ font-weight: var(--weight-medium);
494
+ gap: var(--space-3);
495
+ list-style: none;
496
+ min-height: var(--navbar-sheet-row-height);
497
+ padding-inline: var(--space-3);
498
+ text-decoration: none;
499
+ transition: background-color var(--duration-fast) var(--ease-standard);
500
+ }
501
+
502
+ .ds-navbar__sheet-link::-webkit-details-marker {
503
+ display: none;
504
+ }
505
+
506
+ .ds-navbar__sheet-link .ds-navbar__chevron {
507
+ margin-inline-start: auto;
508
+ }
509
+
510
+ .ds-navbar__sheet-link:hover {
511
+ background: var(--navbar-row-bg-hover);
512
+ }
513
+
514
+ .ds-navbar__sheet-panel {
515
+ display: grid;
516
+ gap: var(--space-1);
517
+ padding: var(--space-1) 0 var(--space-2) var(--space-3);
518
+ }
519
+
520
+ .ds-navbar__sheet-group .ds-navbar__eyebrow {
521
+ padding-inline: var(--space-3);
522
+ }
523
+
524
+ .ds-navbar__sheet-sublink {
525
+ border-radius: var(--navbar-row-radius);
526
+ color: var(--navbar-row-fg);
527
+ display: grid;
528
+ gap: var(--space-0-5);
529
+ padding: var(--space-2) var(--space-3);
530
+ text-decoration: none;
531
+ transition: background-color var(--duration-fast) var(--ease-standard);
532
+ }
533
+
534
+ .ds-navbar__sheet-sublink:hover {
535
+ background: var(--navbar-row-bg-hover);
536
+ }
537
+
538
+ /* In the menu the current page gets the tint; its section keeps an accent
539
+ icon so the open disclosure points at it. */
540
+ .ds-navbar__sheet-link[aria-current="page"],
541
+ .ds-navbar__sheet-sublink[aria-current="page"] {
542
+ background: var(--navbar-row-bg-current);
543
+ }
544
+
545
+ .ds-navbar__sheet-link.is-current .ds-icon:not(.ds-navbar__chevron),
546
+ .ds-navbar__sheet-link[aria-current="page"] .ds-icon {
547
+ color: var(--navbar-current-icon-fg);
548
+ }
549
+
550
+ /* Footer: secondary links in two columns, then full-width actions. */
551
+ .ds-navbar__sheet-footer {
552
+ border-top: 1px solid var(--navbar-sheet-border);
553
+ display: grid;
554
+ gap: var(--space-5);
555
+ margin-block-start: auto;
556
+ padding: var(--space-5) var(--navbar-sheet-padding)
557
+ var(--navbar-sheet-padding);
558
+ }
559
+
560
+ .ds-navbar__sheet-meta {
561
+ display: grid;
562
+ gap: var(--space-3) var(--space-4);
563
+ grid-template-columns: repeat(2, minmax(0, 1fr));
564
+ list-style: none;
565
+ margin: 0;
566
+ padding: 0;
567
+ }
568
+
569
+ .ds-navbar__sheet-meta a {
570
+ border-radius: var(--radius-xs);
571
+ color: var(--navbar-sheet-meta-fg);
572
+ font-size: var(--text-sm);
573
+ font-weight: var(--weight-medium);
574
+ text-decoration: none;
575
+ }
576
+
577
+ .ds-navbar__sheet-meta a:hover {
578
+ color: var(--navbar-row-fg);
579
+ }
580
+
581
+ .ds-navbar__sheet-meta a:focus-visible {
582
+ outline: var(--navbar-focus-width) solid var(--navbar-focus-color);
583
+ outline-offset: var(--navbar-focus-offset);
584
+ }
585
+
586
+ .ds-navbar__sheet-actions {
587
+ display: grid;
588
+ gap: var(--space-2);
589
+ }
590
+
591
+ /* Collapse ---------------------------------------------------------------
592
+ With script, the bar collapses exactly when its full row no longer fits
593
+ (data-collapsed). Without script, a container query collapses it below
594
+ 720px of its own width. */
595
+ .ds-navbar[data-collapsed="true"] .ds-navbar__nav {
596
+ display: none;
597
+ }
598
+
599
+ .ds-navbar[data-collapsed="true"] .ds-navbar__toggle {
600
+ display: inline-flex;
601
+ }
602
+
603
+ .ds-navbar[data-collapsed="true"] .ds-navbar__brand ~ .ds-navbar__start {
604
+ display: none;
605
+ }
606
+
607
+ @container ds-navbar (max-width: 719px) {
608
+ .ds-navbar:not([data-collapsed]) .ds-navbar__nav {
609
+ display: none;
610
+ }
611
+
612
+ .ds-navbar:not([data-collapsed]) .ds-navbar__toggle {
613
+ display: inline-flex;
614
+ }
615
+
616
+ .ds-navbar:not([data-collapsed]) .ds-navbar__brand ~ .ds-navbar__start {
617
+ display: none;
618
+ }
619
+ }
620
+
621
+ @container ds-navbar (max-width: 719px) {
622
+ .ds-navbar__inner {
623
+ padding-inline: var(--space-4);
624
+ }
625
+ }
626
+
627
+ @keyframes ds-navbar-viewport-in {
628
+ from {
629
+ opacity: 0;
630
+ transform: translateX(var(--ds-navbar-viewport-x, 0))
631
+ translateY(calc(-1 * var(--space-1)));
632
+ }
633
+ }
634
+
635
+ @keyframes ds-navbar-panel-in {
636
+ from {
637
+ opacity: 0;
638
+ }
639
+ }
640
+
641
+ @keyframes ds-navbar-sheet-in {
642
+ from {
643
+ opacity: 0;
644
+ transform: translateY(calc(-1 * var(--space-2))) scale(0.98);
645
+ }
646
+ }
647
+
648
+ @media (prefers-reduced-motion: reduce) {
649
+ .ds-navbar__viewport,
650
+ .ds-navbar__viewport[data-instant="true"],
651
+ .ds-navbar__panel:not([hidden]),
652
+ .ds-navbar__sheet[open],
653
+ .ds-navbar__chevron {
654
+ animation: none;
655
+ transition: none;
656
+ }
657
+ }
658
+ }
@@ -0,0 +1,62 @@
1
+ @layer reset, tokens, base, components, motion, utilities;
2
+
3
+ @layer components {
4
+ .ds-page-header {
5
+ display: grid;
6
+ gap: var(--page-header-gap);
7
+ grid-template-columns: minmax(0, 1fr);
8
+ }
9
+
10
+ .ds-page-header__title {
11
+ color: var(--page-header-title-fg);
12
+ font-size: var(--page-header-title-size);
13
+ letter-spacing: var(--page-header-title-tracking);
14
+ line-height: var(--page-header-title-leading);
15
+ max-width: var(--page-header-title-max);
16
+ text-wrap: balance;
17
+ }
18
+
19
+ .ds-page-header__lede {
20
+ color: var(--page-header-lede-fg);
21
+ font-size: var(--page-header-lede-size);
22
+ line-height: var(--page-header-lede-leading);
23
+ max-width: var(--page-header-lede-max);
24
+ }
25
+
26
+ .ds-page-header__meta {
27
+ align-items: center;
28
+ display: flex;
29
+ flex-wrap: wrap;
30
+ gap: var(--page-header-meta-gap);
31
+ }
32
+
33
+ .ds-page-header__actions {
34
+ align-items: center;
35
+ display: flex;
36
+ flex-wrap: wrap;
37
+ gap: var(--page-header-actions-gap);
38
+ margin-block-start: var(--page-header-actions-margin);
39
+ }
40
+
41
+ .ds-page-header__meta:empty,
42
+ .ds-page-header__lede:empty,
43
+ .ds-page-header__actions:empty {
44
+ display: none;
45
+ }
46
+
47
+ .ds-page-header--display .ds-page-header__title {
48
+ font-size: var(--page-header-display-size);
49
+ letter-spacing: var(--page-header-display-tracking);
50
+ line-height: var(--page-header-display-leading);
51
+ max-width: var(--page-header-title-max);
52
+ }
53
+
54
+ .ds-page-header--display .ds-page-header__lede {
55
+ margin-block-start: var(--space-1);
56
+ }
57
+
58
+ .ds-page-header__title em {
59
+ color: var(--page-header-emphasis-fg);
60
+ font-style: normal;
61
+ }
62
+ }