@scattered-light/loomiere-base-ui 0.7.1 → 0.9.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 (99) hide show
  1. package/README.md +53 -2
  2. package/dist/{chunk-JUUPOOQQ.js → chunk-LQWPDLLQ.js} +66 -3
  3. package/dist/chunk-LQWPDLLQ.js.map +1 -0
  4. package/dist/custom/collection/index.d.ts +6 -1
  5. package/dist/custom/collection/index.js +18 -12
  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/AppBar/README.md +58 -0
  10. package/dist/design-system/components/AppBar/preview.html +19 -0
  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 +1 -1
  15. package/dist/design-system/components/DataTable/README.md +1 -1
  16. package/dist/design-system/components/DataTable/preview.html +38 -38
  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/PickerButton/README.md +56 -0
  21. package/dist/design-system/components/PickerButton/preview.html +19 -0
  22. package/dist/design-system/components/ScrollArea/preview.html +2 -2
  23. package/dist/design-system/components/Sheet/README.md +46 -0
  24. package/dist/design-system/components/Sheet/preview.html +19 -0
  25. package/dist/design-system/components/StatFigure/README.md +38 -0
  26. package/dist/design-system/components/StatFigure/preview.html +19 -0
  27. package/dist/design-system/components/Table/README.md +2 -2
  28. package/dist/design-system/components/Table/preview.html +2 -2
  29. package/dist/design-system/components/ToggleGroup/README.md +2 -2
  30. package/dist/design-system/components/ToggleGroup/preview.html +1 -1
  31. package/dist/design-system/components/bundle.js +7 -7
  32. package/dist/design-system/components/index.d.ts +1 -1
  33. package/dist/design-system/components/styles.css +531 -56
  34. package/dist/{index-ChJXlxzq.d.ts → index-DdHpYalU.d.ts} +84 -1
  35. package/dist/index.d.ts +1 -1
  36. package/dist/index.js +1 -1
  37. package/dist/styles/components/Accordion.css +1 -1
  38. package/dist/styles/components/AlertDialog.css +1 -1
  39. package/dist/styles/components/Autocomplete.css +1 -1
  40. package/dist/styles/components/Avatar.css +1 -1
  41. package/dist/styles/components/Button.css +1 -1
  42. package/dist/styles/components/Checkbox.css +1 -1
  43. package/dist/styles/components/CheckboxGroup.css +1 -1
  44. package/dist/styles/components/Collapsible.css +1 -1
  45. package/dist/styles/components/Combobox.css +1 -1
  46. package/dist/styles/components/ContextMenu.css +1 -1
  47. package/dist/styles/components/Dialog.css +1 -1
  48. package/dist/styles/components/Drawer.css +8 -2
  49. package/dist/styles/components/Field.css +1 -1
  50. package/dist/styles/components/Fieldset.css +1 -1
  51. package/dist/styles/components/Form.css +1 -1
  52. package/dist/styles/components/Input.css +1 -1
  53. package/dist/styles/components/Menu.css +1 -1
  54. package/dist/styles/components/Menubar.css +1 -1
  55. package/dist/styles/components/Meter.css +1 -1
  56. package/dist/styles/components/NavigationMenu.css +1 -1
  57. package/dist/styles/components/NumberField.css +1 -1
  58. package/dist/styles/components/OTPField.css +1 -1
  59. package/dist/styles/components/Popover.css +1 -1
  60. package/dist/styles/components/PreviewCard.css +1 -1
  61. package/dist/styles/components/Progress.css +1 -1
  62. package/dist/styles/components/Radio.css +1 -1
  63. package/dist/styles/components/ScrollArea.css +1 -1
  64. package/dist/styles/components/Select.css +1 -1
  65. package/dist/styles/components/Separator.css +1 -1
  66. package/dist/styles/components/Slider.css +1 -1
  67. package/dist/styles/components/Switch.css +1 -1
  68. package/dist/styles/components/Tabs.css +1 -1
  69. package/dist/styles/components/Toast.css +1 -1
  70. package/dist/styles/components/Toggle.css +1 -1
  71. package/dist/styles/components/ToggleGroup.css +42 -1
  72. package/dist/styles/components/Toolbar.css +1 -1
  73. package/dist/styles/components/Tooltip.css +1 -1
  74. package/dist/styles/custom/AppBar.css +33 -0
  75. package/dist/styles/custom/Badge.css +1 -1
  76. package/dist/styles/custom/Collection.css +1 -1
  77. package/dist/styles/custom/CollectionPagination.css +1 -1
  78. package/dist/styles/custom/CollectionToolbar.css +1 -1
  79. package/dist/styles/custom/DataList.css +19 -1
  80. package/dist/styles/custom/DataTable.css +1 -1
  81. package/dist/styles/custom/DatePicker.css +1 -1
  82. package/dist/styles/custom/DescriptionList.css +75 -0
  83. package/dist/styles/custom/EditableList.css +1 -1
  84. package/dist/styles/custom/EmptyState.css +1 -1
  85. package/dist/styles/custom/ListDetail.css +1 -1
  86. package/dist/styles/custom/MoneyField.css +1 -1
  87. package/dist/styles/custom/PickerButton.css +85 -0
  88. package/dist/styles/custom/Sheet.css +90 -0
  89. package/dist/styles/custom/Splitter.css +1 -1
  90. package/dist/styles/custom/StatFigure.css +60 -0
  91. package/dist/styles/custom/Table.css +63 -1
  92. package/dist/styles/index.css +6 -1
  93. package/dist/styles/reset/accessibility.css +1 -1
  94. package/dist/styles/reset/reset-accessibility.css +1 -1
  95. package/dist/styles/reset/reset-tailwind.css +2 -2
  96. package/dist/styles/reset/reset.css +2 -2
  97. package/dist/styles/tailwind.css +6 -1
  98. package/package.json +2 -2
  99. 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.1 · styles for @base-ui/react 1.9.0 */
