/**
 * Estilos específicos de cada página pública (no admin). Se cargan siempre
 * juntos en un único archivo para no multiplicar peticiones; cada bloque
 * está comentado con la página a la que pertenece. Los estilos comunes a
 * todas las páginas (tema, cabecera, pestañas, selector) están en base.css.
 */

/* =======================================================================
   mapas.php — carruseles de mapas (Puertos del Estado / AEMET)
======================================================================= */
.mapas-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 20px;
    align-items: start;
}
@media (max-width: 700px) {
    .mapas-grid { grid-template-columns: 1fr; }
}
.visor-mapa {
    background: var(--bg-card);
    border-radius: var(--radio-lg);
    overflow: hidden;
    box-shadow: var(--shadow-card);
}
.mapa-titulo {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 12px 16px;
}
.mapa-nombre {
    font-weight: 600;
    font-size: 1.05rem;
}
.mapa-hora {
    background: var(--accent);
    color: var(--accent-text);
    font-weight: 700;
    font-size: 0.85rem;
    padding: 4px 10px;
    border-radius: 20px;
    white-space: nowrap;
}
.mapa-imagen-wrap {
    position: relative;
    width: 100%;
    aspect-ratio: 4 / 3;
    background: var(--bg-card);
    touch-action: pan-y;
    user-select: none;
}
.mapa-imagen-wrap img {
    width: 100%;
    height: 100%;
    object-fit: contain;
    display: block;
}
.mapa-flecha {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    background: rgba(13, 27, 42, 0.7);
    border: none;
    color: #e0e6ed;
    width: 40px;
    height: 40px;
    border-radius: 50%;
    font-size: 1.3rem;
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
}
.mapa-flecha:hover {
    background: rgba(46, 168, 160, 0.8);
}
.mapa-flecha-izq { left: 10px; }
.mapa-flecha-der { right: 10px; }
.mapa-controles {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 12px 16px;
}
.mapa-play {
    background: var(--gradiente-marca);
    border: none;
    color: #fff;
    width: 36px;
    height: 36px;
    border-radius: 50%;
    font-size: 1rem;
    cursor: pointer;
    flex-shrink: 0;
    display: flex;
    align-items: center;
    justify-content: center;
}
.mapa-slider {
    flex: 1;
    accent-color: var(--accent);
}
.mapa-credito {
    padding: 0 16px 14px 16px;
    font-size: 0.78rem;
    color: var(--text-muted);
}
.sin-mapas {
    padding: 40px 20px;
    text-align: center;
    color: var(--text-muted);
    background: var(--bg-card);
    border-radius: var(--radio-lg);
    box-shadow: var(--shadow-card);
}

/* =======================================================================
   webcams.php — grid de webcams
======================================================================= */
.webcams-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: 16px;
    row-gap: 32px;
}
@media (max-width: 700px) {
    .webcams-grid { grid-template-columns: 1fr; }
}
.webcam-card {
    background: var(--bg-card);
    border-radius: var(--radio-lg);
    overflow: hidden;
    box-shadow: var(--shadow-card);
}
.webcam-nombre {
    font-weight: 600;
    font-size: 1.15rem;
    padding: 14px 14px 10px 14px;
}
.webcam-frame-wrap {
    position: relative;
    width: 100%;
    padding-top: 56.25%; /* 16:9 */
    background: var(--bg);
}
.webcam-frame-wrap iframe,
.webcam-frame-wrap img {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    border: none;
    object-fit: cover;
}
.webcam-credito {
    padding: 10px 14px 14px 14px;
    font-size: 0.8rem;
    color: var(--text-muted);
}
.webcam-frame-wrap.enlace {
    display: flex;
    align-items: center;
    justify-content: center;
    background-size: cover;
    background-position: center;
    position: relative;
}
.webcam-frame-wrap.enlace::before {
    content: '';
    position: absolute;
    inset: 0;
    background: var(--overlay);
}
.webcam-boton-enlace {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    z-index: 1;
    display: inline-flex;
    align-items: center;
    gap: 8px;
    background: var(--gradiente-marca);
    color: #fff;
    font-weight: 600;
    padding: 10px 20px;
    border-radius: var(--radio-boton);
    text-decoration: none;
}
.webcam-boton-enlace:hover {
    filter: brightness(1.08);
}
.webcam-sin-instantanea {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--text-muted);
    font-size: 0.9rem;
    text-align: center;
    padding: 0 16px;
}

