@salemcobalt/ui 0.2.0-rc.1 → 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.1 — 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. */
@@ -10,6 +10,7 @@
10
10
  .sc-input:focus-visible,
11
11
  .sc-select:focus-visible,
12
12
  .sc-select__item:focus-visible,
13
+ .sc-select__clear:focus-visible,
13
14
  .sc-checkbox:focus-visible,
14
15
  .sc-switch:focus-visible,
15
16
  .sc-tabs__tab:focus-visible,
@@ -305,6 +306,10 @@
305
306
  .sc-button[data-loading] > .sc-button__label {
306
307
  opacity: 0;
307
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
+ }
308
313
  .sc-button__icon {
309
314
  display: inline-flex;
310
315
  inline-size: 1.125em;
@@ -324,6 +329,44 @@
324
329
  border-inline-end-color: transparent;
325
330
  animation: sc-spin 0.8s linear infinite;
326
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
+ }
327
370
  @keyframes sc-spin {
328
371
  to {
329
372
  rotate: 1turn;
@@ -360,6 +403,40 @@
360
403
  .sc-icon-button[data-loading] > .sc-button__icon {
361
404
  opacity: 0;
362
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
+ }
363
440
  .sc-button[data-popup-open] {
364
441
  background: var(--sc-color-surface-active);
365
442
  }
@@ -513,6 +590,9 @@
513
590
  --_p: var(--sc-spacing-lg);
514
591
  }
515
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);
516
596
  box-shadow: var(--sc-elevation-1);
517
597
  border-color: transparent;
518
598
  }
@@ -731,19 +811,27 @@
731
811
  transition-duration: calc(var(--sc-duration-base) * 0.75);
732
812
  transition-timing-function: var(--sc-ease-exit);
733
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. */
734
816
  .sc-dialog__popup {
817
+ --_gutter: var(--sc-spacing-md);
818
+ --_max: calc(100dvw - 2 * var(--_gutter));
735
819
  position: fixed;
736
820
  inset: 0;
737
821
  margin: auto;
738
822
  z-index: var(--sc-z-dialog);
739
823
  box-sizing: border-box;
740
- inline-size: min(100% - 2 * var(--sc-spacing-md), var(--sc-size-dialog-md));
741
- 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);
742
827
  block-size: fit-content;
743
828
  overflow: auto;
744
829
  padding: var(--sc-spacing-lg);
745
830
  border-radius: var(--sc-radius-xl);
746
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);
747
835
  color: var(--sc-color-text-default);
748
836
  border: var(--sc-border-width-hairline) solid var(--sc-color-border-default);
749
837
  box-shadow: var(--sc-elevation-3);
@@ -764,10 +852,10 @@
764
852
  transition-timing-function: var(--sc-ease-exit);
765
853
  }
766
854
  .sc-dialog__popup[data-size='sm'] {
767
- 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));
768
856
  }
769
857
  .sc-dialog__popup[data-size='lg'] {
770
- 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));
771
859
  }
772
860
  .sc-dialog__title {
773
861
  margin: 0;
@@ -788,6 +876,20 @@
788
876
  font-size: var(--sc-font-size-sm);
789
877
  line-height: var(--sc-font-line-height-normal);
790
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
+ }
791
893
  .sc-dialog__actions {
792
894
  margin-block-start: var(--sc-spacing-lg);
793
895
  }
@@ -810,6 +912,65 @@
810
912
  background: var(--sc-color-surface-hover);
811
913
  color: var(--sc-color-text-default);
812
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
+ }
813
974
  @media (prefers-reduced-motion: reduce) {
814
975
  .sc-dialog__backdrop,
815
976
  .sc-dialog__popup {
@@ -928,6 +1089,9 @@
928
1089
  padding: var(--sc-spacing-2xs);
929
1090
  border-radius: var(--sc-radius-lg);
930
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);
931
1095
  color: var(--sc-color-text-default);
932
1096
  border: var(--sc-border-width-hairline) solid var(--sc-color-border-default);
933
1097
  box-shadow: var(--sc-elevation-2);
@@ -963,7 +1127,7 @@
963
1127
  border-radius: var(--sc-radius-sm);
964
1128
  color: var(--sc-color-text-default);
965
1129
  text-decoration: none;
966
- cursor: default;
1130
+ cursor: pointer;
967
1131
  user-select: none;
968
1132
  outline: 0;
969
1133
  }
