BK Marketplace
Toggle theme
Component library

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.

Accent
Success
Danger
Warning
Info
Surface
Sunken
High

Radii

Six steps, from controls to panels.

control 7px
input 9px
card 11px
card-lg 13px
panel 16px
pill 999px

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

Buttons

Seven variants, four sizes, with icon, loading and block states.

Variants

Show markup
<x-ui.button variant="primary" icon="bolt">Launch</x-ui.button>
<x-ui.button variant="secondary">Secondary</x-ui.button>
<x-ui.button variant="outline">Outline</x-ui.button>
<x-ui.button variant="ghost">Ghost</x-ui.button>
<x-ui.button variant="soft">Soft</x-ui.button>
<x-ui.button variant="danger">Delete</x-ui.button>
<x-ui.button :loading="true">Saving</x-ui.button>

Sizes

States

Link

Badges & Avatars

Status pills in soft and solid fills; avatars with initials fallback.

Badges

Neutral Accent Active Failed Pending Solid Pro
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

KK AO TB ZN
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

12.4% vs. last month

Active plans

3

2 one expired

Requests

24.8k

8.1%

Uptime

99.98%

0.0%

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

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.

FCFA XAF

Digits only, grouped as you type.

Password must be at least 12 characters.

Optional
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

Choose a currency

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

selected

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

Copied to clipboard Appears below the trigger Right-hand side
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>

Feedback

Progress bars, loading skeletons and empty states.

Progress

Storage used 68%
Verification 100%
Quota 92%
Syncing…
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.