Components
Card
Displays a card with header, content, and footer.
<x-ui.card variant="sectioned" class="w-full max-w-sm">
<x-ui.card-header>
<x-ui.card-title>Create project</x-ui.card-title>
<x-ui.card-description>Deploy your new project in one-click.</x-ui.card-description>
</x-ui.card-header>
<x-ui.card-content>
<form>
<div class="flex flex-col gap-6">
<div class="grid gap-2">
<x-ui.label for="name">Name</x-ui.label>
<x-ui.input id="name" placeholder="Name of your project" />
</div>
<div class="grid gap-2">
<x-ui.label for="framework">Framework</x-ui.label>
<x-ui.input id="framework" placeholder="Next.js" />
</div>
</div>
</form>
</x-ui.card-content>
<x-ui.card-footer class="flex-col gap-2">
<x-ui.button class="w-full">Deploy</x-ui.button>
<x-ui.button variant="outline" class="w-full">Cancel</x-ui.button>
</x-ui.card-footer>
</x-ui.card>
Blog
<x-ui.card variant="sectioned" class="w-full max-w-sm overflow-hidden pt-0">
<img src="https://images.unsplash.com/photo-1618005182384-a83a8bd57fbe?w=800&q=80&auto=format&fit=crop"
alt=""
class="aspect-video w-full object-cover" />
<x-ui.card-header>
<div class="text-muted-foreground flex items-center gap-2 text-xs">
<x-ui.badge variant="secondary">Design</x-ui.badge>
<span aria-hidden="true">·</span>
<span>Jun 2, 2026</span>
</div>
<x-ui.card-title>Design systems with Tailwind CSS</x-ui.card-title>
<x-ui.card-description>How we scaled a shared component library across a dozen product teams.</x-ui.card-description>
</x-ui.card-header>
<x-ui.card-footer class="gap-2.5">
<x-ui.avatar class="size-7"><x-ui.avatar-fallback>SC</x-ui.avatar-fallback></x-ui.avatar>
<span class="text-sm font-medium">Sofia Carter</span>
</x-ui.card-footer>
</x-ui.card>
Cta
Have a project in mind?
Let's build something great together — tell us about your idea and we'll take it from there.
{{-- Centered call-to-action card. --}}
<x-ui.card class="w-full max-w-sm text-center">
<div class="flex flex-col items-center gap-2">
<div class="bg-primary/10 text-primary flex size-12 items-center justify-center rounded-full">
<x-lucide-rocket class="size-6" aria-hidden="true" />
</div>
<h3 class="mt-1 text-lg font-semibold tracking-tight">Have a project in mind?</h3>
<p class="text-muted-foreground text-sm">Let's build something great together — tell us about your idea and we'll take it from there.</p>
<x-ui.button class="mt-3">Get in touch</x-ui.button>
</div>
</x-ui.card>
Hover Glow
Hover for the glow-up
Move your cursor over this card to see it lift with a soft accent glow.
{{-- A card that lifts and glows on hover. --}}
<x-ui.card class="group relative w-full max-w-sm cursor-pointer overflow-hidden transition-all duration-300 hover:-translate-y-1 hover:shadow-lg">
<div class="bg-primary/30 pointer-events-none absolute -top-16 left-1/2 size-40 -translate-x-1/2 rounded-full opacity-0 blur-3xl transition-opacity duration-500 group-hover:opacity-100"></div>
<div class="relative">
<div class="bg-primary/10 text-primary mb-3 flex size-10 items-center justify-center rounded-lg">
<x-lucide-sparkles class="size-5" aria-hidden="true" />
</div>
<h3 class="font-semibold tracking-tight">Hover for the glow-up</h3>
<p class="text-muted-foreground mt-1 text-sm">Move your cursor over this card to see it lift with a soft accent glow.</p>
</div>
</x-ui.card>
Image Overlay
Exploring the mountains
A short trip above the clouds, where the air is thin and the views endless.
{{-- Full-bleed image with the title and text overlaid on a gradient scrim. --}}
<x-ui.card class="relative w-full max-w-sm overflow-hidden p-0">
<img src="https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=800&q=80&auto=format&fit=crop"
alt="Snowy mountain peaks rising above the clouds at sunset"
class="aspect-[4/3] w-full object-cover" />
<div class="absolute inset-0 bg-linear-to-t from-black/80 via-black/25 to-transparent"></div>
<div class="absolute inset-x-0 bottom-0 space-y-1.5 p-5 text-white">
<x-ui.badge class="border-white/30 bg-white/15 text-white backdrop-blur-sm">Travel</x-ui.badge>
<h3 class="text-lg font-semibold tracking-tight">Exploring the mountains</h3>
<p class="text-sm text-white/80">A short trip above the clouds, where the air is thin and the views endless.</p>
</div>
</x-ui.card>
Login
<x-ui.card variant="sectioned" class="w-full max-w-sm">
<x-ui.card-header>
<x-ui.card-title>Login to your account</x-ui.card-title>
<x-ui.card-description>Enter your email below to login to your account.</x-ui.card-description>
<x-ui.card-action>
<x-ui.button variant="link">Sign Up</x-ui.button>
</x-ui.card-action>
</x-ui.card-header>
<x-ui.card-content>
<form class="flex flex-col gap-6">
<x-ui.field>
<x-ui.field-label for="card-login-email">Email</x-ui.field-label>
<x-ui.input id="card-login-email" type="email" placeholder="[email protected]" />
</x-ui.field>
<x-ui.field>
<div class="flex items-center">
<x-ui.field-label for="card-login-password">Password</x-ui.field-label>
<a href="#" class="ml-auto text-sm underline-offset-4 hover:underline">Forgot your password?</a>
</div>
<x-ui.input id="card-login-password" type="password" />
</x-ui.field>
</form>
</x-ui.card-content>
<x-ui.card-footer class="flex-col gap-2">
<x-ui.button type="submit" class="w-full">Login</x-ui.button>
<x-ui.button variant="outline" class="w-full">Login with Google</x-ui.button>
</x-ui.card-footer>
</x-ui.card>
Notifications
Send notifications to this device.
-
Your call has been confirmed.
5 minutes ago
-
You have a new message.
1 hour ago
<x-ui.card variant="sectioned" class="w-full max-w-sm">
<x-ui.card-header>
<x-ui.card-title>Notifications</x-ui.card-title>
<x-ui.card-description>You have 3 unread messages.</x-ui.card-description>
<x-ui.card-action>
<x-ui.button variant="ghost" size="icon" aria-label="Notification settings">
<x-lucide-bell aria-hidden="true" />
</x-ui.button>
</x-ui.card-action>
</x-ui.card-header>
<x-ui.card-content class="flex flex-col gap-4">
<x-ui.field orientation="horizontal" class="rounded-lg border p-3">
<x-ui.field-content>
<x-ui.field-label for="card-push">Push notifications</x-ui.field-label>
<x-ui.field-description>Send notifications to this device.</x-ui.field-description>
</x-ui.field-content>
<x-ui.switch id="card-push" checked />
</x-ui.field>
<ul class="flex flex-col gap-4">
<li class="flex items-start gap-3">
<span class="bg-primary mt-1.5 size-2 shrink-0 rounded-full" aria-hidden="true"></span>
<div class="text-sm">
<p class="font-medium leading-none">Your call has been confirmed.</p>
<p class="text-muted-foreground">5 minutes ago</p>
</div>
</li>
<li class="flex items-start gap-3">
<span class="bg-primary mt-1.5 size-2 shrink-0 rounded-full" aria-hidden="true"></span>
<div class="text-sm">
<p class="font-medium leading-none">You have a new message.</p>
<p class="text-muted-foreground">1 hour ago</p>
</div>
</li>
</ul>
</x-ui.card-content>
<x-ui.card-footer>
<x-ui.button class="w-full">
<x-lucide-check aria-hidden="true" />
Mark all as read
</x-ui.button>
</x-ui.card-footer>
</x-ui.card>
Payment
<x-ui.card variant="sectioned" class="w-full max-w-sm">
<x-ui.card-header>
<x-ui.card-title>Payment details</x-ui.card-title>
<x-ui.card-description>Enter your card information to continue.</x-ui.card-description>
</x-ui.card-header>
<x-ui.card-content>
<form class="flex flex-col gap-5">
<x-ui.field>
<x-ui.field-label for="pay-name">Name on card</x-ui.field-label>
<x-ui.input id="pay-name" placeholder="Sofia Carter" autocomplete="cc-name" />
</x-ui.field>
<x-ui.field>
<x-ui.field-label for="pay-number">Card number</x-ui.field-label>
<x-ui.input id="pay-number" inputmode="numeric" placeholder="1234 1234 1234 1234" autocomplete="cc-number" />
</x-ui.field>
<div class="grid grid-cols-2 gap-4">
<x-ui.field>
<x-ui.field-label for="pay-exp">Expires</x-ui.field-label>
<x-ui.input id="pay-exp" placeholder="MM/YY" autocomplete="cc-exp" />
</x-ui.field>
<x-ui.field>
<x-ui.field-label for="pay-cvc">CVC</x-ui.field-label>
<x-ui.input id="pay-cvc" inputmode="numeric" placeholder="CVC" autocomplete="cc-csc" />
</x-ui.field>
</div>
</form>
</x-ui.card-content>
<x-ui.card-footer>
<x-ui.button class="w-full">Continue</x-ui.button>
</x-ui.card-footer>
</x-ui.card>
Pricing
- Unlimited projects
- Advanced analytics
- Priority support
- 50 GB storage
<x-ui.card variant="sectioned" class="w-full max-w-sm">
<x-ui.card-header>
<x-ui.card-title>Premium</x-ui.card-title>
<x-ui.card-description>For growing teams that need more power.</x-ui.card-description>
<x-ui.card-action><x-ui.badge>Popular</x-ui.badge></x-ui.card-action>
</x-ui.card-header>
<x-ui.card-content class="flex flex-col gap-5">
<div class="flex items-baseline gap-1">
<span class="text-4xl font-bold tracking-tight">$29</span>
<span class="text-muted-foreground">/month</span>
</div>
<ul class="flex flex-col gap-2.5 text-sm">
@foreach (['Unlimited projects', 'Advanced analytics', 'Priority support', '50 GB storage'] as $feat)
<li class="flex items-center gap-2"><x-lucide-circle-check class="text-primary size-4 shrink-0" aria-hidden="true" /> {{ $feat }}</li>
@endforeach
</ul>
</x-ui.card-content>
<x-ui.card-footer>
<x-ui.button class="w-full">Get started</x-ui.button>
</x-ui.card-footer>
</x-ui.card>
Product
<x-ui.card variant="sectioned" class="w-full max-w-sm overflow-hidden pt-0">
<img src="https://images.unsplash.com/photo-1577140917170-285929fb55b7?w=800&q=80&auto=format&fit=crop"
alt="Solid oak dining table with wooden chairs"
class="aspect-[4/3] w-full object-cover" />
<x-ui.card-header>
<div class="flex items-start justify-between gap-2">
<x-ui.card-title>Classic Wooden Table</x-ui.card-title>
<x-ui.badge variant="secondary">In stock</x-ui.badge>
</div>
<x-ui.card-description>Solid oak dining table that seats six.</x-ui.card-description>
</x-ui.card-header>
<x-ui.card-content>
<div class="flex items-center gap-1.5 text-sm">
<span class="flex text-amber-500" aria-hidden="true">
<x-lucide-star class="size-4 fill-current" />
<x-lucide-star class="size-4 fill-current" />
<x-lucide-star class="size-4 fill-current" />
<x-lucide-star class="size-4 fill-current" />
<x-lucide-star-half class="size-4 fill-current" />
</span>
<span class="text-muted-foreground">4.6 (128 reviews)</span>
</div>
</x-ui.card-content>
<x-ui.card-footer class="justify-between">
<span class="text-2xl font-semibold tabular-nums">$249</span>
<x-ui.button><x-lucide-shopping-cart aria-hidden="true" /> Add to cart</x-ui.button>
</x-ui.card-footer>
</x-ui.card>
Profile
<x-ui.card variant="sectioned" class="w-full max-w-xs">
<x-ui.card-content class="flex flex-col items-center gap-3 pt-6 text-center">
<x-ui.avatar class="size-16"><x-ui.avatar-fallback class="text-lg">SC</x-ui.avatar-fallback></x-ui.avatar>
<div>
<div class="font-semibold">Sofia Carter</div>
<div class="text-muted-foreground text-sm">Product Designer</div>
</div>
<div class="flex justify-center gap-8 text-sm">
<div>
<div class="font-semibold tabular-nums">128</div>
<div class="text-muted-foreground text-xs">Following</div>
</div>
<div>
<div class="font-semibold tabular-nums">2.3k</div>
<div class="text-muted-foreground text-xs">Followers</div>
</div>
</div>
</x-ui.card-content>
<x-ui.card-footer>
<x-ui.button class="w-full"><x-lucide-user-plus aria-hidden="true" /> Follow</x-ui.button>
</x-ui.card-footer>
</x-ui.card>
Share
People with access
<x-ui.card variant="sectioned" class="w-full max-w-md">
<x-ui.card-header>
<x-ui.card-title>Share this document</x-ui.card-title>
<x-ui.card-description>Anyone with the link can view this document.</x-ui.card-description>
</x-ui.card-header>
<x-ui.card-content class="flex flex-col gap-4">
<div class="flex items-center gap-2">
<x-ui.input value="https://blatui.dev/d/8Fk2pQ" readonly aria-label="Document link" class="flex-1" />
<x-ui.button variant="secondary"><x-lucide-copy aria-hidden="true" /> Copy</x-ui.button>
</div>
<x-ui.separator />
<div class="flex flex-col gap-3">
<p class="text-sm font-medium">People with access</p>
<div class="flex items-center gap-3">
<x-ui.avatar><x-ui.avatar-fallback>SC</x-ui.avatar-fallback></x-ui.avatar>
<div class="min-w-0 flex-1 text-sm">
<div class="truncate font-medium">Sofia Carter</div>
<div class="truncate text-muted-foreground">[email protected]</div>
</div>
<span class="text-muted-foreground shrink-0 text-sm">Owner</span>
</div>
<div class="flex items-center gap-3">
<x-ui.avatar><x-ui.avatar-fallback>JD</x-ui.avatar-fallback></x-ui.avatar>
<div class="min-w-0 flex-1 text-sm">
<div class="truncate font-medium">Jackson Doe</div>
<div class="truncate text-muted-foreground">[email protected]</div>
</div>
<span class="text-muted-foreground shrink-0 text-sm">Can edit</span>
</div>
</div>
</x-ui.card-content>
</x-ui.card>
Simple
Simple box.
The base card is just p-6 with a rounded border — no flex,
no imposed gaps. Compose freely inside it.
{{-- The default card is now a simple padded box — drop content straight in, no fighting
imposed flex/gap/py. Use variant="sectioned" when you want header/content/footer. --}}
<x-ui.card class="w-full max-w-sm">
<p class="text-sm">
<span class="font-medium">Simple box.</span>
The base card is just <code class="text-xs">p-6</code> with a rounded border — no flex,
no imposed gaps. Compose freely inside it.
</p>
</x-ui.card>
Stats
<div class="grid w-full max-w-2xl gap-4 sm:grid-cols-2">
<x-ui.card variant="sectioned">
<x-ui.card-header>
<x-ui.card-description>Total Revenue</x-ui.card-description>
<x-ui.card-title class="text-2xl tabular-nums">$15,231.89</x-ui.card-title>
<x-ui.card-action>
<x-ui.badge variant="secondary">
<x-lucide-trending-up class="size-3" aria-hidden="true" />
+20.1%
</x-ui.badge>
</x-ui.card-action>
</x-ui.card-header>
<x-ui.card-footer class="text-muted-foreground text-sm">
Trending up this month
</x-ui.card-footer>
</x-ui.card>
<x-ui.card variant="sectioned">
<x-ui.card-header>
<x-ui.card-description>New Customers</x-ui.card-description>
<x-ui.card-title class="text-2xl tabular-nums">1,234</x-ui.card-title>
<x-ui.card-action>
<x-ui.badge variant="secondary">
<x-lucide-trending-down class="size-3" aria-hidden="true" />
-3.2%
</x-ui.badge>
</x-ui.card-action>
</x-ui.card-header>
<x-ui.card-footer class="text-muted-foreground text-sm">
Down 3.2% this period
</x-ui.card-footer>
</x-ui.card>
</div>
Testimonial
"BlatUI let us ship a polished, accessible UI in days instead of weeks. It's become the foundation of every new project."
<x-ui.card variant="sectioned" class="w-full max-w-sm">
<x-ui.card-content class="flex flex-col gap-4 pt-6">
<span class="flex text-amber-500" aria-hidden="true">
<x-lucide-star class="size-4 fill-current" />
<x-lucide-star class="size-4 fill-current" />
<x-lucide-star class="size-4 fill-current" />
<x-lucide-star class="size-4 fill-current" />
<x-lucide-star class="size-4 fill-current" />
</span>
<p class="text-sm leading-relaxed">"BlatUI let us ship a polished, accessible UI in days instead of weeks. It's become the foundation of every new project."</p>
<div class="flex items-center gap-3">
<x-ui.avatar class="size-9"><x-ui.avatar-fallback>AB</x-ui.avatar-fallback></x-ui.avatar>
<div class="text-sm">
<div class="font-medium">Amelia Bell</div>
<div class="text-muted-foreground text-xs">CTO, Acme Inc</div>
</div>
</div>
</x-ui.card-content>
</x-ui.card>
With Action
<x-ui.card variant="sectioned" class="w-full max-w-sm">
<x-ui.card-header>
<x-ui.card-title>Team members</x-ui.card-title>
<x-ui.card-description>Invite your team to collaborate.</x-ui.card-description>
<x-ui.card-action>
<x-ui.dropdown-menu>
<x-ui.dropdown-menu-trigger>
<x-ui.button variant="ghost" size="icon" aria-label="Card options">
<x-lucide-more-horizontal aria-hidden="true" />
</x-ui.button>
</x-ui.dropdown-menu-trigger>
<x-ui.dropdown-menu-content align="end">
<x-ui.dropdown-menu-item>Edit</x-ui.dropdown-menu-item>
<x-ui.dropdown-menu-item>Duplicate</x-ui.dropdown-menu-item>
<x-ui.dropdown-menu-separator />
<x-ui.dropdown-menu-item variant="destructive">Delete</x-ui.dropdown-menu-item>
</x-ui.dropdown-menu-content>
</x-ui.dropdown-menu>
</x-ui.card-action>
</x-ui.card-header>
<x-ui.card-content class="flex flex-col gap-4">
<div class="flex items-center gap-3">
<x-ui.avatar>
<x-ui.avatar-fallback>SC</x-ui.avatar-fallback>
</x-ui.avatar>
<div class="min-w-0 flex-1 text-sm">
<div class="truncate font-medium">Sofia Carter</div>
<div class="truncate text-muted-foreground">[email protected]</div>
</div>
<x-ui.badge variant="outline">Owner</x-ui.badge>
</div>
<div class="flex items-center gap-3">
<x-ui.avatar>
<x-ui.avatar-fallback>JD</x-ui.avatar-fallback>
</x-ui.avatar>
<div class="min-w-0 flex-1 text-sm">
<div class="truncate font-medium">Jackson Doe</div>
<div class="truncate text-muted-foreground">[email protected]</div>
</div>
<x-ui.badge variant="outline">Member</x-ui.badge>
</div>
</x-ui.card-content>
</x-ui.card>
With Image
<x-ui.card variant="sectioned" class="w-full max-w-sm overflow-hidden pt-0">
<img src="https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=800&q=80&auto=format&fit=crop"
alt="Snowy mountain peaks rising above the clouds at sunset"
class="aspect-video w-full object-cover" />
<x-ui.card-header>
<x-ui.card-title>Exploring the mountains</x-ui.card-title>
<x-ui.card-description>A short trip above the clouds.</x-ui.card-description>
<x-ui.card-action>
<x-ui.badge variant="secondary">Travel</x-ui.badge>
</x-ui.card-action>
</x-ui.card-header>
<x-ui.card-content class="text-muted-foreground text-sm">
Cards group related content and actions, with an optional cover image that bleeds to the edges.
</x-ui.card-content>
<x-ui.card-footer class="gap-2">
<x-ui.button>Read more</x-ui.button>
<x-ui.button variant="outline">Share</x-ui.button>
</x-ui.card-footer>
</x-ui.card>
API Reference
Props, slots and exposed methods for
<x-ui.card>.
Props
| Prop | Type | Default | Description |
|---|---|---|---|
variant |
string
|
'default'
|
default is a simple padded box for free-form content. sectioned removes horizontal padding and stacks card-header / card-content / card-footer parts (each supplies its own padding).
default
sectioned
|
Slots
| Slot | Description |
|---|---|
default |
Card content. With the default variant put anything here directly; with the sectioned variant compose the card-* sub-parts below. |
x-ui.card-header |
Top section holding the title, description, and optional action. Use with the sectioned variant. |
x-ui.card-title |
The card heading text, placed inside card-header. |
x-ui.card-description |
Muted supporting text under the title, placed inside card-header. |
x-ui.card-action |
Top-right action area within card-header (e.g. a menu button or link). |
x-ui.card-content |
The main body of a sectioned card. |
x-ui.card-footer |
Bottom section for actions such as buttons. |