{{-- v4.2.0 §C1 — La fiche d'un espace client : onze onglets, la disposition de la maquette. Le cockpit ne compte que les EXCEPTIONS : quatre repères, « Aujourd'hui », « Échéances ». ⚠️ v4.5.0 §3 — CETTE VUE EST PARTAGÉE PAR DEUX PANNEAUX : la fiche de la direction (Admin\…\ViewEspaceClient) et celle du collaborateur à qui l'espace est confié (Employee\Pages\GererEspaceClient). Elle n'appelle donc que `$this->…` et `$this::…` — jamais une classe de page nommée, jamais une URL d'une ressource d'administration. C'est à cette condition qu'un correctif profite aux deux écrans au lieu d'un seul. --}} @php use App\Enums\EspaceClient\ModeAcces; use App\Enums\EspaceClient\ModeLettre; use App\Enums\EspaceClient\CanalDecision; use App\Enums\EspaceClient\CanalDemande; use App\Enums\EspaceClient\FamilleDocument; use App\Enums\EspaceClient\RoleAcces; use App\Enums\EspaceClient\TypeDecision; use App\Models\EspaceClient\DocumentClient; $espace = $this->espace(); $gere = $this->peutGerer(); $etiquette = 'block text-xs font-semibold uppercase tracking-wide text-gray-500 dark:text-gray-400'; $nombre = fn ($v) => rtrim(rtrim(number_format((float) $v, 2, ',', ' '), '0'), ','); @endphp {{-- v4.16.1 §D2 — `data-fiche-espace` ancre les règles « au pouce » de espace-client-accent.css. --}} {{-- v4.9.0 §B — LE FOCUS ENTRE DANS LE TIROIR. Le panneau ne se rend plus ni sous sa carte ni en fin de page : il s'ouvre dans un tiroir ancré à l'écran (voir tout en bas de cette vue). Il n'y a donc plus rien à faire défiler — mais il y a toujours un premier champ à mettre sous le curseur, y compris quand on ouvre un second panneau alors qu'un premier est déjà ouvert (le tiroir est alors réutilisé, et son `x-init` ne rejouerait pas). Le tiroir peut arriver dans le DOM un instant après l'événement : on réessaie. --}}
{{-- v4.4.2 §4a — Sans compte client actif, chaque envoi de l'espace part à personne : le journal l'écrit en « échec », l'écran disait succès. Le bandeau le dit avant le geste. v4.7.0 §D4 — Et il AGIT : « Inviter un référent » ouvre le panneau d'invitation juste dessous, sur n'importe quel onglet. --}} @if ($this->sansAccesClientActif())
Aucun compte client actif. Les e-mails de cet espace ne partiront à personne tant qu'un référent n'est pas invité. @if ($gere) Inviter un référent @endif
@endif {{-- ═══ Les onglets ════════════════════════════════════════════════════════════════════ Desktop : une ligne. Sous 768 px (v4.7.0 §D2) : cette barre est masquée, et une BARRE BASSE fixe porte les cinq gestes clés + « Plus » — voir en fin de fiche. --}} {{-- Sur mobile, le nom de l'onglet courant tient lieu de titre de section : le contenu s'ouvre d'emblée, sans descendre. --}}

{{ $this::ONGLETS[$onglet] ?? '' }}

{{-- ═══ COCKPIT ═══════════════════════════════════════════════════════════════════════ --}} @if ($onglet === 'cockpit') @php $t = $this->tuiles(); $guide = $this->guide(); $guideVisible = $guide['visible']; @endphp {{-- v4.12.0 §B4 — « VOIR COMME LE RÉFÉRENT », EN TÊTE ET NON PLUS ENFOUI. Le geste existait depuis la v4.7.0 §B5, dans la carte « Lien de lecture et QR code » de l'onglet Paramètres : personne ne le trouvait, et le gérant cherchait à voir l'espace en cliquant « Se connecter » sur la page publique — qui le renvoyait au tableau de bord. Il est désormais à l'endroit où l'on arrive, avec « Voir comme le client » à côté : deux cibles pleine largeur sur téléphone, côte à côte au-delà. --}} @if ($gere)
Voir comme le référent @if ($espace->lienPublic()) Voir comme le client @endif
@endif
$guideVisible])> {{-- v4.7.0 §D5 — Le guide « Pour démarrer » : quatre étapes, chacune avec son état et son lien. La carte disparaît quand tout est fait, ou quand on la masque. --}} @if ($guideVisible)

Pour démarrer

Ce guide disparaît une fois l'espace prêt.

@if ($gere) @endif
    @foreach ($guide['etapes'] as $etape)
  1. $etape['fait'], 'border-gray-300 bg-white text-transparent dark:border-white/20 dark:bg-gray-900' => ! $etape['fait'], ])>✓ $etape['fait'], 'text-gray-800 dark:text-gray-100' => ! $etape['fait'], ])>{{ $etape['libelle'] }} @if ($etape['fait']) fait @elseif ($gere && $etape['action'] === 'invitation') @elseif ($gere && $etape['action'] === 'livrables') @elseif ($gere && $etape['action'] === 'dates') @endif
  2. @endforeach

