@scattered-light/loomiere-mojave 0.7.1 → 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 (32) 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/ContextMenu/README.md +1 -1
  5. package/dist/exports/design-system/components/ContextMenu/preview.html +1 -1
  6. package/dist/exports/design-system/components/DataList/README.md +1 -1
  7. package/dist/exports/design-system/components/DataList/preview.html +1 -1
  8. package/dist/exports/design-system/components/DataTable/README.md +1 -1
  9. package/dist/exports/design-system/components/DataTable/preview.html +38 -38
  10. package/dist/exports/design-system/components/DescriptionList/README.md +41 -0
  11. package/dist/exports/design-system/components/DescriptionList/preview.html +19 -0
  12. package/dist/exports/design-system/components/Drawer/README.md +1 -1
  13. package/dist/exports/design-system/components/ScrollArea/preview.html +2 -2
  14. package/dist/exports/design-system/components/Sheet/README.md +46 -0
  15. package/dist/exports/design-system/components/Sheet/preview.html +19 -0
  16. package/dist/exports/design-system/components/StatFigure/README.md +38 -0
  17. package/dist/exports/design-system/components/StatFigure/preview.html +19 -0
  18. package/dist/exports/design-system/components/Table/README.md +2 -2
  19. package/dist/exports/design-system/components/Table/preview.html +2 -2
  20. package/dist/exports/design-system/components/bundle.css +620 -161
  21. package/dist/exports/design-system/components/bundle.js +7 -7
  22. package/dist/exports/design-system/components/index.d.ts +1 -1
  23. package/dist/exports/design-system/tokens.json +35 -0
  24. package/dist/exports/figma.json +1 -1
  25. package/dist/exports/tailwind.css +81 -0
  26. package/dist/exports/tokens.dtcg.json +313 -26
  27. package/dist/tokens.css +220 -105
  28. package/dist/tokens.d.ts +78 -0
  29. package/dist/tokens.js +79 -1
  30. package/dist/tokens.json +580 -27
  31. package/dist/utilities.css +30 -0
  32. 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. */
@@ -1856,6 +1982,10 @@
1856
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. */
1857
1983
  --sl-collection-editable-list-stack-width: var(--sl-space-80); /** Below this, editable rows stack and show their own labels. 320px matches. */
1858
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. */
1859
1989
  --sl-drawer-handle-width: var(--sl-space-10); /** Grab bar length. */
1860
1990
  --sl-drawer-handle-height: var(--sl-space-1); /** Grab bar thickness. */
1861
1991
  --sl-list-detail-header-gap: var(--sl-space-3); /** Space between the title, the actions and Close. */
@@ -1863,9 +1993,22 @@
1863
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. */
1864
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. */
1865
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. */
1866
2002
  --sl-slider-thumb-size: var(--sl-space-5); /** Knob diameter, big enough to grab with a finger on a 4px track. */
1867
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. */
1868
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. */
1869
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. */
1870
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. */
1871
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. */
@@ -1896,73 +2039,12 @@
1896
2039
  --sl-color-chrome-on-1000: var(--sl-color-neutral-on-1000);
1897
2040
  --sl-color-chrome-on-1100: var(--sl-color-neutral-on-1100);
1898
2041
  --sl-color-chrome-on-1200: var(--sl-color-neutral-on-1200);
1899
- --sl-a11y-focus-ring-radius: var(--sl-radius-focus); /** Rounds the focus ring to match the small control radius. */
1900
2042
  --sl-bar-border-width: var(--sl-stroke-default); /** Strip edge thickness. */
