/* ============================================
   DÉCORATION SAISONNIÈRE — couche posée par-dessus les thèmes
   Chargée uniquement quand une saison est visible (public/shared/seasonal_head.php).
   Classes sur <html> : season-active, season-<clé>, season-type-<type>, season-int-<intensité>,
   season-has-<emplacement>, season-anim-<emplacement>-<animation>, season-user-off.
   Aucune règle `filter:` sur body/html (casserait les éléments position: fixed).
   ============================================ */

/* ── Animations simples (images fixes) ── */
@keyframes season-sway {
    0%, 100% { transform: rotate(-6deg); }
    50%      { transform: rotate(6deg); }
}
@keyframes season-float {
    0%, 100% { transform: translateY(0); }
    50%      { transform: translateY(-6px); }
}
@keyframes season-pulse {
    0%, 100% { transform: scale(1); }
    50%      { transform: scale(1.12); }
}
@keyframes season-flicker {
    0%, 100% { opacity: 1; }
    20%      { opacity: .75; }
    40%      { opacity: .95; }
    60%      { opacity: .6; }
    80%      { opacity: .9; }
}
@keyframes season-spin {
    from { transform: rotate(0deg); }
    to   { transform: rotate(360deg); }
}

/* ── Couronne du logo : centrée sur le logo, devant lui (le logo se voit dans le trou central) ──
   Taille réglable par saison (--season-logo-scale, en % du logo). Centrage par left/top (pas par transform),
   pour laisser transform libre aux animations. */
html.season-has-logo .site-logo-link {
    position: relative;
}
html.season-has-logo .site-logo-link::after {
    content: '';
    position: absolute;
    width: var(--season-logo-scale, 200%);
    height: var(--season-logo-scale, 200%);
    /* Décalage réglable par saison, en % de la taille du logo (x : + droite ; y : + monte) */
    left: calc(50% - var(--season-logo-scale, 200%) / 2 + var(--season-logo-x, 0%));
    top: calc(50% - var(--season-logo-scale, 200%) / 2 - var(--season-logo-y, 0%));
    background: var(--season-img-logo) no-repeat center / contain;
    pointer-events: none;
    z-index: 2;
    transform-origin: center;
}

/* Page d'accueil (logo sans .site-logo-link) : couronne posée par seasonal.js directement sur l'image du logo. */
.season-logo-crown {
    position: absolute;
    background: var(--season-img-logo) no-repeat center / contain;
    pointer-events: none;
    z-index: 101; /* au-dessus du logo, qui flotte à 100 sur mobile */
    transform-origin: center;
}

/* ── Coins des cartes et accessoire d'avatar (insérés par seasonal.js) ── */
.season-coin-anchor {
    display: block;
    position: relative;
    width: 100%;
    height: 0;
    overflow: visible;
    z-index: 6; /* au-dessus de l'icône et du contenu de la tuile */
    pointer-events: none;
}
/* Support du coin : place libre choisie par seasonal.js le long du bord haut (is-top) ou bas (is-bottom).
   Pour le bas, le script fixe top = hauteur de la tuile et le support remonte de sa propre hauteur. */
.season-coin-holder {
    position: absolute;
    top: 0;
    line-height: 0;
    pointer-events: none;
}
.season-coin-holder.is-bottom { transform: translateY(-100%); }
.season-coin-anchor--banner { z-index: 20; } /* le coin de la bannière déborde par-dessus la tuile suivante */
.season-coin {
    display: block;
    width: clamp(92px, 12vw, 160px); /* taille de secours ; seasonal.js fixe la taille qui rentre */
    height: auto;
    pointer-events: none;
    user-select: none;
}
/* Les animations pivotent autour du point d'accroche */
.is-top .season-coin    { transform-origin: top center; }
.is-bottom .season-coin { transform-origin: bottom center; }
.season-avatar-acc {
    display: block;
    pointer-events: none;
    transform-origin: bottom center;
    user-select: none;
}
/* Chapeau du titre « PROFIL » : support placé par seasonal.js, le bas du chapeau sur le point calculé */
.season-hat-holder {
    position: absolute;
    top: 0;
    line-height: 0;
    transform: translateY(-100%);
    pointer-events: none;
}

