livewire/flux
Flux is a hand-crafted UI component library for Livewire apps, built with Tailwind CSS. Includes core components like Button, Dropdown, Icon, Separator, and Tooltip, with additional Pro components available via license.
Installation:
composer require livewire/flux
For Pro features:
php artisan flux:activate
Include Assets:
Add these directives to your layout file (e.g., resources/views/layouts/app.blade.php):
<head>
@fluxAppearance
<!-- Optional: Inter font -->
<link href="https://fonts.bunny.net/css?family=inter:400,500,600&display=swap" rel="stylesheet" />
</head>
<body>
@fluxScripts
</body>
Tailwind Configuration:
Update resources/css/app.css:
@import 'tailwindcss';
@import '../../vendor/livewire/flux/dist/flux.css';
@theme {
--font-sans: Inter, sans-serif;
}
Replace a basic <button> with Flux’s <flux:button>:
<flux:button wire:click="submitForm">
Submit
</flux:button>
Pro Tip: Use variant="primary" or color="red" for styling:
<flux:button variant="primary" color="red">
Delete
</flux:button>
<button>, <select>, etc., with Flux components (e.g., <flux:button>, <flux:dropdown>).wire:model, wire:click, and wire:change directly:
<flux:input wire:model="name" placeholder="Type here..." />
Use props for real-time updates:
<flux:button
wire:click="toggle"
:variant="isActive ? 'primary' : 'outline'"
:disabled="loading"
>
{{ isActive ? 'Active' : 'Inactive' }}
</flux:button>
Customize content via slots:
<flux:dropdown>
<x-slot name="trigger">
<flux:button>Options</flux:button>
</x-slot>
<flux:dropdown.item wire:click="action1">Action 1</flux:dropdown.item>
<flux:dropdown.item wire:click="action2">Action 2</flux:dropdown.item>
</flux:dropdown>
Use invalid prop for error states:
<flux:input
wire:model="email"
invalid="{{ $errors->has('email') }}"
error-message="{{ $errors->first('email') }}"
/>
Wrap forms in <flux:form> for built-in handling:
<flux:form wire:submit="save">
<flux:input wire:model="title" name="title" />
<flux:button type="submit">Save</flux:button>
</flux:form>
Run:
php artisan flux:activate
Then use Pro-only components (e.g., <flux:table>, <flux:modal>).
Publish component templates:
php artisan flux:publish --all
Edit published files in resources/views/vendor/flux/.
| Use Case | Flux Solution | Example |
|---|---|---|
| Tooltips | <flux:tooltip> |
<flux:button><flux:tooltip>Help</flux:tooltip></flux:button> |
| Icons | <flux:icon name="bell" /> |
Uses Lucide icons. |
| Separators | <flux:separator /> |
Horizontal dividers. |
| Dropdowns | <flux:dropdown> |
Multi-level menus. |
| Modals (Pro) | <flux:modal> |
Full-screen or inline modals. |
| Tables (Pro) | <flux:table> |
Sortable, paginated tables. |
flux:scripts with nonce:
@fluxScripts nonce="{{ csp_nonce() }}"
flux-button) or scope your custom styles:
.my-custom-button {
@apply flux-button flux-button-primary;
}
php artisan flux:activate and ensure your license is valid.<flux:modal>) may not work with Blaze.scroll="body" prop for modals:
<flux:modal scroll="body">
<!-- Content -->
</flux:modal>
@fluxScripts or @fluxAppearance.@import).flux.js errors.resources/css/app.css includes Flux imports.php artisan flux:activate if using Pro.!important sparingly. Instead, use Tailwind’s group-* utilities:
<div class="group">
<flux:button class="group-hover:bg-red-500">
Hover Me
</flux:button>
</div>
x-data or Alpine.js to lazy-load heavy components (e.g., <flux:chart>).public function getChartData()
{
return $this->cacheData('chart_data', function () {
return ExpensiveCalculation::run();
});
}
php artisan flux:publish to override Blade templates.<flux:button>:
php artisan flux:publish --component=button
Edit resources/views/vendor/flux/button.blade.php.<flux:button :variant="getButtonVariant()" />
public function getButtonVariant()
{
return $this->isAdmin ? 'primary' : 'outline';
}
<flux:dropdown aria-label="User actions">
<!-- Items -->
</flux:dropdown>
dark: variants. Ensure your layout includes:
<html class="dark">
<!-- Content -->
</html>
<flux:table>
@foreach($columns as $column)
<flux:table.column wire:key="col-{{ $column }}">
{{ $column }}
</flux:table.column>
@endforeach
</flux:table>
stack prop to manage multiple modals:
<flux:modal stack="user-actions">
<!-- Content -->
</flux:modal>
tooltip prop:
<flux:chart type="line" tooltip>
<!-- Data -->
</flux:chart>
composer update livewire/flux livewire/flux-pro
How can I help you explore Laravel packages today?