PHPackages                             cyberline/filament-navigation-footermenu - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. cyberline/filament-navigation-footermenu

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

cyberline/filament-navigation-footermenu
========================================

Configurable footer navigation for Filament v4, v5: collapsible sidebar group and topbar dropdown (dark mode ready).

1.0.1(3mo ago)4976↑544.4%1MITPHPPHP ^8.2

Since Apr 18Pushed 3mo agoCompare

[ Source](https://github.com/CyberLine/filament-navigation-footermenu)[ Packagist](https://packagist.org/packages/cyberline/filament-navigation-footermenu)[ RSS](/packages/cyberline-filament-navigation-footermenu/feed)WikiDiscussions main Synced 1w ago

READMEChangelog (2)Dependencies (3)Versions (3)Used By (0)

Filament Navigation Footer Menu
===============================

[](#filament-navigation-footer-menu)

A **Filament v4, v5** panel plugin that adds a **configurable footer navigation block** to your panel:

- **Sidebar mode** (default navigation): a **collapsible group** at the bottom of the sidebar, aligned with Filament’s native navigation styling. Items expand **upward** so the trigger stays at the bottom (useful above the user area).
- **Top navigation mode** (`$panel->topNavigation()`): a **compact icon trigger** with a **dropdown** menu, placed in the top bar with correct spacing next to the user menu.

Styling uses Filament’s own components and CSS tokens, so **light/dark mode** matches the rest of your panel.

---

Requirements
------------

[](#requirements)

RequirementVersionPHP`^8.2`Laravel (illuminate components)`^11.0` | `^12.0` | `^13.0`Filament`^4.0` | `^5.0`---

Installation
------------

[](#installation)

### 1. Install the package

[](#1-install-the-package)

**From Packagist:**

```
composer require cyberline/filament-navigation-footermenu
```

**From a GitHub/VCS repository** (before Packagist, or for forks):

```
{
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/CyberLine/filament-navigation-footermenu.git"
        }
    ],
    "require": {
        "cyberline/filament-navigation-footermenu": "^1.0"
    }
}
```

**Local path repository** (monorepo or development):

```
{
    "repositories": [
        {
            "type": "path",
            "url": "packages/filament-navigation-footermenu",
            "options": { "symlink": true }
        }
    ],
    "require": {
        "cyberline/filament-navigation-footermenu": "^1.0"
    }
}
```

> **Stable installs:** this package declares a concrete `version` in `composer.json` so projects with `"minimum-stability": "stable"` can require it without treating the VCS checkout as `dev-main`.

### 2. Register the Laravel service provider

[](#2-register-the-laravel-service-provider)

The package registers `FooterMenuServiceProvider` via Composer’s `extra.laravel.providers` for **package discovery**.

In fresh clones or CI, if `bootstrap/cache/packages.php` is missing or `package:discover` did not run, you may see:

`No hint path defined for [filament-navigation-footermenu].`

Alternatively, ensure `composer install` / `php artisan package:discover` completes successfully after every deploy.

### 3. Register the Filament plugin on your panel

[](#3-register-the-filament-plugin-on-your-panel)

In your `PanelProvider` (e.g. `app/Providers/Filament/AdminPanelProvider.php`), add the plugin to the panel’s `plugins` array:

```
use Cyberline\FilamentNavigationFootermenu\Data\FooterMenuItem;
use Cyberline\FilamentNavigationFootermenu\FooterMenuPlugin;

public function panel(Panel $panel): Panel
{
    return $panel
        // ...
        ->plugins([
            FooterMenuPlugin::make()
                ->triggerLabel('Legal')
                ->triggerIcon('heroicon-o-scale')
                ->items([
                    FooterMenuItem::make('Privacy policy')
                        ->icon('heroicon-o-shield-check')
                        ->url(fn () => route('legal.privacy'))
                        ->openUrlInNewTab(),
                ]),
        ]);
}
```

No `->register()` call on the plugin is required beyond Filament’s normal plugin registration on the panel.

---

Publishing (optional)
---------------------

[](#publishing-optional)

Publish and customize config, views, or translations:

```
php artisan vendor:publish --tag=filament-navigation-footermenu-config
php artisan vendor:publish --tag=filament-navigation-footermenu-views
php artisan vendor:publish --tag=filament-navigation-footermenu-lang
```

After publishing views, your copies live under `resources/views/vendor/filament-navigation-footermenu/`.

---

Configuration
-------------

[](#configuration)

Default values are merged from `config/filament-navigation-footermenu.php`.

KeyPurpose`trigger.label`Default trigger label if you do not call `->triggerLabel()` on the plugin.`trigger.icon`Default Heroicon name for the trigger when you do not call `->triggerIcon()`.`heading`Optional heading shown above the **topbar dropdown** list (sidebar group does not use it for the default list UI).`items`Array of item definitions (see **Array-based items**). Used when you do **not** call `->items()` on the plugin.You can leave everything in config, override everything in the panel, or mix (plugin fluent API wins over config for the options you set).

---

Usage
-----

[](#usage)

### Fluent API (`FooterMenuPlugin`)

[](#fluent-api-footermenuplugin)

All chainable methods return `static` for fluent configuration.

MethodDescription`triggerLabel(string|Closure|null $label)`Label for the sidebar group / accessible name for the topbar icon.`triggerIcon(string|Closure|null $icon)`Heroicon (or Filament-supported icon) for the trigger.`heading(string|Closure|null $heading)`Optional heading in the **topbar** dropdown.`items(array|Closure $items)`Menu entries: `FooterMenuItem` instances and/or arrays (see below).`view(?string $bladeView)`Custom Blade view for item **content** (sidebar list and/or dropdown body).`visible(bool|Closure $condition)`Hide the entire footer menu when `false`.`sort(int $sort)`Reserved for ordering relative to other plugins (Filament plugin sort).`extraAttributes(array|Closure $attributes)`Extra HTML attributes merged onto the **root** wrapper (e.g. `class` for a top border).**Example – separator from main nav (Tailwind classes):**

```
FooterMenuPlugin::make()
    ->extraAttributes([
        'class' => 'border-t border-gray-200 pt-3 dark:border-white/10',
    ])
    ->triggerLabel('Legal')
    ->items([ /* ... */ ]);
```

### Fluent item API (`FooterMenuItem`)

[](#fluent-item-api-footermenuitem)

```
FooterMenuItem::make(string $label)
    ->icon(?string $icon)                         // Heroicon name, etc.
    ->url(string|Closure|null $url)             // Resolved to string for links
    ->openUrlInNewTab(bool|Closure $open = true)
    ->visible(bool|Closure $visible)
    ->badge(string|int|Closure|null $badge, string|Closure|null $color = null)
    ->badgeTooltip(string|Closure|null $tooltip)
```

**Resolved row shape** (useful inside custom Blade): `label`, `icon`, `url`, `open_in_new_tab`, `badge`, `badge_color`, `badge_tooltip`.

### Array-based items

[](#array-based-items)

Arrays are normalized to `FooterMenuItem` internally. Supported keys:

KeyAliasesNotes`label`—**Required**, string.`icon`—Optional string or `Closure`.`url`—String, `Closure`, or `null` (`#` when null).`open_in_new_tab``openUrlInNewTab`, `new_tab`Boolean or `Closure`.`visible`—Boolean or `Closure`.`badge`—String, int, `Closure`, or `null`.`badge_color``badgeColor`Optional string or `Closure`.`badge_tooltip``badgeTooltip`Optional string or `Closure`.**Example:**

```
FooterMenuPlugin::make()->items([
    [
        'label' => 'Imprint',
        'icon' => 'heroicon-o-identification',
        'url' => fn () => route('legal.imprint'),
        'new_tab' => true,
        'badge' => '!',
        'badge_color' => 'danger',
        'badge_tooltip' => 'Action required',
    ],
]);
```

### Dynamic items with `Closure`

[](#dynamic-items-with-closure)

```
FooterMenuPlugin::make()->items(fn () => [
    FooterMenuItem::make('Dashboard')
        ->url(fn () => url('/'))
        ->visible(fn () => auth()->user()?->isAdmin() ?? false),
]);
```

### Custom Blade view

[](#custom-blade-view)

Point the plugin at your own view:

```
FooterMenuPlugin::make()
    ->view('components.my-footer-menu');
```

Your view is included with the following variables (non-exhaustive):

VariableDescription`$plugin`The `FooterMenuPlugin` instance.`$layout``'sidebar'` or `'topbar'`.`$heading`Resolved heading string or null.`$triggerLabel`Resolved trigger label.`$triggerIcon`Resolved trigger icon or null.`$items`Array of **resolved** item rows (see shape above).`$topbarAfterUserMenu``bool` – `true` when the topbar UI is rendered **after** the user menu (inside `.fi-topbar-end`). Useful if your custom markup needs different spacing.When a custom view is set, the plugin still renders the outer shell (sidebar group / dropdown); your view replaces the **default list of links** only.

---

Behaviour &amp; layout
----------------------

[](#behaviour--layout)

### Sidebar (default navigation)

[](#sidebar-default-navigation)

- Registered on `PanelsRenderHook::SIDEBAR_FOOTER`.
- Renders **below** other sidebar footer content (e.g. user menu when shown in the sidebar), matching Filament’s footer hook order.
- Uses Filament sidebar group / item classes so spacing matches the main navigation.

### Top navigation

[](#top-navigation)

- When the panel uses top navigation, the plugin does **not** render in the sidebar footer hook for that panel state.
- **Primary placement:** `PanelsRenderHook::USER_MENU_AFTER` — output sits **inside** `.fi-topbar-end`, so Filament’s `gap-x-4` applies between the user menu and your trigger (no overlap with the avatar).
- **Fallback:** if there is **no** user menu in the topbar (`userMenu(false)` or user menu only in the sidebar), the plugin renders on `PanelsRenderHook::TOPBAR_END` instead, with extra margin so the trigger does not collide with adjacent controls.

The topbar trigger is an `x-filament::icon-button` with a circular hit area and hover styles consistent with Filament.

### Visibility and tenancy

[](#visibility-and-tenancy)

The plugin does not render when:

- the user is **not authenticated** in the current panel context, or
- the panel has **tenancy** enabled and **no tenant** is resolved yet, or
- `->visible(false)` (or a `Closure` resolving to `false`) is set on the plugin.

Use `->visible()` for feature flags, permissions, or environment-specific menus.

---

Translations
------------

[](#translations)

The package ships with **English** and **German** language files under the `filament-navigation-footermenu` translation namespace.

Example:

```
__('filament-navigation-footermenu::footermenu.default_trigger_label');
```

Publish if you need to override strings per app.

---

Tailwind / Vite (Filament theme)
--------------------------------

[](#tailwind--vite-filament-theme)

This package’s Blade views use **Tailwind utility classes** (for example `px-6`, `pb-3`, `flex`) alongside Filament’s `fi-*` classes. Filament’s **default pre-built panel CSS** is compiled from Filament’s own sources only; it does **not** scan `vendor/cyberline/filament-navigation-footermenu`, so those utilities may be **missing** in the browser unless your app compiles a **custom Filament theme** that includes this package in Tailwind’s content scan.

### Required steps (Filament v4+ with Vite)

[](#required-steps-filament-v4-with-vite)

1. **Create a panel theme CSS file** (e.g. `resources/css/filament/{panel-id}/theme.css`). The Filament stub pattern is:

    ```
    @import '../../../../vendor/filament/filament/resources/css/theme.css';

    @source '../../../../app/Filament/**/*';
    @source '../../../../resources/views/filament/**/*';
    @source '../../../../vendor/cyberline/filament-navigation-footermenu/resources/views/**/*.blade.php';
    ```

    Adjust relative paths if your file lives elsewhere.
2. **Register the theme** on your panel in `PanelProvider`:

    ```
    return $panel
        ->viteTheme('resources/css/filament/admin/theme.css'); // path to your theme.css
    ```
3. **Add the theme to Vite** in `vite.config.js` (Laravel Vite `input` array) so it is built with `npm run build` / `npm run dev`.
4. **Rebuild assets** after upgrading this package, editing its views, or changing Tailwind classes in the theme (`npm run build`, or keep `npm run dev` running).

### If you publish views

[](#if-you-publish-views)

After `php artisan vendor:publish --tag=filament-navigation-footermenu-views`, add an `@source` line for your app copy so Tailwind scans the published blades, for example:

```
@source '../../../../resources/views/vendor/filament-navigation-footermenu/**/*.blade.php';
```

You can keep or remove the vendor `@source` depending on whether you still load views from the package.

### Optional: avoid a custom theme

[](#optional-avoid-a-custom-theme)

You can avoid relying on extra Tailwind utilities by using **only** Filament’s documented `fi-*` patterns and inline styles the default bundle already includes, or by shipping a tiny **non-Tailwind** CSS file — but the default package views expect a theme build that scans them as above.

---

License
-------

[](#license)

MIT — see [LICENSE.md](LICENSE.md).

###  Health Score

43

—

FairBetter than 89% of packages

Maintenance82

Actively maintained with recent releases

Popularity24

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity47

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

2

Last Release

97d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/cd47ea0e6386fbd6df9c9475eb3d2e97a4741852b2dd8f3ce9fe4da28325d0a3?d=identicon)[CyberLine](/maintainers/CyberLine)

---

Top Contributors

[![CyberLine](https://avatars.githubusercontent.com/u/195617?v=4)](https://github.com/CyberLine "CyberLine (4 commits)")

### Embed Badge

![Health badge](/badges/cyberline-filament-navigation-footermenu/health.svg)

```
[![Health](https://phpackages.com/badges/cyberline-filament-navigation-footermenu/health.svg)](https://phpackages.com/packages/cyberline-filament-navigation-footermenu)
```

###  Alternatives

[psalm/plugin-laravel

Psalm plugin for Laravel

3345.3M347](/packages/psalm-plugin-laravel)[illuminate/pipeline

The Illuminate Pipeline package.

9349.2M291](/packages/illuminate-pipeline)[illuminate/session

The Illuminate Session package.

9939.3M861](/packages/illuminate-session)[illuminate/pagination

The Illuminate Pagination package.

10534.1M1.1k](/packages/illuminate-pagination)[illuminate/broadcasting

The Illuminate Broadcasting package.

7127.2M221](/packages/illuminate-broadcasting)[illuminate/hashing

The Illuminate Hashing package.

6729.7M195](/packages/illuminate-hashing)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
