@scattered-light/loomiere-base-ui 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/README.md +29 -4
  2. package/dist/{chunk-JUUPOOQQ.js → chunk-LJQ3RZDJ.js} +51 -3
  3. package/dist/chunk-LJQ3RZDJ.js.map +1 -0
  4. package/dist/custom/collection/index.d.ts +13 -2
  5. package/dist/custom/collection/index.js +53 -29
  6. package/dist/custom/collection/index.js.map +1 -1
  7. package/dist/custom/index.d.ts +1 -1
  8. package/dist/custom/index.js +1 -1
  9. package/dist/design-system/components/Collection/README.md +1 -1
  10. package/dist/design-system/components/CollectionToolbar/README.md +7 -2
  11. package/dist/design-system/components/ContextMenu/README.md +1 -1
  12. package/dist/design-system/components/ContextMenu/preview.html +1 -1
  13. package/dist/design-system/components/DataList/README.md +1 -1
  14. package/dist/design-system/components/DataList/preview.html +171 -171
  15. package/dist/design-system/components/DataTable/README.md +1 -1
  16. package/dist/design-system/components/DataTable/preview.html +176 -176
  17. package/dist/design-system/components/DescriptionList/README.md +41 -0
  18. package/dist/design-system/components/DescriptionList/preview.html +19 -0
  19. package/dist/design-system/components/Drawer/README.md +1 -1
  20. package/dist/design-system/components/ScrollArea/preview.html +2 -2
  21. package/dist/design-system/components/Sheet/README.md +46 -0
  22. package/dist/design-system/components/Sheet/preview.html +19 -0
  23. package/dist/design-system/components/StatFigure/README.md +38 -0
  24. package/dist/design-system/components/StatFigure/preview.html +19 -0
  25. package/dist/design-system/components/Table/README.md +2 -2
  26. package/dist/design-system/components/Table/preview.html +2 -2
  27. package/dist/design-system/components/bundle.js +7 -7
  28. package/dist/design-system/components/index.d.ts +1 -1
  29. package/dist/design-system/components/styles.css +457 -60
  30. package/dist/{index-ChJXlxzq.d.ts → index-CBAo353T.d.ts} +55 -1
  31. package/dist/index.d.ts +1 -1
  32. package/dist/index.js +1 -1
  33. package/dist/styles/components/Accordion.css +1 -1
  34. package/dist/styles/components/AlertDialog.css +1 -1
  35. package/dist/styles/components/Autocomplete.css +1 -1
  36. package/dist/styles/components/Avatar.css +1 -1
  37. package/dist/styles/components/Button.css +1 -1
  38. package/dist/styles/components/Checkbox.css +1 -1
  39. package/dist/styles/components/CheckboxGroup.css +1 -1
  40. package/dist/styles/components/Collapsible.css +1 -1
  41. package/dist/styles/components/Combobox.css +1 -1
  42. package/dist/styles/components/ContextMenu.css +1 -1
  43. package/dist/styles/components/Dialog.css +1 -1
  44. package/dist/styles/components/Drawer.css +8 -2
  45. package/dist/styles/components/Field.css +1 -1
  46. package/dist/styles/components/Fieldset.css +1 -1
  47. package/dist/styles/components/Form.css +1 -1
  48. package/dist/styles/components/Input.css +1 -1
  49. package/dist/styles/components/Menu.css +1 -1
  50. package/dist/styles/components/Menubar.css +1 -1
  51. package/dist/styles/components/Meter.css +1 -1
  52. package/dist/styles/components/NavigationMenu.css +1 -1
  53. package/dist/styles/components/NumberField.css +1 -1
  54. package/dist/styles/components/OTPField.css +1 -1
  55. package/dist/styles/components/Popover.css +1 -1
  56. package/dist/styles/components/PreviewCard.css +1 -1
  57. package/dist/styles/components/Progress.css +1 -1
  58. package/dist/styles/components/Radio.css +1 -1
  59. package/dist/styles/components/ScrollArea.css +1 -1
  60. package/dist/styles/components/Select.css +1 -1
  61. package/dist/styles/components/Separator.css +1 -1
  62. package/dist/styles/components/Slider.css +1 -1
  63. package/dist/styles/components/Switch.css +1 -1
  64. package/dist/styles/components/Tabs.css +1 -1
  65. package/dist/styles/components/Toast.css +1 -1
  66. package/dist/styles/components/Toggle.css +1 -1
  67. package/dist/styles/components/ToggleGroup.css +1 -1
  68. package/dist/styles/components/Toolbar.css +1 -1
  69. package/dist/styles/components/Tooltip.css +1 -1
  70. package/dist/styles/custom/Badge.css +1 -1
  71. package/dist/styles/custom/Collection.css +2 -2
  72. package/dist/styles/custom/CollectionPagination.css +1 -1
  73. package/dist/styles/custom/CollectionToolbar.css +87 -4
  74. package/dist/styles/custom/DataList.css +19 -1
  75. package/dist/styles/custom/DataTable.css +1 -1
  76. package/dist/styles/custom/DatePicker.css +1 -1
  77. package/dist/styles/custom/DescriptionList.css +75 -0
  78. package/dist/styles/custom/EditableList.css +1 -1
  79. package/dist/styles/custom/EmptyState.css +1 -1
  80. package/dist/styles/custom/ListDetail.css +1 -1
  81. package/dist/styles/custom/MoneyField.css +1 -1
  82. package/dist/styles/custom/Sheet.css +90 -0
  83. package/dist/styles/custom/Splitter.css +1 -1
  84. package/dist/styles/custom/StatFigure.css +60 -0
  85. package/dist/styles/custom/Table.css +63 -1
  86. package/dist/styles/index.css +4 -1
  87. package/dist/styles/reset/accessibility.css +1 -1
  88. package/dist/styles/reset/reset-accessibility.css +1 -1
  89. package/dist/styles/reset/reset-tailwind.css +2 -2
  90. package/dist/styles/reset/reset.css +2 -2
  91. package/dist/styles/tailwind.css +4 -1
  92. package/package.json +2 -2
  93. package/dist/chunk-JUUPOOQQ.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  @import url('https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,400,0..1,0');
