/*
 * Socle visuel Atlas.
 *
 * Contraintes de conception, issues de l'usage réel en atelier :
 *  - Cibles tactiles de 48 px minimum : la saisie se fait debout, parfois avec
 *    des gants, sur un iPad posé sur une aile.
 *  - Aucune interaction dépendant du survol ni du clic droit — inatteignables
 *    au doigt. Tout ce qui est actionnable est visible en permanence.
 *  - Contraste élevé : l'éclairage d'un atelier est mauvais et l'écran est
 *    souvent vu de biais.
 *  - Aucune dimension fixe en pixels sur les conteneurs : la même page sert un
 *    écran de bureau et une tablette.
 */

:root {
    --mh-encre: #14181d;
    --mh-encre-douce: #5b6672;
    --mh-bord: #dde3ea;
    --mh-fond: #f4f6f9;
    --mh-surface: #ffffff;

    --mh-accent: #0b5cad;
    --mh-accent-sombre: #084887;
    --mh-accent-pale: #e8f1fb;

    --mh-succes: #0f7a4d;
    --mh-alerte: #a8410a;
    --mh-danger: #b3261e;
    --mh-danger-pale: #fdecea;

    --mh-rayon: 10px;
    --mh-cible: 48px;
    --mh-ombre: 0 1px 2px rgba(20, 24, 29, .06), 0 4px 12px rgba(20, 24, 29, .06);
}

.mh {
    color: var(--mh-encre);
    font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
    font-size: 16px;
    line-height: 1.5;
}

/* --- En-tête de page ---------------------------------------------------- */

.mh-entete {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    justify-content: space-between;
    gap: 1rem;
    margin-bottom: 1.5rem;
}

.mh-entete h1 {
    font-size: 1.75rem;
    font-weight: 650;
    letter-spacing: -.02em;
    margin: 0;
}

.mh-compte {
    color: var(--mh-encre-douce);
    font-size: .95rem;
    font-variant-numeric: tabular-nums;
}

/* --- Barre d'outils ----------------------------------------------------- */

.mh-outils {
    display: flex;
    flex-wrap: wrap;
    gap: .75rem;
    margin-bottom: 1.25rem;
}

.mh-recherche {
    flex: 1 1 18rem;
    position: relative;
}

.mh-recherche input {
    width: 100%;
    min-height: var(--mh-cible);
    padding: 0 1rem 0 2.75rem;
    font-size: 1rem;
    color: var(--mh-encre);
    background: var(--mh-surface);
    border: 1.5px solid var(--mh-bord);
    border-radius: var(--mh-rayon);
}

.mh-recherche input:focus {
    outline: none;
    border-color: var(--mh-accent);
    box-shadow: 0 0 0 3px var(--mh-accent-pale);
}

.mh-recherche svg {
    position: absolute;
    left: .9rem;
    top: 50%;
    transform: translateY(-50%);
    color: var(--mh-encre-douce);
    pointer-events: none;
}

/* --- Boutons ------------------------------------------------------------ */

.mh-bouton {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: .5rem;
    min-height: var(--mh-cible);
    padding: 0 1.25rem;
    font-size: 1rem;
    font-weight: 550;
    font-family: inherit;
    color: var(--mh-encre);
    background: var(--mh-surface);
    border: 1.5px solid var(--mh-bord);
    border-radius: var(--mh-rayon);
    cursor: pointer;
    transition: background-color .12s, border-color .12s;
}

.mh-bouton:hover { background: var(--mh-fond); }
.mh-bouton:focus-visible { outline: 3px solid var(--mh-accent-pale); outline-offset: 1px; }

.mh-bouton--primaire {
    color: #fff;
    background: var(--mh-accent);
    border-color: var(--mh-accent);
}

.mh-bouton--primaire:hover { background: var(--mh-accent-sombre); border-color: var(--mh-accent-sombre); }