1901
- --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. */
1902
- --sl-calendar-day-radius: var(--sl-radius-pill); /** Selected days are circles. The pill radius is the same full radius badges and switches use. */
1903
- --sl-check-border-width: var(--sl-stroke-default); /** Edge thickness. */
1904
- --sl-check-radius: var(--sl-radius-box); /** Checkbox corners. Radios are always round. */
1905
- --sl-check-transition: var(--sl-transition-input); /** Changes at the same speed as a field. */
1906
- --sl-status-error: var(--sl-scope-error-signal); /** Errors and destructive actions. */
1907
- --sl-status-error-dark: var(--sl-scope-error-fg); /** Error color for text or icons that need more contrast than the base color. */
1908
- --sl-status-error-light: var(--sl-scope-error-soft); /** Error tint for backgrounds behind error messages. */
1909
- --sl-status-info: var(--sl-scope-info-signal); /** Neutral notices and help. */
1910
- --sl-status-info-dark: var(--sl-scope-info-fg); /** Info color for text or icons that need more contrast. */
1911
- --sl-status-info-light: var(--sl-scope-info-soft); /** Info tint for notice backgrounds. */
1912
- --sl-status-success: var(--sl-scope-success-signal); /** Confirmations and completed states. */
1913
- --sl-status-success-dark: var(--sl-scope-success-fg); /** Success color for text or icons that need more contrast. */
1914
- --sl-status-success-light: var(--sl-scope-success-soft); /** Success tint for confirmation backgrounds. */
1915
- --sl-status-warning: var(--sl-scope-warning-signal); /** Warnings, and the required-field marker. */
1916
- --sl-status-warning-dark: var(--sl-scope-warning-fg); /** Warning color for text or icons that need more contrast. */
1917
- --sl-status-warning-light: var(--sl-scope-warning-soft); /** Warning tint for caution backgrounds. */
1918
- --sl-text-primary: var(--sl-scope-chrome-fg); /** Body text and headings. The highest-contrast neutral. */
1919
- --sl-disclosure-indicator-width: var(--sl-stroke-emphasis); /** Selected tab line thickness. */
1920
- --sl-field-border-width: var(--sl-stroke-default); /** Field edge thickness. */
1921
- --sl-field-radius: var(--sl-radius-control); /** Field corners, the same as every other control. */
1922
- --sl-field-transition: var(--sl-transition-input); /** Border and halo ease in, never snap. */
1923
- --sl-gauge-radius: var(--sl-radius-pill); /** Round ends on the track and the fill. */
1924
- --sl-icon-button-radius: var(--sl-radius-item); /** Rounded like a menu item, since its hover fill reads as a highlighted item. */
1925
- --sl-icon-button-transition: var(--sl-transition-button); /** Responds as fast as a button. */
1926
- --sl-item-radius: var(--sl-radius-item); /** Row corners inside the popup. */
1927
- --sl-modal-border-width: var(--sl-stroke-default); /** Modal edge thickness. */
1928
- --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. */
1929
- --sl-modal-shadow: var(--sl-elevation-xl); /** The deepest shadow, because a modal sits above everything but popups and toasts. */
1930
- --sl-modal-backdrop: color-mix(in srgb, var(--sl-overlay-base) 50%, transparent); /** Scrim that dims the page behind a modal. */
1931
- --sl-popup-border-width: var(--sl-stroke-default); /** Popup edge thickness. */
1932
- --sl-popup-radius: var(--sl-radius-surface); /** Corners of a free-floating popup. */
1933
- --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. */
1934
- --sl-popup-shadow: var(--sl-elevation-lg); /** Lifts the popup above the page. */
1935
- --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. */
1936
- --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. */
1937
- --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. */
1938
- --sl-table-cell-padding-inline: var(--sl-control-padding-inline-sm); /** Space either side of cell text, matching small controls. */
1939
- --sl-table-radius: var(--sl-radius-surface); /** Grid corners, like any card or panel. */
1940
- --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. */
1941
- --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. */
1942
- --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. */
1943
- --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. */
1944
- --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. */
1945
- --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. */
1946
- --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. */
1947
- --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. */
1948
- --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. */
1949
- --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. */
1950
- --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. */
1951
- --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. */
1952
- --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. */
1953
- --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. */
1954
- --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. */
1955
- --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. */
1956
- --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. */
1957
- --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. */
1958
- --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. */
1959
- --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. */
1960
- --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. */
1961
- --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. */
1962
- --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. */
1963
- --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. */
1964
- --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. */
1965
- --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. */
1966
2048
  --sl-emphasis-quiet-fg: var(--sl-scope-chrome-fg); /** quiet in default: outline in chrome (neutral) */
1967
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. */
1968
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. */
@@ -2120,44 +2202,10 @@
2120
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. */
2121
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. */
2122
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. */
2123
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. */
2124
- --sl-focus-shadow-3px-error: 0 0 0 3px var(--sl-status-error); /** Focus halo for a field with an error. */
2125
- --sl-calendar-day-color: var(--sl-text-primary); /** A day in the month being shown. */
2126
- --sl-border-accent: var(--sl-scope-accent-border); /** Borders that signal selection or the active item. */
2127
- --sl-border-default: var(--sl-scope-chrome-divider); /** Everyday dividers and control outlines. Darkens under prefers-contrast: more. */
2128
- --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. */
2129
- --sl-border-subtle: var(--sl-scope-chrome-border-subtle); /** Hairlines inside a surface (table rows, list separators) that should barely register. */
2130
- --sl-border-control: var(--sl-scope-chrome-border); /** Edge of a small control (checkbox, radio, switch) that must be found before it is filled. */
2131
- --sl-border-control-hover: var(--sl-scope-chrome-border-hover); /** Control edge under the pointer: one clear step darker than border.control. */
2132
- --sl-interactive-active: var(--sl-scope-accent-solid-active); /** Pressed state of the main accent. Darker than hover so the press is felt. */
2133
- --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. */
2134
- --sl-interactive-disabled: var(--sl-scope-chrome-soft-active); /** Fill for disabled accent controls. Low contrast on purpose, but never invisible. */
2135
- --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. */
2136
- --sl-interactive-tint: var(--sl-scope-accent-soft); /** Faint accent wash behind a ghost or outline control on hover, or a selected row. */
2137
- --sl-interactive-tint-hover: var(--sl-scope-accent-soft-hover); /** Accent wash for a highlighted menu item or a pressed toggle. */
2138
- --sl-interactive-tint-active: var(--sl-scope-accent-soft-active); /** Accent wash for a selected or pressed item: one step past tint-hover. */
2139
- --sl-interactive-tint-strong: var(--sl-scope-accent-soft-strong); /** Strongest accent wash, for hovering an item that is already pressed. */
2140
- --sl-surface-canvas: var(--sl-scope-chrome-canvas); /** The page itself. Paper in light mode, the darkest neutral in dark mode. */
2141
- --sl-surface-overlay: var(--sl-scope-chrome-overlay); /** Popups, menus and code blocks that sit above raised surfaces. */
2142
- --sl-surface-raised: var(--sl-scope-chrome-raised); /** Cards and panels one level above the canvas. */
2143
- --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. */
2144
- --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. */
2145
- --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. */
2146
- --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. */
2147
- --sl-text-disabled: var(--sl-scope-chrome-fg-disabled); /** Text in disabled controls. Deliberately below AA, which WCAG allows for disabled UI. */
2148
- --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. */
2149
- --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. */
2150
- --sl-text-on-tint: var(--sl-scope-accent-on-soft); /** Text on an accent wash (interactive.tint*). Stays in the accent family. */
2151
- --sl-text-on-tint-strong: var(--sl-scope-accent-ink); /** Text on the selected accent wash, a step darker than on-tint. */
2152
- --sl-fill-subtle: var(--sl-scope-chrome-soft); /** Lightest fill: hovered rows, chips, empty tracks. */
2153
- --sl-fill-default: var(--sl-scope-chrome-soft-hover); /** Standard fill: slider and switch tracks, pressed rows. */
2154
- --sl-fill-strong: var(--sl-scope-chrome-soft-active); /** Heaviest fill: scroll thumbs, slider marks, hovered tracks. */
2155
- --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. */
2156
- --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. */
2157
- --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. */
2158
- --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. */
2159
- --sl-content-selection-text: var(--sl-text-primary); /** Selected text stays body text so it reads the same on the tint. */
2160
- --sl-field-border-color-error: var(--sl-status-error); /** Field edge when the value is invalid. */
2161
2209
  --sl-field-color: var(--sl-text-primary); /** The value you typed. */
