alwayscurious/filament-flux-theme
1.3.0A minimal, CSS-first Filament v5 theme that mirrors the Flux design language.
- Type:
- library
Access required
Licensed customers install this in seconds. talk with us for more details.
Filament Flux Theme
The Flux design language for your Filament v5 panel.
Flat surfaces. Monochrome accents. Zinc neutrals. The clean, considered look of Livewire's official component library — dropped onto your admin panel in five minutes, with zero Blade overrides and nothing for Filament updates to break.
Filament is the fastest way to build admin panels in Laravel. Flux is the design language behind Livewire's official component library — flat, monochrome, accessible, and quietly beautiful out of the box. This package marries the two.
It's a CSS-first theme plugin that retints and reshapes your existing Filament markup to match Flux — no component swaps, no published views, no fighting the framework. You keep every bit of Filament's speed and reliability, and your panel comes out looking like it was designed, not assembled.
->plugin(FluxTheme::make()->accent('zinc'))
One line. That's the whole API for the default look.
Why you'll like it
- 🎨 Looks designed, not bolted on. Flat surfaces flush with the page, hairline dividers instead of heavy shadows, and a monochrome accent that reads as intentional. Light and dark mode both, with no extra work.
- ⚡ CSS-first, zero overhead. No migrations, no jobs, no commands, no runtime cost. It's a stylesheet and a handful of CSS variables — it ships nothing that can slow a request down.
- 🧩 Future-proof by design. Pure
.fi-*selectors and Tailwind v4 tokens. There are no Blade overrides to drift out of sync, so Filament can ship updates and your theme keeps working. - 🎚️ Yours to tune. Stay monochrome, drop in any Tailwind ramp, paste a pick straight from fluxui.dev/themes, or hand it a raw
oklch(). Per-panel, per-environment, or from.env. - 🧹 Clean in, clean out.
composer removeplus deleting one@importline returns your panel to stock Filament with zero leftovers. No residue, no regrets.
What "the Flux look" means
If you've used Flux, you already know the feel. In plain terms:
- Flat — surfaces sit flush with the page background instead of floating on raised cards.
- Monochrome accent — by default the highlight color (buttons, active links) is near-black in light mode and near-white in dark mode, rather than a bright brand color. Swap in a real hue (blue, rose, violet…) whenever you want.
- Zinc neutrals — grays come from Tailwind's
zincpalette — a clean, slightly cool gray — used consistently everywhere. - Minimal shadows — very little drop-shadow or glow; the design leans on spacing and subtle hairlines instead.
New to Filament? Here's the lay of the land. Filament is a toolkit for building admin panels in Laravel — the dashboards, tables, and forms behind your app. A panel is one of those admin areas (often at
/admin); you can have more than one. A theme plugin is a small add-on you register on a panel to change how it looks, without touching what it does. This package is exactly that.
Requirements
| Requirement | Version |
|---|---|
| PHP | ^8.3 |
| Laravel | ^11 / ^12 / ^13 |
| Filament | ^5.0 |
| Tailwind CSS | ^4 |
This is a modern, CSS-first theme built for the current stack: it uses Tailwind v4's @theme token layer and Filament v5's viteTheme() API. That's what keeps it lightweight and update-proof — but it also means it will not work on older PHP, Tailwind v3, or Filament v3/v4 setups. Check your versions (php -v, and your app's composer.json) before you start.
Before you start: this guide assumes you already have a working Laravel app with Filament v5 installed and at least one panel (created via
php artisan filament:install --panels), plus Node.js / npm and Vite (the default for a fresh Laravel app). If you don't have a panel yet, set that up first — see the Filament installation docs. Run all commands below from your Laravel application's root directory (where itscomposer.jsonlives), unless stated otherwise.
Installation
Follow the steps in order — most install problems come from skipping the asset rebuild (Step 5) or getting the CSS import path wrong (Step 3).
Step 1 — Require the package via Composer
This package is served over Private Packagist, not the public Packagist.org index — so a plain composer require alwayscurious/filament-flux-theme won't resolve until you register the repository and add your access token. Composer needs both the repository location and a token to reach it.
-
Register the repository (Composer 2.9+):
composer config repositories.private-packagist composer https://repo.packagist.com/alwayscurious/This adds the following to your
composer.json:"repositories": [ { "type": "composer", "url": "https://repo.packagist.com/alwayscurious/" } ] -
Add your auth token (kept out of git, stored in
auth.json):composer config --auth http-basic.repo.packagist.com token <YOUR_PRIVATE_PACKAGIST_TOKEN> -
Require the package:
composer require alwayscurious/filament-flux-theme
Common mistake: Committing the token, or forgetting it entirely and seeing
... file could not be downloaded (HTTP/2 403). A 403 is an auth problem, not a "package missing" problem. Addauth.jsonto.gitignore, or set the token in CI via theCOMPOSER_AUTHenvironment variable.
Step 2 — Scaffold the panel's theme CSS
Why: Filament ships precompiled default CSS. To layer a custom theme on top, you need to own a CSS entry point and compile it through Vite. This command creates that entry point and helps wire it up.
Run Filament's theme generator, naming your panel (admin here):
php artisan make:filament-theme admin
This creates resources/css/filament/admin/theme.css. It then usually prints the exact lines to add to vite.config.js (a new entry in the input array) and to your panel provider (->viteTheme(...)) — follow whatever the command prints on screen. Depending on your Filament version it may make those edits for you or ask you to add them by hand; either is fine. If it asks which panel, choose admin.
Note: The panel name (
admin) must match your actual panel ID. The generated path mirrors it:resources/css/filament/<panel>/theme.css.
Step 3 — Import the package stylesheet
Why the order matters: CSS applies later rules on top of earlier ones. The Flux theme is an overlay that overrides Filament's tokens and component styles — so it must come after Filament's base import, or Filament's defaults will load afterward and cancel out the Flux look.
Open resources/css/filament/admin/theme.css and add the package @import after the line that imports Filament's base theme:
@import '../../../../vendor/filament/filament/resources/css/theme.css';
/* filament-flux-theme overlay — MUST come after Filament's base theme above.
Remove this line if you uninstall the package, or Vite will fail to resolve it. */
@import '../../../../vendor/alwayscurious/filament-flux-theme/resources/css/theme.css';
@source '../../../../app/Filament';
@source '../../../../resources/views';
Why exactly four ../: theme.css lives four folders deep (resources/css/filament/admin/), so four ../ climb back to the project root before descending into vendor/. A wrong depth (three or five ../) produces a Vite build error like Failed to resolve import.
Step 4 — Register the plugin on your panel
Why: The CSS import only restyles surfaces; the plugin is what configures Filament's primary/gray color palettes and emits the Flux accent variables. The class_exists guard means that if you ever composer remove the package, this block silently no-ops instead of throwing a "class not found" fatal error.
Open app/Providers/Filament/AdminPanelProvider.php. You'll find a panel() method that already has a return $panel->... chain. Append the ->when(...) block to that existing chain, immediately before its closing ; — don't add a second return:
use Filament\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...your existing panel config...
->viteTheme('resources/css/filament/admin/theme.css')
->when(
class_exists(\AlwaysCurious\FilamentFluxTheme\FluxTheme::class),
fn (Panel $panel) => $panel->plugin(
\AlwaysCurious\FilamentFluxTheme\FluxTheme::make()->accent('zinc'),
),
);
}
If you don't care about clean uninstalls, the simpler form works too — same existing return $panel chain, just a plain ->plugin(...):
use AlwaysCurious\FilamentFluxTheme\FluxTheme;
return $panel
->viteTheme('resources/css/filament/admin/theme.css')
->plugin(FluxTheme::make()->accent('zinc'));
Note: Step 2 should already have added the
->viteTheme(...)call — just confirm it's there rather than adding it twice, then append the plugin block.
Step 5 — Build your assets
Why: Everything above is source. Filament serves compiled CSS through Vite, so until you rebuild, the browser keeps serving the old stylesheet and the theme will appear to "do nothing." This is the single most common mistake.
Compile your assets:
npm run build
Or, while actively developing, run the watcher instead:
npm run dev
Tip: If you've never built this project's front end before, run
npm installfirst. Any time you changetheme.cssor a theme option, rebuild (or keepnpm run devrunning).
Quick install checklist
- Confirm PHP
^8.3, Laravel^11+, Filament^5, Tailwind^4, and an existing panel. - Register the Private Packagist repository, add your token, and
composer requirethe package. php artisan make:filament-theme admin.- Add the package
@importtoresources/css/filament/admin/theme.css, after Filament's base, with exactly four../. - Register
FluxTheme::make()->accent('zinc')on the panel with theclass_existsguard. npm run build(ornpm run dev).
What gets styled
Every surface in your panel, reskinned to match Flux — and nothing more. This theme ships one extra stylesheet that retints and reshapes Filament's existing markup. There are no Blade overrides, no published views, and no component swaps — which is exactly why it stays compatible across Filament updates. Everything below applies to both light and dark mode.
| Surface | Flux change |
|---|---|
| Buttons | Flatter fills, Flux radius and weight, tightened focus ring |
| Form inputs | Softer borders, Flux focus glow, consistent field height |
| Tables | Header tint removed, flat container, lighter row dividers |
| Badges | Flux pill shape with muted tonal colors |
| Modals | Reduced shadow, Flux radius, calmer overlay |
| Notifications / toasts | Flat card, Flux border and spacing |
| Dropdowns & action menus | Flat panel, Flux item hover and padding |
| Tooltips | Smaller, higher-contrast Flux bubble |
| Infolists | Flat entries, Flux label and divider styling |
| Widgets / sections | Borderless or hairline cards, Flux heading rhythm |
| Lazy placeholders | Flat card chrome and a height floor on Filament's loading skeleton, so hydration doesn't jump |
| Breadcrumbs | Muted separators, lighter Flux text treatment |
| Empty states | Calmer icon and copy, Flux spacing |
| Sidebar | Flat nav, Flux active pill, navlist child indent treatment |
| Topbar | Underline active bar instead of a filled tab |
Configuration
This section walks you from the fastest setup to full control. Start at the top; only keep reading until your needs are met.
The snippets below show only the plugin call for brevity. In your real panel provider, keep the
->viteTheme(...)and theclass_exists()guard from Installation Step 4 — just swap in theFluxTheme::make()->...part shown in each snippet.
1. The quick way
The simplest setup picks one accent color:
FluxTheme::make()->accent('zinc')
FluxTheme::make() creates the plugin and reads its starting values from config. ->accent('zinc') picks one of the legacy accent colors. Valid names are:
zinc, slate, stone, neutral, emerald, sky, rose, amber, violet, indigo, teal
Stick to the names on this list. An unrecognized name doesn't cleanly fall back — Filament's primary/gray palettes default to the zinc base (so the panel looks roughly zinc), but the runtime --color-accent CSS variable receives your invalid string verbatim and produces no usable accent color. When in doubt, use the full theme([...]) generator (section 4) instead.
The config file
Prefer to set defaults app-wide? Publish the config file:
php artisan vendor:publish --tag="filament-flux-theme-config"
This gives you a config file with two simple keys (plus theme, covered in section 4):
| Key | Default | Env var | What it does |
|---|---|---|---|
accent |
zinc |
FILAMENT_FLUX_ACCENT |
Legacy single accent color. Must be one of the names above. Used only when theme is empty. |
radius |
flux |
FILAMENT_FLUX_RADIUS |
Corner radius keyword or length (see the radius table in section 4). |
The fourth key, theme, defaults to an empty array [] and unlocks the advanced path in section 4.
Values set in config become the defaults for every FluxTheme::make(). The fluent setters below override them per panel.
2. Per-panel fluent overrides
Every config key has a matching fluent setter, so you can override the defaults on a single panel. They
Versions
| Version | Released |
|---|---|
| dev-main | Sep 28, 2026 |
| dev-fix/token-hook-scope | Sep 28, 2026 |
| 1.3.0 | Sep 28, 2026 |
| 1.2.8 | Sep 23, 2026 |
| 1.2.7 | Aug 23, 2026 |
| 1.2.6 | Aug 11, 2026 |
| 1.2.4 | Jul 5, 2026 |
| 1.2.3 | Jul 4, 2026 |
| 1.2.2 | Jun 4, 2026 |
| 1.2.0 | Jun 2, 2026 |
| 1.1.0 | Jun 1, 2026 |
| 1.0.1 | Jun 1, 2026 |
| 1.0.0 | Jun 1, 2026 |
| 0.0.1 | Jun 1, 2026 |