/* =========================================================
   BloxRadio — base commune des thèmes saisonniers
   (chargée dès qu'un thème autre que « Normal » est actif)
   Chaque thème définit ses couleurs ; ce fichier les applique
   aux éléments qui avaient une couleur bleue « en dur ».
   ========================================================= */

/* Grande tuile du direct : couleur de fond + voile en dégradé propre au thème */
html[data-theme] .t-np { background: var(--np-base, var(--blue)); }
html[data-theme] .t-np::after { background: linear-gradient(160deg, var(--np-a) 0%, var(--np-b) 52%, var(--np-c) 100%); }
html[data-theme] .t-np .play { color: var(--blue); }
html[data-theme] .np-cover .eq i { background: var(--blue); }

/* Texte sur les boutons de couleur (blanc, ou foncé si la couleur est claire) */
html[data-theme] :is(.btn-main, .send, .round-arrow, .cookie-btn, .seg button[aria-selected="true"], .nav a.active, .play.small, .announce) { color: var(--on-accent, #fff); }
html[data-theme] :is(.btn-main, .cookie-btn):hover { color: var(--on-accent, #fff); }

/* Éléments teintés de la couleur du thème */
html[data-theme] .t-ded { border-color: var(--blue-ring); }
html[data-theme] .t-ded::after { border-color: var(--blue-soft); }
html[data-theme] .t-req { background: linear-gradient(160deg, var(--blue-soft), var(--surface) 70%); border-color: var(--blue-ring); }
html[data-theme] .poll-bar { background: var(--blue-soft); }
html[data-theme] .poll-row.mine .poll-bar { background: var(--blue-ring); }
html[data-theme] .foot-word {
  -webkit-text-stroke: 1.5px var(--blue-ring);
  background: linear-gradient(180deg, var(--blue-soft), transparent 85%); -webkit-background-clip: text; background-clip: text;
}
html[data-theme] body::before { background-image: radial-gradient(var(--dot, rgba(51, 95, 255, .13)) 1px, transparent 1.2px); }
html[data-theme] .kicker::before { content: var(--kicker-emoji, ""); }

/* =========================================================
   Décorations : couche fixe au-dessus du fond, sous les menus et fenêtres
   ========================================================= */
.theme-deco { position: fixed; inset: 0; z-index: 30; pointer-events: none; overflow: hidden; }
.theme-deco i { font-style: normal; }

/* Particules qui tombent (neige, confettis) */
.fx-fall {
  position: absolute; top: -40px; left: var(--x); font-size: calc(18px * var(--s)); line-height: 1; opacity: var(--o);
  animation: fx-fall var(--w) linear var(--d) infinite; will-change: transform;
}
@keyframes fx-fall {
  0% { transform: translate(0, 0) rotate(0deg); }
  50% { transform: translate(24px, 52vh) rotate(calc(var(--r) * 4)); }
  100% { transform: translate(-12px, calc(100vh + 60px)) rotate(calc(var(--r) * 8)); }
}
/* Particules qui montent (cœurs, bulles) */
.fx-rise {
  position: absolute; bottom: -50px; left: var(--x); font-size: calc(20px * var(--s)); line-height: 1; opacity: var(--o);
  animation: fx-rise var(--w) ease-in var(--d) infinite; will-change: transform;
}
@keyframes fx-rise {
  0% { transform: translate(0, 0) rotate(0deg); opacity: 0; }
  10% { opacity: var(--o); }
  50% { transform: translate(-22px, -55vh) rotate(var(--r)); }
  90% { opacity: var(--o); }
  100% { transform: translate(18px, calc(-100vh - 80px)) rotate(calc(var(--r) * -1)); opacity: 0; }
}
/* Étincelles qui scintillent sur place */
.fx-twinkle {
  position: absolute; left: var(--x); top: calc(var(--o) * 70% - 25%); font-size: calc(16px * var(--s));
  color: var(--spark, #ffd86b); text-shadow: 0 0 10px currentColor; animation: fx-twinkle calc(var(--w) / 4) ease-in-out var(--d) infinite;
}
@keyframes fx-twinkle { 0%, 100% { opacity: 0; transform: scale(.4) rotate(0deg); } 50% { opacity: 1; transform: scale(1) rotate(45deg); } }

@media (max-width: 640px) {
  .theme-deco i:nth-child(3n) { display: none; } /* moins de particules sur téléphone */
}
@media (prefers-reduced-motion: reduce) {
  .theme-deco .fx-fall, .theme-deco .fx-rise, .theme-deco .fx-twinkle { display: none; }
}
