**Minor.** A new status dot sits in the line beside a value, an OTP input takes an `xl` size, an overflow nav entry takes an icon and markup of your own, a new token sets the weight of a chosen entry, and the API map names the Alpine factories each component starts. Most of the fixes are about what you write on a component's tag: a key, a show, a listener, a role, a name or a style now reaches the element it is about, a directive written without a value no longer stops Alpine, and an `x-model` on a component with no value to hand over is dropped with a warning. On a touch screen the text floor no longer shrinks larger text, a clearable input's X follows the server, a flashed row fades out rather than in, a price renders without the `intl` extension, and the chosen or current entry of calendars, tabs, lists and steppers stays visible under forced colors.

### Added

- **A [status dot](https://docs.wirekit.app/components/status-dot) sits in the line beside a value** and carries a state in its color, in the intents a badge takes, such as a red dot beside a stock figure that has gone below zero. Its `label` is the name a screen reader reads and the text of a tooltip that opens on hover and on keyboard focus. A dot without a label is decorative and hidden from assistive technology, and inside a link or a button `:focusable="false"` leaves the tab stop to the control. The overflow nav and indicator pages draw their dots with it.
- **An [OTP input](https://docs.wirekit.app/components/otp-input#width-and-size) takes `size="xl"`**, 3.5rem cells with larger digits for a screen where the code is the only thing to enter, such as a PIN pad or a lock screen. It is one more step of the component heights above `lg`, so a theme that resizes its controls resizes these cells too, and groups, wrapping and `justify` work as they do in the other sizes.
- **The [API map](https://docs.wirekit.app/ai-tooling) names the Alpine factories each component starts**, under `factories`, the ones of the components it renders included. An application that imports components from the ES module by name and hands them to `register()` reads there which names a component needs, such as a dropdown's trigger and submenus. The [dependencies](https://docs.wirekit.app/dependencies#importing-only-the-components-you-use) page shows the command, and its size table is measured again.
- **An [overflow nav](https://docs.wirekit.app/components/overflow-nav) entry takes `icon` and `after`.** The icon sits before the label and `after` after it, in the row and in the menu, both inside the link, so the row measures them with the entry. `after` takes text, an `Htmlable` such as a `view()`, or a closure that is called once for the row and once for the menu with `'row'` or `'menu'`, so markup that carries an id renders it once in each place. An entry without either renders as before.
- **`--font-wk-selected-weight` sets the weight of a chosen entry** in a [segmented control](https://docs.wirekit.app/components/segmented-control), a [multi-select](https://docs.wirekit.app/components/multi-select) and a [bottom nav](https://docs.wirekit.app/components/bottom-nav), so a theme can change the weight without replacing the classes of the chosen state. It defaults to the heading weight, so nothing changes until a theme sets it. Each of the three keeps a mark that does not depend on the weight: a selected multi-select option now ends on a check, and a chosen segment carries a frame under forced colors.

### Fixed

- **An Alpine directive written without a value on a component, such as a bare `x-transition` or `x-cloak`, renders with an empty value.** Blade passed it on as `true`, and the tag came out as `x-transition="x-transition"`, which Alpine reads as a list of transition classes and throws on, so the directives after it did not start. A bare `x-init`, `x-intersect` or `x-sort` named itself as an expression and failed when it ran.
- **A [price](https://docs.wirekit.app/components/price) renders without the `intl` PHP extension, and writes its change in the locale of its amount.** WireKit does not require the extension, but without it every page that showed a price stopped with `Class "NumberFormatter" not found`, product cards and pricing tiers included. It now falls back to `1,234.56 EUR` as WireKit's other number helpers do. With the extension, a percentage change reads `-12,5 %` in German instead of `-12.5%`, and an absolute change follows the locale as well.
- **A `wire:key` you write on a component keys its outermost element.** Livewire matches the top-level element of each iteration of a loop by its key. Most form controls handed the key to the field inside their wrapper, and so did the editor, multi-select, tags input, segmented control, status tiles, a logo cloud, a reading bookmark, a responsive [table](https://docs.wirekit.app/components/table), a stat that counts up and has an entrance animation, a pricing table with billing intervals and a toggle button with a tooltip or `optimistic`. After a row was removed, every field below it was rebuilt and lost its focus and state. An [OTP input](https://docs.wirekit.app/components/otp-input) rendered the key nowhere. The [integration guide](https://docs.wirekit.app/getting-started/integration#a-wirekey-on-a-wirekit-component) says where a key you write goes.
- **A listener you write on a component runs beside the component's own listener for the same event.** A listener is an attribute, and where a component listened to the same event on the element your attributes land on, one of the two was dropped: a [replay button](https://docs.wirekit.app/components/replay-button) lost its replay, a [clipboard button](https://docs.wirekit.app/components/clipboard-button), a [dropdown](https://docs.wirekit.app/components/dropdown) and many more dropped yours, and a toggle button let yours replace its toggle. It reached an [inline edit](https://docs.wirekit.app/components/inline-edit) with `control="number"` too: leaving the number editor neither committed nor closed it.
- **The classes a component needs in order to work stay when you replace one of its class blocks with a string personalization.** An overlay's position and layer, scrollbars and scroll fades, touch targets, the bottom nav's safe area, a carousel slide's width per view, a slider's track and the reading components' print rules sat inside the block and went with it. The [customization](https://docs.wirekit.app/customization) page says which classes stay.
- **A row you flash with [`x-wk-flash`](https://docs.wirekit.app/animations#flashing-a-row-that-changed) lights up at once and fades back to its own background.** It started without its tint, reached the tint only at the end of the flash and then dropped back at once, so a line added to a basket turned green late and lost the color abruptly. Under reduced motion the tint still appears at once, holds and ends at once.
- **On a touch screen, field text below 16px is lifted to 16px, and larger text keeps its size.** The rule that keeps iOS from zooming into a field set every field, every button given `touch-text-floor` and the rich-text editor to exactly 16px, so the digits of a large one-time code dropped from 20px to 16px, and every field on a page with a font scale above 1 shrank. It now lifts and never lowers, under a coarse pointer and inside `data-wk-touch`.
- **An `x-show` or `wire:show` you write on a component shows and hides the whole component**, the label, description and error of a field included, and an `x-transition`, `wire:transition`, or an `x-cloak` or `wire:cloak` beside the show, goes to the same element. On the components the key entry above names, the directive hid the element inside alone. A [scroll-to-top](https://docs.wirekit.app/components/scroll-to-top) button, a [reading](https://docs.wirekit.app/components/reading) table of contents and a reading spine show and hide themselves, and a show of yours was dropped as a second attribute of the same name, or toggled the element against the component's own condition; with one of yours they now sit in a wrapper that generates no box, and both conditions apply.
- **An `x-model` on a component that has no value to hand over is dropped, and a warning says so.** Alpine gave such a binding the value of whichever field inside the component was edited last, so an `x-model` on a calendar received the month, one on a date range one of its two dates, and one on a rating or a segmented control nothing. With `APP_DEBUG` on, or in the console, WireKit logs which component dropped it. On a field, and on the controls that hand their value to Alpine, such as a combobox or a slider, `x-model` binds as before; the [integration guide](https://docs.wirekit.app/getting-started/integration#an-x-model-on-a-wirekit-component) says where it binds.
- **The X of a [clearable input](https://docs.wirekit.app/components/input#clearable--copyable) follows a value the server writes.** When your component emptied the property the field's `wire:model` binds, as a scan field does after each scan, the X stayed over the empty field until the next keystroke. It now hides, and it appears when the server writes a value in.
- **A `role`, an `aria-label` or an `aria-labelledby` you write on a component replaces the one the component gives that element.** Where a component wrote its own beside yours, the tag carried the attribute twice and the browser kept the first, mostly the component's: two [breadcrumbs](https://docs.wirekit.app/components/breadcrumb) or two [paginations](https://docs.wirekit.app/components/pagination) on one page could not be told apart by name, and on a range slider, a modal, a ticker, a kanban column and a message the component's own `aria-labelledby` won even without a duplicate. A form control with a visible `label` keeps that label as its name, so what a screen reader announces matches the text on screen.
- **An `id` you write on a multi-select, a [tags input](https://docs.wirekit.app/components/tags-input) or an [inline edit](https://docs.wirekit.app/components/inline-edit) goes on its field, so a `<label for>` of yours names it.** The first two rendered it nowhere and the inline edit gave its field `{id}-control`, while the multi-select's and the tags input's props tables called it the element id. The fallback name these fields carry when nothing else names them steps aside for your label, which it would otherwise have overridden. A test or a script that selected `#{id}-input` or `#{id}-control` on one of them selects `#{id}` now; without an id of yours the ids are as before.
- **An `x-ref` you write reaches your component's `$refs` on the components that kept it in an Alpine component of their own**: an alert dialog, an assistant message, a bottom nav, a chart, a command palette, a conversation, a drawer, a FAB, a map, a page progress bar, the reading components, a reorder list, a replay button, a scroll-to-top button, a theme controller, a toast region and a [tour](https://docs.wirekit.app/components/tour). As on the components v2.60.0 changed, the name renders as `x-wk-ref` there.
- **An attribute a component sets from its own state renders once, and a live region's politeness and a phone field's `autocomplete` are yours.** The `type` of a component's own fields and buttons, the `tabindex` of a [scroll area](https://docs.wirekit.app/components/scroll-area), a [combobox](https://docs.wirekit.app/components/combobox)'s `aria-expanded` and `aria-controls`, the `aria-hidden` of a decorative element and a busy flag stood in the tag twice when you wrote one; the component's value stays. Your `aria-live` on a [spinner](https://docs.wirekit.app/components/spinner), a [skeleton](https://docs.wirekit.app/components/skeleton), a reading meta line or a chat marker, and your `autocomplete` on a [phone](https://docs.wirekit.app/components/phone) field, now replace the component's. A [flag](https://docs.wirekit.app/components/flag) takes your `loading` and `decoding`, so a flag above the fold can load eagerly, and keeps the size its `size` gives it.
- **A `style` you write on a reading table of contents or a [sparkline](https://docs.wirekit.app/components/sparkline) joins the component's own inline style** instead of replacing it: the table of contents lost its offset, and the sparkline its size and its clip.
- **An `x-init` you write on a [wizard](https://docs.wirekit.app/components/wizard) runs.** The wizard started itself with an `x-init` of its own on the same element, and the browser kept that one.
- **Every attribute you write on an OTP input lands on one element.** A `style`, `title`, `lang` or `x-show`, a `wire:keydown.enter` and a listener for `wirekit:otp-complete` reached nothing, so the listener never heard the completion. The binding and `name` go to the hidden field, `dusk`, `data-*` and `aria-label` to the group, `aria-describedby` to the boxes, and the rest to the wrapper.
- **An `id` you write on a segmented control stands on one element**, the radio group. Its hidden field repeated it.
- **A `class` you write on a [scope switcher](https://docs.wirekit.app/components/scope-switcher) reaches its wrapper**, so a layout class such as `ms-auto` applies.
- **Under forced colors, the chosen or current entry stays visible where a fill, a tint or a raised surface was its only mark**, none of which that mode paints: a [calendar](https://docs.wirekit.app/components/calendar)'s chosen day and range, the current page of a [sidebar](https://docs.wirekit.app/components/sidebar) and an [app rail](https://docs.wirekit.app/components/app-rail), the chosen tab of [tabs](https://docs.wirekit.app/components/tabs), the option the keyboard is on in a combobox, a multi-select, a scope switcher, a [command palette](https://docs.wirekit.app/components/command-palette) and a sidebar in selection mode, the current step of a [stepper](https://docs.wirekit.app/components/stepper), and the pressed or checked buttons of a [data table](https://docs.wirekit.app/components/data-table)'s density toggle, an [event calendar](https://docs.wirekit.app/components/event-calendar), a [notification center](https://docs.wirekit.app/components/notification-center)'s filters, a [pricing table](https://docs.wirekit.app/components/pricing-table)'s interval toggle, a [reaction](https://docs.wirekit.app/components/reaction) and the [editor](https://docs.wirekit.app/components/editor) toolbar. Each draws a frame in the system highlight color. A [carousel](https://docs.wirekit.app/components/carousel)'s dots, which vanished there, show their edge, and the current one is filled. The classes these rules hang on are listed in the [public CSS API](https://docs.wirekit.app/extending/public-css-api).
- **Under forced colors, a [toggle](https://docs.wirekit.app/components/toggle)'s knob, a [theme controller](https://docs.wirekit.app/components/theme-controller)'s switch and a [progress](https://docs.wirekit.app/components/progress) track keep their edge with the Material and Minimal presets**, which set the border width to `0px`, and a pressed toggle button shows its focus outline.
- **The current step of a stepper is marked by more than its color**: its label is set in the heading weight. Its circle differed from the next step's in color alone, and with the Material and Minimal presets only the number's color was left.
- **The chosen option of a combobox carries a check.** The list highlights the first free option when it opens, so nothing on screen said which one was chosen.
- **A pressed command in the editor toolbar is told apart from a hovered one** by an edge. It had exactly the hover paint, so every command under the pointer looked pressed.
- **A carousel's slide dots reach 3:1 against the page, and the current one differs in shape**: a dot that is not current is a ring, and the current one is filled in the accent color. A dot that was not current measured 1.29:1 against a light page.
- **A theme controller's switch stays visible while it is off, and has the toggle's touch target.** Its track had no edge and a fill of 1.09:1 against a light page, and the switch is off exactly while the page is light. It takes the toggle's paint now.
- **With the [Material](https://docs.wirekit.app/theming/material) and [Minimal](https://docs.wirekit.app/theming/minimal) presets, the rule their pages give to restore a field's boundary also restores the edge of a checkbox, a radio, a toggle, the theme switch and a dropdown's radio items**, through a new `wk-choice-frame` class on each. Without it an unchecked checkbox or radio was its fill alone.
- **The examples the [MCP server](https://docs.wirekit.app/ai-tooling) hands out are Blade you can paste.** A matrix or a list of states came out in the documentation's own notation, with placeholders such as `{intent}` that threw once pasted, and a preview whose code the page shows without its demo frame is now handed out without that frame as well.

### Documentation

- **The [integration guide](https://docs.wirekit.app/getting-started/integration) says where the attributes you write on a component go**: a `wire:key`, an `x-show` with its transitions, a listener, a `role` or a name, the attributes a component keeps for itself, and which names an expression on a component reads.
- **The Material and Minimal pages give fields their boundary back without taking the field apart.** Their examples replaced a field's classes and took its fill, text color, focus ring, width and disabled state with them. A rule on the frame classes now restores the width alone, and Minimal's panel example changes only the width.
- **The personalization examples on the [toast](https://docs.wirekit.app/components/toast), carousel, [action bar](https://docs.wirekit.app/components/action-bar), data table and customization pages keep what their blocks carry.** The toast example left toasts that could not be clicked, and the others dropped a slide's snapping, the safe-area lift, the frozen columns and a button's focus ring.
- **The design-token tables of the component pages name the tokens the components read, for every size they come in.** The OTP input's table described its default size alone and called the cell width fixed, and the input and [select](https://docs.wirekit.app/components/select) tables left out the `md-compact` height.
- **The tabs page gives `label` the default it has, `'Tabs'`.**
- **The carousel page describes the spacing of its indicator dots as it ships**: they meet the spacing exception of WCAG 2.5.8.

### Components

Every component this release changes, each linked to its page: [Accordion](https://docs.wirekit.app/components/accordion) · [Action Bar](https://docs.wirekit.app/components/action-bar) · [Alert Dialog](https://docs.wirekit.app/components/alert-dialog) · [App Rail](https://docs.wirekit.app/components/app-rail) · [Assistant Message](https://docs.wirekit.app/components/assistant-message) · [Attachment](https://docs.wirekit.app/components/attachment) · [Bento Grid](https://docs.wirekit.app/components/bento-grid) · [Bottom Nav](https://docs.wirekit.app/components/bottom-nav) · [Branch Switcher](https://docs.wirekit.app/components/branch-switcher) · [Breadcrumb](https://docs.wirekit.app/components/breadcrumb) · [Button](https://docs.wirekit.app/components/button) · [Button Group](https://docs.wirekit.app/components/button-group) · [Calendar](https://docs.wirekit.app/components/calendar) · [Carousel](https://docs.wirekit.app/components/carousel) · [Chart](https://docs.wirekit.app/components/chart) · [Chat Marker](https://docs.wirekit.app/components/chat-marker) · [Checkbox](https://docs.wirekit.app/components/checkbox) · [Clipboard Button](https://docs.wirekit.app/components/clipboard-button) · [Color Picker](https://docs.wirekit.app/components/color-picker) · [Combobox](https://docs.wirekit.app/components/combobox) · [Command Palette](https://docs.wirekit.app/components/command-palette) · [Context Menu](https://docs.wirekit.app/components/context-menu) · [Conversation](https://docs.wirekit.app/components/conversation) · [Countdown](https://docs.wirekit.app/components/countdown) · [Data Table](https://docs.wirekit.app/components/data-table) · [Date Picker](https://docs.wirekit.app/components/date-picker) · [Date Separator](https://docs.wirekit.app/components/date-separator) · [Divider](https://docs.wirekit.app/components/divider) · [Drawer](https://docs.wirekit.app/components/drawer) · [Dropdown](https://docs.wirekit.app/components/dropdown) · [Editor](https://docs.wirekit.app/components/editor) · [Event Calendar](https://docs.wirekit.app/components/event-calendar) · [FAB](https://docs.wirekit.app/components/fab) · [Filter Builder](https://docs.wirekit.app/components/filter-builder) · [Flag](https://docs.wirekit.app/components/flag) · [Hover Card](https://docs.wirekit.app/components/hover-card) · [Image Compare](https://docs.wirekit.app/components/image-compare) · [Image Gallery](https://docs.wirekit.app/components/image-gallery) · [Inline Edit](https://docs.wirekit.app/components/inline-edit) · [Input](https://docs.wirekit.app/components/input) · [Kanban](https://docs.wirekit.app/components/kanban) · [Logo Cloud](https://docs.wirekit.app/components/logo-cloud) · [Main](https://docs.wirekit.app/components/main) · [Map](https://docs.wirekit.app/components/map) · [Menubar](https://docs.wirekit.app/components/menubar) · [Message](https://docs.wirekit.app/components/message) · [Message Group](https://docs.wirekit.app/components/message-group) · [Modal](https://docs.wirekit.app/components/modal) · [Multi-Select](https://docs.wirekit.app/components/multi-select) · [Navbar](https://docs.wirekit.app/components/navbar) · [Navigation Menu](https://docs.wirekit.app/components/navigation-menu) · [Notification Center](https://docs.wirekit.app/components/notification-center) · [Number Input](https://docs.wirekit.app/components/number-input) · [OTP Input](https://docs.wirekit.app/components/otp-input) · [Overflow Nav](https://docs.wirekit.app/components/overflow-nav) · [Page Progress](https://docs.wirekit.app/components/page-progress) · [Pagination](https://docs.wirekit.app/components/pagination) · [Password Input](https://docs.wirekit.app/components/password-input) · [Phone](https://docs.wirekit.app/components/phone) · [Price](https://docs.wirekit.app/components/price) · [Pricing Table](https://docs.wirekit.app/components/pricing-table) · [Profile](https://docs.wirekit.app/components/profile) · [Progress](https://docs.wirekit.app/components/progress) · [Progress Radial](https://docs.wirekit.app/components/radial-progress) · [QR Code](https://docs.wirekit.app/components/qr-code) · [Quick Replies](https://docs.wirekit.app/components/quick-replies) · [Radio](https://docs.wirekit.app/components/radio) · [Range Slider](https://docs.wirekit.app/components/range-slider) · [Reaction](https://docs.wirekit.app/components/reaction) · [Reading](https://docs.wirekit.app/components/reading) · [Reorder](https://docs.wirekit.app/components/reorder) · [Replay Button](https://docs.wirekit.app/components/replay-button) · [Scope Switcher](https://docs.wirekit.app/components/scope-switcher) · [Scroll Area](https://docs.wirekit.app/components/scroll-area) · [Scroll to Top](https://docs.wirekit.app/components/scroll-to-top) · [Segmented Control](https://docs.wirekit.app/components/segmented-control) · [Select](https://docs.wirekit.app/components/select) · [Sidebar](https://docs.wirekit.app/components/sidebar) · [Skeleton](https://docs.wirekit.app/components/skeleton) · [Slider](https://docs.wirekit.app/components/slider) · [Spacer](https://docs.wirekit.app/components/spacer) · [Sparkline](https://docs.wirekit.app/components/sparkline) · [Spinner](https://docs.wirekit.app/components/spinner) · [Stage Card](https://docs.wirekit.app/components/stage-card) · [Stat](https://docs.wirekit.app/components/stat) · [Status Dot](https://docs.wirekit.app/components/status-dot) · [Status Tiles](https://docs.wirekit.app/components/status-tiles) · [Stepper](https://docs.wirekit.app/components/stepper) · [Sticky Panel](https://docs.wirekit.app/components/sticky-panel) · [Swap](https://docs.wirekit.app/components/swap) · [Table](https://docs.wirekit.app/components/table) · [Tabs](https://docs.wirekit.app/components/tabs) · [Tags Input](https://docs.wirekit.app/components/tags-input) · [Team Section](https://docs.wirekit.app/components/team-section) · [Testimonial](https://docs.wirekit.app/components/testimonial) · [Textarea](https://docs.wirekit.app/components/textarea) · [Theme Controller](https://docs.wirekit.app/components/theme-controller) · [Ticker](https://docs.wirekit.app/components/ticker) · [Time Picker](https://docs.wirekit.app/components/time-picker) · [Timeline](https://docs.wirekit.app/components/timeline) · [Toast](https://docs.wirekit.app/components/toast) · [Toggle](https://docs.wirekit.app/components/toggle) · [Toggle Button](https://docs.wirekit.app/components/toggle-button) · [Tool Call](https://docs.wirekit.app/components/tool-call) · [Toolbar](https://docs.wirekit.app/components/toolbar) · [Tooltip](https://docs.wirekit.app/components/tooltip) · [Tour](https://docs.wirekit.app/components/tour) · [Tree View](https://docs.wirekit.app/components/tree-view) · [Wizard](https://docs.wirekit.app/components/wizard)