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
enhancementSelector() and hasEnhancement() are no longer exported from actual-css/js/enhance; query [data-enhance~="name"] directly.
registerCommands() drops the prepare callback; write aria-controls, aria-haspopup, and aria-pressed on command buttons in the markup.
registerCommands() and commandSelector() throw on a name that is neither a native command keyword nor a custom -- command.
FormValidator.init() is removed; the module self-registers, and applyEnhancement("validation", selector) opts forms in by selector.
The non-modal dialog command is command="--show"; command="show" is not an HTML keyword and no longer opens a dialog.
.choice-card shows its control on the leading edge — a ring (radio) or box (checkbox) at rest that fills with the check — instead of a corner badge shown only once checked; the badge is now the "Corner badge" recipe in docs/pages/forms/choice-cards.md.
.choice-card is a two-column grid: each child element of the label becomes a row beside the indicator, so loose text needs an element.
--choice-card-check-size defaults to 1.25em and also sets the width of the .choice-card indicator column.
--aura-width is the whole painted .aura frame (the border, no padding); --aura-width: 3px reproduces the former default frame.
.aura defaults to a thin lit line: --aura-width: 1px and --aura-intensity: 0.4.
Added
--surface-opaque and --surface-solid-fg let a theme paint translucent surfaces while rings, separators and inverse text stay opaque.
report:theme-contrast reports the --surface-solid-fg on --surface-solid text pair.
scripts/utils/color.js holds the WCAG contrast and OKLCH math for reports and browser tests; contrast() refuses translucent colors.
glass demo theme: translucent surfaces over a theme-painted backdrop, a stress test of the opaque surface roles.
tests/browser/translucent-surface.test.js keeps rings, separators, step markers, and inverse text opaque over translucent surfaces.
--choice-card-gap sets the space between a .choice-card indicator and its label.
tests/browser/choice-card.test.js locks the leading indicator: visible at rest, level with the first line of a wrapping label, and kept under forced colors.
.shimmer (actual-css/css/effects/shimmer) sweeps a highlight across a text label for an activity in progress; hooks --shimmer-color and --shimmer-highlight.
.range moves to a 1.125rem thumb on a 0.625rem track with a data-enhance="range" fill (--range-progress) and named datalist values (aria-valuetext plus output sync).
--flyout-pad gives rich flyout panels dialog air.
tests/browser/control-geometry.test.js locks the shared control block geometry: input, select, addon, and buttons (including busy and icon-only) share one height per size, and the spinner follows its context at 1em.
Changed
--indicator-ring, the .avatar-stack ring, the .range thumb separator, segmented .meter separators and .steps markers read --surface-opaque.
.tooltip text reads --surface-solid-fg.
.aura masks its frame under the child with --surface-opaque, so a transparent or translucent child is framed rather than filled.
The .aura far halo is an outer box-shadow, so it never paints under the child.
.status-bar without an intent paints --surface-solid / --surface-solid-fg instead of --text / --surface.
registerEnhancement() discovers every named behavior through one shared [data-enhance] query per root instead of one [data-enhance~="name"] selector each.
The command router calls event.preventDefault() once a target resolves, before handle; handlers no longer cancel the click themselves.
--focus-outline (the generic currentColor focus fallback) is --focus-ring-width wide instead of 2 × --border-width: 3px instead of 4px under prefers-contrast: more.
Fixed
actual-css/js/range synchronizes fill, aria-valuetext, and outputs after a native form reset, including controls associated through form="…", while respecting cancellation and teardown.
Docs search leaves Enter on the close button and IME confirmation alone, and ArrowUp from no selection reaches the last result.
demo/sites/admini/chat.html loads the shared composer recipe before local overrides so the bottom bar keeps its flat border and compact textarea.
.otp with .input on its native input no longer draws the field focus ring around all the cells.
Docs search keeps focus in the input while arrowing through results (aria-activedescendant + Home/End), so the second and later matches are reachable by keyboard; Enter follows the highlight instead of closing the dialog.
.tab and .rating draw the component focus ring (--focus-ring-width solid --focus): an intent on the rating no longer becomes the focus color, and neither ring is 4px under prefers-contrast: more.
commandSelector() matches native command keywords case-insensitively, as the router does.
The command router ignores a trigger disabled through a <fieldset disabled> ancestor.
tooltip.js shows on focus only when the trigger matches :focus-visible: a pointer press, or focus handed back by a dialog closed with the pointer, no longer brings the tooltip back.
Documentation and tooling
Choice cards: a stacked-list demo, and a "Corner badge" recipe (.choice-tile) that the Neon Ramen item page uses for its tiles.
tests/browser/choice-chip.test.js asserts the chip's dot layer keeps its height, not just its clip and colour.
tests/exports.test.js keys its inventory on every JS subpath of package.json#exports, so a new subpath or an export on an unlisted module now fails the suite.
Docs search ranks a query token inside a longer alias (select finds the Combobox page via searchable select) and matches body text on word boundaries, so selection no longer outranks select; Combobox and Forms carry select, custom select, and form controls aliases.
focus.css documents two focus contracts: text-like elements keep the currentColor fallback, boxed components draw the --focus ring, and an invalid field's --form-invalid-border ring is the one exception.
tests/css-audit.test.js fails on any framework outline outside the two focus contracts.
report:theme-contrast reports each preset's invalid-field focus line against the field background.
check:sync fails when the .sm and .lg participant lists in variants.css diverge.
Tailwind guide: .outline is named as the dangerous collision, with .table, .sticky, .truncate, .prose, and .sr-only.
Tailwind and Bootstrap guides: a prefix transform is consumer-pipeline work and must also rename the runtime state classes in actual-css/js/selectors.
Table: clarified the responsive boundary — horizontal overflow (.table-wrap + --table-min + accessible scroll) stays the strategy, and the docs now name the alternatives (list/media view, .data-list, dedicated data grid).
Badge vs choice chip vs removable tag vocabulary: a badge is information (non-interactive), choice-card.chip is a selectable label (never nest a .close inside it), and removable tags belong to the widget that produced them.
Combobox: a "Bridge contract" section names what Actual owns (tokens, focus, invalid, .join, contrast) versus the widget (behavior, multi-value, i18n), and keeps the bridge CSS in docs/demo.
Tabs: the .tabs strip / .tab trigger pair is documented as the container/item convention, with the tab module versus tabs token split stated.
Pagination: items are documented as .btn.ghost with chevrons on Previous/Next, so aria-current="page" is the only filled item.
Rich text: demo/templates/rich-text.html is now an @lekoala/rich-text integration (@0.2 from jsDelivr) instead of a hand-wired Squire prototype, with the skin reduced to a --rt-* token bridge plus a rich composer reusing .composer chrome.