/**
 * 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;
    flex-direction: column;
    align-items: flex-start;
    gap: 6px;
    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;
    /* Puede partirse en dos líneas en móvil (fecha larga). */
    max-width: 100%;
}
.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);
}
/* Crédito + enlace "Ver webcam en directo" a la derecha, mismo tamaño de letra. */
.webcam-credito-con-enlace {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    flex-wrap: wrap;
    gap: 4px 12px;
}
.webcam-credito-enlace {
    color: var(--accent2);
    font-weight: 600;
    text-decoration: none;
}
.webcam-credito-enlace:hover {
    text-decoration: underline;
}
.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 h2 {
    margin: 0 0 10px 0;
    font-size: var(--fs-titulo-seccion);
}
.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;
}
.modal-tribe {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    width: 100%;
    margin-top: 22px;
    padding: 13px 20px;
    font-size: 0.95rem;
}
.modal-tribe svg {
    width: 20px;
    height: 20px;
}
.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;
}

/* Modal de paywall (3 días gratis de Previsiones) — mismo .modal-overlay
   de arriba, contenido propio. */
.modal-paywall {
    position: relative;
    background: var(--bg-card);
    border-radius: 16px;
    padding: 30px 24px 24px 24px;
    max-width: 380px;
    width: 100%;
    text-align: center;
    box-shadow: 0 10px 40px rgba(0, 0, 0, 0.35);
}
.modal-paywall-candado {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 76px;
    height: 76px;
    margin: 0 auto 16px auto;
    border-radius: 50%;
    background: color-mix(in srgb, var(--accent) 15%, var(--bg-card));
}
.modal-paywall-candado svg {
    width: 32px;
    height: 32px;
    color: var(--gradiente-inicio);
}
.modal-paywall-badge {
    display: inline-block;
    padding: 4px 12px;
    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;
    margin-bottom: 12px;
}
.modal-paywall h2 {
    margin: 0 0 10px 0;
    font-size: var(--fs-titulo-seccion);
}
.modal-paywall p {
    color: var(--text-muted);
    font-size: 0.92rem;
    line-height: 1.45;
    margin: 0 0 20px 0;
}
.modal-paywall-acciones {
    display: flex;
    flex-direction: column;
    gap: 10px;
}
.modal-paywall-acciones .boton-cta,
.modal-paywall-acciones .boton-cta-contorno {
    display: block;
}
.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: var(--fs-titulo-pagina);
}
.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);
}
/* En los formularios de acceso el texto de las casillas va más pequeño y
   sin negrita (el label global es grande y en negrita). */
.auth-form .auth-checkbox {
    font-size: 0.85rem;
    font-weight: 400;
}
.auth-boton {
    margin-top: var(--espacio-4);
    background: var(--gradiente-marca);
    color: #fff;
    border: none;
    display: inline-block;
    text-align: center;
    text-decoration: none; /* también se usa en enlaces (<a>) */
    padding: var(--boton-pad-y) var(--boton-pad-x);
    border-radius: var(--radio-boton);
    font-weight: var(--fw-boton);
    font-size: var(--fs-boton);
    line-height: var(--lh-boton);
    cursor: pointer;
    transition: filter 0.15s ease, transform 0.1s ease;
}
.auth-boton:hover {
    filter: brightness(1.08);
}
.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: calc(var(--boton-pad-y) - 1.5px) calc(var(--boton-pad-x) - 1.5px);
    border-radius: var(--radio-boton);
    font-weight: var(--fw-boton);
    font-size: var(--fs-boton);
    line-height: var(--lh-boton);
    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: var(--fs-titulo-seccion);
}
.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 propio: cabecera con menú ⋯ (solo móvil), estado de visibilidad y
   acciones al pie de la caja (solo escritorio). */
.perfil-info-cabecera {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--espacio-3);
    align-self: stretch;
}
.perfil-info-menu {
    position: relative;
}
.perfil-estado {
    display: flex;
    align-items: center;
    gap: 8px;
    margin: 0 0 var(--espacio-3);
    font-size: 0.9rem;
    font-weight: 600;
    color: var(--text-muted);
}
.perfil-estado-punto {
    width: 9px;
    height: 9px;
    border-radius: 50%;
    background: var(--green);
}
.perfil-acciones {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 12px;
    align-self: stretch;
    margin-top: auto;
    padding-top: var(--espacio-4);
}
.perfil-acciones > a {
    display: block;
    text-align: center;
}
.perfil-acciones .perfil-boton-secundario {
    grid-column: 1 / -1;
}
@media (min-width: 801px) {
    .perfil-info-menu {
        display: none;
    }
}
@media (max-width: 800px) {
    .perfil-acciones {
        display: none;
    }
}
.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;
}
/* La foto del perfil es cuadrada (la del Zoco sigue siendo 4:3). El recorte
   se alinea hacia arriba para que no se corten las cabezas, y el bloque se
   limita de ancho para que el cuadrado no sea más alto que la ficha. */
.perfil-foto-cuadrada .zoco-detalle-imagenes {
    max-width: 520px;
}
.perfil-foto-cuadrada .zoco-detalle-imagen-principal,
.perfil-foto-cuadrada .zoco-detalle-sin-imagen {
    aspect-ratio: 1 / 1;
}
.perfil-foto-cuadrada .zoco-detalle-imagen-principal {
    object-position: center 25%;
}
.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;
    align-items: flex-start;
    gap: 8px;
}
.perfil-avatar-acciones .perfil-texto-ayuda {
    margin: 0;
}
.perfil-form-avatar {
    display: inline-block;
    line-height: 0;
}
.perfil-form-avatar .boton-cta-contorno {
    line-height: 1.2;
}
.perfil-avatar-fila + .perfil-error,
.perfil-avatar-fila + form .tribe-paso-indicador {
    margin-top: var(--espacio-4);
}
.perfil-boton-secundario {
    display: inline-block;
    background: var(--bg);
    color: var(--text);
    border: 1.5px solid var(--border);
    padding: calc(var(--boton-pad-y) - 1.5px) calc(var(--boton-pad-x) - 1.5px);
    border-radius: var(--radio-boton);
    font-size: var(--fs-boton);
    line-height: var(--lh-boton);
    font-weight: var(--fw-boton);
    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: calc(var(--boton-pad-y) - 1.5px) calc(var(--boton-pad-x) - 1.5px);
    border-radius: var(--radio-boton);
    font-weight: var(--fw-boton);
    font-size: var(--fs-boton);
    line-height: var(--lh-boton);
    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;
    justify-content: center;
    width: 52px;
    height: 52px;
    flex-shrink: 0;
    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: 52px;
    height: 52px;
    border-radius: 50%;
    object-fit: cover;
    border: 1px solid var(--border);
}
/* el aro rosa solo aparece con notificaciones sin leer */
.cuenta-saludo:has(.cuenta-badge-avatar:not([hidden])) .cuenta-avatar-mini {
    border-color: transparent;
    background: var(--gradiente-marca) border-box;
}
.cuenta-avatar-mini-inicial {
    width: 52px;
    height: 52px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    color: #fff;
    font-size: 1.2rem;
    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-3) 0;
    font-size: var(--fs-titulo-pagina);
}
.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: var(--fs-titulo-sub);
    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: minmax(0, 1.2fr) minmax(0, 1fr);
    gap: var(--espacio-5);
    align-items: start;
    margin-bottom: var(--espacio-5);
}
@media (max-width: 700px) {
    .zoco-detalle { grid-template-columns: minmax(0, 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 {
    position: relative;
    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-acciones {
    display: flex;
    align-items: center;
    justify-content: space-between;
    align-self: stretch;
    gap: var(--espacio-3);
    margin-top: var(--espacio-4);
}
.zoco-detalle-acciones .auth-boton {
    margin-top: 0;
}
.zoco-denunciar-enlace {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    padding: 0;
    border: none;
    background: none;
    color: var(--text-muted);
    font: inherit;
    font-size: 0.8rem;
    text-decoration: none;
    cursor: pointer;
}
.zoco-denunciar-enlace svg {
    width: 13px;
    height: 13px;
    fill: currentColor;
}
.zoco-denunciar-enlace:hover {
    color: var(--text);
    text-decoration: underline;
}
.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: var(--fs-titulo-pagina);
}
.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-foto-aviso {
    margin: var(--espacio-2) 0 0;
    padding: 8px 12px;
    border-radius: 8px;
    background: #fdecea;
    color: #b42318;
    font-size: 0.85rem;
}
.zoco-fotos-editor {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--espacio-3);
    margin-top: var(--espacio-3);
}
@media (min-width: 700px) {
    .zoco-fotos-editor {
        grid-template-columns: repeat(4, minmax(0, 1fr));
    }
}
.zoco-foto-editor {
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 6px;
}
.zoco-foto-editor-imagen {
    position: relative;
    aspect-ratio: 1;
    border-radius: var(--radio-lg);
    overflow: hidden;
    background: var(--bg);
}
.zoco-foto-editor-imagen img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
}
.zoco-foto-editor-numero {
    position: absolute;
    top: 6px;
    left: 6px;
    min-width: 24px;
    padding: 2px 8px;
    border-radius: 999px;
    background: rgba(0, 0, 0, 0.6);
    color: #fff;
    font-size: 0.75rem;
    font-weight: 700;
    text-align: center;
}
.zoco-foto-editor-numero.principal {
    background: var(--accent2);
}
.zoco-foto-editor-acciones {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 6px;
}
.zoco-foto-editor-acciones form:last-child {
    grid-column: 1 / -1;
}
.zoco-foto-editor-boton {
    width: 100%;
    padding: 6px 0;
    border: 1px solid var(--border, #d8dee9);
    border-radius: 8px;
    background: var(--bg-card);
    color: var(--text);
    font: inherit;
    font-size: 0.85rem;
    cursor: pointer;
}
.zoco-foto-editor-boton:disabled {
    opacity: 0.35;
    cursor: default;
}
.zoco-foto-editor-quitar {
    color: var(--accent2);
}
.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);
}
/* La etiqueta de tipo/nuevos dentro de la info sigue siendo blanca sobre rosa. */
.zoco-mios-info .zoco-etiqueta-tipo {
    font-size: 0.7rem;
    color: #fff;
}
.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;
    overflow-wrap: anywhere;
}
.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: minmax(0, 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 {
    flex-wrap: nowrap;
}
.mensajes-fila-hilo-enlace {
    display: grid;
    grid-template-columns: 44px minmax(0, 1fr);
    align-items: center;
    gap: 2px 12px;
    flex: 1;
    min-width: 0;
    color: inherit;
    text-decoration: none;
}
.mensajes-fila-hilo-enlace .zoco-mios-info {
    min-width: 0;
}
.mensajes-fila-hilo-enlace .zoco-mios-estado {
    grid-column: 2;
    justify-self: start;
}
.mensajes-menu-hilo {
    position: fixed;
    top: auto;
    right: auto;
    min-width: 200px;
}
.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 {
    position: relative;
    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: var(--bg-card-alt, #f1f4f9);
    border: none;
    border-radius: 50%;
    color: var(--text-muted);
    cursor: pointer;
    transition: background 0.15s ease, color 0.15s ease;
}
.mensajes-boton-opciones:hover,
.mensajes-boton-opciones:focus-visible {
    background: #e31a83;
    color: #fff;
}
.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: var(--boton-pad-y) var(--boton-pad-x);
    border-radius: var(--radio-boton);
    font-weight: var(--fw-boton);
    font-size: var(--fs-boton);
    line-height: var(--lh-boton);
    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(var(--boton-pad-y) - 1.5px) calc(var(--boton-pad-x) - 1.5px);
    border-radius: var(--radio-boton);
    font-weight: var(--fw-boton);
    font-size: var(--fs-boton);
    line-height: var(--lh-boton);
    transition: filter 0.15s ease;
}
.boton-cta-contorno:hover {
    filter: brightness(0.95);
}
/* Fila con el botón "Ver perfil" sobre la caja de Editar perfil de Tribe. */
.tribe-perfil-acciones {
    display: flex;
    justify-content: flex-end;
    margin-bottom: var(--espacio-3);
}
.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-botones {
    display: flex;
    flex-wrap: wrap;
    gap: var(--espacio-2);
    margin-top: var(--espacio-2);
}
.inicio-snippet-botones .boton-cta {
    margin-top: 0;
}
.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: var(--fs-titulo-seccion);
}
.inicio-snippet-subtitulo {
    margin: 4px 0 var(--espacio-2) 0;
    font-size: 1rem;
    font-weight: 700;
}
.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-boton {
    display: inline-block;
    background: #fff;
    color: var(--accent2);
    padding: var(--boton-pad-y) var(--boton-pad-x);
    border-radius: var(--radio-boton);
    font-weight: var(--fw-boton);
    text-decoration: none;
    font-size: var(--fs-boton);
    line-height: var(--lh-boton);
}
.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;
}
/* Solo en escritorio: en móvil se navega con el menú de la cabecera. */
@media (max-width: 700px) {
    .intranet-sidebar {
        display: none;
    }
}
.intranet-sidebar a {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 10px 12px;
    border-radius: 999px;
    color: var(--text);
    text-decoration: none;
    font-weight: 600;
    font-size: 0.9rem;
}
.intranet-sidebar a svg,
.intranet-sidebar .menu-fila-boton 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-sidebar .cuenta-badge-mensajes,
#menuDesplegable .cuenta-badge-mensajes {
    margin-left: auto;
}
.intranet-sidebar a.activa .cuenta-badge-mensajes,
#menuDesplegable a.activa .cuenta-badge-mensajes {
    background: #fff;
    color: var(--accent2);
}
.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-vacio {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: var(--espacio-4);
    min-height: 320px;
    padding: var(--espacio-5) var(--espacio-4);
    background: var(--bg-card);
    border-radius: var(--radio-lg);
    box-shadow: var(--shadow-card);
    text-align: center;
}
.intranet-vacio p {
    margin: 0;
    color: var(--text-muted);
}
.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: var(--fs-titulo-pagina);
    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: var(--fs-titulo-seccion);
}
.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 h3 {
    margin: 0 0 4px 0;
    font-size: var(--fs-titulo-sub);
}
.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;
    gap: var(--espacio-4);
    margin-top: var(--espacio-4);
}
.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 h2 {
    margin: 0;
    font-size: var(--fs-titulo-seccion);
}
.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 h3 {
    margin: 0 0 4px 0;
    font-size: var(--fs-titulo-sub);
}
.tribe-bienvenida-paso p {
    margin: 0;
    font-size: 0.78rem;
    color: var(--text-muted);
    line-height: 1.4;
}
/* En móvil los tres pasos no caben en horizontal con textos largos: se
   apilan, con el número a la izquierda. */
