/*
 * Styles du lot A — planning conducteur, fenêtre d'affectation et « Mon planning ».
 * Fichier propriété du lot A (lié par base.html.twig). Classes préfixées gp-,
 * couleurs et espacements tirés des jetons --gp-* de app.css.
 *
 * La grille doit rester lisible avec une vingtaine de lignes sur cinq jours :
 * en-têtes de colonnes et colonne des noms collés pendant le défilement, et
 * défilement horizontal DANS le cadre de la grille seulement (jamais la page)
 * sur petit écran. Elle s'imprime sur une page A4 paysage.
 */

/* ================================================================== */
/* 1. En-tête et barre d'outils de la grille                          */
/* ================================================================== */

.gp-planning-entete {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--gp-e3);
    margin-bottom: var(--gp-e4);
}

.gp-planning-outils {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--gp-e2) var(--gp-e4);
    margin-bottom: var(--gp-e3);
}

.gp-planning-outils__semaine {
    display: flex;
    gap: var(--gp-e2);
    align-items: center;
}

.gp-planning-outils__semaine .form-control {
    width: 11rem;
}

.gp-planning-outils__vue {
    display: flex;
    flex-wrap: wrap;
    gap: var(--gp-e2);
    margin-left: auto;
}

.gp-planning-copie {
    margin-bottom: var(--gp-e3);
}

.gp-planning-copie > summary {
    cursor: pointer;
    font-weight: 600;
    list-style-position: inside;
    min-height: var(--gp-cible);
    display: flex;
    align-items: center;
    gap: var(--gp-e2);
}

.gp-planning-copie:not([open]) > summary {
    border-bottom: 0;
}

.gp-planning-copie__remplacer {
    min-height: 2.375rem;
    display: flex;
    align-items: center;
    gap: var(--gp-e2);
}

.gp-planning-conflits ul,
.gp-planning-chefs ul {
    padding-left: 1.1rem;
}

/* Le repère des cases dont le chef du jour est indisponible, tel qu'il
   apparaît dans la grille (bandeau et légende). */
.gp-planning-chefs__repere {
    color: var(--gp-rouge);
}

/* Une phrase d'aide : l'icône, puis le texte d'un seul tenant dans un <span>
   (liens et pictogrammes compris). Chaque nœud posé directement dans la
   grille deviendrait sinon une colonne à part. */
.gp-planning-info {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr);
    align-items: baseline;
    column-gap: var(--gp-e2);
    color: var(--gp-ardoise-600);
    font-size: 0.9rem;
    margin-bottom: var(--gp-e3);
}

/* ================================================================== */
/* 2. La grille                                                       */
/* ================================================================== */

.gp-grille {
    /* Le cadre défile dans les deux sens : c'est lui, et non la page, qui
       porte le défilement horizontal au téléphone, et c'est par rapport à lui
       que l'en-tête et la colonne des noms restent collés. */
    overflow: auto;
    /* Bloc conteneur des textes réservés aux lecteurs d'écran (.visually-hidden,
       positionnés en absolu) : sans lui, ils sortiraient du cadre et
       élargiraient la page au téléphone. */
    position: relative;
    max-height: calc(100dvh - 8.5rem);
    overscroll-behavior-x: contain;
    background: var(--gp-surface);
    border: 1px solid var(--gp-trait);
    border-radius: var(--gp-radius);
    box-shadow: var(--gp-ombre);
}

.gp-grille:focus-visible {
    outline-offset: 0;
}

.gp-grille__table {
    /* Disposition fixe : cinq colonnes de jour égales, quelle que soit la
       longueur des noms de clients ; au téléphone, la table garde sa largeur
       utile et c'est le cadre qui défile. */
    --gp-col-nom: 12.5rem;
    --gp-col-jour: 10rem;
    table-layout: fixed;
    width: max(100%, calc(var(--gp-col-nom) + 5 * var(--gp-col-jour)));
    border-collapse: separate;
    border-spacing: 0;
    font-size: 0.875rem;
}

