@sierragridteam/design-system 0.0.0-stage → 0.3.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 (38) hide show
  1. package/README.md +17 -2
  2. package/assets/sierra-logo-full.png +0 -0
  3. package/assets/sierra-mark.png +0 -0
  4. package/package.json +35 -4
  5. package/src/components/Badge.astro +13 -0
  6. package/src/components/Button.astro +36 -0
  7. package/src/components/Callout.astro +17 -0
  8. package/src/components/Card.astro +33 -0
  9. package/src/components/CopyButton.astro +81 -0
  10. package/src/components/DataDiff.astro +50 -0
  11. package/src/components/DataRow.astro +23 -0
  12. package/src/components/DataStatus.astro +26 -0
  13. package/src/components/DataTable.astro +25 -0
  14. package/src/components/EmptyState.astro +17 -0
  15. package/src/components/Field.astro +25 -0
  16. package/src/components/FilterBar.astro +10 -0
  17. package/src/components/GeoJSONMap.astro +280 -0
  18. package/src/components/GeometryPreview.astro +11 -0
  19. package/src/components/Icon.astro +19 -0
  20. package/src/components/IconSprite.astro +68 -0
  21. package/src/components/IdentifierList.astro +54 -0
  22. package/src/components/Logo.astro +75 -0
  23. package/src/components/MapFrame.astro +25 -0
  24. package/src/components/MetricGrid.astro +35 -0
  25. package/src/components/PageHeader.astro +24 -0
  26. package/src/components/Select.astro +202 -0
  27. package/src/components/ValueTable.astro +32 -0
  28. package/src/lib/basemap-style.ts +269 -0
  29. package/src/lib/controls.ts +126 -0
  30. package/src/lib/data-values.ts +45 -0
  31. package/src/lib/dialog.ts +85 -0
  32. package/src/lib/dom.ts +68 -0
  33. package/src/lib/toast.ts +22 -0
  34. package/src/styles/base.css +165 -0
  35. package/src/styles/components.css +2235 -0
  36. package/src/styles/global.css +4 -0
  37. package/src/styles/shell.css +501 -0
  38. package/src/styles/tokens.css +172 -0
