Saltar al contenido principal

Layouts

Introducción​

El sistema de grid de Filament te permite crear layouts responsivos y multicolumna usando cualquier componente de layout. Filament incluye varios componentes integrados:

También puedes crear tus propios componentes de layout personalizados.

Sistema de grid​

Todos los componentes de layout tienen un método columns() que puedes usar de dos formas:

  • Pasando un entero, por ejemplo columns(2). Esto indica el número de columnas usadas a partir del breakpoint lg. En dispositivos más pequeños, siempre será 1 columna.
  • Pasando un array, donde la clave es el breakpoint y el valor es el número de columnas. Ejemplo: columns(['md' => 2, 'xl' => 4]). En md tendrá 2 columnas, en xl tendrá 4. El valor por defecto para dispositivos pequeños es 1 columna, salvo que uses la clave default.

Breakpoints (sm, md, lg, xl, 2xl) están definidos por Tailwind, ver documentación oficial.

Details

💡 Nota sobre columnas dinámicas Además de valores estáticos, columns() acepta funciones de callback. En estas puedes inyectar utilidades como parámetros (por ejemplo $get, $set, etc.).

Span de columnas​

Además de establecer cuántas columnas tiene un layout, puedes decidir cuántas columnas ocupa cada componente dentro de ese grid con columnSpan():

  • columnSpan(2) → ocupa 2 columnas en todos los breakpoints.
  • columnSpan(['md' => 2, 'xl' => 4]) → ocupa 2 columnas en md y 4 en xl.
  • columnSpan('full') o columnSpanFull() → ocupa todo el ancho del grid.
Details

💡 Nota sobre span dinámico columnSpan() también acepta callbacks con utilidades inyectables.

Column start​

Controla en qué columna empieza un componente dentro del grid con columnStart():

use Filament\Forms\Components\TextInput;
use Filament\Schemas\Components\Grid;

Grid::make()
->columns(['sm' => 3,'xl' => 6,'2xl' => 8])
->schema([
TextInput::make('name')
->columnStart(['sm' => 2,'xl' => 3,'2xl' => 4]),
])
Details

💡 Nota sobre inicio dinámico columnStart() acepta funciones con utilidades inyectadas.

Orden visual de columnas​

Puedes manipular el orden visual de los elementos sin cambiar el orden en el markup con columnOrder():

Grid::make()->columns(3)->schema([
TextInput::make('first')->columnOrder(3),
TextInput::make('second')->columnOrder(1),
TextInput::make('third')->columnOrder(2),
])

En este ejemplo: primero second, luego third, finalmente first.

Details

💡 Nota sobre orden dinámico columnOrder() acepta closures que calculan dinámicamente el orden.

Ejemplo completo​

use Filament\Forms\Components\TextInput;
use Filament\Schemas\Components\Section;

Section::make()
->columns(['sm' => 3,'xl' => 6,'2xl' => 8])
->schema([
TextInput::make('name')
->columnSpan(['sm' => 2,'xl' => 3,'2xl' => 4])
->columnOrder(['default' => 2,'xl' => 1]),
TextInput::make('email')
->columnSpan(['default' => 1,'xl' => 2])
->columnOrder(['default' => 1,'xl' => 2]),
])

Componentes básicos de layout​

Grid​

Funciona igual que otros layouts pero con sintaxis explícita:

use Filament\Schemas\Components\Grid;

Grid::make(['default' => 1,'sm' => 2,'md' => 3,'lg' => 4,'xl' => 6,'2xl' => 8])
->schema([
// ...
])

Flex​

Define layouts con flexbox y anchos flexibles:

Flex::make([
Section::make([TextInput::make('title'),Textarea::make('content')]),
Section::make([Toggle::make('is_published'),Toggle::make('is_featured')])->grow(false),
])->from('md')
Details

💡 Nota sobre grow() y from() Estos métodos también aceptan funciones con utilidades.

Fieldset​

Agrupa campos con borde y etiqueta:

Fieldset::make('Label')->columns(['default' => 1,'md' => 2,'xl' => 3])
Details

💡 Nota sobre make() Puedes pasar una función en lugar de un label fijo.

Puedes remover el borde con contained(false).

Container queries​

También puedes usar container queries:

Grid::make()->gridContainer()->columns(['@md' => 3,'@xl' => 4])

Soporta fallback con !@ para navegadores antiguos. Ejemplo:

Grid::make()
->gridContainer()
->columns(['@md' => 3,'@xl' => 4,'!@md' => 2,'!@xl' => 3])

Atributos extra HTML​

Puedes pasar atributos HTML extra con extraAttributes():

Section::make()
->extraAttributes(['class' => 'custom-section-style'])

Por defecto sobrescribe, pero se puede hacer merge con merge: true.