2
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
2
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
3
3
  /* Loomiere for Base UI: component styles. Brand-free: every value is a --sl- variable from a
4
4
  Loomiere theme. Load the theme first:
5
5
  @import '<your theme>/tokens.css';
@@ -9,7 +9,7 @@
9
9
  /* Document defaults, in the reset layer so any unlayered rule wins over them, and so layered
10
10
  frameworks (Chakra's recipes, Tailwind's utilities) are not undone by them. */
11
11
  @layer reset {
12
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
12
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
13
13
  /* CSS Reset - Mojave Theme */
14
14
 
15
15
  /* ============================================
@@ -283,7 +283,7 @@ pre {
283
283
  background: var(--sl-content-pre-background);
284
284
  border: var(--sl-stroke-thin) solid var(--sl-content-pre-border);
285
285
  color: var(--sl-content-pre-text);
286
- border-radius: var(--sl-space-2);
286
+ border-radius: var(--sl-content-pre-radius);
287
287
  overflow-x: auto;
288
288
  margin-block: var(--sl-space-6);
289
289
  }
@@ -453,7 +453,7 @@ hr {
453
453
  }
454
454
  }
455
455
  @layer reset {
456
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
456
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
457
457
  /* Accessibility — base rules (no theme color dependencies). Theme-specific focus/invalid: accessibility-theme.css */
458
458
 
459
459
  /* Remove default focus; keyboard focus styled in accessibility-theme.css */
@@ -566,7 +566,7 @@ main:focus {
566
566
 
567
567
  }
568
568
  @layer reset {
569
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
569
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
570
570
  /* Focus, invalid, contrast — requires theme tokens (after theme-accessibility.css). */
571
571
 
572
572
  :focus-visible {
@@ -634,7 +634,7 @@ button,
634
634
 
635
635
  }
636
636
  /* Component styles */
637
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
637
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
638
638
  /* Accordion - Mojave Theme
639
639
  *
640
640
  * No component tokens. Hover, press, chevron, divider and motion are the disclosure
@@ -755,7 +755,7 @@ button,
755
755
  overflow: hidden;
756
756
  }
757
757
 
758
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
758
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
759
759
  /* Alert Dialog - Mojave Theme
760
760
  *
761
761
  * No component tokens and no rules of its own. An alert dialog looks exactly like a
@@ -764,7 +764,7 @@ button,
764
764
  * cancel quiet, and a destructive one bold with data-color="error".
765
765
  */
766
766
 
767
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
767
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
768
768
  /* Autocomplete - Mojave Theme
769
769
  *
770
770
  * No component tokens. The input is Input (Input.css), the clear button is an icon
@@ -966,7 +966,7 @@ button,
966
966
  (reset-accessibility.css).
967
967
  ============================================ */
968
968
 
969
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
969
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
970
970
  /* Avatar - Mojave Theme
971
971
  *
972
972
  * A round picture with a ring in the page color, so avatars in a group cut out of each other in
@@ -1074,7 +1074,7 @@ button,
1074
1074
  }
1075
1075
  }
1076
1076
 
1077
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
1077
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
1078
1078
  /* Button - Mojave Theme
1079
1079
  *
1080
1080
  * Colors are the brand's emphasis levels, sizes are control.*, text is the trigger
@@ -1224,7 +1224,7 @@ button,
1224
1224
  font-size: var(--sl-icon-size-maximize);
1225
1225
  }
1226
1226
 
1227
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
1227
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
1228
1228
  /* Checkbox - Mojave Theme
1229
1229
  * Sizes follow the label: the box is the icon size one tier above the label's text
1230
1230
  * tier (like a button's icon) and the check mark one tier below it.
@@ -1381,7 +1381,7 @@ button,
1381
1381
  border-radius: var(--sl-radius-pill);
1382
1382
  }
1383
1383
 
1384
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
1384
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
1385
1385
  /* Checkbox Group - Mojave Theme */
1386
1386
 
1387
1387
  /* Each checkbox row is already a full tap target tall, so the rows sit close. */
@@ -1397,7 +1397,7 @@ button,
1397
1397
  pointer-events: none;
1398
1398
  }
1399
1399
 
1400
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
1400
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
1401
1401
  /* Collapsible - Mojave Theme
1402
1402
  *
1403
1403
  * No component tokens. Hover, press, chevron and motion are the disclosure concept
@@ -1513,7 +1513,7 @@ button,
1513
1513
  background: var(--sl-surface-raised);
1514
1514
  }
1515
1515
 
1516
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
1516
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
1517
1517
  /* Combobox - Mojave Theme
1518
1518
  *
1519
1519
  * No component tokens. The input is Input (Input.css); the chips box is a field; the
@@ -1998,7 +1998,7 @@ button,
1998
1998
  color: var(--sl-text-tertiary);
1999
1999
  }
2000
2000
 
2001
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
2001
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
2002
2002
  /* Context Menu - Mojave Theme
2003
2003
  *
2004
2004
  * No component tokens. Opens on right-click; the trigger area only sets the cursor. The popup is the popup concept, rows are item rows at the
@@ -2167,7 +2167,7 @@ button,
2167
2167
  stroke-width: var(--sl-stroke-default);
2168
2168
  }
2169
2169
 
2170
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
2170
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
2171
2171
  /* Dialog and Alert dialog - Mojave Theme
2172
2172
  *
2173
2173
  * Both are centered modals built from the modal concept (tokens/semantic/modal.json):
@@ -2313,12 +2313,14 @@ button,
2313
2313
  margin-top: var(--sl-modal-actions-spacing);
2314
2314
  }
2315
2315
 
2316
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
2316
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
2317
2317
  /* Drawer - a panel that slides in from an edge and can be swiped away.
2318
2318
  The surface, scrim, heading and motion are the modal concept's (--sl-modal-*), so a
2319
2319
  drawer reads as a dialog's sibling; only its size and grab bar are its own
2320
2320
  (--sl-drawer-*). Base UI supplies the swipe through
2321
- --drawer-swipe-movement-x/y and data-swipe-direction on the popup. */
2321
+ --drawer-swipe-movement-x/y and data-swipe-direction on the popup.
2322
+ The working-paper rule (rule.width, 0 by default) replaces the top border with a heavier
2323
+ line in rule.color. It is an inset shadow, so it stays put while the drawer scrolls. */
2322
2324
 
2323
2325
  .DrawerBackdrop {
2324
2326
  position: fixed;
@@ -2355,6 +2357,8 @@ button,
2355
2357
  overflow-y: auto;
2356
2358
  overscroll-behavior: contain;
2357
2359
  pointer-events: auto;
2360
+ border-top-width: max(0px, var(--sl-modal-border-width) - var(--sl-rule-width) * 1000);
2361
+ box-shadow: inset 0 var(--sl-rule-width) 0 0 var(--sl-rule-color), var(--sl-modal-shadow);
2358
2362
  transform: translate(var(--drawer-swipe-movement-x, 0px), var(--drawer-swipe-movement-y, 0px));
2359
2363
  transition: transform calc(var(--sl-modal-animation-duration) * var(--drawer-swipe-strength, 1)) var(--sl-modal-animation-easing);
2360
2364
  }
@@ -2385,6 +2389,8 @@ button,
2385
2389
  max-height: var(--sl-drawer-popup-max-size);
2386
2390
  border-top: 0;
2387
2391
  border-radius: 0 0 var(--sl-modal-radius) var(--sl-modal-radius);
2392
+ /* Its top edge is the screen's, so no rule. */
2393
+ box-shadow: var(--sl-modal-shadow);
2388
2394
  }