/* =======================================================================
   index.php — tarjetas de previsión de oleaje/viento por hora
======================================================================= */
.sin-datos {
    padding: 40px;
    text-align: center;
    color: var(--text-muted);
}
.barra-iconos-sticky {
    position: sticky;
    top: 0;
    z-index: 5;
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
    gap: 10px;
    background: var(--bg-card);
    border: 1px solid var(--border);
    border-radius: 10px;
    padding: 8px 12px;
    margin-bottom: 14px;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.icono-sticky {
    display: flex;
    align-items: center;
    justify-content: center;
}
.icono-sticky svg {
    width: 60px;
    height: 60px;
}
.icono-sticky-ola svg { color: var(--blue); }
.icono-sticky-viento svg { color: var(--accent2); }
.icono-sticky-periodo svg { color: var(--periodo); }

.lista-horas {
    display: flex;
    flex-direction: column;
    gap: 20px;
}
.fila-prevision {
    display: flex;
    flex-direction: column;
    gap: 10px;
    background: var(--bg-card);
    border-radius: var(--radio-lg);
    padding: var(--espacio-3);
    box-shadow: var(--shadow-card);
}
/* Condiciones buenas para surfear (ver condicionSurf() en index.php):
   fondo verde en toda la tarjeta, más suave cuando es solo "aceptable". */
.fila-prevision.fila-buena {
    background: color-mix(in srgb, var(--green) 35%, var(--bg-card));
}
.fila-prevision.fila-aceptable {
    background: color-mix(in srgb, var(--green) 15%, var(--bg-card));
}
.fila-cabecera {
    display: flex;
    align-items: center;
    justify-content: space-between;
}
.fila-hora-fecha {
    display: flex;
    align-items: baseline;
    gap: 8px;
}
.hora-prevision {
    font-weight: 700;
    font-size: 1.3rem;
    color: var(--text);
}
.fila-fecha {
    font-size: 0.82rem;
    font-weight: 600;
    color: var(--text-muted);
}
.icono-amigo {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 38px;
    height: 38px;
    border-radius: 50%;
    background: var(--bg-card-alt);
    color: var(--text-muted);
    flex-shrink: 0;
    border: 0;
    padding: 0;
    cursor: pointer;
}
.icono-amigo:hover {
    background: var(--border);
}
.icono-amigo svg {
    width: 22px;
    height: 22px;
    fill: var(--text-muted);
}

/* Modal de demo "invitar a un amigo" */
.modal-overlay {
    position: fixed;
    inset: 0;
    background: rgba(0, 0, 0, 0.55);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 20px;
    z-index: 50;
}
.modal-overlay[hidden] {
    display: none;
}
.modal-amigo {
    position: relative;
    background: var(--bg-card);
    border-radius: 16px;
    padding: 30px 24px 24px 24px;
    max-width: 360px;
    width: 100%;
    text-align: center;
    box-shadow: 0 10px 40px rgba(0, 0, 0, 0.35);
}
.modal-cerrar {
    position: absolute;
    top: 10px;
    right: 10px;
    width: 30px;
    height: 30px;
    background: transparent;
    border: 0;
    color: var(--text-muted);
    font-size: 1.1rem;
    cursor: pointer;
}
.modal-icono {
    font-size: 2.6rem;
    margin-bottom: 8px;
}
.modal-amigo h3 {
    margin: 0 0 10px 0;
    color: var(--text);
    font-size: 1.15rem;
}
.modal-amigo p {
    color: var(--text-muted);
    font-size: 0.9rem;
    line-height: 1.45;
    margin: 0 0 18px 0;
}
.modal-compartir {
    display: flex;
    justify-content: center;
    gap: 18px;
    margin-top: 4px;
}
.btn-compartir {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 6px;
    text-decoration: none;
    color: var(--text);
    font-size: 0.75rem;
    background: none;
    border: none;
    cursor: pointer;
    font-family: inherit;
}
.btn-compartir[hidden] {
    display: none;
}
.btn-compartir .circulo {
    width: 48px;
    height: 48px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    transition: transform 0.1s ease;
}
.btn-compartir:hover .circulo {
    transform: scale(1.06);
}
.btn-compartir svg {
    width: 24px;
    height: 24px;
    fill: #fff;
}
.btn-whatsapp .circulo { background: #25D366; }
.btn-telegram .circulo { background: #229ED9; }
.btn-nativo .circulo,
.btn-copiar .circulo { background: var(--gradiente-marca); }
.modal-copiado {
    color: var(--green);
    font-size: 0.85rem;
    font-weight: 600;
    margin: 12px 0 0 0;
}
.fila-cuerpo {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 10px;
    align-items: stretch;
}
.bloque {
    border-radius: 10px;
    padding: 8px 10px;
    display: flex;
    flex-direction: column;
    gap: 6px;
}
.bloque-ola {
    background: color-mix(in srgb, var(--blue) 12%, var(--bg-card));
}
.bloque-viento {
    background: color-mix(in srgb, var(--accent2) 12%, var(--bg-card));
}
.bloque-cabecera {
    display: flex;
    align-items: center;
    justify-content: space-between;
}
.bloque-valor {
    font-weight: 700;
    font-size: 1.1rem;
}
.bloque-ola .bloque-valor { color: var(--blue); }
.bloque-viento .bloque-valor { color: var(--accent2); }
.bloque-flecha {
    display: inline-flex;
    align-items: center;
    gap: 3px;
}
.bloque-flecha svg {
    width: 20px;
    height: 20px;
    transform: rotate(calc(var(--deg) + 180deg));
}
.bloque-ola .bloque-flecha svg { fill: var(--blue); }
.bloque-viento .bloque-flecha svg { fill: var(--accent2); }
.bloque-flecha .cardinal {
    font-size: 0.75rem;
    font-weight: 600;
}
.bloque-ola .cardinal { color: var(--blue); }
.bloque-viento .cardinal { color: var(--accent2); }
.barra-fondo {
    width: 100%;
    height: 6px;
    border-radius: 4px;
    background: var(--border);
    overflow: hidden;
}
.barra-relleno {
    height: 100%;
    border-radius: 4px;
}
.bloque-ola .barra-relleno { background: var(--blue); }
.bloque-viento .barra-relleno { background: var(--accent2); }
.bloque-periodo {
    font-size: 0.78rem;
    color: var(--text-muted);
}
/* Variante de 3 cajas (ola/viento/periodo) — usada en el snippet de la home
   y en la lista de /previsiones, ver tarjeta-prevision.blade.php. Cuando se
   usa, la barra de probabilidad también sale un poco más grande y separada
   de las cajas de arriba y del contenido de abajo. */
.fila-cuerpo-3 .fila-cuerpo {
    grid-template-columns: 1fr 1fr 1fr;
}
/* Variante de 4 cajas (ola/viento arriba, periodo/probabilidad abajo) —
   solo el snippet de la home; la lista de /previsiones sigue con 3 cajas
   + la barra de probabilidad aparte. */
.fila-cuerpo-4 .fila-cuerpo {
    grid-template-columns: 1fr 1fr;
}
.fila-cuerpo-4 .bloque {
    min-height: 92px;
    justify-content: center;
}
.bloque-periodo-caja {
    background: color-mix(in srgb, var(--periodo) 15%, var(--bg-card));
    align-items: center;
    justify-content: center;
    text-align: center;
}
.bloque-periodo-etiqueta {
    font-size: 0.75rem;
    color: var(--text-muted);
}
/* Snippet "Oleaje actual" de la home (4 cajas): el propio fondo de cada
   caja hace de barra de progreso — degradado de dos paradas duras en el
   mismo punto (var(--pct), fijado desde el Blade con el % real sobre un
   máximo de referencia), color sólido a la izquierda y una versión clara
   del mismo tono a la derecha. Con esto ya no hace falta una barra aparte,
   y el texto pasa a blanco para leerse bien sobre cualquiera de los dos
   tonos. */
.fila-cuerpo-4 .bloque-ola {
    background: linear-gradient(90deg, var(--blue) var(--pct), color-mix(in srgb, var(--blue) 45%, white) var(--pct));
}
.fila-cuerpo-4 .bloque-viento {
    background: linear-gradient(90deg, var(--accent2) var(--pct), color-mix(in srgb, var(--accent2) 45%, white) var(--pct));
}
.fila-cuerpo-4 .bloque-periodo-caja {
    /* --periodo es demasiado claro para texto blanco encima, se oscurece
       un poco solo para este uso. */
    background: linear-gradient(90deg, color-mix(in srgb, var(--periodo) 75%, black) var(--pct), color-mix(in srgb, var(--periodo) 45%, white) var(--pct));
}
/* Color dinámico (--color-prob, calculado en el Blade con
   colorEscalaProbabilidad()) en vez de un tono fijo: sigue la misma escala
   roja→naranja→amarilla→verde que .barra-probabilidad-fondo, así el color
   de la caja concuerda con el nivel real de probabilidad. */
.fila-cuerpo-4 .bloque-probabilidad-caja {
    background: linear-gradient(90deg, var(--color-prob) var(--pct), color-mix(in srgb, var(--color-prob) 45%, white) var(--pct));
}
.fila-cuerpo-4 .bloque-valor,
.fila-cuerpo-4 .cardinal,
.fila-cuerpo-4 .bloque-periodo-etiqueta {
    color: #fff;
}
.fila-cuerpo-4 .bloque-flecha svg {
    fill: #fff;
}
/* Variante ancha del snippet de 4 cajas: ola/viento/periodo arriba en 3
   columnas, probabilidad como única caja ancha abajo — misma altura total
   que la de 2x2 (hereda min-height de .fila-cuerpo-4 .bloque). */
.fila-cuerpo-5 .fila-cuerpo {
    grid-template-columns: 1fr 1fr 1fr;
}
.fila-cuerpo-5 .bloque-probabilidad-caja {
    grid-column: 1 / -1;
}
.fila-cuerpo-3 .fila-probabilidad {
    margin: 10px 0;
}
.fila-cuerpo-3 .barra-probabilidad-fondo {
    height: 10px;
    border-radius: 5px;
}
.fila-probabilidad {
    padding: 0 2px;
}
.probabilidad-cabecera {
    display: flex;
    gap: 4px;
    font-size: 0.78rem;
    color: var(--text-muted);
    margin-bottom: 4px;
}
.probabilidad-valor {
    font-weight: 700;
    color: var(--text);
}
/* El degradado rojo->verde va fijo en toda la pista (0-100%); lo que se
   "rellena" es en realidad un tapado del lado sin cumplir, así el color
   en cada punto siempre representa el mismo nivel de probabilidad. */
.barra-probabilidad-fondo {
    position: relative;
    background: linear-gradient(90deg, #e5484d, #f4a261, #f2c94c, #a8d95f, var(--green));
}
.barra-probabilidad-vacio {
    position: absolute;
    top: 0;
    right: 0;
    height: 100%;
    background: var(--border);
}
@media (max-width: 600px) {
    .fila-cuerpo { gap: 6px; }
    .bloque-valor { font-size: 1rem; }
}

/* =======================================================================
   Cabecera: estado de sesión (Entrar/Registrarse o saludo + Salir)
======================================================================= */
.cabecera-acciones {
    display: flex;
    align-items: center;
    gap: 10px;
    flex-wrap: wrap;
    flex-shrink: 0;
}
.cuenta-enlace {
    font-size: 0.85rem;
    font-weight: 600;
    color: var(--text-muted);
    text-decoration: none;
    background: none;
    border: none;
    cursor: pointer;
    padding: 0;
    font-family: inherit;
}
.cuenta-enlace:hover {
    color: var(--text);
}
.cuenta-enlace-destacado {
    color: var(--gradiente-inicio);
}
.cuenta-form-salir {
    width: 100%;
}
.mensaje-flash {
    background: color-mix(in srgb, var(--green) 15%, var(--bg-card));
    color: var(--green);
    border-radius: var(--radio);
    padding: 12px 16px;
    font-size: 0.9rem;
    font-weight: 600;
    margin: -10px 0 var(--espacio-4) 0;
}

/* =======================================================================
   auth.register / auth.login — crear cuenta y entrar
======================================================================= */
.auth-caja {
    max-width: 400px;
    margin: 50px auto;
    background: var(--bg-card);
    border-radius: var(--radio-lg);
    padding: var(--espacio-5) var(--espacio-4);
    box-shadow: var(--shadow-card);
}
.auth-titulo {
    margin: 0 0 8px 0;
    font-size: 1.4rem;
}
.auth-subtitulo {
    margin: 0 0 24px 0;
    color: var(--text-muted);
    font-size: 0.9rem;
}
.auth-form {
    display: flex;
    flex-direction: column;
    gap: var(--espacio-2);
}
.auth-form label {
    margin-top: var(--espacio-3);
}
.auth-form label:first-child {
    margin-top: 0;
}
.auth-checkbox {
    display: flex;
    align-items: center;
    gap: 8px;
    font-size: 1rem;
    color: var(--text-muted);
    margin-top: var(--espacio-2);
}
.auth-checkbox input {
    width: auto;
    accent-color: var(--gradiente-inicio);
}
.auth-boton {
    margin-top: var(--espacio-4);
    background: var(--gradiente-marca);
    color: #fff;
    border: none;
    padding: 13px 20px;
    border-radius: var(--radio-boton);
    font-weight: 700;
    font-size: 0.95rem;
    cursor: pointer;
    box-shadow: 0 4px 14px var(--shadow-gradiente);
    transition: filter 0.15s ease, transform 0.1s ease, box-shadow 0.15s ease;
}
.auth-boton:hover {
    filter: brightness(1.08);
    box-shadow: 0 6px 18px var(--shadow-gradiente);
}
.auth-boton:active {
    transform: scale(0.98);
}
.auth-enlace {
    text-align: center;
    font-size: 0.85rem;
    color: var(--text-muted);
    margin-top: var(--espacio-4);
}
.auth-errores {
    background: color-mix(in srgb, var(--accent2) 15%, var(--bg-card));
    color: var(--accent2);
    border-radius: var(--radio);
    padding: 12px 16px;
    margin-bottom: var(--espacio-3);
    font-size: 0.85rem;
}
.auth-errores ul {
    margin: 0;
    padding-left: 18px;
}
.auth-fila-opciones {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-top: var(--espacio-2);
}
.auth-fila-opciones .auth-checkbox {
    margin-top: 0;
}
.auth-olvide {
    font-size: 0.8rem;
    color: var(--text-muted);
}
.auth-olvide:hover {
    color: var(--gradiente-inicio);
}
.auth-separador {
    display: flex;
    align-items: center;
    text-align: center;
    color: var(--text-muted);
    font-size: 0.8rem;
    margin: var(--espacio-4) 0;
}
.auth-separador::before,
.auth-separador::after {
    content: "";
    flex: 1;
    border-bottom: 1px solid var(--border);
}
.auth-separador span {
    padding: 0 10px;
}
.auth-boton-google {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
    background: var(--bg);
    color: var(--text);
    border: 1.5px solid var(--border);
    padding: 12px;
    border-radius: var(--radio-boton);
    font-weight: 600;
    font-size: 0.9rem;
    text-decoration: none;
    transition: border-color 0.15s ease, background 0.15s ease;
}
.auth-boton-google:hover {
    background: color-mix(in srgb, var(--text) 5%, var(--bg));
    border-color: var(--text-muted);
}

/* =======================================================================
   perfil.edit — mi cuenta
======================================================================= */
.perfil-caja {
    max-width: 520px;
    margin: 10px auto;
    background: var(--bg-card);
    border-radius: var(--radio-lg);
    padding: var(--espacio-5) var(--espacio-4);
    box-shadow: var(--shadow-card);
}
/* Publicar/editar anuncio tienen más campos que un login — en escritorio
   se ven mejor ocupando todo el ancho disponible en vez del ancho estrecho
   de formulario que usan login/Mi cuenta/Tribe. */
.perfil-caja.perfil-caja-ancha {
    max-width: 100%;
}
.perfil-seccion {
    background: var(--bg-card);
    border-radius: var(--radio-lg);
    padding: var(--espacio-4);
    margin-top: var(--espacio-3);
    box-shadow: var(--shadow-card);
}
/* La primera sección de una columna nunca lleva separación por encima —
   si no, no queda a la misma altura que lo que tenga al lado (p. ej. la
   barra lateral de la intranet). */
.perfil-seccion:first-child {
    margin-top: 0;
}
/* Dentro de .perfil-caja las secciones ya están sobre un fondo blanco —
   quitamos su propio fondo/sombra para que no se vea "caja dentro de caja",
   y dejamos solo el espaciado entre ellas. */
.perfil-caja .perfil-seccion {
    background: none;
    box-shadow: none;
    padding: 0;
    border-radius: 0;
}
.perfil-caja .perfil-seccion.perfil-seccion-peligro {
    padding: var(--espacio-3);
}
.perfil-seccion-titulo {
    margin: 0 0 var(--espacio-3) 0;
    font-size: 1.05rem;
}
.ajustes-comunicaciones {
    display: flex;
    flex-direction: column;
    gap: var(--espacio-3);
}
.ajustes-comunicacion-fila {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--espacio-3);
    padding: 6px 8px;
    margin: -6px -8px;
    border-radius: var(--radio);
    transition: background 0.3s ease;
}
.ajustes-fila-resaltada {
    background: color-mix(in srgb, var(--green) 25%, transparent);
    animation: ajustesResaltado 2.2s ease-out;
}
@keyframes ajustesResaltado {
    0% {
        background: color-mix(in srgb, var(--green) 45%, transparent);
    }
    100% {
        background: transparent;
    }
}
.ajustes-bloqueados-grid {
    display: flex;
    flex-wrap: wrap;
    gap: var(--espacio-4);
}
.ajustes-bloqueado-tarjeta {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: var(--espacio-2);
    width: 140px;
    text-align: center;
}
.ajustes-bloqueado-avatar {
    width: 64px;
    height: 64px;
    border-radius: 50%;
    object-fit: cover;
}
.ajustes-bloqueado-avatar-inicial {
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--gradiente-marca);
    color: #fff;
    font-weight: 700;
    font-size: 1.3rem;
}
.ajustes-bloqueado-nombre {
    font-weight: 600;
}
.ajustes-bloqueado-tarjeta form {
    width: 100%;
}
.ajustes-bloqueado-tarjeta .auth-boton {
    margin-top: 0;
    width: 100%;
    padding: 8px 12px;
    font-size: 0.85rem;
}
.switch {
    position: relative;
    display: inline-block;
    width: 44px;
    height: 26px;
    flex-shrink: 0;
}
.switch input {
    opacity: 0;
    width: 0;
    height: 0;
}
.switch-slider {
    position: absolute;
    inset: 0;
    background: var(--border);
    border-radius: 999px;
    cursor: pointer;
    transition: background-color 0.15s ease;
}
.switch-slider::before {
    content: "";
    position: absolute;
    width: 20px;
    height: 20px;
    left: 3px;
    top: 3px;
    background: #fff;
    border-radius: 50%;
    transition: transform 0.15s ease;
}
.switch input:checked + .switch-slider {
    background: var(--gradiente-marca);
}
.switch input:checked + .switch-slider::before {
    transform: translateX(18px);
}
.perfil-texto-ayuda {
    color: var(--text-muted);
    font-size: 0.95rem;
    margin: 0 0 var(--espacio-3) 0;
}
.perfil-subtitulo {
    margin: var(--espacio-4) 0 var(--espacio-2) 0;
    font-size: 0.85rem;
    font-weight: 600;
    color: var(--text-muted);
}
.perfil-avatar-fila {
    display: flex;
    align-items: center;
    gap: var(--espacio-3);
}
.perfil-avatar {
    width: 72px;
    height: 72px;
    border-radius: 50%;
    object-fit: cover;
    flex-shrink: 0;
}
.perfil-avatar-inicial {
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--gradiente-marca);
    color: #fff;
    font-size: 1.6rem;
    font-weight: 700;
}
.perfil-publico-visibilidad {
    margin: 0 0 var(--espacio-3) 0;
    font-size: 0.8rem;
    color: var(--text-muted);
}
.perfil-publico-visibilidad a {
    color: var(--text-muted);
    text-decoration: underline;
}
.perfil-publico-visibilidad a:hover {
    color: var(--gradiente-inicio);
}
/* Ficha de perfil público — reutiliza el layout de zoco/show (foto principal
   + miniaturas a la izquierda, snippet blanco a la derecha); esta variante
   solo cambia el placeholder sin foto por la inicial en degradado de marca. */
.zoco-detalle-sin-imagen.perfil-detalle-avatar-vacia {
    background: var(--gradiente-marca);
    color: #fff;
    font-size: 3rem;
    font-weight: 700;
}
.perfil-fotos-extra {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: var(--espacio-3);
}
@media (max-width: 500px) {
    .perfil-fotos-extra {
        grid-template-columns: repeat(2, 1fr);
    }
}
.perfil-foto-extra {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 8px;
}
.perfil-foto-extra-img {
    width: 100%;
    aspect-ratio: 1 / 1;
    object-fit: cover;
    border-radius: var(--radio-lg);
}
.perfil-foto-extra-vacia {
    width: 100%;
    aspect-ratio: 1 / 1;
    border-radius: var(--radio-lg);
    background: var(--bg);
    border: 1.5px dashed var(--border);
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--text-muted);
    font-size: 0.75rem;
    text-align: center;
}
.perfil-avatar-acciones {
    display: flex;
    flex-direction: column;
    gap: 8px;
}
.perfil-form-avatar {
    display: inline-block;
}
.perfil-boton-secundario {
    display: inline-block;
    background: var(--bg);
    color: var(--text);
    border: 1.5px solid var(--border);
    padding: 9px 16px;
    border-radius: var(--radio-boton);
    font-size: 0.85rem;
    font-weight: 600;
    cursor: pointer;
    transition: border-color 0.15s ease, background 0.15s ease;
}
.perfil-boton-secundario.label-sin-color {
    background: #fff;
    border: 0;
}
.label-sin-color label {
    background: #fff;
    border: 0;
}
.perfil-boton-secundario:hover {
    background: color-mix(in srgb, var(--text) 5%, var(--bg));
    border-color: var(--text-muted);
}
.perfil-boton-enlace {
    background: none;
    border: none;
    color: var(--text-muted);
    font-size: 0.8rem;
    text-decoration: underline;
    cursor: pointer;
    padding: 0;
    text-align: left;
}
.perfil-boton-enlace:hover {
    color: var(--accent2);
}
.perfil-error {
    color: var(--accent2);
    font-size: 0.85rem;
    margin: 10px 0 0 0;
}
.perfil-boton-peligro {
    margin-top: var(--espacio-4);
    background: none;
    color: var(--accent2);
    border: 1.5px solid var(--accent2);
    padding: 12px;
    border-radius: var(--radio-boton);
    font-weight: 700;
    font-size: 0.9rem;
    cursor: pointer;
    transition: background 0.15s ease;
}
.perfil-boton-peligro:hover {
    background: color-mix(in srgb, var(--accent2) 12%, transparent);
}