2162
2210
  --sl-gauge-label-color: var(--sl-text-primary); /** What is being measured. */
2163
2211
  --sl-icon-button-color-hover: var(--sl-text-primary); /** Darkens on hover to confirm it's the target. */
@@ -2215,7 +2263,8 @@
2215
2263
  --sl-status-level-success-bold-fg: var(--sl-scope-success-on-solid); /** bold in success: solid in success */
2216
2264
  --sl-status-level-warning-bold-fg: var(--sl-scope-warning-on-solid); /** bold in warning: solid in warning */
2217
2265
  --sl-status-level-error-bold-fg: var(--sl-scope-error-on-solid); /** bold in error: solid in error */
2218
- --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. */
2219
2268
  --sl-focus-shadow-3px-primary: 0 0 0 3px var(--sl-interactive-tint-hover); /** Soft focus halo for inputs. */
2220
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. */
2221
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. */
@@ -2287,6 +2336,7 @@
2287
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. */
2288
2337
  --sl-popup-border-color: var(--sl-border-default); /** Popup edge, a quiet line that separates it from the page under it. */
2289
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. */
2290
2340
  --sl-table-background: var(--sl-surface-canvas); /** Cell area. The page color, so a grid sits on the page like body text. */
2291
2341
  --sl-table-subtle-color: var(--sl-text-secondary); /** Secondary text in cells and panels: counts, hints, group totals. */
2292
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. */
@@ -2299,7 +2349,16 @@
2299
2349
  --sl-table-range-background: var(--sl-interactive-tint); /** Cells inside a dragged range selection. */
2300
2350
  --sl-emphasis-bold-fg: var(--sl-scope-accent-on-solid); /** bold in default: solid in accent (primary) */
2301
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. */
2302
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. */
2303
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. */
2304
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. */
2305
2364
  --sl-check-mark-color: var(--sl-text-on-primary); /** Check mark, dash or dot on a ticked fill. */
@@ -2315,6 +2374,11 @@
2315
2374
  --sl-table-row-hover: var(--sl-item-background-hover); /** Row under the pointer. Same tint as a highlighted menu row. */
2316
2375
  --sl-table-row-selected: var(--sl-item-background-selected); /** Selected rows. Same tint as the chosen menu row. */
2317
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. */
2318
2382
  --sl-check-background: var(--sl-field-background); /** Empty box, the same fill as a field so it reads as something to fill in. */
2319
2383
  --sl-popup-arrow-fill: var(--sl-popup-background); /** The arrow is part of the popup, so it takes the popup's fill. */
2320
2384
  }
@@ -5780,6 +5844,7 @@
5780
5844
  --sl-popup-arrow-fill: var(--sl-popup-background);
5781
5845
  --sl-popup-arrow-stroke: var(--sl-popup-border-color);
5782
5846
  --sl-popup-separator-color: var(--sl-border-subtle);
5847
+ --sl-rule-color: var(--sl-border-strong);
5783
5848
  --sl-table-background: var(--sl-surface-canvas);
5784
5849
  --sl-table-color: var(--sl-text-primary);
5785
5850
  --sl-table-subtle-color: var(--sl-text-secondary);
@@ -5795,7 +5860,23 @@
5795
5860
  --sl-table-column-hover: var(--sl-fill-subtle);
5796
5861
  --sl-table-range-background: var(--sl-interactive-tint);
