@salemcobalt/ui 0.2.0-rc.0 → 0.2.0-rc.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/styles.css CHANGED
@@ -1,4 +1,4 @@
1
- /* @salemcobalt/ui 0.2.0-rc.0 — requires @salemcobalt/tokens/css. */
1
+ /* @salemcobalt/ui 0.2.0-rc.10 — requires @salemcobalt/tokens/css. */
2
2
  @layer sc {
3
3
  /* ---- base.css ---- */
4
4
  /* Shared: focus ring, reduced motion. Component files follow. */
@@ -6,10 +6,161 @@
6
6
  .sc-button:focus-visible,
7
7
  .sc-card[data-interactive]:focus-visible,
8
8
  .sc-dialog__close:focus-visible,
9
- .sc-menu__item:focus-visible {
9
+ .sc-menu__item:focus-visible,
10
+ .sc-input:focus-visible,
11
+ .sc-select:focus-visible,
12
+ .sc-select__item:focus-visible,
13
+ .sc-select__clear:focus-visible,
14
+ .sc-checkbox:focus-visible,
15
+ .sc-switch:focus-visible,
16
+ .sc-tabs__tab:focus-visible,
17
+ .sc-tabs__panel:focus-visible {
10
18
  outline: var(--sc-border-width-focus) solid var(--sc-color-border-focus);
11
19
  outline-offset: var(--sc-border-width-focus);
12
20
  }
21
+ /* Keeps content for assistive tech only. */
22
+ .sc-visually-hidden {
23
+ position: absolute;
24
+ inline-size: 1px;
25
+ block-size: 1px;
26
+ margin: -1px;
27
+ padding: 0;
28
+ overflow: hidden;
29
+ clip-path: inset(50%);
30
+ white-space: nowrap;
31
+ border: 0;
32
+ }
33
+
34
+ /* ---- typography.css ---- */
35
+ /* ---- Heading & Text -------------------------------------------------------- */
36
+ .sc-heading {
37
+ margin: 0;
38
+ font-family: var(--sc-font-family-sans);
39
+ font-weight: var(--sc-font-weight-semibold);
40
+ line-height: var(--sc-font-line-height-snug);
41
+ letter-spacing: var(--sc-font-tracking-normal);
42
+ color: var(--sc-color-text-default);
43
+ text-wrap: balance;
44
+ }
45
+ .sc-heading[data-size='sm'] {
46
+ font-size: var(--sc-font-size-sm);
47
+ line-height: var(--sc-font-line-height-ui);
48
+ }
49
+ .sc-heading[data-size='md'] {
50
+ font-size: var(--sc-font-size-md);
51
+ }
52
+ .sc-heading[data-size='lg'] {
53
+ font-size: var(--sc-font-size-lg);
54
+ }
55
+ .sc-heading[data-size='xl'] {
56
+ font-size: var(--sc-font-size-xl);
57
+ }
58
+ .sc-heading[data-size='2xl'] {
59
+ font-size: var(--sc-font-size-2xl);
60
+ letter-spacing: var(--sc-font-tracking-snug);
61
+ }
62
+ .sc-heading[data-size='3xl'] {
63
+ font-size: var(--sc-font-size-3xl);
64
+ letter-spacing: var(--sc-font-tracking-snug);
65
+ }
66
+ .sc-heading[data-size='4xl'] {
67
+ font-size: var(--sc-font-size-4xl);
68
+ line-height: var(--sc-font-line-height-tight);
69
+ letter-spacing: var(--sc-font-tracking-tight);
70
+ }
71
+ .sc-heading[data-size='5xl'] {
72
+ font-size: var(--sc-font-size-5xl);
73
+ line-height: var(--sc-font-line-height-tight);
74
+ letter-spacing: var(--sc-font-tracking-tight);
75
+ }
76
+ .sc-heading[data-truncate] {
77
+ overflow: hidden;
78
+ text-overflow: ellipsis;
79
+ white-space: nowrap;
80
+ text-wrap: nowrap;
81
+ }
82
+ .sc-text {
83
+ margin: 0;
84
+ font-family: var(--sc-font-family-sans);
85
+ font-size: var(--sc-font-size-sm);
86
+ font-weight: var(--sc-font-weight-regular);
87
+ line-height: var(--sc-font-line-height-ui);
88
+ color: var(--sc-color-text-default);
89
+ text-wrap: pretty;
90
+ }
91
+ .sc-text[data-size='xs'] {
92
+ font-size: var(--sc-font-size-xs);
93
+ }
94
+ .sc-text[data-size='md'] {
95
+ font-size: var(--sc-font-size-md);
96
+ line-height: var(--sc-font-line-height-normal);
97
+ }
98
+ .sc-text[data-size='lg'] {
99
+ font-size: var(--sc-font-size-lg);
100
+ line-height: var(--sc-font-line-height-normal);
101
+ }
102
+ .sc-text[data-weight='medium'] {
103
+ font-weight: var(--sc-font-weight-medium);
104
+ }
105
+ .sc-text[data-weight='semibold'] {
106
+ font-weight: var(--sc-font-weight-semibold);
107
+ }
108
+ .sc-text[data-align='center'] {
109
+ text-align: center;
110
+ }
111
+ .sc-text[data-align='end'] {
112
+ text-align: end;
113
+ }
114
+ .sc-text[data-align='start'] {
115
+ text-align: start;
116
+ }
117
+ .sc-text[data-numeric] {
118
+ font-variant-numeric: tabular-nums;
119
+ }
120
+ .sc-text[data-truncate=''] {
121
+ overflow: hidden;
122
+ text-overflow: ellipsis;
123
+ white-space: nowrap;
124
+ text-wrap: nowrap;
125
+ }
126
+ .sc-text[data-truncate='clamp'] {
127
+ display: -webkit-box;
128
+ -webkit-box-orient: vertical;
129
+ -webkit-line-clamp: var(--sc-text-lines);
130
+ line-clamp: var(--sc-text-lines);
131
+ overflow: hidden;
132
+ }
133
+ p.sc-text {
134
+ max-inline-size: var(--sc-font-measure);
135
+ }
136
+ .sc-heading[data-tone='muted'],
137
+ .sc-text[data-tone='muted'] {
138
+ color: var(--sc-color-text-muted);
139
+ }
140
+ .sc-heading[data-tone='subtle'],
141
+ .sc-text[data-tone='subtle'] {
142
+ color: var(--sc-color-text-subtle);
143
+ }
144
+ .sc-heading[data-tone='accent'],
145
+ .sc-text[data-tone='accent'] {
146
+ color: var(--sc-color-accent-text);
147
+ }
148
+ .sc-heading[data-tone='success'],
149
+ .sc-text[data-tone='success'] {
150
+ color: var(--sc-color-success-text);
151
+ }
152
+ .sc-heading[data-tone='warning'],
153
+ .sc-text[data-tone='warning'] {
154
+ color: var(--sc-color-warning-text);
155
+ }
156
+ .sc-heading[data-tone='danger'],
157
+ .sc-text[data-tone='danger'] {
158
+ color: var(--sc-color-danger-text);
159
+ }
160
+ .sc-heading[data-tone='info'],
161
+ .sc-text[data-tone='info'] {
162
+ color: var(--sc-color-info-text);
163
+ }
13
164
 
14
165
  /* ---- icon.css ---- */
15
166
  /* ---- Icon ------------------------------------------------------------------ */
@@ -155,6 +306,10 @@
155
306
  .sc-button[data-loading] > .sc-button__label {
156
307
  opacity: 0;
157
308
  }
309
+ /* Its own line box, so descenders sit inside the label (the button sets line-height: 1 for centring). */
310
+ .sc-button__label {
311
+ line-height: var(--sc-font-line-height-ui);
312
+ }
158
313
  .sc-button__icon {
159
314
  display: inline-flex;
160
315
  inline-size: 1.125em;
@@ -174,6 +329,44 @@
174
329
  border-inline-end-color: transparent;
175
330
  animation: sc-spin 0.8s linear infinite;
176
331
  }
332
+ /* Icon-only: square, the label kept for assistive tech only, no shortcut hint. Same element, so focus and
333
+ any open tooltip survive the switch. */
334
+ .sc-button[data-icon-only] {
335
+ inline-size: var(--_h);
336
+ padding-inline: 0;
337
+ }
338
+ .sc-button[data-icon-only] > .sc-button__label {
339
+ position: absolute;
340
+ inline-size: 1px;
341
+ block-size: 1px;
342
+ overflow: hidden;
343
+ clip-path: inset(50%);
344
+ white-space: nowrap;
345
+ }
346
+ .sc-button[data-icon-only] > .sc-button__shortcut {
347
+ display: none;
348
+ }
349
+ /* A shortcut hint after the label: a Kbd tinted to the button's own colour, so it reads on every variant. */
350
+ .sc-button__shortcut {
351
+ display: inline-flex;
352
+ align-items: center;
353
+ gap: var(--sc-spacing-3xs);
354
+ flex: none;
355
+ margin-inline-start: var(--sc-spacing-3xs);
356
+ }
357
+ .sc-button__shortcut .sc-kbd {
358
+ background: transparent;
359
+ color: inherit;
360
+ border-color: currentColor;
361
+ box-shadow: none;
362
+ opacity: 0.72;
363
+ }
364
+ .sc-button__shortcut .sc-kbd-group {
365
+ color: inherit;
366
+ }
367
+ .sc-button[data-loading] > .sc-button__shortcut {
368
+ opacity: 0;
369
+ }
177
370
  @keyframes sc-spin {
178
371
  to {
179
372
  rotate: 1turn;
@@ -210,6 +403,40 @@
210
403
  .sc-icon-button[data-loading] > .sc-button__icon {
211
404
  opacity: 0;
212
405
  }
406
+ /* Status dot, top-left: icons such as the broom own the top-right and fill the bottom. Physical corner on
407
+ purpose, because the glyph does not mirror in RTL either. */
408
+ .sc-icon-button__dot {
409
+ --_dot: var(--sc-color-accent-default);
410
+ position: absolute;
411
+ inset: var(--sc-spacing-2xs) auto auto var(--sc-spacing-2xs);
412
+ inline-size: 8px;
413
+ block-size: 8px;
414
+ border-radius: var(--sc-radius-full);
415
+ background: var(--_dot);
416
+ box-shadow: 0 0 0 var(--sc-border-width-focus)
417
+ var(--sc-icon-button-dot-ring, var(--sc-color-surface-default));
418
+ pointer-events: none;
419
+ }
420
+ .sc-icon-button[data-size='sm'] > .sc-icon-button__dot {
421
+ inset: var(--sc-spacing-3xs) auto auto var(--sc-spacing-3xs);
422
+ inline-size: 6px;
423
+ block-size: 6px;
424
+ }
425
+ .sc-icon-button__dot[data-tone='neutral'] {
426
+ --_dot: var(--sc-color-text-subtle);
427
+ }
428
+ .sc-icon-button__dot[data-tone='success'] {
429
+ --_dot: var(--sc-color-success-solid);
430
+ }
431
+ .sc-icon-button__dot[data-tone='warning'] {
432
+ --_dot: var(--sc-color-warning-solid);
433
+ }
434
+ .sc-icon-button__dot[data-tone='danger'] {
435
+ --_dot: var(--sc-color-danger-solid);
436
+ }
437
+ .sc-icon-button__dot[data-tone='info'] {
438
+ --_dot: var(--sc-color-info-solid);
439
+ }
213
440
  .sc-button[data-popup-open] {
214
441
  background: var(--sc-color-surface-active);
215
442
  }
@@ -363,6 +590,9 @@
363
590
  --_p: var(--sc-spacing-lg);
364
591
  }
365
592
  .sc-card[data-variant='elevated'] {
593
+ /* Hover and pressed washes inside a raised surface use the raised tokens, so they show against it (docs/adr/0003). */
594
+ --sc-color-surface-hover: var(--sc-color-surface-raised-hover);
595
+ --sc-color-surface-active: var(--sc-color-surface-raised-active);
366
596
  box-shadow: var(--sc-elevation-1);
367
597
  border-color: transparent;
368
598
  }
@@ -434,11 +664,25 @@
434
664
  }
435
665
  ul.sc-stack,
436
666
  ol.sc-stack,
437
- ul.sc-inline {
667
+ ul.sc-inline,
668
+ ol.sc-inline {
438
669
  margin: 0;
439
670
  padding: 0;
440
671
  list-style: none;
441
672
  }
673
+ li.sc-stack,
674
+ li.sc-inline {
675
+ list-style: none;
676
+ }
677
+ fieldset.sc-stack {
678
+ margin: 0;
679
+ padding: 0;
680
+ border: 0;
681
+ min-inline-size: 0;
682
+ }
683
+ dl.sc-stack {
684
+ margin: 0;
685
+ }
442
686
  .sc-stack[data-gap='none'],
443
687
  .sc-inline[data-gap='none'] {
444
688
  gap: var(--sc-spacing-none);
@@ -567,19 +811,27 @@
567
811
  transition-duration: calc(var(--sc-duration-base) * 0.75);
568
812
  transition-timing-function: var(--sc-ease-exit);
569
813
  }
814
+ /* The popup never exceeds the viewport minus a gutter each side, whatever `size` says. 100dvw rather than
815
+ 100% so the clamp holds inside a transformed or narrow portal container too. */
570
816
  .sc-dialog__popup {
817
+ --_gutter: var(--sc-spacing-md);
818
+ --_max: calc(100dvw - 2 * var(--_gutter));
571
819
  position: fixed;
572
820
  inset: 0;
573
821
  margin: auto;
574
822
  z-index: var(--sc-z-dialog);
575
823
  box-sizing: border-box;
576
- inline-size: min(100% - 2 * var(--sc-spacing-md), var(--sc-size-dialog-md));
577
- max-block-size: min(100% - 2 * var(--sc-spacing-md), 85dvh);
824
+ inline-size: min(var(--_max), var(--sc-size-dialog-md));
825
+ max-inline-size: var(--_max);
826
+ max-block-size: min(100dvh - 2 * var(--_gutter), 85dvh);
578
827
  block-size: fit-content;
579
828
  overflow: auto;
580
829
  padding: var(--sc-spacing-lg);
581
830
  border-radius: var(--sc-radius-xl);
582
831
  background: var(--sc-color-surface-raised);
832
+ /* Hover and pressed washes inside a raised surface use the raised tokens, so they show against it (docs/adr/0003). */
833
+ --sc-color-surface-hover: var(--sc-color-surface-raised-hover);
834
+ --sc-color-surface-active: var(--sc-color-surface-raised-active);
583
835
  color: var(--sc-color-text-default);
584
836
  border: var(--sc-border-width-hairline) solid var(--sc-color-border-default);
585
837
  box-shadow: var(--sc-elevation-3);
@@ -600,10 +852,10 @@
600
852
  transition-timing-function: var(--sc-ease-exit);
601
853
  }
602
854
  .sc-dialog__popup[data-size='sm'] {
603
- inline-size: min(100% - 2 * var(--sc-spacing-md), var(--sc-size-dialog-sm));
855
+ inline-size: min(var(--_max), var(--sc-size-dialog-sm));
604
856
  }
605
857
  .sc-dialog__popup[data-size='lg'] {
606
- inline-size: min(100% - 2 * var(--sc-spacing-md), var(--sc-size-dialog-lg));
858
+ inline-size: min(var(--_max), var(--sc-size-dialog-lg));
607
859
  }
608
860
  .sc-dialog__title {
609
861
  margin: 0;
@@ -624,6 +876,20 @@
624
876
  font-size: var(--sc-font-size-sm);
625
877
  line-height: var(--sc-font-line-height-normal);
626
878
  }
879
+ /* Content wraps instead of widening the popup: long URLs break, fields and media stay inside the box. */
880
+ .sc-dialog__title,
881
+ .sc-dialog__description,
882
+ .sc-dialog__body {
883
+ min-inline-size: 0;
884
+ overflow-wrap: anywhere;
885
+ }
886
+ .sc-dialog__body > *,
887
+ .sc-dialog__body :where(img, video, table, pre, .sc-select) {
888
+ max-inline-size: 100%;
889
+ }
890
+ .sc-dialog__body :where(pre) {
891
+ overflow: auto;
892
+ }
627
893
  .sc-dialog__actions {
628
894
  margin-block-start: var(--sc-spacing-lg);
629
895
  }
@@ -646,6 +912,65 @@
646
912
  background: var(--sc-color-surface-hover);
647
913
  color: var(--sc-color-text-default);
648
914
  }
915
+ /* Sheet: title and actions stay put, the body scrolls. Same centred box as `dialog` on wide viewports. */
916
+ .sc-dialog__popup[data-variant='sheet'] {
917
+ display: flex;
918
+ flex-direction: column;
919
+ overflow: hidden;
920
+ }
921
+ .sc-dialog__popup[data-variant='sheet'] > .sc-dialog__title,
922
+ .sc-dialog__popup[data-variant='sheet'] > .sc-dialog__description,
923
+ .sc-dialog__popup[data-variant='sheet'] > .sc-dialog__actions {
924
+ flex: none;
925
+ }
926
+ .sc-dialog__popup[data-variant='sheet'] > .sc-dialog__body {
927
+ flex: 1 1 auto;
928
+ min-block-size: 0;
929
+ overflow: auto;
930
+ overscroll-behavior: contain;
931
+ }
932
+ /* Below 640px the sheet docks to the bottom edge, full width, and slides up. The breakpoint is fixed
933
+ here because custom properties cannot drive a media query. */
934
+ @media (width < 640px) {
935
+ .sc-dialog__popup[data-variant='sheet'] {
936
+ inset: auto 0 0 0;
937
+ margin: 0;
938
+ inline-size: 100%;
939
+ max-inline-size: none;
940
+ max-block-size: calc(100dvh - env(safe-area-inset-top, 0px) - var(--sc-spacing-xl));
941
+ padding-block-end: calc(var(--sc-spacing-lg) + env(safe-area-inset-bottom, 0px));
942
+ padding-inline: calc(var(--sc-spacing-lg) + env(safe-area-inset-left, 0px))
943
+ calc(var(--sc-spacing-lg) + env(safe-area-inset-right, 0px));
944
+ border-block-end: 0;
945
+ border-radius: var(--sc-radius-xl) var(--sc-radius-xl) 0 0;
946
+ transition:
947
+ opacity var(--sc-duration-base) var(--sc-ease-enter),
948
+ translate var(--sc-duration-base) var(--sc-ease-enter);
949
+ }
950
+ .sc-dialog__popup[data-variant='sheet']::before {
951
+ content: '';
952
+ flex: none;
953
+ align-self: center;
954
+ inline-size: 36px;
955
+ block-size: 4px;
956
+ margin-block: calc(-1 * var(--sc-spacing-sm)) var(--sc-spacing-md);
957
+ border-radius: var(--sc-radius-full);
958
+ background: var(--sc-color-border-strong);
959
+ }
960
+ .sc-dialog__popup[data-variant='sheet'][data-starting-style],
961
+ .sc-dialog__popup[data-variant='sheet'][data-ending-style] {
962
+ opacity: 1;
963
+ translate: 0 100%;
964
+ scale: none;
965
+ }
966
+ /* Actions stack full width, confirming action on top, in thumb reach. */
967
+ .sc-dialog__popup[data-variant='sheet'] > .sc-dialog__actions {
968
+ flex-wrap: wrap-reverse;
969
+ }
970
+ .sc-dialog__popup[data-variant='sheet'] > .sc-dialog__actions > * {
971
+ flex: 1 1 100%;
972
+ }
973
+ }
649
974
  @media (prefers-reduced-motion: reduce) {
650
975
  .sc-dialog__backdrop,
651
976
  .sc-dialog__popup {
@@ -764,6 +1089,9 @@
764
1089
  padding: var(--sc-spacing-2xs);
765
1090
  border-radius: var(--sc-radius-lg);
766
1091
  background: var(--sc-color-surface-raised);
1092
+ /* Hover and pressed washes inside a raised surface use the raised tokens, so they show against it (docs/adr/0003). */
1093
+ --sc-color-surface-hover: var(--sc-color-surface-raised-hover);
1094
+ --sc-color-surface-active: var(--sc-color-surface-raised-active);
767
1095
  color: var(--sc-color-text-default);
768
1096
  border: var(--sc-border-width-hairline) solid var(--sc-color-border-default);
769
1097
  box-shadow: var(--sc-elevation-2);
@@ -799,7 +1127,7 @@
799
1127
  border-radius: var(--sc-radius-sm);
800
1128
  color: var(--sc-color-text-default);
801
1129
  text-decoration: none;
802
- cursor: default;
1130
+ cursor: pointer;
803
1131
  user-select: none;
804
1132
  outline: 0;
805
1133
  }
@@ -880,4 +1208,3467 @@
880
1208
  }
881
1209
  }
882
1210
 
1211
+ /* ---- field.css ---- */
1212
+ /* ---- Field (Input, Textarea, Select) --------------------------------------- */
1213
+ .sc-field {
1214
+ --_h: var(--sc-size-control-md);
1215
+ --_px: var(--sc-spacing-sm);
1216
+ --_radius: var(--sc-radius-md);
1217
+ --_fs: var(--sc-font-size-sm);
1218
+ display: flex;
1219
+ flex-direction: column;
1220
+ align-items: stretch;
1221
+ gap: var(--sc-spacing-2xs);
1222
+ min-inline-size: 0;
1223
+ font-family: var(--sc-font-family-sans);
1224
+ font-size: var(--sc-font-size-sm);
1225
+ line-height: var(--sc-font-line-height-ui);
1226
+ color: var(--sc-color-text-default);
1227
+ }
1228
+ .sc-field[data-size='sm'] {
1229
+ --_h: var(--sc-size-control-sm);
1230
+ --_px: var(--sc-spacing-xs);
1231
+ --_radius: var(--sc-radius-sm);
1232
+ }
1233
+ .sc-field[data-size='lg'] {
1234
+ --_h: var(--sc-size-control-lg);
1235
+ --_px: var(--sc-spacing-md);
1236
+ --_fs: var(--sc-font-size-md);
1237
+ }
1238
+ .sc-field__label {
1239
+ font-weight: var(--sc-font-weight-medium);
1240
+ cursor: default;
1241
+ }
1242
+ .sc-field[data-disabled] .sc-field__label {
1243
+ color: var(--sc-color-text-subtle);
1244
+ }
1245
+ .sc-field__required {
1246
+ margin-inline-start: var(--sc-spacing-3xs);
1247
+ color: var(--sc-color-danger-text);
1248
+ }
1249
+ .sc-field__description {
1250
+ margin: 0;
1251
+ color: var(--sc-color-text-muted);
1252
+ font-size: var(--sc-font-size-xs);
1253
+ }
1254
+ .sc-field__error {
1255
+ margin: 0;
1256
+ color: var(--sc-color-danger-text);
1257
+ font-size: var(--sc-font-size-xs);
1258
+ }
1259
+ /* Input */
1260
+ .sc-input-wrap {
1261
+ position: relative;
1262
+ display: flex;
1263
+ align-items: center;
1264
+ min-inline-size: 0;
1265
+ }
1266
+ .sc-input {
1267
+ appearance: none;
1268
+ box-sizing: border-box;
1269
+ inline-size: 100%;
1270
+ min-inline-size: 0;
1271
+ block-size: var(--_h);
1272
+ margin: 0;
1273
+ padding-block: 0;
1274
+ padding-inline: var(--_px);
1275
+ border: var(--sc-border-width-hairline) solid var(--sc-color-border-strong);
1276
+ border-radius: var(--_radius);
1277
+ background: var(--sc-color-surface-default);
1278
+ color: var(--sc-color-text-default);
1279
+ font: inherit;
1280
+ font-size: var(--_fs);
1281
+ line-height: var(--sc-font-line-height-ui);
1282
+ transition:
1283
+ border-color var(--sc-duration-fast) var(--sc-ease-standard),
1284
+ background-color var(--sc-duration-fast) var(--sc-ease-standard);
1285
+ }
1286
+ .sc-input::placeholder {
1287
+ color: var(--sc-color-text-subtle);
1288
+ opacity: 1;
1289
+ }
1290
+ .sc-input:hover:not(:disabled) {
1291
+ border-color: var(--sc-color-text-muted);
1292
+ }
1293
+ .sc-input:focus-visible {
1294
+ border-color: var(--sc-color-border-focus);
1295
+ outline-offset: 0;
1296
+ }
1297
+ .sc-input[data-invalid] {
1298
+ border-color: var(--sc-color-danger-solid);
1299
+ }
1300
+ .sc-input:disabled {
1301
+ background: var(--sc-color-surface-sunken);
1302
+ color: var(--sc-color-text-subtle);
1303
+ cursor: not-allowed;
1304
+ }
1305
+ /* Native date, time and number fields: same box, tabular digits, the picker indicator at the end edge. */
1306
+ .sc-input:is(
1307
+ [type='date'],
1308
+ [type='time'],
1309
+ [type='datetime-local'],
1310
+ [type='month'],
1311
+ [type='week'],
1312
+ [type='number']
1313
+ ) {
1314
+ font-variant-numeric: tabular-nums;
1315
+ }
1316
+ .sc-input::-webkit-date-and-time-value {
1317
+ min-block-size: 1lh;
1318
+ text-align: start;
1319
+ }
1320
+ .sc-input::-webkit-calendar-picker-indicator {
1321
+ margin-inline-start: var(--sc-spacing-xs);
1322
+ padding: 0;
1323
+ opacity: 0.7;
1324
+ cursor: pointer;
1325
+ }
1326
+ .sc-input::-webkit-calendar-picker-indicator:hover {
1327
+ opacity: 1;
1328
+ }
1329
+ .sc-input-wrap[data-icon-start] > .sc-input {
1330
+ padding-inline-start: calc(var(--_px) + var(--sc-size-icon-md) + var(--sc-spacing-xs));
1331
+ }
1332
+ .sc-input-wrap[data-icon-end] > .sc-input {
1333
+ padding-inline-end: calc(var(--_px) + var(--sc-size-icon-md) + var(--sc-spacing-xs));
1334
+ }
1335
+ .sc-input__icon {
1336
+ position: absolute;
1337
+ inset-block-start: 50%;
1338
+ translate: 0 -50%;
1339
+ display: inline-flex;
1340
+ inline-size: var(--sc-size-icon-md);
1341
+ block-size: var(--sc-size-icon-md);
1342
+ color: var(--sc-color-text-muted);
1343
+ pointer-events: none;
1344
+ }
1345
+ .sc-input__icon[data-side='start'] {
1346
+ inset-inline-start: var(--_px);
1347
+ }
1348
+ .sc-input__icon[data-side='end'] {
1349
+ inset-inline-end: var(--_px);
1350
+ }
1351
+ .sc-input__icon > svg {
1352
+ inline-size: 100%;
1353
+ block-size: 100%;
1354
+ }
1355
+ /* Textarea */
1356
+ .sc-textarea {
1357
+ block-size: auto;
1358
+ min-block-size: var(--_h);
1359
+ padding-block: var(--sc-spacing-xs);
1360
+ line-height: var(--sc-font-line-height-normal);
1361
+ resize: vertical;
1362
+ }
1363
+ .sc-textarea[data-resize='none'] {
1364
+ resize: none;
1365
+ }
1366
+ .sc-textarea[data-variant='code'] {
1367
+ font-family: var(--sc-font-family-mono);
1368
+ font-size: calc(var(--_fs) * 0.95);
1369
+ line-height: var(--sc-font-line-height-normal);
1370
+ tab-size: 2;
1371
+ hyphens: none;
1372
+ overflow-wrap: normal;
1373
+ }
1374
+ .sc-textarea[wrap='off'] {
1375
+ white-space: pre;
1376
+ overflow-x: auto;
1377
+ }
1378
+ /* Select */
1379
+ .sc-select__wrap {
1380
+ position: relative;
1381
+ display: inline-flex;
1382
+ max-inline-size: 100%;
1383
+ align-self: flex-start;
1384
+ }
1385
+ .sc-select__wrap[data-full-width] {
1386
+ display: flex;
1387
+ align-self: stretch;
1388
+ }
1389
+ .sc-select {
1390
+ box-sizing: border-box;
1391
+ display: inline-flex;
1392
+ align-items: center;
1393
+ justify-content: space-between;
1394
+ gap: var(--sc-spacing-xs);
1395
+ min-inline-size: 160px;
1396
+ max-inline-size: 100%;
1397
+ block-size: var(--_h);
1398
+ margin: 0;
1399
+ padding-inline: var(--_px) var(--sc-spacing-xs);
1400
+ border: var(--sc-border-width-hairline) solid var(--sc-color-border-strong);
1401
+ border-radius: var(--_radius);
1402
+ background: var(--sc-color-surface-default);
1403
+ color: var(--sc-color-text-default);
1404
+ font: inherit;
1405
+ font-size: var(--_fs);
1406
+ line-height: 1;
1407
+ text-align: start;
1408
+ white-space: nowrap;
1409
+ cursor: pointer;
1410
+ user-select: none;
1411
+ align-self: flex-start;
1412
+ transition:
1413
+ border-color var(--sc-duration-fast) var(--sc-ease-standard),
1414
+ background-color var(--sc-duration-fast) var(--sc-ease-standard);
1415
+ }
1416
+ .sc-select[data-full-width] {
1417
+ inline-size: 100%;
1418
+ align-self: stretch;
1419
+ }
1420
+ /* Room for the × between the value and the chevron. The clear button is a sibling, never nested in the trigger. */
1421
+ .sc-select[data-clearable] > .sc-select__icon {
1422
+ margin-inline-start: calc(var(--sc-size-icon-lg) + var(--sc-spacing-2xs));
1423
+ }
1424
+ .sc-select__clear {
1425
+ position: absolute;
1426
+ inset-block-start: 50%;
1427
+ inset-inline-end: calc(var(--sc-spacing-xs) + var(--sc-size-icon-md) + var(--sc-spacing-2xs));
1428
+ translate: 0 -50%;
1429
+ display: inline-grid;
1430
+ place-items: center;
1431
+ inline-size: var(--sc-size-icon-lg);
1432
+ block-size: var(--sc-size-icon-lg);
1433
+ padding: 0;
1434
+ border: 0;
1435
+ border-radius: var(--sc-radius-sm);
1436
+ background: transparent;
1437
+ color: var(--sc-color-text-muted);
1438
+ cursor: pointer;
1439
+ }
1440
+ .sc-select__clear:hover {
1441
+ background: var(--sc-color-surface-hover);
1442
+ color: var(--sc-color-text-default);
1443
+ }
1444
+ .sc-select:hover:not([data-disabled]) {
1445
+ border-color: var(--sc-color-text-muted);
1446
+ }
1447
+ .sc-select[data-popup-open] {
1448
+ background: var(--sc-color-surface-hover);
1449
+ }
1450
+ .sc-select:focus-visible {
1451
+ border-color: var(--sc-color-border-focus);
1452
+ outline-offset: 0;
1453
+ }
1454
+ .sc-select[data-invalid] {
1455
+ border-color: var(--sc-color-danger-solid);
1456
+ }
1457
+ .sc-select[data-disabled] {
1458
+ background: var(--sc-color-surface-sunken);
1459
+ color: var(--sc-color-text-subtle);
1460
+ cursor: not-allowed;
1461
+ }
1462
+ .sc-select__value {
1463
+ overflow: hidden;
1464
+ text-overflow: ellipsis;
1465
+ }
1466
+ .sc-select__value[data-placeholder] {
1467
+ color: var(--sc-color-text-subtle);
1468
+ }
1469
+ .sc-select__icon {
1470
+ display: inline-flex;
1471
+ flex: none;
1472
+ color: var(--sc-color-text-muted);
1473
+ }
1474
+ .sc-select__positioner {
1475
+ z-index: var(--sc-z-dropdown);
1476
+ outline: 0;
1477
+ }
1478
+ .sc-select__popup {
1479
+ box-sizing: border-box;
1480
+ min-inline-size: var(--anchor-width);
1481
+ max-block-size: var(--available-height);
1482
+ overflow: auto;
1483
+ padding: var(--sc-spacing-2xs);
1484
+ border-radius: var(--sc-radius-lg);
1485
+ background: var(--sc-color-surface-raised);
1486
+ /* Hover and pressed washes inside a raised surface use the raised tokens, so they show against it (docs/adr/0003). */
1487
+ --sc-color-surface-hover: var(--sc-color-surface-raised-hover);
1488
+ --sc-color-surface-active: var(--sc-color-surface-raised-active);
1489
+ color: var(--sc-color-text-default);
1490
+ border: var(--sc-border-width-hairline) solid var(--sc-color-border-default);
1491
+ box-shadow: var(--sc-elevation-2);
1492
+ font-family: var(--sc-font-family-sans);
1493
+ font-size: var(--sc-font-size-sm);
1494
+ line-height: var(--sc-font-line-height-ui);
1495
+ outline: 0;
1496
+ transform-origin: var(--transform-origin);
1497
+ transition:
1498
+ opacity var(--sc-duration-fast) var(--sc-ease-enter),
1499
+ scale var(--sc-duration-fast) var(--sc-ease-enter);
1500
+ }
1501
+ .sc-select__popup[data-starting-style],
1502
+ .sc-select__popup[data-ending-style] {
1503
+ opacity: 0;
1504
+ scale: 0.97;
1505
+ }
1506
+ .sc-select__item {
1507
+ display: grid;
1508
+ grid-template-columns: var(--sc-size-icon-md) 1fr;
1509
+ align-items: center;
1510
+ column-gap: var(--sc-spacing-xs);
1511
+ box-sizing: border-box;
1512
+ min-block-size: var(--sc-size-control-sm);
1513
+ padding-inline: var(--sc-spacing-xs);
1514
+ padding-block: var(--sc-spacing-2xs);
1515
+ border-radius: var(--sc-radius-sm);
1516
+ cursor: pointer;
1517
+ user-select: none;
1518
+ outline: 0;
1519
+ }
1520
+ .sc-select__item[data-highlighted] {
1521
+ background: var(--sc-color-surface-hover);
1522
+ }
1523
+ .sc-select__item[data-disabled] {
1524
+ opacity: 0.5;
1525
+ cursor: not-allowed;
1526
+ }
1527
+ .sc-select__indicator {
1528
+ grid-column: 1;
1529
+ display: inline-flex;
1530
+ color: var(--sc-color-accent-text);
1531
+ }
1532
+ .sc-select__item-text {
1533
+ grid-column: 2;
1534
+ }
1535
+ .sc-select__group-label {
1536
+ padding: var(--sc-spacing-2xs) var(--sc-spacing-xs);
1537
+ color: var(--sc-color-text-muted);
1538
+ font-size: var(--sc-font-size-xs);
1539
+ font-weight: var(--sc-font-weight-medium);
1540
+ letter-spacing: var(--sc-font-tracking-wide);
1541
+ text-transform: uppercase;
1542
+ }
1543
+ /* Checkbox and Switch share a labelled row */
1544
+ .sc-choice {
1545
+ --_gap: var(--sc-spacing-xs);
1546
+ display: grid;
1547
+ grid-template-columns: auto 1fr;
1548
+ column-gap: var(--_gap);
1549
+ row-gap: var(--sc-spacing-3xs);
1550
+ inline-size: fit-content;
1551
+ font-family: var(--sc-font-family-sans);
1552
+ font-size: var(--sc-font-size-sm);
1553
+ line-height: var(--sc-font-line-height-ui);
1554
+ color: var(--sc-color-text-default);
1555
+ }
1556
+ .sc-choice__control {
1557
+ grid-column: 1 / -1;
1558
+ display: grid;
1559
+ grid-template-columns: subgrid;
1560
+ align-items: start;
1561
+ cursor: pointer;
1562
+ user-select: none;
1563
+ }
1564
+ .sc-choice[data-label-position='start'] {
1565
+ grid-template-columns: 1fr auto;
1566
+ inline-size: 100%;
1567
+ }
1568
+ .sc-choice[data-label-position='start'] > .sc-choice__control > .sc-switch {
1569
+ order: 1;
1570
+ }
1571
+ .sc-choice[data-disabled] {
1572
+ color: var(--sc-color-text-subtle);
1573
+ }
1574
+ .sc-choice[data-disabled] > .sc-choice__control {
1575
+ cursor: not-allowed;
1576
+ }
1577
+ .sc-choice__label {
1578
+ padding-block: calc((var(--sc-size-icon-lg) - 1lh) / 2);
1579
+ }
1580
+ .sc-choice__description {
1581
+ grid-column: 2;
1582
+ color: var(--sc-color-text-muted);
1583
+ font-size: var(--sc-font-size-xs);
1584
+ }
1585
+ .sc-choice[data-label-position='start'] > .sc-choice__description {
1586
+ grid-column: 1;
1587
+ }
1588
+ .sc-choice[data-disabled] > .sc-choice__description {
1589
+ color: var(--sc-color-text-subtle);
1590
+ }
1591
+ .sc-checkbox {
1592
+ box-sizing: border-box;
1593
+ display: inline-grid;
1594
+ place-items: center;
1595
+ inline-size: var(--sc-size-icon-lg);
1596
+ block-size: var(--sc-size-icon-lg);
1597
+ margin: 0;
1598
+ padding: 0;
1599
+ border: var(--sc-border-width-hairline) solid var(--sc-color-border-strong);
1600
+ border-radius: var(--sc-radius-sm);
1601
+ background: var(--sc-color-surface-default);
1602
+ color: var(--sc-color-text-on-accent);
1603
+ cursor: inherit;
1604
+ transition:
1605
+ background-color var(--sc-duration-fast) var(--sc-ease-standard),
1606
+ border-color var(--sc-duration-fast) var(--sc-ease-standard);
1607
+ }
1608
+ .sc-checkbox:hover:not([data-disabled]) {
1609
+ border-color: var(--sc-color-text-muted);
1610
+ }
1611
+ .sc-checkbox[data-checked],
1612
+ .sc-checkbox[data-indeterminate] {
1613
+ background: var(--sc-color-accent-default);
1614
+ border-color: var(--sc-color-accent-default);
1615
+ }
1616
+ .sc-checkbox[data-invalid] {
1617
+ border-color: var(--sc-color-danger-solid);
1618
+ }
1619
+ .sc-checkbox[data-disabled] {
1620
+ opacity: 0.5;
1621
+ }
1622
+ .sc-checkbox__indicator {
1623
+ display: inline-grid;
1624
+ place-items: center;
1625
+ }
1626
+ .sc-checkbox__dash,
1627
+ .sc-checkbox[data-indeterminate] .sc-checkbox__check {
1628
+ display: none;
1629
+ }
1630
+ .sc-checkbox[data-indeterminate] .sc-checkbox__dash {
1631
+ display: inline-block;
1632
+ }
1633
+ .sc-switch {
1634
+ --_w: 36px;
1635
+ --_h: var(--sc-size-icon-lg);
1636
+ --_pad: 2px;
1637
+ box-sizing: border-box;
1638
+ position: relative;
1639
+ display: inline-block;
1640
+ inline-size: var(--_w);
1641
+ block-size: var(--_h);
1642
+ margin: 0;
1643
+ padding: var(--_pad);
1644
+ border: 0;
1645
+ border-radius: var(--sc-radius-full);
1646
+ background: var(--sc-color-border-strong);
1647
+ cursor: inherit;
1648
+ transition: background-color var(--sc-duration-fast) var(--sc-ease-standard);
1649
+ }
1650
+ .sc-switch:hover:not([data-disabled]) {
1651
+ background: var(--sc-color-text-muted);
1652
+ }
1653
+ .sc-switch[data-checked] {
1654
+ background: var(--sc-color-accent-default);
1655
+ }
1656
+ .sc-switch[data-checked]:hover:not([data-disabled]) {
1657
+ background: var(--sc-color-accent-hover);
1658
+ }
1659
+ .sc-switch[data-disabled] {
1660
+ opacity: 0.5;
1661
+ }
1662
+ .sc-switch__thumb {
1663
+ display: block;
1664
+ inline-size: calc(var(--_h) - 2 * var(--_pad));
1665
+ block-size: calc(var(--_h) - 2 * var(--_pad));
1666
+ border-radius: var(--sc-radius-full);
1667
+ background: var(--sc-color-surface-default);
1668
+ box-shadow: var(--sc-elevation-1);
1669
+ transition: translate var(--sc-duration-fast) var(--sc-ease-standard);
1670
+ }
1671
+ .sc-switch[data-checked] > .sc-switch__thumb {
1672
+ translate: calc(var(--_w) - var(--_h)) 0;
1673
+ }
1674
+ @media (prefers-reduced-motion: reduce) {
1675
+ .sc-input,
1676
+ .sc-select,
1677
+ .sc-select__popup,
1678
+ .sc-checkbox,
1679
+ .sc-switch,
1680
+ .sc-switch__thumb {
1681
+ transition: none;
1682
+ }
1683
+ .sc-select__popup[data-starting-style],
1684
+ .sc-select__popup[data-ending-style] {
1685
+ scale: none;
1686
+ }
1687
+ }
1688
+
1689
+ /* ---- tabs.css ---- */
1690
+ /* ---- Tabs ------------------------------------------------------------------ */
1691
+ .sc-tabs {
1692
+ display: flex;
1693
+ flex-direction: column;
1694
+ min-inline-size: 0;
1695
+ font-family: var(--sc-font-family-sans);
1696
+ }
1697
+ .sc-tabs__list {
1698
+ position: relative;
1699
+ display: flex;
1700
+ gap: var(--sc-spacing-2xs);
1701
+ min-inline-size: 0;
1702
+ overflow-x: auto;
1703
+ scrollbar-width: none;
1704
+ border-block-end: var(--sc-border-width-hairline) solid var(--sc-color-border-default);
1705
+ }
1706
+ .sc-tabs__list[data-fill] > .sc-tabs__tab {
1707
+ flex: 1 1 0;
1708
+ }
1709
+ .sc-tabs__tab {
1710
+ display: inline-flex;
1711
+ align-items: center;
1712
+ justify-content: center;
1713
+ gap: var(--sc-spacing-2xs);
1714
+ box-sizing: border-box;
1715
+ block-size: var(--sc-size-control-md);
1716
+ margin: 0;
1717
+ padding-inline: var(--sc-spacing-sm);
1718
+ border: 0;
1719
+ border-radius: var(--sc-radius-sm) var(--sc-radius-sm) 0 0;
1720
+ background: transparent;
1721
+ color: var(--sc-color-text-muted);
1722
+ font: inherit;
1723
+ font-size: var(--sc-font-size-sm);
1724
+ font-weight: var(--sc-font-weight-medium);
1725
+ line-height: 1;
1726
+ white-space: nowrap;
1727
+ cursor: pointer;
1728
+ user-select: none;
1729
+ transition: color var(--sc-duration-fast) var(--sc-ease-standard);
1730
+ }
1731
+ .sc-tabs__tab:hover:not([data-disabled]) {
1732
+ color: var(--sc-color-text-default);
1733
+ background: var(--sc-color-surface-hover);
1734
+ }
1735
+ .sc-tabs__tab[data-active] {
1736
+ color: var(--sc-color-text-default);
1737
+ }
1738
+ .sc-tabs__tab[data-disabled] {
1739
+ opacity: 0.5;
1740
+ cursor: not-allowed;
1741
+ }
1742
+ .sc-tabs__tab:focus-visible {
1743
+ outline-offset: calc(-1 * var(--sc-border-width-focus));
1744
+ }
1745
+ .sc-tabs__icon {
1746
+ display: inline-flex;
1747
+ color: inherit;
1748
+ }
1749
+ .sc-tabs__count {
1750
+ padding-inline: var(--sc-spacing-2xs);
1751
+ border-radius: var(--sc-radius-sm);
1752
+ background: var(--sc-color-surface-active);
1753
+ color: var(--sc-color-text-muted);
1754
+ font-size: var(--sc-font-size-xs);
1755
+ font-variant-numeric: tabular-nums;
1756
+ line-height: 1.4;
1757
+ }
1758
+ .sc-tabs__tab[data-active] > .sc-tabs__count {
1759
+ background: var(--sc-color-accent-subtle);
1760
+ color: var(--sc-color-accent-text);
1761
+ }
1762
+ .sc-tabs__indicator {
1763
+ position: absolute;
1764
+ inset-block-end: calc(-1 * var(--sc-border-width-hairline));
1765
+ inset-inline-start: 0;
1766
+ inline-size: var(--active-tab-width);
1767
+ block-size: var(--sc-border-width-focus);
1768
+ translate: var(--active-tab-left) 0;
1769
+ background: var(--sc-color-accent-default);
1770
+ border-radius: var(--sc-radius-full) var(--sc-radius-full) 0 0;
1771
+ transition:
1772
+ translate var(--sc-duration-base) var(--sc-ease-standard),
1773
+ inline-size var(--sc-duration-base) var(--sc-ease-standard);
1774
+ }
1775
+ .sc-tabs__panel {
1776
+ min-inline-size: 0;
1777
+ padding-block-start: var(--sc-spacing-md);
1778
+ }
1779
+ .sc-tabs__panel[data-hidden] {
1780
+ display: none;
1781
+ }
1782
+ /* Segmented: a quiet control. Sunken track, the active tab raised on `surface-default` by the sliding
1783
+ indicator, no accent colour; counts are plain muted numbers
1784
+ (`text-muted`, not `text-subtle`, which fails AA on the sunken track). */
1785
+ .sc-tabs__list[data-variant='segmented'] {
1786
+ display: inline-flex;
1787
+ align-self: flex-start;
1788
+ max-inline-size: 100%;
1789
+ gap: var(--sc-spacing-3xs);
1790
+ padding: var(--sc-spacing-3xs);
1791
+ border-block-end: 0;
1792
+ border-radius: var(--sc-radius-md);
1793
+ background: var(--sc-color-surface-sunken);
1794
+ isolation: isolate;
1795
+ }
1796
+ .sc-tabs__list[data-variant='segmented'][data-fill] {
1797
+ display: flex;
1798
+ align-self: stretch;
1799
+ }
1800
+ .sc-tabs__list[data-variant='segmented'] > .sc-tabs__tab {
1801
+ position: relative;
1802
+ z-index: 1;
1803
+ block-size: var(--sc-size-control-sm);
1804
+ padding-inline: var(--sc-spacing-sm);
1805
+ border-radius: var(--sc-radius-sm);
1806
+ }
1807
+ .sc-tabs__list[data-variant='segmented'] > .sc-tabs__tab:hover:not([data-disabled]) {
1808
+ background: transparent;
1809
+ }
1810
+ .sc-tabs__list[data-variant='segmented'] .sc-tabs__count,
1811
+ .sc-tabs__list[data-variant='segmented'] > .sc-tabs__tab[data-active] > .sc-tabs__count {
1812
+ padding-inline: 0;
1813
+ background: transparent;
1814
+ color: var(--sc-color-text-muted);
1815
+ font-weight: var(--sc-font-weight-regular);
1816
+ }
1817
+ .sc-tabs__list[data-variant='segmented'] > .sc-tabs__indicator {
1818
+ inset-block: 0 auto;
1819
+ z-index: 0;
1820
+ block-size: var(--active-tab-height);
1821
+ translate: var(--active-tab-left) var(--active-tab-top);
1822
+ background: var(--sc-color-surface-default);
1823
+ border-radius: var(--sc-radius-sm);
1824
+ box-shadow: var(--sc-elevation-1);
1825
+ }
1826
+ @media (prefers-reduced-motion: reduce) {
1827
+ .sc-tabs__tab,
1828
+ .sc-tabs__indicator {
1829
+ transition: none;
1830
+ }
1831
+ }
1832
+
1833
+ /* ---- priority-nav.css ---- */
1834
+ /* ---- PriorityNav ----------------------------------------------------------- */
1835
+ /* Takes the free space in a flex header (brand · nav · actions) without sizing to its own links, so the
1836
+ row can grow back after collapsing. In a grid, give it a `minmax(0, 1fr)` track. */
1837
+ .sc-priority-nav {
1838
+ position: relative;
1839
+ flex: 1 1 0%;
1840
+ min-inline-size: 0;
1841
+ /* The toggle goes icon-only when the nav itself is narrow (below), whatever the viewport. */
1842
+ container: sc-priority-nav / inline-size;
1843
+ font-family: var(--sc-font-family-sans);
1844
+ font-size: var(--sc-font-size-sm);
1845
+ }
1846
+ .sc-priority-nav__list {
1847
+ display: flex;
1848
+ flex-wrap: nowrap;
1849
+ align-items: center;
1850
+ gap: var(--sc-spacing-2xs);
1851
+ min-inline-size: 0;
1852
+ margin: 0;
1853
+ padding: 0;
1854
+ list-style: none;
1855
+ }
1856
+ .sc-priority-nav__item,
1857
+ .sc-priority-nav__more {
1858
+ flex: none;
1859
+ display: flex;
1860
+ }
1861
+ .sc-priority-nav__more[hidden] {
1862
+ display: none;
1863
+ }
1864
+ /* Once measured, the current link is the one item that may shrink (ellipsis) when the row cannot hold it
1865
+ and "More". While measuring it keeps its full width like the others. */
1866
+ .sc-priority-nav:not([data-measuring]) .sc-priority-nav__item[data-current] {
1867
+ flex: 0 1 auto;
1868
+ min-inline-size: 0;
1869
+ }
1870
+ /* Before measurement (server HTML, pre-hydration, no JS): one line that never wraps. With JS the line
1871
+ clips for the few frames before hydration measures it; without JS it scrolls sideways (below). */
1872
+ .sc-priority-nav[data-measuring] > .sc-priority-nav__list {
1873
+ overflow-x: auto;
1874
+ overflow-y: hidden;
1875
+ scrollbar-width: none;
1876
+ }
1877
+ .sc-priority-nav[data-measuring] .sc-priority-nav__more[hidden] {
1878
+ display: flex;
1879
+ position: absolute;
1880
+ visibility: hidden;
1881
+ pointer-events: none;
1882
+ }
1883
+ @media (scripting: none) {
1884
+ .sc-priority-nav[data-measuring] > .sc-priority-nav__list {
1885
+ scrollbar-width: thin;
1886
+ }
1887
+ }
1888
+ .sc-priority-nav__link,
1889
+ .sc-priority-nav__toggle {
1890
+ display: inline-flex;
1891
+ align-items: center;
1892
+ gap: var(--sc-spacing-2xs);
1893
+ box-sizing: border-box;
1894
+ block-size: var(--sc-size-control-sm);
1895
+ margin: 0;
1896
+ padding-inline: var(--sc-spacing-sm);
1897
+ border: 0;
1898
+ border-radius: var(--sc-radius-sm);
1899
+ background: transparent;
1900
+ color: var(--sc-color-text-muted);
1901
+ font: inherit;
1902
+ font-weight: var(--sc-font-weight-medium);
1903
+ line-height: var(--sc-font-line-height-ui);
1904
+ white-space: nowrap;
1905
+ text-decoration: none;
1906
+ cursor: pointer;
1907
+ user-select: none;
1908
+ transition:
1909
+ background-color var(--sc-duration-fast) var(--sc-ease-standard),
1910
+ color var(--sc-duration-fast) var(--sc-ease-standard);
1911
+ }
1912
+ .sc-priority-nav__link {
1913
+ min-inline-size: 0;
1914
+ }
1915
+ .sc-priority-nav__label {
1916
+ min-inline-size: 0;
1917
+ overflow: hidden;
1918
+ text-overflow: ellipsis;
1919
+ }
1920
+ .sc-priority-nav__link:hover,
1921
+ .sc-priority-nav__toggle:hover {
1922
+ background: var(--sc-color-surface-hover);
1923
+ color: var(--sc-color-text-default);
1924
+ }
1925
+ .sc-priority-nav__link:active,
1926
+ .sc-priority-nav__toggle:active {
1927
+ background: var(--sc-color-surface-active);
1928
+ }
1929
+ .sc-priority-nav__link[aria-current='page'] {
1930
+ color: var(--sc-color-text-default);
1931
+ box-shadow: inset 0 calc(-1 * var(--sc-border-width-focus)) 0 var(--sc-color-accent-default);
1932
+ border-end-start-radius: 0;
1933
+ border-end-end-radius: 0;
1934
+ }
1935
+ .sc-priority-nav__link:focus-visible,
1936
+ .sc-priority-nav__toggle:focus-visible {
1937
+ outline: var(--sc-border-width-focus) solid var(--sc-color-border-focus);
1938
+ outline-offset: calc(-1 * var(--sc-border-width-focus));
1939
+ }
1940
+ .sc-priority-nav__toggle[aria-expanded='true'] {
1941
+ background: var(--sc-color-surface-active);
1942
+ color: var(--sc-color-text-default);
1943
+ }
1944
+ .sc-priority-nav__ellipsis {
1945
+ display: none;
1946
+ }
1947
+ @container sc-priority-nav (inline-size <= 400px) {
1948
+ .sc-priority-nav__toggle {
1949
+ justify-content: center;
1950
+ inline-size: var(--sc-size-control-sm);
1951
+ padding-inline: 0;
1952
+ }
1953
+ .sc-priority-nav__ellipsis {
1954
+ display: inline-block;
1955
+ }
1956
+ .sc-priority-nav__chevron {
1957
+ display: none;
1958
+ }
1959
+ /* Visually hidden, still part of the accessible name ("More, 3 links"). */
1960
+ .sc-priority-nav__toggle-label {
1961
+ position: absolute;
1962
+ inline-size: 1px;
1963
+ block-size: 1px;
1964
+ overflow: hidden;
1965
+ clip-path: inset(50%);
1966
+ white-space: nowrap;
1967
+ }
1968
+ }
1969
+ .sc-priority-nav__chevron {
1970
+ transition: rotate var(--sc-duration-fast) var(--sc-ease-standard);
1971
+ }
1972
+ .sc-priority-nav__toggle[aria-expanded='true'] > .sc-priority-nav__chevron {
1973
+ rotate: 180deg;
1974
+ }
1975
+ /* The panel: Menu's surface, a list of the collapsed links. While open it is in the top layer (Popover
1976
+ API), so no ancestor's overflow clips it; it is fixed-positioned against the viewport either way. */
1977
+ .sc-priority-nav__toggle {
1978
+ anchor-name: var(--_anchor);
1979
+ }
1980
+ .sc-priority-nav__panel {
1981
+ --_gutter: var(--sc-spacing-md);
1982
+ position: fixed;
1983
+ inset: auto;
1984
+ z-index: var(--sc-z-dropdown);
1985
+ display: flex;
1986
+ flex-direction: column;
1987
+ box-sizing: border-box;
1988
+ inline-size: max-content;
1989
+ min-inline-size: min(180px, 100vw - 2 * var(--_gutter));
1990
+ max-inline-size: min(320px, 100vw - 2 * var(--_gutter));
1991
+ max-block-size: min(28rem, 100dvh - 2 * var(--_gutter));
1992
+ overflow-y: auto;
1993
+ overscroll-behavior: contain;
1994
+ margin: 0;
1995
+ padding: var(--sc-spacing-2xs);
1996
+ list-style: none;
1997
+ border-radius: var(--sc-radius-lg);
1998
+ background: var(--sc-color-surface-raised);
1999
+ --sc-color-surface-hover: var(--sc-color-surface-raised-hover);
2000
+ --sc-color-surface-active: var(--sc-color-surface-raised-active);
2001
+ color: var(--sc-color-text-default);
2002
+ border: var(--sc-border-width-hairline) solid var(--sc-color-border-default);
2003
+ box-shadow: var(--sc-elevation-2);
2004
+ font-family: var(--sc-font-family-sans);
2005
+ font-size: var(--sc-font-size-sm);
2006
+ transition:
2007
+ opacity var(--sc-duration-fast) var(--sc-ease-enter),
2008
+ translate var(--sc-duration-fast) var(--sc-ease-enter);
2009
+ }
2010
+ /* Anchored below the toggle, aligned to its inline-end edge; flips to its inline-start edge (and above
2011
+ it) when that would leave the viewport; when no edge fits, it spans the viewport row under the toggle,
2012
+ centred on it and kept a gutter from both edges. Without anchor positioning, JS sets left/top (place.ts). */
2013
+ @supports (anchor-name: --a) {
2014
+ .sc-priority-nav__panel {
2015
+ position-anchor: var(--_anchor);
2016
+ position-area: block-end span-inline-start;
2017
+ margin-block: var(--sc-spacing-2xs);
2018
+ /* Makes an option that ends closer than the gutter to the viewport edge count as overflowing. */
2019
+ margin-inline-start: var(--_gutter);
2020
+ position-try-fallbacks:
2021
+ flip-inline,
2022
+ flip-block,
2023
+ flip-block flip-inline,
2024
+ --sc-priority-nav-fit;
2025
+ }
2026
+ }
2027
+ @position-try --sc-priority-nav-fit {
2028
+ position-area: block-end span-all;
2029
+ justify-self: anchor-center;
2030
+ margin-inline: var(--_gutter);
2031
+ }
2032
+ @starting-style {
2033
+ .sc-priority-nav__panel {
2034
+ opacity: 0;
2035
+ translate: 0 calc(-1 * var(--sc-spacing-2xs));
2036
+ }
2037
+ }
2038
+ .sc-priority-nav__panel[hidden] {
2039
+ display: none;
2040
+ }
2041
+ .sc-priority-nav__panel .sc-priority-nav__link {
2042
+ display: flex;
2043
+ inline-size: 100%;
2044
+ padding-inline: var(--sc-spacing-xs);
2045
+ color: var(--sc-color-text-default);
2046
+ }
2047
+ @media (prefers-reduced-motion: reduce) {
2048
+ .sc-priority-nav__link,
2049
+ .sc-priority-nav__toggle,
2050
+ .sc-priority-nav__chevron,
2051
+ .sc-priority-nav__panel {
2052
+ transition: none;
2053
+ }
2054
+ }
2055
+
2056
+ /* ---- popover.css ---- */
2057
+ /* ---- Popover --------------------------------------------------------------- */
2058
+ .sc-popover__positioner {
2059
+ z-index: var(--sc-z-dropdown);
2060
+ outline: 0;
2061
+ }
2062
+ /* Menu's surface: raised background, hairline border, large radius, elevation 2. */
2063
+ .sc-popover {
2064
+ position: relative;
2065
+ box-sizing: border-box;
2066
+ inline-size: max-content;
2067
+ max-inline-size: min(100vw - 2 * var(--sc-spacing-md), 360px);
2068
+ max-block-size: var(--available-height);
2069
+ overflow: auto;
2070
+ padding: var(--sc-spacing-md);
2071
+ border-radius: var(--sc-radius-lg);
2072
+ background: var(--sc-color-surface-raised);
2073
+ --sc-color-surface-hover: var(--sc-color-surface-raised-hover);
2074
+ --sc-color-surface-active: var(--sc-color-surface-raised-active);
2075
+ color: var(--sc-color-text-default);
2076
+ border: var(--sc-border-width-hairline) solid var(--sc-color-border-default);
2077
+ box-shadow: var(--sc-elevation-2);
2078
+ font-family: var(--sc-font-family-sans);
2079
+ font-size: var(--sc-font-size-sm);
2080
+ line-height: var(--sc-font-line-height-normal);
2081
+ outline: 0;
2082
+ transform-origin: var(--transform-origin);
2083
+ transition:
2084
+ opacity var(--sc-duration-fast) var(--sc-ease-enter),
2085
+ scale var(--sc-duration-fast) var(--sc-ease-enter);
2086
+ }
2087
+ /* With an arrow the popup must not clip it. */
2088
+ .sc-popover:has(> .sc-popover__arrow) {
2089
+ overflow: visible;
2090
+ }
2091
+ .sc-popover[data-starting-style],
2092
+ .sc-popover[data-ending-style] {
2093
+ opacity: 0;
2094
+ scale: 0.97;
2095
+ }
2096
+ .sc-popover[data-ending-style] {
2097
+ transition-timing-function: var(--sc-ease-exit);
2098
+ }
2099
+ .sc-popover[data-instant] {
2100
+ transition: none;
2101
+ }
2102
+ .sc-popover__title {
2103
+ margin: 0;
2104
+ font-size: var(--sc-font-size-md);
2105
+ line-height: var(--sc-font-line-height-snug);
2106
+ font-weight: var(--sc-font-weight-semibold);
2107
+ }
2108
+ .sc-popover__title:has(~ .sc-popover__close),
2109
+ .sc-popover__close ~ .sc-popover__title {
2110
+ padding-inline-end: var(--sc-spacing-xl);
2111
+ }
2112
+ .sc-popover__description {
2113
+ margin: var(--sc-spacing-2xs) 0 0;
2114
+ color: var(--sc-color-text-muted);
2115
+ }
2116
+ .sc-popover__close {
2117
+ position: absolute;
2118
+ inset-block-start: var(--sc-spacing-xs);
2119
+ inset-inline-end: var(--sc-spacing-xs);
2120
+ display: inline-grid;
2121
+ place-items: center;
2122
+ inline-size: var(--sc-size-control-sm);
2123
+ block-size: var(--sc-size-control-sm);
2124
+ padding: 0;
2125
+ border: 0;
2126
+ border-radius: var(--sc-radius-md);
2127
+ background: transparent;
2128
+ color: var(--sc-color-text-muted);
2129
+ cursor: pointer;
2130
+ }
2131
+ .sc-popover__close:hover {
2132
+ background: var(--sc-color-surface-hover);
2133
+ color: var(--sc-color-text-default);
2134
+ }
2135
+ .sc-popover__close:focus-visible {
2136
+ outline: var(--sc-border-width-focus) solid var(--sc-color-border-focus);
2137
+ outline-offset: calc(-1 * var(--sc-border-width-focus));
2138
+ }
2139
+ /* A 16×8 tip with the popup's fill and border, placed by Base UI on the side facing the trigger. It overlaps
2140
+ the popup's border by one hairline so the border does not run across its base. */
2141
+ .sc-popover__arrow {
2142
+ --_w: 16px;
2143
+ --_h: 8px;
2144
+ display: block;
2145
+ inline-size: var(--_w);
2146
+ block-size: calc(var(--_h) + var(--sc-border-width-hairline));
2147
+ overflow: clip;
2148
+ pointer-events: none;
2149
+ }
2150
+ .sc-popover__arrow::before {
2151
+ content: '';
2152
+ position: absolute;
2153
+ inset-block-end: 0;
2154
+ inset-inline-start: 50%;
2155
+ box-sizing: border-box;
2156
+ inline-size: calc(var(--_h) * 1.4142);
2157
+ block-size: calc(var(--_h) * 1.4142);
2158
+ background: var(--sc-color-surface-raised);
2159
+ border: var(--sc-border-width-hairline) solid var(--sc-color-border-default);
2160
+ translate: -50% 50%;
2161
+ rotate: 45deg;
2162
+ }
2163
+ .sc-popover__arrow[data-side='top'] {
2164
+ inset-block-end: calc(-1 * var(--_h));
2165
+ rotate: 180deg;
2166
+ }
2167
+ .sc-popover__arrow[data-side='bottom'] {
2168
+ inset-block-start: calc(-1 * var(--_h));
2169
+ }
2170
+ .sc-popover__arrow[data-side='left'],
2171
+ .sc-popover__arrow[data-side='inline-start'] {
2172
+ inset-inline-end: calc(-1 * (var(--_w) + var(--_h)) / 2);
2173
+ rotate: 90deg;
2174
+ }
2175
+ .sc-popover__arrow[data-side='right'],
2176
+ .sc-popover__arrow[data-side='inline-end'] {
2177
+ inset-inline-start: calc(-1 * (var(--_w) + var(--_h)) / 2);
2178
+ rotate: -90deg;
2179
+ }
2180
+ @media (prefers-reduced-motion: reduce) {
2181
+ .sc-popover {
2182
+ transition-duration: 0ms;
2183
+ }
2184
+ .sc-popover[data-starting-style],
2185
+ .sc-popover[data-ending-style] {
2186
+ scale: none;
2187
+ }
2188
+ }
2189
+
2190
+ /* ---- broom-icon.css ---- */
2191
+ /* ---- BroomIcon ------------------------------------------------------------- */
2192
+ /* Geometry and motion as approved: the body pivots on the handle top (20.2, 2.2) from -14deg to 8deg while
2193
+ the dust fades in and drifts left in step; strokes stay a fixed screen width at any size. */
2194
+ .sc-broom {
2195
+ --sc-broom-stroke: 1.25px;
2196
+ }
2197
+ /* `display` (72px) is a one-off for the broom's showcase and empty states. Move it into the Icon sizes and
2198
+ tokens if a second icon ever needs it. */
2199
+ .sc-icon.sc-broom[data-size='display'] {
2200
+ --_s: calc(var(--sc-size-icon-xl) * 3);
2201
+ --sc-broom-stroke: 1.75px;
2202
+ }
2203
+ .sc-broom__body,
2204
+ .sc-broom__dust {
2205
+ transform-box: view-box;
2206
+ stroke-width: var(--sc-broom-stroke);
2207
+ }
2208
+ .sc-broom__body {
2209
+ transform-origin: 20.2px 2.2px;
2210
+ }
2211
+ .sc-broom * {
2212
+ vector-effect: non-scaling-stroke;
2213
+ }
2214
+ .sc-broom__band {
2215
+ fill: currentColor;
2216
+ stroke: none;
2217
+ }
2218
+ .sc-broom__dust {
2219
+ opacity: 0;
2220
+ }
2221
+ .sc-broom[data-sweeping] .sc-broom__body {
2222
+ animation: sc-broom-sweep 0.9s ease-in-out infinite alternate;
2223
+ }
2224
+ .sc-broom[data-sweeping] .sc-broom__dust {
2225
+ animation: sc-broom-dust 0.9s ease-in-out infinite alternate;
2226
+ }
2227
+ @keyframes sc-broom-sweep {
2228
+ from {
2229
+ transform: rotate(-14deg);
2230
+ }
2231
+ to {
2232
+ transform: rotate(8deg);
2233
+ }
2234
+ }
2235
+ /* At the top of the sweep (8deg) the head stays about 2 grid units clear of the dust. */
2236
+ @keyframes sc-broom-dust {
2237
+ from {
2238
+ opacity: 0;
2239
+ transform: translateX(0.5px);
2240
+ }
2241
+ to {
2242
+ opacity: 0.9;
2243
+ transform: translateX(-1px);
2244
+ }
2245
+ }
2246
+ @media (prefers-reduced-motion: reduce) {
2247
+ .sc-broom[data-sweeping] .sc-broom__body,
2248
+ .sc-broom[data-sweeping] .sc-broom__dust {
2249
+ animation: none;
2250
+ }
2251
+ .sc-broom[data-sweeping] .sc-broom__dust {
2252
+ opacity: 0.9;
2253
+ }
2254
+ }
2255
+ /* Drawn on a 24px grid (the shipped icons use 16px), so inside an IconButton it takes the next icon size up:
2256
+ 20px in an md button, as in the approved nav mock. */
2257
+ .sc-icon-button > .sc-button__icon:has(> .sc-broom) {
2258
+ --_icon: var(--sc-size-icon-lg);
2259
+ }
2260
+ .sc-icon-button[data-size='sm'] > .sc-button__icon:has(> .sc-broom) {
2261
+ --_icon: var(--sc-size-icon-md);
2262
+ }
2263
+ .sc-icon-button[data-size='lg'] > .sc-button__icon:has(> .sc-broom) {
2264
+ --_icon: var(--sc-size-icon-xl);
2265
+ }
2266
+
2267
+ /* ---- toolbar.css ---- */
2268
+ /* ---- Toolbar --------------------------------------------------------------- */
2269
+ .sc-toolbar {
2270
+ display: flex;
2271
+ flex-wrap: nowrap;
2272
+ align-items: center;
2273
+ gap: var(--sc-spacing-xs);
2274
+ min-inline-size: 0;
2275
+ overflow-x: auto;
2276
+ scrollbar-width: none;
2277
+ }
2278
+ .sc-toolbar[data-wrap] {
2279
+ flex-wrap: wrap;
2280
+ overflow: visible;
2281
+ }
2282
+ .sc-toolbar__group {
2283
+ display: inline-flex;
2284
+ flex: none;
2285
+ align-items: center;
2286
+ gap: var(--sc-spacing-2xs);
2287
+ }
2288
+ .sc-toolbar__separator {
2289
+ flex: none;
2290
+ inline-size: var(--sc-border-width-hairline);
2291
+ block-size: var(--sc-size-icon-lg);
2292
+ margin-inline: var(--sc-spacing-2xs);
2293
+ background: var(--sc-color-border-default);
2294
+ }
2295
+ .sc-toolbar[data-orientation='vertical'] {
2296
+ flex-direction: column;
2297
+ align-items: stretch;
2298
+ }
2299
+ .sc-toolbar[data-orientation='vertical'] > .sc-toolbar__separator {
2300
+ inline-size: auto;
2301
+ block-size: var(--sc-border-width-hairline);
2302
+ margin-inline: 0;
2303
+ margin-block: var(--sc-spacing-2xs);
2304
+ }
2305
+ .sc-toolbar__spacer {
2306
+ flex: 1 1 0;
2307
+ min-inline-size: var(--sc-spacing-xs);
2308
+ }
2309
+ .sc-toolbar[data-gap='none'],
2310
+ .sc-toolbar__group[data-gap='none'] {
2311
+ gap: var(--sc-spacing-none);
2312
+ }
2313
+ .sc-toolbar[data-gap='3xs'],
2314
+ .sc-toolbar__group[data-gap='3xs'] {
2315
+ gap: var(--sc-spacing-3xs);
2316
+ }
2317
+ .sc-toolbar[data-gap='2xs'],
2318
+ .sc-toolbar__group[data-gap='2xs'] {
2319
+ gap: var(--sc-spacing-2xs);
2320
+ }
2321
+ .sc-toolbar[data-gap='xs'],
2322
+ .sc-toolbar__group[data-gap='xs'] {
2323
+ gap: var(--sc-spacing-xs);
2324
+ }
2325
+ .sc-toolbar[data-gap='sm'],
2326
+ .sc-toolbar__group[data-gap='sm'] {
2327
+ gap: var(--sc-spacing-sm);
2328
+ }
2329
+ .sc-toolbar[data-gap='md'],
2330
+ .sc-toolbar__group[data-gap='md'] {
2331
+ gap: var(--sc-spacing-md);
2332
+ }
2333
+ .sc-toolbar[data-gap='lg'],
2334
+ .sc-toolbar__group[data-gap='lg'] {
2335
+ gap: var(--sc-spacing-lg);
2336
+ }
2337
+ .sc-toolbar[data-gap='xl'],
2338
+ .sc-toolbar__group[data-gap='xl'] {
2339
+ gap: var(--sc-spacing-xl);
2340
+ }
2341
+ .sc-toolbar[data-gap='2xl'],
2342
+ .sc-toolbar__group[data-gap='2xl'] {
2343
+ gap: var(--sc-spacing-2xl);
2344
+ }
2345
+ .sc-toolbar[data-gap='3xl'],
2346
+ .sc-toolbar__group[data-gap='3xl'] {
2347
+ gap: var(--sc-spacing-3xl);
2348
+ }
2349
+ .sc-toolbar[data-gap='4xl'],
2350
+ .sc-toolbar__group[data-gap='4xl'] {
2351
+ gap: var(--sc-spacing-4xl);
2352
+ }
2353
+ /* Toolbar.Button stays focusable when disabled (aria-disabled + data-disabled, no `disabled` attribute), so the
2354
+ Button's :disabled look is repeated for it here. */
2355
+ .sc-toolbar .sc-button[data-disabled] {
2356
+ opacity: 0.5;
2357
+ cursor: not-allowed;
2358
+ }
2359
+
2360
+ /* ---- banner.css ---- */
2361
+ /* ---- Banner ---------------------------------------------------------------- */
2362
+ .sc-banner {
2363
+ --_bg: var(--sc-color-info-subtle);
2364
+ --_fg: var(--sc-color-info-text);
2365
+ display: flex;
2366
+ align-items: center;
2367
+ gap: var(--sc-spacing-xs);
2368
+ box-sizing: border-box;
2369
+ min-block-size: var(--sc-size-control-md);
2370
+ padding-block: var(--sc-spacing-2xs);
2371
+ padding-inline: var(--sc-spacing-sm) var(--sc-spacing-2xs);
2372
+ border-radius: var(--sc-radius-md);
2373
+ background: var(--_bg);
2374
+ color: var(--_fg);
2375
+ font-family: var(--sc-font-family-sans);
2376
+ font-size: var(--sc-font-size-sm);
2377
+ line-height: var(--sc-font-line-height-ui);
2378
+ }
2379
+ .sc-banner[data-tone='success'] {
2380
+ --_bg: var(--sc-color-success-subtle);
2381
+ --_fg: var(--sc-color-success-text);
2382
+ }
2383
+ .sc-banner[data-tone='warning'] {
2384
+ --_bg: var(--sc-color-warning-subtle);
2385
+ --_fg: var(--sc-color-warning-text);
2386
+ }
2387
+ .sc-banner[data-tone='danger'] {
2388
+ --_bg: var(--sc-color-danger-subtle);
2389
+ --_fg: var(--sc-color-danger-text);
2390
+ }
2391
+ .sc-banner[data-tone='neutral'] {
2392
+ --_bg: var(--sc-color-surface-sunken);
2393
+ --_fg: var(--sc-color-text-default);
2394
+ }
2395
+ .sc-banner__icon {
2396
+ display: inline-flex;
2397
+ flex: none;
2398
+ }
2399
+ .sc-banner__body {
2400
+ flex: 1 1 auto;
2401
+ min-inline-size: 0;
2402
+ text-wrap: pretty;
2403
+ }
2404
+ .sc-banner__action {
2405
+ flex: none;
2406
+ }
2407
+ .sc-banner__dismiss {
2408
+ flex: none;
2409
+ color: inherit;
2410
+ }
2411
+ .sc-banner > .sc-button[data-variant='ghost'] {
2412
+ color: inherit;
2413
+ }
2414
+ .sc-banner > .sc-button[data-variant='ghost']:hover,
2415
+ .sc-banner > .sc-button[data-variant='ghost']:active {
2416
+ background: rgb(from var(--_fg) r g b / 0.1);
2417
+ }
2418
+
2419
+ /* ---- progress.css ---- */
2420
+ /* ---- Spinner --------------------------------------------------------------- */
2421
+ .sc-spinner {
2422
+ --_s: var(--sc-size-icon-md);
2423
+ display: inline-block;
2424
+ inline-size: var(--_s);
2425
+ block-size: var(--_s);
2426
+ flex: none;
2427
+ vertical-align: -0.125em;
2428
+ color: inherit;
2429
+ }
2430
+ .sc-spinner[data-size='xs'] {
2431
+ --_s: var(--sc-size-icon-xs);
2432
+ }
2433
+ .sc-spinner[data-size='sm'] {
2434
+ --_s: var(--sc-size-icon-sm);
2435
+ }
2436
+ .sc-spinner[data-size='lg'] {
2437
+ --_s: var(--sc-size-icon-lg);
2438
+ }
2439
+ .sc-spinner[data-size='xl'] {
2440
+ --_s: var(--sc-size-icon-xl);
2441
+ }
2442
+ .sc-spinner[data-size='em'] {
2443
+ --_s: 1em;
2444
+ }
2445
+ .sc-spinner > svg {
2446
+ display: block;
2447
+ inline-size: 100%;
2448
+ block-size: 100%;
2449
+ animation: sc-spin 0.8s linear infinite;
2450
+ }
2451
+ .sc-spinner__track {
2452
+ opacity: 0.25;
2453
+ }
2454
+ .sc-spinner__arc {
2455
+ stroke-dasharray: 28 12;
2456
+ }
2457
+ /* ---- Progress -------------------------------------------------------------- */
2458
+ .sc-progress {
2459
+ --_fill: var(--sc-color-accent-default);
2460
+ --_h: 8px;
2461
+ display: grid;
2462
+ grid-template-columns: 1fr auto;
2463
+ column-gap: var(--sc-spacing-sm);
2464
+ row-gap: var(--sc-spacing-2xs);
2465
+ align-items: baseline;
2466
+ min-inline-size: 0;
2467
+ font-family: var(--sc-font-family-sans);
2468
+ font-size: var(--sc-font-size-sm);
2469
+ line-height: var(--sc-font-line-height-ui);
2470
+ color: var(--sc-color-text-default);
2471
+ }
2472
+ .sc-progress[data-size='sm'] {
2473
+ --_h: 4px;
2474
+ }
2475
+ .sc-progress[data-tone='success'] {
2476
+ --_fill: var(--sc-color-success-solid);
2477
+ }
2478
+ .sc-progress[data-tone='warning'] {
2479
+ --_fill: var(--sc-color-warning-solid);
2480
+ }
2481
+ .sc-progress[data-tone='danger'] {
2482
+ --_fill: var(--sc-color-danger-solid);
2483
+ }
2484
+ .sc-progress[data-tone='neutral'] {
2485
+ --_fill: var(--sc-color-text-muted);
2486
+ }
2487
+ .sc-progress__label {
2488
+ grid-column: 1;
2489
+ font-weight: var(--sc-font-weight-medium);
2490
+ }
2491
+ .sc-progress__value {
2492
+ grid-column: 2;
2493
+ color: var(--sc-color-text-muted);
2494
+ font-size: var(--sc-font-size-xs);
2495
+ font-variant-numeric: tabular-nums;
2496
+ text-align: end;
2497
+ white-space: nowrap;
2498
+ }
2499
+ .sc-progress__track {
2500
+ grid-column: 1 / -1;
2501
+ position: relative;
2502
+ block-size: var(--_h);
2503
+ overflow: hidden;
2504
+ border-radius: var(--sc-radius-full);
2505
+ background: var(--sc-color-surface-active);
2506
+ }
2507
+ .sc-progress__indicator {
2508
+ block-size: 100%;
2509
+ border-radius: inherit;
2510
+ background: var(--_fill);
2511
+ transition: width var(--sc-duration-slow) var(--sc-ease-standard);
2512
+ }
2513
+ .sc-progress__indicator[data-indeterminate] {
2514
+ position: absolute;
2515
+ inset-block: 0;
2516
+ inline-size: 40%;
2517
+ animation: sc-progress-slide 1.4s var(--sc-ease-standard) infinite;
2518
+ }
2519
+ @keyframes sc-progress-slide {
2520
+ from {
2521
+ translate: -100% 0;
2522
+ }
2523
+ to {
2524
+ translate: 250% 0;
2525
+ }
2526
+ }
2527
+ /* inline: spinner + text on one line, no track */
2528
+ .sc-progress[data-variant='inline'] {
2529
+ display: inline-flex;
2530
+ align-items: center;
2531
+ gap: var(--sc-spacing-2xs);
2532
+ }
2533
+ .sc-progress[data-variant='inline'] > .sc-progress__spinner {
2534
+ color: var(--_fill);
2535
+ }
2536
+ .sc-progress[data-variant='inline'] > .sc-progress__value {
2537
+ font-size: inherit;
2538
+ text-align: start;
2539
+ }
2540
+ .sc-progress[data-variant='inline'] > .sc-progress__value::before {
2541
+ content: '·';
2542
+ margin-inline-end: var(--sc-spacing-2xs);
2543
+ }
2544
+ .sc-progress[data-variant='inline'] > .sc-progress__label + .sc-progress__value {
2545
+ margin-inline-start: 0;
2546
+ }
2547
+ @media (prefers-reduced-motion: reduce) {
2548
+ .sc-spinner > svg {
2549
+ animation-duration: 1.6s;
2550
+ }
2551
+ .sc-progress__indicator {
2552
+ transition: none;
2553
+ }
2554
+ .sc-progress__indicator[data-indeterminate] {
2555
+ inline-size: 100%;
2556
+ animation: sc-progress-pulse 2s ease-in-out infinite alternate;
2557
+ }
2558
+ @keyframes sc-progress-pulse {
2559
+ from {
2560
+ opacity: 0.35;
2561
+ }
2562
+ to {
2563
+ opacity: 0.8;
2564
+ }
2565
+ }
2566
+ }
2567
+
2568
+ /* ---- table.css ---- */
2569
+ /* ---- Table ----------------------------------------------------------------- */
2570
+ .sc-table-wrap {
2571
+ position: relative;
2572
+ inline-size: 100%;
2573
+ min-inline-size: 0;
2574
+ overflow-x: auto;
2575
+ overscroll-behavior-x: contain;
2576
+ }
2577
+ .sc-table-wrap[data-sticky-header]:not([data-scroll]) {
2578
+ overflow: visible;
2579
+ }
2580
+ .sc-table-wrap[data-scroll] {
2581
+ overflow: auto;
2582
+ }
2583
+ .sc-table {
2584
+ --_py: var(--sc-spacing-xs);
2585
+ --_px: var(--sc-spacing-sm);
2586
+ --_h: var(--sc-size-control-md);
2587
+ inline-size: 100%;
2588
+ border-collapse: separate;
2589
+ border-spacing: 0;
2590
+ font-family: var(--sc-font-family-sans);
2591
+ font-size: var(--sc-font-size-sm);
2592
+ line-height: var(--sc-font-line-height-ui);
2593
+ color: var(--sc-color-text-default);
2594
+ text-align: start;
2595
+ }
2596
+ .sc-table[data-layout='fixed'] {
2597
+ table-layout: fixed;
2598
+ }
2599
+ .sc-table[data-density='compact'],
2600
+ [data-density='compact'] .sc-table:not([data-density='comfortable']) {
2601
+ --_py: var(--sc-spacing-2xs);
2602
+ --_px: var(--sc-spacing-xs);
2603
+ --_h: var(--sc-size-control-sm);
2604
+ }
2605
+ .sc-table__caption {
2606
+ padding-block-end: var(--sc-spacing-xs);
2607
+ color: var(--sc-color-text-muted);
2608
+ font-size: var(--sc-font-size-xs);
2609
+ text-align: start;
2610
+ caption-side: top;
2611
+ }
2612
+ .sc-table__header,
2613
+ .sc-table__cell {
2614
+ box-sizing: border-box;
2615
+ block-size: var(--_h);
2616
+ padding: var(--_py) var(--_px);
2617
+ vertical-align: middle;
2618
+ text-align: start;
2619
+ }
2620
+ .sc-table__header {
2621
+ color: var(--sc-color-text-muted);
2622
+ font-size: var(--sc-font-size-xs);
2623
+ font-weight: var(--sc-font-weight-medium);
2624
+ letter-spacing: var(--sc-font-tracking-wide);
2625
+ text-transform: uppercase;
2626
+ white-space: nowrap;
2627
+ background: var(--sc-color-surface-canvas);
2628
+ border-block-end: var(--sc-border-width-hairline) solid var(--sc-color-border-default);
2629
+ }
2630
+ /* Sortable column headers: the whole label is the button. */
2631
+ .sc-table__header[data-sortable] {
2632
+ padding: 0;
2633
+ }
2634
+ .sc-table__sort {
2635
+ display: inline-flex;
2636
+ align-items: center;
2637
+ gap: var(--sc-spacing-2xs);
2638
+ box-sizing: border-box;
2639
+ inline-size: 100%;
2640
+ min-block-size: var(--_h);
2641
+ margin: 0;
2642
+ padding: var(--_py) var(--_px);
2643
+ border: 0;
2644
+ border-radius: var(--sc-radius-sm);
2645
+ background: transparent;
2646
+ color: inherit;
2647
+ font: inherit;
2648
+ letter-spacing: inherit;
2649
+ text-transform: inherit;
2650
+ text-align: inherit;
2651
+ white-space: inherit;
2652
+ cursor: pointer;
2653
+ user-select: none;
2654
+ }
2655
+ .sc-table__header[data-align='end'] > .sc-table__sort {
2656
+ justify-content: flex-end;
2657
+ }
2658
+ .sc-table__header[data-align='center'] > .sc-table__sort {
2659
+ justify-content: center;
2660
+ }
2661
+ .sc-table__sort:hover {
2662
+ background: var(--sc-color-surface-hover);
2663
+ color: var(--sc-color-text-default);
2664
+ }
2665
+ .sc-table__sort:focus-visible {
2666
+ outline: var(--sc-border-width-focus) solid var(--sc-color-border-focus);
2667
+ outline-offset: calc(-1 * var(--sc-border-width-focus));
2668
+ }
2669
+ .sc-table__sort-icon {
2670
+ display: inline-flex;
2671
+ flex: none;
2672
+ opacity: 0;
2673
+ transition: opacity var(--sc-duration-fast) var(--sc-ease-standard);
2674
+ }
2675
+ .sc-table__sort:hover > .sc-table__sort-icon,
2676
+ .sc-table__sort:focus-visible > .sc-table__sort-icon {
2677
+ opacity: 0.6;
2678
+ }
2679
+ .sc-table__header[data-sorted] {
2680
+ color: var(--sc-color-text-default);
2681
+ }
2682
+ .sc-table__header[data-sorted] .sc-table__sort-icon {
2683
+ opacity: 1;
2684
+ color: var(--sc-color-accent-text);
2685
+ }
2686
+ .sc-table__body .sc-table__header {
2687
+ color: var(--sc-color-text-default);
2688
+ font-size: inherit;
2689
+ font-weight: var(--sc-font-weight-medium);
2690
+ letter-spacing: 0;
2691
+ text-transform: none;
2692
+ background: transparent;
2693
+ border-block-end: 0;
2694
+ }
2695
+ .sc-table-wrap[data-sticky-header] .sc-table__head .sc-table__header {
2696
+ position: sticky;
2697
+ inset-block-start: 0;
2698
+ z-index: var(--sc-z-sticky);
2699
+ }
2700
+ .sc-table[data-divided] .sc-table__body .sc-table__row:not(:last-child) > .sc-table__cell,
2701
+ .sc-table[data-divided] .sc-table__body .sc-table__row:not(:last-child) > .sc-table__header {
2702
+ border-block-end: var(--sc-border-width-hairline) solid var(--sc-color-border-default);
2703
+ }
2704
+ .sc-table__foot .sc-table__cell,
2705
+ .sc-table__foot .sc-table__header {
2706
+ border-block-start: var(--sc-border-width-hairline) solid var(--sc-color-border-default);
2707
+ font-weight: var(--sc-font-weight-medium);
2708
+ }
2709
+ .sc-table__row[data-interactive] {
2710
+ cursor: pointer;
2711
+ }
2712
+ .sc-table__row[data-interactive]:hover > .sc-table__cell,
2713
+ .sc-table__row[data-interactive]:hover > .sc-table__header {
2714
+ background: var(--sc-color-surface-hover);
2715
+ }
2716
+ .sc-table__row[data-selected] > .sc-table__cell,
2717
+ .sc-table__row[data-selected] > .sc-table__header {
2718
+ background: var(--sc-color-accent-subtle);
2719
+ }
2720
+ /* A selected row still shows its hover (docs/adr/0003): the selected wash, a step towards the accent. */
2721
+ .sc-table__row[data-selected][data-interactive]:hover > .sc-table__cell,
2722
+ .sc-table__row[data-selected][data-interactive]:hover > .sc-table__header {
2723
+ background: color-mix(in oklab, var(--sc-color-accent-subtle), var(--sc-color-accent-default) 10%);
2724
+ }
2725
+ /* Selection column: the cell is the hit area, the checkbox the control (the checkbox inherits the cursor). */
2726
+ .sc-table__select {
2727
+ inline-size: 1px;
2728
+ padding-inline-end: var(--sc-spacing-2xs);
2729
+ text-align: center;
2730
+ cursor: pointer;
2731
+ user-select: none;
2732
+ }
2733
+ .sc-table__select > .sc-checkbox {
2734
+ vertical-align: middle;
2735
+ }
2736
+ .sc-table__select[data-disabled] {
2737
+ cursor: not-allowed;
2738
+ }
2739
+ .sc-table__header[data-align='center'],
2740
+ .sc-table__cell[data-align='center'] {
2741
+ text-align: center;
2742
+ }
2743
+ .sc-table__header[data-align='end'],
2744
+ .sc-table__cell[data-align='end'] {
2745
+ text-align: end;
2746
+ }
2747
+ .sc-table__header[data-numeric],
2748
+ .sc-table__cell[data-numeric] {
2749
+ font-variant-numeric: tabular-nums;
2750
+ }
2751
+ .sc-table__header[data-nowrap],
2752
+ .sc-table__cell[data-nowrap] {
2753
+ white-space: nowrap;
2754
+ }
2755
+ .sc-table__header[data-truncate],
2756
+ .sc-table__cell[data-truncate] {
2757
+ max-inline-size: 0;
2758
+ overflow: hidden;
2759
+ text-overflow: ellipsis;
2760
+ white-space: nowrap;
2761
+ }
2762
+ .sc-table__cell > .sc-badge,
2763
+ .sc-table__cell > .sc-button {
2764
+ vertical-align: middle;
2765
+ }
2766
+
2767
+ /* ---- selection-bar.css ---- */
2768
+ /* ---- SelectionBar ---------------------------------------------------------- */
2769
+ /* Floats centred at the bottom of the viewport, sized to its content. A raised surface like Menu and Popover, so
2770
+ washes inside use the raised tokens (docs/adr/0003). */
2771
+ .sc-selection-bar {
2772
+ --_gutter: var(--sc-spacing-md);
2773
+ --sc-color-surface-hover: var(--sc-color-surface-raised-hover);
2774
+ --sc-color-surface-active: var(--sc-color-surface-raised-active);
2775
+ position: fixed;
2776
+ inset-inline: var(--_gutter);
2777
+ inset-block-end: calc(var(--_gutter) + env(safe-area-inset-bottom, 0px));
2778
+ z-index: var(--sc-z-sticky);
2779
+ box-sizing: border-box;
2780
+ inline-size: fit-content;
2781
+ max-inline-size: min(100vw - 2 * var(--_gutter), 48rem);
2782
+ margin-inline: auto;
2783
+ padding: var(--sc-spacing-2xs) var(--sc-spacing-xs) var(--sc-spacing-2xs) var(--sc-spacing-sm);
2784
+ border: var(--sc-border-width-hairline) solid var(--sc-color-border-default);
2785
+ border-radius: var(--sc-radius-lg);
2786
+ background: var(--sc-color-surface-raised);
2787
+ box-shadow: var(--sc-elevation-2);
2788
+ color: var(--sc-color-text-default);
2789
+ font-family: var(--sc-font-family-sans);
2790
+ font-size: var(--sc-font-size-sm);
2791
+ line-height: var(--sc-font-line-height-ui);
2792
+ opacity: 0;
2793
+ translate: 0 var(--sc-spacing-sm);
2794
+ pointer-events: none;
2795
+ transition:
2796
+ opacity var(--sc-duration-base) var(--sc-ease-standard),
2797
+ translate var(--sc-duration-base) var(--sc-ease-standard);
2798
+ }
2799
+ .sc-selection-bar[data-open] {
2800
+ opacity: 1;
2801
+ translate: none;
2802
+ pointer-events: auto;
2803
+ }
2804
+ @starting-style {
2805
+ .sc-selection-bar[data-open] {
2806
+ opacity: 0;
2807
+ translate: 0 var(--sc-spacing-sm);
2808
+ }
2809
+ }
2810
+ /* Phones: stretch between the gutters. */
2811
+ @media (width < 640px) {
2812
+ .sc-selection-bar {
2813
+ inline-size: auto;
2814
+ }
2815
+ }
2816
+ @media (prefers-reduced-motion: reduce) {
2817
+ .sc-selection-bar,
2818
+ .sc-selection-bar[data-open] {
2819
+ translate: none;
2820
+ transition: none;
2821
+ }
2822
+ }
2823
+ .sc-selection-bar__count {
2824
+ flex: none;
2825
+ font-weight: var(--sc-font-weight-medium);
2826
+ font-variant-numeric: tabular-nums;
2827
+ white-space: nowrap;
2828
+ }
2829
+ /* Left in the flow where the bar is mounted (the end of the scrolling content): the last rows scroll clear of it. */
2830
+ .sc-selection-bar__spacer {
2831
+ flex: none;
2832
+ block-size: calc(
2833
+ var(--sc-selection-bar-height, 0px) + var(--sc-spacing-md) + env(safe-area-inset-bottom, 0px)
2834
+ );
2835
+ }
2836
+
2837
+ /* ---- toast.css ---- */
2838
+ /* ---- Toast ----------------------------------------------------------------- */
2839
+ .sc-toast-viewport {
2840
+ position: fixed;
2841
+ inset-block-end: var(--sc-spacing-lg);
2842
+ inset-inline-end: var(--sc-spacing-lg);
2843
+ z-index: var(--sc-z-toast);
2844
+ display: flex;
2845
+ flex-direction: column;
2846
+ align-items: flex-end;
2847
+ gap: var(--sc-spacing-xs);
2848
+ inline-size: min(360px, 100vw - 2 * var(--sc-spacing-md));
2849
+ outline: none;
2850
+ }
2851
+ /* A raised surface, so washes inside use the raised tokens (docs/adr/0003). */
2852
+ .sc-toast {
2853
+ --sc-color-surface-hover: var(--sc-color-surface-raised-hover);
2854
+ --sc-color-surface-active: var(--sc-color-surface-raised-active);
2855
+ box-sizing: border-box;
2856
+ display: flex;
2857
+ align-items: center;
2858
+ gap: var(--sc-spacing-xs);
2859
+ inline-size: 100%;
2860
+ padding: var(--sc-spacing-xs) var(--sc-spacing-xs) var(--sc-spacing-xs) var(--sc-spacing-sm);
2861
+ border: var(--sc-border-width-hairline) solid var(--sc-color-border-default);
2862
+ border-inline-start: var(--sc-border-width-focus) solid var(--sc-color-border-strong);
2863
+ border-radius: var(--sc-radius-lg);
2864
+ background: var(--sc-color-surface-raised);
2865
+ box-shadow: var(--sc-elevation-2);
2866
+ color: var(--sc-color-text-default);
2867
+ font-family: var(--sc-font-family-sans);
2868
+ font-size: var(--sc-font-size-sm);
2869
+ line-height: var(--sc-font-line-height-ui);
2870
+ transition:
2871
+ opacity var(--sc-duration-fast) var(--sc-ease-standard),
2872
+ translate var(--sc-duration-fast) var(--sc-ease-standard);
2873
+ }
2874
+ .sc-toast:focus-visible {
2875
+ outline: var(--sc-border-width-focus) solid var(--sc-color-border-focus);
2876
+ outline-offset: var(--sc-border-width-focus);
2877
+ }
2878
+ .sc-toast[data-tone='success'] {
2879
+ border-inline-start-color: var(--sc-color-success-solid);
2880
+ }
2881
+ .sc-toast[data-tone='danger'] {
2882
+ border-inline-start-color: var(--sc-color-danger-solid);
2883
+ }
2884
+ .sc-toast[data-starting-style],
2885
+ .sc-toast[data-ending-style] {
2886
+ opacity: 0;
2887
+ translate: 0 var(--sc-spacing-xs);
2888
+ }
2889
+ .sc-toast__content {
2890
+ flex: 1 1 auto;
2891
+ min-inline-size: 0;
2892
+ }
2893
+ .sc-toast__title {
2894
+ margin: 0;
2895
+ font-size: inherit;
2896
+ font-weight: var(--sc-font-weight-medium);
2897
+ }
2898
+ .sc-toast__description {
2899
+ margin: 0;
2900
+ color: var(--sc-color-text-muted);
2901
+ font-size: var(--sc-font-size-xs);
2902
+ }
2903
+ .sc-toast__action,
2904
+ .sc-toast__close {
2905
+ flex: none;
2906
+ }
2907
+ @media (prefers-reduced-motion: reduce) {
2908
+ .sc-toast {
2909
+ transition: none;
2910
+ }
2911
+ .sc-toast[data-starting-style],
2912
+ .sc-toast[data-ending-style] {
2913
+ translate: none;
2914
+ }
2915
+ }
2916
+
2917
+ /* ---- stat.css ---- */
2918
+ /* ---- Stat ------------------------------------------------------------------ */
2919
+ .sc-stat {
2920
+ --_p: var(--sc-spacing-md);
2921
+ --_value: var(--sc-font-size-2xl);
2922
+ position: relative;
2923
+ display: grid;
2924
+ grid-template-columns: 1fr auto;
2925
+ grid-template-areas:
2926
+ 'label icon'
2927
+ 'value value'
2928
+ 'delta delta'
2929
+ 'hint hint';
2930
+ align-content: start;
2931
+ row-gap: var(--sc-spacing-3xs);
2932
+ box-sizing: border-box;
2933
+ min-inline-size: 0;
2934
+ margin: 0;
2935
+ padding: var(--_p);
2936
+ border-radius: var(--sc-radius-xl);
2937
+ background: var(--sc-color-surface-default);
2938
+ color: var(--sc-color-text-default);
2939
+ border: var(--sc-border-width-hairline) solid var(--sc-color-border-default);
2940
+ font-family: var(--sc-font-family-sans);
2941
+ font-size: var(--sc-font-size-sm);
2942
+ line-height: var(--sc-font-line-height-ui);
2943
+ list-style: none;
2944
+ }
2945
+ .sc-stat[data-variant='filled'] {
2946
+ background: var(--sc-color-surface-sunken);
2947
+ border-color: transparent;
2948
+ }
2949
+ .sc-stat[data-variant='plain'] {
2950
+ --_p: 0;
2951
+ background: transparent;
2952
+ border: 0;
2953
+ border-radius: 0;
2954
+ }
2955
+ .sc-stat[data-size='sm'] {
2956
+ --_p: var(--sc-spacing-sm);
2957
+ --_value: var(--sc-font-size-xl);
2958
+ border-radius: var(--sc-radius-lg);
2959
+ }
2960
+ .sc-stat__label {
2961
+ grid-area: label;
2962
+ color: var(--sc-color-text-muted);
2963
+ font-weight: var(--sc-font-weight-medium);
2964
+ }
2965
+ .sc-stat__icon {
2966
+ grid-area: icon;
2967
+ display: inline-flex;
2968
+ color: var(--sc-color-text-subtle);
2969
+ }
2970
+ .sc-stat__icon > svg {
2971
+ inline-size: var(--sc-size-icon-lg);
2972
+ block-size: var(--sc-size-icon-lg);
2973
+ }
2974
+ .sc-stat__value {
2975
+ grid-area: value;
2976
+ font-size: var(--_value);
2977
+ font-weight: var(--sc-font-weight-semibold);
2978
+ line-height: var(--sc-font-line-height-tight);
2979
+ letter-spacing: var(--sc-font-tracking-snug);
2980
+ font-variant-numeric: tabular-nums;
2981
+ overflow-wrap: anywhere;
2982
+ }
2983
+ .sc-stat__delta {
2984
+ grid-area: delta;
2985
+ display: inline-flex;
2986
+ align-items: center;
2987
+ gap: var(--sc-spacing-3xs);
2988
+ color: var(--sc-color-text-muted);
2989
+ font-size: var(--sc-font-size-xs);
2990
+ font-weight: var(--sc-font-weight-medium);
2991
+ font-variant-numeric: tabular-nums;
2992
+ }
2993
+ .sc-stat__delta[data-tone='positive'] {
2994
+ color: var(--sc-color-success-text);
2995
+ }
2996
+ .sc-stat__delta[data-tone='negative'] {
2997
+ color: var(--sc-color-danger-text);
2998
+ }
2999
+ .sc-stat__trend {
3000
+ display: inline-flex;
3001
+ }
3002
+ .sc-stat__hint {
3003
+ grid-area: hint;
3004
+ color: var(--sc-color-text-muted);
3005
+ font-size: var(--sc-font-size-xs);
3006
+ }
3007
+
3008
+ /* ---- chip.css ---- */
3009
+ /* ---- Chip ------------------------------------------------------------------ */
3010
+ .sc-chip {
3011
+ --_h: var(--sc-size-control-sm);
3012
+ --_px: var(--sc-spacing-sm);
3013
+ --_fs: var(--sc-font-size-sm);
3014
+ --_icon: var(--sc-size-icon-sm);
3015
+ --_bg: transparent;
3016
+ --_fg: var(--sc-color-text-default);
3017
+ --_bd: var(--sc-color-border-strong);
3018
+ --_bg-hover: var(--sc-color-surface-hover);
3019
+ --_bg-on: var(--sc-color-surface-active);
3020
+ --_fg-on: var(--sc-color-text-default);
3021
+ --_bd-on: var(--sc-color-text-muted);
3022
+ position: relative;
3023
+ display: inline-flex;
3024
+ align-items: center;
3025
+ box-sizing: border-box;
3026
+ max-inline-size: 100%;
3027
+ block-size: var(--_h);
3028
+ border-radius: var(--sc-radius-full);
3029
+ border: var(--sc-border-width-hairline) solid var(--_bd);
3030
+ background: var(--_bg);
3031
+ color: var(--_fg);
3032
+ font-family: var(--sc-font-family-sans);
3033
+ font-size: var(--_fs);
3034
+ font-weight: var(--sc-font-weight-medium);
3035
+ line-height: 1;
3036
+ white-space: nowrap;
3037
+ transition:
3038
+ background-color var(--sc-duration-fast) var(--sc-ease-standard),
3039
+ border-color var(--sc-duration-fast) var(--sc-ease-standard),
3040
+ color var(--sc-duration-fast) var(--sc-ease-standard);
3041
+ }
3042
+ .sc-chip[data-size='sm'] {
3043
+ --_h: var(--sc-size-badge-md);
3044
+ --_px: var(--sc-spacing-xs);
3045
+ --_fs: var(--sc-font-size-xs);
3046
+ --_icon: var(--sc-size-icon-xs);
3047
+ }
3048
+ .sc-chip[data-selected] {
3049
+ --_bg: var(--_bg-on);
3050
+ --_fg: var(--_fg-on);
3051
+ --_bd: var(--_bd-on);
3052
+ }
3053
+ .sc-chip[data-disabled] {
3054
+ opacity: 0.5;
3055
+ }
3056
+ /* The text, or the toggle button that holds it. */
3057
+ .sc-chip__action,
3058
+ .sc-chip > .sc-chip__icon,
3059
+ .sc-chip > .sc-chip__label {
3060
+ display: inline-flex;
3061
+ align-items: center;
3062
+ min-inline-size: 0;
3063
+ }
3064
+ .sc-chip > .sc-chip__icon {
3065
+ margin-inline-start: var(--_px);
3066
+ }
3067
+ .sc-chip > .sc-chip__label {
3068
+ padding-inline: var(--_px);
3069
+ }
3070
+ .sc-chip > .sc-chip__icon + .sc-chip__label {
3071
+ padding-inline-start: var(--sc-spacing-2xs);
3072
+ }
3073
+ .sc-chip__action {
3074
+ gap: var(--sc-spacing-2xs);
3075
+ box-sizing: border-box;
3076
+ block-size: 100%;
3077
+ margin: 0;
3078
+ padding-inline: var(--_px);
3079
+ border: 0;
3080
+ border-radius: inherit;
3081
+ background: transparent;
3082
+ color: inherit;
3083
+ font: inherit;
3084
+ line-height: 1;
3085
+ cursor: pointer;
3086
+ }
3087
+ .sc-chip__action:hover:not(:disabled) {
3088
+ background: var(--_bg-hover);
3089
+ }
3090
+ .sc-chip[data-selected] > .sc-chip__action:hover:not(:disabled) {
3091
+ background: transparent;
3092
+ filter: brightness(0.97);
3093
+ }
3094
+ .sc-chip__action:disabled {
3095
+ cursor: not-allowed;
3096
+ }
3097
+ .sc-chip__icon {
3098
+ flex: none;
3099
+ inline-size: var(--_icon);
3100
+ block-size: var(--_icon);
3101
+ }
3102
+ .sc-chip__icon > svg {
3103
+ inline-size: 100%;
3104
+ block-size: 100%;
3105
+ }
3106
+ /* The label clips for the ellipsis, so it needs a real line box or descenders get cut (the chip sets line-height: 1). */
3107
+ .sc-chip__label {
3108
+ overflow: hidden;
3109
+ text-overflow: ellipsis;
3110
+ line-height: var(--sc-font-line-height-ui);
3111
+ }
3112
+ .sc-chip[data-removable] > .sc-chip__action,
3113
+ .sc-chip[data-removable] > .sc-chip__label {
3114
+ padding-inline-end: var(--sc-spacing-2xs);
3115
+ }
3116
+ .sc-chip__remove {
3117
+ flex: none;
3118
+ display: inline-grid;
3119
+ place-items: center;
3120
+ box-sizing: border-box;
3121
+ inline-size: calc(var(--_h) - 2 * var(--sc-spacing-2xs) - 2px);
3122
+ block-size: calc(var(--_h) - 2 * var(--sc-spacing-2xs) - 2px);
3123
+ margin-inline-end: var(--sc-spacing-2xs);
3124
+ padding: 0;
3125
+ border: 0;
3126
+ border-radius: var(--sc-radius-full);
3127
+ background: transparent;
3128
+ color: inherit;
3129
+ opacity: 0.7;
3130
+ cursor: pointer;
3131
+ }
3132
+ .sc-chip__remove:hover:not(:disabled) {
3133
+ opacity: 1;
3134
+ background: var(--_bg-hover);
3135
+ }
3136
+ .sc-chip__remove:disabled {
3137
+ cursor: not-allowed;
3138
+ }
3139
+ .sc-chip__action:focus-visible,
3140
+ .sc-chip__remove:focus-visible {
3141
+ outline: var(--sc-border-width-focus) solid var(--sc-color-border-focus);
3142
+ outline-offset: 0;
3143
+ }
3144
+ /* 44px hit area on touch without changing layout. */
3145
+ @media (pointer: coarse) {
3146
+ .sc-chip__action::after,
3147
+ .sc-chip__remove::after {
3148
+ content: '';
3149
+ position: absolute;
3150
+ inset: 50% auto auto 50%;
3151
+ translate: -50% -50%;
3152
+ inline-size: max(100%, var(--sc-size-touch-target));
3153
+ block-size: max(100%, var(--sc-size-touch-target));
3154
+ }
3155
+ .sc-chip__action,
3156
+ .sc-chip__remove {
3157
+ position: relative;
3158
+ }
3159
+ }
3160
+ /* Tones: soft fill when selected, tinted outline otherwise. */
3161
+ .sc-chip[data-tone='accent'] {
3162
+ --_fg: var(--sc-color-accent-text);
3163
+ --_bd: var(--sc-color-accent-text);
3164
+ --_bg-hover: var(--sc-color-accent-subtle);
3165
+ --_bg-on: var(--sc-color-accent-subtle);
3166
+ --_fg-on: var(--sc-color-accent-text);
3167
+ --_bd-on: var(--sc-color-accent-default);
3168
+ }
3169
+ .sc-chip[data-tone='success'] {
3170
+ --_fg: var(--sc-color-success-text);
3171
+ --_bd: var(--sc-color-success-text);
3172
+ --_bg-hover: var(--sc-color-success-subtle);
3173
+ --_bg-on: var(--sc-color-success-subtle);
3174
+ --_fg-on: var(--sc-color-success-text);
3175
+ --_bd-on: var(--sc-color-success-solid);
3176
+ }
3177
+ .sc-chip[data-tone='warning'] {
3178
+ --_fg: var(--sc-color-warning-text);
3179
+ --_bd: var(--sc-color-warning-text);
3180
+ --_bg-hover: var(--sc-color-warning-subtle);
3181
+ --_bg-on: var(--sc-color-warning-subtle);
3182
+ --_fg-on: var(--sc-color-warning-text);
3183
+ --_bd-on: var(--sc-color-warning-solid);
3184
+ }
3185
+ .sc-chip[data-tone='danger'] {
3186
+ --_fg: var(--sc-color-danger-text);
3187
+ --_bd: var(--sc-color-danger-text);
3188
+ --_bg-hover: var(--sc-color-danger-subtle);
3189
+ --_bg-on: var(--sc-color-danger-subtle);
3190
+ --_fg-on: var(--sc-color-danger-text);
3191
+ --_bd-on: var(--sc-color-danger-solid);
3192
+ }
3193
+ .sc-chip[data-tone='info'] {
3194
+ --_fg: var(--sc-color-info-text);
3195
+ --_bd: var(--sc-color-info-text);
3196
+ --_bg-hover: var(--sc-color-info-subtle);
3197
+ --_bg-on: var(--sc-color-info-subtle);
3198
+ --_fg-on: var(--sc-color-info-text);
3199
+ --_bd-on: var(--sc-color-info-solid);
3200
+ }
3201
+ @media (prefers-reduced-motion: reduce) {
3202
+ .sc-chip {
3203
+ transition: none;
3204
+ }
3205
+ }
3206
+
3207
+ /* ---- disclosure.css ---- */
3208
+ /* ---- Disclosure ------------------------------------------------------------ */
3209
+ .sc-disclosure {
3210
+ display: flex;
3211
+ flex-direction: column;
3212
+ gap: var(--sc-spacing-xs);
3213
+ min-inline-size: 0;
3214
+ font-family: var(--sc-font-family-sans);
3215
+ font-size: var(--sc-font-size-sm);
3216
+ line-height: var(--sc-font-line-height-normal);
3217
+ color: var(--sc-color-text-default);
3218
+ }
3219
+ .sc-disclosure__summary {
3220
+ display: inline-flex;
3221
+ align-items: center;
3222
+ gap: var(--sc-spacing-2xs);
3223
+ inline-size: fit-content;
3224
+ margin-inline: calc(-1 * var(--sc-spacing-2xs));
3225
+ padding: var(--sc-spacing-2xs);
3226
+ border-radius: var(--sc-radius-sm);
3227
+ color: var(--sc-color-accent-text);
3228
+ font-weight: var(--sc-font-weight-medium);
3229
+ line-height: var(--sc-font-line-height-ui);
3230
+ list-style: none;
3231
+ cursor: pointer;
3232
+ user-select: none;
3233
+ }
3234
+ .sc-disclosure__summary::-webkit-details-marker,
3235
+ .sc-disclosure__summary::marker {
3236
+ display: none;
3237
+ content: '';
3238
+ }
3239
+ .sc-disclosure__summary:hover {
3240
+ background: var(--sc-color-surface-hover);
3241
+ }
3242
+ .sc-disclosure__summary:focus-visible {
3243
+ outline: var(--sc-border-width-focus) solid var(--sc-color-border-focus);
3244
+ outline-offset: 0;
3245
+ }
3246
+ .sc-disclosure__chevron {
3247
+ flex: none;
3248
+ inline-size: var(--sc-size-icon-md);
3249
+ block-size: var(--sc-size-icon-md);
3250
+ transition: rotate var(--sc-duration-fast) var(--sc-ease-standard);
3251
+ }
3252
+ .sc-disclosure[open] > .sc-disclosure__summary > .sc-disclosure__chevron {
3253
+ rotate: 180deg;
3254
+ }
3255
+ .sc-disclosure[data-summary-position='end'] > .sc-disclosure__summary {
3256
+ order: 1;
3257
+ }
3258
+ .sc-disclosure__content {
3259
+ min-inline-size: 0;
3260
+ }
3261
+ /* Preview: while closed, the content stays rendered, clipped to N lines and faded. Browsers without
3262
+ `::details-content` keep the native behaviour (content hidden until open). */
3263
+ .sc-disclosure[data-preview]:not([open])::details-content {
3264
+ content-visibility: visible;
3265
+ display: block;
3266
+ max-block-size: calc(var(--_lines, 3) * 1lh);
3267
+ overflow: clip;
3268
+ mask-image: linear-gradient(to bottom, #000 40%, transparent 100%);
3269
+ }
3270
+ @media (prefers-reduced-motion: reduce) {
3271
+ .sc-disclosure__chevron {
3272
+ transition: none;
3273
+ }
3274
+ }
3275
+
3276
+ /* ---- empty-state.css ---- */
3277
+ /* ---- EmptyState ------------------------------------------------------------ */
3278
+ .sc-empty-state {
3279
+ --_icon: var(--sc-size-icon-xl);
3280
+ --_ring: 48px;
3281
+ --_py: var(--sc-spacing-2xl);
3282
+ --_title: var(--sc-font-size-lg);
3283
+ display: flex;
3284
+ flex-direction: column;
3285
+ align-items: center;
3286
+ gap: var(--sc-spacing-xs);
3287
+ box-sizing: border-box;
3288
+ inline-size: 100%;
3289
+ margin: 0;
3290
+ padding: var(--_py) var(--sc-spacing-lg);
3291
+ list-style: none;
3292
+ text-align: center;
3293
+ font-family: var(--sc-font-family-sans);
3294
+ color: var(--sc-color-text-default);
3295
+ }
3296
+ .sc-empty-state[data-size='sm'] {
3297
+ --_icon: var(--sc-size-icon-lg);
3298
+ --_ring: 40px;
3299
+ --_py: var(--sc-spacing-lg);
3300
+ --_title: var(--sc-font-size-md);
3301
+ gap: var(--sc-spacing-2xs);
3302
+ }
3303
+ .sc-empty-state__icon {
3304
+ display: inline-grid;
3305
+ place-items: center;
3306
+ inline-size: var(--_ring);
3307
+ block-size: var(--_ring);
3308
+ margin-block-end: var(--sc-spacing-xs);
3309
+ border-radius: var(--sc-radius-full);
3310
+ background: var(--sc-color-surface-sunken);
3311
+ color: var(--sc-color-text-muted);
3312
+ }
3313
+ .sc-empty-state__icon > svg {
3314
+ inline-size: var(--_icon);
3315
+ block-size: var(--_icon);
3316
+ }
3317
+ .sc-empty-state__title {
3318
+ margin: 0;
3319
+ max-inline-size: 36ch;
3320
+ font-size: var(--_title);
3321
+ font-weight: var(--sc-font-weight-semibold);
3322
+ line-height: var(--sc-font-line-height-snug);
3323
+ letter-spacing: var(--sc-font-tracking-snug);
3324
+ text-wrap: balance;
3325
+ }
3326
+ .sc-empty-state__description {
3327
+ margin: 0;
3328
+ max-inline-size: 48ch;
3329
+ font-size: var(--sc-font-size-sm);
3330
+ line-height: var(--sc-font-line-height-normal);
3331
+ color: var(--sc-color-text-muted);
3332
+ text-wrap: pretty;
3333
+ }
3334
+ .sc-empty-state__actions {
3335
+ display: flex;
3336
+ flex-wrap: wrap;
3337
+ justify-content: center;
3338
+ gap: var(--sc-spacing-xs);
3339
+ margin-block-start: var(--sc-spacing-sm);
3340
+ }
3341
+
3342
+ /* ---- skeleton.css ---- */
3343
+ /* ---- Skeleton -------------------------------------------------------------- */
3344
+ .sc-skeleton {
3345
+ --_base: var(--sc-color-surface-active);
3346
+ --_sheen: var(--sc-color-surface-hover);
3347
+ display: block;
3348
+ box-sizing: border-box;
3349
+ inline-size: 100%;
3350
+ block-size: 1em;
3351
+ border-radius: var(--sc-radius-sm);
3352
+ background: var(--_base);
3353
+ background-image: linear-gradient(90deg, var(--_base) 0%, var(--_sheen) 50%, var(--_base) 100%);
3354
+ background-size: 200% 100%;
3355
+ animation: sc-shimmer 1.6s ease-in-out infinite;
3356
+ }
3357
+ .sc-skeleton[data-variant='text'] {
3358
+ display: inline-block;
3359
+ vertical-align: middle;
3360
+ block-size: 1em;
3361
+ border-radius: var(--sc-radius-sm);
3362
+ }
3363
+ .sc-skeleton[data-variant='rect'] {
3364
+ block-size: 80px;
3365
+ border-radius: var(--sc-radius-md);
3366
+ }
3367
+ .sc-skeleton[data-variant='circle'] {
3368
+ inline-size: 40px;
3369
+ aspect-ratio: 1;
3370
+ block-size: auto;
3371
+ border-radius: var(--sc-radius-full);
3372
+ }
3373
+ .sc-skeleton[data-still] {
3374
+ animation: none;
3375
+ background-image: none;
3376
+ }
3377
+ .sc-skeleton-lines {
3378
+ display: flex;
3379
+ flex-direction: column;
3380
+ gap: calc(1lh - 1em);
3381
+ inline-size: 100%;
3382
+ }
3383
+ .sc-skeleton-lines > .sc-skeleton {
3384
+ display: block;
3385
+ }
3386
+ .sc-skeleton-lines > .sc-skeleton[data-last] {
3387
+ inline-size: 60%;
3388
+ }
3389
+ @keyframes sc-shimmer {
3390
+ from {
3391
+ background-position: 200% 0;
3392
+ }
3393
+ to {
3394
+ background-position: -200% 0;
3395
+ }
3396
+ }
3397
+ @media (prefers-reduced-motion: reduce) {
3398
+ .sc-skeleton {
3399
+ animation: none;
3400
+ background-image: none;
3401
+ }
3402
+ }
3403
+
3404
+ /* ---- filepond/dist/filepond.css ---- */
3405
+ /*!
3406
+ * FilePond 4.32.12
3407
+ * Licensed under MIT, https://opensource.org/licenses/MIT/
3408
+ * Please visit https://pqina.nl/filepond/ for details.
3409
+ */
3410
+
3411
+ /* eslint-disable */
3412
+ .filepond--assistant {
3413
+ position: absolute;
3414
+ overflow: hidden;
3415
+ height: 1px;
3416
+ width: 1px;
3417
+ padding: 0;
3418
+ border: 0;
3419
+ clip: rect(1px, 1px, 1px, 1px);
3420
+ -webkit-clip-path: inset(50%);
3421
+ clip-path: inset(50%);
3422
+ white-space: nowrap;
3423
+ }
3424
+ /* Hard to override styles */
3425
+ .filepond--browser.filepond--browser {
3426
+ /* is positioned absolute so it is focusable for form validation errors */
3427
+ position: absolute;
3428
+ margin: 0;
3429
+ padding: 0;
3430
+
3431
+ /* is positioned ~behind drop label */
3432
+ left: 1em;
3433
+ top: 1.75em;
3434
+ width: calc(100% - 2em);
3435
+
3436
+ /* hide visually */
3437
+ opacity: 0;
3438
+ font-size: 0; /* removes text cursor in Internet Explorer 11 */
3439
+ }
3440
+ .filepond--data {
3441
+ position: absolute;
3442
+ width: 0;
3443
+ height: 0;
3444
+ padding: 0;
3445
+ margin: 0;
3446
+ border: none;
3447
+ visibility: hidden;
3448
+ pointer-events: none;
3449
+ contain: strict;
3450
+ }
3451
+ .filepond--drip {
3452
+ position: absolute;
3453
+ top: 0;
3454
+ left: 0;
3455
+ right: 0;
3456
+ bottom: 0;
3457
+ overflow: hidden;
3458
+ opacity: 0.1;
3459
+
3460
+ /* can't interact with this element */
3461
+ pointer-events: none;
3462
+
3463
+ /* inherit border radius from parent (needed for drip-blob cut of) */
3464
+ border-radius: 0.5em;
3465
+
3466
+ /* this seems to prevent Chrome from redrawing this layer constantly */
3467
+ background: rgba(0, 0, 0, 0.01);
3468
+ }
3469
+ .filepond--drip-blob {
3470
+ position: absolute;
3471
+ -webkit-transform-origin: center center;
3472
+ transform-origin: center center;
3473
+ top: 0;
3474
+ left: 0;
3475
+ width: 8em;
3476
+ height: 8em;
3477
+ margin-left: -4em;
3478
+ margin-top: -4em;
3479
+ background: #292625;
3480
+ border-radius: 50%;
3481
+
3482
+ /* will be animated */
3483
+ will-change: transform, opacity;
3484
+ }
3485
+ .filepond--drop-label {
3486
+ position: absolute;
3487
+ left: 0;
3488
+ right: 0;
3489
+ top: 0;
3490
+ margin: 0;
3491
+ color: #4f4f4f;
3492
+
3493
+ /* center contents */
3494
+ display: flex;
3495
+ justify-content: center;
3496
+ align-items: center;
3497
+
3498
+ /* fixes IE11 centering problems (is overruled by label min-height) */
3499
+ height: 0px;
3500
+
3501
+ /* dont allow selection */
3502
+ -webkit-user-select: none;
3503
+ -moz-user-select: none;
3504
+ -ms-user-select: none;
3505
+ user-select: none;
3506
+
3507
+ /* will be animated */
3508
+ will-change: transform, opacity;
3509
+ }
3510
+ /* Hard to override styles on purpose */
3511
+ .filepond--drop-label.filepond--drop-label label {
3512
+ display: block;
3513
+ margin: 0;
3514
+ padding: 0.5em; /* use padding instead of margin so click area is not impacted */
3515
+ }
3516
+ .filepond--drop-label label {
3517
+ cursor: default;
3518
+ font-size: 0.875em;
3519
+ font-weight: normal;
3520
+ text-align: center;
3521
+ line-height: 1.5;
3522
+ }
3523
+ .filepond--label-action {
3524
+ text-decoration: underline;
3525
+ -webkit-text-decoration-skip: ink;
3526
+ text-decoration-skip-ink: auto;
3527
+ -webkit-text-decoration-color: #a7a4a4;
3528
+ text-decoration-color: #a7a4a4;
3529
+ cursor: pointer;
3530
+ }
3531
+ .filepond--root[data-disabled] .filepond--drop-label label {
3532
+ opacity: 0.5;
3533
+ }
3534
+ /* Hard to override styles */
3535
+ .filepond--file-action-button.filepond--file-action-button {
3536
+ font-size: 1em;
3537
+ width: 1.625em;
3538
+ height: 1.625em;
3539
+
3540
+ font-family: inherit;
3541
+ line-height: inherit;
3542
+
3543
+ margin: 0;
3544
+ padding: 0;
3545
+ border: none;
3546
+ outline: none;
3547
+
3548
+ will-change: transform, opacity;
3549
+
3550
+ /* hidden label */
3551
+ }
3552
+ .filepond--file-action-button.filepond--file-action-button span {
3553
+ position: absolute;
3554
+ overflow: hidden;
3555
+ height: 1px;
3556
+ width: 1px;
3557
+ padding: 0;
3558
+ border: 0;
3559
+ clip: rect(1px, 1px, 1px, 1px);
3560
+ -webkit-clip-path: inset(50%);
3561
+ clip-path: inset(50%);
3562
+ white-space: nowrap;
3563
+ }
3564
+ .filepond--file-action-button.filepond--file-action-button {
3565
+ /* scale SVG to fill button */
3566
+ }
3567
+ .filepond--file-action-button.filepond--file-action-button svg {
3568
+ width: 100%;
3569
+ height: 100%;
3570
+ }
3571
+ .filepond--file-action-button.filepond--file-action-button {
3572
+ /* bigger touch area */
3573
+ }
3574
+ .filepond--file-action-button.filepond--file-action-button::after {
3575
+ position: absolute;
3576
+ left: -0.75em;
3577
+ right: -0.75em;
3578
+ top: -0.75em;
3579
+ bottom: -0.75em;
3580
+ content: '';
3581
+ }
3582
+ /* Soft styles */
3583
+ .filepond--file-action-button {
3584
+ /* use default arrow cursor */
3585
+ cursor: auto;
3586
+
3587
+ /* reset default button styles */
3588
+ color: #fff;
3589
+
3590
+ /* set default look n feel */
3591
+ border-radius: 50%;
3592
+ background-color: rgba(0, 0, 0, 0.5);
3593
+ background-image: none;
3594
+
3595
+ /* we animate box shadow on focus */
3596
+ /* it's only slightly slower than animating */
3597
+ /* a pseudo-element with transforms and renders */
3598
+ /* a lot better on chrome */
3599
+ box-shadow: 0 0 0 0 rgba(255, 255, 255, 0);
3600
+ transition: box-shadow 0.25s ease-in;
3601
+ }
3602
+ .filepond--file-action-button:hover,
3603
+ .filepond--file-action-button:focus {
3604
+ box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.9);
3605
+ }
3606
+ .filepond--file-action-button[disabled] {
3607
+ color: rgba(255, 255, 255, 0.5);
3608
+ background-color: rgba(0, 0, 0, 0.25);
3609
+ }
3610
+ .filepond--file-action-button[hidden] {
3611
+ display: none;
3612
+ }
3613
+ /* edit button */
3614
+ .filepond--action-edit-item.filepond--action-edit-item {
3615
+ width: 2em;
3616
+ height: 2em;
3617
+ padding: 0.1875em;
3618
+ }
3619
+ .filepond--action-edit-item.filepond--action-edit-item[data-align*='center'] {
3620
+ margin-left: -0.1875em;
3621
+ }
3622
+ .filepond--action-edit-item.filepond--action-edit-item[data-align*='bottom'] {
3623
+ margin-bottom: -0.1875em;
3624
+ }
3625
+ .filepond--action-edit-item-alt {
3626
+ border: none;
3627
+ line-height: inherit;
3628
+ background: transparent;
3629
+ font-family: inherit;
3630
+ color: inherit;
3631
+ outline: none;
3632
+ padding: 0;
3633
+ margin: 0 0 0 0.25em;
3634
+ pointer-events: all;
3635
+ position: absolute;
3636
+ }
3637
+ .filepond--action-edit-item-alt svg {
3638
+ width: 1.3125em;
3639
+ height: 1.3125em;
3640
+ }
3641
+ .filepond--action-edit-item-alt span {
3642
+ font-size: 0;
3643
+ opacity: 0;
3644
+ }
3645
+ .filepond--file-info {
3646
+ position: static;
3647
+ display: flex;
3648
+ flex-direction: column;
3649
+ align-items: flex-start;
3650
+ flex: 1;
3651
+ margin: 0 0.5em 0 0;
3652
+ min-width: 0;
3653
+
3654
+ /* will be animated */
3655
+ will-change: transform, opacity;
3656
+
3657
+ /* can't do anything with this info */
3658
+ pointer-events: none;
3659
+ -webkit-user-select: none;
3660
+ -moz-user-select: none;
3661
+ -ms-user-select: none;
3662
+ user-select: none;
3663
+
3664
+ /* no margins on children */
3665
+ }
3666
+ .filepond--file-info * {
3667
+ margin: 0;
3668
+ }
3669
+ .filepond--file-info {
3670
+ /* we don't want to have these overrules so these selectors are a bit more specific */
3671
+ }
3672
+ .filepond--file-info .filepond--file-info-main {
3673
+ font-size: 0.75em;
3674
+ line-height: 1.2;
3675
+
3676
+ /* we want ellipsis if this bar gets too wide */
3677
+ text-overflow: ellipsis;
3678
+ overflow: hidden;
3679
+ white-space: nowrap;
3680
+ width: 100%;
3681
+ }
3682
+ .filepond--file-info .filepond--file-info-sub {
3683
+ font-size: 0.625em;
3684
+ opacity: 0.5;
3685
+ transition: opacity 0.25s ease-in-out;
3686
+ white-space: nowrap;
3687
+ }
3688
+ .filepond--file-info .filepond--file-info-sub:empty {
3689
+ display: none;
3690
+ }
3691
+ .filepond--file-status {
3692
+ position: static;
3693
+ display: flex;
3694
+ flex-direction: column;
3695
+ align-items: flex-end;
3696
+ flex-grow: 0;
3697
+ flex-shrink: 0;
3698
+
3699
+ margin: 0;
3700
+ min-width: 2.25em;
3701
+ text-align: right;
3702
+
3703
+ /* will be animated */
3704
+ will-change: transform, opacity;
3705
+
3706
+ /* can't do anything with this info */
3707
+ pointer-events: none;
3708
+ -webkit-user-select: none;
3709
+ -moz-user-select: none;
3710
+ -ms-user-select: none;
3711
+ user-select: none;
3712
+
3713
+ /* no margins on children */
3714
+ }
3715
+ .filepond--file-status * {
3716
+ margin: 0;
3717
+ white-space: nowrap;
3718
+ }
3719
+ .filepond--file-status {
3720
+ /* font sizes */
3721
+ }
3722
+ .filepond--file-status .filepond--file-status-main {
3723
+ font-size: 0.75em;
3724
+ line-height: 1.2;
3725
+ }
3726
+ .filepond--file-status .filepond--file-status-sub {
3727
+ font-size: 0.625em;
3728
+ opacity: 0.5;
3729
+ transition: opacity 0.25s ease-in-out;
3730
+ }
3731
+ /* Hard to override styles */
3732
+ .filepond--file-wrapper.filepond--file-wrapper {
3733
+ border: none;
3734
+ margin: 0;
3735
+ padding: 0;
3736
+ min-width: 0;
3737
+ height: 100%;
3738
+
3739
+ /* hide legend for visual users */
3740
+ }
3741
+ .filepond--file-wrapper.filepond--file-wrapper > legend {
3742
+ position: absolute;
3743
+ overflow: hidden;
3744
+ height: 1px;
3745
+ width: 1px;
3746
+ padding: 0;
3747
+ border: 0;
3748
+ clip: rect(1px, 1px, 1px, 1px);
3749
+ -webkit-clip-path: inset(50%);
3750
+ clip-path: inset(50%);
3751
+ white-space: nowrap;
3752
+ }
3753
+ .filepond--file {
3754
+ position: static;
3755
+ display: flex;
3756
+ height: 100%;
3757
+ align-items: flex-start;
3758
+
3759
+ padding: 0.5625em 0.5625em;
3760
+
3761
+ color: #fff;
3762
+ border-radius: 0.5em;
3763
+
3764
+ /* control positions */
3765
+ }
3766
+ .filepond--file .filepond--file-status {
3767
+ margin-left: auto;
3768
+ margin-right: 2.25em;
3769
+ }
3770
+ .filepond--file .filepond--processing-complete-indicator {
3771
+ pointer-events: none;
3772
+ -webkit-user-select: none;
3773
+ -moz-user-select: none;
3774
+ -ms-user-select: none;
3775
+ user-select: none;
3776
+ z-index: 3;
3777
+ }
3778
+ .filepond--file .filepond--processing-complete-indicator,
3779
+ .filepond--file .filepond--progress-indicator,
3780
+ .filepond--file .filepond--file-action-button {
3781
+ position: absolute;
3782
+ }
3783
+ .filepond--file {
3784
+ /* .filepond--file-action-button */
3785
+ }
3786
+ .filepond--file [data-align*='left'] {
3787
+ left: 0.5625em;
3788
+ }
3789
+ .filepond--file [data-align*='right'] {
3790
+ right: 0.5625em;
3791
+ }
3792
+ .filepond--file [data-align*='center'] {
3793
+ left: calc(50% - 0.8125em); /* .8125 is half of button width */
3794
+ }
3795
+ .filepond--file [data-align*='bottom'] {
3796
+ bottom: 1.125em;
3797
+ }
3798
+ .filepond--file [data-align='center'] {
3799
+ top: calc(50% - 0.8125em);
3800
+ }
3801
+ .filepond--file .filepond--progress-indicator {
3802
+ margin-top: 0.1875em;
3803
+ }
3804
+ .filepond--file .filepond--progress-indicator[data-align*='right'] {
3805
+ margin-right: 0.1875em;
3806
+ }
3807
+ .filepond--file .filepond--progress-indicator[data-align*='left'] {
3808
+ margin-left: 0.1875em;
3809
+ }
3810
+ /* make sure text does not overlap */
3811
+ [data-filepond-item-state='cancelled'] .filepond--file-info,
3812
+ [data-filepond-item-state*='invalid'] .filepond--file-info,
3813
+ [data-filepond-item-state*='error'] .filepond--file-info {
3814
+ margin-right: 2.25em;
3815
+ }
3816
+ [data-filepond-item-state~='processing'] .filepond--file-status-sub {
3817
+ opacity: 0;
3818
+ }
3819
+ [data-filepond-item-state~='processing']
3820
+ .filepond--action-abort-item-processing
3821
+ ~ .filepond--file-status
3822
+ .filepond--file-status-sub {
3823
+ opacity: 0.5;
3824
+ }
3825
+ [data-filepond-item-state='processing-error'] .filepond--file-status-sub {
3826
+ opacity: 0;
3827
+ }
3828
+ [data-filepond-item-state='processing-error']
3829
+ .filepond--action-retry-item-processing
3830
+ ~ .filepond--file-status
3831
+ .filepond--file-status-sub {
3832
+ opacity: 0.5;
3833
+ }
3834
+ [data-filepond-item-state='processing-complete'] {
3835
+ /* busy state */
3836
+ }
3837
+ [data-filepond-item-state='processing-complete'] .filepond--action-revert-item-processing svg {
3838
+ -webkit-animation: fall 0.5s 0.125s linear both;
3839
+ animation: fall 0.5s 0.125s linear both;
3840
+ }
3841
+ [data-filepond-item-state='processing-complete'] {
3842
+ /* hide details by default, only show when can revert */
3843
+ }
3844
+ [data-filepond-item-state='processing-complete'] .filepond--file-status-sub {
3845
+ opacity: 0.5;
3846
+ }
3847
+ [data-filepond-item-state='processing-complete']
3848
+ .filepond--processing-complete-indicator:not([style*='hidden'])
3849
+ ~ .filepond--file-status
3850
+ .filepond--file-status-sub {
3851
+ opacity: 0;
3852
+ }
3853
+ [data-filepond-item-state='processing-complete'] .filepond--file-info-sub {
3854
+ opacity: 0;
3855
+ }
3856
+ [data-filepond-item-state='processing-complete']
3857
+ .filepond--action-revert-item-processing
3858
+ ~ .filepond--file-info
3859
+ .filepond--file-info-sub {
3860
+ opacity: 0.5;
3861
+ }
3862
+ /* file state can be invalid or error, both are visually similar but */
3863
+ /* having them as separate states might be useful */
3864
+ [data-filepond-item-state*='invalid'] .filepond--panel,
3865
+ [data-filepond-item-state*='invalid'] .filepond--file-wrapper,
3866
+ [data-filepond-item-state*='error'] .filepond--panel,
3867
+ [data-filepond-item-state*='error'] .filepond--file-wrapper {
3868
+ -webkit-animation: shake 0.65s linear both;
3869
+ animation: shake 0.65s linear both;
3870
+ }
3871
+ /* spins progress indicator when file is marked as busy */
3872
+ [data-filepond-item-state*='busy'] .filepond--progress-indicator svg {
3873
+ -webkit-animation: spin 1s linear infinite;
3874
+ animation: spin 1s linear infinite;
3875
+ }
3876
+ /**
3877
+ * States
3878
+ */
3879
+ @-webkit-keyframes spin {
3880
+ 0% {
3881
+ -webkit-transform: rotateZ(0deg);
3882
+ transform: rotateZ(0deg);
3883
+ }
3884
+
3885
+ 100% {
3886
+ -webkit-transform: rotateZ(360deg);
3887
+ transform: rotateZ(360deg);
3888
+ }
3889
+ }
3890
+ @keyframes spin {
3891
+ 0% {
3892
+ -webkit-transform: rotateZ(0deg);
3893
+ transform: rotateZ(0deg);
3894
+ }
3895
+
3896
+ 100% {
3897
+ -webkit-transform: rotateZ(360deg);
3898
+ transform: rotateZ(360deg);
3899
+ }
3900
+ }
3901
+ @-webkit-keyframes shake {
3902
+ 10%,
3903
+ 90% {
3904
+ -webkit-transform: translateX(-0.0625em);
3905
+ transform: translateX(-0.0625em);
3906
+ }
3907
+
3908
+ 20%,
3909
+ 80% {
3910
+ -webkit-transform: translateX(0.125em);
3911
+ transform: translateX(0.125em);
3912
+ }
3913
+
3914
+ 30%,
3915
+ 50%,
3916
+ 70% {
3917
+ -webkit-transform: translateX(-0.25em);
3918
+ transform: translateX(-0.25em);
3919
+ }
3920
+
3921
+ 40%,
3922
+ 60% {
3923
+ -webkit-transform: translateX(0.25em);
3924
+ transform: translateX(0.25em);
3925
+ }
3926
+ }
3927
+ @keyframes shake {
3928
+ 10%,
3929
+ 90% {
3930
+ -webkit-transform: translateX(-0.0625em);
3931
+ transform: translateX(-0.0625em);
3932
+ }
3933
+
3934
+ 20%,
3935
+ 80% {
3936
+ -webkit-transform: translateX(0.125em);
3937
+ transform: translateX(0.125em);
3938
+ }
3939
+
3940
+ 30%,
3941
+ 50%,
3942
+ 70% {
3943
+ -webkit-transform: translateX(-0.25em);
3944
+ transform: translateX(-0.25em);
3945
+ }
3946
+
3947
+ 40%,
3948
+ 60% {
3949
+ -webkit-transform: translateX(0.25em);
3950
+ transform: translateX(0.25em);
3951
+ }
3952
+ }
3953
+ @-webkit-keyframes fall {
3954
+ 0% {
3955
+ opacity: 0;
3956
+ -webkit-transform: scale(0.5);
3957
+ transform: scale(0.5);
3958
+ -webkit-animation-timing-function: ease-out;
3959
+ animation-timing-function: ease-out;
3960
+ }
3961
+
3962
+ 70% {
3963
+ opacity: 1;
3964
+ -webkit-transform: scale(1.1);
3965
+ transform: scale(1.1);
3966
+ -webkit-animation-timing-function: ease-in-out;
3967
+ animation-timing-function: ease-in-out;
3968
+ }
3969
+
3970
+ 100% {
3971
+ -webkit-transform: scale(1);
3972
+ transform: scale(1);
3973
+ -webkit-animation-timing-function: ease-out;
3974
+ animation-timing-function: ease-out;
3975
+ }
3976
+ }
3977
+ @keyframes fall {
3978
+ 0% {
3979
+ opacity: 0;
3980
+ -webkit-transform: scale(0.5);
3981
+ transform: scale(0.5);
3982
+ -webkit-animation-timing-function: ease-out;
3983
+ animation-timing-function: ease-out;
3984
+ }
3985
+
3986
+ 70% {
3987
+ opacity: 1;
3988
+ -webkit-transform: scale(1.1);
3989
+ transform: scale(1.1);
3990
+ -webkit-animation-timing-function: ease-in-out;
3991
+ animation-timing-function: ease-in-out;
3992
+ }
3993
+
3994
+ 100% {
3995
+ -webkit-transform: scale(1);
3996
+ transform: scale(1);
3997
+ -webkit-animation-timing-function: ease-out;
3998
+ animation-timing-function: ease-out;
3999
+ }
4000
+ }
4001
+ /* ignore all other interaction elements while dragging a file */
4002
+ .filepond--hopper[data-hopper-state='drag-over'] > * {
4003
+ pointer-events: none;
4004
+ }
4005
+ /* capture all hit tests using a hidden layer, this speeds up the event flow */
4006
+ .filepond--hopper[data-hopper-state='drag-over']::after {
4007
+ content: '';
4008
+ position: absolute;
4009
+ left: 0;
4010
+ top: 0;
4011
+ right: 0;
4012
+ bottom: 0;
4013
+ z-index: 100;
4014
+ }
4015
+ .filepond--progress-indicator {
4016
+ z-index: 103;
4017
+ }
4018
+ .filepond--file-action-button {
4019
+ z-index: 102;
4020
+ }
4021
+ .filepond--file-status {
4022
+ z-index: 101;
4023
+ }
4024
+ .filepond--file-info {
4025
+ z-index: 100;
4026
+ }
4027
+ .filepond--item {
4028
+ position: absolute;
4029
+ top: 0;
4030
+ left: 0;
4031
+ right: 0;
4032
+ z-index: 1;
4033
+
4034
+ padding: 0;
4035
+ margin: 0.25em;
4036
+
4037
+ will-change: transform, opacity;
4038
+
4039
+ touch-action: auto;
4040
+
4041
+ /* item children order */
4042
+ }
4043
+ .filepond--item > .filepond--panel {
4044
+ z-index: -1;
4045
+ }
4046
+ /* has a slight shadow */
4047
+ .filepond--item > .filepond--panel .filepond--panel-bottom {
4048
+ box-shadow: 0 0.0625em 0.125em -0.0625em rgba(0, 0, 0, 0.25);
4049
+ }
4050
+ .filepond--item {
4051
+ /* drag related */
4052
+ }
4053
+ .filepond--item > .filepond--file-wrapper,
4054
+ .filepond--item > .filepond--panel {
4055
+ transition: opacity 0.15s ease-out;
4056
+ }
4057
+ .filepond--item[data-drag-state] {
4058
+ cursor: -webkit-grab;
4059
+ cursor: grab;
4060
+ }
4061
+ .filepond--item[data-drag-state] > .filepond--panel {
4062
+ transition: box-shadow 0.125s ease-in-out;
4063
+ box-shadow: 0 0 0 rgba(0, 0, 0, 0);
4064
+ }
4065
+ .filepond--item[data-drag-state='drag'] {
4066
+ cursor: -webkit-grabbing;
4067
+ cursor: grabbing;
4068
+ }
4069
+ .filepond--item[data-drag-state='drag'] > .filepond--panel {
4070
+ box-shadow: 0 0.125em 0.3125em rgba(0, 0, 0, 0.325);
4071
+ }
4072
+ .filepond--item[data-drag-state]:not([data-drag-state='idle']) {
4073
+ z-index: 2;
4074
+ }
4075
+ /* states */
4076
+ .filepond--item-panel {
4077
+ background-color: #64605e;
4078
+ }
4079
+ [data-filepond-item-state='processing-complete'] .filepond--item-panel {
4080
+ background-color: #369763;
4081
+ }
4082
+ [data-filepond-item-state*='invalid'] .filepond--item-panel,
4083
+ [data-filepond-item-state*='error'] .filepond--item-panel {
4084
+ background-color: #c44e47;
4085
+ }
4086
+ /* style of item panel */
4087
+ .filepond--item-panel {
4088
+ border-radius: 0.5em;
4089
+ transition: background-color 0.25s;
4090
+ }
4091
+ /* normal mode */
4092
+ .filepond--list-scroller {
4093
+ position: absolute;
4094
+ top: 0;
4095
+ left: 0;
4096
+ right: 0;
4097
+ margin: 0;
4098
+ will-change: transform;
4099
+ }
4100
+ /* scroll mode */
4101
+ .filepond--list-scroller[data-state='overflow'] .filepond--list {
4102
+ bottom: 0;
4103
+ right: 0;
4104
+ }
4105
+ .filepond--list-scroller[data-state='overflow'] {
4106
+ overflow-y: scroll;
4107
+ overflow-x: hidden;
4108
+ -webkit-overflow-scrolling: touch;
4109
+ -webkit-mask: linear-gradient(to bottom, #000 calc(100% - 0.5em), transparent 100%);
4110
+ mask: linear-gradient(to bottom, #000 calc(100% - 0.5em), transparent 100%);
4111
+ }
4112
+ /* style scrollbar */
4113
+ .filepond--list-scroller::-webkit-scrollbar {
4114
+ background: transparent;
4115
+ }
4116
+ .filepond--list-scroller::-webkit-scrollbar:vertical {
4117
+ width: 1em;
4118
+ }
4119
+ .filepond--list-scroller::-webkit-scrollbar:horizontal {
4120
+ height: 0;
4121
+ }
4122
+ .filepond--list-scroller::-webkit-scrollbar-thumb {
4123
+ background-color: rgba(0, 0, 0, 0.3);
4124
+ border-radius: 99999px;
4125
+ border: 0.3125em solid transparent;
4126
+ background-clip: content-box;
4127
+ }
4128
+ /* hard to overide styles on purpose */
4129
+ .filepond--list.filepond--list {
4130
+ position: absolute;
4131
+ top: 0;
4132
+ margin: 0;
4133
+ padding: 0;
4134
+ list-style-type: none;
4135
+
4136
+ /* prevents endless paint calls on filepond--list-scroller */
4137
+ will-change: transform;
4138
+ }
4139
+ /* used for padding so allowed to be restyled */
4140
+ .filepond--list {
4141
+ left: 0.75em;
4142
+ right: 0.75em;
4143
+ }
4144
+ .filepond--root[data-style-panel-layout~='integrated'] {
4145
+ width: 100%;
4146
+ height: 100%;
4147
+ max-width: none;
4148
+ margin: 0;
4149
+ }
4150
+ .filepond--root[data-style-panel-layout~='circle'] .filepond--panel-root,
4151
+ .filepond--root[data-style-panel-layout~='integrated'] .filepond--panel-root {
4152
+ border-radius: 0;
4153
+ }
4154
+ .filepond--root[data-style-panel-layout~='circle'] .filepond--panel-root > *,
4155
+ .filepond--root[data-style-panel-layout~='integrated'] .filepond--panel-root > * {
4156
+ display: none;
4157
+ }
4158
+ .filepond--root[data-style-panel-layout~='circle'] .filepond--drop-label,
4159
+ .filepond--root[data-style-panel-layout~='integrated'] .filepond--drop-label {
4160
+ bottom: 0;
4161
+ height: auto;
4162
+ display: flex;
4163
+ justify-content: center;
4164
+ align-items: center;
4165
+ z-index: 7;
4166
+ }
4167
+ .filepond--root[data-style-panel-layout~='circle'],
4168
+ .filepond--root[data-style-panel-layout~='integrated'] {
4169
+ /* we're only loading one item, this makes the intro animation a bit nicer */
4170
+ }
4171
+ .filepond--root[data-style-panel-layout~='circle'] .filepond--item-panel,
4172
+ .filepond--root[data-style-panel-layout~='integrated'] .filepond--item-panel {
4173
+ display: none;
4174
+ }
4175
+ .filepond--root[data-style-panel-layout~='compact'] .filepond--list-scroller,
4176
+ .filepond--root[data-style-panel-layout~='integrated'] .filepond--list-scroller {
4177
+ overflow: hidden;
4178
+ height: 100%;
4179
+ margin-top: 0;
4180
+ margin-bottom: 0;
4181
+ }
4182
+ .filepond--root[data-style-panel-layout~='compact'] .filepond--list,
4183
+ .filepond--root[data-style-panel-layout~='integrated'] .filepond--list {
4184
+ left: 0;
4185
+ right: 0;
4186
+ height: 100%;
4187
+ }
4188
+ .filepond--root[data-style-panel-layout~='compact'] .filepond--item,
4189
+ .filepond--root[data-style-panel-layout~='integrated'] .filepond--item {
4190
+ margin: 0;
4191
+ }
4192
+ .filepond--root[data-style-panel-layout~='compact'] .filepond--file-wrapper,
4193
+ .filepond--root[data-style-panel-layout~='integrated'] .filepond--file-wrapper {
4194
+ height: 100%;
4195
+ }
4196
+ .filepond--root[data-style-panel-layout~='compact'] .filepond--drop-label,
4197
+ .filepond--root[data-style-panel-layout~='integrated'] .filepond--drop-label {
4198
+ z-index: 7;
4199
+ }
4200
+ .filepond--root[data-style-panel-layout~='circle'] {
4201
+ border-radius: 99999rem;
4202
+ overflow: hidden;
4203
+ }
4204
+ .filepond--root[data-style-panel-layout~='circle'] > .filepond--panel {
4205
+ border-radius: inherit;
4206
+ }
4207
+ .filepond--root[data-style-panel-layout~='circle'] > .filepond--panel > * {
4208
+ display: none;
4209
+ }
4210
+ .filepond--root[data-style-panel-layout~='circle'] {
4211
+ /* circle cuts of this info, so best to hide it */
4212
+ }
4213
+ .filepond--root[data-style-panel-layout~='circle'] .filepond--file-info {
4214
+ display: none;
4215
+ }
4216
+ .filepond--root[data-style-panel-layout~='circle'] .filepond--file-status {
4217
+ display: none;
4218
+ }
4219
+ .filepond--root[data-style-panel-layout~='circle'] .filepond--action-edit-item {
4220
+ opacity: 1 !important;
4221
+ visibility: visible !important;
4222
+ }
4223
+ /* dirfty way to fix circular overflow issue on safari 11+ */
4224
+ @media not all and (min-resolution: 0.001dpcm) {
4225
+ @supports (-webkit-appearance: none) and (stroke-color: transparent) {
4226
+ .filepond--root[data-style-panel-layout~='circle'] {
4227
+ will-change: transform;
4228
+ }
4229
+ }
4230
+ }
4231
+ .filepond--panel-root {
4232
+ border-radius: 0.5em;
4233
+ background-color: #f1f0ef;
4234
+ }
4235
+ .filepond--panel {
4236
+ position: absolute;
4237
+ left: 0;
4238
+ top: 0;
4239
+ right: 0;
4240
+ margin: 0;
4241
+
4242
+ /* defaults to 100% height (fixed height mode) this fixes problem with panel height in IE11 */
4243
+ height: 100% !important;
4244
+
4245
+ /* no interaction possible with panel */
4246
+ pointer-events: none;
4247
+ }
4248
+ .filepond-panel:not([data-scalable='false']) {
4249
+ height: auto !important;
4250
+ }
4251
+ .filepond--panel[data-scalable='false'] > div {
4252
+ display: none;
4253
+ }
4254
+ .filepond--panel[data-scalable='true'] {
4255
+ /* this seems to fix Chrome performance issues */
4256
+ /* - when box-shadow is enabled */
4257
+ /* - when multiple ponds are active on the same page */
4258
+ -webkit-transform-style: preserve-3d;
4259
+ transform-style: preserve-3d;
4260
+
4261
+ /* prevent borders and backgrounds */
4262
+ background-color: transparent !important;
4263
+ border: none !important;
4264
+ }
4265
+ .filepond--panel-top,
4266
+ .filepond--panel-bottom,
4267
+ .filepond--panel-center {
4268
+ position: absolute;
4269
+ left: 0;
4270
+ top: 0;
4271
+ right: 0;
4272
+ margin: 0;
4273
+ padding: 0;
4274
+ }
4275
+ .filepond--panel-top,
4276
+ .filepond--panel-bottom {
4277
+ height: 0.5em;
4278
+ }
4279
+ .filepond--panel-top {
4280
+ border-bottom-left-radius: 0 !important;
4281
+ border-bottom-right-radius: 0 !important;
4282
+ border-bottom: none !important;
4283
+
4284
+ /* fixes tiny transparant line between top and center panel */
4285
+ }
4286
+ .filepond--panel-top::after {
4287
+ content: '';
4288
+ position: absolute;
4289
+ height: 2px;
4290
+ left: 0;
4291
+ right: 0;
4292
+ bottom: -1px;
4293
+ background-color: inherit;
4294
+ }
4295
+ .filepond--panel-center,
4296
+ .filepond--panel-bottom {
4297
+ will-change: transform;
4298
+ -webkit-backface-visibility: hidden;
4299
+ backface-visibility: hidden;
4300
+ -webkit-transform-origin: left top;
4301
+ transform-origin: left top;
4302
+ -webkit-transform: translate3d(0, 0.5em, 0);
4303
+ transform: translate3d(0, 0.5em, 0);
4304
+ }
4305
+ .filepond--panel-bottom {
4306
+ border-top-left-radius: 0 !important;
4307
+ border-top-right-radius: 0 !important;
4308
+ border-top: none !important;
4309
+
4310
+ /* fixes tiny transparant line between bottom and center of panel */
4311
+ }
4312
+ .filepond--panel-bottom::before {
4313
+ content: '';
4314
+ position: absolute;
4315
+ height: 2px;
4316
+ left: 0;
4317
+ right: 0;
4318
+ top: -1px;
4319
+ background-color: inherit;
4320
+ }
4321
+ .filepond--panel-center {
4322
+ /* the center panel is scaled using scale3d to fit the correct height */
4323
+ /* we use 100px instead of 1px as scaling 1px to a huge height is really laggy on chrome */
4324
+ height: 100px !important;
4325
+ border-top: none !important;
4326
+ border-bottom: none !important;
4327
+ border-radius: 0 !important;
4328
+
4329
+ /* hide if not transformed, prevents a little flash when the panel is at 100px height while attached for first time */
4330
+ }
4331
+ .filepond--panel-center:not([style]) {
4332
+ visibility: hidden;
4333
+ }
4334
+ .filepond--progress-indicator {
4335
+ position: static;
4336
+ width: 1.25em;
4337
+ height: 1.25em;
4338
+
4339
+ color: #fff;
4340
+
4341
+ /* can't have margins */
4342
+ margin: 0;
4343
+
4344
+ /* no interaction possible with progress indicator */
4345
+ pointer-events: none;
4346
+
4347
+ /* will be animated */
4348
+ will-change: transform, opacity;
4349
+ }
4350
+ .filepond--progress-indicator svg {
4351
+ width: 100%;
4352
+ height: 100%;
4353
+ vertical-align: top;
4354
+ transform-box: fill-box; /* should center the animation correctly when zoomed in */
4355
+ }
4356
+ .filepond--progress-indicator path {
4357
+ fill: none;
4358
+ stroke: currentColor;
4359
+ }
4360
+ .filepond--list-scroller {
4361
+ z-index: 6;
4362
+ }
4363
+ .filepond--drop-label {
4364
+ z-index: 5;
4365
+ }
4366
+ .filepond--drip {
4367
+ z-index: 3;
4368
+ }
4369
+ .filepond--root > .filepond--panel {
4370
+ z-index: 2;
4371
+ }
4372
+ .filepond--browser {
4373
+ z-index: 1;
4374
+ }
4375
+ .filepond--root {
4376
+ /* layout*/
4377
+ box-sizing: border-box;
4378
+ position: relative;
4379
+ margin-bottom: 1em;
4380
+
4381
+ /* base font size for whole component */
4382
+ font-size: 1rem;
4383
+
4384
+ /* base line height */
4385
+ line-height: normal;
4386
+
4387
+ /* up uses default system font family */
4388
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif,
4389
+ 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
4390
+
4391
+ /* will increase font weight a bit on Safari */
4392
+ font-weight: 450;
4393
+
4394
+ /* default text alignment */
4395
+ text-align: left;
4396
+
4397
+ /* better text rendering on Safari */
4398
+ text-rendering: optimizeLegibility;
4399
+
4400
+ /* text direction is ltr for now */
4401
+ direction: ltr;
4402
+
4403
+ /* optimize rendering */
4404
+ /* https://developer.mozilla.org/en-US/docs/Web/CSS/contain */
4405
+ contain: layout style size;
4406
+
4407
+ /* correct box sizing, line-height and positioning on child elements */
4408
+ }
4409
+ .filepond--root * {
4410
+ box-sizing: inherit;
4411
+ line-height: inherit;
4412
+ }
4413
+ .filepond--root *:not(text) {
4414
+ font-size: inherit;
4415
+ }
4416
+ .filepond--root {
4417
+ /* block everything */
4418
+ }
4419
+ .filepond--root[data-disabled] {
4420
+ pointer-events: none;
4421
+ }
4422
+ .filepond--root[data-disabled] .filepond--list-scroller {
4423
+ pointer-events: all;
4424
+ }
4425
+ .filepond--root[data-disabled] .filepond--list {
4426
+ pointer-events: none;
4427
+ }
4428
+ /**
4429
+ * Root element children layout
4430
+ */
4431
+ .filepond--root .filepond--drop-label {
4432
+ min-height: 4.75em;
4433
+ }
4434
+ .filepond--root .filepond--list-scroller {
4435
+ margin-top: 1em;
4436
+ margin-bottom: 1em;
4437
+ }
4438
+ .filepond--root .filepond--credits {
4439
+ position: absolute;
4440
+ right: 0;
4441
+ opacity: 0.4;
4442
+ line-height: 0.85;
4443
+ font-size: 11px;
4444
+ color: inherit;
4445
+ text-decoration: none;
4446
+ z-index: 3;
4447
+ bottom: -14px;
4448
+ }
4449
+ .filepond--root .filepond--credits[style] {
4450
+ top: 0;
4451
+ bottom: auto;
4452
+ margin-top: 14px;
4453
+ }
4454
+
4455
+ /* ---- file-input.css ---- */
4456
+ /* ---- FileInput (FilePond, docs/adr/0004) ------------------------------------
4457
+ FilePond's own stylesheet (filepond/dist/filepond.css) is concatenated just before this file, inside the
4458
+ same layer. Everything here is scoped under .sc-file-input and wins by specificity, never !important.
4459
+ FilePond lays out its rows in JS from measured sizes, so spacing is set in em on its elements and the
4460
+ zone's height through min-height on the drop label. */
4461
+ .sc-file-input-field {
4462
+ /* Drop zone height: two control heights, so `size` and compact density move it with the other fields. */
4463
+ --_zone: calc(var(--_h) * 2);
4464
+ }
4465
+ .sc-file-input {
4466
+ position: relative;
4467
+ box-sizing: border-box;
4468
+ border: var(--sc-border-width-hairline) dashed var(--sc-color-border-strong);
4469
+ border-radius: var(--sc-radius-lg);
4470
+ background: var(--sc-color-surface-default);
4471
+ color: var(--sc-color-text-default);
4472
+ font-size: var(--_fs);
4473
+ transition:
4474
+ border-color var(--sc-duration-fast) var(--sc-ease-standard),
4475
+ background-color var(--sc-duration-fast) var(--sc-ease-standard);
4476
+ }
4477
+ .sc-file-input:not([data-disabled]):hover {
4478
+ border-color: var(--sc-color-text-muted);
4479
+ }
4480
+ /* The file input is FilePond's single tab stop and is invisible; the ring goes on the zone. */
4481
+ .sc-file-input:has(.filepond--browser:focus-visible) {
4482
+ border-color: var(--sc-color-border-focus);
4483
+ outline: var(--sc-border-width-focus) solid var(--sc-color-border-focus);
4484
+ outline-offset: var(--sc-border-width-focus);
4485
+ }
4486
+ .sc-file-input:has(.filepond--root[data-hopper-state='drag-over']) {
4487
+ border-style: solid;
4488
+ border-color: var(--sc-color-accent-default);
4489
+ background: var(--sc-color-accent-subtle);
4490
+ }
4491
+ .sc-file-input[data-invalid] {
4492
+ border-color: var(--sc-color-danger-solid);
4493
+ }
4494
+ .sc-file-input[data-disabled] {
4495
+ border-style: solid;
4496
+ border-color: var(--sc-color-border-default);
4497
+ background: var(--sc-color-surface-sunken);
4498
+ color: var(--sc-color-text-muted);
4499
+ cursor: not-allowed;
4500
+ }
4501
+
4502
+ /* Before FilePond loads (server render, first paint): the same zone, inert. */
4503
+ .sc-file-input__placeholder {
4504
+ display: flex;
4505
+ align-items: center;
4506
+ justify-content: center;
4507
+ min-block-size: var(--_zone);
4508
+ padding: var(--sc-spacing-xs);
4509
+ color: var(--sc-color-text-muted);
4510
+ text-align: center;
4511
+ }
4512
+ .sc-file-input__browse {
4513
+ color: var(--sc-color-text-link);
4514
+ text-decoration: underline;
4515
+ text-underline-offset: 0.2em;
4516
+ }
4517
+
4518
+ /* FilePond's root and the panel it animates behind the rows: the zone above paints the surface instead. */
4519
+ .sc-file-input .filepond--root {
4520
+ margin: 0;
4521
+ font-family: inherit;
4522
+ font-size: inherit;
4523
+ font-weight: inherit;
4524
+ line-height: var(--sc-font-line-height-ui);
4525
+ color: inherit;
4526
+ }
4527
+ .sc-file-input .filepond--panel-root {
4528
+ background-color: transparent;
4529
+ }
4530
+ .sc-file-input .filepond--drip {
4531
+ display: none;
4532
+ }
4533
+ .sc-file-input .filepond--root .filepond--drop-label {
4534
+ min-height: var(--_zone);
4535
+ color: var(--sc-color-text-muted);
4536
+ }
4537
+ /* Disabled reads through the sunken surface, solid border and cursor; the text stays at muted so it keeps AA
4538
+ (axe cannot tell this label belongs to a disabled control). */
4539
+ .sc-file-input[data-disabled] .filepond--root .filepond--drop-label {
4540
+ color: var(--sc-color-text-muted);
4541
+ }
4542
+ .sc-file-input .filepond--drop-label.filepond--drop-label label {
4543
+ padding: var(--sc-spacing-xs);
4544
+ font-size: 1em;
4545
+ line-height: var(--sc-font-line-height-ui);
4546
+ cursor: pointer;
4547
+ }
4548
+ .sc-file-input .filepond--root[data-disabled] .filepond--drop-label label {
4549
+ opacity: 1;
4550
+ }
4551
+ .sc-file-input .filepond--label-action {
4552
+ color: var(--sc-color-text-link);
4553
+ text-decoration-color: currentColor;
4554
+ text-underline-offset: 0.2em;
4555
+ }
4556
+ .sc-file-input[data-disabled] .filepond--label-action {
4557
+ color: inherit;
4558
+ }
4559
+ .sc-file-input .filepond--root .filepond--list-scroller {
4560
+ margin-block: 0 0.5em;
4561
+ }
4562
+ .sc-file-input .filepond--list.filepond--list {
4563
+ inset-inline: 0.5em;
4564
+ }
4565
+
4566
+ /* File rows */
4567
+ .sc-file-input .filepond--item {
4568
+ margin: 0.25em 0;
4569
+ }
4570
+ .sc-file-input .filepond--item-panel {
4571
+ border-radius: var(--sc-radius-md);
4572
+ background-color: var(--sc-color-surface-sunken);
4573
+ }
4574
+ .sc-file-input[data-disabled] .filepond--item-panel {
4575
+ background-color: var(--sc-color-surface-default);
4576
+ }
4577
+ .sc-file-input .filepond--item > .filepond--panel .filepond--panel-bottom {
4578
+ box-shadow: none;
4579
+ }
4580
+ .sc-file-input .filepond--file {
4581
+ align-items: center;
4582
+ padding: 0.5em 0.75em;
4583
+ color: var(--sc-color-text-default);
4584
+ }
4585
+ .sc-file-input[data-disabled] .filepond--file {
4586
+ color: var(--sc-color-text-muted);
4587
+ }
4588
+ .sc-file-input .filepond--file-info {
4589
+ flex-direction: row;
4590
+ align-items: baseline;
4591
+ gap: var(--sc-spacing-xs);
4592
+ margin-inline-end: 2.5em;
4593
+ }
4594
+ .sc-file-input .filepond--file-info .filepond--file-info-main {
4595
+ flex: 0 1 auto;
4596
+ inline-size: auto;
4597
+ font-size: 1em;
4598
+ font-weight: var(--sc-font-weight-medium);
4599
+ line-height: var(--sc-font-line-height-ui);
4600
+ }
4601
+ .sc-file-input .filepond--file-info .filepond--file-info-sub {
4602
+ flex: none;
4603
+ font-size: var(--sc-font-size-xs);
4604
+ font-variant-numeric: tabular-nums;
4605
+ color: var(--sc-color-text-muted);
4606
+ opacity: 1;
4607
+ }
4608
+ .sc-file-input .filepond--file-status {
4609
+ display: none;
4610
+ }
4611
+ .sc-file-input .filepond--progress-indicator {
4612
+ color: var(--sc-color-text-muted);
4613
+ }
4614
+ /* The × at the end of each row: a ghost icon button. */
4615
+ .sc-file-input .filepond--file-action-button.filepond--file-action-button {
4616
+ display: inline-grid;
4617
+ place-items: center;
4618
+ inline-size: var(--sc-size-control-sm);
4619
+ block-size: var(--sc-size-control-sm);
4620
+ border-radius: var(--sc-radius-sm);
4621
+ font-size: inherit;
4622
+ }
4623
+ .sc-file-input .filepond--file [data-align*='right'] {
4624
+ inset-inline-end: 0.25em;
4625
+ }
4626
+ .sc-file-input .filepond--file-action-button.filepond--file-action-button svg {
4627
+ inline-size: var(--sc-size-icon-md);
4628
+ block-size: var(--sc-size-icon-md);
4629
+ }
4630
+ .sc-file-input .filepond--action-remove-item {
4631
+ top: 50%;
4632
+ margin-block-start: calc(var(--sc-size-control-sm) / -2);
4633
+ background: transparent;
4634
+ color: var(--sc-color-text-muted);
4635
+ box-shadow: none;
4636
+ cursor: pointer;
4637
+ transition:
4638
+ background-color var(--sc-duration-fast) var(--sc-ease-standard),
4639
+ color var(--sc-duration-fast) var(--sc-ease-standard);
4640
+ }
4641
+ .sc-file-input .filepond--action-remove-item:hover,
4642
+ .sc-file-input .filepond--action-remove-item:focus {
4643
+ background: var(--sc-color-surface-hover);
4644
+ color: var(--sc-color-text-default);
4645
+ box-shadow: none;
4646
+ }
4647
+ .sc-file-input .filepond--file-action-button.filepond--file-action-button:focus-visible {
4648
+ outline: var(--sc-border-width-focus) solid var(--sc-color-border-focus);
4649
+ outline-offset: 0;
4650
+ }
4651
+ .sc-file-input .filepond--action-remove-item[disabled] {
4652
+ background: transparent;
4653
+ color: var(--sc-color-text-subtle);
4654
+ cursor: not-allowed;
4655
+ }
4656
+
4657
+ /* The message slot stays in the tree (it is the live region); out of the flow while empty. */
4658
+ .sc-file-input__messages {
4659
+ display: flex;
4660
+ flex-direction: column;
4661
+ gap: var(--sc-spacing-3xs);
4662
+ }
4663
+ .sc-file-input__messages:empty {
4664
+ position: absolute;
4665
+ }
4666
+
4667
+ @media (prefers-reduced-motion: reduce) {
4668
+ .sc-file-input,
4669
+ .sc-file-input .filepond--action-remove-item {
4670
+ transition: none;
4671
+ }
4672
+ }
4673
+
883
4674
  }