Componentes prime
Introducción
Dentro de los schemas de Filament, los componentes prime son los bloques constructivos más básicos que se pueden usar para insertar contenido arbitrario en un schema, como texto e imágenes. Como su nombre sugiere, los componentes prime no son divisibles y no se pueden simplificar más. Filament proporciona un conjunto de componentes prime integrados:
También puedes crear tus propios componentes personalizados para agregar tu propio contenido arbitrario a un schema.
En este ejemplo, los componentes prime se usan para mostrar instrucciones al usuario, un código QR que el usuario puede escanear, y una lista de códigos de recuperación que el usuario puede guardar:
use Filament\Actions\Action;
use Filament\Schemas\Components\Image;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Components\Text;
use Filament\Schemas\Components\UnorderedList;
use Filament\Support\Enums\FontWeight;
use Filament\Support\Enums\TextSize;
$schema
->components([
Text::make('Escanea este código QR con tu aplicación de autenticación:')
->color('neutral'),
Image::make(
url: asset('images/qr.jpg'),
alt: 'Código QR para escanear con una aplicación de autenticación',
)
->imageHeight('12rem')
->alignCenter(),
Section::make()
->schema([
Text::make('Por favor guarda los siguientes códigos de recuperación en un lugar seguro. Solo se mostrarán una vez, pero los necesitarás si pierdes acceso a tu aplicación de autenticación:')
->weight(FontWeight::Bold)
->color('neutral'),
UnorderedList::make(fn (): array => array_map(
fn (string $recoveryCode): Text => Text::make($recoveryCode)
->copyable()
->fontFamily(FontFamily::Mono)
->size(TextSize::ExtraSmall)
->color('neutral'),
['tYRnCqNLUx-3QOLNKyDiV', 'cKok2eImKc-oWHHH4VhNe', 'C0ZstEcSSB-nrbyk2pv8z', '49EXLRQ8MI-FpWywpSDHE', 'TXjHnvkUrr-KuiVJENPmJ', 'BB574ookll-uI20yxP6oa', 'BbgScF2egu-VOfHrMtsCl', 'cO0dJYqmee-S9ubJHpRFR'],
))
->size(TextSize::ExtraSmall),
])
->compact()
->secondary(),
])
Aunque el texto se puede renderizar en un schema usando una entrada de texto de infolist, las entradas están destinadas a renderizar un detalle etiqueta-valor sobre una entidad (como un modelo Eloquent), y no para renderizar texto arbitrario. Los componentes prime son más adecuados para este propósito. Las infolists se pueden considerar más similares a listas de descripción en HTML.
Las clases de componentes prime se pueden encontrar en el namespace Filament\Schemas\Components
. Residen dentro del array de componentes del schema.
Componente de texto
El texto se puede insertar en un schema usando el componente Text
. El contenido del texto se pasa al método make()
:
use Filament\Schemas\Components\Text;
Text::make('Modificar estos permisos puede dar a los usuarios acceso a información sensible.')
Para renderizar contenido HTML crudo, puedes pasar un objeto HtmlString
al método make()
:
use Filament\Schemas\Components\Text;
use Illuminate\Support\HtmlString;
Text::make(new HtmlString('<strong>Advertencia:</strong> Modificar estos permisos puede dar a los usuarios acceso a información sensible.'))
Ten en cuenta que necesitarás asegurarte de que el HTML sea seguro para renderizar, de lo contrario tu aplicación será vulnerable a ataques XSS.
Para renderizar Markdown, puedes usar el helper str()
de Laravel para convertir Markdown a HTML, y luego transformarlo en un objeto HtmlString
:
use Filament\Schemas\Components\Text;
Text::make(
str('**Advertencia:** Modificar estos permisos puede dar a los usuarios acceso a información sensible.')
->inlineMarkdown()
->toHtmlString(),
)
Details
💡 Nota sobre valores dinámicos
El métodomake()
también acepta una función para calcularlo dinámicamente. Puedes inyectar varias utilidades como parámetros en la función.Personalizar el color del texto
Puedes establecer un color para el texto:
use Filament\Schemas\Components\Text;
Text::make('Información')
->color('info')
Details
💡 Nota sobre color dinámico
El métodocolor()
también acepta una función para calcularlo dinámicamente. Puedes inyectar varias utilidades como parámetros en la función.Usar un color neutral
Por defecto, el color del texto está establecido en gray
, que típicamente es bastante tenue contra su fondo. Puedes oscurecerlo usando el método color('neutral')
:
use Filament\Schemas\Components\Text;
Text::make('Modificar estos permisos puede dar a los usuarios acceso a información sensible.')
Text::make('Modificar estos permisos puede dar a los usuarios acceso a información sensible.')
->color('neutral')
Mostrar como una "insignia"
Por defecto, el texto es bastante simple y no tiene color de fondo. Puedes hacer que aparezca como una "insignia" en su lugar usando el método badge()
. Un gran caso de uso para esto es con estados, donde puedes querer mostrar una insignia con un color que coincida con el estado:
use Filament\Schemas\Components\Text;
Text::make('Advertencia')
->color('warning')
->badge()
Opcionalmente, puedes pasar un valor booleano para controlar si el texto debe estar en una insignia o no:
use Filament\Schemas\Components\Text;
Text::make('Advertencia')
->color('warning')
->badge(FeatureFlag::active())
Details
💡 Nota sobre insignia dinámica
El métodobadge()
también acepta una función para calcularlo dinámicamente. Puedes inyectar varias utilidades como parámetros en la función.Agregar un ícono a la insignia
Puedes agregar otras cosas a la insignia, como un ícono:
use Filament\Schemas\Components\Text;
use Filament\Support\Icons\Heroicon;
Text::make('Advertencia')
->color('warning')
->badge()
->icon(Heroicon::ExclamationTriangle)
Personalizar el tamaño del texto
El texto tiene un tamaño de fuente pequeño por defecto, pero puedes cambiarlo a TextSize::ExtraSmall
, TextSize::Medium
, o TextSize::Large
.
Por ejemplo, puedes hacer el texto más grande usando size(TextSize::Large)
:
use Filament\Schemas\Components\Text;
use Filament\Support\Enums\TextSize;
Text::make('Modificar estos permisos puede dar a los usuarios acceso a información sensible.')
->size(TextSize::Large)
Personalizar el peso de la fuente
Las entradas de texto tienen peso de fuente regular por defecto, pero puedes cambiarlo a cualquiera de las siguientes opciones: FontWeight::Thin
, FontWeight::ExtraLight
, FontWeight::Light
, FontWeight::Medium
, FontWeight::SemiBold
, FontWeight::Bold
, FontWeight::ExtraBold
o FontWeight::Black
.
Por ejemplo, puedes hacer la fuente negrita usando weight(FontWeight::Bold)
:
use Filament\Schemas\Components\Text;
use Filament\Support\Enums\FontWeight;
Text::make('Modificar estos permisos puede dar a los usuarios acceso a información sensible.')
->weight(FontWeight::Bold)
Details
💡 Nota sobre peso dinámico
El métodoweight()
también acepta una función para calcularlo dinámicamente. Puedes inyectar varias utilidades como parámetros en la función.Personalizar la familia de fuente
Puedes cambiar la familia de fuente del texto a cualquiera de las siguientes opciones: FontFamily::Sans
, FontFamily::Serif
o FontFamily::Mono
.
Por ejemplo, puedes hacer la fuente monoespaciada usando fontFamily(FontFamily::Mono)
:
use Filament\Support\Enums\FontFamily;
use Filament\Schemas\Components\Text;
Text::make('28o.-AK%D~xh*.:[4"3)zPiC')
->fontFamily(FontFamily::Mono)
Details
💡 Nota sobre familia de fuente dinámica
El métodofontFamily()
también acepta una función para calcularlo dinámicamente. Puedes inyectar varias utilidades como parámetros en la función.Agregar un tooltip al texto
Puedes agregar un tooltip al texto usando el método tooltip()
:
use Filament\Schemas\Components\Text;
Text::make('28o.-AK%D~xh*.:[4"3)zPiC')
->tooltip('Tu código secreto de recuperación')
Details
💡 Nota sobre tooltip dinámico
El métodotooltip()
también acepta una función para calcularlo dinámicamente. Puedes inyectar varias utilidades como parámetros en la función.Usar JavaScript para determinar el contenido del texto
Puedes usar JavaScript para determinar el contenido del texto. Esto es útil si quieres mostrar un mensaje diferente dependiendo del estado de un campo de formulario, sin hacer una petición al servidor para re-renderizar el schema. Para permitir esto, puedes usar el método js()
:
use Filament\Schemas\Components\Text;
Text::make(<<<'JS'
$get('name') ? `Hola, ${$get('name')}` : 'Por favor ingresa tu nombre.'
JS)
->js()
Las utilidades $state
y $get()
están disponibles en el contexto de JavaScript, por lo que puedes usarlas para obtener el estado de los campos en el schema.
Componente de ícono
Los íconos se pueden insertar en un schema usando el componente Icon
. Los íconos se pasan al método make()
:
use Filament\Schemas\Components\Icon;
use Filament\Support\Icons\Heroicon;
Icon::make(Heroicon::Star)
Details
💡 Nota sobre valores dinámicos
El métodomake()
también acepta una función para calcularlo dinámicamente. Puedes inyectar varias utilidades como parámetros en la función.Personalizar el color del ícono
Puedes establecer un color para el ícono:
use Filament\Schemas\Components\Icon;
use Filament\Support\Icons\Heroicon;
Icon::make(Heroicon::ExclamationCircle)
->color('danger')
Details
💡 Nota sobre color dinámico
El métodocolor()
también acepta una función para calcularlo dinámicamente. Puedes inyectar varias utilidades como parámetros en la función.Agregar un tooltip al ícono
Puedes agregar un tooltip al ícono usando el método tooltip()
:
use Filament\Schemas\Components\Icon;
use Filament\Support\Icons\Heroicon;
Icon::make(Heroicon::ExclamationTriangle)
->tooltip('Advertencia')
Details
💡 Nota sobre tooltip dinámico
El métodotooltip()
también acepta una función para calcularlo dinámicamente. Puedes inyectar varias utilidades como parámetros en la función.Componente de imagen
Las imágenes se pueden insertar en un schema usando el componente Image
. La URL de la imagen y el texto alternativo se pasan al método make()
:
use Filament\Schemas\Components\Image;
Image::make(
url: asset('images/qr.jpg'),
alt: 'Código QR para escanear con una aplicación de autenticación',
)
Details
💡 Nota sobre valores dinámicos
Los argumentos del métodomake()
también aceptan funciones para calcularlos dinámicamente. Puedes inyectar varias utilidades como parámetros en las funciones.Personalizar el tamaño de la imagen
Puedes personalizar el tamaño de la imagen pasando imageWidth()
e imageHeight()
, o ambos con imageSize()
:
use Filament\Schemas\Components\Image;
Image::make(
url: asset('images/qr.jpg'),
alt: 'Código QR para escanear con una aplicación de autenticación',
)
->imageWidth('12rem')
Image::make(
url: asset('images/qr.jpg'),
alt: 'Código QR para escanear con una aplicación de autenticación',
)
->imageHeight('12rem')
Image::make(
url: asset('images/qr.jpg'),
alt: 'Código QR para escanear con una aplicación de autenticación',
)
->imageSize('12rem')
Details
💡 Nota sobre tamaño dinámico
Los métodosimageWidth()
, imageHeight()
e imageSize()
también aceptan funciones para calcularlos dinámicamente. Puedes inyectar varias utilidades como parámetros en la función.Alinear la imagen
Puedes alinear la imagen al inicio (izquierda en interfaces de izquierda a derecha, derecha en interfaces de derecha a izquierda), centro, o final (derecha en interfaces de izquierda a derecha, izquierda en interfaces de derecha a izquierda) usando los métodos alignStart()
, alignCenter()
o alignEnd()
:
use Filament\Schemas\Components\Image;
Image::make(
url: asset('images/qr.jpg'),
alt: 'Código QR para escanear con una aplicación de autenticación',
)
->alignStart() // Esta es la alineación por defecto.
Image::make(
url: asset('images/qr.jpg'),
alt: 'Código QR para escanear con una aplicación de autenticación',
)
->alignCenter()
Image::make(
url: asset('images/qr.jpg'),
alt: 'Código QR para escanear con una aplicación de autenticación',
)
->alignEnd()
Alternativamente, puedes pasar un enum Alignment
al método alignment()
:
use Filament\Schemas\Components\Image;
use Filament\Support\Enums\Alignment;
Image::make(
url: asset('images/qr.jpg'),
alt: 'Código QR para escanear con una aplicación de autenticación',
)
->alignment(Alignment::Center)
Details
💡 Nota sobre alineación dinámica
El métodoalignment()
también acepta una función para calcularlo dinámicamente. Puedes inyectar varias utilidades como parámetros en la función.Agregar un tooltip a la imagen
Puedes agregar un tooltip a la imagen usando el método tooltip()
:
use Filament\Schemas\Components\Image;
Image::make(
url: asset('images/qr.jpg'),
alt: 'Código QR para escanear con una aplicación de autenticación',
)
->tooltip('Escanea este código QR con tu aplicación de autenticación')
->alignCenter()
Details
💡 Nota sobre tooltip dinámico
El métodotooltip()
también acepta una función para calcularlo dinámicamente. Puedes inyectar varias utilidades como parámetros en la función.Componente de lista desordenada
Las listas desordenadas se pueden insertar en un schema usando el componente UnorderedList
. Los elementos de la lista, que comprenden texto plano o componentes de texto, se pasan al método make()
:
use Filament\Schemas\Components\UnorderedList;
UnorderedList::make([
'Tablas',
'Schemas',
'Acciones',
'Notificaciones',
])
Details
💡 Nota sobre valores dinámicos
El métodomake()
también acepta una función para calcularlo dinámicamente. Puedes inyectar varias utilidades como parámetros en la función.Los componentes de texto se pueden usar como elementos de lista, lo que te permite personalizar el formato de cada elemento:
use Filament\Schemas\Components\Text;
use Filament\Schemas\Components\UnorderedList;
use Filament\Support\Enums\FontFamily;
UnorderedList::make([
Text::make('Tablas')->fontFamily(FontFamily::Mono),
Text::make('Schemas')->fontFamily(FontFamily::Mono),
Text::make('Acciones')->fontFamily(FontFamily::Mono),
Text::make('Notificaciones')->fontFamily(FontFamily::Mono),
])
Personalizar el tamaño de las viñetas
Si estás modificando el tamaño del texto del contenido de la lista, probablemente querrás ajustar el tamaño de las viñetas para que coincidan. Para hacer esto, puedes usar el método size()
. Las viñetas tienen tamaño de fuente pequeño por defecto, pero puedes cambiarlo a TextSize::ExtraSmall
, TextSize::Medium
, o TextSize::Large
.
Por ejemplo, puedes hacer las viñetas más grandes usando size(TextSize::Large)
:
use Filament\Schemas\Components\Text;
use Filament\Schemas\Components\UnorderedList;
UnorderedList::make([
Text::make('Tablas')->size(TextSize::Large),
Text::make('Schemas')->size(TextSize::Large),
Text::make('Acciones')->size(TextSize::Large),
Text::make('Notificaciones')->size(TextSize::Large),
])
->size(TextSize::Large)
Details
💡 Nota sobre tamaño dinámico
El métodosize()
también acepta una función para calcularlo dinámicamente. Puedes inyectar varias utilidades como parámetros en la función.Agregar atributos HTML extra a un componente prime
Puedes pasar atributos HTML extra al componente a través del método extraAttributes()
, que se fusionarán en su elemento HTML externo. Los atributos deben representarse por un array, donde la clave es el nombre del atributo y el valor es el valor del atributo:
use Filament\Schemas\Components\Text;
Text::make('Modificar estos permisos puede dar a los usuarios acceso a información sensible.')
->extraAttributes(['class' => 'custom-text-style'])
Details
💡 Nota sobre atributos dinámicos
El métodoextraAttributes()
también acepta una función para calcularlo dinámicamente. Puedes inyectar varias utilidades como parámetros en la función.Por defecto, llamar extraAttributes()
múltiples veces sobrescribirá los atributos anteriores. Si deseas fusionar los atributos en su lugar, puedes pasar merge: true
al método.