2
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
12
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
456
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
569
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
637
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
758
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
767
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
969
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
1077
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
1227
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
1384
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
1400
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
1516
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
2001
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
2170
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
2316
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
2449
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
2510
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
2552
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
2572
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
2709
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
2858
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
3051
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
3114
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
3534
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
3625
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
3688
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
3853
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
3970
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
4047
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
4199
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
4281
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
4566
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
4594
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
4760
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
4926
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
5062
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
5298
+ /* @scattered-light/loomiere-base-ui 0.9.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.1 · styles for @base-ui/react 1.9.0 */
5410
+ /* @scattered-light/loomiere-base-ui 0.9.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,48 @@ textarea.FieldControl {
5422
5428
  border-radius: var(--sl-radius-item);
5423
5429
  }
5424
5430
 
5425
- /* @scattered-light/loomiere-base-ui 0.7.1 · styles for @base-ui/react 1.9.0 */
5431
+ /* ============================================
5432
+ SEGMENTED (data-variant="segmented")
5433
+ Joined toggles in one outline, the pressed one filled solid: a switch between a few
5434
+ views or modules. Tokens: toggle-group.segmented-* (tokens/component/toggle-group.json).
5435
+ ============================================ */
5436
+
5437
+ .ToggleGroup[data-variant='segmented'] {
5438
+ padding: 0;
5439
+ gap: 0;
5440
+ background: var(--sl-toggle-group-segmented-background);
5441
+ border: var(--sl-stroke-default) solid var(--sl-toggle-group-segmented-border-color);
5442
+ border-radius: var(--sl-radius-chrome);
5443
+ overflow: hidden;
5444
+ }
5445
+
5446
+ .ToggleGroup[data-variant='segmented'] .Toggle {
5447
+ height: calc(var(--sl-control-height-md) - 2 * var(--sl-stroke-default));
5448
+ border: 0;
5449
+ border-radius: 0;
5450
+ background: transparent;
5451
+ color: var(--sl-text-primary);
5452
+ }
5453
+
5454
+ .ToggleGroup[data-variant='segmented'] .Toggle + .Toggle {
5455
+ border-inline-start: var(--sl-stroke-default) solid var(--sl-toggle-group-segmented-border-color);
5456
+ }
5457
+
5458
+ .ToggleGroup[data-variant='segmented'] .Toggle:hover:not([data-disabled]):not(:disabled) {
5459
+ background: var(--sl-fill-subtle);
5460
+ }
5461
+
5462
+ .ToggleGroup[data-variant='segmented'] .Toggle[data-pressed],
5463
+ .ToggleGroup[data-variant='segmented'] .Toggle[data-pressed]:hover:not([data-disabled]):not(:disabled) {
5464
+ background: var(--sl-toggle-group-segmented-pressed-background);
5465
+ color: var(--sl-toggle-group-segmented-pressed-color);
5466
+ }
5467
+
5468
+ .ToggleGroup[data-variant='segmented'] .Toggle:focus-visible {
5469
+ outline-offset: var(--sl-focus-outline-offset-inset);
5470
+ }
5471
+
5472
+ /* @scattered-light/loomiere-base-ui 0.9.0 · styles for @base-ui/react 1.9.0 */
5426
5473
  /* Toolbar - Mojave Theme
5427
5474
  *
5428
5475
  * The strip is the bar concept (tokens/semantic/bar.json). Buttons, toggles, selects
@@ -5484,7 +5531,7 @@ textarea.FieldControl {
5484
5531
  max-width: var(--sl-toolbar-input-max-width);
5485
5532
  }
5486
5533
 
5487
- /* @scattered-light/loomiere-base-ui 0.7.1 · styles for @base-ui/react 1.9.0 */
5534
+ /* @scattered-light/loomiere-base-ui 0.9.0 · styles for @base-ui/react 1.9.0 */
5488
5535
  /* Tooltip - Mojave Theme
5489
5536
  *
5490
5537
  * The inverse surface (surface.inverse, text.on-inverse-surface) with condense text, so a tooltip
@@ -5545,7 +5592,7 @@ textarea.FieldControl {
5545
5592
  }
5546
5593
 
5547
5594
  /* Custom components: not Base UI parts. Built from existing concepts and tokens. */
