/* =====================================================================
   MISE EN PAGE — combocombo
   (En général tu n'as pas besoin de toucher ce fichier :
    les réglages d'apparence sont dans variables.css)
   ===================================================================== */

/* --- Reset léger, cross-browser ------------------------------------ */
*,
*::before,
*::after { box-sizing: border-box; }

html, body {
  margin: 0;
  padding: 0;
  height: 100%;
}

body {
  background: var(--color-bg);
  color: var(--color-text);
  font-family: var(--font-main);
  overflow: hidden;                 /* pas de scroll : page unique    */
  /* groupe de fusion explicite : fiabilise mix-blend-mode, notamment
     sur iOS Safari (sinon la difference est parfois ignorée).        */
  isolation: isolate;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
}

/* --- Couche du mouse trail ----------------------------------------- */
/* position: absolute (et pas fixed) : un arrière-plan en position fixed
   casse le mix-blend-mode sur iOS Safari. Sans scroll, absolute donne
   exactement le même rendu que fixed.                                 */
#trail-layer {
  position: absolute;
  top: 0; left: 0; right: 0; bottom: 0;
  pointer-events: none;             /* ne bloque jamais la souris     */
  overflow: hidden;
  /* z-index 0 : reste derrière le contenu, mais sans créer une couche
     "positive" qui empêcherait le mix-blend-mode des boutons.        */
  z-index: 0;
  /* Le fond est porté ICI (et pas seulement sur <body>) : ainsi il
     fait partie du groupe de fusion, et le mix-blend-mode des textes
     fonctionne aussi au-dessus du gris uni, pas seulement des images. */
  background: var(--color-bg);
}

/* Une image du trail */
.trail-img {
  position: absolute;
  top: 0; left: 0;
  opacity: 0;
  will-change: transform, opacity;
  pointer-events: none;
  user-select: none;
  -webkit-user-drag: none;
}

/* --- État initial pour l'animation d'intro ------------------------- */
/* Logo, tagline, ligne d'info et boutons démarrent invisibles ;
   js/intro.js les révèle en fondu doux au chargement (réglages :
   bloc "intro" de js/config.js).                                      */
.logo,
.tagline,
.footnote,
.btn-row {
  opacity: 0;
}

/* --- Logo centré --------------------------------------------------- */
/* Le logo est un enfant direct de <body> : c'est nécessaire pour que
   mix-blend-mode fusionne bien avec le fond et les images du trail.   */
.logo {
  position: absolute;
  top: 50%;
  left: 50%;
  width: var(--logo-width);
  height: auto;
  transform: translate(-50%, -50%);
  z-index: 2;
  pointer-events: none;             /* laisse passer la souris        */
  mix-blend-mode: var(--logo-blend-mode);
}

/* Sur mobile / tablette tactile : logo à 80% de la largeur d'écran.
   Même condition que la détection mobile du JavaScript.              */
@media (hover: none) and (pointer: coarse) {
  .logo { width: var(--logo-width-mobile); }
}

/* --- Tagline / accroche (en haut, centrée) ------------------------- */
/* Enfant DIRECT de <body>, positionnée elle-même. Sur iOS, un élément
   en mix-blend-mode imbriqué dans un parent positionné voit sa fusion
   isolée dans ce parent : il doit donc être posé directement.         */
.tagline {
  position: absolute;
  top: calc(var(--date-margin-top) + env(safe-area-inset-top, 0px));
  left: 50%;
  transform: translateX(-50%);
  max-width: calc(100% - 2 * var(--footer-padding));
  text-align: center;
  font-family: var(--font-date);
  font-size: var(--font-size-date);
  font-weight: var(--date-weight);
  letter-spacing: var(--date-letter-spacing);
  color: var(--color-text);
  pointer-events: none;
  mix-blend-mode: var(--date-blend-mode);
}

/* --- Ligne d'info (juste au-dessus des boutons) -------------------- */
/* Même typo que la tagline ; enfant direct de <body> pour iOS.        */
.footnote {
  position: absolute;
  bottom: calc(var(--footnote-margin-bottom) + env(safe-area-inset-bottom, 0px));
  left: 50%;
  transform: translateX(-50%);
  max-width: calc(100% - 2 * var(--footer-padding));
  text-align: center;
  white-space: nowrap;
  font-family: var(--font-date);
  font-size: var(--font-size-date);
  font-weight: var(--date-weight);
  letter-spacing: var(--date-letter-spacing);
  color: var(--color-text);
  pointer-events: none;
  mix-blend-mode: var(--date-blend-mode);
}