2389
2395
 
2390
2396
  .DrawerPopup[data-swipe-direction='right'] {
@@ -2440,7 +2446,7 @@ button,
2440
2446
  color: var(--sl-modal-description-color);
2441
2447
  }
2442
2448
 
2443
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
2449
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
2444
2450
  /* Field - Mojave Theme
2445
2451
  *
2446
2452
  * Label, control, description and error. No component tokens: spacing is the field
@@ -2501,7 +2507,7 @@ textarea.FieldControl {
2501
2507
  height: auto;
2502
2508
  }
2503
2509
 
2504
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
2510
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
2505
2511
  /* Fieldset - Mojave Theme
2506
2512
  *
2507
2513
  * No component tokens: a titled group of fields, spaced by the stack gaps, with
@@ -2543,7 +2549,7 @@ textarea.FieldControl {
2543
2549
  color: var(--sl-text-secondary);
2544
2550
  }
2545
2551
 
2546
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
2552
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
2547
2553
  /* Form - Mojave Theme
2548
2554
  *
2549
2555
  * No component tokens: fields stack with the large block space, and the action
@@ -2563,7 +2569,7 @@ textarea.FieldControl {
2563
2569
  margin-top: var(--sl-space-block-md);
2564
2570
  }
2565
2571
 
2566
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
2572
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
2567
2573
  /* Input - Mojave Theme
2568
2574
  *
2569
2575
  * No component tokens: the look is the field concept (tokens/semantic/field.json),
@@ -2700,7 +2706,7 @@ textarea.FieldControl {
2700
2706
  padding-inline: var(--sl-control-padding-inline-lg);
2701
2707
  }
2702
2708
 
2703
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
2709
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
2704
2710
  /* Menu - Mojave Theme
2705
2711
  *
2706
2712
  * No component tokens. The trigger is a Button. The popup is the popup concept, rows are item rows at the
@@ -2849,7 +2855,7 @@ textarea.FieldControl {
2849
2855
  color: var(--sl-text-tertiary);
2850
2856
  }
2851
2857
 
2852
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
2858
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
2853
2859
  /* Menubar - Mojave Theme
2854
2860
  *
2855
2861
  * No component tokens. A row of quiet triggers, each opening a menu. The popup is the popup concept, rows are item rows at the
@@ -3042,7 +3048,7 @@ textarea.FieldControl {
3042
3048
  color: var(--sl-text-tertiary);
3043
3049
  }
3044
3050
 
3045
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
3051
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
3046
3052
  /* Meter - Mojave Theme
3047
3053
  *
3048
3054
  * A gauge (tokens/semantic/gauge.json). The fill is the solid color of the scope around it:
@@ -3105,7 +3111,7 @@ textarea.FieldControl {
3105
3111
  height: var(--sl-gauge-height-lg);
3106
3112
  }
3107
3113
 
3108
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
3114
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
3109
3115
  /* Navigation Menu - Mojave Theme
3110
3116
  *
3111
3117
  * The strip is the bar concept, the panel is the popup concept and each link is an item
@@ -3525,7 +3531,7 @@ textarea.FieldControl {
3525
3531
  width: 100%;
3526
3532
  }
3527
3533
 
3528
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
3534
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
3529
3535
  /* Number Field - Mojave Theme
3530
3536
  *
3531
3537
  * No component tokens. The input is Input (Input.css) and the label, description and
@@ -3616,7 +3622,7 @@ textarea.FieldControl {
3616
3622
  user-select: none;
3617
3623
  }
3618
3624
 
3619
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
3625
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
3620
3626
  /* OTP Field - Mojave Theme
3621
3627
  *
3622
3628
  * One-time code entry: a row of single-character inputs. Each slot is the same control as Input
@@ -3679,7 +3685,7 @@ textarea.FieldControl {
3679
3685
  letter-spacing: var(--sl-font-body-magnify-letter-spacing);
3680
3686
  }
3681
3687
 
3682
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
3688
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
3683
3689
  /* Popover - Mojave Theme */
3684
3690
 
