/* ==========================================================================
   DULANTHA WEERASEKARA — PORTFOLIO
   Visual world: enterprise security-zone topology schematic.
   Ground = engineering print; zones own regions; connectors carry the eye.
   ========================================================================== */

:root {
  /* Ink & ground */
  --ground: #f4f6f9;
  --paper: #ffffff;
  --grid-line: rgba(15, 53, 84, 0.055);
  --ink: #0f3554;
  --ink-soft: #46647f;
  --ink-faint: #7d94a8;
  --line: #b9c7d4;
  --line-strong: #7d94a8;

  /* Roles */
  --blue: #2f6fed;
  --blue-tint: #e8eefc;
  --green: #1e9e5a;
  --green-text: #157a43;   /* green for text runs: >=4.5:1 on tint + paper */
  --green-tint: #e7f4ec;
  --red: #d93a2b;
  --red-tint: #fdecea;
  --amber: #b97a1a;
  --amber-text: #8a5c12;   /* amber for text runs: >=4.5:1 on tint */
  --amber-tint: #fdf4e3;

  /* Type */
  --font-sans: "Archivo", "Segoe UI", system-ui, sans-serif;
  --font-mono: "Fragment Mono", "Consolas", "Courier New", monospace;

  /* Rhythm */
  --space-1: 0.375rem;
  --space-2: 0.75rem;
  --space-3: 1.25rem;
  --space-4: 2rem;
  --space-5: 3.25rem;
  --space-6: 5.5rem;

  /* Plate (dark management panel) & CTA roles */
  --plate: #0f3554;
  --plate-text: #eaf1f7;
  --plate-soft: #b9cbdc;
  --plate-faint: #8fa9c0;
  --cta-bg: #0f3554;
  --cta-fg: #ffffff;
  --cta-hover-bg: #2f6fed;
  --cta-hover-fg: #ffffff;
  --shadow: rgba(15, 53, 84, 0.07);
  --shadow-strong: rgba(15, 53, 84, 0.18);

  --dash: 6 5;             /* zone border dash pattern */
  --bus-x: 2.25rem;        /* mobile bus line offset */
}

/* ---------- Attacker view (dark red-team theme) ---------- */

html[data-theme="dark"] {
  --ground: #10151c;
  --paper: #1a212b;
  --grid-line: rgba(140, 170, 200, 0.06);
  --ink: #d9e4ee;
  --ink-soft: #9fb2c3;
  --ink-faint: #64798d;
  --line: #2b3a4a;
  --line-strong: #4d6579;

  --blue: #6296ff;
  --blue-tint: #1a2637;
  --green: #3ddc74;
  --green-text: #43c878;
  --green-tint: #16281d;
  --red: #ff6355;
  --red-tint: #331a17;
  --amber: #e3a83f;
  --amber-text: #d69a35;
  --amber-tint: #2b2314;

  --plate: #0c1520;
  --cta-bg: #c43a2b;       /* the attacker view leads with the red team's color */
  --cta-fg: #ffffff;
  --cta-hover-bg: #a92e21;
  --cta-hover-fg: #ffffff;
  --shadow: rgba(0, 0, 0, 0.35);
  --shadow-strong: rgba(0, 0, 0, 0.5);
}

/* ---------- Reset & base ---------- */

*,
*::before,
*::after { box-sizing: border-box; }

html {
  scroll-behavior: smooth;
  scroll-padding-top: 4.5rem;
}

html, body { overflow-x: clip; }

/* Lenis smooth scroll */
html.lenis, html.lenis body { height: auto; }
.lenis.lenis-smooth { scroll-behavior: auto !important; }
.lenis.lenis-smooth [data-lenis-prevent] { overscroll-behavior: contain; }
.lenis.lenis-stopped { overflow: hidden; }
.lenis.lenis-smooth iframe { pointer-events: none; }

/* Reveal targets are pre-hidden ONLY when JS + motion are available
   (html.has-js is set by an inline head script that skips reduced-motion);
   GSAP animates them in. No-JS and reduced-motion viewers never get the
   class, so content is visible by default. */
