tonegabes/filament-better-options
O Filament Better Options inclui um sistema avançado e extensível para gerenciamento de ícones que permite:
┌─────────────────────────────────────────────────────────┐
│ IconManager │
│ (Coordena todos os provedores de ícones) │
└─────────────────────────────────────────────────────────┘
│
┌───────────────────┼───────────────────┐
│ │ │
┌───────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ PhosphorIcon │ │ HeroIconProvider │ │ CustomProvider │
│ Provider │ │ │ │ (Seu) │
└───────────────┘ └─────────────────┘ └─────────────────┘
// config/better-options.php
return [
'icons' => [
'default_provider' => 'phosphor', // ou 'heroicons'
'providers' => [
'phosphor' => \ToneGabes\BetterOptions\IconProviders\PhosphorIconProvider::class,
'heroicons' => \ToneGabes\BetterOptions\IconProviders\HeroIconProvider::class,
// Adicione seus provedores personalizados aqui
],
'defaults' => [
'checkbox_idle' => 'phosphor-square',
'checkbox_selected' => 'phosphor-check-square-fill',
'radio_idle' => 'phosphor-circle',
'radio_selected' => 'phosphor-check-circle-fill',
],
],
];
# .env
BETTER_OPTIONS_ICON_PROVIDER=phosphor
BETTER_OPTIONS_CACHE_ICONS=true
BETTER_OPTIONS_DEBUG=false
use ToneGabes\BetterOptions\Forms\Components\CheckboxCards;
CheckboxCards::make('features')
->options([
'performance' => 'Alta Performance',
'security' => 'Segurança Avançada',
'scalability' => 'Escalabilidade',
])
->icons([
'performance' => 'phosphor-lightning',
'security' => 'heroicon-o-shield-check',
'scalability' => 'phosphor-trending-up',
])
->useIconProvider('phosphor'); // Provedor preferido
CheckboxCards::make('options')
->options($options)
->theme('modern'); // minimal, modern, classic
// Equivale a:
CheckboxCards::make('options')
->options($options)
->iconBefore()
->indicatorAfter()
->itemsCenter();
use ToneGabes\BetterOptions\Facades\BetterOptionsIcon;
// Resolver um ícone
$icon = BetterOptionsIcon::resolveIcon('lightning');
// Obter ícones padrão
$defaults = BetterOptionsIcon::getDefaultIcons();
// Verificar se um ícone é suportado
$isSupported = BetterOptionsIcon::isSupported('phosphor-heart');
<?php
namespace App\IconProviders;
use ToneGabes\BetterOptions\Contracts\IconProvider;
class FontAwesomeIconProvider implements IconProvider
{
public function getName(): string
{
return 'fontawesome';
}
public function getDefaultIcons(): array
{
return [
'checkbox_idle' => 'fas fa-square',
'checkbox_selected' => 'fas fa-check-square',
'radio_idle' => 'far fa-circle',
'radio_selected' => 'fas fa-dot-circle',
'search' => 'fas fa-search',
'loading' => 'fas fa-spinner fa-spin',
];
}
public function supports(string $iconName): bool
{
return str_starts_with($iconName, 'fa-') ||
str_starts_with($iconName, 'fas ') ||
str_starts_with($iconName, 'far ') ||
str_starts_with($iconName, 'fab ');
}
public function resolveIcon(string $iconName): string
{
if ($this->supports($iconName)) {
return $iconName;
}
// Adiciona prefixo padrão se necessário
return 'fas fa-' . str_replace('_', '-', $iconName);
}
public function getAvailableIcons(): array
{
return [
'heart' => 'fas fa-heart',
'star' => 'fas fa-star',
'user' => 'fas fa-user',
'home' => 'fas fa-home',
// ... mais ícones
];
}
}
// config/better-options.php
'providers' => [
'phosphor' => \ToneGabes\BetterOptions\IconProviders\PhosphorIconProvider::class,
'heroicons' => \ToneGabes\BetterOptions\IconProviders\HeroIconProvider::class,
'fontawesome' => \App\IconProviders\FontAwesomeIconProvider::class,
],
CheckboxCards::make('social')
->options([
'facebook' => 'Facebook',
'twitter' => 'Twitter',
'instagram' => 'Instagram',
])
->icons([
'facebook' => 'fab fa-facebook',
'twitter' => 'fab fa-twitter',
'instagram' => 'fab fa-instagram',
])
->useIconProvider('fontawesome');
O sistema inclui cache automático para resolução de ícones:
// config/better-options.php
'performance' => [
'cache_icons' => true,
'cache_ttl' => 60, // minutos
],
Em modo de desenvolvimento, o sistema pode validar se todos os ícones existem:
// config/better-options.php
'development' => [
'validate_icons' => true,
'debug' => true,
],
// Obter informações de debug de um componente
$component = CheckboxCards::make('test')
->icons(['option1' => 'phosphor-heart']);
$debugInfo = $component->getDebugInfo();
// Retorna estatísticas de ícones, indicadores e erros de validação
// Estatísticas globais do IconManager
$stats = BetterOptionsIcon::getStats();
use ToneGabes\BetterOptions\Facades\BetterOptionsIcon;
// Em um Service Provider
BetterOptionsIcon::registerProvider(new CustomIconProvider());
BetterOptionsIcon::setDefaultProvider('custom');
->theme('minimal')
->theme('modern')
->theme('classic')
CheckboxCards::make('options')
->iconBefore() // ou ->iconAfter()
->indicatorAfter() // ou ->indicatorBefore()
->itemsCenter() // centralizar conteúdo
->partiallyHiddenIndicator() // indicadores sutis
->hiddenIcon() // ocultar ícones
->hiddenIndicator(); // ocultar indicadores
O novo sistema mantém compatibilidade com o código existente:
// Código antigo - ainda funciona
CheckboxCards::make('options')
->icons(['option1' => 'heroicon-o-heart'])
->idleIndicator('heroicon-o-circle')
->selectedIndicator('heroicon-o-check-circle');
// Novo sistema - mais flexível
CheckboxCards::make('options')
->icons(['option1' => 'heart']) // Resolução automática
->useIconProvider('phosphor')
->theme('modern');
// Validar configuração
$errors = $component->validateIcons();
if (!empty($errors)) {
foreach ($errors as $error) {
logger()->warning($error);
}
}
// Estatísticas de performance
$stats = BetterOptionsIcon::getStats();
echo "Total de provedores: " . $stats['total_providers'];
echo "Provedor padrão: " . $stats['default_provider'];
foreach ($stats['providers'] as $name => $info) {
echo "{$name}: {$info['available_icons_count']} ícones disponíveis";
}
// Categorias de produtos com Phosphor
CheckboxCards::make('categories')
->options([
'electronics' => 'Eletrônicos',
'clothing' => 'Roupas',
'books' => 'Livros',
])
->icons([
'electronics' => 'device-mobile',
'clothing' => 'tshirt',
'books' => 'book',
])
->useIconProvider('phosphor')
->theme('modern');
// Métodos de pagamento com Heroicons
RadioCards::make('payment_method')
->options([
'credit' => 'Cartão de Crédito',
'debit' => 'Cartão de Débito',
'pix' => 'PIX',
])
->icons([
'credit' => 'heroicon-o-credit-card',
'debit' => 'heroicon-o-banknotes',
'pix' => 'heroicon-o-qr-code',
])
->useIconProvider('heroicons');
CheckboxCards::make('permissions')
->options([
'read' => 'Leitura',
'write' => 'Escrita',
'delete' => 'Exclusão',
'admin' => 'Administrador',
])
->icons([
'read' => 'eye',
'write' => 'pencil',
'delete' => 'trash',
'admin' => 'crown',
])
->descriptions([
'read' => 'Visualizar conteúdo',
'write' => 'Criar e editar',
'delete' => 'Remover itens',
'admin' => 'Controle total',
])
->theme('minimal')
->searchable()
->bulkToggleable();
Para contribuir com novos provedores de ícones:
IconProviderclass CustomIconProviderTest extends TestCase
{
public function test_provider_supports_icons()
{
$provider = new CustomIconProvider();
$this->assertTrue($provider->supports('custom-icon'));
$this->assertFalse($provider->supports('invalid-icon'));
}
public function test_provider_resolves_icons()
{
$provider = new CustomIconProvider();
$resolved = $provider->resolveIcon('heart');
$this->assertEquals('custom-heart', $resolved);
}
}
Este sistema fornece uma base sólida e extensível para gerenciamento de ícones, permitindo que desenvolvedores personalizem completamente a aparência visual dos componentes Better Options.
How can I help you explore Laravel packages today?