Installation:
composer require njxqlus/filament-lightbox
Publish the config (optional but recommended for customization):
php artisan vendor:publish --tag="filament-lightbox-config"
First Use Case:
Replace a standard ImageEntry in a Filament Infolist with LightboxImageEntry:
use Njxqlus\Filament\Components\Infolists\LightboxImageEntry;
LightboxImageEntry::make('Image')
->href($model->image_url)
->image($model->image_url)
->imageWidth(300) // Optional: Set thumbnail width
->imageHeight(300) // Optional: Set thumbnail height
Spatie Media Library Integration:
For Spatie Media Library models, use the LightboxMediaEntry:
use Njxqlus\Filament\Components\Infolists\LightboxMediaEntry;
LightboxMediaEntry::make('Image')
->model($model)
->attribute('image') // Spatie Media Library attribute
Replace any ImageEntry with LightboxImageEntry to enable lightbox functionality:
Infolist::make()
->schema([
LightboxImageEntry::make('Profile Picture')
->href($user->profile_photo_url)
->image($user->profile_photo_url),
]);
Use LightboxImageEntry in Table columns for clickable thumbnails:
use Njxqlus\Filament\Tables\Columns\LightboxImageColumn;
Tables\Columns\LightboxImageColumn::make('thumbnail')
->href(fn ($record) => $record->image_url)
->image(fn ($record) => $record->image_url)
->width(80)
->height(80),
Leverage LightboxMediaEntry for models using Spatie Media Library:
LightboxMediaEntry::make('Cover Image')
->model($post)
->attribute('cover_image') // Spatie attribute
->openable() // Optional: Allow lightbox to open on click
->width(400)
->height(300),
Publish the config (filament-lightbox.php) to customize:
// config/filament-lightbox.php
return [
'lightbox_options' => [
'zoom' => true,
'share' => false,
'counter' => true,
],
];
Use LightboxImageEntry in Form sections for previewing uploaded images:
Form::make()
->schema([
LightboxImageEntry::make('Preview')
->href(fn ($record) => $record->image_url ?? null)
->image(fn ($record) => $record->image_url ?? null)
->hiddenLabel(),
]);
->lazy() on LightboxImageEntry for better performance with large datasets.width and height based on screen size using Filament’s responsive helpers:
->width(200)->responsive(['md' => 300, 'lg' => 400])
->image(fn ($record) => $record->image_url ?? asset('images/default.png'))
Lightbox component (see Gotchas).Missing href Attribute:
href() is not set.->href() with a valid URL, even if it’s the same as the image URL.
->href($model->image_url)
->image($model->image_url)
Spatie Media Library Caching:
getFirstMediaUrl() or similar method returns the correct URL. Cached thumbnails may not update immediately.php artisan cache:clear
php artisan media:regenerate-thumbnails
CSS Conflicts:
.filament-lightbox .lb-image {
filter: brightness(0) invert(1); /* Dark mode fix */
}
Lightbox Not Opening:
href or image attributes.// Check if lightbox is initialized
console.log(document.querySelectorAll('.filament-lightbox'));
Custom Lightbox Templates:
php artisan vendor:publish --tag="filament-lightbox-views") and modify resources/views/vendor/filament-lightbox/lightbox.blade.php to add custom buttons or toolbars.Extending for Non-Image Media:
Lightbox:
namespace App\Filament\Components;
use Njxqlus\Filament\Components\Lightbox;
class CustomLightbox extends Lightbox
{
protected static string $view = 'filament-lightbox::custom-lightbox';
public static function make(string $url): static
{
return new static($url);
}
}
Performance Optimization:
->lazy() for lightbox entries in tables to defer initialization:
LightboxImageColumn::make('Image')
->href(fn ($record) => $record->image_url)
->image(fn ($record) => $record->image_url)
->lazy(),
Accessibility:
LightboxImageEntry::make('Image')
->href($url)
->image($url)
->ariaLabel('View full-size image'),
Debugging Lightbox Events:
lightbox:open) by extending the JavaScript:
document.addEventListener('lightbox:open', (e) => {
console.log('Lightbox opened:', e.detail);
});
Config Overrides:
config/filament-lightbox.php:
'lightbox_options' => [
'zoom' => false,
'counter' => false,
'close' => true,
'closeOnClick' => 'node', // 'node', 'outside', or 'background'
],
Testing:
$this->click('.filament-lightbox-trigger');
$this->assertSee('Lightbox content');
How can I help you explore Laravel packages today?