5797
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);
5798
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);
5799
5880
  --sl-calendar-day-background-hover: var(--sl-item-background-hover);
5800
5881
  --sl-check-background: var(--sl-field-background);
5801
5882
  }
@@ -5926,6 +6007,7 @@
5926
6007
  --sl-popup-arrow-fill: var(--sl-popup-background);
5927
6008
  --sl-popup-arrow-stroke: var(--sl-popup-border-color);
5928
6009
  --sl-popup-separator-color: var(--sl-border-subtle);
6010
+ --sl-rule-color: var(--sl-border-strong);
5929
6011
  --sl-table-background: var(--sl-surface-canvas);
5930
6012
  --sl-table-color: var(--sl-text-primary);
5931
6013
  --sl-table-subtle-color: var(--sl-text-secondary);
@@ -5941,7 +6023,23 @@
5941
6023
  --sl-table-column-hover: var(--sl-fill-subtle);
5942
6024
  --sl-table-range-background: var(--sl-interactive-tint);
5943
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);
5944
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);
5945
6043
  --sl-calendar-day-background-hover: var(--sl-item-background-hover);
5946
6044
  --sl-check-background: var(--sl-field-background);
5947
6045
  }
@@ -6072,6 +6170,7 @@
6072
6170
  --sl-popup-arrow-fill: var(--sl-popup-background);
6073
6171
  --sl-popup-arrow-stroke: var(--sl-popup-border-color);
6074
6172
  --sl-popup-separator-color: var(--sl-border-subtle);
6173
+ --sl-rule-color: var(--sl-border-strong);
6075
6174
  --sl-table-background: var(--sl-surface-canvas);
6076
6175
  --sl-table-color: var(--sl-text-primary);
6077
6176
  --sl-table-subtle-color: var(--sl-text-secondary);
@@ -6087,7 +6186,23 @@
6087
6186
  --sl-table-column-hover: var(--sl-fill-subtle);
6088
6187
  --sl-table-range-background: var(--sl-interactive-tint);
6089
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);
6090
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);
6091
6206
  --sl-calendar-day-background-hover: var(--sl-item-background-hover);
6092
6207
  --sl-check-background: var(--sl-field-background);
6093
6208
  }
@@ -6160,6 +6275,16 @@
6160
6275
  letter-spacing: var(--sl-font-title-base-letter-spacing);
6161
6276
  }
6162
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
+
6163
6288
  /* Code uses the mono family so characters line up. */
6164
6289
  .text-style-code-condense {
6165
6290
  font-family: var(--sl-font-code-condense-font-family);
@@ -6169,6 +6294,16 @@
6169
6294
  letter-spacing: var(--sl-font-code-condense-letter-spacing);
6170
6295
  }
6171
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
+
6172
6307
  /* Body copy in the condense tier, dense UI text (tables, secondary labels). */
6173
6308
  .text-style-body-condense {
6174
6309
  font-family: var(--sl-font-body-condense-font-family);
@@ -6224,6 +6359,16 @@
6224
6359
  text-transform: var(--sl-font-eyebrow-condense-text-transform);
6225
6360
  }
6226
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
+
6227
6372
  /* Titles in the condense tier: group headers in tables, menus and dense panels. Titles use the display family; the tier sets the size. */
6228
6373
  .text-style-title-condense {
6229
6374
  font-family: var(--sl-font-title-condense-font-family);
@@ -6414,7 +6559,7 @@
6414
6559
  }
6415
6560
 
6416
6561
 
6417
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
6418
6563
  /* Loomiere for Base UI: component styles. Brand-free: every value is a --sl- variable from a
6419
6564
  Loomiere theme. Load the theme first:
6420
6565
  @import '<your theme>/tokens.css';
@@ -6424,7 +6569,7 @@
6424
6569
  /* Document defaults, in the reset layer so any unlayered rule wins over them, and so layered
6425
6570
  frameworks (Chakra's recipes, Tailwind's utilities) are not undone by them. */
