Transform Filament's default authentication pages into stunning, brand-ready experiences with customizable layouts, media backgrounds, and theme switching.
Note: This package is designed exclusively for Filament v4. For changes and updates, see the CHANGELOG.
composer require caresome/filament-auth-designer
Add to your Panel Provider (e.g., app/Providers/Filament/AdminPanelProvider.php):
use Caresome\FilamentAuthDesigner\AuthDesignerPlugin;use Caresome\FilamentAuthDesigner\Data\AuthPageConfig;use Caresome\FilamentAuthDesigner\Enums\MediaPosition; public function panel(Panel $panel): Panel{ return $panel ->plugin( AuthDesignerPlugin::make() ->login(fn (AuthPageConfig $config) => $config ->media(asset('assets/background.jpg')) ->mediaPosition(MediaPosition::Cover) ->blur(8) ) );}
Use MediaPosition to control where your media appears:
| Position | Description | Size Applied As |
|---|---|---|
| Left | Media on left, form on right | Width |
| Right | Media on right, form on left | Width |
| Top | Media at top, form below | Height |
| Bottom | Media at bottom, form above | Height |
| Cover | Fullscreen background with centered form | Ignored |
CovermediaSize() is ignored (fullscreen)use Caresome\FilamentAuthDesigner\Enums\MediaPosition; ->login(fn ($config) => $config ->media(asset('assets/image.jpg')) ->mediaPosition(MediaPosition::Left) ->mediaSize('50%') // Media takes 50% width)
->login(fn ($config) => $config ->media(asset('assets/image.jpg')) ->mediaPosition(MediaPosition::Right) ->mediaSize('40%'))
->login(fn ($config) => $config ->media(asset('assets/banner.jpg')) ->mediaPosition(MediaPosition::Top) ->mediaSize('250px') // Banner height)
->login(fn ($config) => $config ->media(asset('assets/footer.jpg')) ->mediaPosition(MediaPosition::Bottom) ->mediaSize('200px'))
->login(fn ($config) => $config ->media(asset('assets/fullscreen.jpg')) ->mediaPosition(MediaPosition::Cover) ->blur(8) // Optional: 0-20)
Use any valid CSS unit for mediaSize():
->mediaSize('400px') // Pixels->mediaSize('30vh') // Viewport height->mediaSize('20rem') // Rem units
Set defaults that apply to all auth pages, then override specific pages as needed:
AuthDesignerPlugin::make() ->defaults(fn ($config) => $config ->media(asset('assets/default-bg.jpg')) ->mediaPosition(MediaPosition::Cover) ->blur(8) ) ->login() // Uses defaults ->registration() // Uses defaults ->passwordReset(fn ($config) => $config ->mediaPosition(MediaPosition::Left) // Override position ->mediaSize('45%') ) ->emailVerification() // Uses defaults ->themeToggle()
Use your own custom auth page classes while keeping the plugin's layout features. This is useful when you need to customize the form (e.g., using username instead of email).
use Caresome\FilamentAuthDesigner\Pages\Auth\Login; class CustomLogin extends Login{ public function form(Schema $schema): Schema { return $schema->components([ TextInput::make('username')->label('Username')->required(), $this->getPasswordFormComponent(), $this->getRememberFormComponent(), ]); } protected function getCredentialsFromFormData(array $data): array { return [ 'username' => $data['username'], 'password' => $data['password'], ]; }} // In your panel provider:AuthDesignerPlugin::make() ->login(fn ($config) => $config ->media(asset('assets/login-bg.jpg')) ->mediaPosition(MediaPosition::Cover) ->usingPage(CustomLogin::class) )
use Caresome\FilamentAuthDesigner\Concerns\HasAuthDesignerLayout;use Filament\Pages\Auth\Login; class CustomLogin extends Login{ use HasAuthDesignerLayout; protected function getAuthDesignerPageKey(): string { return 'login'; } // Your customizations...} // In your panel provider:AuthDesignerPlugin::make() ->login(fn ($config) => $config ->usingPage(CustomLogin::class) )
Supported formats: .jpg, .jpeg, .png, .webp, .gif, .svg, .avif
->login(fn ($config) => $config ->media(asset('assets/background.jpg')))
Supported formats: .mp4, .webm, .mov, .ogg
Videos auto-play, loop continuously, and are muted by default.
->login(fn ($config) => $config ->media(asset('assets/video.mp4')))
->login(fn ($config) => $config ->media(asset('assets/background.jpg'), alt: 'Company branding image'))
Enable light/dark/system theme switcher:
->themeToggle() // Default: Top Right (1.5rem)->themeToggle(bottom: '2rem', right: '2rem') // Custom position->themeToggle(top: '1rem', left: '1rem') // Top Left
You can position the theme switcher anywhere on the screen by passing top, bottom, left, or right CSS values. Defaults to auto if not specified.
You can also override the theme switcher position for specific pages:
->login(fn ($config) => $config ->themeToggle(bottom: '2rem', left: '2rem'))
AuthDesignerPlugin::make() ->defaults(fn ($config) => $config ->media(asset('assets/auth-bg.jpg')) ->mediaPosition(MediaPosition::Cover) ->blur(10) ) ->login() ->registration() ->passwordReset() ->emailVerification() ->themeToggle()
AuthDesignerPlugin::make() ->defaults(fn ($config) => $config ->media(asset('assets/default-bg.jpg')) ->mediaPosition(MediaPosition::Right) ->mediaSize('50%') ) ->login(fn ($config) => $config ->media(asset('assets/login.jpg'), alt: 'Welcome back') ->mediaPosition(MediaPosition::Cover) ->blur(8) ) ->registration(fn ($config) => $config ->media(asset('assets/register.jpg')) ->mediaPosition(MediaPosition::Left) ->mediaSize('45%') ) ->passwordReset(fn ($config) => $config ->media(asset('assets/reset.jpg')) ->mediaPosition(MediaPosition::Top) ->mediaSize('200px') ) ->emailVerification() // Uses defaults ->profile(fn ($config) => $config ->media(asset('assets/profile-bg.jpg')) ->mediaPosition(MediaPosition::Right) ) ->themeToggle(bottom: '2rem', right: '2rem')
| Method | Description |
|---|---|
->defaults() |
Set global defaults for all pages |
->login() |
Configure login page |
->registration() |
Configure registration page |
->passwordReset() |
Configure password reset pages |
->emailVerification() |
Configure email verification page |
->profile() |
Configure profile page |
->themeToggle() |
Enable theme switcher (defaults to top-right, customizable) |
| Option | Description | Notes |
|---|---|---|
->media() |
Set background image/video URL | First param is URL, second is alt text |
->mediaPosition() |
Set media position | Left, Right, Top, Bottom, Cover |
->mediaSize() |
Set media size | px/vh/rem; ignored for Cover |
->blur() |
Blur intensity (0-20) | Applies to all positions |
->usingPage() |
Use custom page class | For custom auth pages |
->themeToggle() |
Set theme switcher position | Per-page override |
Inject custom Blade content at specific positions within auth layouts:
use Caresome\FilamentAuthDesigner\View\AuthDesignerRenderHook; AuthDesignerPlugin::make() ->login(fn ($config) => $config ->media(asset('images/login-bg.jpg')) ->mediaPosition(MediaPosition::Cover) ->renderHook(AuthDesignerRenderHook::CardBefore, fn () => view('auth.branding')) )
Note:
CardBeforeandCardAfterare specific to the Cover layout where the form is inside a card. For other layouts (Left, Right, etc.), where the form is not inside a card, use Filament's native render hooks:
PanelsRenderHook::AUTH_LOGIN_FORM_BEFOREPanelsRenderHook::AUTH_LOGIN_FORM_AFTER
| Hook | Description | Available In |
|---|---|---|
MediaOverlay |
Overlay content on top of media | All layouts with media |
CardBefore |
Above the login card | Cover position only |
CardAfter |
Below the login card | Cover position only |
Add branding above the login card (Cover position):
->login(fn ($config) => $config ->renderHook(AuthDesignerRenderHook::CardBefore, fn () => view('auth.branding')))
Add company logo overlay on media:
->login(fn ($config) => $config ->renderHook(AuthDesignerRenderHook::MediaOverlay, fn () => view('auth.logo-overlay')))
Multiple hooks at the same position:
->login(fn ($config) => $config ->renderHook(AuthDesignerRenderHook::CardBefore, fn () => view('auth.logo')) ->renderHook(AuthDesignerRenderHook::CardBefore, fn () => view('auth.welcome-message')))
Images not displaying:
asset('path/to/image.jpg')public/ directoryphp artisan cache:clearLayout not applying:
php artisan view:clearMediaPosition::Cover (not string)Videos not auto-playing:
Blur effect not working:
Custom page not using layout:
HasAuthDesignerLayout trait->usingPage() in the configMedia size not applying:
mediaSize() is ignored for Cover positioncomposer test # Run testscomposer analyse # Run PHPStancomposer format # Format code with Pint
The MIT License (MIT). Please see License File for more information.