/* PHP OOP: Zero to Hero — techdevs.site
   Palette: PHP plum #6f73b9 / ink #22243c / paper #fbfaf7 / amber #e8a13c / leaf #3e8e5a */
:root{
  --plum:#6f73b9; --plum-dark:#4d5190; --plum-soft:#ecedf8;
  --ink:#22243c; --ink-soft:#5a5c74;
  --paper:#fbfaf7; --card:#ffffff; --line:#e4e2da;
  --amber:#e8a13c; --amber-soft:#fdf3e1;
  --leaf:#3e8e5a; --leaf-soft:#e8f5ec;
  --red:#c0504a; --red-soft:#fbeceb;
  --code-bg:#282a3f; --code-ink:#e8e9f5;
  --radius:12px;
  --body:'Inter',system-ui,-apple-system,'Segoe UI',sans-serif;
  --display:'Sora',var(--body);
  --mono:'JetBrains Mono','Consolas',monospace;
}
*{box-sizing:border-box}
html{scroll-behavior:smooth}
body{margin:0;font-family:var(--body);color:var(--ink);background:var(--paper);
     font-size:17px;line-height:1.75}
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{animation:none!important;transition:none!important}
}

/* ---------- top bar ---------- */
.topbar{position:sticky;top:0;z-index:40;display:flex;align-items:center;gap:14px;
  background:var(--ink);color:#fff;padding:12px 20px;box-shadow:0 2px 10px rgba(20,20,40,.25)}
.brand{font-family:var(--display);font-weight:700;font-size:1.05rem;color:#fff;
  text-decoration:none;letter-spacing:.2px}
.brand-php{color:var(--amber);font-family:var(--mono);font-weight:600}
.top-chap{margin-left:auto;font-size:.8rem;color:#c9cbe0;white-space:nowrap}
.menu-btn{display:none;background:none;border:1px solid #4a4c66;color:#fff;
  font-size:1.1rem;border-radius:8px;padding:4px 10px;cursor:pointer}

/* ---------- layout ---------- */
.layout{display:flex;max-width:1280px;margin:0 auto}
.sidebar{width:290px;flex:none;padding:22px 14px 60px;border-right:1px solid var(--line);
  position:sticky;top:53px;height:calc(100vh - 53px);overflow-y:auto;background:var(--paper)}
.side-sec{font-family:var(--display);font-size:.72rem;text-transform:uppercase;
  letter-spacing:.12em;color:var(--ink-soft);margin:20px 8px 6px}
.side-link,.side-home{display:flex;align-items:baseline;gap:8px;padding:7px 10px;margin:2px 0;
  border-radius:8px;color:var(--ink);text-decoration:none;font-size:.88rem;line-height:1.4}
.side-link:hover,.side-home:hover{background:var(--plum-soft)}
.side-link.active,.side-home.active{background:var(--plum);color:#fff}
.side-num{font-family:var(--mono);font-size:.75rem;color:var(--plum-dark);flex:none;width:1.6em}
.side-link.active .side-num{color:#e6e7ff}
.tick{margin-left:auto;visibility:hidden;color:var(--leaf);font-weight:700}
.side-link.active .tick{color:#d3f5df}
.side-link.is-done .tick{visibility:visible}

.content{flex:1;min-width:0;padding:44px clamp(20px,5vw,72px) 80px;background:var(--card)}
.content>*{max-width:78ch}

/* ---------- typography ---------- */
h1{font-family:var(--display);font-weight:800;font-size:clamp(1.7rem,3.4vw,2.4rem);
   line-height:1.2;margin:.2em 0 .4em}
h2{font-family:var(--display);font-weight:700;font-size:1.4rem;margin:2.2em 0 .6em;
   padding-top:.6em;border-top:1px solid var(--line)}
h3{font-family:var(--display);font-weight:600;font-size:1.12rem;margin:1.8em 0 .5em}
p,li{color:var(--ink)}
a{color:var(--plum-dark)}
.lede{font-size:1.13rem;color:var(--ink-soft);margin-bottom:1.6em}
.eyebrow{font-family:var(--mono);font-size:.78rem;letter-spacing:.08em;color:var(--plum-dark);
  text-transform:uppercase;margin-bottom:2px}
strong{font-weight:600}
hr{border:0;border-top:1px solid var(--line);margin:2.5em 0}
table{border-collapse:collapse;width:100%;margin:1.2em 0;font-size:.92rem}
th,td{border:1px solid var(--line);padding:8px 12px;text-align:left;vertical-align:top}
th{background:var(--plum-soft);font-family:var(--display);font-weight:600;font-size:.85rem}
tr:nth-child(even) td{background:#faf9f5}
kbd{font-family:var(--mono);font-size:.85em;background:var(--plum-soft);
  border:1px solid #d5d7ee;border-bottom-width:2px;border-radius:5px;padding:1px 6px}

/* ---------- code ---------- */
code{font-family:var(--mono);font-size:.86em;background:var(--plum-soft);
  color:var(--plum-dark);padding:2px 6px;border-radius:5px}
pre{position:relative;background:var(--code-bg);color:var(--code-ink);border-radius:var(--radius);
  padding:20px 22px;overflow-x:auto;line-height:1.6;margin:1.2em 0;
  box-shadow:0 3px 14px rgba(30,30,60,.18)}
pre code{background:none;color:inherit;padding:0;font-size:.84rem;display:block}
pre .filename{position:absolute;top:0;left:0;font-family:var(--mono);font-size:.7rem;
  background:var(--plum);color:#fff;padding:3px 12px;border-radius:var(--radius) 0 10px 0}
pre.has-name{padding-top:34px}
.copy-btn{position:absolute;top:8px;right:8px;font-family:var(--body);font-size:.72rem;
  background:#3c3f5c;color:#d9dbef;border:none;border-radius:6px;padding:4px 10px;
  cursor:pointer;opacity:.85}
.copy-btn:hover{background:var(--plum)}
.copy-btn.copied{background:var(--leaf);color:#fff}

.output{background:#f4f3ee;border:1px dashed #c9c7bc;border-radius:10px;
  padding:12px 18px;font-family:var(--mono);font-size:.84rem;white-space:pre-wrap;
  margin:-.4em 0 1.4em;color:#3a3c30}
.output::before{content:"BROWSER SHOWS:";display:block;font-family:var(--body);
  font-size:.66rem;font-weight:700;letter-spacing:.1em;color:#8b8a7d;margin-bottom:6px}

/* ---------- boxes ---------- */
.analogy{display:flex;gap:16px;background:var(--amber-soft);border:1px solid #f0dcb4;
  border-radius:var(--radius);padding:18px 20px;margin:1.4em 0}
.analogy-icon{font-size:1.9rem;flex:none;line-height:1.2}
.analogy p{margin:.3em 0}
.analogy .box-tag{color:#a06818}

.note{background:var(--plum-soft);border-left:4px solid var(--plum);
  border-radius:0 var(--radius) var(--radius) 0;padding:14px 20px;margin:1.4em 0}
.warn{background:var(--red-soft);border-left:4px solid var(--red);
  border-radius:0 var(--radius) var(--radius) 0;padding:14px 20px;margin:1.4em 0}
.box-tag{display:block;font-family:var(--display);font-weight:700;font-size:.78rem;
  text-transform:uppercase;letter-spacing:.08em;margin-bottom:4px}
.note .box-tag{color:var(--plum-dark)} .warn .box-tag{color:var(--red)}

.task{background:var(--leaf-soft);border:1px solid #c4e4cf;border-radius:var(--radius);
  padding:18px 22px;margin:1.6em 0}
.task .box-tag{color:var(--leaf)}
.task details{margin-top:10px}
.task summary{cursor:pointer;font-weight:600;color:var(--leaf)}
.task summary:hover{text-decoration:underline}

.keypoints{background:var(--card);border:2px solid var(--plum);border-radius:var(--radius);
  padding:18px 26px;margin:2em 0}
.keypoints .box-tag{color:var(--plum-dark)}
.keypoints ul{margin:.4em 0;padding-left:1.2em}
.keypoints li{margin:.45em 0}

/* ---------- quiz ---------- */
.quiz{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
  padding:18px 22px;margin:1.6em 0;box-shadow:0 2px 8px rgba(30,30,60,.06)}
.quiz .box-tag{color:var(--amber)}
.quiz-q{font-weight:600;margin:.2em 0 .8em}
.quiz-opt{display:block;width:100%;text-align:left;background:var(--paper);
  border:1px solid var(--line);border-radius:8px;padding:9px 14px;margin:6px 0;
  font-family:var(--body);font-size:.92rem;cursor:pointer;color:var(--ink)}
.quiz-opt:hover{border-color:var(--plum);background:var(--plum-soft)}
.quiz-opt.right{background:var(--leaf-soft);border-color:var(--leaf);font-weight:600}
.quiz-opt.wrong{background:var(--red-soft);border-color:var(--red)}
.quiz-fb{font-size:.9rem;margin:.6em 0 0;font-weight:600;min-height:1.2em}
.quiz-fb.ok{color:var(--leaf)} .quiz-fb.no{color:var(--red)}

/* ---------- prev / next / done ---------- */
.done-wrap{margin:2.6em 0 0}
.done-btn{font-family:var(--display);font-weight:600;font-size:.95rem;background:var(--leaf);
  color:#fff;border:none;border-radius:10px;padding:12px 22px;cursor:pointer}
.done-btn.undone{background:#9aa0a8}
.done-btn:hover{filter:brightness(1.07)}
.prevnext{display:flex;justify-content:space-between;gap:16px;margin:2em 0 0;
  border-top:1px solid var(--line);padding-top:22px}
.pn{flex:1;text-decoration:none;border:1px solid var(--line);border-radius:var(--radius);
  padding:12px 18px;color:var(--ink);display:flex;flex-direction:column;gap:2px;max-width:48%}
.pn span{font-size:.75rem;color:var(--ink-soft)}
.pn strong{font-size:.92rem;color:var(--plum-dark)}
.pn:hover{border-color:var(--plum);background:var(--plum-soft)}
.pn.next{text-align:right;margin-left:auto}
.pn.empty{border:none;pointer-events:none}
.page-foot{margin-top:3em;border-top:1px solid var(--line);padding-top:18px;
  font-size:.82rem;color:var(--ink-soft)}

/* ---------- home page ---------- */
.hero{background:linear-gradient(135deg,var(--ink) 0%,#33365c 55%,var(--plum-dark) 100%);
  color:#fff;border-radius:18px;padding:44px 44px 40px;margin-bottom:2.4em;max-width:none}
.hero h1{color:#fff;margin:0 0 .3em}
.hero .lede{color:#d6d8ef;max-width:60ch}
.hero .code-line{font-family:var(--mono);color:var(--amber);font-size:.9rem;margin-bottom:14px}
.hero-badges{display:flex;flex-wrap:wrap;gap:10px;margin-top:20px}
.badge{background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.25);
  border-radius:999px;padding:5px 16px;font-size:.8rem}
.cta{display:inline-block;margin-top:24px;background:var(--amber);color:#3c2a08;
  font-family:var(--display);font-weight:700;text-decoration:none;border-radius:10px;
  padding:13px 26px}
.cta:hover{filter:brightness(1.06)}
.map{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:16px;
  margin:1.4em 0;max-width:none}
.map-card{background:var(--paper);border:1px solid var(--line);border-radius:var(--radius);
  padding:18px 20px}
.map-card h3{margin:.1em 0 .4em;font-size:1rem}
.map-card p{font-size:.88rem;color:var(--ink-soft);margin:.2em 0}
.map-card .eyebrow{margin-bottom:6px}

/* ---------- responsive ---------- */
@media (max-width:900px){
  .menu-btn{display:block}
  .sidebar{position:fixed;left:0;top:53px;bottom:0;height:auto;z-index:50;
    transform:translateX(-105%);transition:transform .25s ease;background:var(--paper);
    box-shadow:4px 0 20px rgba(0,0,0,.15);width:min(320px,85vw)}
  .sidebar.open{transform:translateX(0)}
  .overlay{display:none;position:fixed;inset:53px 0 0 0;background:rgba(20,20,40,.45);z-index:45}
  .overlay.show{display:block}
  .content{padding:30px 18px 70px}
  .hero{padding:30px 24px}
  .prevnext{flex-direction:column}
  .pn{max-width:100%}
  .top-chap{display:none}
}
:focus-visible{outline:3px solid var(--amber);outline-offset:2px}

/* ---------- inline "Try it yourself" runner ---------- */
.run-btn{position:absolute;top:8px;right:66px;font-family:var(--body);font-size:.72rem;
  background:var(--leaf);color:#fff;border:none;border-radius:6px;padding:4px 10px;cursor:pointer}
.run-btn:hover{filter:brightness(1.1)}
.runner{background:var(--card);border:1.5px solid var(--leaf);border-radius:var(--radius);
  padding:16px 18px;margin:-8px 0 26px}
.runner-hint{font-size:.85rem;color:var(--ink-soft);margin:0 0 10px}
.runner-code{width:100%;box-sizing:border-box;background:var(--code-bg);color:var(--code-ink);
  border:1px solid var(--code-bg);border-radius:8px;padding:14px 16px;
  font-family:var(--mono);font-size:.9rem;line-height:1.7;min-height:120px;resize:vertical;tab-size:4}
.runner-code:focus{outline:2px solid var(--leaf)}
.runner-bar{display:flex;align-items:center;gap:12px;margin:10px 0}
.runner-run{font-family:var(--body);font-weight:600;font-size:.88rem;background:var(--leaf);
  color:#fff;border:none;border-radius:8px;padding:9px 20px;cursor:pointer}
.runner-run:hover{filter:brightness(1.1)}
.runner-run:disabled{opacity:.6;cursor:wait}
.runner-status{font-size:.82rem;color:var(--amber);font-family:var(--mono)}
.runner-out{background:#f4f6f4;border:1.5px dashed var(--leaf);border-radius:8px;
  padding:12px 16px;font-family:var(--mono);font-size:.88rem;color:var(--ink);
  white-space:pre-wrap;overflow-wrap:break-word;margin:0;min-height:24px}