3685
3691
  /* ============================================
@@ -3844,7 +3850,7 @@ textarea.FieldControl {
3844
3850
  fill: var(--sl-popup-arrow-stroke);
3845
3851
  }
3846
3852
 
3847
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
3853
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
3848
3854
  /* Preview Card - Mojave Theme
3849
3855
  *
3850
3856
  * The popup concept (surface, arrow, motion) with a title-magnify title and condense
@@ -3961,7 +3967,7 @@ textarea.FieldControl {
3961
3967
  fill: var(--sl-popup-arrow-stroke);
3962
3968
  }
3963
3969
 
3964
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
3970
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
3965
3971
  /* Progress - Mojave Theme
3966
3972
  *
3967
3973
  * A gauge (tokens/semantic/gauge.json), the same bar as Meter. The fill is the solid color of
@@ -4038,7 +4044,7 @@ textarea.FieldControl {
4038
4044
  height: var(--sl-gauge-height-lg);
4039
4045
  }
4040
4046
 
4041
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
4047
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
4042
4048
  /* Radio - Mojave Theme
4043
4049
  * Same box as Checkbox, always round. Sizes follow the label the same way, and the
4044
4050
  * dot is a share of the circle (check.dot-scale).
@@ -4190,7 +4196,7 @@ textarea.FieldControl {
4190
4196
  gap: var(--sl-gap-stack-sm);
4191
4197
  }
4192
4198
 
4193
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
4199
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
4194
4200
  /* Scroll Area - Mojave Theme
4195
4201
  *
4196
4202
  * The scrollbar is the content scrollbar (content.scrollbar-*): a track that stays clear until
@@ -4272,7 +4278,7 @@ textarea.FieldControl {
4272
4278
  background: transparent;
4273
4279
  }
4274
4280
 
4275
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
4281
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
4276
4282
  /* Select - Mojave Theme
4277
4283
  *
4278
4284
  * The trigger is a field (the field pattern, control sizes, the base text style); the
@@ -4557,7 +4563,7 @@ textarea.FieldControl {
4557
4563
  stroke-width: var(--sl-stroke-default);
4558
4564
  }
4559
4565
 
4560
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
4566
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
4561
4567
  /* Separator - Mojave Theme
4562
4568
  *
4563
4569
  * A hairline in the everyday divider color (border.default), one stroke thick, with a step of
@@ -4585,7 +4591,7 @@ textarea.FieldControl {
4585
4591
  margin-inline: var(--sl-space-4);
4586
4592
  }
4587
4593
 
4588
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
4594
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
4589
4595
  /* Slider - Mojave Theme
4590
4596
  *
4591
4597
  * A slider is a gauge you can drag: the track, fill and label row are gauge.* (the same bar as
@@ -4751,7 +4757,7 @@ textarea.FieldControl {
4751
4757
  transform: translate(-50%, 50%);
4752
4758
  }
4753
4759
 
4754
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
4760
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
4755
4761
  /* Switch - Mojave Theme
4756
4762
  * Switch keeps its track sizes. The thumb, its travel and the ON/OFF text are
4757
4763
  * worked out from them: the thumb fills the track's height inside the padding,
@@ -4917,7 +4923,7 @@ textarea.FieldControl {
4917
4923
  color: var(--sl-text-disabled);
4918
4924
  }
4919
4925
 
4920
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
4926
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
4921
4927
  /* Tabs - Mojave Theme
4922
4928
  *
4923
4929
  * No component tokens. The divider, the selected line and color, hover and the disabled
@@ -5053,7 +5059,7 @@ textarea.FieldControl {
5053
5059
  padding: var(--sl-space-6);
5054
5060
  }
5055
5061
 
5056
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
5062
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
5057
5063
  /* Toast - Mojave Theme
5058
5064
  *
5059
5065
  * A toast is a notice (tokens/semantic/notice.json) on the popup surface. A toast whose type
@@ -5289,7 +5295,7 @@ textarea.FieldControl {
5289
5295
  flex-shrink: 0;
5290
5296
  }
5291
5297
 
5292
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
5298
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
5293
5299
  /* Toggle - Mojave Theme
5294
5300
  * A toggle is a button that stays pressed: the same heights, padding, gap and
5295
5301
  * trigger text style as a button of the same size. Pressed, it takes its emphasis level's
@@ -5401,7 +5407,7 @@ textarea.FieldControl {
5401
5407
  height: var(--sl-icon-size-maximize);
5402
5408
  }
5403
5409
 
5404
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
5410
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
5405
5411
  /* Toggle Group - Mojave Theme
5406
5412
  *
5407
5413
  * No component tokens. The strip is the bar concept (tokens/semantic/bar.json); the
@@ -5422,7 +5428,7 @@ textarea.FieldControl {
5422
5428
  border-radius: var(--sl-radius-item);
5423
5429
  }
5424
5430
 
5425
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
5431
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
5426
5432
  /* Toolbar - Mojave Theme
5427
5433
  *
5428
5434
  * The strip is the bar concept (tokens/semantic/bar.json). Buttons, toggles, selects
@@ -5484,7 +5490,7 @@ textarea.FieldControl {
5484
5490
  max-width: var(--sl-toolbar-input-max-width);
5485
5491
  }
5486
5492
 
5487
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
5493
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
5488
5494
  /* Tooltip - Mojave Theme
5489
5495
  *
5490
5496
  * The inverse surface (surface.inverse, text.on-inverse-surface) with condense text, so a tooltip
@@ -5545,7 +5551,7 @@ textarea.FieldControl {
5545
5551
  }
5546
5552
 
5547
5553
  /* Custom components: not Base UI parts. Built from existing concepts and tokens. */
5548
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
5554
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
5549
5555
  /* Badge
5550
5556
  *
5551
5557
  * A status or count label. Not a Base UI part, and not interactive: no hover or focus.
@@ -5650,7 +5656,7 @@ textarea.FieldControl {
5650
5656
  height: var(--sl-badge-dot-base);
5651
5657
  }
5652
5658
 
5653
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
5659
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
5654
5660
  /*
5655
5661
  * DatePicker: a field that opens a calendar for one date or a period.
5656
5662
  * Not a Base UI part. The popup is Popover on a wide viewport and Drawer
@@ -6223,7 +6229,7 @@ textarea.FieldControl {
6223
6229
  flex-basis: 100%;
6224
6230
  }
6225
6231
 
6226
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
6232
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
6227
6233
  /* Money field
6228
6234
  *
6229
6235
  * An amount of money, built on Number field. The value is an integer in minor units
@@ -6568,7 +6574,7 @@ textarea.FieldControl {
6568
6574
  letter-spacing: var(--sl-font-body-base-letter-spacing);
6569
6575
  }
6570
6576
 
6571
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
6577
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
6572
6578
  /* ListDetail
6573
6579
  *
6574
6580
  * The detail of one item, next to its list. Not a Base UI part. It is a Splitter
@@ -6695,7 +6701,7 @@ textarea.FieldControl {
6695
6701
  background: transparent;
6696
6702
  }
6697
6703
 
6698
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
6704
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
6699
6705
  /* Splitter
6700
6706
  *
6701
6707
  * Two or more panels and a handle between them. Not a Base UI part. It follows the
@@ -6903,7 +6909,7 @@ textarea.FieldControl {
6903
6909
  background: var(--sl-border-default);
6904
6910
  }
6905
6911
 
6906
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
6912
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
6907
6913
  /* EmptyState
6908
6914
  *
6909
6915
  * The block a page, pane, table, list or popup shows when it has nothing to show.
@@ -7159,7 +7165,7 @@ textarea.FieldControl {
7159
7165
  color: inherit;
7160
7166
  }
7161
7167
 
7162
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
7168
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
7163
7169
  /* Table - Mojave Theme
7164
7170
  *
7165
7171
  * Base UI has no table, so this styles the native <table class="Table"> elements with the
@@ -7172,6 +7178,13 @@ textarea.FieldControl {
7172
7178
  * `<tr><td data-empty colSpan={n}><EmptyState size="compact" … /></td></tr>`. A cell with
7173
7179
  * only text still uses this rule's padding. A cell whose child is an EmptyState lets the
7174
7180
  * empty state pad itself. The empty row does not take the row hover.
7181
+ *
7182
+ * Totals: tr data-total="subtotal" draws a single rule above the row, and data-total="grand"
7183
+ * a rule above and a double rule under, as on a working paper (table.total-*). They work in
7184
+ * tbody or tfoot. A tfoot row without data-total keeps the header tray band.
7185
+ *
7186
+ * The working-paper rule (rule.width, 0 by default) replaces the table's top border with a
7187
+ * heavier line in rule.color, drawn on the first row's cells so it stays with a sticky header.
7175
7188
  */