@media (max-width: 700px) {
    .tribe-bienvenida-pasos {
        flex-direction: column;
        gap: var(--espacio-3);
    }
    .tribe-bienvenida-pasos::before {
        display: none;
    }
    .tribe-bienvenida-paso {
        display: grid;
        grid-template-columns: 36px 1fr;
        column-gap: var(--espacio-3);
        text-align: left;
        padding: 0;
    }
    .tribe-bienvenida-paso-numero {
        grid-row: 1 / span 2;
        margin: 0;
    }
    .tribe-bienvenida-paso h3,
    .tribe-bienvenida-paso p {
        grid-column: 2;
    }
}
.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 {
    color: inherit;
    text-decoration: none;
    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;
}

/* =======================================================================
   bienvenida (general) — pantalla tras crear cualquier cuenta, no confundir
   con tribe/bienvenida de arriba. Reutiliza perfil-caja-ancha, el badge
   "cuenta creada" y el patrón lema/acciones de Tribe; solo añade la rejilla
   de "todo gratis" y la ilustración de sol+ola.
======================================================================= */
.bienvenida-grid {
    display: grid;
    grid-template-columns: 1fr 1.15fr;
    gap: var(--espacio-5);
    align-items: start;
}
@media (max-width: 800px) {
    .bienvenida-grid {
        grid-template-columns: 1fr;
    }
}
.bienvenida-grid p {
    color: var(--text-muted);
    line-height: 1.6;
    margin: 0 0 var(--espacio-3) 0;
}
.bienvenida-columna-derecha {
    border-left: 1px solid var(--border);
    padding-left: var(--espacio-5);
}
@media (max-width: 800px) {
    .bienvenida-columna-derecha {
        border-left: none;
        padding-left: 0;
    }
    /* despedida en móvil: foto y título más juntos, sin raya entre ambos */
    .bienvenida-grid:has(.bienvenida-columna-derecha) {
        gap: 0;
    }
    .bienvenida-grid:has(.bienvenida-columna-derecha) .bienvenida-ilustracion {
        margin-bottom: var(--espacio-3);
    }
}
.bienvenida-funciones-titulo {
    font-size: var(--fs-titulo-pagina);
    font-weight: 700;
    margin: 0 0 var(--espacio-4) 0;
}
.bienvenida-funciones-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: var(--espacio-3);
}
@media (max-width: 480px) {
    .bienvenida-funciones-grid {
        grid-template-columns: 1fr;
    }
}
.bienvenida-funcion-tarjeta {
    background: var(--bg-card-alt);
    border-radius: var(--radio-lg);
    padding: var(--espacio-3);
}
.bienvenida-funcion-icono {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 44px;
    height: 44px;
    border-radius: 50%;
    color: #fff;
    margin-bottom: var(--espacio-2);
}
.bienvenida-funcion-icono svg {
    width: 22px;
    height: 22px;
}
.bienvenida-funcion-icono-previsiones {
    background: var(--gradiente-marca);
}
.bienvenida-funcion-icono-telegram {
    background: var(--blue);
}
.bienvenida-funcion-icono-tribe {
    background: var(--green);
}
.bienvenida-funcion-icono-zoco {
    background: var(--periodo);
}
.bienvenida-funcion-tarjeta h3 {
    margin: 0 0 4px 0;
    font-size: var(--fs-titulo-sub);
}
.bienvenida-funcion-tarjeta p {
    margin: 0;
    font-size: 0.85rem;
    color: var(--text-muted);
}
.bienvenida-ilustracion {
    width: 100%;
    aspect-ratio: 3 / 2;
    border-radius: var(--radio-lg);
    background: var(--bg-card-alt);
    display: flex;
    align-items: center;
    justify-content: center;
    margin-bottom: var(--espacio-4);
}
.bienvenida-ilustracion svg {
    width: 62%;
    height: 62%;
}
.bienvenida-ilustracion-foto {
    overflow: hidden;
}
.bienvenida-ilustracion-foto img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}

/* despedida — pantalla tras eliminar la cuenta. Reutiliza bienvenida-grid/
   columna-derecha/ilustracion (solo cambia qué va en cada columna),
   modal-paywall-badge para la pastilla y tribe-landing-lema/acciones;
   solo la tarjeta de aviso es genuinamente nueva. */
.despedida-info-caja {
    display: flex;
    align-items: flex-start;
    gap: var(--espacio-3);
    background: color-mix(in srgb, var(--blue) 10%, var(--bg-card-alt));
    border-radius: var(--radio-lg);
    padding: var(--espacio-3);
    margin: var(--espacio-3) 0 var(--espacio-4) 0;
}
.despedida-info-caja .bienvenida-funcion-icono {
    margin-bottom: 0;
    flex-shrink: 0;
}
.despedida-info-caja h3 {
    margin: 0 0 4px 0;
    font-size: var(--fs-titulo-sub);
}
.despedida-info-caja p {
    margin: 0;
    font-size: 0.88rem;
}

/* bienvenida-vuelta — pantalla de "hola de nuevo" tras un login normal
   (no un registro). Reutiliza perfil-caja/perfil-seccion, tribe-landing-
   lema, boton-cta y los iconos bienvenida-funcion-icono-*; solo la
   cabecera con ilustración circular, las tarjetas de acción y la rejilla
   "Tu espacio" son nuevas. */
