/**
 * Mobile UX overrides — Session 42 audit mobile (90% utilisateurs sur téléphone)
 *
 * Règles globales mobile-first :
 *   - Touch targets ≥ 44px (Apple HIG / Material Design)
 *   - Form controls ≥ 44px hauteur + font-size ≥ 16px (anti-zoom iOS)
 *   - Tables responsive (scroll horizontal géré par .table-responsive)
 *   - Modals fullscreen-sm-down par défaut sur ≤ 575px
 *
 * Chargé après tous les autres CSS pour override Bootstrap defaults.
 */

/* =========================================================================
 * CONS-107 — touch-action: manipulation sur les éléments interactifs.
 * Élimine le délai 300ms du double-tap-zoom sur certains navigateurs mobiles
 * tout en préservant le scroll et le pinch-zoom (contrairement à `none`).
 * Règle GLOBALE (hors media query) — bénéfique sur tous les viewports tactiles.
 * ========================================================================= */
button,
.btn,
a,
[role="button"],
.nav-link,
.dropdown-item,
.form-check-input,
.page-link {
    touch-action: manipulation;
}

@media (max-width: 767px) {

    /* =========================================================================
     * FORM CONTROLS — anti-zoom iOS + touch target 44px
     * ========================================================================= */

    /* Override Bootstrap form-control-sm / form-select-sm en mobile */
    .form-control,
    .form-select,
    .form-control-sm,
    .form-select-sm {
        min-height: 44px;
        font-size: 16px !important;  /* iOS : empêche zoom auto sur focus */
        padding-top: 0.5rem;
        padding-bottom: 0.5rem;
    }

    /* Vehicle selector dans header (présent partout) */
    /* Session 51 — CONS-092 : font-size 16px obligatoire (anti-zoom iOS strict) */
    #vehicleSelector,
    .vehicle-selector .form-select {
        min-height: 40px;  /* dans header donc un peu plus compact */
        font-size: 16px !important;  /* iOS : empêche zoom auto sur focus */
        padding: 0.4rem 1.75rem 0.4rem 0.75rem;
    }

    /* Form-switch agrandi pour mobile */
    .form-switch .form-check-input {
        width: 3em;
        height: 1.6em;
        margin-top: 0.15em;
    }

    /* Labels checkbox/radio plus tappables */
    .form-check-label {
        line-height: 1.5;
        padding-left: 4px;
    }

    /* =========================================================================
     * BOUTONS — touch target 44px sauf icon-only (.btn-link, .btn-close)
     * ========================================================================= */

    .btn:not(.btn-close):not(.btn-link):not(.btn-sm) {
        min-height: 44px;
    }

    .btn.btn-sm {
        min-height: 38px;
        padding: 0.5rem 0.85rem;
        font-size: 14px;
    }

    /* btn-link icon-only (chevrons, action discrets) — au moins 36px */
    .btn-link {
        min-height: 36px;
        min-width: 36px;
    }

    /* Session 51 — CONS-090 : dropdowns header doivent respecter Apple HIG 44px */
    header .nav-link,
    header .btn-link,
    header .dropdown-toggle.btn-link,
    .dropdown-toggle.btn-link {
        min-width: 44px;
        min-height: 44px;
        padding: 0.5rem;
        display: inline-flex;
        align-items: center;
        justify-content: center;
    }

    /* =========================================================================
     * TABLES — wrapper responsive automatique
     * ========================================================================= */

    .table:not(.table-borderless) {
        margin-bottom: 0;
    }

    /* Si table sans .table-responsive parent, force overflow scroll */
    main table:not(.table-no-scroll) {
        display: block;
        overflow-x: auto;
        white-space: nowrap;
        -webkit-overflow-scrolling: touch;
    }

    /* =========================================================================
     * MODALS — Pattern scrollable UNIVERSEL (Session 62 — fix définitif)
     *
     * Le bug (signalé 3×) venait de :
     *   1. un footer `position: sticky` qui FLOTTAIT par-dessus les derniers champs
     *      (catastrophique en paysage ~250-360px de haut) ;
     *   2. un conflit avec app.css (`.modal-dialog { position: fixed }` +
     *      `.modal-content { overflow-y: auto; max-height: 85vh }`) → double scroll
     *      bancal + contenu coupé.
     *
     * Solution robuste : header + footer en FLUX FLEX NORMAL (flex: 0 0 auto,
     * position: static — JAMAIS sticky/absolute/fixed). Seul le `.modal-body`
     * scrolle. Header et footer restent toujours visibles sans recouvrir le
     * contenu. Appliqué à TOUS les modals (sélecteur universel).
     *
     * Ordre dvh : on déclare `vh` PUIS `dvh` → le navigateur garde la dernière
     * valeur qu'il comprend (dvh s'il est supporté, sinon il ignore dvh et
     * conserve vh comme fallback).
     * ========================================================================= */

    /* Le modal redevient un conteneur flex normal (annule le bottom-sheet
       `position: fixed` d'app.css qui cassait le pattern flex). */
    .modal-dialog {
        display: flex;
        align-items: stretch;
        position: relative;     /* annule app.css .modal-dialog { position: fixed } */
        bottom: auto;
        left: auto;
        right: auto;
        margin: 8px;
        max-width: calc(100vw - 16px);
        width: auto;
    }
    .modal-dialog.modal-fullscreen-sm-down,
    .modal-dialog.modal-fullscreen {
        margin: 0;
        max-width: 100%;
        width: 100%;
    }

    .modal-content {
        display: flex;
        flex-direction: column;
        width: 100%;
        max-height: 88vh;       /* fallback */
        max-height: 88dvh;      /* gagne si supporté */
        overflow: visible;      /* annule app.css overflow-y:auto (le scroll est porté par .modal-body) */
    }
    .modal-fullscreen-sm-down .modal-content,
    .modal-fullscreen .modal-content {
        height: 100vh;
        height: 100dvh;
        max-height: 100vh;
        max-height: 100dvh;
    }

    /* Modals dont le <form> enveloppe .modal-body + .modal-footer (ex. addVehicleModal,
       editVehicleModal) : sans ça, les enfants flex de .modal-content sont [header, form]
       et le form (display:block) casse la chaîne flex → .modal-body n'est jamais contraint
       → pas de scroll + footer poussé hors écran. Le form doit relayer le flex. */
    .modal-content > form {
        display: flex;
        flex-direction: column;
        flex: 1 1 auto;
        min-height: 0;
        overflow: hidden;
    }

    /* Header + footer : flux normal, jamais détachés du flux. */
    .modal-header,
    .modal-footer {
        flex: 0 0 auto;
        position: static;
    }

    /* Body : seul élément scrollable du modal. */
    .modal-body {
        flex: 1 1 auto;
        overflow-y: auto;
        -webkit-overflow-scrolling: touch;
        min-height: 0;          /* CRUCIAL : permet au body de rétrécir et scroller en flex */
        padding: 1rem;
    }

    /* Footer : boutons full-width empilés + respect encoche iOS. */
    .modal-footer {
        flex-direction: column-reverse;
        gap: 8px;
        padding: 12px 16px;
        padding-bottom: calc(12px + env(safe-area-inset-bottom, 0px));
    }
    .modal-footer > .btn {
        width: 100%;
        margin: 0 !important;
    }

    /* =========================================================================
     * CARDS — espacement lisible
     * ========================================================================= */

    .card-body {
        padding: 1rem;
    }

    .card-header,
    .card-footer {
        padding: 0.75rem 1rem;
    }

    /* =========================================================================
     * BOTTOM-NAV — assurer padding bottom suffisant sur main
     * ========================================================================= */

    main,
    .main-content,
    .driving-container {
        padding-bottom: calc(70px + env(safe-area-inset-bottom)) !important;
    }

    /* Si bandeau sécurité affiché, ajouter padding-top supplémentaire (déjà géré par security-banner.php) */

    /* =========================================================================
     * CHIPS / TAGS / BADGES — taille tappable
     * ========================================================================= */

    .badge.btn,
    a.badge,
    button.badge {
        min-height: 32px;
        padding: 0.35rem 0.65rem;
    }

    /* =========================================================================
     * INPUT GROUPS — alignement mobile
     * ========================================================================= */

    .input-group-text {
        min-height: 44px;
        font-size: 16px;
    }

    /* =========================================================================
     * SCROLL HORIZONTAL ONGLETS (nav-tabs / nav-pills)
     * ========================================================================= */

    .nav-tabs:not(.nav-stacked),
    .nav-pills:not(.nav-stacked) {
        flex-wrap: nowrap;
        overflow-x: auto;
        -webkit-overflow-scrolling: touch;
        scrollbar-width: none;
    }
    .nav-tabs::-webkit-scrollbar,
    .nav-pills::-webkit-scrollbar { display: none; }
    .nav-tabs .nav-link,
    .nav-pills .nav-link {
        white-space: nowrap;
        min-height: 44px;
    }
}