/* --- Rangée de boutons (en bas, centrée) --------------------------- */
/* C'est .btn-row qui porte le mix-blend-mode et qui est l'enfant
   DIRECT de <body> : ainsi la fusion difference fonctionne sur iOS,
   et les boutons à l'intérieur restent libres d'être centrés en flex. */
.btn-row {
  position: absolute;
  left: 50%;
  bottom: calc(var(--btn-margin-bottom) + env(safe-area-inset-bottom, 0px));
  transform: translateX(-50%);
  display: flex;
  gap: var(--btn-gap);
  mix-blend-mode: var(--btn-blend-mode);        /* fusion difference   */
}

.btn {
  padding: 7px 14px;
  font-family: var(--font-date);
  font-size: var(--font-size-date);
  font-weight: var(--date-weight);
  letter-spacing: var(--date-letter-spacing);
  color: var(--color-text);                    /* texte blanc         */
  text-decoration: none;
  white-space: nowrap;
  background-color: transparent;
  border: 1px solid var(--btn-border-color);   /* liseret blanc       */
  border-radius: var(--btn-radius);
  -webkit-tap-highlight-color: transparent;
  transition: background-color 0.18s ease, color 0.18s ease;
}

/* Au survol : le bouton se remplit et le texte devient un "trou".
   Astuce : la rangée est en mode difference. Un fond BLANC s'y inverse
   (remplissage) ; un texte NOIR y est neutre (= le fond transparaît,
   d'où l'effet de texte évidé). Garder blanc/noir pour cet effet.      */
.btn:hover,
.btn:active {
  background-color: #ffffff;   /* remplissage */
  color: #000000;              /* texte évidé (trou) */
}


/* =====================================================================
   CURSEUR PERSONNALISÉ — croix « + » en mode difference (ordinateur)
   ===================================================================== */

/* La classe .has-cross-cursor est ajoutée sur <body> par js/trail.js
   (ordinateur uniquement). Si le JS ne tourne pas, le curseur natif
   reste affiché — pas de curseur "invisible".                         */
.has-cross-cursor { cursor: none; }
/* Au survol des boutons : curseur « main » classique (la croix se cache) */
.has-cross-cursor .btn { cursor: pointer; }

/* Le panneau de réglages garde un curseur normal (c'est un outil). */
.has-cross-cursor #gui-toggle,
.has-cross-cursor #combo-gui,
.has-cross-cursor #combo-gui * { cursor: auto; }

/* La croix elle-même : suit la souris (transform piloté par le JS). */
#cursor {
  position: fixed;
  top: 0; left: 0;
  width: var(--cursor-size);
  height: var(--cursor-size);
  z-index: 100;
  opacity: 0;                       /* caché jusqu'au 1er mouvement   */
  pointer-events: none;
  mix-blend-mode: difference;
  will-change: transform;
}
/* La croix elle-même. Elle pivote de 45° (devient « × ») quand une
   image est agrandie — classe .cursor--x posée par js/trail.js.        */
.cursor-cross {
  position: absolute;
  inset: 0;
  transition: transform 0.22s cubic-bezier(0.22, 0.61, 0.36, 1);
}
#cursor.cursor--x .cursor-cross { transform: rotate(45deg); }

.cursor-cross::before,
.cursor-cross::after {
  content: "";
  position: absolute;
  background: #ffffff;
}
.cursor-cross::before {             /* trait horizontal */
  top: 50%; left: 0; right: 0;
  height: var(--cursor-thickness);
  transform: translateY(-50%);
}
.cursor-cross::after {              /* trait vertical */
  left: 50%; top: 0; bottom: 0;
  width: var(--cursor-thickness);
  transform: translateX(-50%);
}


/* =====================================================================
   PANNEAU DE RÉGLAGES (WebGUI) — injecté par js/gui.js
   ===================================================================== */

