A powerful Filament v4 & v5 plugin for managing navigation menus with:
- ✅ Multiple Locations — Primary, Footer, Sidebar, or any custom location
- ✅ Drag & Drop Reordering — Powered by SortableJS with nested support
- ✅ Button Reordering — Up ↑ Down ↓ Indent → Outdent ← for accessibility
- ✅ Built-in Panels — Custom Links panel and Eloquent Model Sources panel
- ✅ Eloquent Model Compatible — Add Posts, Pages, or any model as menu items
- ✅ Auto Save — Debounced auto-save on every change (configurable)
- ✅ Dark Theme — Full dark mode support via CSS custom properties
| Dependency | Version |
|---|---|
| PHP | ^8.2 |
| Laravel | ^12.0 |
| Filament | ^4.0 | ^5.0 |
| Livewire | ^3.0 | ^4.0 |
composer require notebrainslab/filament-menu-managerphp artisan filament-menu-manager:install
# or manually:
php artisan vendor:publish --tag="filament-menu-manager-migrations"
php artisan migrateuse NoteBrainsLab\FilamentMenuManager\FilamentMenuManagerPlugin;
public function panel(Panel $panel): Panel
{
return $panel
->plugin(
FilamentMenuManagerPlugin::make()
->locations([
'primary' => 'Primary',
'footer' => 'Footer',
])
);
}Publish the config file (Optional):
php artisan vendor:publish --tag="filament-menu-manager-config"Publish the resource files (Optional):
php artisan vendor:publish --tag="filament-menu-manager-views"FilamentMenuManagerPlugin::make()
->locations(['primary' => 'Primary', 'footer' => 'Footer'])
->modelSources([\App\Models\Post::class, \App\Models\Page::class])
->navigationGroup('Content')
->navigationIcon('heroicon-o-bars-3')
->navigationSort(10)
->navigationLabel('Menus');To make an Eloquent model selectable in the Models panel, add the trait:
use NoteBrainsLab\FilamentMenuManager\Concerns\HasMenuItems;
class Post extends Model
{
use HasMenuItems;
// Optional: override the defaults
public function getMenuLabel(): string { return $this->title; }
public function getMenuUrl(): string { return route('posts.show', $this); }
public function getMenuTarget(): string { return '_self'; }
public function getMenuIcon(): ?string { return 'heroicon-o-document'; }
}Then register the model in the plugin:
FilamentMenuManagerPlugin::make()
->modelSources([\App\Models\Post::class])@php
$manager = app(\NoteBrainsLab\FilamentMenuManager\MenuManager::class);
$menus = $manager->menusForLocation('primary');
$menu = $menus->first();
$tree = $menu?->getTree() ?? [];
@endphp
@foreach($tree as $item)
<a href="{{ $item['url'] }}" target="{{ $item['target'] }}">{{ $item['title'] }}</a>
@if(!empty($item['children']))
{{-- render children --}}
@endif
@endforeachcomposer testSee CHANGELOG.md.
MIT License. See LICENSE.