/* ══════════════════════════════════════════════════════════════════════════
   App shell (UI-Redesign Phase 3, 2026-10-22) — DESIGN.md "Layout".
   Sidebar on the canvas plane (brand, navigation, channel list, status +
   user menu), content on the panel plane. Below 768px the sidebar turns
   into a drawer behind a slim top bar. Tokens only.
   ══════════════════════════════════════════════════════════════════════════ */

#boot-spinner {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100vh;
  background: var(--color-bg-canvas);
}

#app {
  display: grid;
  grid-template-columns: var(--sidebar-w) minmax(0, 1fr);
  grid-template-rows: minmax(0, 1fr);
  height: 100vh;
  height: 100dvh;
  background: var(--color-bg-canvas);
}
#app-topbar { display: none; }

/* ── Sidebar ───────────────────────────────────────────────────────────── */
#app-sidebar {
  display: flex;
  flex-direction: column;
  min-height: 0;
  padding: var(--s-3) var(--s-2) var(--s-2);
  background: var(--color-bg-canvas);
  border-right: var(--bw) solid var(--color-border-subtle);
  z-index: var(--z-sidebar);
}

.sb-brand {
  display: flex;
  align-items: center;
  gap: var(--s-2);
  height: var(--control-h-md);
  padding: 0 var(--s-2);
  margin-bottom: var(--s-3);
}
.sb-logo { width: var(--icon-lg); height: var(--icon-lg); object-fit: contain; }
.sb-brand-name { font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--color-text-primary); }

/* Navigation rows. Active = selected tint + a 2px accent indicator at the
   left edge (DESIGN.md: the accent marks the active nav item). */
.sb-nav { display: flex; flex-direction: column; gap: var(--s-px); }
.nav-tab {
  position: relative;
  display: flex;
  align-items: center;
  gap: var(--s-2);
  width: 100%;
  height: var(--nav-row-h);
  padding: 0 var(--s-2);
  background: none;
  border: none;
  border-radius: var(--r-md);
  color: var(--color-text-secondary);
  font-size: var(--fs-sm);
  font-weight: var(--fw-medium);
  text-align: left;
  cursor: pointer;
  transition: background-color var(--dur-fast), color var(--dur-fast);
}
.nav-tab .icon { color: var(--color-text-tertiary); transition: color var(--dur-fast); }
.nav-tab:hover { background: var(--color-bg-hover); color: var(--color-text-primary); }
.nav-tab:hover .icon { color: var(--color-text-secondary); }
.nav-tab.active { background: var(--color-bg-active); color: var(--color-text-primary); }
.nav-tab.active .icon { color: var(--color-accent-text); }
.nav-tab.active::before {
  content: '';
  position: absolute;
  left: calc(var(--s-2) * -1);
  top: var(--s-1-5);
  bottom: var(--s-1-5);
  width: var(--bw-thick);
  border-radius: 0 var(--r-sm) var(--r-sm) 0;
  background: var(--color-accent);
}
.nav-tab-label { flex: 1; min-width: 0; }
/* Shortcut hint: only on hover/focus of the row, tertiary. */
.nav-tab-key {
  font-family: var(--font-mono);
  font-size: var(--fs-2xs);
  color: var(--color-text-tertiary);
  letter-spacing: 0;
  opacity: 0;
  transition: opacity var(--dur-fast);
}
.nav-tab:hover .nav-tab-key, .nav-tab:focus-visible .nav-tab-key { opacity: 1; }

.sb-section-head {
  display: flex;
  align-items: center;
  margin: var(--s-5) 0 var(--s-1-5);
  padding: 0 var(--s-2);
}
.sb-section-label {
  font-size: var(--fs-2xs);
  font-weight: var(--fw-medium);
  text-transform: uppercase;
  letter-spacing: var(--ls-caps);
  color: var(--color-text-tertiary);
}
.sb-filter { margin: 0 0 var(--s-1-5); }
.sb-filter .input { height: var(--sidebar-filter-h); background: var(--color-bg-input); }