.bienvenida-vuelta-cabecera {
    display: flex;
    align-items: center;
    gap: var(--espacio-4);
    margin-bottom: var(--espacio-4);
}
@media (max-width: 600px) {
    .bienvenida-vuelta-cabecera {
        flex-direction: column;
        text-align: center;
    }
}
.bienvenida-vuelta-ilustracion {
    width: 150px;
    height: 150px;
    flex-shrink: 0;
    border-radius: 50%;
    background: var(--bg-card-alt);
    display: flex;
    align-items: center;
    justify-content: center;
    overflow: hidden;
}
.bienvenida-vuelta-ilustracion img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}
.bienvenida-vuelta-inicial {
    width: 100%;
    height: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--gradiente-marca);
    color: #fff;
    font-size: 3.5rem;
    font-weight: 700;
}
.bienvenida-vuelta-cabecera .tribe-landing-lema {
    margin: 0 0 4px 0;
}
.bienvenida-vuelta-acciones-grid {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: var(--espacio-3);
}
@media (max-width: 900px) {
    .bienvenida-vuelta-acciones-grid {
        grid-template-columns: repeat(2, 1fr);
    }
}
@media (max-width: 600px) {
    .bienvenida-vuelta-acciones-grid {
        grid-template-columns: 1fr;
    }
}
.bienvenida-vuelta-accion {
    border-radius: var(--radio-lg);
    padding: var(--espacio-3);
    display: flex;
    flex-direction: column;
}
.bienvenida-vuelta-accion h2 {
    margin: 10px 0 4px 0;
    font-size: var(--fs-titulo-sub);
}
.bienvenida-vuelta-accion p {
    margin: 0 0 var(--espacio-3) 0;
    color: var(--text-muted);
    font-size: 0.88rem;
    flex-grow: 1;
}
.bienvenida-vuelta-accion .boton-cta {
    text-align: center;
    margin-top: 0;
}
/* Escritorio: el título va al lado del icono. */
@media (min-width: 601px) {
    .bienvenida-vuelta-accion {
        display: grid;
        grid-template-columns: auto 1fr;
        grid-template-rows: auto auto 1fr;
        column-gap: var(--espacio-3);
        align-items: center;
    }
    .bienvenida-vuelta-accion .bienvenida-funcion-icono {
        margin-bottom: 0;
    }
    .bienvenida-vuelta-accion h2 {
        margin: 0;
    }
    .bienvenida-vuelta-accion p {
        grid-column: 1 / -1;
        margin: var(--espacio-3) 0;
    }
    .bienvenida-vuelta-accion .boton-cta,
    .bienvenida-vuelta-accion .parte-opciones {
        grid-column: 1 / -1;
        align-self: end;
    }
    .bienvenida-vuelta-accion .parte-opciones {
        align-self: start;
        margin-top: 0;
    }
}
.bienvenida-vuelta-accion-gris {
    background: var(--bg-card);
    box-shadow: var(--sombra-suave, 0 4px 18px rgba(20, 40, 70, 0.08));
}
.bienvenida-vuelta-accion-parte {
    background: var(--bg);
    box-shadow: none;
    border: 1.5px solid var(--border);
}
.bienvenida-vuelta-accion .bienvenida-funcion-icono {
    position: relative;
    border-radius: 14px;
}
.bienvenida-icono-badge {
    position: absolute;
    top: -6px;
    right: -6px;
    margin: 0;
    box-shadow: 0 0 0 2px var(--bg-card);
}
.bienvenida-vuelta-accion-parte .bienvenida-funcion-icono {
    background: rgba(79, 163, 224, 0.16);
    color: var(--blue);
}
.bienvenida-vuelta-accion .boton-cta {
    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);
}
.bienvenida-vuelta-accion .boton-cta-flecha {
    display: none;
}
.parte-opciones {
    display: flex;
    flex-direction: column;
    gap: var(--espacio-3);
    margin-top: var(--espacio-3);
}
.parte-opcion {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--espacio-3);
    font-weight: 600;
}
.bienvenida-vuelta-accion-parte p {
    flex-grow: 0;
}
.parte-opcion-telegram .parte-enlace {
    display: block;
    width: 100%;
    text-align: center;
    box-sizing: border-box;
}
.parte-enlace {
    padding: 8px 16px;
    border-radius: 999px;
    border: 1.5px solid var(--border);
    background: var(--bg-card);
    color: var(--blue);
    font-size: 0.9rem;
    font-weight: 600;
    text-decoration: none;
}
/* Solo móvil: tarjeta en fila (icono · título y descripción · botón redondo
   con borde rosa); toda la tarjeta es clicable. Telegram va en gris con
   icono azul. */
@media (max-width: 600px) {
    .bienvenida-vuelta-accion-parte .parte-opciones {
        grid-column: 1 / -1;
        grid-row: 3;
    }
    .bienvenida-vuelta-accion {
        position: relative;
        display: grid;
        grid-template-columns: auto 1fr auto;
        align-items: center;
        column-gap: var(--espacio-3);
    }
    .bienvenida-vuelta-accion .bienvenida-funcion-icono {
        grid-column: 1;
        grid-row: 1 / span 2;
        width: 50px;
        height: 50px;
        margin-bottom: 0;
    }
    .bienvenida-vuelta-accion .bienvenida-funcion-icono svg {
        width: 24px;
        height: 24px;
    }
    .bienvenida-vuelta-accion h2 {
        grid-column: 2;
        grid-row: 1;
        margin: 0 0 2px 0;
        text-align: left;
    }
    .bienvenida-vuelta-accion p {
        grid-column: 2;
        grid-row: 2;
        margin: 0;
        text-align: left;
        font-size: 0.9rem;
    }
    .bienvenida-vuelta-accion .boton-cta {
        grid-column: 3;
        grid-row: 1 / span 2;
        width: 50px;
        height: 50px;
        padding: 0;
        border-radius: 50%;
        display: flex;
        align-items: center;
        justify-content: center;
    }
    .bienvenida-vuelta-accion .boton-cta::after {
        content: "";
        position: absolute;
        inset: 0;
    }
    .bienvenida-vuelta-accion .boton-cta-texto {
        position: absolute;
        width: 1px;
        height: 1px;
        overflow: hidden;
        clip: rect(0 0 0 0);
        white-space: nowrap;
    }
    .bienvenida-vuelta-accion .boton-cta-flecha {
        display: block;
        font-size: 1.4rem;
        line-height: 1;
    }
}
.espacio-grid {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 0 var(--espacio-3);
}
@media (max-width: 700px) {
    .espacio-grid {
        grid-template-columns: repeat(2, 1fr);
    }
}
.espacio-item {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 14px 4px;
    border-bottom: 1px solid var(--border);
    color: var(--text);
    font-weight: 600;
    font-size: 0.92rem;
    background: none;
    border-left: none;
    border-right: none;
    border-top: none;
    width: 100%;
    text-align: left;
    text-decoration: none;
    cursor: pointer;
}
.espacio-item:hover {
    color: var(--gradiente-inicio);
}
.espacio-item svg {
    width: 20px;
    height: 20px;
    color: currentColor;
    flex-shrink: 0;
}
.espacio-item .cuenta-badge-mensajes {
    margin-left: auto;
}

/* =======================================================================
   SurfMatch (tribe/surfmatch/index) — 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 {
    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;
}
.perfil-fila-mitades {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: var(--espacio-3);
}
.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);
}
/* Perfil público de Tribe: saludo en cita, tarjetas de datos 2×2 a la
   izquierda y listas con chips (spots, otros deportes) a la derecha. */
.tribe-perfil-saludo {
    margin: 0 0 24px;
    padding: 24px var(--espacio-3);
    border-left: 4px solid var(--gradiente-inicio);
    font-size: 1.05rem;
    font-weight: 600;
    color: var(--text);
}
.tribe-perfil-estado {
    padding: 4px 12px;
    border-radius: 999px;
    background: color-mix(in srgb, var(--gradiente-inicio) 12%, var(--bg-card));
    color: var(--gradiente-inicio);
    font-size: 0.85rem;
    font-weight: 600;
}
.tribe-perfil-cambiar {
    font-size: 0.8rem;
    color: var(--text-muted);
    text-decoration: underline;
}
.tribe-perfil-cambiar:hover {
    color: var(--gradiente-inicio);
}
.tribe-perfil-editar {
    margin-left: auto;
}
.tribe-resumen-titulo-fila:has(.tribe-perfil-editar) {
    align-items: center;
    flex: 1;
}
.tribe-perfil-grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: 24px;
    align-items: start;
}
@media (min-width: 801px) {
    .tribe-perfil-grid {
        grid-template-columns: 1fr 1fr;
        gap: 32px;
    }
}
.tribe-perfil-datos {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 24px;
}
@media (min-width: 801px) {
    .tribe-perfil-datos {
        gap: 32px;
    }
}
@media (max-width: 500px) {
    .tribe-perfil-datos {
        grid-template-columns: 1fr;
    }
}
.tribe-perfil-listas {
    display: flex;
    flex-direction: column;
    gap: 24px;
}
@media (min-width: 801px) {
    .tribe-perfil-listas {
        gap: 32px;
    }
}
.tribe-dato-tarjeta,
.tribe-lista-tarjeta {
    display: flex;
    flex-direction: column;
    gap: 14px;
    padding: 24px;
}
/* Raya gris suave bajo las cajas de arriba para separarlas de las de abajo. */
.tribe-perfil-datos .tribe-dato-tarjeta:nth-child(-n+2),
.tribe-lista-tarjeta:first-child:not(:last-child) {
    border-bottom: 1px solid var(--border);
}
@media (max-width: 500px) {
    .tribe-perfil-datos .tribe-dato-tarjeta:not(:last-child) {
        border-bottom: 1px solid var(--border);
    }
}
.tribe-dato-cabecera {
    display: flex;
    align-items: center;
    gap: 10px;
}
.tribe-dato-icono {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    border-radius: 12px;
    color: var(--accent);
}
.tribe-dato-icono svg {
    width: 22px;
    height: 22px;
}
.tribe-dato-etiqueta {
    margin-left: auto;
    font-size: 0.72rem;
    font-weight: 700;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--text-muted);
}
.tribe-dato-valor {
    font-size: 1.05rem;
    font-weight: 600;
    color: var(--text);
}
.tribe-dato-segmentos {
    display: flex;
    gap: 6px;
    margin-top: auto;
}
.tribe-dato-segmentos span {
    flex: 1;
    height: 6px;
    border-radius: 3px;
    background: color-mix(in srgb, var(--text-muted) 30%, transparent);
}
.tribe-dato-segmentos span.activo {
    background: var(--gradiente-marca);
}
.tribe-lista-cabecera {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 10px;
}
.tribe-lista-cabecera h3 {
    margin: 0;
    font-size: var(--fs-titulo-sub);
}
.tribe-lista-cabecera span {
    font-size: 0.8rem;
    color: var(--text-muted);
}
.tribe-lista-chips {
    display: flex;
    flex-wrap: wrap;
    gap: 14px 12px;
}
.tribe-lista-chip {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 6px 12px;
    border-radius: 999px;
    font-size: 0.9rem;
    font-weight: 600;
    color: var(--text);
}
.tribe-lista-chip svg {
    width: 16px;
    height: 16px;
    color: var(--accent);
}
.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: var(--fuente-web);
    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: var(--fs-titulo-pagina);
}
.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 h2 {
    margin: 0 0 var(--espacio-2) 0;
    font-size: var(--fs-titulo-seccion);
}
.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: var(--fs-titulo-seccion);
}
.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);
}
.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,
.inicio-snippet-oscuro .inicio-snippet-subtitulo {
    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);
}
/* Snippet de Tribe: mismo grid imagen+texto que los demás snippets de la
   home, pero con la foto a la derecha (orden invertido en el HTML) y el
   degradado de marca en vez del fondo navy — es la identidad visual propia
   de Tribe en el resto del sitio (botón "Únete a Tribe", etc.). */
.inicio-snippet-tribe {
    background: var(--gradiente-marca);
    box-shadow: var(--shadow-gradiente);
}
.inicio-snippet-tribe .inicio-snippet-titulo {
    color: #fff;
}
.inicio-snippet-tribe .perfil-texto-ayuda {
    color: rgba(255, 255, 255, 0.9);
}
.inicio-snippet-texto-izquierda {
    text-align: left;
}

/* =======================================================================
   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;
}
/* Chip "+" de la landing de Tribe: indica que hay más deportes sin
   nombrarlos; redondo en vez de una píldora ancha para un solo carácter. */
