@scattered-light/loomiere-mojave 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/exports/AGENTS.md +8 -5
  2. package/dist/exports/catalog.json +6 -0
  3. package/dist/exports/design-system/README.md +8 -5
  4. package/dist/exports/design-system/components/Collection/README.md +1 -1
  5. package/dist/exports/design-system/components/CollectionToolbar/README.md +7 -2
  6. package/dist/exports/design-system/components/ContextMenu/README.md +1 -1
  7. package/dist/exports/design-system/components/ContextMenu/preview.html +1 -1
  8. package/dist/exports/design-system/components/DataList/README.md +1 -1
  9. package/dist/exports/design-system/components/DataList/preview.html +171 -171
  10. package/dist/exports/design-system/components/DataTable/README.md +1 -1
  11. package/dist/exports/design-system/components/DataTable/preview.html +176 -176
  12. package/dist/exports/design-system/components/DescriptionList/README.md +41 -0
  13. package/dist/exports/design-system/components/DescriptionList/preview.html +19 -0
  14. package/dist/exports/design-system/components/Drawer/README.md +1 -1
  15. package/dist/exports/design-system/components/ScrollArea/preview.html +2 -2
  16. package/dist/exports/design-system/components/Sheet/README.md +46 -0
  17. package/dist/exports/design-system/components/Sheet/preview.html +19 -0
  18. package/dist/exports/design-system/components/StatFigure/README.md +38 -0
  19. package/dist/exports/design-system/components/StatFigure/preview.html +19 -0
  20. package/dist/exports/design-system/components/Table/README.md +2 -2
  21. package/dist/exports/design-system/components/Table/preview.html +2 -2
  22. package/dist/exports/design-system/components/bundle.css +708 -165
  23. package/dist/exports/design-system/components/bundle.js +7 -7
  24. package/dist/exports/design-system/components/index.d.ts +1 -1
  25. package/dist/exports/design-system/tokens.json +35 -0
  26. package/dist/exports/figma.json +1 -1
  27. package/dist/exports/tailwind.css +81 -0
  28. package/dist/exports/tokens.dtcg.json +317 -26
  29. package/dist/tokens.css +221 -105
  30. package/dist/tokens.d.ts +79 -0
  31. package/dist/tokens.js +80 -1
  32. package/dist/tokens.json +588 -27
  33. package/dist/utilities.css +30 -0
  34. package/package.json +2 -2
@@ -94,6 +94,7 @@
94
94
  --sl-letter-spacing-normal: 0; /** Body text. */
95
95
  --sl-letter-spacing-wide: 0.025em; /** Small text that needs air. */
96
96
  --sl-letter-spacing-wider: 0.05em; /** Small caps and labels. */
97
+ --sl-letter-spacing-caps: 0.08em; /** Uppercase labels that sit beside figures, such as a column head or a working-paper caption. Between wider and widest. */
97
98
  --sl-letter-spacing-widest: 0.1em; /** Uppercase group labels. */
98
99
  --sl-font-family-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; /** Platform UI font. Fallback when a brand typeface is unavailable. */
99
100
  --sl-font-family-serif: ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif; /** Platform serif stack. */
@@ -764,8 +765,12 @@
764
765
  --sl-popup-scale-closed: 0.95; /** Popups grow from just under full size as they open, so they seem to come from the trigger. */
765
766
  --sl-popup-list-max-height: 300px; /** A long list scrolls inside the popup after about seven rows. */
766
767
  --sl-popup-min-width: 200px; /** Narrowest a free-floating popup or menu gets, so short labels don't make a sliver. */
768
+ --sl-rule-width: 0px; /** Thickness of the top rule. 0 turns it off and leaves every top edge as it was. Point it at a stroke step (stroke.medium or stroke.thick) to turn it on. */
767
769
  --sl-color-scheme: light; /** Which way native browser parts (scrollbars, date pickers, autofill) draw: light, or dark wherever the dark theme is on. Set as color-scheme on the root and handed to AG Grid's browserColorScheme, so they follow data-theme as well as the system setting. */
770
+ --sl-font-figures-base-font-variant-numeric: tabular-nums; /** font-variant-numeric of font.figures-base. */
771
+ --sl-font-figures-condense-font-variant-numeric: tabular-nums; /** font-variant-numeric of font.figures-condense. */
768
772
  --sl-font-eyebrow-condense-text-transform: uppercase; /** text-transform of font.eyebrow-condense. */
773
+ --sl-font-caps-condense-text-transform: uppercase; /** text-transform of font.caps-condense. */
769
774
  --sl-font-eyebrow-minimize-text-transform: uppercase; /** text-transform of font.eyebrow-minimize. */
770
775
  --sl-emphasis-standard-bg: transparent; /** standard in default: outline in accent (primary) */
771
776
  --sl-emphasis-quiet-bg: transparent; /** quiet in default: outline in chrome (neutral) */
@@ -780,6 +785,7 @@
780
785
  --sl-status-level-error-standard-bg: transparent; /** standard in error: outline in error */
781
786
  --sl-status-level-error-quiet-bg: transparent; /** quiet in error: outline in error */
782
787
  --sl-button-opacity-disabled: 0.5; /** A disabled button fades as a whole, keeping its shape so the layout doesn't jump. */
788
+ --sl-description-list-label-width: minmax(8rem, 1fr); /** The label column in the default variant. The value column takes twice the room. */
783
789
  --sl-drawer-popup-size: min(420px, 90vw); /** Width of a side drawer. A bottom or top drawer sizes to its content up to max-size. */
784
790
  --sl-drawer-popup-max-size: 85vh; /** Tallest a bottom or top drawer gets, leaving the page visible above it. */
785
791
  --sl-list-detail-split-min-width: 720px; /** Side by side once this element, not the window, is this wide. Dryden used 1100px of the window. A container needs less: a list around 320px and a form around 400px still read at 720px. Narrower, the detail becomes a drawer or a page. */
@@ -1444,7 +1450,6 @@
1444
1450
  --sl-vision-achromatopsia-color-data-19: var(--sl-vision-achromatopsia-color-data-chartreuse); /** Data series 19: chartreuse. Categorical; use in order. */
1445
1451
  --sl-vision-achromatopsia-color-data-20: var(--sl-vision-achromatopsia-color-data-ivory); /** Data series 20: ivory. Categorical; use in order. */
1446
1452
  --sl-focus-ring-width: var(--sl-a11y-focus-outline-width); /** Alias for the focus outline width, kept for components that style rings with box-shadow. */
1447
- --sl-focus-outline: var(--sl-a11y-focus-outline-width) solid var(--sl-focus-ring); /** The one keyboard focus ring. Every control uses it, outside or inset. */
1448
1453
  --sl-focus-outline-offset: var(--sl-a11y-focus-outline-offset); /** Outside ring: a gap between the control and the ring so it never blends into the control border. The default. */
1449
1454
  --sl-focus-outline-offset-inset: calc(-1 * var(--sl-a11y-focus-outline-width)); /** Inset ring: drawn just inside the control's edge, for controls packed into a container (menus, tab lists, steppers) where an outside ring would be clipped or overlap a neighbor. */
1450
1455
  --sl-focus-halo-spread: calc(var(--sl-a11y-focus-outline-offset) + var(--sl-a11y-focus-outline-width) + 2px); /** A soft glow just outside the focus ring: the gap, the ring, then 2px of tint. The ring carries the contrast (WCAG 1.4.11), so the glow can stay pale. */
@@ -1549,6 +1554,7 @@
1549
1554
  --sl-spacing-stack-md: var(--sl-space-6);
1550
1555
  --sl-spacing-stack-sm: var(--sl-space-4);
1551
1556
  --sl-spacing-stack-xs: var(--sl-space-2);
1557
+ --sl-table-grand-total-rule-width: var(--sl-stroke-thick); /** The double line under a grand total row (tr data-total="grand"). It is drawn as a CSS double border, which needs at least 3px to show two strokes. */
1552
1558
  --sl-font-body-base-font-family: var(--sl-font-family-body); /** font-family of font.body-base. */
1553
1559
  --sl-font-body-base-font-size: var(--sl-font-size-md); /** font-size of font.body-base. */
1554
1560
  --sl-font-body-base-font-weight: var(--sl-font-weight-normal); /** font-weight of font.body-base. */
@@ -1584,11 +1590,21 @@
1584
1590
  --sl-font-title-base-font-weight: var(--sl-font-weight-semibold); /** font-weight of font.title-base. */
1585
1591
  --sl-font-title-base-line-height: var(--sl-line-height-md); /** line-height of font.title-base. */
1586
1592
  --sl-font-title-base-letter-spacing: var(--sl-letter-spacing-normal); /** letter-spacing of font.title-base. */
1593
+ --sl-font-figures-base-font-family: var(--sl-font-family-mono); /** font-family of font.figures-base. */
1594
+ --sl-font-figures-base-font-size: var(--sl-font-size-md); /** font-size of font.figures-base. */
1595
+ --sl-font-figures-base-font-weight: var(--sl-font-weight-normal); /** font-weight of font.figures-base. */
1596
+ --sl-font-figures-base-line-height: var(--sl-line-height-md); /** line-height of font.figures-base. */
1597
+ --sl-font-figures-base-letter-spacing: var(--sl-letter-spacing-normal); /** letter-spacing of font.figures-base. */
1587
1598
  --sl-font-code-condense-font-family: var(--sl-font-family-mono); /** font-family of font.code-condense. */
1588
1599
  --sl-font-code-condense-font-size: var(--sl-font-size-sm); /** font-size of font.code-condense. */
1589
1600
  --sl-font-code-condense-font-weight: var(--sl-font-weight-normal); /** font-weight of font.code-condense. */
1590
1601
  --sl-font-code-condense-line-height: var(--sl-line-height-sm); /** line-height of font.code-condense. */
1591
1602
  --sl-font-code-condense-letter-spacing: var(--sl-letter-spacing-normal); /** letter-spacing of font.code-condense. */
1603
+ --sl-font-figures-condense-font-family: var(--sl-font-family-mono); /** font-family of font.figures-condense. */
1604
+ --sl-font-figures-condense-font-size: var(--sl-font-size-sm); /** font-size of font.figures-condense. */
1605
+ --sl-font-figures-condense-font-weight: var(--sl-font-weight-normal); /** font-weight of font.figures-condense. */
1606
+ --sl-font-figures-condense-line-height: var(--sl-line-height-sm); /** line-height of font.figures-condense. */
1607
+ --sl-font-figures-condense-letter-spacing: var(--sl-letter-spacing-normal); /** letter-spacing of font.figures-condense. */
1592
1608
  --sl-font-body-condense-font-family: var(--sl-font-family-body); /** font-family of font.body-condense. */
1593
1609
  --sl-font-body-condense-font-size: var(--sl-font-size-sm); /** font-size of font.body-condense. */
1594
1610
  --sl-font-body-condense-font-weight: var(--sl-font-weight-normal); /** font-weight of font.body-condense. */
@@ -1619,6 +1635,11 @@
1619
1635
  --sl-font-eyebrow-condense-font-weight: var(--sl-font-weight-semibold); /** font-weight of font.eyebrow-condense. */
1620
1636
  --sl-font-eyebrow-condense-line-height: var(--sl-line-height-sm); /** line-height of font.eyebrow-condense. */
1621
1637
  --sl-font-eyebrow-condense-letter-spacing: var(--sl-letter-spacing-wider); /** letter-spacing of font.eyebrow-condense. */
1638
+ --sl-font-caps-condense-font-family: var(--sl-font-family-body); /** font-family of font.caps-condense. */
1639
+ --sl-font-caps-condense-font-size: var(--sl-font-size-sm); /** font-size of font.caps-condense. */
1640
+ --sl-font-caps-condense-font-weight: var(--sl-font-weight-semibold); /** font-weight of font.caps-condense. */
1641
+ --sl-font-caps-condense-line-height: var(--sl-line-height-sm); /** line-height of font.caps-condense. */
1642
+ --sl-font-caps-condense-letter-spacing: var(--sl-letter-spacing-caps); /** letter-spacing of font.caps-condense. */
1622
1643
  --sl-font-title-condense-font-family: var(--sl-font-family-display); /** font-family of font.title-condense. */
1623
1644
  --sl-font-title-condense-font-size: var(--sl-font-size-sm); /** font-size of font.title-condense. */
1624
1645
  --sl-font-title-condense-font-weight: var(--sl-font-weight-semibold); /** font-weight of font.title-condense. */
@@ -1659,6 +1680,111 @@
1659
1680
  --sl-font-link-minimize-font-weight: var(--sl-font-weight-normal); /** font-weight of font.link-minimize. */
1660
1681
  --sl-font-link-minimize-line-height: var(--sl-line-height-xs); /** line-height of font.link-minimize. */
1661
1682
  --sl-font-link-minimize-letter-spacing: var(--sl-letter-spacing-normal); /** letter-spacing of font.link-minimize. */
