From 5ae571f10b504f6d5362106ae7297344f118768d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=9Cmit=20Tun=C3=A7?= Date: Sat, 27 Sep 2025 13:14:49 -0300 Subject: [PATCH] Enhance Filament admin panel with new branding and CSS assets. Added brand logos for light and dark modes, integrated custom CSS for login page styling, and removed the obsolete TruncgilPanelProvider. Updated asset loading in the admin panel configuration. --- app/Providers/Filament/AdminPanelProvider.php | 7 +- .../Filament/TruncgilPanelProvider.php | 58 ---- public/css/app/citrus.css | 26 ++ public/css/filament/filament/custom.css | 26 ++ resources/css/citrus.css | 26 ++ .../filament/anonymous-partial.blade.php | 1 + .../views/vendor/filament/assets.blade.php | 19 ++ .../filament/components/actions.blade.php | 57 ++++ .../filament/components/avatar.blade.php | 18 ++ .../filament/components/badge.blade.php | 182 ++++++++++++ .../filament/components/breadcrumbs.blade.php | 44 +++ .../components/button/group.blade.php | 3 + .../components/button/index.blade.php | 237 ++++++++++++++++ .../vendor/filament/components/card.blade.php | 5 + .../components/dropdown/header.blade.php | 34 +++ .../components/dropdown/index.blade.php | 64 +++++ .../components/dropdown/list/index.blade.php | 3 + .../components/dropdown/list/item.blade.php | 150 ++++++++++ .../filament/components/fieldset.blade.php | 25 ++ .../filament/components/icon-button.blade.php | 138 +++++++++ .../vendor/filament/components/icon.blade.php | 7 + .../components/input/checkbox.blade.php | 26 ++ .../filament/components/input/index.blade.php | 14 + .../components/input/one-time-code.blade.php | 42 +++ .../filament/components/input/radio.blade.php | 14 + .../components/input/select.blade.php | 15 + .../components/input/wrapper.blade.php | 163 +++++++++++ .../vendor/filament/components/link.blade.php | 175 ++++++++++++ .../components/loading-indicator.blade.php | 1 + .../components/loading-section.blade.php | 14 + .../components/modal/description.blade.php | 5 + .../components/modal/heading.blade.php | 5 + .../filament/components/modal/index.blade.php | 267 ++++++++++++++++++ .../components/pagination/index.blade.php | 208 ++++++++++++++ .../components/pagination/item.blade.php | 39 +++ .../components/section/description.blade.php | 5 + .../components/section/heading.blade.php | 5 + .../components/section/index.blade.php | 138 +++++++++ .../filament/components/tabs/index.blade.php | 22 ++ .../filament/components/tabs/item.blade.php | 81 ++++++ .../filament/components/toggle.blade.php | 67 +++++ 41 files changed, 2377 insertions(+), 59 deletions(-) delete mode 100644 app/Providers/Filament/TruncgilPanelProvider.php create mode 100644 public/css/app/citrus.css create mode 100644 public/css/filament/filament/custom.css create mode 100644 resources/css/citrus.css create mode 100644 resources/views/vendor/filament/anonymous-partial.blade.php create mode 100644 resources/views/vendor/filament/assets.blade.php create mode 100644 resources/views/vendor/filament/components/actions.blade.php create mode 100644 resources/views/vendor/filament/components/avatar.blade.php create mode 100644 resources/views/vendor/filament/components/badge.blade.php create mode 100644 resources/views/vendor/filament/components/breadcrumbs.blade.php create mode 100644 resources/views/vendor/filament/components/button/group.blade.php create mode 100644 resources/views/vendor/filament/components/button/index.blade.php create mode 100644 resources/views/vendor/filament/components/card.blade.php create mode 100644 resources/views/vendor/filament/components/dropdown/header.blade.php create mode 100644 resources/views/vendor/filament/components/dropdown/index.blade.php create mode 100644 resources/views/vendor/filament/components/dropdown/list/index.blade.php create mode 100644 resources/views/vendor/filament/components/dropdown/list/item.blade.php create mode 100644 resources/views/vendor/filament/components/fieldset.blade.php create mode 100644 resources/views/vendor/filament/components/icon-button.blade.php create mode 100644 resources/views/vendor/filament/components/icon.blade.php create mode 100644 resources/views/vendor/filament/components/input/checkbox.blade.php create mode 100644 resources/views/vendor/filament/components/input/index.blade.php create mode 100644 resources/views/vendor/filament/components/input/one-time-code.blade.php create mode 100644 resources/views/vendor/filament/components/input/radio.blade.php create mode 100644 resources/views/vendor/filament/components/input/select.blade.php create mode 100644 resources/views/vendor/filament/components/input/wrapper.blade.php create mode 100644 resources/views/vendor/filament/components/link.blade.php create mode 100644 resources/views/vendor/filament/components/loading-indicator.blade.php create mode 100644 resources/views/vendor/filament/components/loading-section.blade.php create mode 100644 resources/views/vendor/filament/components/modal/description.blade.php create mode 100644 resources/views/vendor/filament/components/modal/heading.blade.php create mode 100644 resources/views/vendor/filament/components/modal/index.blade.php create mode 100644 resources/views/vendor/filament/components/pagination/index.blade.php create mode 100644 resources/views/vendor/filament/components/pagination/item.blade.php create mode 100644 resources/views/vendor/filament/components/section/description.blade.php create mode 100644 resources/views/vendor/filament/components/section/heading.blade.php create mode 100644 resources/views/vendor/filament/components/section/index.blade.php create mode 100644 resources/views/vendor/filament/components/tabs/index.blade.php create mode 100644 resources/views/vendor/filament/components/tabs/item.blade.php create mode 100644 resources/views/vendor/filament/components/toggle.blade.php diff --git a/app/Providers/Filament/AdminPanelProvider.php b/app/Providers/Filament/AdminPanelProvider.php index 234e721..1206467 100644 --- a/app/Providers/Filament/AdminPanelProvider.php +++ b/app/Providers/Filament/AdminPanelProvider.php @@ -27,6 +27,8 @@ class AdminPanelProvider extends PanelProvider ->id('admin') ->path('admin') ->default() + ->brandLogo(asset('logos/citrus-yatay.svg')) + ->darkModeBrandLogo(asset('logos/citrus-yatay-dark.svg')) ->colors([ 'primary' => Color::Amber, ]) @@ -54,6 +56,9 @@ class AdminPanelProvider extends PanelProvider ->authMiddleware([ Authenticate::class, ]) - ->login(); + ->login() + ->assets([ + \Filament\Support\Assets\Css::make('citrus', resource_path('css/citrus.css')), + ]); } } diff --git a/app/Providers/Filament/TruncgilPanelProvider.php b/app/Providers/Filament/TruncgilPanelProvider.php deleted file mode 100644 index f014790..0000000 --- a/app/Providers/Filament/TruncgilPanelProvider.php +++ /dev/null @@ -1,58 +0,0 @@ -id('truncgil') - ->path('truncgil') - ->colors([ - 'primary' => Color::Amber, - ]) - ->discoverResources(in: app_path('Filament/Truncgil/Resources'), for: 'App\Filament\Truncgil\Resources') - ->discoverPages(in: app_path('Filament/Truncgil/Pages'), for: 'App\Filament\Truncgil\Pages') - ->pages([ - Dashboard::class, - ]) - ->discoverWidgets(in: app_path('Filament/Truncgil/Widgets'), for: 'App\Filament\Truncgil\Widgets') - ->widgets([ - AccountWidget::class, - FilamentInfoWidget::class, - ]) - ->middleware([ - EncryptCookies::class, - AddQueuedCookiesToResponse::class, - StartSession::class, - AuthenticateSession::class, - ShareErrorsFromSession::class, - VerifyCsrfToken::class, - SubstituteBindings::class, - DisableBladeIconComponents::class, - DispatchServingFilamentEvent::class, - ]) - ->authMiddleware([ - Authenticate::class, - ]) - ->login(); - } -} diff --git a/public/css/app/citrus.css b/public/css/app/citrus.css new file mode 100644 index 0000000..115d0c3 --- /dev/null +++ b/public/css/app/citrus.css @@ -0,0 +1,26 @@ +/* Login sayfası logo boyutu */ +.fi-logo { + height: 6rem !important; + width: auto !important; +} + +/* Login sayfası brand logo boyutu */ +.fi-brand-logo { + height: 6rem !important; + width: auto !important; +} + +/* Login sayfası brand logo container */ +.fi-brand-logo-container { + display: flex; + justify-content: center; + align-items: center; + margin-bottom: 2rem; +} + +/* Login sayfası brand logo img */ +.fi-brand-logo img { + height: 6rem !important; + width: auto !important; + max-width: none !important; +} diff --git a/public/css/filament/filament/custom.css b/public/css/filament/filament/custom.css new file mode 100644 index 0000000..115d0c3 --- /dev/null +++ b/public/css/filament/filament/custom.css @@ -0,0 +1,26 @@ +/* Login sayfası logo boyutu */ +.fi-logo { + height: 6rem !important; + width: auto !important; +} + +/* Login sayfası brand logo boyutu */ +.fi-brand-logo { + height: 6rem !important; + width: auto !important; +} + +/* Login sayfası brand logo container */ +.fi-brand-logo-container { + display: flex; + justify-content: center; + align-items: center; + margin-bottom: 2rem; +} + +/* Login sayfası brand logo img */ +.fi-brand-logo img { + height: 6rem !important; + width: auto !important; + max-width: none !important; +} diff --git a/resources/css/citrus.css b/resources/css/citrus.css new file mode 100644 index 0000000..115d0c3 --- /dev/null +++ b/resources/css/citrus.css @@ -0,0 +1,26 @@ +/* Login sayfası logo boyutu */ +.fi-logo { + height: 6rem !important; + width: auto !important; +} + +/* Login sayfası brand logo boyutu */ +.fi-brand-logo { + height: 6rem !important; + width: auto !important; +} + +/* Login sayfası brand logo container */ +.fi-brand-logo-container { + display: flex; + justify-content: center; + align-items: center; + margin-bottom: 2rem; +} + +/* Login sayfası brand logo img */ +.fi-brand-logo img { + height: 6rem !important; + width: auto !important; + max-width: none !important; +} diff --git a/resources/views/vendor/filament/anonymous-partial.blade.php b/resources/views/vendor/filament/anonymous-partial.blade.php new file mode 100644 index 0000000..e588c8d --- /dev/null +++ b/resources/views/vendor/filament/anonymous-partial.blade.php @@ -0,0 +1 @@ +{!! value($html) !!} diff --git a/resources/views/vendor/filament/assets.blade.php b/resources/views/vendor/filament/assets.blade.php new file mode 100644 index 0000000..11de771 --- /dev/null +++ b/resources/views/vendor/filament/assets.blade.php @@ -0,0 +1,19 @@ +@if (isset($data)) + +@endif + +@foreach ($assets as $asset) + @if (! $asset->isLoadedOnRequest()) + {{ $asset->getHtml() }} + @endif +@endforeach + + diff --git a/resources/views/vendor/filament/components/actions.blade.php b/resources/views/vendor/filament/components/actions.blade.php new file mode 100644 index 0000000..aee116b --- /dev/null +++ b/resources/views/vendor/filament/components/actions.blade.php @@ -0,0 +1,57 @@ +@php + use Filament\Support\Enums\Alignment; +@endphp + +@props([ + 'actions' => [], + 'alignment' => Alignment::Start, + 'fullWidth' => false, +]) + +@php + if (is_array($actions)) { + $actions = array_filter( + $actions, + fn ($action): bool => $action->isVisible(), + ); + } + + if (! $alignment instanceof Alignment) { + $alignment = filled($alignment) ? (Alignment::tryFrom($alignment) ?? $alignment) : null; + } + + $hasActions = false; + + $hasSlot = ! \Filament\Support\is_slot_empty($slot); + $actionsAreHtmlable = $actions instanceof \Illuminate\Contracts\Support\Htmlable; + + if ($hasSlot) { + $hasActions = true; + } elseif ($actionsAreHtmlable) { + $hasActions = ! \Filament\Support\is_slot_empty($actions); + } else { + $hasActions = filled($actions); + } +@endphp + +@if ($hasActions) +
class([ + 'fi-ac', + 'fi-width-full' => $fullWidth, + ($alignment instanceof Alignment) ? "fi-align-{$alignment->value}" : (is_string($alignment) ? $alignment : null) => ! $fullWidth, + ]) + }} + > + @if ($hasSlot) + {{ $slot }} + @elseif ($actionsAreHtmlable) + {{ $actions }} + @else + @foreach ($actions as $action) + {{ $action }} + @endforeach + @endif +
+@endif diff --git a/resources/views/vendor/filament/components/avatar.blade.php b/resources/views/vendor/filament/components/avatar.blade.php new file mode 100644 index 0000000..657eba0 --- /dev/null +++ b/resources/views/vendor/filament/components/avatar.blade.php @@ -0,0 +1,18 @@ +@props([ + 'circular' => true, + 'size' => 'md', +]) + +class([ + 'fi-avatar', + 'fi-circular' => $circular, + match ($size) { + 'sm', 'md', 'lg' => "fi-size-{$size}", + default => $size, + }, + ]) + }} +/> diff --git a/resources/views/vendor/filament/components/badge.blade.php b/resources/views/vendor/filament/components/badge.blade.php new file mode 100644 index 0000000..ea27884 --- /dev/null +++ b/resources/views/vendor/filament/components/badge.blade.php @@ -0,0 +1,182 @@ +@php + use Filament\Support\Enums\IconPosition; + use Filament\Support\Enums\IconSize; + use Filament\Support\Enums\Size; + use Filament\Support\View\Components\BadgeComponent; + use Illuminate\View\ComponentAttributeBag; +@endphp + +@props([ + 'color' => 'primary', + 'deleteButton' => null, + 'disabled' => false, + 'form' => null, + 'formId' => null, + 'href' => null, + 'icon' => null, + 'iconAlias' => null, + 'iconPosition' => IconPosition::Before, + 'iconSize' => null, + 'keyBindings' => null, + 'loadingIndicator' => true, + 'size' => Size::Medium, + 'spaMode' => null, + 'tag' => 'span', + 'target' => null, + 'tooltip' => null, + 'type' => 'button', +]) + +@php + if (! $iconPosition instanceof IconPosition) { + $iconPosition = filled($iconPosition) ? (IconPosition::tryFrom($iconPosition) ?? $iconPosition) : null; + } + + if (! $size instanceof Size) { + $size = filled($size) ? (Size::tryFrom($size) ?? $size) : null; + } + + if (filled($iconSize) && (! $iconSize instanceof IconSize)) { + $iconSize = IconSize::tryFrom($iconSize) ?? $iconSize; + } + + $isDeletable = count($deleteButton?->attributes->getAttributes() ?? []) > 0; + + $wireTarget = $loadingIndicator ? $attributes->whereStartsWith(['wire:target', 'wire:click'])->filter(fn ($value): bool => filled($value))->first() : null; + + $hasLoadingIndicator = filled($wireTarget) || ($type === 'submit' && filled($form)); + + if ($hasLoadingIndicator) { + $loadingIndicatorTarget = html_entity_decode($wireTarget ?: $form, ENT_QUOTES); + } + + $hasTooltip = filled($tooltip); +@endphp + +<{{ $tag }} + @if (($tag === 'a') && (! ($disabled && $hasTooltip))) + {{ \Filament\Support\generate_href_html($href, $target === '_blank', $spaMode) }} + @endif + @if ($keyBindings) + x-bind:id="$id('key-bindings')" + x-mousetrap.global.{{ collect($keyBindings)->map(fn (string $keyBinding): string => str_replace('+', '-', $keyBinding))->implode('.') }}="document.getElementById($el.id).click()" + @endif + @if ($hasTooltip) + x-tooltip="{ + content: @js($tooltip), + theme: $store.theme, + }" + @endif + {{ + $attributes + ->merge([ + 'aria-disabled' => $disabled ? 'true' : null, + 'disabled' => $disabled && blank($tooltip), + 'form' => $tag === 'button' ? $formId : null, + 'type' => $tag === 'button' ? $type : null, + 'wire:loading.attr' => $tag === 'button' ? 'disabled' : null, + 'wire:target' => ($hasLoadingIndicator && $loadingIndicatorTarget) ? $loadingIndicatorTarget : null, + ], escape: false) + ->when( + $disabled && $hasTooltip, + fn (ComponentAttributeBag $attributes) => $attributes->filter( + fn (mixed $value, string $key): bool => ! str($key)->startsWith(['href', 'x-on:', 'wire:click']), + ), + ) + ->class([ + 'fi-badge', + 'fi-disabled' => $disabled, + ($size instanceof Size) ? "fi-size-{$size->value}" : (is_string($size) ? $size : ''), + ]) + ->color(BadgeComponent::class, $color) + }} +> + @if ($iconPosition === IconPosition::Before) + @if ($icon) + {{ + \Filament\Support\generate_icon_html($icon, $iconAlias, (new \Illuminate\View\ComponentAttributeBag([ + 'wire:loading.remove.delay.' . config('filament.livewire_loading_delay', 'default') => $hasLoadingIndicator, + 'wire:target' => $hasLoadingIndicator ? $loadingIndicatorTarget : false, + ])), size: $iconSize ?? \Filament\Support\Enums\IconSize::Small) + }} + @endif + + @if ($hasLoadingIndicator) + {{ + \Filament\Support\generate_loading_indicator_html((new \Illuminate\View\ComponentAttributeBag([ + 'wire:loading.delay.' . config('filament.livewire_loading_delay', 'default') => '', + 'wire:target' => $loadingIndicatorTarget, + ])), size: $iconSize ?? \Filament\Support\Enums\IconSize::Small) + }} + @endif + @endif + + + + {{ $slot }} + + + + @if ($isDeletable) + @php + $deleteButtonWireTarget = $deleteButton->attributes->whereStartsWith(['wire:target', 'wire:click'])->filter(fn ($value): bool => filled($value))->first(); + + $deleteButtonHasLoadingIndicator = filled($deleteButtonWireTarget); + + if ($deleteButtonHasLoadingIndicator) { + $deleteButtonLoadingIndicatorTarget = html_entity_decode($deleteButtonWireTarget, ENT_QUOTES); + } + @endphp + + + @elseif ($iconPosition === IconPosition::After) + @if ($icon) + {{ + \Filament\Support\generate_icon_html($icon, $iconAlias, (new \Illuminate\View\ComponentAttributeBag([ + 'wire:loading.remove.delay.' . config('filament.livewire_loading_delay', 'default') => $hasLoadingIndicator, + 'wire:target' => $hasLoadingIndicator ? $loadingIndicatorTarget : false, + ])), size: $iconSize ?? \Filament\Support\Enums\IconSize::Small) + }} + @endif + + @if ($hasLoadingIndicator) + {{ + \Filament\Support\generate_loading_indicator_html((new \Illuminate\View\ComponentAttributeBag([ + 'wire:loading.delay.' . config('filament.livewire_loading_delay', 'default') => '', + 'wire:target' => $loadingIndicatorTarget, + ])), size: $iconSize ?? \Filament\Support\Enums\IconSize::Small) + }} + @endif + @endif + diff --git a/resources/views/vendor/filament/components/breadcrumbs.blade.php b/resources/views/vendor/filament/components/breadcrumbs.blade.php new file mode 100644 index 0000000..1fe8911 --- /dev/null +++ b/resources/views/vendor/filament/components/breadcrumbs.blade.php @@ -0,0 +1,44 @@ +@php + use Illuminate\View\ComponentAttributeBag; + + use function Filament\Support\generate_icon_html; +@endphp + +@props([ + 'breadcrumbs' => [], +]) + + diff --git a/resources/views/vendor/filament/components/button/group.blade.php b/resources/views/vendor/filament/components/button/group.blade.php new file mode 100644 index 0000000..384f879 --- /dev/null +++ b/resources/views/vendor/filament/components/button/group.blade.php @@ -0,0 +1,3 @@ +
class(['fi-btn-group']) }}> + {{ $slot }} +
diff --git a/resources/views/vendor/filament/components/button/index.blade.php b/resources/views/vendor/filament/components/button/index.blade.php new file mode 100644 index 0000000..eea41fe --- /dev/null +++ b/resources/views/vendor/filament/components/button/index.blade.php @@ -0,0 +1,237 @@ +@php + use Filament\Support\Enums\IconPosition; + use Filament\Support\Enums\IconSize; + use Filament\Support\Enums\Size; + use Filament\Support\View\Components\BadgeComponent; + use Filament\Support\View\Components\ButtonComponent; + use Illuminate\View\ComponentAttributeBag; +@endphp + +@props([ + 'badge' => null, + 'badgeColor' => 'primary', + 'badgeSize' => Size::ExtraSmall, + 'color' => 'primary', + 'disabled' => false, + 'form' => null, + 'formId' => null, + 'href' => null, + 'icon' => null, + 'iconAlias' => null, + 'iconPosition' => IconPosition::Before, + 'iconSize' => null, + 'keyBindings' => null, + 'labeledFrom' => null, + 'labelSrOnly' => false, + 'loadingIndicator' => true, + 'outlined' => false, + 'size' => Size::Medium, + 'spaMode' => null, + 'tag' => 'button', + 'target' => null, + 'tooltip' => null, + 'type' => 'button', +]) + +@php + if (! $iconPosition instanceof IconPosition) { + $iconPosition = filled($iconPosition) ? (IconPosition::tryFrom($iconPosition) ?? $iconPosition) : null; + } + + if (! $size instanceof Size) { + $size = filled($size) ? (Size::tryFrom($size) ?? $size) : null; + } + + if (! $badgeSize instanceof Size) { + $badgeSize = filled($badgeSize) ? (Size::tryFrom($badgeSize) ?? $badgeSize) : null; + } + + if (filled($iconSize) && (! $iconSize instanceof IconSize)) { + $iconSize = IconSize::tryFrom($iconSize) ?? $iconSize; + } + + $iconSize ??= match ($size) { + Size::ExtraSmall, Size::Small => IconSize::Small, + default => null, + }; + + $wireTarget = $loadingIndicator ? $attributes->whereStartsWith(['wire:target', 'wire:click'])->filter(fn ($value): bool => filled($value))->first() : null; + + $hasFormProcessingLoadingIndicator = $type === 'submit' && filled($form); + $hasLoadingIndicator = filled($wireTarget) || $hasFormProcessingLoadingIndicator; + + if ($hasLoadingIndicator) { + $loadingIndicatorTarget = html_entity_decode($wireTarget ?: $form, ENT_QUOTES); + } + + $hasTooltip = filled($tooltip); +@endphp + +@if ($labeledFrom) + +@endif + +<{{ $tag }} + @if (($tag === 'a') && (! ($disabled && $hasTooltip))) + {{ \Filament\Support\generate_href_html($href, $target === '_blank', $spaMode) }} + @endif + @if ($keyBindings) + x-bind:id="$id('key-bindings')" + x-mousetrap.global.{{ collect($keyBindings)->map(fn (string $keyBinding): string => str_replace('+', '-', $keyBinding))->implode('.') }}="document.getElementById($el.id).click()" + @endif + @if ($hasTooltip) + x-tooltip="{ + content: @js($tooltip), + theme: $store.theme, + }" + @endif + @if ($hasFormProcessingLoadingIndicator) + x-data="filamentFormButton" + x-bind:class="{ 'fi-processing': isProcessing }" + @endif + {{ + $attributes + ->merge([ + 'aria-disabled' => $disabled ? 'true' : null, + 'aria-label' => $labelSrOnly ? trim(strip_tags($slot->toHtml())) : null, + 'disabled' => $disabled && blank($tooltip), + 'form' => $formId, + 'type' => $tag === 'button' ? $type : null, + 'wire:loading.attr' => $tag === 'button' ? 'disabled' : null, + 'wire:target' => ($hasLoadingIndicator && $loadingIndicatorTarget) ? $loadingIndicatorTarget : null, + 'x-bind:disabled' => $hasFormProcessingLoadingIndicator ? 'isProcessing' : null, + 'x-bind:aria-label' => ($labelSrOnly && $hasFormProcessingLoadingIndicator) ? ('isProcessing ? processingMessage : ' . \Illuminate\Support\Js::from(trim(strip_tags($slot->toHtml())))) : null, + ], escape: false) + ->when( + $disabled && $hasTooltip, + fn (ComponentAttributeBag $attributes) => $attributes->filter( + fn (mixed $value, string $key): bool => ! str($key)->startsWith(['href', 'x-on:', 'wire:click']), + ), + ) + ->class([ + 'fi-btn', + 'fi-disabled' => $disabled, + 'fi-outlined' => $outlined, + ($size instanceof Size) ? "fi-size-{$size->value}" : (is_string($size) ? $size : ''), + is_string($labeledFrom) ? "fi-labeled-from-{$labeledFrom}" : null, + ]) + ->color(app(ButtonComponent::class, ['isOutlined' => $outlined]), $color) + }} +> + @if ($iconPosition === IconPosition::Before) + @if ($icon) + {{ + \Filament\Support\generate_icon_html($icon, $iconAlias, (new \Illuminate\View\ComponentAttributeBag([ + 'wire:loading.remove.delay.' . config('filament.livewire_loading_delay', 'default') => $hasLoadingIndicator, + 'wire:target' => $hasLoadingIndicator ? $loadingIndicatorTarget : false, + ])), size: $iconSize) + }} + @endif + + @if ($hasLoadingIndicator) + {{ + \Filament\Support\generate_loading_indicator_html((new \Illuminate\View\ComponentAttributeBag([ + 'wire:loading.delay.' . config('filament.livewire_loading_delay', 'default') => '', + 'wire:target' => $loadingIndicatorTarget, + ])), size: $iconSize) + }} + @endif + + @if ($hasFormProcessingLoadingIndicator) + {{ + \Filament\Support\generate_loading_indicator_html((new \Illuminate\View\ComponentAttributeBag([ + 'x-cloak' => 'x-cloak', + 'x-show' => 'isProcessing', + ])), size: $iconSize) + }} + @endif + @endif + + @if (! $labelSrOnly) + @if ($hasFormProcessingLoadingIndicator) + + {{ $slot }} + + @else + {{ $slot }} + @endif + @endif + + @if ($hasFormProcessingLoadingIndicator && (! $labelSrOnly)) + + @endif + + @if ($iconPosition === IconPosition::After) + @if ($icon) + {{ + \Filament\Support\generate_icon_html($icon, $iconAlias, (new \Illuminate\View\ComponentAttributeBag([ + 'wire:loading.remove.delay.' . config('filament.livewire_loading_delay', 'default') => $hasLoadingIndicator, + 'wire:target' => $hasLoadingIndicator ? $loadingIndicatorTarget : false, + ])), size: $iconSize) + }} + @endif + + @if ($hasLoadingIndicator) + {{ + \Filament\Support\generate_loading_indicator_html((new \Illuminate\View\ComponentAttributeBag([ + 'wire:loading.delay.' . config('filament.livewire_loading_delay', 'default') => '', + 'wire:target' => $loadingIndicatorTarget, + ])), size: $iconSize) + }} + @endif + + @if ($hasFormProcessingLoadingIndicator) + {{ + \Filament\Support\generate_loading_indicator_html((new \Illuminate\View\ComponentAttributeBag([ + 'x-cloak' => 'x-cloak', + 'x-show' => 'isProcessing', + ])), size: $iconSize) + }} + @endif + @endif + + @if (filled($badge)) +
+ @if ($badge instanceof \Illuminate\View\ComponentSlot) + {{ $badge }} + @else + color(BadgeComponent::class, $badgeColor)->class([ + 'fi-badge', + ($badgeSize instanceof Size) ? "fi-size-{$badgeSize->value}" : (is_string($badgeSize) ? $badgeSize : ''), + ]) + }} + > + {{ $badge }} + + @endif +
+ @endif + diff --git a/resources/views/vendor/filament/components/card.blade.php b/resources/views/vendor/filament/components/card.blade.php new file mode 100644 index 0000000..2317921 --- /dev/null +++ b/resources/views/vendor/filament/components/card.blade.php @@ -0,0 +1,5 @@ + + {{ $slot }} + diff --git a/resources/views/vendor/filament/components/dropdown/header.blade.php b/resources/views/vendor/filament/components/dropdown/header.blade.php new file mode 100644 index 0000000..ade6953 --- /dev/null +++ b/resources/views/vendor/filament/components/dropdown/header.blade.php @@ -0,0 +1,34 @@ +@php + use Filament\Support\Enums\IconSize; + use Filament\Support\View\Components\DropdownComponent\HeaderComponent; + use Illuminate\View\ComponentAttributeBag; +@endphp + +@props([ + 'color' => 'gray', + 'icon' => null, + 'iconSize' => null, + 'tag' => 'div', +]) + +@php + if (! ($iconSize instanceof IconSize)) { + $iconSize = filled($iconSize) ? (IconSize::tryFrom($iconSize) ?? $iconSize) : null; + } +@endphp + +<{{ $tag }} + {{ + $attributes + ->class([ + 'fi-dropdown-header', + ]) + ->color(HeaderComponent::class, $color) + }} +> + {{ \Filament\Support\generate_icon_html($icon, size: $iconSize) }} + + + {{ $slot }} + + diff --git a/resources/views/vendor/filament/components/dropdown/index.blade.php b/resources/views/vendor/filament/components/dropdown/index.blade.php new file mode 100644 index 0000000..3a32c6a --- /dev/null +++ b/resources/views/vendor/filament/components/dropdown/index.blade.php @@ -0,0 +1,64 @@ +@props([ + 'availableHeight' => null, + 'availableWidth' => null, + 'flip' => true, + 'maxHeight' => null, + 'offset' => 8, + 'placement' => null, + 'shift' => false, + 'size' => false, + 'sizePadding' => 16, + 'teleport' => false, + 'trigger' => null, + 'width' => null, +]) + +@php + use Filament\Support\Enums\Width; + + $sizeConfig = collect([ + 'availableHeight' => $availableHeight, + 'availableWidth' => $availableWidth, + 'padding' => $sizePadding, + ])->filter()->toJson(); + + if (is_string($width)) { + $width = Width::tryFrom($width) ?? $width; + } +@endphp + +
class(['fi-dropdown']) }} +> +
attributes->class(['fi-dropdown-trigger']) }} + > + {{ $trigger }} +
+ + @if (! \Filament\Support\is_slot_empty($slot)) +
has('wire:key')) + wire:ignore.self + wire:key="{{ $attributes->get('wire:key') }}.panel" + @endif + @class([ + 'fi-dropdown-panel', + ($width instanceof Width) ? "fi-width-{$width->value}" : (is_string($width) ? $width : ''), + 'fi-scrollable' => $maxHeight || $size, + ]) + @style([ + "max-height: {$maxHeight}" => $maxHeight, + ]) + > + {{ $slot }} +
+ @endif +
diff --git a/resources/views/vendor/filament/components/dropdown/list/index.blade.php b/resources/views/vendor/filament/components/dropdown/list/index.blade.php new file mode 100644 index 0000000..f0ca5c4 --- /dev/null +++ b/resources/views/vendor/filament/components/dropdown/list/index.blade.php @@ -0,0 +1,3 @@ +
class(['fi-dropdown-list']) }}> + {{ $slot }} +
diff --git a/resources/views/vendor/filament/components/dropdown/list/item.blade.php b/resources/views/vendor/filament/components/dropdown/list/item.blade.php new file mode 100644 index 0000000..dad7ecd --- /dev/null +++ b/resources/views/vendor/filament/components/dropdown/list/item.blade.php @@ -0,0 +1,150 @@ +@php + use Filament\Support\Enums\IconSize; + use Filament\Support\Enums\Size; + use Filament\Support\View\Components\BadgeComponent; + use Filament\Support\View\Components\DropdownComponent\ItemComponent; + use Filament\Support\View\Components\DropdownComponent\ItemComponent\IconComponent; + use Illuminate\View\ComponentAttributeBag; +@endphp + +@props([ + 'badge' => null, + 'badgeColor' => 'primary', + 'badgeTooltip' => null, + 'color' => 'gray', + 'disabled' => false, + 'href' => null, + 'icon' => null, + 'iconAlias' => null, + 'iconColor' => null, + 'iconSize' => null, + 'image' => null, + 'keyBindings' => null, + 'loadingIndicator' => true, + 'spaMode' => null, + 'tag' => 'button', + 'target' => null, + 'tooltip' => null, +]) + +@php + if (filled($iconSize) && (! $iconSize instanceof IconSize)) { + $iconSize = IconSize::tryFrom($iconSize) ?? $iconSize; + } + + $iconColor ??= $color; + + $wireTarget = $loadingIndicator ? $attributes->whereStartsWith(['wire:target', 'wire:click'])->filter(fn ($value): bool => filled($value))->first() : null; + + $hasLoadingIndicator = filled($wireTarget); + + if ($hasLoadingIndicator) { + $loadingIndicatorTarget = html_entity_decode($wireTarget, ENT_QUOTES); + } + + $hasTooltip = filled($tooltip); +@endphp + +{!! ($tag === 'form') ? ('
only(['action', 'class', 'method', 'wire:submit'])->toHtml() . '>') : '' !!} + +@if ($tag === 'form') + @csrf +@endif + +<{{ ($tag === 'form') ? 'button' : $tag }} + @if (($tag === 'a') && (! ($disabled && $hasTooltip))) + {{ \Filament\Support\generate_href_html($href, $target === '_blank', $spaMode) }} + @endif + @if ($keyBindings) + x-bind:id="$id('key-bindings')" + x-mousetrap.global.{{ collect($keyBindings)->map(fn (string $keyBinding): string => str_replace('+', '-', $keyBinding))->implode('.') }}="document.getElementById($el.id).click()" + @endif + @if ($hasTooltip) + x-tooltip="{ + content: @js($tooltip), + theme: $store.theme, + }" + @endif + {{ + $attributes + ->when( + $tag === 'form', + fn (ComponentAttributeBag $attributes) => $attributes->except(['action', 'class', 'method', 'wire:submit']), + ) + ->merge([ + 'aria-disabled' => $disabled ? 'true' : null, + 'disabled' => $disabled && blank($tooltip), + 'type' => match ($tag) { + 'button' => 'button', + 'form' => 'submit', + default => null, + }, + 'wire:loading.attr' => $tag === 'button' ? 'disabled' : null, + 'wire:target' => ($hasLoadingIndicator && $loadingIndicatorTarget) ? $loadingIndicatorTarget : null, + ], escape: false) + ->when( + $disabled && $hasTooltip, + fn (ComponentAttributeBag $attributes) => $attributes->filter( + fn (mixed $value, string $key): bool => ! str($key)->startsWith(['href', 'x-on:', 'wire:click']), + ), + ) + ->class([ + 'fi-dropdown-list-item', + 'fi-disabled' => $disabled, + ]) + ->color(ItemComponent::class, $color) + }} +> + @if ($icon) + {{ + \Filament\Support\generate_icon_html($icon, $iconAlias, (new ComponentAttributeBag([ + 'wire:loading.remove.delay.' . config('filament.livewire_loading_delay', 'default') => $hasLoadingIndicator, + 'wire:target' => $hasLoadingIndicator ? $loadingIndicatorTarget : false, + ]))->color(IconComponent::class, $iconColor), size: $iconSize) + }} + @endif + + @if ($image) +
+ @endif + + @if ($hasLoadingIndicator) + {{ + \Filament\Support\generate_loading_indicator_html((new ComponentAttributeBag([ + 'wire:loading.delay.' . config('filament.livewire_loading_delay', 'default') => '', + 'wire:target' => $loadingIndicatorTarget, + ]))->color(IconComponent::class, $iconColor), size: $iconSize) + }} + @endif + + + {{ $slot }} + + + @if (filled($badge)) + @if ($badge instanceof \Illuminate\View\ComponentSlot) + {{ $badge }} + @else + color(BadgeComponent::class, $badgeColor)->class(['fi-badge']) }} + > + {{ $badge }} + + @endif + @endif + + +{!! ($tag === 'form') ? '
' : '' !!} diff --git a/resources/views/vendor/filament/components/fieldset.blade.php b/resources/views/vendor/filament/components/fieldset.blade.php new file mode 100644 index 0000000..85e5064 --- /dev/null +++ b/resources/views/vendor/filament/components/fieldset.blade.php @@ -0,0 +1,25 @@ +@props([ + 'contained' => true, + 'label' => null, + 'labelHidden' => false, + 'required' => false, +]) + +
class([ + 'fi-fieldset', + 'fi-fieldset-label-hidden' => $labelHidden, + 'fi-fieldset-not-contained' => ! $contained, + ]) + }} +> + @if (filled($label)) + + {{ $label }}@if ($required)* + @endif + + @endif + + {{ $slot }} +
diff --git a/resources/views/vendor/filament/components/icon-button.blade.php b/resources/views/vendor/filament/components/icon-button.blade.php new file mode 100644 index 0000000..5d63f7a --- /dev/null +++ b/resources/views/vendor/filament/components/icon-button.blade.php @@ -0,0 +1,138 @@ +@php + use Filament\Support\Enums\IconSize; + use Filament\Support\Enums\Size; + use Filament\Support\View\Components\BadgeComponent; + use Filament\Support\View\Components\IconButtonComponent; + use Illuminate\View\ComponentAttributeBag; +@endphp + +@props([ + 'badge' => null, + 'badgeColor' => 'primary', + 'badgeSize' => Size::ExtraSmall, + 'color' => 'primary', + 'disabled' => false, + 'form' => null, + 'formId' => null, + 'href' => null, + 'icon' => null, + 'iconAlias' => null, + 'iconSize' => null, + 'keyBindings' => null, + 'label' => null, + 'loadingIndicator' => true, + 'size' => Size::Medium, + 'spaMode' => null, + 'tag' => 'button', + 'target' => null, + 'tooltip' => null, + 'type' => 'button', +]) + +@php + if (! $size instanceof Size) { + $size = filled($size) ? (Size::tryFrom($size) ?? $size) : null; + } + + if (! $badgeSize instanceof Size) { + $badgeSize = filled($badgeSize) ? (Size::tryFrom($badgeSize) ?? $badgeSize) : null; + } + + if (filled($iconSize) && (! $iconSize instanceof IconSize)) { + $iconSize = IconSize::tryFrom($iconSize) ?? $iconSize; + } + + $iconSize ??= match ($size) { + Size::ExtraSmall => IconSize::Small, + Size::Large, Size::ExtraLarge => IconSize::Large, + default => null, + }; + + $wireTarget = $loadingIndicator ? $attributes->whereStartsWith(['wire:target', 'wire:click'])->filter(fn ($value): bool => filled($value))->first() : null; + + $hasLoadingIndicator = filled($wireTarget) || ($type === 'submit' && filled($form)); + + if ($hasLoadingIndicator) { + $loadingIndicatorTarget = html_entity_decode($wireTarget ?: $form, ENT_QUOTES); + } + + $hasTooltip = $hasTooltip = filled($tooltip); +@endphp + +<{{ $tag }} + @if (($tag === 'a') && (! ($disabled && $hasTooltip))) + {{ \Filament\Support\generate_href_html($href, $target === '_blank', $spaMode) }} + @endif + @if ($keyBindings) + x-bind:id="$id('key-bindings')" + x-mousetrap.global.{{ collect($keyBindings)->map(fn (string $keyBinding): string => str_replace('+', '-', $keyBinding))->implode('.') }}="document.getElementById($el.id).click()" + @endif + @if ($hasTooltip) + x-tooltip="{ + content: @js($tooltip), + theme: $store.theme, + }" + @endif + {{ + $attributes + ->merge([ + 'aria-disabled' => $disabled ? 'true' : null, + 'aria-label' => $label, + 'disabled' => $disabled && blank($tooltip), + 'form' => $formId, + 'type' => $tag === 'button' ? $type : null, + 'wire:loading.attr' => $tag === 'button' ? 'disabled' : null, + 'wire:target' => ($hasLoadingIndicator && $loadingIndicatorTarget) ? $loadingIndicatorTarget : null, + ], escape: false) + ->merge([ + 'title' => $hasTooltip ? null : $label, + ], escape: true) + ->when( + $disabled && $hasTooltip, + fn (ComponentAttributeBag $attributes) => $attributes->filter( + fn (mixed $value, string $key): bool => ! str($key)->startsWith(['href', 'x-on:', 'wire:click']), + ), + ) + ->class([ + 'fi-icon-btn', + 'fi-disabled' => $disabled, + ($size instanceof Size) ? "fi-size-{$size->value}" : (is_string($size) ? $size : ''), + ]) + ->color(IconButtonComponent::class, $color) + }} +> + {{ + \Filament\Support\generate_icon_html($icon, $iconAlias, (new \Illuminate\View\ComponentAttributeBag([ + 'wire:loading.remove.delay.' . config('filament.livewire_loading_delay', 'default') => $hasLoadingIndicator, + 'wire:target' => $hasLoadingIndicator ? $loadingIndicatorTarget : false, + ])), size: $iconSize) + }} + + @if ($hasLoadingIndicator) + {{ + \Filament\Support\generate_loading_indicator_html((new \Illuminate\View\ComponentAttributeBag([ + 'wire:loading.delay.' . config('filament.livewire_loading_delay', 'default') => '', + 'wire:target' => $loadingIndicatorTarget, + ])), size: $iconSize) + }} + @endif + + @if (filled($badge)) +
+ @if ($badge instanceof \Illuminate\View\ComponentSlot) + {{ $badge }} + @else + color(BadgeComponent::class, $badgeColor)->class([ + 'fi-badge', + ($badgeSize instanceof Size) ? "fi-size-{$badgeSize->value}" : (is_string($badgeSize) ? $badgeSize : ''), + ]) + }} + > + {{ $badge }} + + @endif +
+ @endif + diff --git a/resources/views/vendor/filament/components/icon.blade.php b/resources/views/vendor/filament/components/icon.blade.php new file mode 100644 index 0000000..8dd0c64 --- /dev/null +++ b/resources/views/vendor/filament/components/icon.blade.php @@ -0,0 +1,7 @@ +@props([ + 'alias' => null, + 'icon' => null, + 'size' => null, +]) + +{{ \Filament\Support\generate_icon_html($icon, $alias, $attributes, $size) }} diff --git a/resources/views/vendor/filament/components/input/checkbox.blade.php b/resources/views/vendor/filament/components/input/checkbox.blade.php new file mode 100644 index 0000000..1423a4d --- /dev/null +++ b/resources/views/vendor/filament/components/input/checkbox.blade.php @@ -0,0 +1,26 @@ +@props([ + 'alpineValid' => null, + 'valid' => true, +]) + +@php + $hasAlpineValidClasses = filled($alpineValid); +@endphp + +class([ + 'fi-checkbox-input', + 'fi-valid' => (! $hasAlpineValidClasses) && $valid, + 'fi-invalid' => (! $hasAlpineValidClasses) && (! $valid), + ]) + }} +/> diff --git a/resources/views/vendor/filament/components/input/index.blade.php b/resources/views/vendor/filament/components/input/index.blade.php new file mode 100644 index 0000000..ff30a0b --- /dev/null +++ b/resources/views/vendor/filament/components/input/index.blade.php @@ -0,0 +1,14 @@ +@props([ + 'inlinePrefix' => false, + 'inlineSuffix' => false, +]) + +class([ + 'fi-input', + 'fi-input-has-inline-prefix' => $inlinePrefix, + 'fi-input-has-inline-suffix' => $inlineSuffix, + ]) + }} +/> diff --git a/resources/views/vendor/filament/components/input/one-time-code.blade.php b/resources/views/vendor/filament/components/input/one-time-code.blade.php new file mode 100644 index 0000000..41783bc --- /dev/null +++ b/resources/views/vendor/filament/components/input/one-time-code.blade.php @@ -0,0 +1,42 @@ +@props([ + 'length' => 6, +]) + +
class([ + 'fi-one-time-code-input-ctn', + ]) + }} +> + @foreach (range(1, $length) as $digit) +
+ @endforeach + + +
diff --git a/resources/views/vendor/filament/components/input/radio.blade.php b/resources/views/vendor/filament/components/input/radio.blade.php new file mode 100644 index 0000000..6bfdac4 --- /dev/null +++ b/resources/views/vendor/filament/components/input/radio.blade.php @@ -0,0 +1,14 @@ +@props([ + 'valid' => true, +]) + +class([ + 'fi-radio-input', + 'fi-invalid' => ! $valid, + ]) + }} +/> diff --git a/resources/views/vendor/filament/components/input/select.blade.php b/resources/views/vendor/filament/components/input/select.blade.php new file mode 100644 index 0000000..4776de3 --- /dev/null +++ b/resources/views/vendor/filament/components/input/select.blade.php @@ -0,0 +1,15 @@ +@props([ + 'inlinePrefix' => false, + 'inlineSuffix' => false, +]) + + diff --git a/resources/views/vendor/filament/components/input/wrapper.blade.php b/resources/views/vendor/filament/components/input/wrapper.blade.php new file mode 100644 index 0000000..002521f --- /dev/null +++ b/resources/views/vendor/filament/components/input/wrapper.blade.php @@ -0,0 +1,163 @@ +@props([ + 'alpineDisabled' => null, + 'alpineValid' => null, + 'disabled' => false, + 'inlinePrefix' => false, + 'inlineSuffix' => false, + 'prefix' => null, + 'prefixActions' => [], + 'prefixIcon' => null, + 'prefixIconColor' => 'gray', + 'prefixIconAlias' => null, + 'suffix' => null, + 'suffixActions' => [], + 'suffixIcon' => null, + 'suffixIconColor' => 'gray', + 'suffixIconAlias' => null, + 'valid' => true, +]) + +@php + use Filament\Support\View\Components\InputComponent\WrapperComponent\IconComponent; + use Illuminate\View\ComponentAttributeBag; + + $prefixActions = array_filter( + $prefixActions, + fn (\Filament\Actions\Action $prefixAction): bool => $prefixAction->isVisible(), + ); + + $suffixActions = array_filter( + $suffixActions, + fn (\Filament\Actions\Action $suffixAction): bool => $suffixAction->isVisible(), + ); + + $hasPrefix = count($prefixActions) || $prefixIcon || filled($prefix); + $hasSuffix = count($suffixActions) || $suffixIcon || filled($suffix); + + $hasAlpineDisabledClasses = filled($alpineDisabled); + $hasAlpineValidClasses = filled($alpineValid); + $hasAlpineClasses = $hasAlpineDisabledClasses || $hasAlpineValidClasses; + + $wireTarget = $attributes->whereStartsWith(['wire:target'])->first(); + + $hasLoadingIndicator = filled($wireTarget); + + if ($hasLoadingIndicator) { + $loadingIndicatorTarget = html_entity_decode($wireTarget, ENT_QUOTES); + } +@endphp + +
except(['wire:target', 'tabindex']) + ->class([ + 'fi-input-wrp', + 'fi-disabled' => (! $hasAlpineClasses) && $disabled, + 'fi-invalid' => (! $hasAlpineClasses) && (! $valid), + ]) + }} +> + @if ($hasPrefix || $hasLoadingIndicator) + + @endif + +
$hasLoadingIndicator && (! $hasPrefix) && $inlinePrefix, + ]) + > + {{ $slot }} +
+ + @if ($hasSuffix) +
$inlineSuffix, + 'fi-input-wrp-suffix-has-label' => filled($suffix), + ]) + > + @if (filled($suffix)) + + {{ $suffix }} + + @endif + + {{ + \Filament\Support\generate_icon_html($suffixIcon, $suffixIconAlias, (new \Illuminate\View\ComponentAttributeBag) + ->merge([ + 'wire:loading.remove.delay.' . config('filament.livewire_loading_delay', 'default') => $hasLoadingIndicator, + 'wire:target' => $hasLoadingIndicator ? $loadingIndicatorTarget : false, + ], escape: false) + ->color(IconComponent::class, $suffixIconColor)) + }} + + @if (count($suffixActions)) +
+ @foreach ($suffixActions as $suffixAction) + {{ $suffixAction }} + @endforeach +
+ @endif +
+ @endif +
diff --git a/resources/views/vendor/filament/components/link.blade.php b/resources/views/vendor/filament/components/link.blade.php new file mode 100644 index 0000000..2615ae3 --- /dev/null +++ b/resources/views/vendor/filament/components/link.blade.php @@ -0,0 +1,175 @@ +@php + use Filament\Support\Enums\FontWeight; + use Filament\Support\Enums\IconPosition; + use Filament\Support\Enums\IconSize; + use Filament\Support\Enums\Size; + use Filament\Support\View\Components\BadgeComponent; + use Filament\Support\View\Components\LinkComponent; + use Illuminate\View\ComponentAttributeBag; +@endphp + +@props([ + 'badge' => null, + 'badgeColor' => 'primary', + 'badgeSize' => Size::ExtraSmall, + 'color' => 'primary', + 'disabled' => false, + 'form' => null, + 'formId' => null, + 'href' => null, + 'icon' => null, + 'iconAlias' => null, + 'iconPosition' => IconPosition::Before, + 'iconSize' => null, + 'keyBindings' => null, + 'labelSrOnly' => false, + 'loadingIndicator' => true, + 'size' => Size::Medium, + 'spaMode' => null, + 'tag' => 'a', + 'target' => null, + 'tooltip' => null, + 'type' => 'button', + 'weight' => null, +]) + +@php + if (! $iconPosition instanceof IconPosition) { + $iconPosition = filled($iconPosition) ? (IconPosition::tryFrom($iconPosition) ?? $iconPosition) : null; + } + + if (! $badgeSize instanceof Size) { + $badgeSize = filled($badgeSize) ? (Size::tryFrom($badgeSize) ?? $badgeSize) : null; + } + + if (! $size instanceof Size) { + $size = filled($size) ? (Size::tryFrom($size) ?? $size) : null; + } + + if (filled($iconSize) && (! $iconSize instanceof IconSize)) { + $iconSize = IconSize::tryFrom($iconSize) ?? $iconSize; + } + + $iconSize ??= match ($size) { + Size::ExtraSmall, Size::Small => IconSize::Small, + default => null, + }; + + if (! $weight instanceof FontWeight) { + $weight = filled($weight) ? (FontWeight::tryFrom($weight) ?? $weight) : null; + } + + $wireTarget = $loadingIndicator ? $attributes->whereStartsWith(['wire:target', 'wire:click'])->filter(fn ($value): bool => filled($value))->first() : null; + + $hasLoadingIndicator = filled($wireTarget) || ($type === 'submit' && filled($form)); + + if ($hasLoadingIndicator) { + $loadingIndicatorTarget = html_entity_decode($wireTarget ?: $form, ENT_QUOTES); + } + + $hasTooltip = filled($tooltip); +@endphp + +<{{ $tag }} + @if (($tag === 'a') && (! ($disabled && $hasTooltip))) + {{ \Filament\Support\generate_href_html($href, $target === '_blank', $spaMode) }} + @endif + @if ($keyBindings) + x-bind:id="$id('key-bindings')" + x-mousetrap.global.{{ collect($keyBindings)->map(fn (string $keyBinding): string => str_replace('+', '-', $keyBinding))->implode('.') }}="document.getElementById($el.id).click()" + @endif + @if ($hasTooltip) + x-tooltip="{ + content: @js($tooltip), + theme: $store.theme, + }" + @endif + {{ + $attributes + ->merge([ + 'aria-disabled' => $disabled ? 'true' : null, + 'disabled' => $disabled && blank($tooltip), + 'form' => $formId, + 'type' => $tag === 'button' ? $type : null, + 'wire:loading.attr' => $tag === 'button' ? 'disabled' : null, + 'wire:target' => ($hasLoadingIndicator && $loadingIndicatorTarget) ? $loadingIndicatorTarget : null, + ], escape: false) + ->when( + $disabled && $hasTooltip, + fn (ComponentAttributeBag $attributes) => $attributes->filter( + fn (mixed $value, string $key): bool => ! str($key)->startsWith(['href', 'x-on:', 'wire:click']), + ), + ) + ->class([ + 'fi-link', + 'fi-disabled' => $disabled, + ($size instanceof Size) ? "fi-size-{$size->value}" : (is_string($size) ? $size : ''), + ($weight instanceof FontWeight) ? "fi-font-{$weight->value}" : (is_string($weight) ? $weight : ''), + ]) + ->color(LinkComponent::class, $color) + }} +> + @if ($iconPosition === IconPosition::Before) + @if ($icon) + {{ + \Filament\Support\generate_icon_html($icon, $iconAlias, (new \Illuminate\View\ComponentAttributeBag([ + 'wire:loading.remove.delay.' . config('filament.livewire_loading_delay', 'default') => $hasLoadingIndicator, + 'wire:target' => $hasLoadingIndicator ? $loadingIndicatorTarget : false, + ])), size: $iconSize) + }} + @endif + + @if ($hasLoadingIndicator) + {{ + \Filament\Support\generate_loading_indicator_html((new \Illuminate\View\ComponentAttributeBag([ + 'wire:loading.delay.' . config('filament.livewire_loading_delay', 'default') => '', + 'wire:target' => $loadingIndicatorTarget, + ])), size: $iconSize) + }} + @endif + @endif + + @if (! $labelSrOnly) + {{ $slot }} + @endif + + @if ($iconPosition === IconPosition::After) + @if ($icon) + {{ + \Filament\Support\generate_icon_html($icon, $iconAlias, (new \Illuminate\View\ComponentAttributeBag([ + 'wire:loading.remove.delay.' . config('filament.livewire_loading_delay', 'default') => $hasLoadingIndicator, + 'wire:target' => $hasLoadingIndicator ? $loadingIndicatorTarget : false, + ])), size: $iconSize) + }} + @endif + + @if ($hasLoadingIndicator) + {{ + \Filament\Support\generate_loading_indicator_html((new \Illuminate\View\ComponentAttributeBag([ + 'wire:loading.delay.' . config('filament.livewire_loading_delay', 'default') => '', + 'wire:target' => $loadingIndicatorTarget, + ])), size: $iconSize) + }} + @endif + @endif + + @if (filled($badge)) + + @endif + +@trim diff --git a/resources/views/vendor/filament/components/loading-indicator.blade.php b/resources/views/vendor/filament/components/loading-indicator.blade.php new file mode 100644 index 0000000..b4aeeda --- /dev/null +++ b/resources/views/vendor/filament/components/loading-indicator.blade.php @@ -0,0 +1 @@ +{{ \Filament\Support\generate_loading_indicator_html($attributes) }} diff --git a/resources/views/vendor/filament/components/loading-section.blade.php b/resources/views/vendor/filament/components/loading-section.blade.php new file mode 100644 index 0000000..d2b436e --- /dev/null +++ b/resources/views/vendor/filament/components/loading-section.blade.php @@ -0,0 +1,14 @@ +@props([ + 'columnSpan' => [], + 'columnStart' => [], + 'height' => null, +]) + +
gridColumn($columnSpan, $columnStart) + ->class(['fi-section fi-loading-section']) + ->style(['height: ' . ($height ?? '8rem')]) + }} +>
diff --git a/resources/views/vendor/filament/components/modal/description.blade.php b/resources/views/vendor/filament/components/modal/description.blade.php new file mode 100644 index 0000000..1355014 --- /dev/null +++ b/resources/views/vendor/filament/components/modal/description.blade.php @@ -0,0 +1,5 @@ +

