anselmokossa/filament-sentinel
Drop-in branded error pages for Filament 500, 403, 404, 419 and 503, built from native Filament UI so they inherit your panel's colours and dark mode. Real exception details, stable SAP-style message numbers, request ids and EN/PT/PT-BR translations.
filament.{panel}.resources...), with the default panel as fallback.UnauthorizedException does — but a panel denial throws a bare
AuthorizationException that says nothing, so the page kept falling back to
listing roles precisely where it was needed most. Sentinel now reads the
current Filament route instead: the route names the resource or page, the page
segment names the ability (index -> ViewAny, create -> Create, edit ->
Update, view -> View, delete -> Delete), and Shield — the only thing that
knows how this application spells its permissions — turns the pair into the
real key, e.g. ViewAny:PayrollRun.Sentinel::deniedTarget() and Sentinel::inferredPermission().class_exists(), like the Spatie check.
Without it the page behaves exactly as it did in 1.1.0.UnauthorizedException exposes getRequiredPermissions() and
getRequiredRoles(), a bare AuthorizationException exposes nothing — and
lists only the entries the user actually lacks, since a denial can name
several while the user is short of just one.page_ and widget_ prefixes name the kind
outright; anything else has its subject matched against the panel's own
registered resources, pages and widgets, so the answer stays correct as those
come and go. Unclaimed subjects are reported as custom rather than guessed at.Sentinel::requiredPermissions(), requiredRoles(), missingPermissions(),
missingRoles() and permissionKind() for reuse outside the error pages.spatie/laravel-permission; it simply uses the extra detail
when the exception offers it.403.blade.php carries its own inline copy of the logic to stay
self-contained. Without a panel to ask, it classifies by prefix only.First public release.
<x-filament::section>, badge, button,
icon) on a light, theme-aware scaffold — they inherit the panel's colours,
fonts, brand logo and dark mode automatically.file:line split from the call, app frames highlighted apart from
vendor). The window unwraps Laravel's generic HttpException(500) to the
root cause, so the class, location, stack and message number all point at
the exception that actually threw, not the framework handler.->livewireOverlay(false).->fullPage() / config('sentinel.window.style'):
the docked window (default) or a full page like the other codes — on a
Livewire error the full page then takes over the document, exactly like landing
on a real error page.->windowPosition() / config('sentinel.window.position'):
bottom-left (default), bottom-right, top-left, top-right, top-center,
bottom-center, center, or a full-height slide-over drawer with
slide-right / slide-left. Set the width with ->windowWidth().sentinel-config, sentinel-translations and sentinel-views
tags, plus a sentinel-errors "eject" tag that publishes a self-contained
set of error pages into resources/views/errors/ — no dependency on the plugin
or even on Filament, so the branded pages keep working after the plugin is
removed.->email() convenience for the "Contact support" action (wraps the address
in a mailto: link).--gray-*, --danger-*,
…) and the .fi-body background, so they match the panel's exact theme in
light and dark — no bespoke palette.resources/views/errors/{code}.blade.php still wins.Retry-After on 503, and the real
exception (class, location, message and stack) on 500. Exception exposure
follows APP_DEBUG by default; set show_exception_details to true to
reveal it in production (for a panel only trusted admins reach) or false to
hide it even locally.SNT-500-087), derived deterministically
from the error signature so the same failure always quotes the same number.brandLogo / darkModeBrandLogo, falling
back to the brand name and then the application name.SentinelPlugin::make()): brand(), messagePrefix(),
messageNumbers(), requestId(), showExceptionDetails(), supportUrl(),
homeUrl(), codes() and enabled(). Anything left unset falls back to
config/sentinel.php.abort() rendering and the request-id middleware).How can I help you explore Laravel packages today?