A reusable Blade UI kit
13 sections, 31 components — date picker, combobox, modals, toasts and the rest. Zero build step: Tailwind, Alpine and Font Awesome all load from CDN, so it drops straight onto shared hosting.
Foundations
Every colour, radius and font is a CSS variable. Swap them in
public/ui/ui.css
and the whole kit re-themes.
Colour tokens
Light and dark values switch on the .dark class.
Radii
Six steps, from controls to panels.
Typography
Space Grotesk for display, Plus Jakarta Sans for text, JetBrains Mono for code.
Display / 32 / Extrabold
Heading / 20 / Semibold
Body / 14 / Regular — the default reading size across the kit.
Muted / 12.5 — hints, captions and secondary metadata.
Mono / 12.5 — TX-8821-A94F
Badges & Avatars
Status pills in soft and solid fills; avatars with initials fallback.
Badges
Show markup
<x-ui.badge variant="accent">Accent</x-ui.badge>
<x-ui.badge variant="success" dot>Active</x-ui.badge>
<x-ui.badge variant="danger" icon="warning">Failed</x-ui.badge>
<x-ui.badge variant="info" solid>Solid</x-ui.badge>
Avatars
Show markup
<x-ui.avatar name="Kelly Kingston" size="lg" status="online" />
<x-ui.avatar name="Ada Obi" square />
<x-ui.avatar size="sm" />
Cards & Stats
Header, body and footer slots; KPI tiles infer trend direction from the sign.
Balance
875 400 FCFA
Active plans
3
Requests
24.8k
Uptime
99.98%
Card
Wallet
Available balance
875 400 FCFA
Last funded 3 days ago.
Border beam
Hover me
Pass beam and a light
travels the border on hover, focus, or when active
is set. The same trigger the radio cards use.
Show markup
<x-ui.card title="Wallet" subtitle="Available balance" icon="wallet" beam>
Your card body content.
<x-slot:action>
<x-ui.button size="xs" variant="ghost" icon="settings" />
</x-slot:action>
<x-slot:footer>
<x-ui.button size="sm" block>Fund wallet</x-ui.button>
</x-slot:footer>
</x-ui.card>
Alerts
Five tones, optional action slot and dismiss button.
Variants
Heads up
Payment received
Verify your account
Transaction failed
Show markup
<x-ui.alert variant="success" title="Payment received">
Funds have landed in your wallet.
</x-ui.alert>
<x-ui.alert variant="warning" title="Verify your account" dismissible>
Some features stay locked until verification completes.
</x-ui.alert>
Text inputs
Label, hint, error, icons and prefix/suffix affixes — all optional.
Inputs
We never share this.
Digits only, grouped as you type.
Password must be at least 12 characters.
Show markup
<x-ui.input label="Email" type="email" icon="user"
placeholder="you@example.com" hint="We never share this." />
<x-ui.input label="Amount" numeric prefix="FCFA" suffix="XAF" placeholder="0" />
<x-ui.input label="Password" type="password"
error="Password must be at least 12 characters." />
Textarea
Markdown supported.
Native select
Use combobox when you need search.
Choice controls
Checkbox, radio, switch and segmented control — native inputs, repainted in CSS.
Checkbox & radio
Show markup
<x-ui.checkbox label="Email notifications"
description="Get a summary every morning." checked />
<x-ui.radio name="plan" label="Starter" card />
<x-ui.switch label="Two-factor auth" :checked="true" />
<x-ui.segmented :options="[
['label' => 'Day', 'value' => 'day'],
['label' => 'Week', 'value' => 'week'],
]" />
Switch & segmented
Combobox
Searchable select with full keyboard support — ↑↓ to move, ↵ to pick, esc to close. Posts through a hidden input.
Single, multiple and plain
No matches found
Type to filter.
No matches found
Multi-select with running count.
No matches found
Search disabled for short lists.
Show markup
<x-ui.combobox
label="Country"
name="country"
placeholder="Select a country"
:options="[
['value' => 'ng', 'label' => 'Nigeria', 'description' => 'Lagos · GMT+1'],
['value' => 'gh', 'label' => 'Ghana', 'description' => 'Accra · GMT'],
]"
/>
{{-- multi-select --}}
<x-ui.combobox label="Tags" :options="$tags" multiple />
Date picker
No date library. Tap the month label to zoom out to months, again for a year grid — so 1950 is
three taps away, not 900 clicks. Values post as
YYYY-MM-DD.
Variants
Preselected to today.
Year grid runs back to 1920.
Bounded to this month.
Show markup
<x-ui.date-picker
label="Start date"
name="start_date"
value="2026-08-08"
hint="Posts as YYYY-MM-DD."
/>
{{-- year grid back to 1920 --}}
<x-ui.date-picker label="Date of birth" :min-year="1920" :max="now()->toDateString()" />
Tables
Header and footer slots; wide tables scroll inside the card, not the page.
Recent transactions
Last 7 days
| Reference | Description | Amount | Status | |
|---|---|---|---|---|
| TX-8821 | Wallet funding | 240 000 FCFA | Settled |
|
| TX-8820 | Plan renewal | -29 000 FCFA | Settled |
|
| TX-8817 | Withdrawal | -500 000 FCFA | Pending |
|
| TX-8814 | Wallet funding | 1 200 000 FCFA | Failed |
|
Overlays
Modals trap focus and lock scroll; toasts queue globally; tooltips follow hover and focus.
Modal, toast and tooltip
Show markup
{{-- Trigger --}}
<x-ui.button x-on:click="$dispatch('open-modal', 'confirm')">Open modal</x-ui.button>
{{-- Modal --}}
<x-ui.modal name="confirm" title="Delete workspace" icon="trash">
This cannot be undone.
<x-slot:footer>
<x-ui.button variant="ghost" x-on:click="$dispatch('close-modal', 'confirm')">Cancel</x-ui.button>
<x-ui.button variant="danger">Delete</x-ui.button>
</x-slot:footer>
</x-ui.modal>
{{-- Toast, from anywhere --}}
<x-ui.button x-on:click="$store.toast.push({
title: 'Saved', message: 'Changes applied.', variant: 'success'
})">Toast</x-ui.button>
{{-- Tooltip --}}
<x-ui.tooltip text="Copied to clipboard" position="top">
<x-ui.button size="sm" variant="outline" icon="copy">Copy</x-ui.button>
</x-ui.tooltip>
Create API key
Keys are shown once.
No matches found
Delete workspace
This cannot be undone.
Deleting this workspace removes every project, key and transaction record it holds. Type the workspace name to confirm.
Feedback
Progress bars, loading skeletons and empty states.
Progress
Show markup
<x-ui.progress label="Storage" :value="68" show-value />
<x-ui.progress indeterminate variant="accent" />
<x-ui.skeleton variant="paragraph" :lines="3" />
<x-ui.empty-state icon="inbox" title="No transactions yet"
description="Once you fund your wallet, activity shows up here.">
<x-ui.button size="sm" icon="plus">Fund wallet</x-ui.button>
</x-ui.empty-state>
Skeletons
No transactions yet
Once you fund your wallet, activity shows up here with receipts and running balances.