/* ============================================================================
 *  GPU Admin Panel - UI Shell
 *  -------------------------------------------------------------------------
 *  Layout primitives that wrap pages: page-shell width tiers, topbar
 *  reskin, and sidebar reskin. Loaded between tokens.css and
 *  ui-components.css so primitive components inherit shell-level layout
 *  context (sticky offsets, scroll containers).
 *
 *  Catalog (this file):
 *    - .page-shell                 page wrapper (placed inside .admin-main)
 *    - .page-shell--narrow         max-width: 720px  (forms, focused detail)
 *    - .page-shell--content        max-width: 960px  (default; settings)
 *    - .page-shell--data           max-width: 1280px (audit, health)
 *    - .page-shell--full           max-width: none   (workspace canvas)
 *
 *  Width tiers are page-level decisions: a CGI script wraps its body in
 *  the appropriate modifier. The default (no modifier) is --content.
 *
 *  See docs/UI_SYSTEM.md for usage examples and the migration guide for
 *  legacy admin-* shells.
 * ========================================================================== */

/* ===== .page-shell - default (content tier) =============================== */
.page-shell {
    width: 100%;
    max-width: var(--width-content);
    margin: 0 auto;
    padding: 0;
}

/* ===== Width tier modifiers =============================================== */
.page-shell--narrow  { max-width: var(--width-narrow); }
.page-shell--content { max-width: var(--width-content); }
.page-shell--data    { max-width: var(--width-data); }

/* Workspace tier: full-bleed canvas. The page itself owns its gutters.
 * Used by Library / Photos / Videos / Galleries / Collections — anywhere
 * the canvas IS the content. Combine with body[data-page="<id>"] zeroing
 * .admin-main padding to remove the outer page chrome entirely.
 * Doubled-class selector (.page-shell.page-shell--full) bumps specificity
 * past placeholder.css's base .page-shell rule so padding/min-height win. */
.page-shell.page-shell--full {
    max-width: none;
    height: 100%;
    display: flex;
    flex-direction: column;
    min-height: 0;
    padding: 0;
}

/* ===== Internal slots ===================================================== *
 *  Optional helpers that pages can use to compose a tiered layout.
 *  Pages are NOT required to use these; .page-shell on its own is fine.    */
.page-shell__header {
    margin-bottom: var(--space-6);
}
.page-shell__body {
    flex: 1 1 auto;
    min-height: 0;
}
.page-shell__footer {
    margin-top: var(--space-6);
    padding-top: var(--space-4);
    border-top: 1px solid var(--color-border);
    color: var(--color-text-muted);
    font-size: var(--type-xs);
}

/* When a page-shell is applied to a workspace pane, the inner body should
 * fill all available height instead of growing to content. */
.page-shell--full > .page-shell__body {
    overflow: hidden;
    display: flex;
    flex-direction: column;
}

/* ============================================================================
 *  ui-topbar
 *  -------------------------------------------------------------------------
 *  Reskin of legacy .admin-topbar. All IDs preserved so core.js JS hooks
 *  (_setupSidebarCollapse, _setupFullMenu, _setupMobileMenu) keep working.
 * ========================================================================== */
.ui-topbar {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    z-index: var(--z-popover);
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 0 var(--space-6);
    height: var(--topbar-height);
    background: var(--color-surface);
    border-bottom: 1px solid var(--color-border);
    box-shadow: var(--elevation-1);
}
.ui-topbar__left {
    display: flex;
    align-items: center;
    gap: var(--space-3);
    min-width: 0;
    flex: 1 1 auto;
}
.ui-topbar__right {
    display: flex;
    align-items: center;
    gap: var(--space-3);
    flex: 0 0 auto;
}
.ui-topbar__brand {
    font-size: 0.9375rem;
    font-weight: var(--type-weight-semibold);
    color: var(--color-text);
    text-decoration: none;
    white-space: nowrap;
}
.ui-topbar__brand:hover { color: var(--color-primary); }
.ui-topbar__brand-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    color: var(--color-primary);
}

.ui-topbar__toggle svg { transition: transform var(--motion-fast); }
.admin-body.admin-sidebar-collapsed #admin-sidebar-toggle.ui-topbar__toggle svg { transform: rotate(180deg); }
.admin-body.admin-collections--open #admin-collections-toggle.ui-topbar__toggle {
    background: var(--color-primary-light);
    color: var(--color-primary);
    border-color: transparent;
}

.ui-topbar__site-picker {
    display: inline-flex;
    align-items: center;
    gap: var(--space-2);
    height: var(--control-height-sm);
    padding: 0 var(--space-3);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-md);
    background: var(--color-surface);
    color: var(--color-text-muted);
    font-size: var(--type-xs);
    cursor: not-allowed;
    user-select: none;
}
.ui-topbar__site-picker-label { line-height: 1; }