@@ -0,0 +1,2235 @@
1
+ /**
2
+ * Global component classes.
3
+ *
4
+ * These are global (not Astro-scoped) on purpose: most member UI is rendered in
5
+ * the browser from data, and client-rendered DOM cannot pick up scoped styles.
6
+ * The .astro components in src/components/ are thin wrappers that emit these
7
+ * classes. Reference and examples: /styleguide.
8
+ */
9
+
10
+ /* ------------------------------------------------------------------------ */
11
+ /* Text roles */
12
+ /* ------------------------------------------------------------------------ */
13
+ .kicker {
14
+ display: inline-block;
15
+ font-family: var(--font-ui);
16
+ font-size: var(--fs-label);
17
+ font-weight: var(--fw-semibold);
18
+ letter-spacing: var(--tracking-kicker);
19
+ text-transform: uppercase;
20
+ color: var(--brand-brass-text);
21
+ }
22
+
23
+ .label {
24
+ font-family: var(--font-ui);
25
+ font-size: var(--fs-label);
26
+ font-weight: var(--fw-semibold);
27
+ letter-spacing: var(--tracking-label);
28
+ text-transform: uppercase;
29
+ color: var(--ink-secondary);
30
+ }
31
+
32
+ .lead {
33
+ font-size: var(--fs-lead);
34
+ color: var(--ink-secondary);
35
+ max-width: 60ch;
36
+ }
37
+
38
+ .meta {
39
+ font-size: var(--fs-small);
40
+ color: var(--ink-muted);
41
+ }
42
+
43
+ .mono {
44
+ font-family: var(--font-mono);
45
+ font-variant-numeric: tabular-nums;
46
+ }
47
+
48
+ .muted {
49
+ color: var(--ink-muted);
50
+ }
51
+
52
+ .prose {
53
+ max-width: 66ch;
54
+ font-size: var(--fs-body);
55
+ line-height: var(--lh-body);
56
+ }
57
+
58
+ .prose > * + * {
59
+ margin-top: var(--space-3);
60
+ }
61
+
62
+ .prose > :first-child {
63
+ margin-top: 0;
64
+ }
65
+
66
+ /* Notes are written by volunteers in Markdown; every heading level maps to a calm sans heading. */
67
+ .prose h1,
68
+ .prose h2 {
69
+ font-family: var(--font-display);
70
+ font-size: var(--fs-h2);
71
+ font-weight: var(--fw-medium);
72
+ line-height: var(--lh-heading);
73
+ color: var(--ink-strong);
74
+ margin-top: var(--space-6);
75
+ }
76
+
77
+ .prose h3,
78
+ .prose h4,
79
+ .prose h5,
80
+ .prose h6 {
81
+ font-family: var(--font-ui);
82
+ font-size: var(--fs-h3);
83
+ font-weight: var(--fw-semibold);
84
+ color: var(--ink-strong);
85
+ margin-top: var(--space-5);
86
+ }
87
+
88
+ .prose h4,
89
+ .prose h5,
90
+ .prose h6 {
91
+ font-size: var(--fs-ui);
92
+ letter-spacing: var(--tracking-label);
93
+ text-transform: uppercase;
94
+ color: var(--ink-secondary);
95
+ }
96
+
97
+ .prose :is(h1, h2, h3, h4, h5, h6) + * {
98
+ margin-top: var(--space-2);
99
+ }
100
+
101
+ .prose strong {
102
+ font-weight: var(--fw-semibold);
103
+ color: var(--ink-strong);
104
+ }
105
+
106
+ .prose a {
107
+ color: var(--brand-green);
108
+ text-decoration: underline;
109
+ text-underline-offset: 2px;
110
+ }
111
+
112
+ .prose ul,
113
+ .prose ol {
114
+ padding-left: var(--space-5);
115
+ }
116
+
117
+ .prose li + li,
118
+ .prose li > ul,
119
+ .prose li > ol {
120
+ margin-top: var(--space-1);
121
+ }
122
+
123
+ .prose li::marker {
124
+ color: var(--brand-brass-text);
125
+ }
126
+
127
+ /* GitHub-style task lists: "- [ ] item" */
128
+ .prose li:has(> input[type="checkbox"]) {
129
+ list-style: none;
130
+ margin-left: calc(-1 * var(--space-5));
131
+ }
132
+
133
+ .prose input[type="checkbox"] {
134
+ margin-right: var(--space-2);
135
+ accent-color: var(--brand-green);
136
+ vertical-align: -1px;
137
+ }
138
+
139
+ .prose blockquote {
140
+ padding: var(--space-3) var(--space-4);
141
+ border-left: 3px solid var(--brand-brass);
142
+ background: var(--surface-banner);
143
+ color: var(--ink-body);
144
+ }
145
+
146
+ .prose blockquote > * + * {
147
+ margin-top: var(--space-2);
148
+ }
149
+
150
+ .prose code {
151
+ padding: 1px var(--space-1);
152
+ background: var(--surface-banner);
153
+ border-radius: var(--radius-sm);
154
+ font-family: var(--font-mono);
155
+ font-size: var(--fs-small);
156
+ }
157
+
158
+ .prose pre {
159
+ padding: var(--space-3) var(--space-4);
160
+ background: var(--surface-banner);
161
+ border: var(--border);
162
+ border-radius: var(--radius);
163
+ overflow: auto;
164
+ }
165
+
166
+ .prose pre code {
167
+ padding: 0;
168
+ background: none;
169
+ }
170
+
171
+ .prose hr {
172
+ border: 0;
173
+ border-top: var(--border);
174
+ margin: var(--space-5) 0;
175
+ }
176
+
177
+ .prose img {
178
+ max-width: 100%;
179
+ height: auto;
180
+ border-radius: var(--radius);
181
+ }
182
+
183
+ .prose table {
184
+ display: block;
185
+ max-width: 100%;
186
+ overflow-x: auto;
187
+ border-collapse: collapse;
188
+ font-size: var(--fs-ui);
189
+ }
190
+
191
+ .prose th,
192
+ .prose td {
193
+ padding: var(--space-2) var(--space-3);
194
+ border: var(--border-soft);
195
+ text-align: left;
196
+ vertical-align: top;
197
+ }
198
+
199
+ .prose th {
200
+ background: var(--surface-banner);
201
+ font-weight: var(--fw-semibold);
202
+ color: var(--ink-strong);
203
+ }
204
+
205
+ /* ------------------------------------------------------------------------ */
206
+ /* Buttons */
207
+ /* ------------------------------------------------------------------------ */
208
+ .btn {
209
+ display: inline-flex;
210
+ align-items: center;
211
+ justify-content: center;
212
+ gap: var(--space-2);
213
+ min-height: var(--control-h);
214
+ padding: 0 var(--space-4);
215
+ border: var(--border-w) solid transparent;
216
+ border-radius: var(--radius-sm);
217
+ background: transparent;
218
+ font-family: var(--font-ui);
219
+ font-size: var(--fs-label-lg);
220
+ font-weight: var(--fw-semibold);
221
+ letter-spacing: var(--tracking-label);
222
+ text-transform: uppercase;
223
+ text-decoration: none;
224
+ line-height: 1;
225
+ white-space: nowrap;
226
+ cursor: pointer;
227
+ transition:
228
+ background-color var(--transition),
229
+ border-color var(--transition),
230
+ color var(--transition);
231
+ }
232
+
233
+ .btn:hover {
234
+ text-decoration: none;
235
+ }
236
+
237
+ .btn:disabled,
238
+ .btn[aria-disabled="true"] {
239
+ opacity: 0.55;
240
+ cursor: not-allowed;
241
+ }
242
+
243
+ .btn--primary {
244
+ background: var(--brand-green);
245
+ border-color: var(--brand-green);
246
+ color: var(--surface-page);
247
+ }
248
+
249
+ .btn--primary:hover:not(:disabled) {
250
+ background: var(--brand-green-hover);
251
+ border-color: var(--brand-green-hover);
252
+ color: var(--surface-page);
253
+ }
254
+
255
+ .btn--secondary {
256
+ background: color-mix(in srgb, var(--brand-brass) 8%, transparent);
257
+ border-color: var(--brand-brass);
258
+ color: var(--brand-brass-text);
259
+ }
260
+
261
+ .btn--secondary:hover:not(:disabled) {
262
+ background: color-mix(in srgb, var(--brand-brass) 16%, transparent);
263
+ color: var(--brand-brass-text);
264
+ }
265
+
266
+ .btn--ghost {
267
+ border-color: transparent;
268
+ color: var(--ink-secondary);
269
+ }
270
+
271
+ .btn--ghost:hover:not(:disabled) {
272
+ background: var(--surface-card);
273
+ color: var(--brand-green);
274
+ }
275
+
276
+ .btn--outline {
277
+ border-color: var(--line-control);
278
+ color: var(--ink-body);
279
+ background: var(--surface-raised);
280
+ }
281
+
282
+ .btn--outline:hover:not(:disabled) {
283
+ border-color: var(--brand-green);
284
+ color: var(--brand-green);
285
+ }
286
+
287
+ /* Destructive: the sanctioned use of orange in the app. */
288
+ .btn--danger {
289
+ background: var(--signal-orange);
290
+ border-color: var(--signal-orange);
291
+ color: var(--surface-page);
292
+ }
293
+
294
+ .btn--danger:hover:not(:disabled) {
295
+ background: var(--signal-orange-hover);
296
+ border-color: var(--signal-orange-hover);
297
+ color: var(--surface-page);
298
+ }
299
+
300
+ .btn--sm {
301
+ min-height: var(--control-h-sm);
302
+ padding: 0 var(--space-3);
303
+ font-size: var(--fs-label);
304
+ }
305
+
306
+ .btn--block {
307
+ display: flex;
308
+ width: 100%;
309
+ }
310
+
311
+ .btn .icon {
312
+ width: 16px;
313
+ height: 16px;
314
+ }
315
+
316
+ /* Square, icon-only; always give it an aria-label. */
317
+ .btn--icon {
318
+ width: var(--control-h-sm);
319
+ padding: 0;
320
+ }
321
+
322
+ .btn.is-busy {
323
+ position: relative;
324
+ color: transparent !important;
325
+ }
326
+
327
+ .btn.is-busy::after {
328
+ content: "";
329
+ position: absolute;
330
+ width: 14px;
331
+ height: 14px;
332
+ border: 2px solid currentcolor;
333
+ border-right-color: transparent;
334
+ border-radius: 50%;
335
+ color: var(--surface-page);
336
+ animation: spin 0.8s linear infinite;
337
+ }
338
+
339
+ .btn--secondary.is-busy::after,
340
+ .btn--ghost.is-busy::after,
341
+ .btn--outline.is-busy::after {
342
+ color: var(--brand-brass-text);
343
+ }
344
+
345
+ @keyframes spin {
346
+ to {
347
+ transform: rotate(360deg);
348
+ }
349
+ }
350
+
351
+ /* ------------------------------------------------------------------------ */
352
+ /* Icons */
353
+ /* ------------------------------------------------------------------------ */
354
+ .icon {
355
+ width: var(--icon);
356
+ height: var(--icon);
357
+ flex: 0 0 auto;
358
+ fill: none;
359
+ stroke: currentcolor;
360
+ stroke-width: 1.75;
361
+ stroke-linecap: round;
362
+ stroke-linejoin: round;
363
+ }
364
+
365
+ .icon--lg {
366
+ width: var(--icon-lg);
367
+ height: var(--icon-lg);
368
+ }
369
+
370
+ /* ------------------------------------------------------------------------ */
371
+ /* Cards & panels */
372
+ /* ------------------------------------------------------------------------ */
373
+ .card {
374
+ background: var(--surface-card);
375
+ border: var(--border);
376
+ border-radius: var(--radius);
377
+ box-shadow: none;
378
+ }
379
+
380
+ .card--padded {
381
+ padding: var(--space-5);
382
+ }
383
+
384
+ .card--raised {
385
+ background: var(--surface-raised);
386
+ }
387
+
388
+ .card--banner {
389
+ background: var(--surface-banner);
390
+ }
391
+
392
+ .card__header {
393
+ display: flex;
394
+ align-items: center;
395
+ justify-content: space-between;
396
+ gap: var(--space-3);
397
+ padding: var(--space-3) var(--space-5);
398
+ border-bottom: var(--border);
399
+ }
400
+
401
+ .card__title {
402
+ font-family: var(--font-ui);
403
+ font-size: var(--fs-h3);
404
+ font-weight: var(--fw-semibold);
405
+ color: var(--ink-strong);
406
+ }
407
+
408
+ .card__body {
409
+ padding: var(--space-5);
410
+ }
411
+
412
+ .card__footer {
413
+ padding: var(--space-3) var(--space-5);
414
+ border-top: var(--border-soft);
415
+ background: var(--surface-banner);
416
+ border-radius: 0 0 var(--radius) var(--radius);
417
+ }
418
+
419
+ /* Callout: banner surface with a coloured rule. */
420
+ .callout {
421
+ padding: var(--space-3) var(--space-4);
422
+ background: var(--surface-banner);
423
+ border: var(--border);
424
+ border-left: 3px solid var(--brand-green);
425
+ border-radius: var(--radius);
426
+ font-size: var(--fs-ui);
427
+ }
428
+
429
+ .callout--brass {
430
+ border-left-color: var(--brand-brass);
431
+ }
432
+
433
+ .callout--orange {
434
+ border-left-color: var(--signal-orange);
435
+ }
436
+
437
+ .callout__title {
438
+ display: block;
439
+ margin-bottom: var(--space-1);
440
+ font-size: var(--fs-label);
441
+ font-weight: var(--fw-semibold);
442
+ letter-spacing: var(--tracking-label);
443
+ text-transform: uppercase;
444
+ color: var(--ink-secondary);
445
+ }
446
+
447
+ /* ------------------------------------------------------------------------ */
448
+ /* Page header */
449
+ /* ------------------------------------------------------------------------ */
450
+ .page-header {
451
+ display: flex;
452
+ align-items: flex-end;
453
+ justify-content: space-between;
454
+ gap: var(--space-4);
455
+ padding-bottom: var(--space-5);
456
+ margin-bottom: var(--space-6);
457
+ border-bottom: var(--border);
458
+ }
459
+
460
+ .page-header__text {
461
+ display: flex;
462
+ flex-direction: column;
463
+ gap: var(--space-2);
464
+ min-width: 0;
465
+ }
466
+
467
+ .page-header__actions {
468
+ display: flex;
469
+ gap: var(--space-2);
470
+ flex-wrap: wrap;
471
+ }
472
+
473
+ .section-header {
474
+ display: flex;
475
+ align-items: baseline;
476
+ justify-content: space-between;
477
+ gap: var(--space-3);
478
+ margin-bottom: var(--space-3);
479
+ }
480
+
481
+ .section-header p {
482
+ font-size: var(--fs-ui);
483
+ color: var(--ink-secondary);
484
+ }
485
+
486
+ .stack > * + * {
487
+ margin-top: var(--section-gap);
488
+ }
489
+
490
+ /* ------------------------------------------------------------------------ */
491
+ /* Lists & rows — the workhorse of the resources and admin pages */
492
+ /* ------------------------------------------------------------------------ */
493
+ .list {
494
+ list-style: none;
495
+ margin: 0;
496
+ padding: 0;
497
+ background: var(--surface-card);
498
+ border: var(--border);
499
+ border-radius: var(--radius);
500
+ }
501
+
502
+ .row {
503
+ display: flex;
504
+ align-items: center;
505
+ gap: var(--space-3);
506
+ min-height: var(--row-h);
507
+ padding: var(--space-2) var(--space-4);
508
+ color: inherit;
509
+ text-decoration: none;
510
+ transition: background-color var(--transition);
511
+ }
512
+
513
+ .row + .row,
514
+ .list > li + li > .row {
515
+ border-top: var(--border-soft);
516
+ }
517
+
518
+ a.row:hover,
519
+ button.row:hover {
520
+ background: var(--surface-raised);
521
+ text-decoration: none;
522
+ color: inherit;
523
+ }
524
+
525
+ button.row {
526
+ width: 100%;
527
+ border: 0;
528
+ background: none;
529
+ text-align: left;
530
+ }
531
+
532
+ .row__icon {
533
+ color: var(--ink-muted);
534
+ }
535
+
536
+ a.row:hover .row__icon,
537
+ button.row:hover .row__icon {
538
+ color: var(--brand-green);
539
+ }
540
+
541
+ .row__main {
542
+ flex: 1 1 auto;
543
+ min-width: 0;
544
+ display: flex;
545
+ flex-direction: column;
546
+ gap: 2px;
547
+ }
548
+
549
+ .row__title {
550
+ font-size: var(--fs-ui);
551
+ font-weight: var(--fw-medium);
552
+ color: var(--ink-strong);
553
+ overflow: hidden;
554
+ text-overflow: ellipsis;
555
+ white-space: nowrap;
556
+ }
557
+
558
+ .row__title--wrap {
559
+ white-space: normal;
560
+ }
561
+
562
+ .row__desc {
563
+ font-size: var(--fs-small);
564
+ color: var(--ink-secondary);
565
+ }
566
+
567
+ .row__meta {
568
+ display: flex;
569
+ flex-wrap: wrap;
570
+ align-items: center;
571
+ gap: var(--space-1) var(--space-2);
572
+ }
573
+
574
+ .row__aside {
575
+ display: flex;
576
+ align-items: center;
577
+ gap: var(--space-2);
578
+ font-size: var(--fs-small);
579
+ color: var(--ink-muted);
580
+ flex: 0 0 auto;
581
+ }
582
+
583
+ .row__chevron {
584
+ color: var(--ink-muted);
585
+ }
586
+
587
+ .row--static:hover {
588
+ background: none;
589
+ }
590
+
591
+ .row.is-selected,
592
+ .row.is-selected:hover {
593
+ background: var(--brand-green-tint);
594
+ }
595
+
596
+ .row.is-selected .row__icon {
597
+ color: var(--brand-green);
598
+ }
599
+
600
+ .row__file {
601
+ max-width: 22ch;
602
+ overflow: hidden;
603
+ text-overflow: ellipsis;
604
+ white-space: nowrap;
605
+ }
606
+
607
+ /* A list inside a card: the card draws the frame. */
608
+ .list--flush {
609
+ border: 0;
610
+ border-radius: 0;
611
+ background: none;
612
+ }
613
+
614
+ /* ------------------------------------------------------------------------ */
615
+ /* Tables */
616
+ /* ------------------------------------------------------------------------ */
617
+ .table-wrap {
618
+ overflow-x: auto;
619
+ background: var(--surface-card);
620
+ border: var(--border);
621
+ border-radius: var(--radius);
622
+ }
623
+
624
+ .table {
625
+ width: 100%;
626
+ border-collapse: collapse;
627
+ font-size: var(--fs-ui);
628
+ }
629
+
630
+ .table th {
631
+ padding: var(--space-2) var(--space-4);
632
+ text-align: left;
633
+ font-size: var(--fs-label);
634
+ font-weight: var(--fw-semibold);
635
+ letter-spacing: var(--tracking-label);
636
+ text-transform: uppercase;
637
+ color: var(--ink-secondary);
638
+ background: var(--surface-banner);
639
+ border-bottom: var(--border);
640
+ white-space: nowrap;
641
+ }
642
+
643
+ .table td {
644
+ padding: var(--space-2) var(--space-4);
645
+ height: var(--row-h);
646
+ border-top: var(--border-soft);
647
+ vertical-align: middle;
648
+ }
649
+
650
+ .table tr:first-child td {
651
+ border-top: 0;
652
+ }
653
+
654
+ .table tbody tr:hover td {
655
+ background: var(--surface-raised);
656
+ }
657
+
658
+ .table td.is-num {
659
+ font-family: var(--font-mono);
660
+ font-variant-numeric: tabular-nums;
661
+ text-align: right;
662
+ }
663
+
664
+ .table td.is-actions {
665
+ text-align: right;
666
+ white-space: nowrap;
667
+ }
668
+
669
+ /* Date cells may carry a data-label ("Joined"); it only shows once rows become cards. */
670
+ .table td[data-label]::before {
671
+ content: none;
672
+ }
673
+
674
+ /* ------------------------------------------------------------------------ */
675
+ /* Badges & status */
676
+ /* ------------------------------------------------------------------------ */
677
+ .badge {
678
+ display: inline-flex;
679
+ align-items: center;
680
+ gap: 6px;
681
+ height: 22px;
682
+ padding: 0 var(--space-2);
683
+ border: var(--border-w) solid transparent;
684
+ border-radius: var(--radius-sm);
685
+ font-family: var(--font-ui);
686
+ font-size: var(--fs-label);
687
+ font-weight: var(--fw-semibold);
688
+ letter-spacing: var(--tracking-label);
689
+ text-transform: uppercase;
690
+ white-space: nowrap;
691
+ color: var(--ink-secondary);
692
+ background: var(--surface-banner);
693
+ border-color: var(--line);
694
+ }
695
+
696
+ .badge::before {
697
+ content: "";
698
+ width: 7px;
699
+ height: 7px;
700
+ border-radius: 50%;
701
+ background: var(--state-muted);
702
+ }
703
+
704
+ .badge--ok {
705
+ color: var(--brand-green);
706
+ background: var(--brand-green-tint);
707
+ border-color: color-mix(in srgb, var(--brand-green) 30%, transparent);
708
+ }
709
+
710
+ .badge--ok::before {
711
+ background: var(--state-ok);
712
+ }
713
+
714
+ .badge--elevated {
715
+ color: var(--brand-brass-text);
716
+ background: var(--brand-brass-tint);
717
+ border-color: color-mix(in srgb, var(--brand-brass) 45%, transparent);
718
+ }
719
+
720
+ .badge--elevated::before {
721
+ background: var(--state-elevated);
722
+ }
723
+
724
+ .badge--alarm {
725
+ color: var(--signal-orange-text);
726
+ background: var(--signal-orange-tint);
727
+ border-color: color-mix(in srgb, var(--signal-orange) 35%, transparent);
728
+ }
729
+
730
+ .badge--alarm::before {
731
+ background: var(--state-alarm);
732
+ }
733
+
734
+ .badge--deep {
735
+ color: var(--ink-on-deep);
736
+ background: var(--surface-deep);
737
+ border-color: var(--surface-deep);
738
+ }
739
+
740
+ .badge--deep::before {
741
+ background: var(--brand-brass);
742
+ }
743
+
744
+ .badge--plain::before {
745
+ display: none;
746
+ }
747
+
748
+ .pill {
749
+ display: inline-flex;
750
+ align-items: center;
751
+ height: 22px;
752
+ padding: 0 var(--space-3);
753
+ border-radius: var(--radius-pill);
754
+ background: var(--surface-banner);
755
+ border: var(--border);
756
+ font-size: var(--fs-small);
757
+ color: var(--ink-secondary);
758
+ }
759
+
760
+ /* ------------------------------------------------------------------------ */
761
+ /* Forms */
762
+ /* ------------------------------------------------------------------------ */
763
+ .form {
764
+ display: flex;
765
+ flex-direction: column;
766
+ gap: var(--space-5);
767
+ }
768
+
769
+ .form__row {
770
+ display: grid;
771
+ grid-template-columns: 1fr 1fr;
772
+ gap: var(--space-4);
773
+ }
774
+
775
+ .field {
776
+ display: flex;
777
+ flex-direction: column;
778
+ gap: var(--space-2);
779
+ }
780
+
781
+ .field__label {
782
+ font-family: var(--font-ui);
783
+ font-size: var(--fs-label);
784
+ font-weight: var(--fw-semibold);
785
+ letter-spacing: var(--tracking-label);
786
+ text-transform: uppercase;
787
+ color: var(--ink-secondary);
788
+ }
789
+
790
+ .field__optional {
791
+ margin-left: var(--space-1);
792
+ color: var(--ink-muted);
793
+ font-weight: var(--fw-regular);
794
+ text-transform: none;
795
+ letter-spacing: 0;
796
+ }
797
+
798
+ .input,
799
+ .select,
800
+ .textarea {
801
+ width: 100%;
802
+ min-height: var(--control-h);
803
+ padding: 0 var(--space-3);
804
+ background: var(--surface-raised);
805
+ border: var(--border-w) solid var(--line-control);
806
+ border-radius: var(--radius-sm);
807
+ font-family: var(--font-ui);
808
+ font-size: var(--fs-body);
809
+ color: var(--ink-strong);
810
+ transition: border-color var(--transition);
811
+ }
812
+
813
+ .textarea {
814
+ padding: var(--space-2) var(--space-3);
815
+ min-height: 120px;
816
+ resize: vertical;
817
+ }
818
+
819
+ .input:focus,
820
+ .select:focus,
821
+ .textarea:focus {
822
+ outline: 2px solid var(--brand-green);
823
+ outline-offset: 1px;
824
+ border-color: var(--brand-green);
825
+ }
826
+
827
+ .input[aria-invalid="true"] {
828
+ border-color: var(--signal-orange);
829
+ }
830
+
831
+ .input--code {
832
+ font-family: var(--font-mono);
833
+ font-size: var(--fs-code);
834
+ letter-spacing: 0.35em;
835
+ text-align: center;
836
+ min-height: 56px;
837
+ }
838
+
839
+ .field__help {
840
+ font-size: var(--fs-small);
841
+ color: var(--ink-muted);
842
+ }
843
+
844
+ .field__error {
845
+ font-size: var(--fs-small);
846
+ color: var(--signal-orange-text);
847
+ }
848
+
849
+ .form__actions {
850
+ display: flex;
851
+ gap: var(--space-2);
852
+ align-items: center;
853
+ flex-wrap: wrap;
854
+ }
855
+
856
+ .form__error {
857
+ padding: var(--space-3) var(--space-4);
858
+ background: var(--surface-banner);
859
+ border: var(--border);
860
+ border-left: 3px solid var(--signal-orange);
861
+ border-radius: var(--radius);
862
+ font-size: var(--fs-ui);
863
+ color: var(--ink-body);
864
+ }
865
+
866
+ fieldset.field {
867
+ margin: 0;
868
+ padding: 0;
869
+ border: 0;
870
+ min-width: 0;
871
+ }
872
+
873
+ fieldset.field > legend {
874
+ padding: 0;
875
+ margin-bottom: var(--space-2);
876
+ }
877
+
878
+ /* Choice cards: big targets for "pick one" (resource type, visibility). */
879
+ .choices {
880
+ display: grid;
881
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
882
+ gap: var(--space-3);
883
+ }
884
+
885
+ .choice {
886
+ display: flex;
887
+ flex-direction: column;
888
+ align-items: flex-start;
889
+ gap: var(--space-1);
890
+ padding: var(--space-4);
891
+ background: var(--surface-raised);
892
+ border: var(--border-w) solid var(--line);
893
+ border-radius: var(--radius);
894
+ font-family: var(--font-ui);
895
+ text-align: left;
896
+ color: inherit;
897
+ cursor: pointer;
898
+ transition:
899
+ border-color var(--transition),
900
+ background-color var(--transition);
901
+ }
902
+
903
+ .choice:hover {
904
+ border-color: var(--brand-green);
905
+ }
906
+
907
+ .choice.is-selected {
908
+ border-color: var(--brand-green);
909
+ background: var(--brand-green-tint);
910
+ box-shadow: inset 0 0 0 1px var(--brand-green);
911
+ }
912
+
913
+ .choice:has(:focus-visible) {
914
+ outline: 2px solid var(--brand-green);
915
+ outline-offset: 2px;
916
+ }
917
+
918
+ .choice.is-disabled {
919
+ opacity: 0.55;
920
+ cursor: not-allowed;
921
+ }
922
+
923
+ .choice.is-disabled:hover {
924
+ border-color: var(--line);
925
+ }
926
+
927
+ .choice__icon {
928
+ display: inline-grid;
929
+ place-items: center;
930
+ width: 40px;
931
+ height: 40px;
932
+ margin-bottom: var(--space-2);
933
+ border-radius: 50%;
934
+ background: var(--brand-brass-tint);
935
+ color: var(--brand-brass-text);
936
+ }
937
+
938
+ .choice.is-selected .choice__icon {
939
+ background: var(--brand-green);
940
+ color: var(--surface-page);
941
+ }
942
+
943
+ .choice__label {
944
+ font-size: var(--fs-body);
945
+ font-weight: var(--fw-semibold);
946
+ color: var(--ink-strong);
947
+ }
948
+
949
+ .choice__text {
950
+ font-size: var(--fs-small);
951
+ line-height: var(--lh-ui);
952
+ color: var(--ink-secondary);
953
+ }
954
+
955
+ .choices--compact .choice {
956
+ display: grid;
957
+ grid-template-columns: auto 1fr;
958
+ column-gap: var(--space-3);
959
+ align-items: center;
960
+ padding: var(--space-3) var(--space-4);
961
+ }
962
+
963
+ .choices--compact .choice__icon {
964
+ grid-row: span 2;
965
+ width: 32px;
966
+ height: 32px;
967
+ margin: 0;
968
+ }
969
+
970
+ /* ------------------------------------------------------------------------ */
971
+ /* Dialog (native <dialog>, modal) */
972
+ /* ------------------------------------------------------------------------ */
973
+ .dialog {
974
+ width: min(var(--dialog-w), calc(100vw - 2 * var(--space-4)));
975
+ max-height: calc(100dvh - 2 * var(--space-6));
976
+ margin: auto;
977
+ padding: 0;
978
+ display: flex;
979
+ flex-direction: column;
980
+ background: var(--surface-page);
981
+ color: var(--ink-body);
982
+ border: var(--border);
983
+ border-radius: var(--radius);
984
+ box-shadow: var(--shadow-drawer);
985
+ }
986
+
987
+ .dialog:not([open]) {
988
+ display: none;
989
+ }
990
+
991
+ .dialog[open] {
992
+ animation: dialog-in var(--transition-slow) both;
993
+ }
994
+
995
+ @keyframes dialog-in {
996
+ from {
997
+ opacity: 0;
998
+ transform: translateY(8px);
999
+ }
1000
+ }
1001
+
1002
+ .dialog--wide {
1003
+ width: min(var(--dialog-w-wide), calc(100vw - 2 * var(--space-4)));
1004
+ }
1005
+
1006
+ .dialog::backdrop {
1007
+ background: var(--backdrop);
1008
+ }
1009
+
1010
+ .dialog__header {
1011
+ display: flex;
1012
+ align-items: flex-start;
1013
+ justify-content: space-between;
1014
+ gap: var(--space-3);
1015
+ padding: var(--space-4) var(--space-5);
1016
+ border-bottom: var(--border);
1017
+ }
1018
+
1019
+ .dialog__title {
1020
+ margin-top: var(--space-1);
1021
+ font-family: var(--font-display);
1022
+ font-size: var(--fs-h2);
1023
+ font-weight: var(--fw-medium);
1024
+ line-height: var(--lh-heading);
1025
+ color: var(--ink-strong);
1026
+ }
1027
+
1028
+ .dialog__body {
1029
+ flex: 1 1 auto;
1030
+ overflow-y: auto;
1031
+ padding: var(--space-5);
1032
+ }
1033
+
1034
+ .dialog__footer {
1035
+ display: flex;
1036
+ align-items: center;
1037
+ gap: var(--space-2);
1038
+ padding: var(--space-3) var(--space-5);
1039
+ border-top: var(--border);
1040
+ background: var(--surface-banner);
1041
+ }
1042
+
1043
+ /* ------------------------------------------------------------------------ */
1044
+ /* Wizard: stepper and step panel */
1045
+ /* ------------------------------------------------------------------------ */
1046
+ .steps {
1047
+ display: flex;
1048
+ gap: var(--space-2);
1049
+ margin: 0 0 var(--space-5);
1050
+ padding: 0;
1051
+ list-style: none;
1052
+ counter-reset: step;
1053
+ }
1054
+
1055
+ .steps__item {
1056
+ flex: 1 1 0;
1057
+ min-width: 0;
1058
+ border-top: 3px solid var(--line);
1059
+ }
1060
+
1061
+ .steps__item.is-done {
1062
+ border-top-color: var(--brand-brass);
1063
+ }
1064
+
1065
+ .steps__item.is-current {
1066
+ border-top-color: var(--brand-green);
1067
+ }
1068
+
1069
+ .steps__btn {
1070
+ display: flex;
1071
+ align-items: center;
1072
+ gap: var(--space-2);
1073
+ width: 100%;
1074
+ padding: var(--space-2) 0 0;
1075
+ border: 0;
1076
+ background: none;
1077
+ font-family: var(--font-ui);
1078
+ font-size: var(--fs-small);
1079
+ color: var(--ink-muted);
1080
+ text-align: left;
1081
+ }
1082
+
1083
+ button.steps__btn {
1084
+ cursor: pointer;
1085
+ }
1086
+
1087
+ button.steps__btn:hover .steps__label {
1088
+ color: var(--brand-green);
1089
+ text-decoration: underline;
1090
+ }
1091
+
1092
+ .steps__num {
1093
+ display: inline-grid;
1094
+ place-items: center;
1095
+ flex: 0 0 auto;
1096
+ width: 20px;
1097
+ height: 20px;
1098
+ border-radius: 50%;
1099
+ border: var(--border-w) solid var(--line-control);
1100
+ font-size: var(--fs-label);
1101
+ font-weight: var(--fw-semibold);
1102
+ }
1103
+
1104
+ .steps__num .icon {
1105
+ width: 12px;
1106
+ height: 12px;
1107
+ stroke-width: 3;
1108
+ }
1109
+
1110
+ .is-done .steps__num {
1111
+ border-color: var(--brand-brass);
1112
+ background: var(--brand-brass-tint);
1113
+ color: var(--brand-brass-text);
1114
+ }
1115
+
1116
+ .is-current .steps__num {
1117
+ border-color: var(--brand-green);
1118
+ background: var(--brand-green);
1119
+ color: var(--surface-page);
1120
+ }
1121
+
1122
+ .is-current .steps__label {
1123
+ color: var(--ink-strong);
1124
+ font-weight: var(--fw-semibold);
1125
+ }
1126
+
1127
+ .steps__label {
1128
+ overflow: hidden;
1129
+ text-overflow: ellipsis;
1130
+ white-space: nowrap;
1131
+ }
1132
+
1133
+ .wizard__intro {
1134
+ margin-bottom: var(--space-4);
1135
+ }
1136
+
1137
+ .wizard__intro h3 {
1138
+ font-family: var(--font-ui);
1139
+ font-size: var(--fs-h3);
1140
+ font-weight: var(--fw-semibold);
1141
+ color: var(--ink-strong);
1142
+ }
1143
+
1144
+ .wizard__intro p {
1145
+ margin-top: var(--space-1);
1146
+ font-size: var(--fs-ui);
1147
+ color: var(--ink-secondary);
1148
+ }
1149
+
1150
+ .wizard .form {
1151
+ gap: var(--space-4);
1152
+ }
1153
+
1154
+ .wizard .form .wizard__intro {
1155
+ margin-bottom: 0;
1156
+ }
1157
+
1158
+ .wizard__preview .note-body {
1159
+ padding: 0 var(--space-4) var(--space-4)
1160
+ calc(var(--space-4) + var(--icon) + var(--space-3));
1161
+ }
1162
+
1163
+ /* ------------------------------------------------------------------------ */
1164
+ /* Markdown editor */
1165
+ /* ------------------------------------------------------------------------ */
1166
+ .md-editor {
1167
+ display: flex;
1168
+ flex-direction: column;
1169
+ border: var(--border-w) solid var(--line-control);
1170
+ border-radius: var(--radius-sm);
1171
+ background: var(--surface-raised);
1172
+ }
1173
+
1174
+ .md-editor:focus-within {
1175
+ outline: 2px solid var(--brand-green);
1176
+ outline-offset: 1px;
1177
+ border-color: var(--brand-green);
1178
+ }
1179
+
1180
+ .md-editor__bar {
1181
+ display: flex;
1182
+ align-items: center;
1183
+ flex-wrap: wrap;
1184
+ gap: var(--space-2);
1185
+ padding: 0 var(--space-2);
1186
+ border-bottom: var(--border-soft);
1187
+ background: var(--surface-banner);
1188
+ }
1189
+
1190
+ .md-editor__tabs {
1191
+ display: flex;
1192
+ margin-right: auto;
1193
+ }
1194
+
1195
+ .md-editor__tab {
1196
+ padding: var(--space-2) var(--space-3);
1197
+ border: 0;
1198
+ border-bottom: 2px solid transparent;
1199
+ background: none;
1200
+ font-family: var(--font-ui);
1201
+ font-size: var(--fs-label);
1202
+ font-weight: var(--fw-semibold);
1203
+ letter-spacing: var(--tracking-label);
1204
+ text-transform: uppercase;
1205
+ color: var(--ink-secondary);
1206
+ cursor: pointer;
1207
+ }
1208
+
1209
+ .md-editor__tab[aria-selected="true"] {
1210
+ border-bottom-color: var(--brand-green);
1211
+ color: var(--ink-strong);
1212
+ }
1213
+
1214
+ .md-editor__tools {
1215
+ display: flex;
1216
+ flex-wrap: wrap;
1217
+ gap: 2px;
1218
+ }
1219
+
1220
+ .md-editor__tool {
1221
+ display: inline-grid;
1222
+ place-items: center;
1223
+ width: var(--control-h-sm);
1224
+ height: var(--control-h-sm);
1225
+ border: 0;
1226
+ border-radius: var(--radius-sm);
1227
+ background: none;
1228
+ color: var(--ink-secondary);
1229
+ cursor: pointer;
1230
+ }
1231
+
1232
+ .md-editor__tool:hover {
1233
+ background: var(--surface-raised);
1234
+ color: var(--brand-green);
1235
+ }
1236
+
1237
+ .md-editor__tool .icon {
1238
+ width: 16px;
1239
+ height: 16px;
1240
+ }
1241
+
1242
+ .md-editor .md-editor__input {
1243
+ min-height: 240px;
1244
+ border: 0;
1245
+ border-radius: 0;
1246
+ font-family: var(--font-mono);
1247
+ font-size: var(--fs-ui);
1248
+ line-height: var(--lh-body);
1249
+ }
1250
+
1251
+ .md-editor .md-editor__input:focus {
1252
+ outline: 0;
1253
+ }
1254
+
1255
+ .md-editor__preview {
1256
+ max-width: none;
1257
+ padding: var(--space-3) var(--space-4);
1258
+ overflow: auto;
1259
+ }
1260
+
1261
+ .md-editor__help {
1262
+ padding: var(--space-2) var(--space-3);
1263
+ border-top: var(--border-soft);
1264
+ font-size: var(--fs-small);
1265
+ color: var(--ink-muted);
1266
+ }
1267
+
1268
+ .md-editor__help code {
1269
+ padding: 0 var(--space-1);
1270
+ background: var(--surface-banner);
1271
+ border-radius: var(--radius-sm);
1272
+ font-family: var(--font-mono);
1273
+ font-size: var(--fs-small);
1274
+ }
1275
+
1276
+ /* ------------------------------------------------------------------------ */
1277
+ /* Dropbox picker */
1278
+ /* ------------------------------------------------------------------------ */
1279
+ .picker {
1280
+ display: flex;
1281
+ flex-direction: column;
1282
+ gap: var(--space-2);
1283
+ }
1284
+
1285
+ .picker__bar {
1286
+ display: flex;
1287
+ align-items: center;
1288
+ gap: var(--space-2);
1289
+ min-height: var(--control-h);
1290
+ }
1291
+
1292
+ .picker__crumb {
1293
+ padding: 0;
1294
+ border: 0;
1295
+ background: none;
1296
+ font: inherit;
1297
+ color: var(--brand-green);
1298
+ cursor: pointer;
1299
+ }
1300
+
1301
+ .picker__crumb:hover {
1302
+ text-decoration: underline;
1303
+ }
1304
+
1305
+ .picker__list {
1306
+ max-height: 320px;
1307
+ overflow-y: auto;
1308
+ }
1309
+
1310
+ .picker__empty {
1311
+ display: flex;
1312
+ align-items: center;
1313
+ gap: var(--space-2);
1314
+ padding: var(--space-4);
1315
+ }
1316
+
1317
+ .picker__selected {
1318
+ display: flex;
1319
+ align-items: center;
1320
+ gap: var(--space-3);
1321
+ min-height: var(--row-h);
1322
+ padding: var(--space-2) var(--space-4);
1323
+ background: var(--surface-banner);
1324
+ border: var(--border);
1325
+ border-left: 3px solid var(--brand-green);
1326
+ border-radius: var(--radius);
1327
+ color: var(--brand-green);
1328
+ }
1329
+
1330
+ .picker__selected-text {
1331
+ display: flex;
1332
+ flex-direction: column;
1333
+ min-width: 0;
1334
+ color: var(--ink-strong);
1335
+ overflow-wrap: anywhere;
1336
+ }
1337
+
1338
+ .picker .mono,
1339
+ .wizard .mono {
1340
+ font-size: var(--fs-ui);
1341
+ overflow-wrap: anywhere;
1342
+ }
1343
+
1344
+ /* ------------------------------------------------------------------------ */
1345
+ /* Toolbar */
1346
+ /* ------------------------------------------------------------------------ */
1347
+ .toolbar {
1348
+ display: flex;
1349
+ align-items: center;
1350
+ gap: var(--space-2);
1351
+ flex-wrap: wrap;
1352
+ margin-bottom: var(--space-4);
1353
+ }
1354
+
1355
+ .toolbar__spacer {
1356
+ flex: 1 1 auto;
1357
+ }
1358
+
1359
+ .toolbar .input,
1360
+ .toolbar .select {
1361
+ width: auto;
1362
+ min-width: 200px;
1363
+ }
1364
+
1365
+ /* Breadcrumbs (folder browser) */
1366
+ .crumbs {
1367
+ display: flex;
1368
+ align-items: center;
1369
+ flex-wrap: wrap;
1370
+ gap: var(--space-1);
1371
+ font-size: var(--fs-ui);
1372
+ color: var(--ink-muted);
1373
+ }
1374
+
1375
+ .crumbs a {
1376
+ color: var(--ink-secondary);
1377
+ }
1378
+
1379
+ .crumbs__sep {
1380
+ color: var(--line-control);
1381
+ }
1382
+
1383
+ .crumbs__current {
1384
+ color: var(--ink-strong);
1385
+ font-weight: var(--fw-medium);
1386
+ }
1387
+
1388
+ /* ------------------------------------------------------------------------ */
1389
+ /* Stat tiles */
1390
+ /* ------------------------------------------------------------------------ */
1391
+ .stats {
1392
+ display: grid;
1393
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
1394
+ gap: var(--space-3);
1395
+ }
1396
+
1397
+ .stat {
1398
+ display: flex;
1399
+ flex-direction: column;
1400
+ gap: var(--space-2);
1401
+ padding: var(--space-4) var(--space-5);
1402
+ background: var(--surface-card);
1403
+ border: var(--border);
1404
+ border-radius: var(--radius);
1405
+ color: inherit;
1406
+ text-decoration: none;
1407
+ }
1408
+
1409
+ a.stat:hover {
1410
+ border-color: var(--brand-green);
1411
+ text-decoration: none;
1412
+ }
1413
+
1414
+ .stat__label {
1415
+ font-size: var(--fs-label);
1416
+ font-weight: var(--fw-semibold);
1417
+ letter-spacing: var(--tracking-label);
1418
+ text-transform: uppercase;
1419
+ color: var(--ink-secondary);
1420
+ }
1421
+
1422
+ .stat__value {
1423
+ font-family: var(--font-display);
1424
+ font-size: var(--fs-stat);
1425
+ font-weight: var(--fw-medium);
1426
+ line-height: 1.1;
1427
+ color: var(--ink-strong);
1428
+ font-variant-numeric: tabular-nums;
1429
+ }
1430
+
1431
+ .stat__sub {
1432
+ font-size: var(--fs-small);
1433
+ color: var(--ink-muted);
1434
+ }
1435
+
1436
+ /* ch is measured in the 28px display face, so the default 12ch would outgrow the tile. */
1437
+ .stat__value.skeleton--text {
1438
+ width: 5ch;
1439
+ }
1440
+
1441
+ /* ------------------------------------------------------------------------ */
1442
+ /* Empty, loading, skeleton */
1443
+ /* ------------------------------------------------------------------------ */
1444
+ .empty {
1445
+ display: flex;
1446
+ flex-direction: column;
1447
+ align-items: center;
1448
+ gap: var(--space-2);
1449
+ padding: var(--space-8) var(--space-5);
1450
+ text-align: center;
1451
+ background: var(--surface-hero);
1452
+ border: var(--border);
1453
+ border-radius: var(--radius);
1454
+ color: var(--ink-secondary);
1455
+ }
1456
+
1457
+ .empty .icon {
1458
+ width: 28px;
1459
+ height: 28px;
1460
+ color: var(--brand-brass);
1461
+ }
1462
+
1463
+ .empty__title {
1464
+ font-family: var(--font-display);
1465
+ font-size: var(--fs-h2);
1466
+ color: var(--ink-strong);
1467
+ }
1468
+
1469
+ .empty p {
1470
+ max-width: 44ch;
1471
+ font-size: var(--fs-ui);
1472
+ }
1473
+
1474
+ .skeleton {
1475
+ position: relative;
1476
+ overflow: hidden;
1477
+ background: var(--surface-banner);
1478
+ border-radius: var(--radius-sm);
1479
+ color: transparent !important;
1480
+ min-height: 1em;
1481
+ }
1482
+
1483
+ .skeleton::after {
1484
+ content: "";
1485
+ position: absolute;
1486
+ inset: 0;
1487
+ background: linear-gradient(
1488
+ 90deg,
1489
+ transparent,
1490
+ var(--surface-raised),
1491
+ transparent
1492
+ );
1493
+ transform: translateX(-100%);
1494
+ animation: shimmer 1.4s infinite;
1495
+ }
1496
+
1497
+ .skeleton--row {
1498
+ height: var(--row-h);
1499
+ border-radius: 0;
1500
+ }
1501
+
1502
+ .skeleton--row + .skeleton--row {
1503
+ border-top: var(--border-soft);
1504
+ }
1505
+
1506
+ .skeleton--text {
1507
+ display: inline-block;
1508
+ width: 12ch;
1509
+ max-width: 100%;
1510
+ height: 0.9em;
1511
+ vertical-align: middle;
1512
+ }
1513
+
1514
+ @keyframes shimmer {
1515
+ to {
1516
+ transform: translateX(100%);
1517
+ }
1518
+ }
1519
+
1520
+ /* ------------------------------------------------------------------------ */
1521
+ /* Toasts */
1522
+ /* ------------------------------------------------------------------------ */
1523
+ .toasts {
1524
+ position: fixed;
1525
+ view-transition-name: toasts;
1526
+ right: var(--space-4);
1527
+ bottom: var(--space-4);
1528
+ z-index: var(--z-toast);
1529
+ display: flex;
1530
+ flex-direction: column;
1531
+ gap: var(--space-2);
1532
+ max-width: min(420px, calc(100vw - 2 * var(--space-4)));
1533
+ }
1534
+
1535
+ .toast {
1536
+ display: flex;
1537
+ align-items: flex-start;
1538
+ gap: var(--space-3);
1539
+ padding: var(--space-3) var(--space-4);
1540
+ background: var(--surface-deep);
1541
+ color: var(--ink-on-deep);
1542
+ border-left: 3px solid var(--brand-green);
1543
+ border-radius: var(--radius);
1544
+ box-shadow: var(--shadow-popover);
1545
+ font-size: var(--fs-ui);
1546
+ animation: toast-in var(--transition-slow);
1547
+ }
1548
+
1549
+ .toast--error {
1550
+ border-left-color: var(--signal-orange);
1551
+ }
1552
+
1553
+ .toast--warn {
1554
+ border-left-color: var(--brand-brass);
1555
+ }
1556
+
1557
+ .toast__close {
1558
+ margin-left: auto;
1559
+ background: none;
1560
+ border: 0;
1561
+ color: var(--ink-on-deep-muted);
1562
+ padding: 0;
1563
+ }
1564
+
1565
+ @keyframes toast-in {
1566
+ from {
1567
+ opacity: 0;
1568
+ transform: translateY(6px);
1569
+ }
1570
+ }
1571
+
1572
+ /* ------------------------------------------------------------------------ */
1573
+ /* Avatar / user chip */
1574
+ /* ------------------------------------------------------------------------ */
1575
+ .avatar {
1576
+ display: inline-grid;
1577
+ place-items: center;
1578
+ flex: 0 0 auto;
1579
+ width: 32px;
1580
+ height: 32px;
1581
+ border-radius: 50%;
1582
+ background: var(--brand-green);
1583
+ color: var(--surface-page);
1584
+ font-family: var(--font-display);
1585
+ font-size: var(--fs-small);
1586
+ font-weight: var(--fw-semibold);
1587
+ line-height: 1;
1588
+ text-transform: uppercase;
1589
+ /* Initials are capitals: trim to cap height so the serif's tall ascent does not push them low. */
1590
+ text-box: trim-both cap alphabetic;
1591
+ }
1592
+
1593
+ .user-chip {
1594
+ display: flex;
1595
+ align-items: center;
1596
+ gap: var(--space-3);
1597
+ min-width: 0;
1598
+ }
1599
+
1600
+ .user-chip__text {
1601
+ display: flex;
1602
+ flex-direction: column;
1603
+ min-width: 0;
1604
+ }
1605
+
1606
+ .user-chip__name {
1607
+ font-size: var(--fs-ui);
1608
+ font-weight: var(--fw-medium);
1609
+ color: var(--ink-strong);
1610
+ overflow: hidden;
1611
+ text-overflow: ellipsis;
1612
+ white-space: nowrap;
1613
+ }
1614
+
1615
+ .user-chip__sub {
1616
+ font-size: var(--fs-small);
1617
+ color: var(--ink-muted);
1618
+ overflow: hidden;
1619
+ text-overflow: ellipsis;
1620
+ white-space: nowrap;
1621
+ }
1622
+
1623
+ /* ------------------------------------------------------------------------ */
1624
+ /* Definition list (account, details) */
1625
+ /* ------------------------------------------------------------------------ */
1626
+ .dl {
1627
+ display: grid;
1628
+ grid-template-columns: max-content 1fr;
1629
+ gap: var(--space-2) var(--space-5);
1630
+ font-size: var(--fs-ui);
1631
+ }
1632
+
1633
+ .dl dt {
1634
+ font-size: var(--fs-label);
1635
+ font-weight: var(--fw-semibold);
1636
+ letter-spacing: var(--tracking-label);
1637
+ text-transform: uppercase;
1638
+ color: var(--ink-secondary);
1639
+ padding-top: 3px;
1640
+ }
1641
+
1642
+ .dl dd {
1643
+ color: var(--ink-strong);
1644
+ }
1645
+
1646
+ /* ------------------------------------------------------------------------ */
1647
+ /* Responsive */
1648
+ /* ------------------------------------------------------------------------ */
1649
+ @media (max-width: 600px) {
1650
+ /* Two tiles a row on phones: four stacked tiles push everything else off the screen. */
1651
+ .stats {
1652
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1653
+ gap: var(--space-2);
1654
+ }
1655
+
1656
+ .stat {
1657
+ gap: var(--space-1);
1658
+ padding: var(--space-3);
1659
+ }
1660
+
1661
+ .form__row {
1662
+ grid-template-columns: 1fr;
1663
+ }
1664
+
1665
+ /* Toolbar controls share the row and fill it instead of keeping a desktop minimum width. */
1666
+ .toolbar .input,
1667
+ .toolbar .select {
1668
+ flex: 1 1 10rem;
1669
+ min-width: 0;
1670
+ }
1671
+
1672
+ .toolbar__spacer {
1673
+ display: none;
1674
+ }
1675
+
1676
+ /*
1677
+ * Card tables: each row becomes a dense card instead of scrolling sideways.
1678
+ * The .is-primary cell takes the first line, the rest flow inline beneath it,
1679
+ * and the actions sit full-width at the bottom as easy tap targets.
1680
+ */
1681
+ .table--cards thead {
1682
+ position: absolute;
1683
+ width: 1px;
1684
+ height: 1px;
1685
+ overflow: hidden;
1686
+ clip-path: inset(50%);
1687
+ white-space: nowrap;
1688
+ }
1689
+
1690
+ .table--cards,
1691
+ .table--cards tbody {
1692
+ display: block;
1693
+ }
1694
+
1695
+ .table--cards tr {
1696
+ display: flex;
1697
+ flex-wrap: wrap;
1698
+ align-items: center;
1699
+ gap: var(--space-1) var(--space-3);
1700
+ padding: var(--space-3);
1701
+ border-top: var(--border-soft);
1702
+ }
1703
+
1704
+ .table--cards tr:first-child {
1705
+ border-top: 0;
1706
+ }
1707
+
1708
+ .table--cards td {
1709
+ display: block;
1710
+ height: auto;
1711
+ padding: 0;
1712
+ border-top: 0;
1713
+ min-width: 0;
1714
+ }
1715
+
1716
+ .table--cards td[colspan] {
1717
+ flex: 1 1 100%;
1718
+ }
1719
+
1720
+ .table--cards tbody tr:hover td {
1721
+ background: none;
1722
+ }
1723
+
1724
+ .table--cards td.is-primary {
1725
+ flex: 1 1 100%;
1726
+ font-weight: var(--fw-medium);
1727
+ color: var(--ink-strong);
1728
+ overflow-wrap: anywhere;
1729
+ }
1730
+
1731
+ .table--cards td.is-blank {
1732
+ display: none;
1733
+ }
1734
+
1735
+ .table--cards td.is-note {
1736
+ flex: 1 1 100%;
1737
+ order: 1;
1738
+ font-size: var(--fs-small);
1739
+ color: var(--ink-secondary);
1740
+ }
1741
+
1742
+ .table--cards td[data-label] {
1743
+ font-size: var(--fs-small);
1744
+ color: var(--ink-muted);
1745
+ }
1746
+
1747
+ .table--cards td[data-label]::before {
1748
+ content: attr(data-label) " ";
1749
+ }
1750
+
1751
+ .table--cards td.is-actions {
1752
+ display: flex;
1753
+ flex: 1 1 100%;
1754
+ order: 2;
1755
+ gap: var(--space-2);
1756
+ margin-top: var(--space-2);
1757
+ }
1758
+
1759
+ .table--cards td.is-actions .btn {
1760
+ flex: 1 1 0;
1761
+ min-height: var(--control-h);
1762
+ }
1763
+
1764
+ /* A lone action (Remove, Reinstate) sits beside the primary cell rather than taking a row. */
1765
+ .table--cards tr:has(> td.is-actions > .btn:only-child) td.is-primary {
1766
+ flex: 1 1 0;
1767
+ order: -3;
1768
+ }
1769
+
1770
+ .table--cards td.is-actions:has(> .btn:only-child) {
1771
+ flex: 0 0 auto;
1772
+ order: -2;
1773
+ margin: calc(-1 * var(--space-1)) 0;
1774
+ }
1775
+
1776
+ /* Line break after that first line, so the badges and dates start on the next. */
1777
+ .table--cards tr:has(> td.is-actions > .btn:only-child)::after {
1778
+ content: "";
1779
+ flex-basis: 100%;
1780
+ order: -1;
1781
+ margin-top: calc(-1 * var(--space-1));
1782
+ }
1783
+
1784
+ .table--cards td.is-actions:has(> .btn:only-child) .btn {
1785
+ flex: 0 0 auto;
1786
+ }
1787
+
1788
+ .steps__label {
1789
+ display: none;
1790
+ }
1791
+
1792
+ .steps__item.is-current .steps__label {
1793
+ display: inline;
1794
+ }
1795
+
1796
+ .dialog__body {
1797
+ padding: var(--space-4);
1798
+ }
1799
+
1800
+ .page-header {
1801
+ flex-direction: column;
1802
+ align-items: stretch;
1803
+ }
1804
+
1805
+ .dl {
1806
+ grid-template-columns: 1fr;
1807
+ gap: var(--space-1);
1808
+ }
1809
+
1810
+ .dl dd + dt {
1811
+ margin-top: var(--space-3);
1812
+ }
1813
+ }
1814
+
1815
+ /* Select: inset chevron stays centered independently of the label. */
1816
+ sierra-select {
1817
+ display: block;
1818
+ min-width: 0;
1819
+ }
1820
+ .select-trigger {
1821
+ display: flex;
1822
+ align-items: center;
1823
+ gap: var(--space-3);
1824
+ text-align: left;
1825
+ cursor: pointer;
1826
+ }
1827
+ .select-trigger [data-select-label] {
1828
+ flex: 1;
1829
+ min-width: 0;
1830
+ overflow: hidden;
1831
+ text-overflow: ellipsis;
1832
+ white-space: nowrap;
1833
+ }
1834
+ .select-trigger .select-chevron {
1835
+ flex: none;
1836
+ width: 1rem;
1837
+ height: 1rem;
1838
+ margin-left: auto;
1839
+ color: var(--ink-secondary);
1840
+ }
1841
+ .select-trigger[aria-expanded="true"] .select-chevron {
1842
+ transform: rotate(180deg);
1843
+ }
1844
+ .select-trigger:disabled {
1845
+ opacity: 0.5;
1846
+ cursor: not-allowed;
1847
+ }
1848
+ .select-popover {
1849
+ position: fixed;
1850
+ inset: auto;
1851
+ margin: 0;
1852
+ padding: var(--space-1);
1853
+ box-sizing: border-box;
1854
+ overflow-y: auto;
1855
+ background: var(--surface-raised);
1856
+ color: var(--ink-strong);
1857
+ border: var(--border);
1858
+ border-radius: var(--radius-sm);
1859
+ font-family: var(--font-ui);
1860
+ font-size: var(--fs-body);
1861
+ }
1862
+ .select-option {
1863
+ display: flex;
1864
+ align-items: center;
1865
+ justify-content: space-between;
1866
+ gap: var(--space-3);
1867
+ min-height: var(--control-h);
1868
+ padding: var(--space-2) var(--space-3);
1869
+ border-radius: var(--radius-sm);
1870
+ cursor: pointer;
1871
+ }
1872
+ .select-option:hover,
1873
+ .select-option.is-active {
1874
+ background: var(--brand-green-tint);
1875
+ }
1876
+ .select-option[aria-disabled="true"] {
1877
+ opacity: 0.5;
1878
+ cursor: not-allowed;
1879
+ }
1880
+ .select-check {
1881
+ flex: none;
1882
+ visibility: hidden;
1883
+ }
1884
+ .select-option[aria-selected="true"] .select-check {
1885
+ visibility: visible;
1886
+ color: var(--brand-green);
1887
+ }
1888
+
1889
+ .ds-data-table caption {
1890
+ text-align: left;
1891
+ padding: var(--space-3);
1892
+ font-weight: var(--fw-semibold);
1893
+ }
1894
+ .ds-numeric {
1895
+ text-align: right;
1896
+ font-variant-numeric: tabular-nums;
1897
+ white-space: nowrap;
1898
+ }
1899
+ .ds-data-status {
1900
+ display: flex;
1901
+ flex-wrap: wrap;
1902
+ align-items: center;
1903
+ gap: var(--space-3);
1904
+ padding: var(--space-3);
1905
+ border-left: 3px solid var(--brand-green);
1906
+ background: var(--surface-banner);
1907
+ font-size: var(--fs-ui);
1908
+ }
1909
+ .ds-data-status[data-state="stale"] {
1910
+ border-color: var(--brand-brass);
1911
+ }
1912
+ .ds-data-status[data-state="unavailable"] {
1913
+ border-color: var(--signal-orange);
1914
+ }
1915
+ .ds-filter-bar {
1916
+ display: flex;
1917
+ flex-wrap: wrap;
1918
+ align-items: end;
1919
+ gap: var(--space-4);
1920
+ }
1921
+ .ds-filter-bar > * {
1922
+ flex: 1 1 180px;
1923
+ min-width: 0;
1924
+ }
1925
+ .ds-map-frame {
1926
+ margin: 0;
1927
+ border: var(--border);
1928
+ border-radius: var(--radius);
1929
+ overflow: hidden;
1930
+ background: var(--surface-hero);
1931
+ }
1932
+ .ds-map-toolbar,
1933
+ .ds-map-frame figcaption {
1934
+ padding: var(--space-3);
1935
+ background: var(--surface-card);
1936
+ font-size: var(--fs-small);
1937
+ }
1938
+ .ds-map-frame figcaption {
1939
+ display: grid;
1940
+ gap: var(--space-2);
1941
+ }
1942
+ .ds-map-canvas {
1943
+ height: 380px;
1944
+ }
1945
+ .ds-map-compact .ds-map-canvas {
1946
+ height: 220px;
1947
+ }
1948
+ .ds-map-frame .maplibregl-ctrl-group {
1949
+ background: var(--surface-raised);
1950
+ border: var(--border);
1951
+ box-shadow: none;
1952
+ }
1953
+ .ds-map-fallback {
1954
+ padding: var(--space-3);
1955
+ }
1956
+ .ds-map-feature-list {
1957
+ display: flex;
1958
+ flex-wrap: wrap;
1959
+ gap: var(--space-2);
1960
+ padding: var(--space-3);
1961
+ }
1962
+
1963
+ .ds-data-table .ds-numeric {
1964
+ text-align: right;
1965
+ }
1966
+ .ds-data-table tbody th {
1967
+ background: transparent;
1968
+ font-size: var(--fs-body);
1969
+ letter-spacing: normal;
1970
+ text-transform: none;
1971
+ color: var(--ink-strong);
1972
+ }
1973
+
1974
+ /* Row headers and numeric cells share the same full-row hover surface. */
1975
+ .table tbody tr:hover > :is(th, td) {
1976
+ background: var(--surface-raised);
1977
+ }
1978
+ .ds-map-attribution {
1979
+ margin: 0;
1980
+ padding: var(--space-1) var(--space-3);
1981
+ font-family: var(--font-ui);
1982
+ font-size: var(--fs-label);
1983
+ line-height: 1.4;
1984
+ color: var(--ink-secondary);
1985
+ }
1986
+ .ds-map-attribution a {
1987
+ color: inherit;
1988
+ }
1989
+ .ds-map-frame figcaption .ds-map-attribution {
1990
+ padding: 0;
1991
+ }
1992
+
1993
+ /* Dense data primitives: readable values, secondary explanations, no truncation. */
1994
+ .ds-data-note {
1995
+ margin: var(--space-1) 0 0;
1996
+ color: var(--ink-secondary);
1997
+ font-family: var(--font-ui);
1998
+ font-size: var(--fs-small);
1999
+ line-height: 1.5;
2000
+ overflow-wrap: anywhere;
2001
+ }
2002
+ .ds-values {
2003
+ width: 100%;
2004
+ border-collapse: collapse;
2005
+ table-layout: fixed;
2006
+ }
2007
+ .ds-values caption {
2008
+ text-align: left;
2009
+ font-weight: var(--fw-semibold);
2010
+ padding-bottom: var(--space-3);
2011
+ }
2012
+ .ds-values th,
2013
+ .ds-values td {
2014
+ padding: var(--space-3);
2015
+ border-bottom: var(--border-soft);
2016
+ vertical-align: top;
2017
+ text-align: left;
2018
+ }
2019
+ .ds-values th {
2020
+ width: 30%;
2021
+ font-size: var(--fs-ui);
2022
+ font-weight: var(--fw-medium);
2023
+ overflow-wrap: anywhere;
2024
+ }
2025
+ .ds-values tr:hover > :is(th, td) {
2026
+ background: var(--surface-raised);
2027
+ }
2028
+ .ds-value {
2029
+ font-family: var(--font-mono);
2030
+ font-size: var(--fs-small);
2031
+ overflow-wrap: anywhere;
2032
+ white-space: pre-wrap;
2033
+ }
2034
+ .ds-metric-grid {
2035
+ display: grid;
2036
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 150px), 1fr));
2037
+ margin: 0;
2038
+ border: var(--border);
2039
+ border-radius: var(--radius);
2040
+ overflow: hidden;
2041
+ }
2042
+ .ds-metric {
2043
+ padding: var(--space-4);
2044
+ background: var(--surface-card);
2045
+ border: var(--border-soft);
2046
+ min-width: 0;
2047
+ }
2048
+ .ds-metric dt {
2049
+ color: var(--ink-secondary);
2050
+ font-size: var(--fs-small);
2051
+ }
2052
+ .ds-metric dd {
2053
+ margin: var(--space-2) 0 0;
2054
+ }
2055
+ .ds-metric-value {
2056
+ font-family: var(--font-mono);
2057
+ font-size: var(--fs-h3);
2058
+ font-variant-numeric: tabular-nums;
2059
+ overflow-wrap: anywhere;
2060
+ }
2061
+ .ds-metric-missing,
2062
+ .ds-metric-unit {
2063
+ font-size: var(--fs-small);
2064
+ color: var(--ink-secondary);
2065
+ }
2066
+ .ds-identifiers {
2067
+ display: block;
2068
+ min-width: 0;
2069
+ }
2070
+ .ds-identifiers-head,
2071
+ .ds-diff-heading {
2072
+ display: flex;
2073
+ align-items: center;
2074
+ flex-wrap: wrap;
2075
+ justify-content: space-between;
2076
+ gap: var(--space-3);
2077
+ margin-bottom: var(--space-3);
2078
+ }
2079
+ .ds-identifier-list {
2080
+ list-style: none;
2081
+ padding: 0;
2082
+ margin: 0;
2083
+ display: grid;
2084
+ gap: var(--space-1);
2085
+ }
2086
+ .ds-identifier-list li {
2087
+ display: flex;
2088
+ align-items: center;
2089
+ gap: var(--space-3);
2090
+ padding: var(--space-2) var(--space-3);
2091
+ background: var(--surface-banner);
2092
+ border-radius: var(--radius-sm);
2093
+ }
2094
+ .ds-identifier-list code {
2095
+ flex: 1;
2096
+ min-width: 0;
2097
+ overflow-wrap: anywhere;
2098
+ font-size: var(--fs-small);
2099
+ }
2100
+ .ds-identifier-list button {
2101
+ flex: none;
2102
+ }
2103
+ .ds-identifiers summary {
2104
+ cursor: pointer;
2105
+ padding: var(--space-3) 0;
2106
+ font-size: var(--fs-small);
2107
+ color: var(--brand-green);
2108
+ }
2109
+ .ds-copy-status {
2110
+ min-height: 1.5em;
2111
+ }
2112
+ .ds-diff {
2113
+ container-type: inline-size;
2114
+ }
2115
+ .ds-diff-list {
2116
+ list-style: none;
2117
+ padding: 0;
2118
+ margin: 0;
2119
+ }
2120
+ .ds-diff-list > li {
2121
+ display: grid;
2122
+ grid-template-columns: minmax(0, 28%) minmax(0, 1fr);
2123
+ gap: var(--space-5);
2124
+ padding-block: var(--space-2);
2125
+ align-items: baseline;
2126
+ font-family: var(--font-mono);
2127
+ font-size: var(--fs-small);
2128
+ line-height: 1.65;
2129
+ }
2130
+ .ds-diff-field {
2131
+ font-size: inherit;
2132
+ overflow-wrap: anywhere;
2133
+ }
2134
+ .ds-diff-values {
2135
+ min-width: 0;
2136
+ overflow-wrap: anywhere;
2137
+ white-space: pre-wrap;
2138
+ }
2139
+ .ds-diff-before {
2140
+ color: var(--ink-muted);
2141
+ text-decoration-thickness: 1px;
2142
+ }
2143
+ .ds-diff-after {
2144
+ color: var(--ink-strong);
2145
+ text-decoration: none;
2146
+ }
2147
+ .ds-diff-arrow {
2148
+ color: var(--brand-brass-text);
2149
+ }
2150
+ .ds-diff-list > li[data-kind="added"] .ds-diff-arrow {
2151
+ color: var(--brand-green);
2152
+ }
2153
+ .ds-diff-removed {
2154
+ color: var(--ink-secondary);
2155
+ font-family: var(--font-ui);
2156
+ }
2157
+ @container (max-width: 520px) {
2158
+ .ds-diff-list > li {
2159
+ grid-template-columns: minmax(0, 1fr);
2160
+ gap: var(--space-1);
2161
+ padding-block: var(--space-3);
2162
+ }
2163
+ .ds-diff-field {
2164
+ color: var(--ink-secondary);
2165
+ }
2166
+ }
2167
+ .ds-map-notice {
2168
+ margin: var(--space-3);
2169
+ }
2170
+
2171
+ /* Body row headers use body-cell dividers, not the column heading's bottom rule. */
2172
+ .ds-data-table tbody th {
2173
+ border-bottom: 0;
2174
+ border-top: var(--border-soft);
2175
+ height: var(--row-h);
2176
+ padding: var(--space-2) var(--space-4);
2177
+ vertical-align: middle;
2178
+ }
2179
+ .ds-data-table tbody tr:first-child th {
2180
+ border-top: 0;
2181
+ }
2182
+ .ds-row-note {
2183
+ padding-left: var(--space-2);
2184
+ border-left: 2px solid var(--line-control);
2185
+ font-weight: var(--fw-regular);
2186
+ }
2187
+ .ds-row-note[data-tone="caution"] {
2188
+ border-left-color: var(--brand-brass);
2189
+ }
2190
+ .ds-data-table tbody th {
2191
+ white-space: normal;
2192
+ }
2193
+ .ds-row-note {
2194
+ max-width: 42ch;
2195
+ }
2196
+
2197
+ sierra-copy {
2198
+ display: inline-flex;
2199
+ flex: none;
2200
+ position: relative;
2201
+ align-items: center;
2202
+ }
2203
+ sierra-copy button > span {
2204
+ display: flex;
2205
+ align-items: center;
2206
+ }
2207
+ sierra-copy [hidden] {
2208
+ display: none;
2209
+ }
2210
+ sierra-copy [data-copy-check] {
2211
+ color: var(--brand-green);
2212
+ }
2213
+ .ds-copy-error {
2214
+ position: absolute;
2215
+ right: 0;
2216
+ top: 100%;
2217
+ z-index: 2;
2218
+ width: 220px;
2219
+ padding: var(--space-2);
2220
+ background: var(--surface-raised);
2221
+ border: var(--border);
2222
+ border-radius: var(--radius-sm);
2223
+ color: var(--ink-strong);
2224
+ font-size: var(--fs-small);
2225
+ }
2226
+ .ds-values caption {
2227
+ padding: var(--space-4);
2228
+ }
2229
+ .ds-values th,
2230
+ .ds-values td {
2231
+ padding: var(--space-3) var(--space-4);
2232
+ }
2233
+ .ds-values tr:last-child > :is(th, td) {
2234
+ border-bottom: 0;
2235
+ }