5548
- /* @scattered-light/loomiere-base-ui 0.7.1 · styles for @base-ui/react 1.9.0 */
5595
+ /* @scattered-light/loomiere-base-ui 0.9.0 · styles for @base-ui/react 1.9.0 */
5549
5596
  /* Badge
5550
5597
  *
5551
5598
  * A status or count label. Not a Base UI part, and not interactive: no hover or focus.
@@ -5650,7 +5697,7 @@ textarea.FieldControl {
5650
5697
  height: var(--sl-badge-dot-base);
5651
5698
  }
5652
5699
 
5653
- /* @scattered-light/loomiere-base-ui 0.7.1 · styles for @base-ui/react 1.9.0 */
5700
+ /* @scattered-light/loomiere-base-ui 0.9.0 · styles for @base-ui/react 1.9.0 */
5654
5701
  /*
5655
5702
  * DatePicker: a field that opens a calendar for one date or a period.
5656
5703
  * Not a Base UI part. The popup is Popover on a wide viewport and Drawer
@@ -6223,7 +6270,7 @@ textarea.FieldControl {
6223
6270
  flex-basis: 100%;
6224
6271
  }
6225
6272
 
6226
- /* @scattered-light/loomiere-base-ui 0.7.1 · styles for @base-ui/react 1.9.0 */
6273
+ /* @scattered-light/loomiere-base-ui 0.9.0 · styles for @base-ui/react 1.9.0 */
6227
6274
  /* Money field
6228
6275
  *
6229
6276
  * An amount of money, built on Number field. The value is an integer in minor units
@@ -6568,7 +6615,7 @@ textarea.FieldControl {
6568
6615
  letter-spacing: var(--sl-font-body-base-letter-spacing);
6569
6616
  }
6570
6617
 
6571
- /* @scattered-light/loomiere-base-ui 0.7.1 · styles for @base-ui/react 1.9.0 */
6618
+ /* @scattered-light/loomiere-base-ui 0.9.0 · styles for @base-ui/react 1.9.0 */
6572
6619
  /* ListDetail
6573
6620
  *
6574
6621
  * The detail of one item, next to its list. Not a Base UI part. It is a Splitter
@@ -6695,7 +6742,7 @@ textarea.FieldControl {
6695
6742
  background: transparent;
6696
6743
  }
6697
6744
 
6698
- /* @scattered-light/loomiere-base-ui 0.7.1 · styles for @base-ui/react 1.9.0 */
6745
+ /* @scattered-light/loomiere-base-ui 0.9.0 · styles for @base-ui/react 1.9.0 */
6699
6746
  /* Splitter
6700
6747
  *
6701
6748
  * Two or more panels and a handle between them. Not a Base UI part. It follows the
@@ -6903,7 +6950,7 @@ textarea.FieldControl {
6903
6950
  background: var(--sl-border-default);
6904
6951
  }
6905
6952
 
6906
- /* @scattered-light/loomiere-base-ui 0.7.1 · styles for @base-ui/react 1.9.0 */
6953
+ /* @scattered-light/loomiere-base-ui 0.9.0 · styles for @base-ui/react 1.9.0 */
6907
6954
  /* EmptyState
6908
6955
  *
6909
6956
  * The block a page, pane, table, list or popup shows when it has nothing to show.
@@ -7159,7 +7206,7 @@ textarea.FieldControl {
7159
7206
  color: inherit;
7160
7207
  }
7161
7208
 
7162
- /* @scattered-light/loomiere-base-ui 0.7.1 · styles for @base-ui/react 1.9.0 */
7209
+ /* @scattered-light/loomiere-base-ui 0.9.0 · styles for @base-ui/react 1.9.0 */
7163
7210
  /* Table - Mojave Theme
7164
7211
  *
7165
7212
  * Base UI has no table, so this styles the native <table class="Table"> elements with the
@@ -7172,6 +7219,13 @@ textarea.FieldControl {
7172
7219
  * `<tr><td data-empty colSpan={n}><EmptyState size="compact" … /></td></tr>`. A cell with
7173
7220
  * only text still uses this rule's padding. A cell whose child is an EmptyState lets the
7174
7221
  * empty state pad itself. The empty row does not take the row hover.
7222
+ *
7223
+ * Totals: tr data-total="subtotal" draws a single rule above the row, and data-total="grand"
7224
+ * a rule above and a double rule under, as on a working paper (table.total-*). They work in
7225
+ * tbody or tfoot. A tfoot row without data-total keeps the header tray band.
7226
+ *
7227
+ * The working-paper rule (rule.width, 0 by default) replaces the table's top border with a
7228
+ * heavier line in rule.color, drawn on the first row's cells so it stays with a sticky header.
7175
7229
  */
7176
7230
 