.tribe-planes-filtro-mas {
    justify-content: center;
    padding-left: 0;
    padding-right: 0;
    min-width: 2.4rem;
    font-size: 1.05rem;
    line-height: 1;
}
.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: center;
    gap: var(--espacio-3);
    margin-bottom: var(--espacio-3);
}
.modulo-oleaje-eyebrow {
    display: block;
    color: var(--accent);
    font-size: 0.75rem;
    font-weight: 700;
    letter-spacing: 0.04em;
    text-transform: uppercase;
}
.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-pie {
    flex-basis: 100%;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--espacio-2);
}
.modulo-oleaje-cuando {
    flex-basis: 100%;
    color: var(--titular);
    /* Más grande que en Previsiones, pero se encoge en pantallas muy
       estrechas para que la fecha más larga siga cabiendo en una línea. */
    font-size: min(1.1rem, 4.6vw);
    font-weight: 700;
    white-space: nowrap;
}
.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: var(--fs-titulo-seccion);
}
.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-pie {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    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) {
    /* Móvil: anillo, etiqueta y titular alineados en una fila; el subtexto
       y "Mejor momento" a todo el ancho (igual que en Previsiones). */
    .modulo-oleaje-panel {
        display: grid;
        grid-template-columns: auto 1fr;
        gap: var(--espacio-2) var(--espacio-3);
    }
    .modulo-oleaje-cuando {
        grid-column: 1 / -1;
    }
    .modulo-oleaje-panel-texto {
        display: contents;
    }
    .modulo-oleaje-panel-titulos {
        min-width: 0;
    }
    .modulo-oleaje-panel-subtexto {
        grid-column: 1 / -1;
    }
    .modulo-oleaje-panel-pie {
        grid-column: 1 / -1;
    }
    .modulo-oleaje-pie {
        justify-content: flex-start;
    }
    .modulo-oleaje-mejor-momento {
        grid-column: 1 / -1;
        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-flecha {
    width: 40px;
    height: 40px;
    border-radius: 50%;
    border: 1.5px solid var(--gradiente-inicio);
    background: var(--bg-card-alt);
    color: var(--gradiente-inicio);
    font-size: 1.4rem;
    font-weight: 700;
    line-height: 1;
    cursor: pointer;
    flex-shrink: 0;
    display: flex;
    align-items: center;
    justify-content: center;
}
.prevision-flecha:hover:not(:disabled) {
    background: color-mix(in srgb, var(--gradiente-inicio) 12%, var(--bg-card-alt));
}
.prevision-flecha:disabled {
    opacity: 0.3;
    cursor: default;
}

.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-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-probabilidad {
    display: grid;
    grid-template-columns: auto 1fr;
    align-items: center;
    gap: var(--espacio-2) 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 {
    display: contents;
}
.prevision-hora-probabilidad-titulos {
    min-width: 0;
}
.prevision-hora-probabilidad-cuando {
    grid-column: 1 / -1;
    color: var(--titular);
    font-size: 0.85rem;
    font-weight: 700;
}
.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-probabilidad-pie {
    grid-column: 1 / -1;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--espacio-2);
}
.prevision-hora-probabilidad-subtexto {
    grid-column: 1 / -1;
    margin: 0;
    color: var(--text-muted);
    font-size: 0.88rem;
}
/* Gráfica "Evolución semanal" dentro de la tarjeta de previsión */
.prevision-evolucion {
    background: var(--bg);
    border-radius: var(--radio-lg);
    padding: var(--espacio-3);
    margin-bottom: var(--espacio-3);
}
.prevision-evolucion-con-enlaces {
    position: relative;
}
.prevision-evolucion-enlace {
    position: absolute;
    inset: 0;
    border-radius: inherit;
}
.prevision-evolucion-con-enlaces:hover {
    background: color-mix(in srgb, var(--accent) 6%, var(--bg));
}
/* El contenido pasa a un lado para que el clic caiga en el enlace de la
   caja; solo los nodos (también enlaces) lo interceptan. */
.prevision-evolucion-con-enlaces .prevision-evolucion-cabecera,
.prevision-evolucion-con-enlaces .prevision-evolucion-svg {
    position: relative;
    pointer-events: none;
}
.prevision-evolucion-con-enlaces .prevision-evolucion-nodo {
    pointer-events: auto;
}
.prevision-evolucion-cabecera {
    display: flex;
    justify-content: space-between;
    align-items: flex-end;
    gap: var(--espacio-2);
}
.prevision-evolucion-titulo {
    margin: 0;
    font-size: var(--fs-titulo-seccion);
}
.prevision-evolucion-subtitulo {
    margin: 2px 0 0;
    color: var(--text-muted);
    font-size: 0.85rem;
}
.prevision-evolucion-activo {
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    gap: 2px;
    color: var(--text-muted);
    font-size: 0.85rem;
    white-space: nowrap;
}
.prevision-evolucion-activo strong {
    color: var(--accent);
    font-size: 1.1rem;
}
.prevision-evolucion-svg {
    display: block;
    width: 100%;
    max-width: 560px;
    height: auto;
    margin: var(--espacio-2) auto 0;
}
.prevision-evolucion-rejilla {
    stroke: var(--border);
    stroke-width: 1;
}
.prevision-evolucion-eje {
    fill: var(--text-muted);
    font-size: 11px;
}
.prevision-evolucion-eje-activo {
    fill: var(--accent2);
    font-weight: 700;
}
.prevision-evolucion-linea {
    fill: none;
    stroke: var(--accent);
    stroke-width: 3;
    stroke-linecap: round;
}
.prevision-evolucion-punto {
    fill: var(--bg-card);
    stroke: var(--accent);
    stroke-width: 3;
}
.prevision-evolucion-halo {
    fill: var(--bg-card);
    stroke: var(--accent2);
    stroke-width: 2.5;
}
.prevision-evolucion-punto-activo {
    fill: var(--accent2);
}
.prevision-evolucion-candado-fondo {
    fill: var(--bg-card);
    stroke: var(--text-muted);
    stroke-width: 1.5;
    stroke-dasharray: 3 3;
}
.prevision-evolucion-candado {
    fill: none;
    stroke: var(--text-muted);
    stroke-width: 2.4;
    stroke-linecap: round;
    stroke-linejoin: round;
}
.prevision-evolucion-nodo-bloqueado:hover .prevision-evolucion-candado-fondo,
.prevision-evolucion-nodo-bloqueado:focus-visible .prevision-evolucion-candado-fondo {
    stroke: var(--accent2);
}
.prevision-evolucion-nodo-bloqueado:hover .prevision-evolucion-candado,
.prevision-evolucion-nodo-bloqueado:focus-visible .prevision-evolucion-candado {
    stroke: var(--accent2);
}
.prevision-evolucion-nodo {
    cursor: pointer;
    outline: none;
}
.prevision-evolucion-zona {
    fill: transparent;
}
.prevision-evolucion-nodo:hover .prevision-evolucion-punto,
.prevision-evolucion-nodo:focus-visible .prevision-evolucion-punto {
    fill: var(--accent);
}
.prevision-evolucion-nodo:hover .prevision-evolucion-eje,
.prevision-evolucion-nodo:focus-visible .prevision-evolucion-eje {
    fill: var(--text);
}
.prevision-evolucion-nodo:focus-visible .prevision-evolucion-zona {
    stroke: var(--accent);
    stroke-width: 1.5;
}

.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-dias-tira {
    display: flex;
    gap: 8px;
    overflow-x: auto;
    padding: 2px 2px 10px 2px;
    margin-bottom: var(--espacio-2);
    -webkit-overflow-scrolling: touch;
}
.prevision-dia-tira-boton {
    flex-shrink: 0;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 2px;
    min-width: 76px;
    padding: 10px 8px;
    border-radius: var(--radio);
    border: 1.5px solid var(--border);
    background: var(--bg-card);
    color: var(--text);
    font-weight: 700;
    font-size: 0.85rem;
    cursor: pointer;
}
@media (min-width: 700px) {
    /* En escritorio, si los 9 días caben sin hacer scroll, que se
       repartan todo el ancho en vez de dejar un hueco a la derecha — en
       móvil se queda igual (flex-shrink: 0 + scroll horizontal). */
    .prevision-dia-tira-boton {
        flex: 1 1 0;
        max-width: 140px;
    }
}
.prevision-dia-tira-boton span {
    font-weight: 500;
    font-size: 0.7rem;
    color: var(--text-muted);
}
.prevision-dia-tira-boton[data-activo] {
    border-color: var(--gradiente-inicio);
    background: color-mix(in srgb, var(--gradiente-inicio) 8%, var(--bg-card));
    color: var(--gradiente-inicio);
}
.prevision-dia-tira-boton[data-activo] span {
    color: var(--gradiente-inicio);
}
.prevision-dia-tira-bloqueado {
    background: var(--bg);
    color: var(--text-muted);
}
.prevision-dia-tira-bloqueado span {
    color: var(--text-muted);
}
.prevision-dia-tira-candado {
    width: 16px;
    height: 16px;
    color: var(--text-muted);
}

.prevision-tira-dia {
    display: flex;
    justify-content: center;
    gap: 6px;
    min-width: 0;
    padding: 2px;
    margin-bottom: var(--espacio-3);
}
/* Los botones de hora se reparten el ancho disponible (sin scroll ni
   huecos a los lados) y no pasan de un tamaño razonable en escritorio. */
.prevision-tira-dia .prevision-tira-boton {
    flex: 1 1 0;
    min-width: 0;
    max-width: 90px;
    padding: 6px 0;
    text-align: center;
}
.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;
}
/* Móvil: cajas arriba y gráfica debajo; el hueco lo da el flex, no el margen. */
.prevision-evolucion-fila {
    display: flex;
    flex-direction: column;
    gap: var(--espacio-3);
}
.prevision-evolucion-fila .prevision-evolucion {
    margin-bottom: 0;
}
@media (min-width: 900px) {
    .prevision-evolucion-fila {
        display: grid;
        grid-template-columns: 1fr 1fr;
        gap: var(--espacio-3);
        align-items: stretch;
    }
    .prevision-evolucion-fila .prevision-evolucion {
        margin-bottom: 0;
    }
    .prevision-evolucion-fila .prevision-fila-cajas {
        grid-template-columns: 1fr 1fr;
        grid-auto-rows: 1fr;
        gap: var(--espacio-3);
    }
    /* Icono grande a la izquierda y etiqueta + valor a la derecha. */
    .prevision-evolucion-fila .prevision-fila-caja {
        display: grid;
        grid-template-columns: auto 1fr;
        grid-template-rows: auto auto;
        align-content: center;
        align-items: center;
        column-gap: var(--espacio-3);
        row-gap: 4px;
        padding: var(--espacio-3);
    }
    .prevision-evolucion-fila .prevision-fila-caja-cabecera {
        display: contents;
    }
    .prevision-evolucion-fila .prevision-fila-caja-icono {
        grid-column: 1;
        grid-row: 1 / 3;
        width: 52px;
        height: 52px;
        border-radius: 12px;
    }
    .prevision-evolucion-fila .prevision-fila-caja-icono svg {
        width: 26px;
        height: 26px;
    }
    .prevision-evolucion-fila .prevision-fila-caja-etiqueta {
        grid-column: 2;
        grid-row: 1;
        align-self: end;
    }
    .prevision-evolucion-fila .prevision-fila-caja-valor {
        grid-column: 2;
        grid-row: 2;
        align-self: start;
    }
}
.prevision-fila-caja {
    background: var(--bg);
    border-radius: var(--radio);
    padding: 10px 12px;
}
.prevision-fila-caja-cabecera {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 4px;
}
.prevision-fila-caja-icono {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    border-radius: 8px;
    background: color-mix(in srgb, var(--accent) 15%, transparent);
    flex-shrink: 0;
}
.prevision-fila-caja-icono svg {
    width: 16px;
    height: 16px;
    fill: none;
    stroke: var(--accent);
    stroke-width: 2;
    stroke-linecap: round;
    stroke-linejoin: round;
}
.prevision-fila-caja-etiqueta {
    display: block;
    color: var(--text-muted);
    font-size: 0.7rem;
    font-weight: 700;
    letter-spacing: 0.03em;
    text-transform: uppercase;
}
.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) {
    /* 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/estilos — catálogo de iconos (en uso y por añadir), página temporal.
======================================================================= */
.iconos-catalogo-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(130px, 1fr));
    gap: var(--espacio-3);
    margin-top: var(--espacio-3);
}
.iconos-catalogo-subtitulo {
    margin: var(--espacio-4) 0 0;
    font-size: 1rem;
}
.iconos-catalogo-uso {
    font-size: 0.72rem;
    color: var(--text-muted);
    overflow-wrap: anywhere;
}
.iconos-catalogo-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-catalogo-icono {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 64px;
    height: 64px;
    border-radius: 16px;
    background: color-mix(in srgb, var(--accent) 12%, var(--bg-card));
    color: var(--accent);
}
.iconos-catalogo-icono svg {
    width: 34px;
    height: 34px;
}
.iconos-catalogo-nombre {
    font-weight: 600;
    font-size: 0.9rem;
}

