{{--
v4.14.0 §C — LA COQUILLE HTML DU NOUVEL ESPACE CLIENT.
Elle ne porte QUE ce qui ne change jamais d'un écran à l'autre : la langue, le thème, la
police, la feuille de style, le manifeste et le service worker. L'en-tête, la barre du bas et
le sélecteur d'espace vivent dans , parce qu'ils dépendent de
l'espace ouvert et que Livewire ne transmet pas de sous-blocs à une mise en page.
⚠️ Aucun chrome Filament ici, et c'est tout l'objet du lot : le panneau reste en ligne à côté,
intact, mais cette façade ne lui doit pas une ligne.
--}}
@php
/*
| v4.16.0 §A/§C — L'ESPACE OUVERT, résolu ICI, au rendu.
|
| Le gabarit en a besoin pour trois choses que la coquille ne peut pas porter : le titre de
| l'onglet, la couleur de thème, et surtout l'`apple-touch-icon` — qui vit dans le et
| qu'un composant ne peut pas atteindre.
|
| ⚠️ Enveloppé : une base pas encore migrée ne doit pas faire tomber la page. Sans espace, on
| retombe sur l'identité de l'installation, comme partout ailleurs.
|
| ⚠️ Les classes sont appelées par leur nom PLEINEMENT QUALIFIÉ, et non importées : Blade
| compile le contenu d'un slot à l'intérieur d'un bloc conditionnel, où PHP interdit `use`.
| La règle vaut pour toutes les vues du socle (v1.4 §4.1) — un import ici serait un 500 au
| rendu, invisible à la relecture.
*/
try {
$espaceOuvert = app(\App\Services\EspaceClient\AccesClient::class)
->espaceCourant(auth()->user(), request()->query('espace'));
} catch (\Throwable) {
$espaceOuvert = null;
}
$marqueOuverte = $espaceOuvert?->nomDuPrestataire() ?? \App\Support\Identite::marque();
$couleurOuverte = $espaceOuvert !== null
? \App\Support\EspaceClient\IconeEspace::couleurPrimaire($espaceOuvert)
: \App\Support\Identite::couleurPrimaire();
$langueOuverte = $espaceOuvert?->langue ?: 'fr';
@endphp
{{-- viewport-fit=cover : sur un téléphone à encoche, la barre du bas reste atteignable.
v4.17.2 §C2 — `maximum-scale=1` : les BRETELLES du point §C. La ceinture, c'est le
plancher de 16px sur tout champ focusable (`socle.css`) — iOS zoome la page dès qu'on
touche un champ plus petit. Un champ nouveau qui oublierait la règle ne ferait donc pas
sauter l'écran du client pour autant. --}}
{{ $title ?? $marqueOuverte }}
{{-- v4.16.1 §B — LE FAVICON SUIT L'ESPACE OUVERT. Avant connexion (aucun espace résolu) :
l'icône de l'INSTALLATION, à défaut l'icône neutre du socle — jamais la marque d'une
autre société dans l'onglet de quelqu'un. Après connexion : le logo du CLIENT, partout,
y compris l'onglet — c'est la décision du gérant. On sert alors l'icône OPAQUE par espace,
la même composition que la pastille de l'écran d'accueil, à une taille de favicon. --}}
@if ($espaceOuvert !== null)
@else
@endif
{{-- v4.16.0 §C — `crossorigin="use-credentials"` n'est PAS décoratif : sans lui, le navigateur
demande le manifeste sans cookie, le serveur ne sait pas qui ouvre l'application, et
chacun installerait la même icône anonyme. --}}
{{-- v4.16.0 §C — L'`apple-touch-icon` est SERVI OPAQUE, et par espace. C'était le défaut le
plus visible : un favicon transparent posé par iOS sur son fond imposé donne une pastille
BLANCHE sur l'écran d'accueil. --}}
{{-- v4.16.1 §A — LE NOM PROPOSÉ PAR « AJOUTER À L'ÉCRAN D'ACCUEIL », sur iPhone. Il ne vient
PAS du manifeste : Safari le lit sur la page, dans cette balise — comme l'icône juste
au-dessus. Le manifeste, lui, est demandé dans une requête à part, souvent sans cookie
ou depuis un cache, et retombe alors sur le manifeste NEUTRE : c'est ainsi que
l'installation proposait le nom de la maison au lieu de celui du client. Le nom est le
MÊME que le `short_name` du manifeste par espace, pour qu'Android et iOS s'accordent. --}}
{{-- La police auto-hébergée, comme sur les panneaux : aucun CDN — la politique de sécurité
du socle n'autorise que « self ». --}}
{{-- Le thème est posé AVANT le premier rendu : jamais d'écran clair qui vire au sombre. --}}
@vite('resources/css/espace-client/app.css')
@livewireStyles
{{-- v4.17.1 §B — La brique push est montée AVANT l'écran : `window.soclePush` existe quand
l'écran Compte le lit. En bas de page, l'écran le lisait trop tôt et concluait
« indisponible » à tort — même dans l'application installée. Le script est
auto-suffisant (il définit `window.soclePush` tout de suite et n'enregistre le service
worker qu'au `load`). --}}
@auth
@include('filament.push-register', [
'routesPush' => [
'cle' => route('espace-client.app.push.key'),
'abonnement' => route('espace-client.app.push.subscribe'),
],
])
@endauth
{{ $slot }}
{{-- v4.17.3 §B2 — `data-navigate-once` + le drapeau : Livewire RÉEXÉCUTE les scripts du
corps à chaque navigation `wire:navigate`. Sans ces deux garde-fous, chaque changement
d'onglet ajouterait un écouteur de plus, et la bascule de thème finirait par basculer
deux fois — donc pas du tout. Les écouteurs sont posés sur `document`, qui SURVIT à la
navigation : ils n'ont besoin d'être posés qu'une fois. --}}
@livewireScripts