/* cabecera: botón con solo el avatar, abre el menú de la cuenta */
.cuenta-saludo {
    position: relative;
    display: flex;
    align-items: center;
    background: none;
    border: none;
    padding: 0;
    color: var(--text-muted);
    text-decoration: none;
    font-size: 0.85rem;
    font-family: inherit;
    cursor: pointer;
}
.cuenta-saludo:hover {
    color: var(--text);
}
.cuenta-avatar-mini {
    width: 34px;
    height: 34px;
    border-radius: 50%;
    object-fit: cover;
    border: 1px solid transparent;
    background: var(--gradiente-marca) border-box;
}
.cuenta-avatar-mini-inicial {
    width: 34px;
    height: 34px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    color: #fff;
    font-size: 0.9rem;
    font-weight: 700;
    border: 1px solid transparent;
    background: var(--gradiente-marca) border-box;
}
.cuenta-badge-avatar {
    position: absolute;
    top: -3px;
    right: -3px;
    min-width: 17px;
    height: 17px;
    padding: 0 4px;
    border-radius: 999px;
    background: var(--accent2);
    color: #fff;
    font-size: 0.65rem;
    font-weight: 700;
    display: flex;
    align-items: center;
    justify-content: center;
    border: 2px solid var(--bg);
}
.cuenta-badge-avatar[hidden] {
    display: none;
}
.menu-cuenta-nombre {
    display: block;
    padding: 6px 12px 10px 12px;
    margin-bottom: 4px;
    border-bottom: 1px solid var(--border);
    font-size: 1.1rem;
    font-weight: 700;
    color: var(--text-muted);
}

/* =======================================================================
   zoco — mercadillo de segunda mano
======================================================================= */
.zoco-titulo {
    margin: 0 0 var(--espacio-2) 0;
    font-size: 1.5rem;
}
.zoco-iconos-fila {
    display: flex;
    align-items: center;
    gap: 10px;
    margin: var(--espacio-4) 0 var(--espacio-4) 0;
    flex-wrap: wrap;
}
.zoco-icono-boton {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 42px;
    height: 42px;
    border-radius: 50%;
    background: var(--bg-card);
    color: var(--text);
    border: 1.5px solid var(--border);
    cursor: pointer;
    text-decoration: none;
    flex-shrink: 0;
    transition: border-color 0.15s ease;
}
.zoco-icono-boton:hover {
    border-color: var(--gradiente-inicio);
}
.zoco-icono-boton svg {
    width: 20px;
    height: 20px;
}
.zoco-buscador {
    display: flex;
    gap: 8px;
    margin-bottom: var(--espacio-3);
}
.zoco-buscador[hidden] {
    display: none;
}
.zoco-buscador input {
    min-width: 220px;
}
.zoco-buscador button {
    background: var(--gradiente-marca);
    color: #fff;
    border: none;
    padding: 12px 20px;
    border-radius: var(--radio-boton);
    font-weight: 600;
    font-size: 0.85rem;
    cursor: pointer;
    transition: filter 0.15s ease;
}
.zoco-buscador button:hover {
    filter: brightness(1.08);
}
.zoco-categorias,
.zoco-subcategorias {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    margin-bottom: var(--espacio-3);
}
.zoco-categorias a,
.zoco-subcategorias a {
    padding: 8px 16px;
    border-radius: 999px;
    background: var(--bg-card);
    color: var(--text-muted);
    text-decoration: none;
    font-size: 0.85rem;
    font-weight: 500;
    transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}
.zoco-subcategorias a {
    background: transparent;
    border: 1.5px solid var(--border);
}
.zoco-categorias a:hover,
.zoco-subcategorias a:hover {
    color: var(--text);
}
.zoco-categorias a.activa,
.zoco-subcategorias a.activa {
    background: var(--gradiente-marca);
    color: #fff;
    border-color: transparent;
}
.zoco-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
    gap: var(--espacio-3);
    margin-top: var(--espacio-4);
}
.zoco-tarjeta-contenedor {
    position: relative;
}
.zoco-tarjeta {
    background: var(--bg-card);
    border-radius: var(--radio-lg);
    overflow: hidden;
    text-decoration: none;
    color: var(--text);
    display: flex;
    flex-direction: column;
    box-shadow: var(--shadow-card);
    transition: transform 0.15s ease;
}
.zoco-tarjeta:hover {
    transform: translateY(-3px);
}
.zoco-tarjeta-favorito-form {
    position: absolute;
    top: 8px;
    right: 8px;
    z-index: 2;
}
.zoco-tarjeta-favorito {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    border-radius: 50%;
    border: none;
    background: rgba(255, 255, 255, 0.85);
    color: var(--text-muted);
    cursor: pointer;
    box-shadow: var(--shadow-card);
}
.zoco-tarjeta-favorito svg {
    width: 18px;
    height: 18px;
    fill: currentColor;
}
.zoco-tarjeta-favorito.activo {
    color: var(--accent2);
}
.zoco-tarjeta-imagen {
    position: relative;
    aspect-ratio: 4 / 3;
    background: var(--bg);
    overflow: hidden;
}
.zoco-tarjeta-imagen img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
}
.zoco-tarjeta-sin-imagen {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--text-muted);
    font-size: 0.8rem;
}
.zoco-etiqueta-tipo {
    position: absolute;
    top: 8px;
    left: 8px;
    background: var(--accent2);
    color: #fff;
    font-size: 0.7rem;
    font-weight: 700;
    padding: 3px 8px;
    border-radius: 999px;
    text-transform: uppercase;
}
.zoco-etiqueta-tipo-estatica {
    position: static;
    display: inline-block;
    margin-bottom: 10px;
}
.zoco-tarjeta-cuerpo {
    padding: 14px 16px 16px 16px;
    display: flex;
    flex-direction: column;
    gap: 6px;
}
.zoco-tarjeta-categoria {
    font-size: 0.7rem;
    color: var(--text-muted);
    text-transform: uppercase;
    letter-spacing: 0.03em;
}
.zoco-tarjeta-titulo {
    margin: 0;
    font-size: 0.95rem;
    line-height: 1.35;
}
.zoco-tarjeta-precio {
    font-weight: 700;
    font-size: 1.05rem;
    color: var(--accent);
    margin-top: 2px;
}

/* zoco/show — detalle de un anuncio */
.zoco-volver {
    display: inline-block;
    color: var(--text-muted);
    text-decoration: none;
    font-size: 0.85rem;
    margin-bottom: 16px;
}
.zoco-volver:hover {
    color: var(--text);
}
.zoco-detalle {
    display: grid;
    grid-template-columns: 1.2fr 1fr;
    gap: var(--espacio-5);
    align-items: start;
    margin-bottom: var(--espacio-5);
}
@media (max-width: 700px) {
    .zoco-detalle { grid-template-columns: 1fr; }
    /* En móvil las "cajas blancas" (foto, vendedor, info) quedan apiladas —
       igualamos el hueco entre ellas al mismo que ya pone el grid entre
       columnas, en vez del margin-bottom propio (más corto) de .zoco-vendedor. */
    .zoco-detalle-imagenes .zoco-vendedor-plano {
        margin-top: var(--espacio-5);
        margin-bottom: 0;
    }
}
.zoco-detalle-info {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    background: var(--bg-card);
    border-radius: var(--radio-lg);
    padding: var(--espacio-4);
    box-shadow: var(--shadow-card);
}
/* Variante sin caja propia, para cuando el bloque del vendedor va suelto
   debajo de la foto en vez de ser una tarjeta aparte (ver zoco/show). */
.zoco-vendedor-plano {
    background: none;
    box-shadow: none;
    padding: 0;
    margin-top: var(--espacio-3);
}
.zoco-detalle-imagen-principal {
    width: 100%;
    aspect-ratio: 4 / 3;
    object-fit: cover;
    border-radius: var(--radio-lg);
    background: var(--bg-card);
    box-shadow: var(--shadow-card);
}
.zoco-detalle-sin-imagen {
    width: 100%;
    aspect-ratio: 4 / 3;
    border-radius: var(--radio-lg);
    background: var(--bg-card);
    box-shadow: var(--shadow-card);
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--text-muted);
}
.zoco-detalle-miniaturas {
    display: flex;
    gap: 8px;
    margin-top: 8px;
}
.zoco-detalle-miniaturas img {
    width: 60px;
    height: 60px;
    object-fit: cover;
    border-radius: 8px;
}
.zoco-miniatura-click {
    cursor: pointer;
    border: 2px solid transparent;
    transition: border-color 0.15s ease;
}
.zoco-miniatura-click.activa {
    border-color: var(--accent);
}
.zoco-detalle-titulo {
    margin: 0 0 8px 0;
    font-size: 1.4rem;
}
.zoco-detalle-precio {
    display: block;
    font-size: 1.6rem;
    font-weight: 700;
    color: var(--accent);
    margin-bottom: 10px;
}
.zoco-detalle-meta {
    color: var(--text-muted);
    font-size: 0.85rem;
    margin: 0 0 16px 0;
}
.zoco-detalle-meta a {
    color: var(--text-muted);
    text-decoration: underline;
}
.zoco-detalle-meta a:hover {
    color: var(--gradiente-inicio);
}
.zoco-boton-compartir {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    background: none;
    border: none;
    color: var(--text);
    padding: 9px 16px;
    border-radius: var(--radio-boton);
    font-weight: 600;
    font-size: 0.85rem;
    font-family: inherit;
    cursor: pointer;
}
.zoco-boton-compartir:hover {
    color: var(--gradiente-inicio);
}
.zoco-vendedor .zoco-boton-compartir {
    margin-left: auto;
    flex-shrink: 0;
}
.zoco-boton-compartir svg {
    width: 18px;
    height: 18px;
    fill: currentColor;
}
.zoco-boton-favorito.activo {
    color: var(--accent2);
}
.zoco-boton-favorito.activo:hover {
    color: var(--accent2);
}
.zoco-favorito-contador {
    font-size: 0.85rem;
    color: var(--text-muted);
}
.zoco-boton-favorito-estatico {
    cursor: default;
}
.zoco-boton-favorito-estatico:hover {
    color: var(--text);
}
.zoco-vendedor {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 12px 14px;
    background: var(--bg-card);
    border-radius: var(--radio-lg);
    margin-bottom: 20px;
    box-shadow: var(--shadow-card);
}
.zoco-vendedor-avatar,
.zoco-vendedor-avatar-inicial {
    width: 40px;
    height: 40px;
    border-radius: 50%;
    flex-shrink: 0;
}
.zoco-vendedor-avatar {
    object-fit: cover;
}
.zoco-vendedor-avatar-inicial {
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--gradiente-marca);
    color: #fff;
    font-size: 1rem;
    font-weight: 700;
}
.zoco-vendedor-info {
    display: flex;
    flex-direction: column;
    gap: 2px;
}
.zoco-vendedor-etiqueta {
    font-size: 0.72rem;
    color: var(--text-muted);
    text-transform: uppercase;
    letter-spacing: 0.03em;
}
.zoco-mensaje-etiqueta-difusion {
    display: inline-block;
    font-size: 0.72rem;
    font-weight: 700;
    color: var(--gradiente-inicio);
    text-transform: uppercase;
    letter-spacing: 0.03em;
    margin-bottom: 4px;
}
.zoco-vendedor-nombre {
    font-weight: 600;
    font-size: 0.95rem;
}
.zoco-detalle-descripcion {
    white-space: pre-line;
    line-height: 1.6;
    margin-bottom: 20px;
}