1683
+ --sl-a11y-focus-ring-radius: var(--sl-radius-focus); /** Rounds the focus ring to match the small control radius. */
1684
+ --sl-bar-radius: var(--sl-radius-surface); /** Strip corners. Controls inside a toggle group take radius.item, so the inner corners follow the outer ones. */
1685
+ --sl-calendar-day-radius: var(--sl-radius-pill); /** Selected days are circles. The pill radius is the same full radius badges and switches use. */
1686
+ --sl-check-border-width: var(--sl-stroke-default); /** Edge thickness. */
1687
+ --sl-check-radius: var(--sl-radius-box); /** Checkbox corners. Radios are always round. */
1688
+ --sl-check-transition: var(--sl-transition-input); /** Changes at the same speed as a field. */
1689
+ --sl-status-error: var(--sl-scope-error-signal); /** Errors and destructive actions. */
1690
+ --sl-status-error-dark: var(--sl-scope-error-fg); /** Error color for text or icons that need more contrast than the base color. */
1691
+ --sl-status-error-light: var(--sl-scope-error-soft); /** Error tint for backgrounds behind error messages. */
1692
+ --sl-status-info: var(--sl-scope-info-signal); /** Neutral notices and help. */
1693
+ --sl-status-info-dark: var(--sl-scope-info-fg); /** Info color for text or icons that need more contrast. */
1694
+ --sl-status-info-light: var(--sl-scope-info-soft); /** Info tint for notice backgrounds. */
1695
+ --sl-status-success: var(--sl-scope-success-signal); /** Confirmations and completed states. */
1696
+ --sl-status-success-dark: var(--sl-scope-success-fg); /** Success color for text or icons that need more contrast. */
1697
+ --sl-status-success-light: var(--sl-scope-success-soft); /** Success tint for confirmation backgrounds. */
1698
+ --sl-status-warning: var(--sl-scope-warning-signal); /** Warnings, and the required-field marker. */
1699
+ --sl-status-warning-dark: var(--sl-scope-warning-fg); /** Warning color for text or icons that need more contrast. */
1700
+ --sl-status-warning-light: var(--sl-scope-warning-soft); /** Warning tint for caution backgrounds. */
1701
+ --sl-text-primary: var(--sl-scope-chrome-fg); /** Body text and headings. The highest-contrast neutral. */
1702
+ --sl-content-pre-radius: var(--sl-radius-surface); /** Code block corners, like any panel, so a brand that squares its surfaces squares code blocks too. */
1703
+ --sl-disclosure-indicator-width: var(--sl-stroke-emphasis); /** Selected tab line thickness. */
1704
+ --sl-field-border-width: var(--sl-stroke-default); /** Field edge thickness. */
1705
+ --sl-field-radius: var(--sl-radius-control); /** Field corners, the same as every other control. */
1706
+ --sl-field-transition: var(--sl-transition-input); /** Border and halo ease in, never snap. */
1707
+ --sl-gauge-radius: var(--sl-radius-pill); /** Round ends on the track and the fill. */
1708
+ --sl-icon-button-radius: var(--sl-radius-item); /** Rounded like a menu item, since its hover fill reads as a highlighted item. */
1709
+ --sl-icon-button-transition: var(--sl-transition-button); /** Responds as fast as a button. */
1710
+ --sl-item-radius: var(--sl-radius-item); /** Row corners inside the popup. */
1711
+ --sl-modal-border-width: var(--sl-stroke-default); /** Modal edge thickness. */
1712
+ --sl-modal-radius: var(--sl-radius-modal); /** The largest radius, so a modal reads as its own layer. A drawer rounds only the edge facing the page. */
1713
+ --sl-modal-shadow: var(--sl-elevation-xl); /** The deepest shadow, because a modal sits above everything but popups and toasts. */
1714
+ --sl-modal-backdrop: color-mix(in srgb, var(--sl-overlay-base) 50%, transparent); /** Scrim that dims the page behind a modal. */
1715
+ --sl-popup-border-width: var(--sl-stroke-default); /** Popup edge thickness. */
1716
+ --sl-popup-radius: var(--sl-radius-surface); /** Corners of a free-floating popup. */
1717
+ --sl-popup-radius-field: var(--sl-radius-control); /** Corners of a list that drops from a field, matching the field so the two read as one control. */
1718
+ --sl-popup-shadow: var(--sl-elevation-lg); /** Lifts the popup above the page. */
1719
+ --sl-popup-empty-padding-block: var(--sl-empty-padding-block-compact); /** Room around a plain 'No results' line. The same padding as a compact empty state, so a sentence and an EmptyState in that slot take the same space. An EmptyState drops this padding and uses its own. */
1720
+ --sl-table-row-height: var(--sl-control-height-sm); /** Row height: the small control height, so a checkbox, input or button in a cell fits without growing the row. */
1721
+ --sl-table-header-height: var(--sl-control-height-md); /** Header row height: the regular control height, a little taller than rows so the header reads as its own band. */
1722
+ --sl-table-cell-padding-inline: var(--sl-control-padding-inline-sm); /** Space either side of cell text, matching small controls. */
1723
+ --sl-table-radius: var(--sl-radius-surface); /** Grid corners, like any card or panel. */
1724
+ --sl-table-subtotal-rule-width: var(--sl-stroke-default); /** The single line above a subtotal row (tr data-total="subtotal"), the line an accountant draws before adding a column. */
1725
+ --sl-font-body-base-font: var(--sl-font-body-base-font-weight) var(--sl-font-body-base-font-size) / var(--sl-font-body-base-line-height) var(--sl-font-body-base-font-family); /** Body copy in the base tier, the default UI and body text. As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
1726
+ --sl-font-selected-base-font: var(--sl-font-selected-base-font-weight) var(--sl-font-selected-base-font-size) / var(--sl-font-selected-base-line-height) var(--sl-font-selected-base-font-family); /** The selected or current item in the base tier (the default UI and body text): selected tabs and toggles, the current nav item or page. Base body text at semibold, so selection reads without changing size. As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
1727
+ --sl-font-label-base-font: var(--sl-font-label-base-font-weight) var(--sl-font-label-base-font-size) / var(--sl-font-label-base-line-height) var(--sl-font-label-base-font-family); /** Form labels in the base tier, the default UI and body text. As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
1728
+ --sl-font-link-base-font: var(--sl-font-link-base-font-weight) var(--sl-font-link-base-font-size) / var(--sl-font-link-base-line-height) var(--sl-font-link-base-font-family); /** Links in the base tier. The same type as base body text: a link stands out by color and underline, not by its type. As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
1729
+ --sl-font-subtitle-base-font: var(--sl-font-subtitle-base-font-weight) var(--sl-font-subtitle-base-font-size) / var(--sl-font-subtitle-base-line-height) var(--sl-font-subtitle-base-font-family); /** Subtitles in the base tier, the default UI and body text. As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
1730
+ --sl-font-trigger-base-font: var(--sl-font-trigger-base-font-weight) var(--sl-font-trigger-base-font-size) / var(--sl-font-trigger-base-line-height) var(--sl-font-trigger-base-font-family); /** Buttons and triggers in the base tier, the default UI and body text. As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
1731
+ --sl-font-title-base-font: var(--sl-font-title-base-font-weight) var(--sl-font-title-base-font-size) / var(--sl-font-title-base-line-height) var(--sl-font-title-base-font-family); /** Titles in the base tier: a toast, an accordion row, a list item heading. Titles use the display family; the tier sets the size. As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
1732
+ --sl-font-figures-base-font: var(--sl-font-figures-base-font-weight) var(--sl-font-figures-base-font-size) / var(--sl-font-figures-base-line-height) var(--sl-font-figures-base-font-family); /** Figures in the base tier: an amount beside base text, a balance in a card. The mono family with tabular numbers, so digits line up. As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
1733
+ --sl-font-code-condense-font: var(--sl-font-code-condense-font-weight) var(--sl-font-code-condense-font-size) / var(--sl-font-code-condense-line-height) var(--sl-font-code-condense-font-family); /** Code uses the mono family so characters line up. As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
1734
+ --sl-font-figures-condense-font: var(--sl-font-figures-condense-font-weight) var(--sl-font-figures-condense-font-size) / var(--sl-font-figures-condense-line-height) var(--sl-font-figures-condense-font-family); /** Figures in the condense tier: amounts and counts in tables and dense rows. The mono family with tabular numbers, so digits line up down a column. As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
1735
+ --sl-font-body-condense-font: var(--sl-font-body-condense-font-weight) var(--sl-font-body-condense-font-size) / var(--sl-font-body-condense-line-height) var(--sl-font-body-condense-font-family); /** Body copy in the condense tier, dense UI text (tables, secondary labels). As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
1736
+ --sl-font-trigger-condense-font: var(--sl-font-trigger-condense-font-weight) var(--sl-font-trigger-condense-font-size) / var(--sl-font-trigger-condense-line-height) var(--sl-font-trigger-condense-font-family); /** Buttons and triggers in the condense tier (dense UI): condense body text at medium, like base-trigger one tier down. As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
1737
+ --sl-font-selected-condense-font: var(--sl-font-selected-condense-font-weight) var(--sl-font-selected-condense-font-size) / var(--sl-font-selected-condense-line-height) var(--sl-font-selected-condense-font-family); /** The selected or current item in the condense tier (dense UI text): selected tabs and toggles, the current nav item or page. Condense body text at semibold, so selection reads without changing size. As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
1738
+ --sl-font-link-condense-font: var(--sl-font-link-condense-font-weight) var(--sl-font-link-condense-font-size) / var(--sl-font-link-condense-line-height) var(--sl-font-link-condense-font-family); /** Links in the condense tier. The same type as condense body text: a link stands out by color and underline, not by its type. As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
1739
+ --sl-font-subtitle-condense-font: var(--sl-font-subtitle-condense-font-weight) var(--sl-font-subtitle-condense-font-size) / var(--sl-font-subtitle-condense-line-height) var(--sl-font-subtitle-condense-font-family); /** Subtitles in the condense tier, dense UI text (tables, secondary labels). As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
1740
+ --sl-font-eyebrow-condense-font: var(--sl-font-eyebrow-condense-font-weight) var(--sl-font-eyebrow-condense-font-size) / var(--sl-font-eyebrow-condense-line-height) var(--sl-font-eyebrow-condense-font-family); /** Small uppercase eyebrow labels in the condense tier, dense UI text (tables, secondary labels). As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
1741
+ --sl-font-caps-condense-font: var(--sl-font-caps-condense-font-weight) var(--sl-font-caps-condense-font-size) / var(--sl-font-caps-condense-line-height) var(--sl-font-caps-condense-font-family); /** Caps labels in the condense tier: a working-paper caption, a column head over figures, a sheet's tab label. Uppercase and tracked a little wider than an eyebrow, so it reads as a label and not a heading. As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
1742
+ --sl-font-title-condense-font: var(--sl-font-title-condense-font-weight) var(--sl-font-title-condense-font-size) / var(--sl-font-title-condense-line-height) var(--sl-font-title-condense-font-family); /** Titles in the condense tier: group headers in tables, menus and dense panels. Titles use the display family; the tier sets the size. As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
1743
+ --sl-font-body-magnify-font: var(--sl-font-body-magnify-font-weight) var(--sl-font-body-magnify-font-size) / var(--sl-font-body-magnify-line-height) var(--sl-font-body-magnify-font-family); /** Body copy in the magnify tier, emphasized body text (lead paragraphs). As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
1744
+ --sl-font-trigger-magnify-font: var(--sl-font-trigger-magnify-font-weight) var(--sl-font-trigger-magnify-font-size) / var(--sl-font-trigger-magnify-line-height) var(--sl-font-trigger-magnify-font-family); /** Buttons and triggers in the magnify tier (emphasized, larger UI): magnify body text at medium, like base-trigger one tier up. As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
1745
+ --sl-font-title-magnify-font: var(--sl-font-title-magnify-font-weight) var(--sl-font-title-magnify-font-size) / var(--sl-font-title-magnify-line-height) var(--sl-font-title-magnify-font-family); /** Titles in the magnify tier: popovers, cards and fieldsets. Titles use the display family; the tier sets the size. As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
1746
+ --sl-font-body-minimize-font: var(--sl-font-body-minimize-font-weight) var(--sl-font-body-minimize-font-size) / var(--sl-font-body-minimize-line-height) var(--sl-font-body-minimize-font-family); /** Body copy in the minimize tier, the smallest functional text (captions, fine print). As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
1747
+ --sl-font-trigger-minimize-font: var(--sl-font-trigger-minimize-font-weight) var(--sl-font-trigger-minimize-font-size) / var(--sl-font-trigger-minimize-line-height) var(--sl-font-trigger-minimize-font-family); /** Buttons and triggers in the minimize tier (the smallest UI): minimize body text at medium, like base-trigger one tier down. As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
1748
+ --sl-font-selected-minimize-font: var(--sl-font-selected-minimize-font-weight) var(--sl-font-selected-minimize-font-size) / var(--sl-font-selected-minimize-line-height) var(--sl-font-selected-minimize-font-family); /** The selected or current item in the minimize tier (the smallest functional text): selected tabs and toggles, the current nav item or page. Minimize body text at semibold, so selection reads without changing size. As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
1749
+ --sl-focus-shadow-3px-error: 0 0 0 3px var(--sl-status-error); /** Focus halo for a field with an error. */
1750
+ --sl-calendar-day-color: var(--sl-text-primary); /** A day in the month being shown. */
1751
+ --sl-border-accent: var(--sl-scope-accent-border); /** Borders that signal selection or the active item. */
1752
+ --sl-border-default: var(--sl-scope-chrome-divider); /** Everyday dividers and control outlines. Darkens under prefers-contrast: more. */
1753
+ --sl-border-strong: var(--sl-scope-chrome-border-strong); /** Borders that identify a control, such as inputs and unchecked checkboxes. 3:1 against the canvas, as WCAG asks for control boundaries. */
1754
+ --sl-border-subtle: var(--sl-scope-chrome-border-subtle); /** Hairlines inside a surface (table rows, list separators) that should barely register. */
1755
+ --sl-border-control: var(--sl-scope-chrome-border); /** Edge of a small control (checkbox, radio, switch) that must be found before it is filled. */
1756
+ --sl-border-control-hover: var(--sl-scope-chrome-border-hover); /** Control edge under the pointer: one clear step darker than border.control. */
1757
+ --sl-interactive-active: var(--sl-scope-accent-solid-active); /** Pressed state of the main accent. Darker than hover so the press is felt. */
1758
+ --sl-interactive-default: var(--sl-scope-accent-solid); /** Primary accent for buttons, links and selected states. Step 600 is 6.1:1 on paper; step 400 is 5.6:1 on the dark canvas. */
1759
+ --sl-interactive-disabled: var(--sl-scope-chrome-soft-active); /** Fill for disabled accent controls. Low contrast on purpose, but never invisible. */
1760
+ --sl-interactive-hover: var(--sl-scope-accent-solid-hover); /** Hover state of the main accent. One step away from default in the direction of more contrast. */
1761
+ --sl-interactive-tint: var(--sl-scope-accent-soft); /** Faint accent wash behind a ghost or outline control on hover, or a selected row. */
1762
+ --sl-interactive-tint-hover: var(--sl-scope-accent-soft-hover); /** Accent wash for a highlighted menu item or a pressed toggle. */
1763
+ --sl-interactive-tint-active: var(--sl-scope-accent-soft-active); /** Accent wash for a selected or pressed item: one step past tint-hover. */
1764
+ --sl-interactive-tint-strong: var(--sl-scope-accent-soft-strong); /** Strongest accent wash, for hovering an item that is already pressed. */
1765
+ --sl-surface-canvas: var(--sl-scope-chrome-canvas); /** The page itself. Paper in light mode, the darkest neutral in dark mode. */
1766
+ --sl-surface-overlay: var(--sl-scope-chrome-overlay); /** Popups, menus and code blocks that sit above raised surfaces. */
1767
+ --sl-surface-raised: var(--sl-scope-chrome-raised); /** Cards and panels one level above the canvas. */
1768
+ --sl-surface-modal: var(--sl-scope-chrome-modal); /** Dialogs and drawers. Paper in light mode; in dark mode one step lighter than the page, so a modal lifts off the dimmed page under it. */
1769
+ --sl-surface-tray: var(--sl-scope-chrome-tray); /** The strip behind a row of controls (toolbars, toggle groups). A step off the page in both themes, so the controls sitting on it stand out, while secondary and accent text on it still pass AA. */
1770
+ --sl-surface-inverse: var(--sl-scope-chrome-inverse); /** Dark-on-light flip for small floating things such as tooltips. Inside a brand pair it becomes the pair's text color. */
1771
+ --sl-text-accent: var(--sl-scope-accent-fg); /** Accent text such as active tabs. One step darker than the interactive color so it stays AA as text. */
1772
+ --sl-text-disabled: var(--sl-scope-chrome-fg-disabled); /** Text in disabled controls. Deliberately below AA, which WCAG allows for disabled UI. */
1773
+ --sl-text-secondary: var(--sl-scope-chrome-fg-secondary); /** Supporting text such as descriptions and helper copy. Over 7:1 on every surface, and darker still under prefers-contrast: more. */
1774
+ --sl-text-tertiary: var(--sl-scope-chrome-fg-tertiary); /** Placeholders, captions and metadata. The lightest text that still passes AA (4.5:1) on every surface. */
1775
+ --sl-text-on-tint: var(--sl-scope-accent-on-soft); /** Text on an accent wash (interactive.tint*). Stays in the accent family. */
1776
+ --sl-text-on-tint-strong: var(--sl-scope-accent-ink); /** Text on the selected accent wash, a step darker than on-tint. */
1777
+ --sl-fill-subtle: var(--sl-scope-chrome-soft); /** Lightest fill: hovered rows, chips, empty tracks. */
1778
+ --sl-fill-default: var(--sl-scope-chrome-soft-hover); /** Standard fill: slider and switch tracks, pressed rows. */
1779
+ --sl-fill-strong: var(--sl-scope-chrome-soft-active); /** Heaviest fill: scroll thumbs, slider marks, hovered tracks. */
1780
+ --sl-fill-inverse: var(--sl-scope-chrome-solid); /** A small solid chip in the chrome color that flips with the theme: dark on light pages, light on dark ones. Keyboard keys use it. */
1781
+ --sl-fill-stronger: var(--sl-scope-chrome-soft-strong); /** One step past fill.strong, for the hover state of a strong fill such as a scrollbar thumb. */
1782
+ --sl-fill-track: var(--sl-scope-chrome-track); /** The empty part of a meter or progress bar. Light like fill.subtle in light mode; near the page in dark mode, so any palette's fill reads 3:1 against it. */
1783
+ --sl-content-prose-color: var(--sl-text-primary); /** Long-form body text. The same as body text, so prose and UI read as one voice. */
1784
+ --sl-content-selection-text: var(--sl-text-primary); /** Selected text stays body text so it reads the same on the tint. */
1785
+ --sl-field-border-color-error: var(--sl-status-error); /** Field edge when the value is invalid. */
1786
+ --sl-focus-ring: var(--sl-interactive-default); /** Focus ring color. Uses the interactive accent so focus reads as "this is the thing you can act on". */
1787
+ --sl-focus-outline: var(--sl-a11y-focus-outline-width) solid var(--sl-focus-ring); /** The one keyboard focus ring. Every control uses it, outside or inset. */
1662
1788
  --sl-font-subtitle-minimize-font-family: var(--sl-font-family-body); /** font-family of font.subtitle-minimize. */
