Skip to main content
Version: 2.x

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.

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'),
// ...
]);
});

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')),
// ...
]);
});

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'),
]);
});