7177
7231
  .Table {
@@ -7190,6 +7244,15 @@ textarea.FieldControl {
7190
7244
  border-radius: var(--sl-table-radius);
7191
7245
  overflow: hidden;
7192
7246
  font-variant-numeric: tabular-nums;
7247
+ /* The top border steps aside while the working-paper rule is on (any rule.width above 0). */
7248
+ border-top-width: max(0px, var(--sl-stroke-default) - var(--sl-rule-width) * 1000);
7249
+ }
7250
+
7251
+ /* The working-paper rule, on the first row: the header, or the body when there is none.
7252
+ At rule.width 0 this is no border at all. */
7253
+ .Table > thead > tr:first-child > *,
7254
+ .Table:not(:has(> thead)) > tbody:first-of-type > tr:first-child > * {
7255
+ border-top: var(--sl-rule-width) solid var(--sl-rule-color);
7193
7256
  }
7194
7257
 
7195
7258
  .Table caption {
@@ -7301,6 +7364,52 @@ textarea.FieldControl {
7301
7364
  border-bottom: none;
7302
7365
  }
7303
7366
 
7367
+ /* Subtotal and grand total rows: rules instead of a band, in the subtitle weight.
7368
+ Hover and selection don't apply: a total is not a record. */
7369
+ .Table tr[data-total] > * {
7370
+ font-family: var(--sl-font-subtitle-condense-font-family);
7371
+ font-size: var(--sl-font-subtitle-condense-font-size);
7372
+ font-weight: var(--sl-font-subtitle-condense-font-weight);
7373
+ line-height: var(--sl-font-subtitle-condense-line-height);
7374
+ letter-spacing: var(--sl-font-subtitle-condense-letter-spacing);
7375
+ background: var(--sl-table-total-background);
7376
+ color: var(--sl-table-color);
7377
+ border-top: var(--sl-table-subtotal-rule-width) solid var(--sl-table-total-rule-color);
7378
+ }
7379
+
7380
+ .Table tbody tr[data-total] > * {
7381
+ border-bottom: var(--sl-stroke-default) solid var(--sl-table-row-border-color);
7382
+ }
7383
+
7384
+ .Table tbody tr[data-total]:last-child:not([data-total='grand']) > * {
7385
+ border-bottom: none;
7386
+ }
7387
+
7388
+ /* The grand total: a double rule under the figures. */
7389
+ .Table :is(tbody, tfoot) tr[data-total='grand'] > * {
7390
+ border-bottom: var(--sl-table-grand-total-rule-width) double var(--sl-table-total-rule-color);
7391
+ }
7392
+
7393
+ /* A label or blank cell in a total row can leave the rules off, so they only run under the
7394
+ figures: data-rule="none" on the cell. */
7395
+ .Table :is(tbody, tfoot) tr[data-total] > [data-rule='none'] {
7396
+ border-top-color: transparent;
7397
+ border-bottom-color: transparent;
7398
+ }
7399
+
7400
+ /* In the footer the body's last row has no line under it, so those cells keep the footer's
7401
+ usual line on top. */
7402
+ .Table tfoot tr[data-total] > [data-rule='none'] {
7403
+ border-top: var(--sl-stroke-default) solid var(--sl-table-border-color);
7404
+ }
7405
+
7406
+ @media (hover: hover) {
7407
+ .Table tbody tr[data-total]:hover > * {
7408
+ background: var(--sl-table-total-background);
7409
+ color: var(--sl-table-color);
7410
+ }
7411
+ }
7412
+
7304
7413
  /* A header that stays put while the body scrolls (the table's wrapper scrolls) */
7305
7414
  .Table[data-sticky-header] thead th {
7306
7415
  position: sticky;
@@ -7331,7 +7440,7 @@ textarea.FieldControl {
7331
7440
  color: inherit;
7332
7441
  }
7333
7442
 
7334
- /* @scattered-light/loomiere-base-ui 0.7.1 · styles for @base-ui/react 1.9.0 */
7443
+ /* @scattered-light/loomiere-base-ui 0.9.0 · styles for @base-ui/react 1.9.0 */
7335
7444
  /* Collection
7336
7445
  *
7337
7446
  * DataTable, DataList, the toolbar and the pagination, in one place so the two views
@@ -7342,7 +7451,7 @@ textarea.FieldControl {
7342
7451
  * the tabs and the search where they are, so selecting rows does not grow the toolbar.
7343
7452
  */
7344
7453
 
7345
- /* @scattered-light/loomiere-base-ui 0.7.1 · styles for @base-ui/react 1.9.0 */
7454
+ /* @scattered-light/loomiere-base-ui 0.9.0 · styles for @base-ui/react 1.9.0 */
7346
7455
  /* Collection toolbar
7347
7456
  *
7348
7457
  * The wrap follows the toolbar's own width, not the window: a table in a narrow pane wraps
@@ -7483,7 +7592,7 @@ textarea.FieldControl {
7483
7592
  letter-spacing: var(--sl-font-body-condense-letter-spacing);
7484
7593
  }
7485
7594
 
7486
- /* @scattered-light/loomiere-base-ui 0.7.1 · styles for @base-ui/react 1.9.0 */
7595
+ /* @scattered-light/loomiere-base-ui 0.9.0 · styles for @base-ui/react 1.9.0 */
7487
7596
  /* DataTable additions on top of .Table.
7488
7597
  *
7489
7598
  * Sort buttons fill the header cell and inherit its hover, so old aria-sort markup keeps
@@ -7604,12 +7713,15 @@ textarea.FieldControl {
7604
7713
  color: var(--sl-table-subtle-color);
7605
7714
  }
7606
7715
 
7607
- /* @scattered-light/loomiere-base-ui 0.7.1 · styles for @base-ui/react 1.9.0 */
7716
+ /* @scattered-light/loomiere-base-ui 0.9.0 · styles for @base-ui/react 1.9.0 */
7608
7717
  /* DataList
7609
7718
  *
7610
7719
  * The same rows as the table, in one container with the table's borders, hover, selected
7611
7720
  * and current states. Not a stack of floating cards: the two views should read as one family.
7612
7721
  * variant=cards adds the surface radius and a gap when a queue should read as separate items.
7722
+ *
7723
+ * The working-paper rule (rule.width, 0 by default) replaces the top border with a heavier
7724
+ * line in rule.color: on the first row, or on each card's top edge.
7613
7725
  */
7614
7726
 
7615
7727
  .DataList {
@@ -7628,6 +7740,13 @@ textarea.FieldControl {
7628
7740
  background: var(--sl-table-background);
7629
7741
  border: var(--sl-stroke-default) solid var(--sl-table-border-color);
7630
7742
  border-radius: var(--sl-table-radius);
7743
+ /* The top border steps aside while the working-paper rule is on (any rule.width above 0). */
7744
+ border-top-width: max(0px, var(--sl-stroke-default) - var(--sl-rule-width) * 1000);
7745
+ }
7746
+
7747
+ /* The working-paper rule on the first row. At rule.width 0 this is no border at all. */
7748
+ .DataList ul > li:first-child {
7749
+ border-top: var(--sl-rule-width) solid var(--sl-rule-color);
7631
7750
  }
7632
7751
 
7633
7752
  .DataList li {
@@ -7721,6 +7840,14 @@ textarea.FieldControl {
7721
7840
  background: var(--sl-table-background);
7722
7841
  border: var(--sl-stroke-default) solid var(--sl-table-border-color);
7723
7842
  border-radius: var(--sl-table-radius);
7843
+ border-top-width: max(0px, var(--sl-stroke-default) - var(--sl-rule-width) * 1000);
7844
+ box-shadow: inset 0 var(--sl-rule-width) 0 0 var(--sl-rule-color);
7845
+ }
7846
+
7847
+ .DataList[data-variant='cards'] li[aria-current='true'] {
7848
+ box-shadow:
7849
+ inset var(--sl-stroke-strong) 0 0 0 var(--sl-border-accent),
7850
+ inset 0 var(--sl-rule-width) 0 0 var(--sl-rule-color);
7724
7851
  }
7725
7852
 
7726
7853
  .DataList[data-loading] ul {
@@ -7728,7 +7855,7 @@ textarea.FieldControl {
7728
7855
  transition: opacity var(--sl-duration-fast) var(--sl-easing-default);
7729
7856
  }
7730
7857
 
7731
- /* @scattered-light/loomiere-base-ui 0.7.1 · styles for @base-ui/react 1.9.0 */
7858
+ /* @scattered-light/loomiere-base-ui 0.9.0 · styles for @base-ui/react 1.9.0 */
7732
7859
  /* Pagination
7733
7860
  *
7734
7861
  * Not tied to a collection. Anything with a page, a page count and a total can use it.
@@ -7753,7 +7880,7 @@ textarea.FieldControl {
7753
7880
  margin: 0;
7754
7881
  }
7755
7882
 
7756
- /* @scattered-light/loomiere-base-ui 0.7.1 · styles for @base-ui/react 1.9.0 */
7883
+ /* @scattered-light/loomiere-base-ui 0.9.0 · styles for @base-ui/react 1.9.0 */
7757
7884
  /* EditableList
7758
7885
  *
7759
7886
  * One table at every width, so a field is not submitted twice. Under the stack width each
@@ -7851,3 +7978,351 @@ textarea.FieldControl {
7851
7978
  letter-spacing: var(--sl-font-subtitle-condense-letter-spacing);
7852
7979
  }
7853
7980
  }
7981
+
7982
+ /* @scattered-light/loomiere-base-ui 0.9.0 · styles for @base-ui/react 1.9.0 */
7983
+ /* Sheet
7984
+ *
7985
+ * A working-paper surface: the raised surface with a heavier rule across its top
7986
+ * (sheet.rule-width in sheet.rule-color) instead of its top border, and an optional tab
7987
+ * label that sits on the rule like the tab of a ledger page. The tab is caps-condense on
7988
+ * the inverse surface. An action (an Edit link, a count) sits at the end of the header row.
7989
+ * Tokens: sheet.* (tokens/component/sheet.json).
7990
+ *
7991
+ * Content runs edge to edge, so a Table, DataList or leader DescriptionList inside lines up
7992
+ * with the sheet's sides; data-inset on SheetBody pads it by sheet.padding instead. A Table
7993
+ * inside drops its own outer border and corners, since the sheet is its frame.
7994
+ */
7995
+
7996
+ .Sheet {
7997
+ box-sizing: border-box;
7998
+ display: flex;
7999
+ flex-direction: column;
8000
+ min-width: 0;
8001
+ }
8002
+
8003
+ .SheetHeader {
8004
+ display: flex;
8005
+ align-items: flex-end;
8006
+ gap: var(--sl-sheet-header-gap);
8007
+ min-height: var(--sl-sheet-tab-height);
8008
+ }
8009
+
8010
+ .SheetTab {
8011
+ font-family: var(--sl-font-caps-condense-font-family);
8012
+ font-size: var(--sl-font-caps-condense-font-size);
8013
+ font-weight: var(--sl-font-caps-condense-font-weight);
8014
+ line-height: var(--sl-font-caps-condense-line-height);
8015
+ letter-spacing: var(--sl-font-caps-condense-letter-spacing);
8016
+ text-transform: var(--sl-font-caps-condense-text-transform);
8017
+ display: inline-flex;
8018
+ align-items: center;
8019
+ height: var(--sl-sheet-tab-height);
8020
+ padding-inline: var(--sl-sheet-tab-padding-inline);
8021
+ background: var(--sl-sheet-tab-background);
8022
+ color: var(--sl-sheet-tab-color);
8023
+ border-radius: var(--sl-sheet-tab-radius) var(--sl-sheet-tab-radius) 0 0;
8024
+ white-space: nowrap;
8025
+ }
8026
+
8027
+ .SheetAction {
8028
+ font-family: var(--sl-font-subtitle-condense-font-family);
8029
+ font-size: var(--sl-font-subtitle-condense-font-size);
8030
+ font-weight: var(--sl-font-subtitle-condense-font-weight);
8031
+ line-height: var(--sl-font-subtitle-condense-line-height);
8032
+ letter-spacing: var(--sl-font-subtitle-condense-letter-spacing);
8033
+ margin-inline-start: auto;
8034
+ padding-block-end: var(--sl-space-1);
8035
+ }
8036
+
8037
+ .SheetBody {
8038
+ box-sizing: border-box;
8039
+ flex: 1;
8040
+ min-width: 0;
8041
+ background: var(--sl-sheet-background);
8042
+ border: var(--sl-sheet-border-width) solid var(--sl-sheet-border-color);
8043
+ border-top: var(--sl-sheet-rule-width) solid var(--sl-sheet-rule-color);
8044
+ border-radius: var(--sl-sheet-radius);
8045
+ /* Rows inside keep to the rounded corners. clip, not hidden, so a sticky header still sticks. */
8046
+ overflow: clip;
8047
+ }
8048
+
8049
+ /* Under a tab the top corners stay square, so the tab sits flush on the rule. */
8050
+ .Sheet[data-tab] > .SheetBody {
8051
+ border-start-start-radius: 0;
8052
+ border-start-end-radius: 0;
8053
+ }
8054
+
8055
+ .SheetBody[data-inset] {
8056
+ padding: var(--sl-sheet-padding);
8057
+ }
8058
+
8059
+ /* The sheet is the frame: a table or list inside drops its own outer edge. */
8060
+ .SheetBody > .Table,
8061
+ .SheetBody > .CollectionView .Table,
8062
+ .SheetBody > .DataList ul {
8063
+ border: 0;
8064
+ border-radius: 0;
8065
+ }
8066
+
8067
+ .SheetBody > .Table > thead > tr:first-child > *,
8068
+ .SheetBody > .Table:not(:has(> thead)) > tbody:first-of-type > tr:first-child > *,
8069
+ .SheetBody > .DataList ul > li:first-child {
8070
+ border-top: 0;
8071
+ }
8072
+
8073
+ /* @scattered-light/loomiere-base-ui 0.9.0 · styles for @base-ui/react 1.9.0 */
8074
+ /* StatFigure
8075
+ *
8076
+ * One large figure with a caps label above and a caption under it. The label is
8077
+ * caps-condense, the figure uses the figures text family (mono, tabular numbers) at
8078
+ * stat-figure.figure-font-size, the caption is body-condense. data-underline="double"
8079
+ * draws a double rule under the figure only, the accountant's mark for a final total;
8080
+ * data-tone="accent" colors the figure; data-size="sm" makes it smaller for a row of figures.
8081
+ * Tokens: stat-figure.* (tokens/component/stat-figure.json).
8082
+ */
8083
+
8084
+ .StatFigure {
8085
+ display: inline-flex;
8086
+ flex-direction: column;
8087
+ align-items: flex-start;
8088
+ gap: var(--sl-stat-figure-gap);
8089
+ min-width: 0;
8090
+ }
8091
+
8092
+ .StatFigureLabel {
8093
+ font-family: var(--sl-font-caps-condense-font-family);
8094
+ font-size: var(--sl-font-caps-condense-font-size);
8095
+ font-weight: var(--sl-font-caps-condense-font-weight);
8096
+ line-height: var(--sl-font-caps-condense-line-height);
8097
+ letter-spacing: var(--sl-font-caps-condense-letter-spacing);
8098
+ text-transform: var(--sl-font-caps-condense-text-transform);
8099
+ color: var(--sl-stat-figure-label-color);
8100
+ }
8101
+
8102
+ .StatFigureValue {
8103
+ font-family: var(--sl-font-figures-base-font-family);
8104
+ font-variant-numeric: var(--sl-font-figures-base-font-variant-numeric);
8105
+ font-size: var(--sl-stat-figure-figure-font-size);
8106
+ font-weight: var(--sl-stat-figure-figure-font-weight);
8107
+ line-height: var(--sl-stat-figure-figure-line-height);
8108
+ color: var(--sl-stat-figure-figure-color);
8109
+ white-space: nowrap;
8110
+ }
8111
+
8112
+ .StatFigure[data-size='sm'] .StatFigureValue {
8113
+ font-size: var(--sl-stat-figure-figure-font-size-sm);
8114
+ line-height: var(--sl-stat-figure-figure-line-height-sm);
8115
+ }
8116
+
8117
+ .StatFigure[data-tone='accent'] .StatFigureValue {
8118
+ color: var(--sl-stat-figure-figure-color-accent);
8119
+ }
8120
+
8121
+ .StatFigure[data-underline='double'] .StatFigureValue {
8122
+ border-bottom: var(--sl-stat-figure-underline-width) double var(--sl-stat-figure-underline-color);
8123
+ }
8124
+
8125
+ .StatFigureCaption {
8126
+ font-family: var(--sl-font-body-condense-font-family);
8127
+ font-size: var(--sl-font-body-condense-font-size);
8128
+ font-weight: var(--sl-font-body-condense-font-weight);
8129
+ line-height: var(--sl-font-body-condense-line-height);
8130
+ letter-spacing: var(--sl-font-body-condense-letter-spacing);
8131
+ color: var(--sl-stat-figure-caption-color);
8132
+ }
8133
+
8134
+ /* @scattered-light/loomiere-base-ui 0.9.0 · styles for @base-ui/react 1.9.0 */
8135
+ /* DescriptionList
8136
+ *
8137
+ * Label and value pairs in a native dl, one DescriptionItem (a div holding a dt and a dd)
8138
+ * per pair, with a hairline between pairs. The default variant sets labels in a column
8139
+ * beside their values. data-variant="leader" runs a dotted leader from each label to its
8140
+ * value, which sits at the end of the row, as on a working paper. Labels are body text
8141
+ * in the secondary color, values primary text with tabular numbers.
8142
+ * Tokens: description-list.* (tokens/component/description-list.json).
8143
+ */
8144
+
8145
+ .DescriptionList {
8146
+ font-family: var(--sl-font-body-base-font-family);
8147
+ font-size: var(--sl-font-body-base-font-size);
8148
+ font-weight: var(--sl-font-body-base-font-weight);
8149
+ line-height: var(--sl-font-body-base-line-height);
8150
+ letter-spacing: var(--sl-font-body-base-letter-spacing);
8151
+ margin: 0;
8152
+ padding: 0;
8153
+ font-variant-numeric: tabular-nums;
8154
+ }
8155
+
8156
+ .DescriptionItem {
8157
+ display: grid;
8158
+ grid-template-columns: var(--sl-description-list-label-width) 2fr;
8159
+ align-items: baseline;
8160
+ column-gap: var(--sl-description-list-column-gap);
8161
+ padding-block: var(--sl-description-list-row-padding-block);
8162
+ padding-inline: var(--sl-description-list-row-padding-inline);
8163
+ border-bottom: var(--sl-stroke-default) solid var(--sl-description-list-row-border-color);
8164
+ }
8165
+
8166
+ .DescriptionItem:last-child {
8167
+ border-bottom: none;
8168
+ }
8169
+
8170
+ .DescriptionTerm {
8171
+ margin: 0;
8172
+ color: var(--sl-description-list-label-color);
8173
+ }
8174
+
8175
+ .DescriptionDetails {
8176
+ margin: 0;
8177
+ min-width: 0;
8178
+ color: var(--sl-description-list-value-color);
8179
+ overflow-wrap: anywhere;
8180
+ }
8181
+
8182
+ /* Leader: the label grows to fill the row, and its ::after is the dotted line that leads
8183
+ to the value. The line sits on the text's baseline. */
8184
+ .DescriptionList[data-variant='leader'] .DescriptionItem {
8185
+ display: flex;
8186
+ column-gap: var(--sl-description-list-leader-gap);
8187
+ }
8188
+
8189
+ .DescriptionList[data-variant='leader'] .DescriptionTerm {
8190
+ display: flex;
8191
+ flex: 1 1 auto;
8192
+ align-items: baseline;
8193
+ gap: var(--sl-description-list-leader-gap);
8194
+ min-width: 0;
8195
+ }
8196
+
8197
+ .DescriptionList[data-variant='leader'] .DescriptionTerm::after {
8198
+ content: '';
8199
+ flex: 1 1 var(--sl-space-6);
8200
+ min-width: var(--sl-space-6);
8201
+ border-bottom: var(--sl-description-list-leader-width) dotted var(--sl-description-list-leader-color);
8202
+ }
8203
+
8204
+ .DescriptionList[data-variant='leader'] .DescriptionDetails {
8205
+ flex: 0 1 auto;
8206
+ max-width: 60%;
8207
+ text-align: end;
8208
+ }
8209
+
8210
+ /* @scattered-light/loomiere-base-ui 0.9.0 · styles for @base-ui/react 1.9.0 */
8211
+ /* AppBar
8212
+ *
8213
+ * The bar across the top of an app window, one row on a line in the rule color. The line is
8214
+ * app-bar.border-width while rule.width is 0, and the thicker of the two once a brand turns the
8215
+ * rule on, so an ink-rule brand gets the working-paper rule under its app bar.
8216
+ * AppBarSpacer pushes what follows it to the end. A vertical Separator inside is a short
8217
+ * divider between groups of icon actions. Tokens: app-bar.* (tokens/component/app-bar.json).
8218
+ */
8219
+
8220
+ .AppBar {
8221
+ box-sizing: border-box;
8222
+ display: flex;
8223
+ align-items: center;
8224
+ gap: var(--sl-app-bar-gap);
8225
+ min-height: var(--sl-app-bar-height);
8226
+ padding-inline: var(--sl-app-bar-padding-inline);
8227
+ padding-block: var(--sl-space-2);
8228
+ background: var(--sl-app-bar-background);
8229
+ border-bottom: max(var(--sl-app-bar-border-width), var(--sl-rule-width)) solid var(--sl-app-bar-border-color);
8230
+ min-width: 0;
8231
+ }
8232
+
8233
+ .AppBarSpacer {
8234
+ flex: 1 1 var(--sl-space-4);
8235
+ min-width: 0;
8236
+ }
8237
+
8238
+ .AppBar .Separator[data-orientation='vertical'] {
8239
+ height: var(--sl-app-bar-divider-height);
8240
+ margin-inline: var(--sl-space-1);
8241
+ background: var(--sl-app-bar-divider-color);
8242
+ }
8243
+
8244
+ /* @scattered-light/loomiere-base-ui 0.9.0 · styles for @base-ui/react 1.9.0 */
8245
+ /* PickerButton
8246
+ *
8247
+ * A trigger with a caps label before the current choice: CLIENT Alpha Services. The field
8248
+ * look and states of a Select trigger; the label is caps-condense in picker-button.label-color,
8249
+ * the choice is cut with an ellipsis at picker-button.max-width and the chevron turns while
8250
+ * its popup is open. Tokens: picker-button.* (tokens/component/picker-button.json) and field.*.
8251
+ */
8252
+
8253
+ .PickerButton {
8254
+ box-sizing: border-box;
8255
+ color: var(--sl-field-color);
8256
+ background: var(--sl-field-background);
8257
+ border: var(--sl-field-border-width) solid var(--sl-field-border-color);
8258
+ border-radius: var(--sl-field-radius);
8259
+ transition: var(--sl-field-transition);
8260
+ outline: none;
8261
+ font-family: var(--sl-font-body-base-font-family);
8262
+ font-size: var(--sl-font-body-base-font-size);
8263
+ font-weight: var(--sl-font-body-base-font-weight);
8264
+ line-height: var(--sl-font-body-base-line-height);
8265
+ letter-spacing: var(--sl-font-body-base-letter-spacing);
8266
+ display: inline-flex;
8267
+ align-items: center;
8268
+ gap: var(--sl-gap-control);
8269
+ max-width: var(--sl-picker-button-max-width);
8270
+ min-width: 0;
8271
+ height: var(--sl-control-height-md);
8272
+ margin: 0;
8273
+ padding-block: var(--sl-control-padding-block);
8274
+ padding-inline: var(--sl-control-padding-inline);
8275
+ cursor: pointer;
8276
+ white-space: nowrap;
8277
+ }
8278
+
8279
+ .PickerButton:hover:not(:disabled) {
8280
+ border-color: var(--sl-field-border-color-hover);
8281
+ }
8282
+
8283
+ .PickerButton:focus-visible {
8284
+ border-color: var(--sl-field-border-color-focus);
8285
+ box-shadow: var(--sl-field-shadow-focus);
8286
+ }
8287
+
8288
+ .PickerButton:disabled {
8289
+ background: var(--sl-field-background-disabled);
8290
+ color: var(--sl-field-color-disabled);
8291
+ cursor: not-allowed;
8292
+ }
8293
+
8294
+ .PickerButtonLabel {
8295
+ font-family: var(--sl-font-caps-condense-font-family);
8296
+ font-size: var(--sl-font-caps-condense-font-size);
8297
+ font-weight: var(--sl-font-caps-condense-font-weight);
8298
+ line-height: var(--sl-font-caps-condense-line-height);
8299
+ letter-spacing: var(--sl-font-caps-condense-letter-spacing);
8300
+ text-transform: var(--sl-font-caps-condense-text-transform);
8301
+ flex: none;
8302
+ color: var(--sl-picker-button-label-color);
8303
+ }
8304
+
8305
+ .PickerButtonValue {
8306
+ flex: 0 1 auto;
8307
+ min-width: 0;
8308
+ overflow: hidden;
8309
+ text-overflow: ellipsis;
8310
+ color: var(--sl-field-color);
8311
+ }
8312
+
8313
+ .PickerButtonValue[data-placeholder] {
8314
+ color: var(--sl-field-placeholder-color);
8315
+ }
8316
+
8317
+ .PickerButtonIcon {
8318
+ flex: none;
8319
+ width: var(--sl-icon-size-base);
8320
+ height: var(--sl-icon-size-base);
8321
+ color: var(--sl-text-tertiary);
8322
+ transition: transform var(--sl-duration-normal) var(--sl-easing-default);
8323
+ }
8324
+
8325
+ .PickerButton[aria-expanded='true'] .PickerButtonIcon,
8326
+ .PickerButton[data-popup-open] .PickerButtonIcon {
8327
+ transform: rotate(180deg);
8328
+ }