1663
1789
  --sl-font-subtitle-minimize-font-size: var(--sl-font-size-xs); /** font-size of font.subtitle-minimize. */
1664
1790
  --sl-font-subtitle-minimize-font-weight: var(--sl-font-weight-bold); /** font-weight of font.subtitle-minimize. */
@@ -1852,9 +1978,14 @@
1852
1978
  --sl-collection-list-row-padding-block: var(--sl-space-3); /** Vertical padding of a list row. The row is not a fixed height, because a second line and an extra slot have to fit. */
1853
1979
  --sl-collection-list-row-gap: var(--sl-space-2); /** Between the checkbox, the text, the amount and the actions in a list row. */
1854
1980
  --sl-collection-toolbar-gap: var(--sl-space-2); /** Between the search, the filters and the actions. */
1981
+ --sl-collection-search-min-width: var(--sl-space-60); /** The narrowest the toolbar search gets beside the filters and actions. Under it, the search wraps to its own line, so a few words of a query still show. */
1855
1982
  --sl-collection-narrow-width: var(--sl-space-96); /** Below this, a table with narrow="list" becomes a list, and the toolbar's search takes the full width. A 360px pane is under it. */
1856
1983
  --sl-collection-editable-list-stack-width: var(--sl-space-80); /** Below this, editable rows stack and show their own labels. 320px matches. */
1857
1984
  --sl-collection-selection-column-width: var(--sl-space-10); /** The checkbox column. Wide enough for the control, no wider, so the data keeps the room. */
1985
+ --sl-description-list-row-padding-block: var(--sl-space-2); /** Space above and below each pair. */
1986
+ --sl-description-list-row-padding-inline: var(--sl-space-4); /** Space either side of each pair, so pairs inside a sheet line up with its tab label. */
1987
+ --sl-description-list-column-gap: var(--sl-space-4); /** Space between the label column and the value column in the default variant. */
1988
+ --sl-description-list-leader-gap: var(--sl-space-1-5); /** Space between the leader and the label or value either side of it. */
1858
1989
  --sl-drawer-handle-width: var(--sl-space-10); /** Grab bar length. */
1859
1990
  --sl-drawer-handle-height: var(--sl-space-1); /** Grab bar thickness. */
1860
1991
  --sl-list-detail-header-gap: var(--sl-space-3); /** Space between the title, the actions and Close. */
@@ -1862,9 +1993,22 @@
1862
1993
  --sl-money-field-picker-min-inline-size: var(--sl-space-56); /** The currency list shows a code, a name and a symbol, so the popup is wider than the code trigger inside the field. */
1863
1994
  --sl-popover-text-max-width: var(--sl-measure-narrow); /** Keeps the title and description to a readable line length. The popup itself has no fixed cap, so wider content such as a calendar or a form fits; it stops at the space Base UI reports beside the trigger. */
1864
1995
  --sl-popover-popup-min-width: var(--sl-popup-min-width); /** Narrow enough for a short note, wide enough that a title doesn't wrap word by word. */
1996
+ --sl-sheet-rule-width: var(--sl-stroke-medium); /** The top rule. A sheet always has one, so it is its own token rather than rule.width (which is 0 until a brand turns it on for tables and drawers). */
1997
+ --sl-sheet-padding: var(--sl-space-4); /** Space inside a sheet with inset set. Without it, rows and tables inside run edge to edge. */
1998
+ --sl-sheet-tab-height: var(--sl-space-7); /** Height of the tab label. */
1999
+ --sl-sheet-tab-padding-inline: var(--sl-space-3-5); /** Space either side of the tab label's text. */
2000
+ --sl-sheet-tab-radius: var(--sl-radius-sm); /** The tab label's top corners. Its bottom corners stay square where it meets the rule. */
2001
+ --sl-sheet-header-gap: var(--sl-space-3); /** Space between the tab label and an action at the end of the header row, such as an Edit link. */
1865
2002
  --sl-slider-thumb-size: var(--sl-space-5); /** Knob diameter, big enough to grab with a finger on a 4px track. */
1866
2003
  --sl-splitter-handle-hit-size: var(--sl-a11y-min-touch-target); /** The part a finger grabs. The line stays one stroke. A fine pointer uses a11y.min-target (24px) instead, so the grab area does not cover the panel's scrollbar. Coarse pointers keep this 44px. */
1867
2004
  --sl-splitter-grip-size: var(--sl-space-1); /** 4px. The diameter of one grip dot. Small enough to sit on the hairline without becoming a second control. */
2005
+ --sl-stat-figure-figure-font-size: var(--sl-font-size-4xl); /** Size of the figure. Large enough to lead the page, a step under the page title. */
2006
+ --sl-stat-figure-figure-font-size-sm: var(--sl-font-size-2xl); /** Size of the figure at size="sm", for a row of figures in a card or a sheet header. */
2007
+ --sl-stat-figure-figure-line-height: var(--sl-line-height-4xl); /** Line height paired with figure-font-size. */
2008
+ --sl-stat-figure-figure-line-height-sm: var(--sl-line-height-2xl); /** Line height paired with figure-font-size-sm. */
2009
+ --sl-stat-figure-figure-font-weight: var(--sl-font-weight-semibold); /** Weight of the figure. */
2010
+ --sl-stat-figure-underline-width: var(--sl-stroke-thick); /** The double underline at underline="double", the accountant's mark for a final total. A CSS double border, so at least 3px. */
2011
+ --sl-stat-figure-gap: var(--sl-space-1); /** Space between the label, the figure and the caption. */
1868
2012
  --sl-switch-track-text-font-size: var(--sl-font-size-xs); /** Sized to the track, not a text style: the ON/OFF label has to fit inside the switch at each size. The rest of the label uses condense-subtitle-label. */
1869
2013
  --sl-switch-track-text-font-size-sm: var(--sl-font-size-xxs); /** Sized to the track, not a text style: the ON/OFF label has to fit inside the switch at each size. The rest of the label uses condense-subtitle-label. */
1870
2014
  --sl-switch-track-text-font-size-lg: var(--sl-font-size-sm); /** Sized to the track, not a text style: the ON/OFF label has to fit inside the switch at each size. The rest of the label uses condense-subtitle-label. */
@@ -1895,73 +2039,12 @@
1895
2039
  --sl-color-chrome-on-1000: var(--sl-color-neutral-on-1000);
1896
2040
  --sl-color-chrome-on-1100: var(--sl-color-neutral-on-1100);
1897
2041
  --sl-color-chrome-on-1200: var(--sl-color-neutral-on-1200);
1898
- --sl-a11y-focus-ring-radius: var(--sl-radius-focus); /** Rounds the focus ring to match the small control radius. */
1899
2042
  --sl-bar-border-width: var(--sl-stroke-default); /** Strip edge thickness. */