/* ── Bordures verticales (insérées par seasonal.js) ── */
.season-bordure {
    position: fixed;
    top: 0;      /* recalé sous le header par seasonal.js */
    bottom: 0;
    width: var(--season-bordure-pc, 150px); /* largeur réglée dans l'admin (« Où afficher chaque décoration ») */
    pointer-events: none;
    z-index: 9988;
}
.season-bordure--g { left: 0; }
.season-bordure--d { right: 0; transform: scaleX(-1); } /* même image, retournée */
.season-bordure-strip {
    position: absolute;
    inset: 0;
    background: var(--season-img-bordure) repeat-y center top / 100% auto;
    transform-origin: top center;
}
/* Fin des guirlandes verticales, sur toutes les pages : leurs 200 derniers px s'effacent en dégradé, en bas de l'écran
   ou au ras de l'élément qui les arrête (bandeau du bas de l'accueil, pied de page), au lieu d'une coupure nette.
   (Le cadre de la carte plein écran, .season-frame, n'est pas concerné.) */
/* Haut : fondu sous le header, réglage « Fondu du haut » de la saison (0 = coupure nette ; moitié sur tablette et
   téléphone). */
.season-bordure {
    --season-bfade: var(--season-bordure-fade-top, 0px);
    -webkit-mask-image: linear-gradient(to bottom, transparent 0, #000 var(--season-bfade), #000 calc(100% - 200px), transparent 100%);
    mask-image: linear-gradient(to bottom, transparent 0, #000 var(--season-bfade), #000 calc(100% - 200px), transparent 100%);
}
@media (max-width: 1024px) {
    .season-bordure { --season-bfade: calc(var(--season-bordure-fade-top, 0px) / 2); }
}
/* Image dédiée au côté droit : pas de miroir */
html.season-has-bordure-droite .season-bordure--d { transform: none; }
html.season-has-bordure-droite .season-bordure--d .season-bordure-strip { background-image: var(--season-img-bordure-droite); }
@media (max-width: 1024px) {
    .season-bordure { width: var(--season-bordure-tab, 42px); } /* tablette : liseré (ne bloque aucun clic) */
}
@media (max-width: 768px) {
    .season-bordure { width: var(--season-bordure-mob, 42px); } /* téléphone */
}
html.season-anim-bordure-sway    .season-bordure-strip { animation: season-bordure-sway 5s ease-in-out infinite; }
html.season-anim-bordure-float   .season-bordure-strip { animation: season-float 3.5s ease-in-out infinite; }
html.season-anim-bordure-pulse   .season-bordure-strip { animation: season-bordure-pulse 2.6s ease-in-out infinite; transform-origin: left center; }
html.season-anim-bordure-flicker .season-bordure-strip { animation: season-flicker 2.2s linear infinite; }
html.season-anim-bordure-spin    .season-bordure-strip { animation: season-float 3.5s ease-in-out infinite; } /* une rotation du cadre n'a pas de sens */
@keyframes season-bordure-sway {
    0%, 100% { transform: rotate(-0.8deg); }
    50%      { transform: rotate(0.8deg); }
}
@keyframes season-bordure-pulse {
    0%, 100% { transform: scaleX(1); }
    50%      { transform: scaleX(1.12); }
}

/* ── Texture de fond : un vrai fond de page (seasonal.js), sous le header, sur toute la largeur ──
   Posée DERRIÈRE le contenu (z-index négatif, au-dessus du fond du thème peint sur la page) : elle se voit dans les
   marges, dans le bandeau du haut et en transparence derrière la colonne et les tuiles ; les tuiles opaques la cachent.
   Ordinateur, tablette et téléphone. */
.season-fond {
    position: fixed;
    left: 0;
    right: 0;
    top: 0;      /* recalé sous le header par seasonal.js */
    bottom: 0;
    background: var(--season-img-fond) repeat center top / auto;
    opacity: var(--season-fond-opacity, .3);
    pointer-events: none;
    z-index: -1;
    /* Fondu sous le header : la texture part de zéro au ras du header et atteint son opacité après --season-fond-fade */
    -webkit-mask-image: linear-gradient(to bottom, transparent 0, #000 var(--season-fond-fade, 120px));
    mask-image: linear-gradient(to bottom, transparent 0, #000 var(--season-fond-fade, 120px));
}
@media (max-width: 1024px) {
    .season-fond {
        -webkit-mask-image: linear-gradient(to bottom, transparent 0, #000 calc(var(--season-fond-fade, 120px) / 2));
        mask-image: linear-gradient(to bottom, transparent 0, #000 calc(var(--season-fond-fade, 120px) / 2));
    }
}

/* ── Application des animations choisies dans l'admin ── */
html.season-anim-logo-sway    .site-logo-link::after, html.season-anim-logo-sway    .season-logo-crown { animation: season-sway 3s ease-in-out infinite; }
html.season-anim-logo-float   .site-logo-link::after, html.season-anim-logo-float   .season-logo-crown { animation: season-float 2.6s ease-in-out infinite; }
html.season-anim-logo-pulse   .site-logo-link::after, html.season-anim-logo-pulse   .season-logo-crown { animation: season-pulse 2s ease-in-out infinite; }
html.season-anim-logo-flicker .site-logo-link::after, html.season-anim-logo-flicker .season-logo-crown { animation: season-flicker 2s linear infinite; }
html.season-anim-logo-spin    .site-logo-link::after, html.season-anim-logo-spin    .season-logo-crown { animation: season-spin 20s linear infinite; transform-origin: center; } /* rotation lente de la couronne */

html.season-anim-coin-sway    .season-coin { animation: season-sway 4s ease-in-out infinite; }
html.season-anim-coin-float   .season-coin { animation: season-float 3s ease-in-out infinite; }
html.season-anim-coin-pulse   .season-coin { animation: season-pulse 2.4s ease-in-out infinite; }
html.season-anim-coin-flicker .season-coin { animation: season-flicker 2.2s linear infinite; }
html.season-anim-coin-spin    .season-coin { animation: season-spin 8s linear infinite; transform-origin: center; }

html.season-anim-avatar-sway    .season-avatar-acc { animation: season-sway 3s ease-in-out infinite; }
html.season-anim-avatar-float   .season-avatar-acc { animation: season-float 2.6s ease-in-out infinite; }
html.season-anim-avatar-pulse   .season-avatar-acc { animation: season-pulse 2s ease-in-out infinite; }
html.season-anim-avatar-flicker .season-avatar-acc { animation: season-flicker 2s linear infinite; }
html.season-anim-avatar-spin    .season-avatar-acc { animation: season-spin 6s linear infinite; transform-origin: center; }

/* ── Particules ── */
#season-particles {
    position: fixed;
    inset: 0;
    overflow: hidden;
    pointer-events: none;
    z-index: 9990;
}
.season-p {
    position: absolute;
    top: 0;
    left: 0;
    will-change: transform, opacity;
    user-select: none;
    line-height: 1;
    pointer-events: none;
}
img.season-p {
    display: block;
    height: auto;
}
.season-spark {
    position: absolute;
    width: 7px;
    height: 7px;
    border-radius: 50%;
    pointer-events: none;
    will-change: transform, opacity;
}

/* ── Intro du dashboard ── */
#season-intro {
    position: fixed;
    inset: 0;
    z-index: 2147483000;
    overflow: hidden;
    cursor: pointer;
}
#season-intro .season-intro-actor {
    position: absolute;
    left: 50%;
    top: 50%;
    width: min(38vw, 260px);
    height: auto;
    margin: 0;
    transform: translate(-50%, -50%) scale(.05);
    will-change: transform, opacity, filter;
    user-select: none;
    pointer-events: none;
    line-height: 1;
    text-align: center;
}
#season-intro .season-intro-actor.is-emoji {
    width: auto;
    font-size: min(30vw, 200px);
}
#season-intro .season-intro-flash {
    position: absolute;
    inset: 0;
    background: #000;
    opacity: 0;
    pointer-events: none;
}

/* ── Bouton ✨ (activer / désactiver les décorations) ── */
.season-toggle {
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 6px;
    /* Couleurs du thème (le thème « jour » est très clair) : texte du menu, sinon des liens */
    color: var(--nav-text, var(--text-link, rgba(255, 255, 255, .75)));
    font-size: .85em;
    background: var(--btn-secondary-bg, rgba(255, 255, 255, .05));
    border: 1px solid var(--btn-secondary-border, transparent);
    padding: 5px 10px;
    border-radius: 20px;
    transition: all .3s;
    touch-action: manipulation;
    line-height: 1.2;
}
.season-toggle:hover {
    background: var(--bg-surface-hover, rgba(255, 255, 255, .12));
    color: var(--text-link-hover, #fff);
}
.season-toggle.is-off {
    opacity: .55;
    filter: grayscale(1);
}
/* Entrée « ✨ » du menu latéral : même gabarit que les icônes du menu */
.nav-season-icon {
    display: inline-block;
    font-size: 2.2rem;
    line-height: 1;
}
.nav-season-toggle.is-off .nav-season-icon {
    filter: grayscale(1);
    opacity: .55;
}
/* Bouton de saison en tête de la barre d'onglets (tablette et téléphone) : petit, étoile + légende (Saison, Événement, Commémo.) */
html body .tabbar .tabbar-season {
    flex: 0 0 56px !important;
    min-width: 56px !important;
    max-width: 56px !important;
    min-height: 56px !important;
    padding: 0 !important;
    display: flex !important;
    flex-direction: column !important;
    align-items: center !important;
    justify-content: center !important;
    gap: 3px !important;
    line-height: 1 !important;
    text-decoration: none !important;
    color: var(--text-main, #fff) !important;
    opacity: .85;
}
html body .tabbar .tabbar-season .tabbar-season-icon { font-size: 18px; line-height: 1; }
html body .tabbar .tabbar-season .tabbar-season-label { font-size: 10px; line-height: 1; white-space: nowrap; }
/* Page d'accueil : petite ligne « ✨ Gestion des saisons » sous les liens du header */
html body .header nav a.season-toggle-header {
    flex: 0 0 100%;
    margin: 2px 0 0;
    padding: 2px 6px;
    font-size: .72em;
    text-align: center;
    color: var(--text-muted, rgba(255, 255, 255, .7));
    opacity: .85;
    text-decoration: none;
}
html body .header nav a.season-toggle-header:hover { opacity: 1; }
html body .header nav a.season-toggle-header.is-off { filter: grayscale(1); opacity: .55; }
html body .tabbar .tabbar-season.is-off {
    filter: grayscale(1);
    opacity: .45;
}
.season-toggle--floating {
    position: fixed;
    left: 12px;
    bottom: 12px;
    z-index: 9991;
    background: rgba(0, 0, 0, .45);
    color: rgba(255, 255, 255, .85); /* fond sombre fixe : le texte reste clair */
    backdrop-filter: blur(6px);
    -webkit-backdrop-filter: blur(6px);
}
.season-test-badge {
    position: fixed;
    right: 12px;
    bottom: 12px;
    z-index: 9991;
    background: rgba(255, 152, 0, .9);
    color: #000;
    font: 600 12px/1.3 'Segoe UI', sans-serif;
    padding: 6px 10px;
    border-radius: 8px;
    pointer-events: auto;
    text-decoration: none;
}

/* ── Décorations coupées par le joueur ── */
html.season-user-off .season-bordure,
html.season-user-off .season-coin,
html.season-user-off .season-avatar-acc,
html.season-user-off #season-particles,
html.season-user-off .season-fond {
    display: none !important;
}

/* ── Appareil réglé sur « réduire les animations » ── */
@media (prefers-reduced-motion: reduce) {
    #season-particles,
    #season-intro {
        display: none !important;
    }
    html.season-active .site-logo-link::after,
    .season-logo-crown,
    .season-bordure-strip,
    .season-coin,
    .season-avatar-acc {
        animation: none !important;
    }
}

/* ── Couleur du thème sur les images de saison (--avatar-color) ──
   season-halo : lueur qui épouse le contour ; season-tint : filtre SVG #season-tint injecté par seasonal.js. */
html.season-halo .season-coin,
html.season-halo.season-has-logo .site-logo-link::after,
html.season-halo .season-logo-crown,
html.season-halo .season-bordure-strip,
html.season-halo .season-frame-strip,
html.season-halo .season-map-corner,
html.season-halo .season-avatar-acc,
html.season-halo img.season-p,
html.season-halo #season-intro .season-intro-actor {
    filter: drop-shadow(0 0 var(--season-halo, 6px) var(--avatar-color, transparent));
}
html.season-tint .season-coin,
html.season-tint.season-has-logo .site-logo-link::after,
html.season-tint .season-logo-crown,
html.season-tint .season-bordure-strip,
html.season-tint .season-frame-strip,
html.season-tint .season-map-corner,
html.season-tint .season-avatar-acc,
html.season-tint img.season-p,
html.season-tint #season-intro .season-intro-actor {
    filter: url(#season-tint);
}
html.season-halo.season-tint .season-coin,
html.season-halo.season-tint.season-has-logo .site-logo-link::after,
html.season-halo.season-tint .season-logo-crown,
html.season-halo.season-tint .season-bordure-strip,
html.season-halo.season-tint .season-frame-strip,
html.season-halo.season-tint .season-map-corner,
html.season-halo.season-tint .season-avatar-acc,
html.season-halo.season-tint img.season-p,
html.season-halo.season-tint #season-intro .season-intro-actor {
    filter: url(#season-tint) drop-shadow(0 0 var(--season-halo, 6px) var(--avatar-color, transparent));
}
/* Téléphone : pas d'effet sur les particules (trop d'éléments animés filtrés) */
@media (max-width: 768px) {
    html.season-halo img.season-p,
    html.season-tint img.season-p {
        filter: none;
    }
}

/* ── Cadre de la carte plein écran (season-frame-only) ──
   Au-dessus de la carte et des marqueurs (z-index ≤ 700 dans Leaflet), sous les boutons (Leaflet 1000, page 10000). */
/* Épaisseur du cadre = largeur des guirlandes des pages (même réglage admin : ordinateur, tablette, téléphone) */
html.season-frame-only { --season-frame-t: var(--season-bordure-pc, 150px); }
@media (max-width: 1024px) { html.season-frame-only { --season-frame-t: var(--season-bordure-tab, 42px); } }
@media (max-width: 768px)  { html.season-frame-only { --season-frame-t: var(--season-bordure-mob, 42px); } }
.season-frame {
    position: fixed;
    pointer-events: none;
    z-index: 900;
    overflow: hidden;
}
.season-frame--l { left: 0; top: 0; bottom: 0; width: var(--season-frame-t); }
.season-frame--r { right: 0; top: 0; bottom: 0; width: var(--season-frame-t); transform: scaleX(-1); }
.season-frame--t { left: 0; right: 0; top: 0; height: var(--season-frame-t); }
.season-frame--b { left: 0; right: 0; bottom: 0; height: var(--season-frame-t); transform: scaleY(-1); }
.season-frame--l .season-frame-strip,
.season-frame--r .season-frame-strip {
    position: absolute;
    inset: 0;
    background: var(--season-img-bordure) repeat-y center top / 100% auto;
}
/* Haut et bas, sans image header-footer : bande verticale pivotée de -90° autour de son coin haut gauche → bande horizontale */
.season-frame--t .season-frame-strip,
.season-frame--b .season-frame-strip {
    position: absolute;
    left: 0;
    top: var(--season-frame-t);
    width: var(--season-frame-t);
    height: 100vw;
    transform-origin: top left;
    transform: rotate(-90deg);
    background: var(--season-img-bordure) repeat-y center top / 100% auto;
}
/* Guirlande dédiée au haut et au bas (header-footer) : image horizontale répétée, sans pivot.
   Le bas reprend la même image à l'endroit (pas de miroir : les objets seraient à l'envers). */
html.season-has-header-footer .season-frame--b { transform: none; }
html.season-has-header-footer .season-frame--t .season-frame-strip,
html.season-has-header-footer .season-frame--b .season-frame-strip {
    inset: 0;
    width: auto;
    height: auto;
    transform: none;
    background: var(--season-img-header-footer) repeat-x left center / auto 100%;
}
/* Coins de bannière dans les angles libres de la carte (au-dessus du cadre, sous les boutons) */
.season-map-corner {
    position: fixed;
    z-index: 901;
    pointer-events: none;
    user-select: none;
}
html.season-has-bordure-droite .season-frame--r { transform: none; }
html.season-has-bordure-droite .season-frame--r .season-frame-strip { background-image: var(--season-img-bordure-droite); }

/* ── Coins de bannière (dashboard et carte plein écran) : jamais animés ──
   Halo et teinte : selon leur case « Couleur du thème » (désactivée par défaut, voir plus bas). */
html .season-coin--banner,
html .season-map-corner {
    animation: none !important;
}

/* ── Objets exclus de la couleur du thème (classes season-nofx-<groupe>, cases « Couleur du thème » de l'admin) ── */
html.season-nofx-logo .site-logo-link::after,
html.season-nofx-logo .season-logo-crown,
html.season-nofx-coin .season-coin:not(.season-coin--banner),
html.season-nofx-coin-banniere .season-coin--banner:not(.season-coin--banner-bas),
html.season-nofx-coin-banniere .season-map-corner:not(.season-map-corner--bas),
html.season-nofx-coin-banniere-bas .season-coin--banner-bas,
html.season-nofx-coin-banniere-bas .season-map-corner--bas,
html.season-nofx-avatar .season-avatar-acc,
html.season-nofx-bordure .season-bordure-strip,
html.season-nofx-bordure .season-frame--l .season-frame-strip,
html.season-nofx-bordure .season-frame--r .season-frame-strip,
html.season-nofx-bordure:not(.season-has-header-footer) .season-frame--t .season-frame-strip,
html.season-nofx-bordure:not(.season-has-header-footer) .season-frame--b .season-frame-strip,
html.season-nofx-header-footer.season-has-header-footer .season-frame--t .season-frame-strip,
html.season-nofx-header-footer.season-has-header-footer .season-frame--b .season-frame-strip,
html.season-nofx-particule img.season-p,
html.season-nofx-intro #season-intro .season-intro-actor {
    filter: none !important;
}