html.has-js .edge-headline .role-line,
html.has-js .edge-headline h1,
html.has-js .edge-headline .title-line,
html.has-js .edge-headline .value-line,
html.has-js .edge-actions,
html.has-js .avail-note,
html.has-js .edge-diagram,
html.has-js .zone h2,
html.has-js .zone-intro,
html.has-js .device,
html.has-js .appliance,
html.has-js .lab-item,
html.has-js .cert-table tbody tr,
html.has-js .edu-block li,
html.has-js .mgmt-links li,
html.has-js .tb-cell { opacity: 0; }

body {
  margin: 0;
  font-family: var(--font-sans);
  font-size: 1.0625rem;
  line-height: 1.6;
  color: var(--ink);
  background-color: var(--ground);
  background-image:
    linear-gradient(var(--grid-line) 1px, transparent 1px),
    linear-gradient(90deg, var(--grid-line) 1px, transparent 1px);
  background-size: 32px 32px;
  -webkit-font-smoothing: antialiased;
}

/* ---------- Browser surfaces carry the design ---------- */

::selection {
  background: var(--blue);
  color: #fff;
}

:focus-visible {
  outline: 2px dashed var(--blue);   /* diagram selection marquee */
  outline-offset: 3px;
  border-radius: 3px;
}

html {
  scrollbar-color: var(--line-strong) var(--ground);
  scrollbar-width: thin;
}
body::-webkit-scrollbar { width: 10px; }
body::-webkit-scrollbar-track { background: var(--ground); }
body::-webkit-scrollbar-thumb {
  background: var(--line-strong);
  border: 2px solid var(--ground);
  border-radius: 6px;
}

a {
  color: var(--blue);
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 0.2em;
}
a:hover { color: var(--ink); }

/* ---------- Type scale ---------- */

h1, h2, h3 {
  line-height: 1.12;
  text-wrap: balance;
  margin: 0;
}

h2 {
  font-size: clamp(1.7rem, 3.2vw, 2.4rem);
  font-weight: 700;
  letter-spacing: -0.015em;
  margin-bottom: var(--space-2);
}

h3 {
  font-size: 1.2rem;
  font-weight: 600;
}

p { margin: 0 0 var(--space-3); max-width: 68ch; }

.mono {
  font-family: var(--font-mono);
  font-size: 0.78rem;
  letter-spacing: 0.01em;
}

/* ==========================================================================
   Drawing header (fixed top bar)
   ========================================================================== */

.dwg-header {
  position: fixed;
  inset: 0 0 auto 0;
  z-index: 50;
  display: flex;
  align-items: center;
  gap: var(--space-3);
  padding: 0.55rem 1.25rem;
  background: color-mix(in srgb, var(--paper) 92%, transparent);
  backdrop-filter: blur(6px);
  border-bottom: 1px solid var(--line);
}

.dwg-header .dwg-id {
  font-family: var(--font-mono);
  font-size: 0.78rem;
  color: var(--ink-soft);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.dwg-header nav {
  margin-left: auto;
  display: flex;
  gap: 0.25rem;
}

.dwg-header nav a {
  font-family: var(--font-mono);
  font-size: 0.78rem;
  color: var(--ink-soft);
  text-decoration: none;
  padding: 0.35rem 0.7rem;
  border: 1px solid transparent;
  border-radius: 3px;
}

.dwg-header nav a:hover,
.dwg-header nav a:focus-visible {
  color: var(--ink);
  border-color: var(--line);
  background: var(--ground);
}

.mode-toggle {
  font-family: var(--font-mono);
  font-size: 0.7rem;
  letter-spacing: 0.04em;
  color: var(--ink);
  background: var(--ground);
  border: 1px solid var(--line-strong);
  border-radius: 3px;
  padding: 0.35rem 0.7rem;
  cursor: pointer;
  white-space: nowrap;
  transition: color 140ms ease-out, border-color 140ms ease-out, background-color 140ms ease-out;
}

.mode-toggle:hover, .mode-toggle:focus-visible {
  border-color: var(--ink);
}

html[data-theme="dark"] .mode-toggle {
  color: var(--red);
  border-color: var(--red);
}

/* ==========================================================================
   Layout shell
   ========================================================================== */

.sheet {
  max-width: 1180px;
  margin: 0 auto;
  padding: 0 clamp(1rem, 4vw, 2.5rem);
}

/* ==========================================================================
   Hero — the network edge
   ========================================================================== */

.edge {
  padding-top: 7.5rem;
  padding-bottom: var(--space-5);
}

.edge-grid {
  display: grid;
  grid-template-columns: minmax(0, 6fr) minmax(0, 5fr);
  gap: var(--space-5);
  align-items: center;
}

.edge-headline .role-line {
  font-family: var(--font-mono);
  font-size: 0.78rem;
  color: var(--ink-soft);
  margin: 0 0 var(--space-2);
}

.edge-headline .role-line .permit {
  color: var(--green-text);
  font-weight: 400;
}

.edge-headline h1 {
  font-size: clamp(2.1rem, 4.6vw, 3.9rem);
  font-weight: 800;
  font-stretch: 118%;
  text-transform: uppercase;
  letter-spacing: -0.01em;
  line-height: 0.98;
}

.edge-headline .title-line {
  margin-top: var(--space-2);
  font-size: clamp(1.15rem, 2vw, 1.45rem);
  font-weight: 500;
  color: var(--ink);
}

.edge-headline .value-line {
  margin-top: var(--space-3);
  color: var(--ink-soft);
  font-size: 1.0625rem;
  max-width: 46ch;
}

.edge-actions {
  margin-top: var(--space-4);
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2);
  align-items: center;
}