/* paginación genérica (usada por zoco/index) */
.paginacion {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 20px;
    margin-top: 26px;
}
.paginacion-enlace {
    color: var(--gradiente-inicio);
    text-decoration: none;
    font-size: 0.85rem;
    font-weight: 600;
}
.paginacion-enlace.paginacion-deshabilitado {
    color: var(--text-muted);
    opacity: 0.5;
    pointer-events: none;
}
.paginacion-info {
    color: var(--text-muted);
    font-size: 0.85rem;
}
.zoco-miniaturas-editables {
    flex-wrap: wrap;
}
.zoco-miniatura-borrar {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 4px;
}
.zoco-foto-campo {
    display: flex;
    align-items: center;
    gap: var(--espacio-3);
    flex-wrap: wrap;
}
.zoco-foto-campo .zoco-foto-nombre {
    margin: 0;
}
.zoco-fotos-grid {
    display: grid;
    grid-template-columns: 1fr;
    row-gap: var(--espacio-5);
    column-gap: var(--espacio-4);
    margin-top: var(--espacio-2);
}
.zoco-foto-grupo label:first-child {
    margin-top: 0;
}
@media (min-width: 700px) {
    .zoco-fotos-grid {
        grid-template-columns: 1fr 1fr;
    }
}
.zoco-mios-lista {
    display: flex;
    flex-direction: column;
    gap: 10px;
}
.zoco-mios-fila {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    background: var(--bg-card);
    border-radius: var(--radio);
    text-decoration: none;
    color: inherit;
    padding: var(--espacio-3);
    flex-wrap: wrap;
    box-shadow: var(--shadow-card);
}
.zoco-mios-miniatura {
    width: 56px;
    height: 56px;
    border-radius: var(--radio);
    object-fit: cover;
    flex-shrink: 0;
}
.zoco-mios-miniatura-vacia {
    background: var(--bg);
}
.zoco-mios-info {
    display: flex;
    flex-direction: column;
    gap: 2px;
    flex: 1;
    min-width: 140px;
}
.zoco-mios-info a {
    color: var(--text);
    font-weight: 600;
    text-decoration: none;
}
.zoco-mios-info span {
    font-size: 0.8rem;
    color: var(--text-muted);
}
.zoco-mios-estado {
    display: inline-block;
    padding: 2px 10px;
    border-radius: 999px;
    background: var(--bg);
    font-size: 0.75rem;
    width: fit-content;
}
.zoco-mios-acciones {
    display: flex;
    gap: 6px;
    align-items: center;
}
.zoco-mios-icono {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 34px;
    height: 34px;
    border-radius: 50%;
    background: none;
    border: none;
    cursor: pointer;
    padding: 0;
}
.zoco-mios-icono svg {
    width: 18px;
    height: 18px;
}
.zoco-mios-icono-editar {
    color: var(--blue);
}
.zoco-mios-icono-editar:hover {
    background: color-mix(in srgb, var(--blue) 15%, transparent);
}
.zoco-mios-icono-eliminar {
    color: var(--accent2);
}
.zoco-mios-icono-eliminar:hover {
    background: color-mix(in srgb, var(--accent2) 15%, transparent);
}
.zoco-hilo {
    display: flex;
    flex-direction: column;
    gap: 10px;
    margin: 16px 0 var(--espacio-3) 0;
}
.zoco-mensaje {
    background: color-mix(in srgb, var(--gradiente-inicio) 4%, var(--bg-card));
    border-radius: 10px;
    padding: 10px 14px;
}
.zoco-mensaje-propio {
    background: color-mix(in srgb, var(--periodo) 10%, var(--bg-card));
}
.zoco-mensaje p {
    margin: 0 0 4px 0;
    white-space: pre-line;
}
.zoco-mensaje span {
    font-size: 0.75rem;
    color: var(--text-muted);
}
.zoco-mensaje-pie {
    display: flex;
    align-items: center;
    justify-content: flex-start;
    gap: var(--espacio-2);
}
.zoco-mensaje-fila-propia .zoco-mensaje-pie {
    justify-content: flex-end;
}
.zoco-mensaje-fila {
    display: flex;
    align-items: flex-start;
    gap: 8px;
    width: 100%;
}
.zoco-mensaje-fila-propia {
    flex-direction: row-reverse;
}
/* Mensaje nunca entregado por bloqueo: solo lo ve quien lo escribió, sin
   ningún aviso explícito ni icono, la propia atenuación ya lo insinúa. */
.zoco-mensaje-fila-no-entregado {
    opacity: 0.3;
}
.zoco-mensaje-fila .zoco-mensaje {
    flex: 1;
    min-width: 0;
}
.zoco-mensaje-fila-propia .zoco-mensaje {
    text-align: right;
}
.zoco-mensaje-avatar {
    width: 36px;
    height: 36px;
    border-radius: 50%;
    object-fit: cover;
    flex-shrink: 0;
    margin-top: 10px;
}
.zoco-mensaje-avatar-inicial {
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--gradiente-marca);
    color: #fff;
    font-size: 0.8rem;
    font-weight: 700;
}
.zoco-hilo-form {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: var(--espacio-3);
}
.zoco-hilo-form textarea {
    width: 100%;
    min-height: 48px;
    max-height: 160px;
    overflow-y: auto;
    resize: none;
}
.zoco-hilo-form button {
    width: 100%;
    margin-top: 0;
}
.mensajes-bloqueo-aviso {
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
}
.mensajes-bloqueo-aviso .perfil-texto-ayuda {
    margin-bottom: var(--espacio-3);
}
.zoco-mensaje-oficial {
    width: 100%;
    display: flex;
    align-items: flex-start;
    gap: var(--espacio-3);
    background: var(--bg-card);
    border: 1px solid color-mix(in srgb, var(--gradiente-inicio) 30%, transparent);
}
.zoco-mensaje-oficial-texto {
    flex: 1;
}
.zoco-mensaje-oficial-texto p {
    margin: 0 0 4px 0;
    white-space: pre-line;
}
.zoco-mensaje-oficial-texto span {
    font-size: 0.75rem;
    color: var(--text-muted);
}
.mensajes-match-acciones {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: var(--espacio-3);
    margin: var(--espacio-2) 0;
}
.zoco-mensaje-oficial-avatar {
    width: 36px;
    height: 36px;
    border-radius: 50%;
    object-fit: cover;
    flex-shrink: 0;
}
.zoco-mensaje-oficial-avatar-inicial {
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--gradiente-marca);
    color: #fff;
    font-weight: 700;
}

/* =======================================================================
   Mensajes (Zoco + Tribe chat) — bandeja de una sola columna, a pantalla
   completa: se muestra la lista de hilos O la conversación abierta, nunca
   las dos a la vez, igual en escritorio que en móvil.
======================================================================= */
.mensajes-grid {
    display: grid;
    grid-template-columns: 1fr;
    align-items: start;
}
.mensajes-grid.tiene-conversacion .mensajes-lista-lateral {
    display: none;
}
.mensajes-grid:not(.tiene-conversacion) .mensajes-conversacion {
    display: none;
}
.mensajes-lista-lateral {
    max-height: 70vh;
    overflow-y: auto;
}
.mensajes-fila-hilo.activo {
    border: 2px solid var(--gradiente-inicio);
    box-shadow: var(--shadow-card);
}
.mensajes-fila-hilo-avatar {
    width: 44px;
    height: 44px;
    border-radius: 50%;
    object-fit: cover;
    flex-shrink: 0;
}
.mensajes-fila-hilo-avatar-inicial {
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--gradiente-marca);
    color: #fff;
    font-weight: 700;
}
.mensajes-conversacion {
    background: var(--bg-card);
    border-radius: var(--radio-lg);
    padding: var(--espacio-4) var(--espacio-2);
    box-shadow: var(--shadow-card);
}
.mensajes-conversacion-cabecera {
    display: flex;
    align-items: center;
    gap: 10px;
    padding-bottom: var(--espacio-3);
    margin-bottom: var(--espacio-3);
    border-bottom: 1px solid var(--border);
}
.mensajes-conversacion-avatar {
    width: 44px;
    height: 44px;
    border-radius: 50%;
    object-fit: cover;
    flex-shrink: 0;
}
.mensajes-conversacion-avatar-inicial {
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--gradiente-marca);
    color: #fff;
    font-weight: 700;
}
.mensajes-conversacion-cabecera-texto {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
    flex: 1;
}
.mensajes-boton-opciones {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 36px;
    height: 36px;
    flex-shrink: 0;
    background: none;
    border: none;
    border-radius: 50%;
    color: var(--text-muted);
    cursor: pointer;
}
.mensajes-boton-opciones:hover {
    background: var(--bg);
    color: var(--text);
}
.mensajes-boton-opciones svg {
    width: 20px;
    height: 20px;
}
.menu-fila-boton-peligro {
    color: var(--accent2);
}
.mensajes-conversacion-nombre {
    font-weight: 700;
    font-size: 1.1rem;
}
.mensajes-conversacion-contexto {
    font-size: 0.85rem;
    color: var(--text-muted);
}
.mensajes-vacio {
    color: var(--text-muted);
    padding: var(--espacio-4) 0;
    text-align: center;
}
.mensajes-volver-movil {
    display: inline-block;
    margin-bottom: var(--espacio-2);
    font-size: 1rem;
    font-weight: 600;
}
.cuenta-badge-mensajes {
    background: var(--accent2);
    color: #fff;
    font-size: 0.65rem;
    font-weight: 700;
    padding: 1px 6px;
    border-radius: 999px;
    margin-left: 4px;
}
.boton-cta {
    display: inline-block;
    background: var(--gradiente-marca);
    color: #fff;
    text-decoration: none;
    border: none;
    padding: 11px 20px;
    border-radius: var(--radio-boton);
    font-weight: 600;
    font-size: 0.85rem;
    cursor: pointer;
    transition: filter 0.15s ease;
}
.boton-cta:hover {
    filter: brightness(1.08);
}
/* Mismo tamaño y forma que .boton-cta, pero "hueco": fondo blanco y borde
   de 1.5px con el degradado de marca en vez de relleno sólido. Se usa
   donde .boton-cta ya ocupa el hueco de acción principal y hace falta una
   acción secundaria con el mismo peso visual, sin competir con ella. */
.boton-cta-contorno {
    display: inline-block;
    background:
        linear-gradient(var(--bg-card), var(--bg-card)) padding-box,
        var(--gradiente-marca) border-box;
    border: 1.5px solid transparent;
    color: var(--gradiente-inicio);
    text-decoration: none;
    padding: calc(11px - 1.5px) calc(20px - 1.5px);
    border-radius: var(--radio-boton);
    font-weight: 600;
    font-size: 0.85rem;
    transition: filter 0.15s ease;
}
.boton-cta-contorno:hover {
    filter: brightness(0.95);
}
.zoco-mensaje-boton-compartir {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    margin: var(--espacio-2) 0;
}
.zoco-mensaje-boton-compartir svg {
    width: 16px;
    height: 16px;
}

/* =======================================================================
   home/index — inicio, snippet de previsión
======================================================================= */
.inicio-secciones {
    display: flex;
    flex-direction: column;
    gap: var(--espacio-4);
}
.inicio-snippet {
    background: var(--bg-card);
    border-radius: var(--radio-lg);
    padding: var(--espacio-3);
    box-shadow: var(--shadow-card);
}
.inicio-snippet-imagen-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: var(--espacio-4);
    align-items: center;
}
@media (max-width: 700px) {
    .inicio-snippet-imagen-grid {
        grid-template-columns: 1fr;
    }
}
.inicio-snippet-imagen {
    width: 100%;
    height: 100%;
    aspect-ratio: 16 / 9;
    max-height: 260px;
    object-fit: cover;
    border-radius: var(--radio-lg);
}
.inicio-snippet-imagen-texto .boton-cta {
    margin-top: var(--espacio-2);
}
.inicio-snippet + .inicio-snippet {
    margin-top: var(--espacio-4);
}
.inicio-snippet .fila-prevision {
    box-shadow: none;
    padding: 0;
}
/* Textos más grandes — pedido explícitamente solo para el snippet de la
   home, no para la lista completa de /previsiones. */
.inicio-snippet .bloque-valor {
    font-size: 1.4rem;
}
.inicio-snippet .bloque-flecha .cardinal {
    font-size: 0.95rem;
}
.inicio-snippet .fila-fecha {
    font-size: 1.05rem;
}
.inicio-snippet-cabecera {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 12px;
    margin-bottom: var(--espacio-3);
}
.inicio-snippet-titulo {
    margin: 0;
    font-size: 1.3rem;
}
.inicio-snippet-ubicacion {
    color: var(--text-muted);
    font-size: 0.9rem;
    font-weight: 600;
}
.inicio-enlace-completa {
    margin-top: var(--espacio-3);
}
.inicio-zoco-grid {
    margin-top: 0;
}
.mapa-boton {
    padding: 0 16px 16px 16px;
}
.inicio-grid-2 {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 20px;
}
@media (max-width: 700px) {
    .inicio-grid-2 { grid-template-columns: 1fr; }
}
.webcam-card-boton {
    padding: 0 14px 16px 14px;
}
/* En la home: la 2ª webcam y los anuncios del zoco del 4º en adelante se
   quitan en móvil (solo 1 webcam y 3 anuncios), quedan todos en escritorio. */
.inicio-zoco-extra {
    display: contents;
}
@media (max-width: 700px) {
    .inicio-webcam-extra,
    .inicio-zoco-extra {
        display: none;
    }
}
.inicio-banner-tribe {
    background: var(--gradiente-marca);
    border-radius: var(--radio-lg);
    padding: 48px 32px;
    text-align: center;
    color: #fff;
    box-shadow: var(--shadow-gradiente);
}
.inicio-banner-tribe h3 {
    margin: 0 0 var(--espacio-2) 0;
    font-size: 1.7rem;
}
.inicio-banner-tribe p {
    margin: 0 0 var(--espacio-4) 0;
    color: rgba(255, 255, 255, 0.9);
    font-size: 1.05rem;
}
.inicio-banner-tribe-boton {
    display: inline-block;
    background: #fff;
    color: var(--accent2);
    padding: 13px 28px;
    border-radius: var(--radio-boton);
    font-weight: 700;
    text-decoration: none;
    font-size: 0.95rem;
}
.inicio-banner-tribe-boton:hover {
    filter: brightness(0.97);
}

