/* =========================================================================
   base.css — estructura y componentes de la página pública del evento.
   TODO el color/tipografía sale de variables CSS. Un "tema" = un fichero que
   define esas variables (ver atardecer.css, caramelo-pastel.css).
   Añadir un tema nuevo = un fichero de variables + su fuente. Cero cambios aquí.
   ========================================================================= */

*{box-sizing:border-box}
/* Color SÓLIDO del lienzo (raíz) = --edge (el mismo de la barra de estado). iOS
   Safari muestrea el background-COLOR, no los degradados de --page-bg (que son solo
   imagen). Sin color sólido → franjas blancas en las safe areas. Usando --edge, las
   safe areas, el overscroll y la barra de estado son el mismo color del tema. */
html{background-color:var(--edge)}
body{
  margin:0;font-family:var(--font);color:var(--ink);min-height:100vh;
  background:var(--page-bg);background-repeat:no-repeat;
  padding:18px 14px 92px;
}

/* MÓVIL: el degradado del tema NO toca arriba ni abajo. Una capa de color sólido
   (--edge, el mismo de la barra de estado) cubre la franja superior e inferior y se
   funde con el degradado hacia el centro. Así la barra de estado, el top y el bottom
   de la página son el MISMO color → no se ve el corte. La cabecera conserva su aire
   (padding con env() para librar el notch/isla). En escritorio no cambia nada. */