1900
- --sl-bar-radius: var(--sl-radius-surface); /** Strip corners. Controls inside a toggle group take radius.item, so the inner corners follow the outer ones. */
1901
- --sl-calendar-day-radius: var(--sl-radius-pill); /** Selected days are circles. The pill radius is the same full radius badges and switches use. */
1902
- --sl-check-border-width: var(--sl-stroke-default); /** Edge thickness. */
1903
- --sl-check-radius: var(--sl-radius-box); /** Checkbox corners. Radios are always round. */
1904
- --sl-check-transition: var(--sl-transition-input); /** Changes at the same speed as a field. */
1905
- --sl-status-error: var(--sl-scope-error-signal); /** Errors and destructive actions. */
1906
- --sl-status-error-dark: var(--sl-scope-error-fg); /** Error color for text or icons that need more contrast than the base color. */
1907
- --sl-status-error-light: var(--sl-scope-error-soft); /** Error tint for backgrounds behind error messages. */
1908
- --sl-status-info: var(--sl-scope-info-signal); /** Neutral notices and help. */
1909
- --sl-status-info-dark: var(--sl-scope-info-fg); /** Info color for text or icons that need more contrast. */
1910
- --sl-status-info-light: var(--sl-scope-info-soft); /** Info tint for notice backgrounds. */
1911
- --sl-status-success: var(--sl-scope-success-signal); /** Confirmations and completed states. */
1912
- --sl-status-success-dark: var(--sl-scope-success-fg); /** Success color for text or icons that need more contrast. */
1913
- --sl-status-success-light: var(--sl-scope-success-soft); /** Success tint for confirmation backgrounds. */
1914
- --sl-status-warning: var(--sl-scope-warning-signal); /** Warnings, and the required-field marker. */
1915
- --sl-status-warning-dark: var(--sl-scope-warning-fg); /** Warning color for text or icons that need more contrast. */
1916
- --sl-status-warning-light: var(--sl-scope-warning-soft); /** Warning tint for caution backgrounds. */
1917
- --sl-text-primary: var(--sl-scope-chrome-fg); /** Body text and headings. The highest-contrast neutral. */
1918
- --sl-disclosure-indicator-width: var(--sl-stroke-emphasis); /** Selected tab line thickness. */
1919
- --sl-field-border-width: var(--sl-stroke-default); /** Field edge thickness. */
1920
- --sl-field-radius: var(--sl-radius-control); /** Field corners, the same as every other control. */
1921
- --sl-field-transition: var(--sl-transition-input); /** Border and halo ease in, never snap. */
1922
- --sl-gauge-radius: var(--sl-radius-pill); /** Round ends on the track and the fill. */
1923
- --sl-icon-button-radius: var(--sl-radius-item); /** Rounded like a menu item, since its hover fill reads as a highlighted item. */
1924
- --sl-icon-button-transition: var(--sl-transition-button); /** Responds as fast as a button. */
1925
- --sl-item-radius: var(--sl-radius-item); /** Row corners inside the popup. */
1926
- --sl-modal-border-width: var(--sl-stroke-default); /** Modal edge thickness. */
1927
- --sl-modal-radius: var(--sl-radius-modal); /** The largest radius, so a modal reads as its own layer. A drawer rounds only the edge facing the page. */
1928
- --sl-modal-shadow: var(--sl-elevation-xl); /** The deepest shadow, because a modal sits above everything but popups and toasts. */
1929
- --sl-modal-backdrop: color-mix(in srgb, var(--sl-overlay-base) 50%, transparent); /** Scrim that dims the page behind a modal. */
1930
- --sl-popup-border-width: var(--sl-stroke-default); /** Popup edge thickness. */
1931
- --sl-popup-radius: var(--sl-radius-surface); /** Corners of a free-floating popup. */
1932
- --sl-popup-radius-field: var(--sl-radius-control); /** Corners of a list that drops from a field, matching the field so the two read as one control. */
1933
- --sl-popup-shadow: var(--sl-elevation-lg); /** Lifts the popup above the page. */
1934
- --sl-popup-empty-padding-block: var(--sl-empty-padding-block-compact); /** Room around a plain 'No results' line. The same padding as a compact empty state, so a sentence and an EmptyState in that slot take the same space. An EmptyState drops this padding and uses its own. */
1935
- --sl-table-row-height: var(--sl-control-height-sm); /** Row height: the small control height, so a checkbox, input or button in a cell fits without growing the row. */
1936
- --sl-table-header-height: var(--sl-control-height-md); /** Header row height: the regular control height, a little taller than rows so the header reads as its own band. */
1937
- --sl-table-cell-padding-inline: var(--sl-control-padding-inline-sm); /** Space either side of cell text, matching small controls. */
1938
- --sl-table-radius: var(--sl-radius-surface); /** Grid corners, like any card or panel. */
1939
- --sl-font-body-base-font: var(--sl-font-body-base-font-weight) var(--sl-font-body-base-font-size) / var(--sl-font-body-base-line-height) var(--sl-font-body-base-font-family); /** Body copy in the base tier, the default UI and body text. As a font shorthand; letter-spacing and text-transform are separate. */
1940
- --sl-font-selected-base-font: var(--sl-font-selected-base-font-weight) var(--sl-font-selected-base-font-size) / var(--sl-font-selected-base-line-height) var(--sl-font-selected-base-font-family); /** The selected or current item in the base tier (the default UI and body text): selected tabs and toggles, the current nav item or page. Base body text at semibold, so selection reads without changing size. As a font shorthand; letter-spacing and text-transform are separate. */
1941
- --sl-font-label-base-font: var(--sl-font-label-base-font-weight) var(--sl-font-label-base-font-size) / var(--sl-font-label-base-line-height) var(--sl-font-label-base-font-family); /** Form labels in the base tier, the default UI and body text. As a font shorthand; letter-spacing and text-transform are separate. */
1942
- --sl-font-link-base-font: var(--sl-font-link-base-font-weight) var(--sl-font-link-base-font-size) / var(--sl-font-link-base-line-height) var(--sl-font-link-base-font-family); /** Links in the base tier. The same type as base body text: a link stands out by color and underline, not by its type. As a font shorthand; letter-spacing and text-transform are separate. */
1943
- --sl-font-subtitle-base-font: var(--sl-font-subtitle-base-font-weight) var(--sl-font-subtitle-base-font-size) / var(--sl-font-subtitle-base-line-height) var(--sl-font-subtitle-base-font-family); /** Subtitles in the base tier, the default UI and body text. As a font shorthand; letter-spacing and text-transform are separate. */
1944
- --sl-font-trigger-base-font: var(--sl-font-trigger-base-font-weight) var(--sl-font-trigger-base-font-size) / var(--sl-font-trigger-base-line-height) var(--sl-font-trigger-base-font-family); /** Buttons and triggers in the base tier, the default UI and body text. As a font shorthand; letter-spacing and text-transform are separate. */
1945
- --sl-font-title-base-font: var(--sl-font-title-base-font-weight) var(--sl-font-title-base-font-size) / var(--sl-font-title-base-line-height) var(--sl-font-title-base-font-family); /** Titles in the base tier: a toast, an accordion row, a list item heading. Titles use the display family; the tier sets the size. As a font shorthand; letter-spacing and text-transform are separate. */
1946
- --sl-font-code-condense-font: var(--sl-font-code-condense-font-weight) var(--sl-font-code-condense-font-size) / var(--sl-font-code-condense-line-height) var(--sl-font-code-condense-font-family); /** Code uses the mono family so characters line up. As a font shorthand; letter-spacing and text-transform are separate. */
1947
- --sl-font-body-condense-font: var(--sl-font-body-condense-font-weight) var(--sl-font-body-condense-font-size) / var(--sl-font-body-condense-line-height) var(--sl-font-body-condense-font-family); /** Body copy in the condense tier, dense UI text (tables, secondary labels). As a font shorthand; letter-spacing and text-transform are separate. */
1948
- --sl-font-trigger-condense-font: var(--sl-font-trigger-condense-font-weight) var(--sl-font-trigger-condense-font-size) / var(--sl-font-trigger-condense-line-height) var(--sl-font-trigger-condense-font-family); /** Buttons and triggers in the condense tier (dense UI): condense body text at medium, like base-trigger one tier down. As a font shorthand; letter-spacing and text-transform are separate. */
1949
- --sl-font-selected-condense-font: var(--sl-font-selected-condense-font-weight) var(--sl-font-selected-condense-font-size) / var(--sl-font-selected-condense-line-height) var(--sl-font-selected-condense-font-family); /** The selected or current item in the condense tier (dense UI text): selected tabs and toggles, the current nav item or page. Condense body text at semibold, so selection reads without changing size. As a font shorthand; letter-spacing and text-transform are separate. */
1950
- --sl-font-link-condense-font: var(--sl-font-link-condense-font-weight) var(--sl-font-link-condense-font-size) / var(--sl-font-link-condense-line-height) var(--sl-font-link-condense-font-family); /** Links in the condense tier. The same type as condense body text: a link stands out by color and underline, not by its type. As a font shorthand; letter-spacing and text-transform are separate. */
1951
- --sl-font-subtitle-condense-font: var(--sl-font-subtitle-condense-font-weight) var(--sl-font-subtitle-condense-font-size) / var(--sl-font-subtitle-condense-line-height) var(--sl-font-subtitle-condense-font-family); /** Subtitles in the condense tier, dense UI text (tables, secondary labels). As a font shorthand; letter-spacing and text-transform are separate. */
1952
- --sl-font-eyebrow-condense-font: var(--sl-font-eyebrow-condense-font-weight) var(--sl-font-eyebrow-condense-font-size) / var(--sl-font-eyebrow-condense-line-height) var(--sl-font-eyebrow-condense-font-family); /** Small uppercase eyebrow labels in the condense tier, dense UI text (tables, secondary labels). As a font shorthand; letter-spacing and text-transform are separate. */
1953
- --sl-font-title-condense-font: var(--sl-font-title-condense-font-weight) var(--sl-font-title-condense-font-size) / var(--sl-font-title-condense-line-height) var(--sl-font-title-condense-font-family); /** Titles in the condense tier: group headers in tables, menus and dense panels. Titles use the display family; the tier sets the size. As a font shorthand; letter-spacing and text-transform are separate. */
1954
- --sl-font-body-magnify-font: var(--sl-font-body-magnify-font-weight) var(--sl-font-body-magnify-font-size) / var(--sl-font-body-magnify-line-height) var(--sl-font-body-magnify-font-family); /** Body copy in the magnify tier, emphasized body text (lead paragraphs). As a font shorthand; letter-spacing and text-transform are separate. */
1955
- --sl-font-trigger-magnify-font: var(--sl-font-trigger-magnify-font-weight) var(--sl-font-trigger-magnify-font-size) / var(--sl-font-trigger-magnify-line-height) var(--sl-font-trigger-magnify-font-family); /** Buttons and triggers in the magnify tier (emphasized, larger UI): magnify body text at medium, like base-trigger one tier up. As a font shorthand; letter-spacing and text-transform are separate. */
1956
- --sl-font-title-magnify-font: var(--sl-font-title-magnify-font-weight) var(--sl-font-title-magnify-font-size) / var(--sl-font-title-magnify-line-height) var(--sl-font-title-magnify-font-family); /** Titles in the magnify tier: popovers, cards and fieldsets. Titles use the display family; the tier sets the size. As a font shorthand; letter-spacing and text-transform are separate. */
1957
- --sl-font-body-minimize-font: var(--sl-font-body-minimize-font-weight) var(--sl-font-body-minimize-font-size) / var(--sl-font-body-minimize-line-height) var(--sl-font-body-minimize-font-family); /** Body copy in the minimize tier, the smallest functional text (captions, fine print). As a font shorthand; letter-spacing and text-transform are separate. */
1958
- --sl-font-trigger-minimize-font: var(--sl-font-trigger-minimize-font-weight) var(--sl-font-trigger-minimize-font-size) / var(--sl-font-trigger-minimize-line-height) var(--sl-font-trigger-minimize-font-family); /** Buttons and triggers in the minimize tier (the smallest UI): minimize body text at medium, like base-trigger one tier down. As a font shorthand; letter-spacing and text-transform are separate. */
1959
- --sl-font-selected-minimize-font: var(--sl-font-selected-minimize-font-weight) var(--sl-font-selected-minimize-font-size) / var(--sl-font-selected-minimize-line-height) var(--sl-font-selected-minimize-font-family); /** The selected or current item in the minimize tier (the smallest functional text): selected tabs and toggles, the current nav item or page. Minimize body text at semibold, so selection reads without changing size. As a font shorthand; letter-spacing and text-transform are separate. */
1960
- --sl-font-link-minimize-font: var(--sl-font-link-minimize-font-weight) var(--sl-font-link-minimize-font-size) / var(--sl-font-link-minimize-line-height) var(--sl-font-link-minimize-font-family); /** Links in the minimize tier. The same type as minimize body text: a link stands out by color and underline, not by its type. As a font shorthand; letter-spacing and text-transform are separate. */
1961
- --sl-font-subtitle-minimize-font: var(--sl-font-subtitle-minimize-font-weight) var(--sl-font-subtitle-minimize-font-size) / var(--sl-font-subtitle-minimize-line-height) var(--sl-font-subtitle-minimize-font-family); /** Subtitles in the minimize tier, the smallest functional text (captions, fine print). As a font shorthand; letter-spacing and text-transform are separate. */
1962
- --sl-font-eyebrow-minimize-font: var(--sl-font-eyebrow-minimize-font-weight) var(--sl-font-eyebrow-minimize-font-size) / var(--sl-font-eyebrow-minimize-line-height) var(--sl-font-eyebrow-minimize-font-family); /** Small uppercase eyebrow labels in the minimize tier, the smallest functional text (captions, fine print). As a font shorthand; letter-spacing and text-transform are separate. */
1963
- --sl-font-title-amplify-font: var(--sl-font-title-amplify-font-weight) var(--sl-font-title-amplify-font-size) / var(--sl-font-title-amplify-line-height) var(--sl-font-title-amplify-font-family); /** Titles in the amplify tier: dialogs, drawers and page sections. Titles use the display family; the tier sets the size. As a font shorthand; letter-spacing and text-transform are separate. */
1964
- --sl-font-title-maximize-font: var(--sl-font-title-maximize-font-weight) var(--sl-font-title-maximize-font-size) / var(--sl-font-title-maximize-line-height) var(--sl-font-title-maximize-font-family); /** Titles in the maximize tier: the page head. Titles use the display family; the tier sets the size. As a font shorthand; letter-spacing and text-transform are separate. */
2043
+ --sl-font-link-minimize-font: var(--sl-font-link-minimize-font-weight) var(--sl-font-link-minimize-font-size) / var(--sl-font-link-minimize-line-height) var(--sl-font-link-minimize-font-family); /** Links in the minimize tier. The same type as minimize body text: a link stands out by color and underline, not by its type. As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
2044
+ --sl-font-subtitle-minimize-font: var(--sl-font-subtitle-minimize-font-weight) var(--sl-font-subtitle-minimize-font-size) / var(--sl-font-subtitle-minimize-line-height) var(--sl-font-subtitle-minimize-font-family); /** Subtitles in the minimize tier, the smallest functional text (captions, fine print). As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
2045
+ --sl-font-eyebrow-minimize-font: var(--sl-font-eyebrow-minimize-font-weight) var(--sl-font-eyebrow-minimize-font-size) / var(--sl-font-eyebrow-minimize-line-height) var(--sl-font-eyebrow-minimize-font-family); /** Small uppercase eyebrow labels in the minimize tier, the smallest functional text (captions, fine print). As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
2046
+ --sl-font-title-amplify-font: var(--sl-font-title-amplify-font-weight) var(--sl-font-title-amplify-font-size) / var(--sl-font-title-amplify-line-height) var(--sl-font-title-amplify-font-family); /** Titles in the amplify tier: dialogs, drawers and page sections. Titles use the display family; the tier sets the size. As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
2047
+ --sl-font-title-maximize-font: var(--sl-font-title-maximize-font-weight) var(--sl-font-title-maximize-font-size) / var(--sl-font-title-maximize-line-height) var(--sl-font-title-maximize-font-family); /** Titles in the maximize tier: the page head. Titles use the display family; the tier sets the size. As a font shorthand; letter-spacing, text-transform and font-variant-numeric are separate. */
1965
2048
  --sl-emphasis-quiet-fg: var(--sl-scope-chrome-fg); /** quiet in default: outline in chrome (neutral) */
1966
2049
  --sl-pair-ember-dune-hover: color-mix(in oklab, var(--sl-pair-ember-dune-accent) 85%, var(--sl-pair-ember-dune-bg)); /** Accent on hover: accent moved 15% toward bg. 4.76:1 against bg, which is the button label. */
1967
2050
  --sl-pair-ember-dune-active: var(--sl-pair-ember-dune-accent); /** Accent while pressed: the accent itself, because moving it would drop the button label below AA. */
@@ -2119,44 +2202,10 @@
2119
2202
  --sl-collection-row-height-md: var(--sl-control-height-md); /** A roomier row when the collection is the page rather than a dense register. */
2120
2203
  --sl-collection-header-height-sm: var(--sl-control-height-md); /** The dense header, a step above the dense row, matching today's table header. */
2121
2204
  --sl-collection-header-height-md: var(--sl-control-height-lg); /** The header for the roomier row. */
2205
+ --sl-description-list-leader-width: var(--sl-stroke-default); /** Thickness of the dotted leader. */
2206
+ --sl-sheet-border-width: var(--sl-stroke-default); /** Thickness of the sides and bottom. */
2207
+ --sl-sheet-radius: var(--sl-radius-surface); /** Corners, like any card or panel. The top corners stay square under a tab label, so the tab sits flush on the rule. */
2122
2208
  --sl-splitter-handle-size: var(--sl-stroke-default); /** The visible separator. One stroke, the same hairline as Separator, so a splitter reads as a divider you can grab. */
2123
- --sl-focus-shadow-3px-error: 0 0 0 3px var(--sl-status-error); /** Focus halo for a field with an error. */
2124
- --sl-calendar-day-color: var(--sl-text-primary); /** A day in the month being shown. */
2125
- --sl-border-accent: var(--sl-scope-accent-border); /** Borders that signal selection or the active item. */
2126
- --sl-border-default: var(--sl-scope-chrome-divider); /** Everyday dividers and control outlines. Darkens under prefers-contrast: more. */
2127
- --sl-border-strong: var(--sl-scope-chrome-border-strong); /** Borders that identify a control, such as inputs and unchecked checkboxes. 3:1 against the canvas, as WCAG asks for control boundaries. */
2128
- --sl-border-subtle: var(--sl-scope-chrome-border-subtle); /** Hairlines inside a surface (table rows, list separators) that should barely register. */
2129
- --sl-border-control: var(--sl-scope-chrome-border); /** Edge of a small control (checkbox, radio, switch) that must be found before it is filled. */
2130
- --sl-border-control-hover: var(--sl-scope-chrome-border-hover); /** Control edge under the pointer: one clear step darker than border.control. */
2131
- --sl-interactive-active: var(--sl-scope-accent-solid-active); /** Pressed state of the main accent. Darker than hover so the press is felt. */
2132
- --sl-interactive-default: var(--sl-scope-accent-solid); /** Primary accent for buttons, links and selected states. Step 600 is 6.1:1 on paper; step 400 is 5.6:1 on the dark canvas. */
2133
- --sl-interactive-disabled: var(--sl-scope-chrome-soft-active); /** Fill for disabled accent controls. Low contrast on purpose, but never invisible. */
2134
- --sl-interactive-hover: var(--sl-scope-accent-solid-hover); /** Hover state of the main accent. One step away from default in the direction of more contrast. */
2135
- --sl-interactive-tint: var(--sl-scope-accent-soft); /** Faint accent wash behind a ghost or outline control on hover, or a selected row. */
2136
- --sl-interactive-tint-hover: var(--sl-scope-accent-soft-hover); /** Accent wash for a highlighted menu item or a pressed toggle. */
2137
- --sl-interactive-tint-active: var(--sl-scope-accent-soft-active); /** Accent wash for a selected or pressed item: one step past tint-hover. */
2138
- --sl-interactive-tint-strong: var(--sl-scope-accent-soft-strong); /** Strongest accent wash, for hovering an item that is already pressed. */
2139
- --sl-surface-canvas: var(--sl-scope-chrome-canvas); /** The page itself. Paper in light mode, the darkest neutral in dark mode. */
2140
- --sl-surface-overlay: var(--sl-scope-chrome-overlay); /** Popups, menus and code blocks that sit above raised surfaces. */
2141
- --sl-surface-raised: var(--sl-scope-chrome-raised); /** Cards and panels one level above the canvas. */
2142
- --sl-surface-modal: var(--sl-scope-chrome-modal); /** Dialogs and drawers. Paper in light mode; in dark mode one step lighter than the page, so a modal lifts off the dimmed page under it. */
2143
- --sl-surface-tray: var(--sl-scope-chrome-tray); /** The strip behind a row of controls (toolbars, toggle groups). A step off the page in both themes, so the controls sitting on it stand out, while secondary and accent text on it still pass AA. */
2144
- --sl-surface-inverse: var(--sl-scope-chrome-inverse); /** Dark-on-light flip for small floating things such as tooltips. Inside a brand pair it becomes the pair's text color. */
2145
- --sl-text-accent: var(--sl-scope-accent-fg); /** Accent text such as active tabs. One step darker than the interactive color so it stays AA as text. */
2146
- --sl-text-disabled: var(--sl-scope-chrome-fg-disabled); /** Text in disabled controls. Deliberately below AA, which WCAG allows for disabled UI. */
2147
- --sl-text-secondary: var(--sl-scope-chrome-fg-secondary); /** Supporting text such as descriptions and helper copy. Over 7:1 on every surface, and darker still under prefers-contrast: more. */
2148
- --sl-text-tertiary: var(--sl-scope-chrome-fg-tertiary); /** Placeholders, captions and metadata. The lightest text that still passes AA (4.5:1) on every surface. */
2149
- --sl-text-on-tint: var(--sl-scope-accent-on-soft); /** Text on an accent wash (interactive.tint*). Stays in the accent family. */
2150
- --sl-text-on-tint-strong: var(--sl-scope-accent-ink); /** Text on the selected accent wash, a step darker than on-tint. */
2151
- --sl-fill-subtle: var(--sl-scope-chrome-soft); /** Lightest fill: hovered rows, chips, empty tracks. */
2152
- --sl-fill-default: var(--sl-scope-chrome-soft-hover); /** Standard fill: slider and switch tracks, pressed rows. */
2153
- --sl-fill-strong: var(--sl-scope-chrome-soft-active); /** Heaviest fill: scroll thumbs, slider marks, hovered tracks. */
2154
- --sl-fill-inverse: var(--sl-scope-chrome-solid); /** A small solid chip in the chrome color that flips with the theme: dark on light pages, light on dark ones. Keyboard keys use it. */
2155
- --sl-fill-stronger: var(--sl-scope-chrome-soft-strong); /** One step past fill.strong, for the hover state of a strong fill such as a scrollbar thumb. */
2156
- --sl-fill-track: var(--sl-scope-chrome-track); /** The empty part of a meter or progress bar. Light like fill.subtle in light mode; near the page in dark mode, so any palette's fill reads 3:1 against it. */
2157
- --sl-content-prose-color: var(--sl-text-primary); /** Long-form body text. The same as body text, so prose and UI read as one voice. */
2158
- --sl-content-selection-text: var(--sl-text-primary); /** Selected text stays body text so it reads the same on the tint. */
2159
- --sl-field-border-color-error: var(--sl-status-error); /** Field edge when the value is invalid. */
2160
2209
  --sl-field-color: var(--sl-text-primary); /** The value you typed. */