{{ $guide['faites'] }} sur {{ $guide['total'] }} — l'espace se remplit

@endif {{-- v4.7.0 §D7 — Les tuiles : un point d'attention sur « En attente du client » quand il y a quelque chose, des chiffres tabulaires, les sous-libellés de la maquette. --}}
*:nth-child(3)]:border-t lg:[&>*:nth-child(3)]:border-l-0 lg:[&>*:nth-child(4)]:border-t' => $guideVisible, 'sm:grid-cols-4 sm:divide-x sm:divide-y-0' => ! $guideVisible, ])>

En attente du client @if ($t['en_attente_du_client'] > 0) @endif

$t['en_attente_du_client'] > 0, 'text-gray-900 dark:text-white' => $t['en_attente_du_client'] === 0])>{{ $t['en_attente_du_client'] }}

{{ $t['a_valider'] }} livrable{{ $t['a_valider'] > 1 ? 's' : '' }} à valider

Échéances sous 10 j

{{ $t['echeances_10_jours'] }}

en jours ouvrés

Pièces manquantes

{{ $t['pieces_manquantes'] }}

{{ $t['pieces_cote_client'] }} client · {{ $t['pieces_cote_nous'] }} chez nous

Commandé

{{ number_format($t['montant_commande'], 2, ',', ' ') }} DH

{{ $t['part_du_marche'] }} % du marché