6426
6571
  @layer reset {
6427
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
6428
6573
  /* CSS Reset - Mojave Theme */
6429
6574
 
6430
6575
  /* ============================================
@@ -6698,7 +6843,7 @@ pre {
6698
6843
  background: var(--sl-content-pre-background);
6699
6844
  border: var(--sl-stroke-thin) solid var(--sl-content-pre-border);
6700
6845
  color: var(--sl-content-pre-text);
6701
- border-radius: var(--sl-space-2);
6846
+ border-radius: var(--sl-content-pre-radius);
6702
6847
  overflow-x: auto;
6703
6848
  margin-block: var(--sl-space-6);
6704
6849
  }
@@ -6868,7 +7013,7 @@ hr {
6868
7013
  }
6869
7014
  }
6870
7015
  @layer reset {
6871
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
6872
7017
  /* Accessibility — base rules (no theme color dependencies). Theme-specific focus/invalid: accessibility-theme.css */
6873
7018
 
6874
7019
  /* Remove default focus; keyboard focus styled in accessibility-theme.css */
@@ -6981,7 +7126,7 @@ main:focus {
6981
7126
 
6982
7127
  }
6983
7128
  @layer reset {
6984
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
6985
7130
  /* Focus, invalid, contrast — requires theme tokens (after theme-accessibility.css). */
6986
7131
 
6987
7132
  :focus-visible {
@@ -7049,7 +7194,7 @@ button,
7049
7194
 
7050
7195
  }
7051
7196
  /* Component styles */
7052
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
7053
7198
  /* Accordion - Mojave Theme
7054
7199
  *
7055
7200
  * No component tokens. Hover, press, chevron, divider and motion are the disclosure
@@ -7170,7 +7315,7 @@ button,
7170
7315
  overflow: hidden;
7171
7316
  }
7172
7317
 
7173
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
7174
7319
  /* Alert Dialog - Mojave Theme
7175
7320
  *
7176
7321
  * No component tokens and no rules of its own. An alert dialog looks exactly like a
@@ -7179,7 +7324,7 @@ button,
7179
7324
  * cancel quiet, and a destructive one bold with data-color="error".
7180
7325
  */
7181
7326
 
7182
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
7183
7328
  /* Autocomplete - Mojave Theme
7184
7329
  *
7185
7330
  * No component tokens. The input is Input (Input.css), the clear button is an icon
@@ -7381,7 +7526,7 @@ button,
7381
7526
  (reset-accessibility.css).
7382
7527
  ============================================ */
7383
7528
 
7384
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
7385
7530
  /* Avatar - Mojave Theme
7386
7531
  *
7387
7532
  * A round picture with a ring in the page color, so avatars in a group cut out of each other in
@@ -7489,7 +7634,7 @@ button,
7489
7634
  }
7490
7635
  }
7491
7636
 
7492
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
7493
7638
  /* Button - Mojave Theme
7494
7639
  *
7495
7640
  * Colors are the brand's emphasis levels, sizes are control.*, text is the trigger
@@ -7639,7 +7784,7 @@ button,
7639
7784
  font-size: var(--sl-icon-size-maximize);
7640
7785
  }
7641
7786
 
7642
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
7643
7788
  /* Checkbox - Mojave Theme
7644
7789
  * Sizes follow the label: the box is the icon size one tier above the label's text
7645
7790
  * tier (like a button's icon) and the check mark one tier below it.
@@ -7796,7 +7941,7 @@ button,
7796
7941
  border-radius: var(--sl-radius-pill);
7797
7942
  }
7798
7943
 
7799
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
7800
7945
  /* Checkbox Group - Mojave Theme */
7801
7946
 
7802
7947
  /* Each checkbox row is already a full tap target tall, so the rows sit close. */
@@ -7812,7 +7957,7 @@ button,
7812
7957
  pointer-events: none;
7813
7958
  }
7814
7959
 
7815
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
7816
7961
  /* Collapsible - Mojave Theme
7817
7962
  *
7818
7963
  * No component tokens. Hover, press, chevron and motion are the disclosure concept
@@ -7928,7 +8073,7 @@ button,
7928
8073
  background: var(--sl-surface-raised);
7929
8074
  }
7930
8075
 
7931
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
7932
8077
  /* Combobox - Mojave Theme
7933
8078
  *
7934
8079
  * No component tokens. The input is Input (Input.css); the chips box is a field; the
@@ -8413,7 +8558,7 @@ button,
8413
8558
  color: var(--sl-text-tertiary);
8414
8559
  }
8415
8560
 
8416
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
8417
8562
  /* Context Menu - Mojave Theme
8418
8563
  *
8419
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
@@ -8582,7 +8727,7 @@ button,
8582
8727
  stroke-width: var(--sl-stroke-default);
8583
8728
  }
8584
8729
 
8585
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
8586
8731
  /* Dialog and Alert dialog - Mojave Theme
8587
8732
  *
8588
8733
  * Both are centered modals built from the modal concept (tokens/semantic/modal.json):
@@ -8728,12 +8873,14 @@ button,
8728
8873
  margin-top: var(--sl-modal-actions-spacing);
8729
8874
  }
8730
8875
 
8731
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
8732
8877
  /* Drawer - a panel that slides in from an edge and can be swiped away.
8733
8878
  The surface, scrim, heading and motion are the modal concept's (--sl-modal-*), so a
8734
8879
  drawer reads as a dialog's sibling; only its size and grab bar are its own
8735
8880
  (--sl-drawer-*). Base UI supplies the swipe through
8736
- --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. */
8737
8884
 
8738
8885
  .DrawerBackdrop {
8739
8886
  position: fixed;
@@ -8770,6 +8917,8 @@ button,
8770
8917
  overflow-y: auto;
8771
8918
  overscroll-behavior: contain;
8772
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);
8773
8922
  transform: translate(var(--drawer-swipe-movement-x, 0px), var(--drawer-swipe-movement-y, 0px));
8774
8923
  transition: transform calc(var(--sl-modal-animation-duration) * var(--drawer-swipe-strength, 1)) var(--sl-modal-animation-easing);
8775
8924
  }
@@ -8800,6 +8949,8 @@ button,
8800
8949
  max-height: var(--sl-drawer-popup-max-size);
8801
8950
  border-top: 0;
8802
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);
8803
8954
  }
8804
8955
 
