/* Toasts + confirmation maison (jamais d'alert()/confirm() natifs). */

.ody-toasts{position:fixed;bottom:20px;left:50%;transform:translateX(-50%);
  display:flex;flex-direction:column;gap:8px;z-index:10000}
.ody-toast{background:#1a1a1a;color:#fff;padding:12px 16px;border-radius:10px;font-size:14px;
  box-shadow:0 8px 24px rgba(0,0,0,.18);opacity:0;transform:translateY(8px);
  transition:opacity .2s,transform .2s;max-width:90vw}
.ody-toast.show{opacity:1;transform:none}
/* Succès : le vert de la charte Vayanji, pas celui de Mon Check-in. Le vert-encre des
   boutons serait ici indistinct du toast neutre (#1a1a1a). */
.ody-toast.ok{background:#2e5741}
.ody-toast.error{background:#a32d2d}

.ody-modal{position:fixed;inset:0;background:rgba(0,0,0,.4);display:flex;align-items:center;
  justify-content:center;z-index:10001;opacity:0;pointer-events:none;transition:opacity .15s}
.ody-modal.show{opacity:1;pointer-events:auto}
.ody-modal-box{position:relative;background:#fff;border-radius:14px;padding:22px;max-width:380px;
  width:calc(100% - 40px);box-shadow:0 20px 60px rgba(0,0,0,.25)}
.ody-modal-msg{font-size:15px;color:#1a1a1a;margin-bottom:18px;line-height:1.5}
.ody-modal-actions{display:flex;gap:10px;justify-content:flex-end}
/* ⚠️ Pas de `border` ici : ".ody-modal-actions button" (classe+élément) est plus spécifique qu'un
   ".ody-btn-ok" à une seule classe -- un border posé ici gagnerait TOUJOURS sur le sien, quel que
   soit l'ordre dans le fichier (bug vécu le 2026-09-08 : bordure dorée invisible). Chaque bouton
   déclare donc son propre `border` complet ci-dessous. */
.ody-modal-actions button{font:inherit;padding:9px 16px;border-radius:8px;cursor:pointer;
  transition:background .15s,color .15s}
.ody-btn-cancel{background:#eee;color:#1a1a1a;border:1px solid transparent}
/* Défaut doré (2026-09-08), même langage que partout ailleurs -- voir assets/app.css. Ce bouton est
   PARTAGÉ par toutes les confirmations (lâcher, rebut, désactiver...) : pas de traitement "danger"
   distinct pour l'instant, faute de mécanisme pour le signaler au cas par cas (voir showConfirm()
   dans ui.js). À revoir si Patrick veut une couleur différente pour les actions destructrices. */
.ody-btn-ok{background:transparent;color:var(--spark);border:1px solid var(--spark)}
.ody-btn-ok:hover{background:var(--spark);color:#fff}

/* Modale INFORMATIVE (showInfoModal, 2026-08-31) : contenu libre + une seule sortie (croix). */
.ody-modal-body{font-size:14.5px;color:#1a1a1a;line-height:1.6}
.ody-modal-body h2{margin:0 0 14px;font-size:17px}
.ody-modal-body ul{margin:0 0 16px;padding-left:20px}
.ody-modal-body li{margin-bottom:8px}
/* ⚠️ padding:0 + flex (2026-09-08), même bug/même fix que .qp-close (assets/app.css) : sans ça, ce
   bouton hérite du padding:11px 18px du bouton par défaut -> ovale mal centré au survol. Partagé par
   TOUTES les modales info (showInfoModal(), ui.js), donc un seul correctif pour tous ses usages. */
.ody-modal-x{position:absolute;top:10px;right:10px;width:30px;height:30px;padding:0;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  border:0;background:none;color:#6b6b6b;font-size:22px;line-height:1;cursor:pointer}
.ody-modal-x:hover{background:#f1ede4}
/* Cadre or : réservé à un contenu déclenché volontairement et rare (comme celui-ci), jamais
   étendu aux boutons -- l'or reste réservé aux moments, cf. la charte du projet. */
.ody-modal-box.is-gold{border:1px solid var(--spark,#c2853a);
  box-shadow:0 20px 60px rgba(0,0,0,.25),0 0 0 4px rgba(194,133,58,.12)}

/* Modale iframe (ex. "Étiquette" sur admin/jetons.php) : même langage que .ody-modal ci-dessus,
   mais dimensionnée pour accueillir une page entière plutôt qu'un message. */
.ody-iframe-modal{position:fixed;inset:0;background:rgba(16,26,22,.55);display:flex;
  align-items:center;justify-content:center;z-index:10002;opacity:0;pointer-events:none;
  transition:opacity .15s;padding:24px;box-sizing:border-box}
.ody-iframe-modal.show{opacity:1;pointer-events:auto}
.ody-iframe-box{position:relative;background:#fff;border-radius:16px;overflow:hidden;
  width:min(480px,100%);height:min(640px,90vh);box-shadow:0 24px 70px rgba(0,0,0,.35)}
.ody-iframe-box iframe{display:block;width:100%;height:100%;border:0}
/* padding:0 (2026-09-08), même bug/même fix que .qp-close et .ody-modal-x -- c'est un vrai
   <button> (créé en JS, ui.js), donc hérite du padding:11px 18px du bouton par défaut sans ça. */
.ody-iframe-x{position:absolute;top:10px;right:10px;width:32px;height:32px;padding:0;border-radius:50%;
  border:0;background:rgba(26,26,26,.75);color:#fff;font-size:20px;line-height:1;cursor:pointer;
  display:flex;align-items:center;justify-content:center;z-index:1}
.ody-iframe-x:hover{background:#101a16}