/* =======================================================================
   dev/estilos — sección "guía de estilo" en 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-spec {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: var(--espacio-3);
    align-items: center;
    padding: var(--espacio-3) 0;
    border-bottom: 1px solid var(--border);
}
.styleguide-spec:first-child {
    padding-top: 0;
}
.styleguide-spec:last-child {
    border-bottom: 0;
    padding-bottom: 0;
}
.styleguide-spec-datos {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 6px;
}
.styleguide-uso {
    flex-basis: 100%;
    color: var(--text-muted);
    font-size: 0.85rem;
}
@media (max-width: 600px) {
    .styleguide-spec {
        grid-template-columns: 1fr;
        gap: 6px;
    }
}
.styleguide-avatares {
    display: flex;
    align-items: center;
    gap: var(--espacio-3);
}

/* bienvenida sin email confirmado: foto y aviso a partes iguales */
.bienvenida-grid-mitad {
    grid-template-columns: 1fr 1fr;
    align-items: center;
}
@media (max-width: 800px) {
    .bienvenida-grid-mitad {
        grid-template-columns: 1fr;
        gap: 0;
    }
    .bienvenida-grid-mitad .bienvenida-ilustracion {
        margin-bottom: var(--espacio-3);
    }
}
.bienvenida-confirmar {
    background: var(--bg-input, rgba(0, 0, 0, 0.04));
    border-radius: var(--radio-lg);
    padding: var(--espacio-4);
}
.bienvenida-confirmar h2 {
    margin: 0 0 var(--espacio-2) 0;
    font-size: var(--fs-titulo-seccion);
}

/* pista de primera vez en /hola: flecha + texto hacia el avatar de la
   cabecera hasta que se abre el menú (ver js/pista-menu.js) */
.pista-menu {
    position: absolute;
    z-index: 40;
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    max-width: min(240px, calc(100vw - 16px));
    color: #e31a83;
    pointer-events: none;
}
.pista-menu[hidden] {
    display: none;
}
.pista-menu-flecha {
    width: 72px;
    height: 76px;
    overflow: visible;
}
/* trazo punteado que "viaja" hacia el avatar */
.pista-menu-trazo {
    stroke-dasharray: 0.1 9;
    animation: pista-menu-viaje 1.2s linear infinite;
}
.pista-menu p {
    margin: 4px 0 0 0;
    padding: 8px 12px;
    background: #e31a83;
    border-radius: var(--radio-lg);
    box-shadow: 0 8px 24px var(--shadow-gradiente);
    font-size: 0.9rem;
    font-weight: 600;
    line-height: 1.35;
    color: #fff;
    text-align: right;
}
@keyframes pista-menu-viaje {
    to {
        stroke-dashoffset: -9.1;
    }
}
.cuenta-saludo-pulso .cuenta-avatar-mini,
.cuenta-saludo-pulso .cuenta-avatar-mini-inicial {
    animation: pista-menu-pulso 1.8s ease-out infinite;
}
@keyframes pista-menu-pulso {
    0% {
        box-shadow: 0 0 0 0 rgba(227, 26, 131, 0.55);
    }
    70%, 100% {
        box-shadow: 0 0 0 10px rgba(227, 26, 131, 0);
    }
}
@media (prefers-reduced-motion: reduce) {
    .pista-menu-trazo,
    .cuenta-saludo-pulso .cuenta-avatar-mini,
    .cuenta-saludo-pulso .cuenta-avatar-mini-inicial {
        animation: none;
    }
}
/* avatar grande de /hola: más pequeño en móvil */
@media (max-width: 600px) {
    .bienvenida-vuelta-ilustracion {
        width: 88px;
        height: 88px;
    }
    .bienvenida-vuelta-inicial {
        font-size: 2.2rem;
    }
}

/* Captcha de Cloudflare Turnstile en los formularios de acceso */
.auth-form .cf-turnstile {
    margin: 0.75rem 0;
    width: 100%;
}

/* Icono de consejos de seguridad, arriba a la derecha de la caja del anuncio */
.zoco-aviso-boton {
    position: absolute;
    top: var(--espacio-3);
    right: var(--espacio-3);
    width: 38px;
    height: 38px;
    display: grid;
    place-items: center;
    border: 0;
    border-radius: 50%;
    background: var(--bg-card-alt, #f1f4f9);
    color: var(--text-muted);
    cursor: pointer;
    transition: background 0.15s ease, color 0.15s ease;
}
.zoco-aviso-boton:hover,
.zoco-aviso-boton:focus-visible {
    background: #e31a83;
    color: #fff;
}
.zoco-aviso-boton svg {
    width: 24px;
    height: 24px;
    fill: currentColor;
}
.modal-amigo .modal-lista {
    margin: 0 0 14px 0;
    padding-left: 1.2rem;
    text-align: left;
    color: var(--text-muted);
    font-size: 0.9rem;
    line-height: 1.5;
}
.modal-amigo .modal-lista li {
    margin-bottom: 6px;
}

/* Anuncio que el usuario ya ha denunciado: se muestra el estado, sin acción */
.zoco-denunciado {
    cursor: default;
    opacity: 0.7;
    text-decoration: none;
}

/* =======================================================================
   previsiones — barra fija con día y hora al hacer scroll, y línea de
   "Actualizado" encima de la tarjeta.
======================================================================= */
.prevision-actualizado-linea {
    margin: 0;
    color: var(--text-muted);
    font-size: 0.8rem;
}
.prevision-barra {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    z-index: 60;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: var(--espacio-2);
    padding: 8px var(--espacio-3);
    background: var(--bg-card);
    border-bottom: 1px solid var(--border);
    box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
    transform: translateY(-110%);
    transition: transform 0.2s ease;
}
.prevision-barra-visible {
    transform: translateY(0);
}
.prevision-barra-centro {
    display: flex;
    align-items: center;
    gap: var(--espacio-3);
    min-width: 0;
}
.prevision-barra-cuando {
    flex-shrink: 0;
    font-size: 0.95rem;
    white-space: nowrap;
}
.prevision-barra-horas {
    display: flex;
    gap: 6px;
    overflow-x: auto;
    scrollbar-width: none;
}
.prevision-barra-horas .prevision-tira-boton {
    padding: 4px 8px;
    font-size: 0.72rem;
}
.prevision-barra-horas::-webkit-scrollbar {
    display: none;
}
.prevision-flecha-mini {
    width: 32px;
    height: 32px;
    font-size: 1.2rem;
}
@media (max-width: 600px) {
    /* En móvil, día y hora arriba y las horas debajo, a todo el ancho. */
    .prevision-barra {
        flex-wrap: wrap;
    }
    .prevision-barra-centro {
        flex-direction: column;
        gap: 6px;
        flex: 1;
        align-items: center;
    }
    .prevision-barra-horas {
        max-width: 100%;
    }
}

/* =======================================================================
   tribe/perfil — formulario de Tribe en 4 pasos
======================================================================= */
.tribe-flow-intro {
    margin: 0 0 var(--espacio-3) 0;
}
.tribe-flow-pasos {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: var(--espacio-2);
    margin-bottom: var(--espacio-4);
}
.tribe-flow-tab {
    display: flex;
    flex-direction: column;
    gap: 8px;
    padding: 0;
    border: 0;
    background: none;
    color: var(--text-muted);
    font: inherit;
    text-align: left;
    cursor: pointer;
}
.tribe-flow-tab:disabled {
    cursor: default;
}
.tribe-flow-tab-barra {
    display: block;
    height: 4px;
    border-radius: 999px;
    background: var(--border);
}
.tribe-flow-tab.activo .tribe-flow-tab-barra,
.tribe-flow-tab.hecho .tribe-flow-tab-barra {
    background: var(--gradiente-marca);
}
.tribe-flow-tab.hecho:not(.activo) .tribe-flow-tab-barra {
    opacity: 0.45;
}
.tribe-flow-tab-texto {
    display: flex;
    align-items: center;
    gap: 8px;
    font-size: 0.85rem;
    font-weight: 600;
}
.tribe-flow-tab.activo {
    color: var(--text);
}
.tribe-flow-tab-num {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 22px;
    height: 22px;
    border-radius: 50%;
    background: var(--bg-card-alt);
    font-size: 0.75rem;
    flex-shrink: 0;
}
.tribe-flow-tab.activo .tribe-flow-tab-num {
    background: var(--gradiente-marca);
    color: #fff;
}
@media (max-width: 560px) {
    .tribe-flow-tab-titulo {
        display: none;
    }
}
.tribe-flow-cabecera {
    margin-bottom: var(--espacio-3);
}
.tribe-flow-cabecera h2 {
    margin: 0 0 6px 0;
    font-size: var(--fs-titulo-seccion);
}
.tribe-flow-cabecera .tribe-paso-indicador {
    margin-bottom: 6px;
}
.tribe-flow-panel > .perfil-campo {
    margin-bottom: var(--espacio-4);
}
.tribe-flow-panel > .perfil-campo:last-of-type {
    border-bottom: 0;
}
.perfil-texto-opcional {
    font-size: 0.7rem;
    font-weight: 700;
    color: var(--text-muted);
    text-transform: uppercase;
    letter-spacing: 0.03em;
    white-space: nowrap;
}
.tribe-chips {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
}
.tribe-chip {
    position: relative;
    display: inline-flex;
    cursor: pointer;
}
.tribe-chip input {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    margin: 0;
    opacity: 0;
    cursor: pointer;
}
.tribe-chip span {
    display: inline-block;
    padding: 9px 16px;
    border: 1.5px solid var(--border);
    border-radius: var(--radio-boton);
    background: var(--bg-card);
    color: var(--text);
    font-size: 0.88rem;
    font-weight: 600;
    transition: border-color 0.15s ease, background 0.15s ease;
}
.tribe-chip:hover span {
    border-color: var(--gradiente-inicio);
}
.tribe-chip input:checked + span {
    border-color: transparent;
    background: var(--gradiente-marca);
    color: #fff;
}
.tribe-chip input:focus-visible + span {
    outline: 2px solid var(--accent);
    outline-offset: 2px;
}
.tribe-flow-error {
    margin: 0;
    color: #d93a3a;
    font-size: 0.82rem;
    font-weight: 600;
}
.tribe-flow-error[hidden] {
    display: none;
}
.tribe-flow-privacidad {
    margin: 0 0 var(--espacio-4) 0;
    padding: var(--espacio-3);
    border-radius: var(--radio);
    background: var(--bg-card-alt);
    font-size: 0.88rem;
    color: var(--text);
}
.tribe-flow-visibilidad {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: var(--espacio-2);
}
@media (max-width: 560px) {
    .tribe-flow-visibilidad {
        grid-template-columns: 1fr;
    }
}
.tribe-flow-tarjeta {
    position: relative;
    display: block;
    cursor: pointer;
}
.tribe-flow-tarjeta input {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    margin: 0;
    opacity: 0;
    cursor: pointer;
}
.tribe-flow-tarjeta > span {
    display: flex;
    flex-direction: column;
    gap: 4px;
    height: 100%;
    padding: var(--espacio-3);
    border: 1.5px solid var(--border);
    border-radius: var(--radio-lg);
    background: var(--bg-card);
}
.tribe-flow-tarjeta em {
    font-style: normal;
    font-size: 0.82rem;
    color: var(--text-muted);
}
.tribe-flow-tarjeta input:checked + span {
    border-color: var(--gradiente-inicio);
    box-shadow: 0 0 0 1px var(--gradiente-inicio) inset;
}
.tribe-flow-tarjeta input:focus-visible + span {
    outline: 2px solid var(--accent);
    outline-offset: 2px;
}
.tribe-flow-resumen {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: var(--espacio-2);
    padding: var(--espacio-3);
    border-radius: var(--radio);
    background: var(--bg-card-alt);
}
@media (max-width: 560px) {
    .tribe-flow-resumen {
        grid-template-columns: 1fr;
    }
}
.tribe-flow-resumen div {
    display: flex;
    flex-direction: column;
    gap: 2px;
}
.tribe-flow-resumen span {
    font-size: 0.72rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.03em;
    color: var(--text-muted);
}
.tribe-flow-resumen strong {
    font-size: 0.9rem;
}
.tribe-flow-acciones {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--espacio-3);
    margin-top: var(--espacio-4);
    padding-top: var(--espacio-3);
    border-top: 1px solid var(--border);
}
.tribe-flow-contador {
    font-size: 0.82rem;
    font-weight: 600;
    color: var(--text-muted);
}
.tribe-flow-botones {
    display: flex;
    align-items: center;
    gap: var(--espacio-2);
}
.tribe-flow-botones .auth-boton {
    margin-top: 0;
}
.tribe-flow-botones [hidden] {
    display: none;
}
.tribe-flow-foto-estado {
    margin: 0;
    font-size: 0.82rem;
    color: var(--text-muted);
}
.tribe-flow-foto-estado.error {
    color: #d93a3a;
    font-weight: 600;
}
.tribe-flow-foto-estado:empty {
    display: none;
}
.perfil-avatar-acciones .boton-cta-contorno.desactivado {
    opacity: 0.5;
    pointer-events: none;
}
/* Sin JS se ven los 4 pasos seguidos y el botón de envío; con JS (clase
   .tribe-flow-activo) solo el paso actual. */