/* ── Petit menu du choix de saison ── */
.season-menu {
    position: fixed;
    z-index: 2147483001;
    min-width: 220px;
    background: rgba(20, 18, 12, .96);
    border: 1px solid rgba(255, 255, 255, .15);
    border-radius: 10px;
    padding: 6px;
    box-shadow: 0 8px 28px rgba(0, 0, 0, .55);
    font: 14px/1.3 'Segoe UI', sans-serif;
    color: #fff;
}
.season-menu-title {
    padding: 6px 10px 8px;
    font-size: 12px;
    opacity: .7;
    border-bottom: 1px solid rgba(255, 255, 255, .1);
    margin-bottom: 4px;
}
.season-menu button {
    display: block;
    width: 100%;
    text-align: left;
    background: none;
    border: 0;
    color: inherit;
    font: inherit;
    padding: 8px 10px;
    border-radius: 6px;
    cursor: pointer;
}
.season-menu button:hover { background: rgba(255, 255, 255, .1); }
.season-menu button.is-current { font-weight: 700; }

/* ── « Décor sans animations » : tout reste fixe ── */
html.season-calm .season-coin,
html.season-calm .season-avatar-acc,
html.season-calm .season-bordure-strip,
html.season-calm .site-logo-link::after,
html.season-calm .season-logo-crown {
    animation: none !important;
}
html.season-calm #season-particles,
html.season-calm #season-intro {
    display: none !important;
}