8805
8956
  .DrawerPopup[data-swipe-direction='right'] {
@@ -8855,7 +9006,7 @@ button,
8855
9006
  color: var(--sl-modal-description-color);
8856
9007
  }
8857
9008
 
8858
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
8859
9010
  /* Field - Mojave Theme
8860
9011
  *
8861
9012
  * Label, control, description and error. No component tokens: spacing is the field
@@ -8916,7 +9067,7 @@ textarea.FieldControl {
8916
9067
  height: auto;
8917
9068
  }
8918
9069
 
8919
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
8920
9071
  /* Fieldset - Mojave Theme
8921
9072
  *
8922
9073
  * No component tokens: a titled group of fields, spaced by the stack gaps, with
@@ -8958,7 +9109,7 @@ textarea.FieldControl {
8958
9109
  color: var(--sl-text-secondary);
8959
9110
  }
8960
9111
 
8961
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
8962
9113
  /* Form - Mojave Theme
8963
9114
  *
8964
9115
  * No component tokens: fields stack with the large block space, and the action
@@ -8978,7 +9129,7 @@ textarea.FieldControl {
8978
9129
  margin-top: var(--sl-space-block-md);
8979
9130
  }
8980
9131
 
8981
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
8982
9133
  /* Input - Mojave Theme
8983
9134
  *
8984
9135
  * No component tokens: the look is the field concept (tokens/semantic/field.json),
@@ -9115,7 +9266,7 @@ textarea.FieldControl {
9115
9266
  padding-inline: var(--sl-control-padding-inline-lg);
9116
9267
  }
9117
9268
 
9118
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
9119
9270
  /* Menu - Mojave Theme
9120
9271
  *
9121
9272
  * No component tokens. The trigger is a Button. The popup is the popup concept, rows are item rows at the
@@ -9264,7 +9415,7 @@ textarea.FieldControl {
9264
9415
  color: var(--sl-text-tertiary);
9265
9416
  }
9266
9417
 
9267
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
9268
9419
  /* Menubar - Mojave Theme
9269
9420
  *
9270
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
@@ -9457,7 +9608,7 @@ textarea.FieldControl {
9457
9608
  color: var(--sl-text-tertiary);
9458
9609
  }
9459
9610
 
9460
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
9461
9612
  /* Meter - Mojave Theme
9462
9613
  *
9463
9614
  * A gauge (tokens/semantic/gauge.json). The fill is the solid color of the scope around it:
@@ -9520,7 +9671,7 @@ textarea.FieldControl {
9520
9671
  height: var(--sl-gauge-height-lg);
9521
9672
  }
9522
9673
 
9523
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
9524
9675
  /* Navigation Menu - Mojave Theme
9525
9676
  *
9526
9677
  * The strip is the bar concept, the panel is the popup concept and each link is an item
@@ -9940,7 +10091,7 @@ textarea.FieldControl {
9940
10091
  width: 100%;
9941
10092
  }
9942
10093
 
9943
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
9944
10095
  /* Number Field - Mojave Theme
9945
10096
  *
9946
10097
  * No component tokens. The input is Input (Input.css) and the label, description and
@@ -10031,7 +10182,7 @@ textarea.FieldControl {
10031
10182
  user-select: none;
10032
10183
  }
10033
10184
 
10034
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
10035
10186
  /* OTP Field - Mojave Theme
10036
10187
  *
10037
10188
  * One-time code entry: a row of single-character inputs. Each slot is the same control as Input
@@ -10094,7 +10245,7 @@ textarea.FieldControl {
10094
10245
  letter-spacing: var(--sl-font-body-magnify-letter-spacing);
10095
10246
  }
10096
10247
 
10097
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
10098
10249
  /* Popover - Mojave Theme */
10099
10250
 
