Skip to content
Brok UI

Loading…

No results

Blade, Tailwind, Alpine & Livewire-ready

The UI system for Laravel teams that own their code

One Artisan command writes real, readable Blade and CSS into your project — accessible components and blocks you edit freely, with diff-aware updates when you want them.

New Why copy-in beats a package kit
Get started Browse components
composer require jml/brok && php artisan ui:install
Components
389
installable primitives
Blocks
132
399 compositions
Pages
22
80 compositions
License
MIT
open core

You own the code

ui:add writes real Blade and CSS tokens into your repository. There is no runtime dependency on Brok — edit, restructure and ship on your terms.

Install in two commands

Updates stay diff-aware

Owning the source does not mean freezing it. ui:diff and ui:update three-way merge upstream fixes into your edits.

Read the honest comparison

Accessible and themeable

WCAG-minded defaults, semantic design tokens, RTL-ready. Re-skin the whole system by editing tokens — never the markup.

Open the theme generator

Start with the essentials

A curated core of the primitives every app needs — so you start here, not cold in front of all 389.

Browse all 389 components

Button

Displays a button or link with variants, sizes, a pill shape, static or Livewire-targeted loading state, leading/trailing icon slots, an accessibility-safe icon-only mode and an optional animated arrow.

Input

Text input with sm/md/lg sizes, invalid, disabled, readonly, file, dark, RTL, and responsive states; composes with label/field/button for forms. Inside a <x-ui.field name> (or with its own name) it self-wires old() repopulation and aria-invalid/aria-describedby from the shared $errors bag.

Native Select

A native select control with a custom chevron and an optional leading icon. Inside a <x-ui.field name> (or with its own name) it self-wires name/id and aria-invalid/aria-describedby from the shared $errors bag.

Card

A content container with header, content and footer sections; renders as div, a, article, section, li, details, dl or figure, with a frameless ghost variant.

Dialog

Modal dialog with focus trap, Escape-to-close, focus restoration, background inertness and a teleported overlay. Supports sm/md/lg/xl/full size presets, a scrollable body, sticky header/footer, layered Escape for nested content, and an opt-in subject-change announcement.

Table

A responsive data table with header, body, row, cell, sort-button, and shared announced loading and empty-state row parts; rows can link as a whole.

Tabs

Accessible tabbed interface (wire:model/x-model bind the active value through x-modelable) with roving tabindex, arrow-key navigation, touch swipe between panels, orientation, line/pills/boxed variants and full-width and disabled-tab support, with opt-in URL sync (`param`) so a tab is shareable as a link.

Badge

Compact status label with semantic variants, sizes, and a read-model `tone` (positive/attention/negative/info/neutral) that resolves to the soft recipe in one place.

Calendar

A localized month grid with full keyboard navigation and an ISO hidden form value.

Command

A filterable, keyboard-navigable command palette for server-authorized commands with stable action keys, disabled reasons, grouped links, shortcuts, and empty-state handling.

Dropdown Menu

Accessible menu with roving focus, type-ahead, click-outside dismissal and Escape handling. Sub-parts cover labels, groups, shortcuts, checkbox/radio items and nested submenus. Opt into `anchored` to teleport the panel past a clipping/scrolling ancestor.

Chart

A token-themed chart wrapper around ApexCharts (area, line, bar, scatter, pie, radar, radial, treemap, boxplot, range & mixed) with themed grid, legend and tooltip.

Composed blocks

Full sections built from the primitives — 132 blocks (399 compositions) across marketing, app and commerce.

Browse all 132 blocks

Ready to own your Laravel UI?

One Artisan command writes real, editable Blade into your app. No runtime lock-in, no black box.