Accordion navigation
Sections that expand one at a time to reveal their content.
▸ Usage<Accordion
headingLevel={3}
items={[
{ value: 'refunds', title: 'How do refunds work?', content: <p>Within 30 days…</p> },
{ value: 'seats', title: 'Can I change seats mid-cycle?', content: <p>Yes…</p> },
]}
/> Alert feedback
Nearly at your limit 92% of the period’s allowance is used.
A message about the state of the system or the result of an action.
▸ Usage<Alert tone="danger" title="Upload failed" actions={<Button size="sm" tone="danger" variant="outline">Retry</Button>}>
The file is larger than the 25 MB limit.
</Alert> Autocomplete form
A text input that filters a long list of options as you type.
▸ Usage<Autocomplete
label="Country"
items={countries}
value={country}
onChange={setCountry}
/> Scope Filters a list you pass in, synchronously. Async loading, pagination, and multi-select are not implemented.
Avatar display
A person or entity, shown as an image, initials, or a fallback glyph.
▸ UsageAvatar, AvatarGroup
<Avatar name="Ada Lovelace" src="/ada.jpg" /> Badge display
3 new
A count or status dot attached to the corner of another element.
▸ Usage<Badge content={3} label="3 unread">
<Button iconOnly variant="ghost" aria-label="Notifications">
<BellIcon />
</Button>
</Badge> Breadcrumbs navigation
Where the current page sits in the hierarchy above it.
▸ Usage<Breadcrumbs
maxItems={3}
items={[
{ label: 'Home', href: '/' },
{ label: 'Workspaces', href: '/workspaces' },
{ label: 'Acme', href: '/workspaces/acme' },
{ label: 'Billing' },
]}
/> Button action
Save Cancel
A control that performs an action when activated.
▸ Usage<Button onClick={save}>Save changes</Button> Calendar date
S Sunday M Monday T Tuesday W Wednesday T Thursday F Friday S Saturday 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1 2 3 4 5 6 7 8 9 10 11 12
November 2026 A month grid for choosing a date.
▸ Usage<Calendar label="Delivery date" value={date} onChange={setDate} min="2026-01-01" /> Scope Gregorian calendar only, with locale-aware month and weekday names. No week numbers and no multi-month view.
Card layout
Three lines, one surface.
A surface that groups related content into one unit.
▸ UsageCard, CardHeader, CardBody, CardFooter
<Card>
<CardHeader>Monthly usage</CardHeader>
<CardBody>You have used 4,210 of 10,000 credits.</CardBody>
<CardFooter>
<Button size="sm" variant="ghost">View details</Button>
</CardFooter>
</Card> Checkbox form
An independent on/off choice.
▸ Usage<Checkbox label="Email me about outages" name="outage-emails" /> CheckboxGroup form
Several related checkboxes with one label, description, and error.
▸ Usage<CheckboxGroup
label="Notify me about"
value={channels}
onChange={setChannels}
items={[
{ value: 'outages', label: 'Outages' },
{ value: 'billing', label: 'Billing changes' },
{ value: 'product', label: 'Product updates' },
]}
/> Chip display
paid draft
A short, non-interactive label that categorises an item or states its status.
▸ Usage<Chip tone="success">Active</Chip> CircularProgress feedback
Progress in a compact ring, for tight spaces and dashboards.
▸ Usage<CircularProgress label="Storage used" value={72} size="lg" showValue /> Code display
--k-fg-accent
An inline fragment of code or a literal value.
▸ Usage<p>Set <Code>UI_KIT_TONES</Code> to override the vocabulary.</p> DateInput date
A date the user types rather than browses to.
▸ Usage<DateInput label="Date of birth" max="2008-08-18" /> Scope Built on the native date input, so the display format follows the platform and cannot be overridden.
DatePicker date
A date field with a calendar beside it.
▸ Usage<DatePicker label="Invoice date" value={date} onChange={setDate} max="2026-12-31" /> DateRangePicker date
A start and end date, with a range calendar beside them.
▸ Usage<DateRangePicker label="Reporting period" value={period} onChange={setPeriod} /> Divider layout
A rule that separates two groups of content.
▸ Usage<Divider /> Drawer overlay
Open drawer Narrow the list without leaving the page.
A panel that slides in from an edge and blocks the page behind it.
▸ Usage<Drawer
open={filtering}
onClose={() => setFiltering(false)}
title="Filters"
footer={<Button onClick={apply}>Show 42 results</Button>}
>
<CheckboxGroup label="Status" items={statuses} value={selected} onChange={setSelected} />
</Drawer> Dropdown overlay
Actions ▾
A menu of commands opened from a control.
▸ Usage<Dropdown
trigger={<Button variant="ghost" iconOnly aria-label="Project actions"><MoreIcon /></Button>}
items={[
{ label: 'Rename', onSelect: rename, shortcut: 'R' },
{ label: 'Duplicate', onSelect: duplicate },
{ separator: true },
{ label: 'Delete project', onSelect: remove, tone: 'danger' },
]}
/> Scope Single-level menus. Submenus, checkbox items, and radio items are not implemented.
Field form
A text input wired to its label, description, and error message.
▸ UsageField, FieldShell
<Field label="Work email" type="email" name="email" /> Form form
A group of fields with a shared layout and one error summary.
▸ UsageForm, FormActions
<Form
errors={errors}
onSubmit={(event) => {
event.preventDefault()
setErrors(validate(new FormData(event.currentTarget)))
}}
>
<Field label="Work email" name="email" id="email" error={errors.email} />
<Field label="Company" name="company" id="company" error={errors.company} />
<FormActions>
<Button type="submit">Create account</Button>
<Button variant="ghost" type="button">Cancel</Button>
</FormActions>
</Form> Image display
A picture with reserved space, a blurred placeholder, and a failure state.
▸ Usage<Image src="/photo.jpg" alt="A wide landscape photograph" ratio={16 / 9} /> InputOtp form
A short one-time code, shown as separate character cells.
▸ Usage<InputOtp
label="Verification code"
description="Sent to +1 555 0100."
length={6}
onComplete={verify}
/> Kbd display
⌘ K
A key or key combination the user should press.
▸ Usage<Kbd keys={['mod']}>K</Kbd> Link navigation
Navigation to another place. Not an action.
▸ Usage<Link href="/docs/billing">Read the billing guide</Link> Listbox form
A list of options that can be selected, with keyboard navigation.
▸ Usage<Listbox
label="Environment"
value={env}
onChange={setEnv}
items={[
{ value: 'prod', label: 'Production', description: 'Serving live traffic' },
{ value: 'staging', label: 'Staging', description: 'Mirrors production' },
]}
/> Scope Options are rendered eagerly; there is no virtualisation for very long lists.
Modal overlay
Open modal This cannot be undone.
A dialog that blocks the page until it is resolved.
▸ UsageModal, ModalFooter
<Modal
open={confirming}
onClose={() => setConfirming(false)}
title="Delete this project?"
description="Its 1,204 documents will be permanently removed."
footer={
<>
<Button variant="ghost" onClick={() => setConfirming(false)}>Keep project</Button>
<Button tone="danger" onClick={remove}>Delete project</Button>
</>
}
/> Navbar navigation
The bar across the top of an application: brand, links, actions.
▸ Usage<Navbar
brand={<><Logo /> UI-Kit</>}
links={[
{ label: 'Overview', href: '/', current: true },
{ label: 'Usage', href: '/usage' },
{ label: 'Billing', href: '/billing' },
]}
actions={<Button size="sm">New project</Button>}
/> Scope Collapses to a stacked menu at a CSS breakpoint. It does not include a mega-menu, nor submenu support.
NumberInput form
A numeric value with steppers, bounds, and formatting.
▸ Usage<NumberInput label="Seats" min={1} max={50} value={seats} onValueChange={setSeats} /> Pagination navigation
Moving between pages of a long result set.
▸ UsagePagination, paginationRange
<Pagination page={page} pageCount={42} onPageChange={setPage} /> Popover overlay
Why this price?
A small non-blocking surface anchored to the control that opened it.
▸ Usage<Popover
title="Rename project"
trigger={<Button variant="ghost" size="sm">Rename</Button>}
>
<Field label="Name" defaultValue={project.name} />
</Popover> Scope Positions against the viewport with a flip and a clamp. It does not reposition inside a scrolling container that clips its own overflow, and it draws no arrow.
Progress feedback
How far along a task is, when the proportion is known.
▸ Usage<Progress label="Uploading contract.pdf" value={62} /> RadioGroup form
One choice from a small set, with every option visible.
▸ Usage<RadioGroup
label="Billing period"
name="period"
value={period}
onChange={setPeriod}
items={[
{ value: 'monthly', label: 'Monthly' },
{ value: 'annual', label: 'Annual', description: 'Two months free.' },
]}
/> RangeCalendar date
S Sunday M Monday T Tuesday W Wednesday T Thursday F Friday S Saturday 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1 2 3 4 5 6 7 8 9 10 11 12
November 2026 A month grid for choosing a start and end date.
▸ Usage<RangeCalendar label="Stay" value={stay} onChange={setStay} min="2026-08-18" /> Scope A single month view. Two-month side-by-side selection is not implemented.
ScrollShadow layout
A scrollable region that fades at whichever edge has more content.
▸ Usage<ScrollShadow style={{ maxHeight: '12rem' }} label="Team members">
{members.map((m) => <User key={m.id} name={m.name} description={m.email} />)}
</ScrollShadow> Select form
A choice of one option from a known list.
▸ Usage<Select label="Plan" placeholder="Choose a plan" items={[
{ value: 'free', label: 'Free' },
{ value: 'pro', label: 'Pro' },
{ value: 'scale', label: 'Scale' },
]} /> Scope Built on the native `<select>`, so options are text only. For option icons, descriptions, or search, use Listbox or Autocomplete.
Skeleton feedback
A placeholder occupying the shape of content that has not arrived.
▸ Usage<Skeleton loaded={!isLoading}>
<p>{user.biography}</p>
</Skeleton> Slider form
A value chosen from a continuous range by dragging.
▸ Usage<Slider
label="Quality"
min={0}
max={100}
step={5}
value={quality}
onValueChange={setQuality}
formatValue={(v) => `${v}%`}
/> Scope Single-value only. A two-thumb range slider is not implemented.
Snippet display
npx create-quxkit-app my-app A command or value shown with a copy button.
▸ Usage<Snippet prompt="$">npx ui-kit init --brand "#22409E"</Snippet> Spacer layout
A fixed gap, for the cases where layout cannot supply one.
▸ Usage<div style={{ display: 'flex' }}>
<strong>Project settings</strong>
<Spacer grow />
<Button size="sm">Save</Button>
</div> Spinner feedback
An indeterminate busy indicator, for a wait with no known length.
▸ Usage<Spinner label="Loading invoices" /> Switch form
Metered billing
A setting that takes effect the moment it is changed.
▸ Usage<Switch
label="Two-factor authentication"
description="Required for accounts with billing access."
checked={enabled}
onChange={(e) => save(e.target.checked)}
/> Table data
Rows of records with columns that can be sorted and selected.
▸ Usage<Table
caption="Invoices from the last 30 days"
columns={[
{ key: 'number', header: 'Invoice', sortable: true },
{ key: 'customer', header: 'Customer' },
{ key: 'amount', header: 'Amount', align: 'end', sortable: true },
]}
rows={invoices}
getRowId={(row) => row.id}
sort={sort}
onSortChange={setSort}
selected={selected}
onSelectionChange={setSelected}
/> Scope Sorting is reported and requested, not performed — you sort the data. No virtualisation, column resizing, or pinned columns.
Tabs navigation
Alternative views of the same region, one shown at a time.
▸ Usage<Tabs
items={[
{ value: 'overview', label: 'Overview', content: <Overview /> },
{ value: 'usage', label: 'Usage', content: <Usage /> },
{ value: 'billing', label: 'Billing', content: <Billing /> },
]}
/> Textarea form
A multi-line text input, wired to its label, description, and error.
▸ Usage<Textarea label="What went wrong?" autoSize /> TimeInput date
A time of day.
▸ Usage<TimeInput label="Start time" description="Times are in UTC." step={900} /> Scope Built on the native time input, so its appearance follows the platform and it carries no time zone.
Toast feedback
A transient message about something that just happened.
▸ UsageToast, ToastProvider, ToastViewport, useToast
<ToastProvider position="bottom-right">
<App />
</ToastProvider> Scope Includes a provider, a queue, and timers. It does not persist toasts across navigation or coordinate multiple viewports.
Tooltip overlay
Hover me
A short label revealed on hover or focus.
▸ Usage<Tooltip content="Delete permanently">
<Button iconOnly variant="ghost" tone="danger" aria-label="Delete permanently">
<TrashIcon />
</Button>
</Tooltip> Scope Positions against the viewport with a flip and a clamp. It does not reposition inside a scrolling container that clips its own overflow, and it draws no arrow.
User display
A person shown as an avatar next to their name and a secondary line.
▸ Usage<User name="Ada Lovelace" description="[email protected] " src="/ada.jpg" />