/**
 * VISTA MOSAICO — Carta de Restaurante
 *
 * Namespace .rl-mosaico* / .rl-mosaico-overlay*
 * No comparte NINGUNA clase con la vista de lista, de modo que ambas
 * pueden convivir en la misma página sin pisarse.
 *
 * ---------------------------------------------------------------
 * PERSONALIZACIÓN DESDE EL TEMA
 * ---------------------------------------------------------------
 * Los tamaños de texto van en em/rem, así que HEREDAN del tema: si el
 * tema cambia la tipografía base, el mosaico se ajusta solo.
 *
 * El resto (colores, radios, separaciones) se expone como variables CSS.
 * Para redefinirlas basta con esto en el CSS del tema:
 *
 *   .restaurant-menu {
 *       --rl-mosaico-radio: 4px;
 *       --rl-mosaico-gap: 24px;
 *       --rl-mosaico-precio-color: #b8860b;
 *   }
 *
 * NO hace falta tocar este archivo (se sobrescribiría al actualizar).
 */

.restaurant-menu {
    /* Colores. Por defecto se enganchan a las variables que ya usa
       la vista de lista, para que ambas vistas vayan a juego. */
    --rl-mosaico-precio-color: var(--rm-precio-color, var(--rm-font-secondary, #666));

    /* Etiqueta de precio sobre la foto */
    --rl-mosaico-precio-fondo: rgba(255, 255, 255, .94);

    /* Cinta del nombre (pegada a la foto).
       Usa el par "Color del botón" + "Color del texto del botón" del
       Personalizador del tema: son dos ajustes pensados para ir juntos, así que
       el contraste está garantizado (no puede quedar texto ilegible sobre el
       fondo, que es el riesgo de fijar el texto en blanco).

       Estas variables las publica el tema y ya NO las pisa nadie: el plugin
       inyectaba --rm-secondary-color con un `style` inline desde una opción
       huérfana suya, y eso se ha eliminado. Los colores son cosa del tema. */
    --rl-mosaico-cinta-fondo: var(--rm-secondary-color, #1E90FF);
    --rl-mosaico-cinta-texto: var(--rm-secondary-text-color, #fff);
}

.rl-mosaico-overlay {
    /* El overlay se inyecta en <body>, fuera de .restaurant-menu. Antes esto era
       un problema porque el color de precio salía del color de BOTÓN, que el
       plugin inyectaba inline en ese contenedor (y que además podía ser claro,
       dejando el precio blanco sobre el panel blanco).
       Ahora el tema publica --rm-precio-color en :root, así que el overlay la ve
       igual que la carta: misma fuente de verdad, sin trucos. */
    --rl-mosaico-precio-color: var(--rm-precio-color, var(--rm-font-secondary, #666));
}

.restaurant-menu,
.rl-mosaico-overlay {
    /* Separación entre celdas */
    --rl-mosaico-gap: 14px;
    --rl-mosaico-gap-tablet: 18px;
    --rl-mosaico-gap-desktop: 20px;

    /* Columnas */
    --rl-mosaico-cols-movil: 2;
    --rl-mosaico-cols-tablet: 3;
    --rl-mosaico-cols-desktop: 4;

    /* ---------------------------------------------------------------
       TAMAÑOS DE TEXTO
       Los define el TEMA, desde el Personalizador ("Mosaico: tamaños de
       texto"), y los publica en :root como variables --rl-mosaico-txt-*.

       Aquí NO se declaran a propósito: si el plugin las declarase en
       .restaurant-menu (especificidad 0,1,0) ganarían al :root del tema y el
       Personalizador no tendría ningún efecto. Es el mismo choque que ya
       ocurrió con el color.

       Los valores por defecto van como fallback dentro de cada var(), así que
       el mosaico funciona igual aunque el tema no esté activo.
       --------------------------------------------------------------- */

    /* Cuánto se amplían nombre y precio en el overlay respecto a la celda.
       1.4 = 40% más grande. (Un x2 resultaba demasiado grande en pantalla.)
       Se declara AQUÍ, en el bloque compartido, porque el overlay se inyecta
       en <body>, fuera de .restaurant-menu, y allí no vería la variable.
       Ajustable desde el tema:  --rl-mosaico-zoom: 1.6; */
    --rl-mosaico-zoom: 1.4;

    /* Radios */
    --rl-mosaico-radio: 12px;
    --rl-mosaico-radio-overlay: 16px;

    /* Proporción de la figura (1/1 = cuadrado) */
    --rl-mosaico-proporcion: 1 / 1;

    /* Colores (el color de precio se define arriba, por contexto). */
    --rl-mosaico-fondo-figura: #f0f0f0;
    --rl-mosaico-overlay-fondo: rgba(0, 0, 0, .78);
    --rl-mosaico-overlay-panel: #fff;
    --rl-mosaico-overlay-texto: #1a1a1a;
    --rl-mosaico-alergeno-fondo: #f4f4f4;
}

/* =========================================================
   REJILLA
   ========================================================= */

.rl-mosaico {
    display: grid;
    /* 2 columnas en móvil (donde se va a usar el 90% del tiempo). */
    grid-template-columns: repeat(var(--rl-mosaico-cols-movil, 2), 1fr);
    gap: var(--rl-mosaico-gap, 14px);
    margin: 0 0 28px;
    padding: 0;
}

/* Tablet */
@media (min-width: 600px) {
    .rl-mosaico {
        grid-template-columns: repeat(var(--rl-mosaico-cols-tablet, 3), 1fr);
        gap: var(--rl-mosaico-gap-tablet, 18px);
    }
}

/* Escritorio */
@media (min-width: 900px) {
    .rl-mosaico {
        grid-template-columns: repeat(var(--rl-mosaico-cols-desktop, 4), 1fr);
        gap: var(--rl-mosaico-gap-desktop, 20px);
    }
}

/* =========================================================
   CELDA
   ========================================================= */

.rl-mosaico__item {
    display: flex;
    flex-direction: column;
    /* Los hijos (figura e info) deben ocupar TODO el ancho de la celda.
       Sin esto, el <button> los encoge a su contenido: la figura queda más
       estrecha (y la etiqueta de precio, posicionada respecto a ella, se sale
       de la foto) y el nombre no se puede centrar. */
    align-items: stretch;
    /* Las celdas se estiran a la altura de su fila (grid), y el bloque de info
       se empuja con margin-top:auto. Así el precio queda SIEMPRE pegado a su
       nombre, tenga 1 línea o 2, y aun así todas las filas quedan alineadas.
       (Antes se reservaban 2 líneas con min-height en el nombre, lo que dejaba
       un hueco enorme bajo los títulos de una sola línea.) */
    height: 100%;
    /* Reset del <button> (se usa button por accesibilidad, no por estilo). */
    margin: 0;
    padding: 0;
    border: 0;
    background: none;
    font: inherit;
    color: inherit;
    text-align: center;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
    /* La sombra va en la TARJETA (foto + cinta), no solo en la foto: si no, la
       cinta quedaría fuera de la sombra, como pegada por debajo. */
    border-radius: var(--rl-mosaico-radio, 12px);
    box-shadow: 0 2px 10px rgba(0, 0, 0, .10);
    transition: transform .12s ease, box-shadow .28s ease;
}

.rl-mosaico__item:focus-visible {
    outline: 3px solid var(--rl-mosaico-precio-color, #666);
    outline-offset: 3px;
    border-radius: var(--rl-mosaico-radio, 12px);
}

/* --- Figura cuadrada --- */
.rl-mosaico__figura {
    /* <span> es inline por defecto: hay que forzarlo a bloque. */
    align-self: stretch;
    position: relative;
    display: block;
    width: 100%;
    /* El cuadrado se fuerza aquí: da igual que la foto sea
       horizontal o vertical, object-fit: cover la recorta. */
    aspect-ratio: var(--rl-mosaico-proporcion, 1 / 1);
    overflow: hidden;
    /* Solo se redondean las esquinas de ARRIBA: la cinta del nombre va pegada
       debajo y continúa la tarjeta, redondeando ella las de abajo. */
    border-radius: var(--rl-mosaico-radio, 12px) var(--rl-mosaico-radio, 12px) 0 0;
    background-color: var(--rl-mosaico-fondo-figura, #f0f0f0);
}

.rl-mosaico__img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
    transition: transform .35s ease;
}

@media (hover: hover) {
    /* La foto hace zoom y la tarjeta se eleva ligeramente. La etiqueta de
       precio NO escala: el zoom se aplica a .rl-mosaico__img, no a la figura. */
    .rl-mosaico__item:hover .rl-mosaico__img {
        transform: scale(1.06);
    }

    .rl-mosaico__item:hover {
        box-shadow: 0 8px 22px rgba(0, 0, 0, .18);
    }

    /* El nombre ya NO cambia de color en hover: ahora vive sobre la cinta de
       color, y recolorearlo lo dejaría ilegible. */
}

/* Feedback táctil en móvil (donde no hay hover): la celda entera se hunde
   un poco al pulsar. Se aplica al item, que es quien tiene la transición. */
.rl-mosaico__item:active {
    transform: scale(.97);
}

/* --- Placeholder (sin foto): degradado + nombre grande --- */
.rl-mosaico__placeholder {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 10%;
    box-sizing: border-box;
}

.rl-mosaico__placeholder-txt {
    color: #fff;
    /* Inicial del producto: el nombre completo va debajo de la celda. */
    font-size: clamp(2rem, 11vw, 3.6rem);
    font-weight: 700;
    line-height: 1;
    text-align: center;
    /* Sombra sutil para asegurar contraste sobre cualquier tono del degradado. */
    text-shadow: 0 1px 4px rgba(0, 0, 0, .3);
}

/* --- Info bajo la figura --- */
.rl-mosaico__info {
    /* OJO: NO usar flex + align-items:center aquí.
       align-items:center ENCOGE al hijo a su contenido (en vez de estirarlo),
       así que la caja del nombre acababa midiendo solo lo que el texto
       (~125px en vez del ancho de la celda). El texto quedaba centrado dentro
       de esa caja pequeña, y por tanto se veía pegado a la izquierda.
       Con display:block el <span> del nombre ocupa todo el ancho y el
       text-align:center funciona como se espera. */
    display: block;
    /* CINTA: va pegada a la foto (sin margen), de modo que el nombre queda
       inequívocamente asociado a SU plato. Antes flotaba entre dos filas y no
       se sabía si pertenecía a la foto de arriba o a la de abajo. */
    padding: 8px 6px;
    background: var(--rl-mosaico-cinta-fondo, #1E90FF);
    color: var(--rl-mosaico-cinta-texto, #fff);
    border-radius: 0 0 var(--rl-mosaico-radio, 12px) var(--rl-mosaico-radio, 12px);
}

.rl-mosaico__nombre {
    font-size: var(--rl-mosaico-txt-nombre, 0.95em);
    font-weight: 600;
    line-height: 1.25;
    /* Sin min-height: el nombre ocupa lo que necesita y el precio va justo
       debajo. Los nombres de más de 2 líneas se recortan con puntos
       suspensivos (el nombre completo sigue íntegro en el overlay). */
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    overflow-wrap: anywhere;
    /* Centra la 2ª línea cuando el nombre parte en dos. */
    text-align: center;
    width: 100%;
}

/* --- Indicador de "ampliar" (sobre la foto) ---
   Señal visual de que la celda es pulsable. Imprescindible en móvil, donde no
   hay hover y no había ninguna pista de que se pudiera abrir la ficha.
   Va arriba a la derecha: la esquina inferior derecha la ocupa el precio. */
.rl-mosaico__zoom {
    position: absolute;
    top: 8px;
    right: 8px;
    z-index: 1;
    width: 26px;
    height: 26px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    background: rgba(255, 255, 255, .92);
    color: #444;
    box-shadow: 0 1px 5px rgba(0, 0, 0, .18);
    -webkit-backdrop-filter: blur(4px);
    backdrop-filter: blur(4px);
    transition: transform .2s ease, background .2s ease;
}

.rl-mosaico__zoom svg {
    width: 15px;
    height: 15px;
    display: block;
}

@media (hover: hover) {
    .rl-mosaico__item:hover .rl-mosaico__zoom {
        background: #fff;
        transform: scale(1.12);
    }
}

/* --- Etiqueta de precio (sobre la foto) ---
   Va dentro de .rl-mosaico__figura, en la esquina inferior derecha. Al vivir
   sobre la imagen (que siempre es cuadrada), su posición es constante: ya no
   depende de si el nombre ocupa 1 o 2 líneas. */
.rl-mosaico__precio {
    position: absolute;
    right: 8px;
    bottom: 8px;
    z-index: 1;
    padding: 5px 10px;
    border-radius: 999px;
    background: var(--rl-mosaico-precio-fondo, rgba(255, 255, 255, .94));
    color: var(--rl-mosaico-precio-color, #666);
    font-size: var(--rl-mosaico-txt-precio, 0.85em);
    font-weight: 700;
    line-height: 1.2;
    white-space: nowrap;
    box-shadow: 0 2px 6px rgba(0, 0, 0, .16);
    /* backdrop-filter suaviza el contraste si la foto es muy clara. */
    -webkit-backdrop-filter: blur(4px);
    backdrop-filter: blur(4px);
}

/* =========================================================
   OVERLAY
   ========================================================= */

.rl-mosaico-overlay {
    position: fixed;
    inset: 0;
    z-index: 99999;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 20px;
    box-sizing: border-box;
    background: var(--rl-mosaico-overlay-fondo, rgba(0, 0, 0, .78));
    opacity: 0;
    visibility: hidden;
    transition: opacity .22s ease, visibility .22s ease;
    overscroll-behavior: contain;
    /* El overlay se inyecta en <body>, fuera de .restaurant-menu, así que no
       heredaría la tipografía del tema: se fuerza explícitamente. */
    font-family: inherit;
    /* line-height propio: heredado del tema quedaba demasiado aireado. */
    line-height: 1.35;
}

.rl-mosaico-overlay.is-open {
    opacity: 1;
    visibility: visible;
}

.rl-mosaico-overlay__dialog {
    position: relative;
    width: 100%;
    max-width: 460px;
    max-height: 88vh;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
    background: var(--rl-mosaico-overlay-panel, #fff);
    /* El panel es claro: se fija un color de texto legible en lugar de heredar
       el del tema, que podría ser claro (pensado para fondos oscuros). */
    color: var(--rl-mosaico-overlay-texto, #1a1a1a);
    border-radius: var(--rl-mosaico-radio-overlay, 16px);
    padding: 0 0 22px;
    transform: translateY(14px) scale(.98);
    transition: transform .22s ease;
}

.rl-mosaico-overlay.is-open .rl-mosaico-overlay__dialog {
    transform: translateY(0) scale(1);
}

/* Botón de cierre: siempre visible (imprescindible en móvil).
   Va sobre un círculo blanco sólido, no un gris translúcido: sobre una foto
   clara (helado, plato blanco) el translúcido se confundía con la imagen. */
.rl-mosaico-overlay__close {
    position: absolute;
    top: 12px;
    right: 12px;
    z-index: 2;
    width: 34px;
    height: 34px;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 0;
    border: 0;
    border-radius: 50%;
    background: #fff;
    color: #1a1a1a;
    font-size: 1.25rem;
    line-height: 1;
    cursor: pointer;
    box-shadow: 0 2px 8px rgba(0, 0, 0, .22);
    transition: transform .15s ease;
}

.rl-mosaico-overlay__close:hover {
    transform: scale(1.08);
}

.rl-mosaico-overlay__figura {
    /* Contenedor de los precios, que van superpuestos sobre la foto. */
    position: relative;
    display: block;
    width: 100%;
    aspect-ratio: var(--rl-mosaico-proporcion, 1 / 1);
    overflow: hidden;
    border-radius: var(--rl-mosaico-radio-overlay, 16px) var(--rl-mosaico-radio-overlay, 16px) 0 0;
    background-color: var(--rl-mosaico-fondo-figura, #f0f0f0);
}

.rl-mosaico-overlay__figura img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.rl-mosaico-overlay__figura .rl-mosaico__placeholder {
    position: relative;
    width: 100%;
    height: 100%;
}

/* En el overlay la figura es mucho mayor que la celda: la inicial se escala
   respecto al contenedor, no respecto al ancho de la ventana. */
.rl-mosaico-overlay__figura .rl-mosaico__placeholder-txt {
    font-size: 5rem;
}

.rl-mosaico-overlay__body {
    padding: 20px 22px 0;
}

/* --- Nombre --- */
.rl-mosaico-overlay__nombre {
    margin: 0 0 8px;
    text-align: center;
    /* Ampliación del nombre de la celda (0.95em) por el factor configurable.
       Con el valor por defecto (1.4): 0.95 x 1.4 = 1.33em. */
    font-size: calc(var(--rl-mosaico-txt-nombre, 0.95em) * var(--rl-mosaico-zoom, 1.4));
    font-weight: 700;
    line-height: 1.2;
}

/* --- Precios (SOBRE la foto) ---
   Van superpuestos en la esquina inferior derecha de la imagen, igual que en
   la celda del mosaico. Así, debajo de la foto queda solo el contenido:
   nombre, descripción y alérgenos.

   El degradado oscuro es imprescindible: las fotos de helado tienen zonas muy
   claras (nata, platos blancos) y sin él las píldoras se perderían. */
.rl-mosaico-overlay__precios {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 1;
    display: flex;
    align-items: center;
    /* El precio PRINCIPAL va siempre a la derecha (igual que en la celda del
       mosaico), tanto si hay precio alternativo como si no. El alternativo, si
       existe, queda a la izquierda.

       Se hace con `order` y no reordenando el DOM a propósito: en el HTML el
       precio principal se imprime PRIMERO, que es como debe leerlo un lector de
       pantalla. `order` solo cambia la posición visual. */
    justify-content: flex-end;
    gap: 10px;
    padding: 30px 14px 12px;
    background: linear-gradient(to top, rgba(0, 0, 0, .55), rgba(0, 0, 0, 0));
    /* El degradado no debe bloquear el gesto de cerrar arrastrando. */
    pointer-events: none;
}

.rl-mosaico-overlay__precio {
    padding: 5px 12px;
    border-radius: 999px;
    background: var(--rl-mosaico-precio-fondo, rgba(255, 255, 255, .96));
    color: var(--rl-mosaico-precio-color, #666);
    /* Siempre a la derecha: margin-left:auto empuja el resto del hueco hacia
       la izquierda, así que funciona haya o no precio alternativo. */
    order: 2;
    margin-left: auto;
    /* Ampliación del precio de la celda (0.85em) por el mismo factor. */
    font-size: calc(var(--rl-mosaico-txt-precio, 0.85em) * var(--rl-mosaico-zoom, 1.4));
    font-weight: 800;
    line-height: 1.2;
    white-space: nowrap;
    box-shadow: 0 2px 6px rgba(0, 0, 0, .18);
}

.rl-mosaico-overlay__precio-extra {
    /* Visualmente antes que el principal (order menor), aunque en el DOM va
       después. */
    order: 1;
    padding: 4px 10px;
    border-radius: 999px;
    background: rgba(255, 255, 255, .82);
    color: #444;
    font-size: var(--rl-mosaico-txt-precio-extra, 0.8em);
    font-weight: 600;
    line-height: 1.3;
    box-shadow: 0 1px 4px rgba(0, 0, 0, .14);
    -webkit-backdrop-filter: blur(4px);
    backdrop-filter: blur(4px);
}

/* --- Descripción --- */
.rl-mosaico-overlay__desc {
    /* NO se escala x2: es texto de lectura, no un titular. Al doble quedaría
       desproporcionado. Se mantiene en tamaño cómodo de lectura. */
    font-size: var(--rl-mosaico-txt-desc, 1em);
    line-height: 1.45;
    margin: 0 0 16px;
    opacity: .9;
}

.rl-mosaico-overlay__desc p {
    margin: 0 0 6px;
    line-height: 1.45;
}

.rl-mosaico-overlay__desc p:last-child {
    margin-bottom: 0;
}

/* --- Alérgenos ---
   Separados por una línea fina: son información legal, no parte de la
   descripción comercial. Antes quedaban sueltos, sin delimitar. */
.rl-mosaico-overlay__alergenos-wrap {
    padding-top: 14px;
    border-top: 1px solid rgba(0, 0, 0, .08);
}

.rl-mosaico-overlay__alergenos-tit {
    margin: 0 0 8px;
    text-align: center;
    font-size: var(--rl-mosaico-txt-alergeno-tit, 0.7em);
    font-weight: 700;
    letter-spacing: .08em;
    text-transform: uppercase;
    opacity: .55;
}

.rl-mosaico-overlay__alergenos {
    display: flex;
    flex-wrap: wrap;
    /* Centradas. La descripción sí queda a la izquierda (es texto de lectura y
       centrado costaría más de leer), pero los alérgenos son etiquetas sueltas
       y centradas quedan mejor equilibradas bajo el título. */
    justify-content: center;
    gap: 8px;
}

.rl-mosaico-overlay__alergeno {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 5px 10px 5px 6px;
    border-radius: 999px;
    background: var(--rl-mosaico-alergeno-fondo, #f4f4f4);
    font-size: var(--rl-mosaico-txt-alergeno, 0.8em);
    line-height: 1.2;
}

.rl-mosaico-overlay__alergeno img {
    width: 22px;
    height: 22px;
    display: block;
    flex-shrink: 0;
}

/* Bloquea el scroll del fondo mientras el overlay está abierto. */
body.rl-mosaico-lock {
    overflow: hidden;
}
