{{-- 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. --}}
{{ config('app.name', 'BillPro') }}
@php
$headerUser = Auth::user();
$headerTeam = $headerUser->currentTeam;
$headerRole = $headerUser->isSuperAdmin()
? __('Administrator')
: ($headerUser->ownsTeam($headerTeam) ? __('Owner') : (optional($headerUser->teamRole($headerTeam))->name ?? __('Member')));
@endphp
{{-- Search has no room to sit open on a phone, so it gets a
button that drops the same palette in under the bar. --}}
{{-- CRM global search (S16). Empty, and invisible, until it is built. --}}
@if (Laravel\Jetstream\Jetstream::hasTeamFeatures())
@foreach (Auth::user()->allTeams() as $team)
@endforeach
@endif
@endif
{{-- On a phone the trigger is just the photo, so the
identity the header cannot show — name, role and
which workspace you are in — is stated here. --}}
@foreach (Auth::user()->allTeams() as $team)
@endforeach
@endif
@endif
{{ __('Profile') }}
{{-- Where a person turns alerts on for their own phone
and installs BillPro. Deliberately here rather than
under Settings: Settings needs `settings.manage`,
and none of this is a workspace decision. --}}
{{ __('Notifications & app') }}
@if (Laravel\Jetstream\Jetstream::hasApiFeatures())
{{ __('API Tokens') }}
@endif
{{-- Mobile search drawer. Same palette component as the desktop bar,
given the full width it needs instead of being squeezed. --}}
@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. --}}