.gp-grille__table th,
.gp-grille__table td {
    border-right: 1px solid var(--gp-trait);
    border-bottom: 1px solid var(--gp-trait);
}

.gp-grille__table tr > :last-child {
    border-right: 0;
}

/* En-têtes de colonnes collés en haut du cadre. */
.gp-grille__table thead th {
    position: sticky;
    top: 0;
    z-index: 3;
    background: var(--gp-surface);
    border-bottom: 2px solid var(--gp-trait-fort);
    padding: var(--gp-e2) var(--gp-e2);
    text-align: left;
    vertical-align: bottom;
    font-weight: 700;
}

.gp-grille__jour-nom {
    display: block;
    font-size: 0.9rem;
    color: var(--gp-nuit);
}

.gp-grille__jour-compte {
    display: block;
    font-size: 0.72rem;
    font-weight: 500;
    color: var(--gp-ardoise-600);
    white-space: nowrap;
}

.gp-grille__jour--aujourdhui {
    box-shadow: inset 0 -3px 0 var(--gp-jaune);
}

.gp-grille__aujourdhui {
    display: inline-block;
    padding: 0 0.3rem;
    border-radius: 3px;
    background: var(--gp-jaune);
    color: var(--gp-nuit);
    font-size: 0.68rem;
    font-weight: 700;
    vertical-align: 0.1em;
}

/* Colonne des noms collée à gauche ; le coin reste au-dessus de tout. */
.gp-grille__coin,
.gp-grille__nom {
    position: sticky;
    left: 0;
    width: var(--gp-col-nom);
    background: var(--gp-surface);
    box-shadow: inset -1px 0 0 var(--gp-trait-fort);
}

.gp-grille__table thead .gp-grille__coin {
    z-index: 4;
}

.gp-grille__nom {
    z-index: 2;
    padding: var(--gp-e2);
    text-align: left;
    vertical-align: top;
    font-weight: 400;
}

.gp-grille__coin-total {
    display: block;
    font-size: 0.72rem;
    font-weight: 500;
    color: var(--gp-ardoise-600);
}

.gp-grille__personne {
    display: block;
    font-weight: 700;
    line-height: 1.25;
    color: var(--gp-nuit);
    overflow-wrap: anywhere;
}

.gp-grille__infos {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.25rem 0.4rem;
    margin-top: 0.15rem;
    font-size: 0.75rem;
    color: var(--gp-ardoise-600);
}

.gp-grille__infos .gp-tag {
    font-size: 0.68rem;
    padding: 0 0.35rem;
}

.gp-grille__ligne--inactive .gp-grille__personne {
    color: var(--gp-ardoise-500);
    text-decoration: line-through;
}

/* Bandeau d'équipe (vue regroupée) : un intertitre, pas une ligne de données. */
.gp-grille__groupe th {
    background: var(--gp-fond-creux);
    padding: 0.3rem var(--gp-e2);
    font-size: 0.72rem;
    font-weight: 700;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--gp-ardoise-700);
    text-align: left;
}

.gp-grille__groupe th > span {
    position: sticky;
    left: var(--gp-e2);
}

/* ------------------------------------------------------------------ */
/* Cellules                                                           */
/* ------------------------------------------------------------------ */

.gp-cellule {
    /* Hauteur 1px : le lien intérieur peut alors occuper toute la case. */
    height: 1px;
    padding: 0;
    vertical-align: top;
    background: var(--gp-surface);
}

.gp-cellule__lien {
    display: flex;
    flex-direction: column;
    gap: 0.2rem;
    height: 100%;
    min-height: 4.5rem;
    padding: 0.4rem 0.5rem;
    color: inherit;
    text-decoration: none;
}

.gp-cellule__lien:hover {
    background: var(--gp-bleu-chantier-pale);
    color: inherit;
}

.gp-cellule__lien:focus-visible {
    outline-offset: -3px;
}

.gp-cellule--affectee .gp-cellule__lien {
    box-shadow: inset 3px 0 0 var(--gp-bleu-chantier);
}

.gp-cellule--aujourdhui {
    background: #fffcf0;
}

