The shadcn/ui visual language in plain HTML and CSS — for server-rendered, static, HTMX, Astro, and AI-generated apps. Built on :has(), the Popover API, native <dialog>, and design tokens. No React, no Tailwind, no runtime.
The primary action trigger. 6 variants × 4 sizes × loading + icon + group + disabled states. Pure CSS — even the loading spinner is a CSS animation.
Input & Field
Native text inputs with leading/trailing icons, validation, sizes, and the higher-level .field wrapper that auto-shows error messages via :user-invalid.
We'll never share your email.
Please enter a valid email address.
At least 8 characters with one number.
Password must be at least 8 characters.
Markdown supported. Max 280 characters.
.form-field is the simpler layout helper from label.css.
—
Enter the 8-digit code sent to your phone.
Selection Controls
Checkbox, radio, switch, radio-group, and toggle-group — all built on native form controls. Keyboard, screen-reader, and form submission all work for free.
Checkboxes
Switches
Radio group (card style)
Toggle group
Card
Composable container with header, content, and footer zones. Interactive hover-lift variant for clickable cards.
Create project
Deploy a new project from a template.
Choose from 12 starter templates — React, Vue, Svelte, or static HTML.
Live
Production
acme.com · 99.99% uptime
Deployed2 min ago
Regionus-east-1
Buildv1.2.3
Team members
5 of 10 seats used
A
B
C
D
E
+5
Badge
Inline status indicators. Six color variants plus outline and dot styles.
Inline message banners. Four variants. Dismissible using the native <details> element — no JS required.
Heads up!
You can add components to your app using the CLI.
Success
Your changes have been saved successfully.
Warning
Your subscription expires in 3 days. Renew to avoid interruption.
Error
Your session has expired. Please log in again to continue.
Accordion & Collapsible
Built on native <details> + <summary>. Animated height via the modern grid-template-rows: 0fr → 1fr technique.
Is it accessible?
Yes. By using native <details> we get keyboard navigation, screen-reader semantics, and the "summary" role for free.
How big is the bundle?
The complete framework gzips to ~16.8 KB. You can also import individual component files for tree-shaking.
Can I use only some components?
Absolutely. Each component is a standalone CSS file in src/components/.
Advanced filters
Tabs
Pure CSS tabs using radio inputs + :has(). Three variants: default, underline, vertical.
Account settings go here.
Password change form goes here.
Team management goes here.
Underline variant
A high-level overview of what we offer.
Everything you get when you sign up.
Simple, transparent pricing.
Frequently asked questions.
Dialog · Alert Dialog · Drawer · Sheet
Four modal-style overlays, all built on native <dialog>. Use <form method="dialog"> for no-JS close buttons.
Dropdown · Menubar · Context Menu
Three menu patterns, all powered by the Popover API. Click-trigger via popovertarget attribute — no JS state. The .context-menu variant is styled identically but is not demoed here: right-click positioning at the cursor requires a one-line oncontextmenu + showPopover() trigger (JS-required).
The shadcn aesthetic, reimagined for the era of :has(), Popover API, and native <dialog>. No JS framework.
Toast & Sonner
Auto-dismissing notifications. The live demo below uses the Sonner component, whose CSS animation runs for --sonner-duration then hides itself; the sibling .toast component works the same way with its own --toast-duration token. Variants for success, error, warning, info, loading.
New message
You have a new message from Alex.
Saved
Your changes have been saved.
Failed to save
Check your connection and try again.
Storage almost full
You've used 90% of your storage.
Subscription expires soon
Renew now to keep your premium features.
Table
Restyled native HTML table with hover rows, alignment variants, and badges inside cells.
Status
Email
Amount
Method
Actions
Success
ken99@example.com
$316.00
Credit card
Success
abe45@example.com
$242.00
Credit card
Processing
monserrat44@example.com
$837.00
PayPal
Failed
sylvia75@example.com
$875.00
Credit card
Progress · Slider · Spinner
Loading indicators at three scales of richness.
Progress
Uploading… 67%
Indeterminate
Slider
Volume 50%
Brightness (large)
Spinner
Skeleton & Empty States
Loading shimmer for placeholders, and friendly empty states with CTAs.
Loading…
No projects yet
Get started by creating your first project. It only takes a minute.
Avatar · Separator · Kbd
Image with text fallback, layout dividers, and keyboard shortcut indicators.
AB
CD
EF
GH
IJ
KL
A
B
C
+5
FirstSecondThird
Press ⌘K to searchPress ⌘⇧P for command palettePress ? for help
Calendar
Pure CSS month calendar with today, selected, and outside-month states.
June 2026
SMTWTFS
Carousel · Aspect Ratio
Scroll-snap carousel — scroll/swipe and Tab-then-arrow keyboard navigation work with zero JS; the prev/next arrow buttons use a one-line inline scrollBy() (or CSS ::scroll-button() where supported). Aspect-ratio presets below.
Card 1
Card 2
Card 3
Card 4
Card 5
Navigation Menu · Breadcrumb · Pagination
Three nav patterns: rich dropdown nav, breadcrumb trail, and paginated list nav.
Typography
Drop-in prose styles for blog posts, docs, marketing copy. Wraps in .prose.
The Platform is the Framework
Modern CSS can do it all. The platform caught up to React three years ago — we just stopped paying attention.
For the past decade, we built UIs by shipping JavaScript that describes UIs. Every interaction was a state update, every animation a useEffect, every modal a portal. The cost added up: parse time, hydration jank, framework lock-in.
What changed
Three things landed in browsers that quietly eliminated 90% of the JavaScript we wrote:
:has() — parent selectors. Finally.
The Popover API — built-in dropdowns, tooltips, menus.
grid-template-rows: 0fr → 1fr — animated height without max-height hacks.
“The best framework is no framework. The second-best is the platform itself.”