/* Bouton d'ouverture/fermeture */
#gui-toggle {
  position: fixed;
  top: 14px; right: 14px;
  z-index: 1001;
  width: 38px; height: 38px;
  border: none;
  border-radius: 9px;
  background: rgba(20, 20, 20, 0.85);
  color: #fff;
  font-size: 18px;
  line-height: 1;
  cursor: pointer;
  -webkit-backdrop-filter: blur(6px);
  backdrop-filter: blur(6px);
  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.4);
}
#gui-toggle:hover { background: rgba(45, 45, 45, 0.95); }

/* Le panneau */
#combo-gui {
  position: fixed;
  top: 62px; right: 14px;
  z-index: 1000;
  width: 290px;
  /* hauteur limitée à l'écran VISIBLE :
     dvh = "dynamic viewport height", tient compte de la barre du
     navigateur mobile ; vh sert de repli pour les vieux navigateurs */
  max-height: calc(100vh - 76px);
  max-height: calc(100dvh - 76px);
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;   /* défilement fluide iOS      */
  overscroll-behavior: contain;        /* le scroll ne "déborde" pas */
  background: rgba(18, 18, 18, 0.94);
  -webkit-backdrop-filter: blur(8px);
  backdrop-filter: blur(8px);
  border: 1px solid rgba(255, 255, 255, 0.10);
  border-radius: 12px;
  padding: 14px 16px 16px;
  color: #fff;
  font-family: var(--font-main);
  font-size: 12px;
  box-shadow: 0 8px 30px rgba(0, 0, 0, 0.5);
}
#combo-gui.gui-hidden { display: none; }

#combo-gui h2 {
  margin: 0 0 4px;
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 0.04em;
}
#combo-gui .gui-hint {
  margin: 0 0 12px;
  font-size: 10.5px;
  line-height: 1.4;
  color: rgba(255, 255, 255, 0.5);
}

/* Onglets Ordinateur / Mobile */
.gui-tabs {
  display: flex;
  gap: 6px;
  margin-bottom: 13px;
}
.gui-tab {
  flex: 1;
  padding: 7px 4px;
  border: 1px solid rgba(255, 255, 255, 0.12);
  border-radius: 7px;
  background: rgba(255, 255, 255, 0.05);
  color: rgba(255, 255, 255, 0.6);
  font-family: var(--font-main);
  font-size: 11px;
  font-weight: 600;
  cursor: pointer;
}
.gui-tab--active {
  background: var(--color-accent);
  border-color: var(--color-accent);
  color: #fff;
}

/* Une ligne de réglage */
.gui-row { margin-bottom: 11px; }

.gui-label {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  margin-bottom: 4px;
  color: rgba(255, 255, 255, 0.85);
}
.gui-value {
  color: var(--color-accent);
  font-variant-numeric: tabular-nums;
  font-weight: 600;
}

.gui-row input[type="range"] {
  width: 100%;
  margin: 0;
  accent-color: var(--color-accent);
  cursor: pointer;
}

.gui-row.gui-row--bool .gui-label { margin-bottom: 0; }
.gui-row input[type="checkbox"] {
  width: 15px; height: 15px;
  accent-color: var(--color-accent);
  cursor: pointer;
}

/* Bloc de test (réglages qui ne sont pas dans la config copiée) */
.gui-test {
  margin-top: 13px;
  border-top: 1px solid rgba(255, 255, 255, 0.10);
  padding-top: 12px;
}

/* Bloc d'export */
.gui-export {
  margin-top: 14px;
  border-top: 1px solid rgba(255, 255, 255, 0.10);
  padding-top: 12px;
}
.gui-export textarea {
  width: 100%;
  height: 130px;
  resize: vertical;
  background: #0b0b0b;
  color: #d8d8d8;
  border: 1px solid rgba(255, 255, 255, 0.12);
  border-radius: 7px;
  padding: 8px;
  font-family: "SF Mono", Menlo, Consolas, monospace;
  font-size: 10.5px;
  line-height: 1.45;
}
.gui-btn {
  display: block;
  width: 100%;
  margin-top: 8px;
  padding: 9px;
  border: none;
  border-radius: 7px;
  background: var(--color-accent);
  color: #fff;
  font-size: 12px;
  font-weight: 700;
  cursor: pointer;
}
.gui-btn:hover  { filter: brightness(1.1); }
.gui-btn:active { transform: translateY(1px); }
.gui-btn--ghost {
  background: rgba(255, 255, 255, 0.08);
  color: #fff;
}