/* ── Message de saison : petite bannière refermable en haut du dashboard ── */
.season-message {
    display: flex;
    align-items: center;
    gap: 12px;
    margin: 0 0 16px;
    padding: 10px 14px 10px 18px;
    border-radius: 12px;
    background: rgba(0, 0, 0, 0.45);
    border: 1px solid var(--border-main, rgba(255, 255, 255, 0.12));
    border-left: 4px solid var(--color-primary, #0055a4);
    color: var(--text-main, #fff);
    font-size: 0.95em;
    line-height: 1.4;
    box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
    animation: season-message-in 0.5s ease-out both;
    transition: opacity 0.3s, transform 0.3s;
}
/* Tablette et mobile : le dashboard est une grille de 12 colonnes ; sans ceci, le message n'occupait qu'une colonne
   (petit pavé en haut à gauche). Sans effet sur PC, où le dashboard est une simple colonne. */
.dashboard-container > .season-message {
    grid-column: 1 / -1;
    min-width: 0; /* sinon le texte sur une ligne élargirait la grille au lieu d'être coupé par « … » */
}
.season-message--sober {
    border-left-color: rgba(255, 255, 255, 0.55);
    font-style: italic;
    letter-spacing: 0.2px;
}
.season-message.is-closing { opacity: 0; transform: translateY(-6px); }
/* Une seule ligne, coupée par « … » ; un appui (classe is-expanded) affiche le texte en entier */
.season-message-text {
    flex: 1 1 auto;
    min-width: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    cursor: pointer;
}
.season-message.is-expanded .season-message-text {
    white-space: normal;
    overflow: visible;
}
.season-message-close {
    flex: 0 0 auto;
    border: none;
    background: rgba(255, 255, 255, 0.1);
    color: inherit;
    width: 28px;
    height: 28px;
    border-radius: 50%;
    cursor: pointer;
    font-size: 0.85em;
    line-height: 1;
}
.season-message-close:hover { background: rgba(255, 255, 255, 0.2); }
/* Tablette et mobile (mêmes bornes que mobile-app.css) : bandeau plus bas, petite croix collée à droite */
@media (max-width: 1024px), (min-width: 1025px) and (max-width: 1366px) and (pointer: coarse) {
    .season-message {
        gap: 8px;
        margin-bottom: 10px;
        padding: 6px 6px 6px 12px;
        font-size: 0.85em;
        border-radius: 10px;
    }
    html body .season-message-close {
        display: flex !important;
        align-items: center;
        justify-content: center;
        width: 22px !important;
        min-width: 22px !important;
        max-width: 22px !important;
        height: 22px !important;
        min-height: 22px !important;
        padding: 0 !important;
        margin: 0 !important;
        font-size: 0.75em;
        box-shadow: none !important;
    }
}
@keyframes season-message-in {
    from { opacity: 0; transform: translateY(-8px); }
    to   { opacity: 1; transform: none; }
}

/* ── Ambiance du soir : voile de nuit sur les bords (le centre reste lisible), décor plus lumineux ──
   Sous les guirlandes (9988) et les particules (9990), qui ressortent ainsi sur le voile. */
.season-night-veil {
    position: fixed;
    inset: 0;
    pointer-events: none;
    z-index: 9987;
    background: radial-gradient(ellipse at center, transparent 45%, rgba(4, 6, 20, var(--season-night-veil, 0.25)) 100%);
    animation: season-night-in 2.5s ease-out both;
}
@keyframes season-night-in { from { opacity: 0; } to { opacity: 1; } }
html.season-night .season-bordure,
html.season-night #season-particles {
    animation: season-night-glow 3.2s ease-in-out infinite;
}
@keyframes season-night-glow {
    0%, 100% { filter: brightness(1.12) drop-shadow(0 0 4px rgba(255, 236, 170, 0.45)); }
    50%      { filter: brightness(1.32) drop-shadow(0 0 9px rgba(255, 236, 170, 0.75)); }
}
/* Sans animations : même lumière, sans scintillement */
html.season-calm.season-night .season-bordure,
html.season-calm.season-night #season-particles {
    animation: none;
    filter: brightness(1.15) drop-shadow(0 0 5px rgba(255, 236, 170, 0.5));
}
@media (prefers-reduced-motion: reduce) {
    html.season-night .season-bordure,
    html.season-night #season-particles { animation: none; filter: brightness(1.15); }
}

