⚓ v0.28.2 — Anchor Visibility Spec Alignment
Every Midwest surface that pins itself to a trigger — dropdowns, submenus, popovers, and the two autocomplete-style fields — asks the browser to hide it when its anchor scrolls out of view. The keyword that requests this was renamed in the CSS Anchor Positioning spec, and all five components now use the current spelling. Alongside it, the bundled positioning fallback is refreshed and BadgeComponent's static introspection index picks up the predicates v0.28.1 added.
What's New
Badge introspection knows about icon-only badges
v0.28.1 taught BadgeComponent to render round when it has an icon and no label, via two new predicates — icon_only? and labelless?. The component shipped, but the static AST sidecar that bin/ast exports alongside it still described the previous API. It has been regenerated, so the offline component index now lists both methods and anything reading those sidecars sees the real surface.
This is an index refresh, not an API change: the predicates have behaved this way since v0.28.1, and they stay derived from the label you already pass rather than being options you set.
What Changed
position-visibility uses the spec's current keyword
CSS anchor positioning lets an anchored element hide itself when the thing it is anchored to is no longer visible — so a dropdown does not float over the page after its trigger has scrolled away under a sticky header. Midwest requested that behaviour with position-visibility: anchors-visible. The CSSWG has since renamed anchors-valid and anchors-visible to the singular anchor-valid and anchor-visible, and the plural forms are now only legacy value aliases that a user agent may still recognise.
/* Before — the legacy alias */position-visibility: anchors-visible;/* After — the spec's current keyword */position-visibility: anchor-visible;Five components carried the old spelling and now carry the new one. Nothing about the intent changed, and because browsers still honour the alias there is no visible difference today — this moves the library off a name the spec has already deprecated, before a browser drops it.
Dropdowns and submenus
DropdownComponent's desktop menu and DropdownItemComponent's side-positioned submenu (≥ 700 px) both hide themselves when their anchor leaves the viewport. The submenu's mobile branch is untouched — it uses position-visibility: always, because a full-width mobile submenu has no anchor to track.
Popovers
PopoverComponent's desktop anchored mode gets the same rename. The anchored preview is the one to watch: scroll its trigger out of view and the popover goes with it.
Autocomplete and address fields
Both fields render a results list anchored to the input and sized to it (width: anchor-size(width)), so the list must disappear along with the field it belongs to rather than hovering over unrelated content.
Positioning fallback refreshed
The bundled JavaScript picks up a patch-level @floating-ui/dom update — the positioning fallback Midwest uses where native anchor positioning is unavailable. It brings upstream fixes to offset-parent detection across iframes, viewport measurement, and alignment-axis shifting. No API change; the dropdown's async JS chunk grows by ~360 bytes.
Badge demo recording
The BadgeComponent demo video is re-recorded against the v0.28.1 badge: shorter scene titles, a hover on the support chip, and a new Minimal badge scene covering the plain pill.
What Was Removed
Nothing was removed. No component options, slots, or helpers were dropped, and there are no API changes. Every component that renders on v0.28.1 renders identically on v0.28.2 — the position-visibility rename is a keyword swap browsers already treat as equivalent.
Dev Process
- Roadmap — no roadmap items changed state. The v0.25–v0.27 milestones are all complete and none of this release's work was a scoped item, so like v0.28.0 and v0.28.1 it lands under the roadmap's post-milestone note, which now records v0.28.2.
- Stylelint — the config gains a
languageOptions.syntax.atRulesentry declaring@apply's prelude as<any-value>. Newer Stylelint parses at-rule preludes strictly and had started reporting Tailwind's@applyas malformed; the existingat-rule-no-unknownallowlist suppressed the unknown at-rule error but not the prelude parse. Run it throughbin/lintas always. - Built assets — the component sources carry the new keyword; the compiled bundle and the per-component async artifacts are regenerated by
bin/buildduringbin/release, so the rename reaches published CSS at packaging time. - Version bumps — the gem, the
@unabridged/midwestnpm package, and the@unabridged/midwest-language-serverLSP package are all bumped to0.28.2.