/* =======================================================================
   intranet-layout — mi cuenta / mis anuncios / mis mensajes, con menú
   lateral fijo (perfil.edit, zoco.mios, zoco.mensajes.*)
======================================================================= */
.intranet-grid {
    display: grid;
    grid-template-columns: 200px 1fr;
    gap: var(--espacio-4);
    align-items: start;
}
@media (max-width: 700px) {
    .intranet-grid {
        grid-template-columns: 1fr;
    }
}
.intranet-grid:has(.intranet-columna-lateral-oculta) {
    grid-template-columns: 1fr;
}
.intranet-sidebar {
    display: flex;
    flex-direction: column;
    gap: 2px;
    background: var(--bg-card);
    border-radius: var(--radio-lg);
    /* El padding-top de aquí + el padding-top propio de cada <a> (10px) han
       de sumar var(--espacio-4), lo mismo que usan las cajas de contenido,
       para que el primer enlace y el primer título queden a la misma altura. */
    padding: 14px 10px var(--espacio-4);
    box-shadow: var(--shadow-card);
    position: sticky;
    top: 20px;
}
@media (max-width: 700px) {
    .intranet-sidebar {
        position: static;
        flex-direction: row;
        flex-wrap: wrap;
    }
}
.intranet-sidebar a {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 10px 12px;
    border-radius: var(--radio);
    color: var(--text);
    text-decoration: none;
    font-weight: 600;
    font-size: 0.9rem;
}
.intranet-sidebar a svg {
    width: 18px;
    height: 18px;
    flex-shrink: 0;
}
.intranet-sidebar a:hover {
    background: var(--bg);
}
.intranet-sidebar a.activa {
    background: var(--gradiente-marca);
    color: #fff;
}
.intranet-contenido {
    min-width: 0;
    display: flow-root;
}
.intranet-contenido > .zoco-grid {
    margin-top: 0;
}
/* Menú + snippets extra (p. ej. "Ver mi perfil" o "Publicar anuncio") se
   agrupan en una sola columna flex — así ninguno de los dos lados "infla"
   la altura de una fila de grid compartida con el otro (con contenidos tan
   dispares como un formulario largo y un menú corto, eso los desalineaba). */
.intranet-columna-lateral {
    display: flex;
    flex-direction: column;
    gap: var(--espacio-3);
}
.intranet-columna-lateral-oculta {
    display: none;
}
.intranet-perfil-snippet {
    display: flex;
    align-items: center;
    gap: 10px;
    background: var(--bg-card);
    border-radius: var(--radio-lg);
    padding: 10px 12px;
    box-shadow: var(--shadow-card);
    color: var(--text);
    text-decoration: none;
    font-weight: 600;
    font-size: 0.9rem;
}
.intranet-perfil-snippet:hover {
    background: var(--bg);
}
.intranet-perfil-snippet-avatar {
    width: 32px;
    height: 32px;
    border-radius: 50%;
    object-fit: cover;
    flex-shrink: 0;
}
.intranet-perfil-snippet-avatar-inicial {
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--gradiente-marca);
    color: #fff;
    font-size: 0.85rem;
    font-weight: 700;
}
.intranet-sidebar-boton {
    display: block;
    text-align: center;
}

/* =======================================================================
   Tribe — encontrar gente afín para surfear
======================================================================= */
.tribe-landing-grid {
    display: grid;
    grid-template-columns: 1.3fr 1fr;
    gap: var(--espacio-5);
    align-items: center;
}
@media (max-width: 700px) {
    .tribe-landing-grid {
        grid-template-columns: 1fr;
    }
    .tribe-landing-imagen {
        order: -1;
    }
}
.tribe-landing-lema {
    font-size: 1.4rem;
    font-weight: 700;
    margin: 0 0 var(--espacio-4) 0;
}
.tribe-landing p {
    color: var(--text-muted);
    line-height: 1.6;
    margin: 0 0 var(--espacio-3) 0;
}
.tribe-landing-subtitulo {
    margin: var(--espacio-4) 0 var(--espacio-3) 0;
    font-size: 1.1rem;
}
.tribe-landing-lista {
    margin: 0 0 var(--espacio-4) 0;
    padding-left: 1.2em;
    color: var(--text-muted);
    line-height: 1.8;
}
.tribe-landing-pasos {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: var(--espacio-3);
    margin: var(--espacio-4) 0;
}
.tribe-landing-paso {
    background: var(--bg-card-alt);
    border-radius: var(--radio-lg);
    padding: var(--espacio-3);
}
.tribe-landing-paso-destacado {
    background: color-mix(in srgb, var(--accent) 10%, var(--bg-card));
    border: 1px solid color-mix(in srgb, var(--accent) 30%, transparent);
}
.tribe-landing-paso-numero {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    border-radius: 8px;
    background: color-mix(in srgb, var(--accent) 15%, transparent);
    color: var(--accent);
    font-weight: 700;
    font-size: 0.85rem;
    margin-bottom: var(--espacio-2);
}
.tribe-landing-paso h4 {
    margin: 0 0 4px 0;
    font-size: 1rem;
}
.tribe-landing-paso p {
    margin: 0;
    font-size: 0.88rem;
}
@media (max-width: 700px) {
    .tribe-landing-pasos {
        grid-template-columns: 1fr;
    }
}
.tribe-landing p.tribe-landing-cierre {
    font-weight: 700;
    color: var(--text);
}
.tribe-landing .boton-cta {
    margin-top: var(--espacio-3);
}
.tribe-landing-acciones {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: var(--espacio-4);
    margin-top: var(--espacio-3);
}
.tribe-landing-acciones .boton-cta {
    margin-top: 0;
}
.tribe-landing-deportes {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    margin: var(--espacio-3) 0;
}
.tribe-landing-nota {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    color: var(--text-muted);
    font-size: 0.85rem;
}
.tribe-landing-punto {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: var(--green);
    flex-shrink: 0;
}
.tribe-landing-planes {
    margin-top: var(--espacio-4);
}
.tribe-landing-imagen img,
.tribe-landing-imagen-vacia {
    width: 100%;
    aspect-ratio: 3 / 2;
    border-radius: var(--radio-lg);
    object-fit: cover;
}
/* Hueco de foto provisional del hero de Tribe — mismo patrón "Sin foto"
   sólido que usa el Zoco (.zoco-detalle-sin-imagen), no el hueco discontinuo
   de foto de perfil de arriba: aquí es solo un marcador de posición a la
   espera de la imagen definitiva, no una acción de "sube tu foto". */
.tribe-landing-foto-vacia {
    width: 100%;
    min-height: 220px;
    aspect-ratio: 4 / 3;
    border-radius: var(--radio-lg);
    background: var(--bg);
    box-shadow: var(--shadow-card);
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--text-muted);
    font-size: 0.9rem;
}

/* =======================================================================
   tribe/bienvenida — pantalla tras crear el perfil por primera vez.
======================================================================= */
.tribe-bienvenida-badge {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 6px 14px 6px 6px;
    border-radius: var(--radio-boton);
    background: color-mix(in srgb, var(--green) 15%, var(--bg-card));
    color: var(--green);
    font-size: 0.78rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.03em;
    margin-bottom: var(--espacio-3);
}
.tribe-bienvenida-badge-icono {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 22px;
    height: 22px;
    border-radius: 50%;
    background: var(--green);
    color: #fff;
    flex-shrink: 0;
}
.tribe-bienvenida-badge-icono svg {
    width: 13px;
    height: 13px;
}
.tribe-landing-imagen {
    position: relative;
}
/* Ilustración animada "buscando coincidencias" — sustituye a la foto en
   tribe/bienvenida: degradado de mar propio (sin depender de una imagen),
   sol, línea de horizonte, radar con onda expansiva y botón central con
   pulso, avatares flotando suavemente. Todo en CSS + un icono SVG. */
