/* ============================================================
   layout.css : agencement (app shell, sidebar, topbar, page)
   ============================================================ */

/* ---------- Coque applicative ---------- */
.app {
  display: grid;
  grid-template-columns: var(--sidebar-w) 1fr;
  min-height: 100vh;
  transition: grid-template-columns var(--t-base);
}
.app[data-collapsed="true"] {
  grid-template-columns: var(--sidebar-w-collapsed) 1fr;
}

/* ============================================================
   SIDEBAR
   ============================================================ */
.sidebar {
  position: sticky;
  top: 0;
  height: 100vh;
  background: var(--c-sidebar-bg);
  border-right: 1px solid var(--c-sidebar-border);
  display: flex;
  flex-direction: column;
  overflow: hidden;
}

.sidebar__brand {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  height: var(--topbar-h);
  padding: 0 var(--sp-4);
  border-bottom: 1px solid var(--c-sidebar-border);
  flex-shrink: 0;
}
.sidebar__brand-mark {
  width: 32px; height: 32px;
  border-radius: var(--radius-sm);
  background: var(--accent);
  display: grid; place-items: center;
  color: var(--accent-contrast);
  font-weight: var(--fw-bold);
  flex-shrink: 0;
}
.sidebar__brand-name {
  font-weight: var(--fw-semibold);
  color: #fff;
  font-size: var(--fs-h3);
  white-space: nowrap;
}
.sidebar__brand-name small {
  display: block;
  font-size: var(--fs-xs);
  font-weight: var(--fw-regular);
  color: var(--c-sidebar-text-muted);
}

/* ── Logo + identité produit ──────────────────────────────────────────
   Bandeau fin couleur + pastille avec le nom du produit, sous le logo.
   La couleur (--accent) et le nom s'adaptent automatiquement au produit
   via [data-product] sur <body>. */
.sidebar__logo {
  padding: var(--sp-4) var(--sp-4) var(--sp-3);
  border-bottom: 3px solid var(--accent);   /* liseré couleur produit */
  text-align: center;
  flex-shrink: 0;
}
.sidebar__logo .sidebar-logo { max-width: 150px; margin: 0 auto; }
/* Pastille discrète avec le nom du produit */
[data-product] .sidebar__logo::after {
  content: "";
  display: inline-flex; align-items: center;
  margin-top: var(--sp-3);
  padding: 0.15rem 0.6rem;
  font-size: var(--fs-xs); font-weight: var(--fw-bold);
  text-transform: uppercase; letter-spacing: 0.06em;
  color: var(--c-sidebar-text);
  background: var(--c-sidebar-surface);
  border-left: 3px solid var(--accent);
  border-radius: var(--radius-sm);
}
[data-product="aibiza"]    .sidebar__logo::after { content: "AI.biza"; }
[data-product="connect"]   .sidebar__logo::after { content: "Connect"; }
[data-product="analytics"] .sidebar__logo::after { content: "Analytics"; }
[data-product="onair"]     .sidebar__logo::after { content: "OnAir"; }
/* Masquer la pastille quand la sidebar est repliée */
.app[data-collapsed="true"] .sidebar__logo::after { display: none; }
.app[data-collapsed="true"] .sidebar__logo { border-bottom-width: 2px; }

.sidebar__nav {
  flex: 1;
  overflow-y: auto;
  padding: var(--sp-3) var(--sp-2);
}
.sidebar__section-label {
  font-size: var(--fs-xs);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--c-sidebar-text-muted);
  padding: var(--sp-4) var(--sp-3) var(--sp-2);
  white-space: nowrap;
}

