Design System

Components

The kit-level building blocks every block composes from — each carrying its usage law (use-when · never · dos · don’ts) from kit-meta.yaml, grouped into the shadcnuikit categories, with every standard shadcn name accounted for: vendored, adapted, backlog, or refused with its reason.

The Refit — Data Display, every variant (124)

Cardkit/card.tsx · ssr-pure · 8 variants · shadcnuikit Base / Card (8)

Use when — A widget or a settings group earns a frame (CN-15's card half).

Never — Around a lone paragraph, around another card, or per row of dense data (CN-16 — a card earns its border).

  • title + data on the face; the WHY one hover away (the card contract)
  • card-in-card nesting
  • dressing a table as a stack of cards
basic

Basic

A description line.

Body content.

with-footer

With footer

Body.

header-action

Header action

Body.

stat

133

clients served

notification
SD

Sharpdream replied

to your proposal.

media-top

Media top

horizontal

Horizontal

media beside copy

ghost

Ghost — no fill, dashed frame.

Badgekit/badge.tsx · ssr-pure · 12 variants · shadcnuikit Base / Badge (12)

Use when — A state or a count that can change (CN-17).

Never — Decoration — a badge that can never change is a label in costume.

  • keep it one word or a number
  • sentences on a badge
  • reusing status tones for series colors
default
default
secondary
secondary
destructive
destructive
outline
outline
with-dot
live
with-count
Inbox 12
pill-icon
★ starred
success
Anchored
warning
Owed
info
Examined
removable
filter
gradient
Pro
StatusChipkit/status-chip.tsx · ssr-pure · 6 variants · Myco original (the lifecycle-tone pill — no shadcn equivalent)

Use when — Any lifecycle state anywhere — one chip carries every state on the face (DL-FMT-05).

Never — For decoration or series identity — tones are reserved for state meaning.

  • derive the tone from the state word (statusTone), declared once
  • let a long grade label auto-disclose
  • recomputing tones per surface
  • a sentence on a pill
success
Anchored
info
Examined
in-progress
Settling
warning
Owed
danger
Refused
muted
Draft
Avatarkit/avatar.tsx · ssr-pure · 21 variants · shadcnuikit Base / Avatar (21)

Use when — A person or character appears in a list, a row, or chrome.

Never — As a decorative filler for entities that have no identity to show.

  • always provide the initials fallback (no broken-image state)
  • human-photo placeholders for characters — a robot is unmistakably a robot
initials
VG
image
VG
icon-fallback
sizes
SMMDLG
xs
XS
xl
XL
with-ring
RG
ring-colored
EM
gradient-ring
GR
bordered
BD
with-status-dot
ON
status-away
AW
status-busy
BZ
status-offline
OF
group-stack
AABBCC
group-overflow
AABB+5
with-badge
PR3
with-name
ALAda Lovelace
member
initials-tinted
FT
square
SQ
square-lg
SL
Itemkit/item.tsx · ssr-pure · 10 variants · shadcnuikit Base / Item (10)

Use when — A member row, a settlement line, a setting — the between-justified row the app leans on.

Never — For dense tabular data (that is Table/CN-15) or a single key-value pair (plain rows).

  • one trailing slot; keep the title truncatable
  • the description carries the WHY, quietly
  • two competing trailing controls
  • a row that is secretly a table
default
Ada Lovelacemember since charter
$1,240
outline
Settlement #204verified arrival
Settled
muted
Draft proposalawaiting your confirm
with-media
SD
Sharpdreamfiduciary · truth-in-character
with-trailing
Notificationsrow-level updates
with-icon
Charter.pdf2.4 MB · uploaded today
with-badge
Inboxunread messages
12
with-checkbox
Verify the arrivaldue before settlement
selected
Selected rowhighlighted state
Separatorkit/separator.tsx · ssr-pure · 16 variants · shadcnuikit Base / Separator (16)

Use when — Between groups where space alone cannot carry the break.

Never — When proximity already groups (CN-11 — space does the explaining first).

  • prefer the two-tier gap rhythm; add a rule only on top of it
  • a rule between every row — that is a table's job
horizontal

Above

Below

vertical
Docs
Kit
API
with-label
OR
label-left
Recent
label-right
More
dashed
dotted
thick
gradient
primary
muted
inset
with-icon
vertical-tall
A
B
toolbar
spaced-lg

Above

Below

Skeletonkit/skeleton.tsx · css-animated · 7 variants · shadcnuikit Base / Skeleton (7)

Use when — The loading state of a known shape (the five mandatory states).

Never — As a stand-in for data that simply does not exist — that is the designed zero (DL-STA-03), not a shimmer.

  • match the real content's silhouette
  • skeletons that never resolve
  • shimmering an honest empty
line
block
circle
card
table-rows
avatar-text
list
Spinnerkit/spinner.tsx · css-animated · 14 variants · shadcnuikit Data Display / Spinner (14)

Use when — A known action is genuinely in flight and its duration is unknown (indeterminate).

Never — As progress toward a real bar (use Progress — a spinner promises nothing), or spinning forever with nothing behind it.

  • carry an accessible busy label
  • resolve to the real state — a spinner is a state, not a decoration
  • a spinner that never resolves
  • a spinner dressed as determinate progress
ring
pulse
dots
bars
sizes
ring-lg
dots-lg
bars-lg
primary
success
warning
muted
with-label
Loading…
in-button
Tablekit/table.tsx · ssr-pure · 12 variants · shadcnuikit Data Display / Table (12)

Use when — Dense data as rows — edge-to-edge, divider-separated (CN-15).

Never — For two key-value pairs (plain rows) or for layout.

  • right-align and tabular-nums the numbers (DL-FMT-02)
  • one status chip per row at most
  • a card per row
  • center-aligning money
basic
NameGrade
Claim AAnchored
Claim BExamined
striped
NameGrade
Claim AAnchored
Claim BAnchored
Claim CAnchored
with-status
ClaimState
DeliveryAnchored
DraftExamined
numeric-right
MemberSettled
alice$1,240
bob$980
with-footer
MemberSettled
alice$1,240
bob$980
Total$2,220
with-selection
Name
Ada
Bo
hoverable
ClaimGrade
Claim AAnchored
Claim BAnchored
Claim CAnchored
compact
KV
aA
bB
cC
dD
with-avatar
MemberSettled
ALAda$1,240
BOBo$1,240
with-actions
NameActions
Item A
Item B
bordered
AB
12
34
with-caption
Settlements this week
MemberAmount
alice$1,240
Progresskit/progress.tsx · ssr-pure · 10 variants · shadcnuikit Data Display / Progress (10)

Use when — Real progress toward a real bar (a goal's settled receipts vs its target).

Never — Indeterminate spinners dressed as progress, or progress toward an invented goal (DL-VIZ-02).

  • label with the numbers (n of N) beside the bar
  • a bar with no denominator
default
labeled
Arrivals62 / 100
sizes
success
warning
danger
over-track
gradient
striped
value-inside
68%
Emptykit/empty.tsx · ssr-pure · 8 variants · shadcnuikit Base / Empty (8)

Use when — A real, dignified zero (DL-STA-03 — the empty is one of the five mandatory states).

Never — As a stand-in for a loading shape (that is Skeleton), or to hide an error behind a friendly blank.

  • say what is absent and the one thing that would fill it
  • keep the single action optional and records-nothing
  • a blank the person wonders about
  • an empty that reads as a failure
basic

No settlements yet

When a member settles a receipt, it lands here.

with-media

Your inbox is clear

Nothing needs you right now.

with-action

No blueprints chartered

Pick a proven blueprint to begin.

compact

Nothing here

with-illustration

No records yet

The designed zero — not a spinner that never resolves.

search-zero

No matches

Nothing matched “xyzzy”. Try a broader term.

error

Something broke

We couldn’t load this. The failure is named, not hidden.

two-actions

Start your first blueprint

Charter one from the gallery, or import an existing unit.

The Refit — Forms, every variant (153)

Buttonkit/button.tsx · ssr-pure · 27 variants · shadcnuikit Base / Button (27)

Use when — A person commits an action — one primary per screen, its decline twin beside it.

Never — As navigation dressed as an act (use a link), or full-bleed (a control is fit-content, never inflated — layout:no-inflation).

  • label with the outcome, short (the action slot's ceiling)
  • pair every primary with its records-nothing decline
  • a bare generic verb (Submit / OK) — outcome-labels refuses it
  • more than one primary act on a screen
default
secondary
destructive
outline
ghost
link
sizes
icon
with-icon
icon-right
two-icons
loading
disabled
block
pill
square
with-count
success
warning
info
active
soft
gradient
glow
3d
neon
shine
ButtonGroupkit/button-group.tsx · ssr-pure · 20 variants · shadcnuikit Base / Button Group (20)

Use when — 2–4 related actions that read as one control (a view switch, an alignment set).

Never — For unrelated actions (they get their own buttons with space), or as navigation dressed as a control.

  • keep the members parallel — same weight, same size
  • one pressed state at a time when it is a choice
  • mixing a primary and a decline inside one group
  • a group of one (that is just a button)
horizontal
vertical
mixed-variants
with-icons
two
many
size-sm
size-lg
icon-only
split
pill
outline-all
secondary-all
ghost-all
with-active
with-dropdown
with-count
destructive-end
labelled
Sort
full-width
Inputkit/input.tsx · ssr-pure · 25 variants · shadcnuikit Base / Input (25)

Use when — One-line typed values inside a propose-first form.

Never — For values the record already knows (CN-06 — recognition over recall).

  • always a visible Label — placeholder is an example, not a name
  • placeholder-as-label
  • collecting what the law refuses to hold (payment instruments)
default
with-label
placeholder
disabled
with-icon
icon-right
%
with-addon
$
with-button
clearable
invalid
with-error

that address is not reachable

with-description

how the fleet finds you

required
readonly
password
email
number
search
date
time
color
file
pill
ghost
sizes
Textareakit/textarea.tsx · ssr-pure · 11 variants · shadcnuikit Form / Textarea (11)

Use when — Prose the person authors (a piece, a why, a note).

Never — For structured values a picker or select can constrain (CN-05 — prevention beats messages).

  • state consequences before commitment, at the Confirm crossing
  • unbounded fields feeding slots with declared ceilings
default
with-label
placeholder
rows
disabled
readonly
required
invalid
with-error

keep it under 280 characters

with-counter

13 / 280

resize-none
Selectkit/select.tsx · ssr-pure · 9 variants · shadcnuikit Base / Native Select (9)

Use when — One choice among a closed set too long for radios (5+).

Never — With a single option — render the plain label instead (DL-CMP-03).

  • inherent order when the set has one (DL-RNK-02)
  • a select of two (radios read faster)
default
with-label
placeholder
grouped
with-description

who can read this

required
invalid
disabled
sizes
Checkboxkit/checkbox.tsx · ssr-pure · 13 variants · shadcnuikit Base / Checkbox (13)

Use when — Independent opt-ins; each box a separate fact.

Never — For mutually exclusive choices (radio-group).

  • consent words verbatim beside a consent box
  • pre-checked consent — consent is the person's own act (L49)
default
checked
with-label
description
disabled
disabled-checked
required
invalid
with-error

You must confirm before settling.

group-vertical
group-horizontal
card
consent
RadioGroupkit/radio-group.tsx · ssr-pure · 15 variants · shadcnuikit Form / Radio Group (15)

Use when — 2-4 mutually exclusive choices, all visible.

Never — Long sets (select) or a single option (plain label, DL-CMP-03).

  • describe each option's consequence inline
  • a default that pre-decides a consequential choice
default
with-descriptions
horizontal
disabled
two-options
many
required
Pick one *
invalid
with-error

Choose an option to continue.

disabled-one
cards
cards-horizontal
with-badge
sizes
inline
Ship to:
Switchkit/switch.tsx · ssr-pure · 10 variants · shadcnuikit Data Display / Switch (10)

Use when — A live toggle whose effect is instant and reversible.

Never — For choices that take effect at a Confirm (checkbox in a form).

  • state what ON means beside it
  • a switch that silently records — every write is a visible act
default
on
with-label
disabled
disabled-on
label-left
with-description
required
colored
card
Sliderkit/slider.tsx · ssr-pure · 3 variants · shadcnuikit Slider (native range — Radix Slider refused, needs a client)

Use when — A bounded continuous value where feel matters more than precision.

Never — For exact amounts (money is typed, never slid).

  • show the current value as a number beside it
  • sliders for consequential quantities
default
filled
disabled
Togglekit/toggle.tsx · ssr-pure · 7 variants · shadcnuikit Base / Toggle (7)

Use when — A view option (dense/roomy) — presentation, not data.

Never — For anything that writes to the record.

  • aria-pressed always
  • toggles as primary acts
default
pressed
sizes
with-icon
icon-text
disabled
outline
ToggleGroupkit/toggle-group.tsx · ssr-pure · 3 variants · shadcnuikit Base / Toggle Group (part of Toggle 7)

Use when — Sibling view modes when at least two exist.

Never — A single mode — no single-option switcher (DL-CMP-03).

  • mark the active one visibly, not by color alone
  • mixing acts into a view-mode strip
single
multiple
sizes
Fieldkit/field.tsx · ssr-pure · 10 variants · shadcnuikit Form / Field (10)

Use when — Every real form input sits in a Field — it carries the label/description/error scaffold honestly.

Never — As a layout grid (that is the blueprint's job) or to hide an error away from its control.

  • the error renders in place, toned destructive, naming what to fix (CN-09)
  • the description carries the WHY quietly
  • an error that appears only in a popup
  • a label that does not point at its control
default
with-description

how the fleet will find you

with-error

that address is not reachable

horizontal
required
optional
with-select

how this reads

with-textarea

a sentence or two

with-checkbox
disabled

not editable here

The Refit — Navigation, every variant (33)

Tabskit/tabs.tsx · ssr-pure · 15 variants · shadcnuikit Navigation / Tabs (15)

Use when — 2-5 peer views of ONE subject, each complete.

Never — As navigation between subjects (that is the sidebar's job) or with one tab (DL-CMP-03).

  • name tabs by content, not by verb
  • burying the primary act in the second tab
default
pill
underline
ActiveSecond
with-count
three
with-icons
full-width
with-disabled
with-content

The active panel renders below.

vertical
General settings.
secondary
boxed
many
with-badge-dot
compact
Paginationkit/pagination.tsx · ssr-pure · 12 variants · shadcnuikit Navigation / Pagination (12)

Use when — A long read-projection split into real pages with real URLs.

Never — Infinite scroll in disguise, or hiding the total (honest truncation shows n of N).

  • aria-current on the active page
  • paginating eight rows
with-ellipsis
prev-next-only
active-first
active-last
both-ellipsis
icon-only
disabled
with-summary
Showing 11–20 of 92
Breadcrumbkit/breadcrumb.tsx · ssr-pure · 6 variants · shadcnuikit Base / Breadcrumb (6)

Use when — Console surfaces under the shell — Home / the leaf.

Never — On a public door (a stranger has no hierarchy yet).

  • keep leaves short — the crumb is chrome, not a title
  • duplicating the page title as the last crumb AND an h1 twice the size
default
with-ellipsis
with-current
with-icon
slash-separator
long-trail

The Refit — Overlays & Disclosure, every variant (94)

Alertkit/alert.tsx · ssr-pure · 15 variants · shadcnuikit Base / Alert (15)

Use when — A message that belongs IN the flow, beside what it concerns (DL-FMT-04).

Never — For transient popups (the toast pattern is refused here) or to bury a refusal away from its cause.

  • name what happened, why, and the one next step in plain words (CN-09)
  • error codes on the surface
  • stacking alerts — one message, placed well
default
destructive
warning
success
with-action
info
with-icon
title-only
description-only
dismissable
with-link
with-list
left-accent
filled
banner
Dialogkit/dialog.tsx · css-animated · 16 variants · shadcnuikit Base / Alert Dialog (16)

Use when — A focused read or confirm that must interrupt — rare by design.

Never — For content that could live on the page (a modal is a claim on attention).

  • closable by backdrop and ✕ — leaving records nothing
  • modal-in-modal
  • forms with multiple acts inside a dialog
default
with-footer
destructive-confirm
title-only
no-description
single-action
with-form
with-icon
success
scrollable
small
large
two-column
form-tall
warning
media-header
Sheetkit/sheet.tsx · css-animated · 8 variants · shadcnuikit Base / Sheet (8)

Use when — Progressive disclosure at page scale — the honesty story, an inspector, secondary detail.

Never — For the primary task (a sheet is an aside, not a page).

  • one quiet affordance opens it; closing loses nothing
  • stacking sheets
  • acts inside a sheet that belong on the page
right
left
top
bottom
with-footer
with-form
scrollable
wide
Popoverkit/popover.tsx · css-animated · 6 variants · shadcnuikit Base / Popover (6)

Use when — A small structured disclosure richer than a tooltip (a mini-form, a legend).

Never — For hover-only hints (tooltip) or page-scale content (sheet).

  • keep it dismissible by clicking away
  • popovers as menus (dropdown-menu exists)
default
Open popover

A floating panel

Arbitrary content, zero JS.

with-form
Set goal
align-start
Aligned start

Panel aligned to the start edge.

align-end
Aligned end

Panel aligned to the end edge.

with-actions
Confirm?

Delete this draft?

This records nothing until you confirm.

with-menu
Quick actions
DropdownMenukit/dropdown-menu.tsx · css-animated · 12 variants · shadcnuikit Base / Dropdown Menu (12)

Use when — 2-6 secondary actions on one anchor (the ... affordance).

Never — Hiding THE primary act in a menu.

  • destructive items last, visually distinct
  • menus of one item
  • nesting submenus
default
Menu ▾
with-label
Actions ▾
with-destructive
More ▾
align-end
End ▾
with-icons
File ▾
with-shortcut
Edit ▾
checkbox-items
View ▾
radio-items
Sort ▾
with-avatar
VG
grouped
All ▾
with-description
Plan ▾
scrollable
Desk ▾
HoverCardkit/hover-card.tsx · css-animated · 3 variants · shadcnuikit Base / Hover Card (3)

Use when — Previewing an entity behind a link (a person, a piece) without leaving.

Never — On touch-primary surfaces as the only path to the content.

  • always give the link a real destination too
  • hover-only access to anything that matters
default

Myco

A richer tooltip, revealed on hover.

align-start

Sharpdream

Aligned to the start edge.

align-end

The Fleet

Aligned to the end edge.

Tooltipkit/tooltip.tsx · css-animated · 8 variants · shadcnuikit Base / Tooltip (8)

Use when — The honesty rider, the grade explanation, the reassurance — one hover away (the typography disclosure law).

Never — For content a person MUST see to act safely — that goes on the face.

  • keep the face word short; the tooltip carries the sentence
  • tooltips on tooltips
  • burying a refusal in a tooltip
top
The WHY, one hover away.
bottom
Revealed below the trigger.
left
To the left.
right
To the right.
on-icon
Settings
on-text
Hover the terma defined term to learn more.
long
A longer hint that wraps onto two lines to show the max-width clamp holds.
with-shortcut
Save · ⌘S
Accordionkit/accordion.tsx · css-animated · 12 variants · shadcnuikit Base / Accordion (12)

Use when — Long reference content where one section at a time is the honest reading.

Never — Hiding content a decision needs at glance (the glance budget is not an accordion).

  • summaries that say what opens
  • burying refusals or consequences below the fold of a closed section
single
Is it honest?
Yes — the resting state is the golden.
Is it zero-JS?
Yes — a native disclosure.
multiple-open
First
Open by default.
Second
Also open — several can stand open at once.
with-rich-content
Details

Rich content inside a panel:

all-closed
First
Closed until opened.
Second
Also closed.
faq
How do refunds work?
Settlement reverses on the same rail.
Can I export?
Yes — every surface is yours.
Is it private?
Public-only reaches the feed.
with-icon
Step one
Icon in the trigger.
Step two
Second step.
with-badge
Notifications 3
Trigger carries a count.
bordered
Card one
Each item framed.
Card two
Boxed disclosure.
compact
Tight
Denser padding.
Rows
Compact list.
ghost
No rules
Borderless disclosure.
long-content
Read more

A longer passage that wraps across several lines to show how the panel grows with its content. A longer passage that wraps across several lines to show how the panel grows with its content.

nested
Parent

Contains its own disclosure:

Child
Nested panel.
Collapsiblekit/collapsible.tsx · css-animated · 8 variants · shadcnuikit Base / Collapsible (8)

Use when — One optional drill (raw JSON, the full floor one rung down — DL-CNT-07).

Never — As the default state for primary content.

  • closed by default only when the summary truly summarizes
  • nesting collapsibles three deep (the depth budget)
closed
Show details

Revealed content, zero JS.

open
Hide details

A single disclosure, open by default.

with-icon
More options

An iconed trigger.

with-count
Filters 2
in-card
Advanced

Nested in a card.

rich-content
Show metric

48 of 100 arrived.

ghost
Read notes

A quiet, link-styled trigger.

list-item
Section 3 4 items
  • One
  • Two
  • Three
  • Four
ScrollAreakit/scroll-area.tsx · ssr-pure · 6 variants · shadcnuikit Base / Scroll Area (6)

Use when — A bounded region that must scroll inside the page (a long list in a panel).

Never — To make dishonestly-tall content fit — cut or paginate first (the inclusion law).

  • give it an accessible label when it is the main content
  • nested scroll traps
vertical

Scrollable row 1

Scrollable row 2

Scrollable row 3

Scrollable row 4

Scrollable row 5

Scrollable row 6

Scrollable row 7

Scrollable row 8

horizontal
tag 1tag 2tag 3tag 4tag 5tag 6tag 7tag 8tag 9tag 10tag 11tag 12
both-axes

A very long scrollable row number 1 that also overflows horizontally.

A very long scrollable row number 2 that also overflows horizontally.

A very long scrollable row number 3 that also overflows horizontally.

A very long scrollable row number 4 that also overflows horizontally.

A very long scrollable row number 5 that also overflows horizontally.

A very long scrollable row number 6 that also overflows horizontally.

A very long scrollable row number 7 that also overflows horizontally.

A very long scrollable row number 8 that also overflows horizontally.

with-list
Member 1
Member 2
Member 3
Member 4
Member 5
Member 6
Member 7
Member 8
Member 9
Member 10
tall

Line 1

Line 2

Line 3

Line 4

Line 5

Line 6

Line 7

Line 8

Line 9

Line 10

Line 11

Line 12

Line 13

Line 14

Line 15

Line 16

Line 17

Line 18

Line 19

Line 20

chat
HiIs it honest?The resting state is the golden.Good.Anything else?No, thanks.

The Refit — Interactive & Motion, every variant (42)

Calendarkit/calendar.tsx · ssr-pure · 15 variants · shadcnuikit Base / Calendar (15)

Use when — Showing the data's month — settlements by day, a cycle's cadence, a deadline in context.

Never — Rendering 'today' from ambient time (no clock in render — pass the day in as data).

  • mark days from spine data
  • Monday-first, tabular numerals
  • a calendar as decoration when a plain date reads faster (DL-FMT-03)

Interactive — hydrated on this page: navigate months (‹ ›) and pick a day. The static grid below is the no-JS fallback.

April 2027
MoTuWeThFrSaSu
month
March 2027
MoTuWeThFrSaSu
with-marked
March 2027
MoTuWeThFrSaSu
with-selected
March 2027
MoTuWeThFrSaSu
today
March 2027
MoTuWeThFrSaSu
range
March 2027
MoTuWeThFrSaSu
weekends
March 2027
MoTuWeThFrSaSu
sparse
March 2027
MoTuWeThFrSaSu
full
March 2027
MoTuWeThFrSaSu
january
2027
MoTuWeThFrSaSu
february-leap
January 2028
MoTuWeThFrSaSu
december
November 2027
MoTuWeThFrSaSu
next-quarter
June 2027
MoTuWeThFrSaSu
compact
March 2027
MoTuWeThFrSaSu
two-up
March 2027
MoTuWeThFrSaSu
April 2027
MoTuWeThFrSaSu
with-footer
March 2027
MoTuWeThFrSaSu
Comboboxkit/combobox.tsx · ssr-pure · 12 variants · shadcnuikit Base / Combobox (12)

Use when — One choice from a long finite set the person knows by name.

Never — As a search over an unbounded space (that is a read-projection's job) or when the set fits a select.

  • render the whole option set (a projection, not a fetch-as-you-type)
  • free-text smuggled through a picker — validate at the engine
default
prefilled
with-label
with-description

pick one or type your own

countries
many
disabled
invalid
required
with-icon
size-sm
value-preset
Sidebarkit/sidebar.tsx · css-animated · 3 variants · shadcnuikit Dashboard / Sidebar (1)

Use when — The app shell's primary navigation, and any inner left menu of named things (the design-system docs menus) — a menu is a menu; only the container differs.

Never — A second primary-navigation system beside the shell's — one shell, one nav (the navigation-menu row's law).

  • derive menu items from a single home (SURFACES, kit-meta, templates.yaml) so the menu cannot drift
  • carry active state as aria-current, never color alone
  • a scrolling page taking the sidebar with it — the sidebar is sticky, its own overflow scrolls
  • kit-level collapse state — collapse belongs to the chrome island

The Refit — Illustrations, every scene (8)

Illustrationkit/illustration.tsx · ssr-pure · 8 variants · shadcnuikit Illustrations (original art, our own bytes)

Use when — An empty, first-time, or refused state earns a picture — 'nothing here' and 'this is refused' are real, dignified states (DL-STA-03 / DL-FMT-04).

Never — As decoration on a full state, or to soften a refusal into something it is not — the drawing carries the state, never disguises it.

  • strokes currentColor so it themes with the surface (light + dark)
  • pair with a plain title + the one action that would fill the state (the Empty component)
  • a remote/CDN image (a fetch the page cannot make honestly)
  • alarm-red art for a calm refusal — a boundary is not an emergency
empty-box
no-results
inbox-zero
refused
disconnected
first-sprout
all-clear
broken

Against the shadcn component set — every name accounted for

42 of 53 standard shadcn components vendored · 4 adapted (the need met by Myco machinery) · 4 backlog · 3 refused — every status a documented row in kit-meta.yaml (hover the marks for the reasons).

button → Button
card → Card
badge → Badge
alert → Alert
avatar → Avatar
breadcrumb → Breadcrumb
separator → Separator
skeleton → Skeleton
table → Table
input → Input
textarea → Textarea
label → Label
select → Select
checkbox → Checkbox
radio-group → RadioGroup
switch → Switch
slider → Slider
toggle → Toggle
toggle-group → ToggleGroup
form adapted
combobox → Combobox
input-otp backlog
calendar → Calendar
date-picker backlog
tooltip → Tooltip
dialog → Dialog
alert-dialog → Dialog
sheet → Sheet
drawer → Sheet
popover → Popover
hover-card → HoverCard
accordion → Accordion
collapsible → Collapsible
dropdown-menu → DropdownMenu
sidebar → Sidebar
navigation-menu adapted
menubar backlog
context-menu backlog
pagination → Pagination
tabs → Tabs
scroll-area → ScrollArea
carousel → Carousel
resizable refused
progress → Progress
toast refused
sonner refused
data-table adapted
spinner → Spinner
empty → Empty
item → Item
button-group → ButtonGroup
field → Field
command adapted