@if ($gere)
Nouveau livrable Saisir une demande reçue Message de la semaine
@endif
@forelse ($this->alertes() as $alerte) {{ ['danger' => 'urgent', 'warning' => 'à traiter', 'info' => 'à suivre'][$alerte['niveau']] ?? '—' }} @empty Rien ne va mal aujourd'hui. @endforelse @forelse ($this->echeances() as $ligne) @php $l = $ligne['livrable']; @endphp {{ $ligne['jours_ouvres'] < 0 ? 'en retard de '.abs($ligne['jours_ouvres']).' j' : $ligne['jours_ouvres'].' j ouvrés' }} @empty Aucune échéance sous dix jours ouvrés. @endforelse
@endif {{-- ═══ LIVRABLES ═════════════════════════════════════════════════════════════════════ --}} @if ($onglet === 'livrables') @if ($gere)
Nouveau livrable
@endif @forelse ($this->livrables() as $livrable) {{ $livrable->statut->label() }} @if ($gere) {{-- v4.17.0 §B2.6 — Le fil de discussion, avec son composeur. --}} Conversation Remettre @if ($livrable->version_courante > 0) Décision reçue @endif @if ($livrable->statut->estValide()) Réceptionner Diffuser @endif {{-- v4.12.0 §A — Corriger et retirer : un livrable créé par erreur n'était jusqu'ici ni modifiable ni supprimable. Réservé au gestionnaire — le client ne voit jamais ces deux gestes. --}} Modifier Supprimer @endif @empty Aucun livrable — créez le premier. @endforelse @endif {{-- ═══ REPORTING ═════════════════════════════════════════════════════════════════════ --}} @if ($onglet === 'reporting') @php $ligne = $this->indicateurs(); $c = $ligne->calcules ?? []; $m = $c['mois'] ?? []; $cum = $c['cumul'] ?? []; $cibles = $espace->ciblesConfigurees(); $pct = fn ($v) => $v === null ? '—' : number_format((float) $v, 1, ',', ' ').' %'; /** L'état d'un indicateur face à sa cible. Trois mots, pas un code couleur muet. */ $etat = function ($valeur, $cible, bool $plusHaut = true): array { if ($valeur === null || $cible === null) { return ['pas encore mesuré', 'gray']; } return ($plusHaut ? $valeur >= $cible : $valeur <= $cible) ? ['atteint', 'success'] : ['à surveiller', 'warning']; }; @endphp
@foreach ($this->moisDisponibles() as $cle => $libelle) @endforeach @if ($gere) Saisir les indicateurs digitaux du mois Générer le rapport mensuel Recalculer @endif @if ($ligne->verrouille) Mois clôturé @endif
@php $dt = $m['delais_tenus'] ?? []; $dtc = $cum['delais_tenus'] ?? []; $vp = $m['valides_premier_passage'] ?? []; $vpc = $cum['valides_premier_passage'] ?? []; $dr = $m['delai_retour'] ?? []; $drc = $cum['delai_retour'] ?? []; $pn = $m['penalites_theoriques'] ?? []; $pnc = $cum['penalites_theoriques'] ?? []; [$dtLib, $dtTon] = $etat($dtc['ratio'] ?? null, $cibles['delais_tenus_pct']); [$vpLib, $vpTon] = $etat($vpc['ratio'] ?? null, $cibles['valides_premier_passage_pct']); [$drLib, $drTon] = $etat($drc['moyenne'] ?? null, $cibles['delai_retour_max_jours'], false); @endphp {{ $dtLib }} {{ $vpLib }} {{ $drLib }} {{ ((float) ($pnc['montant'] ?? 0)) > 0 ? 'à surveiller' : 'atteint' }} @php $cv = $m['couverture'] ?? []; $cvc = $cum['couverture'] ?? []; $pr = $m['promesse_tenue'] ?? []; $prc = $cum['promesse_tenue'] ?? []; $pj = $m['planning_j5'] ?? []; $pjc = $cum['planning_j5'] ?? []; @endphp @forelse ($espace->reseauxConfigures() as $reseau) @php $s = ($ligne->saisis['reseaux'][$reseau['cle']] ?? []); @endphp @empty Aucun réseau configuré — voyez « Paramètres » pour en ajouter. @endforelse @forelse ($this->rapportsGeneres() as $rapport) @if ($gere) Partager avec le client @endif @empty Aucun rapport généré pour cet espace. @endforelse @endif {{-- ═══ PUBLICATIONS ══════════════════════════════════════════════════════════════════ --}} @if ($onglet === 'publications') @if ($gere)
Nouvelle publication
@endif
@foreach ($this::VUES_PUBLICATIONS as $cle => $libelle) @endforeach
@forelse ($this->publications() as $publication) @php $contenu = $publication->contenu(); @endphp {{ $publication->statut->label() }} @if ($gere) Ouvrir {{-- v4.17.0 §B2.6 — Le fil de discussion, avec son composeur. --}} Conversation {{-- v4.13.0 §D — Corriger et retirer, comme pour les livrables (v4.12.0). Réservé au gestionnaire : le client ne voit jamais ces gestes. --}} Supprimer @if ($publication->statut->estModifiable()) Envoyer au client @endif @if ($publication->statut->attendLeClient()) Relancer Décision reçue @endif @if ($publication->statut === \App\Enums\EspaceClient\StatutPublication::Validee) Programmer @endif @if (in_array($publication->statut, [\App\Enums\EspaceClient\StatutPublication::Validee, \App\Enums\EspaceClient\StatutPublication::Programmee], true)) Marquer publiée @endif @if ($publication->statut !== \App\Enums\EspaceClient\StatutPublication::Annulee) Annuler @endif @endif @empty Aucune publication dans cette vue. @endforelse @endif {{-- ═══ ÉVÉNEMENTS ════════════════════════════════════════════════════════════════════ --}} @if ($onglet === 'evenements') @if ($gere)
Planifier un événement
@endif @forelse ($this->evenements() as $evenement) {{ $evenement->statut->label() }} @if ($evenement->promesse_tenue !== null) {{ $evenement->promesse_tenue ? 'promesse tenue' : 'promesse non tenue' }} @endif @if ($gere) {{ $evenement->statut === \App\Enums\EspaceClient\StatutEvenement::Signale ? 'Qualifier' : 'Modifier' }} Galerie {{-- v4.13.0 §D — Corriger et retirer, comme pour les livrables (v4.12.0). Réservé au gestionnaire : le client ne voit jamais ces gestes. --}} Supprimer @endif {{-- La chronologie, étape par étape : c'est la promesse du jour même, pas une décoration. --}} @if ($evenement->etapes())
@foreach ($evenement->etapes() as $etape) @php $fait = filled($etape['fait_le'] ?? null); $enRetard = ! $fait && filled($etape['echeance_le'] ?? null) && \Illuminate\Support\Carbon::parse($etape['echeance_le'])->isPast(); @endphp
$fait, 'border-red-200 bg-red-50 text-red-800 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-300' => $enRetard, 'border-gray-200 bg-white text-gray-600 dark:border-white/10 dark:bg-gray-900 dark:text-gray-300' => ! $fait && ! $enRetard, ])> {{ $etape['libelle'] }} {{ $etape['decalage_h'] < 0 ? 'H'.$etape['decalage_h'] : 'H+'.$etape['decalage_h'] }} @if ($fait) · fait à {{ \Illuminate\Support\Carbon::parse($etape['fait_le'])->format('H:i') }} @endif @if ($etape['cle_promesse']) · promesse @endif @if (! $fait && $gere) @endif
@endforeach
@if ($evenement->galerie_lien)

