**Minor.** An assistant's turn can show its work: a tool call has a component of its own, the variants a regeneration produced get a switcher, an answer names the sources it relied on, and the reasoning disclosure stays open while the model is still writing. The combobox becomes a picker that shows icons, avatars and descriptions, runs without search when a short list does not need it, and opens a panel as wide as its options. A light subtree can sit inside a dark page, and a dark panel on a light page now resolves every color WireKit derives rather than the ones computed for the page around it. And a field set can say what is wrong with its whole group, so a checkbox group's error no longer has to be wired by hand.

### Added

- **A [field set](https://docs.wirekit.app/components/field#a-group-error) shows an error for its whole group, and the controls inside point at it.** Pass the message as `error`, or give the set the `name` your validation uses: it reads the error bag for that key and for every entry below it, so a checkbox group bound to `roles` shows the error Laravel files under `roles.1`. The message renders once, in the hint's place, as a polite live region that follows `announce-error` and the surrounding form's `announce-errors`. Every checkbox, radio and toggle in the set carries `aria-invalid` and points at the message through `aria-describedby`, next to its own hint or error, and points at the set's `hint` while nothing is wrong. Radios that share the set's `name` no longer repeat the message under every option. A view compiled before this release keeps rendering the set the old way until its compiled views are cleared.
- **The component sandbox offers more of each component's props.** A [badge](https://docs.wirekit.app/components/badge)'s surface, dismiss button and wrapping; a [callout](https://docs.wirekit.app/components/callout)'s icon, border and stripe; an [alert](https://docs.wirekit.app/components/alert)'s icon; a [code block](https://docs.wirekit.app/components/code-block)'s copy button; a [keyboard key](https://docs.wirekit.app/components/kbd)'s size; a [heading](https://docs.wirekit.app/components/heading)'s size, accent and tracking; a [text](https://docs.wirekit.app/components/text)'s weight, alignment, truncation, line clamp and word breaking; a [text link](https://docs.wirekit.app/components/link)'s variant, size, underline and external marker; and a [button](https://docs.wirekit.app/components/button)'s label wrapping. It still leaves out what an open endpoint should not take, such as URLs, free text, icon names and personalization scopes.
- **A subtree can be light inside a dark page: put `light` on it.** What is below the element resolves the light values again, the browser's own controls included, while the page around it stays dark. The class declares only the tokens that change with the mode, so a radius, a font or a spacing value you override in your own `:root` reaches into the subtree unchanged, and a reader's request for more contrast reaches it too. The mode-only utilities `wk-light-only` and `wk-dark-only` follow the island as well, and so do your own `dark:` utilities once your `@custom-variant dark` line is the one the [integration guide](https://docs.wirekit.app/getting-started/integration) shows. [A light island in a dark page](https://docs.wirekit.app/theming#a-light-island-in-a-dark-page) shows the markup, and the one kind of override that needs a second selector.
- **[`WcagContrast::conformance()`](https://docs.wirekit.app/theming#checking-a-color-pairing-in-php) tells you whether a contrast ratio meets WCAG AA or AAA** for body text, large text or a UI component, the way a page labels a color pairing. UI components top out at AA, because WCAG defines no AAA level for them. `WcagContrast::parseToLinearRgba()` is available alongside it and returns the alpha channel with the color, including for the forms a browser returns from `getComputedStyle` — `oklab(…)` and `color(srgb …)` — and `WcagContrast::unmeasurableReason()` tells you why a pair has no ratio.
- **The [data table](https://docs.wirekit.app/components/data-table) can freeze its first column while the rest scrolls.** `sticky-column` holds the column that names the row — usually a name or a date — against the start edge, so a wide table stays readable once it has been pushed sideways. With `selectable` the checkbox freezes with it, because a checkbox that scrolls out from under its own row is worse than one that never moved. The frozen column is capped at `--size-wk-table-sticky-column-max` and wraps rather than taking the screen: on a phone an ordinary company name would otherwise claim two fifths of it, and every further character comes out of the columns you froze it to be able to read. It is positioned logically, so under `dir="rtl"` the column holds the right edge without a second rule, and hiding it through the column menu moves the freeze to whatever is first now. Off by default, and switchable for the whole application through config.
- **[`<x-wirekit::branch-switcher>`](https://docs.wirekit.app/components/branch-switcher) steps between several generated answers.** When a model regenerates, the earlier answer is not waste — it is the other option. Two arrows, a count, and an announcement that carries the whole sentence ("Showing response 2 of 3") into a polite region that exists before it has anything to say, because a region created together with its text is inert and a fragment appended to an existing one tells a screen reader's user nothing. The index is 1-based everywhere: in the label, in what `wire:model` hands the server, and in the `current` prop you write. It is a control rather than a container — you render the active variant, the switcher owns the index. The ends do not wrap unless you ask for `loop`, because a reader stepping through variants expects the last one to be the last one. `←` and `→` work while either arrow has focus, and an index whose variant no longer exists is clamped rather than refused, since a regenerate that drops one while the reader is on it is an ordinary race.
- **[`<x-wirekit::tool-call>`](https://docs.wirekit.app/components/tool-call) shows one tool invocation an assistant made** — the name, where the call stands, the arguments as readable JSON, and the result behind a disclosure. It composes primitives you already have rather than inventing a visual language: `code` for the name, `badge` and `shimmer` for the state, `code-block` for the arguments, `collapsible` for the result. A running call marks its block `aria-busy` and shimmers its label; a failed one opens its disclosure, because an error nobody sees is not reported. The state is in the badge's text as well as its color, so a reader who cannot tell the intents apart can still tell a finished call from a failed one. `seconds` replaces the state word with how long the call took — the application owns that number, and a value that is not one is ignored rather than rendered as "Took 0 s".
- **An [assistant message](https://docs.wirekit.app/components/assistant-message#sources) shows the sources an answer cites, as numbered chips.** Pass `citations` whatever your retrieval layer produced: titles, arrays with a `label`, an `href` and a `snippet`, or your own models. Each chip opens a popover with the passage the answer relied on and, where there is one, a link to it. An entry without a label is left out rather than drawn as a chip nothing names, the numbering follows what is rendered, and each chip carries its source in its accessible name, so a screen reader announces "Source 1, Rate limits" rather than a bare digit.
- **The reasoning disclosure of an [assistant message](https://docs.wirekit.app/components/assistant-message#reasoning) follows the stream.** It stayed collapsed, so a reader watching an answer being written saw no sign that the model was reasoning. While the message streams, the disclosure is open and its label shimmers with the incoming text; it closes when the stream ends. Pass `reasoning-seconds` and the closed label reads "Thought for 12 s". Your application owns that number, and a value that is not a number shows no duration rather than "Thought for 0 s".
- **`ComponentRegistry::acceptedPropNames(string $name)` returns every name a component's tag accepts** — its `@props` and its `@aware` keys together. Use it when the question is whether Blade would do anything with an attribute, which is what a linter, an editor completion or an unknown-prop warning is really asking. It is deliberately a different answer from `extractProps()`: `@aware` resolves against the rendering component's own data before it walks up to the parent, so `<x-wirekit::accordion.item variant="separated">` takes effect even though `variant` is not in that component's `@props`.
- **Every component in the manifest now lists the design tokens it reads.** `wirekit:export-json`, the `.wirekit-schema.json` feed, the MCP catalog and `wirekit:show --as=json` carry a sorted `tokens` array per component, and each entry in `sub_components` carries its own: the custom properties declared in `dist/wirekit.css` that its template, the partials it includes, the helpers it calls and the stylesheet rules on the classes it renders read. It is derived from the component on every export, so it cannot fall behind the markup. `ComponentRegistry::tokensOf(string $name)` returns the same list.
- **The component manifest names the values each prop accepts and the type it takes.** Every prop record in the manifest `wirekit:export-json` writes carries `values`, the list the component validates, and `value_type`, what the template proves the value to be, so a props playground or an assistant can offer a fitting control instead of reading the prose. A prop that answers to two names lists its values under each name in that name's own spelling: a card lists `outline` under `surface` and `outlined` under `variant`. [`ComponentRegistry::extractProps()`](https://docs.wirekit.app/extending/component-registry) describes the record.
- **[Pagination](https://docs.wirekit.app/components/pagination) turns the page inside a Livewire component.** Every page control was a plain link, so in a Livewire component a click reloaded the page and lost whatever the component held outside the URL, such as a filter. With `livewire`, each control stays a link, and a click calls the component's `gotoPage()` for the paginator's page name, then scrolls back to the top the way Livewire's own pager does; `scroll-to` picks another target or turns it off. A component can also return `wirekit::pagination.livewire` from `paginationView()` and `wirekit::pagination.livewire-simple` from `paginationSimpleView()`, so `$paginator->links()` renders this pager too.
- **The theme script can load as a file, for a Content Security Policy that allows no inline script.** `@wirekitThemeScript` wrote an inline script and nothing else, so under `script-src 'self'` without nonces the browser refused it, and the page painted light until the [theme controller](https://docs.wirekit.app/components/theme-controller) turned it dark. Set `wirekit.theme.script` to `external` and the same script loads from your own origin as `wirekit-theme.js`, still before the first paint. It ships in `dist/` and publishes with the other assets.
- **A clickable [card](https://docs.wirekit.app/components/card) can show at rest that it leads somewhere.** The pointer and the hover shadow were the only signs of a card with `href`, and a phone shows neither, so a clickable card looked like one with nothing behind it. With `chevron`, a card that links or runs an action carries a chevron at its inline end, mirrored in right-to-left pages and hidden from screen readers. It is opt-in, and a card that does neither never draws one.
- **[Prose](https://docs.wirekit.app/components/prose#adapting-to-the-column) can size its type to its own column rather than to the viewport.** A media query cannot see a column, so prose in a narrow sidebar on a wide screen kept the heading scale built for a whole page. With `container`, the wrapper becomes a size container and its scale tightens once the column is narrower than 30rem. It is opt-in because a size container no longer takes its width from its content, so prose inside a parent that shrinks to fit its content would collapse; the page names those parents.
- **The browser's find in page opens what it finds.** A match inside a closed [accordion](https://docs.wirekit.app/components/accordion#find-in-page) item or a collapsed [collapsible](https://docs.wirekit.app/components/collapsible#find-in-page) opens it, and with `findable` an inactive [tabs](https://docs.wirekit.app/components/tabs#find-in-page) panel does too. In a browser that cannot search hidden content, the panels stay hidden exactly as before.
- **A [toggle button](https://docs.wirekit.app/components/toggle-button#icons-tooltips-and-state-labels) takes an icon, an icon per state, a tooltip, a color for its pressed state, a label per state and `wire:model`.** `icon` shows one glyph in both states, and `on-icon` with `off-icon` swaps two. `tooltip` names an icon-only toggle, `active-intent` colors the pressed icon from the canonical intents, and `on-label` with `off-label` changes the visible text instead of announcing a pressed state. An icon-only toggle with no visible label, tooltip or `aria-label` throws in debug mode and is logged otherwise.
- **A [tooltip](https://docs.wirekit.app/components/tooltip) can name its trigger without also describing it.** `describes` links the tooltip to its trigger through `aria-describedby` and stays on by default. Set it to false when the tooltip repeats the trigger's accessible name, such as the `aria-label` of an icon-only button, so a screen reader does not announce the same words twice.
- **A [combobox](https://docs.wirekit.app/components/combobox#select-without-search) can run without search.** `:searchable="false"` renders a select-only combobox whose keyboard follows the WAI-ARIA select-only pattern: the arrow keys, Home, End, PageUp and PageDown move through the options, Enter, Space and Tab choose one, Escape keeps the current choice, disabled options are skipped, and typing jumps to a matching option. It keeps the option model, the hidden input and the Livewire binding of the searchable combobox.
- **[Combobox](https://docs.wirekit.app/components/combobox#icons-avatars-and-descriptions) and [multi-select](https://docs.wirekit.app/components/multi-select) options can carry an icon, an image or an avatar, a description, search keywords and a shorter label for the chosen value.** An array option reads `icon`, `image`, `avatar` with `initials`, `description`, `keywords` and `selectedLabel`, one medium per option, and a list of plain options renders exactly as before.
- **[Combobox](https://docs.wirekit.app/components/combobox#panel-placement-and-width) and [multi-select](https://docs.wirekit.app/components/multi-select) take `placement` and `panel-width` for their options panel.** The panel always opened below the field at exactly its width, so a compact field with long options had no readable panel. `placement` accepts the placements a dropdown accepts, and `panel-width` takes `trigger`, the default, `auto` for the width of the widest option, or a CSS length. The panel never gets narrower than the field or wider than the room its placement leaves, and both props have application-wide defaults in config.

### Changed

- **[Prose](https://docs.wirekit.app/components/prose#where-the-reading-serif-comes-from) with `preset="reading"` sets long-form text in a serif.** The preset used to open up the leading only. It now uses `--font-wk-serif`: the family you name in `wirekit.fonts.serif`, or the reader's own platform serif when you name none, so no font request leaves the page, and the reading measure counts characters of that serif. If you use the preset and want its leading without the serif, the page shows the one rule that keeps it.

### Fixed

- **A [collapsible](https://docs.wirekit.app/components/collapsible), [combobox](https://docs.wirekit.app/components/combobox) or [navigation menu](https://docs.wirekit.app/components/navigation-menu) stops animating its chevron and panel for a reader who asked for less motion.** Their moving parts sat outside WireKit's reduced-motion rule, so a chevron still turned and a collapsible still slid open. Each root now carries a marker class, `wk-collapsible`, `wk-combobox` and `wk-navigation-menu`, listed in the [public CSS API](https://docs.wirekit.app/extending/public-css-api); keep it if you re-template one of them.
- **The component sandbox offers every intent a [badge](https://docs.wirekit.app/components/badge) and every size a [button](https://docs.wirekit.app/components/button) accepts.** `accent` and `md-compact` worked on the components and could not be picked in the sandbox's prop editor.
- **A [select](https://docs.wirekit.app/components/select) whose chosen value is longer than the field no longer makes the page scroll sideways in Safari.** Safari and every browser on iPhone and iPad counted the cut-off rest of the value into the width of the page, so a phone could scroll sideways over nothing you could see.
- **A [modal](https://docs.wirekit.app/components/modal) or [alert dialog](https://docs.wirekit.app/components/alert-dialog) trigger can take the layout of the container it sits in.** The trigger slot sat in a box of its own, so a button there kept its natural width in a stack that stretched its neighbors, and no class on the component could change that. Add `class="contents"` to the component and the trigger follows the surrounding layout. A page that does not add it looks exactly as before.
- **A [table](https://docs.wirekit.app/components/table) or [data table](https://docs.wirekit.app/components/data-table) wider than the screen no longer lets a visually hidden label stretch the page.** A label such as the hidden heading of an actions column is positioned absolutely, and the table's scroller was not its containing block, so on a phone the label sat outside the scroller and widened everything around the table. The scroller contains it now.
- **A page that declines more contrast with `data-contrast="no-preference"` keeps that choice inside a `.dark` panel.** When the operating system asked for more contrast, a dark panel on such a page still raised its hint text and borders, while the page around it rightly did not. The refusal on `<html>` now reaches every panel that switches mode.
- **A `.dark` panel on a light page resolves the colors WireKit derives from its tokens against itself.** Soft alert text, inline code, tooltips, the reading components and the [navigation rail](https://docs.wirekit.app/components/app-rail) kept the colors computed for the light page, near-black text on a dark panel and a white rail inside it, because a CSS custom property is computed where it is declared and those were declared for the page alone. They are declared for the dark class as well now, and a dark panel inside a rail switches too. [What the class carries besides tokens](https://docs.wirekit.app/theming#what-the-class-carries-besides-tokens) has the placement that still matters for the page.
- **A [segmented control](https://docs.wirekit.app/components/segmented-control) no longer animates its segments for a reader who asked for less motion.** Its segments carry a transition that WireKit's reduced-motion rule only reached when something around the control happened to opt in; the control now opts in itself.
- **[`wirekit:doctor:a11y --theme-contrast`](https://docs.wirekit.app/cli-reference#wirekitdoctora11y) no longer overstates the contrast of a translucent color.** A half-transparent text color was measured as if it were solid, which can report a pass the reader never sees. It is now laid over its background first, as a browser draws it, and a translucent background is skipped with that reason instead of being measured as solid.
- **A [segmented control](https://docs.wirekit.app/components/segmented-control) whose options scroll now says so.** On a narrow screen the bar scrolls on its own, and with a later option selected it opened scrolled to that option: the first options hidden and the next one cut mid-word, with nothing on screen saying more lay before them. A soft shadow now marks the edge the options continue past, and it follows the scroll. It is positioned logically, so a right-to-left page gets it on the side its options continue toward.
- **A [table](https://docs.wirekit.app/components/table#sticky-first-column) with `sticky-column` caps its frozen column and holds it against the start edge in right-to-left pages.** A table with a frozen column takes its content's width so that it can scroll, which kept every cell on one line: at phone width a comparison's frozen column took 334 of 369px. The cells of that column are now capped at `--size-wk-table-sticky-column-max`, `min(40vw, 16rem)` by default, and its header may wrap. The column was also pinned to the left edge, which under `dir="rtl"` is the far end of the row; it follows the start edge now, and left-to-right pages render as before.
- **[`wirekit:doctor:props`](https://docs.wirekit.app/cli-reference#wirekitdoctorprops) no longer reports an `@aware` key written on a tag as an unknown prop.** It asked for the declared props alone, so a correct call read as a typo while the runtime warning over the same render stayed quiet.
- **[`wirekit:doctor:a11y`](https://docs.wirekit.app/cli-reference#wirekitdoctora11y) no longer reads markup quoted in a comment as markup.** A comment explaining why a `role="img"` carries a name was reported as a `role="img"` without one. Comments are blanked before the rules run — in place, so every finding still reports the line it is on.
- **The [app rail](https://docs.wirekit.app/components/app-rail) shows its module names in a phone drawer it has to itself.** Below the shell's breakpoint the rail kept its icon-only form inside the drawer, where a tooltip never appears because a tap follows the link first. Alone in the drawer it now presents its names, expandable or not; beside a module column it keeps its narrow form, which is what fits a phone there.
- **The [app shell](https://docs.wirekit.app/components/app-shell)'s phone drawer has a close control of its own.** A header placed in the content column keeps its navigation toggle where the open drawer covers it, so a second tap on the toggle landed on whatever the drawer drew in that spot, such as a brand link that navigates away. The drawer now shows a close button there, first in its tab order, where focus lands when it opens, and its columns start below it. Escape and a tap on the backdrop close it as before.
- **Canceling an [alert dialog](https://docs.wirekit.app/components/alert-dialog) returns focus to the button that opened it, even when the dialog names a `focus-return-to` target.** The named target won on every close, so a keyboard user who backed out of a delete landed on it, typically the list heading, instead of on the row they came from. Cancel, Escape and a backdrop click now return focus to the trigger while it still exists. After the confirmation the named target still comes first, because the re-render is about to remove the trigger's row.
- **A [chart](https://docs.wirekit.app/components/chart) draws its default series in colors a reader can make out on a light page.** WCAG asks 3:1 of a graphic that carries content, and in light mode most of the default series fell short; the first one, standing in for the gray default accent, measured 1.67:1 on white. Where a color token is gray or falls under 3:1 against `--color-wk-bg`, the chart now draws that series in a darker shade of the same hue, and the token stays as it is for everything else that reads it. The sixth to eighth series switch shade with the mode as well. `--color-wk-info` now defaults to `#0891b2` in light mode, so the token itself holds 3:1 on white. The default palette already cleared the bar in dark mode and looks as before.
- **A date or time [input](https://docs.wirekit.app/components/input) centers its text in WebKit, the engine behind Safari, and an empty date field no longer reads like a set one.** WebKit placed the text of a `date`, `time` or `datetime-local` field against the top edge, 8px above the middle of a 40px field, because the field was given a block layout and WebKit centers that text only in a row layout. The separators between the parts of a date or a time now take the placeholder color: WebKit fills an empty date field with today's date in a gray a page cannot restyle, and with the separators in the text color the empty field looked like a date somebody had set.
- **[Pagination](https://docs.wirekit.app/components/pagination) renders previous and next for a paginator from `simplePaginate()` instead of throwing.** Such a paginator knows whether another page exists but not how many there are. The default `full` variant asked it for a total and `simple` asked it for the last page, so rendering failed with an exception. It now gets the previous and next controls, the same step down a cursor paginator already got, and the documentation no longer says the simple variant works with it.
- **A [timeline](https://docs.wirekit.app/components/timeline) entry shrinks with a narrow container, so a long line scrolls inside it.** The content area of a timeline item could not become narrower than the widest line it held. A line that cannot wrap, such as a tool call's arguments, pushed the entry past its container and nothing scrolled: on a 360px phone the documented conversation of tool calls reached 28px past its column in Chromium and 35px in WebKit.
- **WireKit components inside [prose](https://docs.wirekit.app/components/prose) look the way they do anywhere else.** Prose's element rules reached into the components nested in it: a button link came out underlined, a code block wrapped instead of scrolling and gained a second padding and background, table cells lost their own padding and gained borders, and a blockquote lost its inset. The elements a component renders are now skipped by those rules, while text you place in a component's slot keeps prose styling. Add `not-wk-prose` to a block of your own to leave all of it unstyled.
- **A [slider](https://docs.wirekit.app/components/slider#step-marks)'s first and last mark labels stay inside the slider.** Every mark label was centered on its position, so the first label reached half its width past the start of the track and the last one half its width past the end, which cut the last label off at phone width. The labels at the ends now align with the ends of the track, and a label in the middle stays centered.
- **A [multi-select](https://docs.wirekit.app/components/multi-select) or [tags input](https://docs.wirekit.app/components/tags-input) is as tall as an input beside it on a touch screen.** The text field inside each component's frame took the 44px touch target on top of the frame's own padding and border, so on a phone a multi-select measured 58px and a tags input 54px next to a 44px input. The frame takes the target now, and nothing changes on a desktop.
- **A [collapsible](https://docs.wirekit.app/components/collapsible) given an `id` no longer renders that id on two elements.** The root and the panel both carried it, so `aria-controls` pointed at an id two elements shared. The root keeps your id, and the panel takes it with `-panel` appended.
- **A slot whose condition turned out false counts as empty again.** Livewire wraps every `@if` in two HTML comments, and a slot holding only those comments counted as filled: a consent [checkbox](https://docs.wirekit.app/components/checkbox) rendered with no text and no accessible name, and other components lost their fallback label or default button, or kept room for content that was not there. Every component that decides whether a slot is empty now ignores those comments.
- **Slot content that a component uses as text no longer carries Livewire's markers.** A [textarea](https://docs.wirekit.app/components/textarea) filled inside a condition showed `<!--[if BLOCK]><![endif]-->` around its value, and the same markers reached the label of a chat marker, the tooltip of an app rail item and the answer an FAQ item hands to search engines.
- **A required [checkbox](https://docs.wirekit.app/components/checkbox#with-rich-label-slot) shows its star when its label comes from the slot.** The star was drawn only for a label passed as a prop, so a required consent checkbox with a rich label showed no mark.
- **The [Minimal](https://docs.wirekit.app/theming/minimal) preset keeps its panels and helper text readable in dark mode, and [Aurora](https://docs.wirekit.app/theming/aurora)'s recipe for blue informational text holds in both modes.** Both set colors in `:root` alone, which on a page with the dark class outranks WireKit's dark defaults: card text in the Minimal preset measured 1.04:1 in dark mode, and Aurora's informational text 2.85:1. Each block now carries the matching dark values.

### Documentation

- **The [animations](https://docs.wirekit.app/animations#view-transitions) page explains view transitions with Livewire.** `wire:transition` already starts a transition, skips it for a reader who asked for less motion and while a modal dialog is open, so the page shows how to name your elements and how to handle one whose shape changes, rather than adding a second driver that would race it.
- **The [range slider](https://docs.wirekit.app/components/range-slider), [chart](https://docs.wirekit.app/components/chart), [streaming chart](https://docs.wirekit.app/components/charts-apex/streaming), [command palette](https://docs.wirekit.app/components/command-palette) and [tabs](https://docs.wirekit.app/components/tabs) pages show a Livewire class and its view in one tabbed code block.** Each tab is titled after its file, so two PHP files no longer appear as two tabs that both read php.
- **[Theming](https://docs.wirekit.app/theming#guaranteed-compliance) lists the guaranteed contrast pairs as a table** of role, foreground token, background token and requirement, with one row per button intent and the tinted callout and alert surfaces in rows of their own. The statements are the same as before.
- **The [AI tooling](https://docs.wirekit.app/ai-tooling#discovering-the-surfaces-from-any-page) page shows how an agent finds the machine-readable surfaces from any documentation URL:** the Markdown source a page answers with for `Accept: text/markdown`, the `Link` header every page sends, and the catalog at `/.well-known/api-catalog`.

### Components

Every component this release changes, each linked to its page: [Accordion](https://docs.wirekit.app/components/accordion) · [Alert](https://docs.wirekit.app/components/alert) · [Alert Dialog](https://docs.wirekit.app/components/alert-dialog) · [App Rail](https://docs.wirekit.app/components/app-rail) · [App Shell](https://docs.wirekit.app/components/app-shell) · [Assistant Message](https://docs.wirekit.app/components/assistant-message) · [Attachment](https://docs.wirekit.app/components/attachment) · [Avatar](https://docs.wirekit.app/components/avatar) · [Band](https://docs.wirekit.app/components/band) · [Blockquote](https://docs.wirekit.app/components/blockquote) · [Bottom Nav](https://docs.wirekit.app/components/bottom-nav) · [Branch Switcher](https://docs.wirekit.app/components/branch-switcher) · [Brand](https://docs.wirekit.app/components/brand) · [Brand Bar](https://docs.wirekit.app/components/brand-bar) · [Breadcrumb](https://docs.wirekit.app/components/breadcrumb) · [Button](https://docs.wirekit.app/components/button) · [Calendar](https://docs.wirekit.app/components/calendar) · [Callout](https://docs.wirekit.app/components/callout) · [Card](https://docs.wirekit.app/components/card) · [Center](https://docs.wirekit.app/components/center) · [Chart](https://docs.wirekit.app/components/chart) · [Chat Marker](https://docs.wirekit.app/components/chat-marker) · [Checkbox](https://docs.wirekit.app/components/checkbox) · [Code](https://docs.wirekit.app/components/code) · [Code Block](https://docs.wirekit.app/components/code-block) · [Collapsible](https://docs.wirekit.app/components/collapsible) · [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) · [Container](https://docs.wirekit.app/components/container) · [Context Menu](https://docs.wirekit.app/components/context-menu) · [Countdown](https://docs.wirekit.app/components/countdown) · [CTA](https://docs.wirekit.app/components/cta) · [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) · [Empty State](https://docs.wirekit.app/components/empty-state) · [Event Calendar](https://docs.wirekit.app/components/event-calendar) · [FAB](https://docs.wirekit.app/components/fab) · [FAQ](https://docs.wirekit.app/components/faq) · [Feature](https://docs.wirekit.app/components/feature) · [Field](https://docs.wirekit.app/components/field) · [File Upload](https://docs.wirekit.app/components/file-upload) · [Filter Builder](https://docs.wirekit.app/components/filter-builder) · [Footer](https://docs.wirekit.app/components/footer) · [Grid](https://docs.wirekit.app/components/grid) · [Heading](https://docs.wirekit.app/components/heading) · [Hero](https://docs.wirekit.app/components/hero) · [Highlight](https://docs.wirekit.app/components/highlight) · [Hover Card](https://docs.wirekit.app/components/hover-card) · [Image](https://docs.wirekit.app/components/image) · [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) · [Lightbox](https://docs.wirekit.app/components/lightbox) · [Link component](https://docs.wirekit.app/components/link) · [List](https://docs.wirekit.app/components/list) · [Logo Cloud](https://docs.wirekit.app/components/logo-cloud) · [Map](https://docs.wirekit.app/components/map) · [Menubar](https://docs.wirekit.app/components/menubar) · [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) · [Pagination](https://docs.wirekit.app/components/pagination) · [Password Input](https://docs.wirekit.app/components/password-input) · [Popover](https://docs.wirekit.app/components/popover) · [Pricing Table](https://docs.wirekit.app/components/pricing-table) · [Product Card](https://docs.wirekit.app/components/product-card) · [Profile](https://docs.wirekit.app/components/profile) · [Prose](https://docs.wirekit.app/components/prose) · [Radio](https://docs.wirekit.app/components/radio) · [Range Slider](https://docs.wirekit.app/components/range-slider) · [Rating](https://docs.wirekit.app/components/rating) · [Reading](https://docs.wirekit.app/components/reading) · [Replay Button](https://docs.wirekit.app/components/replay-button) · [Row](https://docs.wirekit.app/components/row) · [Scope Switcher](https://docs.wirekit.app/components/scope-switcher) · [Section](https://docs.wirekit.app/components/section) · [Segmented Control](https://docs.wirekit.app/components/segmented-control) · [Select](https://docs.wirekit.app/components/select) · [Shell Bar](https://docs.wirekit.app/components/shell-bar) · [Shimmer](https://docs.wirekit.app/components/shimmer) · [Sidebar](https://docs.wirekit.app/components/sidebar) · [Skip Link](https://docs.wirekit.app/components/skip-link) · [Slider](https://docs.wirekit.app/components/slider) · [Sparkline](https://docs.wirekit.app/components/sparkline) · [Stack](https://docs.wirekit.app/components/stack) · [Stage Card](https://docs.wirekit.app/components/stage-card) · [Stat](https://docs.wirekit.app/components/stat) · [Status Matrix](https://docs.wirekit.app/components/status-matrix) · [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) · [Stream](https://docs.wirekit.app/components/stream) · [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) · [Text](https://docs.wirekit.app/components/text) · [Textarea](https://docs.wirekit.app/components/textarea) · [Theme Controller](https://docs.wirekit.app/components/theme-controller) · [Time Picker](https://docs.wirekit.app/components/time-picker) · [Timeline](https://docs.wirekit.app/components/timeline) · [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) · [Visually Hidden](https://docs.wirekit.app/components/visually-hidden)