2161
2210
  --sl-gauge-label-color: var(--sl-text-primary); /** What is being measured. */
2162
2211
  --sl-icon-button-color-hover: var(--sl-text-primary); /** Darkens on hover to confirm it's the target. */
@@ -2214,7 +2263,8 @@
2214
2263
  --sl-status-level-success-bold-fg: var(--sl-scope-success-on-solid); /** bold in success: solid in success */
2215
2264
  --sl-status-level-warning-bold-fg: var(--sl-scope-warning-on-solid); /** bold in warning: solid in warning */
2216
2265
  --sl-status-level-error-bold-fg: var(--sl-scope-error-on-solid); /** bold in error: solid in error */
2217
- --sl-focus-ring: var(--sl-interactive-default); /** Focus ring color. Uses the interactive accent so focus reads as "this is the thing you can act on". */
2266
+ --sl-description-list-value-color: var(--sl-text-primary); /** Values. */
2267
+ --sl-stat-figure-figure-color: var(--sl-text-primary); /** The figure's color. */
2218
2268
  --sl-focus-shadow-3px-primary: 0 0 0 3px var(--sl-interactive-tint-hover); /** Soft focus halo for inputs. */
2219
2269
  --sl-focus-shadow-3px-primary-soft: 0 0 0 3px var(--sl-interactive-tint-active); /** Slightly stronger focus halo for inputs on tinted surfaces. */
2220
2270
  --sl-focus-halo-color: var(--sl-interactive-tint-hover); /** The pale tint of the focus glow. Components on a colored scope use that scope's soft-hover instead. */
@@ -2286,6 +2336,7 @@
2286
2336
  --sl-notice-description-color: var(--sl-text-secondary); /** Description on the plain surface. A tinted notice uses its palette's text color for both lines. */
2287
2337
  --sl-popup-border-color: var(--sl-border-default); /** Popup edge, a quiet line that separates it from the page under it. */
2288
2338
  --sl-popup-separator-color: var(--sl-border-subtle); /** Line between groups of rows, quieter than the popup edge. */
2339
+ --sl-rule-color: var(--sl-border-strong); /** Color of the top rule. The chrome's strong border, so the rule reads as structure, not as an accent or a selection. A brand can point it at text.primary for an ink rule. */
2289
2340
  --sl-table-background: var(--sl-surface-canvas); /** Cell area. The page color, so a grid sits on the page like body text. */
2290
2341
  --sl-table-subtle-color: var(--sl-text-secondary); /** Secondary text in cells and panels: counts, hints, group totals. */
2291
2342
  --sl-table-header-background: var(--sl-surface-tray); /** Header row, side bar and other grid chrome. The tray step, so it sits a step off the cells in both themes and secondary text on it still passes AA. */
@@ -2298,7 +2349,16 @@
2298
2349
  --sl-table-range-background: var(--sl-interactive-tint); /** Cells inside a dragged range selection. */
2299
2350
  --sl-emphasis-bold-fg: var(--sl-scope-accent-on-solid); /** bold in default: solid in accent (primary) */
2300
2351
  --sl-status-level-default-bold-fg: var(--sl-scope-accent-on-solid); /** bold in default: solid in accent (primary) */
2352
+ --sl-description-list-row-border-color: var(--sl-border-subtle); /** Hairline between pairs, as quiet as a table's row lines. */
2353
+ --sl-description-list-label-color: var(--sl-text-secondary); /** Labels. */
2354
+ --sl-description-list-leader-color: var(--sl-border-control); /** The dotted leader at variant="leader". The control edge color: dark enough to lead the eye, still lighter than the text. */
2301
2355
  --sl-drawer-handle-color: var(--sl-border-strong); /** The grab bar on bottom drawers. Strong border so it reads as something to drag. */
2356
+ --sl-sheet-background: var(--sl-surface-raised); /** The sheet's fill: the raised surface, one level above the page like any card or panel. */
2357
+ --sl-sheet-border-color: var(--sl-border-default); /** The sheet's sides and bottom, the everyday divider. */
2358
+ --sl-sheet-tab-background: var(--sl-surface-inverse); /** The tab label's fill: the inverse surface, so the label reads as the sheet's name, and its text passes AA in every theme. */
2359
+ --sl-stat-figure-figure-color-accent: var(--sl-text-accent); /** The figure's color at tone="accent", for a figure that asks for action (open questions, items to review). */
2360
+ --sl-stat-figure-label-color: var(--sl-text-secondary); /** The caps label above the figure. */
2361
+ --sl-stat-figure-caption-color: var(--sl-text-secondary); /** The caption under the figure. */
2302
2362
  --sl-shadow-outline: 0 0 0 3px color-mix(in oklab, var(--sl-focus-ring) 60%, transparent); /** Focus halo for controls that use box-shadow instead of outline: the focus ring color at 60% opacity, so it follows the accent and the theme. Becomes currentColor under prefers-contrast: more. */
2303
2363
  --sl-calendar-day-background-hover: var(--sl-item-background-hover); /** The same hover tint as a list item, so a day feels like a choice in a list. */
2304
2364
  --sl-check-mark-color: var(--sl-text-on-primary); /** Check mark, dash or dot on a ticked fill. */
@@ -2314,6 +2374,11 @@
2314
2374
  --sl-table-row-hover: var(--sl-item-background-hover); /** Row under the pointer. Same tint as a highlighted menu row. */
2315
2375
  --sl-table-row-selected: var(--sl-item-background-selected); /** Selected rows. Same tint as the chosen menu row. */
2316
2376
  --sl-table-range-border: var(--sl-focus-ring); /** Edge of a range selection and of the focused cell, the same color as every focus ring. */
2377
+ --sl-table-total-rule-color: var(--sl-rule-color); /** The line above a subtotal or total row and the double line under a grand total. The working-paper rule color, so totals and sheet tops are ruled in the same ink. */
2378
+ --sl-table-total-background: var(--sl-table-background); /** Fill of a subtotal or grand total row: the cell color, so the rules mark the total instead of a band. The footer's default totals row keeps the header tray. */
2379
+ --sl-sheet-rule-color: var(--sl-rule-color); /** The top rule's color: the working-paper rule color, so sheets and ruled tables match. */
2380
+ --sl-sheet-tab-color: var(--sl-text-on-inverse-surface); /** Text on the tab label. */
2381
+ --sl-stat-figure-underline-color: var(--sl-rule-color); /** The double underline's color: the working-paper rule color, like a grand total's double rule. */
2317
2382
  --sl-check-background: var(--sl-field-background); /** Empty box, the same fill as a field so it reads as something to fill in. */
2318
2383
  --sl-popup-arrow-fill: var(--sl-popup-background); /** The arrow is part of the popup, so it takes the popup's fill. */
2319
2384
  }
@@ -5779,6 +5844,7 @@
5779
5844
  --sl-popup-arrow-fill: var(--sl-popup-background);
5780
5845
  --sl-popup-arrow-stroke: var(--sl-popup-border-color);
5781
5846
  --sl-popup-separator-color: var(--sl-border-subtle);
5847
+ --sl-rule-color: var(--sl-border-strong);
5782
5848
  --sl-table-background: var(--sl-surface-canvas);
5783
5849
  --sl-table-color: var(--sl-text-primary);
5784
5850
  --sl-table-subtle-color: var(--sl-text-secondary);
@@ -5794,7 +5860,23 @@
5794
5860
  --sl-table-column-hover: var(--sl-fill-subtle);
5795
5861
  --sl-table-range-background: var(--sl-interactive-tint);
5796
5862
  --sl-table-range-border: var(--sl-focus-ring);
5863
+ --sl-table-total-rule-color: var(--sl-rule-color);
5864
+ --sl-table-total-background: var(--sl-table-background);
5865
+ --sl-description-list-row-border-color: var(--sl-border-subtle);
5866
+ --sl-description-list-label-color: var(--sl-text-secondary);
5867
+ --sl-description-list-value-color: var(--sl-text-primary);
5868
+ --sl-description-list-leader-color: var(--sl-border-control);
5797
5869
  --sl-drawer-handle-color: var(--sl-border-strong);
5870
+ --sl-sheet-background: var(--sl-surface-raised);
5871
+ --sl-sheet-border-color: var(--sl-border-default);
5872
+ --sl-sheet-rule-color: var(--sl-rule-color);
5873
+ --sl-sheet-tab-background: var(--sl-surface-inverse);
5874
+ --sl-sheet-tab-color: var(--sl-text-on-inverse-surface);
5875
+ --sl-stat-figure-figure-color: var(--sl-text-primary);
5876
+ --sl-stat-figure-figure-color-accent: var(--sl-text-accent);
5877
+ --sl-stat-figure-underline-color: var(--sl-rule-color);
5878
+ --sl-stat-figure-label-color: var(--sl-text-secondary);
5879
+ --sl-stat-figure-caption-color: var(--sl-text-secondary);
5798
5880
  --sl-calendar-day-background-hover: var(--sl-item-background-hover);
5799
5881
  --sl-check-background: var(--sl-field-background);
5800
5882
  }
@@ -5925,6 +6007,7 @@
5925
6007
  --sl-popup-arrow-fill: var(--sl-popup-background);
5926
6008
  --sl-popup-arrow-stroke: var(--sl-popup-border-color);
5927
6009
  --sl-popup-separator-color: var(--sl-border-subtle);
6010
+ --sl-rule-color: var(--sl-border-strong);
5928
6011
  --sl-table-background: var(--sl-surface-canvas);
5929
6012
  --sl-table-color: var(--sl-text-primary);
5930
6013
  --sl-table-subtle-color: var(--sl-text-secondary);
@@ -5940,7 +6023,23 @@
5940
6023
  --sl-table-column-hover: var(--sl-fill-subtle);
5941
6024
  --sl-table-range-background: var(--sl-interactive-tint);
5942
6025
  --sl-table-range-border: var(--sl-focus-ring);
6026
+ --sl-table-total-rule-color: var(--sl-rule-color);
6027
+ --sl-table-total-background: var(--sl-table-background);
6028
+ --sl-description-list-row-border-color: var(--sl-border-subtle);
6029
+ --sl-description-list-label-color: var(--sl-text-secondary);
6030
+ --sl-description-list-value-color: var(--sl-text-primary);
6031
+ --sl-description-list-leader-color: var(--sl-border-control);
5943
6032
  --sl-drawer-handle-color: var(--sl-border-strong);
6033
+ --sl-sheet-background: var(--sl-surface-raised);
6034
+ --sl-sheet-border-color: var(--sl-border-default);
6035
+ --sl-sheet-rule-color: var(--sl-rule-color);
6036
+ --sl-sheet-tab-background: var(--sl-surface-inverse);
6037
+ --sl-sheet-tab-color: var(--sl-text-on-inverse-surface);
6038
+ --sl-stat-figure-figure-color: var(--sl-text-primary);
6039
+ --sl-stat-figure-figure-color-accent: var(--sl-text-accent);
6040
+ --sl-stat-figure-underline-color: var(--sl-rule-color);
6041
+ --sl-stat-figure-label-color: var(--sl-text-secondary);
6042
+ --sl-stat-figure-caption-color: var(--sl-text-secondary);
5944
6043
  --sl-calendar-day-background-hover: var(--sl-item-background-hover);
5945
6044
  --sl-check-background: var(--sl-field-background);
5946
6045
  }
@@ -6071,6 +6170,7 @@
6071
6170
  --sl-popup-arrow-fill: var(--sl-popup-background);
6072
6171
  --sl-popup-arrow-stroke: var(--sl-popup-border-color);
6073
6172
  --sl-popup-separator-color: var(--sl-border-subtle);
6173
+ --sl-rule-color: var(--sl-border-strong);
6074
6174
  --sl-table-background: var(--sl-surface-canvas);
6075
6175
  --sl-table-color: var(--sl-text-primary);
6076
6176
  --sl-table-subtle-color: var(--sl-text-secondary);
@@ -6086,7 +6186,23 @@
6086
6186
  --sl-table-column-hover: var(--sl-fill-subtle);
6087
6187
  --sl-table-range-background: var(--sl-interactive-tint);
6088
6188
  --sl-table-range-border: var(--sl-focus-ring);
6189
+ --sl-table-total-rule-color: var(--sl-rule-color);
6190
+ --sl-table-total-background: var(--sl-table-background);
6191
+ --sl-description-list-row-border-color: var(--sl-border-subtle);
6192
+ --sl-description-list-label-color: var(--sl-text-secondary);
6193
+ --sl-description-list-value-color: var(--sl-text-primary);
6194
+ --sl-description-list-leader-color: var(--sl-border-control);
6089
6195
  --sl-drawer-handle-color: var(--sl-border-strong);
6196
+ --sl-sheet-background: var(--sl-surface-raised);
6197
+ --sl-sheet-border-color: var(--sl-border-default);
6198
+ --sl-sheet-rule-color: var(--sl-rule-color);
6199
+ --sl-sheet-tab-background: var(--sl-surface-inverse);
6200
+ --sl-sheet-tab-color: var(--sl-text-on-inverse-surface);
6201
+ --sl-stat-figure-figure-color: var(--sl-text-primary);
6202
+ --sl-stat-figure-figure-color-accent: var(--sl-text-accent);
6203
+ --sl-stat-figure-underline-color: var(--sl-rule-color);
6204
+ --sl-stat-figure-label-color: var(--sl-text-secondary);
6205
+ --sl-stat-figure-caption-color: var(--sl-text-secondary);
6090
6206
  --sl-calendar-day-background-hover: var(--sl-item-background-hover);
6091
6207
  --sl-check-background: var(--sl-field-background);
6092
6208
  }
@@ -6159,6 +6275,16 @@
6159
6275
  letter-spacing: var(--sl-font-title-base-letter-spacing);
6160
6276
  }
6161
6277
 
6278
+ /* Figures in the base tier: an amount beside base text, a balance in a card. The mono family with tabular numbers, so digits line up. */
6279
+ .text-style-figures-base {
6280
+ font-family: var(--sl-font-figures-base-font-family);
6281
+ font-size: var(--sl-font-figures-base-font-size);
6282
+ font-weight: var(--sl-font-figures-base-font-weight);
6283
+ line-height: var(--sl-font-figures-base-line-height);
6284
+ letter-spacing: var(--sl-font-figures-base-letter-spacing);
6285
+ font-variant-numeric: var(--sl-font-figures-base-font-variant-numeric);
6286
+ }
6287
+
6162
6288
  /* Code uses the mono family so characters line up. */
6163
6289
  .text-style-code-condense {
6164
6290
  font-family: var(--sl-font-code-condense-font-family);
@@ -6168,6 +6294,16 @@
6168
6294
  letter-spacing: var(--sl-font-code-condense-letter-spacing);
6169
6295
  }
