blendbyte/filament-title-with-slug
Filament v5 Title + Slug input for Laravel: auto-generate slugs, live permalink preview, and inline editing. Works with Laravel 11–13. Simple drop-in field to manage titles and clean URLs in your Filament forms.
Installation (unchanged):
composer require blendbyte/filament-title-with-slug
Publish the config (if needed):
php artisan vendor:publish --provider="Blendbyte\FilamentTitleWithSlug\FilamentTitleWithSlugServiceProvider" --tag="config"
First Use Case (updated for responsive improvements):
Replace a standard TextInput with TitleWithSlugInput in a Filament resource:
use Blendbyte\FilamentTitleWithSlug\TitleWithSlugInput;
TitleWithSlugInput::make('title')
->required()
->maxLength(255)
->slug('slug') // Maps to a slug field
->responsive(); // Now fully optimized for all screen sizes
Where to Look First:
responsive_layout).Basic Integration (with responsive improvements):
TitleWithSlugInput::make('post_title')
->rules(['unique:posts,title'])
->slug('post_slug')
->livePreviewUrl(fn (string $slug) => route('posts.show', $slug))
->responsive(); // Auto-adjusts layout for mobile/desktop
Dynamic Slug Generation (unchanged):
TitleWithSlugInput::make('name')
->slug('url')
->slugGenerator(fn (string $title) => Str::slug($title, '-')
->replace(['and', 'the', 'an'], '')
->lower());
Responsive Layout Control (NEW): Explicitly configure responsive behavior:
TitleWithSlugInput::make('title')
->slug('slug')
->responsive([
'md' => 'stack', // Stack fields on medium screens
'lg' => 'inline', // Show inline on large screens
]);
Resource-Level Configuration (unchanged):
public static function form(Form $form): array
{
return [
TitleWithSlugInput::make('title')
->required()
->slug('slug')
->responsive()
->livePreviewUrl(fn ($slug) => "/posts/$slug"),
// Other fields...
];
}
Table Column Integration (unchanged):
SlugColumn::make('slug')
->url(fn ($record) => route('posts.show', $record->slug))
->openUrlInNewTab()
->responsive(); // Now supports responsive table columns
Custom Preview URLs (unchanged):
TitleWithSlugInput::make('event_name')
->slug('event_slug')
->livePreviewUrl(fn ($slug) => route('events.preview', ['slug' => $slug, 'year' => now()->year]));
Slug Validation (unchanged):
TitleWithSlugInput::make('product_name')
->slug('product_slug')
->rules([
'unique:products,slug',
'regex:/^[a-z0-9\-]+$/i',
]);
Multi-Language Support (unchanged):
TitleWithSlugInput::make('title')
->slug('slug')
->slugGenerator(fn ($title, $locale) => Str::slug(__($title), '-', $locale));
Responsive Slug Input (NEW): Optimize slug input for touch devices:
TitleWithSlugInput::make('title')
->slug('slug')
->responsiveSlugInput([
'touch' => true, // Enable touch-friendly UI
'minWidth' => '200px', // Minimum width for mobile
]);
Responsive Layout Conflicts (NEW):
// Avoid implicit conflicts
TitleWithSlugInput::make('title')
->slug('slug')
->responsive('stack'); // Force stack layout
Slug Field Mismatch (unchanged):
slug() matches a database column.Live Preview URL Conflicts (unchanged):
Slug Collisions (unchanged):
->unique() or custom logic.Config Overrides (unchanged):
// config/filament-title-with-slug.php
'responsive' => [
'default' => 'inline',
'mobile' => 'stack',
],
Check Responsive Behavior: Log responsive settings to debug layout issues:
TitleWithSlugInput::make('title')
->slug('slug')
->responsive()
->afterStateUpdated(fn ($state, $set) => {
logger()->debug("Responsive layout: " . $this->getResponsiveLayout());
});
Validate Database Sync (unchanged): Ensure slugs update correctly.
Clear Cached Views (unchanged):
php artisan filament:cache:clear
Custom Responsive Rules (NEW): Extend responsive behavior for specific use cases:
TitleWithSlugInput::make('title')
->slug('slug')
->responsive(fn ($screen) => $screen === 'xs' ? 'stack' : 'inline');
Event Listeners (unchanged): Trigger actions on slug changes.
Testing (unchanged): Mock slug generation in tests.
Localization (unchanged): Adapt slugs per locale.
Performance (NEW): Optimize responsive slug suggestions:
TitleWithSlugInput::make('title')
->slug('slug')
->suggestions(function (string $query) {
return Post::where('slug', 'like', "%{$query}%")
->limit(5)
->pluck('slug')
->toArray(); // Ensure array for responsive rendering
});
Visual Customization (NEW): Style the responsive input:
TitleWithSlugInput::make('title')
->slug('slug')
->responsive()
->extraAttributes(['class' => 'filament-responsive-input']);
How can I help you explore Laravel packages today?