.btn {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  font-family: var(--font-mono);
  font-size: 0.82rem;
  text-decoration: none;
  padding: 0.7rem 1.1rem;
  border-radius: 4px;
  border: 1px solid var(--ink);
  color: var(--ink);
  background: var(--paper);
  transition: background-color 140ms ease-out, color 140ms ease-out,
              box-shadow 140ms ease-out, transform 140ms ease-out;
}

.btn svg { flex: none; }

.btn:hover, .btn:focus-visible {
  transform: translateY(-1px);
  box-shadow: 0 3px 10px var(--shadow-strong);
}

.btn-primary {
  background: var(--cta-bg);
  color: var(--cta-fg);
  border-color: var(--cta-bg);
}
.btn-primary:hover, .btn-primary:focus-visible {
  background: var(--cta-hover-bg);
  border-color: var(--cta-hover-bg);
  color: var(--cta-hover-fg);
}

.btn-quiet { border-color: var(--line-strong); color: var(--ink-soft); }
.btn-quiet:hover, .btn-quiet:focus-visible { color: var(--ink); border-color: var(--ink); }

.avail-note {
  width: 100%;
  margin-top: var(--space-2);
  font-family: var(--font-mono);
  font-size: 0.78rem;
  color: var(--ink-soft);
}
.avail-note .dot {
  display: inline-block;
  width: 0.55em; height: 0.55em;
  border-radius: 50%;
  background: var(--green);
  margin-right: 0.45em;
}

/* Hero diagram */

.edge-diagram { min-width: 0; }
.edge-diagram svg { display: block; width: 100%; height: auto; }
.edge-diagram .diagram-mobile { display: none; }

/* Defender view shows the diagram; attacker view swaps in the terminal. */
.edge-terminal { display: none; }
html[data-theme="dark"] .diagram-figure { display: none; }
html[data-theme="dark"] .edge-terminal { display: block; }

.edge-terminal {
  border: 1.5px solid var(--line-strong);
  border-radius: 6px;
  background: var(--plate);
  box-shadow: 0 10px 15px var(--shadow-strong);
  overflow: hidden;
  font-family: var(--font-mono);
}

.term-bar {
  display: flex;
  align-items: center;
  gap: 0.45rem;
  padding: 0.55rem 0.85rem;
  background: var(--paper);
  border-bottom: 1px solid var(--line);
}

.term-dot { width: 0.72em; height: 0.72em; border-radius: 50%; flex: none; }
.term-dot.r { background: var(--red); }
.term-dot.a { background: var(--amber); }
.term-dot.g { background: var(--green); }