.tribe-bienvenida-radar {
    width: 100%;
    aspect-ratio: 3 / 2;
    border-radius: var(--radio-lg);
    box-shadow: var(--shadow-card);
    overflow: hidden;
    background: linear-gradient(
        180deg,
        #dcf3f1 0%,
        #a3dcdd 38%,
        #6cc7cf 58%,
        #3a9fb0 100%
    );
}
.tribe-bienvenida-sol {
    position: absolute;
    top: 10%;
    right: 14%;
    width: 72px;
    height: 72px;
    border-radius: 50%;
    background: color-mix(in srgb, var(--text) 10%, transparent);
}
.tribe-bienvenida-sol::after {
    content: "";
    position: absolute;
    inset: 22%;
    border-radius: 50%;
    background: var(--periodo);
}
.tribe-bienvenida-horizonte {
    position: absolute;
    left: -5%;
    right: -5%;
    top: 40%;
    height: 3px;
    background: color-mix(in srgb, #fff 70%, transparent);
    opacity: 0.7;
    transform: rotate(-1.2deg);
}
.tribe-bienvenida-horizonte::before {
    content: "";
    position: absolute;
    inset: -8px 0;
    background: linear-gradient(180deg, transparent, color-mix(in srgb, #fff 25%, transparent), transparent);
}
.tribe-bienvenida-radar-nucleo {
    position: absolute;
    top: 52%;
    left: 50%;
    width: 140px;
    height: 140px;
    transform: translate(-50%, -50%);
}
.tribe-bienvenida-radar-anillo {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 60px;
    height: 60px;
    border-radius: 50%;
    border: 1.5px solid color-mix(in srgb, #fff 55%, transparent);
    transform: translate(-50%, -50%) scale(0.6);
    animation: tribeBienvenidaOnda 2.6s ease-out infinite;
}
.tribe-bienvenida-radar-anillo-2 {
    animation-delay: 1.3s;
}
@keyframes tribeBienvenidaOnda {
    0% {
        transform: translate(-50%, -50%) scale(0.6);
        opacity: 0.9;
    }
    100% {
        transform: translate(-50%, -50%) scale(2.2);
        opacity: 0;
    }
}
.tribe-bienvenida-radar-boton {
    position: absolute;
    top: 50%;
    left: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 60px;
    height: 60px;
    border-radius: 50%;
    background: var(--bg-card);
    color: var(--gradiente-inicio);
    box-shadow: var(--shadow-card);
    transform: translate(-50%, -50%);
    animation: tribeBienvenidaPulsoBoton 1.8s ease-in-out infinite;
}
.tribe-bienvenida-radar-boton svg {
    width: 24px;
    height: 24px;
}
@keyframes tribeBienvenidaPulsoBoton {
    0%, 100% {
        transform: translate(-50%, -50%) scale(1);
    }
    50% {
        transform: translate(-50%, -50%) scale(1.15);
    }
}
.tribe-bienvenida-avatares-flotantes span {
    position: absolute;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 34px;
    height: 34px;
    border-radius: 50%;
    color: #fff;
    font-weight: 700;
    font-size: 0.85rem;
    box-shadow: var(--shadow-card);
    border: 2px solid var(--bg-card);
    animation: tribeBienvenidaFlotar 3.6s ease-in-out infinite;
}
.tribe-bienvenida-avatares-flotantes span:nth-child(1) {
    top: 42%;
    left: 14%;
    background: #c5567a;
    animation-delay: 0s;
}
.tribe-bienvenida-avatares-flotantes span:nth-child(2) {
    top: 24%;
    right: 4%;
    background: #3d8a8a;
    animation-delay: 0.7s;
}
.tribe-bienvenida-avatares-flotantes span:nth-child(3) {
    bottom: 18%;
    right: 30%;
    background: #e8935a;
    animation-delay: 1.4s;
}
@keyframes tribeBienvenidaFlotar {
    0%, 100% {
        transform: translateY(0);
    }
    50% {
        transform: translateY(-6px);
    }
}
@media (prefers-reduced-motion: reduce) {
    .tribe-bienvenida-radar-anillo,
    .tribe-bienvenida-radar-boton,
    .tribe-bienvenida-avatares-flotantes span {
        animation: none;
    }
}
.tribe-bienvenida-chip {
    position: absolute;
    bottom: 12px;
    right: 12px;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 8px 14px;
    border-radius: var(--radio-boton);
    background: var(--bg-card);
    color: var(--text);
    font-size: 0.8rem;
    font-weight: 600;
    box-shadow: var(--shadow-card);
    transition: background 0.4s ease, color 0.4s ease;
}
/* Cuando el aviso de "hay coincidencias" ya es visible en el chat (ver
   FindTribeMatches::avisarNuevosMatchesAgregados y su visible_at retrasado
   30-60s a propósito) — notificaciones-polling.js detecta el no-leído de
   Tribe y añade esta clase para que la caja "salte" del mismo modo. */
.tribe-bienvenida-chip-encontrado {
    background: var(--gradiente-marca);
    color: #fff;
}
.tribe-bienvenida-chip-encontrado .tribe-bienvenida-chip-punto {
    background: #fff;
    animation: none;
}
.tribe-bienvenida-chip-punto {
    width: 7px;
    height: 7px;
    border-radius: 50%;
    background: var(--accent);
    flex-shrink: 0;
    animation: tribeBienvenidaPulso 1.6s ease-in-out infinite;
}
@keyframes tribeBienvenidaPulso {
    0%, 100% {
        opacity: 1;
    }
    50% {
        opacity: 0.3;
    }
}
.tribe-bienvenida-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: var(--espacio-4);
    margin-top: var(--espacio-4);
}
@media (max-width: 700px) {
    .tribe-bienvenida-grid {
        grid-template-columns: 1fr;
    }
}
.tribe-bienvenida-card {
    background: var(--bg-card);
    border-radius: var(--radio-lg);
    box-shadow: var(--shadow-card);
    padding: var(--espacio-4);
}
.tribe-bienvenida-card-cabecera {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: var(--espacio-2);
    margin-bottom: var(--espacio-4);
}
.tribe-bienvenida-card-cabecera h3 {
    margin: 0;
    font-size: 1.15rem;
}
.tribe-bienvenida-card-etiqueta {
    color: var(--text-muted);
    font-size: 0.8rem;
    white-space: nowrap;
}
.tribe-bienvenida-pasos {
    position: relative;
    display: flex;
    gap: var(--espacio-2);
    margin-bottom: var(--espacio-4);
}
.tribe-bienvenida-pasos::before {
    content: "";
    position: absolute;
    top: 18px;
    left: 18px;
    right: 18px;
    height: 1px;
    background: var(--border);
}
.tribe-bienvenida-paso {
    position: relative;
    flex: 1;
    text-align: center;
    padding: 0 4px;
}
.tribe-bienvenida-paso-numero {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 36px;
    height: 36px;
    margin: 0 auto var(--espacio-2);
    border-radius: 50%;
    background: color-mix(in srgb, var(--accent) 15%, var(--bg-card));
    border: 3px solid var(--bg-card);
    color: var(--accent);
    font-weight: 700;
}
.tribe-bienvenida-paso h4 {
    margin: 0 0 4px 0;
    font-size: 0.9rem;
}
.tribe-bienvenida-paso p {
    margin: 0;
    font-size: 0.78rem;
    color: var(--text-muted);
    line-height: 1.4;
}
.tribe-bienvenida-divisor {
    border: none;
    border-top: 1px solid var(--border);
    margin: 0 0 var(--espacio-3) 0;
}
.tribe-bienvenida-nota {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    color: var(--text-muted);
    font-size: 0.85rem;
    line-height: 1.5;
}
.tribe-bienvenida-nota-icono {
    flex-shrink: 0;
    margin-top: 2px;
    width: 18px;
    height: 18px;
    color: var(--accent);
}
.tribe-bienvenida-perfil-fila {
    display: flex;
    align-items: center;
    gap: 12px;
    margin-bottom: var(--espacio-4);
}
.tribe-bienvenida-perfil-fila .zoco-vendedor-avatar-inicial,
.tribe-bienvenida-perfil-fila .zoco-vendedor-avatar {
    width: 48px;
    height: 48px;
}
.tribe-bienvenida-perfil-fila .zoco-vendedor-avatar-inicial {
    font-size: 1.1rem;
}
.tribe-bienvenida-grupo {
    margin-bottom: var(--espacio-3);
}
.tribe-bienvenida-grupo:last-of-type {
    margin-bottom: var(--espacio-4);
}
.tribe-bienvenida-grupo .zoco-vendedor-etiqueta {
    display: block;
    margin-bottom: 8px;
}
.tribe-bienvenida-pills {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
}
.tribe-bienvenida-boton-editar {
    display: block;
    text-align: center;
}

/* =======================================================================
   dev/matches — maqueta estática de la pantalla de matches de Tribe.
   Reutiliza al máximo lo ya definido arriba (tarjeta, pills, divisor,
   nota, avatar, fila persona); solo lo genuinamente nuevo tiene clase.
======================================================================= */
/* Combinada con .modulo-oleaje-eyebrow (que ya pone block/mayúsculas/
   tamaño) — aquí solo se sobreescribe el color, para no pelearse con su
   "display: block" por orden de cascada. */
.tribe-matches-eyebrow {
    color: var(--gradiente-inicio);
}
.tribe-matches-eyebrow-punto {
    display: inline-block;
    width: 8px;
    height: 8px;
    margin-right: 6px;
    border-radius: 50%;
    background: var(--gradiente-inicio);
    vertical-align: middle;
}
.tribe-matches-stat {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    gap: 4px;
    background: color-mix(in srgb, var(--accent) 10%, var(--bg-card));
    border-radius: var(--radio-lg);
    padding: var(--espacio-4);
}
.tribe-matches-stat-emoji {
    font-size: 1.8rem;
    line-height: 1;
    margin-bottom: 4px;
}
.tribe-matches-stat-numero {
    font-weight: 700;
    font-size: 1.05rem;
}
.tribe-matches-stat-nota {
    color: var(--text-muted);
    font-size: 0.8rem;
}
.tribe-matches-tabs {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: var(--espacio-3);
    margin: var(--espacio-4) 0;
}
.tribe-matches-tabs-grupo {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
}
.tribe-matches-tabs-acciones {
    display: flex;
    flex-wrap: wrap;
    gap: var(--espacio-3);
    color: var(--text-muted);
    font-size: 0.85rem;
}
.tribe-matches-grid {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: var(--espacio-4);
}
@media (max-width: 700px) {
    .tribe-matches-grid {
        grid-template-columns: 1fr;
    }
}
.tribe-matches-cabecera-fila {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--espacio-2);
    margin-bottom: var(--espacio-3);
}
.tribe-matches-cabecera-pills {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    justify-content: flex-end;
    gap: 6px;
    flex-shrink: 0;
}
.tribe-matches-compatibilidad {
    padding: 3px 10px;
    border-radius: var(--radio-boton);
    background: color-mix(in srgb, var(--accent) 15%, var(--bg-card));
    color: var(--accent);
    font-size: 0.75rem;
    font-weight: 700;
    white-space: nowrap;
}
.tribe-matches-detalle {
    display: flex;
    flex-direction: column;
    gap: 8px;
    margin: var(--espacio-3) 0;
}
.tribe-matches-detalle-fila {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    font-size: 0.88rem;
    color: var(--text-muted);
}
.tribe-matches-detalle-fila svg {
    width: 18px;
    height: 18px;
    margin-top: 1px;
    color: var(--accent);
    flex-shrink: 0;
}
.tribe-matches-detalle-fila strong {
    color: var(--text);
    font-weight: 600;
}
.tribe-matches-acciones {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: var(--espacio-4);
    margin-top: var(--espacio-3);
}
.tribe-matches-pasar,
.tribe-matches-like {
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    flex-shrink: 0;
    cursor: pointer;
}
.tribe-matches-pasar {
    width: 56px;
    height: 56px;
    background: var(--bg-card);
    border: 1.5px solid var(--border);
    color: var(--text-muted);
}
.tribe-matches-pasar svg {
    width: 20px;
    height: 20px;
}
.tribe-matches-like {
    width: 64px;
    height: 64px;
    background: var(--gradiente-marca);
    border: none;
    color: #fff;
    box-shadow: 0 8px 20px var(--shadow-gradiente);
}
.tribe-matches-like svg {
    width: 28px;
    height: 28px;
}
.tribe-matches-pie {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: var(--espacio-3);
    margin-top: var(--espacio-4);
    padding-top: var(--espacio-3);
    border-top: 1px solid var(--border);
}
.tribe-matches-pie-derecha {
    color: var(--text-muted);
    font-size: 0.85rem;
}

/* Confeti de bienvenida a Tribe — piezas que caen desde arriba de la
   pantalla y se autodestruyen a los 5s (ver public/js/tribe-confeti.js). */
.confeti-contenedor {
    position: fixed;
    inset: 0;
    pointer-events: none;
    overflow: hidden;
    z-index: 9999;
}
.confeti-pieza {
    position: absolute;
    top: -20px;
    width: 8px;
    height: 14px;
    opacity: 0.9;
    animation-name: confeti-caer;
    animation-timing-function: linear;
    animation-fill-mode: forwards;
}
@keyframes confeti-caer {
    to {
        transform: translateY(110vh) rotate(var(--giro, 360deg));
        opacity: 0.3;
    }
}
.tribe-landing-imagen-vacia {
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--bg);
    border: 1.5px dashed var(--border);
    color: var(--text-muted);
    font-size: 0.9rem;
}
.tribe-opciones {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
    gap: 8px 16px;
    margin-top: var(--espacio-2);
}
.tribe-opciones-ancho {
    grid-template-columns: 1fr;
}
.tribe-otro-deporte-campo {
    margin-top: var(--espacio-2);
    display: flex;
    flex-direction: column;
    gap: 4px;
}
.tribe-otro-deporte-campo[hidden] {
    display: none;
}
.tribe-otro-deporte-campo label {
    font-size: 0.78rem;
    font-weight: 600;
    color: var(--text-muted);
}
.tribe-zona-titulo {
    font-weight: 600;
    font-size: 1.2rem;
    color: var(--text-muted);
    margin-top: var(--espacio-3);
    margin-bottom: 0;
}
.tribe-zona-titulo:first-of-type {
    margin-top: var(--espacio-2);
}
.perfil-campo {
    display: flex;
    flex-direction: column;
    gap: var(--espacio-2);
    padding-bottom: var(--espacio-4);
    border-bottom: 1px solid var(--border);
}
.perfil-campo-titulo {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 8px;
}
.perfil-campo-titulo label {
    margin-bottom: 0;
}
.perfil-badge-obligatorio {
    font-size: 0.7rem;
    font-weight: 700;
    color: var(--gradiente-inicio);
    text-transform: uppercase;
    letter-spacing: 0.03em;
    white-space: nowrap;
    flex-shrink: 0;
}
.tribe-paso-indicador {
    font-size: 0.78rem;
    font-weight: 700;
    color: var(--gradiente-inicio);
    text-transform: uppercase;
    letter-spacing: 0.03em;
    margin: 0 0 var(--espacio-3) 0;
}
.tribe-paso-acciones {
    display: flex;
    align-items: stretch;
    gap: 12px;
    margin-top: var(--espacio-4);
}
.tribe-paso-acciones > * {
    flex: 1;
    margin-top: 0;
    padding: 13px 20px;
    font-size: 0.95rem;
    text-align: center;
}
.tribe-disponibilidad-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 16px;
    margin-top: var(--espacio-2);
}
@media (max-width: 500px) {
    .tribe-disponibilidad-grid {
        grid-template-columns: 1fr;
    }
}
.tribe-disponibilidad-etiqueta {
    font-size: 0.78rem;
    font-weight: 600;
    color: var(--text-muted);
    margin: 0 0 4px 0;
}
.tribe-resumen-titulo-fila {
    display: flex;
    align-items: baseline;
    flex-wrap: wrap;
    gap: 10px;
}
.tribe-resumen-editar {
    color: var(--gradiente-inicio);
    font-size: 0.85rem;
    font-weight: 600;
    text-decoration: none;
}
.tribe-resumen-editar:hover {
    text-decoration: underline;
}
.tribe-resumen {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: var(--espacio-4);
    align-items: start;
}
/* Perfil público: la foto ocupa un tercio de la caja, no la mitad — el
   detalle de un match (tribe/matches/show.blade.php) sigue con 1fr 1fr. */
.tribe-resumen-foto-tercio {
    grid-template-columns: 1fr 2fr;
}
@media (max-width: 600px) {
    .tribe-resumen {
        grid-template-columns: 1fr;
    }
}
.tribe-resumen-foto {
    width: 100%;
    aspect-ratio: 1 / 1;
    border-radius: var(--radio-lg);
    object-fit: cover;
}
.tribe-resumen-info {
    display: flex;
    flex-direction: column;
    gap: 20px;
}
.tribe-resumen-saludo {
    margin: 0;
    font-size: 1.05rem;
    font-weight: 600;
    color: var(--text);
}
.tribe-resumen-info:only-child {
    grid-column: 1 / -1;
}
.tribe-resumen-fila {
    display: flex;
    flex-direction: column;
    gap: 4px;
}
.tribe-resumen-etiqueta {
    font-size: 1rem;
    font-weight: 600;
    color: var(--text-muted);
}
.tribe-opciones .auth-checkbox {
    margin-top: 0;
}
.tribe-matches-lista {
    display: flex;
    flex-direction: column;
    gap: 10px;
}
.tribe-match-fila {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 12px 14px;
    background: var(--bg-card);
    border-radius: var(--radio-lg);
    text-decoration: none;
    color: inherit;
    box-shadow: var(--shadow-card);
}
.tribe-match-info {
    display: flex;
    flex-direction: column;
    gap: 2px;
}
.tribe-match-nombre {
    font-weight: 600;
    color: var(--text);
}
.tribe-match-nivel {
    font-size: 0.8rem;
    color: var(--text-muted);
}
.tribe-match-dato {
    margin: 0 0 10px 0;
    font-size: 0.9rem;
}
.tribe-match-dato strong {
    color: var(--text-muted);
    font-weight: 600;
}

/* =======================================================================
   Páginas de error (404/500) — resources/views/errors/
======================================================================= */
.error-pagina {
    max-width: 100%;
    margin: 0 auto;
    padding: var(--espacio-5) 20px;
    text-align: center;
}
.error-ola {
    width: 90px;
    height: 90px;
    margin: 0 auto var(--espacio-3);
}
.error-codigo {
    margin: 0;
    font-family: "Outfit", sans-serif;
    font-size: 5.5rem;
    font-weight: 800;
    line-height: 1;
    background: var(--gradiente-marca);
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
}
.error-titulo {
    margin: var(--espacio-2) 0 var(--espacio-1);
    font-size: 1.5rem;
}
.error-texto {
    color: var(--text-muted);
    margin-bottom: var(--espacio-4);
}
.error-acciones {
    display: flex;
    justify-content: center;
    flex-wrap: wrap;
    gap: var(--espacio-3);
}

/* =======================================================================
   legal/acerca-de — página "Acerca de SurfBCN"
   ======================================================================= */
.acerca-pagina {
    display: flex;
    flex-direction: column;
    gap: var(--espacio-4);
}
.acerca-seccion {
    padding-bottom: var(--espacio-4);
    border-bottom: 1px solid var(--border);
}
.acerca-seccion:last-of-type {
    border-bottom: none;
    padding-bottom: 0;
}
.acerca-seccion h3 {
    margin: 0 0 var(--espacio-2) 0;
    font-size: 1.15rem;
}
.acerca-seccion p {
    color: var(--text-muted);
    margin: 0 0 var(--espacio-2) 0;
}
.acerca-seccion p:last-child {
    margin-bottom: 0;
}
.acerca-cierre {
    text-align: center;
    padding-top: var(--espacio-2);
}
.acerca-cierre-frase {
    font-size: 1.1rem;
    margin: 0 0 var(--espacio-1) 0;
}

