Clusters by asign
CommunityGroup several fields into one input row with a shared label, joined borders and one focus ring — the successor of guava/filament-clusters.
Author:
asign
Package health
Automated checks of this plugin's Composer package
15 checks
- Passed: GitHub Actions pinned to SHA
- Skipped: GitLab CI includes pinned to SHA
- Passed: Open security advisories
- Passed: Dependabot PR responsiveness — No open Dependabot PRs.
- Skipped: Renovate MR responsiveness
- Passed: Dependabot or Renovate configured
- Passed: Dependency update cooldown configured
- Passed: Provides a security policy
- Passed: Abandoned or archived — No consulted source marks the package abandoned (packagist, github).
- Passed: Commit and release recency — Active: last commit 0 days ago; last release 0 days ago.
-
Passed:
composer.lock not committed by library
—
composer.lockis absent from the released dist archive. - Passed: Dist archive is lean
-
Passed:
Current Laravel version supported
—
Package dependencies resolve together with current Laravel
13.0. -
Passed:
Current PHP version supported
—
Constraint
^8.3supports current PHP8.5. - Skipped: Current Symfony version supported
filament/
namespace. Review the source and install at your own risk. Found
malware or an unresolved security issue the author won't
address?
Report it
.
Documentation
- Screenshots
- Requirements
- Installation
- Usage
- Configuration
- Gotchas
- Translations
- AI agents
- Testing
- Changelog
- License
Put several fields into one input row in Filament 5: one label, one bordered control, joined borders and a shared focus ring.
Address lines, name parts, ranges, money plus currency. Every child keeps its own state path and validation; the cluster only
draws them together and gathers their errors. A maintained Filament 5 successor of guava/filament-clusters.
#Screenshots
Name, address, period, money plus currency, prefix and suffix and a two-row cluster: one label and one bordered control each:

Every child keeps its own validation; the cluster gathers the errors under one label:

Dark mode:

#Requirements
- PHP 8.3+
- Laravel 12 or 13
- Filament 5
#Installation
composer require asignua/filament-clusters
php artisan filament:assets
Registering the plugin is optional (it only lists the plugin on the panel):
use Asignua\FilamentClusters\ClustersPlugin;
$panel->plugin(ClustersPlugin::make());
Migrating from Guava: change the import to Asignua\FilamentClusters\Cluster. Note that an integer columns() now means "on every screen".
#Usage
use Asignua\FilamentClusters\Cluster;
use Filament\Forms\Components\TextInput;
Cluster::make([
TextInput::make('first_name')->label('First name')->required(),
TextInput::make('last_name')->label('Last name')->required(),
])
->label('Name')
->hint('Legal name')
->helperText('As in the passport');
The children are saved as first_name / last_name, exactly as without the cluster.
#Several clusters in one form
Cluster::make([...]) needs no name: each unnamed cluster gets a generated one from its child field names, stable between
Livewire requests, so any number of them can sit in one schema. A cluster owns no state, so the name only matters for DOM ids.
#Columns and stacking
Cluster::make([...])->columns(4); // 4 equal columns on every screen
Cluster::make([...])->columns(['default' => 1, 'sm' => 2]); // stacked on mobile
Cluster::make([...])->stackBelow('md'); // one per line below md, a row from md up
Cluster::make([...])->columns(1); // a vertical cluster
Per-child width: ->columnSpan(['default' => 3]) (a bare columnSpan(3) is Filament's lg-only span). Likewise ->columns(3) is ['default' => 3], not Filament's lg-only form.
#Recipes
// Money + currency
Cluster::make([
Select::make('currency')->options(['EUR' => 'EUR', 'USD' => 'USD'])->native(false)->default('EUR'),
TextInput::make('amount')->numeric()->minValue(0)->columnSpan(['default' => 3]),
])->label('Price')->columns(4);
// Range
Cluster::make([
TextInput::make('min')->numeric()->prefix('from'),
TextInput::make('max')->numeric()->prefix('to')->gte('min'),
])->label('Quantity');
// Address lines
Cluster::make([
TextInput::make('street')->columnSpan(['default' => 1, 'sm' => 3]),
TextInput::make('house')->columnSpan(['default' => 1, 'sm' => 1]),
TextInput::make('zip'),
TextInput::make('city')->columnSpan(['default' => 1, 'sm' => 3]),
])->label('Address')->columns(['default' => 1, 'sm' => 4]);
// Date + time
Cluster::make([DatePicker::make('day'), TimePicker::make('time')])->label('When')->stackBelow('sm');
#Configuration
There is no config file. Restyle through CSS variables on .fi-cl: --fi-cl-radius, --fi-cl-divider, --fi-cl-ring,
--fi-cl-ring-focus, --fi-cl-ring-invalid. Dark mode follows Filament's .dark class.
#Gotchas
- Children's own labels, hints and helper text are not drawn (the cluster supplies them). Their labels stay as screen-reader names.
- Multi-row clusters (more children than columns) draw a hairline on both sides of every later cell, so the first cell of a second row shows a short line at the outer edge.
- Don't override
isDisabled()-style logic from the children: the dimmed frame is shown when every child is disabled, the cluster itself is not disabled by it. - Only fields with a single-line frame (
fi-input-wrp) look right inside; textareas, toggles and editors do not. - Outside a panel (plain Livewire page) load the stylesheet with
FilamentAsset::getStyleHref('filament-clusters', 'asignua/filament-clusters').
#Translations
English, Ukrainian, German, Spanish, French, Italian, Dutch, Polish, Brazilian Portuguese and Turkish under
filament-clusters::filament-clusters (the screen-reader name of a child). Publish with --tag=filament-clusters-translations.
#AI agents
Laravel Boost guidelines ship in resources/boost/guidelines/core.blade.php.
#Testing
composer install
composer test
composer analyse
vendor/bin/pint --test
#Changelog
See CHANGELOG.md.
#License
The MIT License (MIT). See LICENSE.md.
The author
asign is a small web-dev company from Lviv, Ukraine. We build business applications on Laravel and Filament — CRMs, automation systems for standard and non-standard business processes, booking and content management systems, including our own Filament-based CMS. We open-source the parts that prove useful beyond a single project
From the same author
Relation Manager Tabs
Render relation managers as ordinary tabs of the record form, so an edit or view page has exactly one row of tabs.
Author:
asign
SEO Files
Generate and edit sitemap.xml with hreflang and a sitemap index for large sites, robots.txt and llms.txt / llms-full.txt from your Filament panel
Author:
asign
Mail Log
Log of every outgoing mail with queue status, a sandboxed preview and signed links, tokens and passwords redacted before storage.
Author:
asign
Toggle Icon Column
Clickable icon column that toggles a boolean in place, with on/off colours and hover preview — the successor of archilex's plugin.
Author:
asign
Featured Plugins
A selection of plugins curated by the Filament team
Soft Theme
A theme that gives panels a warm, approachable look with rounded shapes, gentle colors, and serif headings.
Filament
Noir Theme
A theme that gives panels a focused, refined look with near-black surfaces, crisp actions, and restrained color.
Filament
Advanced Tables (formerly Filter Sets)
Supercharge your tables with powerful features like user-customizable views, quick filters, multi-column sorting, advanced table searching, convenient view management, and more. Compatible with Resource Panel Tables, Relation Managers, Table Widgets, and Table Builder!
Kenneth Sese