6170
6296
 
6297
+ /* Figures in the condense tier: amounts and counts in tables and dense rows. The mono family with tabular numbers, so digits line up down a column. */
6298
+ .text-style-figures-condense {
6299
+ font-family: var(--sl-font-figures-condense-font-family);
6300
+ font-size: var(--sl-font-figures-condense-font-size);
6301
+ font-weight: var(--sl-font-figures-condense-font-weight);
6302
+ line-height: var(--sl-font-figures-condense-line-height);
6303
+ letter-spacing: var(--sl-font-figures-condense-letter-spacing);
6304
+ font-variant-numeric: var(--sl-font-figures-condense-font-variant-numeric);
6305
+ }
6306
+
6171
6307
  /* Body copy in the condense tier, dense UI text (tables, secondary labels). */
6172
6308
  .text-style-body-condense {
6173
6309
  font-family: var(--sl-font-body-condense-font-family);
@@ -6223,6 +6359,16 @@
6223
6359
  text-transform: var(--sl-font-eyebrow-condense-text-transform);
6224
6360
  }
6225
6361
 
6362
+ /* Caps labels in the condense tier: a working-paper caption, a column head over figures, a sheet's tab label. Uppercase and tracked a little wider than an eyebrow, so it reads as a label and not a heading. */
6363
+ .text-style-caps-condense {
6364
+ font-family: var(--sl-font-caps-condense-font-family);
6365
+ font-size: var(--sl-font-caps-condense-font-size);
6366
+ font-weight: var(--sl-font-caps-condense-font-weight);
6367
+ line-height: var(--sl-font-caps-condense-line-height);
6368
+ letter-spacing: var(--sl-font-caps-condense-letter-spacing);
6369
+ text-transform: var(--sl-font-caps-condense-text-transform);
6370
+ }
6371
+
6226
6372
  /* Titles in the condense tier: group headers in tables, menus and dense panels. Titles use the display family; the tier sets the size. */
6227
6373
  .text-style-title-condense {
6228
6374
  font-family: var(--sl-font-title-condense-font-family);
@@ -6413,7 +6559,7 @@
6413
6559
  }
6414
6560
 
6415
6561
 
6416
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
6562
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
6417
6563
  /* Loomiere for Base UI: component styles. Brand-free: every value is a --sl- variable from a
6418
6564
  Loomiere theme. Load the theme first:
6419
6565
  @import '<your theme>/tokens.css';
@@ -6423,7 +6569,7 @@
6423
6569
  /* Document defaults, in the reset layer so any unlayered rule wins over them, and so layered
6424
6570
  frameworks (Chakra's recipes, Tailwind's utilities) are not undone by them. */
6425
6571
  @layer reset {
6426
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
6572
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
6427
6573
  /* CSS Reset - Mojave Theme */
6428
6574
 
6429
6575
  /* ============================================
@@ -6697,7 +6843,7 @@ pre {
6697
6843
  background: var(--sl-content-pre-background);
6698
6844
  border: var(--sl-stroke-thin) solid var(--sl-content-pre-border);
6699
6845
  color: var(--sl-content-pre-text);
6700
- border-radius: var(--sl-space-2);
6846
+ border-radius: var(--sl-content-pre-radius);
6701
6847
  overflow-x: auto;
6702
6848
  margin-block: var(--sl-space-6);
6703
6849
  }
@@ -6867,7 +7013,7 @@ hr {
6867
7013
  }
6868
7014
  }
6869
7015
  @layer reset {
6870
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
7016
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
6871
7017
  /* Accessibility — base rules (no theme color dependencies). Theme-specific focus/invalid: accessibility-theme.css */
6872
7018
 
6873
7019
  /* Remove default focus; keyboard focus styled in accessibility-theme.css */
@@ -6980,7 +7126,7 @@ main:focus {
6980
7126
 
6981
7127
  }
6982
7128
  @layer reset {
6983
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
7129
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
6984
7130
  /* Focus, invalid, contrast — requires theme tokens (after theme-accessibility.css). */
6985
7131
 
6986
7132
  :focus-visible {
@@ -7048,7 +7194,7 @@ button,
7048
7194
 
7049
7195
  }
7050
7196
  /* Component styles */
7051
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
7197
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
7052
7198
  /* Accordion - Mojave Theme
7053
7199
  *
7054
7200
  * No component tokens. Hover, press, chevron, divider and motion are the disclosure
@@ -7169,7 +7315,7 @@ button,
7169
7315
  overflow: hidden;
7170
7316
  }
7171
7317
 
7172
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
7318
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
7173
7319
  /* Alert Dialog - Mojave Theme
7174
7320
  *
7175
7321
  * No component tokens and no rules of its own. An alert dialog looks exactly like a
@@ -7178,7 +7324,7 @@ button,
7178
7324
  * cancel quiet, and a destructive one bold with data-color="error".
7179
7325
  */
7180
7326
 
7181
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
7327
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
7182
7328
  /* Autocomplete - Mojave Theme
7183
7329
  *
7184
7330
  * No component tokens. The input is Input (Input.css), the clear button is an icon
@@ -7380,7 +7526,7 @@ button,
7380
7526
  (reset-accessibility.css).
7381
7527
  ============================================ */
7382
7528
 
7383
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
7529
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
7384
7530
  /* Avatar - Mojave Theme
7385
7531
  *
7386
7532
  * A round picture with a ring in the page color, so avatars in a group cut out of each other in
@@ -7488,7 +7634,7 @@ button,
7488
7634
  }
7489
7635
  }
7490
7636
 
7491
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
7637
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
7492
7638
  /* Button - Mojave Theme
7493
7639
  *
7494
7640
  * Colors are the brand's emphasis levels, sizes are control.*, text is the trigger
@@ -7638,7 +7784,7 @@ button,
7638
7784
  font-size: var(--sl-icon-size-maximize);
7639
7785
  }
7640
7786
 
7641
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
7787
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
7642
7788
  /* Checkbox - Mojave Theme
7643
7789
  * Sizes follow the label: the box is the icon size one tier above the label's text
7644
7790
  * tier (like a button's icon) and the check mark one tier below it.
@@ -7795,7 +7941,7 @@ button,
7795
7941
  border-radius: var(--sl-radius-pill);
7796
7942
  }
7797
7943
 
7798
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
7944
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
7799
7945
  /* Checkbox Group - Mojave Theme */
7800
7946
 
7801
7947
  /* Each checkbox row is already a full tap target tall, so the rows sit close. */
@@ -7811,7 +7957,7 @@ button,
7811
7957
  pointer-events: none;
7812
7958
  }
7813
7959
 
7814
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
7960
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
7815
7961
  /* Collapsible - Mojave Theme
7816
7962
  *
7817
7963
  * No component tokens. Hover, press, chevron and motion are the disclosure concept
@@ -7927,7 +8073,7 @@ button,
7927
8073
  background: var(--sl-surface-raised);
7928
8074
  }
7929
8075
 
7930
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
8076
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
7931
8077
  /* Combobox - Mojave Theme
7932
8078
  *
7933
8079
  * No component tokens. The input is Input (Input.css); the chips box is a field; the
@@ -8412,7 +8558,7 @@ button,
8412
8558
  color: var(--sl-text-tertiary);
8413
8559
  }
8414
8560
 
8415
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
8561
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
8416
8562
  /* Context Menu - Mojave Theme
8417
8563
  *
8418
8564
  * 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
@@ -8581,7 +8727,7 @@ button,
8581
8727
  stroke-width: var(--sl-stroke-default);
8582
8728
  }
8583
8729
 
8584
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
8730
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
8585
8731
  /* Dialog and Alert dialog - Mojave Theme
8586
8732
  *
8587
8733
  * Both are centered modals built from the modal concept (tokens/semantic/modal.json):
@@ -8727,12 +8873,14 @@ button,
8727
8873
  margin-top: var(--sl-modal-actions-spacing);
8728
8874
  }
8729
8875
 
8730
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
8876
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
8731
8877
  /* Drawer - a panel that slides in from an edge and can be swiped away.
8732
8878
  The surface, scrim, heading and motion are the modal concept's (--sl-modal-*), so a
8733
8879
  drawer reads as a dialog's sibling; only its size and grab bar are its own
8734
8880
  (--sl-drawer-*). Base UI supplies the swipe through
8735
- --drawer-swipe-movement-x/y and data-swipe-direction on the popup. */
8881
+ --drawer-swipe-movement-x/y and data-swipe-direction on the popup.
8882
+ The working-paper rule (rule.width, 0 by default) replaces the top border with a heavier
8883
+ line in rule.color. It is an inset shadow, so it stays put while the drawer scrolls. */
8736
8884
 
8737
8885
  .DrawerBackdrop {
8738
8886
  position: fixed;
@@ -8769,6 +8917,8 @@ button,
8769
8917
  overflow-y: auto;
8770
8918
  overscroll-behavior: contain;
8771
8919
  pointer-events: auto;
8920
+ border-top-width: max(0px, var(--sl-modal-border-width) - var(--sl-rule-width) * 1000);
8921
+ box-shadow: inset 0 var(--sl-rule-width) 0 0 var(--sl-rule-color), var(--sl-modal-shadow);
8772
8922
  transform: translate(var(--drawer-swipe-movement-x, 0px), var(--drawer-swipe-movement-y, 0px));
8773
8923
  transition: transform calc(var(--sl-modal-animation-duration) * var(--drawer-swipe-strength, 1)) var(--sl-modal-animation-easing);
8774
8924
  }
@@ -8799,6 +8949,8 @@ button,
8799
8949
  max-height: var(--sl-drawer-popup-max-size);
8800
8950
  border-top: 0;
8801
8951
  border-radius: 0 0 var(--sl-modal-radius) var(--sl-modal-radius);
8952
+ /* Its top edge is the screen's, so no rule. */
8953
+ box-shadow: var(--sl-modal-shadow);
8802
8954
  }
8803
8955
 
8804
8956
  .DrawerPopup[data-swipe-direction='right'] {
@@ -8854,7 +9006,7 @@ button,
8854
9006
  color: var(--sl-modal-description-color);
8855
9007
  }
8856
9008
 
8857
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
9009
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
8858
9010
  /* Field - Mojave Theme
8859
9011
  *
8860
9012
  * Label, control, description and error. No component tokens: spacing is the field
@@ -8915,7 +9067,7 @@ textarea.FieldControl {
8915
9067
  height: auto;
8916
9068
  }
8917
9069
 
8918
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
9070
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
8919
9071
  /* Fieldset - Mojave Theme
8920
9072
  *
8921
9073
  * No component tokens: a titled group of fields, spaced by the stack gaps, with
@@ -8957,7 +9109,7 @@ textarea.FieldControl {
8957
9109
  color: var(--sl-text-secondary);
8958
9110
  }
8959
9111
 
8960
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
9112
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
8961
9113
  /* Form - Mojave Theme
8962
9114
  *
8963
9115
  * No component tokens: fields stack with the large block space, and the action
@@ -8977,7 +9129,7 @@ textarea.FieldControl {
8977
9129
  margin-top: var(--sl-space-block-md);
8978
9130
  }
8979
9131
 
8980
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
9132
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
8981
9133
  /* Input - Mojave Theme
8982
9134
  *
8983
9135
  * No component tokens: the look is the field concept (tokens/semantic/field.json),
@@ -9114,7 +9266,7 @@ textarea.FieldControl {
9114
9266
  padding-inline: var(--sl-control-padding-inline-lg);
9115
9267
  }
9116
9268
 
9117
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
9269
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
9118
9270
  /* Menu - Mojave Theme
9119
9271
  *
9120
9272
  * No component tokens. The trigger is a Button. The popup is the popup concept, rows are item rows at the
@@ -9263,7 +9415,7 @@ textarea.FieldControl {
9263
9415
  color: var(--sl-text-tertiary);
9264
9416
  }
9265
9417
 
9266
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
9418
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
9267
9419
  /* Menubar - Mojave Theme
9268
9420
  *
9269
9421
  * No component tokens. A row of quiet triggers, each opening a menu. The popup is the popup concept, rows are item rows at the
@@ -9456,7 +9608,7 @@ textarea.FieldControl {
9456
9608
  color: var(--sl-text-tertiary);
9457
9609
  }
9458
9610
 
9459
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
9611
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
9460
9612
  /* Meter - Mojave Theme
9461
9613
  *
9462
9614
  * A gauge (tokens/semantic/gauge.json). The fill is the solid color of the scope around it:
@@ -9519,7 +9671,7 @@ textarea.FieldControl {
9519
9671
  height: var(--sl-gauge-height-lg);
9520
9672
  }
9521
9673
 
9522
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
9674
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
9523
9675
  /* Navigation Menu - Mojave Theme
9524
9676
  *
9525
9677
  * The strip is the bar concept, the panel is the popup concept and each link is an item
@@ -9939,7 +10091,7 @@ textarea.FieldControl {
9939
10091
  width: 100%;
9940
10092
  }
9941
10093
 
9942
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
10094
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
9943
10095
  /* Number Field - Mojave Theme
9944
10096
  *
9945
10097
  * No component tokens. The input is Input (Input.css) and the label, description and
@@ -10030,7 +10182,7 @@ textarea.FieldControl {
10030
10182
  user-select: none;
10031
10183
  }
10032
10184
 
10033
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
10185
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
10034
10186
  /* OTP Field - Mojave Theme
10035
10187
  *
10036
10188
  * One-time code entry: a row of single-character inputs. Each slot is the same control as Input
@@ -10093,7 +10245,7 @@ textarea.FieldControl {
10093
10245
  letter-spacing: var(--sl-font-body-magnify-letter-spacing);
10094
10246
  }
10095
10247
 
10096
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
10248
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
10097
10249
  /* Popover - Mojave Theme */
10098
10250
 