/* =========================================================================
 * PAYSAGE mobile (hauteur réduite ~250-360px) — Session 62
 * Le pattern flex ci-dessus gère déjà le scroll du body ; ici on ne fait que
 * COMPACTER header/footer pour libérer un maximum de hauteur au contenu.
 * ========================================================================= */
@media (max-height: 500px) and (orientation: landscape) {
    .modal-content {
        max-height: 96vh;
        max-height: 96dvh;
    }
    .modal-header,
    .modal-footer {
        padding-top: 0.4rem;
        padding-bottom: 0.4rem;
    }
    .modal-footer {
        padding-bottom: calc(0.4rem + env(safe-area-inset-bottom, 0px));
    }
    .modal-title {
        font-size: 1rem;
    }
}

/* Petit mobile (≤ 375px iPhone SE) : encore plus compact */
/* Session 51 — CONS-104 : breakpoint normalisé en 374.98px (cohérence avec autres media queries Bootstrap) */
@media (max-width: 374.98px) {
    .modal-body { padding: 0.75rem; }
    .card-body { padding: 0.75rem; }
    h1, .h1 { font-size: 1.5rem; }
    h2, .h2 { font-size: 1.3rem; }
    h3, .h3 { font-size: 1.1rem; }
}

/* =========================================================================
 * GLOBAL (desktop + mobile) — Session 62 fix : modals scrollables dont le <form>
 * enveloppe .modal-body + .modal-footer (addVehicleModal, editVehicleModal, …).
 * Bootstrap modal-dialog-scrollable suppose .modal-body enfant DIRECT de
 * .modal-content. Quand un <form> s'intercale, la chaîne flex casse → .modal-body
 * fait sa hauteur naturelle, le footer (Enregistrer) est poussé hors écran, même
 * sur desktop. Le form doit relayer la chaîne flex. Scopé aux modals scrollables
 * pour ne pas affecter les modals simples.
 * ========================================================================= */
.modal-dialog-scrollable .modal-content > form {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-height: 0;
    overflow: hidden;
}
