{{-- Authenticated panel shell: collapsible sidebar + sticky topbar + theme toggle + language switcher. The panel brand seed is injected into :root so the whole primary-* scale re-themes per reseller. The wordmark and browser-tab title read ONE source — App\Support\Brand::name() (the owner/current panel name) — the same value Settings → General writes. A small listener below keeps them in sync live when that name is edited, so a rename shows without a reload (Livewire re-renders the component, not this layout). --}} {{ $title ?? __('Dashboard') }} — {{ \App\Support\Brand::name() }} @php $rfFavicon = panel_favicon_url(); @endphp @if ($rfFavicon) @else @endif {{-- Apply the saved theme before paint to avoid a flash of the wrong theme. --}} {{-- Per-panel brand seed — the primary scale derives from this at runtime. --}} @vite(['resources/css/app.css', 'resources/js/app.js']) @livewireStyles {{-- Impersonation banner — shown while an admin is viewing as a client. --}} @if (session('impersonator_id'))
{{ __('You are viewing the panel as :name.', ['name' => auth()->user()->display_name ?? auth()->user()->name]) }} {{ __('Return to admin') }}
@endif
@include('partials.sidebar') {{-- Mobile sidebar backdrop --}}
@include('partials.topbar')
{{ $slot }}
{{-- Global notification host (top-right), shared by every shell. --}} @include('partials.toast-host') {{-- The one confirmation dialog every destructive control routes through. --}} {{-- Live shell sync: Settings dispatches `brand-updated` to update the persistent chrome (site name, brand colour) without a full reload. --}} @livewireScripts @stack('scripts')