/* =======================================================================
   tribe/partials/proximas-sesiones-preview — snippet estático provisional,
   guarda el diseño acordado mientras se define la funcionalidad real.
======================================================================= */
.tribe-sesiones-caja {
    position: relative;
    background: var(--bg-card);
    border-radius: var(--radio-lg);
    padding: var(--espacio-3);
    box-shadow: var(--shadow-card);
    margin-top: var(--espacio-4);
}
.tribe-sesiones-cabecera {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: var(--espacio-3);
}
.tribe-sesiones-titulo {
    margin: 0;
    font-size: 1.3rem;
}
.tribe-sesiones-anadir {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    border-radius: var(--radio);
    background: var(--bg);
    color: var(--text);
    font-size: 1.4rem;
    line-height: 1;
    flex-shrink: 0;
}
.tribe-sesiones-lista {
    display: flex;
    flex-direction: column;
    gap: var(--espacio-3);
}
.tribe-sesion-fila {
    display: flex;
    gap: var(--espacio-3);
    padding: var(--espacio-3);
    border: 1px solid var(--border);
    border-radius: var(--radio-lg);
}
.tribe-sesion-fila-destacada {
    border-color: var(--gradiente-inicio);
    background: color-mix(in srgb, var(--gradiente-inicio) 6%, var(--bg-card));
}
.tribe-sesion-hora {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    min-width: 78px;
    padding-right: var(--espacio-3);
    border-right: 1px solid var(--border);
}
.tribe-sesion-hora-valor {
    font-size: 1.5rem;
    font-weight: 700;
    line-height: 1.1;
}
.tribe-sesion-hora-fecha {
    margin-top: var(--espacio-1);
    font-size: 0.75rem;
    font-weight: 700;
    letter-spacing: 0.03em;
    color: var(--text-muted);
}
.tribe-sesion-info {
    display: flex;
    flex-direction: column;
    gap: 4px;
    flex: 1;
}
.tribe-sesion-nombre {
    font-weight: 700;
    font-size: 1.05rem;
}
.tribe-sesion-lugar {
    color: var(--text-muted);
    font-size: 0.9rem;
}
.tribe-sesion-avatares {
    display: flex;
    align-items: center;
    margin-top: var(--espacio-1);
}
.tribe-sesion-avatar {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    border-radius: 50%;
    color: #fff;
    font-size: 0.8rem;
    font-weight: 700;
    border: 2px solid var(--bg-card);
    margin-left: -8px;
}
.tribe-sesion-avatar:first-child {
    margin-left: 0;
}
.tribe-sesiones-fila-destacada .tribe-sesion-avatar {
    border-color: color-mix(in srgb, var(--gradiente-inicio) 6%, var(--bg-card));
}
.tribe-sesion-avatares-mas {
    margin-left: var(--espacio-2);
    color: var(--text-muted);
    font-size: 0.85rem;
}
.tribe-sesion-boton {
    align-self: flex-start;
    margin-top: var(--espacio-2);
    padding: 8px 20px;
    font-size: 0.9rem;
}
.tribe-sesion-abierta {
    margin-top: var(--espacio-1);
    color: var(--accent);
    font-weight: 700;
    font-size: 0.9rem;
}
/* Snippet oscuro: mismo fondo navy + degradados azul→rosa que usamos en la
   landing de Founding Surfer, para los bloques de la home que queremos que
   destaquen más (boletín de alertas / "hoy no hay olas"). Modificador sobre
   .inicio-snippet, no toca el resto de tarjetas. */
.inicio-snippet-oscuro {
    position: relative;
    overflow: hidden;
    background:
        radial-gradient(circle at 12% 15%, rgba(31, 111, 168, 0.45), transparent 55%),
        radial-gradient(circle at 88% 85%, rgba(227, 26, 131, 0.4), transparent 55%),
        linear-gradient(160deg, #0d1b2a, #132a3d);
}
.inicio-snippet-oscuro .inicio-snippet-titulo,
.inicio-snippet-oscuro .inicio-snippet-imagen-texto {
    position: relative;
    z-index: 1;
}
.inicio-snippet-oscuro .inicio-snippet-titulo {
    color: #fff;
}
.inicio-snippet-oscuro .perfil-texto-ayuda {
    color: rgba(224, 230, 237, 0.8);
}
.inicio-snippet-oscuro .inicio-snippet-imagen {
    box-shadow: 0 8px 30px rgba(0, 0, 0, 0.35);
}

/* =======================================================================
   tribe/partials/planes-cerca-de-ti — snippet estático provisional, mismo
   espíritu que proximas-sesiones-preview justo arriba: puro maquetado,
   sin datos reales. Reutiliza .tribe-sesion-fila/-hora/-avatar y
   .boton-cta/-contorno donde encajan, solo añade lo que falta.
======================================================================= */
.tribe-planes {
    margin-top: var(--espacio-4);
}
.tribe-planes-cabecera {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: var(--espacio-3);
    margin-bottom: var(--espacio-3);
}
.tribe-planes-titulo {
    margin-bottom: 6px;
}
.tribe-planes-subtitulo {
    margin: 0;
    color: var(--text-muted);
    max-width: 46ch;
}
.tribe-planes-boton-proponer {
    flex-shrink: 0;
    white-space: nowrap;
}

.tribe-planes-banner {
    display: flex;
    align-items: center;
    gap: var(--espacio-3);
    background: var(--bg-card);
    border-radius: var(--radio-lg);
    padding: var(--espacio-3);
    box-shadow: var(--shadow-card);
    margin-bottom: var(--espacio-3);
}
.tribe-planes-banner-icono {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 56px;
    height: 56px;
    border-radius: 50%;
    background: color-mix(in srgb, var(--accent) 15%, var(--bg-card));
    color: var(--accent);
    font-size: 1.4rem;
    flex-shrink: 0;
}
.tribe-planes-banner-texto {
    flex: 1;
    min-width: 200px;
}
.tribe-planes-banner-eyebrow {
    display: block;
    color: var(--accent);
    font-size: 0.75rem;
    font-weight: 700;
    letter-spacing: 0.04em;
    margin-bottom: 2px;
}
.tribe-planes-banner-titular {
    display: block;
    font-size: 1.2rem;
}
.tribe-planes-banner-subtexto {
    margin: 2px 0 0;
    color: var(--text-muted);
    font-size: 0.9rem;
}
.tribe-planes-banner-boton {
    flex-shrink: 0;
    white-space: nowrap;
}

.tribe-planes-filtros {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: var(--espacio-2);
    margin-bottom: var(--espacio-3);
}
.tribe-planes-filtros-grupo {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
}
.tribe-planes-filtro {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 8px 16px;
    border-radius: var(--radio-boton);
    border: 1px solid var(--border);
    background: var(--bg-card);
    color: var(--text-muted);
    font-size: 0.85rem;
    font-weight: 600;
    white-space: nowrap;
}
.tribe-planes-filtro-activo {
    background: color-mix(in srgb, var(--accent) 15%, var(--bg-card));
    border-color: var(--accent);
    color: var(--accent);
}
.tribe-planes-filtro-fecha {
    color: var(--text);
}
.tribe-planes-filtro-ancho {
    display: flex;
    justify-content: space-between;
    width: 100%;
}

.tribe-planes-contador {
    color: var(--text-muted);
    font-size: 0.85rem;
}

/* Fila de plan: mismo .tribe-sesion-fila de siempre, pero en 3 columnas
   (hora / info / lateral con avatares+botón) en vez de 2. */
.tribe-plan-fila {
    align-items: flex-start;
}
.tribe-plan-deporte {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    color: var(--text-muted);
    font-size: 0.72rem;
    font-weight: 700;
    letter-spacing: 0.03em;
}
.tribe-plan-deporte-icono {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 20px;
    height: 20px;
    border-radius: 6px;
    color: #fff;
    font-size: 0.75rem;
    flex-shrink: 0;
}
.tribe-plan-tags {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    margin-top: 4px;
}
.tribe-plan-tag {
    padding: 3px 10px;
    border-radius: var(--radio-boton);
    background: var(--bg);
    color: var(--text-muted);
    font-size: 0.75rem;
    font-weight: 600;
}
.tribe-plan-lateral {
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    gap: 6px;
    flex-shrink: 0;
}
.tribe-plan-personas {
    color: var(--text-muted);
    font-size: 0.8rem;
}

.tribe-planes-inferior {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: var(--espacio-3);
    margin-top: var(--espacio-3);
}
.tribe-planes-caja-inferior {
    background: var(--bg-card);
    border-radius: var(--radio-lg);
    padding: var(--espacio-3);
    box-shadow: var(--shadow-card);
}
.tribe-planes-persona {
    display: flex;
    align-items: center;
    gap: var(--espacio-2);
    margin: var(--espacio-2) 0 var(--espacio-3);
}
.tribe-planes-persona-info {
    display: flex;
    flex-direction: column;
    gap: 2px;
}
.tribe-planes-botones {
    display: flex;
    gap: 8px;
    flex-wrap: wrap;
}
.tribe-planes-boton-destacado {
    background:
        linear-gradient(color-mix(in srgb, var(--accent) 10%, var(--bg-card)), color-mix(in srgb, var(--accent) 10%, var(--bg-card))) padding-box,
        var(--gradiente-marca) border-box;
}

@media (max-width: 700px) {
    .tribe-planes-inferior {
        grid-template-columns: 1fr;
    }
    .tribe-plan-fila {
        flex-direction: column;
    }
    .tribe-plan-fila .tribe-sesion-hora {
        flex-direction: row;
        align-items: baseline;
        gap: 8px;
        border-right: none;
        border-bottom: 1px solid var(--border);
        padding-right: 0;
        padding-bottom: var(--espacio-2);
        margin-bottom: var(--espacio-2);
        width: 100%;
    }
    .tribe-plan-lateral {
        align-items: flex-start;
        width: 100%;
    }
    .tribe-planes-banner {
        flex-wrap: wrap;
    }
}

/* =======================================================================
   components/home/modulo-oleaje — módulo "Oleaje actual" de la home.
======================================================================= */
.modulo-oleaje {
    background: var(--bg-card);
    border-radius: var(--radio-lg);
    padding: var(--espacio-4);
    box-shadow: var(--shadow-card);
}
.modulo-oleaje-cabecera {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    gap: var(--espacio-3);
    padding-bottom: var(--espacio-3);
    margin-bottom: var(--espacio-3);
    border-bottom: 1px solid var(--border);
}
.modulo-oleaje-eyebrow {
    display: block;
    color: var(--accent);
    font-size: 0.75rem;
    font-weight: 700;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    margin-bottom: 4px;
}
.modulo-oleaje-titulo {
    margin: 0;
    font-size: 1.6rem;
}
.modulo-oleaje-fecha {
    display: block;
    color: var(--text-muted);
    margin-top: 4px;
}
.modulo-oleaje-ubicacion {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    flex-shrink: 0;
    background: var(--bg);
    border-radius: var(--radio-boton);
    padding: 8px 16px;
    font-weight: 600;
    font-size: 0.9rem;
}
.modulo-oleaje-punto {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: var(--color-prob, var(--accent2));
    flex-shrink: 0;
}
.modulo-oleaje-panel {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: var(--espacio-3);
    background: color-mix(in srgb, var(--color-prob) 10%, var(--bg-card));
    border: 1px solid color-mix(in srgb, var(--color-prob) 30%, transparent);
    border-radius: var(--radio-lg);
    padding: var(--espacio-3);
    margin-bottom: var(--espacio-3);
}
.gauge-probabilidad {
    position: relative;
    width: 92px;
    height: 92px;
    border-radius: 50%;
    background: conic-gradient(var(--color-prob) calc(var(--pct) * 1%), color-mix(in srgb, var(--color-prob) 15%, var(--border)) 0);
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
}
.gauge-probabilidad::before {
    content: '';
    position: absolute;
    inset: 8px;
    border-radius: 50%;
    background: color-mix(in srgb, var(--color-prob) 10%, var(--bg-card));
}
.gauge-valor {
    position: relative;
    font-size: 1.4rem;
    font-weight: 700;
}
.modulo-oleaje-panel-texto {
    flex: 1;
    min-width: 200px;
}
.modulo-oleaje-etiqueta {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    color: var(--color-prob);
    font-size: 0.75rem;
    font-weight: 700;
    letter-spacing: 0.03em;
}
.modulo-oleaje-panel-titular {
    margin: 4px 0 2px;
    font-size: 1.3rem;
}
.modulo-oleaje-panel-subtexto {
    margin: 0;
    color: var(--text-muted);
    font-size: 0.9rem;
}
.modulo-oleaje-mejor-momento {
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding-left: var(--espacio-3);
    border-left: 1px solid color-mix(in srgb, var(--color-prob) 30%, transparent);
    flex-shrink: 0;
}
.modulo-oleaje-mejor-momento-etiqueta {
    color: var(--text-muted);
    font-size: 0.8rem;
}
.modulo-oleaje-mejor-momento-valor {
    font-weight: 700;
}
.modulo-oleaje-cajas {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: var(--espacio-3);
}
.modulo-oleaje-caja {
    background: var(--bg);
    border-radius: var(--radio);
    padding: var(--espacio-3);
}
.modulo-oleaje-caja-cabecera {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: var(--espacio-2);
}
.modulo-oleaje-caja-etiqueta {
    color: var(--text-muted);
    font-size: 0.75rem;
    font-weight: 700;
    letter-spacing: 0.04em;
    text-transform: uppercase;
}
.modulo-oleaje-caja-icono {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 30px;
    height: 30px;
    border-radius: 8px;
    background: color-mix(in srgb, var(--accent) 15%, transparent);
    flex-shrink: 0;
}
.modulo-oleaje-caja-icono svg {
    width: 16px;
    height: 16px;
    fill: none;
    stroke: var(--accent);
    stroke-width: 2;
    stroke-linecap: round;
    stroke-linejoin: round;
}
.modulo-oleaje-caja-valor {
    display: flex;
    align-items: baseline;
    gap: 8px;
    font-size: 1.3rem;
    font-weight: 700;
    margin-bottom: 4px;
}
.modulo-oleaje-caja-flecha {
    display: inline-flex;
    align-items: center;
    gap: 3px;
    font-size: 0.75rem;
    font-weight: 600;
    color: var(--text-muted);
}
.modulo-oleaje-caja-flecha svg {
    width: 14px;
    height: 14px;
    fill: var(--text-muted);
    transform: rotate(calc(var(--deg) + 180deg));
}
.modulo-oleaje-caja-descripcion {
    display: block;
    color: var(--text-muted);
    font-size: 0.82rem;
}
.modulo-oleaje-pie {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: var(--espacio-2);
    margin-top: var(--espacio-3);
}
.modulo-oleaje-actualizado {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    color: var(--text-muted);
    font-size: 0.82rem;
}
.modulo-oleaje-actualizado .modulo-oleaje-punto {
    background: var(--accent);
}
.modulo-oleaje-boton {
    display: inline-flex;
    align-items: center;
    gap: 8px;
}
.modulo-oleaje-boton svg {
    width: 16px;
    height: 16px;
}
@media (max-width: 700px) {
    .modulo-oleaje-cajas {
        grid-template-columns: 1fr;
    }
    .modulo-oleaje-mejor-momento {
        border-left: none;
        border-top: 1px solid color-mix(in srgb, var(--color-prob) 30%, transparent);
        padding-left: 0;
        padding-top: var(--espacio-2);
        width: 100%;
    }
}

/* =======================================================================
   previsiones/index — una sola tarjeta de hora a la vez (cabecera con
   flechas de día, resumen diario, tarjeta de la hora activa, tira de horas
   abajo para cambiarla sin recargar — ver public/js/prevision-navegacion.js).
   Mismo lenguaje visual que components/home/modulo-oleaje: gauge circular
   + cajas planas para Altura/Viento/Periodo.
======================================================================= */
.prevision-nueva {
    display: flex;
    flex-direction: column;
    gap: var(--espacio-3);
}
.prevision-cabecera {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--espacio-3);
    margin-bottom: var(--espacio-3);
    padding-bottom: var(--espacio-3);
    border-bottom: 1px solid var(--border);
}
.prevision-flecha {
    width: 40px;
    height: 40px;
    border-radius: 50%;
    border: 0;
    background: var(--bg);
    color: var(--text);
    font-size: 1.4rem;
    line-height: 1;
    cursor: pointer;
    flex-shrink: 0;
    display: flex;
    align-items: center;
    justify-content: center;
}
.prevision-flecha:disabled {
    opacity: 0.3;
    cursor: default;
}
.prevision-cabecera-texto {
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    gap: 2px;
}
.prevision-cabecera-fecha {
    font-weight: 700;
    font-size: 1.1rem;
}
.prevision-cabecera-actualizado {
    color: var(--text-muted);
    font-size: 0.8rem;
}