.gp-cellule--conflit .gp-cellule__lien {
    background: var(--gp-rouge-pale);
    box-shadow: inset 3px 0 0 var(--gp-rouge);
}

.gp-cellule__tete {
    display: flex;
    align-items: center;
    gap: 0.35rem;
}

.gp-cellule__chantier {
    font-weight: 800;
    font-variant-numeric: tabular-nums;
    color: var(--gp-nuit);
    letter-spacing: 0.01em;
}

.gp-cellule__consigne {
    color: var(--gp-bleu-chantier);
    margin-left: auto;
}

.gp-cellule__client {
    font-size: 0.78rem;
    line-height: 1.25;
    color: var(--gp-ardoise-600);
    display: -webkit-box;
    -webkit-line-clamp: 2;
    line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

.gp-cellule__chef {
    font-size: 0.75rem;
    color: var(--gp-ardoise-700);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* Chef du jour absent, désactivé ou déclassé depuis : lu en entier, en alerte. */
.gp-cellule__chef--hors-service {
    white-space: normal;
    color: var(--gp-rouge);
    font-weight: 600;
}

/* La case qu'on vient d'enregistrer, retrouvée après le rechargement de la
   grille (contrôleur planning-modale) : un cadre bref pour que l'œil la
   repère, sans masquer le contour de focus du lien. */
.gp-cellule--retrouvee {
    outline: 3px solid var(--gp-bleu-chantier);
    outline-offset: -3px;
    animation: gp-cellule-retrouvee 2.4s ease-out forwards;
}

@keyframes gp-cellule-retrouvee {
    0%,
    50% {
        outline-color: var(--gp-bleu-chantier);
    }

    100% {
        outline-color: transparent;
    }
}

@media (prefers-reduced-motion: reduce) {
    .gp-cellule--retrouvee {
        animation: none;
    }
}

.gp-cellule__retiree {
    align-self: flex-start;
    font-size: 0.7rem;
    color: var(--gp-ardoise-600);
    border: 1px dashed var(--gp-trait-fort);
    border-radius: 3px;
    padding: 0 0.3rem;
}

/* Absence : la grande lettre du papier, case grisée et non cliquable. */
.gp-cellule--absence {
    text-align: center;
    vertical-align: middle;
    color: var(--gp-ardoise-600);
    cursor: not-allowed;
    background: repeating-linear-gradient(135deg, var(--gp-fond-creux) 0 6px, var(--gp-ardoise-200) 6px 12px);
}

.gp-cellule__absence {
    display: block;
    font-size: 2rem;
    font-weight: 800;
    line-height: 1;
    color: var(--gp-ardoise-700);
}

.gp-cellule__motif {
    display: block;
    font-size: 0.72rem;
    font-weight: 600;
}

.gp-cellule--libre .gp-cellule__ajout {
    align-items: center;
    justify-content: center;
    color: var(--gp-ardoise-300);
    font-size: 1.2rem;
}

.gp-cellule--libre .gp-cellule__ajout:hover,
.gp-cellule--libre .gp-cellule__ajout:focus-visible {
    color: var(--gp-bleu-chantier);
}

/* Raccourci « déclarer une absence » d'une case libre : dans le coin, discret
   pour ne pas concurrencer le « + », mais toujours présent (pas de survol au
   téléphone). */
.gp-cellule--libre {
    position: relative;
}

.gp-cellule__absent {
    position: absolute;
    right: 0.15rem;
    bottom: 0.15rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.75rem;
    height: 1.75rem;
    border-radius: var(--gp-radius, 0.375rem);
    color: var(--gp-ardoise-300);
    font-size: 0.9rem;
    text-decoration: none;
}

.gp-cellule__absent:hover,
.gp-cellule__absent:focus-visible {
    color: var(--gp-ambre, #b45309);
    background: var(--gp-ambre-pale, #fff7ed);
}

/* Machines : code du parc, ou « LOC » et son matériel loué. */
.gp-machines {
    display: flex;
    flex-wrap: wrap;
    gap: 0.2rem;
    min-width: 0;
}

.gp-machine {
    display: inline-flex;
    align-items: baseline;
    gap: 0.3rem;
    max-width: 100%;
    padding: 0.05rem 0.35rem;
    border-radius: 4px;
    background: var(--gp-ardoise-200);
    color: var(--gp-nuit);
    font-size: 0.75rem;
    font-weight: 700;
    line-height: 1.35;
}

.gp-machine__code {
    white-space: nowrap;
    font-variant-numeric: tabular-nums;
}

.gp-machine__detail {
    font-weight: 500;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.gp-machine--loc {
    background: var(--gp-jaune-pale);
    color: var(--gp-ambre);
    box-shadow: inset 0 0 0 1px #e0b53a;
}

.gp-pastille-conflit {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: none;
    width: 1.15rem;
    height: 1.15rem;
    border-radius: 50%;
    background: var(--gp-rouge);
    color: #fff;
    font-size: 0.72rem;
    font-weight: 800;
    line-height: 1;
}

/* Légende sous la grille. */
.gp-planning-legende {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--gp-e2) var(--gp-e4);
    margin: var(--gp-e3) 0 0;
    font-size: 0.8rem;
    color: var(--gp-ardoise-600);
}

.gp-planning-legende > span {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
}

.gp-cellule-exemple {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.35rem;
    height: 1.35rem;
    border: 1px solid var(--gp-trait-fort);
    border-radius: 3px;
    font-weight: 800;
    font-size: 0.8rem;
    color: var(--gp-ardoise-600);
    background: var(--gp-surface);
}

.gp-cellule-exemple--absence {
    background: var(--gp-fond-creux);
    color: var(--gp-ardoise-700);
}

/* Mention réservée au papier (« Imprimé le … ») : utilitaire, donc
   prioritaire comme ceux de Bootstrap. Sans !important, une règle de mise en
   page plus précise (`.gp-planning-legende > span`) l'affichait à l'écran. */
.gp-print-seulement {
    display: none !important;
}

/* Téléphone : colonnes plus serrées, le cadre défile horizontalement. */
@media (max-width: 575.98px) {
    .gp-grille {
        max-height: calc(100dvh - 6rem);
        margin-inline: calc(-1 * var(--gp-e2));
        border-radius: var(--gp-radius-sm);
    }

    .gp-grille__table {
        --gp-col-nom: 7.75rem;
        --gp-col-jour: 8.75rem;
    }

    /* Barre d'outils compacte : la grille doit apparaître sans défiler. */
    .gp-planning-outils {
        padding: var(--gp-e2);
    }

    .gp-planning-outils > .btn-group {
        width: 100%;
    }

    .gp-planning-outils > .btn-group > .btn {
        flex: 1 1 auto;
        white-space: nowrap;
        padding-inline: var(--gp-e2);
    }

    .gp-planning-outils__semaine {
        width: 100%;
    }

    .gp-planning-outils__semaine .form-control {
        flex: 1 1 auto;
        width: auto;
        min-width: 0;
    }

    .gp-planning-outils__vue {
        width: 100%;
        margin-left: 0;
    }

    .gp-planning-outils__vue > .btn {
        flex: 1 1 auto;
        font-size: 0.875rem;
        padding-inline: var(--gp-e2);
    }

    .gp-grille__jour-compte {
        white-space: normal;
    }
}

@media (pointer: coarse) {
    .gp-cellule__lien {
        min-height: 5rem;
    }
}

/* ================================================================== */
/* 3. Fenêtre d'affectation (modale) et formulaires                   */
/* ================================================================== */

/* La modale défile dans son corps : la frame et le formulaire, insérés entre
   .modal-content et .modal-body, doivent laisser passer la mise en page flex. */
.gp-modale-planning turbo-frame,
.gp-modale-planning .gp-cadre,
.gp-modale-planning .gp-form-affectation {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-height: 0;
}

.gp-modale-planning .modal-body {
    overflow-y: auto;
}

.gp-cadre__titre {
    min-width: 0;
}

/* Pleine page (case ouverte dans un nouvel onglet, sans JavaScript, lien
   « modifier au planning » d'un refus d'absence) : le cadre n'est pas dans
   une .modal, seule à définir les variables dont Bootstrap tire les marges
   de .modal-header, .modal-body et .modal-footer. On les pose ici, sinon
   libellés et champs touchent la bordure de la carte. */
.gp-cadre--page {
    --bs-modal-padding: var(--gp-e4);
    --bs-modal-header-padding-x: var(--gp-e4);
    --bs-modal-header-padding-y: var(--gp-e3);
    --bs-modal-header-padding: var(--gp-e3) var(--gp-e4);
    --bs-modal-header-border-width: 1px;
    --bs-modal-header-border-color: var(--gp-trait);
    --bs-modal-footer-gap: var(--gp-e2);
    --bs-modal-footer-border-width: 1px;
    --bs-modal-footer-border-color: var(--gp-trait);
    max-width: 48rem;
}

.gp-cadre__actions {
    flex-wrap: wrap;
    gap: var(--gp-e2);
}

.gp-cadre__actions > * {
    margin: 0;
}

/* Pleine page au téléphone : les actions restent au pouce, en bas de l'écran.
   Le filet et la marge du haut les détachent du texte qui défile dessous. */
.gp-cadre--page .gp-cadre__actions {
    position: sticky;
    bottom: 0;
    z-index: 5;
    background: var(--gp-surface);
    border-radius: 0 0 var(--gp-radius) var(--gp-radius);
    padding: var(--gp-e3) var(--gp-e4) calc(var(--gp-e3) + env(safe-area-inset-bottom));
}

@media (max-width: 575.98px) {
    .gp-cadre__actions > * {
        flex: 1 1 auto;
    }

    .gp-cadre__actions > .btn-primary {
        order: -1;
        flex-basis: 100%;
    }
}

.gp-recherche-chantier {
    position: relative;
    margin-bottom: var(--gp-e2);
}

.gp-recherche-chantier > .bi {
    position: absolute;
    left: 0.75rem;
    top: 50%;
    transform: translateY(-50%);
    color: var(--gp-ardoise-500);
    pointer-events: none;
}

.gp-recherche-chantier > .form-control {
    padding-left: 2.25rem;
}

.gp-lignes-machine {
    display: grid;
    gap: var(--gp-e2);
    margin-bottom: var(--gp-e2);
}

.gp-ligne-machine {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    gap: var(--gp-e2);
    align-items: start;
    padding: var(--gp-e2);
    background: var(--gp-fond);
    border: 1px solid var(--gp-trait);
    border-radius: var(--gp-radius-sm);
}

.gp-ligne-machine__retirer {
    min-width: var(--gp-cible);
    min-height: 2.375rem;
}

.gp-ligne-machine__location {
    grid-column: 1 / -1;
}

.gp-ligne-machine > .invalid-feedback,
.gp-ligne-machine > ul {
    grid-column: 1 / -1;
}

.gp-lignes-machine__vide {
    padding: var(--gp-e2) var(--gp-e3);
    margin-bottom: var(--gp-e2);
    border: 1px dashed var(--gp-trait-fort);
    border-radius: var(--gp-radius-sm);
    color: var(--gp-ardoise-600);
    font-size: 0.9rem;
}

.gp-duplication-modele {
    padding: var(--gp-e3);
    background: var(--gp-fond);
    border: 1px solid var(--gp-trait);
    border-radius: var(--gp-radius-sm);
}

.gp-duplication-jour .form-check-label {
    min-height: 1.75rem;
}

/* ================================================================== */
/* 4. « Mon planning » — le téléphone de chantier                     */
/* ================================================================== */

.gp-mon-planning {
    max-width: 42rem;
    margin-inline: auto;
}

.gp-mon-planning__semaine + .gp-mon-planning__semaine {
    margin-top: var(--gp-e6);
}

.gp-mon-planning__titre {
    display: flex;
    flex-direction: column;
    gap: 0.1rem;
    font-size: 1.2rem;
    margin: var(--gp-e4) 0 var(--gp-e3);
}

.gp-mon-planning__periode {
    font-size: 0.875rem;
    font-weight: 500;
    color: var(--gp-ardoise-600);
    letter-spacing: 0;
}

.gp-jours {
    list-style: none;
    margin: 0;
    padding: 0;
    display: grid;
    /* Une seule colonne, jamais plus large que l'écran : un libellé long ne
       doit pas élargir toutes les cartes (et la page) au téléphone. */
    grid-template-columns: minmax(0, 1fr);
    gap: var(--gp-e3);
}

.gp-jour__carte {
    overflow: hidden;
}

.gp-jour--aujourdhui .gp-jour__carte {
    border: 2px solid var(--gp-jaune);
    box-shadow: var(--gp-ombre-haute);
}

.gp-jour__entete {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--gp-e2);
    padding: var(--gp-e2) var(--gp-e4);
    border-bottom: 1px solid var(--gp-trait);
    background: var(--gp-surface);
}

.gp-jour--passe .gp-jour__entete {
    background: var(--gp-fond-creux);
}

.gp-jour__date {
    font-size: 1rem;
    margin: 0;
}

.gp-jour__corps {
    padding: var(--gp-e3) var(--gp-e4) var(--gp-e4);
}

.gp-jour__chantier {
    font-size: 1.1rem;
    font-weight: 700;
    line-height: 1.3;
    margin-bottom: var(--gp-e1);
    color: var(--gp-nuit);
}

.gp-jour__reference {
    display: inline-block;
    padding: 0 0.4rem;
    margin-right: 0.3rem;
    border-radius: 4px;
    background: var(--gp-nuit);
    color: #fff;
    font-variant-numeric: tabular-nums;
}

.gp-jour__libelle {
    margin-bottom: var(--gp-e1);
    color: var(--gp-ardoise-700);
}

.gp-jour__lieu {
    display: flex;
    gap: 0.4rem;
    color: var(--gp-ardoise-600);
    margin-bottom: 0;
}

.gp-jour__details {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr);
    gap: var(--gp-e2) var(--gp-e3);
    margin: var(--gp-e3) 0 0;
}

.gp-jour__details dt {
    font-size: 0.85rem;
    font-weight: 600;
    color: var(--gp-ardoise-600);
    padding-top: 0.1rem;
}

.gp-jour__details dd {
    margin: 0;
    min-width: 0;
}

.gp-jour__details .gp-machine {
    font-size: 0.875rem;
}

/* Sur la carte du jour, le libellé complet de l'engin se lit en entier. */
.gp-jour__details .gp-machine__detail {
    white-space: normal;
}

.gp-jour__details .gp-machines {
    gap: 0.35rem;
}

/* Équipe du jour : le matériel loué d'un équipier (« LOC — mini-pelle louée
   chez… ») se lit aussi en entier, sur plusieurs lignes si besoin. */
.gp-jour__equipe .gp-machine__detail {
    white-space: normal;
}

.gp-jour__consigne {
    display: flex;
    gap: var(--gp-e2);
    margin-top: var(--gp-e3);
    padding: var(--gp-e2) var(--gp-e3);
    background: var(--gp-jaune-pale);
    border-left: 4px solid var(--gp-jaune);
    border-radius: var(--gp-radius-sm);
    color: var(--gp-nuit);
}

.gp-jour__absence {
    display: flex;
    align-items: center;
    gap: var(--gp-e3);
    margin-bottom: var(--gp-e2);
}

.gp-jour__lettre {
    display: flex;
    align-items: center;
    justify-content: center;
    flex: none;
    width: 3.25rem;
    height: 3.25rem;
    border-radius: var(--gp-radius);
    background: var(--gp-fond-creux);
    color: var(--gp-ardoise-700);
    font-size: 2rem;
    font-weight: 800;
}

.gp-jour__equipe-titre {
    margin: var(--gp-e4) 0 var(--gp-e1);
}

.gp-jour__equipe {
    list-style: none;
    margin: 0;
    padding: 0;
}

.gp-jour__equipe > li {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.25rem 0.6rem;
    padding: var(--gp-e2) 0;
    border-top: 1px solid var(--gp-trait);
}

.gp-jour__membre {
    font-weight: 600;
}

.gp-jour__autre-chantier {
    flex-basis: 100%;
    font-size: 0.85rem;
    color: var(--gp-ardoise-600);
}

/* Consigne du conducteur pour un équipier, sous son nom (vue du chef). */
.gp-jour__consigne-membre {
    flex-basis: 100%;
    display: flex;
    gap: var(--gp-e2);
    font-size: 0.9rem;
    color: var(--gp-nuit);
}

.gp-jour__consigne-membre .bi {
    color: var(--gp-bleu-chantier);
}

/* Chef du jour absent ou hors service : à régler avec le conducteur. */
.gp-jour__alerte {
    display: flex;
    gap: var(--gp-e2);
    margin-top: var(--gp-e3);
    padding: var(--gp-e2) var(--gp-e3);
    background: var(--gp-ambre-pale);
    border-left: 4px solid var(--gp-ambre);
    border-radius: var(--gp-radius-sm);
    color: var(--gp-nuit);
}

.gp-jour__alerte > .bi {
    color: var(--gp-ambre);
}

.gp-jour__tel {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    min-height: var(--gp-cible);
    font-weight: 600;
    text-decoration: none;
}

.gp-jour__vide {
    margin: 0;
    color: var(--gp-ardoise-600);
}

.gp-jour__actions {
    display: grid;
    gap: var(--gp-e2);
    padding: 0 var(--gp-e4) var(--gp-e4);
}

.gp-jour__actions .btn {
    min-height: var(--gp-cible);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--gp-e2);
}

/* ================================================================== */
/* 5. Impression : la semaine sur une page A4 paysage                 */
/* ================================================================== */

/* Page nommée : seule la grille passe en paysage, pas les autres écrans. */
@page planning {
    size: A4 landscape;
    margin: 7mm 8mm;
}

@media print {
    .gp-planning {
        page: planning;
    }

    .gp-print-seulement {
        display: inline !important;
    }

    /* Chaque millimètre compte : la semaine d'une vingtaine de personnes,
       regroupée par équipe ou encadrement compris, tient sur la page. */
    .gp-planning-entete {
        margin-bottom: 1.5mm;
    }

    .gp-planning .gp-page-titre {
        font-size: 12pt;
        margin-bottom: 0;
    }

    .gp-planning .gp-page-soustitre {
        font-size: 8pt;
    }

    .gp-planning-copie,
    .gp-planning-outils,
    .gp-planning-info,
    .gp-modale-planning {
        display: none !important;
    }

    .gp-planning-conflits {
        font-size: 7pt;
        line-height: 1.25;
        padding: 0.8mm 2mm;
        margin-bottom: 1mm;
        border: 1px solid #999;
    }

    .gp-planning-conflits > .bi {
        font-size: 9pt;
        line-height: 1.25;
    }

    .gp-planning-conflits .gp-pastille-conflit {
        width: 3mm;
        height: 3mm;
        font-size: 6pt;
    }

    /* Sur papier, les conflits suivent la phrase sur la même ligne : une
       semaine regroupée par équipe, encadrement compris, tient alors sur une
       page. */
    .gp-planning-conflits ul {
        display: inline;
        padding-left: 0;
        margin: 0 !important;
    }

    .gp-planning-conflits li {
        display: inline;
    }

    .gp-planning-conflits li::before {
        content: " · ";
    }

    .gp-grille {
        overflow: visible;
        max-height: none;
        border: 0;
        border-radius: 0;
        box-shadow: none;
        margin: 0;
    }

    /* Bordures fusionnées à l'impression : le mode « séparé » de l'écran
       (nécessaire aux en-têtes collants) perd des traits sur papier. */
    .gp-grille__table {
        --gp-col-nom: 32mm;
        width: 100%;
        border-collapse: collapse;
        font-size: 7pt;
    }

    .gp-grille__table th,
    .gp-grille__table td {
        border: 0.5pt solid #888 !important;
    }

    .gp-grille__table thead th,
    .gp-grille__coin,
    .gp-grille__nom,
    .gp-grille__groupe th > span {
        position: static;
        box-shadow: none;
    }

    .gp-grille__table thead {
        display: table-header-group;
    }

    .gp-grille__table thead th,
    .gp-grille__nom {
        padding: 0.4mm 1.2mm;
    }

    .gp-grille__personne {
        line-height: 1.15;
    }

    .gp-grille__infos .gp-tag {
        font-size: 5.5pt;
        line-height: 1.2;
        padding: 0 0.8mm;
    }

    .gp-grille__groupe th {
        padding: 0.2mm 1.2mm;
        font-size: 6pt;
        line-height: 1.1;
    }

    .gp-grille__jour-nom {
        font-size: 8pt;
    }

    .gp-grille__aujourdhui {
        font-size: 6pt;
    }

    .gp-grille__infos {
        margin-top: 0;
    }

    .gp-grille__ligne {
        break-inside: avoid;
    }

    /* Une case tient en deux lignes, pour qu'une vingtaine de personnes
       tiennent sur la page : la référence suivie du client (tronqué), puis
       machines et chef à la suite. Le ::before, placé entre les deux par
       `order`, force le retour à la ligne. */
    .gp-cellule {
        height: auto;
    }

    .gp-cellule__lien {
        flex-direction: row;
        flex-wrap: wrap;
        align-items: baseline;
        gap: 0 1.2mm;
        height: auto;
        min-height: 0;
        padding: 0.4mm 1.2mm;
        line-height: 1.15;
        box-shadow: none !important;
    }

    .gp-cellule__lien::before {
        content: "";
        order: 0;
        flex-basis: 100%;
        height: 0;
    }

    .gp-cellule__lien:hover {
        background: transparent;
    }

    .gp-cellule__tete {
        order: -2;
        flex: none;
    }

    .gp-cellule__client {
        order: -1;
        flex: 1 1 0;
        min-width: 0;
        display: block;
        white-space: nowrap;
        text-overflow: ellipsis;
    }

    /* Le matériel loué se lit en entier sur papier : c'est ce qui dit au
       chantier quoi récupérer et chez quel loueur (synthèse §4.3). */
    .gp-machine__detail {
        white-space: normal;
        overflow: visible;
    }

    .gp-cellule__client,
    .gp-cellule__chef,
    .gp-cellule__motif,
    .gp-grille__infos,
    .gp-grille__jour-compte,
    .gp-grille__coin-total {
        font-size: 6.5pt;
    }

    .gp-cellule__ajout .bi {
        display: none;
    }

    .gp-cellule--conflit .gp-cellule__lien,
    .gp-cellule--absence,
    .gp-pastille-conflit,
    .gp-machine,
    .gp-grille__aujourdhui {
        -webkit-print-color-adjust: exact;
        print-color-adjust: exact;
    }

    .gp-cellule--absence {
        background: #e5e5e5;
        vertical-align: middle;
    }

    /* Absence : la lettre et son motif sur une seule ligne. */
    .gp-cellule__absence {
        display: inline;
        font-size: 9pt;
    }

    .gp-cellule__motif {
        display: inline;
        margin-left: 0.8mm;
    }

    .gp-cellule--aujourdhui {
        background: transparent;
    }

    .gp-machine {
        font-size: 6.5pt;
        line-height: 1.15;
        padding: 0 0.8mm;
    }

    .gp-planning-legende {
        font-size: 6.5pt;
        gap: 1mm 4mm;
        margin-top: 1mm;
        break-inside: avoid;
    }

    .gp-planning-legende .gp-cellule-exemple,
    .gp-planning-legende .gp-pastille-conflit {
        width: 3.2mm;
        height: 3.2mm;
        font-size: 6pt;
    }
}

/* Bouton « Chercher dans Eviatrans » du formulaire d'affectation (lien direct, référence inconnue du planning). */
.gp-recherche-eviatrans {
    margin-top: var(--gp-e2);
}