Galerie : {{ $evenement->galerie_lien }}

@endif
@endif @empty Aucun événement — planifiez la première couverture. @endforelse
@endif {{-- ═══ DEMANDES ══════════════════════════════════════════════════════════════════════ --}} @if ($onglet === 'demandes') @if ($gere)
Saisir une demande reçue
@endif @forelse ($this->demandes() as $demande) {{ $demande->statut->label() }} @if ($gere) @if ($demande->statut->value === 'recue') Qualifier @endif @if ($demande->lettre_commande_id === null) Préparer la lettre @endif {{-- v4.13.0 §D — Corriger et retirer, comme pour les livrables (v4.12.0). Réservé au gestionnaire : le client ne voit jamais ces gestes. --}} Supprimer @endif @empty Aucune demande reçue. @endforelse @endif {{-- ═══ COMMANDES ═════════════════════════════════════════════════════════════════════ --}} @php $vuesCommandes = $this::VUES_COMMANDES; @endphp @if ($onglet === 'commandes') @php $vueCmd = $this->vueCourante($vuesCommandes); @endphp
@foreach ($vuesCommandes as $cle => $libelle) @endforeach
@endif {{-- ─── Commandes › Réceptions (v4.3.0 §C1) ──────────────────────────────────────────── --}} @if ($onglet === 'commandes' && $vueCmd === 'receptions') @php $receptions = $this->receptions(); $reperes = $this->postes(); $commande = round((float) $reperes->sum('montant_commande'), 2); $facture = round((float) $receptions->sum(fn ($r) => $r->invoice_id !== null ? (float) $r->montant_ttc : 0), 2); $valide = round((float) $receptions->sum('montant_ht'), 2); @endphp
@foreach ([ ['Commandé', number_format($commande, 2, ',', ' ').' DH', 'HT, lettres engagées'], ['Livré', $reperes->sum('livre').' ligne(s)', 'remis au moins une fois'], ['Validé', number_format($valide, 2, ',', ' ').' DH', 'HT, base des décomptes'], ['Facturé', number_format($facture, 2, ',', ' ').' DH', 'TTC, décomptes facturés'], ] as [$libelle, $valeur, $detail])

