Workspace Tabs
Browser-like tabs for Filament panels. Open multiple pages in tabs without losing context, drag to reorder, pin frequently accessed pages, and right-click for quick actions.
Author:
Mustafa Khaled
Documentation
Browser-like tabs for Filament panels. Open multiple pages in tabs without losing context, drag to reorder, pin frequently accessed pages, and right-click for quick actions.
#Features
- Tab per page — Every navigation opens a new tab. Revisiting a URL activates the existing tab.
- Drag to reorder — Rearrange tabs via drag-and-drop (powered by SortableJS).
- Pin tabs — Double-click a tab to pin/unpin it. Pinned tabs can't be closed and stick to the left.
- Context menu — Right-click any tab for: Close, Close Others, Close to the Right, Duplicate, Pin/Unpin, Close All.
- Recently closed — Reopen closed tabs from the dropdown (last 50 stored).
- Keyboard shortcuts —
Ctrl+W/Cmd+Wto close the active tab. - Middle-click — Middle-click or
Ctrl+clicksidebar links to open in a new tab. - Persistent — Tabs survive page reloads via localStorage.
- Dark mode — Full support for Filament's dark mode.
- SPA-ready — Works with Filament's
->spa()mode and Livewire'swire:navigate.
#Requirements
- PHP 8.2+
- Filament v4 or v5
- Laravel 11+
#Installation
composer require wezlo/filament-workspace-tabs
#Setup
#1. Register the plugin
Add the plugin to your panel provider:
use Wezlo\FilamentWorkspaceTabs\WorkspaceTabsPlugin;
public function panel(Panel $panel): Panel
{
return $panel
->plugins([
WorkspaceTabsPlugin::make(),
]);
}
#2. Add the Tailwind source
Add the package views to your Filament theme CSS so Tailwind can scan utility classes:
/* resources/css/filament/{panel}/theme.css */
@source '../../../../vendor/wezlo/filament-workspace-tabs/resources/views/**/*';
Then rebuild your frontend assets:
npm run build
#Configuration
All options are available as fluent methods on the plugin:
WorkspaceTabsPlugin::make()
->maxTabs(25) // Maximum open tabs (default: 20)
->persistKey('my_tabs') // localStorage key prefix (default: 'filament_workspace_tabs')
->excludeUrls(['/admin/login']) // URL prefixes to never track as tabs
->contextMenu(false) // Disable right-click context menu
->dragReorder(false) // Disable drag-to-reorder
#Usage
Once installed, the tab bar appears below the topbar automatically.
| Action | Behavior |
|---|---|
| Click sidebar link | Opens a new tab |
| Click an existing tab | Switches to that tab (navigates to its URL) |
| Middle-click / Ctrl+click a link | Opens in a new tab without navigating |
| Close button (x) | Closes the tab |
| Double-click a tab | Pins / unpins the tab |
| Right-click a tab | Opens context menu |
Ctrl+W / Cmd+W |
Closes the active tab |
| Drag a tab | Reorders it |
#Pinned tabs
Pinned tabs display a pin icon alongside the label, have an indigo left border, and cannot be closed until unpinned. They always stay to the left of unpinned tabs.
#Context menu options
- Close — Close this tab (not available for pinned tabs)
- Close Others — Close all tabs except this one (respects pinned tabs)
- Close to the Right — Close all tabs to the right of this one
- Duplicate — Open the same URL in a new tab
- Pin / Unpin — Toggle the pinned state
- Close All — Close all unpinned tabs
#Recently closed
When tabs are closed, they're stored in a history list. Click the dropdown arrow on the right side of the tab bar to reopen any of the last 10 recently closed tabs.
#How it works
- Tab state (URLs, labels, order, pinned status) is stored client-side in
localStorageusing Alpine.js$persist(). - Switching tabs triggers
Livewire.navigate()for SPA-style page transitions. - Page titles are automatically extracted from
document.titleon each navigation. - The tab bar is injected via Filament's
TOPBAR_AFTERrender hook — no template modifications needed. - The persist key is automatically scoped to the panel ID to avoid cross-panel tab bleed.
#Publishing config
php artisan vendor:publish --tag="filament-workspace-tabs-config"
#License
MIT
The author
From the same author
Modal Notifications
Render any Filament notification as a blocking modal by chaining one method: ->asModal(). Multiple modal notifications fired in the same request are queued one at a time — the user dismisses one and the next slides in, no stacking.
Author:
Mustafa Khaled
Search Spotlight
A full-screen Spotlight / command-palette search overlay for Filament panels. Opens on ⌘K (configurable), aggregates results from multiple categories (records, resources, pages, actions, plus recent/pinned from localStorage), and composes Filament's built-in `GlobalSearchProvider` — every resource that already implements `getGloballySearchableAttributes()` shows up automatically.
Author:
Mustafa Khaled
Export Pro
A comprehensive, model-agnostic export engine for Filament. Handles large datasets with background processing and real-time progress tracking, maintains full export history with audit trails, supports scheduled/recurring exports with delivery, and gives admins visibility into who exported what and when.
Author:
Mustafa Khaled
Record Freezer
Freeze individual Eloquent records against modification — finalised contracts, audited financial periods, legal holds
Author:
Mustafa Khaled
Featured Plugins
A selection of plugins curated by the Filament team
Custom Dashboards
Let your users build and share their own dashboards with a drag-and-drop interface. Define your data sources in PHP and let them do the rest.
Filament
Advanced Tables (formerly Filter Sets)
Supercharge your tables with powerful features like user-customizable views, quick filters, multi-column sorting, advanced table searching, convenient view management, and more. Compatible with Resource Panel Tables, Relation Managers, Table Widgets, and Table Builder!
Kenneth Sese
Custom Fields
Eliminate custom field migrations forever. Let your users create and manage form fields directly in Filament admin panels with 20+ built-in field types, validation, and zero database changes.
Relaticle