/* RTScale 产品手册 —— 样式与 InScope gRPC API 文档保持统一
   基底取自 docs/grpc-api/style.css，并补充手册所需的图片 / 翻页 / 移动端规则 */
:root{
  --bg:#f4f6f9; --panel:#ffffff; --ink:#1f2933; --muted:#6b7785;
  --line:#e3e8ee; --accent:#2563c9; --accent-weak:#eaf1fb;
  --side:#1f2733; --side-ink:#c7d0db; --side-active:#2f7ff0;
  --proto:#eef3fb; --proto-line:#cfe0f5; --code-bg:#1e2530; --code-ink:#e6edf6;
  --ret:#7a3fb0; --fn:#1f2933; --enum:#b8742a; --msg:#2e8b57;
}
*{box-sizing:border-box;}
html{scroll-behavior:smooth;}
body{margin:0;background:var(--bg);color:var(--ink);
  font:14px/1.65 "Segoe UI","Microsoft YaHei",system-ui,sans-serif;}
code{font-family:"Cascadia Code",Consolas,monospace;font-size:.88em;
  background:#eef1f5;border:1px solid var(--line);border-radius:4px;padding:.5px 5px;}
a{color:var(--accent);text-decoration:none;}
a:hover{text-decoration:underline;}

/* sidebar */
nav.side{position:fixed;top:0;left:0;width:264px;height:100vh;overflow-y:auto;
  background:var(--side);color:var(--side-ink);padding:18px 12px 40px;z-index:40;}
nav.side .brand{font-size:19px;font-weight:700;color:#fff;display:flex;align-items:center;gap:8px;text-decoration:none;}
nav.side .brand:hover{text-decoration:none;}
nav.side .logo{color:var(--side-active);}
nav.side .brand-sub{font-size:12px;color:#8a97a6;margin:2px 0 16px 2px;}
nav.side .nav-group{font-size:11px;text-transform:uppercase;letter-spacing:.09em;
  color:#788596;margin:16px 8px 5px;}
nav.side a.navlink{display:flex;align-items:baseline;gap:8px;color:var(--side-ink);
  padding:7px 10px;border-radius:7px;font-size:13.5px;}
nav.side a.navlink:hover{background:#2a3340;color:#fff;text-decoration:none;}
nav.side a.navlink.active{background:var(--side-active);color:#fff;font-weight:600;}
nav.side a.navlink .n{font-family:"Cascadia Code",Consolas,monospace;font-size:12px;opacity:.7;}
nav.side a.navlink.active .n{opacity:.9;}

/* content */
.content{margin-left:264px;}
.topbar{position:sticky;top:0;z-index:5;background:rgba(244,246,249,.9);
  backdrop-filter:blur(6px);border-bottom:1px solid var(--line);
  padding:10px 40px;font-size:12.5px;color:var(--muted);display:flex;align-items:center;gap:8px;}
.topbar .crumb-cur{color:var(--ink);font-weight:600;}
.topbar a.crumb{color:var(--muted);}
.menu-btn{display:none;}
main{max-width:1000px;padding:26px 40px 110px;}

h1{font-size:27px;margin:6px 0 4px;scroll-margin-top:56px;}
h1 .count{font-size:13px;font-weight:600;color:var(--accent);
  background:var(--accent-weak);border-radius:20px;padding:2px 11px;margin-left:10px;vertical-align:middle;}
main h2{font-size:20px;margin:36px 0 10px;padding-bottom:6px;border-bottom:1px solid var(--line);scroll-margin-top:56px;}
main h3{font-size:16px;margin:26px 0 7px;font-weight:680;color:#27313f;scroll-margin-top:56px;}
main h4{font-size:14.5px;margin:20px 0 6px;font-weight:700;color:var(--accent);scroll-margin-top:56px;}
.intro{color:#48515c;margin:8px 0 18px;font-size:14.5px;}
.muted{color:var(--muted);}
main p{margin:10px 0;color:#323b46;}
main strong{color:var(--ink);font-weight:680;}

/* lists */
main ul{margin:11px 0;padding-left:4px;}
main ul li{position:relative;list-style:none;padding:3px 0 3px 18px;margin:4px 0;color:#323b46;}
main ul li::before{content:"";position:absolute;left:3px;top:11px;width:6px;height:6px;
  border-radius:50%;background:var(--accent);opacity:.75;}
main ol{margin:11px 0;padding-left:24px;}
main ol li{margin:5px 0;color:#323b46;padding-left:4px;}
main ol li::marker{color:var(--accent);font-weight:700;}

/* note / callout (Obsidian [!note]) */
.callout{background:#fff8ec;border:1px solid #f0dcb4;border-left:3px solid var(--enum);
  border-radius:0 8px 8px 0;padding:11px 15px;margin:14px 0;color:#5a4a2e;font-size:13.8px;line-height:1.7;}
.callout.note{background:#eef4fb;border-color:#cfe0f5;border-left-color:var(--accent);color:#33424f;}
.callout.tip{background:#e9f7ef;border-color:#bfe6cf;border-left-color:var(--msg);color:#245c3d;}
.callout.warning,.callout.warn,.callout.caution{background:#fdf1ea;border-color:#f3d3bd;border-left-color:#c2410c;color:#7a3b1a;}
.callout .callout-title{font-weight:700;margin-bottom:4px;display:flex;align-items:center;gap:6px;}
.callout .callout-body>p:first-child{margin-top:2px;}
.callout .callout-body>p:last-child{margin-bottom:0;}
main h5{font-size:13.5px;margin:16px 0 5px;font-weight:700;color:#37475a;scroll-margin-top:56px;}

/* per-page TOC (本章小节) */
.toc-box{background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:12px 14px;margin:14px 0 26px;}
.toc-title{font-size:11px;text-transform:uppercase;letter-spacing:.07em;color:var(--muted);margin-bottom:9px;}
.toc-grid{display:flex;flex-wrap:wrap;gap:7px;}
.toc-item{font-size:12.8px;background:#f1f4f8;border:1px solid var(--line);border-radius:6px;
  padding:3px 10px;color:var(--accent);}
.toc-item:hover{background:var(--accent-weak);text-decoration:none;}
.toc-item.sub{color:var(--accent);background:#f6f8fb;font-size:12.3px;}
.toc-item.sub:hover{color:var(--accent);}

/* tables (table.params) */
.table-wrap{overflow-x:auto;margin:16px 0;}
table.params{width:100%;border-collapse:collapse;background:var(--panel);
  border:1px solid var(--line);border-radius:8px;overflow:hidden;}
table.params th{background:#f3f6fa;text-align:left;font-size:11.5px;text-transform:uppercase;
  letter-spacing:.04em;color:var(--muted);padding:8px 12px;border-bottom:1px solid var(--line);}
table.params td{padding:8px 12px;border-bottom:1px solid var(--line);vertical-align:top;}
table.params tr:last-child td{border-bottom:none;}
table.params tr:hover td{background:#fafbfd;}
td.pn{font-family:"Cascadia Code",Consolas,monospace;color:#1b4fa0;white-space:nowrap;}

/* code blocks (reserved) */
pre{background:var(--code-bg);color:var(--code-ink);border-radius:9px;padding:13px 15px;overflow-x:auto;
  font-family:"Cascadia Code",Consolas,monospace;font-size:12.6px;line-height:1.55;margin:4px 0;}
pre code{background:none;border:none;padding:0;color:inherit;font-size:inherit;}

/* figures (manual-specific, palette-aligned) */
figure.img{margin:28px auto;text-align:center;}
figure.img img{display:inline-block;max-width:100%;height:auto;border:1px solid var(--line);
  border-radius:9px;box-shadow:0 2px 8px rgba(16,24,40,.08);background:#fff;}
.fig-grid{display:grid;gap:20px;margin:22px auto;align-items:start;justify-items:center;}
.grid-fig{margin:0;width:100%;display:flex;flex-direction:column;align-items:center;}
.grid-fig img{display:block;max-width:100%;height:auto;max-height:540px;object-fit:contain;
  border:1px solid var(--line);border-radius:9px;box-shadow:0 2px 8px rgba(16,24,40,.08);background:#fff;}
.caption{color:var(--muted);font-size:12.5px;margin:8px auto 2px;text-align:center;}
figcaption.caption{margin-top:10px;}

/* chapter 3: paired module/param figures — bottom-align, shrink the left (module) image */
.ch3 .fig-grid{align-items:end;}
.ch3 .fig-grid .grid-fig:nth-child(odd) img{width:60%;}

/* print / PDF export — drop the app chrome, let content flow full width */
@media print{
  @page{margin:16mm 14mm;}
  nav.side,.topbar,.backdrop,.totop,.pager,main footer{display:none !important;}
  .content{margin-left:0 !important;}
  main{max-width:none !important;padding:0 !important;}
  body{background:#fff;font-size:13.5px;}
  /* 图 / 表 / 代码 / 提示框尽量不跨页 */
  figure.img,.fig-grid,table,pre,.callout{break-inside:avoid;page-break-inside:avoid;}
  figure.img img,.grid-fig img{box-shadow:none;max-width:100% !important;}
  /* 标题不与其后内容分离，且不落在页脚孤行 */
  h1,h2,h3,h4,h5{break-after:avoid;page-break-after:avoid;}
  h2,h3,h4{break-before:auto;}
  p,li{orphans:3;widows:3;}
}

/* prev / next pager */
.pager{display:flex;justify-content:space-between;gap:14px;margin:46px 0 0;padding-top:22px;border-top:1px solid var(--line);}
.pager a,.pager span{flex:1;border:1px solid var(--line);background:var(--panel);border-radius:9px;padding:12px 16px;transition:.12s;}
.pager a:hover{border-color:var(--accent);box-shadow:0 4px 16px rgba(37,99,201,.08);text-decoration:none;}
.pager .dir{font-size:11.5px;color:var(--muted);}
.pager .ttl{font-weight:600;color:var(--ink);margin-top:2px;font-size:13.5px;}
.pager .next{text-align:right;}
.pager .disabled{opacity:0;border:none;pointer-events:none;}

footer{margin-top:48px;padding-top:16px;border-top:1px solid var(--line);color:var(--muted);font-size:12px;}

/* back to top */
.totop{position:fixed;right:24px;bottom:24px;width:42px;height:42px;border-radius:9px;background:var(--accent);
  color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;
  box-shadow:0 6px 18px rgba(37,99,201,.32);opacity:0;pointer-events:none;transition:.22s;font-size:18px;z-index:30;}
.totop.show{opacity:1;pointer-events:auto;}
.totop:hover{text-decoration:none;}

/* responsive — added for the manual (reference is desktop-only) */
@media(max-width:900px){
  nav.side{transform:translateX(-100%);transition:transform .3s;}
  nav.side.open{transform:none;box-shadow:0 0 40px rgba(0,0,0,.35);}
  .content{margin-left:0;}
  .menu-btn{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:8px;
    border:1px solid var(--line);background:#fff;cursor:pointer;font-size:17px;color:var(--ink);}
  main{padding:22px 18px 80px;}
  h1{font-size:23px;}
  .fig-grid{grid-template-columns:1fr !important;}
  .backdrop{display:none;position:fixed;inset:0;background:rgba(0,0,0,.4);z-index:35;}
  .backdrop.show{display:block;}
}

/* == pygments (教程代码高亮) == */
pre { line-height: 125%; }
td.linenos .normal { color: #666666; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: #666666; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.codehilite .hll { background-color: #ffffcc }
.codehilite { background: #f0f0f0; }
.codehilite .c { color: #60A0B0; font-style: italic } /* Comment */
.codehilite .err { border: 1px solid #F00 } /* Error */
.codehilite .k { color: #007020; font-weight: bold } /* Keyword */
.codehilite .o { color: #666 } /* Operator */
.codehilite .ch { color: #60A0B0; font-style: italic } /* Comment.Hashbang */
.codehilite .cm { color: #60A0B0; font-style: italic } /* Comment.Multiline */
.codehilite .cp { color: #007020 } /* Comment.Preproc */
.codehilite .cpf { color: #60A0B0; font-style: italic } /* Comment.PreprocFile */
.codehilite .c1 { color: #60A0B0; font-style: italic } /* Comment.Single */
.codehilite .cs { color: #60A0B0; background-color: #FFF0F0 } /* Comment.Special */
.codehilite .gd { color: #A00000 } /* Generic.Deleted */
.codehilite .ge { font-style: italic } /* Generic.Emph */
.codehilite .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.codehilite .gr { color: #F00 } /* Generic.Error */
.codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.codehilite .gi { color: #00A000 } /* Generic.Inserted */
.codehilite .go { color: #888 } /* Generic.Output */
.codehilite .gp { color: #C65D09; font-weight: bold } /* Generic.Prompt */
.codehilite .gs { font-weight: bold } /* Generic.Strong */
.codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.codehilite .gt { color: #04D } /* Generic.Traceback */
.codehilite .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
.codehilite .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
.codehilite .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
.codehilite .kp { color: #007020 } /* Keyword.Pseudo */
.codehilite .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
.codehilite .kt { color: #902000 } /* Keyword.Type */
.codehilite .m { color: #40A070 } /* Literal.Number */
.codehilite .s { color: #4070A0 } /* Literal.String */
.codehilite .na { color: #4070A0 } /* Name.Attribute */
.codehilite .nb { color: #007020 } /* Name.Builtin */
.codehilite .nc { color: #0E84B5; font-weight: bold } /* Name.Class */
.codehilite .no { color: #60ADD5 } /* Name.Constant */
.codehilite .nd { color: #555; font-weight: bold } /* Name.Decorator */
.codehilite .ni { color: #D55537; font-weight: bold } /* Name.Entity */
.codehilite .ne { color: #007020 } /* Name.Exception */
.codehilite .nf { color: #06287E } /* Name.Function */
.codehilite .nl { color: #002070; font-weight: bold } /* Name.Label */
.codehilite .nn { color: #0E84B5; font-weight: bold } /* Name.Namespace */
.codehilite .nt { color: #062873; font-weight: bold } /* Name.Tag */
.codehilite .nv { color: #BB60D5 } /* Name.Variable */
.codehilite .ow { color: #007020; font-weight: bold } /* Operator.Word */
.codehilite .w { color: #BBB } /* Text.Whitespace */
.codehilite .mb { color: #40A070 } /* Literal.Number.Bin */
.codehilite .mf { color: #40A070 } /* Literal.Number.Float */
.codehilite .mh { color: #40A070 } /* Literal.Number.Hex */
.codehilite .mi { color: #40A070 } /* Literal.Number.Integer */
.codehilite .mo { color: #40A070 } /* Literal.Number.Oct */
.codehilite .sa { color: #4070A0 } /* Literal.String.Affix */
.codehilite .sb { color: #4070A0 } /* Literal.String.Backtick */
.codehilite .sc { color: #4070A0 } /* Literal.String.Char */
.codehilite .dl { color: #4070A0 } /* Literal.String.Delimiter */
.codehilite .sd { color: #4070A0; font-style: italic } /* Literal.String.Doc */
.codehilite .s2 { color: #4070A0 } /* Literal.String.Double */
.codehilite .se { color: #4070A0; font-weight: bold } /* Literal.String.Escape */
.codehilite .sh { color: #4070A0 } /* Literal.String.Heredoc */
.codehilite .si { color: #70A0D0; font-style: italic } /* Literal.String.Interpol */
.codehilite .sx { color: #C65D09 } /* Literal.String.Other */
.codehilite .sr { color: #235388 } /* Literal.String.Regex */
.codehilite .s1 { color: #4070A0 } /* Literal.String.Single */
.codehilite .ss { color: #517918 } /* Literal.String.Symbol */
.codehilite .bp { color: #007020 } /* Name.Builtin.Pseudo */
.codehilite .fm { color: #06287E } /* Name.Function.Magic */
.codehilite .vc { color: #BB60D5 } /* Name.Variable.Class */
.codehilite .vg { color: #BB60D5 } /* Name.Variable.Global */
.codehilite .vi { color: #BB60D5 } /* Name.Variable.Instance */
.codehilite .vm { color: #BB60D5 } /* Name.Variable.Magic */
.codehilite .il { color: #40A070 } /* Literal.Number.Integer.Long */
