Clusters plugin screenshot
Dark mode ready
Multilingual support
Supports v5.x

Clusters by asign

Community

Group several fields into one input row with a shared label, joined borders and one focus ring — the successor of guava/filament-clusters.

Tags: Forms Form Field
Supported versions:
5.x
asign avatar Author: asign

Package health

Automated checks of this plugin's Composer package

100 / 100
Security 100
Maintenance 100
Ecosystem 100
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.lock is 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.3 supports current PHP 8.5.
  • Skipped: Current Symfony version supported
Third-party plugin. This is built by the community, not the Filament team. Filament does not review, endorse, or vet the security of plugins outside the 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 .
Powered by Plumb Last scanned 7 hours ago

Documentation

Filament Clusters

Tests

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:

A form with clustered fields: name, address line, period, price, prefix and suffix, billing address

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

A validation error under a Period cluster

Dark mode:

The cluster form in 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 avatar Author: asign

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

Plugins
28
Stars
27

From the same author