.ui-topbar__avatar-wrap {
    position: relative;
    display: inline-flex;
}
.ui-topbar__avatar-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    border: 1px solid var(--color-border);
    border-radius: 999px;
    background: var(--color-primary-hover-bg);
    color: var(--color-primary);
    cursor: pointer;
    font: inherit;
}
.ui-topbar__avatar-btn:hover,
.ui-topbar__avatar-btn.active {
    background: var(--color-hover);
    color: var(--color-text);
}
.ui-topbar__avatar-icon { flex-shrink: 0; }
.ui-topbar__avatar-popover {
    position: absolute;
    top: calc(100% + var(--space-2));
    right: 0;
    z-index: var(--z-popover);
    width: 220px;
    padding: var(--space-2);
    background: var(--color-surface-raised);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-lg);
    box-shadow: var(--elevation-3);
}
.ui-topbar__avatar-header {
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding: var(--space-3);
    border-bottom: 1px solid var(--color-border);
    color: var(--color-text);
}
.ui-topbar__avatar-header span {
    color: var(--color-text-muted);
    font-size: var(--type-xs);
}
.ui-topbar__avatar-item {
    display: flex;
    width: 100%;
    align-items: center;
    padding: var(--space-2) var(--space-3);
    border: 0;
    border-radius: var(--radius-md);
    background: transparent;
    color: var(--color-text-muted);
    cursor: pointer;
    font: inherit;
    font-size: var(--type-sm);
    text-align: left;
    text-decoration: none;
}
.ui-topbar__avatar-item:hover {
    background: var(--color-hover);
    color: var(--color-text);
}
.ui-topbar__avatar-item--danger { color: var(--color-danger); }
.ui-topbar__avatar-item--danger:hover {
    background: var(--color-danger-light);
    color: var(--color-danger);
}

/* ----- Full-menu hamburger + popover ------------------------------------- */
.ui-topbar__menu-wrap {
    position: relative;
    display: inline-flex;
}
.ui-topbar__menu-btn.active {
    background: var(--color-hover);
    color: var(--color-text);
    border-color: var(--color-border);
}
.ui-topbar__menu-popover {
    position: fixed;
    top: calc(var(--topbar-height) + var(--space-2));
    left: var(--space-3);
    z-index: var(--z-popover);
    width: 280px;
    max-height: calc(100vh - var(--topbar-height) - var(--space-6));
    overflow-y: auto;
    padding: var(--space-2);
    background: var(--color-surface-raised);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-lg);
    box-shadow: var(--elevation-3);
}

@media (max-width: 768px) {
    .ui-topbar__menu-popover { right: var(--space-3); width: auto; }
}

/* Inside the popover, force the expanded look regardless of whether the
 * main sidebar is collapsed. The popover always shows full nav. */
.ui-topbar__menu-popover .ui-sidebar__scroll { overflow: visible; padding: 0; }
.ui-topbar__menu-popover .ui-sidebar__bottom { padding: var(--space-1) 0 0; }
.ui-topbar__menu-popover .ui-sidebar__heading,
.ui-topbar__menu-popover .ui-sidebar__group-toggle,
.admin-body.admin-sidebar-collapsed .ui-topbar__menu-popover .ui-sidebar__heading,
.admin-body.admin-sidebar-collapsed .ui-topbar__menu-popover .ui-sidebar__group-toggle { display: flex; }
.ui-topbar__menu-popover .ui-sidebar__link span,
.admin-body.admin-sidebar-collapsed .ui-topbar__menu-popover .ui-sidebar__link span { display: inline; }
.ui-topbar__menu-popover .ui-sidebar__link {
    justify-content: flex-start;
    width: auto;
    height: auto;
    margin: 2px 4px;
    padding: var(--space-2) var(--space-3);
    border-radius: var(--radius-md);
}

/* ============================================================================
 *  ui-sidebar
 *  -------------------------------------------------------------------------
 *  Reskin of legacy .admin-nav. IDs preserved (#admin-nav, #admin-nav-bottom,
 *  #admin-nav-settings-btn) so core.js JS hooks keep working. The
 *  body.admin-sidebar-collapsed and
 *  body.admin-collections--open state classes are also preserved.
 * ========================================================================== */
