/* Major portal layout primitives. */
.page-glow {
  position: fixed;
  top: 50%;
  left: 50%;
  width: 40vw;
  height: 40vw;
  transform: translate(-55%, -58%);
  pointer-events: none;
  background: rgba(56, 189, 248, 0.15);
  filter: blur(100px);
  border-radius: 50%;
  z-index: 0;
}

.wrap {
  width: min(1120px, 95vw);
  margin: 0 auto;
  padding: 0.5rem;
  flex: 1;
  position: relative;
  z-index: 1;
  min-height: 0;
}

.frame {
  border: 2px solid var(--line);
  border-radius: 10px;
  background: rgba(15, 23, 42, 0.4);
  box-shadow:
    0 8px 32px 0 rgba(0, 0, 0, 0.3),
    inset 0 1px 0 rgba(255, 255, 255, 0.03);
  overflow: hidden;
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  /* .wrap is already flex:1 inside body's flex column, so it's exactly
     "100vh minus whatever the footer actually renders at" with no guessing.
     A hardcoded height: calc(100vh - 132px - 1.1rem) here duplicated that
     but with a magic number for the footer's assumed height - real footer
     height drifts a few px across browsers/devices (font metrics, toolbar
     chrome affecting 100vh), which is exactly what was truncating content
     on some Chromebook/MacBook viewports. Filling .wrap's real height
     instead tracks the actual footer position on any device. */
  height: 100%;
  display: flex;
  flex-direction: column;
  min-height: 0;
}

.banner {
  border-bottom: 1px solid rgba(255, 255, 255, 0.1);
  padding: 1rem 1.2rem;
  background: rgba(15, 23, 42, 0.4);
  position: relative;
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
}

.banner::after {
  content: "";
  position: absolute;
  left: 1.2rem;
  right: 1.2rem;
  bottom: 0;
  height: 1px;
  background: linear-gradient(90deg, transparent, rgba(255, 207, 90, 0.65), transparent);
}

.kicker {
  margin: 0;
  font-size: 0.78rem;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: var(--accent-2);
  font-family: var(--font-terminal);
}

h1 {
  margin: 0.35rem 0 0.3rem;
  font-size: clamp(1.3rem, 4vw, 2.25rem);
  letter-spacing: -0.02em;
  color: var(--accent);
  text-shadow: 0 0 14px rgba(255, 207, 90, 0.2);
  font-family: var(--font-terminal);
}

.desc {
  margin: 0;
  color: rgba(255, 255, 255, 0.7);
  max-width: 72ch;
  font-size: clamp(0.95rem, 1.2vw, 1.03rem);
  font-family: var(--font-ui);
}

.content {
  padding: 0.85rem 1.05rem 0.8rem;
  display: grid;
  grid-template-columns: 1.6fr 1fr;
  gap: 1rem;
  /* align-items: start (the grid default override) let grid items size to
     their own natural content height instead of stretching to fill .content
     - which meant .main-panel/nav/nav ul never had a real height constraint
     to overflow against internally, so a too-tall link list just overflowed
     .content itself and got hard-clipped by its overflow:hidden instead of
     scrolling in nav ul as intended. stretch gives .main-panel a real height
     to pass down the flex chain. */
  align-items: stretch;
  flex: 1;
  min-height: 0;
  overflow: hidden;
  background: rgba(15, 23, 42, 0.4);
  border: 1px solid rgba(255, 255, 255, 0.1);
  border-radius: 16px;
  box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.3);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
}

.main-panel {
  min-width: 0;
  min-height: 0;
  display: flex;
  flex-direction: column;
}

.main-copy {
  margin: 0 0 0.55rem;
  color: rgba(255, 255, 255, 0.7);
  max-width: 60ch;
  font-size: clamp(0.92rem, 1.05vw, 0.98rem);
  font-family: var(--font-ui);
}

.main-panel nav {
  flex: 1;
  min-height: 0;
  display: flex;
}