/* ── Minute de silence : voile sobre par-dessus tout (même l'intro) ── */
.season-silence {
    position: fixed;
    inset: 0;
    z-index: 2147483002;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 24px 16px;
    background: rgba(6, 8, 14, 0.9);
    color: #f2f2f2;
    text-align: center;
    opacity: 0;
    transition: opacity 0.9s ease;
}
.season-silence.is-on { opacity: 1; }
.season-silence-inner { max-width: 560px; }
.season-silence-flower {
    display: block;
    max-height: 140px;
    max-width: 60vw;
    margin: 0 auto 18px;
    filter: drop-shadow(0 4px 14px rgba(0, 0, 0, 0.6));
}
.season-silence-title {
    margin: 0 0 10px;
    font-family: var(--font-family-title, serif);
    font-size: 2em;
    font-weight: 600;
    letter-spacing: 3px;
    text-transform: uppercase;
    color: #fff;
}
.season-silence-sub {
    margin: 0 0 22px;
    font-size: 1.05em;
    line-height: 1.5;
    opacity: 0.8;
}
.season-silence-bar {
    height: 3px;
    width: min(320px, 70vw);
    margin: 0 auto 26px;
    background: rgba(255, 255, 255, 0.15);
    border-radius: 3px;
    overflow: hidden;
}
.season-silence-bar span {
    display: block;
    height: 100%;
    background: rgba(255, 255, 255, 0.75);
    transform-origin: left center;
}
.season-silence-bar span.is-running { animation: season-silence-bar linear forwards; }
@keyframes season-silence-bar { to { transform: scaleX(1); } }
.season-silence-skip {
    border: 1px solid rgba(255, 255, 255, 0.25);
    background: transparent;
    color: rgba(255, 255, 255, 0.6);
    border-radius: 20px;
    padding: 6px 18px;
    font-size: 0.85em;
    cursor: pointer;
}
.season-silence-skip:hover { color: #fff; border-color: rgba(255, 255, 255, 0.5); }
@media (max-width: 768px) {
    .season-silence-flower { max-height: 90px; }
    .season-silence-title { font-size: 1.5em; letter-spacing: 2px; }
    .season-silence-sub { font-size: 0.95em; }
}

/* ── Décor masqué sur cette page (menu ✨ « Masquer sur cette page ») et pendant l'édition 3D (page GPS global) ── */
html.season-page-hidden .season-bordure,
html.season-page-hidden #season-particles,
html.season-page-hidden .season-fond,
html.season-page-hidden .season-coin-anchor,
html.season-page-hidden .season-logo-crown,
html.season-editing .season-bordure,
html.season-editing #season-particles {
    display: none !important;
}
/* Choix « Masquer / Afficher sur cette page » du menu : séparé des trois modes */
.season-menu .season-menu-page {
    border-top: 1px solid rgba(255, 255, 255, .15);
    margin-top: 4px;
    padding-top: 8px;
}