/* The channel list scrolls on its own and never pushes the footer away. */
.sb-channels {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
  gap: var(--s-px);
  margin: 0 calc(var(--s-2) * -1);
  padding: 0 var(--s-2) var(--s-2);
}
.sidebar-channel {
  position: relative;
  display: flex;
  align-items: center;
  gap: var(--s-2);
  min-height: var(--nav-row-h);
  padding: 0 var(--s-2) 0 var(--s-1-5);
  border-radius: var(--r-md);
  color: var(--color-text-secondary);
  font-size: var(--fs-sm);
  cursor: pointer;
  transition: background-color var(--dur-fast), color var(--dur-fast);
}
.sidebar-channel:hover { background: var(--color-bg-hover); color: var(--color-text-primary); }
.sidebar-channel.active { background: var(--color-bg-selected); color: var(--color-text-primary); }
.sidebar-channel.has-unread { color: var(--color-text-primary); font-weight: var(--fw-medium); }
.sidebar-channel-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sidebar-channel-avatar { position: relative; display: inline-flex; flex-shrink: 0; }
.sidebar-channel-avatar .avatar { width: var(--avatar-sm); height: var(--avatar-sm); font-size: var(--fs-2xs); }
/* Live dot notched into the avatar corner; the ring takes the row's own
   background so it reads as cut out on every state. */
.live-dot-badge {
  position: absolute;
  right: calc(var(--s-0-5) * -1);
  bottom: calc(var(--s-0-5) * -1);
  width: var(--dot-sm);
  height: var(--dot-sm);
  border-radius: var(--r-full);
  background: var(--color-danger);
  box-shadow: 0 0 0 var(--s-0-5) var(--color-bg-canvas);
}
.sidebar-channel-mute { display: inline-flex; color: var(--color-text-tertiary); }
.sidebar-channel-mute .icon { width: var(--icon-sm); height: var(--icon-sm); }
.sidebar-channel .unread {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: var(--icon-md);
  height: var(--icon-md);
  padding: 0 var(--s-1);
  border-radius: var(--r-full);
  background: var(--color-accent);
  color: var(--color-text-on-accent);
  font-size: var(--fs-2xs);
  font-weight: var(--fw-semibold);
  font-variant-numeric: tabular-nums;
}
.sb-channels-empty { padding: var(--s-2); font-size: var(--fs-xs); color: var(--color-text-tertiary); }
.sb-channels-empty button {
  display: inline; padding: 0; background: none; border: none;
  color: var(--color-accent-text); font-size: inherit; cursor: pointer;
}
.sb-channels-empty button:hover { text-decoration: underline; }

/* ── Sidebar footer: connection status + user menu ─────────────────────── */
.sb-footer {
  display: flex;
  flex-direction: column;
  gap: var(--s-px);
  padding-top: var(--s-2);
  border-top: var(--bw) solid var(--color-border-subtle);
}
.sb-status {
  display: flex;
  align-items: center;
  gap: var(--s-2);
  height: var(--control-h-sm);
  padding: 0 var(--s-2);
  background: none;
  border: none;
  border-radius: var(--r-md);
  color: var(--color-text-tertiary);
  font-size: var(--fs-xs);
  text-align: left;
  cursor: pointer;
}
.sb-status:hover { background: var(--color-bg-hover); color: var(--color-text-secondary); }
.sb-status .dot { margin: 0 var(--s-1-5) 0 var(--s-1); }
.sb-status.is-warning { color: var(--color-warning); }
.sb-status.is-offline { color: var(--color-danger-text); }

.profile-menu { position: relative; }
.sb-user {
  display: flex;
  align-items: center;
  gap: var(--s-2);
  width: 100%;
  height: var(--control-h-lg);
  padding: 0 var(--s-2) 0 var(--s-1-5);
  background: none;
  border: none;
  border-radius: var(--r-md);
  color: var(--color-text-primary);
  text-align: left;
  cursor: pointer;
  transition: background-color var(--dur-fast);
}
.sb-user:hover, .sb-user[aria-expanded="true"] { background: var(--color-bg-hover); }
.sb-user > .icon { color: var(--color-text-tertiary); }
.sb-user-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: var(--fw-medium); }