.tribe-flow:not(:has(.tribe-flow-activo)) .tribe-flow-pasos,
.tribe-flow:not(:has(.tribe-flow-activo)) #tribe-flow-siguiente,
.tribe-flow:not(:has(.tribe-flow-activo)) #tribe-flow-atras {
    display: none;
}
.tribe-flow:not(:has(.tribe-flow-activo)) #tribe-flow-enviar {
    display: inline-block;
}
/* `.auth-form label` mete un margen superior y un tamaño de letra de
   etiqueta de campo: no aplica a los chips ni a las tarjetas. */
.auth-form .tribe-chip,
.auth-form .tribe-flow-tarjeta {
    margin: 0;
    font-size: inherit;
    font-weight: inherit;
    color: inherit;
}
.tribe-chips {
    align-items: flex-start;
}
/* SurfMatch: el shaka es un emoji, no un svg. */
.tribe-matches-like {
    font-size: 1.9rem;
    line-height: 1;
}
.tribe-matches-acciones form {
    margin: 0;
}

/* =======================================================================
   tribe/landing — página de Tribe para quien aún no tiene perfil
======================================================================= */
.tribe-lp-hero {
    display: grid;
    grid-template-columns: 1.15fr 1fr;
    gap: var(--espacio-5);
    align-items: center;
}
/* Mismos tamaños y pesos que el resto de Tribe (tribe-landing-lema y
   .tribe-landing p): solo cambia la maquetación. El ritmo vertical lo da
   el `gap` de la columna de texto, no los márgenes de cada elemento. */
.tribe-lp-texto {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: var(--espacio-3);
}
.tribe-lp-titulo {
    margin: -6px 0 0 0;
    font-size: var(--fs-titulo-pagina);
    font-weight: 700;
    line-height: 1.3;
}
.tribe-lp .tribe-lp-entradilla,
.tribe-lp .tribe-lp-nota {
    margin: 0;
}
.tribe-lp .tribe-lp-nota {
    padding: var(--espacio-3);
    border-radius: var(--radio-lg);
    background: color-mix(in srgb, var(--accent) 10%, var(--bg-card));
    color: var(--text);
}
.tribe-lp .tribe-lp-texto .boton-cta {
    margin-top: var(--espacio-1);
}
.tribe-lp-imagen img {
    display: block;
    width: 100%;
    aspect-ratio: 1 / 1;
    object-fit: cover;
    object-position: 40% center;
    border-radius: var(--radio-lg);
}
.tribe-lp-pasos {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    margin-top: var(--espacio-5);
    padding-top: var(--espacio-4);
    border-top: 1px solid var(--border);
}
.tribe-lp-paso {
    display: flex;
    align-items: flex-start;
    gap: var(--espacio-3);
    padding: 0 var(--espacio-4);
}
.tribe-lp-paso:first-child {
    padding-left: 0;
}
.tribe-lp-paso + .tribe-lp-paso {
    border-left: 1px solid var(--border);
}
.tribe-lp-paso .tribe-landing-paso-numero {
    flex-shrink: 0;
    width: 36px;
    height: 36px;
    margin-bottom: 0;
    border-radius: 10px;
}
.tribe-lp-paso h2 {
    margin: 0 0 4px 0;
    font-size: var(--fs-titulo-sub);
}
.tribe-lp-paso p {
    margin: 0;
    font-size: 0.88rem;
    color: var(--text-muted);
    line-height: 1.45;
}
@media (max-width: 800px) {
    .tribe-lp-hero {
        grid-template-columns: 1fr;
        gap: var(--espacio-4);
    }
    .tribe-lp-imagen {
        order: -1;
    }
    .tribe-lp-pasos {
        grid-template-columns: 1fr;
        gap: var(--espacio-3);
    }
    .tribe-lp-paso,
    .tribe-lp-paso:first-child {
        padding: 0;
    }
    .tribe-lp-paso + .tribe-lp-paso {
        border-left: 0;
    }
}
/* iOS Safari hace zoom al enfocar un campo con letra menor de 16px y deja la
   página desplazable de lado al terminar. Los selects ya van a 16px; los
   campos de texto del formulario de Tribe (saludo, otro deporte) iban a
   15.2px. */
@media (max-width: 800px) {
    .tribe-flow input[type="text"] {
        font-size: 16px;
    }
}

/* tribe/bienvenida — ritmo vertical uniforme en la columna de texto (insignia,
   titular, párrafo, botones): lo da el `gap`, no los márgenes de cada uno. */
.tribe-bienvenida-texto {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: var(--espacio-3);
}
.tribe-bienvenida-texto > * {
    margin: 0;
}
.tribe-landing .tribe-bienvenida-texto > p {
    margin: 0;
}
.tribe-bienvenida-texto .tribe-landing-acciones {
    margin-top: var(--espacio-1);
}

/* SurfMatch real (tribe/surfmatch/index) (la maqueta dev/matches ya no existe). */
button.tribe-matches-pestana {
    font-family: inherit;
    cursor: pointer;
}
.tribe-matches-grid > [hidden] {
    display: none;
}
a.tribe-matches-persona {
    margin-bottom: 0;
    text-decoration: none;
    color: inherit;
}
.tribe-matches-tabs-acciones span {
    display: inline-flex;
    align-items: center;
    gap: 6px;
}

/* =======================================================================
   Tacto: todo lo pulsable se encoge un poco al tocarlo, con rebote suave
   (propiedad `scale`, que se suma a cualquier `transform` que ya tenga el
   elemento). Las tarjetas enlazadas suben y ganan sombra en vez de
   encogerse. Valores en base.css (--toque-*). `.toque` lo pone
   js/toque.js (en iOS Safari `:active` no funciona al tocar). Ver
   EFECTOS-CSS.md.
======================================================================= */
.boton-cta,
.boton-cta-contorno,
.auth-boton,
.auth-boton-google,
.perfil-boton-secundario,
.perfil-boton-peligro,
.inicio-banner-tribe-boton,
.pagina-tabs a,
.zoco-categorias a,
.zoco-subcategorias a,
.tribe-planes-filtro,
.zoco-icono-boton,
.menu-hamburguesa,
.cuenta-saludo,
.tribe-matches-pasar,
.tribe-matches-like,
.btn-compartir,
.menu-fila-boton,
.paginacion-enlace,
.tribe-matches-persona {
    transition:
        scale var(--toque-duracion) var(--toque-curva),
        background 0.15s ease,
        color 0.15s ease,
        border-color 0.15s ease,
        box-shadow 0.15s ease,
        filter 0.15s ease,
        opacity 0.15s ease;
}
:is(
    .boton-cta,
    .boton-cta-contorno,
    .auth-boton,
    .auth-boton-google,
    .perfil-boton-secundario,
    .perfil-boton-peligro,
    .inicio-banner-tribe-boton,
    .pagina-tabs a,
    .zoco-categorias a,
    .zoco-subcategorias a,
    .tribe-planes-filtro,
    .zoco-icono-boton,
    .menu-hamburguesa,
    .cuenta-saludo,
    .tribe-matches-pasar,
    .tribe-matches-like,
    .btn-compartir,
    .menu-fila-boton,
    .paginacion-enlace,
    .tribe-matches-persona
):not(.paginacion-deshabilitado):is(:active, .toque) {
    scale: var(--toque-escala);
}
.zoco-tarjeta {
    transition:
        transform var(--toque-duracion) var(--toque-curva),
        box-shadow 0.2s ease;
}
.zoco-tarjeta:is(:active, .toque) {
    transform: translateY(calc(var(--toque-elevacion) * -1));
    box-shadow: var(--sombra-toque);
}
@media (prefers-reduced-motion: reduce) {
    :is(
        .boton-cta,
        .boton-cta-contorno,
        .auth-boton,
        .auth-boton-google,
        .perfil-boton-secundario,
        .perfil-boton-peligro,
        .inicio-banner-tribe-boton,
        .pagina-tabs a,
        .zoco-categorias a,
        .zoco-subcategorias a,
        .tribe-planes-filtro,
        .zoco-icono-boton,
        .menu-hamburguesa,
        .cuenta-saludo,
        .tribe-matches-pasar,
        .tribe-matches-like,
        .btn-compartir,
        .menu-fila-boton,
        .paginacion-enlace,
        .tribe-matches-persona
    ):is(:active, .toque) {
        scale: 1;
    }
    .zoco-tarjeta:is(:active, .toque) {
        transform: none;
    }
}

