@scattered-light/loomiere-mojave 0.24.0 → 0.25.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.
@@ -6733,7 +6733,7 @@
6733
6733
  }
6734
6734
 
6735
6735
 
6736
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
6736
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
6737
6737
  /* Loomiere for Base UI: component styles. Brand-free: every value is a --sl- variable from a
6738
6738
  Loomiere theme. Load the theme first:
6739
6739
  @import '<your theme>/tokens.css';
@@ -6743,7 +6743,7 @@
6743
6743
  /* Document defaults, in the reset layer so any unlayered rule wins over them, and so layered
6744
6744
  frameworks (Chakra's recipes, Tailwind's utilities) are not undone by them. */
6745
6745
  @layer reset {
6746
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
6746
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
6747
6747
  /* CSS Reset - Mojave Theme */
6748
6748
 
6749
6749
  /* ============================================
@@ -7187,7 +7187,7 @@ hr {
7187
7187
  }
7188
7188
  }
7189
7189
  @layer reset {
7190
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
7190
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
7191
7191
  /* Accessibility — base rules (no theme color dependencies). Theme-specific focus/invalid: accessibility-theme.css */
7192
7192
 
7193
7193
  /* Remove default focus; keyboard focus styled in accessibility-theme.css */
@@ -7300,7 +7300,7 @@ main:focus {
7300
7300
 
7301
7301
  }
7302
7302
  @layer reset {
7303
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
7303
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
7304
7304
  /* Focus, invalid, contrast — requires theme tokens (after theme-accessibility.css). */
7305
7305
 
7306
7306
  :focus-visible {
@@ -7368,7 +7368,7 @@ button,
7368
7368
 
7369
7369
  }
7370
7370
  /* Component styles */
7371
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
7371
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
7372
7372
  /* Accordion - Mojave Theme
7373
7373
  *
7374
7374
  * No component tokens. Hover, press, chevron, divider and motion are the disclosure
@@ -7489,7 +7489,7 @@ button,
7489
7489
  overflow: hidden;
7490
7490
  }
7491
7491
 
7492
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
7492
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
7493
7493
  /* Alert Dialog - Mojave Theme
7494
7494
  *
7495
7495
  * No component tokens and no rules of its own. An alert dialog looks exactly like a
@@ -7498,7 +7498,7 @@ button,
7498
7498
  * cancel quiet, and a destructive one bold with data-color="error".
7499
7499
  */
7500
7500
 
7501
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
7501
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
7502
7502
  /* Autocomplete - Mojave Theme
7503
7503
  *
7504
7504
  * No component tokens. The input is Input (Input.css), the clear button is an icon
@@ -7700,7 +7700,7 @@ button,
7700
7700
  (reset-accessibility.css).
7701
7701
  ============================================ */
7702
7702
 
7703
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
7703
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
7704
7704
  /* Avatar - Mojave Theme
7705
7705
  *
7706
7706
  * A round picture with a ring in the page color, so avatars in a group cut out of each other in
@@ -7808,7 +7808,7 @@ button,
7808
7808
  }
7809
7809
  }
7810
7810
 
7811
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
7811
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
7812
7812
  /* Button - Mojave Theme
7813
7813
  *
7814
7814
  * Colors are the brand's emphasis levels, sizes are control.*, text is the trigger
@@ -7979,7 +7979,7 @@ button,
7979
7979
  font-size: var(--sl-icon-size-maximize);
7980
7980
  }
7981
7981
 
7982
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
7982
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
7983
7983
  /* Checkbox - Mojave Theme
7984
7984
  * Sizes follow the label: the box is the icon size one tier above the label's text
7985
7985
  * tier (like a button's icon) and the check mark one tier below it.
@@ -8136,7 +8136,7 @@ button,
8136
8136
  border-radius: var(--sl-radius-pill);
8137
8137
  }
8138
8138
 
8139
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
8139
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
8140
8140
  /* Checkbox Group - Mojave Theme */
8141
8141
 
8142
8142
  /* Each checkbox row is already a full tap target tall, so the rows sit close. */
@@ -8152,7 +8152,7 @@ button,
8152
8152
  pointer-events: none;
8153
8153
  }
8154
8154
 
8155
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
8155
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
8156
8156
  /* Collapsible - Mojave Theme
8157
8157
  *
8158
8158
  * No component tokens. Hover, press, chevron and motion are the disclosure concept
@@ -8268,7 +8268,7 @@ button,
8268
8268
  background: var(--sl-surface-raised);
8269
8269
  }
8270
8270
 
8271
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
8271
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
8272
8272
  /* Combobox - Mojave Theme
8273
8273
  *
8274
8274
  * No component tokens. The input is Input (Input.css); the chips box is a field; the
@@ -8753,7 +8753,7 @@ button,
8753
8753
  color: var(--sl-text-tertiary);
8754
8754
  }
8755
8755
 
8756
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
8756
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
8757
8757
  /* Context Menu - Mojave Theme
8758
8758
  *
8759
8759
  * 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
@@ -8922,7 +8922,7 @@ button,
8922
8922
  stroke-width: var(--sl-stroke-default);
8923
8923
  }
8924
8924
 
8925
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
8925
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
8926
8926
  /* Dialog and Alert dialog - Mojave Theme
8927
8927
  *
8928
8928
  * Both are centered modals built from the modal concept (tokens/semantic/modal.json):
@@ -9068,7 +9068,7 @@ button,
9068
9068
  margin-top: var(--sl-modal-actions-spacing);
9069
9069
  }
9070
9070
 
9071
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
9071
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
9072
9072
  /* Drawer - a panel that slides in from an edge and can be swiped away.
9073
9073
  The surface, scrim, heading and motion are the modal concept's (--sl-modal-*), so a
9074
9074
  drawer reads as a dialog's sibling; only its size and grab bar are its own
@@ -9201,7 +9201,7 @@ button,
9201
9201
  color: var(--sl-modal-description-color);
9202
9202
  }
9203
9203
 
9204
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
9204
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
9205
9205
  /* Field - Mojave Theme
9206
9206
  *
9207
9207
  * Label, control, description and error. No component tokens: spacing is the field
@@ -9262,7 +9262,7 @@ textarea.FieldControl {
9262
9262
  height: auto;
9263
9263
  }
9264
9264
 
9265
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
9265
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
9266
9266
  /* Fieldset - Mojave Theme
9267
9267
  *
9268
9268
  * No component tokens: a titled group of fields, spaced by the stack gaps, with
@@ -9304,7 +9304,7 @@ textarea.FieldControl {
9304
9304
  color: var(--sl-text-secondary);
9305
9305
  }
9306
9306
 
9307
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
9307
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
9308
9308
  /* Form - Mojave Theme
9309
9309
  *
9310
9310
  * No component tokens: fields stack with the large block space, and the action
@@ -9324,7 +9324,7 @@ textarea.FieldControl {
9324
9324
  margin-top: var(--sl-space-block-md);
9325
9325
  }
9326
9326
 
9327
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
9327
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
9328
9328
  /* Input - Mojave Theme
9329
9329
  *
9330
9330
  * No component tokens: the look is the field concept (tokens/semantic/field.json),
@@ -9471,7 +9471,7 @@ textarea.FieldControl {
9471
9471
  padding-inline: var(--sl-control-padding-inline-lg);
9472
9472
  }
9473
9473
 
9474
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
9474
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
9475
9475
  /* Menu - Mojave Theme
9476
9476
  *
9477
9477
  * No component tokens. The trigger is a Button. The popup is the popup concept, rows are item rows at the
@@ -9620,7 +9620,7 @@ textarea.FieldControl {
9620
9620
  color: var(--sl-text-tertiary);
9621
9621
  }
9622
9622
 
9623
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
9623
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
9624
9624
  /* Menubar - Mojave Theme
9625
9625
  *
9626
9626
  * No component tokens. A row of quiet triggers, each opening a menu. The popup is the popup concept, rows are item rows at the
@@ -9813,7 +9813,7 @@ textarea.FieldControl {
9813
9813
  color: var(--sl-text-tertiary);
9814
9814
  }
9815
9815
 
9816
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
9816
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
9817
9817
  /* Meter - Mojave Theme
9818
9818
  *
9819
9819
  * A gauge (tokens/semantic/gauge.json). The fill is the solid color of the scope around it:
@@ -9876,7 +9876,7 @@ textarea.FieldControl {
9876
9876
  height: var(--sl-gauge-height-lg);
9877
9877
  }
9878
9878
 
9879
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
9879
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
9880
9880
  /* Navigation Menu - Mojave Theme
9881
9881
  *
9882
9882
  * The strip is the bar concept, the panel is the popup concept and each link is an item
@@ -10296,7 +10296,7 @@ textarea.FieldControl {
10296
10296
  width: 100%;
10297
10297
  }
10298
10298
 
10299
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
10299
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
10300
10300
  /* Number Field - Mojave Theme
10301
10301
  *
10302
10302
  * No component tokens. The input is Input (Input.css) and the label, description and
@@ -10387,7 +10387,7 @@ textarea.FieldControl {
10387
10387
  user-select: none;
10388
10388
  }
10389
10389
 
10390
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
10390
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
10391
10391
  /* OTP Field - Mojave Theme
10392
10392
  *
10393
10393
  * One-time code entry: a row of single-character inputs. Each slot is the same control as Input
@@ -10450,7 +10450,7 @@ textarea.FieldControl {
10450
10450
  letter-spacing: var(--sl-font-body-magnify-letter-spacing);
10451
10451
  }
10452
10452
 
10453
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
10453
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
10454
10454
  /* Popover - Mojave Theme */
10455
10455
 
10456
10456
  /* ============================================
@@ -10615,7 +10615,7 @@ textarea.FieldControl {
10615
10615
  fill: var(--sl-popup-arrow-stroke);
10616
10616
  }
10617
10617
 
10618
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
10618
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
10619
10619
  /* Preview Card - Mojave Theme
10620
10620
  *
10621
10621
  * The popup concept (surface, arrow, motion) with a title-magnify title and condense
@@ -10732,7 +10732,7 @@ textarea.FieldControl {
10732
10732
  fill: var(--sl-popup-arrow-stroke);
10733
10733
  }
10734
10734
 
10735
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
10735
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
10736
10736
  /* Progress - Mojave Theme
10737
10737
  *
10738
10738
  * A gauge (tokens/semantic/gauge.json), the same bar as Meter. The fill is the solid color of
@@ -10809,7 +10809,7 @@ textarea.FieldControl {
10809
10809
  height: var(--sl-gauge-height-lg);
10810
10810
  }
10811
10811
 
10812
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
10812
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
10813
10813
  /* Radio - Mojave Theme
10814
10814
  * Same box as Checkbox, always round. Sizes follow the label the same way, and the
10815
10815
  * dot is a share of the circle (check.dot-scale).
@@ -10961,7 +10961,7 @@ textarea.FieldControl {
10961
10961
  gap: var(--sl-gap-stack-sm);
10962
10962
  }
10963
10963
 
10964
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
10964
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
10965
10965
  /* Scroll Area - Mojave Theme
10966
10966
  *
10967
10967
  * The scrollbar is the content scrollbar (content.scrollbar-*): a track that stays clear until
@@ -11043,7 +11043,7 @@ textarea.FieldControl {
11043
11043
  background: transparent;
11044
11044
  }
11045
11045
 
11046
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
11046
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
11047
11047
  /* Select - Mojave Theme
11048
11048
  *
11049
11049
  * The trigger is a field (the field pattern, control sizes, the base text style); the
@@ -11334,7 +11334,7 @@ textarea.FieldControl {
11334
11334
  stroke-width: var(--sl-stroke-default);
11335
11335
  }
11336
11336
 
11337
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
11337
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
11338
11338
  /* Separator - Mojave Theme
11339
11339
  *
11340
11340
  * A hairline in the everyday divider color (border.default), one stroke thick, with a step of
@@ -11362,7 +11362,7 @@ textarea.FieldControl {
11362
11362
  margin-inline: var(--sl-space-4);
11363
11363
  }
11364
11364
 
11365
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
11365
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
11366
11366
  /* Slider - Mojave Theme
11367
11367
  *
11368
11368
  * A slider is a gauge you can drag: the track, fill and label row are gauge.* (the same bar as
@@ -11528,7 +11528,7 @@ textarea.FieldControl {
11528
11528
  transform: translate(-50%, 50%);
11529
11529
  }
11530
11530
 
11531
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
11531
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
11532
11532
  /* Switch - Mojave Theme
11533
11533
  * Switch keeps its track sizes. The thumb, its travel and the ON/OFF text are
11534
11534
  * worked out from them: the thumb fills the track's height inside the padding,
@@ -11694,7 +11694,7 @@ textarea.FieldControl {
11694
11694
  color: var(--sl-text-disabled);
11695
11695
  }
11696
11696
 
11697
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
11697
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
11698
11698
  /* Tabs - Mojave Theme
11699
11699
  *
11700
11700
  * No component tokens. The divider, the selected line and color, hover and the disabled
@@ -11830,7 +11830,7 @@ textarea.FieldControl {
11830
11830
  padding: var(--sl-space-6);
11831
11831
  }
11832
11832
 
11833
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
11833
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
11834
11834
  /* Toast - Mojave Theme
11835
11835
  *
11836
11836
  * A toast is a notice (tokens/semantic/notice.json) on the popup surface. A toast whose type
@@ -12066,7 +12066,7 @@ textarea.FieldControl {
12066
12066
  flex-shrink: 0;
12067
12067
  }
12068
12068
 
12069
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
12069
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
12070
12070
  /* Toggle - Mojave Theme
12071
12071
  * A toggle is a button that stays pressed: the same heights, padding, gap and
12072
12072
  * trigger text style as a button of the same size. Pressed, it takes its emphasis level's
@@ -12178,7 +12178,7 @@ textarea.FieldControl {
12178
12178
  height: var(--sl-icon-size-maximize);
12179
12179
  }
12180
12180
 
12181
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
12181
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
12182
12182
  /* Toggle Group - Mojave Theme
12183
12183
  *
12184
12184
  * No component tokens. The strip is the bar concept (tokens/semantic/bar.json); the
@@ -12240,7 +12240,7 @@ textarea.FieldControl {
12240
12240
  outline-offset: var(--sl-focus-outline-offset-inset);
12241
12241
  }
12242
12242
 
12243
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
12243
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
12244
12244
  /* Toolbar - Mojave Theme
12245
12245
  *
12246
12246
  * The strip is the bar concept (tokens/semantic/bar.json). Buttons, toggles, selects
@@ -12302,7 +12302,7 @@ textarea.FieldControl {
12302
12302
  max-width: var(--sl-toolbar-input-max-width);
12303
12303
  }
12304
12304
 
12305
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
12305
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
12306
12306
  /* Tooltip - Mojave Theme
12307
12307
  *
12308
12308
  * The inverse surface (surface.inverse, text.on-inverse-surface) with condense text, so a tooltip
@@ -12363,7 +12363,7 @@ textarea.FieldControl {
12363
12363
  }
12364
12364
 
12365
12365
  /* Custom components: not Base UI parts. Built from existing concepts and tokens. */
12366
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
12366
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
12367
12367
  /* Badge
12368
12368
  *
12369
12369
  * A status or count label. Not a Base UI part, and not interactive: no hover or focus.
@@ -12468,7 +12468,57 @@ textarea.FieldControl {
12468
12468
  height: var(--sl-badge-dot-base);
12469
12469
  }
12470
12470
 
12471
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
12471
+ /* A removable chip (onRemove): the label, then a small close button at the end. The button is
12472
+ * the badge's height so its hit area fills the end of the pill, and the end padding drops so
12473
+ * the glyph sits where the padding was. The badge stays a span; only the button is
12474
+ * interactive, and it carries the focus ring. */
12475
+ .Badge[data-removable] {
12476
+ padding-inline-end: 0;
12477
+ }
12478
+
12479
+ .BadgeRemove {
12480
+ display: inline-flex;
12481
+ align-items: center;
12482
+ justify-content: center;
12483
+ flex-shrink: 0;
12484
+ width: var(--sl-badge-height-condense);
12485
+ height: 100%;
12486
+ margin: 0;
12487
+ margin-inline-start: calc(var(--sl-badge-gap-condense) * -1);
12488
+ padding: 0;
12489
+ border: 0;
12490
+ border-radius: var(--sl-radius-pill);
12491
+ background: transparent;
12492
+ color: inherit;
12493
+ cursor: pointer;
12494
+ }
12495
+
12496
+ .BadgeRemove:hover {
12497
+ background: var(--sl-e-bg-hover);
12498
+ }
12499
+
12500
+ .BadgeRemove:focus-visible {
12501
+ outline: var(--sl-focus-outline);
12502
+ outline-offset: var(--sl-focus-outline-offset);
12503
+ box-shadow: 0 0 0 var(--sl-focus-halo-spread) var(--sl-focus-halo-color);
12504
+ }
12505
+
12506
+ .BadgeRemove:disabled {
12507
+ cursor: default;
12508
+ opacity: var(--sl-button-opacity-disabled);
12509
+ }
12510
+
12511
+ .Badge[data-size='minimize'] .BadgeRemove {
12512
+ width: var(--sl-badge-height-minimize);
12513
+ margin-inline-start: calc(var(--sl-badge-gap-minimize) * -1);
12514
+ }
12515
+
12516
+ .Badge[data-size='base'] .BadgeRemove {
12517
+ width: var(--sl-badge-height-base);
12518
+ margin-inline-start: calc(var(--sl-badge-gap-base) * -1);
12519
+ }
12520
+
12521
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
12472
12522
  /*
12473
12523
  * DatePicker: a field that opens a calendar for one date or a period.
12474
12524
  * Not a Base UI part. The popup is Popover on a wide viewport and Drawer
@@ -13058,7 +13108,7 @@ textarea.FieldControl {
13058
13108
  flex-basis: 100%;
13059
13109
  }
13060
13110
 
13061
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
13111
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
13062
13112
  /* Money field
13063
13113
  *
13064
13114
  * An amount of money, built on Number field. The value is an integer in minor units
@@ -13403,7 +13453,7 @@ textarea.FieldControl {
13403
13453
  letter-spacing: var(--sl-font-body-base-letter-spacing);
13404
13454
  }
13405
13455
 
13406
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
13456
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
13407
13457
  /* ListDetail
13408
13458
  *
13409
13459
  * The detail of one item, next to its list. Not a Base UI part. It is a Splitter
@@ -13530,7 +13580,7 @@ textarea.FieldControl {
13530
13580
  background: transparent;
13531
13581
  }
13532
13582
 
13533
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
13583
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
13534
13584
  /* Splitter
13535
13585
  *
13536
13586
  * Two or more panels and a handle between them. Not a Base UI part. It follows the
@@ -13738,7 +13788,7 @@ textarea.FieldControl {
13738
13788
  background: var(--sl-border-default);
13739
13789
  }
13740
13790
 
13741
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
13791
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
13742
13792
  /* EmptyState
13743
13793
  *
13744
13794
  * The block a page, pane, table, list or popup shows when it has nothing to show.
@@ -13994,7 +14044,265 @@ textarea.FieldControl {
13994
14044
  color: inherit;
13995
14045
  }
13996
14046
 
13997
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
14047
+ /* ============================================
14048
+ REPORT LAYOUT
14049
+ ============================================
14050
+ *
14051
+ * A working paper before it has anything on it: a report that has not been run, a schedule
14052
+ * with no lines yet. It sits where the result will appear, left-aligned, never centered.
14053
+ * Top row: a square icon box, the title and one sentence, and the main action at the end of
14054
+ * the row with an optional caption under it (wraps under the text when narrow). Then the
14055
+ * guide: numbered steps and a few terms in two columns split 1.3 : 1 by a hairline, one
14056
+ * column when the block is narrow. Last, a bar-only preview of the result's shape.
14057
+ *
14058
+ * The icon box is square with the control radius and a strong border, not the subtle circle:
14059
+ * the same mark as the report's card, so the glyph is the accent text color. The title steps
14060
+ * up to title-magnify, the size of a page section heading, since it heads the sheet.
14061
+ *
14062
+ * The block is its own inline-size container, so the two columns fold by its width, not the
14063
+ * viewport's: a report sheet beside an open side panel folds as soon as it is narrow.
14064
+ */
14065
+
14066
+ .EmptyState[data-layout='report'] {
14067
+ container-type: inline-size;
14068
+ align-items: stretch;
14069
+ justify-content: flex-start;
14070
+ gap: var(--sl-space-6);
14071
+ max-width: 61.25rem;
14072
+ margin-block: 0;
14073
+ padding: var(--sl-space-7);
14074
+ text-align: start;
14075
+ }
14076
+
14077
+ .EmptyStateHeader {
14078
+ display: flex;
14079
+ flex-wrap: wrap;
14080
+ align-items: flex-start;
14081
+ gap: var(--sl-space-4) var(--sl-space-5);
14082
+ }
14083
+
14084
+ .EmptyState[data-layout='report'] .EmptyStateMedia:not([data-custom]) {
14085
+ width: var(--sl-space-12);
14086
+ height: var(--sl-space-12);
14087
+ border: var(--sl-stroke-default) solid var(--sl-border-strong);
14088
+ border-radius: var(--sl-radius-control);
14089
+ background: var(--sl-surface-raised);
14090
+ color: var(--sl-text-accent);
14091
+ }
14092
+
14093
+ .EmptyState[data-layout='report'] .EmptyStateMedia:not([data-custom]) .material-symbols-outlined,
14094
+ .EmptyState[data-layout='report'] .EmptyStateMedia:not([data-custom]) svg {
14095
+ width: var(--sl-icon-size-maximize);
14096
+ height: var(--sl-icon-size-maximize);
14097
+ font-size: var(--sl-icon-size-maximize);
14098
+ }
14099
+
14100
+ /* error and done keep their status tone on the glyph; the box stays plain. */
14101
+ .EmptyState[data-layout='report'] .EmptyStateMedia[data-status='error']:not([data-custom]) {
14102
+ color: var(--sl-status-error);
14103
+ }
14104
+
14105
+ .EmptyState[data-layout='report'] .EmptyStateMedia[data-status='success']:not([data-custom]) {
14106
+ color: var(--sl-status-success);
14107
+ }
14108
+
14109
+ .EmptyState[data-layout='report'] .EmptyStateText {
14110
+ flex: 1 1 20rem;
14111
+ align-items: flex-start;
14112
+ gap: var(--sl-space-1);
14113
+ max-width: none;
14114
+ }
14115
+
14116
+ .EmptyState[data-layout='report'] .EmptyStateTitle {
14117
+ font-family: var(--sl-font-title-magnify-font-family);
14118
+ font-size: var(--sl-font-title-magnify-font-size);
14119
+ font-weight: var(--sl-font-title-magnify-font-weight);
14120
+ line-height: var(--sl-font-title-magnify-line-height);
14121
+ letter-spacing: var(--sl-font-title-magnify-letter-spacing);
14122
+ }
14123
+
14124
+ .EmptyState[data-layout='report'] .EmptyStateDescription {
14125
+ max-width: var(--sl-measure-base);
14126
+ }
14127
+
14128
+ .EmptyState[data-layout='report'] .EmptyStateActions {
14129
+ flex-direction: column;
14130
+ align-items: flex-end;
14131
+ justify-content: flex-start;
14132
+ gap: var(--sl-space-1-5);
14133
+ }
14134
+
14135
+ .EmptyStateActionRow {
14136
+ display: flex;
14137
+ flex-wrap: wrap;
14138
+ align-items: center;
14139
+ justify-content: flex-end;
14140
+ gap: var(--sl-empty-actions-gap);
14141
+ }
14142
+
14143
+ .EmptyStateActionCaption {
14144
+ font-family: var(--sl-font-body-minimize-font-family);
14145
+ font-size: var(--sl-font-body-minimize-font-size);
14146
+ font-weight: var(--sl-font-body-minimize-font-weight);
14147
+ line-height: var(--sl-font-body-minimize-line-height);
14148
+ letter-spacing: var(--sl-font-body-minimize-letter-spacing);
14149
+ margin: 0;
14150
+ color: var(--sl-text-secondary);
14151
+ }
14152
+
14153
+ /* The guide: steps and terms, ruled off from the top row. */
14154
+ .EmptyStateGuide {
14155
+ display: grid;
14156
+ grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr);
14157
+ border-top: var(--sl-stroke-default) solid var(--sl-border-strong);
14158
+ }
14159
+
14160
+ .EmptyStateGuide > * {
14161
+ padding-block-start: var(--sl-space-4);
14162
+ }
14163
+
14164
+ .EmptyStateGuide > * + * {
14165
+ margin-inline-start: var(--sl-space-6);
14166
+ padding-inline-start: var(--sl-space-6);
14167
+ border-inline-start: var(--sl-stroke-default) solid var(--sl-border-subtle);
14168
+ }
14169
+
14170
+ /* One child fills the row. */
14171
+ .EmptyStateGuide > :only-child {
14172
+ grid-column: 1 / -1;
14173
+ }
14174
+
14175
+ .EmptyStateSection {
14176
+ min-width: 0;
14177
+ }
14178
+
14179
+ .EmptyStateSectionTitle {
14180
+ font-family: var(--sl-font-caps-condense-font-family);
14181
+ font-size: var(--sl-font-caps-condense-font-size);
14182
+ font-weight: var(--sl-font-caps-condense-font-weight);
14183
+ line-height: var(--sl-font-caps-condense-line-height);
14184
+ letter-spacing: var(--sl-font-caps-condense-letter-spacing);
14185
+ text-transform: var(--sl-font-caps-condense-text-transform);
14186
+ margin: 0;
14187
+ color: var(--sl-text-primary);
14188
+ }
14189
+
14190
+ .EmptyStateSteps {
14191
+ display: flex;
14192
+ flex-direction: column;
14193
+ gap: var(--sl-space-3);
14194
+ margin: var(--sl-space-2) 0 0;
14195
+ padding: 0;
14196
+ list-style: none;
14197
+ }
14198
+
14199
+ .EmptyStateStep {
14200
+ font-family: var(--sl-font-body-base-font-family);
14201
+ font-size: var(--sl-font-body-base-font-size);
14202
+ font-weight: var(--sl-font-body-base-font-weight);
14203
+ line-height: var(--sl-font-body-base-line-height);
14204
+ letter-spacing: var(--sl-font-body-base-letter-spacing);
14205
+ display: flex;
14206
+ align-items: flex-start;
14207
+ gap: var(--sl-space-3);
14208
+ }
14209
+
14210
+ .EmptyStateStep b,
14211
+ .EmptyStateStep strong {
14212
+ font-weight: var(--sl-font-weight-semibold);
14213
+ }
14214
+
14215
+ .EmptyStateStepNumber {
14216
+ font-family: var(--sl-font-figures-condense-font-family);
14217
+ font-size: var(--sl-font-figures-condense-font-size);
14218
+ font-weight: var(--sl-font-figures-condense-font-weight);
14219
+ line-height: var(--sl-font-figures-condense-line-height);
14220
+ letter-spacing: var(--sl-font-figures-condense-letter-spacing);
14221
+ font-variant-numeric: var(--sl-font-figures-condense-font-variant-numeric);
14222
+ display: inline-flex;
14223
+ flex-shrink: 0;
14224
+ align-items: center;
14225
+ justify-content: center;
14226
+ width: var(--sl-space-7);
14227
+ height: var(--sl-space-7);
14228
+ margin-block-start: calc(var(--sl-space-0-5) * -1);
14229
+ border: var(--sl-stroke-default) solid var(--sl-border-strong);
14230
+ border-radius: var(--sl-radius-control);
14231
+ font-weight: var(--sl-font-weight-semibold);
14232
+ }
14233
+
14234
+ .EmptyStateStepText {
14235
+ min-width: 0;
14236
+ }
14237
+
14238
+ .EmptyStateTerms {
14239
+ display: flex;
14240
+ flex-direction: column;
14241
+ margin: var(--sl-space-2) 0 0;
14242
+ }
14243
+
14244
+ .EmptyStateTerm {
14245
+ font-family: var(--sl-font-body-condense-font-family);
14246
+ font-size: var(--sl-font-body-condense-font-size);
14247
+ font-weight: var(--sl-font-body-condense-font-weight);
14248
+ line-height: var(--sl-font-body-condense-line-height);
14249
+ letter-spacing: var(--sl-font-body-condense-letter-spacing);
14250
+ display: flex;
14251
+ flex-direction: column;
14252
+ padding-block: var(--sl-space-2);
14253
+ border-bottom: var(--sl-stroke-default) solid var(--sl-border-subtle);
14254
+ }
14255
+
14256
+ .EmptyStateTerm dt {
14257
+ font-weight: var(--sl-font-weight-semibold);
14258
+ color: var(--sl-text-primary);
14259
+ }
14260
+
14261
+ .EmptyStateTerm dd {
14262
+ margin: 0;
14263
+ color: var(--sl-text-secondary);
14264
+ }
14265
+
14266
+ .EmptyStatePreview {
14267
+ min-width: 0;
14268
+ pointer-events: none;
14269
+ user-select: none;
14270
+ }
14271
+
14272
+ .EmptyStatePreviewCaption {
14273
+ font-family: var(--sl-font-body-minimize-font-family);
14274
+ font-size: var(--sl-font-body-minimize-font-size);
14275
+ font-weight: var(--sl-font-body-minimize-font-weight);
14276
+ line-height: var(--sl-font-body-minimize-line-height);
14277
+ letter-spacing: var(--sl-font-body-minimize-letter-spacing);
14278
+ margin: var(--sl-space-1-5) 0 0;
14279
+ color: var(--sl-text-secondary);
14280
+ }
14281
+
14282
+ /* Narrow: one column, the terms under the steps with a hairline between. */
14283
+ @container (max-width: 45rem) {
14284
+ .EmptyStateGuide {
14285
+ grid-template-columns: minmax(0, 1fr);
14286
+ }
14287
+
14288
+ .EmptyStateGuide > * + * {
14289
+ margin-inline-start: 0;
14290
+ padding-inline-start: 0;
14291
+ border-inline-start: 0;
14292
+ margin-block-start: var(--sl-space-4);
14293
+ border-top: var(--sl-stroke-default) solid var(--sl-border-subtle);
14294
+ }
14295
+
14296
+ .EmptyState[data-layout='report'] .EmptyStateActions {
14297
+ align-items: flex-start;
14298
+ }
14299
+
14300
+ .EmptyStateActionRow {
14301
+ justify-content: flex-start;
14302
+ }
14303
+ }
14304
+
14305
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
13998
14306
  /* Table - Mojave Theme
13999
14307
  *
14000
14308
  * Base UI has no table, so this styles the native <table class="Table"> elements with the
@@ -14275,7 +14583,7 @@ textarea.FieldControl {
14275
14583
  color: inherit;
14276
14584
  }
14277
14585
 
14278
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
14586
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
14279
14587
  /* Collection
14280
14588
  *
14281
14589
  * DataTable, DataList, the toolbar and the pagination, in one place so the two views
@@ -14286,7 +14594,7 @@ textarea.FieldControl {
14286
14594
  * the tabs and the search where they are, so selecting rows does not grow the toolbar.
14287
14595
  */