/* Opens upward from the footer. */
.profile-dropdown {
  position: absolute;
  left: 0;
  right: 0;
  bottom: calc(100% + var(--s-1));
  min-width: calc(var(--sidebar-w) - var(--s-4));
}
.profile-dropdown a.linked { color: var(--color-success); }
.dropdown-account-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--s-2);
  min-height: var(--control-h-sm);
  padding: 0 var(--s-2);
  font-size: var(--fs-xs);
}
.dropdown-account-row.empty { color: var(--color-text-tertiary); justify-content: flex-start; padding: 0 var(--s-2); text-align: left; }
.dropdown-account-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.profile-dropdown .dropdown-link { color: var(--color-accent-text); font-size: var(--fs-xs); min-height: var(--control-h-sm); }
.dropdown-kbd { margin-left: auto; }
.dropdown-version { padding: var(--s-1) var(--s-2); font-family: var(--font-mono); font-size: var(--fs-2xs); color: var(--color-text-tertiary); letter-spacing: 0; }

/* ── Content area ──────────────────────────────────────────────────────── */
#app-main {
  display: flex;
  flex-direction: column;
  min-width: 0;
  min-height: 0;
  background: var(--color-bg-panel);
  overflow: hidden;
}
.view { display: none; flex: 1; min-height: 0; min-width: 0; }
.view.active { display: flex; animation: fade-in var(--dur-enter) var(--ease-out); }

/* Scrolling page with a header + centered body capped at --content-max.
   Views opt in with .page (everything but Chat). */
.view.page { flex-direction: column; overflow-y: auto; }
.page-header {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--s-2) var(--s-3);
  width: 100%;
  max-width: var(--content-max);
  margin: 0 auto;
  padding: var(--s-6) var(--s-8) var(--s-4);
}
.page-title { font-size: var(--fs-lg); font-weight: var(--fw-semibold); color: var(--color-text-primary); }
.page-subtitle { font-size: var(--fs-sm); color: var(--color-text-tertiary); }
.page-actions { margin-left: auto; display: flex; align-items: center; gap: var(--s-2); }
.page-body {
  display: flex;
  flex-direction: column;
  gap: var(--s-4);
  width: 100%;
  max-width: var(--content-max);
  margin: 0 auto;
  padding: 0 var(--s-8) var(--s-8);
}
.page-body.is-narrow, .page-header.is-narrow { max-width: var(--content-narrow); }

/* ── Mobile: drawer navigation ─────────────────────────────────────────── */
@media (max-width: 767px) {
  #app { grid-template-columns: minmax(0, 1fr); grid-template-rows: var(--topbar-h) minmax(0, 1fr); }
  #app-topbar {
    display: flex;
    align-items: center;
    gap: var(--s-2);
    padding: 0 var(--s-2);
    background: var(--color-bg-canvas);
    border-bottom: var(--bw) solid var(--color-border-subtle);
  }
  #app-topbar .btn { width: var(--touch-min); height: var(--touch-min); }
  #topbar-title { flex: 1; font-weight: var(--fw-semibold); }
  #topbar-status-dot { margin-right: var(--s-2); }
  #app-sidebar {
    position: fixed;
    top: 0;
    bottom: 0;
    left: 0;
    width: min(var(--sidebar-w), 85vw);
    transform: translateX(-100%);
    transition: transform var(--dur-base) var(--ease-standard);
    box-shadow: var(--shadow-modal);
    z-index: var(--z-modal);
  }
  #app.nav-open #app-sidebar { transform: none; }
  #nav-scrim {
    position: fixed;
    inset: 0;
    background: var(--color-scrim);
    z-index: calc(var(--z-modal) - 1);
    animation: fade-in var(--dur-base) var(--ease-out);
  }
  .nav-tab, .sidebar-channel, .sb-status { min-height: var(--touch-min); }
  .nav-tab-key { display: none; }
  .page-header { padding: var(--s-4) var(--s-4) var(--s-3); }
  .page-body { padding: 0 var(--s-4) var(--s-6); }
}

/* ── Shortcut overview modal ───────────────────────────────────────────── */
.shortcut-list { display: flex; flex-direction: column; gap: var(--s-4); }
.shortcut-group-title {
  margin-bottom: var(--s-1);
  font-size: var(--fs-2xs);
  font-weight: var(--fw-medium);
  text-transform: uppercase;
  letter-spacing: var(--ls-caps);
  color: var(--color-text-tertiary);
}
.shortcut-row { display: flex; align-items: center; justify-content: space-between; gap: var(--s-4); min-height: var(--control-h-sm); }
.shortcut-keys { display: inline-flex; gap: var(--s-1); }