/* ── Anneau du ruban autour des ✨ du bouton de la saison (logo du ruban, centre transparent) ── */
.season-ring-host {
    position: relative;
    display: inline-block;
    line-height: 1;
}
.season-ring {
    position: absolute;
    left: 50%;
    top: 50%;
    max-width: none;
    height: auto;
    transform: translate(-50%, -50%);
    pointer-events: none;
    z-index: 1;
}

/* ── Ruban du mois en surimpression (Octobre rose, Movember) : ses coins gardent leur couleur, sans halo ni teinte ── */
html .season-coin.season-coin--ruban,
html .season-avatar-acc.season-coin--ruban { filter: none !important; }

/* ── Note discrète en bas de l'écran (J'y étais, chasse aux objets) ── */
.season-toast {
    position: fixed;
    left: 50%;
    bottom: 24px;
    z-index: 2147482990;
    max-width: min(520px, calc(100vw - 32px));
    padding: 10px 18px;
    border-radius: 22px;
    background: rgba(10, 12, 20, 0.88);
    border: 1px solid rgba(255, 255, 255, 0.18);
    color: #fff;
    font-size: 0.92em;
    line-height: 1.4;
    text-align: center;
    box-shadow: 0 6px 20px rgba(0, 0, 0, 0.35);
    cursor: pointer;
    opacity: 0;
    transform: translate(-50%, 12px);
    transition: opacity 0.4s, transform 0.4s;
}
.season-toast.is-on { opacity: 1; transform: translate(-50%, 0); }
.season-toast--sober { font-style: italic; background: rgba(10, 10, 12, 0.92); }
@media (max-width: 768px) {
    .season-toast { bottom: 84px; font-size: 0.85em; } /* au-dessus de la barre d'onglets */
}