/* =======================================================================
   Aparición al cargar y al hacer scroll. Dos tipos de elemento:
   - TARJETAS (listas de cosas pequeñas): fundido largo, con subida y
     escalonado entre ellas (variables --aparece-*).
   - BLOQUES (cajas grandes de página, secciones, ficha): fundido corto con
     una subida mínima y sin retraso (--aparece-bloque-*), para que al cargar
     no se vea la página "vacía" mientras la cabecera ya está.
   Nacen ocultos desde el primer pintado (sin parpadeo) y js/revela.js los
   muestra al entrar en pantalla. Solo `opacity` y `transform` (GPU); sin
   `scale`, que en iOS parpadea con esquinas redondeadas. La clase
   `con-revela` solo la pone el <head> si hay IntersectionObserver y no se
   pidió reducir el movimiento; sin ella (o sin JavaScript) todo se ve normal.
   Si el script no llega a ejecutarse, a los 3 s se muestra todo. Las listas
   de selectores están repetidas en js/revela.js (las comprueba un test).
   Ver EFECTOS-CSS.md, bloque 2.
======================================================================= */
.con-revela :where(
    .zoco-grid > .zoco-tarjeta-contenedor,
    .tribe-matches-grid > .tribe-bienvenida-card,
    .tribe-sesiones-lista > .tribe-sesion-fila,
    .mapas-grid > .visor-mapa,
    .webcams-grid > .webcam-card,
    .zoco-mios-lista > .zoco-mios-fila
):not(.revelado) {
    opacity: 0;
    transform: translateY(var(--aparece-subida));
    will-change: opacity, transform;
}
.con-revela :where(
    .inicio-secciones > :not(.modal-overlay),
    main > .perfil-caja:not(:has(> .perfil-seccion)),
    .perfil-caja > .perfil-seccion,
    .intranet-contenido > :is(.perfil-caja, .perfil-seccion, .intranet-vacio),
    .intranet-contenido > div:not([class]) > :is(.perfil-seccion, form),
    .zoco-detalle > :is(.zoco-detalle-imagenes, .zoco-detalle-info),
    main > .inicio-snippet,
    .error-pagina,
    main > .auth-caja
):not(.revelado) {
    opacity: 0;
    transform: translateY(var(--aparece-bloque-subida));
    will-change: opacity, transform;
}
.con-revela:not(.revela-listo) :where(
    .zoco-grid > .zoco-tarjeta-contenedor,
    .tribe-matches-grid > .tribe-bienvenida-card,
    .tribe-sesiones-lista > .tribe-sesion-fila,
    .mapas-grid > .visor-mapa,
    .webcams-grid > .webcam-card,
    .zoco-mios-lista > .zoco-mios-fila,
    .inicio-secciones > :not(.modal-overlay),
    main > .perfil-caja:not(:has(> .perfil-seccion)),
    .perfil-caja > .perfil-seccion,
    .intranet-contenido > :is(.perfil-caja, .perfil-seccion, .intranet-vacio),
    .intranet-contenido > div:not([class]) > :is(.perfil-seccion, form),
    .zoco-detalle > :is(.zoco-detalle-imagenes, .zoco-detalle-info),
    main > .inicio-snippet,
    .error-pagina,
    main > .auth-caja
):not(.revelado) {
    animation: revela-seguridad 0s 3s forwards;
}
.con-revela :where(
    .zoco-grid > .zoco-tarjeta-contenedor,
    .tribe-matches-grid > .tribe-bienvenida-card,
    .tribe-sesiones-lista > .tribe-sesion-fila,
    .mapas-grid > .visor-mapa,
    .webcams-grid > .webcam-card,
    .zoco-mios-lista > .zoco-mios-fila
).revelado {
    transition:
        opacity var(--aparece-duracion) var(--aparece-curva),
        transform var(--aparece-duracion) var(--aparece-curva);
}
.con-revela :where(
    .inicio-secciones > :not(.modal-overlay),
    main > .perfil-caja:not(:has(> .perfil-seccion)),
    .perfil-caja > .perfil-seccion,
    .intranet-contenido > :is(.perfil-caja, .perfil-seccion, .intranet-vacio),
    .intranet-contenido > div:not([class]) > :is(.perfil-seccion, form),
    .zoco-detalle > :is(.zoco-detalle-imagenes, .zoco-detalle-info),
    main > .inicio-snippet,
    .error-pagina,
    main > .auth-caja
).revelado {
    transition:
        opacity var(--aparece-bloque-duracion) var(--aparece-bloque-curva),
        transform var(--aparece-bloque-duracion) var(--aparece-bloque-curva);
}
/* Las fotos de las tarjetas se funden al terminar de cargar (js/revela.js
   pone .cargada), en vez de saltar de golpe sobre el hueco gris. */
.con-revela :where(.zoco-tarjeta-imagen) > img {
    opacity: 0;
    transition: opacity 0.5s ease-out;
}
.con-revela :where(.zoco-tarjeta-imagen) > img.cargada {
    opacity: 1;
}
.con-revela:not(.revela-listo) :where(.zoco-tarjeta-imagen) > img {
    opacity: 1;
}
@keyframes revela-seguridad {
    to {
        opacity: 1;
        transform: none;
    }
}

/* Previsiones y mensajes/chat: sus bloques contienen elementos fijos (la barra de
   previsiones, el panel de conversación), así que
   no puede llevar `transform` ni `will-change: transform` (la descolocarían).
   Entra con un fundido solo de `opacity`, que no cambia a los hijos `fixed`. */
@keyframes previsiones-entra {
    from {
        opacity: 0;
    }
}
@media (prefers-reduced-motion: no-preference) {
    .con-revela :is(.prevision-nueva, .mensajes-grid) {
        animation: previsiones-entra var(--aparece-duracion) var(--aparece-curva) backwards;
    }
}

/* Indicador deslizante (js/deslizante.js), solo escritorio con ratón: una
   píldora se desliza bajo el elemento resaltado — pestañas, menús, barra
   lateral de la cuenta y horas/días de Previsiones. El JS añade .desliza al
   contenedor mientras dura y lo retira al terminar. */
.pagina-tabs.desliza,
.prevision-tira-dia.desliza,
.prevision-dias-tira.desliza {
    position: relative;
}
.indicador-deslizante {
    position: absolute;
    z-index: 0;
    top: 0;
    left: 0;
    width: var(--indicador-w, 0);
    height: var(--indicador-h, 0);
    border-radius: 999px;
    background: var(--gradiente-marca);
    transform: translate(var(--indicador-x, 0), var(--indicador-y, 0));
    opacity: 0;
    pointer-events: none;
}
.indicador-deslizante.visible {
    opacity: 1;
}
.desliza.animado > .indicador-deslizante {
    transition: transform 320ms cubic-bezier(0.22, 1, 0.36, 1), width 320ms cubic-bezier(0.22, 1, 0.36, 1), height 320ms cubic-bezier(0.22, 1, 0.36, 1), opacity 160ms ease;
}

/* Menús verticales */
:is(.menu-desplegable, .intranet-sidebar).desliza a,
:is(.menu-desplegable, .intranet-sidebar).desliza .menu-fila-boton {
    position: relative;
    z-index: 1;
    background: none;
    color: var(--text);
    transition: color 200ms ease;
}
:is(.menu-desplegable, .intranet-sidebar).desliza a:hover,
:is(.menu-desplegable, .intranet-sidebar).desliza .menu-fila-boton:hover {
    background: none;
}
:is(.menu-desplegable, .intranet-sidebar).desliza .resaltado {
    color: #fff;
}
:is(.menu-desplegable, .intranet-sidebar).desliza a.activa:not(.resaltado) .cuenta-badge-mensajes,
#menuDesplegable.desliza a.activa:not(.resaltado) .cuenta-badge-mensajes {
    background: var(--accent2);
    color: #fff;
}
:is(.menu-desplegable, .intranet-sidebar).desliza a.resaltado .cuenta-badge-mensajes,
#menuDesplegable.desliza a.resaltado .cuenta-badge-mensajes {
    background: #fff;
    color: var(--accent2);
}

/* Pestañas (.pagina-tabs) */
.pagina-tabs.desliza a {
    position: relative;
    z-index: 1;
    background: var(--bg-card);
    color: var(--text-muted);
    transition: color 220ms ease, background-color 220ms ease;
}
.pagina-tabs.desliza a.resaltado {
    background: transparent;
    color: #fff;
}

/* Horas de Previsiones */
.prevision-tira-dia.desliza .indicador-deslizante {
    border-radius: var(--radio-boton);
}
.prevision-tira-dia.desliza .prevision-tira-boton {
    position: relative;
    z-index: 1;
    background: var(--bg);
    border-color: var(--border);
    color: var(--text-muted);
    transition: color 220ms ease, background-color 220ms ease, border-color 220ms ease;
}
.prevision-tira-dia.desliza .prevision-tira-boton.resaltado {
    background: transparent;
    border-color: transparent;
    color: #fff;
}

/* Días de Previsiones: conservan su color (rosa suave con borde rosa) y su
   forma; solo se desliza ese mismo recuadro. */
.prevision-dias-tira.desliza .indicador-deslizante {
    box-sizing: border-box;
    border: 1.5px solid var(--gradiente-inicio);
    border-radius: var(--radio);
    background: color-mix(in srgb, var(--gradiente-inicio) 8%, var(--bg-card));
}
.prevision-dias-tira.desliza .prevision-dia-tira-boton:not(.prevision-dia-tira-bloqueado) {
    position: relative;
    z-index: 1;
    background: var(--bg-card);
    border-color: var(--border);
    color: var(--text);
    transition: color 220ms ease, background-color 220ms ease, border-color 220ms ease;
}
.prevision-dias-tira.desliza .prevision-dia-tira-boton:not(.prevision-dia-tira-bloqueado) span {
    color: var(--text-muted);
}
.prevision-dias-tira.desliza .prevision-dia-tira-boton.resaltado {
    background: transparent;
    border-color: transparent;
    color: var(--gradiente-inicio);
}
.prevision-dias-tira.desliza .prevision-dia-tira-boton.resaltado span {
    color: var(--gradiente-inicio);
}

@media (prefers-reduced-motion: reduce) {
    .desliza.animado > .indicador-deslizante,
    .desliza a,
    .desliza .menu-fila-boton,
    .desliza .prevision-tira-boton,
    .desliza .prevision-dia-tira-boton {
        transition: none;
    }
}

