You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
.actions is removed; compose a <menu> (or <ul>) with cluster for a row, or stack list-reset for a vertical list.
.navbar-nav is removed; the horizontal link list is a .cluster with the framework --gap.
.dialog-confirmation is removed; compose .media with .dialog-icon, then <footer class="bleed background-subtle cluster justify-content-space-between"> (recipe in docs/pages/components/dialog.md).
The dialog.modal body <footer> has no layout of its own; compose its row as <footer class="cluster justify-content-end">, as in the drawer.
--modal-header-bg is removed; put a .background-* utility on the dialog.modal > header band.
.form-actions no longer lays out its row; write class="cluster form-actions" (--form-actions-justify and --form-actions-align still apply).
.form-actions drops its top margin and --form-actions-margin-block-start; space it from the fields with .stack on the form.
.justify-content-* no longer sets --cluster-justify, so it aligns only its own element, never a nested .cluster.
.card header and footer rows drop to zero specificity: .media, .cluster, .form-actions and .justify-content-* on a slot now take over its layout.
--font-width-dense is removed; set font-stretch on an element that should render condensed.
A theme sets --control-pad-x-sm / -md / -lg instead of --control-pad-x, which .sm/.lg and .compact/.spacious now select from.
A theme that sets its own control steps re-selects them in its block to work as a nested island (recipe in docs/pages/foundations/tokens.md).
Added
actual-css contrast [--theme FILE] (Bun) measures a theme's soft, focus, invalid-focus and inverse pairs in each declared scheme, and exits 1 on a miss.
.tight and .loose set the inherited --gap to --space-20 / --space-50 alone, without the padding or control size of .compact / .spacious.
docs/pages/guides/upgrading.md lists the edits a 0.11 project needs for 0.12.
.items-baseline aligns children on their first text baseline and sets --items-align, completing the .items-* series.
Changed
An action row composed from .cluster inherits the framework --gap (0.75rem); the removed .actions set 0.5rem. Use .tight for the tighter rhythm.
.cluster removes the native list chrome (margin, padding, list-style) from a ul, ol or menu it is applied to; the element stays a list in the DOM.
A heading that is the first child beside a leading .dialog-icon in a .media row centers on the icon anywhere, not only in a dialog.
A dialog.modal or .drawer header gives back its corner-close room when the dialog contains no .close; without :has() the room stays.
.compact and .spacious no longer set font-stretch: density changes rhythm and geometry, never typography.
.compact and .spacious select --control-pad-x-sm / -lg, so density controls get narrower or wider, not only shorter or taller.
.sm controls use the shared --control-pad-x-sm step: 13px of inline padding instead of 14px.
.card.compact lowers --card-gap to --space-20 along with --card-pad.
.nav-list rows sit --space-10 apart instead of --space-20, so a vertical nav reads as one list.
.topbar lays out its default row at zero specificity, so topbar cluster hands the row to .cluster.
The WCAG and OKLCH color math moves from scripts/utils/color.js to src/tooling/color.js.
report:theme-contrast labels a dark-only preset (dim, glass, indigo, neon) as dark instead of light.
Fixed
actual-css contrast counts a resting soft pair under 4.5:1 as a miss; it only gated the hovered pair.
The design and contrast examples run bunx --bun actual-css: plain bunx honors the CLI's Node shebang and stops on "needs Bun".
dialog.modal.scrollable lays the body wrapper out as a flex column: a structural header or footer keeps its size and every other region scrolls, so a modal with an external dialog > header no longer collapses its footer to zero.
--dialog-icon-size and --dialog-icon-glyph-size are read, not declared, on .dialog-icon, so an override on the icon's media row or the dialog moves the circle and the heading beside it together.
An .avatar-stack avatar layers its fill over --surface-opaque, so a translucent fill no longer shows the neighbour it overlaps.
prefers-reduced-motion also resets ::backdrop, so a modal or drawer scrim no longer fades when the user reduces motion.