/* ── Chasse aux objets : l'objet caché, au-dessus des tuiles ── */
.season-hunt-obj {
    position: absolute;
    z-index: 9995;
    padding: 0;
    border: none;
    background: none;
    cursor: pointer;
    line-height: 1;
    filter: drop-shadow(0 0 6px rgba(255, 255, 255, 0.35));
    animation: season-hunt-idle 3.4s ease-in-out infinite;
    transition: transform 0.2s;
}
.season-hunt-obj img { width: 100%; height: 100%; object-fit: contain; pointer-events: none; }
.season-hunt-obj:hover, .season-hunt-obj:focus-visible { transform: scale(1.3); animation-play-state: paused; }
.season-hunt-obj.is-caught { animation: season-hunt-caught 0.6s ease-out forwards; pointer-events: none; }
@keyframes season-hunt-idle {
    0%, 100% { transform: rotate(-6deg); }
    50%      { transform: rotate(6deg) translateY(-3px); }
}
@keyframes season-hunt-caught {
    to { transform: scale(2) rotate(20deg); opacity: 0; filter: drop-shadow(0 0 14px rgba(255, 236, 170, 0.9)); }
}
html.season-calm .season-hunt-obj { animation: none; }
@media (prefers-reduced-motion: reduce) { .season-hunt-obj { animation: none; } }

