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