.prevision-resumen {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    align-items: center;
    gap: var(--espacio-3);
    margin-top: var(--espacio-3);
    padding-top: var(--espacio-3);
    border-top: 1px solid var(--border);
}
.prevision-resumen-clima {
    display: flex;
    flex-direction: column;
    gap: 6px;
}
.prevision-resumen-clima-fila {
    display: flex;
    align-items: center;
    gap: 8px;
}
.prevision-resumen-clima-icono {
    font-size: 2.1rem;
    line-height: 1;
}
.prevision-resumen-eyebrow {
    display: block;
    color: var(--text-muted);
    font-size: 0.68rem;
    font-weight: 700;
    letter-spacing: 0.03em;
    text-transform: uppercase;
    margin-bottom: 2px;
}
.prevision-resumen-clima-texto {
    display: block;
    font-size: 1rem;
}
.prevision-resumen-item {
    padding-left: var(--espacio-3);
    border-left: 1px solid var(--border);
}
.prevision-resumen-item strong {
    display: block;
    font-size: 1rem;
}
.prevision-resumen-traje {
    display: block;
    color: var(--text-muted);
    font-size: 0.78rem;
    margin-top: 2px;
}

.prevision-hora-tarjeta {
    background: var(--bg-card);
    border-radius: var(--radio-lg);
    padding: var(--espacio-4);
    box-shadow: var(--shadow-card);
}
.prevision-hora-tarjeta.fila-buena {
    background: color-mix(in srgb, var(--green) 20%, var(--bg-card));
}
.prevision-hora-tarjeta.fila-aceptable {
    background: color-mix(in srgb, var(--green) 10%, var(--bg-card));
}
.prevision-hora-cabecera {
    display: flex;
    align-items: center;
    gap: var(--espacio-3);
    margin-bottom: var(--espacio-3);
}
.prevision-hora-hora {
    flex-shrink: 0;
}
.prevision-hora-boton-amigo {
    background: var(--gradiente-marca);
}
.prevision-hora-boton-amigo:hover {
    background: var(--gradiente-marca);
    filter: brightness(1.08);
}
.prevision-hora-boton-amigo svg {
    fill: #fff;
}
.prevision-hora-valor {
    display: block;
    font-size: 2rem;
    font-weight: 700;
    line-height: 1.1;
}
.prevision-hora-momento {
    display: block;
    color: var(--text-muted);
    font-size: 0.85rem;
    margin-top: 2px;
    white-space: nowrap;
}
.prevision-hora-probabilidad {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: var(--espacio-3);
    background: color-mix(in srgb, var(--color-prob) 10%, var(--bg-card));
    border: 1px solid color-mix(in srgb, var(--color-prob) 30%, transparent);
    border-radius: var(--radio-lg);
    padding: var(--espacio-3);
    margin-bottom: var(--espacio-3);
}
.prevision-hora-probabilidad-texto {
    flex: 1;
    min-width: 180px;
}
.prevision-hora-probabilidad-etiqueta {
    display: block;
    color: var(--color-prob);
    font-size: 0.75rem;
    font-weight: 700;
    letter-spacing: 0.03em;
    margin-bottom: 4px;
}
.prevision-hora-probabilidad-titular {
    display: block;
    font-size: 1.2rem;
}
.prevision-hora-probabilidad-subtexto {
    margin: 4px 0 0;
    color: var(--text-muted);
    font-size: 0.88rem;
}
.prevision-hora-extra {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: var(--espacio-2);
    margin-top: var(--espacio-3);
    padding-top: var(--espacio-3);
    border-top: 1px solid var(--border);
}
.prevision-hora-extra > div {
    display: flex;
    flex-direction: column;
    gap: 2px;
}
.prevision-hora-extra span {
    color: var(--text-muted);
    font-size: 0.7rem;
    font-weight: 700;
    letter-spacing: 0.03em;
    text-transform: uppercase;
}
.prevision-hora-extra strong {
    font-size: 0.92rem;
}

.prevision-tira-dia {
    display: flex;
    flex: 1;
    justify-content: center;
    gap: 6px;
    overflow-x: auto;
    min-width: 0;
    padding: 2px;
    -webkit-overflow-scrolling: touch;
}
.prevision-tira-boton {
    flex-shrink: 0;
    padding: 5px 9px;
    border-radius: var(--radio-boton);
    border: 1px solid var(--border);
    background: var(--bg);
    color: var(--text-muted);
    font-weight: 600;
    font-size: 0.72rem;
    cursor: pointer;
}
.prevision-tira-boton[data-activo] {
    background: var(--gradiente-marca);
    border-color: transparent;
    color: #fff;
}

.prevision-fila-cajas {
    flex: 1;
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: var(--espacio-2);
    min-width: 0;
}
.prevision-fila-caja {
    background: var(--bg);
    border-radius: var(--radio);
    padding: 10px 12px;
}
.prevision-fila-caja-etiqueta {
    display: block;
    color: var(--text-muted);
    font-size: 0.7rem;
    font-weight: 700;
    letter-spacing: 0.03em;
    text-transform: uppercase;
    margin-bottom: 4px;
}
.prevision-fila-caja-valor {
    display: flex;
    align-items: baseline;
    flex-wrap: wrap;
    gap: 6px;
    font-weight: 700;
    font-size: 1.05rem;
}
.prevision-fila-caja-flecha {
    display: inline-flex;
    align-items: center;
    gap: 2px;
    font-size: 0.75rem;
    font-weight: 600;
    color: var(--accent);
}
.prevision-fila-caja-flecha svg {
    width: 13px;
    height: 13px;
    fill: var(--accent);
    transform: rotate(calc(var(--deg) + 180deg));
}
.prevision-fila-caja-descripcion {
    font-size: 0.75rem;
    font-weight: 600;
    color: var(--accent);
}
.prevision-nota-compartir {
    text-align: center;
    color: var(--text-muted);
    font-size: 0.85rem;
    margin-top: var(--espacio-3);
}
@media (max-width: 600px) {
    .prevision-cabecera-fecha {
        font-size: 1rem;
    }
    .prevision-hora-cabecera {
        flex-wrap: wrap;
    }
    .prevision-hora-hora {
        order: 1;
    }
    .prevision-hora-boton-amigo {
        order: 2;
        margin-left: auto;
    }
    .prevision-tira-dia {
        order: 3;
        flex-basis: 100%;
        /* Centrado (como en escritorio) recortaría el primer botón: en
           móvil no caben los 6 sin scroll, así que empieza por la izquierda. */
        justify-content: flex-start;
    }
    /* En vez de apilar clima/amanecer/atardecer/agua/UV en una columna
       (mucho scroll), en móvil van en un grid de 2 — igual que ya hace
       .prevision-hora-extra más abajo en la misma tarjeta. */
    .prevision-resumen {
        display: grid;
        grid-template-columns: 1fr 1fr;
        gap: var(--espacio-3) var(--espacio-3);
    }
    .prevision-resumen-item {
        border-left: none;
        padding-left: 0;
    }
    .prevision-hora-tarjeta {
        padding: var(--espacio-3);
    }
    .prevision-fila-cajas {
        grid-template-columns: repeat(2, 1fr);
    }
    .prevision-hora-extra {
        grid-template-columns: repeat(2, 1fr);
    }
}

/* =======================================================================
   dev/iconos-deportes — página temporal de revisión, no enlazada en menús.
======================================================================= */
.iconos-deportes-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
    gap: var(--espacio-3);
    margin-top: var(--espacio-4);
}
.iconos-deportes-item {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: var(--espacio-2);
    background: var(--bg-card);
    border-radius: var(--radio-lg);
    padding: var(--espacio-4) var(--espacio-2);
    box-shadow: var(--shadow-card);
    text-align: center;
}
.iconos-deportes-icono {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 80px;
    height: 80px;
    border-radius: 18px;
    background: color-mix(in srgb, var(--accent) 12%, var(--bg-card));
    color: var(--accent);
}
.iconos-deportes-icono svg {
    width: 48px;
    height: 48px;
}
.iconos-deportes-nombre {
    font-weight: 600;
    font-size: 0.9rem;
}

/* =======================================================================
   dev/iconos-deportes — sección "guía de estilo" añadida a la misma
   página temporal: referencia rápida de color/tipografía/componentes ya
   usados en el resto del sitio, para no reinventar patrones.
======================================================================= */
.styleguide-seccion {
    margin-top: var(--espacio-5);
}
.styleguide-seccion-titulo {
    margin: 0 0 4px 0;
    font-size: 1.2rem;
}
.styleguide-seccion-nota {
    color: var(--text-muted);
    font-size: 0.9rem;
    margin: 0 0 var(--espacio-3) 0;
}
.styleguide-codigo {
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 0.8rem;
    background: var(--bg);
    color: var(--text-muted);
    padding: 2px 6px;
    border-radius: 6px;
}
.styleguide-swatches {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
    gap: var(--espacio-3);
}
.styleguide-swatch {
    display: flex;
    flex-direction: column;
    gap: 6px;
}
.styleguide-swatch-color {
    height: 56px;
    border-radius: var(--radio);
    border: 1px solid var(--border);
}
.styleguide-swatch-nombre {
    font-weight: 600;
    font-size: 0.85rem;
}
.styleguide-muestra {
    background: var(--bg-card);
    border-radius: var(--radio-lg);
    box-shadow: var(--shadow-card);
    padding: var(--espacio-4);
}
.styleguide-muestra + .styleguide-muestra {
    margin-top: var(--espacio-3);
}
.styleguide-fila {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--espacio-3);
}
.styleguide-fila-tipografia > * {
    margin: 0 0 var(--espacio-2) 0;
}
.styleguide-avatares {
    display: flex;
    align-items: center;
    gap: var(--espacio-3);
}