class(['fi-modal-description']) }} +> + {{ $slot }} +

diff --git a/resources/views/vendor/filament/components/modal/heading.blade.php b/resources/views/vendor/filament/components/modal/heading.blade.php new file mode 100644 index 0000000..a3127cd --- /dev/null +++ b/resources/views/vendor/filament/components/modal/heading.blade.php @@ -0,0 +1,5 @@ +

class(['fi-modal-heading']) }} +> + {{ $slot }} +

diff --git a/resources/views/vendor/filament/components/modal/index.blade.php b/resources/views/vendor/filament/components/modal/index.blade.php new file mode 100644 index 0000000..ec3489a --- /dev/null +++ b/resources/views/vendor/filament/components/modal/index.blade.php @@ -0,0 +1,267 @@ +@php + use Filament\Support\Enums\Alignment; + use Filament\Support\Enums\Width; + use Filament\Support\View\Components\ModalComponent\IconComponent; + use Illuminate\View\ComponentAttributeBag; +@endphp + +@props([ + 'alignment' => Alignment::Start, + 'ariaLabelledby' => null, + 'autofocus' => \Filament\Support\View\Components\ModalComponent::$isAutofocused, + 'closeButton' => \Filament\Support\View\Components\ModalComponent::$hasCloseButton, + 'closeByClickingAway' => \Filament\Support\View\Components\ModalComponent::$isClosedByClickingAway, + 'closeByEscaping' => \Filament\Support\View\Components\ModalComponent::$isClosedByEscaping, + 'closeEventName' => 'close-modal', + 'closeQuietlyEventName' => 'close-modal-quietly', + 'description' => null, + 'extraModalWindowAttributeBag' => null, + 'footer' => null, + 'footerActions' => [], + 'footerActionsAlignment' => Alignment::Start, + 'header' => null, + 'heading' => null, + 'icon' => null, + 'iconAlias' => null, + 'iconColor' => 'primary', + 'id' => null, + 'openEventName' => 'open-modal', + 'slideOver' => false, + 'stickyFooter' => false, + 'stickyHeader' => false, + 'trigger' => null, + 'visible' => true, + 'width' => 'sm', +]) + +@php + $hasContent = ! \Filament\Support\is_slot_empty($slot); + $hasDescription = filled($description); + $hasFooter = (! \Filament\Support\is_slot_empty($footer)) || (is_array($footerActions) && count($footerActions)) || (! is_array($footerActions) && (! \Filament\Support\is_slot_empty($footerActions))); + $hasHeading = filled($heading); + $hasIcon = filled($icon); + + if (! $alignment instanceof Alignment) { + $alignment = filled($alignment) ? (Alignment::tryFrom($alignment) ?? $alignment) : null; + } + + if (! $footerActionsAlignment instanceof Alignment) { + $footerActionsAlignment = filled($footerActionsAlignment) ? (Alignment::tryFrom($footerActionsAlignment) ?? $footerActionsAlignment) : null; + } + + if (is_string($width)) { + $width = Width::tryFrom($width) ?? $width; + } + + $closeEventHandler = filled($id) ? '$dispatch(' . \Illuminate\Support\Js::from($closeEventName) . ', { id: ' . \Illuminate\Support\Js::from($id) . ' })' : 'close()'; + + $wireSubmitHandler = $attributes->get('wire:submit.prevent'); + $attributes = $attributes->except(['wire:submit.prevent']); +@endphp + +@if ($trigger) + {!! '
' !!} + {{-- Avoid formatting issues with unclosed elements --}} + +
attributes->get('disabled')) + @if ($id) + x-on:click="$dispatch(@js($openEventName), { id: @js($id) })" + @else + x-on:click="$el.nextElementSibling.dispatchEvent(new CustomEvent(@js($openEventName)))" + @endif + @endif + {{ $trigger->attributes->except(['disabled'])->class(['fi-modal-trigger']) }} + > + {{ $trigger }} +
+@endif + + + +@if ($trigger) + {!! '
' !!} + {{-- Avoid formatting issues with unclosed elements --}} +@endif diff --git a/resources/views/vendor/filament/components/pagination/index.blade.php b/resources/views/vendor/filament/components/pagination/index.blade.php new file mode 100644 index 0000000..509a295 --- /dev/null +++ b/resources/views/vendor/filament/components/pagination/index.blade.php @@ -0,0 +1,208 @@ +@props([ + 'currentPageOptionProperty' => 'tableRecordsPerPage', + 'extremeLinks' => false, + 'paginator', + 'pageOptions' => [], +]) + +@php + use Illuminate\Contracts\Pagination\CursorPaginator; + + $isRtl = __('filament-panels::layout.direction') === 'rtl'; + $isSimple = ! $paginator instanceof \Illuminate\Pagination\LengthAwarePaginator; +@endphp + + diff --git a/resources/views/vendor/filament/components/pagination/item.blade.php b/resources/views/vendor/filament/components/pagination/item.blade.php new file mode 100644 index 0000000..f81314d --- /dev/null +++ b/resources/views/vendor/filament/components/pagination/item.blade.php @@ -0,0 +1,39 @@ +@props([ + 'active' => false, + 'ariaLabel' => null, + 'disabled' => false, + 'icon' => null, + 'iconAlias' => null, + 'label' => null, +]) + +
  • class([ + 'fi-pagination-item', + 'fi-disabled' => $disabled, + 'fi-active' => $active, + ]) + }} +> + +
  • diff --git a/resources/views/vendor/filament/components/section/description.blade.php b/resources/views/vendor/filament/components/section/description.blade.php new file mode 100644 index 0000000..089fe24 --- /dev/null +++ b/resources/views/vendor/filament/components/section/description.blade.php @@ -0,0 +1,5 @@ +

    class(['fi-section-header-description']) }} +> + {{ $slot }} +

    diff --git a/resources/views/vendor/filament/components/section/heading.blade.php b/resources/views/vendor/filament/components/section/heading.blade.php new file mode 100644 index 0000000..c4b2413 --- /dev/null +++ b/resources/views/vendor/filament/components/section/heading.blade.php @@ -0,0 +1,5 @@ +

    class(['fi-section-header-heading']) }} +> + {{ $slot }} +

    diff --git a/resources/views/vendor/filament/components/section/index.blade.php b/resources/views/vendor/filament/components/section/index.blade.php new file mode 100644 index 0000000..76efc62 --- /dev/null +++ b/resources/views/vendor/filament/components/section/index.blade.php @@ -0,0 +1,138 @@ +@php + use Filament\Support\Enums\Alignment; + use Filament\Support\Enums\IconSize; + use Filament\Support\View\Components\SectionComponent\IconComponent; + + use function Filament\Support\is_slot_empty; +@endphp + +@props([ + 'afterHeader' => null, + 'aside' => false, + 'collapsed' => false, + 'collapseId' => null, + 'collapsible' => false, + 'compact' => false, + 'contained' => true, + 'contentBefore' => false, + 'description' => null, + 'divided' => false, + 'footer' => null, + 'hasContentEl' => true, + 'heading' => null, + 'headingTag' => 'h2', + 'icon' => null, + 'iconColor' => 'gray', + 'iconSize' => null, + 'persistCollapsed' => false, + 'secondary' => false, +]) + +@php + if (filled($iconSize) && (! $iconSize instanceof IconSize)) { + $iconSize = IconSize::tryFrom($iconSize) ?? $iconSize; + } + + $hasDescription = filled((string) $description); + $hasHeading = filled($heading); + $hasIcon = filled($icon); + $hasHeader = $hasIcon || $hasHeading || $hasDescription || $collapsible || (! is_slot_empty($afterHeader)); +@endphp + +
    class([ + 'fi-section', + 'fi-section-not-contained' => ! $contained, + 'fi-section-has-content-before' => $contentBefore, + 'fi-section-has-header' => $hasHeader, + 'fi-aside' => $aside, + 'fi-compact' => $compact, + 'fi-collapsible' => $collapsible, + 'fi-divided' => $divided, + 'fi-secondary' => $secondary, + ]) + }} +> + @if ($hasHeader) +
    + {{ + \Filament\Support\generate_icon_html($icon, attributes: (new \Illuminate\View\ComponentAttributeBag) + ->color(IconComponent::class, $iconColor), size: $iconSize ?? IconSize::Large) + }} + + @if ($hasHeading || $hasDescription) +
    + @if ($hasHeading) + <{{ $headingTag }} class="fi-section-header-heading"> + {{ $heading }} + + @endif + + @if ($hasDescription) +

    + {{ $description }} +

    + @endif +
    + @endif + + @if (! is_slot_empty($afterHeader)) +
    + {{ $afterHeader }} +
    + @endif + + @if ($collapsible) + + @endif +
    + @endif + +
    + @if ($hasContentEl) +
    + {{ $slot }} +
    + @else + {{ $slot }} + @endif + + @if (! is_slot_empty($footer)) +
    + {{ $footer }} +
    + @endif +
    +
    diff --git a/resources/views/vendor/filament/components/tabs/index.blade.php b/resources/views/vendor/filament/components/tabs/index.blade.php new file mode 100644 index 0000000..56dcd47 --- /dev/null +++ b/resources/views/vendor/filament/components/tabs/index.blade.php @@ -0,0 +1,22 @@ +@props([ + 'contained' => false, + 'label' => null, + 'vertical' => false, +]) + + diff --git a/resources/views/vendor/filament/components/tabs/item.blade.php b/resources/views/vendor/filament/components/tabs/item.blade.php new file mode 100644 index 0000000..3cb559f --- /dev/null +++ b/resources/views/vendor/filament/components/tabs/item.blade.php @@ -0,0 +1,81 @@ +@php + use Filament\Support\Enums\IconPosition; +@endphp + +@props([ + 'active' => false, + 'alpineActive' => null, + 'badge' => null, + 'badgeColor' => null, + 'badgeTooltip' => null, + 'badgeIcon' => null, + 'badgeIconPosition' => IconPosition::Before, + 'href' => null, + 'icon' => null, + 'iconColor' => 'gray', + 'iconPosition' => IconPosition::Before, + 'spaMode' => null, + 'tag' => 'button', + 'target' => null, + 'type' => 'button', +]) + +@php + if (! $iconPosition instanceof IconPosition) { + $iconPosition = filled($iconPosition) ? (IconPosition::tryFrom($iconPosition) ?? $iconPosition) : null; + } + + $hasAlpineActiveClasses = filled($alpineActive); +@endphp + +<{{ $tag }} + @if ($tag === 'button') + type="{{ $type }}" + @elseif ($tag === 'a') + {{ \Filament\Support\generate_href_html($href, $target === '_blank', $spaMode) }} + @endif + @if ($hasAlpineActiveClasses) + x-bind:class="{ + 'fi-active': {{ $alpineActive }}, + }" + @endif + {{ + $attributes + ->merge([ + 'aria-selected' => $active, + 'role' => 'tab', + ]) + ->class([ + 'fi-tabs-item', + 'fi-active' => (! $hasAlpineActiveClasses) && $active, + ]) + }} +> + @if ($icon && $iconPosition === IconPosition::Before) + {{ \Filament\Support\generate_icon_html($icon) }} + @endif + + + {{ $slot }} + + + @if ($icon && $iconPosition === IconPosition::After) + {{ \Filament\Support\generate_icon_html($icon) }} + @endif + + @if (filled($badge)) + @if ($badge instanceof \Illuminate\View\ComponentSlot) + {{ $badge }} + @else + + {{ $badge }} + + @endif + @endif + diff --git a/resources/views/vendor/filament/components/toggle.blade.php b/resources/views/vendor/filament/components/toggle.blade.php new file mode 100644 index 0000000..348e76f --- /dev/null +++ b/resources/views/vendor/filament/components/toggle.blade.php @@ -0,0 +1,67 @@ +@php + use Filament\Support\View\Components\ToggleComponent; + use Illuminate\Support\Arr; +@endphp + +@props([ + 'state', + 'offColor' => 'gray', + 'offIcon' => null, + 'onColor' => 'primary', + 'onIcon' => null, +]) + + + +@if ($state) +
    +
    + + + +
    +
    +@endif