10100
10251
  /* ============================================
@@ -10259,7 +10410,7 @@ textarea.FieldControl {
10259
10410
  fill: var(--sl-popup-arrow-stroke);
10260
10411
  }
10261
10412
 
10262
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
10263
10414
  /* Preview Card - Mojave Theme
10264
10415
  *
10265
10416
  * The popup concept (surface, arrow, motion) with a title-magnify title and condense
@@ -10376,7 +10527,7 @@ textarea.FieldControl {
10376
10527
  fill: var(--sl-popup-arrow-stroke);
10377
10528
  }
10378
10529
 
10379
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
10380
10531
  /* Progress - Mojave Theme
10381
10532
  *
10382
10533
  * A gauge (tokens/semantic/gauge.json), the same bar as Meter. The fill is the solid color of
@@ -10453,7 +10604,7 @@ textarea.FieldControl {
10453
10604
  height: var(--sl-gauge-height-lg);
10454
10605
  }
10455
10606
 
10456
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
10457
10608
  /* Radio - Mojave Theme
10458
10609
  * Same box as Checkbox, always round. Sizes follow the label the same way, and the
10459
10610
  * dot is a share of the circle (check.dot-scale).
@@ -10605,7 +10756,7 @@ textarea.FieldControl {
10605
10756
  gap: var(--sl-gap-stack-sm);
10606
10757
  }
10607
10758
 
10608
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
10609
10760
  /* Scroll Area - Mojave Theme
10610
10761
  *
10611
10762
  * The scrollbar is the content scrollbar (content.scrollbar-*): a track that stays clear until
@@ -10687,7 +10838,7 @@ textarea.FieldControl {
10687
10838
  background: transparent;
10688
10839
  }
10689
10840
 
10690
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
10691
10842
  /* Select - Mojave Theme
10692
10843
  *
10693
10844
  * The trigger is a field (the field pattern, control sizes, the base text style); the
@@ -10972,7 +11123,7 @@ textarea.FieldControl {
10972
11123
  stroke-width: var(--sl-stroke-default);
10973
11124
  }
10974
11125
 
10975
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
10976
11127
  /* Separator - Mojave Theme
10977
11128
  *
10978
11129
  * A hairline in the everyday divider color (border.default), one stroke thick, with a step of
@@ -11000,7 +11151,7 @@ textarea.FieldControl {
11000
11151
  margin-inline: var(--sl-space-4);
11001
11152
  }
11002
11153
 
11003
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
11004
11155
  /* Slider - Mojave Theme
11005
11156
  *
11006
11157
  * A slider is a gauge you can drag: the track, fill and label row are gauge.* (the same bar as
@@ -11166,7 +11317,7 @@ textarea.FieldControl {
11166
11317
  transform: translate(-50%, 50%);
11167
11318
  }
11168
11319
 
11169
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
11170
11321
  /* Switch - Mojave Theme
11171
11322
  * Switch keeps its track sizes. The thumb, its travel and the ON/OFF text are
11172
11323
  * worked out from them: the thumb fills the track's height inside the padding,
@@ -11332,7 +11483,7 @@ textarea.FieldControl {
11332
11483
  color: var(--sl-text-disabled);
11333
11484
  }
11334
11485
 
11335
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
11336
11487
  /* Tabs - Mojave Theme
11337
11488
  *
11338
11489
  * No component tokens. The divider, the selected line and color, hover and the disabled
@@ -11468,7 +11619,7 @@ textarea.FieldControl {
11468
11619
  padding: var(--sl-space-6);
11469
11620
  }
11470
11621
 
11471
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
11472
11623
  /* Toast - Mojave Theme
11473
11624
  *
11474
11625
  * A toast is a notice (tokens/semantic/notice.json) on the popup surface. A toast whose type
@@ -11704,7 +11855,7 @@ textarea.FieldControl {
11704
11855
  flex-shrink: 0;
11705
11856
  }
11706
11857
 
11707
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
11708
11859
  /* Toggle - Mojave Theme
11709
11860
  * A toggle is a button that stays pressed: the same heights, padding, gap and
11710
11861
  * trigger text style as a button of the same size. Pressed, it takes its emphasis level's
@@ -11816,7 +11967,7 @@ textarea.FieldControl {
11816
11967
  height: var(--sl-icon-size-maximize);
11817
11968
  }
11818
11969
 
11819
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
11820
11971
  /* Toggle Group - Mojave Theme
11821
11972
  *
11822
11973
  * No component tokens. The strip is the bar concept (tokens/semantic/bar.json); the
@@ -11837,7 +11988,7 @@ textarea.FieldControl {
11837
11988
  border-radius: var(--sl-radius-item);
11838
11989
  }
11839
11990
 
11840
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
11841
11992
  /* Toolbar - Mojave Theme
11842
11993
  *
11843
11994
  * The strip is the bar concept (tokens/semantic/bar.json). Buttons, toggles, selects
@@ -11899,7 +12050,7 @@ textarea.FieldControl {
11899
12050
  max-width: var(--sl-toolbar-input-max-width);
11900
12051
  }
11901
12052
 
11902
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
11903
12054
  /* Tooltip - Mojave Theme
11904
12055
  *
11905
12056
  * The inverse surface (surface.inverse, text.on-inverse-surface) with condense text, so a tooltip
@@ -11960,7 +12111,7 @@ textarea.FieldControl {
11960
12111
  }
11961
12112
 
11962
12113
  /* Custom components: not Base UI parts. Built from existing concepts and tokens. */
