// App shell: fixed-height header on top, sidebar + main beside each
// other below, both filling the remaining viewport height. The sidebar
// owns its own scrolling (long menus don't push the header off-screen);
// the main pane scrolls independently so opening a long page never
// scrolls the sidebar out of view.
//
// Dark mode goes through `:host-context(.dark)` — the `.dark` class
// sits on <html>, outside this component's view encapsulation, so a
// nested `:where(.dark) &` would compile to a selector with the
// `_ngcontent` attribute appended to `.dark` itself, which <html>
// doesn't carry. `:host-context()` is the Angular-canonical escape
// hatch that walks the DOM up from the host and matches without
// applying the scoping attribute to the ancestor selector.
:host {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
  height: 100vh;
}

.shell-body {
  display: flex;
  flex: 1 1 auto;
  min-height: 0;
}

.shell-main {
  flex: 1 1 auto;
  min-width: 0;
  overflow-y: auto;
  background-color: #f9fafb;
  color: #111827;
}

:host-context(.dark) .shell-main {
  background-color: #0b1220;
  color: #e5e7eb;
}

// Skip-link (WCAG 2.4.1 "Bypass Blocks"). Hidden by default, fully
// visible and focusable when reached via Tab from the address bar.
// Plain CSS rather than the `sr-only` Tailwind utilities so the
// visual state on focus is as predictable as possible across themes.
.skip-link {
  position: absolute;
  top: -40px;
  left: 0.75rem;
  z-index: 50;
  padding: 0.5rem 0.75rem;
  background: var(--color-brand-primary-500);
  color: #fff;
  border-radius: 0.25rem;
  text-decoration: none;
  transition: top 0.15s ease-out;

  &:focus,
  &:focus-visible {
    top: 0.5rem;
    outline: 2px solid var(--color-brand-accent-300);
    outline-offset: 2px;
  }
}
