/* Página pública de la murga — publica/index.php
   REGLA DURA (patrón Splash): todo el color/tipografía sale de las variables
   que inyecta el <head> desde private/temas.php. Acá NO va ningún color
   hardcodeado de marca: solo var(--brand), var(--fondo), etc. */

* { margin: 0; padding: 0; box-sizing: border-box; }

/* Utilidad: la pública no carga im.css, así que .oculto se define acá.
   Sin esto el lightbox (display:flex) nunca se ocultaba y tapaba la página. */
.oculto { display: none !important; }

html { scroll-behavior: smooth; }

body {
    font-family: var(--ff-body);
    background: var(--fondo);
    color: var(--texto);
    line-height: 1.6;
    -webkit-font-smoothing: antialiased;
    overflow-x: hidden; /* nunca scroll horizontal (el título/logo grande no debe empujar el ancho) */
}

.pp-container { max-width: 960px; margin: 0 auto; padding: 0 24px; }

/* ---- Nav ---- */
.pp-nav {
    position: sticky; top: 0; z-index: 10;
    background: var(--fondo); /* fallback sin color-mix */
    background: color-mix(in srgb, var(--fondo) 85%, transparent);
    backdrop-filter: blur(10px);
    border-bottom: 1px solid var(--card-borde);
}
.pp-nav-inner {
    display: flex; align-items: center; justify-content: space-between;
    gap: 16px; height: 60px;
}
.pp-marca { display: flex; align-items: center; gap: 10px; min-width: 0; }
.pp-logo {
    width: 36px; height: 36px; object-fit: contain;
    border-radius: 10px;
}
.pp-marca-nombre {
    font-family: var(--ff-display);
    font-weight: 800; font-size: 1.05rem;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

/* Botón de acceso a la gestión: visible y minimalista en la barra (reemplaza a
   la flecha desplegable; ya no hay que abrir nada). */
/* Solo ícono: chico y minimalista, con el color de marca (--brand resuelve al
   color propio del conjunto si se eligió uno en Apariencia, o al del tema). */
.pp-ingresar {
    display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0;
    width: 38px; height: 38px; padding: 0;
    border-radius: 50%;
    border: 1px solid var(--brand-mid);
    background: var(--brand-soft); color: var(--brand);
    text-decoration: none;
    transition: border-color 0.2s, transform 0.15s ease, filter 0.2s ease;
}
.pp-ingresar:hover { border-color: var(--brand); transform: translateY(-1px); filter: brightness(1.05); }
.pp-ingresar svg { color: var(--brand); flex-shrink: 0; }

/* Aviso de transición: barra full-width bajo la barra de navegación, cerrable. */
.pp-aviso {
    position: relative;
    padding: 11px 46px;
    text-align: center;
    font-size: 0.86rem; line-height: 1.4; color: var(--texto);
    background: var(--brand-soft);
    border-bottom: 1px solid var(--brand-mid);
}
.pp-aviso-txt strong { color: var(--brand); font-weight: 700; }
.pp-aviso-x {
    position: absolute; right: 10px; top: 50%; transform: translateY(-50%);
    display: inline-flex; align-items: center; justify-content: center;
    width: 32px; height: 32px; padding: 0;
    background: none; border: none; cursor: pointer;
    color: var(--texto-suave); border-radius: 50%;
    transition: color 0.2s, background 0.2s;
}
.pp-aviso-x:hover { color: var(--texto); background: rgba(128,128,128,.18); }

/* ---- Hero ---- */
.pp-hero {
    position: relative;
    overflow: hidden;
    background: linear-gradient(170deg, var(--brand-soft) 0%, var(--fondo) 65%);
}

/* Carrusel de portada: capas absolutas detrás del velo; la imagen de cada
   slide la inyecta el <head> con nonce (.pp-slide-N). Con una sola foto
   queda una capa fija. */
.pp-slides { position: absolute; inset: 0; }
.pp-slide {
    position: absolute; inset: 0;
    background-size: cover;
    /* El encuadre (background-position-x:50% + background-position-y por slide,
       escritorio y móvil) lo define el <style> del <head>, con el valor que el
       admin elige con el slider de "Posición vertical". */
    background-position: 50% 50%;
    opacity: 0;
    transition: opacity 0.9s ease;
}
.pp-slide.activa { opacity: 1; }

.pp-puntos {
    position: absolute; z-index: 2;
    bottom: 14px; left: 0; right: 0;
    display: flex; justify-content: center; gap: 8px;
}
.pp-punto {
    position: relative;
    width: 10px; height: 10px; padding: 0;
    border-radius: 50%;
    border: 1px solid var(--texto);
    background: transparent;
    opacity: .55;
    cursor: pointer;
    transition: opacity 0.2s, transform 0.15s ease;
}
/* Área de toque de ~40px sin agrandar el punto visible (antes 9px, imposible
   de acertar en móvil). */
.pp-punto::after { content: ''; position: absolute; inset: -14px; }
.pp-punto:hover { opacity: .9; transform: scale(1.2); }
.pp-punto.activa { background: var(--texto); opacity: 1; }

.pp-hero-velo { position: relative; z-index: 1; background: transparent; }
.pp-hero-conportada .pp-hero-velo {
    /* Banner más alto cuando hay foto: la proporción se acerca a la de la
       imagen (16:9) y cover recorta mucho menos (la foto se ve casi completa,
       sin ampliarse ni mutilarse). El contenido queda centrado vertical. */
    min-height: clamp(440px, 58vh, 680px);
    display: flex; flex-direction: column; justify-content: center;
    /* velo sobre la foto para que el texto del tema siga legible */
    background: rgba(0, 0, 0, 0.55); /* fallback sin color-mix */
    background: linear-gradient(180deg,
        color-mix(in srgb, var(--fondo) 55%, transparent) 0%,
        color-mix(in srgb, var(--fondo) 88%, transparent) 100%);
}
@media (max-width: 640px) {
    .pp-hero-conportada .pp-hero-velo { min-height: 420px; }
}
.pp-hero-inner {
    position: relative; z-index: 1; /* el texto siempre por encima del logo */
    padding-top: 88px; padding-bottom: 72px;
    text-align: center;
    /* El velo es flex-column y esta caja lleva .pp-container, que trae
       `margin: 0 auto`. En flexbox un margen auto en el eje cruzado gana sobre
       align-self:stretch, así que sin este width la caja se encogía al ancho del
       contenido y quedaba centrada: alinear el texto a la izquierda o a la
       derecha adentro de una caja angosta y centrada se veía casi igual que
       centrado. Con width:100% la caja ocupa sus 960px (el max-width de
       .pp-container) y la alineación se nota de verdad. */
    width: 100%;
}

/* Posición del bloque de texto dentro de la cabecera (publica_config:
   texto_pos_h / texto_pos_v, se elige en Apariencia). El centro es el default
   histórico y no agrega ninguna regla: las clases solo desplazan.

   Vertical: el velo es la caja de altura fija cuando hay foto de portada; sin
   foto crece con el contenido y arriba/centro/abajo se ven igual (se avisa en
   el panel). Horizontal: alinea el texto y arrastra la bio y los botones de
   redes, que por defecto van centrados con márgenes automáticos. */
/* El velo ya era flex-column centrado cuando hay portada; se generaliza para que
   la elección valga siempre. La especificidad extra (.pp-hero ...) le gana a
   `.pp-hero-conportada .pp-hero-velo { justify-content: center }` sin depender
   del orden de las reglas. */
.pp-hero-velo { display: flex; flex-direction: column; justify-content: center; }
.pp-hero .pp-hero-velo.pp-hv-arriba { justify-content: flex-start; }
.pp-hero .pp-hero-velo.pp-hv-abajo  { justify-content: flex-end; }

.pp-hh-izquierda .pp-hero-inner { text-align: left; }
.pp-hh-derecha   .pp-hero-inner { text-align: right; }
.pp-hh-izquierda .pp-bio { margin-left: 0; margin-right: auto; }
.pp-hh-derecha   .pp-bio { margin-left: auto; margin-right: 0; }
.pp-hh-izquierda .pp-redes { justify-content: flex-start; }
.pp-hh-derecha   .pp-redes { justify-content: flex-end; }

/* El logo decorativo vive abajo a la derecha. Con el texto también a la derecha
   los dos pelean por el mismo rincón: el logo se pasa a la izquierda (el texto
   nunca queda tapado, pero así tampoco quedan encimados). */
.pp-hero-con-logo.pp-hh-derecha .pp-hero-logo {
    right: auto; left: clamp(12px, 4vw, 48px);
    object-position: bottom left;
}
@media (max-width: 640px) {
    .pp-hero-con-logo.pp-hh-derecha .pp-hero-logo { right: auto; left: 14px; }
}

/* Logo completo como marca decorativa: abajo-derecha, entero (object-fit:contain),
   sin deformar. Detrás del texto (z-index 0) para no restarle legibilidad.
   Escritorio ~28% del ancho; en móvil más chico, pegado a la esquina. */
.pp-hero-logo {
    position: absolute; z-index: 0;
    right: clamp(12px, 4vw, 48px);
    bottom: clamp(12px, 4vw, 44px);
    width: 28%;
    max-width: 320px;
    height: auto;
    max-height: 72%;
    object-fit: contain;
    object-position: bottom right;
    pointer-events: none;
    filter: drop-shadow(0 6px 22px rgba(0, 0, 0, 0.45));
}
@media (max-width: 640px) {
    /* Unificado a 640 (coincide con el encuadre pos_y_mov y el min-height del
       hero): antes en 560 dejaba la banda 561-640 con padding y logo de
       escritorio, y el logo se solapaba con la bio/redes.
       En móvil el hero es corto: se reserva una franja inferior para que el
       logo quede abajo-derecha y NO se meta en la zona del título. */
    .pp-hero-con-logo .pp-hero-inner { padding-bottom: 150px; }
    .pp-hero-logo {
        width: 40%;
        max-width: 130px;
        max-height: 130px;
        right: 14px;
        bottom: 18px;
    }
}
.pp-eyebrow {
    display: inline-block;
    text-transform: uppercase;
    letter-spacing: 0.2em;
    font-size: 0.74rem; font-weight: 700;
    color: var(--brand);
    background: var(--brand-soft);
    border: 1px solid var(--brand-mid);
    padding: 6px 14px;
    border-radius: 999px;
    margin-bottom: 18px;
}
/* Subtítulo debajo del nombre: el margin-bottom del título ya da el espacio
   de arriba; acá solo el de abajo para separarlo de la bio. */
.pp-eyebrow-abajo { margin-top: 0; margin-bottom: 22px; }
.pp-display {
    font-family: var(--ff-display);
    font-size: clamp(2.6rem, 8vw, 4.6rem);
    font-weight: 800; line-height: 1.05;
    margin-bottom: 18px;
}
.pp-bio {
    color: var(--texto-suave);
    max-width: 620px;
    margin: 0 auto 26px;
    font-size: clamp(1rem, 2.2vw, 1.15rem);
}
.pp-redes {
    display: flex; flex-wrap: wrap; gap: 10px;
    justify-content: center;
}
.pp-red {
    color: var(--texto); text-decoration: none;
    font-weight: 600; font-size: 0.9rem;
    background: var(--card-bg);
    border: 1px solid var(--card-borde);
    padding: 9px 18px;
    border-radius: 999px;
    transition: border-color 0.2s, transform 0.15s ease, color 0.2s;
}
.pp-red:hover { border-color: var(--brand); transform: translateY(-2px); }
/* Como logo (Instagram, YouTube…): botón circular con el ícono, sin texto. */
.pp-red.es-icono {
    display: inline-flex; align-items: center; justify-content: center;
    width: 46px; height: 46px; padding: 0;
    border-radius: 50%;
}
.pp-red.es-icono:hover { color: var(--brand); }
.pp-red.es-icono svg { width: 22px; height: 22px; }

/* ---- Secciones ---- */
.pp-seccion { padding: 64px 24px 80px; }
.pp-titulo {
    font-family: var(--ff-display);
    font-size: clamp(1.6rem, 4vw, 2.2rem);
    font-weight: 800;
    margin-bottom: 28px;
    text-align: center;
}

/* ---- Tarjeta de fecha (toques y próximo ensayo) ---- */
.pp-fecha {
    display: flex; gap: 16px; align-items: flex-start;
    background: var(--card-bg);
    border: 1px solid var(--card-borde);
    border-radius: var(--radio);
    padding: 18px;
    transition: border-color 0.2s, transform 0.15s ease;
}
.pp-fecha:hover { border-color: var(--brand-mid); transform: translateY(-2px); }
.pp-fecha-cal {
    display: flex; flex-direction: column; align-items: center;
    background: var(--brand); color: var(--brand-on);
    border-radius: calc(var(--radio) * 0.6);
    padding: 8px 12px;
    min-width: 56px;
    flex-shrink: 0;
}
.pp-fecha-dia { font-size: 1.5rem; font-weight: 800; line-height: 1.1; }
.pp-fecha-mes { font-size: 0.7rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; }
.pp-chip {
    display: inline-block;
    font-size: 0.66rem; font-weight: 700;
    text-transform: uppercase; letter-spacing: 0.1em;
    color: var(--brand);
    background: var(--brand-soft);
    padding: 2px 8px;
    border-radius: 999px;
    margin-bottom: 4px;
}
.pp-fecha-info h3 {
    font-family: var(--ff-display);
    font-size: 1.1rem; font-weight: 700;
    margin-bottom: 2px;
}
.pp-fecha-info p { color: var(--texto-suave); font-size: 0.88rem; }

/* ---- Agenda: ensayos abiertos + próximos toques ---- */
.pp-agenda {
    display: grid;
    /* min(100%, 280px): en pantallas ≤328px la pista ya no fuerza 280px fijos
       (que desbordaban y quedaban clipeados por overflow-x:hidden del body). */
    grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
    gap: 28px;
    max-width: 860px;
    margin: 0 auto;
    align-items: start;
}
/* Con una sola columna (solo ensayos o solo toques), que quede angosta y centrada */
.pp-agenda:has(> :only-child) { max-width: 480px; }
.pp-agenda-sub {
    font-family: var(--ff-display);
    font-size: 1.15rem; font-weight: 700;
    margin-bottom: 14px;
    text-align: center;
}
.pp-agenda-lista { display: flex; flex-direction: column; gap: 12px; }
.pp-ensayos-txt {
    color: var(--texto-suave);
    font-size: 0.92rem;
    margin-top: 14px;
    background: var(--card-bg);
    border: 1px solid var(--card-borde);
    border-radius: var(--radio);
    padding: 14px 18px;
}

/* ---- Nuestro evento (cara pública del Festival) ---- */
.pp-festi {
    max-width: 560px;
    margin: 0 auto;
    background: var(--card-bg);
    border: 1px solid var(--card-borde);
    border-radius: var(--radio);
    padding: 28px 26px;
    text-align: center;
}
.pp-festi-nombre {
    font-family: var(--ff-display);
    font-size: clamp(1.6rem, 5vw, 2.4rem);
    font-weight: 800; line-height: 1.1;
    color: var(--brand);
}
.pp-festi-meta { color: var(--texto-suave); font-size: 1rem; margin-top: 8px; }
.pp-festi-tandas { margin-top: 22px; }
.pp-festi-tandas-lbl {
    display: inline-block;
    text-transform: uppercase; letter-spacing: 0.14em;
    font-size: 0.72rem; font-weight: 700;
    color: var(--brand);
    background: var(--brand-soft);
    border: 1px solid var(--brand-mid);
    padding: 4px 12px; border-radius: 999px;
    margin-bottom: 14px;
}
.pp-festi-lista {
    list-style: none;
    display: flex; flex-direction: column; gap: 8px;
    max-width: 360px; margin: 0 auto;
}
.pp-festi-lista li {
    background: var(--fondo);
    border: 1px solid var(--card-borde);
    border-radius: calc(var(--radio) * 0.6);
    padding: 10px 16px;
    font-weight: 600;
}
.pp-festi-precio { margin-top: 18px; font-weight: 700; color: var(--brand); }

/* ---- CTA "pedí la tuya" / "pedí tu entrada" / "hacé tu pedido" (chat IG) ---- */
.pp-cta {
    display: inline-flex; align-items: center; justify-content: center; gap: 10px;
    margin-top: 22px;
    background: var(--brand); color: var(--brand-on);
    font-size: 1.05rem; font-weight: 800; letter-spacing: .01em;
    text-decoration: none; cursor: pointer;
    padding: 16px 34px;
    border-radius: 999px;
    /* Relieve para que se lea como botón físico y no como link: sombra proyectada
       + resalte superior interno + borde inferior sutil (funciona en todos los temas). */
    box-shadow: 0 9px 22px -6px rgba(0,0,0,.42), inset 0 1px 0 rgba(255,255,255,.22), inset 0 -2px 0 rgba(0,0,0,.18);
    transition: transform .12s ease, box-shadow .2s ease, filter .2s ease;
}
.pp-cta:hover { transform: translateY(-2px); filter: brightness(1.06);
    box-shadow: 0 15px 28px -8px rgba(0,0,0,.5), inset 0 1px 0 rgba(255,255,255,.22), inset 0 -2px 0 rgba(0,0,0,.18); }
.pp-cta:active { transform: translateY(1px);
    box-shadow: 0 4px 12px -6px rgba(0,0,0,.4), inset 0 1px 0 rgba(255,255,255,.12), inset 0 -1px 0 rgba(0,0,0,.16); }
.pp-cta svg { flex-shrink: 0; }
.pp-cta-wrap { text-align: center; margin-top: 22px; }
.pp-cta-wrap .pp-cta { margin-top: 0; }
/* Foto del evento/rifa: arriba de la card, ENTERA sin recortar. Los flyers de
   rifa suelen ser verticales con título/pie: con object-fit:cover + tope 340px
   se cortaban justo esas zonas. contain los muestra completos (con fondo si
   sobra), y el lightbox permite ampliarlos. */
.pp-festi-img {
    width: 100%; max-height: 460px; object-fit: contain; display: block;
    background: var(--fondo);
    border-radius: calc(var(--radio) * 0.7);
    margin-bottom: 18px;
}

/* ---- A la venta (productos del módulo Ventas) ---- */
.pp-ventas {
    display: grid;
    /* auto-fill (no auto-fit) para que la última card de una fila incompleta NO
       se estire a todo el ancho (con foto quedaba una imagen enorme). min(100%)
       evita desborde en pantallas angostas. */
    grid-template-columns: repeat(auto-fill, minmax(min(100%, 220px), 1fr));
    gap: 12px;
    max-width: 760px;
    margin: 0 auto;
}
.pp-ventas:has(> :only-child) { max-width: 380px; }
.pp-venta {
    display: flex; align-items: center; justify-content: space-between; gap: 12px;
    background: var(--card-bg);
    border: 1px solid var(--card-borde);
    border-radius: var(--radio);
    padding: 14px 18px;
}
/* Producto con foto: card vertical (imagen arriba, datos abajo) */
.pp-ventas.es-fotos { grid-template-columns: repeat(auto-fill, minmax(min(100%, 200px), 1fr)); }
.pp-venta.es-foto { flex-direction: column; align-items: stretch; padding: 0; overflow: hidden; }
.pp-venta-img { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; display: block; }
.pp-venta.es-foto .pp-venta-datos {
    display: flex; align-items: center; justify-content: space-between; gap: 10px;
    padding: 12px 16px;
}
.pp-venta-datos { display: contents; }
.pp-venta-nombre { font-weight: 600; }
.pp-venta-precio {
    font-family: var(--ff-body); font-weight: 700;
    color: var(--brand); white-space: nowrap;
}

/* ---- Galería (minimalista: centrada, hover sutil) ----
   Flex + justify-center: con 1, 2 o 3 fotos quedan centradas con su tamaño
   fijo en vez de estirarse a todo el ancho; con más, llenan y bajan de fila. */
.pp-galeria {
    display: flex; flex-wrap: wrap; justify-content: center;
    gap: 10px;
    max-width: 960px;
    margin: 0 auto;
}
.pp-galeria-item {
    flex: 0 0 auto;
    width: clamp(150px, 30vw, 210px);
    aspect-ratio: 1 / 1;
    padding: 0; margin: 0; cursor: pointer;
    overflow: hidden;
    border-radius: var(--radio);
    background: var(--card-bg);
    border: 1px solid var(--card-borde);
}
.pp-galeria-item img {
    width: 100%; height: 100%;
    object-fit: cover; display: block;
    transition: transform 0.4s ease;
}
.pp-galeria-item:hover img { transform: scale(1.05); }
@media (prefers-reduced-motion: reduce) {
    .pp-galeria-item img { transition: none; }
}

/* ---- Lightbox (imagen grande, misma pestaña) ---- */
.pp-zoom { cursor: zoom-in; }
.pp-noscroll { overflow: hidden; }
.pp-lightbox {
    position: fixed; inset: 0; z-index: 100;
    display: flex; align-items: center; justify-content: center;
    padding: 24px;
    background: rgba(0, 0, 0, 0.88);
    cursor: zoom-out;
}
.pp-lightbox img {
    max-width: 100%; max-height: 100%;
    object-fit: contain;
    border-radius: 8px;
    box-shadow: 0 20px 60px rgba(0, 0, 0, 0.6);
    cursor: default;
}
.pp-lightbox-cerrar {
    position: absolute; top: 14px; right: 20px;
    width: 44px; height: 44px;
    background: transparent; border: 0;
    color: #fff; font-size: 2.4rem; line-height: 1;
    cursor: pointer; opacity: 0.85;
}
.pp-lightbox-cerrar:hover { opacity: 1; }

/* ---- Pie ---- */
.pp-pie {
    border-top: 1px solid var(--card-borde);
    padding: 22px 0;
    font-size: 0.85rem;
    color: var(--texto-suave);
}
.pp-pie-inner {
    display: flex; flex-wrap: wrap; align-items: center;
    justify-content: space-between;
    gap: 8px;
}
.pp-pie a { color: var(--brand); text-decoration: none; font-weight: 600; }
/* Crédito "Creado por MiSplash" con la mascota animada (igual al SaaS) */
.pp-pie-splash {
    display: inline-flex; align-items: center; gap: 6px;
    color: var(--texto-suave) !important; font-weight: 700;
    opacity: 0.75; transition: opacity 0.2s ease;
}
.pp-pie-splash:hover { opacity: 1; }
.pp-pie-splash .pp-pie-splash-pre { font-weight: 400; }
.pp-pie-splash img {
    width: 24px; height: auto; display: block;
    animation: pp-splash-float 3s ease-in-out infinite;
}
@keyframes pp-splash-float {
    0%, 100% { transform: translateY(0); }
    50%      { transform: translateY(-5px); }
}

@media (prefers-reduced-motion: reduce) {
    html { scroll-behavior: auto; }
    .pp-red, .pp-fecha, .pp-slide, .pp-punto { transition: none; }
    .pp-pie-splash img { animation: none; }
}

@media (max-width: 560px) {
    .pp-hero-inner { padding-top: 56px; padding-bottom: 48px; }
    .pp-seccion { padding: 48px 24px 64px; }
}

/* Modo vista previa (editor de apariencia): solo visual — los links no
   navegan, pero el scroll sigue funcionando. */
body.pp-preview a, body.pp-preview button { pointer-events: none; cursor: default; }

/* ---- Multi-rifa: varias tarjetas en "Nuestras rifas" ---- */
.pp-rifa-card + .pp-rifa-card { margin-top: 22px; }

/* ---- Detalle ampliado (rifa / evento / producto) ----
   Modal centrado que abre la tarjeta entera (elemento .pp-ampliable con
   data-detalle). Debajo del lightbox (z 90 < 100): tocar la imagen del
   detalle la amplía a pantalla completa encima. Cero colores hardcodeados:
   todo sale de los tokens del tema, como el resto de la pública. */
.pp-ampliable { cursor: pointer; }
.pp-ampliable:focus-visible { outline: 2px solid var(--brand); outline-offset: 3px; }

/* En el preview del editor los <a>/<button> quedan sin pointer-events, pero
   el detalle tiene que poder abrirse (las tarjetas son divs, no les afecta)
   y CERRARSE: la X queda exceptuada del bloqueo. El velo también cierra. */
body.pp-preview .pp-detalle-cerrar { pointer-events: auto; }

.pp-detalle {
    position: fixed; inset: 0; z-index: 90;
    display: flex; align-items: center; justify-content: center;
    padding: 16px;
}
.pp-detalle.oculto { display: none; }
.pp-detalle-velo {
    position: absolute; inset: 0;
    background: rgba(0, 0, 0, 0.62);
}
.pp-detalle-caja {
    position: relative; z-index: 1;
    width: 100%; max-width: 480px;
    max-height: min(88vh, 720px);
    overflow-y: auto;
    overscroll-behavior: contain;
    /* card-bg en los temas oscuros trae alpha (es un velo sobre el fondo de
       la página): solo, dejaría ver el contenido de atrás a través del modal.
       Se apila sobre --fondo opaco para que la caja sea sólida. */
    background-color: var(--fondo);
    background-image: linear-gradient(var(--card-bg), var(--card-bg));
    border: 1px solid var(--card-borde);
    border-radius: var(--radio);
    box-shadow: 0 24px 64px rgba(0, 0, 0, 0.45);
    text-align: center;
}
.pp-detalle-cerrar {
    position: sticky; top: 10px;
    float: right; margin: 10px 12px 0 0;
    width: 38px; height: 38px;
    border: 1px solid var(--card-borde);
    border-radius: 12px;
    background: var(--fondo); color: var(--texto);
    font-size: 1.5rem; line-height: 1;
    cursor: pointer; z-index: 2;
}
.pp-detalle-img {
    display: block;
    width: 100%;
    max-height: 300px;
    object-fit: contain;
    background: var(--brand-soft);
    cursor: zoom-in;
}
.pp-detalle-cuerpo {
    padding: 20px 24px 26px;
    display: flex; flex-direction: column; gap: 12px;
    align-items: center;
}
.pp-detalle-titulo {
    font-family: var(--ff-display);
    font-size: 1.5rem; font-weight: 800;
    color: var(--texto);
    margin: 0;
    overflow-wrap: anywhere;
}
.pp-detalle-meta {
    margin: 0;
    font-size: 0.95rem;
    color: var(--texto-suave);
}
.pp-detalle-lista { width: 100%; }
.pp-detalle-lista .pp-festi-lista li { white-space: pre-line; }
.pp-detalle-precio {
    margin: 0;
    font-size: 1.15rem; font-weight: 800;
    color: var(--brand);
}
.pp-detalle .pp-cta { margin-top: 8px; }
