/* LIVEROK — écran Quêtes.
 *
 * Deux principes tiennent toute la feuille :
 *   1. TOUT est scopé sous `.quests-view` ou `.quests-modal`. Le dépôt a un historique de règles parasites qui
 *      débordent d'un écran à l'autre ; rien d'ici ne doit pouvoir toucher le reste de l'application.
 *   2. Le rendu « carte de jeu » est obtenu par un FILTRE sur la couche de tuiles, pas par un autre fournisseur de
 *      fond de carte. Zéro requête supplémentaire, zéro dépendance, et le jour où le filtre déplaît il suffit de
 *      supprimer une règle.
 */

.quests-view{padding:44px 6vw 90px;background:#fbf6ee}
.quests-head{display:flex;gap:28px;justify-content:space-between;align-items:flex-end;flex-wrap:wrap}
.quests-head-copy{max-width:640px}
.quests-view h1{font:800 clamp(32px,4vw,46px)/1.05 'Baloo 2';letter-spacing:-2px;margin:10px 0 12px}
.quests-head-copy p{color:var(--muted);line-height:1.65;margin:0}
.quests-head-actions{display:grid;gap:12px;justify-items:end}
.quests-carnet{display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end}
.quests-carnet-item{background:#fff;border:1px solid var(--line);border-radius:100px;padding:7px 14px;font-size:12px;color:var(--muted)}
.quests-carnet-item b{color:var(--ink);font-size:14px;margin-right:4px}

/* ——— Filtres ——— */
.quests-filters{display:flex;gap:9px;flex-wrap:wrap;margin:26px 0 18px;align-items:center}
.quests-view .quests-filters select{border:1px solid var(--line);border-radius:100px;padding:10px 14px;font:600 12px 'DM Sans';background:#fff}
.quests-view .quests-chip{border:1px solid var(--line);background:#fff;border-radius:100px;padding:10px 15px;font:600 12px 'DM Sans';color:var(--muted);cursor:pointer}
.quests-view .quests-chip.active{background:var(--mint-pale);border-color:var(--mint);color:#20705c}
.quests-view .quests-chip:hover{border-color:var(--coral)}

/* ——— Corps : carte + journal ——— */
.quests-body{display:grid;grid-template-columns:1fr 380px;gap:20px;align-items:stretch}
/* ===== La carte de jeu ==============================================================================================
 * Objectif assumé : que ça ressemble à la carte du monde d'un jeu — parchemin, cadre travaillé, pastilles de région —
 * et non à un fond de plan avec des épingles. Tout est obtenu en CSS sur les tuiles existantes : aucun fournisseur de
 * plus, aucune image à charger, rien à maintenir chez un tiers.
 * Trois couches font l'effet : le FILTRE parchemin sur les tuiles, les TACHES d'usure (:after), et le CADRE double
 * avec son ombre intérieure (:before + bordures). Retirer l'une des trois casse l'illusion. */
.quests-map-wrap{position:relative;border-radius:20px;overflow:hidden;background:#efe3cd;
  border:3px solid #b99a6b;outline:1px solid #7d6440;outline-offset:3px;
  box-shadow:0 18px 50px rgba(60,42,20,.22),inset 0 0 0 6px #f7ecd8}
.quests-map{height:min(74vh,760px);width:100%}
/* Ornements d'angle : quatre coins de carte ancienne, dessinés en dégradés, sans une seule image. */
.quests-map-wrap>.quests-corner{position:absolute;width:34px;height:34px;z-index:3;pointer-events:none;opacity:.5;
  background:radial-gradient(circle at 0 0,transparent 62%,#8a6a3d 63%,#8a6a3d 68%,transparent 69%)}
.quests-map-wrap>.quests-corner.tl{top:8px;left:8px}
.quests-map-wrap>.quests-corner.tr{top:8px;right:8px;transform:rotate(90deg)}
.quests-map-wrap>.quests-corner.br{bottom:8px;right:8px;transform:rotate(180deg)}
.quests-map-wrap>.quests-corner.bl{bottom:8px;left:8px;transform:rotate(270deg)}
/* Contrôles de zoom habillés en boutons de parchemin. */
.quests-map .leaflet-control-zoom{border:0;box-shadow:0 3px 10px rgba(60,42,20,.35);border-radius:12px;overflow:hidden}
.quests-map .leaflet-control-zoom a{background:#f7ecd8;color:#5b4326;border-bottom:1px solid #d9c3a0;
  font:800 18px/30px 'Baloo 2';width:34px;height:34px}
.quests-map .leaflet-control-zoom a:hover{background:#fff7ea;color:var(--coral-dark)}
.quests-map .leaflet-control-attribution{background:rgba(247,236,216,.85);font-size:9px;color:#6b5a3a}

/* Le parchemin. Le filtre s'applique à la COUCHE DE TUILES seule : les tracés, les signes et le brouillard sont
   dessinés au-dessus et gardent leurs couleurs franches. Filtrer toute la carte les délaverait aussi.
   Cette carte est un PLATEAU DE JEU et le reste en permanence : aucune règle ici ne doit pouvoir la faire ressembler à
   une carte topographique. Le vrai terrain vit dans l'aperçu d'une quête et sur l'écran de suivi (.lr-realmap). */
.quests-map .leaflet-tile-pane{filter:sepia(.55) saturate(.72) contrast(1.06) brightness(1.03) hue-rotate(-8deg)}
.quests-map-wrap:after{content:"";position:absolute;inset:0;pointer-events:none;mix-blend-mode:multiply;opacity:.5;
  background:radial-gradient(circle at 18% 22%,rgba(160,124,72,.16),transparent 42%),
             radial-gradient(circle at 78% 68%,rgba(140,105,60,.14),transparent 46%),
             radial-gradient(circle at 52% 12%,rgba(190,160,110,.10),transparent 38%)}
.quests-map-wrap:before{content:"";position:absolute;inset:0;pointer-events:none;z-index:2;
  box-shadow:inset 0 0 60px rgba(96,68,30,.22)}
.quests-map-hint{position:absolute;left:14px;right:14px;bottom:14px;z-index:1000;margin:0;background:rgba(255,255,255,.94);
  border:1px solid var(--line);border-radius:14px;padding:10px 14px;font-size:12px;color:var(--muted)}

/* « Vous êtes ici » : un point qui bat, jamais une pastille à toucher — on ne doit pas le confondre avec une quête. */
.quests-here{display:grid;place-items:center;width:26px;height:26px;position:relative}
.quests-here:before{content:"";position:absolute;inset:0;border-radius:50%;background:rgba(47,126,95,.35);animation:quests-pulse 2.2s ease-out infinite}
.quests-here i{width:13px;height:13px;border-radius:50%;background:#2f7e5f;border:3px solid #fff;box-shadow:0 2px 6px rgba(23,57,45,.45);z-index:1}
@keyframes quests-pulse{0%{transform:scale(.5);opacity:.85}100%{transform:scale(1.6);opacity:0}}
@media(prefers-reduced-motion:reduce){.quests-here:before{animation:none;transform:scale(1.1);opacity:.35}}

/* ——— Signes de quête ——— */
.quest-pin{display:grid;place-items:center;width:34px;height:38px;position:relative;
  filter:drop-shadow(0 4px 6px rgba(60,42,20,.35))}
.quest-pin:before{content:"";position:absolute;inset:0 0 4px;background:var(--coral);
  border-radius:50% 50% 50% 50%/58% 58% 42% 42%;clip-path:polygon(50% 100%,0 62%,0 0,100% 0,100% 62%)}
.quest-pin b{position:relative;z-index:1;color:#fff;font:800 17px 'Baloo 2';line-height:1;margin-top:-6px}
.quest-pin i{position:absolute;z-index:2;right:-3px;top:-5px;font-size:12px;font-style:normal;
  background:#fff;border-radius:50%;width:18px;height:18px;display:grid;place-items:center;border:1px solid #e0d3bd}
.quest-pin.is-unconfirmed:before{background:#9aa8a2}
.quest-pin.is-engaged:before{background:#2f7e5f}
.quest-pin.is-done:before{background:#17392d}
.quest-pin.is-alert:before{background:#c2451f}
.quest-pin.is-group{filter:drop-shadow(0 0 5px rgba(244,185,66,.9)) drop-shadow(0 4px 6px rgba(60,42,20,.35))}

/* ——— Liaison avec les sorties ——— */
/* Pastille de date des sorties prévues, sur la carte des quêtes. Volontairement d'une autre forme que les signes de
   quête : on doit distinguer d'un coup d'œil « un parcours à faire » de « un rendez-vous à une date ». */
.quest-outing{display:grid;place-items:center;min-width:54px;height:26px;padding:0 8px;border-radius:100px;
  background:var(--ink);color:#fff;font:800 11px 'DM Sans';white-space:nowrap;box-shadow:0 3px 8px rgba(23,57,45,.35)}
.quest-outing b{font-weight:800}
.quests-outings{display:grid;gap:8px;margin:6px 0 4px}
.quests-outings button{display:grid;gap:2px;text-align:left;border:1px solid var(--line);background:#fff;
  border-radius:16px;padding:12px 15px;cursor:pointer}
.quests-outings button:hover{border-color:var(--coral);background:#fffaf7}
.quests-outings b{font:800 12px 'DM Sans';color:var(--coral-dark);text-transform:capitalize}
.quests-outings span{font:800 14px 'Baloo 2'}
.quests-outings small{color:var(--muted);font-size:11px}
/* Bouton « Quêtes » ajouté à la carte d'Explorer : il vit dans la barre Leaflet, pas dans le thème. */
.lr-quests-toggle button{border:0;background:#fff;padding:7px 11px;font:700 12px 'DM Sans';color:var(--ink);cursor:pointer;border-radius:4px}
.lr-quests-toggle.is-on button{background:var(--coral);color:#fff}

/* ——— Journal ——— */
.quests-journal{background:#fff;border:1px solid var(--line);border-radius:24px;display:flex;flex-direction:column;overflow:hidden;min-height:0}
.quests-tabs{display:flex;overflow-x:auto;border-bottom:1px solid var(--line);scrollbar-width:none}
.quests-tabs::-webkit-scrollbar{display:none}
.quests-view .quests-tabs button{flex:0 0 auto;border:0;background:none;padding:15px 16px;font:700 12px 'DM Sans';color:var(--muted);cursor:pointer;border-bottom:2px solid transparent}
.quests-view .quests-tabs button.active{color:var(--coral-dark);border-bottom-color:var(--coral)}
.quests-list{overflow-y:auto;max-height:min(64vh,640px);padding:8px}
.quests-view .quests-row{width:100%;display:grid;grid-template-columns:auto 1fr auto;gap:12px;align-items:center;
  border:0;background:none;text-align:left;padding:12px;border-radius:16px;cursor:pointer}
.quests-view .quests-row:hover{background:#fbf6ee}
.quests-row-glyph{font-size:22px;width:38px;height:38px;display:grid;place-items:center;background:#f7f2e9;border-radius:12px}
.quests-row-copy{display:grid;gap:3px;min-width:0}
.quests-row-copy strong{font:800 14px 'Baloo 2'}
.quests-row-copy small{color:var(--muted);font-size:11px}
.quests-row-count{color:var(--muted);font-size:12px;font-weight:700;white-space:nowrap}
.quests-dots{letter-spacing:1px;color:var(--coral-dark)}
.quests-badges{display:flex;gap:5px;flex-wrap:wrap;margin-top:3px}
.quests-badge,.quests-stamp{font-size:10px;font-weight:800;letter-spacing:.4px;padding:3px 8px;border-radius:100px;background:#f2efe8;color:var(--muted)}
.quests-badge.is-done{background:var(--mint-pale);color:#20705c}
.quests-badge.is-engaged{background:#fff2e6;color:var(--coral-dark)}
.quests-badge.is-group{background:#fdf3d6;color:#8a6d1f}
.quests-badge.is-alert{background:#fdece7;color:#b23c1c}
.quests-stamp{background:#fdf3d6;color:#8a6d1f}

/* ——— Terrains ———
 * Le premier tri de l'écran, et le seul qui compte quand on arrive : est-ce que je sors un véhicule, ou est-ce que je
 * mets des chaussures ? Il est donc AU-DESSUS des filtres et beaucoup plus gros qu'eux — trois pastilles de la même
 * taille que « difficulté » ne se liraient pas comme un choix de départ, mais comme un filtre de plus parmi six. */
.quests-terrains{display:grid;grid-template-columns:auto repeat(2,minmax(0,1fr));gap:10px;margin:24px 0 4px}
.quests-view .quests-terrain{display:grid;gap:2px;justify-items:center;text-align:center;cursor:pointer;
  border:1px solid var(--line);background:#fff;border-radius:18px;padding:12px 14px;transition:.15s}
.quests-view .quests-terrain b{font:800 14px 'Baloo 2';color:var(--ink)}
.quests-view .quests-terrain small{color:var(--muted);font-size:10.5px;line-height:1.3}
.quests-terrain-glyph{font-size:20px;line-height:1}
.quests-view .quests-terrain:hover{border-color:var(--coral)}
.quests-view .quests-terrain.active{border-color:var(--ink);background:#fbf6ee;box-shadow:inset 0 0 0 1px var(--ink)}
.quests-view .quests-terrain.is-route.active{background:#eef4fb;border-color:#1c4e80;box-shadow:inset 0 0 0 1px #1c4e80}
.quests-view .quests-terrain.is-sentier.active{background:var(--mint-pale);border-color:#20705c;box-shadow:inset 0 0 0 1px #20705c}
.quests-view .quests-terrain.is-all{padding-left:22px;padding-right:22px}
.quests-terrain-line{display:flex;align-items:center;gap:8px;margin:2px 0 12px;color:var(--muted);font-size:12px}
.quests-terrain-tag{font-size:10px;font-weight:800;letter-spacing:.4px;padding:3px 9px;border-radius:100px;background:#f2efe8;color:var(--muted)}
.quests-terrain-tag.is-route{background:#eef4fb;color:#1c4e80}
.quests-terrain-tag.is-sentier{background:var(--mint-pale);color:#20705c}

/* Intertitres de la liste : deux coups d'œil au lieu d'une lecture ligne à ligne. */
.quests-group+.quests-group{margin-top:14px}
.quests-group-title{display:flex;align-items:center;gap:8px;margin:6px 8px;font:800 11px 'DM Sans';letter-spacing:.6px;
  text-transform:uppercase;color:var(--muted)}
.quests-group-title i{font-style:normal;font-size:10px;font-weight:800;padding:2px 7px;border-radius:100px;background:#f2efe8}
.quests-group.is-route .quests-group-title i{background:#eef4fb;color:#1c4e80}
.quests-group.is-sentier .quests-group-title i{background:var(--mint-pale);color:#20705c}
.quests-view .quests-group-title .text-link{margin-left:auto;font-size:10px;text-transform:none;letter-spacing:0}

/* ——— Garder pour plus tard ———
 * L'étoile est POSÉE SUR LA LIGNE, pas dans la fiche : on garde une idée en survolant une liste, pas après avoir
 * ouvert, lu et refermé un panneau. Elle vit hors du bouton d'ouverture — un bouton dans un bouton n'existe pas. */
.quests-row-wrap{position:relative;display:flex;align-items:center}
.quests-row-wrap .quests-row{flex:1;min-width:0}
.quests-view .quests-keep{flex:0 0 auto;border:0;background:none;cursor:pointer;font-size:18px;line-height:1;
  color:#c9c2b4;padding:8px 10px;border-radius:12px}
.quests-view .quests-keep:hover{background:#fdf3d6;color:#8a6d1f}
.quests-view .quests-keep.is-on{color:#e2a32b}
.quests-view .quests-keep.is-remove{font-size:16px}
.quests-view .quests-keep.is-remove:hover{background:#fdece7;color:#b23c1c}
.quests-view .quests-keep-wide{border:1px solid var(--line);background:#fff;border-radius:100px;padding:11px 16px;
  font:700 12px 'DM Sans';color:var(--muted);cursor:pointer}
.quests-view .quests-keep-wide.is-on{background:#fdf3d6;border-color:#e2a32b;color:#8a6d1f}

/* ——— Fiche ———
 * ELLE NE BLOQUE PLUS LA CARTE. Auparavant un voile plein écran couvrait tout : ouvrir une quête obligeait à la fermer
 * pour pouvoir bouger la carte, alors que le geste naturel est justement de regarder le tracé pendant qu'on lit.
 * Le conteneur ne reçoit donc AUCUN clic (`pointer-events:none`) ; seul le panneau lui-même est interactif. */
.quests-sheet{position:fixed;inset:0;z-index:1200;display:flex;justify-content:flex-end;pointer-events:none;background:none}
.quests-sheet[hidden]{display:none}
.quests-sheet-inner{pointer-events:auto;background:#fff;width:min(520px,100%);height:100%;overflow-y:auto;padding:32px 30px 60px;position:relative;
  box-shadow:-20px 0 60px rgba(23,57,45,.22);border-left:1px solid var(--line)}
.quests-sheet-inner h2{font:800 27px/1.15 'Baloo 2';margin:8px 0 4px;letter-spacing:-1px}
.quests-sheet-inner h3{font:800 15px 'Baloo 2';margin:24px 0 8px}
.quests-sheet-close{position:absolute;right:18px;top:18px;border:1px solid var(--line);background:#fff;border-radius:50%;
  width:36px;height:36px;font-size:20px;line-height:1;cursor:pointer;color:var(--ink)}
.quests-place{color:var(--muted);margin:0 0 16px}
.quests-facts{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin:18px 0}
.quests-facts div{background:#fbf6ee;border-radius:14px;padding:12px 10px;text-align:center;display:grid;gap:2px}
.quests-facts b{font:800 16px 'Baloo 2'}
.quests-facts small{color:var(--muted);font-size:10px}
/* Le dénivelé d'une activité physique est mis en avant : c'est lui, plus que la distance, qui dit ce que la sortie
   va coûter. Deux parcours de 15 km n'ont rien à voir selon qu'ils montent de 100 ou de 1 200 mètres. */
.quests-facts .is-climb{background:#fdf0e9;border:1px solid #f0cdb9}
.quests-facts .is-climb b{color:var(--coral-dark)}
.quests-climb{color:var(--coral-dark);font-weight:800}
/* Aperçu du parcours : c'est une CARTE RÉELLE (voir .lr-realmap dans app-styles.css), parce qu'on y prépare une sortie.
   Elle porte le même cadre et la même teinte que la carte de l'écran de suivi — les deux servent le même moment. */
.quests-mini{height:210px;border-radius:18px;overflow:hidden;border:1px solid var(--line);background:#efe9dd}
.quests-mini-legend{display:flex;align-items:center;gap:6px;margin:6px 2px 0;font-size:11px;color:var(--muted)}
/* Profil altimétrique : dessiné à la main en SVG, sans bibliothèque. Il répond à « ça monte quand ? », question que
   ni la distance ni le dénivelé total ne traitent — 600 m étalés sur 20 km ne sont pas 600 m d'une seule traite. */
.quests-elevation{margin:10px 0 4px;border:1px solid var(--line);border-radius:16px;background:#fbf6ee;padding:8px 10px 4px}
.quests-elevation svg{width:100%;height:88px;display:block}
.quests-elevation-fill{fill:rgba(233,109,58,.16);stroke:none}
.quests-elevation-line{fill:none;stroke:var(--coral);stroke-width:2;vector-effect:non-scaling-stroke}
.quests-elevation-legend{display:flex;justify-content:space-between;font-size:10px;color:var(--muted);padding:2px 2px 4px}
.quests-story{line-height:1.7;color:#455650;margin:18px 0}
.quests-challenges,.quests-alerts{margin:0;padding-left:18px;color:#455650;line-height:1.6}
.quests-alerts li{color:#b23c1c}
.quests-alerts li.is-confirmed{font-weight:700}
.quests-alerts span{color:var(--muted);font-weight:400}
.quests-actions{display:flex;gap:10px;flex-wrap:wrap;margin:22px 0}
.quests-done-flag{display:inline-flex;align-items:center;gap:8px;background:var(--mint-pale);color:#20705c;
  border-radius:16px;padding:14px 18px;font-weight:800;font-size:13px}
.quests-credits{display:flex;gap:8px;flex-wrap:wrap}
.quests-credit{display:inline-flex;align-items:center;gap:7px;background:#f7f5f0;border-radius:100px;padding:5px 12px 5px 5px;font-size:12px;font-weight:700}
.quests-credit img{width:24px;height:24px;border-radius:50%;object-fit:cover}
.quests-credit i{font-style:normal;font-weight:400;color:var(--muted);font-size:10px}
.quests-first{background:#fdf3d6;border-radius:14px;padding:12px 15px;font-size:13px;margin:16px 0}
.quests-note{color:var(--muted);font-size:12px;line-height:1.6}
.quests-error{color:#b23c1c;font-size:13px;font-weight:600}
.quests-loading{color:var(--muted)}
.quests-boot{padding:60px 0;color:var(--muted)}

/* ——— Photos du parcours ——— */
.quests-photos{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;margin:6px 0 4px}
.quests-photos figure{margin:0;border:1px solid var(--line);border-radius:16px;overflow:hidden;background:#fbf6ee}
.quests-photos img{width:100%;height:150px;object-fit:cover;display:block}
.quests-photos figcaption{padding:8px 10px 0;font-size:12px;color:#455650}
.quests-photo-tools{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 10px 8px}
.quests-photo-tools small{color:var(--muted);font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.quests-photo-tools button{border:0;background:none;cursor:pointer;font-size:14px;line-height:1;color:var(--muted);padding:2px 4px}
.quests-photo-tools button:hover{color:var(--coral-dark)}
.quests-photo-add{display:flex;gap:12px;align-items:flex-start;flex-wrap:wrap;border:1px dashed var(--line);
  border-radius:16px;padding:14px 16px;background:#fbf6ee;margin:12px 0}
.quests-photo-add span{display:grid;gap:4px;flex:1 1 240px}
.quests-photo-add b{font:800 13px 'DM Sans'}
.quests-photo-add small{color:var(--muted);font-size:11.5px;line-height:1.5}

/* ——— Fenêtres de création et de signalement ——— */
.quests-modal{position:fixed;inset:0;z-index:1300;background:rgba(23,57,45,.45);display:grid;place-items:center;padding:20px}
.quests-dialog{background:#fff;border-radius:24px;padding:30px 28px;width:min(560px,100%);max-height:88vh;overflow-y:auto;position:relative}
.quests-dialog-wide{width:min(760px,100%)}
/* Import en lot : une ligne par fichier, l'activité devinée montrée et corrigeable AVANT publication. */
.quests-bulk-progress{margin:12px 0 0;font:700 12px 'DM Sans';color:var(--coral-dark)}
.quests-bulk{display:grid;gap:6px;margin:16px 0;max-height:46vh;overflow-y:auto}
.quests-bulk-row{display:grid;grid-template-columns:1fr auto auto;grid-template-areas:"name mode flag" "meta mode flag";
  gap:2px 10px;align-items:center;border:1px solid var(--line);border-radius:14px;padding:10px 14px;background:#fff}
.quests-bulk-row b{grid-area:name;font:800 13px 'Baloo 2'}
.quests-bulk-row small{grid-area:meta;color:var(--muted);font-size:11px}
.quests-bulk-row select{grid-area:mode;padding:7px 10px;font-size:12px;border-radius:100px}
.quests-bulk-flag{grid-area:flag;font-size:10px;font-weight:800;letter-spacing:.4px;text-transform:uppercase;
  padding:4px 9px;border-radius:100px;background:#fff8e6;color:#8a6d1f;white-space:nowrap}
.quests-bulk-flag.is-ok{background:var(--mint-pale);color:#20705c}
.quests-bulk-row.is-check{border-color:#e6c34a;background:#fffdf6}
.quests-bulk-row.is-done{border-color:var(--mint);background:var(--mint-pale)}
.quests-bulk-row.is-error{border-color:var(--danger-line,#d98b7a);background:#fdf0ed}
.quests-bulk-row.is-reading{opacity:.6}
@media(max-width:640px){.quests-bulk-row{grid-template-columns:1fr;grid-template-areas:"name" "meta" "mode" "flag"}
  .quests-bulk-flag{justify-self:start}}
.quests-dialog h2{font:800 24px 'Baloo 2';margin:0 0 8px}
.quests-dialog>p{color:var(--muted);font-size:13px;line-height:1.6}
.quests-dialog label{display:grid;gap:7px;font-weight:700;font-size:12px;margin:14px 0}
.quests-dialog summary{cursor:pointer;font-weight:700;font-size:13px;margin:14px 0 6px}
.quests-source-list{display:grid;gap:8px;margin:16px 0}
.quests-dialog .quests-source{display:grid;gap:3px;text-align:left;border:1px solid var(--line);background:#fff;
  border-radius:16px;padding:14px 16px;cursor:pointer}
.quests-dialog .quests-source:hover{border-color:var(--coral);background:#fffaf7}
.quests-source strong{font:800 14px 'Baloo 2'}
/* Ce que l'application a compris du fichier, montré AVANT de demander quoi que ce soit : on ne demande pas à
   quelqu'un de confirmer une activité sans lui dire ce qu'on a lu. */
.quests-readout{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin:16px 0 4px}
.quests-readout div{background:#fbf6ee;border-radius:14px;padding:10px 8px;text-align:center;display:grid;gap:2px}
.quests-readout b{font:800 15px 'Baloo 2'}
.quests-readout small{color:var(--muted);font-size:10px}
.quests-dialog .quests-field-strong{background:#fff4ee;border:1px solid #f3d5c6;border-radius:16px;padding:12px 14px;margin:16px 0 8px}
.quests-field-strong em{font-style:normal;color:var(--coral-dark);font-weight:800}
.quests-warn{background:#fff8e6;border:1px solid #e6c34a;border-radius:14px;padding:11px 14px;font-size:12px;line-height:1.55;margin:0 0 12px}
.quests-field-row{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.quests-time-row{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--muted)}
.quests-time-row input{width:74px}
.quests-dialog .quests-time small{display:block;color:var(--muted);font-weight:400;font-size:11px;line-height:1.5;margin-top:6px}
.quests-duration{border:1px solid var(--line);border-radius:16px;padding:12px 14px;margin:16px 0;background:#fbf6ee}
.quests-duration-title{display:block;font-weight:800;font-size:12px;margin-bottom:4px}
.quests-duration-title em{font-style:normal;color:var(--coral-dark)}
.quests-duration small{display:block;color:var(--muted);font-size:11px;line-height:1.5;margin-top:6px}
.quests-duration .quests-field-row{margin-top:6px}
/* ——— Grappes de secteur (dézoom), façon carte de région ——— */
.quest-cluster{display:grid;place-items:center;transform:translate(-50%,-50%);width:44px;height:44px;border-radius:50%;
  background:radial-gradient(circle at 35% 30%,#f6a072,var(--coral) 60%,var(--coral-dark));color:#fff;
  font:800 15px 'Baloo 2';border:3px solid #fff7ea;box-shadow:0 4px 12px rgba(80,45,20,.45);cursor:pointer;position:relative}
.quest-cluster.is-mid{width:54px;height:54px;font-size:17px}
.quest-cluster.is-big{width:66px;height:66px;font-size:20px}
.quest-cluster:hover{filter:brightness(1.08)}
.quest-cluster i{position:absolute;top:100%;left:50%;transform:translateX(-50%);margin-top:5px;font-style:normal;
  font:800 11px 'DM Sans';color:#5b4326;white-space:nowrap;text-shadow:0 1px 0 #fff7ea,0 0 5px #fff7ea;letter-spacing:.4px;text-transform:uppercase}
/* ——— Sonde : « qu'est-ce qui passe par ici ? » ——— */
.quests-probe-ring{pointer-events:none}
.quests-probe-head{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:10px 12px 6px}
.quests-probe-head b{font:800 13px 'Baloo 2'}
/* ——— Récit manquant : une invitation, pas un blanc ——— */
.quests-untold{background:#fff8e6;border:1px solid #e6c34a;border-radius:16px;padding:13px 16px;margin:16px 0;font-size:13px;line-height:1.6}
.quests-untold b{display:block;margin-bottom:4px}
.quests-untold p{margin:0;color:#6b5a2a}
/* ——— Estimations par moyen de déplacement ——— */
.quests-estimates{display:grid;grid-template-columns:repeat(auto-fit,minmax(110px,1fr));gap:8px;margin:6px 0}
.quests-estimates div{background:#fbf6ee;border-radius:14px;padding:10px 12px;display:grid;gap:1px;text-align:center}
.quests-estimates span{font-size:11px;color:var(--muted)}
.quests-estimates b{font:800 15px 'Baloo 2'}
.quests-estimates small{font-size:10px;color:var(--muted)}

/* ——— Balises : départ, arrivée, repères ——— */
.quests-marks{border:1px solid var(--line);border-radius:16px;padding:12px 14px;margin:16px 0;background:#fbf6ee}
.quests-marks>small{display:block;color:var(--muted);font-size:11px;line-height:1.5;margin:2px 0 10px}
.quests-markmap{height:230px;border-radius:14px;overflow:hidden;border:1px solid var(--line);margin:0 0 12px;background:#efe9dd;cursor:crosshair}
.quests-mark{display:grid;grid-template-columns:auto 1fr 1fr auto;gap:8px;align-items:center;margin-bottom:8px;
  border-radius:12px;transition:background .15s}
.quests-mark[draggable="true"] .quests-mark-role{cursor:grab}
.quests-mark.is-dragging{opacity:.5;background:#fff0e8}
.quests-mark-tools{display:flex;gap:4px}
.quests-mark-tools button{border:1px solid var(--line);background:#fff;border-radius:9px;width:26px;height:28px;cursor:pointer;color:var(--muted);font-size:12px;line-height:1;padding:0}
.quests-mark-tools button:disabled{opacity:.3;cursor:default}
.quests-mark-tools button:not(:disabled):hover{border-color:var(--coral);color:var(--coral-dark)}
.quests-mark-role{font:800 10px 'DM Sans';letter-spacing:.5px;text-transform:uppercase;padding:5px 9px;border-radius:100px;background:#eef1ee;color:var(--muted);white-space:nowrap}
.quests-mark-role.is-start{background:var(--mint-pale);color:#20705c}
.quests-mark-role.is-end{background:#fdece7;color:var(--coral-dark)}
.quests-dialog .quests-mark input{padding:9px 11px;font-size:12px}


.quests-mark-fixed{color:var(--muted);text-align:center;width:30px}
.quests-mark-add{padding:8px 14px;font-size:12px}
.quests-marklist{list-style:none;padding:0;margin:6px 0;display:grid;gap:6px}
.quests-marklist li{display:grid;gap:2px;background:#fbf6ee;border-radius:12px;padding:9px 12px;font-size:13px}
.quests-marklist li.is-start{background:var(--mint-pale)}
.quests-marklist li.is-end{background:#fdece7}
.quests-marklist b{font:800 10px 'DM Sans';letter-spacing:.5px;text-transform:uppercase;color:var(--muted)}
.quests-marklist small{color:var(--muted);font-size:11px}
/* ——— Ce qu'ils en ont dit ——— */
.quests-notes{display:grid;gap:8px;margin:6px 0}
.quests-notes blockquote{margin:0;background:#fbf6ee;border-left:3px solid var(--coral);border-radius:0 12px 12px 0;
  padding:10px 14px;font-size:13px;line-height:1.6;color:#455650}
.quests-notes cite{display:block;font-style:normal;font-weight:800;font-size:11px;color:var(--muted);margin-top:5px}
.quests-owner-tools{display:flex;align-items:center;gap:10px;flex-wrap:wrap;border-top:1px solid var(--line);
  margin-top:22px;padding-top:16px;font-size:12px;color:var(--muted)}
.quests-owner-tools span{flex:1 1 160px}
.quests-view .quests-owner-tools .danger-link{font:800 12px 'DM Sans'}

/* ——— Doublons ———
 * Le pourcentage est le chiffre qui décide : il est donc gros, à part, et lisible avant les noms — deux titres
 * ressemblants ne prouvent rien, deux tracés qui se recouvrent à 94 % si. */
.quests-twinlist{display:grid;gap:8px;margin:8px 0 4px}
.quests-twin{display:flex;gap:10px;align-items:flex-start;border:1px solid var(--line);border-radius:14px;
  padding:10px 12px;cursor:pointer;background:#fff}
.quests-twin:hover{border-color:var(--coral)}
.quests-twin span{display:grid;gap:2px}
.quests-twin b{font:800 13px 'Baloo 2'}
.quests-twin small{color:var(--muted);font-size:11px}
.quests-twin-row{display:grid;grid-template-columns:1fr auto;gap:6px 14px;align-items:center;
  border:1px solid var(--line);border-radius:16px;padding:12px 14px;margin-bottom:8px;background:#fff}
.quests-twin-row b{font:800 14px 'Baloo 2'}
.quests-twin-row small{display:block;color:var(--muted);font-size:11px}
.quests-twin-score{font:800 22px 'Baloo 2';color:#8a6d1f}
.quests-twin-tools{grid-column:1/-1;display:flex;gap:8px;flex-wrap:wrap}
@media(max-width:640px){.quests-readout{grid-template-columns:repeat(2,1fr)}.quests-field-row{grid-template-columns:1fr}
  .quests-mark{grid-template-columns:auto 1fr auto}.quests-mark [data-mark-hint]{grid-column:2/4}}

/* ===== Continuité entre les écrans ==================================================================================
 * Ces deux blocs existent pour une seule raison : ne pas donner la sensation de changer d'outil. L'un rappelle, dans
 * le formulaire de création, de quelle quête vient la sortie et ce qu'il reste à faire ; l'autre annonce, sur la fiche
 * d'une sortie, qu'un parcours l'accompagne et y ramène. Ils sont volontairement dessinés pareil. */
.quest-context{display:flex;gap:16px;align-items:center;flex-wrap:wrap;justify-content:space-between;
  background:#fff4ee;border:1px solid #f3d5c6;border-radius:18px;padding:14px 18px;margin:0 0 22px}
.quest-context-copy{display:grid;gap:2px;flex:1 1 260px}
.quest-context strong{font:800 17px 'Baloo 2'}
.quest-context small{color:var(--muted);font-size:12px}
.quest-context-todo{line-height:1.5;margin-top:4px}
.quest-from{display:flex;gap:14px;align-items:center;width:100%;text-align:left;cursor:pointer;
  background:#fff4ee;border:1px solid #f3d5c6;border-radius:18px;padding:12px 16px;margin:0 0 18px}
.quest-from:hover{border-color:var(--coral)}
.quest-from>span{display:grid;gap:2px}
.quest-from strong{font:800 16px 'Baloo 2'}
.quest-from small{color:var(--muted);font-size:12px}
.quest-from-glyph{font-size:24px;width:44px;height:44px;display:grid;place-items:center;background:#fff;border-radius:14px;flex:none}
/* Repères du parcours posés sur la carte de création (product.js) : même langage que la fiche d'une quête. */
.lr-quest-mark{display:grid;place-items:center;width:22px;height:22px;border-radius:50%;background:#17392d;color:#fff;
  font:800 11px 'DM Sans';border:2px solid #fff;box-shadow:0 2px 5px rgba(23,57,45,.4)}
.lr-quest-mark.is-start{background:#2f7e5f}
.lr-quest-mark.is-end{background:var(--coral-dark)}
.quests-source small{color:var(--muted);font-size:11px}
.quests-gpx{border:1px dashed var(--line);border-radius:16px;padding:14px 16px;background:#fbf6ee}
.quests-checks{display:grid;grid-template-columns:repeat(2,1fr);gap:6px}
.quests-dialog .quests-check{display:flex;align-items:center;gap:8px;font-weight:600;font-size:12px;margin:0}
.quests-check input{margin:0}

/* ——— Adaptation mobile : la carte reste reine, le journal glisse dessous ——— */
@media(max-width:980px){
  .quests-body{grid-template-columns:1fr}
  .quests-map{height:58vh}
  .quests-list{max-height:none}
  .quests-head-actions{justify-items:stretch;width:100%}
  .quests-carnet{justify-content:flex-start}
}
/* Sur écran étroit, la fiche devient un panneau du BAS qui laisse la carte visible au-dessus : on lit et on voit le
   tracé en même temps, et on la referme d'un glissé vers le bas comme n'importe quelle feuille de téléphone. */
@media(max-width:980px){
  .quests-sheet{align-items:flex-end;justify-content:center}
  .quests-sheet-inner{width:100%;height:auto;max-height:62vh;border-radius:22px 22px 0 0;border-left:0;
    border-top:1px solid var(--line);box-shadow:0 -18px 50px rgba(23,57,45,.22);padding:22px 20px 60px}
  .quests-sheet-inner:before{content:"";display:block;width:44px;height:4px;border-radius:4px;background:var(--line);margin:-8px auto 14px}
}

@media(max-width:640px){
  /* ——— Refonte téléphone (31/07/2026, mesurée sur un 390×844 réel) ———————————————————————————————
     Constat avant correction : la carte — la RAISON D'ÊTRE de l'écran — commençait à 505 px du haut, sous 374 px
     d'en-tête, de sélecteurs de terrain empilés et de filtres. Sur un écran de 844 px, on ouvrait « la carte des
     quêtes » et on voyait du texte. Après : la carte commence à 299 px et en occupe 584, soit les deux tiers du
     premier écran. Rien n'a été retiré de la page — seulement compacté et remonté.
     Toutes les cibles tactiles passent à 44 px minimum (recommandation Apple ; Google demande 48 dp) : les pastilles
     de filtre et les commandes de zoom de Leaflet étaient à 39 et 34 px, ce que la relecture d'un magasin
     d'applications relève. */
  .quests-view{padding:14px 4vw 110px}
  .quests-head{gap:10px;margin:0}
  .quests-view h1{font-size:22px;line-height:1.15;margin:2px 0 0}
  /* CORRECTION DU 01/08/2026 — j'avais masqué ici le paragraphe d'intention avec le surtitre, pour gagner 76 px.
     C'était une erreur : ce paragraphe est la seule DÉFINITION du mot « quête » que rencontre un nouveau venu, et
     « quête » n'a aucun sens évident. Le surtitre, lui, n'apprend rien — il reste masqué. Le paragraphe revient,
     borné à deux lignes : trente-six pixels pour la seule phrase qui explique l'écran, c'est le meilleur rapport
     de la page. */
  .quests-head-copy .eyebrow{display:none}
  .quests-head-copy p{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
    font-size:13px;line-height:1.4;margin:4px 0 0}
  .quests-head-actions{margin:0}
  .quests-head-actions .primary{width:100%;min-height:44px;padding:10px 14px}
  .quests-carnet,.quests-filters{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch;padding-bottom:2px}
  .quests-carnet::-webkit-scrollbar,.quests-filters::-webkit-scrollbar{display:none}
  .quests-carnet-item,.quests-view .quests-chip,.quests-view .quests-filters select{flex:0 0 auto}
  .quests-filters{margin:10px 0 8px}
  /* Les trois terrains tiennent sur UNE ligne : empilés, ils mangeaient 136 px pour trois mots. Ils restent en pleine
     largeur (jamais un ruban qu'on rate en faisant défiler), simplement plus serrés. */
  .quests-terrains{grid-template-columns:repeat(3,1fr);gap:6px;margin:10px 0 0}
  .quests-view .quests-terrain{padding:8px 6px;min-height:44px}
  .quests-view .quests-terrain.is-all{grid-column:auto}
  .quests-view .quests-terrain small,.quests-view .quests-terrain.is-all small{display:none}
  .quests-view .quests-terrain b{font-size:13px;line-height:1.2}
  .quests-view .quests-chip,.quests-view .quests-filters select{min-height:44px}
  .quests-facts{grid-template-columns:repeat(2,1fr)}
  .quests-sheet-inner{width:100%;padding:26px 20px 80px}
  .quests-checks{grid-template-columns:1fr}
  .quests-body{gap:12px}
  /* `dvh` suit la barre d'adresse qui se rétracte ; `vh` reste en repli pour les navigateurs qui l'ignorent. Le
     plancher évite une carte inutilisable sur un très petit écran en paysage. */
  .quests-map{height:calc(100vh - 260px);height:calc(100dvh - 260px);min-height:340px}
  .quests-map .leaflet-control-zoom a{width:44px;height:44px;line-height:44px;font-size:20px}
}

/* ===== Centres d'intérêt ============================================================================================
 * Un losange, jamais une pastille de quête : un parcours se suit, un centre d'intérêt se visite, et les deux ne se
 * cherchent pas de la même façon sur une carte. Les jeux le font depuis toujours — les points d'intérêt n'ont jamais
 * la forme des objectifs. */
.quest-poi{display:grid;place-items:center;width:30px;height:30px;font-size:15px;
  background:#fff7ea;border:2px solid #8a6a3d;border-radius:6px;transform:rotate(45deg);
  box-shadow:0 3px 8px rgba(60,42,20,.4);cursor:pointer}
.quest-poi>*{transform:rotate(-45deg)}
.quest-poi{line-height:1}
.quest-poi.is-done{background:var(--mint-pale);border-color:#2f7e5f}
.quest-poi:hover{filter:brightness(1.06)}
.quests-pois{display:grid;gap:6px;margin:6px 0}
.quests-pois button{display:grid;grid-template-columns:auto 1fr auto;gap:10px;align-items:center;text-align:left;
  border:1px solid var(--line);background:#fff;border-radius:14px;padding:10px 14px;cursor:pointer;font-size:13px}
.quests-pois button:hover{border-color:var(--coral);background:#fffaf7}
.quests-pois button.is-done{background:var(--mint-pale);border-color:var(--mint)}
.quests-pois span:first-child{font-size:19px}
.quests-pois b{font:800 13px 'Baloo 2';display:block}
.quests-pois small{color:var(--muted);font-size:11px}
.quests-pois i{font-style:normal;color:#20705c;font-weight:800}
.quests-poi-rules{background:#fff7ea;border:1px solid #e0cba6;border-radius:16px;padding:13px 16px;margin:14px 0;font-size:13px;line-height:1.6}
.quests-poi-rules b{display:block;margin-bottom:4px}
.quests-poi-rules p{margin:0;color:#6b5a3a}

/* ===== Fragments de territoire ====================================================================================
 * Une pastille au CENTRE d'une commune, jamais un contour : le serveur rattache au centre le plus proche et n'a pas
 * les frontières. Dessiner une limite qu'on ne connaît pas serait un mensonge visuel — voir liverok-fragment-math.php.
 * L'anneau est un dégradé conique piloté par --p (le pourcentage) : aucune image, aucune bibliothèque de graphique. */
.quest-frag{display:grid;place-items:center;transform:translate(-50%,-50%);width:46px;height:46px;border-radius:50%;
  background:conic-gradient(var(--mint) calc(var(--p,0)*1%),rgba(255,247,234,.75) 0);
  border:2px solid #fff7ea;box-shadow:0 3px 10px rgba(80,45,20,.32);cursor:pointer;position:relative;
  font:800 12px 'Baloo 2';color:#3f2f1c}
.quest-frag::before{content:'';position:absolute;inset:5px;border-radius:50%;background:#fff7ea}
.quest-frag b{position:relative;z-index:1;line-height:1}
.quest-frag i{position:absolute;top:100%;left:50%;transform:translateX(-50%);margin-top:4px;font-style:normal;
  font:800 10px 'DM Sans';color:#5b4326;white-space:nowrap;letter-spacing:.3px;text-transform:uppercase;
  text-shadow:0 1px 0 #fff7ea,0 0 5px #fff7ea}
/* Sans compte, le pourcentage vaudrait 0 partout et ne dirait rien : on montre le nombre de parcours déposés.
 * Le disque intérieur passe au BLANC (et non au crème du dessous) : le banc d'essai a montré qu'avec le même crème,
 * une pastille « 7 parcours » et une pastille « 0 % » se ressemblaient trait pour trait. Ce n'est pas la même chose —
 * l'une dit qu'il y a de quoi faire, l'autre qu'on n'a rien fait. */
.quest-frag.is-count{background:radial-gradient(circle at 35% 30%,#fff,#e2d5bd);border-color:#c8b393}
.quest-frag.is-count::before{background:#fff}
.quest-frag.is-done{background:conic-gradient(#e0b437 100%,#e0b437 0);border-color:#a9821c;
  box-shadow:0 3px 12px rgba(140,100,20,.45)}
.quest-frag:hover{filter:brightness(1.06)}
.quest-frag.tier-complet b::after{content:'🏅';display:block;font-size:11px;margin-top:-1px}

/* ——— Fiche d'un territoire ——— */
.frag-head{display:grid;grid-template-columns:auto 1fr;gap:14px;align-items:center;margin-bottom:14px}
.frag-head h2{margin:2px 0 3px}
.frag-ring{display:grid;place-items:center;width:74px;height:74px;border-radius:50%;
  background:conic-gradient(var(--mint) calc(var(--p,0)*1%),#efe6d6 0);position:relative;flex:none}
.frag-ring::before{content:'';position:absolute;inset:8px;border-radius:50%;background:#fff}
.frag-ring b{position:relative;z-index:1;font:800 17px 'Baloo 2';color:#3f2f1c}
.frag-ring.tier-complet{background:conic-gradient(#e0b437 100%,#e0b437 0)}
.frag-tier{margin:0;font-size:12px;color:var(--muted)}
.frag-stats{list-style:none;margin:0 0 16px;padding:0;display:grid;
  grid-template-columns:repeat(auto-fit,minmax(96px,1fr));gap:8px}
.frag-stats li{background:#fbf6ee;border-radius:14px;padding:10px 12px;text-align:center;display:grid;gap:1px}
.frag-stats b{font:800 18px 'Baloo 2'}
.frag-stats span{font-size:11px;color:var(--muted);line-height:1.35}
.frag-empty{background:#fff8e6;border:1px solid #e6c34a;border-radius:16px;padding:13px 16px;
  margin:0 0 14px;font-size:13px;line-height:1.6;color:#6b5a2a}
.frag-todo{display:grid;gap:6px;margin:6px 0 10px}
.frag-todo-item{display:grid;grid-template-columns:auto 1fr;gap:10px;align-items:center;text-align:left;
  border:1px solid var(--line);background:#fff;border-radius:14px;padding:10px 14px;cursor:pointer;width:100%}
.frag-todo-item:hover{border-color:var(--coral);background:#fffaf7}
.frag-todo-emoji{font-size:19px}
.frag-todo-copy b{font:800 13px 'Baloo 2';display:block}
.frag-todo-copy small{color:var(--muted);font-size:11px}
.frag-more{font-size:12px;color:var(--muted);margin:0 0 10px}
.frag-source{font-size:11px;color:var(--muted);line-height:1.5;margin:14px 0 0;border-top:1px solid var(--line);padding-top:10px}
