WireKit v2.20.0
Minor release — sidebar and app-shell layout controls, a floating action button, two form-field affordances, and a run of accessibility and correctness fixes. Everything here is additive or a fix; existing code renders identically.
Added
- A single-action floating action button —
<x-wirekit::fab.button>. A circular, screen-corner button for the one primary action a screen offers (compose, add, feedback). It follows the writing direction, keeps clear of the iOS home indicator and a landscape notch via safe-area insets, and announces to assistive tech what it opens. - Sidebar sections fold and remember their state.
<x-wirekit::sidebar.group collapsible>turns a section heading into a disclosure that folds its items;<x-wirekit::sidebar.collapsible>gains the same, apersist="key"that remembers the open state across reloads, and avariant="heading"that styles its trigger as a small uppercase section label instead of a nav row. - App shell gains a
viewportmode.<x-wirekit::app-shell viewport>pins the shell to the viewport height so the sidebar and main region scroll internally — brand at the top, account menu at the bottom — instead of the page growing past the fold. The default keeps the document-scroll behavior. - Input gains a
monovariant and leading/trailing icon slots.monorenders the field value in the monospace font (codes, SKUs, hashes);<x-slot:leading>/<x-slot:trailing>place an icon or addon inside the field frame. - Checkbox gains a
hideLabelprop — a checkbox with no visible label that keeps its accessible name, closing an API gap with the other form controls. - File upload's remove button gains a translatable, overridable
removeLabel(defaultRemove :name), so its accessible name is no longer hardcoded English.
Changed
- Dropdown, popover, menubar, multi-select and color-picker panels follow their trigger on scroll and resize. An open panel used to stay at its opening coordinates while the page scrolled; it now re-anchors to its trigger and tears its listeners down on close.
Fixed
- Form controls that share a
nameon one page now each get a unique DOMid. Input, textarea, select and the other name-derived controls emitted the sameidtwice when two fields shared aname(a create-and-edit form, a filter bar plus a modal), leaving every field after the first without an accessible name. Each instance now derives a page-unique id, solabel[for]andaria-describedbyresolve to the right field. Opt out withwirekit.a11y.dedupe_ids. - File upload's remove button now meets the 44px touch-target size. Its clickable area was ~18px; it now fills a 44×44 target while the visible chip stays small.
- Sidebar sections no longer disappear in the collapsed icon rail. A
<x-wirekit::sidebar.collapsible>hid all its items when the sidebar folded to the icon rail; its child icons now stay reachable as a flat list, like a static group. - A retinted active sidebar item keeps its color on hover. The base hover style is now scoped to non-active items, so a themed active state is not overridden while the pointer is over it.
- Tooltip honors a
delayoroffsetof0instead of swallowing the zero and applying the default. - Unbound
prop="false"reads as off across the remaining tri-state props that still treated the unbound string"false"as truthy. - Config class overrides now reach dotted sub-components.
wirekit.components.sidebar.item.classes.*(and every otherparent.childsub-component) applied only to top-level components before; the override now resolves for sub-components too. php artisan wirekit:publish-fontsre-publishes fonts when the bundled files change, andwirekit:doctorreports stale published fonts, instead of silently leaving an old copy in place.
Documentation
- Alert dialog and field docs clarify the action-button count and where a validation error's accessible ownership lives.