Skip to main content
WireKit

WireKit v2.20.0

Minor release

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, a persist="key" that remembers the open state across reloads, and a variant="heading" that styles its trigger as a small uppercase section label instead of a nav row.
  • App shell gains a viewport mode. <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 mono variant and leading/trailing icon slots. mono renders 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 hideLabel prop — 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 (default Remove :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 name on one page now each get a unique DOM id. Input, textarea, select and the other name-derived controls emitted the same id twice when two fields shared a name (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, so label[for] and aria-describedby resolve to the right field. Opt out with wirekit.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 delay or offset of 0 instead 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 other parent.child sub-component) applied only to top-level components before; the override now resolves for sub-components too.
  • php artisan wirekit:publish-fonts re-publishes fonts when the bundled files change, and wirekit:doctor reports 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.