Introduction
Cupertino UI
A shadcn-compatible component registry, designed after Apple Human Interface Guidelines. Each component is a drop-in replacement for its shadcn counterpart — same name, same props, same data-slot attributes. Read on for installation, philosophy, and the component catalog.
Installation
Install any Cupertino component into an existing shadcn project. The component is written to components/ui/<name>.tsx, replacing the shadcn version (same API, different style).
$ npx shadcn@latest add https://cupertino-ui.vercel.app/r/button.jsonDon’t have shadcn set up yet? Follow the shadcn installation guide first.
Philosophy
Apple’s four design principles, applied to a shadcn registry.
Components
Accordion
iOS grouped-list style — 44pt touch targets, smooth chevron rotation, subtle separator. Drop-in replacement for shadcn Accordion.
$ npx shadcn add https://cupertino-ui.vercel.app/r/accordion.jsonAlert
rounded-2xl, muted fill. Destructive variant uses Apple system red. Supports leading icon, title, description, and action slot.
$ npx shadcn add https://cupertino-ui.vercel.app/r/alert.jsonAlert Dialog
iOS-native alert dialog — 270px max-width, rounded-3xl, centered header, full-width separator-divided footer buttons.
$ npx shadcn add https://cupertino-ui.vercel.app/r/alert-dialog.jsonAspect Ratio
Pure utility wrapper that maintains a fixed ratio. No visible styling — wraps any child in a ratio-locked container.
$ npx shadcn add https://cupertino-ui.vercel.app/r/aspect-ratio.jsonAvatar
Circular, 40pt default. Medium-weight initials fallback. Supports sm/lg sizes, badge overlay, and stacked group.
$ npx shadcn add https://cupertino-ui.vercel.app/r/avatar.jsonBadge
Full pill, semibold, tracking-tight. The destructive variant uses Apple system red — designed for notification counts.
$ npx shadcn add https://cupertino-ui.vercel.app/r/badge.jsonCalendar
Apple HIG date grid — rounded-2xl container, circular day cells, today highlighted with primary fill, muted weekday labels.
$ npx shadcn add https://cupertino-ui.vercel.app/r/calendar.jsonCard
rounded-2xl, soft shadow, subtle ring. All shadcn composition slots (Header, Title, Description, Content, Action, Footer) are preserved.
$ npx shadcn add https://cupertino-ui.vercel.app/r/card.jsonCarousel
Apple HIG horizontal scroll — rounded-2xl slides, pill dots indicator, smooth Embla snap scroll, secondary ghost nav buttons.
$ npx shadcn add https://cupertino-ui.vercel.app/r/carousel.jsonChart
Apple HIG charts — Recharts wrapper with rounded-2xl blur tooltip, hairline grid, rounded-full legend dots. Bar and area variants shown.
$ npx shadcn add https://cupertino-ui.vercel.app/r/chart.jsonCheckbox
22pt touch-friendly, 6px radius, bold checkmark. Scale-press feedback with 200ms transition. Primary fill when checked.
$ npx shadcn add https://cupertino-ui.vercel.app/r/checkbox.jsonCollapsible
Headless expand/collapse primitive. Wire any trigger and content — pair with Button and the accordion pattern for a HIG feel.
$ npx shadcn add https://cupertino-ui.vercel.app/r/collapsible.jsonCombobox
Apple HIG combobox — autocomplete input dengan list saran. Built on base-ui combobox + Input Group shell.
$ npx shadcn add https://cupertino-ui.vercel.app/r/combobox.jsonCommand
Apple HIG command palette — rounded-2xl modal, prominent search input, grouped sections with uppercase 11px labels, ⌘K shortcut hint.
Command Palette
Search for a command to run...
$ npx shadcn add https://cupertino-ui.vercel.app/r/command.jsonData Table
Built on TanStack Table + Cupertino Table primitives — column sorting, pagination, and row actions. Install @tanstack/react-table to enable full features.
| Invoice | Status | Method | Amount |
|---|---|---|---|
| INV-001 | Paid | Apple Pay | $250.00 |
| INV-002 | Pending | Card | $150.00 |
| INV-003 | Paid | Apple Pay | $320.00 |
| INV-004 | Failed | Card | $90.00 |
$ npx shadcn add https://cupertino-ui.vercel.app/r/table.jsonDate Picker
Composed from Calendar + Popover — no separate component. Apple HIG date picker with rounded-2xl popover, calendar grid, and formatted trigger button.
$ npx shadcn add https://cupertino-ui.vercel.app/r/calendar.json https://cupertino-ui.vercel.app/r/popover.jsonDialog
rounded-3xl surface, blur backdrop, 17pt semibold title. X close button top-right. Optional footer row.
$ npx shadcn add https://cupertino-ui.vercel.app/r/dialog.jsonDirection
RTL/LTR direction provider — wraps Radix DirectionProvider to set text direction for an entire subtree. Useful for Arabic, Hebrew, and other RTL languages.
LTR (default)
Hello, world! Left to right.
RTL
مرحبا بالعالم! من اليمين إلى اليسار.
$ npx shadcn add https://cupertino-ui.vercel.app/r/direction.jsonDrawer
Apple HIG bottom sheet — Vaul-based, rounded-t-3xl with iOS grabber, blur overlay, same surface as sheet.
$ npx shadcn add https://cupertino-ui.vercel.app/r/drawer.jsonEmpty
Apple HIG empty-state — large muted icon in rounded-full container, 15pt semibold title, 13pt muted description, action slot.
No messages
When you receive messages, they'll appear here.
$ npx shadcn add https://cupertino-ui.vercel.app/r/empty.jsonField
Apple HIG form field wrapper — composes label, control, description, and error in a single semantic group with consistent spacing.
We'll never share your email.
$ npx shadcn add https://cupertino-ui.vercel.app/r/field.jsonHover Card
rounded-2xl popover surface, 13pt text, shadow-xl. Appears on hover after a short delay — ideal for user profiles and rich previews.
$ npx shadcn add https://cupertino-ui.vercel.app/r/hover-card.jsonInput
44pt height, rounded-xl, filled background that turns crisp white on focus. Pairs naturally with Label.
$ npx shadcn add https://cupertino-ui.vercel.app/r/input.jsonInput Group
Apple HIG input group — composes input with leading/trailing addons (icons, text, buttons, kbd). Shared rounded-xl shell, single focus ring across the group.
$ npx shadcn add https://cupertino-ui.vercel.app/r/input-group.jsonInput OTP
Apple HIG segmented code input — rounded-xl cells, 44pt height, focus ring per active cell, pulsing caret.
$ npx shadcn add https://cupertino-ui.vercel.app/r/input-otp.jsonItem
Apple HIG list row — leading media slot (icon or image), title + description content, trailing actions, three sizes.
Get notified when something happens.
Quick access to items you've starred.
$ npx shadcn add https://cupertino-ui.vercel.app/r/item.jsonKbd
Keyboard shortcut indicator. Mono badge with subtle border and inset shadow — inline-flex by default so it sits naturally beside text.
$ npx shadcn add https://cupertino-ui.vercel.app/r/kbd.jsonLabel
15pt medium weight, tracking-tight. Built on Radix Label, so it forwards htmlFor and supports peer-disabled.
$ npx shadcn add https://cupertino-ui.vercel.app/r/label.jsonNative Select
Apple HIG native select — uses the platform's native dropdown for accessibility, styled to match Input. Best for mobile and form-heavy contexts.
$ npx shadcn add https://cupertino-ui.vercel.app/r/native-select.jsonPagination
Active page uses primary pill, ghosts for others. 44pt touch targets. Previous/Next show text on larger screens.
$ npx shadcn add https://cupertino-ui.vercel.app/r/pagination.jsonPopover
rounded-2xl surface, shadow-xl. Optional title/description slots. Smooth zoom-in on open.
$ npx shadcn add https://cupertino-ui.vercel.app/r/popover.jsonProgress
8pt rounded-full track with primary fill. Smooth 300ms ease-out animation as value changes.
$ npx shadcn add https://cupertino-ui.vercel.app/r/progress.jsonRadio Group
22pt circle, border-2, primary fill with white inner dot when selected. Scale-press feedback and 200ms transition.
$ npx shadcn add https://cupertino-ui.vercel.app/r/radio-group.jsonResizable
Split panes with Apple HIG handles — 1px divider that widens to 4px on hover, ring-ring/50 highlight on drag.
$ npx shadcn add https://cupertino-ui.vercel.app/r/resizable.jsonScroll Area
Thin 8pt scrollbar with rounded-full thumb. Hides until hover on desktop, matches native iOS scroll behavior.
$ npx shadcn add https://cupertino-ui.vercel.app/r/scroll-area.jsonSelect
44pt rounded-xl trigger with muted fill. rounded-2xl dropdown, 15pt items, primary checkmark on selected.
$ npx shadcn add https://cupertino-ui.vercel.app/r/select.jsonSeparator
Subtle horizontal or vertical rule at 70% border opacity. Use it to divide list items, sections, and inline metadata.
$ npx shadcn add https://cupertino-ui.vercel.app/r/separator.jsonSheet
Slide-over surface — right by default; use side='bottom' for iOS-style modal with a grabber indicator. Rounded-3xl on top/bottom variants.
$ npx shadcn add https://cupertino-ui.vercel.app/r/sheet.jsonSkeleton
rounded-xl muted pulse — composable loading placeholder that matches your content shape.
$ npx shadcn add https://cupertino-ui.vercel.app/r/skeleton.jsonSlider
6pt track, white shadow thumb with scale-on-hover. Primary fill for the active range. Supports range (dual thumb) and vertical.
$ npx shadcn add https://cupertino-ui.vercel.app/r/slider.jsonSonner
Apple HIG toast notifications — rounded-2xl blur surface, subtle shadow, icon-coded severity. Place <Toaster /> once in your layout.
$ npx shadcn add https://cupertino-ui.vercel.app/r/sonner.jsonSpinner
Apple HIG activity indicator — ring arc animation matching iOS. sm / default / lg sizes. Use text color to tint.
$ npx shadcn add https://cupertino-ui.vercel.app/r/spinner.jsonSwitch
iOS exact dimensions — 51×31pt — with a thumb shadow and 200ms transition. Use size='sm' for compact contexts (40×24pt).
$ npx shadcn add https://cupertino-ui.vercel.app/r/switch.jsonTable
Apple HIG data table — 13px cells, hairline borders, uppercase 11px column headers, hover row bg-muted/40.
| Product | Category | Price | Status |
|---|---|---|---|
| MacBook Pro | Mac | $1,999 | In Stock |
| iPhone 16 Pro | iPhone | $999 | In Stock |
| iPad Pro | iPad | $1,099 | Low Stock |
| Apple Watch Ultra | Watch | $799 | In Stock |
$ npx shadcn add https://cupertino-ui.vercel.app/r/table.jsonTabs
iOS Segmented Control by default — pill container with a white selected pill that gains a soft shadow. Use variant='line' for the underline style.
$ npx shadcn add https://cupertino-ui.vercel.app/r/tabs.jsonTextarea
rounded-xl, muted fill, 15pt with relaxed line-height. Focus clears background fill for readability.
$ npx shadcn add https://cupertino-ui.vercel.app/r/textarea.jsonToast
shadcn deprecated the Radix-based Toast in favor of Sonner. Use the Sonner component — same install, same API, better UX. See Sonner above.
$ npx shadcn add https://cupertino-ui.vercel.app/r/sonner.jsonToggle
44pt, rounded-xl. Primary fill when pressed-on; transparent when off. Default and outline variants, scale-press feedback.
$ npx shadcn add https://cupertino-ui.vercel.app/r/toggle.jsonToggle Group
Composed toggle buttons — spacing=0 creates an iOS segmented-control attachment with shared borders. Supports single and multiple selection.
$ npx shadcn add https://cupertino-ui.vercel.app/r/toggle-group.jsonTooltip
Dark rounded-lg pill with 12pt medium label and soft slide-in (200ms). Wrap any trigger and provide content.
$ npx shadcn add https://cupertino-ui.vercel.app/r/tooltip.jsonTypography
Apple HIG type scale — SF Pro-style sizing (40/28/22/17/15/13pt), tight tracking on display sizes, semibold for headings.
The quick brown fox
Jumps over the lazy dog
Section heading
Subsection
A lead paragraph introduces a section with lighter weight and tighter tracking.
Body copy renders at 15pt with relaxed line height for readable paragraphs. Inline code looks like npm install.
Muted secondary text for hints and descriptions.
“Design is not just what it looks like and feels like. Design is how it works.” — Steve Jobs
- First list item with proper marker
- Second list item with relaxed leading
- Third list item
$ npx shadcn add https://cupertino-ui.vercel.app/r/typography.json