.nav-link {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  padding: var(--sp-2) var(--sp-3);
  margin-bottom: 2px;
  border-radius: var(--radius);
  color: var(--c-sidebar-text);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  text-decoration: none;
  white-space: nowrap;
  transition: background var(--t-fast), color var(--t-fast);
}
.nav-link i { width: 20px; text-align: center; font-size: 1rem; flex-shrink: 0; }
.nav-link:hover { background: var(--c-sidebar-surface); color: #fff; }
.nav-link.is-active {
  background: var(--accent-soft);
  color: #fff;
  position: relative;
}
.nav-link.is-active::before {
  content: "";
  position: absolute;
  left: -8px; top: 50%;
  transform: translateY(-50%);
  width: 3px; height: 60%;
  background: var(--accent);
  border-radius: var(--radius-pill);
}

.sidebar__footer {
  border-top: 1px solid var(--c-sidebar-border);
  padding: var(--sp-3) var(--sp-2);
  flex-shrink: 0;
}

/* Mode réduit : on masque les libellés, on garde les icônes */
.app[data-collapsed="true"] .sidebar__brand-name,
.app[data-collapsed="true"] .sidebar__section-label,
.app[data-collapsed="true"] .nav-link span,
.app[data-collapsed="true"] .product-switcher__label {
  display: none;
}
.app[data-collapsed="true"] .nav-link { justify-content: center; }

/* Commutateur de produit */
.product-switcher {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  padding: var(--sp-2) var(--sp-3);
  border-radius: var(--radius);
  color: var(--c-sidebar-text);
  cursor: pointer;
}
.product-switcher:hover { background: var(--c-sidebar-surface); }
.product-switcher__dot {
  width: 12px; height: 12px; border-radius: 50%;
  background: var(--accent); flex-shrink: 0;
}

/* ============================================================
   ZONE PRINCIPALE
   ============================================================ */
.main { display: flex; flex-direction: column; min-width: 0; }
/* Pages "app" pleine hauteur (Score Radar, Music Charts) : la colonne occupe
   exactement le viewport ; le <main flex-grow-1> remplit l'espace restant sous
   la topbar et les barres d'outils, ce qui rend les enfants en height:100% résolubles. */
.main--app { height: 100vh; }
.main--app > main { min-height: 0; }

.topbar {
  position: sticky;
  top: 0;
  z-index: 20;
  height: var(--topbar-h);
  display: flex;
  align-items: center;
  gap: var(--sp-4);
  padding: 0 var(--sp-5);
  background: rgba(255, 255, 255, 0.85);
  backdrop-filter: blur(8px);
  border-bottom: 1px solid var(--c-border);
}
.topbar__toggle {
  border: none; background: transparent; cursor: pointer;
  width: 36px; height: 36px; border-radius: var(--radius-sm);
  color: var(--c-text-muted); font-size: 1.1rem;
  display: grid; place-items: center;
}
.topbar__toggle:hover { background: var(--c-surface-2); color: var(--c-text); }
.topbar__title { font-size: var(--fs-h2); font-weight: var(--fw-semibold); }
.topbar__breadcrumb { font-size: var(--fs-sm); color: var(--c-text-muted); }
.topbar__spacer { flex: 1; }
.topbar__actions { display: flex; align-items: center; gap: var(--sp-3); }

.avatar {
  width: 34px; height: 34px; border-radius: 50%;
  background: var(--accent); color: var(--accent-contrast);
  display: grid; place-items: center;
  font-weight: var(--fw-semibold); font-size: var(--fs-sm);
}

.page {
  padding: var(--sp-6) var(--sp-5);
  max-width: var(--page-max);
  width: 100%;
  margin: 0 auto;
}
.page__header { margin-bottom: var(--sp-5); }
.page__title { font-size: var(--fs-display); margin: 0 0 var(--sp-1); }
.page__subtitle { color: var(--c-text-muted); font-size: var(--fs-body); margin: 0; }

/* Grilles utilitaires */
.grid { display: grid; gap: var(--sp-4); }
.grid--2 { grid-template-columns: repeat(2, 1fr); }
.grid--3 { grid-template-columns: repeat(3, 1fr); }
.grid--4 { grid-template-columns: repeat(4, 1fr); }

@media (max-width: 1024px) {
  .grid--3, .grid--4 { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 860px) {
  .app, .app[data-collapsed="true"] { grid-template-columns: var(--sidebar-w-collapsed) 1fr; }
  .grid--2, .grid--3, .grid--4 { grid-template-columns: 1fr; }
}

/* ============================================================
   DRAWER MOBILE (<768px)
   La sidebar devient un panneau hors-écran qui glisse à l'ouverture.
   Bouton hamburger + backdrop injectés par auth-utils.js#setupMobileSidebar
   (bascule la classe .sidebar-open sur <aside.sidebar> et .active sur le backdrop).
   ============================================================ */
@media (max-width: 767.98px) {
  /* La sidebar quitte le flux de la grille : main occupe toute la largeur. */
  .app,
  .app[data-collapsed="true"] { grid-template-columns: 1fr; }

  .sidebar {
    position: fixed;
    top: 0;
    left: 0;
    height: 100vh;
    width: 78%;
    max-width: 320px;
    z-index: 1000;
    transform: translateX(-100%);
    transition: transform 0.25s ease-out;
    box-shadow: 2px 0 12px rgba(0, 0, 0, 0.35);
  }
  .sidebar.sidebar-open { transform: translateX(0); }

  /* Dans le drawer, on garde toujours la sidebar « pleine » (libellés visibles),
     même si l'état desktop était réduit en icônes. */
  .app[data-collapsed="true"] .sidebar__brand-name,
  .app[data-collapsed="true"] .sidebar__section-label,
  .app[data-collapsed="true"] .nav-link span,
  .app[data-collapsed="true"] .product-switcher__label { display: revert; }
  .app[data-collapsed="true"] .nav-link { justify-content: flex-start; }
  .app[data-collapsed="true"] .sidebar__logo::after { display: inline-flex; }

  .sidebar-backdrop {
    position: fixed;
    inset: 0;
    background: rgba(0, 0, 0, 0.5);
    z-index: 999;
    display: none;
  }
  .sidebar-backdrop.active { display: block; }

  #mobile-sidebar-toggle {
    position: fixed;
    top: 0.6rem;
    left: 0.6rem;
    z-index: 1001;
    background: var(--c-surface);
    color: var(--c-text);
    border: 1px solid var(--c-border);
    border-radius: var(--radius-sm);
    padding: 0.4rem 0.7rem;
    font-size: 1.1rem;
    line-height: 1;
    box-shadow: var(--shadow-sm);
    cursor: pointer;
  }

  /* On masque le toggle desktop (réduction) : sur mobile c'est le hamburger
     flottant qui pilote le drawer. Décalage du contenu de la topbar pour
     ne pas passer sous le hamburger. */
  .topbar__toggle { display: none; }
  .topbar { padding-left: 3.4rem; }
}

@media (min-width: 768px) {
  #mobile-sidebar-toggle,
  .sidebar-backdrop { display: none !important; }
}

/* ---------- Loader plein écran ----------
   Affiché pendant le chargement initial, masqué par initializePage()
   (auth-utils.js). Remplace l'ancien style inline dupliqué par page. */
.page-loader { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 9999; }
.page-loader .spinner-border { width: 3rem; height: 3rem; }