14288
14596
 
14289
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
14597
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
14290
14598
  /* Collection toolbar
14291
14599
  *
14292
14600
  * The wrap follows the toolbar's own width, not the window: a table in a narrow pane wraps
@@ -14498,7 +14806,7 @@ textarea.FieldControl {
14498
14806
  margin-inline-start: auto;
14499
14807
  }
14500
14808
 
14501
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
14809
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
14502
14810
  /* DataTable additions on top of .Table.
14503
14811
  *
14504
14812
  * Sort buttons fill the header cell and inherit its hover, so old aria-sort markup keeps
@@ -14534,6 +14842,10 @@ textarea.FieldControl {
14534
14842
  background: transparent;
14535
14843
  color: inherit;
14536
14844
  font: inherit;
14845
+ /* A button's own text-transform and letter-spacing reset the header's, so a caps header
14846
+ * (headerStyle="caps") showed sortable columns in mixed case. Inherit them like the font. */
14847
+ text-transform: inherit;
14848
+ letter-spacing: inherit;
14537
14849
  text-align: inherit;
14538
14850
  cursor: pointer;
14539
14851
  }
@@ -14698,7 +15010,38 @@ textarea.FieldControl {
14698
15010
  }
14699
15011
  }
14700
15012
 
14701
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
15013
+ /* Placeholder rows (placeholderRows): the table's shape before there is data. The real column
15014
+ * headers in the tertiary text color, then plain bars where the values will be: border-subtle
15015
+ * bars, border-default on subtotal rows so the section rhythm shows. 8px bars at the cell's
15016
+ * alignment, so a figures column's bars hug the end like its numbers will. No hover, no
15017
+ * pointer: the table is aria-hidden and nothing in it works. */
15018
+ .DataTable[data-placeholder] {
15019
+ pointer-events: none;
15020
+ user-select: none;
15021
+ }
15022
+
15023
+ .DataTable[data-placeholder] thead th {
15024
+ color: var(--sl-text-tertiary);
15025
+ }
15026
+
15027
+ .DataTable[data-placeholder] td {
15028
+ line-height: 0;
15029
+ }
15030
+
15031
+ .DataTablePlaceholderBar {
15032
+ display: inline-block;
15033
+ max-inline-size: 100%;
15034
+ block-size: var(--sl-space-2);
15035
+ border-radius: var(--sl-radius-minimal);
15036
+ background: var(--sl-border-subtle);
15037
+ vertical-align: middle;
15038
+ }
15039
+
15040
+ .DataTable[data-placeholder] [data-placeholder-row='subtotal'] .DataTablePlaceholderBar {
15041
+ background: var(--sl-border-default);
15042
+ }
15043
+
15044
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
14702
15045
  /* DataList
14703
15046
  *
14704
15047
  * The same rows as the table, in one container with the table's borders, hover, selected
@@ -14840,7 +15183,7 @@ textarea.FieldControl {
14840
15183
  transition: opacity var(--sl-duration-fast) var(--sl-easing-default);
14841
15184
  }
14842
15185
 
14843
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
15186
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
14844
15187
  /* Collection cards
14845
15188
  *
14846
15189
  * The page of a collection as a grid. Columns fill the width, none narrower than
@@ -14865,7 +15208,7 @@ textarea.FieldControl {
14865
15208
  flex: 1 1 auto;
14866
15209
  }
14867
15210
 
14868
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
15211
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
14869
15212
  /* Pagination
14870
15213
  *
14871
15214
  * Not tied to a collection. Anything with a page, a page count and a total can use it.
@@ -14890,7 +15233,7 @@ textarea.FieldControl {
14890
15233
  margin: 0;
14891
15234
  }
14892
15235
 
14893
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
15236
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
14894
15237
  /* EditableList
14895
15238
  *
14896
15239
  * One table at every width, so a field is not submitted twice. Under the stack width each
@@ -14989,7 +15332,7 @@ textarea.FieldControl {
14989
15332
  }
14990
15333
  }
14991
15334
 
14992
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
15335
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
14993
15336
  /* Sheet
14994
15337
  *
14995
15338
  * A working-paper surface: the raised surface with a heavier rule across its top
@@ -15107,7 +15450,7 @@ textarea.FieldControl {
15107
15450
  border-top: 0;
15108
15451
  }
15109
15452
 
15110
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
15453
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
15111
15454
  /* StatFigure
15112
15455
  *
15113
15456
  * One large figure with a caps label above and a caption under it. The label is
@@ -15168,7 +15511,7 @@ textarea.FieldControl {
15168
15511
  color: var(--sl-stat-figure-caption-color);
15169
15512
  }
15170
15513
 
15171
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
15514
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
15172
15515
  /* StatCard
15173
15516
  *
15174
15517
  * A card for one thing a page lists: a name (the heading), a caption, and a row of StatFigures
@@ -15330,7 +15673,7 @@ textarea.FieldControl {
15330
15673
  white-space: nowrap;
15331
15674
  }
15332
15675
 
15333
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
15676
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
15334
15677
  /* DescriptionList
15335
15678
  *
15336
15679
  * Label and value pairs in a native dl, one DescriptionItem (a div holding a dt and a dd)
@@ -15408,7 +15751,7 @@ textarea.FieldControl {
15408
15751
  text-align: end;
15409
15752
  }
15410
15753
 
15411
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
15754
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
15412
15755
  /* FormGrid
15413
15756
  *
15414
15757
  * Fields on a grid. Columns are as wide as the space allows up to --form-grid-columns
@@ -15445,7 +15788,7 @@ textarea.FieldControl {
15445
15788
  align-self: end;
15446
15789
  }
15447
15790
 
15448
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
15791
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
15449
15792
  /* Notice
15450
15793
  *
15451
15794
  * A message in the page: a thick leading edge and a tinted ground. data-status picks the
@@ -15501,7 +15844,271 @@ textarea.FieldControl {
15501
15844
  --notice-ground: var(--sl-surface-tray);
15502
15845
  }
15503
15846
 
15504
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
15847
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
15848
+ /* ChecklistNotice
15849
+ *
15850
+ * A Notice with a list of pass/fail rows. The title is subtitle-condense; each row is a mark
15851
+ * (check or close) and the label in body-condense, with an optional detail line in the
15852
+ * secondary color. Rows are split by a hairline. A passed row's mark is the success color,
15853
+ * a failed one's the error color, so the two differ in lightness as well as hue in every
15854
+ * theme; the visually hidden "Done" / "Not done" carries the state for assistive tech.
15855
+ */
15856
+
15857
+ .ChecklistNotice {
15858
+ display: flex;
15859
+ flex-direction: column;
15860
+ gap: var(--sl-space-2);
15861
+ }
15862
+
15863
+ .ChecklistNoticeTitle {
15864
+ font-family: var(--sl-font-subtitle-condense-font-family);
15865
+ font-size: var(--sl-font-subtitle-condense-font-size);
15866
+ font-weight: var(--sl-font-subtitle-condense-font-weight);
15867
+ line-height: var(--sl-font-subtitle-condense-line-height);
15868
+ letter-spacing: var(--sl-font-subtitle-condense-letter-spacing);
15869
+ margin: 0;
15870
+ }
15871
+
15872
+ .ChecklistNoticeList {
15873
+ display: flex;
15874
+ flex-direction: column;
15875
+ margin: 0;
15876
+ padding: 0;
15877
+ list-style: none;
15878
+ }
15879
+
15880
+ .ChecklistNoticeItem {
15881
+ font-family: var(--sl-font-body-condense-font-family);
15882
+ font-size: var(--sl-font-body-condense-font-size);
15883
+ font-weight: var(--sl-font-body-condense-font-weight);
15884
+ line-height: var(--sl-font-body-condense-line-height);
15885
+ letter-spacing: var(--sl-font-body-condense-letter-spacing);
15886
+ display: flex;
15887
+ align-items: flex-start;
15888
+ gap: var(--sl-space-2);
15889
+ padding-block: var(--sl-space-1-5);
15890
+ border-top: var(--sl-stroke-default) solid var(--sl-border-subtle);
15891
+ }
15892
+
15893
+ .ChecklistNoticeMark {
15894
+ flex-shrink: 0;
15895
+ width: var(--sl-icon-size-condense);
15896
+ height: var(--sl-icon-size-condense);
15897
+ font-size: var(--sl-icon-size-condense);
15898
+ line-height: inherit;
15899
+ font-weight: var(--sl-font-weight-semibold);
15900
+ color: var(--sl-status-error-dark);
15901
+ }
15902
+
15903
+ .ChecklistNoticeItem[data-passed] .ChecklistNoticeMark {
15904
+ color: var(--sl-status-success-dark);
15905
+ }
15906
+
15907
+ .ChecklistNoticeText {
15908
+ display: flex;
15909
+ flex-direction: column;
15910
+ min-width: 0;
15911
+ }
15912
+
15913
+ .ChecklistNoticeDetail {
15914
+ color: var(--sl-text-secondary);
15915
+ }
15916
+
15917
+ .ChecklistNoticeFooter {
15918
+ display: flex;
15919
+ flex-wrap: wrap;
15920
+ align-items: center;
15921
+ gap: var(--sl-space-2);
15922
+ }
15923
+
15924
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
15925
+ /* ParameterBar
15926
+ *
15927
+ * Settings for a result, in one wrapping row on the tray: the app's fields at the start, the
15928
+ * status line, the Run button and any extra actions at the end. Fields align on their controls
15929
+ * (align-items: flex-end), so a field with a description does not push its neighbours' inputs
15930
+ * down. When the bar is narrow the end group wraps onto its own line, at the start.
15931
+ *
15932
+ * data-changed (a setting changed since the last run) turns the status line to the warning
15933
+ * text color. The bar itself does not dim anything; the app dims its own stale result.
15934
+ *
15935
+ * ParameterBarLocked is a fixed setting: the field label over the value as text with a lock,
15936
+ * on no box, at the control's height so it lines up with the inputs beside it.
15937
+ */
15938
+
15939
+ .ParameterBar {
15940
+ display: flex;
15941
+ flex-wrap: wrap;
15942
+ align-items: flex-end;
15943
+ gap: var(--sl-space-3) var(--sl-space-4);
15944
+ margin: 0;
15945
+ padding: var(--sl-space-3) var(--sl-space-4);
15946
+ border: var(--sl-stroke-default) solid var(--sl-border-default);
15947
+ background: var(--sl-surface-tray);
15948
+ }
15949
+
15950
+ .ParameterBarFields {
15951
+ display: flex;
15952
+ flex: 1 1 auto;
15953
+ flex-wrap: wrap;
15954
+ align-items: flex-end;
15955
+ gap: var(--sl-space-3) var(--sl-space-4);
15956
+ min-width: 0;
15957
+ }
15958
+
15959
+ /* A field in the bar keeps its own width; it does not stretch across the row. */
15960
+ .ParameterBarFields > .FieldRoot {
15961
+ flex: 0 1 auto;
15962
+ }
15963
+
15964
+ .ParameterBarEnd {
15965
+ display: flex;
15966
+ flex-wrap: wrap;
15967
+ align-items: center;
15968
+ gap: var(--sl-space-2) var(--sl-space-3);
15969
+ margin-inline-start: auto;
15970
+ }
15971
+
15972
+ .ParameterBarStatus {
15973
+ font-family: var(--sl-font-body-condense-font-family);
15974
+ font-size: var(--sl-font-body-condense-font-size);
15975
+ font-weight: var(--sl-font-body-condense-font-weight);
15976
+ line-height: var(--sl-font-body-condense-line-height);
15977
+ letter-spacing: var(--sl-font-body-condense-letter-spacing);
15978
+ margin: 0;
15979
+ color: var(--sl-text-secondary);
15980
+ }
15981
+
15982
+ .ParameterBarStatus:empty {
15983
+ display: none;
15984
+ }
15985
+
15986
+ .ParameterBar[data-changed] .ParameterBarStatus {
15987
+ color: var(--sl-status-warning-dark);
15988
+ }
15989
+
15990
+ .ParameterBarLocked {
15991
+ display: flex;
15992
+ flex-direction: column;
15993
+ gap: var(--sl-field-gap);
15994
+ min-width: 0;
15995
+ }
15996
+
15997
+ .ParameterBarLockedValue {
15998
+ font-family: var(--sl-font-body-base-font-family);
15999
+ font-size: var(--sl-font-body-base-font-size);
16000
+ font-weight: var(--sl-font-body-base-font-weight);
16001
+ line-height: var(--sl-font-body-base-line-height);
16002
+ letter-spacing: var(--sl-font-body-base-letter-spacing);
16003
+ display: inline-flex;
16004
+ align-items: center;
16005
+ gap: var(--sl-space-1-5);
16006
+ height: var(--sl-control-height-md);
16007
+ color: var(--sl-text-primary);
16008
+ white-space: nowrap;
16009
+ }
16010
+
16011
+ .ParameterBarLockedValue .material-symbols-outlined {
16012
+ width: var(--sl-icon-size-condense);
16013
+ height: var(--sl-icon-size-condense);
16014
+ font-size: var(--sl-icon-size-condense);
16015
+ color: var(--sl-text-secondary);
16016
+ }
16017
+
16018
+ .ParameterBarLockedText {
16019
+ overflow: hidden;
16020
+ text-overflow: ellipsis;
16021
+ }
16022
+
16023
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
16024
+ /* LineItemGrid
16025
+ *
16026
+ * Editable lines (a journal entry, an invoice) on the Table styles. Cells hold controls, so
16027
+ * their padding drops to the table's block padding and the controls fill the cell. The
16028
+ * line-number column is narrow and in the tertiary color; the remove column is as narrow as
16029
+ * its button. Footer rows stick to the bottom of the scroll box (maxHeight caps it): the
16030
+ * table clips instead of hiding its overflow, because overflow: hidden would make the table
16031
+ * the scroll container and the footer would never stick.
16032
+ *
16033
+ * A footer row's data-tone colors its figures with the status text colors (the -dark steps,
16034
+ * which pass as text on the tray). The words in the cell carry the state; color only adds.
16035
+ */
16036
+
16037
+ .LineItemGrid {
16038
+ display: flex;
16039
+ flex-direction: column;
16040
+ gap: var(--sl-space-2);
16041
+ min-width: 0;
16042
+ }
16043
+
16044
+ .LineItemGridScroll {
16045
+ overflow: auto;
16046
+ max-width: 100%;
16047
+ }
16048
+
16049
+ .LineItemGridTable {
16050
+ overflow: clip;
16051
+ table-layout: fixed;
16052
+ min-width: 40rem;
16053
+ }
16054
+
16055
+ .LineItemGrid[data-read-only] .LineItemGridTable {
16056
+ table-layout: auto;
16057
+ }
16058
+
16059
+ .LineItemGridTable > tbody > tr > td {
16060
+ padding-block: var(--sl-space-1);
16061
+ vertical-align: middle;
16062
+ }
16063
+
16064
+ /* A control fills its cell. */
16065
+ .LineItemGridTable > tbody > tr > td > :is(.Input, .FieldRoot, .ComboboxRoot, .MoneyField, .SelectTrigger) {
16066
+ width: 100%;
16067
+ }
16068
+
16069
+ .LineItemGridNumberCol {
16070
+ width: var(--sl-space-10);
16071
+ }
16072
+
16073
+ .LineItemGridRemoveCol {
16074
+ width: var(--sl-space-14);
16075
+ }
16076
+
16077
+ .LineItemGridNumber {
16078
+ color: var(--sl-text-tertiary);
16079
+ font-variant-numeric: tabular-nums;
16080
+ }
16081
+
16082
+ .LineItemGridRemove {
16083
+ text-align: center;
16084
+ }
16085
+
16086
+ .LineItemGridTable > tfoot > tr > * {
16087
+ position: sticky;
16088
+ bottom: 0;
16089
+ z-index: 1;
16090
+ background: var(--sl-table-header-background);
16091
+ font-weight: var(--sl-font-weight-semibold);
16092
+ }
16093
+
16094
+ /* Stacked footer rows stick one above the other: the last at the bottom, the one before over it. */
16095
+ .LineItemGridTable > tfoot > tr:not(:last-child) > * {
16096
+ bottom: var(--sl-table-row-height);
16097
+ }
16098
+
16099
+ .LineItemGridTable > tfoot > tr[data-tone='success'] > [data-align='end'] {
16100
+ color: var(--sl-status-success-dark);
16101
+ }
16102
+
16103
+ .LineItemGridTable > tfoot > tr[data-tone='error'] > [data-align='end'] {
16104
+ color: var(--sl-status-error-dark);
16105
+ }
16106
+
16107
+ .LineItemGridAdd {
16108
+ display: flex;
16109
+ }
16110
+
16111
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
15505
16112
  /* Spinner
15506
16113
  *
15507
16114
  * A ring that turns: the track in the subtle border, the moving arc in the accent border.
@@ -15537,7 +16144,7 @@ textarea.FieldControl {
15537
16144
  }
15538
16145
  }
15539
16146
 
15540
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
16147
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
15541
16148
  /* AppBar
15542
16149
  *
15543
16150
  * The bar across the top of an app window, one row on a line in the rule color. The line is
@@ -15571,7 +16178,7 @@ textarea.FieldControl {
15571
16178
  background: var(--sl-app-bar-divider-color);
15572
16179
  }
15573
16180
 
15574
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
16181
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
15575
16182
  /* PickerButton
15576
16183
  *
15577
16184
  * A trigger with a caps label before the current choice: CLIENT Alpha Services. The field
@@ -15671,7 +16278,7 @@ textarea.FieldControl {
15671
16278
  transform: rotate(180deg);
15672
16279
  }
15673
16280
 
15674
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
16281
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
15675
16282
  /* MultiSelect
15676
16283
  *
15677
16284
  * A PickerButton trigger that opens a popover of checkbox rows (label, count at the end) and a
@@ -15725,7 +16332,7 @@ textarea.FieldControl {
15725
16332
  border-top: 1px solid var(--sl-popup-separator-color);
15726
16333
  }
15727
16334
 
15728
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
16335
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
15729
16336
  /* PickerSplit
15730
16337
  *
15731
16338
  * A PickerButton whose choice is itself a control: the main part (CLIENT Alpha Services) acts,
@@ -15823,7 +16430,7 @@ textarea.FieldControl {
15823
16430
  transform: rotate(180deg);
15824
16431
  }
15825
16432
 
15826
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
16433
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
15827
16434
  /* SplitButton
15828
16435
  *
15829
16436
  * A Button and a square Menu trigger side by side, joined into one outline: the inner corners
@@ -15847,7 +16454,7 @@ textarea.FieldControl {
15847
16454
  margin-inline-start: -1px;
15848
16455
  }
15849
16456
 
15850
- /* @scattered-light/loomiere-base-ui 0.24.0 · styles for @base-ui/react 1.9.0 */
16457
+ /* @scattered-light/loomiere-base-ui 0.25.0 · styles for @base-ui/react 1.9.0 */
15851
16458
  /* SideNav
15852
16459
  *
15853
16460
  * The column of links down the side of a workspace. Rows are ruled apart with a hairline; the