Navigation
Getting started
By default, Filament will register navigation items for each of your resources and custom pages. These classes contain static properties and methods that you can override, to configure that navigation item and its order:
protected static ?string $navigationIcon = 'heroicon-o-document-text';
protected static ?string $navigationLabel = 'Custom Navigation Label';
protected static ?int $navigationSort = 3;
The $navigationIcon
supports the name of any Blade component, and passes a set of formatting classes to it. By default, the Blade Heroicons v1 package is installed, so you may use the name of any Heroicons v1 out of the box. However, you may create your own custom icon components or install an alternative library if you wish.
Navigation item badges
To add a badge next to the navigation item, you can use the getNavigationBadge()
method and return the content of the badge:
protected static function getNavigationBadge(): ?string
{
return static::getModel()::count();
}
If a badge value is returned by getNavigationBadge()
, it will display using the primary Tailwind color by default. To style the badge contextually, return either danger
, warning
, success
or secondary
from the getNavigationBadgeColor()
method:
protected static function getNavigationBadgeColor(): ?string
{
return static::getModel()::count() > 10 ? 'warning' : 'primary';
}
Grouping navigation items
You may group navigation items by specifying a $navigationGroup
property on a resource and custom page:
protected static ?string $navigationGroup = 'Settings';
All items in the same navigation group will be displayed together under the same group label, "Settings" in this case. Ungrouped items will remain at the top of the sidebar.
Customizing navigation groups
You may customize navigation groups by calling Filament::registerNavigationGroups()
from the boot()
method of any service provider, and passing NavigationGroup
objects in order:
use Filament\Facades\Filament;
use Filament\Navigation\NavigationGroup;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function boot(): void
{
Filament::serving(function () {
Filament::registerNavigationGroups([
NavigationGroup::make()
->label('Shop')
->icon('heroicon-s-shopping-cart'),
NavigationGroup::make()
->label('Blog')
->icon('heroicon-s-pencil'),
NavigationGroup::make()
->label('Settings')
->icon('heroicon-s-cog')
->collapsed(),
]);
});
}
}
In this example, we pass in a custom icon()
for the groups, and make one collapsed()
by default.
Ordering navigation groups
By using registerNavigationGroups()
, you are defining a new order for the navigation groups in the sidebar. If you just want to reorder the groups and not define an entire NavigationGroup
object, you may just pass the labels of the groups in the new order:
use Filament\Facades\Filament;
Filament::registerNavigationGroups([
'Shop',
'Blog',
'Settings',
]);
Active icons
You may assign a navigation icon which will be displayed for active items using the $activeNavigationIcon
property:
protected static ?string $activeNavigationIcon = 'heroicon-s-document-text';
Alternatively, override the getActiveNavigationIcon()
method:
protected static function getActiveNavigationIcon(): string
{
return 'heroicon-s-document-text';
}
Registering custom navigation items
You may register custom navigation items by calling Filament::registerNavigationItems()
from the boot()
method of any service provider:
use Filament\Facades\Filament;
use Filament\Navigation\NavigationItem;
Filament::serving(function () {
Filament::registerNavigationItems([
NavigationItem::make('Analytics')
->url('https://filament.pirsch.io', shouldOpenInNewTab: true)
->icon('heroicon-o-presentation-chart-line')
->activeIcon('heroicon-s-presentation-chart-line')
->group('Reports')
->sort(3),
]);
});
Conditionally hiding navigation items
You can also conditionally hide a navigation item by using the visible()
or hidden()
methods, passing in a condition to check:
use Filament\Navigation\NavigationItem;
NavigationItem::make('Analytics')
->visible(auth()->user()->can('view-analytics'))
// or
->hidden(! auth()->user()->can('view-analytics')),
Disabling resource or page navigation items
To prevent resources or pages from showing up in navigation, you may use:
protected static bool $shouldRegisterNavigation = false;
Advanced navigation customization
The Filament::navigation()
method which can be called from the boot
method of a ServiceProvider
:
use Filament\Facades\Filament;
use Filament\Navigation\NavigationBuilder;
Filament::navigation(function (NavigationBuilder $builder): NavigationBuilder {
return $builder;
});
Once you add this callback function, Filament's default automatic navigation will be disabled and your sidebar will be empty. This is done on purpose, since this API is designed to give you complete control over the navigation.
To register navigation items, just call the items()
method:
use App\Filament\Pages\Settings;
use App\Filament\Resources\UserResource;
use Filament\Facades\Filament;
use Filament\Navigation\NavigationBuilder;
use Filament\Navigation\NavigationItem;
Filament::navigation(function (NavigationBuilder $builder): NavigationBuilder {
return $builder->items([
NavigationItem::make('Dashboard')
->icon('heroicon-o-home')
->activeIcon('heroicon-s-home')
->isActiveWhen(fn (): bool => request()->routeIs('filament.pages.dashboard'))
->url(route('filament.pages.dashboard')),
...UserResource::getNavigationItems(),
...Settings::getNavigationItems(),
]);
});
If you want to register groups, you can call the groups()
method:
use App\Filament\Pages\HomePageSettings;
use App\Filament\Resources\CategoryResource;
use App\Filament\Resources\PageResource;
use Filament\Facades\Filament;
use Filament\Navigation\NavigationBuilder;
use Filament\Navigation\NavigationGroup;
Filament::navigation(function (NavigationBuilder $builder): NavigationBuilder {
return $builder
->groups([
NavigationGroup::make('Website')
->items([
...PageResource::getNavigationItems(),
...CategoryResource::getNavigationItems(),
...HomePageSettings::getNavigationItems(),
]),
]);
});
Customizing the user menu
The user menu is featured in the top right corner of the admin layout. It's fully customizable.
To register new items to the user menu, you should use a service provider:
use Filament\Facades\Filament;
use Filament\Navigation\UserMenuItem;
Filament::serving(function () {
Filament::registerUserMenuItems([
UserMenuItem::make()
->label('Settings')
->url(route('filament.pages.settings'))
->icon('heroicon-s-cog'),
// ...
]);
});
Customizing the account link
To customize the user account link at the start of the user menu, register a new item with the account
array key:
use Filament\Facades\Filament;
use Filament\Navigation\UserMenuItem;
Filament::serving(function () {
Filament::registerUserMenuItems([
'account' => UserMenuItem::make()->url(route('filament.pages.account')),
// ...
]);
});
Customizing the logout link
To customize the user account link at the end of the user menu, register a new item with the logout
array key:
use Filament\Facades\Filament;
use Filament\Navigation\UserMenuItem;
Filament::serving(function () {
Filament::registerUserMenuItems([
// ...
'logout' => UserMenuItem::make()->label('Log out'),
]);
});