/* Xponzy - Portfolio gallery (public page). Self-hosted, zero CDN dependencies.
 *
 * REGLA DEL OWNER: SOLO lenguaje del theme Lagom (colores, tipografia heredada, iconos
 * lm, presentacion). Este archivo NO inventa estetica: replica la receta EXACTA de la
 * galeria nativa del theme (store/site-builder, reglas `.site .section-templates` de
 * site.css, verificadas en el servidor):
 *
 *   card  = a > .thumb-wrapper { border-radius: var(--border-radius-sm);
 *           box-shadow: var(--box-shadow-xlg); overflow: hidden }   <- flotante SIEMPRE
 *           + img { height: var(--previews-img-height)=240px; object-fit: cover }
 *   nombre DEBAJO de la imagen: centrado, font-weight: var(--font-weight-lighter)
 *   subtitle de seccion: font-size-xlg + font-weight-light + text-body-color
 *   grid: separacion vertical var(--spacing-9x); show-more: margin var(--spacing-8x)
 *   SIN cajas de texto, SIN badges, SIN lift: la restriccion es la elegancia del theme.
 *
 * Unicos patrones interactivos anadidos, tambien COPIADOS del theme:
 *   - overlay de imagen con fade opacity 0->1 (patron .screenshot-thumb .overlay de
 *     site.css, unico overlay de imagen del theme)
 *   - boton sobre imagen con la receta glassy del theme: tokens --btn-light-* +
 *     backdrop-filter blur(10px) (patron .bottom-action-sticky / --ui-block-overlay-*)
 */

#xponzy-portfolio .section-subtitle {
    /* receta .site .section-subtitle: xlg / light / text-body-color, centrado */
    text-align: center;
    margin: 0 auto var(--spacing-8x, 64px);
    max-width: var(--max-width-md, 640px);
    color: var(--text-body-color, inherit);
    font-size: var(--font-size-xlg, 18px);
    font-weight: var(--font-weight-light, 300);
    line-height: 1.6;
}

/* ---------------------------------------------------------------------------
 * Filter tabs: mismas clases que la galeria nativa (ul.nav.nav-tabs +
 * a.templates-filter-btn). theme.css global ya da tipografia/hover/subrayado
 * activo de 3px; aqui solo el ajuste fino que la galeria nativa tambien hace.
 * ------------------------------------------------------------------------- */
#xponzy-portfolio .templates {
    margin-top: calc(2 * 8px);
}

#xponzy-portfolio .nav-tabs {
    border-bottom: var(--card-border, 1px solid #EFEFF1);
    margin-bottom: var(--spacing-8x, 64px);
    row-gap: 4px;
}

#xponzy-portfolio .templates-filter-btn {
    display: inline-block;
    cursor: pointer;
    position: relative;
    color: var(--nav-tabs-link-color, currentColor);
    padding: var(--nav-link-padding-v, 10px) var(--nav-link-padding-h, 16px);
    margin-bottom: -1px;
    font-weight: var(--font-weight-medium, 500);
    font-size: var(--font-size-md, 15px);
    transition: var(--transition-base, .24s ease);
    transition-property: color;
}

#xponzy-portfolio .templates-filter-btn:hover,
#xponzy-portfolio .templates-filter-btn:focus {
    color: var(--nav-tabs-link-hover-color, var(--text-primary-color, #065CFE));
    text-decoration: none;
    outline: none;
}

#xponzy-portfolio .templates-filter-btn.active {
    color: var(--nav-tabs-link-active-color, var(--text-primary-color, #065CFE));
}

/* subrayado activo de 3px — regla :after literal de .nav-tabs a.active del theme */
#xponzy-portfolio .templates-filter-btn.active::after {
    content: "";
    position: absolute;
    bottom: 0;
    left: var(--nav-link-padding-h, 16px);
    right: var(--nav-link-padding-h, 16px);
    height: var(--nav-tabs-link-active-border-width, 3px);
    background: var(--nav-tabs-link-active-border-color, var(--text-primary-color, #065CFE));
}

/* ---------------------------------------------------------------------------
 * Grid: aire vertical de la galeria nativa (spacing-9x entre filas)
 * ------------------------------------------------------------------------- */
#xponzy-portfolio .previews .row {
    row-gap: var(--spacing-9x, 72px);
}

/* ---------------------------------------------------------------------------
 * Card = receta thumb-wrapper de la galeria nativa: imagen flotante con sombra
 * xlg permanente, nombre debajo. Cero caja, cero borde, cero fondo.
 * ------------------------------------------------------------------------- */
#xponzy-portfolio .xpf-card {
    position: relative;
    display: flex;
    flex-direction: column;
    height: 100%;
    background: none;
    border: 0;
    overflow: visible;
}

#xponzy-portfolio .xpf-cover {
    position: relative;
    overflow: hidden;
    text-align: center;
    border-radius: var(--border-radius-sm, 6px);
    box-shadow: var(--box-shadow-xlg, 0 0 1px rgba(0,0,0,.04), 0 8px 56px rgba(0,0,0,.08));
    background: var(--card-cap-bg, transparent);
    cursor: pointer;
}

