:root{
  --ink-deep:#0d1b2a;
  --ink-mid:#1b2a40;
  --ink-soft:#33475d;
  --ink-faint:#5f7c9e;
  --rule:#c9d3df;
  --rule-soft:#e2e8ef;
  --steel:#2f4a6b;
  --steel-2:#3d5a7d;
  --accent:#4a8cc7;
  --bg:#f4f6f9;
  --panel:#ffffff;
  --mono:"JetBrains Mono","Consolas","SFMono-Regular","Menlo",monospace;
}
*{box-sizing:border-box;margin:0;padding:0}

body{
  font-family:"Hiragino Sans","Noto Sans JP","Yu Gothic",system-ui,-apple-system,sans-serif;
  background:var(--bg);
  color:var(--ink-mid);
  font-size:17px;
  line-height:1.85;
  min-height:100vh;
  -webkit-font-smoothing:antialiased;
}

a{color:var(--accent)}
img{max-width:100%;display:block}

/* ===== TOP BAR (shared with index) ===== */
.topbar{
  background:#0d1b2a;color:#e6edf5;padding:14px 28px;
  display:flex;align-items:center;gap:18px;
  border-bottom:3px solid #2f4a6b;
}
.topbar .brand{font-family:var(--mono);font-size:15px;letter-spacing:.08em;color:#7fb3d9;font-weight:700}
.topbar .brand b{color:#e6edf5}
.topbar nav{margin-left:auto;display:flex;gap:20px}
.topbar nav a{color:#b8c5d6;text-decoration:none;font-size:15px;font-weight:600;letter-spacing:.04em}
.topbar nav a:hover{color:#fff}

/* ===== LESSON HERO ===== */
header.hero{
  background:
    linear-gradient(90deg,rgba(13,27,42,.96) 0%,rgba(13,27,42,.82) 48%,rgba(13,27,42,.42) 100%),
    linear-gradient(180deg,rgba(19,36,61,.42) 0%,rgba(27,47,77,.78) 100%),
    url("assets/network-hero.png") center/cover no-repeat;
  color:#e6edf5;
  min-height:360px;
  padding:64px 28px 56px;
  border-bottom:1px solid #2a3f5f;
  position:relative;overflow:hidden;
  display:flex;
  align-items:center;
}
header.hero::before{
  content:"";position:absolute;inset:0;
  background-image:
    linear-gradient(rgba(127,179,217,.05) 1px,transparent 1px),
    linear-gradient(90deg,rgba(127,179,217,.05) 1px,transparent 1px);
  background-size:32px 32px;pointer-events:none;
}
header.hero .hero-inner{width:100%;max-width:1180px;margin:0 auto;position:relative;z-index:1}
header.hero .kicker{
  font-family:var(--mono);font-size:13px;letter-spacing:.2em;color:#7fb3d9;font-weight:700;
  display:inline-block;padding:5px 12px;border:1px solid rgba(127,179,217,.46);border-radius:2px;background:rgba(13,27,42,.68);
  margin-bottom:16px;
}
header.hero h1{
  font-size:34px;font-weight:800;letter-spacing:.01em;color:#fff;line-height:1.4;
  border-left:4px solid var(--accent);padding-left:18px;
  text-shadow:0 2px 18px rgba(0,0,0,.36);
}
header.hero p{color:#d0dcea;font-size:16px;margin-top:16px;letter-spacing:.02em;line-height:1.8;max-width:860px;text-shadow:0 2px 16px rgba(0,0,0,.32)}

/* ===== SECTION TABS (sticky) ===== */
.tabs-bar{
  position:sticky;top:0;z-index:20;
  background:#fff;border-bottom:1px solid var(--rule);
}
.tabs-bar-inner{
  max-width:1180px;margin:0 auto;
}
.view-toolbar{
  display:flex;justify-content:flex-end;align-items:center;gap:10px;
  padding:6px 12px 6px;
  border-bottom:1px dashed var(--rule);
}
.view-toolbar-label{
  font-family:var(--mono);font-size:11px;color:var(--ink-faint);
  letter-spacing:.12em;font-weight:700;
}
.view-toggle-group{
  display:inline-flex;background:#fff;border:1px solid var(--rule);
}
.view-toggle-btn{
  border:none;background:transparent;
  padding:5px 12px;
  font-size:12.5px;font-weight:700;
  color:var(--ink-soft);font-family:inherit;
  cursor:pointer;letter-spacing:.04em;transition:.12s;
}
.view-toggle-btn + .view-toggle-btn{border-left:1px solid var(--rule)}
.view-toggle-btn:hover{color:var(--ink-deep);background:#f4f7fb}
.view-toggle-btn.is-active,.view-toggle-btn.is-active:hover{
  background:var(--accent);color:#fff;
}
nav.tabs{
  display:flex;flex-wrap:wrap;gap:0;padding:0 8px;
}
.tab{
  flex:0 0 auto;
  background:transparent;color:var(--ink-soft);
  border:none;border-bottom:2px solid transparent;
  padding:12px 14px;
  font-size:14.5px;font-weight:700;letter-spacing:.02em;
  cursor:pointer;text-decoration:none;
  font-family:inherit;transition:.12s;
  white-space:nowrap;
}
.tab:hover{color:var(--ink-deep);background:#f4f7fb}
.tab.active{color:var(--ink-deep);border-bottom-color:var(--accent)}

@media (max-width:680px){
  .view-toolbar{padding:4px 8px}
  .view-toolbar-label{display:none}
  .view-toggle-btn{padding:5px 10px;font-size:12px}
  .tab{padding:10px 12px;font-size:13.5px}
}

.panel.is-hidden{display:none}

/* ===== Lesson TOC (in 学習目標 panel) ===== */
.lesson-toc{
  display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:10px;
  margin:14px 0 8px;
}
.toc-card{
  display:grid;grid-template-columns:48px 1fr;gap:14px;align-items:center;
  padding:14px 16px;
  background:#fff;border:1px solid var(--rule);
  text-decoration:none;color:inherit;cursor:pointer;
  transition:.12s;
}
.toc-card:hover{background:#f3f8fc;border-color:var(--accent)}
.toc-num{
  display:flex;align-items:center;justify-content:center;
  width:40px;height:40px;
  background:#2a6aa3;color:#fff;
  font-family:var(--mono);font-weight:700;font-size:15px;letter-spacing:.04em;
}
.toc-body{display:flex;flex-direction:column;gap:3px;min-width:0}
.toc-ttl{font-weight:700;font-size:15.5px;color:var(--ink-deep);line-height:1.4}
.toc-desc{font-size:12.5px;color:var(--ink-soft);line-height:1.55}

/* ===== レッスンレベル別の目次カード色(トップページの基礎/標準/発展に整合) ===== */
.lesson-l1 .toc-card{border-left:3px solid #bdd5ec}
.lesson-l1 .toc-card:hover{background:#f6fbff;border-color:#bdd5ec;border-left-color:#2a6aa3}
.lesson-l1 .toc-num{background:#2a6aa3}

.lesson-l2 .toc-card{border-left:3px solid #bfd9cd}
.lesson-l2 .toc-card:hover{background:#f7fbf9;border-color:#bfd9cd;border-left-color:#246a4f}
.lesson-l2 .toc-num{background:#246a4f}

.lesson-l3 .toc-card{border-left:3px solid #e2c5bf}
.lesson-l3 .toc-card:hover{background:#fff8f6;border-color:#e2c5bf;border-left-color:#88382e}
.lesson-l3 .toc-num{background:#88382e}

/* ===== PANEL (lesson section) ===== */
.panel{
  display:block;max-width:1180px;
  margin:24px auto;
  padding:36px 36px 32px;
  background:var(--panel);
  border:1px solid var(--rule);
  position:relative;
}
.panel + .panel{margin-top:18px}
.panel h2{
  margin:0 0 22px;font-size:24px;font-weight:800;color:var(--ink-deep);
  letter-spacing:.02em;
  padding-bottom:12px;border-bottom:2px solid var(--ink-deep);
  display:flex;align-items:baseline;gap:14px;
}
.panel h2::before{
  content:attr(data-num);font-family:var(--mono);font-size:13px;color:var(--ink-faint);
  letter-spacing:.2em;font-weight:700;
}
.panel h3{
  font-size:19px;font-weight:800;color:var(--ink-deep);
  margin:28px 0 12px;
  padding-left:14px;border-left:3px solid var(--steel);
  letter-spacing:.02em;
}
.panel h4{font-size:16.5px;font-weight:800;color:var(--ink-mid);margin:20px 0 10px;letter-spacing:.02em}
.panel p{margin:12px 0;font-size:16.5px;color:var(--ink-mid);line-height:1.85}
.panel ol,.panel ul{margin:12px 0 12px 26px;font-size:16.5px;color:var(--ink-mid);line-height:1.9}
.panel li{margin:6px 0}

/* ===== Boxes ===== */
.desc{
  background:#f8fafc;border:1px solid var(--rule-soft);
  color:var(--ink-mid);padding:18px 22px;
  margin:10px 0 20px;line-height:1.9;font-size:16px;
  border-left:3px solid var(--steel);
}
.desc b{color:var(--ink-deep)}
.desc code,.icode{
  background:#eef3f8;padding:2px 8px;border-radius:2px;font-size:14.5px;
  font-family:var(--mono);color:var(--steel);
}

.tip,.warn,.keypoint{
  margin:16px 0;padding:16px 20px;font-size:15.5px;line-height:1.9;
  border-left:3px solid;background:#fafaf7;
}
.tip{border-left-color:var(--accent);background:#fafaf7}
.tip::before{
  content:"NOTE";display:inline-block;font-family:var(--mono);font-size:12px;
  letter-spacing:.2em;color:var(--accent);font-weight:800;margin-right:12px;
}
.warn{border-left-color:#c08a2a;background:#fbf6ec}
.warn::before{
  content:"NOTICE";display:inline-block;font-family:var(--mono);font-size:12px;
  letter-spacing:.2em;color:#a4731c;font-weight:800;margin-right:12px;
}
.keypoint{border-left-color:var(--ink-deep);background:#eef0f3}
.keypoint strong{color:var(--ink-deep);display:block;font-family:var(--mono);font-size:13px;
  letter-spacing:.2em;margin-bottom:10px;font-weight:800;}

/* ===== Compare ===== */
.compare{display:grid;grid-template-columns:1fr 1fr;gap:0;margin:16px 0;border:1px solid var(--rule)}
.compare > div{padding:20px 22px;font-size:15.5px;line-height:1.9;background:#fff}
.compare > div + div{border-left:1px solid var(--rule)}
.pros{border-top:3px solid #4a8cc7}
.cons{border-top:3px solid #c0653a}
.alt{border-top:3px solid #4a9b6a}
.pros h4,.cons h4,.alt h4{margin:0 0 10px;font-size:15.5px;font-family:var(--mono);letter-spacing:.08em;font-weight:800}
.pros h4{color:#2f5d8a}
.cons h4{color:#9a4d2a}
.alt h4{color:#2c6b46}
.compare.three{grid-template-columns:repeat(3,1fr)}
@media (max-width:760px){.compare.three{grid-template-columns:1fr}}

/* ===== Term inline ===== */
.term{
  background:transparent;padding:1px 6px;border-radius:2px;
  color:var(--steel);font-weight:700;font-size:15.5px;
  border-bottom:2px solid var(--accent);
}
.obsolete-note{
  display:inline;
  padding:2px 8px;
  color:#8a3a1d;
  background:#fff1e6;
  border:1px solid #e6b28f;
  font-weight:800;
}

/* 章末「情報Iで覚えること」 */
.info1-note{
  margin:22px 0 4px;
  padding:14px 18px;
  color:#1f3552;
  background:#f3faf5;
  border:1px solid #c4dfca;
  border-left:5px solid #4a9b6a;
  border-radius:0 6px 6px 0;
  font-size:14.5px;
  line-height:1.85;
}
.info1-note b{color:#2c6b46}
.info1-note .info1-label{
  display:inline-block;
  margin-right:10px;
  padding:2px 10px;
  background:#4a9b6a;
  color:#fff;
  font-size:12.5px;
  font-weight:800;
  border-radius:11px;
  letter-spacing:.04em;
}

/* 詳細技術であることを明示するバッジ(見出し横) */
.adv-badge, .trivia-badge{
  display:inline-block;
  margin-left:10px;
  padding:2px 10px;
  font-size:12px;
  font-weight:800;
  border-radius:11px;
  letter-spacing:.04em;
  vertical-align:middle;
}
.adv-badge{background:#fef0e6;color:#9a4d1c;border:1px solid #e6b28f}
.trivia-badge{background:#e8eef9;color:#2a4a78;border:1px solid #b6c5e2}

/* ===== SVG ===== */
svg{display:block;margin:16px auto;max-width:100%;height:auto}
svg text{letter-spacing:.01em}
svg .link-main{stroke:#516076;stroke-width:2.4;stroke-linecap:round}
svg .link-sub{stroke:#9aa5b5;stroke-width:1.8;stroke-dasharray:5 4;stroke-linecap:round}
.panel > svg{
  width:100%;
  margin:20px auto 0;
  padding:18px;
  background:#fff;
  border:1px solid var(--rule);
  border-top:3px solid var(--steel);
}
.diagram-caption{
  margin:0 0 18px;
  padding:11px 14px;
  color:var(--ink-soft);
  background:#fff;
  border:1px solid var(--rule);
  border-top:1px dashed var(--rule);
  font-size:14.5px;
  line-height:1.75;
}
.textbook-note{
  margin:-10px 0 22px;
  padding:14px 18px;
  color:#1f3552;
  background:#f5f1fb;
  border:1px solid #d9cfee;
  border-left:4px solid #8e6fbf;
  border-radius:0 6px 6px 0;
  font-size:14.5px;
  line-height:1.85;
}
.textbook-note b{
  color:#5e4290;
}

/* ===== Generated Visuals ===== */
.visual-figure{
  margin:20px 0 22px;
  border:1px solid var(--rule);
  border-top:3px solid var(--accent);
  background:#fff;
}
.visual-figure img{
  width:100%;
  aspect-ratio:16/7;
  object-fit:cover;
  object-position:center;
}
.visual-figure figcaption{
  padding:13px 16px;
  font-size:14.5px;
  line-height:1.7;
  color:var(--ink-soft);
  background:#f8fafc;
  border-top:1px solid var(--rule);
}
.root-map-figure{
  margin:20px auto 0;
  padding:16px;
  background:#f8fbff;
  border:1px solid var(--rule);
  border-top:3px solid var(--steel);
}
.root-map-figure img{
  display:block;
  width:100%;
  height:auto;
  background:#eef7ff;
  border:1px solid #cfe1f2;
  border-radius:14px;
  box-shadow:0 10px 22px rgba(31,53,82,.10);
}
.packet-source-diagram{
  margin:20px auto 0;
  padding:16px;
  background:#f8fbff;
  border:1px solid var(--rule);
  border-top:3px solid var(--steel);
}
.packet-source-diagram img{
  display:block;
  width:100%;
  height:auto;
  background:#fff;
  border:1px solid #d5e2ef;
  border-radius:10px;
  box-shadow:0 8px 18px rgba(31,53,82,.08);
}
.packet-source-sequence{
  overflow:hidden;
}
.packet-source-step{
  position:relative;
}
.packet-source-sequence.is-running .packet-source-step{
  opacity:0;
  transform:translateY(12px);
  animation:packetStepIn .58s ease-out forwards;
  animation-delay:var(--step-delay,0s);
}
.packet-step-badge,
.packet-step-label{
  position:absolute;
  z-index:1;
  pointer-events:none;
}
.packet-step-badge{
  top:10px;
  left:10px;
  display:inline-flex;
  align-items:center;
  justify-content:center;
  width:30px;
  height:30px;
  border-radius:50%;
  background:#1f7bd2;
  color:#fff;
  border:3px solid #fff;
  box-shadow:0 4px 10px rgba(31,83,130,.22);
  font-size:15px;
  font-weight:900;
  line-height:1;
}
.packet-step-label{
  right:10px;
  bottom:10px;
  padding:4px 9px;
  border-radius:999px;
  background:rgba(255,255,255,.92);
  border:1px solid #c9d8e8;
  color:var(--ink-mid);
  font-size:12px;
  font-weight:800;
  box-shadow:0 4px 10px rgba(31,53,82,.08);
}
.packet-source-flow{
  display:grid;
  grid-template-columns:minmax(0,1.08fr) minmax(0,.62fr) minmax(0,1.22fr);
  align-items:center;
  gap:10px;
}
.packet-source-subgrid{
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:14px;
  margin-top:14px;
}
@keyframes packetStepIn{
  from{opacity:0;transform:translateY(12px)}
  to{opacity:1;transform:translateY(0)}
}
@media (prefers-reduced-motion:reduce){
  .packet-source-sequence.is-running .packet-source-step{
    opacity:1;
    transform:none;
    animation:none;
  }
}
@media (max-width:760px){
  .packet-source-diagram{padding:10px}
  .packet-source-flow{grid-template-columns:1fr;gap:8px}
  .packet-source-subgrid{grid-template-columns:1fr;gap:10px;margin-top:10px}
  .packet-step-badge{width:28px;height:28px;font-size:14px}
  .packet-step-label{font-size:11px}
}
.concept-figure{
  margin:18px 0 22px;
  border:1px solid var(--rule);
  border-top:3px solid var(--steel);
  background:#fff;
}
.concept-figure img{
  display:block;
  width:100%;
  height:auto;
}
.concept-figure figcaption{
  padding:11px 14px;
  color:var(--ink-soft);
  background:#fff;
  border-top:1px dashed var(--rule);
  font-size:14.5px;
  line-height:1.75;
}
.nic-compare-figure{
  max-width:760px;
  margin:18px auto 22px;
  border-radius:10px;
  overflow:hidden;
}
.nic-photo-grid{
  display:grid;
  grid-template-columns:repeat(2,minmax(0,1fr));
  gap:12px;
  padding:14px;
  background:#f8fbff;
}
.nic-photo-card{
  border:1px solid #d6e4f2;
  border-radius:10px;
  background:#fff;
  overflow:hidden;
}
.nic-photo-card img{
  display:block;
  width:100%;
  aspect-ratio:4/3;
  object-fit:contain;
  background:#fff;
}
.nic-photo-card b{
  display:block;
  padding:9px 10px 2px;
  color:#1f3552;
  font-size:14px;
  line-height:1.35;
}
.nic-photo-card span{
  display:block;
  padding:0 10px 10px;
  color:#5f7c9e;
  font-size:12.5px;
  line-height:1.45;
}
@media (max-width:640px){
  .nic-photo-grid{
    grid-template-columns:1fr;
  }
}
.note-concept-figure{
  width:min(92%, 600px);
  margin:12px auto 14px;
  border:1px solid #d9cfee;
  background:#fff;
}
.note-concept-figure-main{
  width:min(92%, 620px);
}
.note-concept-figure img{
  display:block;
  width:100%;
  height:auto;
}
.note-concept-figure figcaption{
  padding:8px 11px;
  color:#5e4290;
  background:#fbf9ff;
  border-top:1px dashed #d9cfee;
  font-size:13px;
  line-height:1.6;
  text-align:center;
}

/* ===== Overlay-figure: 背景PNG + 日本語テキストを絶対配置で重ねる図 ===== */
.overlay-figure{
  margin:18px 0 22px;
  border:1px solid var(--rule);
  border-top:3px solid var(--steel);
  background:#fff;
}
.overlay-figure-stage{
  position:relative;
  width:100%;
}
.overlay-figure-stage img{
  display:block;
  width:100%;
  height:auto;
}
.overlay-figure-stage .ovl{
  position:absolute;
  transform:translate(-50%,-50%);
  pointer-events:none;
  text-align:center;
  line-height:1.35;
  color:#1f3552;
  font-family:-apple-system,BlinkMacSystemFont,"Hiragino Kaku Gothic ProN","Noto Sans JP",sans-serif;
  white-space:nowrap;
}
.overlay-figure-stage .ovl-title{
  font-weight:800;
  font-size:clamp(15px,1.95vw,24px);
}
.overlay-figure-stage .ovl-bottom-note{
  font-size:clamp(11.5px,1.18vw,16px);
  color:#1f3552;
  font-weight:600;
}
.overlay-figure-stage .ovl-arrow{
  font-size:clamp(11px,1.05vw,14px);
  font-weight:800;
  padding:1px 8px;
  background:rgba(255,255,255,.92);
  border-radius:999px;
  box-shadow:0 1px 2px rgba(31,53,82,.12);
}
.overlay-figure-stage .ovl-mono{
  font-family:ui-monospace,"SFMono-Regular",Menlo,Consolas,monospace;
  font-weight:700;
  font-size:clamp(11px,1.05vw,14px);
}
.overlay-figure-stage .ovl-mono-big{
  font-family:ui-monospace,"SFMono-Regular",Menlo,Consolas,monospace;
  font-weight:800;
  font-size:clamp(18px,2.6vw,32px);
}
.overlay-figure-stage .ovl-bin{
  font-family:ui-monospace,"SFMono-Regular",Menlo,Consolas,monospace;
  font-size:clamp(13px,1.45vw,19px);
  letter-spacing:.04em;
}
.overlay-figure-stage .ovl-dot{
  font-size:clamp(20px,2.6vw,32px);
  font-weight:800;
}
.overlay-figure-stage .ovl-label{
  font-size:clamp(11px,1.1vw,14.5px);
  font-weight:700;
}
.overlay-figure-stage .ovl-sub{
  font-size:clamp(10px,.95vw,12.5px);
  color:#5f7c9e;
  font-weight:500;
}
.overlay-figure-stage .ovl-tag{
  display:inline-block;
  padding:2px 8px;
  border-radius:999px;
  font-size:clamp(10px,1.0vw,13px);
  font-weight:700;
  background:#fff;
  border:1.5px solid currentColor;
  white-space:nowrap;
}
.overlay-figure-stage .ovl-step{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  width:clamp(20px,2.0vw,28px);
  height:clamp(20px,2.0vw,28px);
  border-radius:50%;
  background:currentColor;
  color:#fff !important;
  font-weight:800;
  font-size:clamp(11px,1.15vw,15px);
  box-shadow:0 1px 3px rgba(0,0,0,.18);
}
.overlay-figure-stage .ovl-step span{color:#fff}
.overlay-figure-stage .ovl-multiline{
  white-space:normal;
}
.overlay-figure figcaption{
  padding:11px 14px;
  color:var(--ink-soft);
  background:#fff;
  border-top:1px dashed var(--rule);
  font-size:14.5px;
  line-height:1.75;
}
.note-bucket-compare{
  display:grid;
  grid-template-columns:1fr 1.12fr;
  gap:10px;
  align-items:end;
  width:min(96%, 760px);
  margin:10px auto 14px;
}
.note-bucket-compare figure{
  margin:0;
  padding:10px;
  background:#fff;
  border:1px solid #d9cfee;
}
.note-bucket-compare img{
  display:block;
  width:100%;
  height:auto;
}
.note-bucket-compare figcaption{
  margin-top:6px;
  color:#5e4290;
  font-size:13px;
  line-height:1.6;
  text-align:center;
}
@media (max-width:520px){
  .note-concept-figure-main{
    width:100%;
  }
  .note-bucket-compare{
    grid-template-columns:1fr;
  }
}

/* ===== Device Summary ===== */
.device-role-grid{
  display:grid;
  grid-template-columns:repeat(4,1fr);
  gap:1px;
  margin:18px 0 24px;
  background:var(--rule);
  border:1px solid var(--rule);
}
.device-role-grid > div{
  min-height:172px;
  padding:18px 16px 20px;
  background:#fff;
  border-top:3px solid var(--steel);
}
.role-icon{
  width:76px;
  height:76px;
  margin:0 0 12px;
}
.role-icon.wide{
  width:96px;
  height:58px;
  margin-top:9px;
  margin-bottom:21px;
}
.device-role-grid b{
  display:block;
  color:var(--ink-deep);
  font-size:16px;
  line-height:1.5;
  margin-bottom:8px;
}
.device-role-grid span{
  display:block;
  color:var(--ink-soft);
  font-size:14.5px;
  line-height:1.7;
}
.icon-legend{
  display:grid;
  grid-template-columns:repeat(3,1fr);
  gap:1px;
  margin:18px 0 0;
  background:var(--rule);
  border:1px solid var(--rule);
}
.icon-legend > div{
  background:#fff;
  min-height:108px;
  padding:16px;
  display:flex;
  align-items:center;
  gap:14px;
}
.icon-legend svg{
  width:62px;
  height:62px;
  flex:0 0 auto;
  margin:0;
}
.icon-legend span{
  color:var(--ink-deep);
  font-weight:800;
  font-size:15px;
}

/* ===== Throughput Visual ===== */
.throughput-visual{
  margin:18px 0 22px;
  padding:18px;
  background:#fff;
  border:1px solid var(--rule);
  border-top:3px solid var(--accent);
}
.throughput-row{
  display:grid;
  grid-template-columns:72px 1fr minmax(210px,.58fr);
  gap:14px;
  align-items:center;
  padding:10px 0;
}
.throughput-row + .throughput-row{border-top:1px solid var(--rule-soft)}
.throughput-label{
  font-family:var(--mono);
  color:var(--ink-deep);
  font-size:13px;
  font-weight:800;
  letter-spacing:.14em;
}
.throughput-note{color:var(--ink-soft);font-size:14.5px;line-height:1.6}
.throughput-lane{
  position:relative;
  height:34px;
  border:1px solid #bfd0e1;
  background:linear-gradient(90deg,#eef5fb,#f8fbff);
  overflow:hidden;
}
.throughput-lane::before{
  content:"";
  position:absolute;
  left:0;right:0;top:50%;
  height:2px;
  background:#8fb4d7;
  transform:translateY(-50%);
}
.throughput-lane i{
  position:relative;
  z-index:1;
  display:inline-block;
  width:14px;height:14px;
  margin:9px 8px;
  background:#4a8cc7;
  box-shadow:0 0 0 2px rgba(74,140,199,.12);
  transform:rotate(45deg);
}
.throughput-lane.medium i{background:#3d9f8f}
.throughput-lane.fast i{background:#c08a2a}
.throughput-lane.fast i{margin-right:4px}

/* ===== Tables ===== */
.panel table{width:100%;border-collapse:collapse;margin:16px 0;font-size:15.5px}
.panel th,.panel td{padding:12px 16px;border:1px solid var(--rule);text-align:left;line-height:1.7}
.panel th{background:var(--ink-deep);color:#e6edf5;font-weight:700;letter-spacing:.04em;font-size:14.5px}
.panel tbody tr:nth-child(even){background:#f8fafc}

/* ===== Quiz ===== */
.quiz-card{
  background:#fff;border:1px solid var(--rule);padding:26px 28px;margin:20px 0;
  border-top:3px solid var(--steel);
}
.quiz-card h3{
  font-size:17.5px;font-weight:800;color:var(--ink-deep);margin:0 0 8px;
  padding:0;border:none;letter-spacing:.02em;
}
.quiz-card h3::before{
  content:"Q";display:inline-block;background:var(--ink-deep);color:#fff;
  font-family:var(--mono);font-size:13px;font-weight:800;
  padding:4px 10px;margin-right:12px;border-radius:2px;letter-spacing:.04em;
}
.quiz-q{font-size:15.5px;color:var(--ink-soft);margin:10px 0 16px}
.quiz-option{
  display:block;padding:14px 18px;margin:8px 0;
  border:1px solid var(--rule);background:#fff;
  cursor:pointer;font-size:16px;color:var(--ink-mid);
  transition:all .15s;line-height:1.7;
}
.quiz-option:hover{border-color:var(--accent);background:#f0f6fb}
.quiz-option.correct{
  border-color:#3d7a4f;background:#eef6ef;color:#1f4a2c;font-weight:700;
  border-left:3px solid #3d7a4f;
}
.quiz-option.wrong{
  border-color:#9a4d2a;background:#fbeee6;color:#7a3a1c;
  border-left:3px solid #9a4d2a;
}
.quiz-option.disabled{pointer-events:none;opacity:.7}
.quiz-explain{
  display:none;margin-top:16px;padding:18px 22px;
  background:#f8fafc;border-left:3px solid var(--steel);
  font-size:15.5px;line-height:1.9;color:var(--ink-mid);
}
.quiz-explain.show{display:block}
.quiz-explain b{color:var(--ink-deep)}

/* ===== Buttons ===== */
button.btn{
  background:#fff;color:var(--ink-deep);border:1px solid var(--rule);
  padding:12px 22px;font-weight:700;cursor:pointer;font-size:15px;
  font-family:var(--mono);letter-spacing:.06em;transition:.12s;
}
button.btn:hover{background:var(--ink-deep);color:#fff;border-color:var(--ink-deep)}

/* ===== Lesson nav (前/次) ===== */
.lesson-nav{
  max-width:1180px;margin:24px auto;padding:0 28px;
  display:grid;grid-template-columns:1fr 1fr;gap:16px;
}
.lesson-nav a{
  display:block;background:#fff;border:1px solid var(--rule);
  padding:20px 24px;text-decoration:none;color:var(--ink-mid);
  transition:.12s;
}
.lesson-nav a:hover{border-color:var(--accent);background:#f0f6fb}
.lesson-nav a.is-disabled{opacity:.55;pointer-events:none}
.lesson-nav .lab{
  font-family:var(--mono);font-size:13px;color:var(--ink-faint);
  font-weight:700;letter-spacing:.16em;
}
.lesson-nav .ttl{font-size:16.5px;font-weight:800;color:var(--ink-deep);margin-top:8px;letter-spacing:.02em}
.lesson-nav .right{text-align:right}

/* ===== Footer ===== */
.page-footer{
  background:#0d1b2a;color:#7c8da4;
  padding:32px;
  margin-top:48px;
  border-top:1px solid #1f3552;
  font-family:var(--mono);font-size:13.5px;letter-spacing:.04em;
}
.page-footer-inner{max-width:1180px;margin:0 auto;display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap;align-items:center}
.page-footer nav{display:flex;gap:22px}
.page-footer a{color:#7c8da4;text-decoration:none}
.page-footer a:hover{color:#cdd9e9}

/* ===== Interactive Widgets (lesson.js) ===== */

/* 本文中タブ切替 */
.tab-group{
  margin:18px 0 22px;
  border:1px solid var(--rule);
  background:#fff;
}
.tab-group .tab-bar{
  display:flex;flex-wrap:wrap;gap:0;
  background:#f4f7fb;border-bottom:1px solid var(--rule);
}
.tab-group .tab-btn{
  background:transparent;border:none;
  padding:12px 22px;
  font-family:inherit;font-size:14.5px;font-weight:700;
  color:var(--ink-soft);letter-spacing:.04em;cursor:pointer;
  border-bottom:3px solid transparent;
  transition:.12s;
}
.tab-group .tab-btn:hover{background:#eaf1f8;color:var(--ink-deep)}
.tab-group .tab-btn.active{
  background:#fff;color:var(--ink-deep);
  border-bottom-color:var(--accent);
}
.tab-group .tab-pane{display:none;padding:20px 22px}
.tab-group .tab-pane.active{display:block}

/* details / summary */
.panel details{
  margin:16px 0;
  border:1px solid var(--rule);
  background:#fff;
}
.panel details summary{
  cursor:pointer;
  padding:14px 18px;
  font-weight:800;color:var(--ink-deep);
  background:#f4f7fb;
  list-style:none;
  font-size:15.5px;letter-spacing:.02em;
  border-left:3px solid var(--accent);
}
.panel details summary::-webkit-details-marker{display:none}
.panel details summary::before{
  content:"+";display:inline-block;
  font-family:var(--mono);font-weight:800;
  margin-right:12px;color:var(--accent);
}
.panel details[open] summary::before{content:"−"}
.panel details > *:not(summary){padding:14px 22px;font-size:15.5px;line-height:1.85}

/* クリックで解答表示 */
.reveal{
  margin:16px 0;
  border:1px solid var(--rule);
  background:#fff;
  padding:18px 22px;
  border-left:3px solid #c08a2a;
}
.reveal-question{
  font-size:15.5px;color:var(--ink-deep);font-weight:700;margin-bottom:12px;
}
.reveal-btn{
  background:#fff;color:var(--ink-deep);
  border:1px solid var(--rule);
  padding:10px 18px;
  font-family:var(--mono);font-size:13.5px;font-weight:700;
  letter-spacing:.06em;cursor:pointer;
  transition:.12s;
}
.reveal-btn:hover{background:var(--ink-deep);color:#fff;border-color:var(--ink-deep)}
.reveal-btn.opened{background:#eef6ef;border-color:#3d7a4f;color:#1f4a2c}
.reveal-body{
  margin-top:14px;padding:14px 18px;
  background:#f8fafc;border-left:3px solid var(--steel);
  font-size:15.5px;line-height:1.85;
}

/* ステップ実行 */
.walkthrough{
  margin:18px 0 22px;
  border:1px solid var(--rule);
  background:#fff;
  border-top:3px solid var(--steel-2);
}
.walkthrough .wt-stage{padding:18px 20px 8px}
.walkthrough .wt-controls{
  display:flex;align-items:center;gap:12px;
  padding:12px 20px;
  background:#f4f7fb;border-top:1px solid var(--rule);
}
.walkthrough .wt-controls button{
  background:#fff;color:var(--ink-deep);
  border:1px solid var(--rule);
  padding:8px 18px;
  font-family:var(--mono);font-weight:700;font-size:13.5px;
  letter-spacing:.06em;cursor:pointer;transition:.12s;
}
.walkthrough .wt-controls button:hover:not(:disabled){
  background:var(--ink-deep);color:#fff;border-color:var(--ink-deep);
}
.walkthrough .wt-controls button:disabled{opacity:.4;cursor:not-allowed}
.walkthrough .wt-indicator{
  margin-left:auto;
  font-family:var(--mono);font-size:13px;font-weight:700;
  color:var(--ink-faint);letter-spacing:.1em;
}
.walkthrough .wt-notes{
  padding:14px 22px;background:#f8fafc;
  border-top:1px solid var(--rule);
  min-height:64px;
}
.walkthrough .wt-note{display:none;font-size:15px;line-height:1.8;color:var(--ink-mid)}
.walkthrough .wt-note.active{display:block}
.walkthrough .wt-note b{color:var(--ink-deep)}

/* SVG 内のステップ可視化 (汎用) */
.walkthrough svg .step-item{opacity:0;transition:opacity .25s}
.walkthrough:not([data-step]) svg .s0,
.walkthrough[data-step="0"] svg .s0,
.walkthrough[data-step="1"] svg .s0,
.walkthrough[data-step="1"] svg .s1,
.walkthrough[data-step="2"] svg .s0,
.walkthrough[data-step="2"] svg .s1,
.walkthrough[data-step="2"] svg .s2,
.walkthrough[data-step="3"] svg .s0,
.walkthrough[data-step="3"] svg .s1,
.walkthrough[data-step="3"] svg .s2,
.walkthrough[data-step="3"] svg .s3,
.walkthrough[data-step="4"] svg .s0,
.walkthrough[data-step="4"] svg .s1,
.walkthrough[data-step="4"] svg .s2,
.walkthrough[data-step="4"] svg .s3,
.walkthrough[data-step="4"] svg .s4,
.walkthrough[data-step="5"] svg .s0,
.walkthrough[data-step="5"] svg .s1,
.walkthrough[data-step="5"] svg .s2,
.walkthrough[data-step="5"] svg .s3,
.walkthrough[data-step="5"] svg .s4,
.walkthrough[data-step="5"] svg .s5,
.walkthrough[data-step="6"] svg .s0,
.walkthrough[data-step="6"] svg .s1,
.walkthrough[data-step="6"] svg .s2,
.walkthrough[data-step="6"] svg .s3,
.walkthrough[data-step="6"] svg .s4,
.walkthrough[data-step="6"] svg .s5,
.walkthrough[data-step="6"] svg .s6,
.walkthrough[data-step="7"] svg .s0,
.walkthrough[data-step="7"] svg .s1,
.walkthrough[data-step="7"] svg .s2,
.walkthrough[data-step="7"] svg .s3,
.walkthrough[data-step="7"] svg .s4,
.walkthrough[data-step="7"] svg .s5,
.walkthrough[data-step="7"] svg .s6,
.walkthrough[data-step="7"] svg .s7{opacity:1}

/* 1ステップずつ見せる図。重なりやすいシナリオ図では未来の要素を完全に隠す。 */
.walkthrough.one-step svg .step-item{opacity:0}
.walkthrough.one-step:not([data-step]) svg .s0,
.walkthrough.one-step[data-step="0"] svg .s0,
.walkthrough.one-step[data-step="1"] svg .s1,
.walkthrough.one-step[data-step="2"] svg .s2,
.walkthrough.one-step[data-step="3"] svg .s3,
.walkthrough.one-step[data-step="4"] svg .s4,
.walkthrough.one-step[data-step="5"] svg .s5,
.walkthrough.one-step[data-step="6"] svg .s6,
.walkthrough.one-step[data-step="7"] svg .s7{opacity:1}

/* アニメ制御 */
.anim-ctrl{
  display:inline-flex;gap:8px;
  margin:10px 0 18px;
}
.anim-ctrl button{
  background:#fff;color:var(--ink-deep);
  border:1px solid var(--rule);
  padding:7px 14px;
  font-family:var(--mono);font-weight:700;font-size:13px;
  letter-spacing:.06em;cursor:pointer;transition:.12s;
}
.anim-ctrl button:hover{background:var(--ink-deep);color:#fff;border-color:var(--ink-deep)}

/* インライン小問 */
.inline-quiz{
  margin:18px 0;
  padding:16px 20px;
  background:#fbf6ec;
  border:1px solid #e6c98e;
  border-left:3px solid #c08a2a;
}
.inline-quiz .iq-q{
  font-weight:800;color:var(--ink-deep);
  font-size:15.5px;margin-bottom:12px;
}
.inline-quiz .iq-options{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:8px}
.inline-quiz .iq-option{
  background:#fff;color:var(--ink-mid);
  border:1px solid var(--rule);
  padding:10px 16px;
  font-size:15px;cursor:pointer;
  transition:.12s;text-align:left;flex:1 1 240px;
}
.inline-quiz .iq-option:hover{border-color:var(--accent);background:#f0f6fb}
.inline-quiz .iq-option.correct{
  border-color:#3d7a4f;background:#eef6ef;color:#1f4a2c;font-weight:700;
  border-left:3px solid #3d7a4f;
}
.inline-quiz .iq-option.wrong{
  border-color:#9a4d2a;background:#fbeee6;color:#7a3a1c;
  border-left:3px solid #9a4d2a;
}
.inline-quiz .iq-option.disabled{pointer-events:none;opacity:.85}
.inline-quiz .iq-feedback{
  display:none;margin-top:12px;padding:12px 16px;
  background:#fff;border-left:3px solid var(--steel);
  font-size:14.5px;line-height:1.8;
}
.inline-quiz .iq-feedback.show{display:block}

/* レイヤースタック図 共通スタイル */
.layer-stack rect.layer{stroke:#1f3552;stroke-width:1.5}
.layer-stack text.layer-name{font-weight:800;fill:#1f3552}
.layer-stack text.layer-role{fill:#5f7c9e;font-size:12px}

@media (max-width:700px){
  body{font-size:16px}
  .compare{grid-template-columns:1fr}
  .compare > div + div{border-left:none;border-top:1px solid var(--rule)}
  .panel{padding:24px}
  .panel p,.panel ol,.panel ul{font-size:15.5px}
  header.hero{min-height:340px;padding:40px 22px 36px;background-position:58% center}
  header.hero h1{font-size:24px}
  header.hero p{font-size:14.5px}
  .panel > svg{padding:10px}
  .device-role-grid{grid-template-columns:1fr 1fr}
  .icon-legend{grid-template-columns:1fr}
  .throughput-row{grid-template-columns:1fr;gap:8px}
  .visual-figure img{aspect-ratio:4/3}
  .lesson-nav{grid-template-columns:1fr}
}

@media (max-width:460px){
  .device-role-grid{grid-template-columns:1fr}
}