{{ $libelle }}

{{ $valeur }}

{{ $detail }}

@endforeach
@if ($gere)
Générer les périodes
@endif @forelse ($receptions as $reception) {{ $reception->statut->label() }} @if ($gere) Préparer le décompte @if (in_array($reception->statut->value, ['decompte_prepare', 'en_cours'], true)) PV signé @endif @if ($reception->invoice_id === null && $reception->lignes->isNotEmpty()) Créer la facture @endif @endif @if ($reception->lignes->isNotEmpty())
@foreach ($reception->lignes as $l) {{ $l->poste?->numero ?? '?' }} · {{ $nombre($l->quantite) }} × {{ number_format((float) $l->pu_ht, 2, ',', ' ') }} = {{ number_format((float) $l->montant_ht, 2, ',', ' ') }} DH @endforeach
@endif @empty Générez les périodes de réception depuis les dates d'exécution du marché. @endforelse
@endif {{-- ─── Commandes › Pénalités (v4.3.0 §C1) ───────────────────────────────────────────── --}} @if ($onglet === 'commandes' && $vueCmd === 'penalites') @php $simulation = $this->simulationDePenalites(); $theoriques = $this->penalitesTheoriques(); @endphp
{{ number_format($simulation['total'], 2, ',', ' ') }} DH @if ($simulation['plafond_atteint']) plafond atteint @endif
@forelse ($theoriques['lignes'] as $ligne) {{ $ligne['jours'] }} jour(s) @empty Aucun livrable n'a été remis en retard. @endforelse @endif {{-- ─── Commandes › Lettres de commande ──────────────────────────────────────────────── --}} @if ($onglet === 'commandes' && $vueCmd === 'lettres') @forelse ($this->lettres() as $lettre) {{ $lettre->statut->label() }} {{ number_format($lettre->montantHt(), 2, ',', ' ') }} DH @if ($gere && $lettre->statut->value === 'preparee') Envoyer à signer @endif @empty Aucune lettre de commande. @endforelse @forelse ($this->piecesManquantes() as $piece) {{ $piece->debiteur === 'client' ? 'côté client' : 'de notre côté' }} @empty Tous les dossiers sont complets. @endforelse @endif {{-- ─── Commandes › Bordereau ────────────────────────────────────────────────────────── --}} @if ($onglet === 'commandes' && $vueCmd === 'bordereau') @if ($gere)
Poste
@endif @forelse ($this->postes() as $ligne) {{ number_format($ligne['montant_commande'], 2, ',', ' ') }} DH @if ($gere) Modifier Supprimer @endif @empty Aucun poste — ajoutez le premier avec + Poste. @endforelse @endif {{-- ═══ DOCUMENTS ═════════════════════════════════════════════════════════════════════ --}} @if ($onglet === 'documents') @if ($gere)
Ajouter un document
@endif @forelse ($this->documents() as $document) {{ $document->estPartage() ? 'partagé' : 'interne' }} @if ($gere) {{-- v4.13.0 §D — Un document chargé par erreur restait là pour toujours : il se renomme, change de visibilité, et se retire. --}} Modifier Supprimer @endif @empty Aucun document. @endforelse @endif {{-- ═══ RÉUNIONS ══════════════════════════════════════════════════════════════════════ --}} @if ($onglet === 'reunions') @if ($gere)
Proposer un créneau
@endif @forelse ($this->reunions() as $reunion) @if ($gere) Compte rendu {{-- v4.13.0 §D — Corriger et retirer, comme pour les livrables (v4.12.0). Réservé au gestionnaire : le client ne voit jamais ces gestes. --}} Supprimer @endif @empty Aucune réunion — proposez le premier créneau. @endforelse @endif {{-- ═══ JOURNAL E-MAILS ═══════════════════════════════════════════════════════════════ --}} @if ($onglet === 'journal') @forelse ($this->journal() as $ligne) {{ $ligne->statut === 'envoye' ? 'envoyé' : 'échec' }} @empty Aucun e-mail envoyé pour cet espace. @endforelse @endif {{-- ═══ PARAMÈTRES ════════════════════════════════════════════════════════════════════ v4.7.0 §A1 — Chaque « Modifier » ouvre son formulaire SOUS SA CARTE, pas en fin de page. --}} @if ($onglet === 'parametres') @if ($gere) Modifier @endif {{-- v4.8.0 §D4 — Le pont espace client → tâches. v4.30.0 §B5 — Pilotage éteint : la ligne est masquée. --}} @if (\App\Services\Pilotage\Pilotage::actif()) @endif {{-- ─── v4.7.0 §E — L'identité de l'espace : la marque qui exécute, les logos, l'adresse d'envoi, la signature. En haut de l'onglet, sous l'identité : c'est ce que le client voit sur sa page et dans chaque e-mail. ─────────────────────────────────────────── --}} @php // v4.9.0 §C4 — La ligne dit la LISTE des copies visibles, et le NOMBRE des copies // cachées. Les adresses cachées ne s'affichent pas ici : les écrire en clair sur // la fiche viderait « cachée » de son sens. $copiesCc = $espace->adressesCc(); $copiesCci = $espace->adressesCci(); $mentionCopies = ' · copie : '.($copiesCc === [] ? 'aucune' : implode(', ', $copiesCc)); if ($copiesCci !== []) { $mentionCopies .= ' · copie cachée : '.count($copiesCci).' adresse'.(count($copiesCci) > 1 ? 's' : ''); } @endphp @if ($gere) Modifier @endif @if ($espace->logoDuPrestataire()) {{ $espace->nomDuPrestataire() }} @endif @if ($espace->logoDuClient()) {{ $espace->client_nom }} @endif

Signature des e-mails · {{ filled($espace->signature_html) ? 'saisie' : 'générée automatiquement' }}

{!! $this->apercuDeLaSignature() !!}
@if ($gere) Modifier l'adresse @endif @if ($espace->lienPublic())

{{ $espace->lienPublic() }}

@if ($gere)
Renouveler le jeton Voir comme le client {{-- v4.7.0 §B5 — L'espace CONNECTÉ, tel qu'un référent le verrait, sans créer de compte. --}} Voir comme le référent
@endif
{!! $this->qrCode() !!}
@else Le mode d'accès de cet espace n'ouvre pas de lien de lecture. @if ($gere)
Voir comme le référent
@endif @endif {{-- ─── v4.5.0 §7 — Le lien court public, une adresse qu'on donne à voix haute ─── --}} @if ($espace->mode->ouvreLeLienPublic()) @php $hotePublic = \App\Models\EspaceClient\ClientDashboard::hotePublic(); $lienCourt = $espace->lienCourtPublic(); @endphp {{ $espace->lien_court_actif && $hotePublic !== null ? 'actif' : 'éteint' }} @if ($gere) {{-- v4.7.0 §D6 — Sans domaine public, « Activer » est là mais grisé, et dit pourquoi. --}} @if ($hotePublic === null) Activer @else {{ $espace->lien_court_actif ? 'Désactiver' : 'Activer' }} @endif @endif @if ($lienCourt !== null)

{{ $lienCourt }}

Copier Ouvrir
{!! $this->qrCodeCourt() !!}
@endif @endif
@foreach ($this->modules() as $module) {{ $module['actif'] ? 'actif' : 'éteint' }} @if ($gere) ↑ ↓ {{ $module['actif'] ? 'Éteindre' : 'Allumer' }} @endif @endforeach {{-- ─── v4.3.0 §C1 — Les paramètres du lot 2 ─────────────────────────────────── --}} @if ($gere) Modifier @endif @if ($gere) Régénérer les périodes @endif @foreach ([\App\Enums\EspaceClient\ModuleClient::Avancement, \App\Enums\EspaceClient\ModuleClient::Quantites] as $moduleAVues) @php $actives = array_keys(app(\App\Services\EspaceClient\VueClient::class)->vuesActives($espace, $moduleAVues)); @endphp @if ($gere) @foreach ($moduleAVues->vuesPossibles() as $cle => $libelle) {{ $libelle }} @endforeach @endif @endforeach @if ($gere) {{ $espace->optionDuModule(\App\Enums\EspaceClient\ModuleClient::AFaire, 'publications', true) ? 'Retirer' : 'Autoriser' }} @endif @if ($gere) {{ $espace->optionDuModule(\App\Enums\EspaceClient\ModuleClient::Avancement, 'evenements_signalement_client', true) ? 'Retirer' : 'Autoriser' }} @endif {{-- ─── v4.5.0 §4 — Les gestionnaires : à qui la direction confie cet espace ──────── --}} @if ($gere)
Confier à un collaborateur
@endif @forelse ($this->gestionnaires() as $gestionnaire) @if ($gere) Retirer @endif @empty Personne d'autre que la direction ne gère cet espace. @endforelse
@if ($gere)
Inviter une personne
@endif @forelse ($this->acces() as $acces) {{ $acces->actif ? 'actif' : 'désactivé' }} @if ($gere) Renvoyer {{ $acces->actif ? 'Désactiver' : 'Rétablir' }} @endif @empty Aucun compte client — invitez le référent du marché. @endforelse
{{-- ─── v4.5.0 §5 — Le geste sans retour, en dernier et à part ─────────────────────── --}} @if ($gere) Supprimer @endif @endif {{-- ═══ v4.7.0 §D2 — LA BARRE BASSE (sous 768 px) ═══════════════════════════════════════ Cinq entrées avec icône et libellé — Cockpit · Livrables · Publier · Commandes · Plus —, l'onglet courant en évidence, et « Plus » ouvre une feuille avec les autres onglets, dans l'ordre de la fiche. Desktop : rien de tout cela. --}}

Autres onglets

@foreach ($this::ONGLETS as $cle => $libelle) @continue(array_key_exists($cle, $this::BARRE_BASSE)) @endforeach
{{-- ═══ v4.9.0 §B — LE TIROIR DES PANNEAUX DE SAISIE ════════════════════════════════════ « Le formulaire s'ouvre en bas et j'arrive pas à l'ouvrir. » C'était vrai : huit ancres se rendaient sous leur carte, et TOUS LES AUTRES panneaux — livrable, remise, décision, document, réunion… — retombaient sur un include unique en fin de fiche, après six cartes et la carte rouge « Supprimer l'espace ». Il n'y a plus ni l'un ni l'autre : un SEUL tiroir, ancré à l'écran, quelle que soit la position de défilement. Sur bureau il glisse depuis la droite ; sous 640 px, c'est une feuille qui monte du bas. Le CORPS des panneaux n'a pas bougé d'une ligne — mêmes `wire:click`, mêmes `wire:model` : seul le conteneur a changé. Il est rendu APRÈS la barre basse : à z-index égal, c'est le dernier du document qui passe devant. Un tiroir sous la barre de navigation ne serait qu'un autre formulaire qu'on n'atteint pas. Accessibilité : `role="dialog"` + `aria-modal`, piège de focus et défilement du fond bloqué par `x-trap.noscroll` (le plugin focus d'Alpine, déjà livré par Filament), qui rend aussi le focus au déclencheur à la fermeture. Échap, clic sur le fond et le bouton « Fermer » appellent tous les trois la méthode de fermeture existante. --}} @if ($panneau !== null) @endif