{{-- 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