.ui-sidebar {
    width: var(--nav-width);
    flex-shrink: 0;
    background: var(--color-surface-raised);
    border-right: 1px solid var(--color-border);
    display: flex;
    flex-direction: column;
    overflow: hidden;
    transition: width var(--motion-base);
}
.admin-body.admin-spa-loading .admin-main {
    cursor: progress;
    opacity: 0.72;
    transition: opacity var(--motion-fast);
}
.ui-sidebar__scroll {
    flex: 1;
    overflow-y: auto;
    overflow-x: hidden;
    padding: var(--space-2);
}
.ui-sidebar__section { margin-bottom: var(--space-2); }
.ui-sidebar__heading {
    font-size: 0.6875rem;
    font-weight: var(--type-weight-medium);
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--color-text-soft);
    padding: 18px 20px 4px;
}
.ui-sidebar__group-toggle {
    display: flex;
    width: 100%;
    align-items: center;
    justify-content: space-between;
    border: 0;
    background: transparent;
    appearance: none;
    -webkit-appearance: none;
    cursor: pointer;
    font-family: var(--ff-sans);
    text-align: left;
}
.ui-sidebar__group-toggle.ui-sidebar__link {
    color: var(--color-text-muted);
}
.ui-sidebar__group-toggle.ui-sidebar__link .ui-sidebar__group-caret {
    margin-left: auto;
}
.ui-sidebar__group-toggle:hover {
    color: var(--color-text);
}
.ui-sidebar__group-caret {
    flex-shrink: 0;
    transition: transform var(--motion-fast);
}
.ui-sidebar__section--collapsible[data-collapsed="false"] .ui-sidebar__group-caret {
    transform: rotate(180deg);
}
.ui-sidebar__group-body[hidden] { display: none; }
.ui-sidebar__link {
    display: flex;
    align-items: center;
    gap: var(--space-2);
    margin: 2px var(--space-2);
    padding: var(--space-2) var(--space-3);
    border-radius: var(--radius-md);
    border: 1px solid transparent;
    font-size: var(--type-sm);
    color: var(--color-text-muted);
    text-decoration: none;
    transition: background var(--motion-fast), color var(--motion-fast),
                border-color var(--motion-fast);
}
.ui-sidebar__link:hover {
    background: var(--color-hover);
    color: var(--color-text);
}
.ui-sidebar__link.active {
    background: var(--color-primary-hover-bg);
    border-color: var(--color-primary-light);
    color: var(--color-primary);
    font-weight: var(--type-weight-medium);
}
.ui-sidebar__link svg { flex-shrink: 0; }

.ui-sidebar__bottom {
    flex-shrink: 0;
    padding: var(--space-1) var(--space-2) var(--space-2);
}
.ui-sidebar__bottom-sep {
    height: 1px;
    background: var(--color-border);
    margin: var(--space-1) var(--space-2);
}
.ui-sidebar__bottom-btn {
    width: 100%;
    border: none;
    cursor: pointer;
    background: none;
    font-family: var(--ff-sans);
}
.ui-sidebar__bottom-btn--danger { color: var(--color-danger); }
.ui-sidebar__bottom-btn--danger:hover {
    background: var(--color-danger-light);
    color: var(--color-danger);
}

/* Tab strips live in ui-components.css; shell-level pages add overflow polish. */
.ui-tabs {
    -webkit-overflow-scrolling: touch;
    scroll-snap-type: x proximity;
}
.ui-tabs__tab {
    scroll-snap-align: center;
}

/* ----- Collapsed (desktop) ----------------------------------------------- *
 *  When body.admin-sidebar-collapsed is set:
 *   - sidebar narrows to 56px (just enough for an icon-only column)
 *   - all sections except the first are hidden (per design decision)
 *   - bottom block is hidden (settings/theme/logout move into the
 *     hamburger-popover menu instead)
 *   - links become 36x36 squares centered horizontally                      */
@media (min-width: 769px) {
    .admin-body.admin-sidebar-collapsed .ui-sidebar {
        width: 56px;
    }
    .admin-body.admin-sidebar-collapsed .ui-sidebar__scroll {
        padding: var(--space-2) 0;
    }
    .admin-body.admin-sidebar-collapsed .ui-sidebar__heading,
    .admin-body.admin-sidebar-collapsed .ui-sidebar__group-toggle,
    .admin-body.admin-sidebar-collapsed .ui-sidebar__link span {
        display: none;
    }
    .admin-body.admin-sidebar-collapsed .ui-sidebar__scroll .ui-sidebar__section:not(:first-child),
    .admin-body.admin-sidebar-collapsed .ui-sidebar__bottom {
        display: none;
    }
    .admin-body.admin-sidebar-collapsed .ui-sidebar__link {
        width: 36px;
        height: 36px;
        margin: 4px auto;
        padding: 0;
        justify-content: center;
        border-radius: var(--radius-md);
    }
}

/* ----- Mobile slide-in --------------------------------------------------- */
@media (max-width: 768px) {
    /* Hide desktop sidebar collapse toggle on mobile (use mobile menu instead) */
    .ui-topbar #admin-sidebar-toggle.ui-topbar__toggle { display: none; }
    .ui-sidebar {
        position: fixed;
        top: var(--topbar-height);
        left: 0;
        bottom: 0;
        z-index: var(--z-modal);
        transform: translateX(-100%);
        transition: transform var(--motion-base);
        width: 260px;
    }
    .ui-sidebar.mobile-open { transform: translateX(0); }
    .admin-mobile-nav-overlay {
        display: none;
        position: fixed;
        inset: 0;
        top: var(--topbar-height);
        background: rgba(0, 0, 0, 0.35);
        z-index: calc(var(--z-modal) - 1);
    }
    .admin-mobile-nav-overlay.active { display: block; }
}