7176
7189
 
7177
7190
  .Table {
@@ -7190,6 +7203,15 @@ textarea.FieldControl {
7190
7203
  border-radius: var(--sl-table-radius);
7191
7204
  overflow: hidden;
7192
7205
  font-variant-numeric: tabular-nums;
7206
+ /* The top border steps aside while the working-paper rule is on (any rule.width above 0). */
7207
+ border-top-width: max(0px, var(--sl-stroke-default) - var(--sl-rule-width) * 1000);
7208
+ }
7209
+
7210
+ /* The working-paper rule, on the first row: the header, or the body when there is none.
7211
+ At rule.width 0 this is no border at all. */
7212
+ .Table > thead > tr:first-child > *,
7213
+ .Table:not(:has(> thead)) > tbody:first-of-type > tr:first-child > * {
7214
+ border-top: var(--sl-rule-width) solid var(--sl-rule-color);
7193
7215
  }
7194
7216
 
7195
7217
  .Table caption {
@@ -7301,6 +7323,52 @@ textarea.FieldControl {
7301
7323
  border-bottom: none;
7302
7324
  }
7303
7325
 
7326
+ /* Subtotal and grand total rows: rules instead of a band, in the subtitle weight.
7327
+ Hover and selection don't apply: a total is not a record. */
7328
+ .Table tr[data-total] > * {
7329
+ font-family: var(--sl-font-subtitle-condense-font-family);
7330
+ font-size: var(--sl-font-subtitle-condense-font-size);
7331
+ font-weight: var(--sl-font-subtitle-condense-font-weight);
7332
+ line-height: var(--sl-font-subtitle-condense-line-height);
7333
+ letter-spacing: var(--sl-font-subtitle-condense-letter-spacing);
7334
+ background: var(--sl-table-total-background);
7335
+ color: var(--sl-table-color);
7336
+ border-top: var(--sl-table-subtotal-rule-width) solid var(--sl-table-total-rule-color);
7337
+ }
7338
+
7339
+ .Table tbody tr[data-total] > * {
7340
+ border-bottom: var(--sl-stroke-default) solid var(--sl-table-row-border-color);
7341
+ }
7342
+
7343
+ .Table tbody tr[data-total]:last-child:not([data-total='grand']) > * {
7344
+ border-bottom: none;
7345
+ }
7346
+
7347
+ /* The grand total: a double rule under the figures. */
7348
+ .Table :is(tbody, tfoot) tr[data-total='grand'] > * {
7349
+ border-bottom: var(--sl-table-grand-total-rule-width) double var(--sl-table-total-rule-color);
7350
+ }
7351
+
7352
+ /* A label or blank cell in a total row can leave the rules off, so they only run under the
7353
+ figures: data-rule="none" on the cell. */
7354
+ .Table :is(tbody, tfoot) tr[data-total] > [data-rule='none'] {
7355
+ border-top-color: transparent;
7356
+ border-bottom-color: transparent;
7357
+ }
7358
+
7359
+ /* In the footer the body's last row has no line under it, so those cells keep the footer's
7360
+ usual line on top. */
7361
+ .Table tfoot tr[data-total] > [data-rule='none'] {
7362
+ border-top: var(--sl-stroke-default) solid var(--sl-table-border-color);
7363
+ }
7364
+
7365
+ @media (hover: hover) {
7366
+ .Table tbody tr[data-total]:hover > * {
7367
+ background: var(--sl-table-total-background);
7368
+ color: var(--sl-table-color);
7369
+ }
7370
+ }
7371
+
7304
7372
  /* A header that stays put while the body scrolls (the table's wrapper scrolls) */
7305
7373
  .Table[data-sticky-header] thead th {
7306
7374
  position: sticky;
@@ -7331,23 +7399,28 @@ textarea.FieldControl {
7331
7399
  color: inherit;
7332
7400
  }
7333
7401
 
7334
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
7402
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
7335
7403
  /* Collection
7336
7404
  *
7337
7405
  * DataTable, DataList, the toolbar and the pagination, in one place so the two views
7338
7406
  * share the table concept. Sections: toolbar, table additions, groups, list, pagination, sizes.
7339
7407
  * Each section is its own file so the design system can name the part. This file brings them in.
7340
7408
  *
7341
- * The selection bar replaces the trailing controls (filters, sort, clear, actions) and leaves
7409
+ * The selection bar replaces the trailing controls (filters, sort, actions) and leaves
7342
7410
  * the tabs and the search where they are, so selecting rows does not grow the toolbar.
7343
7411
  */
7344
7412
 
7345
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
7413
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
7346
7414
  /* Collection toolbar
7347
7415
  *
7348
7416
  * The wrap follows the toolbar's own width, not the window: a table in a narrow pane wraps
7349
- * even when the page is wide. Search takes the full width first. Filters wrap under it.
7417
+ * even when the page is wide. Search grows to fill the row beside the trailing controls, and
7418
+ * wraps to its own line before it shrinks under collection.search-min-width. Under the narrow
7419
+ * width it takes the full row and filters wrap under it.
7350
7420
  * A container query cannot read the width token, so the component also sets data-narrow.
7421
+ *
7422
+ * The search icon and the clear button sit inside the field. The browser's own search cancel
7423
+ * is hidden by the reset, so the clear button is the only one, in every browser.
7351
7424
  */
7352
7425
 
7353
7426
  .CollectionToolbar {
@@ -7359,7 +7432,6 @@ textarea.FieldControl {
7359
7432
  }
7360
7433
 
7361
7434
  .CollectionToolbarMain,
7362
- .CollectionToolbarTrailing,
7363
7435
  .CollectionSelectionBar,
7364
7436
  .CollectionSort {
7365
7437
  display: flex;
@@ -7372,11 +7444,90 @@ textarea.FieldControl {
7372
7444
  display: flex;
7373
7445
  align-items: center;
7374
7446
  gap: var(--sl-collection-toolbar-gap);
7447
+ flex: 1 1 0;
7448
+ min-width: min(100%, var(--sl-collection-search-min-width));
7449
+ }
7450
+
7451
+ .CollectionSearchField {
7452
+ position: relative;
7453
+ flex: 1 1 auto;
7375
7454
  min-width: 0;
7376
7455
  }
7377
7456
 
7378
- .CollectionSearch .Input {
7457
+ /* Scoped to the field so it wins over Input.css, which loads later. */
7458
+ .CollectionSearchField .Input {
7379
7459
  min-width: 0;
7460
+ padding-inline-start: calc(var(--sl-control-padding-inline) + var(--sl-icon-size-magnify) + var(--sl-space-2));
7461
+ }
7462
+
7463
+ .CollectionSearchField[data-filled] .Input {
7464
+ padding-inline-end: calc(var(--sl-control-padding-inline) + var(--sl-icon-button-size));
7465
+ }
7466
+
7467
+ .CollectionSearchIcon {
7468
+ position: absolute;
7469
+ inset-inline-start: var(--sl-control-padding-inline);
7470
+ inset-block-start: 50%;
7471
+ transform: translateY(-50%);
7472
+ width: var(--sl-icon-size-magnify);
7473
+ height: var(--sl-icon-size-magnify);
7474
+ font-size: var(--sl-icon-size-magnify);
7475
+ line-height: 1;
7476
+ color: var(--sl-field-affix-color);
7477
+ pointer-events: none;
7478
+ }
7479
+
7480
+ .CollectionSearchClear {
7481
+ display: flex;
7482
+ align-items: center;
7483
+ justify-content: center;
7484
+ flex-shrink: 0;
7485
+ width: var(--sl-icon-button-size);
7486
+ height: var(--sl-icon-button-size);
7487
+ padding: 0;
7488
+ border: none;
7489
+ border-radius: var(--sl-icon-button-radius);
7490
+ background: transparent;
7491
+ color: var(--sl-icon-button-color);
7492
+ cursor: pointer;
7493
+ outline: none;
7494
+ transition: var(--sl-icon-button-transition);
7495
+ position: absolute;
7496
+ inset-inline-end: var(--sl-space-3);
7497
+ inset-block-start: 50%;
7498
+ transform: translateY(-50%);
7499
+ font-size: var(--sl-icon-size-magnify);
7500
+ line-height: 1;
7501
+ }
7502
+
7503
+ .CollectionSearchClear:hover {
7504
+ background: var(--sl-icon-button-background-hover);
7505
+ color: var(--sl-icon-button-color-hover);
7506
+ }
7507
+
7508
+ .CollectionSearchClear:focus-visible {
7509
+ outline: var(--sl-focus-outline);
7510
+ outline-offset: var(--sl-focus-outline-offset);
7511
+ box-shadow: 0 0 0 var(--sl-focus-halo-spread) var(--sl-focus-halo-color);
7512
+ }
7513
+
7514
+ /* The trailing controls join the main row one by one, so each keeps its own width and
7515
+ wraps under the search on its own rather than squeezing. Search takes what is left. */
7516
+ .CollectionToolbarTrailing {
7517
+ display: contents;
7518
+ }
7519
+
7520
+ .CollectionSelectionBar {
7521
+ flex: 0 0 auto;
7522
+ max-width: 100%;
7523
+ }
7524
+
7525
+ /* Select.css and Combobox.css fill their container. In the row they size to their text. */
7526
+ .CollectionToolbarMain .SelectTrigger,
7527
+ .CollectionToolbarMain .ComboboxInputWrapper {
7528
+ flex: none;
7529
+ width: auto;
7530
+ max-width: 100%;
7380
7531
  }
7381
7532
 
7382
7533
  .CollectionToolbarActions {
@@ -7400,7 +7551,7 @@ textarea.FieldControl {
7400
7551
  letter-spacing: var(--sl-font-body-condense-letter-spacing);
7401
7552
  }
7402
7553
 
7403
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
7554
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
7404
7555
  /* DataTable additions on top of .Table.
7405
7556
  *
7406
7557
  * Sort buttons fill the header cell and inherit its hover, so old aria-sort markup keeps
@@ -7521,12 +7672,15 @@ textarea.FieldControl {
7521
7672
  color: var(--sl-table-subtle-color);
7522
7673
  }
7523
7674
 
7524
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
7675
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
7525
7676
  /* DataList
7526
7677
  *
7527
7678
  * The same rows as the table, in one container with the table's borders, hover, selected
7528
7679
  * and current states. Not a stack of floating cards: the two views should read as one family.
7529
7680
  * variant=cards adds the surface radius and a gap when a queue should read as separate items.
7681
+ *
7682
+ * The working-paper rule (rule.width, 0 by default) replaces the top border with a heavier
7683
+ * line in rule.color: on the first row, or on each card's top edge.
7530
7684
  */
7531
7685
 
7532
7686
  .DataList {
@@ -7545,6 +7699,13 @@ textarea.FieldControl {
7545
7699
  background: var(--sl-table-background);
7546
7700
  border: var(--sl-stroke-default) solid var(--sl-table-border-color);
7547
7701
  border-radius: var(--sl-table-radius);
7702
+ /* The top border steps aside while the working-paper rule is on (any rule.width above 0). */
7703
+ border-top-width: max(0px, var(--sl-stroke-default) - var(--sl-rule-width) * 1000);
7704
+ }
7705
+
7706
+ /* The working-paper rule on the first row. At rule.width 0 this is no border at all. */
7707
+ .DataList ul > li:first-child {
7708
+ border-top: var(--sl-rule-width) solid var(--sl-rule-color);
7548
7709
  }
7549
7710
 
7550
7711
  .DataList li {
@@ -7638,6 +7799,14 @@ textarea.FieldControl {
7638
7799
  background: var(--sl-table-background);
7639
7800
  border: var(--sl-stroke-default) solid var(--sl-table-border-color);
7640
7801
  border-radius: var(--sl-table-radius);
7802
+ border-top-width: max(0px, var(--sl-stroke-default) - var(--sl-rule-width) * 1000);
7803
+ box-shadow: inset 0 var(--sl-rule-width) 0 0 var(--sl-rule-color);
7804
+ }
7805
+
7806
+ .DataList[data-variant='cards'] li[aria-current='true'] {
7807
+ box-shadow:
7808
+ inset var(--sl-stroke-strong) 0 0 0 var(--sl-border-accent),
7809
+ inset 0 var(--sl-rule-width) 0 0 var(--sl-rule-color);
7641
7810
  }
7642
7811
 
7643
7812
  .DataList[data-loading] ul {
@@ -7645,7 +7814,7 @@ textarea.FieldControl {
7645
7814
  transition: opacity var(--sl-duration-fast) var(--sl-easing-default);
7646
7815
  }
7647
7816
 
7648
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
7817
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
7649
7818
  /* Pagination
7650
7819
  *
7651
7820
  * Not tied to a collection. Anything with a page, a page count and a total can use it.
@@ -7670,7 +7839,7 @@ textarea.FieldControl {
7670
7839
  margin: 0;
7671
7840
  }
7672
7841
 
7673
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
7842
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
7674
7843
  /* EditableList
7675
7844
  *
7676
7845
  * One table at every width, so a field is not submitted twice. Under the stack width each
@@ -7768,3 +7937,231 @@ textarea.FieldControl {
7768
7937
  letter-spacing: var(--sl-font-subtitle-condense-letter-spacing);
7769
7938
  }
7770
7939
  }
7940
+
7941
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
7942
+ /* Sheet
7943
+ *
7944
+ * A working-paper surface: the raised surface with a heavier rule across its top
7945
+ * (sheet.rule-width in sheet.rule-color) instead of its top border, and an optional tab
7946
+ * label that sits on the rule like the tab of a ledger page. The tab is caps-condense on
7947
+ * the inverse surface. An action (an Edit link, a count) sits at the end of the header row.
7948
+ * Tokens: sheet.* (tokens/component/sheet.json).
7949
+ *
7950
+ * Content runs edge to edge, so a Table, DataList or leader DescriptionList inside lines up
7951
+ * with the sheet's sides; data-inset on SheetBody pads it by sheet.padding instead. A Table
7952
+ * inside drops its own outer border and corners, since the sheet is its frame.
7953
+ */
7954
+
7955
+ .Sheet {
7956
+ box-sizing: border-box;
7957
+ display: flex;
7958
+ flex-direction: column;
7959
+ min-width: 0;
7960
+ }
7961
+
7962
+ .SheetHeader {
7963
+ display: flex;
7964
+ align-items: flex-end;
7965
+ gap: var(--sl-sheet-header-gap);
7966
+ min-height: var(--sl-sheet-tab-height);
7967
+ }
7968
+
7969
+ .SheetTab {
7970
+ font-family: var(--sl-font-caps-condense-font-family);
7971
+ font-size: var(--sl-font-caps-condense-font-size);
7972
+ font-weight: var(--sl-font-caps-condense-font-weight);
7973
+ line-height: var(--sl-font-caps-condense-line-height);
7974
+ letter-spacing: var(--sl-font-caps-condense-letter-spacing);
7975
+ text-transform: var(--sl-font-caps-condense-text-transform);
7976
+ display: inline-flex;
7977
+ align-items: center;
7978
+ height: var(--sl-sheet-tab-height);
7979
+ padding-inline: var(--sl-sheet-tab-padding-inline);
7980
+ background: var(--sl-sheet-tab-background);
7981
+ color: var(--sl-sheet-tab-color);
7982
+ border-radius: var(--sl-sheet-tab-radius) var(--sl-sheet-tab-radius) 0 0;
7983
+ white-space: nowrap;
7984
+ }
7985
+
7986
+ .SheetAction {
7987
+ font-family: var(--sl-font-subtitle-condense-font-family);
7988
+ font-size: var(--sl-font-subtitle-condense-font-size);
7989
+ font-weight: var(--sl-font-subtitle-condense-font-weight);
7990
+ line-height: var(--sl-font-subtitle-condense-line-height);
7991
+ letter-spacing: var(--sl-font-subtitle-condense-letter-spacing);
7992
+ margin-inline-start: auto;
7993
+ padding-block-end: var(--sl-space-1);
7994
+ }
7995
+
7996
+ .SheetBody {
7997
+ box-sizing: border-box;
7998
+ flex: 1;
7999
+ min-width: 0;
8000
+ background: var(--sl-sheet-background);
8001
+ border: var(--sl-sheet-border-width) solid var(--sl-sheet-border-color);
8002
+ border-top: var(--sl-sheet-rule-width) solid var(--sl-sheet-rule-color);
8003
+ border-radius: var(--sl-sheet-radius);
8004
+ /* Rows inside keep to the rounded corners. clip, not hidden, so a sticky header still sticks. */
8005
+ overflow: clip;
8006
+ }
8007
+
8008
+ /* Under a tab the top corners stay square, so the tab sits flush on the rule. */
8009
+ .Sheet[data-tab] > .SheetBody {
8010
+ border-start-start-radius: 0;
8011
+ border-start-end-radius: 0;
8012
+ }
8013
+
8014
+ .SheetBody[data-inset] {
8015
+ padding: var(--sl-sheet-padding);
8016
+ }
8017
+
8018
+ /* The sheet is the frame: a table or list inside drops its own outer edge. */
8019
+ .SheetBody > .Table,
8020
+ .SheetBody > .CollectionView .Table,
8021
+ .SheetBody > .DataList ul {
8022
+ border: 0;
8023
+ border-radius: 0;
8024
+ }
8025
+
8026
+ .SheetBody > .Table > thead > tr:first-child > *,
8027
+ .SheetBody > .Table:not(:has(> thead)) > tbody:first-of-type > tr:first-child > *,
8028
+ .SheetBody > .DataList ul > li:first-child {
8029
+ border-top: 0;
8030
+ }
8031
+
8032
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
8033
+ /* StatFigure
8034
+ *
8035
+ * One large figure with a caps label above and a caption under it. The label is
8036
+ * caps-condense, the figure uses the figures text family (mono, tabular numbers) at
8037
+ * stat-figure.figure-font-size, the caption is body-condense. data-underline="double"
8038
+ * draws a double rule under the figure only, the accountant's mark for a final total;
8039
+ * data-tone="accent" colors the figure; data-size="sm" makes it smaller for a row of figures.
8040
+ * Tokens: stat-figure.* (tokens/component/stat-figure.json).
8041
+ */
8042
+
8043
+ .StatFigure {
8044
+ display: inline-flex;
8045
+ flex-direction: column;
8046
+ align-items: flex-start;
8047
+ gap: var(--sl-stat-figure-gap);
8048
+ min-width: 0;
8049
+ }
8050
+
8051
+ .StatFigureLabel {
8052
+ font-family: var(--sl-font-caps-condense-font-family);
8053
+ font-size: var(--sl-font-caps-condense-font-size);
8054
+ font-weight: var(--sl-font-caps-condense-font-weight);
8055
+ line-height: var(--sl-font-caps-condense-line-height);
8056
+ letter-spacing: var(--sl-font-caps-condense-letter-spacing);
8057
+ text-transform: var(--sl-font-caps-condense-text-transform);
8058
+ color: var(--sl-stat-figure-label-color);
8059
+ }
8060
+
8061
+ .StatFigureValue {
8062
+ font-family: var(--sl-font-figures-base-font-family);
8063
+ font-variant-numeric: var(--sl-font-figures-base-font-variant-numeric);
8064
+ font-size: var(--sl-stat-figure-figure-font-size);
8065
+ font-weight: var(--sl-stat-figure-figure-font-weight);
8066
+ line-height: var(--sl-stat-figure-figure-line-height);
8067
+ color: var(--sl-stat-figure-figure-color);
8068
+ white-space: nowrap;
8069
+ }
8070
+
8071
+ .StatFigure[data-size='sm'] .StatFigureValue {
8072
+ font-size: var(--sl-stat-figure-figure-font-size-sm);
8073
+ line-height: var(--sl-stat-figure-figure-line-height-sm);
8074
+ }
8075
+
8076
+ .StatFigure[data-tone='accent'] .StatFigureValue {
8077
+ color: var(--sl-stat-figure-figure-color-accent);
8078
+ }
8079
+
8080
+ .StatFigure[data-underline='double'] .StatFigureValue {
8081
+ border-bottom: var(--sl-stat-figure-underline-width) double var(--sl-stat-figure-underline-color);
8082
+ }
8083
+
8084
+ .StatFigureCaption {
8085
+ font-family: var(--sl-font-body-condense-font-family);
8086
+ font-size: var(--sl-font-body-condense-font-size);
8087
+ font-weight: var(--sl-font-body-condense-font-weight);
8088
+ line-height: var(--sl-font-body-condense-line-height);
8089
+ letter-spacing: var(--sl-font-body-condense-letter-spacing);
8090
+ color: var(--sl-stat-figure-caption-color);
8091
+ }
8092
+
8093
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
8094
+ /* DescriptionList
8095
+ *
8096
+ * Label and value pairs in a native dl, one DescriptionItem (a div holding a dt and a dd)
8097
+ * per pair, with a hairline between pairs. The default variant sets labels in a column
8098
+ * beside their values. data-variant="leader" runs a dotted leader from each label to its
8099
+ * value, which sits at the end of the row, as on a working paper. Labels are body text
8100
+ * in the secondary color, values primary text with tabular numbers.
8101
+ * Tokens: description-list.* (tokens/component/description-list.json).
8102
+ */
8103
+
8104
+ .DescriptionList {
8105
+ font-family: var(--sl-font-body-base-font-family);
8106
+ font-size: var(--sl-font-body-base-font-size);
8107
+ font-weight: var(--sl-font-body-base-font-weight);
8108
+ line-height: var(--sl-font-body-base-line-height);
8109
+ letter-spacing: var(--sl-font-body-base-letter-spacing);
8110
+ margin: 0;
8111
+ padding: 0;
8112
+ font-variant-numeric: tabular-nums;
8113
+ }
8114
+
8115
+ .DescriptionItem {
8116
+ display: grid;
8117
+ grid-template-columns: var(--sl-description-list-label-width) 2fr;
8118
+ align-items: baseline;
8119
+ column-gap: var(--sl-description-list-column-gap);
8120
+ padding-block: var(--sl-description-list-row-padding-block);
8121
+ padding-inline: var(--sl-description-list-row-padding-inline);
8122
+ border-bottom: var(--sl-stroke-default) solid var(--sl-description-list-row-border-color);
8123
+ }
8124
+
8125
+ .DescriptionItem:last-child {
8126
+ border-bottom: none;
8127
+ }
8128
+
8129
+ .DescriptionTerm {
8130
+ margin: 0;
8131
+ color: var(--sl-description-list-label-color);
8132
+ }
8133
+
8134
+ .DescriptionDetails {
8135
+ margin: 0;
8136
+ min-width: 0;
8137
+ color: var(--sl-description-list-value-color);
8138
+ overflow-wrap: anywhere;
8139
+ }
8140
+
8141
+ /* Leader: the label grows to fill the row, and its ::after is the dotted line that leads
8142
+ to the value. The line sits on the text's baseline. */
8143
+ .DescriptionList[data-variant='leader'] .DescriptionItem {
8144
+ display: flex;
8145
+ column-gap: var(--sl-description-list-leader-gap);
8146
+ }
8147
+
8148
+ .DescriptionList[data-variant='leader'] .DescriptionTerm {
8149
+ display: flex;
8150
+ flex: 1 1 auto;
8151
+ align-items: baseline;
8152
+ gap: var(--sl-description-list-leader-gap);
8153
+ min-width: 0;
8154
+ }
8155
+
8156
+ .DescriptionList[data-variant='leader'] .DescriptionTerm::after {
8157
+ content: '';
8158
+ flex: 1 1 var(--sl-space-6);
8159
+ min-width: var(--sl-space-6);
8160
+ border-bottom: var(--sl-description-list-leader-width) dotted var(--sl-description-list-leader-color);
8161
+ }
8162
+
8163
+ .DescriptionList[data-variant='leader'] .DescriptionDetails {
8164
+ flex: 0 1 auto;
8165
+ max-width: 60%;
8166
+ text-align: end;
8167
+ }