11963
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
11964
12115
  /* Badge
11965
12116
  *
11966
12117
  * A status or count label. Not a Base UI part, and not interactive: no hover or focus.
@@ -12065,7 +12216,7 @@ textarea.FieldControl {
12065
12216
  height: var(--sl-badge-dot-base);
12066
12217
  }
12067
12218
 
12068
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
12069
12220
  /*
12070
12221
  * DatePicker: a field that opens a calendar for one date or a period.
12071
12222
  * Not a Base UI part. The popup is Popover on a wide viewport and Drawer
@@ -12638,7 +12789,7 @@ textarea.FieldControl {
12638
12789
  flex-basis: 100%;
12639
12790
  }
12640
12791
 
12641
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
12642
12793
  /* Money field
12643
12794
  *
12644
12795
  * An amount of money, built on Number field. The value is an integer in minor units
@@ -12983,7 +13134,7 @@ textarea.FieldControl {
12983
13134
  letter-spacing: var(--sl-font-body-base-letter-spacing);
12984
13135
  }
12985
13136
 
12986
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
12987
13138
  /* ListDetail
12988
13139
  *
12989
13140
  * The detail of one item, next to its list. Not a Base UI part. It is a Splitter
@@ -13110,7 +13261,7 @@ textarea.FieldControl {
13110
13261
  background: transparent;
13111
13262
  }
13112
13263
 
13113
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
13114
13265
  /* Splitter
13115
13266
  *
13116
13267
  * Two or more panels and a handle between them. Not a Base UI part. It follows the
@@ -13318,7 +13469,7 @@ textarea.FieldControl {
13318
13469
  background: var(--sl-border-default);
13319
13470
  }
13320
13471
 
13321
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
13322
13473
  /* EmptyState
13323
13474
  *
13324
13475
  * The block a page, pane, table, list or popup shows when it has nothing to show.
@@ -13574,7 +13725,7 @@ textarea.FieldControl {
13574
13725
  color: inherit;
13575
13726
  }
13576
13727
 
13577
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
13578
13729
  /* Table - Mojave Theme
13579
13730
  *
13580
13731
  * Base UI has no table, so this styles the native <table class="Table"> elements with the
@@ -13587,6 +13738,13 @@ textarea.FieldControl {
13587
13738
  * `<tr><td data-empty colSpan={n}><EmptyState size="compact" … /></td></tr>`. A cell with
13588
13739
  * only text still uses this rule's padding. A cell whose child is an EmptyState lets the
13589
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.
13590
13748
  */
13591
13749
 
13592
13750
  .Table {
@@ -13605,6 +13763,15 @@ textarea.FieldControl {
13605
13763
  border-radius: var(--sl-table-radius);
13606
13764
  overflow: hidden;
13607
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);
13608
13775
  }
13609
13776
 
13610
13777
  .Table caption {
@@ -13716,6 +13883,52 @@ textarea.FieldControl {
13716
13883
  border-bottom: none;
13717
13884
  }
13718
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
+
13719
13932
  /* A header that stays put while the body scrolls (the table's wrapper scrolls) */
13720
13933
  .Table[data-sticky-header] thead th {
13721
13934
  position: sticky;
@@ -13746,7 +13959,7 @@ textarea.FieldControl {
13746
13959
  color: inherit;
13747
13960
  }
13748
13961
 
13749
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
13750
13963
  /* Collection
13751
13964
  *
13752
13965
  * DataTable, DataList, the toolbar and the pagination, in one place so the two views
@@ -13757,7 +13970,7 @@ textarea.FieldControl {
13757
13970
  * the tabs and the search where they are, so selecting rows does not grow the toolbar.
13758
13971
  */
13759
13972
 
13760
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
13761
13974
  /* Collection toolbar
13762
13975
  *
13763
13976
  * The wrap follows the toolbar's own width, not the window: a table in a narrow pane wraps
@@ -13898,7 +14111,7 @@ textarea.FieldControl {
13898
14111
  letter-spacing: var(--sl-font-body-condense-letter-spacing);
13899
14112
  }
13900
14113
 
13901
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
13902
14115
  /* DataTable additions on top of .Table.
13903
14116
  *
13904
14117
  * Sort buttons fill the header cell and inherit its hover, so old aria-sort markup keeps
@@ -14019,12 +14232,15 @@ textarea.FieldControl {
14019
14232
  color: var(--sl-table-subtle-color);
14020
14233
  }
14021
14234
 
14022
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
14023
14236
  /* DataList
14024
14237
  *
14025
14238
  * The same rows as the table, in one container with the table's borders, hover, selected
14026
14239
  * and current states. Not a stack of floating cards: the two views should read as one family.
14027
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.
14028
14244
  */
14029
14245
 
14030
14246
  .DataList {
@@ -14043,6 +14259,13 @@ textarea.FieldControl {
14043
14259
  background: var(--sl-table-background);
14044
14260
  border: var(--sl-stroke-default) solid var(--sl-table-border-color);
14045
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);
14046
14269
  }
14047
14270
 
14048
14271
  .DataList li {
@@ -14136,6 +14359,14 @@ textarea.FieldControl {
14136
14359
  background: var(--sl-table-background);
14137
14360
  border: var(--sl-stroke-default) solid var(--sl-table-border-color);
14138
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);
14139
14370
  }
14140
14371
 
14141
14372
  .DataList[data-loading] ul {
@@ -14143,7 +14374,7 @@ textarea.FieldControl {
14143
14374
  transition: opacity var(--sl-duration-fast) var(--sl-easing-default);
14144
14375
  }
14145
14376
 
14146
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
14147
14378
  /* Pagination
14148
14379
  *
14149
14380
  * Not tied to a collection. Anything with a page, a page count and a total can use it.
@@ -14168,7 +14399,7 @@ textarea.FieldControl {
14168
14399
  margin: 0;
14169
14400
  }
14170
14401
 
14171
- /* @scattered-light/loomiere-base-ui 0.7.1 · 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 */
14172
14403
  /* EditableList
14173
14404
  *
14174
14405
  * One table at every width, so a field is not submitted twice. Under the stack width each
@@ -14266,3 +14497,231 @@ textarea.FieldControl {
14266
14497
  letter-spacing: var(--sl-font-subtitle-condense-letter-spacing);
14267
14498
  }
14268
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
+ }