#xponzy-portfolio .xpf-cover img {
    width: 100%;
    height: var(--previews-img-height, 240px);
    object-fit: cover;
    display: block;
}

/* Overlay de imagen del theme (patron .screenshot-thumb .overlay de site.css):
 * capa absoluta flex-centrada, opacity 0 -> 1 con transition-base. */
#xponzy-portfolio .xpf-cover::after {
    content: "";
    position: absolute;
    inset: 0;
    background: var(--ui-overlay-bg, rgba(0, 0, 0, .32));
    opacity: 0;
    transition: opacity var(--transition-base, .24s ease);
    pointer-events: none;
}

#xponzy-portfolio .xpf-card:hover .xpf-cover::after,
#xponzy-portfolio .xpf-card:focus-within .xpf-cover::after {
    opacity: 1;
}

/* Boton "Ver proyecto" SOBRE la imagen, con la receta glassy del theme:
 * tokens --btn-light-* (el boton de Lagom para usarse encima de imagenes)
 * + blur(10px) del patron glassmorphism (--ui-block-overlay). Aparece con el
 * mismo fade del overlay. Las clases .btn/.btn-sm del theme dan altura,
 * padding, radio y el margen del icono lm. */
#xponzy-portfolio .xpf-view-btn {
    position: absolute;
    top: calc(var(--previews-img-height, 240px) / 2);
    left: 50%;
    transform: translate(-50%, -50%);
    z-index: 2;
    margin: 0;
    color: var(--btn-light-color, #fff);
    background: var(--btn-light-bg, rgba(255, 255, 255, .08));
    border-color: var(--btn-light-border, rgba(255, 255, 255, .16));
    -webkit-backdrop-filter: blur(10px);
    backdrop-filter: blur(10px);
    opacity: 0;
    transition: opacity var(--transition-base, .24s ease),
                background-color var(--transition-base, .24s ease),
                border-color var(--transition-base, .24s ease);
}

#xponzy-portfolio .xpf-card:hover .xpf-view-btn,
#xponzy-portfolio .xpf-card:focus-within .xpf-view-btn {
    opacity: 1;
}

#xponzy-portfolio .xpf-view-btn:hover,
#xponzy-portfolio .xpf-view-btn:focus {
    color: var(--btn-light-hover-color, #fff);
    background: var(--btn-light-hover-bg, rgba(255, 255, 255, .16));
    border-color: var(--btn-light-hover-border, rgba(255, 255, 255, .24));
}

#xponzy-portfolio .xpf-view-btn:active {
    background: var(--btn-light-active-bg, rgba(255, 255, 255, .24));
    border-color: var(--btn-light-active-border, rgba(255, 255, 255, .32));
}

/* Sin hover (tactil): el boton queda siempre visible sobre la imagen. */
@media (hover: none) {
    #xponzy-portfolio .xpf-view-btn,
    #xponzy-portfolio .xpf-cover::after {
        opacity: 1;
    }
}

/* ---------------------------------------------------------------------------
 * Caption bajo la imagen = receta .tplname (centrado, peso lighter) + categoria
 * como linea secundaria en text-lighter (patron .main-header-title + p).
 * El resto del contenido de la card NO se muestra aqui: vive en el modal.
 * ------------------------------------------------------------------------- */
#xponzy-portfolio .xpf-body {
    display: block;
    padding: 0;
}