.term-title {
  margin-left: 0.4rem;
  font-size: 0.7rem;
  color: var(--ink-faint);
  letter-spacing: 0.02em;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

.term-body {
  padding: 1rem 1.1rem 1.25rem;
  font-size: 0.82rem;
  line-height: 1.75;
  color: var(--ink-soft);
  min-height: 22.5rem;
}

.term-line {
  display: block;
  white-space: pre-wrap;
  word-break: break-word;
}

.term-prompt { color: var(--green); }
.term-prompt.root { color: var(--red); }

.term-line.cmd .term-type,
.term-line.root .term-type { color: var(--ink); }
.term-line.ok .term-type { color: var(--green-text); }
.term-line.muted .term-type { color: var(--ink-faint); }

.term-cursor {
  display: inline-block;
  width: 0.55em;
  height: 1.05em;
  vertical-align: -0.18em;
  margin-left: 2px;
  background: var(--green);
  animation: term-blink 1.05s steps(1) infinite;
}

@keyframes term-blink { 50% { opacity: 0; } }

/* SVG shared vocabulary */
.d-label {
  font-family: var(--font-mono);
  font-size: 11px;
  fill: var(--ink-soft);
  letter-spacing: 0.02em;
}
.d-label-strong { fill: var(--ink); }
.d-name {
  font-family: var(--font-sans);
  font-weight: 700;
  fill: var(--ink);
}
.d-wire {
  stroke: var(--line-strong);
  stroke-width: 1.5;
  fill: none;
}
.d-node {
  fill: var(--paper);
  stroke: var(--ink);
  stroke-width: 1.5;
}
.d-glyph {
  stroke: var(--ink);
  stroke-width: 1.5;
  fill: none;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.d-zone-stub {
  fill: var(--paper);
  stroke: var(--line-strong);
  stroke-width: 1.25;
  stroke-dasharray: var(--dash);
}
.pkt { r: 4; }
.pkt-permit { fill: var(--green); }
.pkt-deny { fill: var(--red); }
.deny-mark { stroke: var(--red); stroke-width: 2; stroke-linecap: round; }

/* ==========================================================================
   Zones
   ========================================================================== */

.zone {
  position: relative;
  margin-block: var(--space-6);
}

/* Connector between zones (desktop): a short vertical wire w/ junction */
.zone::before {
  content: "";
  position: absolute;
  top: calc(-1 * var(--space-6));
  left: 50%;
  height: var(--space-6);
  border-left: 1.5px solid var(--line-strong);
  transform: scaleY(0);
  transform-origin: top;
  transition: transform 600ms cubic-bezier(0.16, 1, 0.3, 1);
}
.zone.wired::before { transform: scaleY(1); }

.zone-frame {
  position: relative;
  border: 1.5px dashed var(--zone-line, var(--line-strong));
  border-radius: 6px;
  background: var(--zone-tint, var(--paper));
  padding: clamp(1.5rem, 4vw, 3rem);
}

/* Zone label: sits ON the border, fieldset-legend style — diagram grammar */
.zone-tab {
  position: absolute;
  top: 0;
  left: clamp(1rem, 3vw, 2.25rem);
  transform: translateY(-55%);
  display: inline-flex;
  align-items: baseline;
  gap: 0.7em;
  padding: 0.2rem 0.7rem;
  background: var(--zone-tab-bg, var(--ink));
  color: #fff;
  font-family: var(--font-mono);
  font-size: 0.78rem;
  letter-spacing: 0.04em;
  border-radius: 3px;
}
.zone-tab .seg {
  color: rgba(255, 255, 255, 0.85);
  letter-spacing: 0.02em;
}

.zone-intro { color: var(--ink-soft); max-width: 62ch; }

/* Zone color variants */
.zone-perimeter { --zone-line: #6f8ec9; --zone-tint: var(--blue-tint); --zone-tab-bg: #274f9e; }
.zone-trust     { --zone-line: #63a37f; --zone-tint: var(--green-tint); --zone-tab-bg: #1d6e42; }
.zone-lab       { --zone-line: #c99e58; --zone-tint: var(--amber-tint); --zone-tab-bg: #8a5c12; }
.zone-ca        { --zone-line: var(--line-strong); --zone-tint: var(--paper); --zone-tab-bg: #0f3554; }
.zone-mgmt      { --zone-line: var(--plate); --zone-tint: var(--plate); --zone-tab-bg: #1d49a8; }
html[data-theme="dark"] .zone-mgmt { --zone-line: var(--line-strong); }

/* ==========================================================================
   Perimeter zone — capability devices on a bus
   ========================================================================== */

.bus {
  position: relative;
  margin-top: var(--space-4);
  display: grid;
  grid-template-columns: repeat(12, 1fr);
  gap: var(--space-3);
}

/* the segment bus line behind the devices */
.bus::before {
  content: "";
  position: absolute;
  top: 1.4rem;
  left: 2%;
  right: 2%;
  border-top: 1.5px solid var(--line-strong);
}

.device {
  position: relative;
  background: var(--paper);
  border: 1.5px solid var(--ink);
  border-radius: 5px;
  padding: var(--space-3);
  box-shadow: 0 2px 8px var(--shadow);
}

/* drop line from bus to device */
.device::before {
  content: "";
  position: absolute;
  top: -0.85rem;
  left: 2rem;
  height: 0.85rem;
  border-left: 1.5px solid var(--line-strong);
}

.device-firewall { grid-column: span 7; }
.device-vpn      { grid-column: span 5; }
.device-switch   { grid-column: span 5; }
.device-monitor  { grid-column: span 7; }

.device-head {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  margin-bottom: var(--space-2);
}

.device-head svg { flex: none; stroke: var(--ink); }

.device-head h3 { font-size: 1.0625rem; }

.device-head .dev-id {
  margin-left: auto;
  font-family: var(--font-mono);
  font-size: 0.7rem;
  color: var(--ink-faint);
}

.device p {
  font-size: 0.95rem;
  color: var(--ink-soft);
  margin-bottom: var(--space-2);
}

.iface-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem;
}

.iface-list li {
  font-family: var(--font-mono);
  font-size: 0.78rem;
  color: var(--ink);
  background: var(--ground);
  border: 1px solid var(--line);
  border-radius: 3px;
  padding: 0.22rem 0.55rem;
}

/* ==========================================================================
   Trust zone — experience appliances
   ========================================================================== */

.appliance {
  background: var(--paper);
  border: 1.5px solid var(--ink);
  border-radius: 5px;
  margin-top: var(--space-4);
  box-shadow: 0 2px 8px var(--shadow);
  overflow: hidden;
}

.appliance-head {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0.4rem 1.25rem;
  padding: var(--space-3) var(--space-4);
  border-bottom: 1.5px solid var(--ink);
  background: var(--ground);
}

.appliance-head h3 {
  font-size: 1.2rem;
  font-weight: 700;
}

.appliance-head .role {
  font-size: 1rem;
  font-weight: 500;
  color: var(--ink-soft);
}

.appliance-head .meta {
  margin-left: auto;
  font-family: var(--font-mono);
  font-size: 0.78rem;
  color: var(--ink-soft);
  text-align: right;
}

.appliance-body { padding: var(--space-4); }

.log {
  list-style: none;
  margin: 0;
  padding: 0;
}

.log li {
  position: relative;
  padding: 0.45rem 0 0.45rem 1.6rem;
  max-width: 75ch;
  color: var(--ink);
  font-size: 1rem;
}

/* annotation tick — connector stub into each line */
.log li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 1.05em;
  width: 0.9rem;
  border-top: 1.5px solid var(--line-strong);
}

.log li strong { font-weight: 600; }

.log li.sub-role {
  margin-top: var(--space-2);
  padding-top: var(--space-2);
  border-top: 1.5px dashed var(--line);
  color: var(--ink-soft);
  font-size: 0.95rem;
}

.log .metric {
  font-family: var(--font-mono);
  font-size: 0.85em;
  color: var(--green-text);
  font-weight: 400;
  background: var(--green-tint);
  border-radius: 3px;
  padding: 0.05em 0.35em;
}

/* ==========================================================================
   Lab zone — isolated segment
   ========================================================================== */

.zone-lab .zone-frame { border-style: dashed; }

.airgap-note {
  position: absolute;
  top: 0;
  right: clamp(1rem, 3vw, 2.25rem);
  transform: translateY(-55%);
  font-family: var(--font-mono);
  font-size: 0.7rem;
  color: var(--amber-text);
  background: var(--amber-tint);
  border: 1px dashed var(--amber);
  border-radius: 3px;
  padding: 0.18rem 0.6rem;
}

.lab-grid {
  margin-top: var(--space-4);
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--space-3) var(--space-4);
}

.lab-item {
  border-top: 1.5px solid var(--zone-line);
  padding-top: var(--space-2);
}

.lab-item h3 { font-size: 1.0625rem; margin-bottom: 0.3rem; }
.lab-item p { font-size: 0.95rem; color: var(--ink-soft); margin-bottom: 0.5rem; }

.lab-tools {
  margin-top: var(--space-4);
  padding-top: var(--space-3);
  border-top: 1.5px dashed var(--zone-line);
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0.4rem;
}

.lab-tools .mono { color: var(--amber-text); margin-right: 0.5rem; }

.lab-tools span:not(.mono) {
  font-family: var(--font-mono);
  font-size: 0.78rem;
  background: var(--paper);
  border: 1px solid var(--zone-line);
  border-radius: 3px;
  padding: 0.22rem 0.55rem;
}

/* ==========================================================================
   CA zone — certification records
   ========================================================================== */

.cert-tier {
  margin-top: var(--space-4);
}

.cert-table {
  margin-top: var(--space-2);
  width: 100%;
  border-collapse: collapse;
  font-size: 0.95rem;
}

.cert-table caption {
  text-align: left;
  font-family: var(--font-mono);
  font-size: 0.78rem;
  color: var(--ink-faint);
  padding-bottom: var(--space-2);
}

.cert-table th {
  text-align: left;
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 0.78rem;
  letter-spacing: 0.04em;
  color: var(--ink-soft);
  border-bottom: 1.5px solid var(--ink);
  padding: 0.5rem 0.75rem 0.5rem 0;
}

.cert-table td {
  border-bottom: 1px solid var(--line);
  padding: 0.65rem 0.75rem 0.65rem 0;
  font-variant-numeric: tabular-nums;
}

.cert-table td.year {
  font-family: var(--font-mono);
  font-size: 0.82rem;
  color: var(--ink-soft);
}

.cert-table .status {
  font-family: var(--font-mono);
  font-size: 0.78rem;
  color: var(--green-text);
  white-space: nowrap;
}
.cert-table .status::before {
  content: "";
  display: inline-block;
  width: 0.5em; height: 0.5em;
  border-radius: 50%;
  background: var(--green);
  margin-right: 0.45em;
}
.cert-table .status.expired { color: var(--ink-faint); }
.cert-table .status.expired::before { background: var(--ink-faint); }

.cert-verify {
  margin-top: var(--space-3);
  font-size: 0.95rem;
}

.edu-block {
  margin-top: var(--space-5);
  border-top: 1.5px dashed var(--line-strong);
  padding-top: var(--space-3);
}

.edu-block h3 { margin-bottom: var(--space-2); }

.edu-block ul {
  list-style: none;
  margin: 0;
  padding: 0;
}

.edu-block li {
  display: flex;
  flex-wrap: wrap;
  gap: 0.25rem 1rem;
  align-items: baseline;
  padding: 0.4rem 0;
  font-size: 0.95rem;
}

.edu-block li .mono { color: var(--ink-faint); margin-left: auto; }

/* ==========================================================================
   Management zone — contact (dark plate)
   ========================================================================== */

.zone-mgmt .zone-frame {
  color: var(--plate-text);
  border-style: solid;
}

.zone-mgmt h2 { color: #fff; }

.zone-mgmt .zone-intro { color: var(--plate-soft); }

.zone-mgmt ::selection { background: #fff; color: var(--ink); }

.mgmt-grid {
  margin-top: var(--space-4);
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  gap: var(--space-4);
  align-items: end;
}

.mgmt-links {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 0.8rem;
}

.mgmt-links a {
  display: inline-flex;
  align-items: center;
  flex-wrap: wrap;
  overflow-wrap: anywhere;
  min-width: 0;
  gap: 0.75rem;
  color: var(--plate-text);
  text-decoration: none;
  font-size: 1.0625rem;
  border-bottom: 1px solid rgba(255, 255, 255, 0.25);
  padding-bottom: 0.35rem;
  transition: border-color 140ms ease-out, color 140ms ease-out;
}

.mgmt-links a:hover, .mgmt-links a:focus-visible {
  color: #fff;
  border-color: #fff;
}

.mgmt-links svg { stroke: currentColor; flex: none; }

.mgmt-links .proto {
  font-family: var(--font-mono);
  font-size: 0.78rem;
  color: var(--plate-faint);
  min-width: 5.5em;
}

.mgmt-cta { text-align: right; }

.mgmt-cta .btn-console {
  background: #fff;
  color: var(--ink);
  border-color: #fff;
  font-size: 0.82rem;
  padding: 0.85rem 1.4rem;
}
.mgmt-cta .btn-console:hover, .mgmt-cta .btn-console:focus-visible {
  background: var(--blue);
  border-color: var(--blue);
  color: #fff;
}

/* Attacker view: the console CV button wears the red-team CTA color,
   matching the hero Download CV button. */
html[data-theme="dark"] .mgmt-cta .btn-console {
  background: var(--cta-bg);
  color: var(--cta-fg);
  border-color: var(--cta-bg);
}
html[data-theme="dark"] .mgmt-cta .btn-console:hover,
html[data-theme="dark"] .mgmt-cta .btn-console:focus-visible {
  background: var(--cta-hover-bg);
  border-color: var(--cta-hover-bg);
  color: var(--cta-hover-fg);
}

.mgmt-cta .loc {
  margin-top: var(--space-2);
  font-family: var(--font-mono);
  font-size: 0.78rem;
  color: var(--plate-faint);
}

/* ==========================================================================
   Footer — title block
   ========================================================================== */

.title-block {
  margin: var(--space-6) 0 0;
  border-top: 1.5px solid var(--ink);
  background: var(--paper);
}

.title-block .sheet {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  padding-top: 0;
  padding-bottom: 0;
}

.tb-cell {
  border-right: 1px solid var(--line);
  padding: var(--space-2) var(--space-3) var(--space-3) 0;
  padding-left: var(--space-3);
}
.tb-cell:first-child { padding-left: 0; }
.tb-cell:last-child { border-right: 0; }

.tb-cell .k {
  display: block;
  font-family: var(--font-mono);
  font-size: 0.7rem;
  letter-spacing: 0.08em;
  color: var(--ink-faint);
  margin-bottom: 0.2rem;
  padding-top: 0.5rem;
}

.tb-cell .v {
  font-size: 0.82rem;
  color: var(--ink);
}

/* ==========================================================================
   Motion
   ========================================================================== */

.pkt-track { opacity: 1; }

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  .zone::before { transition: none; transform: scaleY(1); }
  .pkt, .deny-mark, .pkt-track * { animation: none !important; }
  .pkt-anim { display: none; }
  .btn, .mgmt-links a { transition: none; }
  .term-cursor { animation: none; }
}

/* ==========================================================================
   Responsive
   ========================================================================== */

@media (max-width: 960px) {
  .edge-grid { grid-template-columns: 1fr; gap: var(--space-4); }
  .device-firewall, .device-vpn, .device-switch, .device-monitor { grid-column: span 12; }
  .mgmt-grid { grid-template-columns: 1fr; }
  .mgmt-cta { text-align: left; }
}

@media (max-width: 720px) {
  body { font-size: 1rem; }

  .edge-headline h1 {
    font-size: clamp(1.9rem, 9.6vw, 2.6rem);
    font-stretch: 102%;
  }

  .dwg-header nav a:not(.nav-keep) { display: none; }

  .edge { padding-top: 6rem; }

  .edge-diagram .diagram-desktop { display: none; }
  .edge-diagram .diagram-mobile { display: block; }

  .term-body { font-size: 0.78rem; min-height: 19rem; padding: 0.85rem 0.9rem 1rem; }
  .term-title { font-size: 0.66rem; }

  /* zones hang off a left bus line instead of centered connectors */
  .zone { margin-block: var(--space-5); }
  .zone::before {
    left: var(--bus-x);
    top: calc(-1 * var(--space-5));
    height: var(--space-5);
  }

  .zone-frame { padding: 1.4rem 1.1rem; }
  .zone-tab { left: 0.9rem; max-width: calc(100% - 1.8rem); }
  .zone-tab .seg { display: none; }
  .airgap-note { display: none; }

  .appliance-head { padding: var(--space-2) var(--space-3); }
  .appliance-head .meta { margin-left: 0; text-align: left; width: 100%; }
  .appliance-body { padding: var(--space-3); }

  .lab-grid { grid-template-columns: 1fr; }

  .cert-table th:nth-child(2), .cert-table td:nth-child(2) { display: none; }

  .mgmt-links a { font-size: 0.95rem; }
  .mgmt-links .proto { min-width: 0; }
  .cert-verify { overflow-wrap: anywhere; }

  .title-block .sheet { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .tb-cell:nth-child(2) { border-right: 0; }
}
