:root{color-scheme:light;--bg:#fbfaf7;--fg:#1f2328;--muted:#6b7280;--line:#e6e2d8;--card:#fff;--accent:#7a5c1e;--soft:#f1e9d6;--code:#f3f0e8}
@media(prefers-color-scheme:dark){:root:not([data-theme=light]){color-scheme:dark;--bg:#16181c;--fg:#e6e6e6;--muted:#9aa0a6;--line:#2c3037;--card:#1d2026;--accent:#d7b46a;--soft:#2b2718;--code:#24272e}}
:root[data-theme=dark]{color-scheme:dark;--bg:#16181c;--fg:#e6e6e6;--muted:#9aa0a6;--line:#2c3037;--card:#1d2026;--accent:#d7b46a;--soft:#2b2718;--code:#24272e}
*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:24px}body{margin:0;background:var(--bg);color:var(--fg);font:16px/1.75 -apple-system,"PingFang SC","Microsoft YaHei","Noto Sans CJK SC",system-ui,sans-serif}a{color:var(--accent);text-underline-offset:4px}a:hover{text-decoration:underline}button,input{font:inherit}button{cursor:pointer}a:focus-visible,button:focus-visible,input:focus-visible,summary:focus-visible{outline:2px solid var(--accent);outline-offset:5px}[hidden]{display:none!important}.skip{position:absolute;left:20px;top:-80px;background:var(--card);padding:10px;z-index:10}.skip:focus{top:10px}.site-header,main,footer{max-width:960px;margin:auto;padding-left:24px;padding-right:24px}.site-header{display:flex;align-items:center;justify-content:space-between;padding-top:36px;padding-bottom:30px;border-bottom:1px solid var(--line);gap:20px}.brand svg{width:72px;height:40px;display:block;color:var(--fg)}nav{display:flex;align-items:center;gap:22px}nav a{text-decoration:none;font-size:14px}#theme{background:transparent;border:1px solid var(--line);border-radius:30px;color:var(--muted);font-size:12px;padding:4px 10px}main{padding-top:64px;padding-bottom:32px}.eyebrow{color:var(--muted);font-size:12px;letter-spacing:.12em}.hero h1{font-size:clamp(32px,5vw,48px);letter-spacing:-.025em;line-height:1.2;margin:16px 0}.lead{color:var(--muted);font-size:19px;line-height:1.8}.intro{max-width:750px;color:var(--muted);font-size:15px;margin-top:24px}.hero-links{display:flex;gap:24px;align-items:center;flex-wrap:wrap;margin-top:30px;font-size:14px}.hero-links a{font-weight:600;text-decoration:none;border-bottom:1px solid var(--accent)}.hero-links span{color:var(--muted)}.catalog-bar{display:flex;justify-content:space-between;align-items:center;gap:16px;margin:56px 0 28px;border-bottom:1px solid var(--line);padding-bottom:16px;font-size:14px}.search{display:flex;align-items:center;gap:12px;color:var(--muted);font-size:13px}.search input{width:225px;max-width:100%;padding:7px 12px;border:1px solid var(--line);border-radius:7px;background:var(--card);color:var(--fg);font-size:14px}.chapter{display:grid;grid-template-columns:180px minmax(0,1fr);gap:28px;margin-bottom:36px}.chapter header{padding-top:16px}.chapter h2{font-size:18px;margin:0 0 6px}.chapter header p{font-size:13px;color:var(--muted);margin:0}.chapter ol{list-style:none;margin:0;padding:0;border:1px solid var(--line);background:var(--card);border-radius:12px;overflow:hidden}.post+.post{border-top:1px solid var(--line)}.post>a{display:flex;gap:16px;padding:18px 20px;text-decoration:none;align-items:baseline;color:var(--fg)}.post>a:hover{background:var(--soft)}.number{font-size:12px;font-variant-numeric:tabular-nums;color:var(--muted);flex:none}.post h3{font-size:17px;font-weight:600;margin:0;line-height:1.5}.post p{font-size:14px;color:var(--muted);line-height:1.6;margin:6px 0}.meta{font-size:12px;color:var(--muted)}.arrow{color:var(--accent);margin-left:auto}.article-wrap{max-width:740px;margin:auto}.back{font-size:14px;text-decoration:none}.article-header{margin:38px 0 28px}.article-header h1{font-size:clamp(30px,5vw,42px);line-height:1.35;letter-spacing:-.025em;margin:12px 0 14px}.article-header .lead{font-size:18px}.contents{border:1px solid var(--line);border-radius:10px;padding:12px 18px;margin:30px 0 38px;background:var(--card);font-size:14px}.contents summary{cursor:pointer;color:var(--muted)}.contents ul{padding-left:20px}.contents a{text-decoration:none}.prose{font-size:17px;line-height:1.95;overflow-wrap:anywhere}.prose p{margin:1.3em 0}.prose h2{font-size:24px;line-height:1.5;margin:2.3em 0 .7em;letter-spacing:-.015em}.prose h3{font-size:20px;margin:1.8em 0 .6em}.prose a{color:var(--accent)}.prose blockquote{margin:24px 0;border-left:3px solid var(--accent);padding:1px 22px;background:var(--card);color:var(--muted)}.prose ul,.prose ol{padding-left:1.5em}.prose li{margin:.4em 0}.prose hr{border:0;border-top:1px solid var(--line);margin:36px 0}.prose img{max-width:100%;height:auto;border-radius:8px}.prose table{display:block;max-width:100%;overflow-x:auto;border-collapse:collapse;font-size:14px;line-height:1.75}.prose th,.prose td{padding:10px 14px;border:1px solid var(--line);min-width:100px}.prose th{background:var(--code)}code{font-family:ui-monospace,"SF Mono",Menlo,monospace;background:var(--code);padding:2px 5px;border-radius:4px;font-size:.85em}.codehilite,pre{overflow:auto;border:1px solid var(--line);border-radius:8px;padding:18px;line-height:1.6;font-size:14px;background:var(--code)}.codehilite pre{padding:0;border:0;margin:0;background:transparent}.codehilite code,pre code{padding:0;background:transparent}.pagination{border-top:1px solid var(--line);margin-top:56px;padding-top:24px;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:24px}.pagination a{display:block;padding:16px;border:1px solid var(--line);border-radius:10px;background:var(--card);text-decoration:none}.pagination a:last-child{text-align:right}.pagination span{display:block;color:var(--muted);font-size:12px}.pagination strong{font-size:15px}footer{margin-top:64px;padding-top:24px;padding-bottom:40px;border-top:1px solid var(--line);display:flex;gap:8px 22px;flex-wrap:wrap;color:var(--muted);font-size:13px}footer a{text-decoration:none}footer p{width:100%;font-size:12px;margin:8px 0 0}
@media(max-width:640px){.site-header{padding-top:24px;gap:12px}nav{gap:14px}.brand svg{width:55px;height:32px}.site-header,main,footer{padding-left:20px;padding-right:20px}main{padding-top:40px}.chapter{grid-template-columns:1fr;gap:14px;margin-bottom:28px}.chapter header{padding-top:0}.chapter header p{margin-top:3px}.catalog-bar{align-items:flex-start;flex-direction:column;margin-top:38px}.search{width:100%}.search input{flex:1;min-width:0}.post>a{padding:16px;gap:12px}.prose{font-size:16px;line-height:1.95}.prose h2{font-size:22px}.article-header{margin-top:28px}.pagination{gap:12px}.pagination a{padding:12px}}
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}}
@media print{.site-header,.contents,.pagination,footer,.back{display:none}main{padding:0}.article-wrap{max-width:none}body{background:white;color:black}.prose a{color:inherit;text-decoration:none}}

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 */