#xponzy-portfolio .xpf-title {
    display: block;
    margin: var(--spacing-2x, 16px) 0 0;
    text-align: center;
    font-size: var(--font-size-md, 15px);
    font-weight: var(--font-weight-lighter, 300);
    line-height: 1.4;
    color: inherit;
}

#xponzy-portfolio .xpf-chip-category {
    display: block;
    margin: 4px 0 0;
    text-align: center;
    font-size: var(--font-size-sm, 13px);
    color: var(--text-lighter-color, currentColor);
    opacity: .75;
}

/* Orden visual: imagen, titulo, categoria (la categoria esta antes del titulo
 * en el DOM; flex la reordena sin tocar el markup). */
#xponzy-portfolio .xpf-body {
    display: flex;
    flex-direction: column;
}

#xponzy-portfolio .xpf-chip-category { order: 2; }
#xponzy-portfolio .xpf-title { order: 1; }

/* Contenido que la galeria nativa NO muestra en la card (vive en el modal;
 * sigue en el DOM porque portfolio.js puebla el modal desde aqui). */
#xponzy-portfolio .xpf-short,
#xponzy-portfolio .xpf-tech,
#xponzy-portfolio .xpf-client,
#xponzy-portfolio .xpf-badge-featured {
    display: none;
}

#xponzy-portfolio .xpf-empty {
    text-align: center;
    padding: calc(6 * 8px) 0;
    opacity: .7;
}

/* Show more: receta nativa (margin spacing-8x auto 0, centrado). */
#xponzy-portfolio .xpf-more-wrap {
    margin-top: var(--spacing-8x, 64px);
}

/* Hidden state for cards beyond the initial batch (server-rendered baseline for the
 * default "All" filter) and anything portfolio.js decides to hide dynamically. */
#xponzy-portfolio [hidden],
#xponzy-portfolio .xpf-hidden {
    display: none !important;
}

/* ---------------------------------------------------------------------------
 * Detail modal (#xpfModal). Chrome 100% del theme (.modal/.modal-content...);
 * solo layout de contenido propio. Aqui SI vive todo el detalle del proyecto.
 * ------------------------------------------------------------------------- */
#xpfModal .xpf-modal-gallery {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
    gap: 8px;
    margin-bottom: calc(2 * 8px);
}

#xpfModal .xpf-modal-gallery img {
    width: 100%;
    aspect-ratio: 4 / 3;
    object-fit: cover;
    border-radius: var(--border-radius-sm, 6px);
    box-shadow: var(--box-shadow-sm, 0 0 1px rgba(0,0,0,.04), 0 2px 16px rgba(0,0,0,.08));
}

#xpfModal .xpf-modal-long {
    white-space: pre-line;
    margin-bottom: calc(2 * 8px);
    line-height: 1.7;
    opacity: .9;
}

#xpfModal .xpf-modal-tech {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    margin-bottom: calc(1.5 * 8px);
}

#xpfModal .xpf-modal-tech .xpf-chip-tech {
    font-size: var(--badge-font-size, 11px);
    padding: var(--badge-padding-y, 3px) var(--badge-padding-x, 8px);
    border-radius: var(--badge-border-radius, 10px);
    border: var(--card-border, 1px solid #EFEFF1);
    opacity: .85;
}

#xpfModal .xpf-modal-client {
    display: none;
}

#xpfModal .xpf-modal-visit.d-none,
#xpfModal .modal-footer.d-none {
    display: none !important;
}

/* ---------------------------------------------------------------------------
 * xpf-polish: accesibilidad. Foco visible + prefers-reduced-motion.
 * ------------------------------------------------------------------------- */
#xponzy-portfolio .templates-filter-btn:focus-visible,
#xponzy-portfolio .xpf-view-btn:focus-visible,
#xponzy-portfolio .xpf-show-more-btn:focus-visible {
    outline: 2px solid var(--nav-tabs-link-active-color, var(--text-primary-color, #065CFE));
    outline-offset: 2px;
    border-radius: 2px;
}

@media (prefers-reduced-motion: reduce) {
    #xponzy-portfolio .templates-filter-btn,
    #xponzy-portfolio .xpf-cover::after,
    #xponzy-portfolio .xpf-view-btn {
        transition: none !important;
    }
}
