/* ═══ LA CAPA VIAJA CON LA HOJA (2026-07-20) ══════════════════════════════════
   Esta hoja declara su @layer ACÁ ADENTRO. Antes la capa la ponía quien la
   importaba —`@import url(...) layer(lib)`, repetido en 4 emisores— así que
   la hoja caía en su capa SOLO si el importador acertaba, y cargarla por
   <link> la dejaba SIN CAPA: en CSS lo no-capado le gana a todo lo capado.
   Con la capa acá la hoja es inmune a CÓMO se la cargue, y el <head> puede
   usar <link> (paralelo, y un fallo se ve en Network) en vez de @import
   (serial, render-blocking, y si falla se pierde EN SILENCIO — el defecto que
   dejaba el shell sin `container-type` y tiraba el layout a flujo plano).
   ═════════════════════════════════════════════════════════════════════════ */
@layer lib {
/*
 * Cx · Az — piel GLOBAL de la capa de aplicación (shell). Clon auto-contenido de
 * components/ax/wwwroot/ax.css (capa Ax, DEPRECADA): mismo CSS, prefijo ax-→az-.
 *
 * .az-nav-item vive acá (no scoped) porque AzNavItem tiene como raíz un <NavLink>
 * (componente del framework): el CSS scoped del .razor NO se aplica al <a> que
 * renderiza un componente hijo. Global + prefijo az- = sin colisiones.
 *
 * Sólo consume tokens --mx-*; el color/forma activos los deciden los otros ejes.
 * RAIL OSCURO: los ítems del rail leen del juego --mx-color-sidebar-* (bg/fg/hover/active),
 * que es OSCURO por el fix mode-aware del tema (MxThemeGen.EmitRichTokens).
 */

.az-nav-item {
    display: flex;
    align-items: center;
    gap: var(--mx-space-2);
    padding: var(--mx-space-2) var(--mx-space-3);
    border-radius: var(--mx-radius-sm);
    /* sobre el rail oscuro: fg atenuado del sidebar (cae a text-muted fuera del rail) */
    color: var(--mx-color-sidebar-muted, var(--mx-color-text-muted, var(--mx-color-text)));
    text-decoration: none;
    font-size: var(--mx-text-sm);
    line-height: 1.4;
    white-space: nowrap;
    transition: background var(--mx-transition-fast, .12s) ease, color var(--mx-transition-fast, .12s) ease;
    /* reset para el modo acción (raíz <button>) — luce idéntico al modo router (<a>) */
    width: 100%;
    border: 0;
    background: transparent;
    font-family: inherit;
    text-align: left;
    cursor: pointer;
    -webkit-appearance: none;
    appearance: none;
}
.az-nav-item:hover {
    background: var(--mx-color-sidebar-hover, var(--mx-color-surface-2));
    color: var(--mx-color-sidebar-fg, var(--mx-color-text));
}

/* activo (router por URL, o Active manual en modo acción) — tint del acento + texto acento */
.az-nav-item--active {
    background: var(--mx-color-sidebar-active-bg, var(--mx-color-primary-light));
    color: var(--mx-color-sidebar-active-fg, var(--mx-color-primary-text, var(--mx-color-primary)));
    font-weight: var(--mx-font-weight-semibold);
    box-shadow: inset 3px 0 0 var(--mx-color-primary);   /* barra de acento a la izquierda */
}
.az-nav-item--active:hover { background: var(--mx-color-sidebar-active-bg, var(--mx-color-primary-light)); }

.az-nav-item__icon {
    display: inline-flex;
    align-items: center;
    flex: none;
}

.az-nav-item__label {
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
}

.az-nav-item__badge {
    flex: none;
    min-width: 18px;
    padding: 1px var(--mx-space-1);
    text-align: center;
    border-radius: var(--mx-radius-full);
    background: var(--mx-color-primary);
    color: var(--mx-color-primary-on, var(--mx-color-surface));
    font-size: var(--mx-text-xs);
    line-height: 1.4;
}

/* icon-rail: sólo icono, centrado; label y badge ocultos */
.az-nav-item--collapsed {
    justify-content: center;
    padding: var(--mx-space-2);
}
.az-nav-item--collapsed .az-nav-item__label,
.az-nav-item--collapsed .az-nav-item__badge { display: none; }

/* ── tablet (641–1024px del shell): icon-rail AUTOMÁTICO vía @container ── */
@container (min-width: 641px) and (max-width: 1024px) {
    .az-nav-item { justify-content: center; padding: var(--mx-space-2); }
    .az-nav-item__label,
    .az-nav-item__badge { display: none; }
    /* activo en icon-rail: highlight contenido, SIN la barra de acento (sólo va con label) */
    .az-nav-item--active { box-shadow: none; }

    /* dentro del flyout de un grupo SÍ se muestran labels, alineados a la izquierda */
    .az-nav-group__sub .az-nav-item { justify-content: flex-start; padding: var(--mx-space-2) var(--mx-space-3); }
    .az-nav-group__sub .az-nav-item__label { display: block; }
}

/* ═══ AzNavGroup — item con sub-items: acordeón (desktop) / flyout a la derecha (icon-rail) ═══
   (estilos portados para paridad con ax.css; AzNavGroup no se clonó como componente,
    pero las reglas quedan disponibles si se agrega más adelante.) */
.az-nav-group { display: flex; flex-direction: column; }
.az-nav-group__chevron {
    margin-left: auto; flex: none; display: inline-flex; align-items: center;
    color: var(--mx-color-sidebar-muted, var(--mx-color-text-muted)); transition: transform .15s ease;
}
.az-nav-group--open > .az-nav-group__trigger .az-nav-group__chevron { transform: rotate(180deg); }
.az-nav-group--active > .az-nav-group__trigger {
    color: var(--mx-color-sidebar-active-fg, var(--mx-color-primary-text, var(--mx-color-primary)));
    font-weight: var(--mx-font-weight-semibold);
}

/* desktop: acordeón inline (oculto salvo --open) */
.az-nav-group__sub {
    display: none; flex-direction: column; gap: 2px;
    margin: 2px 0 2px var(--mx-space-5);
}
.az-nav-group--open > .az-nav-group__sub { display: flex; }

/* icon-rail (tablet): el sub-list pasa a flyout popover a la derecha, en hover/focus */
@container (min-width: 641px) and (max-width: 1024px) {
    .az-nav-group { position: relative; }
    .az-nav-group__chevron { display: none; }   /* en icon-rail el chevron sobra (el flyout es la pista) */
    .az-nav-group__sub {
        margin: 0; padding: var(--mx-space-1);
        position: absolute; left: calc(100% + 8px); top: 0;
        min-width: 188px;
        background: var(--mx-color-surface);
        border: var(--mx-border-width, 1px) solid var(--mx-color-border);
        border-radius: var(--mx-radius-md);
        box-shadow: var(--mx-shadow-lg, 0 10px 30px rgba(0, 0, 0, .14));
        z-index: 60;
    }
    .az-nav-group:hover > .az-nav-group__sub,
    .az-nav-group:focus-within > .az-nav-group__sub { display: flex; }
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   AzShell — el GRID del shell (topbar / [rail | main]). FUENTE ÚNICA del grid del shell.
   Antes vivía SCOPED en AzShell.razor.css → sólo viajaba en el bundle {app}.styles.css del
   consumidor → obligaba a pasar ScopedHref a mano. Movido acá (GLOBAL, _content/MxLite.UI.Az/az.css,
   @layer lib vía AzHead) → el grid SIEMPRE está, sin ScopedHref. Esta es la versión BUENA tokenizada
   (topbar 56px via --az-topbar-h; background = el PATRÓN cálido var(--mx-bg-pattern, ...); todos los
   tokens --mx-*). El SKIN (components.css §MkzShellAlign, @layer skin) lo refina encima.
   ⚠️ El grid NO debe duplicarse en components.css ni en ningún otro CSS del kit (lo enforce un guard
   test: el grid .az-shell vive SÓLO acá). Responsive por @container (no @media). ═══════════════════ */

/* el HOST es el contenedor de @container (mide el ancho disponible). El grid .az-shell va ADENTRO
   para que las @container queries puedan colapsar SU grid (un contenedor no se consulta a sí mismo). */
.az-shell-host {
    container-type: inline-size;
    height: 100dvh;
    min-height: 0;
}

.az-shell {
    --az-rail-w: 248px;
    --az-rail-collapsed-w: 60px;
    --az-topbar-h: 56px;

    display: grid;
    grid-template-columns: var(--az-rail-w) minmax(0, 1fr);
    grid-template-rows: var(--az-topbar-h) minmax(0, 1fr);
    grid-template-areas:
        "topbar topbar"
        "rail   main";
    height: 100%;
    min-height: 0;
    /* el PATRÓN cálido del tema (gradientes radiales derivados del seed); cae a --mx-color-bg plano
       si el tema no define patrón. Antes era --mx-color-bg plano → tapaba el patrón y el shell salía
       blanco-frío aunque el tema definiera --mx-bg-pattern. */
    background: var(--mx-bg-pattern, var(--mx-color-bg));
    color: var(--mx-color-text);
    font-family: var(--mx-font-sans);
    font-size: var(--mx-text-base);
    line-height: var(--mx-line-height-normal);
    text-shadow: var(--mx-text-shadow);
    -webkit-font-smoothing: antialiased;
    transition: grid-template-columns var(--mx-transition-base, .2s) ease;
}

.az-shell--collapsed {
    grid-template-columns: var(--az-rail-collapsed-w) minmax(0, 1fr);
}

.az-shell__topbar {
    grid-area: topbar;
    display: flex;
    align-items: center;
    gap: var(--mx-space-3);
    padding: 0 var(--mx-space-4);
    border-bottom: var(--mx-border-width, 1px) solid color-mix(in srgb, var(--mx-color-border) 60%, transparent);
    /* GLASS (F1): topbar semitransparente + blur → el fondo decorativo se ve a través = sensación premium. */
    background: color-mix(in srgb, var(--mx-color-surface) 72%, transparent);
    backdrop-filter: blur(14px) saturate(180%);
    -webkit-backdrop-filter: blur(14px) saturate(180%);
    position: sticky;
    top: 0;
    z-index: var(--mx-z-sticky, 20);
}

.az-shell__rail {
    grid-area: rail;
    min-height: 0;
    overflow-y: auto;
    border-right: var(--mx-border-width, 1px) solid color-mix(in srgb, var(--mx-color-border) 50%, transparent);
    /* RAIL OSCURO + glass sutil (F1): mayormente opaco (legibilidad) con blur → el fondo bleed-ea apenas en los bordes. */
    background: color-mix(in srgb, var(--mx-color-sidebar-bg, var(--mx-color-surface)) 88%, transparent);
    backdrop-filter: blur(14px) saturate(140%);
    -webkit-backdrop-filter: blur(14px) saturate(140%);
    color: var(--mx-color-sidebar-fg, var(--mx-color-text));
}

.az-shell__main {
    grid-area: main;
    min-width: 0;
    min-height: 0;
    overflow: auto;
    padding: var(--mx-space-5);
}

.az-shell__backdrop { display: none; }

/* ── tablet (641–1024px): icon-rail automático (sólo iconos) ── */
@container (min-width: 641px) and (max-width: 1024px) {
    .az-shell { grid-template-columns: var(--az-rail-collapsed-w) minmax(0, 1fr); }
    /* el rail no debe recortar el flyout de los grupos (sale hacia la derecha) */
    .az-shell__rail { overflow: visible; }
}

/* ── mobile (≤640px): el rail pasa a drawer off-canvas + hamburguesa ── */
@container (max-width: 640px) {
    .az-shell,
    .az-shell--collapsed {
        grid-template-columns: minmax(0, 1fr);
        grid-template-areas:
            "topbar"
            "main";
    }

    .az-shell__rail {
        position: fixed;
        /* #3 · top:0 (no var(--az-topbar-h)): el SKIN pone --az-topbar-h:auto → top:auto rompía el fixed y el
           drawer caía al FONDO en flujo. El drawer full-height izquierdo trae su propia cabecera (marca). */
        inset: 0 auto 0 0;
        height: 100%;
        width: var(--az-rail-w);
        transform: translateX(-100%);
        width: var(--az-rail-w);
        transform: translateX(-100%);
        transition: transform var(--mx-transition-base, .2s) ease;
        z-index: var(--mx-z-fixed, 1200);
    }

    .az-shell--mobile-open .az-shell__rail { transform: translateX(0); }

    .az-shell--mobile-open .az-shell__backdrop {
        display: block;
        position: fixed;
        inset: 0;
        background: var(--mx-color-overlay, rgba(0, 0, 0, .4));
        z-index: var(--mx-z-sticky, 1020);
    }
}

@media (prefers-reduced-motion: reduce) {
    .az-shell,
    .az-shell__rail { transition: none; }
}

/* #1 · el control del rail refleja el estado VISUAL desde el CSS, no desde el markup. 2026-07-20 dejó
   de ser un chevron al pie y pasó a ser un PIN en el header: derecho = fijado (rail abierto), inclinado
   45° = suelto (icon-rail). El markup emite SIEMPRE el mismo ícono y sólo el CSS lo transforma — que es
   lo que resolvió #1 en su momento: antes el markup ADEMÁS cambiaba chevron-left↔right y el doble flip
   se cancelaba. Cubre el colapso C# (.az-shell--collapsed) Y el icon-rail automático por @container.
   La transformación vive en DOS lados a propósito: AzSidebar.razor.css (aplicativo e IDE) y mx-skin.css
   (preview y sitio, que no cargan bundle scoped). */

}