/* =======================================================================
   Zoco: barra de búsqueda y filtros + panel lateral de filtros
======================================================================= */
.zoco-barra {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 14px;
    margin-top: var(--espacio-4);
}
.zoco-barra-acciones {
    display: flex;
    align-items: center;
    gap: 10px;
    min-width: 0;
}
.zoco-buscador-caja {
    width: min(290px, 38vw);
    min-height: 46px;
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 0 14px;
    border: 1px solid var(--border);
    border-radius: 999px;
    background: var(--bg-card);
    color: var(--text-muted);
}
.zoco-buscador-caja svg {
    width: 18px;
    height: 18px;
    flex-shrink: 0;
}
.zoco-buscador-caja input {
    min-width: 0;
    flex: 1;
    border: 0;
    outline: 0;
    background: transparent;
    color: var(--text);
    font: inherit;
    font-size: 0.9rem;
}
.zoco-filtros-boton {
    position: relative;
    min-height: 46px;
    display: inline-flex;
    align-items: center;
    gap: 9px;
    padding: 9px 17px;
    border: 1px solid #e31a83;
    border-radius: 999px;
    background: var(--bg-card);
    color: #e31a83;
    font: inherit;
    font-weight: 600;
    cursor: pointer;
}
.zoco-filtros-boton svg {
    width: 18px;
    height: 18px;
}
.zoco-filtros-contador {
    min-width: 22px;
    height: 22px;
    display: grid;
    place-items: center;
    padding: 0 6px;
    border-radius: 999px;
    background: #e31a83;
    color: #fff;
    font-size: 0.7rem;
    font-weight: 700;
}
.zoco-mensajes-boton {
    position: relative;
    width: 46px;
    height: 46px;
    flex-shrink: 0;
    display: grid;
    place-items: center;
    border: 1px solid var(--border);
    border-radius: 50%;
    background: var(--bg-card);
    color: var(--text-muted);
    text-decoration: none;
    transition: background 0.15s ease, color 0.15s ease;
}
.zoco-mensajes-boton svg {
    width: 20px;
    height: 20px;
}
.zoco-mensajes-boton:hover,
.zoco-mensajes-boton:focus-visible {
    background: #e31a83;
    border-color: #e31a83;
    color: #fff;
}
.zoco-mensajes-contador {
    position: absolute;
    top: -5px;
    right: -5px;
    min-width: 20px;
    height: 20px;
    display: grid;
    place-items: center;
    padding: 0 5px;
    border-radius: 999px;
    background: #e31a83;
    color: #fff;
    font-size: 0.68rem;
    font-weight: 700;
    box-shadow: 0 0 0 2px var(--bg-card);
}
.zoco-mensajes-contador[hidden] {
    display: none;
}
.zoco-publicar {
    min-height: 46px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    padding: 9px 19px;
    border-radius: 999px;
    background: var(--gradiente-marca);
    color: #fff;
    font-weight: 700;
    text-decoration: none;
    box-shadow: 0 6px 18px var(--shadow-gradiente);
}
.zoco-publicar svg {
    width: 18px;
    height: 18px;
}
@media (max-width: 760px) {
    .zoco-barra-acciones {
        width: 100%;
    }
    .zoco-buscador-caja {
        width: auto;
        flex: 1;
    }
    .zoco-publicar {
        width: 100%;
    }
}
@media (max-width: 360px) {
    .zoco-filtros-boton-texto {
        display: none;
    }
    .zoco-filtros-boton {
        width: 46px;
        padding: 0;
        justify-content: center;
    }
    .zoco-filtros-contador {
        position: absolute;
        right: -5px;
        top: -6px;
    }
}
.zoco-filtros-resumen {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 14px;
    margin-top: 14px;
    padding: 10px 14px;
    border-radius: 15px;
    background: var(--bg-card);
}
.zoco-filtros-resumen-izq {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 8px;
}
.zoco-filtros-resumen-etiqueta {
    color: var(--text-muted);
    font-size: 0.8rem;
}
.zoco-filtros-chip {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    min-height: 31px;
    padding: 5px 11px;
    border-radius: 999px;
    background: var(--bg);
    color: var(--text);
    font-size: 0.8rem;
    font-weight: 600;
    text-decoration: none;
}
.zoco-filtros-chip span {
    color: #e31a83;
    font-size: 1rem;
    line-height: 1;
}
.zoco-filtros-limpiar {
    color: #e31a83;
    font-size: 0.8rem;
    font-weight: 600;
    text-decoration: none;
    white-space: nowrap;
}
@media (max-width: 760px) {
    .zoco-filtros-resumen {
        flex-direction: column;
        align-items: flex-start;
    }
    .zoco-filtros-limpiar {
        align-self: flex-end;
    }
}
.zoco-resultados-meta {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    margin: var(--espacio-4) 0 var(--espacio-2);
    color: var(--text-muted);
    font-size: 0.85rem;
}
.zoco-orden {
    display: flex;
    align-items: center;
    gap: 8px;
}
.zoco-orden label {
    flex-shrink: 0;
    margin: 0;
    font-size: 0.75rem;
    white-space: nowrap;
}
.zoco-orden select {
    min-height: 38px;
    padding: 6px 12px;
    border: 1px solid var(--border);
    border-radius: 12px;
    background: var(--bg-card);
    color: var(--text);
    font: inherit;
    font-size: 0.85rem;
}
@media (max-width: 760px) {
    .zoco-orden label {
        display: none;
    }
}

/* Panel: lateral derecho en escritorio, hoja desde abajo en móvil */
.zoco-filtros-fondo {
    position: fixed;
    inset: 0;
    z-index: 90;
    background: rgba(4, 14, 22, 0.42);
    opacity: 0;
    transition: opacity 220ms ease;
}
.zoco-filtros-fondo[hidden] {
    display: none;
}
.zoco-filtros-fondo.abierto {
    opacity: 1;
}
.zoco-filtros-panel {
    position: fixed;
    z-index: 91;
    top: 0;
    right: 0;
    width: min(420px, 92vw);
    height: 100%;
    background: var(--bg-card);
    box-shadow: -22px 0 54px rgba(0, 0, 0, 0.18);
    transform: translateX(105%);
    transition: transform 220ms ease;
    visibility: hidden;
}
.zoco-filtros-panel.abierto {
    transform: translateX(0);
    visibility: visible;
}
html.zoco-filtros-abierto {
    overflow: hidden;
}
.zoco-filtros-form {
    height: 100%;
    display: flex;
    flex-direction: column;
    padding: 26px;
}
.zoco-filtros-cabecera {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
}
.zoco-filtros-cabecera h2 {
    margin: 0;
    font-size: var(--fs-titulo-seccion);
}
.zoco-filtros-cerrar {
    width: 42px;
    height: 42px;
    display: grid;
    place-items: center;
    border: 1px solid var(--border);
    border-radius: 50%;
    background: transparent;
    color: var(--text);
    cursor: pointer;
}
.zoco-filtros-cuerpo {
    flex: 1;
    overflow-y: auto;
    min-height: 0;
}
.zoco-filtros-seccion {
    padding: 22px 0;
    border-bottom: 1px solid var(--border);
}
.zoco-filtros-seccion[hidden] {
    display: none;
}
.zoco-filtros-seccion-nombre {
    margin: 0;
    font-size: 0.8rem;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: var(--text-muted);
}
.zoco-filtros-opciones {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 8px;
    margin-top: 13px;
}
.zoco-filtros-opcion {
    min-height: 42px;
    display: flex;
    align-items: center;
    gap: 9px;
    padding: 9px 11px;
    border: 1px solid var(--border);
    border-radius: 13px;
    color: var(--text-muted);
    font-size: 0.85rem;
    cursor: pointer;
}
.zoco-filtros-opcion:has(input:checked) {
    border-color: #e31a83;
    color: var(--text);
    background: color-mix(in srgb, #e31a83 8%, var(--bg-card));
}
.zoco-filtros-opcion input {
    accent-color: #e31a83;
    flex-shrink: 0;
}
.zoco-filtros-acciones {
    display: grid;
    grid-template-columns: 0.75fr 1.25fr;
    gap: 9px;
    padding-top: 22px;
}
.zoco-filtros-restablecer,
.zoco-filtros-aplicar {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 46px;
    border-radius: 999px;
    font: inherit;
    font-weight: 700;
    cursor: pointer;
}
.zoco-filtros-restablecer {
    text-decoration: none;
    border: 1px solid var(--border);
    background: transparent;
    color: var(--text-muted);
}
.zoco-filtros-aplicar {
    border: 0;
    background: var(--gradiente-marca);
    color: #fff;
}
@media (max-width: 760px) {
    .zoco-filtros-panel {
        top: auto;
        bottom: 0;
        width: 100%;
        height: auto;
        max-height: 88vh;
        max-height: 88dvh;
        display: flex;
        flex-direction: column;
        border-radius: 24px 24px 0 0;
        transform: translateY(105%);
    }
    .zoco-filtros-panel.abierto {
        transform: translateY(0);
    }
    /* El cuerpo es lo que se desplaza; "Restablecer" y "Ver N anuncios"
       quedan siempre a la vista aunque la lista de opciones sea larga. */
    .zoco-filtros-form {
        height: auto;
        min-height: 0;
        flex: 1;
        padding: 20px 16px calc(22px + env(safe-area-inset-bottom));
    }
}
@media (max-width: 360px) {
    .zoco-filtros-opciones {
        grid-template-columns: 1fr;
    }
}
@media (prefers-reduced-motion: reduce) {
    .zoco-filtros-panel,
    .zoco-filtros-fondo {
        transition: none;
    }
}

/* Enlaces a todas las categorías (rastreables por buscadores), al pie del listado */
.zoco-explorar {
    margin-top: var(--espacio-5);
    color: var(--text-muted);
    font-size: 0.85rem;
}
.zoco-explorar ul {
    list-style: none;
    margin: 0;
    padding: 0;
}
.zoco-explorar > ul {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
    gap: 12px;
}
.zoco-explorar > ul > li > a {
    font-weight: 700;
    color: var(--text);
}
.zoco-explorar ul ul {
    display: flex;
    flex-wrap: wrap;
    gap: 2px 12px;
    margin-top: 4px;
}
.zoco-explorar a {
    color: var(--text-muted);
    text-decoration: none;
}
.zoco-explorar a:hover {
    color: var(--text);
    text-decoration: underline;
}
@media (max-width: 760px) {
    .zoco-explorar {
        display: none;
    }
}

/* Etiqueta de compatibilidad de SurfMatch: baja / media / alta. */
.tribe-matches-compatibilidad-baja {
    background: var(--bg-card-alt);
    color: var(--text-muted);
}
.tribe-matches-compatibilidad-media {
    background: color-mix(in srgb, var(--accent) 15%, var(--bg-card));
    color: var(--accent);
}
.tribe-matches-compatibilidad-alta {
    background: color-mix(in srgb, var(--green) 18%, var(--bg-card));
    color: var(--green);
}
