# shadcss > shadcn/ui's aesthetic as zero-runtime HTML + CSS. 52 components, no React/Radix/Tailwind, no JS framework, zero dependencies. Theme via CSS custom-property design tokens. Live demo: https://shadcss.vercel.app · npm: @russfranky/shadcss · CLI: npx @russfranky/shadcss-cli add ## How to use - Import the bundle (`@import "@russfranky/shadcss"` via a bundler, or `dist/shadcss.min.css` by path / CDN), or copy individual `src/components/.css` files (each depends only on `src/base/tokens.css`). - Write semantic HTML with the classes below. Prefer native elements; only add ARIA where the component's a11y contract says to. - `js` legend: none = zero JS · trigger = one native one-liner (showModal()/showPopover()) · consumer = you write real JS for full behavior. - `status` legend: stable · partial (works, limited) · visual-only (styling only; behavior needs JS). ## Components ### accordion — status:stable · js:none · support:details Collapsible content panels built on native
. Classes: accordion accordion-content A11y: Native
/ — keyboard + SR for free; exclusive mode via name= Markup:
Q
A
### alert — status:stable · js:none · support:baseline Inline message banner with icon, title, description. Classes: alert alert-title alert-description alert-dismissible alert-default alert-info alert-success alert-warning alert-destructive A11y: Add role=alert for live announcement Markup: ### alert-dialog — status:stable · js:trigger · support:dialog Confirmation modal for destructive actions. Classes: alert-dialog alert-dialog-header alert-dialog-title alert-dialog-description alert-dialog-body alert-dialog-footer A11y: Open via showModal(); role=alertdialog + aria-labelledby/-describedby; native focus trap Markup:
T
D
### aspect-ratio — status:stable · js:none · support:baseline Lock an element to a width/height ratio. Classes: aspect-ratio aspect-square aspect-video aspect-photo aspect-portrait aspect-cinema aspect-wide aspect-ultra A11y: Decorative wrapper; alt text on media Markup:
…
### avatar — status:stable · js:none · support:baseline Image with text fallback. Sizes, ring, square, group. Classes: avatar avatar-sm avatar-lg avatar-xl avatar-square avatar-ring avatar-group A11y: img alt; image-error fallback needs a one-line onerror Markup:
…
### badge — status:stable · js:none · support:baseline Inline status indicator. Classes: badge badge-primary badge-secondary badge-destructive badge-success badge-warning badge-info badge-outline badge-dot A11y: Decorative; colored fills use AA-contrast tokens Markup: T ### breadcrumb — status:stable · js:none · support:baseline Hierarchical navigation trail. Classes: breadcrumb breadcrumb-item breadcrumb-link breadcrumb-current breadcrumb-ellipsis A11y: nav landmark + aria-label; aria-current=page on the current item Markup: ### button — status:stable · js:none · support:baseline The primary action trigger. 6 variants, 4 sizes, loading + icon + group modes. Classes: btn btn-secondary btn-outline btn-ghost btn-destructive btn-link btn-sm btn-lg btn-icon btn-group btn-primary btn-danger btn-error A11y: Use ### calendar — status:visual-only · js:consumer · support:baseline Pure-CSS month calendar. Day cells with today/selected/disabled states. Classes: calendar calendar-header calendar-title calendar-nav calendar-nav-btn calendar-grid calendar-weekday calendar-day calendar-sm is-today outside A11y: Visual month grid; month nav + date logic need JS; add role=grid/row/gridcell for an interactive picker Markup:
Month Year
S……
### card — status:stable · js:none · support:baseline Container with header, content, footer zones. Classes: card card-header card-title card-description card-action card-content card-footer card-interactive A11y: Use a heading for card-title; card-action slot is top-right Markup:
T
D
…
### carousel — status:partial · js:consumer · support:baseline Scroll-snap carousel with optional dots. Classes: carousel carousel-viewport carousel-track carousel-item carousel-controls carousel-btn carousel-dots carousel-dot A11y: Scroll-snap works with no JS; arrows/dots need JS; viewport is keyboard-focusable Markup: ### checkbox — status:stable · js:none · support:baseline Native checkbox styled to match shadcn. Supports indeterminate. Classes: checkbox A11y: Native input; aria-invalid for error; indeterminate needs el.indeterminate via JS Markup: ### collapsible — status:stable · js:none · support:details Standalone collapsible (like accordion but unstyled). Classes: collapsible collapsible-trigger collapsible-content A11y: Native
; must be a
element Markup:
T
…
### command — status:visual-only · js:consumer · support:popover-api Command palette UI shell. Pair with Popover API for ⌘K. Classes: command command-input-wrap command-input command-list command-group command-group-heading command-item command-separator command-shortcut command-empty command-footer A11y: Styled shell; fuzzy search + arrow-key nav + listbox/option roles need JS Markup:
…
Suggestions
…
### container — status:stable · js:none · support:baseline Centered, max-width page/content wrapper with responsive padding. Classes: container container-sm container-md container-lg container-xl container-full A11y: Layout helper Markup:
…
### context-menu — status:partial · js:consumer · support:popover-api Right-click menu. Uses Popover API + inline oncontextmenu. Classes: context-menu A11y: Right-click positioning needs oncontextmenu + showPopover(); add menu roles Markup:
Right-click here
### dialog — status:stable · js:trigger · support:dialog Native modal. Backdrop blur, slide-in animation. Classes: dialog dialog-header dialog-title dialog-description dialog-body dialog-footer dialog-close A11y: Open via showModal(); native focus trap; add aria-labelledby Markup:
T
D
…
### drawer — status:stable · js:trigger · support:dialog Side panel sliding from any edge. Built on . Classes: drawer drawer-header drawer-title drawer-description drawer-body drawer-footer drawer-handle A11y: Open via showModal(); native ; data-side edge Markup: … ### dropdown — status:stable · js:trigger · support:popover-api Menu of actions. Uses Popover API via popovertarget attribute. Classes: dropdown-menu dropdown-item dropdown-label dropdown-separator dropdown-destructive dropdown-shortcut dropdown-checkbox-item dropdown-radio-item dropdown-sub-trigger dropdown-sub-content A11y: Opens via popovertarget (no JS). For full keyboard menu (arrow-key roving focus, type-ahead, Escape, role=menu/menuitem) add @russfranky/shadcss-js/menu and data-sc-menu Markup: ### empty — status:stable · js:none · support:baseline Placeholder for empty states. Classes: empty empty-icon empty-title empty-description empty-actions empty-error empty-success empty-warning A11y: Empty-state layout Markup:
…
T
D
### field — status:stable · js:none · support:baseline Higher-level form field wrapper with label, description, and validation error. Classes: field field-label field-control field-description field-error field-group A11y: Error shows via :user-invalid OR data-invalid/aria-invalid; wire aria-describedby Markup:

D

…E

### hover-card — status:stable · js:none · support:baseline Rich tooltip showing on hover. Contains header, body, footer. Classes: hover-card hover-card-panel hover-card-header hover-card-title hover-card-description hover-card-footer hover-card-stat hover-card-stat-value A11y: Reveals on :hover/:focus-within — no JS; touch open needs JS; add aria-describedby Markup:
…
…
…
### input — status:stable · js:none · support:baseline Single-line text input. Leading/trailing icon support. Classes: input input-sm input-lg input-wrap A11y: Native input; pair with a