{{-- Installable app: manifest, icons and the push key for this device. --}} @vite(['resources/css/app.css', 'resources/js/app.js']) @livewireStyles {{-- Archive mode: you are standing inside a workspace that no longer takes writes. --}} {{-- Then the two cut-over states, narrowest first: money YOU have not counted yet, and then money nobody can reconcile. Each names what is withheld and why, so a refusal is never a silence. --}} {{-- Imbalance gate: a counted float and the books disagree, so money is held. --}}
{{-- Layer stack: page content <= z-40, header z-45, mobile overlay z-46, sidebar z-50, modals z-50, assistant z-60, notes drawer z-70. The header must clear z-40 or its dropdowns (team switcher, profile) get overlaid by page sections -- sticky + z-index makes the header a stacking context, so the dropdown's own z-50 can't escape it. --}} {{-- Ctrl+K / Cmd+K, the one binding for the whole app (CRM_PLAN.md 19.3, conflict register C12). Once CRM search is live for this person it opens it (the crm.search component listens for crm-search-open); until then it focuses the page palette, as it always has. --}} @php $searchShortcutEvent = \App\Support\CrmNav::searchIsLive(Auth::user()) ? \App\Support\CrmNav::SEARCH_OPEN_EVENT : 'global-search-focus'; @endphp
{{-- Subtle brand gradient sheen --}}
{{-- The glow is 40rem wide and centred on left-1/3, so on a 360px phone its right edge landed 80px past the viewport and made the WHOLE DOCUMENT 440px wide. Android then widens the layout viewport to fit, and every position:fixed child (the bottom dock, the Ask bubble) is sized to that wider viewport — which is why the dock looked bigger than the page and ran off the right edge. This clipping layer bounds it horizontally while still letting the glow bleed upward. Never let a decorative element sit unclipped in a full-width bar. --}}
{{-- The mobile row is deliberately built out of three parts that can never fight for space: a fixed-width left cluster, a brand that is allowed to shrink and then disappear, and a fixed-width right cluster. The avatar lives in the right cluster, so it stays on screen no matter how long the workspace name is. --}}
{{-- Mobile brand mark. The wordmark only appears once there is room for it, and truncates rather than pushing anything off. --}}
{{-- Mobile search drawer. Same palette component as the desktop bar, given the full width it needs instead of being squeezed. --}}
{{-- Optional legacy $header slot --}} @if (isset($header))
{{ $header }}
@endif {{-- The bottom nav floats clear of the edge on mobile, so the page reserves the dock's height plus that gap plus the home-indicator inset; otherwise the last row of any list hides underneath it. --}}
{{ $slot }}
{{-- Notes from the Suggest button, with the page recorded automatically. Only the CRM testers see it for now. --}} @if (\App\Support\CrmPilot::isTester(auth()->user())) @endif {{-- Global floating AI Assistant (item #8). Renders only for permitted users. --}} {{-- Sticky notes. Mounted globally so any screen can open notes for any record by dispatching `open-notes` (see ). --}} {{-- "BillPro has been updated" notice + the guided tour bar. Mounted globally so the notice finds the user wherever they land after a deploy, and so the tour survives navigating between pages. --}} {{-- The action centre: ONE dialog for everything this person is being asked to do — set the month's targets, close last month, cash up a day that was missed, finish their own staff record. Deliberately a single mount: a login that opens four separate modals teaches people to dismiss modals. It waits its turn behind the release notice above. --}} {{-- "You appear to be 5.6 km from the office" + apply to work off-site. Mounted globally so both clock buttons (top bar and /attendance) open the same dialog. --}} {{-- Progress and errors for any upload that has no inline bar of its own. --}} {{-- Invisible. Notices that a new notification has landed and lets the browser chime, for anyone whose device is not on push. --}} @stack('modals') @livewireScripts {{-- An expired session sends staff to login, never to a "page expired" screen. Same component in every layout. --}}