notebrainslab / filament-menu-manager
A powerful Filament v4 & v5 plugin for managing menus with multiple locations, drag & drop reordering, Eloquent model support, auto-save, and dark theme.
Package info
github.com/notebrainslab/filament-menu-manager
pkg:composer/notebrainslab/filament-menu-manager
1.0.0
2026-02-23 06:50 UTC
Requires
- php: ^8.2
- filament/filament: ^4.0|^5.0
- illuminate/contracts: ^11.0|^12.0
- spatie/laravel-package-tools: ^1.16
Requires (Dev)
- orchestra/testbench: ^9.0
- pestphp/pest: ^3.0
- pestphp/pest-plugin-laravel: ^3.0
- phpunit/phpunit: ^11.0
README
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
Requirements
| Dependency | Version |
|---|---|
| PHP | ^8.2 |
| Laravel | ^12.0 |
| Filament | ^4.0 | ^5.0 |
| Livewire | ^3.0 | ^4.0 |
Installation
1. Install via Composer
composer require notebrainslab/filament-menu-manager
2. Publish and run migrations
php artisan filament-menu-manager:install # or manually: php artisan vendor:publish --tag="filament-menu-manager-migrations" php artisan migrate
3. Register the plugin in your Panel Provider
use NoteBrainsLab\FilamentMenuManager\FilamentMenuManagerPlugin; public function panel(Panel $panel): Panel { return $panel ->plugin( FilamentMenuManagerPlugin::make() ->locations([ 'primary' => 'Primary', 'footer' => 'Footer', ]) ); }
Configuration
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"
Plugin API (Fluent)
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');
Eloquent Model Sources
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])
Render Menus in Blade
@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 @endforeach
Testing
composer test
Changelog
See CHANGELOG.md.
License
MIT License. See LICENSE.