@@ -1100,6 +1264,7 @@
1100
1264
  min-inline-size: 0;
1101
1265
  }
1102
1266
  .sc-input {
1267
+ appearance: none;
1103
1268
  box-sizing: border-box;
1104
1269
  inline-size: 100%;
1105
1270
  min-inline-size: 0;
@@ -1137,6 +1302,30 @@
1137
1302
  color: var(--sc-color-text-subtle);
1138
1303
  cursor: not-allowed;
1139
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
+ }
1140
1329
  .sc-input-wrap[data-icon-start] > .sc-input {
1141
1330
  padding-inline-start: calc(var(--_px) + var(--sc-size-icon-md) + var(--sc-spacing-xs));
1142
1331
  }
@@ -1174,7 +1363,29 @@
1174
1363
  .sc-textarea[data-resize='none'] {
1175
1364
  resize: none;
1176
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
+ }
1177
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
+ }
1178
1389
  .sc-select {
1179
1390
  box-sizing: border-box;
1180
1391
  display: inline-flex;
@@ -1206,6 +1417,30 @@
1206
1417
  inline-size: 100%;
1207
1418
  align-self: stretch;
1208
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
+ }
1209
1444
  .sc-select:hover:not([data-disabled]) {
1210
1445
  border-color: var(--sc-color-text-muted);
1211
1446
  }
@@ -1248,6 +1483,9 @@
1248
1483
  padding: var(--sc-spacing-2xs);
1249
1484
  border-radius: var(--sc-radius-lg);
1250
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);
1251
1489
  color: var(--sc-color-text-default);
1252
1490
  border: var(--sc-border-width-hairline) solid var(--sc-color-border-default);
1253
1491
  box-shadow: var(--sc-elevation-2);
@@ -1275,7 +1513,7 @@
1275
1513
  padding-inline: var(--sc-spacing-xs);
1276
1514
  padding-block: var(--sc-spacing-2xs);
1277
1515
  border-radius: var(--sc-radius-sm);
1278
- cursor: default;
1516
+ cursor: pointer;
1279
1517
  user-select: none;
1280
1518
  outline: 0;
1281
1519
  }
@@ -1541,6 +1779,50 @@
1541
1779
  .sc-tabs__panel[data-hidden] {
1542
1780
  display: none;
1543
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
+ }
1544
1826
  @media (prefers-reduced-motion: reduce) {
1545
1827
  .sc-tabs__tab,
1546
1828
  .sc-tabs__indicator {
@@ -1548,91 +1830,531 @@
1548
1830
  }
1549
1831
  }
1550
1832
 
