Componente Filament Form per la selezione di date con calendario inline sempre visibile e controllo granulare delle date selezionabili.
use Modules\UI\Filament\Forms\Components\InlineDatePicker;
InlineDatePicker::make('appointment_date')
->enabledDates(['2025-06-05', '2025-06-21'])
->highlightColor('bg-indigo-600 text-white')
->compactMode()
->required();- Design Inline: Calendario sempre visibile senza popup
- Date Selettive: Solo date specifiche sono cliccabili e evidenziate
- Tema Coerente: Basato sul design One theme con Tailwind CSS
- Alpine.js: Interattività fluida senza page reload
- Accessibilità: Supporto completo keyboard navigation e screen reader
// Date abilitate (array o Closure dinamica)
->enabledDates(['2025-06-05', '2025-06-21'])
->enabledDates(fn () => $this->getAvailableDates())
// Personalizzazione colori
->highlightColor('bg-green-600 text-white')
// Layout compatto
->compactMode()
// Controlli navigazione
->showNavigation(false)InlineDatePicker::make('date')
->enabledDates(fn () => $this->getDoctorAvailableDates())
->live()
->afterStateUpdated(fn ($state) => $this->loadTimeSlots($state))Componente Filament Form per la selezione di studi medici attraverso interfaccia card visuale.
use Modules\UI\Forms\Components\StudioCardSelector;
StudioCardSelector::make('selected_studio')
->studios(fn (Get $get) => $this->getStudiosForLocation($get))
->required();- Layout Responsive: Card stack verticali su mobile, orizzontali su desktop
- Accessibilità: Supporto completo keyboard navigation e screen reader
- Personalizzazione: Varianti compact/default/detailed
- Interattività: Selezione radio con feedback visivo
- Alpine.js: Interazioni fluide senza page reload
// Layout compatto
StudioCardSelector::make('studio')->compact();
// Layout dettagliato con info extra
StudioCardSelector::make('studio')
->detailed()
->showDistance()
->showSpecializations()
->showPhone();showDistance(): Badge distanza con icona mappashowSpecializations(): Tag specializzazioni medicheshowPhone(): Numero telefono con icona
Componente per la selezione mutuamente esclusiva con interfaccia card personalizzabile.
use Modules\UI\Filament\Forms\Components\RadioCollection;
RadioCollection::make('selection')
->options(collect([
(object)['id' => 1, 'name' => 'Opzione 1', 'description' => 'Descrizione 1'],
(object)['id' => 2, 'name' => 'Opzione 2', 'description' => 'Descrizione 2'],
]))
->valueKey('id')
->itemView('custom.item-template')
->required();- Type Safety: Comparazione type-safe tra valori per evitare problemi di type coercion
- Accessibilità: Supporto completo per screen reader e navigazione keyboard
- Reattività: Alpine.js + Livewire per feedback immediato
- Personalizzazione: Template item completamente personalizzabile
- Fisica Quantistica: Ogni opzione esiste in superposizione fino alla selezione
- Fenomenologia: Interfaccia progettata per minimizzare interruzioni cognitive
- Gestalt: Rispetta principi di prossimità, somiglianza e chiusura
- Zen: Design minimalista che riduce all'essenziale
📖 Documentazione Filosofica Completa
Componente per la selezione gerarchica di dati geografici (Regione → Provincia → CAP).
use Modules\UI\Filament\Forms\Components\LocationSelector;
LocationSelector::make()
->regionField('region')
->provinceField('province')
->capField('cap')
->required()
->searchable()- Selezione gerarchica con dipendenze automatiche
- Integrazione con modulo Geo
- Live updates tra i campi
- Validazione cascata
- Gestione errori con logging
Componente semplificato per la selezione di uno studio odontoiatrico tramite pulsanti radio-style.
<x-ui::ui.studio-selector
:studios="$studios"
:selected-studio="$selectedStudioId"
target-field="selected_studio"
/>- Pulsanti radio-style per selezione singola
- Visual feedback per stato selezionato
- Informazioni compatte (nome, indirizzo, contatti)
- Empty states integrati
- Integrazione Livewire automatica
- Layout responsive
Componente avanzato per la visualizzazione dettagliata di uno studio (per liste, dashboard, dettagli).
<x-ui::ui.studio-card
:studio="$studio"
:show-distance="true"
:show-rating="true"
:show-services="true"
:actions="['book', 'details', 'contact']"
/>- Layout responsive completo
- Rating con stelle
- Informazioni di contatto estese
- Servizi offerti
- Azioni personalizzabili
- Orari di apertura
I componenti SVG per le bandiere sono registrati automaticamente e possono essere utilizzati con il prefisso ui-flags.
{{-- Bandiera italiana --}}
<x-ui-flags.it class="w-6 h-4" />
{{-- Bandiera inglese --}}
<x-ui-flags.gb class="w-6 h-4" />- Registrazione automatica dei componenti
- Supporto per tutte le bandiere del mondo
- Dimensioni ottimizzate
- Colori ufficiali
- ViewBox corretto per il mantenimento delle proporzioni
-
Dimensioni
- Utilizzare classi Tailwind per le dimensioni
- Mantenere le proporzioni originali (3:2)
- Esempio:
class="w-6 h-4"
-
Accessibilità
- Aggiungere attributi
aria-labelquando necessario - Fornire testo alternativo per screen reader
- Esempio:
<x-ui-flags.it class="w-6 h-4" aria-label="Bandiera italiana" />
- Aggiungere attributi
-
Performance
- Gli SVG sono ottimizzati
- Non richiedono richieste HTTP aggiuntive
- Caching automatico
-
Personalizzazione
- Possibilità di modificare i colori via CSS
- Supporto per classi Tailwind
- Esempio:
<x-ui-flags.it class="w-6 h-4 text-primary-600" />
Questo documento descrive i componenti UI disponibili nel modulo UI e le loro funzionalità principali.
Il componente RadioCollection offre un'alternativa avanzata ai radio button standard di Filament, permettendo visualizzazioni ricche e personalizzabili per ogni opzione.
- Template Personalizzabili: Ogni opzione può avere un template visivo personalizzato
- Accessibilità Completa: Supporto completo per screen reader e navigazione da tastiera
- Alpine.js Integration: Feedback visivo immediato con Alpine.js
- Performance Ottimizzate: Rendering efficiente anche con molte opzioni
- Type Safety: Comparazione type-safe per evitare problemi di type coercion
use Modules\UI\Filament\Forms\Components\RadioCollection;
RadioCollection::make('selection')
->options(collect([
(object)['id' => 1, 'name' => 'Opzione 1', 'description' => 'Descrizione 1'],
(object)['id' => 2, 'name' => 'Opzione 2', 'description' => 'Descrizione 2'],
]))
->valueKey('id')
->itemView('custom.item-template')
->required();// Template item personalizzato: resources/views/custom/item-template.blade.php
<div class="space-y-1">
<h4 class="font-medium text-gray-900 dark:text-gray-100">
{{ $item->name }}
</h4>
<p class="text-sm text-gray-500 dark:text-gray-400">
{{ $item->description }}
</p>
</div>options(Collection $options)- Imposta la collezione di opzionivalueKey(string $key)- Imposta la chiave da usare come valore (default: 'id')itemView(string $view)- Imposta il template personalizzato per ogni item
- Fisica Quantistica: Ogni opzione esiste in superposizione fino alla selezione
- Fenomenologia: Interfaccia progettata per minimizzare interruzioni cognitive
- Gestalt: Rispetta principi di prossimità, somiglianza e chiusura
- Zen: Design minimalista che riduce all'essenziale
📖 Documentazione Filosofica Completa
Componente per la selezione mutuamente esclusiva con interfaccia card personalizzabile.
use Modules\UI\Filament\Forms\Components\RadioCollection;
RadioCollection::make('selection')
->options(collect([
(object)['id' => 1, 'name' => 'Opzione 1', 'description' => 'Descrizione 1'],
(object)['id' => 2, 'name' => 'Opzione 2', 'description' => 'Descrizione 2'],
]))
->valueKey('id')
->itemView('custom.item-template')
->required();- Type Safety: Comparazione type-safe tra valori per evitare problemi di type coercion
- Accessibilità: Supporto completo per screen reader e navigazione keyboard
- Reattività: Alpine.js + Livewire per feedback immediato
- Personalizzazione: Template item completamente personalizzabile
- Fisica Quantistica: Ogni opzione esiste in superposizione fino alla selezione
- Fenomenologia: Interfaccia progettata per minimizzare interruzioni cognitive
- Gestalt: Rispetta principi di prossimità, somiglianza e chiusura
- Zen: Design minimalista che riduce all'essenziale
📖 Documentazione Filosofica Completa
Il componente LocationSelector facilita la selezione di posizioni geografiche con supporto per autocompletamento e validazione.
- Autocompletamento integrato
- Validazione coordinate
- Supporto mappe integrate
- Geocoding automatico
LocationSelector::make('address')
->enableMap()
->required();- Riutilizzabilità: Progettare componenti modulari e riutilizzabili
- Accessibilità: Seguire sempre le linee guida WCAG 2.1
- Performance: Ottimizzare il rendering e la reattività
- Documentazione: Mantenere documentazione aggiornata con esempi
Modules/UI/resources/views/components/ui/
├── buttons/
├── cards/
├── forms/
└── layout/
Tutti i componenti UI condivisi devono essere posizionati in Modules/UI/resources/views/components/ui/ seguendo la struttura modulare.
Documentazione aggiornata: Dicembre 2024