/* ── Impression ── */
@media print {
    .season-toast, .season-hunt-obj,
    .season-message, .season-night-veil, .season-silence,
    #season-particles, #season-intro, .season-fond, .season-bordure, .season-frame, .season-map-corner, .season-coin, .season-avatar-acc, .season-toggle, .season-test-badge, .season-menu, .season-logo-crown {
        display: none !important;
    }
}

/* ── Effets dans les cartes (public/js/seasonal-map.js, bloc « 🗺️ Carte » de l'admin) ──
   Teinte et soir : calques au-dessus du fond de carte, sous les marqueurs et les boutons (fusion posée par le script).
   Météo de la carte héro / plein écran : canevas sous les marqueurs. Rien ne capte les clics. */
.season-map-tint,
.season-map-night {
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    pointer-events: none;
}
.season-map-night { background: #0b1030; opacity: 0; transition: opacity 1.5s ease; }
.season-map-weather { position: absolute; left: 0; top: 0; pointer-events: none; }
html.season-editing .season-map-weather { display: none; }
@media print {
    .season-map-tint, .season-map-night, .season-map-weather { display: none !important; }
}
/* Brume de la carte 3D (MapLibre 4, sans ciel natif) : dégradé en haut de la carte, réglé par le script */
.season-map-haze { position: absolute; left: 0; top: 0; width: 100%; height: 0; pointer-events: none; transition: opacity .3s ease; }
@media print { .season-map-haze { display: none !important; } }