1551
- /* ---- toolbar.css ---- */
1552
- /* ---- Toolbar --------------------------------------------------------------- */
1553
- .sc-toolbar {
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 {
1554
1847
  display: flex;
1555
1848
  flex-wrap: nowrap;
1556
1849
  align-items: center;
1557
- gap: var(--sc-spacing-xs);
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;
1558
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 {
1559
1873
  overflow-x: auto;
1874
+ overflow-y: hidden;
1560
1875
  scrollbar-width: none;
1561
1876
  }
1562
- .sc-toolbar[data-wrap] {
1563
- flex-wrap: wrap;
1564
- overflow: visible;
1877
+ .sc-priority-nav[data-measuring] .sc-priority-nav__more[hidden] {
1878
+ display: flex;
1879
+ position: absolute;
1880
+ visibility: hidden;
1881
+ pointer-events: none;
1565
1882
  }
1566
- .sc-toolbar__group {
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 {
1567
1890
  display: inline-flex;
1568
- flex: none;
1569
1891
  align-items: center;
1570
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);
1571
1911
  }
1572
- .sc-toolbar__separator {
1573
- flex: none;
1574
- inline-size: var(--sc-border-width-hairline);
1575
- block-size: var(--sc-size-icon-lg);
1576
- margin-inline: var(--sc-spacing-2xs);
1577
- background: var(--sc-color-border-default);
1578
- }
1579
- .sc-toolbar[data-orientation='vertical'] {
1580
- flex-direction: column;
1581
- align-items: stretch;
1582
- }
1583
- .sc-toolbar[data-orientation='vertical'] > .sc-toolbar__separator {
1584
- inline-size: auto;
1585
- block-size: var(--sc-border-width-hairline);
1586
- margin-inline: 0;
1587
- margin-block: var(--sc-spacing-2xs);
1588
- }
1589
- .sc-toolbar__spacer {
1590
- flex: 1 1 0;
1591
- min-inline-size: var(--sc-spacing-xs);
1912
+ .sc-priority-nav__link {
1913
+ min-inline-size: 0;
1592
1914
  }
1593
- .sc-toolbar[data-gap='none'],
1594
- .sc-toolbar__group[data-gap='none'] {
1595
- gap: var(--sc-spacing-none);
1915
+ .sc-priority-nav__label {
1916
+ min-inline-size: 0;
1917
+ overflow: hidden;
1918
+ text-overflow: ellipsis;
1596
1919
  }
1597
- .sc-toolbar[data-gap='3xs'],
1598
- .sc-toolbar__group[data-gap='3xs'] {
1599
- gap: var(--sc-spacing-3xs);
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);
1600
1924
  }
1601
- .sc-toolbar[data-gap='2xs'],
1602
- .sc-toolbar__group[data-gap='2xs'] {
1603
- gap: var(--sc-spacing-2xs);
1925
+ .sc-priority-nav__link:active,
1926
+ .sc-priority-nav__toggle:active {
1927
+ background: var(--sc-color-surface-active);
1604
1928
  }
1605
- .sc-toolbar[data-gap='xs'],
1606
- .sc-toolbar__group[data-gap='xs'] {
1607
- gap: var(--sc-spacing-xs);
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;
1608
1934
  }
1609
- .sc-toolbar[data-gap='sm'],
1610
- .sc-toolbar__group[data-gap='sm'] {
1611
- gap: var(--sc-spacing-sm);
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));
1612
1939
  }
1613
- .sc-toolbar[data-gap='md'],
1614
- .sc-toolbar__group[data-gap='md'] {
1615
- gap: var(--sc-spacing-md);
1940
+ .sc-priority-nav__toggle[aria-expanded='true'] {
1941
+ background: var(--sc-color-surface-active);
1942
+ color: var(--sc-color-text-default);
1616
1943
  }
1617
- .sc-toolbar[data-gap='lg'],
1618
- .sc-toolbar__group[data-gap='lg'] {
1619
- gap: var(--sc-spacing-lg);
1944
+ .sc-priority-nav__ellipsis {
1945
+ display: none;
1620
1946
  }
1621
- .sc-toolbar[data-gap='xl'],
1622
- .sc-toolbar__group[data-gap='xl'] {
1623
- gap: var(--sc-spacing-xl);
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
+ }
1624
1968
  }
1625
- .sc-toolbar[data-gap='2xl'],
1626
- .sc-toolbar__group[data-gap='2xl'] {
1627
- gap: var(--sc-spacing-2xl);
1969
+ .sc-priority-nav__chevron {
1970
+ transition: rotate var(--sc-duration-fast) var(--sc-ease-standard);
1628
1971
  }
1629
- .sc-toolbar[data-gap='3xl'],
1630
- .sc-toolbar__group[data-gap='3xl'] {
1631
- gap: var(--sc-spacing-3xl);
1972
+ .sc-priority-nav__toggle[aria-expanded='true'] > .sc-priority-nav__chevron {
1973
+ rotate: 180deg;
1632
1974
  }
1633
- .sc-toolbar[data-gap='4xl'],
1634
- .sc-toolbar__group[data-gap='4xl'] {
1635
- gap: var(--sc-spacing-4xl);
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;
1636
2358
  }
1637
2359
 
1638
2360
  /* ---- banner.css ---- */
@@ -1843,4 +2565,2110 @@
1843
2565
  }
1844
2566
  }
1845
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
+
1846
4674
  }