Flux ui patterns
51 production-grade Agent Skills for AI coding agents — full software lifecycle (idea → spec → build → review → ship → operate → maintain) plus Laravel/TALL/VILT/Filament stack workflows. Works with Elyra, Claude Code, Cursor, and more.
npx -y skills add kwhorne/elyra-skills --skill flux-ui-patternsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Build TALL stack UIs with Flux UI the intended way - pick the right component, compose forms and tables, theme with CSS variables, and avoid fighting the library with custom CSS. Use when building or reviewing Blade views in a project using Flux, converting custom Tailwind markup to Flux components, or deciding between Flux and hand-rolled UI.
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
5.2 KB, as published. Nobody here has run it
Flux UI Patterns
Flux earns its keep when you use components as designed — accessibility, dark mode, and keyboard handling come free. Fight it with overrides and you inherit all that work back.
When to use
- Building Blade/Livewire views in a project that uses Flux UI
- Reviewing UI code for consistency ("half Flux, half hand-rolled divs")
- Converting custom Tailwind markup to Flux components
- "Does Flux have something for this, or do we build it?"
Principles
- Check Flux first, build second. Before hand-rolling any control, check whether a Flux component (or composition of two) covers it. Hand-rolled means hand-rolled a11y, dark mode, and focus management.
- Props before classes. Use
variant,size,iconprops for supported variations. Utility classes on Flux components are for layout (margin, width, grid placement) — not for restyling internals. - The accessibility is in the composition.
flux:field+flux:label+flux:errorwire upfor/ariaautomatically. Skip the wrapper and you silently lose it. - Consistency beats preference. One project, one way to render a form row, a table, an action button.
Process
1. Map the design to components
- Inventory what the page needs: forms, tables, modals, dropdowns, toasts, badges
- For each, find the Flux equivalent; in elyra, verify against the live index with
flux_component_indexrather than memory — APIs move - No match? Compose primitives (
flux:dropdown+flux:navlist,flux:modal+ form) before writing custom markup
2. Forms — the standard recipe
<flux:field>
<flux:label>Email</flux:label>
<flux:input wire:model.blur="form.email" type="email" />
<flux:error name="form.email" />
</flux:field>
- Every input gets the field/label/error wrapper — that's where the a11y wiring lives
wire:modelgranularity perlivewire-component-design(deferred by default,.blurfor validate-on-blur)- Shorthand props (e.g.
label="Email"directly on input) are fine — pick one style per project and stick to it
3. Actions and feedback
- Buttons:
variantprop (primary,danger,ghost, …) — one primary action per view region - Destructive flows:
flux:modalconfirmation, danger variant on the confirming button - After Livewire actions: toast via Flux's toast component, triggered from the component — not inline status divs
4. Tables and lists
- Use Flux's table for sortable/paginated data wired to Livewire; keep row actions in a trailing dropdown
- Empty states: design them explicitly — a bare "No results." row is a design hole
5. Theming — variables, not overrides
- Customize via the documented CSS variables / Tailwind config (accent color, radius) so all components shift together
- Dark mode: Flux handles it per component — your job is to not break it with hard-coded
bg-white/text-blackin surrounding layout - If a component must look genuinely different from what props allow, that's a design-system decision: wrap it in your own Blade component once (
<x-app.stat-card>), don't sprinkle the same six utilities across twelve views
6. Review pass
# Smell: raw form controls in a Flux project
grep -rn "<input\|<select\|<button" resources/views --include="*.blade.php" | grep -v "flux:"
- Mixed Flux/hand-rolled controls in the same view → converge
- Repeated identical class-soup on Flux components → extract a wrapper component
- In elyra:
blade_to_fluxsuggests conversions;design_system_checkcatches consistency drift
Output format
## Flux review: <view/feature>
### Component mapping
| UI need | Used | Should be |
|---------|------|-----------|
| date input | raw `<input type="date">` | `flux:input type="date"` |
### Consistency findings
1. <view:line> — <issue> → <fix>
### Extracted wrappers
- `<x-app.…>` for <repeated pattern> (used N places)
### Theming
Variables touched: … | hard-coded colors found: …
Anti-patterns
- ❌ Hand-rolling a dropdown/modal/toast that Flux ships — and losing keyboard + a11y behavior
- ❌ Restyling component internals with utility classes instead of variants/props/variables
- ❌ Inputs without the
field/label/errorcomposition — looks fine, fails screen readers - ❌
bg-white dark:bg-zinc-900hand-managed on every container while Flux handles its own — drift guaranteed - ❌ Three different button styles for the same action across views
- ❌ Writing Flux component code from memory instead of checking the current component API
- ❌ One-off wrapper divs with the same 8 classes pasted in 12 views — extract the Blade component