@media (max-width:640px){
  body{
    position: relative;        /* ancla para el ::before del degradado */
    padding-top: calc(18px + env(safe-area-inset-top));
    padding-right: calc(14px + env(safe-area-inset-right));
    padding-bottom: calc(72px + env(safe-area-inset-bottom));
    padding-left: calc(14px + env(safe-area-inset-left));
    background: transparent;   /* el sólido lo pone html (--edge); el degradado, ::before */
  }
  /* El degradado del tema (el mismo de la web), ANCLADO al contenido: como es
     position:absolute dentro del body, cubre todo el alto scrollable y SCROLLEA con
     la página (no es fijo al viewport). La máscara lo desvanece arriba y abajo hacia
     el --edge sólido del html → sin corte con la barra de estado ni la de Safari. */
  body::before{
    content:""; position:absolute; inset:0; z-index:-1; pointer-events:none;
    opacity:.35;   /* brillo más sutil (atenúa los acentos del tema) */
    /* Brillo del tema (acentos translúcidos) en la zona ALTA visible (posición en px
       desde el inicio del contenido, no %, para que no se diluya en páginas largas).
       La máscara lo desvanece arriba/abajo hacia el --edge sólido del html. */
    background:
      radial-gradient(1000px 700px at 15% 70px, var(--brand-glow), transparent 64%),
      radial-gradient(920px 640px at 90% 150px, var(--count-glow), transparent 64%);
    background-repeat:no-repeat;
    -webkit-mask-image:linear-gradient(180deg, transparent 0, #000 75px, #000 calc(100% - 110px), transparent 100%);
            mask-image:linear-gradient(180deg, transparent 0, #000 75px, #000 calc(100% - 110px), transparent 100%);
  }
}

/* etiqueta de depuración (solo en la previsualización; el Blade real no la pinta) */
.tag{position:fixed;top:0;left:0;background:var(--grad);color:var(--brand-on);font-size:10px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;padding:5px 11px;border-radius:0 0 12px 0;z-index:60}

/* conmutador de estado/recuento (solo previsualización) */
/* La vista llena al menos el alto del viewport (menos el padding del body: 18+92).
   Es columna flex para que el mapa (flex:1) absorba el hueco vertical sobrante. */
.view{display:none;flex-direction:column;max-width:1382px;margin:0 auto;min-height:calc(100dvh - 110px)}
body[data-state="scheduled"] .view-scheduled,
body[data-state="live"] .view-live,
body[data-state="ended"] .view-ended{display:flex}
.hidden{display:none!important}

/* ---- hero (estado programado) ---- */
.hero{padding:40px 26px;text-align:center;margin-bottom:18px;background:var(--glass);border:1px solid var(--glassline);border-radius:24px;box-shadow:var(--shadow)}
.crest{width:66px;height:66px;margin:0 auto 16px;border:0;border-radius:20px;display:flex;align-items:center;justify-content:center;font-size:10px;color:var(--brand-on);background:var(--grad);box-shadow:0 8px 24px var(--brand-glow);overflow:hidden}
.crest img{width:100%;height:100%;object-fit:cover}
.h-title{font-family:var(--font-title,var(--font));font-size:35px;font-weight:600;line-height:1.06;margin:0;letter-spacing:-.02em;color:var(--title-on)}
.place{color:var(--muted);font-size:13px;margin-top:7px;font-weight:600;text-transform:uppercase;letter-spacing:.12em}
.sub{color:var(--muted);font-size:13px;margin-top:16px}
.count-big{font-family:var(--font-title,var(--font));font-size:52px;font-weight:700;margin-top:2px;letter-spacing:-.03em;color:var(--count-on);text-shadow:0 0 30px var(--count-glow)}
.share{display:flex;align-items:center;justify-content:center;gap:9px;text-align:center;color:var(--brand-on);font-size:13px;font-weight:700;border:0;width:100%;font-family:inherit;border-radius:16px;padding:15px;margin-top:18px;background:var(--grad);box-shadow:0 10px 24px var(--brand-glow);cursor:pointer;-webkit-tap-highlight-color:transparent}
.share:active{transform:translateY(1px)}
.share svg{flex:0 0 auto}

/* snackbar "¡Copiado!" — pastilla oscura neutra (legible en cualquier tema) */
.snack{position:fixed;left:50%;bottom:26px;transform:translateX(-50%) translateY(14px);
  background:#15151c;color:#fff;font-size:14px;font-weight:600;padding:11px 18px;border-radius:12px;
  box-shadow:0 12px 32px rgba(0,0,0,.45);display:flex;align-items:center;gap:8px;
  opacity:0;pointer-events:none;transition:opacity .22s,transform .22s;z-index:90}
.snack.show{opacity:1;transform:translateX(-50%) translateY(0)}

.pill{display:inline-flex;align-items:center;gap:7px;font-size:11px;letter-spacing:.05em;text-transform:uppercase;border-radius:99px;padding:7px 16px;white-space:nowrap;font-weight:800}
.pill-wait{background:var(--wait-bg);color:var(--wait-on);margin-top:16px}
.pill-live{background:var(--live);color:var(--live-on);font-weight:600;box-shadow:0 0 22px var(--live-glow)}
.pill-end{background:var(--end-bg);color:var(--muted)}
.dot{width:9px;height:9px;border-radius:50%;background:var(--dot);animation:pulse 1.4s infinite}
@keyframes pulse{0%{box-shadow:0 0 0 0 var(--dot-pulse)}70%{box-shadow:0 0 0 8px transparent}100%{box-shadow:0 0 0 0 transparent}}

/* ---- barra de marca (directo / terminado) ---- */
.bar{display:flex;align-items:center;gap:14px;padding:14px 18px;margin-bottom:16px;background:var(--glass);border:1px solid var(--glassline);border-radius:20px;box-shadow:var(--shadow)}
.crest-s{width:44px;height:44px;border:0;border-radius:13px;display:flex;align-items:center;justify-content:center;font-size:9px;color:var(--brand-on);flex:0 0 auto;background:var(--grad);overflow:hidden}
.crest-s img{width:100%;height:100%;object-fit:cover}
.b-title{font-family:var(--font-title,var(--font));font-size:19px;font-weight:600;line-height:1.1;color:var(--title-on)}
/* Horario del recorrido bajo el título. Mismo peso visual que la frescura para
   que sea dato de apoyo y no compita con el nombre del evento. */
.b-when{margin-top:4px;font-size:12px;font-weight:600;line-height:1.2;color:var(--muted)}
.bar-right{margin-left:auto;display:flex;align-items:center;gap:12px}
.fresh{font-size:12px;color:var(--muted);white-space:nowrap;font-weight:600}

/* ---- mapa ---- */
.mapcard{display:flex;flex-direction:column;flex:1 1 auto;min-height:630px;overflow:hidden;border-radius:22px;border:1px solid var(--glassline);margin-bottom:18px;box-shadow:0 18px 44px var(--map-shadow)}
.map{flex:1 1 auto;min-height:630px;position:relative;background:var(--map-bg)}
.wm{position:absolute;left:14px;bottom:12px;color:var(--wm-on);font-size:10px;letter-spacing:.12em;text-transform:uppercase;z-index:2}
.freshfloat{position:absolute;top:12px;right:12px;background:var(--chip-bg);border:1px solid var(--chip-line);border-radius:99px;padding:6px 13px;font-size:11px;color:var(--chip-on);font-weight:600;z-index:3}
.cluster{display:none;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background:var(--live);color:var(--live-on);font-weight:800;font-size:14px;border-radius:99px;padding:8px 14px;z-index:3}
body.many .cluster{display:flex}

/* pin de previsualización (en la app real son marcadores de MapLibre) */
.pin{position:absolute;transform:translate(-50%,-100%);text-align:center;z-index:2}
.pin .a{width:46px;height:46px;border-radius:50%;border:2.5px solid var(--pin-border);display:flex;align-items:center;justify-content:center;font-weight:800;box-shadow:0 4px 14px rgba(0,0,0,.32)}
.pin.stale .a{background:var(--pin-stale-bg)!important;color:var(--pin-stale-on)!important;border-color:var(--pin-border);box-shadow:none;opacity:.85}
.tip{width:0;height:0;border:7px solid transparent;border-top-color:var(--pin-border);margin:-2px auto 0}
.lbl{font-size:10px;background:var(--chip-bg);border:1px solid var(--chip-line);color:var(--chip-on);border-radius:99px;padding:2px 9px;margin-top:5px;display:inline-block;white-space:nowrap;font-weight:700}
body.many .pin .a{width:30px;height:30px;font-size:12px;border-width:2px}
body.many .pin .lbl{display:none}

/* popup de MapLibre: el contenido hereda el --ink (claro en temas oscuros) sobre
   fondo blanco del popup → ilegible. Forzamos texto oscuro + fuente del tema. */
.maplibregl-popup-content{color:#1f2430;font-family:var(--font);font-weight:700;font-size:13px;border-radius:10px;padding:8px 26px 8px 12px;box-shadow:0 8px 24px rgba(0,0,0,.28)}
.maplibregl-popup-close-button{color:#1f2430;font-size:16px}

/* marcador real con foto (MapLibre): aro de color con OUTLINE (no border ni
   box-shadow). outline-offset:-1px lo solapa 1px hacia dentro → tapa la costura
   de antialiasing (la línea clara) sin comerse la imagen. El box-shadow es solo
   la sombra. El color del aro lo fija el JS (colorFor). */
.baliza-pin{width:42px;height:42px;border-radius:50%;border:0;background-size:cover;background-position:center;outline:3px solid var(--pin-border);outline-offset:-1px;box-shadow:0 3px 10px rgba(0,0,0,.4)}

/* color por carroza: el tema define --c1..--c8 y su texto --c1-on..--c8-on */
.gcard[data-i="1"] .av,.pin[data-i="1"] .a{background:var(--c1);color:var(--c1-on)} .pin[data-i="1"] .tip{border-top-color:var(--c1)}
.gcard[data-i="2"] .av,.pin[data-i="2"] .a{background:var(--c2);color:var(--c2-on)} .pin[data-i="2"] .tip{border-top-color:var(--c2)}
.gcard[data-i="3"] .av,.pin[data-i="3"] .a{background:var(--c3);color:var(--c3-on)} .pin[data-i="3"] .tip{border-top-color:var(--c3)}
.gcard[data-i="4"] .av,.pin[data-i="4"] .a{background:var(--c4);color:var(--c4-on)} .pin[data-i="4"] .tip{border-top-color:var(--c4)}
.gcard[data-i="5"] .av,.pin[data-i="5"] .a{background:var(--c5);color:var(--c5-on)} .pin[data-i="5"] .tip{border-top-color:var(--c5)}
.gcard[data-i="6"] .av,.pin[data-i="6"] .a{background:var(--c6);color:var(--c6-on)} .pin[data-i="6"] .tip{border-top-color:var(--c6)}
.gcard[data-i="7"] .av,.pin[data-i="7"] .a{background:var(--c7);color:var(--c7-on)} .pin[data-i="7"] .tip{border-top-color:var(--c7)}
.gcard[data-i="8"] .av,.pin[data-i="8"] .a{background:var(--c8);color:var(--c8-on)} .pin[data-i="8"] .tip{border-top-color:var(--c8)}

/* Avatar de la leyenda: MISMO aro de color que el marcador del mapa (outline con
   offset -1px → sin costura clara), para que se vean iguales. Por carroza; en
   "sin señal" (.off) no se pone. La sombra la da el box-shadow base de .av. */
.gcard[data-i="1"] .av:not(.off){outline:3px solid var(--c1);outline-offset:-1px}
.gcard[data-i="2"] .av:not(.off){outline:3px solid var(--c2);outline-offset:-1px}
.gcard[data-i="3"] .av:not(.off){outline:3px solid var(--c3);outline-offset:-1px}
.gcard[data-i="4"] .av:not(.off){outline:3px solid var(--c4);outline-offset:-1px}
.gcard[data-i="5"] .av:not(.off){outline:3px solid var(--c5);outline-offset:-1px}
.gcard[data-i="6"] .av:not(.off){outline:3px solid var(--c6);outline-offset:-1px}
.gcard[data-i="7"] .av:not(.off){outline:3px solid var(--c7);outline-offset:-1px}
.gcard[data-i="8"] .av:not(.off){outline:3px solid var(--c8);outline-offset:-1px}

.sec{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--sec);margin:0 0 12px;font-weight:800}
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:11px}
.gcard{display:flex;align-items:center;gap:11px;padding:13px 15px;background:var(--glass);border:1px solid var(--glassline);border-radius:16px;box-shadow:var(--shadow)}
.av{width:42px;height:42px;border-radius:50%;border:0;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:14px;flex:0 0 auto;box-shadow:0 3px 10px rgba(0,0,0,.22);overflow:hidden}
.av img{width:100%;height:100%;object-fit:cover}
.av.off{background:var(--pin-stale-bg)!important;color:var(--pin-stale-on)!important;opacity:.85;box-shadow:none}
.who{font-size:14px;font-weight:600;line-height:1.2;color:var(--title-on)}
.st{font-size:11.5px;color:var(--muted);display:flex;align-items:center;gap:6px;margin-top:3px;font-weight:600}
.sd{width:7px;height:7px;border-radius:50%;background:var(--sd-on)}
.sd.off{background:transparent;border:1.5px solid var(--muted)}

.stats{display:flex;justify-content:space-around;padding:20px;margin-bottom:18px;background:var(--glass);border:1px solid var(--glassline);border-radius:18px;box-shadow:var(--shadow)}
.stats b{display:block;font-family:var(--font-title,var(--font));font-size:27px;font-weight:700;text-align:center;color:var(--count-on)}
.stats span{font-size:12px;color:var(--muted);font-weight:600}

.route{position:absolute;inset:0;width:100%;height:100%;z-index:1}
.route polyline{fill:none;stroke-width:4.5;stroke-linecap:round;stroke-linejoin:round;filter:drop-shadow(0 1px 3px rgba(0,0,0,.35))}

/* conmutador inferior (solo previsualización): fundido con el fondo */
.switch{position:fixed;z-index:60;background:transparent;border:0;padding:2px;display:flex;gap:4px}
.switch-state{bottom:16px;left:50%;transform:translateX(-50%)}
.switch-count{bottom:16px;right:14px}
.switch .lab{color:var(--muted);font-size:10px;align-self:center;padding:0 6px;text-transform:uppercase;letter-spacing:.08em}
.switch button{border:0;background:transparent;color:var(--muted);font-size:12px;padding:6px 12px;border-radius:99px;cursor:pointer;font-weight:700}
.switch button.on{background:var(--switch-on-bg);color:var(--switch-on-color)}

/* ====================== PATROCINADORES ======================
   Sección al final de la página (fuera del <main>, no altera la altura del mapa).
   Tarjeta con logo (3/2, contain) y nombre debajo; tile claro u oscuro según el
   patrocinador (logos blancos → tile oscuro). El cromo usa variables del tema. */
.sponsors{max-width:1382px;margin:34px auto 0}
/* En pre/post la sección va DENTRO de .view (flex en columna): ahí los margin:auto
   laterales la encogerían al contenido y `auto-fill` colapsaría a 1 columna. La
   forzamos a ancho completo. En live la sección cuelga a nivel de body (bloque),
   donde el margin:auto sí centra a ancho completo: ese caso no se toca. */
.view > .sponsors{width:100%;margin:0 0 18px}
.sp-head{font-family:var(--font-title,var(--font));color:var(--muted);font-size:12px;font-weight:700;letter-spacing:.09em;text-transform:uppercase;margin:0 2px}
/* Encabezado de la sección: título a la izquierda y, en MÓVIL (pre/post, donde los
   logos van arriba del mapa), un atajo "Ver mapa" a la derecha. Oculto en escritorio
   (el mapa ya se ve) y nunca en live (ahí la sección cuelga bajo el mapa). */
.sp-headrow{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:0 0 14px}
.sp-tomap{display:none}
@media(max-width:559px){
  .sp-tomap{display:inline-flex;align-items:center;gap:6px;cursor:pointer;flex:0 0 auto;
    padding:7px 12px;border:1px solid var(--glassline);border-radius:999px;
    font:700 12px/1 var(--font);color:var(--ink);background:var(--glass)}
  .sp-tomap svg{width:13px;height:13px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
}
.sp-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:14px}
@media(min-width:560px){.sp-grid{grid-template-columns:repeat(auto-fill,minmax(210px,1fr))}}
.sp-card{background:var(--glass);border:1px solid var(--glassline);border-radius:16px;overflow:hidden;box-shadow:var(--shadow);transition:transform .12s}
a.sp-card{display:block;text-decoration:none;color:inherit}
a.sp-card:hover{transform:translateY(-2px)}
.sp-tile{position:relative;aspect-ratio:3/2;background:#fff;overflow:hidden}
.sp-card.dark .sp-tile{background:#0f2340}
/* imagen absoluta: el tile mantiene SIEMPRE el 3/2 (la imagen no lo estira) y el
   logo va contenido dentro, sea landscape o portrait. */
.sp-tile img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;padding:10px}
/* pie a una sola línea → todas las tarjetas con el mismo alto. */
.sp-name{padding:10px 12px;font-size:12.5px;font-weight:700;color:var(--ink);text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* Chip "Patrocinadores" (SOLO live): flota centrado en el borde inferior del
   mapa y baja con scroll suave a la sección. Vive DENTRO de .map (absoluto), así
   sirve igual en no-inmersivo (borde de la tarjeta) y en inmersivo (el inmersivo
   solo lo sube por encima de la tira de carrozas). Se desvanece cuando la sección
   está a la vista (lo marca el IntersectionObserver) para no tapar logos. */
.sp-chip{position:absolute;left:50%;bottom:16px;transform:translateX(-50%);z-index:6;
  display:inline-flex;align-items:center;gap:7px;cursor:pointer;
  padding:9px 16px;border:1px solid var(--glassline);border-radius:999px;
  font:700 13px/1 var(--font);color:var(--chip-on);background:var(--chip-bg);
  box-shadow:0 10px 26px var(--map-shadow);transition:opacity .25s,visibility .25s}
.sp-chip svg{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
/* "Ver mapa": vuelve arriba desde el final de la sección (live, ambos modos). */
.sp-backtomap{display:flex;width:fit-content;margin:22px auto 0;align-items:center;gap:7px;cursor:pointer;
  padding:11px 18px;border:1px solid var(--glassline);border-radius:999px;
  font:700 13px/1 var(--font);color:var(--ink);background:var(--glass)}
.sp-backtomap svg{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}

/* Móvil: la cabecera del estado "pre" (cuenta atrás) ocupa ~la mitad: menos
   padding y tipografías más contenidas. Solo afecta a esa cabecera (.hero/pre). */
@media (max-width: 640px) {
  /* Barra de directo (móvil): suprimimos la cápsula y el texto "En directo"; queda
     solo el punto parpadeando (en color --live) y, al lado, la frescura
     ("conectando…"/última actualización). order:1 deja el punto antes del texto. */
  .bar-right{flex-direction:row;align-items:center;gap:7px}
  .pill-live{background:none;box-shadow:none;padding:0}
  .pill-live .pill-lab{display:none}
  .pill-live .dot{background:var(--live);--dot-pulse:var(--live-glow)}
  .fresh{order:1}
  /* La barra va justa de ancho en móvil: el horario baja de cuerpo para que no
     robe sitio al nombre del evento ni fuerce una tercera línea. */
  .b-when{font-size:11px;margin-top:3px}
  .hero{padding:18px 18px}
  .crest{width:48px;height:48px;margin-bottom:10px}
  .h-title{font-size:23px}
  .sub{margin-top:8px}
  .pill-wait{margin-top:10px}
  .count-big{font-size:30px}
}
