muslin
Quiet and professional components for dense work tools. Two modes, five accents, 37 components.
-
Alert
Persistent status banner for outcomes the user must see. danger announces assertively (role=alert).
-
Avatar
Initials circle (or photo) with the name as its accessible label; AvatarGroup overlaps with a +N overflow.
-
Badge
Status pill in the four status token pairs. Single fixed size by design — its height derives from the text metrics.
-
Breadcrumbs
Location trail: nav > ol > links with “/” separators; the last item is marked as the current page.
-
Button
Primary action trigger with four variants and three sizes.
-
Card
Bordered surface container for grouped content.
-
Checkbox
Native checkbox with a muslin box visual; keyboard and screen-reader native.
-
Combobox
Searchable select: type to filter, pick to choose. Custom input and listbox; no native dropdown UI.
-
Confirm Dialog
Confirmation on top of the dialog machine: trigger, question, cancel + confirm. danger renders the destructive style.
-
Context Menu
Right-click menu on the wrapped area; opens at the pointer with full keyboard semantics from the menu machine.
-
Dialog
Accessible modal dialog with focus trap, Escape to close, and scroll lock.
-
Divider
Hairline separator — horizontal by default, vertical inside flex rows, or labeled between two lines.
-
Drawer
Side panel for detail views — row detail, filters, edit forms. Slides in from side, focus-trapped, Escape closes.
-
Dropdown Menu
Button-triggered menu with keyboard navigation and destructive items.
-
Dropzone
Upload area: click or drop files to pick them. Tints accent while a file drag hovers; dropped files are filtered by accept.
-
Empty State
Centered “nothing here yet” with a way forward: icon, title, description, action.
-
Field Group
Label, control, hint, and error message in one consistent rhythm. The official home of the invalid state.
-
File Input
File picker with a custom visible row (label + picked names). The OS picker dialog is the only native surface.
-
Input
Single-line text field with error state.
-
Label
Form label associated with its control via htmlFor.
-
Pagination
Page navigation with a first/last window and prev/next buttons.
-
Popover
Floating panel anchored to its trigger — filters, hints, quick forms. The trigger is composed as-child.
-
Progress Bar
Determinate fill (value/max) or an indeterminate pulse when value is omitted.
-
Radio
Radio group with native arrow-key navigation between items. Exports both RadioGroup and Radio; a Radio only works inside a RadioGroup.
-
Search Input
Search field with the magnifier prefix and a clear button built in — same value API as Input.
-
Select
Custom dropdown listbox with placeholder and error state. Fully custom trigger and inline-anchored listbox (no Portal/floating-ui, no native select in the visible UI). Listbox clips inside overflow-hidden ancestors.
-
Sidebar
Navigation rail with titled sections; the active item gets aria-current="page".
-
Skeleton
Loading placeholder that mirrors the shape it stands in for. text matches a line of copy; block fills a box.
-
Spinner
Inline loading ring with sizes; give it a label so screen readers know what is loading.
-
Switch
Native checkbox exposed with the switch role.
-
Table
Compound native table: Table.Header, Table.Body, Table.Row, Table.Head, Table.Cell.
-
Tabs
Tab list with roving keyboard navigation and automatic activation.
-
Tag
Compact removable chip for filters and lists; the X appears only when onRemove is provided.
-
Textarea
Multi-line text field with error state.
-
Toast
Declarative toast notification with auto-dismiss and a close button.
-
Toast Region
Stacks toasts bottom-right in one column; each entry keeps the declarative Toast API. Empty list renders nothing.
-
Tooltip
Hover and keyboard-focus tooltip; stays hidden when disabled.