:root{--bg: #ffffff;--fg: #1f2328;--muted: #6b7280;--border: #e5e7eb;--accent: #2563eb;--accent-soft: #eff6ff;--code-bg: #f6f8fa;--inline-code-bg: #f3f4f6;--header-bg: rgba(255, 255, 255, .88);--content-width: 48rem;--detail-width: 78rem;--list-width: 64rem;--layout-width: 68rem;--radius: 8px;--font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;--font-display: "Eon Wordmark", "Nunito", "Avenir Next", "Segoe UI", "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;--font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;color-scheme:light}html.dark{--bg: #0f1115;--fg: #e6e6e6;--muted: #9ca3af;--border: #262b33;--accent: #7aa2ff;--accent-soft: #1a2333;--code-bg: #161b22;--inline-code-bg: #1f242c;--header-bg: rgba(15, 17, 21, .88);color-scheme:dark}*,*:before,*:after{box-sizing:border-box}html{min-width:320px;background:var(--bg);scroll-behavior:smooth;scrollbar-gutter:stable}@font-face{font-family:Eon Wordmark;src:url(/fonts/nunito-eon.woff2) format("woff2");font-style:normal;font-weight:700;font-display:swap;unicode-range:U+0045,U+006E-006F}body{margin:0;background:var(--bg);color:var(--fg);font-family:var(--font-sans);font-size:16px;line-height:1.75;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}a{color:inherit;text-decoration-thickness:1px;text-underline-offset:3px}button{font:inherit}::selection{background:var(--accent-soft)}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.site-shell{--page-width: var(--content-width);display:flex;min-height:100vh;flex-direction:column}.site-shell--detail{--page-width: var(--detail-width)}.site-shell--list{--page-width: var(--list-width)}.skip-link{position:fixed;top:-100px;left:1rem;z-index:200;padding:.5rem .75rem;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg);color:var(--fg);font-size:.85rem}.skip-link:focus{top:1rem}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.site-header{position:sticky;top:0;z-index:30;border-bottom:1px solid var(--border);background:var(--header-bg);-webkit-backdrop-filter:saturate(180%) blur(12px);backdrop-filter:saturate(180%) blur(12px)}.site-header__inner{display:grid;grid-template-columns:1fr auto auto;width:100%;max-width:var(--page-width);margin:0 auto;padding:.9rem 1.5rem;align-items:center;gap:1.5rem;transition:max-width .56s cubic-bezier(.65,0,.35,1)}.site-logo{grid-column:1;justify-self:start;display:inline-flex;align-items:center;gap:.5rem;color:var(--fg);font-size:1.5rem;line-height:1;text-decoration:none;white-space:nowrap}.site-logo__wordmark{font-family:var(--font-display);font-weight:700;letter-spacing:.01em}.site-logo__mark{width:1.625rem;height:1.625rem;flex:none}.site-nav{display:flex;grid-column:2;justify-self:end;align-items:center;gap:1.3rem}.site-nav__link{padding:.2rem 0;border-bottom:1px solid transparent;color:var(--muted);font-family:var(--font-display);font-size:.9rem;font-weight:700;letter-spacing:.01em;text-decoration:none}.site-nav__link:hover,.site-nav__link.is-active{border-bottom-color:var(--fg);color:var(--fg)}.site-actions{display:flex;grid-column:3;justify-self:end;align-items:center;gap:.25rem}.theme-toggle,.menu-toggle{display:inline-flex;width:2rem;height:2rem;padding:0;align-items:center;justify-content:center;border:0;border-radius:999px;background:transparent;color:var(--muted);cursor:pointer}.theme-toggle:hover,.menu-toggle:hover{background:var(--inline-code-bg);color:var(--fg)}.menu-toggle{display:none;flex-direction:column;gap:4px}.menu-toggle span{display:block;width:16px;height:1.5px;background:currentColor}.site-main{width:100%;max-width:var(--page-width);margin:0 auto;padding:3.5rem 1.5rem 5rem;flex:1}.site-footer{border-top:1px solid var(--border)}.site-footer__inner{display:flex;max-width:var(--layout-width);margin:0 auto;padding:1.5rem;align-items:center;justify-content:center;gap:1rem;flex-wrap:wrap;color:var(--muted);font-size:.78rem;text-align:center}.site-footer__meta{display:flex;align-items:center;justify-content:center;gap:.5rem;flex-wrap:wrap;text-align:center}.site-footer a{color:var(--muted);text-decoration:none}.site-footer a:hover{color:var(--fg);text-decoration:underline}.dot{opacity:.55}.back-to-top{position:fixed;right:1.5rem;bottom:1.5rem;z-index:40;display:inline-flex;width:2.75rem;height:2.75rem;padding:0;align-items:center;justify-content:center;border:1px solid var(--border);border-radius:999px;background:var(--fg);color:var(--bg);box-shadow:0 8px 24px #00000029;cursor:pointer;transition:background .15s ease,opacity .15s ease,transform .15s ease}.back-to-top:hover{opacity:.88;transform:translateY(-2px)}.back-to-top svg{width:1.1rem;height:1.1rem}.back-to-top-enter-active,.back-to-top-leave-active{transition:opacity .15s ease,transform .15s ease}.back-to-top-enter-from,.back-to-top-leave-to{opacity:0;transform:translateY(6px)}@media (max-width: 720px){.back-to-top{right:1rem;bottom:1rem;width:2.5rem;height:2.5rem}}.home-intro{margin-bottom:4rem}.home-name{margin:0 0 1.25rem;font-size:clamp(2.25rem,5vw,2.75rem);font-weight:700;letter-spacing:-.02em;line-height:1.1}.home-persona{display:flex;margin:0 0 1.5rem;flex-direction:column;gap:.15rem;color:var(--muted);font-size:1.02rem;line-height:1.8}.home-persona p{margin:0}.home-motto{margin:0 0 1.5rem;padding-left:1rem;border-left:2px solid var(--accent);color:var(--fg);font-size:1.05rem;line-height:1.8}.home-links{display:flex;flex-wrap:wrap;gap:.5rem;align-items:center;color:var(--muted);font-size:.9rem}.home-links a{color:var(--fg);text-decoration:underline;text-underline-offset:3px}.home-section{margin-top:3.5rem}.section-heading{margin-bottom:1.75rem}.section-title{margin:0;font-size:1.4rem;font-weight:700;letter-spacing:-.02em}.section-description{margin:.5rem 0 0;color:var(--muted);font-size:.95rem}.content-list{display:flex;flex-direction:column}.content-row{padding:1.5rem 0;border-bottom:1px solid var(--border)}.content-row:first-child{padding-top:0}.content-row__link{display:block;color:inherit;text-decoration:none}.content-row__meta{display:flex;align-items:center;gap:.45rem;color:var(--muted);font-size:.78rem}.content-row__kind{color:var(--fg);font-weight:600}.content-row__title{margin:.5rem 0 .45rem;font-size:1.15rem;letter-spacing:-.02em;line-height:1.35;text-decoration:underline;text-decoration-color:transparent;text-underline-offset:4px;transition:text-decoration-color .15s ease}.content-row__link:hover .content-row__title{text-decoration-color:currentColor}.content-row__summary{display:-webkit-box;overflow:hidden;margin:0;color:var(--muted);font-size:.95rem;line-height:1.7;-webkit-box-orient:vertical;-webkit-line-clamp:2}.empty-state{color:var(--muted);font-size:.9rem}.blog-shell{display:grid;grid-template-columns:minmax(0,48rem) 11rem;grid-template-areas:"list tags";gap:2rem;align-items:start;justify-content:space-between;min-width:0}.blog-list{grid-area:list;min-width:0}.blog-tags{position:sticky;top:5.5rem;grid-area:tags;min-width:0;max-height:calc(100vh - 7rem);padding-left:1.25rem;overflow-y:auto;border-left:1px solid var(--border);scrollbar-width:thin;scrollbar-color:var(--border) transparent}.blog-tags__title{margin:0 0 .6rem;color:var(--muted);font-size:.72rem;font-weight:600;letter-spacing:.12em}.blog-tags__nav{display:flex;min-width:0;flex-direction:column;gap:.1rem}.tag-hash{margin-right:.12em;opacity:.5}.blog-tags__item{display:grid;grid-template-columns:minmax(0,1fr) auto;width:100%;padding:.3rem .15rem;gap:.5rem;border:0;background:transparent;color:var(--muted);font-family:var(--font-mono);font-size:.72rem;line-height:1.6;text-align:left;cursor:pointer;transition:color .16s ease}.blog-tags__name{overflow-wrap:anywhere}.blog-tags__item:hover{color:var(--fg)}.blog-tags__item.is-active{color:var(--accent)}.blog-tags__item:hover .blog-tags__name,.blog-tags__item.is-active .blog-tags__name{text-decoration:underline;text-underline-offset:3px}.blog-tags__item.is-active .tag-hash{opacity:.9}.blog-tags__count{color:var(--muted);font-family:var(--font-mono);font-size:.66rem;font-variant-numeric:tabular-nums}.blog-tags__item.is-active .blog-tags__count{color:var(--accent)}.blog-timeline{position:relative;margin:0;padding:0 0 1rem 2rem;list-style:none}.blog-timeline:before{content:"";position:absolute;top:.9rem;bottom:1.4rem;left:.25rem;width:1px;background:color-mix(in srgb,var(--muted) 42%,transparent)}.blog-entry{position:relative;padding:1.1rem 0}.blog-entry:before{content:"";position:absolute;top:1.52rem;left:-1.94rem;width:7px;height:7px;border:1.5px solid color-mix(in srgb,var(--muted) 55%,transparent);border-radius:999px;background:var(--bg);transition:border-color .2s ease,background .2s ease}.blog-entry.is-open:before{border-color:var(--accent);background:var(--accent);box-shadow:0 0 0 4px var(--accent-soft)}.blog-entry__heading{margin:0}.blog-entry__toggle{display:grid;grid-template-columns:minmax(0,1fr) auto;width:100%;padding:0;align-items:center;border:0;background:transparent;color:inherit;text-align:left;cursor:pointer}.blog-entry__meta{grid-column:1;display:flex;flex-wrap:wrap;align-items:center;margin-bottom:.28rem;gap:.55rem}.blog-entry__date{color:var(--muted);font-family:var(--font-mono);font-size:.7rem;letter-spacing:.045em}.blog-entry__tags{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;color:var(--muted);font-family:var(--font-mono);font-size:.66rem;line-height:1.5}.blog-entry__tag{display:inline-flex;align-items:baseline;white-space:nowrap}.blog-entry__title{grid-column:1;font-size:1.06rem;font-weight:650;letter-spacing:-.015em;line-height:1.45}.blog-entry__toggle:hover .blog-entry__title{text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:4px}.blog-entry__chevron{grid-column:2;grid-row:1 / 3;width:1rem;height:1rem;color:var(--muted);transition:transform .26s ease,color .2s ease}.blog-entry.is-open .blog-entry__chevron{color:var(--fg);transform:rotate(180deg)}.blog-entry__panel{display:grid;grid-template-rows:0fr;transition:grid-template-rows .38s cubic-bezier(.22,1,.36,1)}.blog-entry__panel.is-open{grid-template-rows:1fr}.blog-entry__panel-inner{overflow:hidden;min-height:0}.blog-entry__expanded{display:grid;grid-template-columns:minmax(0,1fr);gap:1.5rem;padding-top:1rem;align-items:end}.blog-entry__expanded.has-cover{grid-template-columns:minmax(0,1fr) 12rem}.blog-entry__summary{margin:0 0 .85rem;color:var(--muted);font-size:.92rem;line-height:1.8}.blog-entry__read{display:inline-flex;gap:.3rem;padding-bottom:.1rem;align-items:center;border-bottom:1px solid var(--fg);color:var(--fg);font-size:.82rem;font-weight:600;text-decoration:none}.blog-entry__read:hover{border-bottom-color:var(--accent);color:var(--accent)}.blog-entry__cover{width:100%;height:7.4rem;border:1px solid var(--border);border-radius:10px;background:var(--code-bg);object-fit:cover}.article-header{margin-bottom:2rem}.article-title{margin:0 0 .75rem;font-size:2rem;font-weight:700;letter-spacing:-.04em;line-height:1.2}.article-meta{display:flex;flex-wrap:wrap;align-items:center;gap:.75rem;color:var(--muted);font-size:.8rem}.article-tags{display:flex;flex-wrap:wrap;margin:.75rem 0 0;padding:0;gap:.7rem;list-style:none}.article-tag{display:inline-flex;align-items:baseline;color:var(--muted);font-family:var(--font-mono);font-size:.7rem;letter-spacing:.02em;line-height:1.5;white-space:nowrap}.course-lock{display:flex;width:100%;padding:2.25rem 1.5rem;flex-direction:column;align-items:center;gap:.85rem;border:1px solid var(--border);border-radius:var(--radius);background:var(--code-bg);text-align:center}.course-lock .course-lock__eyebrow{margin:0;color:var(--muted);font-size:.72rem;letter-spacing:.16em;text-transform:uppercase}.course-lock .course-lock__title{margin:0;font-size:1.75rem;font-weight:700;letter-spacing:-.03em;line-height:1.25}.course-lock .course-lock__status{max-width:32rem;margin:0;color:var(--muted);font-size:.9rem;line-height:1.75}.course-lock .course-lock__error{margin:0;color:#dc2626;font-size:.8rem}.course-lock__button{display:inline-flex;padding:.6rem 1.25rem;align-items:center;justify-content:center;border:1px solid var(--fg);border-radius:999px;background:var(--fg);color:var(--bg);font:inherit;font-size:.9rem;cursor:pointer;transition:opacity .15s ease}.course-lock__button:hover:not(:disabled){opacity:.82}.course-lock__button:disabled{cursor:wait;opacity:.5}.not-found{padding:3rem 0 4rem}.not-found__code{margin:0 0 1rem;color:var(--muted);font-family:var(--font-mono);font-size:.8rem;letter-spacing:.18em}.not-found__title{margin:0 0 .75rem;font-size:2.2rem;letter-spacing:-.04em}.not-found__desc{margin:0 0 1.5rem;color:var(--muted)}.not-found__link{display:inline-block;padding:.55rem 1.1rem;border:1px solid var(--fg);border-radius:999px;color:var(--fg);font-size:.9rem;text-decoration:none}.not-found__link:hover{background:var(--fg);color:var(--bg)}.unlock-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:100;display:flex;padding:1.25rem;align-items:center;justify-content:center;background:#080a0e9e;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}.unlock-dialog{position:relative;overflow:auto;width:100%;max-width:380px;max-height:calc(100vh - 2.5rem);padding:1.75rem 1.5rem 1.5rem;border:1px solid var(--border);border-radius:18px;background:var(--bg);color:var(--fg);text-align:center;box-shadow:0 28px 90px #00000047}.unlock-close{position:absolute;top:.65rem;right:.65rem;display:inline-flex;width:2rem;height:2rem;padding:0;align-items:center;justify-content:center;border:0;border-radius:999px;background:transparent;color:var(--muted);cursor:pointer;transition:background .15s ease,color .15s ease}.unlock-close svg{width:1rem;height:1rem}.unlock-close:hover{background:var(--inline-code-bg);color:var(--fg)}.unlock-qr{display:block;width:220px;height:220px;margin:1.1rem auto 0;padding:.5rem;border:1px solid var(--border);border-radius:14px;background:#fff;object-fit:contain}.unlock-instructions{display:flex;flex-direction:column;gap:.3rem}.unlock-instructions p{margin:0;color:var(--muted);font-size:.9rem;line-height:1.7}.unlock-instructions strong{color:var(--fg);font-weight:600}.unlock-instructions .unlock-send strong{display:inline-block;margin-left:.15rem;color:var(--accent);font-family:var(--font-mono);font-size:1.3rem;letter-spacing:.08em;line-height:1.4;vertical-align:-.08em}.unlock-error{margin:.85rem 0 0;color:#dc2626;font-size:.78rem;line-height:1.6}.unlock-retry{padding:0;border:0;background:none;color:var(--accent);font:inherit;text-decoration:underline;cursor:pointer}.unlock-fade-enter-active,.unlock-fade-leave-active{transition:opacity .15s ease}.unlock-fade-enter-active .unlock-dialog,.unlock-fade-leave-active .unlock-dialog{transition:transform .18s ease}.unlock-fade-enter-from,.unlock-fade-leave-to{opacity:0}.unlock-fade-enter-from .unlock-dialog,.unlock-fade-leave-to .unlock-dialog{transform:translateY(8px) scale(.985)}.course-catalog{max-width:46rem;margin:0 auto}.course-list{display:flex;flex-direction:column;gap:2rem}.course-card{display:grid;grid-template-columns:minmax(0,1fr) 14rem;grid-template-areas:"text logo" "footer logo";gap:1rem 2rem;padding:2rem;border:1px solid var(--border);border-radius:16px;background:var(--bg);color:var(--fg);text-decoration:none;transition:border-color .15s ease,transform .15s ease}.course-card:hover{border-color:var(--fg);transform:translateY(-2px)}.course-card__text{grid-area:text}.course-card__eyebrow{margin:0 0 1rem;color:var(--muted);font-size:.8rem;letter-spacing:.04em}.course-card__title{margin:0 0 .75rem;font-size:1.35rem;letter-spacing:-.02em;line-height:1.35}.course-card__desc{display:-webkit-box;overflow:hidden;margin:0;color:var(--muted);font-size:.92rem;line-height:1.8;-webkit-box-orient:vertical;-webkit-line-clamp:3}.course-card__logo{grid-area:logo;align-self:center;justify-self:end;width:14rem;height:9.8rem;border-radius:12px;background:var(--code-bg);object-fit:cover}.course-card__footer{grid-area:footer;display:flex;margin-top:.75rem;flex-direction:column;align-items:flex-start;gap:.9rem}.course-card__meta{display:flex;flex-wrap:wrap;gap:1.25rem;color:var(--muted);font-size:.85rem}.course-card__meta-item{display:inline-flex;align-items:center;gap:.4rem}.course-card__meta-item svg{width:16px;height:16px;flex:none}.course-card__button{display:inline-flex;padding:.7rem 1.15rem;align-items:center;justify-content:center;border-radius:6px;background:var(--fg);color:var(--bg);font-size:.85rem;font-weight:600;white-space:nowrap}.course-card--no-cover{grid-template-columns:1fr;grid-template-areas:"text" "footer"}.course-card--planned{display:block;border-style:dashed}.course-card--planned:hover{border-color:var(--border);transform:none}.collection-shell{display:grid;grid-template-columns:13rem minmax(0,1fr);gap:2.5rem;align-items:start}.collection-shell.has-outline{grid-template-columns:13rem minmax(0,1fr) 10.5rem;gap:2rem}.collection-sidebar{position:sticky;top:5.5rem;max-height:calc(100vh - 7rem);padding-right:1.5rem;overflow-y:auto;border-right:1px solid var(--border)}.collection-series{display:block;margin-bottom:.55rem;color:var(--fg);font-size:.95rem;font-weight:700;line-height:1.4;text-decoration:none}.collection-menu-toggle{display:none;width:100%;margin-top:.75rem;padding:.6rem .75rem;align-items:center;justify-content:space-between;border:1px solid var(--border);border-radius:var(--radius);background:transparent;color:var(--fg);font:inherit;font-size:.82rem;cursor:pointer}.collection-nav{display:flex;flex-direction:column;gap:.15rem}.collection-nav__link{display:flex;gap:.6rem;padding:.4rem .5rem;border-radius:6px;color:var(--muted);font-size:.82rem;line-height:1.45;text-decoration:none}.collection-nav__link:hover{background:var(--inline-code-bg);color:var(--fg)}.collection-nav__link.is-active{background:var(--inline-code-bg);color:var(--fg);font-weight:600}.collection-nav__index{flex:none;padding-top:.05rem;font-family:var(--font-mono);font-size:.7rem}.collection-nav__title{min-width:0}.collection-nav__lock{width:.8rem;height:.8rem;flex:none;margin-left:auto;color:var(--muted)}.collection-nav__link.is-active .collection-nav__lock{color:var(--fg)}.collection-article{max-width:48rem}.collection-article.prose a{color:var(--fg)}.article-shell{display:grid;grid-template-columns:12rem minmax(0,48rem);gap:2rem;align-items:start;justify-content:center}.article-shell.has-outline{grid-template-columns:12rem minmax(0,48rem) 10.5rem}.article-main{grid-column:2;width:100%;max-width:48rem;min-width:0}.article-timeline{position:sticky;top:5.5rem;grid-column:1;max-height:calc(100vh - 7rem);padding:1.2rem .4rem;overflow-y:auto;scrollbar-width:none;-webkit-mask-image:linear-gradient(to bottom,transparent 0,#000 1.4rem,#000 calc(100% - 1.4rem),transparent 100%);mask-image:linear-gradient(to bottom,transparent 0,#000 1.4rem,#000 calc(100% - 1.4rem),transparent 100%)}.article-timeline::-webkit-scrollbar{display:none}.article-timeline nav{position:relative;display:flex;flex-direction:column}.article-timeline nav:before{content:"";position:absolute;top:.6rem;bottom:.6rem;left:4px;width:1px;background:color-mix(in srgb,var(--muted) 42%,transparent)}.article-timeline__link{position:relative;display:block;padding:.42rem 0 .42rem 1.15rem;color:var(--muted);font-size:.76rem;line-height:1.45;overflow-wrap:anywhere;text-decoration:none}.article-timeline__link:before{content:"";position:absolute;top:.82rem;left:1.5px;width:6px;height:6px;border:1px solid color-mix(in srgb,var(--muted) 55%,transparent);border-radius:999px;background:var(--bg)}.article-timeline__link time{display:block;margin-bottom:.1rem;font-family:var(--font-mono);font-size:.6rem;letter-spacing:.03em;opacity:.72}.article-timeline__link:hover,.article-timeline__link.is-active{color:var(--fg)}.article-timeline__link.is-active{font-weight:600}.article-timeline__link.is-active:before{border-color:var(--accent);background:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}.article-outline{position:sticky;top:5.5rem;grid-column:3;max-height:calc(100vh - 7rem);padding-left:1.25rem;overflow-y:auto;border-left:1px solid var(--border)}.article-outline nav{display:flex;flex-direction:column;gap:.1rem}.article-outline__link{display:block;padding:.28rem 0;color:var(--muted);font-size:.78rem;line-height:1.45;overflow-wrap:anywhere;text-decoration:none}.article-outline__link.is-level-3{padding-left:.7rem;font-size:.74rem}.article-outline__link:hover{color:var(--fg)}.collection-pager{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1rem;margin-top:4rem;padding-top:1.5rem;border-top:1px solid var(--border)}.collection-pager__item{display:flex;flex-direction:column;gap:.35rem;padding:1rem;border:1px solid var(--border);border-radius:var(--radius);color:var(--fg);text-decoration:none}.collection-pager__item:hover{border-color:var(--fg)}.collection-pager__item--next{grid-column:2;text-align:right}.collection-pager__label{color:var(--muted);font-size:.72rem}.collection-pager__title{font-size:.88rem;line-height:1.5}@media (max-width: 1240px){.article-shell.has-outline{grid-template-columns:12rem minmax(0,48rem)}.article-shell .article-outline{display:none}}@media (max-width: 1100px){.collection-shell.has-outline{grid-template-columns:13rem minmax(0,1fr);gap:2.5rem}.collection-shell .article-outline{display:none}.site-shell--list{--page-width: var(--content-width)}.blog-shell{grid-template-columns:minmax(0,1fr);grid-template-areas:"tags" "list";gap:1.5rem}.blog-tags{position:static;max-height:none;padding:0 0 .9rem;overflow:visible;border-left:0;border-bottom:1px solid var(--border)}.blog-tags__title{display:none}.blog-tags__nav{flex-direction:row;gap:.9rem;padding-bottom:.1rem;overflow-x:auto;scrollbar-width:none}.blog-tags__nav::-webkit-scrollbar{display:none}.blog-tags__item{width:auto;flex:none;grid-template-columns:auto auto;padding:.35rem 0;gap:.3rem}}@media (max-width: 900px){.article-shell,.article-shell.has-outline{grid-template-columns:minmax(0,48rem);gap:1.5rem}.article-main{grid-column:auto}.article-timeline{display:none}.collection-shell,.collection-shell.has-outline{grid-template-columns:minmax(0,1fr);gap:1.5rem}.collection-sidebar{position:static;max-height:none;padding:0 0 1rem;overflow-y:visible;border-right:0;border-bottom:1px solid var(--border)}.collection-menu-toggle{display:flex}.collection-nav{display:none}.collection-nav.is-open{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));margin-top:.75rem}}@media (max-width: 720px){.blog-timeline{padding-left:1.5rem}.blog-entry:before{left:-1.44rem}.blog-entry__expanded.has-cover{grid-template-columns:minmax(0,1fr)}.blog-entry__cover{height:10rem}.course-card{grid-template-columns:1fr;grid-template-areas:"text" "logo" "footer";padding:1.5rem;gap:1rem}.course-card__logo{justify-self:center;width:15rem;height:10.5rem}.course-card--no-cover{grid-template-areas:"text" "footer"}.course-card__footer{gap:.75rem}.collection-nav.is-open,.collection-pager{grid-template-columns:1fr}.collection-pager__item--next{grid-column:auto;text-align:left}}@media (max-width: 720px){.site-header__inner{grid-template-columns:1fr auto 1fr;padding:.85rem 1rem;gap:1rem}.menu-toggle{display:inline-flex;grid-column:1;justify-self:start}.site-logo{grid-column:2;justify-self:center}.site-actions{grid-column:3;justify-self:end}.site-nav{position:absolute;top:100%;right:0;left:0;display:none;margin:0;padding:.75rem 1rem 1rem;flex-direction:column;align-items:flex-start;gap:.75rem;border-bottom:1px solid var(--border);background:var(--bg)}.site-nav.is-open{display:flex}.site-nav__link{font-size:.95rem}.site-main{padding:2.5rem 1rem 4rem}.article-title{font-size:1.75rem}.course-lock{padding:1.5rem 1rem}.course-lock .course-lock__title{font-size:1.45rem}.unlock-overlay{padding:1rem}.unlock-dialog{max-width:100%;padding:1.5rem 1.25rem}.unlock-qr{width:200px;height:200px;margin-top:.9rem}.unlock-instructions .unlock-send strong{font-size:1.2rem}.site-footer__inner{padding:1.25rem 1rem;flex-direction:column;align-items:center}.site-footer__meta{flex-direction:column;gap:.35rem}.site-footer__meta .dot{display:none}}@media (prefers-reduced-motion: reduce){html{scroll-behavior:auto}*,*:before,*:after{transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}.prose{--copy-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='9' y='9' width='11' height='11' rx='2'/%3E%3Cpath d='M5 15V5a2 2 0 0 1 2-2h10'/%3E%3C/svg%3E");--copied-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m5 12 4 4L19 6'/%3E%3C/svg%3E");min-width:0;font-size:1rem;line-height:1.8}.prose>:first-child{margin-top:0}.prose h1,.prose h2,.prose h3,.prose h4{margin:2.5rem 0 1rem;font-weight:700;letter-spacing:-.025em;line-height:1.3}.prose h1{font-size:2rem}.prose h2{font-size:1.45rem}.prose h3{font-size:1.18rem}.prose h4{font-size:1.02rem}.prose p{margin:1rem 0}.prose a{color:var(--accent);text-decoration:underline;text-underline-offset:3px}.prose strong{font-weight:650}.prose ul,.prose ol{margin:1rem 0;padding-left:1.4rem}.prose li{margin:.35rem 0}.prose blockquote{margin:1.5rem 0;padding:.1rem 0 .1rem 1rem;border-left:3px solid var(--border);color:var(--muted)}.prose blockquote>:first-child{margin-top:0}.prose blockquote>:last-child{margin-bottom:0}.prose blockquote code{color:var(--fg)}.prose hr{margin:2.5rem 0;border:0;border-top:1px solid var(--border)}.prose img{display:block;max-width:100%;height:auto;margin:1.5rem auto;border-radius:var(--radius)}.prose code{padding:.12em .35em;border-radius:4px;background:var(--inline-code-bg);font-family:var(--font-mono);font-size:.9em}.prose :not(pre)>code{overflow-wrap:anywhere}.prose pre{overflow-x:auto;margin:1.4rem 0;border:1px solid var(--border);border-radius:var(--radius);background:var(--code-bg)}.prose pre code{display:block;padding:1rem 1.1rem;background:transparent;font-size:.875rem;line-height:1.7}.prose .shiki{background:var(--code-bg)!important}.prose div[class*=language-]{position:relative}.prose div[class*=language-]>span.lang{display:none}.prose div[class*=language-] pre{margin:1.4rem 0}.prose div[class*=language-]>button.copy{position:absolute;top:.55rem;right:.6rem;display:inline-flex;width:1.7rem;height:1.7rem;padding:0;align-items:center;justify-content:center;border:1px solid var(--border);border-radius:5px;background:var(--bg);color:var(--muted);opacity:0;cursor:pointer;transition:opacity .15s ease,border-color .15s ease,color .15s ease}.prose div[class*=language-]>button.copy:before{content:"";width:.9rem;height:.9rem;background-color:currentColor;-webkit-mask:var(--copy-icon) center / contain no-repeat;mask:var(--copy-icon) center / contain no-repeat}.prose div[class*=language-]:hover>button.copy,.prose div[class*=language-]>button.copy:focus-visible{opacity:1}.prose div[class*=language-]>button.copy:hover{border-color:var(--muted);color:var(--fg)}.prose div[class*=language-]>button.copy.copied{border-color:var(--accent);color:var(--accent);opacity:1}.prose div[class*=language-]>button.copy.copied:before{-webkit-mask-image:var(--copied-icon);mask-image:var(--copied-icon)}.prose div[class*=language-]>button.copy.copied:after{position:absolute;top:50%;right:calc(100% + .4rem);padding:.15rem .4rem;border-radius:4px;background:var(--fg);color:var(--bg);content:"已复制";font-size:.68rem;line-height:1.4;white-space:nowrap;transform:translateY(-50%)}@media (hover: none){.prose div[class*=language-]>button.copy{opacity:.85}}.prose table{width:100%;margin:1.5rem 0;border-collapse:collapse;font-size:.92rem}.prose th,.prose td{padding:.6rem .7rem;border:1px solid var(--border);text-align:left;vertical-align:top;overflow-wrap:anywhere}.prose th{background:var(--inline-code-bg);font-weight:650}.prose .header-anchor{margin-left:.3rem;color:var(--muted);text-decoration:none;opacity:0;transition:opacity .15s ease}.prose h1:hover .header-anchor,.prose h2:hover .header-anchor,.prose h3:hover .header-anchor,.prose h4:hover .header-anchor{opacity:1}.prose kbd{padding:.1rem .35rem;border:1px solid var(--border);border-bottom-width:2px;border-radius:4px;background:var(--inline-code-bg);font-family:var(--font-mono);font-size:.82em}@media (max-width: 720px){.prose h1{font-size:1.75rem}.prose h2{font-size:1.3rem}.prose pre code{font-size:.82rem}}