10099
10251
  /* ============================================
@@ -10258,7 +10410,7 @@ textarea.FieldControl {
10258
10410
  fill: var(--sl-popup-arrow-stroke);
10259
10411
  }
10260
10412
 
10261
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
10413
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
10262
10414
  /* Preview Card - Mojave Theme
10263
10415
  *
10264
10416
  * The popup concept (surface, arrow, motion) with a title-magnify title and condense
@@ -10375,7 +10527,7 @@ textarea.FieldControl {
10375
10527
  fill: var(--sl-popup-arrow-stroke);
10376
10528
  }
10377
10529
 
10378
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
10530
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
10379
10531
  /* Progress - Mojave Theme
10380
10532
  *
10381
10533
  * A gauge (tokens/semantic/gauge.json), the same bar as Meter. The fill is the solid color of
@@ -10452,7 +10604,7 @@ textarea.FieldControl {
10452
10604
  height: var(--sl-gauge-height-lg);
10453
10605
  }
10454
10606
 
10455
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
10607
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
10456
10608
  /* Radio - Mojave Theme
10457
10609
  * Same box as Checkbox, always round. Sizes follow the label the same way, and the
10458
10610
  * dot is a share of the circle (check.dot-scale).
@@ -10604,7 +10756,7 @@ textarea.FieldControl {
10604
10756
  gap: var(--sl-gap-stack-sm);
10605
10757
  }
10606
10758
 
10607
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
10759
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
10608
10760
  /* Scroll Area - Mojave Theme
10609
10761
  *
10610
10762
  * The scrollbar is the content scrollbar (content.scrollbar-*): a track that stays clear until
@@ -10686,7 +10838,7 @@ textarea.FieldControl {
10686
10838
  background: transparent;
10687
10839
  }
10688
10840
 
10689
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
10841
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
10690
10842
  /* Select - Mojave Theme
10691
10843
  *
10692
10844
  * The trigger is a field (the field pattern, control sizes, the base text style); the
@@ -10971,7 +11123,7 @@ textarea.FieldControl {
10971
11123
  stroke-width: var(--sl-stroke-default);
10972
11124
  }
10973
11125
 
10974
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
11126
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
10975
11127
  /* Separator - Mojave Theme
10976
11128
  *
10977
11129
  * A hairline in the everyday divider color (border.default), one stroke thick, with a step of
@@ -10999,7 +11151,7 @@ textarea.FieldControl {
10999
11151
  margin-inline: var(--sl-space-4);
11000
11152
  }
11001
11153
 
11002
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
11154
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
11003
11155
  /* Slider - Mojave Theme
11004
11156
  *
11005
11157
  * A slider is a gauge you can drag: the track, fill and label row are gauge.* (the same bar as
@@ -11165,7 +11317,7 @@ textarea.FieldControl {
11165
11317
  transform: translate(-50%, 50%);
11166
11318
  }
11167
11319
 
11168
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
11320
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
11169
11321
  /* Switch - Mojave Theme
11170
11322
  * Switch keeps its track sizes. The thumb, its travel and the ON/OFF text are
11171
11323
  * worked out from them: the thumb fills the track's height inside the padding,
@@ -11331,7 +11483,7 @@ textarea.FieldControl {
11331
11483
  color: var(--sl-text-disabled);
11332
11484
  }
11333
11485
 
11334
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
11486
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
11335
11487
  /* Tabs - Mojave Theme
11336
11488
  *
11337
11489
  * No component tokens. The divider, the selected line and color, hover and the disabled
@@ -11467,7 +11619,7 @@ textarea.FieldControl {
11467
11619
  padding: var(--sl-space-6);
11468
11620
  }
11469
11621
 
11470
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
11622
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
11471
11623
  /* Toast - Mojave Theme
11472
11624
  *
11473
11625
  * A toast is a notice (tokens/semantic/notice.json) on the popup surface. A toast whose type
@@ -11703,7 +11855,7 @@ textarea.FieldControl {
11703
11855
  flex-shrink: 0;
11704
11856
  }
11705
11857
 
11706
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
11858
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
11707
11859
  /* Toggle - Mojave Theme
11708
11860
  * A toggle is a button that stays pressed: the same heights, padding, gap and
11709
11861
  * trigger text style as a button of the same size. Pressed, it takes its emphasis level's
@@ -11815,7 +11967,7 @@ textarea.FieldControl {
11815
11967
  height: var(--sl-icon-size-maximize);
11816
11968
  }
11817
11969
 
11818
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
11970
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
11819
11971
  /* Toggle Group - Mojave Theme
11820
11972
  *
11821
11973
  * No component tokens. The strip is the bar concept (tokens/semantic/bar.json); the
@@ -11836,7 +11988,7 @@ textarea.FieldControl {
11836
11988
  border-radius: var(--sl-radius-item);
11837
11989
  }
11838
11990
 
11839
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
11991
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
11840
11992
  /* Toolbar - Mojave Theme
11841
11993
  *
11842
11994
  * The strip is the bar concept (tokens/semantic/bar.json). Buttons, toggles, selects
@@ -11898,7 +12050,7 @@ textarea.FieldControl {
11898
12050
  max-width: var(--sl-toolbar-input-max-width);
11899
12051
  }
11900
12052
 
11901
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
12053
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
11902
12054
  /* Tooltip - Mojave Theme
11903
12055
  *
11904
12056
  * The inverse surface (surface.inverse, text.on-inverse-surface) with condense text, so a tooltip
@@ -11959,7 +12111,7 @@ textarea.FieldControl {
11959
12111
  }
11960
12112
 
11961
12113
  /* Custom components: not Base UI parts. Built from existing concepts and tokens. */
11962
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
12114
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
11963
12115
  /* Badge
11964
12116
  *
11965
12117
  * A status or count label. Not a Base UI part, and not interactive: no hover or focus.
@@ -12064,7 +12216,7 @@ textarea.FieldControl {
12064
12216
  height: var(--sl-badge-dot-base);
12065
12217
  }
12066
12218
 
12067
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
12219
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
12068
12220
  /*
12069
12221
  * DatePicker: a field that opens a calendar for one date or a period.
12070
12222
  * Not a Base UI part. The popup is Popover on a wide viewport and Drawer
@@ -12637,7 +12789,7 @@ textarea.FieldControl {
12637
12789
  flex-basis: 100%;
12638
12790
  }
12639
12791
 
12640
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
12792
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
12641
12793
  /* Money field
12642
12794
  *
12643
12795
  * An amount of money, built on Number field. The value is an integer in minor units
@@ -12982,7 +13134,7 @@ textarea.FieldControl {
12982
13134
  letter-spacing: var(--sl-font-body-base-letter-spacing);
12983
13135
  }
12984
13136
 
12985
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
13137
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
12986
13138
  /* ListDetail
12987
13139
  *
12988
13140
  * The detail of one item, next to its list. Not a Base UI part. It is a Splitter
@@ -13109,7 +13261,7 @@ textarea.FieldControl {
13109
13261
  background: transparent;
13110
13262
  }
13111
13263
 
13112
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
13264
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
13113
13265
  /* Splitter
13114
13266
  *
13115
13267
  * Two or more panels and a handle between them. Not a Base UI part. It follows the
@@ -13317,7 +13469,7 @@ textarea.FieldControl {
13317
13469
  background: var(--sl-border-default);
13318
13470
  }
13319
13471
 
13320
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
13472
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
13321
13473
  /* EmptyState
13322
13474
  *
13323
13475
  * The block a page, pane, table, list or popup shows when it has nothing to show.
@@ -13573,7 +13725,7 @@ textarea.FieldControl {
13573
13725
  color: inherit;
13574
13726
  }
13575
13727
 
13576
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
13728
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
13577
13729
  /* Table - Mojave Theme
13578
13730
  *
13579
13731
  * Base UI has no table, so this styles the native <table class="Table"> elements with the
@@ -13586,6 +13738,13 @@ textarea.FieldControl {
13586
13738
  * `<tr><td data-empty colSpan={n}><EmptyState size="compact" … /></td></tr>`. A cell with
13587
13739
  * only text still uses this rule's padding. A cell whose child is an EmptyState lets the
13588
13740
  * empty state pad itself. The empty row does not take the row hover.
13741
+ *
13742
+ * Totals: tr data-total="subtotal" draws a single rule above the row, and data-total="grand"
13743
+ * a rule above and a double rule under, as on a working paper (table.total-*). They work in
13744
+ * tbody or tfoot. A tfoot row without data-total keeps the header tray band.
13745
+ *
13746
+ * The working-paper rule (rule.width, 0 by default) replaces the table's top border with a
13747
+ * heavier line in rule.color, drawn on the first row's cells so it stays with a sticky header.
13589
13748
  */
13590
13749
 