.mh-bouton--danger { color: var(--mh-danger); border-color: #e9c4c1; }
.mh-bouton--danger:hover { background: var(--mh-danger-pale); }

.mh-bouton:disabled { opacity: .5; cursor: not-allowed; }

/* --- Tableau ------------------------------------------------------------ */

.mh-tableau-cadre {
    background: var(--mh-surface);
    border: 1px solid var(--mh-bord);
    border-radius: var(--mh-rayon);
    box-shadow: var(--mh-ombre);
    overflow-x: auto;
}

.mh-tableau {
    width: 100%;
    border-collapse: collapse;
    font-size: .975rem;
}

.mh-tableau th {
    padding: .875rem 1rem;
    text-align: left;
    font-size: .8rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .05em;
    color: var(--mh-encre-douce);
    background: var(--mh-fond);
    border-bottom: 1px solid var(--mh-bord);
    white-space: nowrap;
}

.mh-tableau td {
    padding: .875rem 1rem;
    border-bottom: 1px solid var(--mh-bord);
    vertical-align: middle;
}

.mh-tableau tbody tr:last-child td { border-bottom: none; }
.mh-tableau tbody tr:hover { background: var(--mh-fond); }

.mh-principal { font-weight: 600; }
.mh-secondaire { color: var(--mh-encre-douce); font-size: .9rem; }
.mh-nombre { font-variant-numeric: tabular-nums; text-align: right; }

/* Plaque d'immatriculation — c'est la clé d'entrée du métier, elle doit se
   repérer instantanément dans une liste. */
.mh-plaque {
    display: inline-block;
    padding: .3rem .6rem;
    font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
    font-size: .95rem;
    font-weight: 650;
    letter-spacing: .06em;
    text-transform: uppercase;
    background: var(--mh-encre);
    color: #fff;
    border-radius: 5px;
    white-space: nowrap;
}

.mh-actions { display: flex; gap: .5rem; justify-content: flex-end; }

.mh-etiquette {
    display: inline-block;
    padding: .2rem .6rem;
    font-size: .8rem;
    font-weight: 600;
    border-radius: 999px;
    background: var(--mh-accent-pale);
    color: var(--mh-accent-sombre);
}

.mh-etiquette--fournisseur { background: #fdf0e3; color: var(--mh-alerte); }

/* --- États -------------------------------------------------------------- */

.mh-vide {
    padding: 4rem 2rem;
    text-align: center;
    color: var(--mh-encre-douce);
}

.mh-vide p { margin: 0 0 1.25rem; font-size: 1.05rem; }

.mh-message {
    display: flex;
    gap: .75rem;
    padding: 1rem 1.25rem;
    margin-bottom: 1.25rem;
    border-radius: var(--mh-rayon);
    border: 1.5px solid;
    font-size: .975rem;
}

.mh-message--erreur { background: var(--mh-danger-pale); border-color: #eec9c6; color: #7d1a15; }
.mh-message--succes { background: #e9f6ef; border-color: #bfe3d1; color: #0b5c3a; }
/* Utilisée depuis longtemps par les écrans (émission, relance, seed) mais
   jamais définie : le bandeau se fondait dans le blanc. Attrapé au navigateur. */
.mh-message--attention { background: #fdf0e3; border-color: #f3d9bd; color: #7c3407; }

/* --- Aide des raccourcis clavier ---------------------------------------- */

.mh-raccourcis {
    position: fixed;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    z-index: 1001;
    background: var(--mh-surface);
    border-radius: var(--mh-rayon);
    box-shadow: var(--mh-ombre);
    padding: 1.5rem 2rem;
    min-width: 22rem;
}

.mh-raccourcis h2 { margin: 0 0 1rem; font-size: 1.1rem; }

.mh-raccourcis table { border-collapse: collapse; margin-bottom: .75rem; }

.mh-raccourcis td { padding: .3rem .75rem .3rem 0; }

/* --- Planning d'atelier -------------------------------------------------- */

.mh-planning td { vertical-align: top; min-width: 7rem; }

.mh-planning-absent { background: repeating-linear-gradient(
    -45deg, var(--mh-fond), var(--mh-fond) 6px, #eceff3 6px, #eceff3 12px); }

.mh-planning-aujourdhui { background: var(--mh-accent-pale); }

.mh-planning-ordre {
    display: block;
    margin: .15rem 0;
    padding: .2rem .45rem;
    border-left: 3px solid var(--mh-accent);
    border-radius: 4px;
    background: var(--mh-fond);
    font-size: .85rem;
    text-decoration: none;
    color: var(--mh-encre);
    white-space: nowrap;
}

.mh-planning-ordre:hover { background: var(--mh-accent-pale); }

.mh-raccourcis kbd {
    display: inline-block;
    min-width: 1.6rem;
    padding: .1rem .4rem;
    border: 1px solid var(--mh-bord);
    border-bottom-width: 2px;
    border-radius: 5px;
    background: var(--mh-fond);
    font-family: inherit;
    font-size: .9rem;
    text-align: center;
}

/* --- Formulaire en panneau latéral -------------------------------------- */

.mh-voile {
    position: fixed;
    inset: 0;
    background: rgba(20, 24, 29, .45);
    z-index: 40;
}

.mh-panneau {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    width: min(34rem, 100vw);
    background: var(--mh-surface);
    box-shadow: -8px 0 32px rgba(20, 24, 29, .16);
    z-index: 50;
    display: flex;
    flex-direction: column;
}

.mh-panneau-entete {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 1.25rem 1.5rem;
    border-bottom: 1px solid var(--mh-bord);
}

.mh-panneau-entete h2 { margin: 0; font-size: 1.25rem; font-weight: 650; }

.mh-panneau-corps { flex: 1; overflow-y: auto; padding: 1.5rem; }

.mh-panneau-pied {
    display: flex;
    gap: .75rem;
    justify-content: flex-end;
    padding: 1.25rem 1.5rem;
    border-top: 1px solid var(--mh-bord);
    background: var(--mh-fond);
}

.mh-fermer {
    display: flex;
    align-items: center;
    justify-content: center;
    width: var(--mh-cible);
    height: var(--mh-cible);
    background: none;
    border: none;
    border-radius: var(--mh-rayon);
    cursor: pointer;
    color: var(--mh-encre-douce);
}

.mh-fermer:hover { background: var(--mh-fond); color: var(--mh-encre); }

/* --- Champs ------------------------------------------------------------- */

.mh-champ { margin-bottom: 1.25rem; }

.mh-champ label {
    display: block;
    margin-bottom: .4rem;
    font-size: .9rem;
    font-weight: 550;
}

.mh-champ .mh-aide {
    display: block;
    margin-top: .3rem;
    font-size: .85rem;
    color: var(--mh-encre-douce);
    font-weight: 400;
}

.mh-champ input,
.mh-champ select,
.mh-champ textarea {
    width: 100%;
    min-height: var(--mh-cible);
    padding: .625rem .875rem;
    font-size: 1rem;
    font-family: inherit;
    color: var(--mh-encre);
    background: var(--mh-surface);
    border: 1.5px solid var(--mh-bord);
    border-radius: var(--mh-rayon);
}

.mh-champ textarea { min-height: 5.5rem; resize: vertical; }

.mh-champ input:focus,
.mh-champ select:focus,
.mh-champ textarea:focus {
    outline: none;
    border-color: var(--mh-accent);
    box-shadow: 0 0 0 3px var(--mh-accent-pale);
}

.mh-champ input.mh-plaque-saisie {
    font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
    font-size: 1.15rem;
    font-weight: 650;
    letter-spacing: .08em;
    text-transform: uppercase;
}

.mh-duo { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; }

@media (max-width: 32rem) {
    .mh-duo { grid-template-columns: 1fr; }
}

.mh-obligatoire { color: var(--mh-danger); }

/* --- Accueil ------------------------------------------------------------ */

.mh-tuiles {
    display: grid;
    /* « min(…, 100%) » et non « 15rem » seul : une largeur minimale en rem
       grandit avec la police. À 200 %, 15rem valent 480 px et la grille
       débordait d'un téléphone de 390 px — l'utilisateur qui agrandit le
       texte pour mieux lire se retrouvait à faire défiler horizontalement.
       La colonne ne descend plus jamais sous la largeur disponible. */
    grid-template-columns: repeat(auto-fit, minmax(min(15rem, 100%), 1fr));
    gap: 1rem;
    margin-bottom: 2rem;
}

.mh-tuile {
    display: block;
    padding: 1.5rem;
    background: var(--mh-surface);
    border: 1px solid var(--mh-bord);
    border-radius: var(--mh-rayon);
    box-shadow: var(--mh-ombre);
    text-decoration: none;
    color: inherit;
}

.mh-tuile:hover { border-color: var(--mh-accent); }

.mh-tuile-valeur {
    font-size: 2.25rem;
    font-weight: 650;
    line-height: 1.1;
    font-variant-numeric: tabular-nums;
}

.mh-tuile-titre { margin-top: .35rem; color: var(--mh-encre-douce); font-size: .95rem; }

/* --- Sections d'un formulaire long ---------------------------------------
   La fiche véhicule compte une trentaine de champs. Sans regroupement visible,
   elle devient un mur illisible et la saisie s'allonge — or l'objectif est de
   rester sous les trente secondes pour les cas courants. Les sections suivent
   l'ordre dans lequel l'information arrive : ce qu'on a sous les yeux d'abord,
   ce qu'on lit sur la carte grise ensuite. */

.mh-section {
    margin: 1.75rem 0 1rem;
    padding-top: 1.25rem;
    border-top: 1px solid var(--mh-bord);
}

.mh-section:first-of-type { margin-top: 0; padding-top: 0; border-top: none; }

.mh-section-titre {
    margin: 0 0 1rem;
    font-size: .8rem;
    font-weight: 650;
    text-transform: uppercase;
    letter-spacing: .06em;
    color: var(--mh-encre-douce);
}

.mh-trio { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 1rem; }

@media (max-width: 32rem) {
    .mh-trio { grid-template-columns: 1fr; }
}

/* --- Badges d'échéance ---------------------------------------------------
   Une date seule oblige l'utilisateur à calculer de tête. La couleur porte
   l'information, mais jamais seule : le texte reste explicite, pour rester
   lisible en cas de daltonisme comme sur un écran délavé d'atelier. */

.mh-echeance {
    display: inline-flex;
    align-items: center;
    gap: .4rem;
    padding: .25rem .6rem;
    font-size: .85rem;
    font-weight: 550;
    border-radius: 999px;
    white-space: nowrap;
}

.mh-echeance--ok { background: #e9f6ef; color: #0b5c3a; }
.mh-echeance--proche { background: #fdf0e3; color: var(--mh-alerte); }
.mh-echeance--expire { background: var(--mh-danger-pale); color: #7d1a15; }
.mh-echeance--vide { color: var(--mh-encre-douce); }

.mh-etiquette--entreprise { background: #eeeaf9; color: #4b3391; }

/* --- États d'un ordre de réparation --------------------------------------
   Le statut est l'information la plus consultée d'une liste d'OR : c'est elle
   qui dit ce qu'il reste à faire. Chaque état a sa couleur, mais le libellé
   reste toujours écrit. */

.mh-etat {
    display: inline-block;
    padding: .25rem .7rem;
    font-size: .85rem;
    font-weight: 600;
    border-radius: 999px;
    white-space: nowrap;
}

.mh-etat--nouveau     { background: #eef1f5; color: #414c58; }
.mh-etat--encours     { background: var(--mh-accent-pale); color: var(--mh-accent-sombre); }
.mh-etat--termine     { background: #e9f6ef; color: #0b5c3a; }
.mh-etat--facturable  { background: #fdf0e3; color: var(--mh-alerte); }
.mh-etat--facture     { background: #eeeaf9; color: #4b3391; }

.mh-etats { display: flex; flex-wrap: wrap; gap: .5rem; }

.mh-etiquette--prestation { background: #e9f6ef; color: #0b5c3a; }

/* Panneau élargi : un ordre de réparation porte un tableau de lignes, qui ne
   tient pas dans la largeur d'un formulaire. */
.mh-panneau--large { width: min(52rem, 100vw); }

/* --- Totaux --------------------------------------------------------------
   Alignés à droite et en chiffres tabulaires : c'est un bloc que l'on compare
   du regard à un devis papier ou à une facture fournisseur. */

.mh-totaux {
    margin-left: auto;
    width: min(20rem, 100%);
    font-variant-numeric: tabular-nums;
}

.mh-totaux > div {
    display: flex;
    justify-content: space-between;
    gap: 2rem;
    padding: .4rem 0;
}

.mh-totaux span { color: var(--mh-encre-douce); }

.mh-totaux-final {
    border-top: 2px solid var(--mh-encre);
    margin-top: .3rem;
    padding-top: .6rem !important;
    font-size: 1.15rem;
}

/* États d'un devis. Couleurs distinctes de celles des ordres : les deux listes
   se consultent à la suite, et une même couleur pour des sens différents
   induirait en erreur. */
.mh-etat--devis-brouillon { background: #eef1f5; color: #414c58; }
.mh-etat--devis-envoye    { background: var(--mh-accent-pale); color: var(--mh-accent-sombre); }
.mh-etat--devis-accepte   { background: #e9f6ef; color: #0b5c3a; }
.mh-etat--devis-refuse    { background: var(--mh-danger-pale); color: #7d1a15; }
.mh-etat--devis-expire    { background: #fdf0e3; color: var(--mh-alerte); }

/* États d'une facture. */
.mh-etat--fac-brouillon { background: #eef1f5; color: #414c58; }
.mh-etat--fac-emise     { background: var(--mh-accent-pale); color: var(--mh-accent-sombre); }
.mh-etat--fac-payee     { background: #e9f6ef; color: #0b5c3a; }
.mh-etat--fac-annulee   { background: var(--mh-danger-pale); color: #7d1a15; }

.mh-etiquette--avoir { background: #fdf0e3; color: var(--mh-alerte); margin-left: .5rem; }

/* Fiche en pleine page — pour les écrans de saisie longue qui ne sont pas des
   panneaux latéraux. */
.mh-fiche {
    max-width: 46rem;
    background: var(--mh-surface);
    border: 1px solid var(--mh-bord);
    border-radius: var(--mh-rayon);
    box-shadow: var(--mh-ombre);
    padding: 1.75rem;
}

.mh-barre-action {
    display: flex;
    justify-content: flex-end;
    gap: .75rem;
    margin-top: 1.75rem;
    padding-top: 1.25rem;
    border-top: 1px solid var(--mh-bord);
}

/* --- Alertes du tableau de bord ------------------------------------------
   Chaque alerte est cliquable et mène à l'écran où l'on agit. Une alerte sans
   action possible n'est qu'une source d'anxiété : l'utilisateur apprend à les
   ignorer, et les vraies se perdent avec les autres. */

.mh-alertes {
    display: grid;
    /* Même raison que .mh-tuiles : 19rem débordent dès 125 % de police. */
    grid-template-columns: repeat(auto-fill, minmax(min(19rem, 100%), 1fr));
    gap: .75rem;
}

.mh-alerte {
    display: block;
    padding: .875rem 1rem;
    background: var(--mh-surface);
    border: 1px solid var(--mh-bord);
    border-left: 4px solid var(--mh-encre-douce);
    border-radius: var(--mh-rayon);
    text-decoration: none;
    color: inherit;
}

.mh-alerte:hover { border-color: var(--mh-accent); }

.mh-alerte--urgent     { border-left-color: var(--mh-danger); }
.mh-alerte--attention  { border-left-color: var(--mh-alerte); }
.mh-alerte--information{ border-left-color: var(--mh-accent); }

.mh-alerte-cat {
    font-size: .7rem;
    font-weight: 650;
    text-transform: uppercase;
    letter-spacing: .06em;
    color: var(--mh-encre-douce);
}

.mh-alerte-titre { font-weight: 600; margin-top: .2rem; }
.mh-alerte-detail { font-size: .875rem; color: var(--mh-encre-douce); margin-top: .15rem; }

.mh-tuile--alerte { border-color: #e9c4c1; }
.mh-tuile--alerte .mh-tuile-valeur { color: var(--mh-danger); }

.mh-code {
    background: var(--mh-encre);
    color: #e6ebf1;
    padding: .875rem 1rem;
    border-radius: var(--mh-rayon);
    font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
    font-size: .85rem;
    overflow-x: auto;
    white-space: pre;
}


/* ---------------------------------------------------------------------------
   Recherche globale
   ---------------------------------------------------------------------------
   Placée dans la barre de navigation, donc sur fond sombre. Les résultats
   s'affichent sur fond clair : ils appartiennent au contenu, pas au menu.
--------------------------------------------------------------------------- */

.mh-recherche-globale {
    position: relative;
    margin-inline: 1rem;
    flex: 0 1 22rem;
}

.mh-recherche-globale input {
    width: 100%;
    /* 44 px minimum : une cible tactile plus petite se rate au doigt, et cet
       écran s'utilise sur une tablette d'atelier. */
    min-height: 44px;
    padding: .5rem .85rem;
    border-radius: 8px;
    border: 1px solid rgba(255, 255, 255, .18);
    background: rgba(255, 255, 255, .08);
    color: #fff;
    font-size: .95rem;
}

.mh-recherche-globale input::placeholder { color: rgba(255, 255, 255, .55); }

.mh-recherche-globale input:focus {
    outline: 2px solid #4d9de8;
    outline-offset: 1px;
    background: rgba(255, 255, 255, .14);
}

/* Sous la liste, pour capter le clic extérieur sans bloquer le reste. */
.mh-recherche-voile {
    position: fixed;
    inset: 0;
    z-index: 40;
}

.mh-recherche-resultats {
    position: absolute;
    z-index: 41;
    top: calc(100% + .4rem);
    left: 0;
    right: 0;
    max-height: 60vh;
    overflow-y: auto;
    background: #fff;
    border: 1px solid var(--mh-bord, #e5e7eb);
    border-radius: 10px;
    box-shadow: 0 12px 32px rgba(17, 24, 39, .18);
}

.mh-recherche-ligne {
    display: grid;
    grid-template-columns: 5.5rem 1fr;
    gap: .1rem .75rem;
    width: 100%;
    padding: .6rem .85rem;
    border: 0;
    border-bottom: 1px solid var(--mh-bord, #e5e7eb);
    background: transparent;
    text-align: left;
    cursor: pointer;
    color: var(--mh-encre, #111827);
}

.mh-recherche-ligne:last-child { border-bottom: 0; }
.mh-recherche-ligne:hover,
.mh-recherche-ligne:focus-visible { background: var(--mh-fond, #f3f4f6); }

.mh-recherche-type {
    grid-row: span 2;
    align-self: center;
    font-size: .7rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--mh-encre-douce, #6b7280);
}

.mh-recherche-titre { font-weight: 600; }

.mh-recherche-detail {
    font-size: .85rem;
    color: var(--mh-encre-douce, #6b7280);
}

.mh-recherche-vide {
    padding: .9rem;
    color: var(--mh-encre-douce, #6b7280);
    font-size: .9rem;
}

@media (max-width: 900px) {
    /* Sur tablette, la recherche prend toute la largeur sous les liens plutôt
       que de les comprimer jusqu'à l'illisible. */
    .mh-recherche-globale { flex: 1 1 100%; margin: .5rem 0 0; order: 10; }
}


/* ---------------------------------------------------------------------------
   Bandeau de licence
   ---------------------------------------------------------------------------
   Pleine largeur, au-dessus du contenu. La couleur porte l'urgence, mais le
   texte reste explicite : un écran délavé ou un daltonisme ne doivent pas
   effacer l'information.
--------------------------------------------------------------------------- */

.mh-bandeau-licence {
    padding: .6rem 1.25rem;
    font-size: .9rem;
    line-height: 1.4;
    border-bottom: 1px solid transparent;
}

.mh-bandeau-licence--information {
    background: #eff6ff;
    border-bottom-color: #bfdbfe;
    color: #1e3a8a;
}

.mh-bandeau-licence--attention {
    background: #fff8ec;
    border-bottom-color: #f0d9b5;
    color: #7a4a08;
}

.mh-bandeau-licence--urgent {
    background: #fef2f2;
    border-bottom-color: #fecaca;
    color: #991b1b;
    font-weight: 600;
}

/* --- Pièces jointes ------------------------------------------------------
   Le composant s'affiche dans un panneau latéral étroit et sur tablette en
   atelier. Un tableau y déborderait ; chaque document occupe donc une ligne
   qui se replie sous les 30 rem, plutôt que de pousser ses actions hors du
   champ derrière une barre de défilement horizontale. */

.mh-pieces {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: .5rem;
}

.mh-piece {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    flex-wrap: wrap;
    padding: .75rem 1rem;
    background: var(--mh-surface);
    border: 1px solid var(--mh-bord);
    border-radius: var(--mh-rayon);
}

.mh-piece-info {
    display: flex;
    flex-direction: column;
    gap: .25rem;
    min-width: 0;
    flex: 1 1 14rem;
}

/* Un nom de fichier venu d'un téléphone n'a ni espace ni limite de longueur :
   sans coupure explicite, il élargit la ligne et repousse les boutons. */
.mh-piece-nom { overflow-wrap: anywhere; }

/* --- Pagination ----------------------------------------------------------
   Barre commune à toutes les listes. Le rang est écrit à gauche parce que
   « 51–75 sur 1 240 » répond à une question que « page 3 » laisse ouverte :
   combien reste-t-il ? */

.mh-pagination {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: .75rem;
    margin-top: 1rem;
    padding: .5rem .25rem;
    color: var(--mh-encre-douce);
    font-size: .9rem;
}

.mh-pagination-rang { font-variant-numeric: tabular-nums; }

.mh-pagination-boutons {
    display: flex;
    align-items: center;
    gap: .35rem;
}

.mh-pagination-position {
    padding: 0 .5rem;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

/* Un bouton désactivé doit se voir désactivé : sans cela l'utilisateur clique
   sur « suivant » en boucle au bout de la liste, et croit à un blocage. */
.mh-pagination .mh-bouton:disabled {
    opacity: .4;
    cursor: default;
}

/* Liste de suggestions d'adresses (ChampAdresse) : ancrée sous le champ,
   au-dessus du reste, même langage visuel que les tableaux. */
.mh-suggestions {
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    z-index: 30;
    margin: 0;
    padding: 0;
    list-style: none;
    background: #fff;
    border: 1px solid var(--mh-bord, #dde3ea);
    border-radius: 0 0 .4rem .4rem;
    box-shadow: 0 6px 18px rgba(0, 0, 0, .12);
    max-height: 16rem;
    overflow-y: auto;
}

.mh-suggestions li {
    padding: .45rem .7rem;
    cursor: pointer;
}

.mh-suggestions li:hover {
    background: var(--mh-fond);
}

/* --- Cases et boutons radio dans un libellé en flex -----------------------
   Sans ceci, la case est un élément flex comme un autre : elle se laisse
   comprimer par le texte voisin, d'autant plus que la description est
   longue. Constaté en recette réelle sur téléphone — les cinq rôles avaient
   leurs ronds à cinq abscisses différentes, chacun décalé de son libellé.
   La case garde désormais sa taille propre ; seul le texte s'adapte. */
.mh-champ input[type="radio"],
.mh-champ input[type="checkbox"],
label input[type="radio"],
label input[type="checkbox"] {
    flex: 0 0 auto;
    /* INDISPENSABLE : la règle générale des formulaires met tous les champs à
       « width: 100% ». Une case héritait donc de 263 px de large et poussait
       son propre libellé hors de l'écran — c'était la cause réelle du
       désalignement constaté en recette, et non un simple problème
       d'espacement. */
    width: auto;
}

/* Corollaire indispensable : si la case ne se comprime plus, c'est le texte
   voisin qui doit occuper le reste ET pouvoir revenir à la ligne.
   « min-width: 0 » seul le faisait collapser à zéro — le texte sortait alors
   d'une boîte de largeur nulle, plus loin qu'avant. Il faut les deux :
   « flex: 1 » pour prendre la place disponible, « min-width: 0 » pour
   descendre sous la largeur du plus long mot. */
.mh-champ input[type="radio"] + span,
.mh-champ input[type="checkbox"] + span,
label input[type="radio"] + span,
label input[type="checkbox"] + span {
    flex: 1 1 auto;
    min-width: 0;
}

/* ---- Retours de formulaire (recette terrain, août 2026) ------------------ */

/* Bannière d'erreur à demeure dans un panneau : entre le corps et le pied,
   donc visible sans défilement, à côté du bouton pressé. */
.mh-panneau-erreur {
    margin: .75rem 1.5rem 0;
    flex-shrink: 0;
}

/* Champ dont la saisie bloque l'enregistrement : le liseré désigne le champ,
   le message sous le champ dit quoi faire. Jamais l'un sans l'autre. */
.mh-champ--invalide input,
.mh-champ--invalide select,
.mh-champ--invalide textarea {
    border-color: #c0362c;
    outline: none;
    box-shadow: 0 0 0 3px rgba(192, 54, 44, .12);
}

.mh-champ-probleme {
    display: block;
    margin-top: .3rem;
    font-size: .875rem;
    color: #7d1a15;
}

/* Indice non bloquant : la saisie est inhabituelle mais peut être légitime
   (VIN court d'un véhicule ancien, adresse e-mail interne). On prévient,
   on n'empêche pas. */
.mh-champ-indice {
    display: block;
    margin-top: .3rem;
    font-size: .875rem;
    color: #8a5a00;
}

/* ---- Tableaux larges sur écran étroit (recette terrain, août 2026) ------- */

/* Le cadre défile horizontalement depuis toujours — mais rien ne le disait :
   à 390 px, la liste des devis se coupait proprement après trois colonnes et
   le bouton « Ouvrir » vivait hors écran, indevinable (3 reproductions par
   l'audit externe). Les ombres de défilement sont l'indice : elles
   n'apparaissent que du côté où du contenu se cache, et disparaissent au
   bout de course. Technique des dégradés attachés (local/scroll) — aucune
   ligne de JavaScript. */
.mh-tableau-cadre {
    background:
        linear-gradient(to right, var(--mh-surface) 30%, transparent) left,
        linear-gradient(to left, var(--mh-surface) 30%, transparent) right,
        radial-gradient(farthest-side at 0 50%, rgba(20, 24, 29, .22), transparent) left,
        radial-gradient(farthest-side at 100% 50%, rgba(20, 24, 29, .22), transparent) right;
    background-repeat: no-repeat;
    background-size: 3rem 100%, 3rem 100%, .875rem 100%, .875rem 100%;
    background-attachment: local, local, scroll, scroll;
    background-color: var(--mh-surface);
}

/* L'ombre vit sur le cadre : les cellules doivent la laisser transparaître.
   L'en-tête garde son fond — l'indice se lit sur les lignes. */
.mh-tableau tbody tr:hover { background: rgba(20, 24, 29, .04); }

/* La ligne entière ouvre le document : sur téléphone, le bouton « Ouvrir »
   de la dernière colonne est à un écran de distance — la ligne, elle, est
   sous le doigt. Le bouton reste, pour la découvrabilité au premier regard. */
.mh-ligne-cliquable { cursor: pointer; }

/* Message à contenu riche (titre, liste, boutons) : les enfants s'empilent.
   Sans cela, .mh-message étant un flex en ligne, un avertissement structuré
   se faisait écraser en colonnes illisibles sur téléphone — constaté sur la
   confirmation d'émission de facture à 390 px. */
.mh-message--bloc {
    flex-direction: column;
    align-items: stretch;
}

/* ---- Choisir ou créer (recette terrain, août 2026) ----------------------- */

/* Le champ de ChoixCatalogue vit DANS un formulaire de panneau : il reprend
   l'apparence des champs (contrairement à la recherche globale, sombre dans
   la barre). Les résultats réutilisent la liste déroulante de la recherche
   globale — même geste, même rendu. */
.mh-choix { position: relative; }

.mh-choix input {
    width: 100%;
    min-height: var(--mh-cible);
    padding: .625rem .875rem;
    font-size: 1rem;
    font-family: inherit;
    color: var(--mh-encre);
    background: var(--mh-surface);
    border: 1.5px solid var(--mh-bord);
    border-radius: var(--mh-rayon);
}

.mh-choix input:focus {
    outline: none;
    border-color: var(--mh-accent);
    box-shadow: 0 0 0 3px var(--mh-accent-pale);
}

/* Les résultats du choix se posent au-dessus du contenu du panneau. */
.mh-choix .mh-recherche-resultats { z-index: 60; max-height: 40vh; }
.mh-choix .mh-recherche-voile { z-index: 55; }

/* La ligne de création se distingue : c'est une porte, pas un résultat. */
.mh-choix-creer { background: var(--mh-accent-pale, #eaf2fb); font-weight: 550; }
.mh-choix-creer:hover, .mh-choix-creer:focus-visible { background: #dbeafe; }

/* Mini-formulaire de création rapide, encadré dans le panneau. */
.mh-mini-formulaire {
    margin-top: .75rem;
    padding: 1rem;
    background: var(--mh-fond);
    border: 1px solid var(--mh-bord);
    border-radius: var(--mh-rayon);
}

.mh-mini-actions {
    display: flex;
    gap: .75rem;
    justify-content: flex-end;
    margin-top: .75rem;
}

.mh-bascule { display: flex; gap: .5rem; flex-wrap: wrap; }

/* Bouton-lien : une action discrète qui déplie sans peser. */
.mh-bouton--lien {
    background: none;
    border: 0;
    padding: .25rem 0;
    color: var(--mh-accent);
    cursor: pointer;
    font-size: .925rem;
}
.mh-bouton--lien:hover { text-decoration: underline; }

/* ---- Repère couleur (catalogue personnalisé) ----------------------------- */

.mh-couleurs { display: flex; gap: .5rem; flex-wrap: wrap; }

.mh-couleur {
    width: 2rem;
    height: 2rem;
    border-radius: 50%;
    border: 2px solid transparent;
    cursor: pointer;
    padding: 0;
}

.mh-couleur--aucune {
    background: var(--mh-surface);
    border-color: var(--mh-bord);
    color: var(--mh-encre-douce);
    font-size: 1rem;
    line-height: 1;
}

.mh-couleur--choisie {
    outline: 2px solid var(--mh-accent);
    outline-offset: 2px;
}

/* La pastille dans une liste ou une proposition. */
.mh-pastille {
    display: inline-block;
    width: .65rem;
    height: .65rem;
    border-radius: 50%;
    margin-right: .4rem;
    vertical-align: baseline;
}
