
pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
  Theme: GitHub Dark
  Description: Dark theme as seen on github.com
  Author: github.com
  Maintainer: @Hirse
  Updated: 2021-05-15

  Outdated base version: https://github.com/primer/github-syntax-dark
  Current colors taken from GitHub's CSS
*/.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#79c0ff}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-code,.hljs-comment,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c}


:root{
  --accent:#4d9fff; --accent-dark:#79b8ff;
  --text:#d0d7de; --text-2:#9198a1; --text-3:#6e7681;
  --bg:#0d1117; --bg-soft:#161b22; --bg-code:#0d1117; --border:#30363d;
  --tip-bg:rgba(2,125,253,.12); --tip-border:#4d9fff;
  --warn-bg:rgba(240,160,32,.12); --warn-border:#e0a52e;
  --ok-bg:rgba(45,164,78,.12); --ok-border:#3fb950;
  --radius:10px;
  --font-body:-apple-system,"Segoe UI","PingFang SC","HarmonyOS Sans SC","Microsoft YaHei",sans-serif;
  --font-mono:"Cascadia Code","JetBrains Mono",Consolas,"Courier New",monospace;
}
*{box-sizing:border-box}
html{scroll-behavior:smooth;scroll-padding-top:24px;color-scheme:dark}
body{margin:0;font-family:var(--font-body);font-size:16px;line-height:1.85;color:var(--text);background:var(--bg)}
/* ---------- 侧边目录 ---------- */
#sidebar{position:fixed;top:0;left:0;bottom:0;width:272px;overflow-y:auto;padding:20px 14px 40px;background:var(--bg-soft);border-right:1px solid var(--border);font-size:13.5px}
#sidebar .logo{font-weight:800;font-size:16px;color:var(--accent-dark);margin:4px 6px 14px}
#sidebar a{display:block;color:var(--text-2);text-decoration:none;padding:4.5px 10px;border-radius:6px;line-height:1.5}
#sidebar a:hover{background:#21262d;color:var(--accent-dark)}
#sidebar a.lv2{padding-left:24px;font-size:12.8px}
#sidebar .grp{margin-top:12px;padding:4px 10px;font-weight:700;color:var(--text);font-size:12.5px;letter-spacing:.05em}
main{margin-left:272px;padding:36px 48px 120px;max-width:920px}
/* 宽屏时正文左贴目录，右侧保留约 1/5 空白，不铺满整屏 */
@media(min-width:1200px){main{max-width:none;margin-left:296px;margin-right:0;width:calc((100vw - 272px)*0.8 - 24px)}}
/* ---------- 示例代码 + Playground 左右排版 ---------- */
.duo{display:grid;grid-template-columns:minmax(0,1fr);gap:14px;align-items:start}
.duo>pre{margin:0}
@media(min-width:1480px){
  .duo{grid-template-columns:minmax(0,1.05fr) minmax(0,1fr)}
  .duo>pre code.hljs{font-size:12px;line-height:1.55}
  .duo .playground{margin-top:0}
  .duo .pg-body{grid-template-columns:1fr}
  .duo .pg-ctrl{border-right:none;border-bottom:1px solid var(--border)}
}
/* 左下角联系方式 */
.contact{position:fixed;left:14px;bottom:12px;z-index:30;font-size:12px;color:var(--text-3);background:var(--bg);border:1px solid var(--border);border-radius:8px;padding:5px 12px}
.contact a{color:var(--text-2);text-decoration:none}
.contact a:hover{color:var(--accent)}
@media(max-width:1080px){#sidebar{display:none}main{margin-left:0;padding:20px 18px 80px}}
/* ---------- 标题与正文 ---------- */
h1{font-size:30px;line-height:1.4;margin:1.2em 0 .6em}
h2.chap{font-size:25px;margin:2.4em 0 .5em;padding-bottom:.35em;border-bottom:2px solid var(--border);color:var(--accent-dark)}
h3{font-size:20px;margin:1.9em 0 .5em}
h4{font-size:17px;margin:1.5em 0 .4em;color:#e6edf3}
p{margin:.7em 0}
strong{color:#f0f6fc}
a{color:var(--accent)}
code{font-family:var(--font-mono);font-size:.88em;background:var(--bg-soft);border:1px solid var(--border);border-radius:5px;padding:.1em .38em;word-break:break-word}
pre{position:relative;margin:1em 0;border-radius:var(--radius);overflow:hidden;box-shadow:0 2px 10px rgba(0,0,0,.45);border:1px solid #21262d}
pre code.hljs{display:block;padding:16px 18px;font-family:var(--font-mono);font-size:13.5px;line-height:1.65;background:var(--bg-code)}
pre .lang-tag{position:absolute;top:0;right:44px;font-size:11px;color:#8b949e;padding:4px 8px;letter-spacing:.06em}
.copy-btn{position:absolute;top:5px;right:6px;background:#21262d;border:1px solid #30363d;color:#9aa4b2;border-radius:6px;font-size:12px;padding:2.5px 9px;cursor:pointer;transition:.15s}
.copy-btn:hover{color:#fff;border-color:#8b949e}
ul,ol{padding-left:1.6em}
li{margin:.32em 0}
table{border-collapse:collapse;width:100%;margin:1.1em 0;font-size:14.5px}
th,td{border:1px solid var(--border);padding:8px 12px;text-align:left;vertical-align:top;line-height:1.6}
th{background:var(--bg-soft);font-weight:700}
tr:nth-child(even) td{background:#10161d}
/* ---------- 提示框 ---------- */
.callout{border-left:4px solid var(--tip-border);background:var(--tip-bg);border-radius:0 var(--radius) var(--radius) 0;padding:12px 18px;margin:1.1em 0;font-size:15px}
.callout.warn{border-left-color:var(--warn-border);background:var(--warn-bg)}
.callout.ok{border-left-color:var(--ok-border);background:var(--ok-bg)}
.callout b:first-child{display:block;margin-bottom:2px}
/* ---------- 运行效果预览 ---------- */
.pv{margin:1em 0;border:1px solid var(--border);border-radius:var(--radius);overflow:hidden}
.pv-bar{display:flex;align-items:center;gap:8px;background:var(--bg-soft);border-bottom:1px solid var(--border);padding:7px 14px;font-size:13px;color:var(--text-2)}
.pv-bar .dot{width:9px;height:9px;border-radius:50%}
.pv-stage{background:#10161d;background-image:linear-gradient(45deg,#141a22 25%,transparent 25%,transparent 75%,#141a22 75%),linear-gradient(45deg,#141a22 25%,transparent 25%,transparent 75%,#141a22 75%);background-size:22px 22px;background-position:0 0,11px 11px;padding:26px 16px;display:flex;justify-content:center;align-items:center;min-height:120px}
/* 模拟手机画面 */
.pv-app{width:300px;background:#161b22;border-radius:18px;box-shadow:0 6px 24px rgba(0,0,0,.5);border:1px solid #30363d;overflow:hidden;font-size:14px}
.pv-appbar{background:linear-gradient(90deg,#02569B,#027DFD);color:#fff;padding:12px 16px;font-weight:600;font-size:15px}
.pv-body{padding:14px 16px;display:flex;flex-direction:column;gap:10px}
.pv-btn{display:inline-block;background:var(--accent);color:#0d1117;border-radius:22px;padding:8px 20px;font-size:14px;text-align:center;font-weight:600;box-shadow:0 2px 6px rgba(2,125,253,.35)}
.pv-btn.outline{background:transparent;color:var(--accent);border:1.5px solid var(--accent);box-shadow:none}
.pv-btn.tonal{background:#1c3a5e;color:var(--accent-dark);box-shadow:none}
.pv-textbtn{color:var(--accent);font-size:14px;padding:6px 10px}
.pv-input{border:1.4px solid #4b5563;border-radius:10px;padding:9px 12px;color:#6e7681;font-size:14px;background:#0d1117}
.pv-input.focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(77,159,255,.18)}
.pv-card{background:#161b22;border-radius:12px;box-shadow:0 1px 6px rgba(0,0,0,.4);border:1px solid #30363d;padding:12px 14px}
.pv-chip{display:inline-block;background:#1c3a5e;color:var(--accent-dark);border-radius:16px;padding:3px 12px;font-size:12.5px;margin:2px 3px}
.pv-row{display:flex;gap:8px;align-items:center}
.pv-col{display:flex;flex-direction:column;gap:8px}
.pv-box{background:#1c3a5e;border:1.5px dashed var(--accent);border-radius:8px;display:flex;align-items:center;justify-content:center;color:var(--accent-dark);font-size:12.5px;padding:10px}
.pv-box.red{background:rgba(224,82,82,.14);border-color:#ff8a8a;color:#ff8a8a}
.pv-box.green{background:rgba(63,185,80,.14);border-color:#3fb950;color:#56d364}
.pv-box.amber{background:rgba(224,165,46,.14);border-color:#e0a52e;color:#e3b341}
.pv-item{display:flex;align-items:center;gap:12px;padding:10px 4px;border-bottom:1px solid #21262d}
.pv-item:last-child{border-bottom:none}
.pv-avatar{width:38px;height:38px;border-radius:50%;background:linear-gradient(135deg,#7fb5ff,#027DFD);flex-shrink:0}
.pv-badge{background:#e05252;color:#fff;border-radius:10px;font-size:11px;padding:1px 7px}
.pv-nav{display:flex;border-top:1px solid #30363d;background:#0d1117}
.pv-nav .tab{flex:1;text-align:center;padding:9px 2px 7px;font-size:11px;color:#6e7681}
.pv-nav .tab.on{color:var(--accent-dark);font-weight:600}
.pv-nav .tab i{display:block;width:20px;height:20px;margin:0 auto 2px;border-radius:6px;background:currentColor;opacity:.85}
.pv-switch{width:44px;height:24px;border-radius:12px;background:#30363d;position:relative;display:inline-block}
.pv-switch.on{background:var(--accent)}
.pv-switch::after{content:"";position:absolute;width:20px;height:20px;border-radius:50%;background:#c9d1d9;top:2px;left:2px;box-shadow:0 1px 3px rgba(0,0,0,.4);transition:.15s}
.pv-switch.on::after{left:22px}
.pv-check{width:20px;height:20px;border-radius:5px;background:var(--accent);color:#0d1117;display:inline-flex;align-items:center;justify-content:center;font-size:13px;flex-shrink:0;font-weight:700}
.pv-check.off{background:transparent;border:1.6px solid #4b5563}
.pv-progress{height:6px;border-radius:3px;background:#21262d;overflow:hidden}
.pv-progress>i{display:block;height:100%;background:var(--accent);border-radius:3px}
.pv-fab{position:relative}
.pv-fab b{position:absolute;right:14px;bottom:14px;width:48px;height:48px;border-radius:16px;background:#f0c14b;color:#3d2f00;display:flex;align-items:center;justify-content:center;font-size:22px;box-shadow:0 4px 12px rgba(0,0,0,.5)}
/* ---------- 标签页（多示例） ---------- */
.tabs{margin:1em 0}
.tab-btns{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:-1px;position:relative;z-index:1}
.tab-btns button{border:1px solid var(--border);border-bottom:none;background:var(--bg-soft);color:var(--text-2);padding:7px 16px;border-radius:9px 9px 0 0;font-size:13.5px;cursor:pointer;font-family:inherit}
.tab-btns button.on{background:#161b22;color:#e6edf3;border-color:#21262d;font-weight:600}
.tab-pane{display:none}
.tab-pane.on{display:block}
/* ---------- 交互 Playground ---------- */
.playground{margin:1.2em 0;border:1.5px solid var(--accent);border-radius:14px;overflow:hidden;box-shadow:0 4px 18px rgba(2,125,253,.14)}
.pg-head{background:linear-gradient(90deg,#02569B,#027DFD);color:#fff;padding:9px 18px;font-weight:700;font-size:14.5px;display:flex;align-items:center;gap:8px}
.pg-body{display:grid;grid-template-columns:1fr 1fr;gap:0}
@media(max-width:860px){.pg-body{grid-template-columns:1fr}}
.pg-ctrl{padding:16px 20px;background:#0d1117;border-right:1px solid var(--border)}
.pg-ctrl label{display:block;font-size:13px;color:var(--text-2);margin:10px 0 3px;font-weight:600}
.pg-ctrl label:first-child{margin-top:0}
.pg-ctrl input[type=range]{width:100%;accent-color:var(--accent)}
.pg-ctrl select,.pg-ctrl input[type=color]{padding:5px 8px;border:1px solid var(--border);border-radius:7px;font-family:inherit;font-size:13.5px;background:#161b22;color:var(--text)}
.pg-out{padding:16px 20px}
.pg-out .code-src{font-family:var(--font-mono);font-size:12.5px;background:#161b22;color:#c9d1d9;border:1px solid #21262d;border-radius:9px;padding:12px 14px;white-space:pre-wrap;word-break:break-word;line-height:1.6;margin-bottom:12px}
.pg-out .pv-stage{min-height:150px}
/* ---------- 封面 ---------- */
.hero{margin:-36px -48px 0;padding:64px 48px 46px;background:linear-gradient(135deg,#020d1c 0%,#03264d 55%,#02569B 100%);color:#fff}
.hero h1{font-size:36px;margin:0 0 12px;color:#fff}
.hero .sub{font-size:17px;opacity:.92;max-width:640px}
.hero .meta{margin-top:22px;display:flex;gap:12px;flex-wrap:wrap}
.hero .meta span{background:rgba(255,255,255,.10);border:1px solid rgba(255,255,255,.24);border-radius:20px;padding:4px 16px;font-size:13.5px}
@media(max-width:1080px){.hero{margin:-20px -18px 0;padding:44px 22px 34px}}
details.src{margin:.6em 0;font-size:14px;color:var(--text-2)}
details.src summary{cursor:pointer;font-weight:600}
details.src ol{margin:.4em 0}

/* ---------- 步骤 / 关键点 ---------- */
.steps,.keys{margin:.9em 0;padding:12px 16px;border-radius:10px;font-size:14.5px}
.steps{background:rgba(2,125,253,.08);border:1px dashed #274a73}
.keys{background:rgba(45,164,78,.08);border:1px dashed #2c5e3f}
.steps>b,.keys>b{display:block;font-size:12px;letter-spacing:.08em;color:#9198a1;margin-bottom:5px}
.steps ol,.keys ul{margin:0;padding-left:1.35em}
.steps li,.keys li{margin:.25em 0}
/* ---------- 动态效果演示 ---------- */
.demo{position:relative;margin:1em 0;padding:32px 16px 20px;min-height:150px;border:1px solid var(--border);border-radius:12px;background:linear-gradient(180deg,#10161d,#0d1117);display:flex;align-items:center;justify-content:center;overflow:hidden}
.demo .cap{position:absolute;top:9px;left:14px;font-size:11.5px;color:#6e7681;letter-spacing:.04em}
.demo .cap::before{content:"\25B6  ";color:var(--accent)}
@keyframes shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}
@keyframes floaty{0%,100%{transform:translateY(0)}50%{transform:translateY(-9px)}}
.a-float{animation:floaty 3s ease-in-out infinite}
@keyframes fadeUp{0%{opacity:0;transform:translateY(8px)}100%{opacity:1;transform:translateY(0)}}
.a-fade{animation:fadeUp .8s ease both}
@keyframes flexGrow{0%,100%{flex:2}50%{flex:3}}
.a-flex>div:first-child{animation:flexGrow 4s ease-in-out infinite}
@keyframes scrollLoop{0%,10%{transform:translateY(0)}40%,60%{transform:translateY(-76px)}90%,100%{transform:translateY(0)}}
.a-scroll{animation:scrollLoop 6s ease-in-out infinite}
@keyframes refreshSwipe{0%,100%{opacity:0;transform:translateY(-6px)}50%{opacity:1;transform:translateY(0)}}
.a-refresh{animation:refreshSwipe 4s ease-in-out infinite}
@keyframes popIn{0%{opacity:0;transform:scale(.9)}60%{opacity:1;transform:scale(1.02)}100%{opacity:1;transform:scale(1)}}
.a-pop{opacity:0;animation:popIn .9s ease infinite alternate}
.a-pop.d2{animation-delay:.15s}.a-pop.d3{animation-delay:.3s}.a-pop.d4{animation-delay:.45s}
@keyframes navCycle{0%,30%{color:#4d9fff;font-weight:700}31%,100%{color:#6e7681;font-weight:400}}
.a-nav{animation:navCycle 6s infinite}
.a-nav.n2{animation-delay:2s}.a-nav.n3{animation-delay:4s}
@keyframes ripple{0%{box-shadow:0 0 0 0 rgba(46,125,107,.5)}70%{box-shadow:0 0 0 16px rgba(46,125,107,0)}100%{box-shadow:0 0 0 0 rgba(46,125,107,0)}}
.a-ripple{animation:ripple 2.4s infinite}
@keyframes dialogIn{0%,8%{opacity:0;transform:scale(.92)}22%,80%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(.96)}}
.a-dialog{animation:dialogIn 5s ease infinite}
@keyframes badgePop{0%,60%{transform:scale(1)}70%{transform:scale(1.5)}80%,100%{transform:scale(1)}}
.a-badge{display:inline-block;animation:badgePop 3s ease infinite}
@keyframes itemIn{0%,100%{opacity:.35;transform:translateX(-4px)}50%{opacity:1;transform:translateX(0)}}
.a-item{animation:itemIn 3s ease infinite}.a-item.d2{animation-delay:.2s}.a-item.d3{animation-delay:.4s}
@keyframes morph{0%,100%{border-radius:50%;transform:scale(1)}50%{border-radius:22px;transform:scale(1.12) rotate(8deg)}}
.a-morph{animation:morph 4s ease-in-out infinite}
@keyframes themeFlipCard{0%,45%{background:#161b22}55%,95%{background:#30363d}100%{background:#161b22}}
.a-theme-card{animation:themeFlipCard 6s ease infinite}
@keyframes shimmerBar{0%{background-position:200% 0}100%{background-position:-200% 0}}
.a-shimmer{background:linear-gradient(110deg,#1b2129 25%,#232b34 40%,#1b2129 60%);background-size:200% 100%;animation:shimmerBar 1.6s linear infinite}
@keyframes rowIn{0%,15%{opacity:0;transform:translateY(4px)}40%,100%{opacity:1;transform:translateY(0)}}
.a-row{animation:rowIn 4s ease infinite}.a-row.d2{animation-delay:.4s}.a-row.d3{animation-delay:.8s}
@keyframes softPulse{0%,100%{transform:scale(1);box-shadow:0 0 0 0 rgba(77,159,255,.25)}50%{transform:scale(1.06);box-shadow:0 0 0 10px rgba(77,159,255,0)}}
.a-pulse{animation:softPulse 2.6s ease-in-out infinite}
/* ---------- 手机模拟（问诊室） ---------- */
.phone{width:262px;border-radius:26px;border:6px solid #0a0f0d;background:#101614;overflow:hidden;box-shadow:0 12px 26px rgba(0,0,0,.5)}
.phone-bar{background:#161b22;padding:9px 10px;font-size:11px;text-align:center;font-weight:600;border-bottom:1px solid #21262d;color:#d0d7de}
.phone-body{padding:10px;display:flex;flex-direction:column;gap:7px;min-height:158px}
.bub{max-width:80%;padding:7px 9px;border-radius:10px;font-size:10.5px;line-height:1.55;background:#1c2321;color:#d0d7de;box-shadow:0 1px 3px rgba(0,0,0,.3);opacity:0;animation:bubIn 6s ease infinite}
.bub.me{align-self:flex-end;background:#16C2A3;color:#06241f}
.bub.sys{align-self:center;background:#161b22;color:#8b949e;font-size:9.5px;box-shadow:none}
.bub.d1{animation-delay:.2s}.bub.d2{animation-delay:1s}.bub.d3{animation-delay:2s}.bub.d4{animation-delay:3s}
@keyframes bubIn{0%{opacity:0;transform:translateY(7px)}8%,90%{opacity:1;transform:translateY(0)}100%{opacity:0}}
/* ---------- 动效演示手动控制条 ---------- */
.demo-bar{position:absolute;top:6px;right:10px;display:flex;gap:6px;z-index:3}
.demo-bar button{background:#21262d;border:1px solid #30363d;color:#9aa4b2;border-radius:6px;font-size:11.5px;padding:2.5px 10px;cursor:pointer;font-family:inherit;transition:.15s}
.demo-bar button:hover{color:#e6edf3;border-color:#8b949e}
.demo.demo-paused,.demo.demo-paused *{animation-play-state:paused !important}
@media (prefers-reduced-motion: reduce){.demo *{animation:none !important}}

/* 打印 */
@media print{#sidebar,.copy-btn,.tab-btns{display:none}main{margin:0;max-width:none}}


@keyframes sheetUp{from{transform:translateY(30%);opacity:0}to{transform:translateY(0);opacity:1}}


/* ---------- 章节导航（模块版） ---------- */
/* 章节页的页面主标题为 h1，视觉与原来的 h2.chap 完全一致 */
h1.chap{font-size:25px;margin:2.4em 0 .5em;padding-bottom:.35em;border-bottom:2px solid var(--border);color:var(--accent-dark)}
/* ---------- 全站页脚 ---------- */
.page-foot{margin:2.6em 0 1.4em;padding-top:1.1em;border-top:1px solid var(--border);font-size:13px;color:var(--text-3);display:flex;flex-wrap:wrap;gap:6px 18px;align-items:center}
.page-foot a{color:var(--text-2);text-decoration:none}
.page-foot a:hover{color:var(--accent)}
/* ---------- 广告位（AdSense）：预留高度减少布局抖动，明确标注「广告」 ---------- */
.ad-slot{margin:2.2em 0;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-soft);padding:10px 12px;min-height:110px;display:flex;flex-direction:column;justify-content:center;align-items:center;gap:8px;overflow:hidden}
.ad-label{font-size:11px;letter-spacing:.16em;color:var(--text-3);border:1px solid var(--border);border-radius:4px;padding:1px 6px}
.ad-slot ins{width:100%}
.pn-nav{display:flex;gap:14px;margin:3em 0 1em}
.pn-nav .pn{flex:1;border:1px solid var(--border);border-radius:10px;padding:12px 16px;text-decoration:none;color:var(--text-2);font-size:13px;line-height:1.5;transition:.15s}
.pn-nav .pn:hover{border-color:var(--accent);color:var(--accent-dark)}
.pn-nav .pn b{display:block;margin-top:4px;color:var(--text);font-size:14.5px}
.pn-nav .pn:last-child{text-align:right}
.toc-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px;margin:1.4em 0}
.toc-card{display:block;border:1px solid var(--border);border-radius:12px;padding:14px 16px;text-decoration:none;transition:.15s;background:var(--bg-soft)}
.toc-card:hover{border-color:var(--accent);transform:translateY(-2px)}
.toc-card .g{font-size:11.5px;color:var(--text-3);letter-spacing:.06em}
.toc-card .t{margin-top:4px;font-weight:700;color:var(--text);font-size:15px}
.toc-card .d{margin-top:4px;font-size:12.5px;color:var(--text-2)}