13591
13750
  .Table {
@@ -13604,6 +13763,15 @@ textarea.FieldControl {
13604
13763
  border-radius: var(--sl-table-radius);
13605
13764
  overflow: hidden;
13606
13765
  font-variant-numeric: tabular-nums;
13766
+ /* The top border steps aside while the working-paper rule is on (any rule.width above 0). */
13767
+ border-top-width: max(0px, var(--sl-stroke-default) - var(--sl-rule-width) * 1000);
13768
+ }
13769
+
13770
+ /* The working-paper rule, on the first row: the header, or the body when there is none.
13771
+ At rule.width 0 this is no border at all. */
13772
+ .Table > thead > tr:first-child > *,
13773
+ .Table:not(:has(> thead)) > tbody:first-of-type > tr:first-child > * {
13774
+ border-top: var(--sl-rule-width) solid var(--sl-rule-color);
13607
13775
  }
13608
13776
 
13609
13777
  .Table caption {
@@ -13715,6 +13883,52 @@ textarea.FieldControl {
13715
13883
  border-bottom: none;
13716
13884
  }
13717
13885
 
13886
+ /* Subtotal and grand total rows: rules instead of a band, in the subtitle weight.
13887
+ Hover and selection don't apply: a total is not a record. */
13888
+ .Table tr[data-total] > * {
13889
+ font-family: var(--sl-font-subtitle-condense-font-family);
13890
+ font-size: var(--sl-font-subtitle-condense-font-size);
13891
+ font-weight: var(--sl-font-subtitle-condense-font-weight);
13892
+ line-height: var(--sl-font-subtitle-condense-line-height);
13893
+ letter-spacing: var(--sl-font-subtitle-condense-letter-spacing);
13894
+ background: var(--sl-table-total-background);
13895
+ color: var(--sl-table-color);
13896
+ border-top: var(--sl-table-subtotal-rule-width) solid var(--sl-table-total-rule-color);
13897
+ }
13898
+
13899
+ .Table tbody tr[data-total] > * {
13900
+ border-bottom: var(--sl-stroke-default) solid var(--sl-table-row-border-color);
13901
+ }
13902
+
13903
+ .Table tbody tr[data-total]:last-child:not([data-total='grand']) > * {
13904
+ border-bottom: none;
13905
+ }
13906
+
13907
+ /* The grand total: a double rule under the figures. */
13908
+ .Table :is(tbody, tfoot) tr[data-total='grand'] > * {
13909
+ border-bottom: var(--sl-table-grand-total-rule-width) double var(--sl-table-total-rule-color);
13910
+ }
13911
+
13912
+ /* A label or blank cell in a total row can leave the rules off, so they only run under the
13913
+ figures: data-rule="none" on the cell. */
13914
+ .Table :is(tbody, tfoot) tr[data-total] > [data-rule='none'] {
13915
+ border-top-color: transparent;
13916
+ border-bottom-color: transparent;
13917
+ }
13918
+
13919
+ /* In the footer the body's last row has no line under it, so those cells keep the footer's
13920
+ usual line on top. */
13921
+ .Table tfoot tr[data-total] > [data-rule='none'] {
13922
+ border-top: var(--sl-stroke-default) solid var(--sl-table-border-color);
13923
+ }
13924
+
13925
+ @media (hover: hover) {
13926
+ .Table tbody tr[data-total]:hover > * {
13927
+ background: var(--sl-table-total-background);
13928
+ color: var(--sl-table-color);
13929
+ }
13930
+ }
13931
+
13718
13932
  /* A header that stays put while the body scrolls (the table's wrapper scrolls) */
13719
13933
  .Table[data-sticky-header] thead th {
13720
13934
  position: sticky;
@@ -13745,23 +13959,28 @@ textarea.FieldControl {
13745
13959
  color: inherit;
13746
13960
  }
13747
13961
 
13748
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
13962
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
13749
13963
  /* Collection
13750
13964
  *
13751
13965
  * DataTable, DataList, the toolbar and the pagination, in one place so the two views
13752
13966
  * share the table concept. Sections: toolbar, table additions, groups, list, pagination, sizes.
13753
13967
  * Each section is its own file so the design system can name the part. This file brings them in.
13754
13968
  *
13755
- * The selection bar replaces the trailing controls (filters, sort, clear, actions) and leaves
13969
+ * The selection bar replaces the trailing controls (filters, sort, actions) and leaves
13756
13970
  * the tabs and the search where they are, so selecting rows does not grow the toolbar.
13757
13971
  */
13758
13972
 
13759
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
13973
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
13760
13974
  /* Collection toolbar
13761
13975
  *
13762
13976
  * The wrap follows the toolbar's own width, not the window: a table in a narrow pane wraps
13763
- * even when the page is wide. Search takes the full width first. Filters wrap under it.
13977
+ * even when the page is wide. Search grows to fill the row beside the trailing controls, and
13978
+ * wraps to its own line before it shrinks under collection.search-min-width. Under the narrow
13979
+ * width it takes the full row and filters wrap under it.
13764
13980
  * A container query cannot read the width token, so the component also sets data-narrow.
13981
+ *
13982
+ * The search icon and the clear button sit inside the field. The browser's own search cancel
13983
+ * is hidden by the reset, so the clear button is the only one, in every browser.
13765
13984
  */
13766
13985
 
13767
13986
  .CollectionToolbar {
@@ -13773,7 +13992,6 @@ textarea.FieldControl {
13773
13992
  }
13774
13993
 
13775
13994
  .CollectionToolbarMain,
13776
- .CollectionToolbarTrailing,
13777
13995
  .CollectionSelectionBar,
13778
13996
  .CollectionSort {
13779
13997
  display: flex;
@@ -13786,11 +14004,90 @@ textarea.FieldControl {
13786
14004
  display: flex;
13787
14005
  align-items: center;
13788
14006
  gap: var(--sl-collection-toolbar-gap);
14007
+ flex: 1 1 0;
14008
+ min-width: min(100%, var(--sl-collection-search-min-width));
14009
+ }
14010
+
14011
+ .CollectionSearchField {
14012
+ position: relative;
14013
+ flex: 1 1 auto;
13789
14014
  min-width: 0;
13790
14015
  }
13791
14016
 
13792
- .CollectionSearch .Input {
14017
+ /* Scoped to the field so it wins over Input.css, which loads later. */
14018
+ .CollectionSearchField .Input {
13793
14019
  min-width: 0;
14020
+ padding-inline-start: calc(var(--sl-control-padding-inline) + var(--sl-icon-size-magnify) + var(--sl-space-2));
14021
+ }
14022
+
14023
+ .CollectionSearchField[data-filled] .Input {
14024
+ padding-inline-end: calc(var(--sl-control-padding-inline) + var(--sl-icon-button-size));
14025
+ }
14026
+
14027
+ .CollectionSearchIcon {
14028
+ position: absolute;
14029
+ inset-inline-start: var(--sl-control-padding-inline);
14030
+ inset-block-start: 50%;
14031
+ transform: translateY(-50%);
14032
+ width: var(--sl-icon-size-magnify);
14033
+ height: var(--sl-icon-size-magnify);
14034
+ font-size: var(--sl-icon-size-magnify);
14035
+ line-height: 1;
14036
+ color: var(--sl-field-affix-color);
14037
+ pointer-events: none;
14038
+ }
14039
+
14040
+ .CollectionSearchClear {
14041
+ display: flex;
14042
+ align-items: center;
14043
+ justify-content: center;
14044
+ flex-shrink: 0;
14045
+ width: var(--sl-icon-button-size);
14046
+ height: var(--sl-icon-button-size);
14047
+ padding: 0;
14048
+ border: none;
14049
+ border-radius: var(--sl-icon-button-radius);
14050
+ background: transparent;
14051
+ color: var(--sl-icon-button-color);
14052
+ cursor: pointer;
14053
+ outline: none;
14054
+ transition: var(--sl-icon-button-transition);
14055
+ position: absolute;
14056
+ inset-inline-end: var(--sl-space-3);
14057
+ inset-block-start: 50%;
14058
+ transform: translateY(-50%);
14059
+ font-size: var(--sl-icon-size-magnify);
14060
+ line-height: 1;
14061
+ }
14062
+
14063
+ .CollectionSearchClear:hover {
14064
+ background: var(--sl-icon-button-background-hover);
14065
+ color: var(--sl-icon-button-color-hover);
14066
+ }
14067
+
14068
+ .CollectionSearchClear:focus-visible {
14069
+ outline: var(--sl-focus-outline);
14070
+ outline-offset: var(--sl-focus-outline-offset);
14071
+ box-shadow: 0 0 0 var(--sl-focus-halo-spread) var(--sl-focus-halo-color);
14072
+ }
14073
+
14074
+ /* The trailing controls join the main row one by one, so each keeps its own width and
14075
+ wraps under the search on its own rather than squeezing. Search takes what is left. */
14076
+ .CollectionToolbarTrailing {
14077
+ display: contents;
14078
+ }
14079
+
14080
+ .CollectionSelectionBar {
14081
+ flex: 0 0 auto;
14082
+ max-width: 100%;
14083
+ }
14084
+
14085
+ /* Select.css and Combobox.css fill their container. In the row they size to their text. */
14086
+ .CollectionToolbarMain .SelectTrigger,
14087
+ .CollectionToolbarMain .ComboboxInputWrapper {
14088
+ flex: none;
14089
+ width: auto;
14090
+ max-width: 100%;
13794
14091
  }
13795
14092
 
13796
14093
  .CollectionToolbarActions {
@@ -13814,7 +14111,7 @@ textarea.FieldControl {
13814
14111
  letter-spacing: var(--sl-font-body-condense-letter-spacing);
13815
14112
  }
13816
14113
 
13817
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
14114
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
13818
14115
  /* DataTable additions on top of .Table.
13819
14116
  *
13820
14117
  * Sort buttons fill the header cell and inherit its hover, so old aria-sort markup keeps
@@ -13935,12 +14232,15 @@ textarea.FieldControl {
13935
14232
  color: var(--sl-table-subtle-color);
13936
14233
  }
13937
14234
 
13938
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
14235
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
13939
14236
  /* DataList
13940
14237
  *
13941
14238
  * The same rows as the table, in one container with the table's borders, hover, selected
13942
14239
  * and current states. Not a stack of floating cards: the two views should read as one family.
13943
14240
  * variant=cards adds the surface radius and a gap when a queue should read as separate items.
14241
+ *
14242
+ * The working-paper rule (rule.width, 0 by default) replaces the top border with a heavier
14243
+ * line in rule.color: on the first row, or on each card's top edge.
13944
14244
  */
13945
14245
 
13946
14246
  .DataList {
@@ -13959,6 +14259,13 @@ textarea.FieldControl {
13959
14259
  background: var(--sl-table-background);
13960
14260
  border: var(--sl-stroke-default) solid var(--sl-table-border-color);
13961
14261
  border-radius: var(--sl-table-radius);
14262
+ /* The top border steps aside while the working-paper rule is on (any rule.width above 0). */
14263
+ border-top-width: max(0px, var(--sl-stroke-default) - var(--sl-rule-width) * 1000);
14264
+ }
14265
+
14266
+ /* The working-paper rule on the first row. At rule.width 0 this is no border at all. */
14267
+ .DataList ul > li:first-child {
14268
+ border-top: var(--sl-rule-width) solid var(--sl-rule-color);
13962
14269
  }
13963
14270
 
13964
14271
  .DataList li {
@@ -14052,6 +14359,14 @@ textarea.FieldControl {
14052
14359
  background: var(--sl-table-background);
14053
14360
  border: var(--sl-stroke-default) solid var(--sl-table-border-color);
14054
14361
  border-radius: var(--sl-table-radius);
14362
+ border-top-width: max(0px, var(--sl-stroke-default) - var(--sl-rule-width) * 1000);
14363
+ box-shadow: inset 0 var(--sl-rule-width) 0 0 var(--sl-rule-color);
14364
+ }
14365
+
14366
+ .DataList[data-variant='cards'] li[aria-current='true'] {
14367
+ box-shadow:
14368
+ inset var(--sl-stroke-strong) 0 0 0 var(--sl-border-accent),
14369
+ inset 0 var(--sl-rule-width) 0 0 var(--sl-rule-color);
14055
14370
  }
14056
14371
 
14057
14372
  .DataList[data-loading] ul {
@@ -14059,7 +14374,7 @@ textarea.FieldControl {
14059
14374
  transition: opacity var(--sl-duration-fast) var(--sl-easing-default);
14060
14375
  }
14061
14376
 
14062
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
14377
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
14063
14378
  /* Pagination
14064
14379
  *
14065
14380
  * Not tied to a collection. Anything with a page, a page count and a total can use it.
@@ -14084,7 +14399,7 @@ textarea.FieldControl {
14084
14399
  margin: 0;
14085
14400
  }
14086
14401
 
14087
- /* @scattered-light/loomiere-base-ui 0.7.0 · styles for @base-ui/react 1.9.0 */
14402
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
14088
14403
  /* EditableList
14089
14404
  *
14090
14405
  * One table at every width, so a field is not submitted twice. Under the stack width each
@@ -14182,3 +14497,231 @@ textarea.FieldControl {
14182
14497
  letter-spacing: var(--sl-font-subtitle-condense-letter-spacing);
14183
14498
  }
14184
14499
  }
14500
+
14501
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
14502
+ /* Sheet
14503
+ *
14504
+ * A working-paper surface: the raised surface with a heavier rule across its top
14505
+ * (sheet.rule-width in sheet.rule-color) instead of its top border, and an optional tab
14506
+ * label that sits on the rule like the tab of a ledger page. The tab is caps-condense on
14507
+ * the inverse surface. An action (an Edit link, a count) sits at the end of the header row.
14508
+ * Tokens: sheet.* (tokens/component/sheet.json).
14509
+ *
14510
+ * Content runs edge to edge, so a Table, DataList or leader DescriptionList inside lines up
14511
+ * with the sheet's sides; data-inset on SheetBody pads it by sheet.padding instead. A Table
14512
+ * inside drops its own outer border and corners, since the sheet is its frame.
14513
+ */
14514
+
14515
+ .Sheet {
14516
+ box-sizing: border-box;
14517
+ display: flex;
14518
+ flex-direction: column;
14519
+ min-width: 0;
14520
+ }
14521
+
14522
+ .SheetHeader {
14523
+ display: flex;
14524
+ align-items: flex-end;
14525
+ gap: var(--sl-sheet-header-gap);
14526
+ min-height: var(--sl-sheet-tab-height);
14527
+ }
14528
+
14529
+ .SheetTab {
14530
+ font-family: var(--sl-font-caps-condense-font-family);
14531
+ font-size: var(--sl-font-caps-condense-font-size);
14532
+ font-weight: var(--sl-font-caps-condense-font-weight);
14533
+ line-height: var(--sl-font-caps-condense-line-height);
14534
+ letter-spacing: var(--sl-font-caps-condense-letter-spacing);
14535
+ text-transform: var(--sl-font-caps-condense-text-transform);
14536
+ display: inline-flex;
14537
+ align-items: center;
14538
+ height: var(--sl-sheet-tab-height);
14539
+ padding-inline: var(--sl-sheet-tab-padding-inline);
14540
+ background: var(--sl-sheet-tab-background);
14541
+ color: var(--sl-sheet-tab-color);
14542
+ border-radius: var(--sl-sheet-tab-radius) var(--sl-sheet-tab-radius) 0 0;
14543
+ white-space: nowrap;
14544
+ }
14545
+
14546
+ .SheetAction {
14547
+ font-family: var(--sl-font-subtitle-condense-font-family);
14548
+ font-size: var(--sl-font-subtitle-condense-font-size);
14549
+ font-weight: var(--sl-font-subtitle-condense-font-weight);
14550
+ line-height: var(--sl-font-subtitle-condense-line-height);
14551
+ letter-spacing: var(--sl-font-subtitle-condense-letter-spacing);
14552
+ margin-inline-start: auto;
14553
+ padding-block-end: var(--sl-space-1);
14554
+ }
14555
+
14556
+ .SheetBody {
14557
+ box-sizing: border-box;
14558
+ flex: 1;
14559
+ min-width: 0;
14560
+ background: var(--sl-sheet-background);
14561
+ border: var(--sl-sheet-border-width) solid var(--sl-sheet-border-color);
14562
+ border-top: var(--sl-sheet-rule-width) solid var(--sl-sheet-rule-color);
14563
+ border-radius: var(--sl-sheet-radius);
14564
+ /* Rows inside keep to the rounded corners. clip, not hidden, so a sticky header still sticks. */
14565
+ overflow: clip;
14566
+ }
14567
+
14568
+ /* Under a tab the top corners stay square, so the tab sits flush on the rule. */
14569
+ .Sheet[data-tab] > .SheetBody {
14570
+ border-start-start-radius: 0;
14571
+ border-start-end-radius: 0;
14572
+ }
14573
+
14574
+ .SheetBody[data-inset] {
14575
+ padding: var(--sl-sheet-padding);
14576
+ }
14577
+
14578
+ /* The sheet is the frame: a table or list inside drops its own outer edge. */
14579
+ .SheetBody > .Table,
14580
+ .SheetBody > .CollectionView .Table,
14581
+ .SheetBody > .DataList ul {
14582
+ border: 0;
14583
+ border-radius: 0;
14584
+ }
14585
+
14586
+ .SheetBody > .Table > thead > tr:first-child > *,
14587
+ .SheetBody > .Table:not(:has(> thead)) > tbody:first-of-type > tr:first-child > *,
14588
+ .SheetBody > .DataList ul > li:first-child {
14589
+ border-top: 0;
14590
+ }
14591
+
14592
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
14593
+ /* StatFigure
14594
+ *
14595
+ * One large figure with a caps label above and a caption under it. The label is
14596
+ * caps-condense, the figure uses the figures text family (mono, tabular numbers) at
14597
+ * stat-figure.figure-font-size, the caption is body-condense. data-underline="double"
14598
+ * draws a double rule under the figure only, the accountant's mark for a final total;
14599
+ * data-tone="accent" colors the figure; data-size="sm" makes it smaller for a row of figures.
14600
+ * Tokens: stat-figure.* (tokens/component/stat-figure.json).
14601
+ */
14602
+
14603
+ .StatFigure {
14604
+ display: inline-flex;
14605
+ flex-direction: column;
14606
+ align-items: flex-start;
14607
+ gap: var(--sl-stat-figure-gap);
14608
+ min-width: 0;
14609
+ }
14610
+
14611
+ .StatFigureLabel {
14612
+ font-family: var(--sl-font-caps-condense-font-family);
14613
+ font-size: var(--sl-font-caps-condense-font-size);
14614
+ font-weight: var(--sl-font-caps-condense-font-weight);
14615
+ line-height: var(--sl-font-caps-condense-line-height);
14616
+ letter-spacing: var(--sl-font-caps-condense-letter-spacing);
14617
+ text-transform: var(--sl-font-caps-condense-text-transform);
14618
+ color: var(--sl-stat-figure-label-color);
14619
+ }
14620
+
14621
+ .StatFigureValue {
14622
+ font-family: var(--sl-font-figures-base-font-family);
14623
+ font-variant-numeric: var(--sl-font-figures-base-font-variant-numeric);
14624
+ font-size: var(--sl-stat-figure-figure-font-size);
14625
+ font-weight: var(--sl-stat-figure-figure-font-weight);
14626
+ line-height: var(--sl-stat-figure-figure-line-height);
14627
+ color: var(--sl-stat-figure-figure-color);
14628
+ white-space: nowrap;
14629
+ }
14630
+
14631
+ .StatFigure[data-size='sm'] .StatFigureValue {
14632
+ font-size: var(--sl-stat-figure-figure-font-size-sm);
14633
+ line-height: var(--sl-stat-figure-figure-line-height-sm);
14634
+ }
14635
+
14636
+ .StatFigure[data-tone='accent'] .StatFigureValue {
14637
+ color: var(--sl-stat-figure-figure-color-accent);
14638
+ }
14639
+
14640
+ .StatFigure[data-underline='double'] .StatFigureValue {
14641
+ border-bottom: var(--sl-stat-figure-underline-width) double var(--sl-stat-figure-underline-color);
14642
+ }
14643
+
14644
+ .StatFigureCaption {
14645
+ font-family: var(--sl-font-body-condense-font-family);
14646
+ font-size: var(--sl-font-body-condense-font-size);
14647
+ font-weight: var(--sl-font-body-condense-font-weight);
14648
+ line-height: var(--sl-font-body-condense-line-height);
14649
+ letter-spacing: var(--sl-font-body-condense-letter-spacing);
14650
+ color: var(--sl-stat-figure-caption-color);
14651
+ }
14652
+
14653
+ /* @scattered-light/loomiere-base-ui 0.8.0 · styles for @base-ui/react 1.9.0 */
14654
+ /* DescriptionList
14655
+ *
14656
+ * Label and value pairs in a native dl, one DescriptionItem (a div holding a dt and a dd)
14657
+ * per pair, with a hairline between pairs. The default variant sets labels in a column
14658
+ * beside their values. data-variant="leader" runs a dotted leader from each label to its
14659
+ * value, which sits at the end of the row, as on a working paper. Labels are body text
14660
+ * in the secondary color, values primary text with tabular numbers.
14661
+ * Tokens: description-list.* (tokens/component/description-list.json).
14662
+ */
14663
+
14664
+ .DescriptionList {
14665
+ font-family: var(--sl-font-body-base-font-family);
14666
+ font-size: var(--sl-font-body-base-font-size);
14667
+ font-weight: var(--sl-font-body-base-font-weight);
14668
+ line-height: var(--sl-font-body-base-line-height);
14669
+ letter-spacing: var(--sl-font-body-base-letter-spacing);
14670
+ margin: 0;
14671
+ padding: 0;
14672
+ font-variant-numeric: tabular-nums;
14673
+ }
14674
+
14675
+ .DescriptionItem {
14676
+ display: grid;
14677
+ grid-template-columns: var(--sl-description-list-label-width) 2fr;
14678
+ align-items: baseline;
14679
+ column-gap: var(--sl-description-list-column-gap);
14680
+ padding-block: var(--sl-description-list-row-padding-block);
14681
+ padding-inline: var(--sl-description-list-row-padding-inline);
14682
+ border-bottom: var(--sl-stroke-default) solid var(--sl-description-list-row-border-color);
14683
+ }
14684
+
14685
+ .DescriptionItem:last-child {
14686
+ border-bottom: none;
14687
+ }
14688
+
14689
+ .DescriptionTerm {
14690
+ margin: 0;
14691
+ color: var(--sl-description-list-label-color);
14692
+ }
14693
+
14694
+ .DescriptionDetails {
14695
+ margin: 0;
14696
+ min-width: 0;
14697
+ color: var(--sl-description-list-value-color);
14698
+ overflow-wrap: anywhere;
14699
+ }
14700
+
14701
+ /* Leader: the label grows to fill the row, and its ::after is the dotted line that leads
14702
+ to the value. The line sits on the text's baseline. */
14703
+ .DescriptionList[data-variant='leader'] .DescriptionItem {
14704
+ display: flex;
14705
+ column-gap: var(--sl-description-list-leader-gap);
14706
+ }
14707
+
14708
+ .DescriptionList[data-variant='leader'] .DescriptionTerm {
14709
+ display: flex;
14710
+ flex: 1 1 auto;
14711
+ align-items: baseline;
14712
+ gap: var(--sl-description-list-leader-gap);
14713
+ min-width: 0;
14714
+ }
14715
+
14716
+ .DescriptionList[data-variant='leader'] .DescriptionTerm::after {
14717
+ content: '';
14718
+ flex: 1 1 var(--sl-space-6);
14719
+ min-width: var(--sl-space-6);
14720
+ border-bottom: var(--sl-description-list-leader-width) dotted var(--sl-description-list-leader-color);
14721
+ }
14722
+
14723
+ .DescriptionList[data-variant='leader'] .DescriptionDetails {
14724
+ flex: 0 1 auto;
14725
+ max-width: 60%;
14726
+ text-align: end;
14727
+ }