@font-face{font-family:Fraunces;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/fraunces-vietnamese-400-normal.CvGt0Ybw.woff2)format("woff2"),url(/_astro/fraunces-vietnamese-400-normal.B65MOf9T.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Fraunces;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/fraunces-latin-ext-400-normal.D8gbi3Gu.woff2)format("woff2"),url(/_astro/fraunces-latin-ext-400-normal.UihxqfOe.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Fraunces;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/fraunces-latin-400-normal.6IfK1voy.woff2)format("woff2"),url(/_astro/fraunces-latin-400-normal.NUPT2cO8.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Fraunces;font-style:italic;font-display:swap;font-weight:400;src:url(/_astro/fraunces-vietnamese-400-italic.BTOWH4O7.woff2)format("woff2"),url(/_astro/fraunces-vietnamese-400-italic.CO9zBbpA.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Fraunces;font-style:italic;font-display:swap;font-weight:400;src:url(/_astro/fraunces-latin-ext-400-italic.jodr80a5.woff2)format("woff2"),url(/_astro/fraunces-latin-ext-400-italic.CGHg0U1I.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Fraunces;font-style:italic;font-display:swap;font-weight:400;src:url(/_astro/fraunces-latin-400-italic.ChpO6tcr.woff2)format("woff2"),url(/_astro/fraunces-latin-400-italic.B7iDoVhm.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Fraunces;font-style:normal;font-display:swap;font-weight:500;src:url(/_astro/fraunces-vietnamese-500-normal.GOH_-EGq.woff2)format("woff2"),url(/_astro/fraunces-vietnamese-500-normal.B-KbxExq.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Fraunces;font-style:normal;font-display:swap;font-weight:500;src:url(/_astro/fraunces-latin-ext-500-normal.Z5DV8IzT.woff2)format("woff2"),url(/_astro/fraunces-latin-ext-500-normal.BMcFk1Xs.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Fraunces;font-style:normal;font-display:swap;font-weight:500;src:url(/_astro/fraunces-latin-500-normal.DnGCNyPD.woff2)format("woff2"),url(/_astro/fraunces-latin-500-normal.BTR4KCeb.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Fraunces;font-style:normal;font-display:swap;font-weight:600;src:url(/_astro/fraunces-vietnamese-600-normal.BjlAJixd.woff2)format("woff2"),url(/_astro/fraunces-vietnamese-600-normal.DlAl5EAR.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Fraunces;font-style:normal;font-display:swap;font-weight:600;src:url(/_astro/fraunces-latin-ext-600-normal.BtzmzP0X.woff2)format("woff2"),url(/_astro/fraunces-latin-ext-600-normal.B0Dy4lqi.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Fraunces;font-style:normal;font-display:swap;font-weight:600;src:url(/_astro/fraunces-latin-600-normal.BFCDtZfi.woff2)format("woff2"),url(/_astro/fraunces-latin-600-normal.DL5QCzvS.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Fraunces;font-style:normal;font-display:swap;font-weight:700;src:url(/_astro/fraunces-vietnamese-700-normal.DH94m5DZ.woff2)format("woff2"),url(/_astro/fraunces-vietnamese-700-normal.DxawQjq2.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Fraunces;font-style:normal;font-display:swap;font-weight:700;src:url(/_astro/fraunces-latin-ext-700-normal.CanUGppC.woff2)format("woff2"),url(/_astro/fraunces-latin-ext-700-normal.DuBstVeD.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Fraunces;font-style:normal;font-display:swap;font-weight:700;src:url(/_astro/fraunces-latin-700-normal.CEOla-zY.woff2)format("woff2"),url(/_astro/fraunces-latin-700-normal.DTjk5d1Q.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Public Sans;font-style:normal;font-display:swap;font-weight:300;src:url(/_astro/public-sans-vietnamese-300-normal.D5FYYlEb.woff2)format("woff2"),url(/_astro/public-sans-vietnamese-300-normal.eZGMJ7RK.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Public Sans;font-style:normal;font-display:swap;font-weight:300;src:url(/_astro/public-sans-latin-ext-300-normal.2QCaJEpM.woff2)format("woff2"),url(/_astro/public-sans-latin-ext-300-normal.C5EVZmVg.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Public Sans;font-style:normal;font-display:swap;font-weight:300;src:url(/_astro/public-sans-latin-300-normal.C9J7XxkK.woff2)format("woff2"),url(/_astro/public-sans-latin-300-normal.1jtUkgh3.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Public Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/public-sans-vietnamese-400-normal.TxZB8OSn.woff2)format("woff2"),url(/_astro/public-sans-vietnamese-400-normal.BO1meqcx.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Public Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/public-sans-latin-ext-400-normal.mk90oQqJ.woff2)format("woff2"),url(/_astro/public-sans-latin-ext-400-normal.B02wwOdZ.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Public Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/public-sans-latin-400-normal.8Rpg0ruU.woff2)format("woff2"),url(/_astro/public-sans-latin-400-normal.SBbinRkI.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Public Sans;font-style:normal;font-display:swap;font-weight:500;src:url(/_astro/public-sans-vietnamese-500-normal.DjztbcKe.woff2)format("woff2"),url(/_astro/public-sans-vietnamese-500-normal.CXYe29CY.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Public Sans;font-style:normal;font-display:swap;font-weight:500;src:url(/_astro/public-sans-latin-ext-500-normal.DC-z7ASZ.woff2)format("woff2"),url(/_astro/public-sans-latin-ext-500-normal.BHCCp-na.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Public Sans;font-style:normal;font-display:swap;font-weight:500;src:url(/_astro/public-sans-latin-500-normal.NlrCPXnF.woff2)format("woff2"),url(/_astro/public-sans-latin-500-normal.vCxiVFAq.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Public Sans;font-style:normal;font-display:swap;font-weight:600;src:url(/_astro/public-sans-vietnamese-600-normal.P4BtCUdw.woff2)format("woff2"),url(/_astro/public-sans-vietnamese-600-normal.CcnAzmUX.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Public Sans;font-style:normal;font-display:swap;font-weight:600;src:url(/_astro/public-sans-latin-ext-600-normal.DchWdWJ_.woff2)format("woff2"),url(/_astro/public-sans-latin-ext-600-normal.DfkbVac2.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Public Sans;font-style:normal;font-display:swap;font-weight:600;src:url(/_astro/public-sans-latin-600-normal.Fru-LXNs.woff2)format("woff2"),url(/_astro/public-sans-latin-600-normal.BR59oU-I.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Public Sans;font-style:normal;font-display:swap;font-weight:700;src:url(/_astro/public-sans-vietnamese-700-normal.D97ShjGS.woff2)format("woff2"),url(/_astro/public-sans-vietnamese-700-normal.Dq5VrXjD.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Public Sans;font-style:normal;font-display:swap;font-weight:700;src:url(/_astro/public-sans-latin-ext-700-normal.CgolUQuG.woff2)format("woff2"),url(/_astro/public-sans-latin-ext-700-normal.jWHjnMgZ.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Public Sans;font-style:normal;font-display:swap;font-weight:700;src:url(/_astro/public-sans-latin-700-normal.BqJmxWdE.woff2)format("woff2"),url(/_astro/public-sans-latin-700-normal.Dm-oTPSL.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--color-background:#fafafa;--color-foreground:#09090b;--color-primary:#18181b;--color-secondary:#3f3f46;--color-accent:#ec4899;--color-accent-text:#c22d85;--color-destructive:#dc2626;--color-assignment:#b45309;--color-border:#e4e4e7;--color-muted:#e8ecf0;--sk-shine:#ffffff73;--font-display:"Fraunces", "Noto Serif SC", "Songti SC", Georgia, serif;--font-body:"Public Sans", "PingFang SC", "Microsoft YaHei", system-ui, sans-serif;--font-size-body:1rem;--max-width:960px;--content-width:68ch;--ease:cubic-bezier(.22, .61, .36, 1);--ease-bounce:cubic-bezier(.34, 1.4, .64, 1);--header-h:4.2rem;--nav-drop-gap:22px;--nav-drop-pad-x:1.1rem;color-scheme:light}:root[data-theme=dark]{color-scheme:dark;--color-background:#0e0e10;--color-foreground:#f4f4f5;--color-primary:#fafafa;--color-secondary:#a1a1aa;--color-accent:#f472b6;--color-accent-text:#f472b6;--color-destructive:#f87171;--color-assignment:#f59e0b;--color-border:#26262a;--color-muted:#1a1a1c;--sk-shine:#ffffff1a}.logo-mark{flex:none;width:32px;height:32px;display:block}*{box-sizing:border-box}html{scroll-behavior:smooth}body{background:var(--color-background);color:var(--color-foreground);font-family:var(--font-body);font-size:var(--font-size-body);-webkit-font-smoothing:antialiased;margin:0;line-height:1.7}main{min-height:60vh}a{color:var(--color-primary)}:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}.skeleton{background:var(--color-muted);border-radius:2px;display:none;position:relative;overflow:hidden}.js-ready .skeleton.sk-show{display:block}.skeleton:after{content:"";background:linear-gradient(90deg, transparent, var(--sk-shine), transparent);animation:1.3s ease-in-out infinite shimmer;position:absolute;inset:0;transform:translate(-100%)}@keyframes shimmer{to{transform:translate(100%)}}.sk-num{width:55%;height:1.4rem;margin:.1rem 0 .35rem}.sk-card{border-top:1px solid var(--color-border);flex-direction:column;gap:.55rem;padding:1.1rem .2rem;display:flex}.sk-card:first-child{border-top:none}.sk-line{border-radius:2px;height:.8rem}.sk-line.w40{width:40%}.sk-line.w70{width:70%}.sk-line.w90{width:90%}.progress{background:var(--color-accent);z-index:100;width:0;height:2px;transition:width .1s linear;position:fixed;top:0;left:0}.back-top{border:1px solid var(--color-border);background:var(--color-background);width:2.5rem;height:2.5rem;color:var(--color-secondary);cursor:pointer;opacity:0;pointer-events:none;transition:opacity .3s var(--ease), border-color .2s var(--ease), color .2s var(--ease), transform .2s var(--ease);z-index:50;border-radius:50%;justify-content:center;align-items:center;display:flex;position:fixed;bottom:1.4rem;right:1.4rem}.back-top svg{width:2rem;height:2rem;transition:transform .2s var(--ease)}.back-top.show{opacity:1;pointer-events:auto}.back-top.hide{opacity:0;pointer-events:none}.back-top:hover{border-color:var(--color-accent);color:var(--color-accent);transform:translateY(-2px)}.back-top:hover svg{transform:translateY(-1.5px)}.link-draw{color:var(--color-primary);background-image:linear-gradient(var(--color-accent), var(--color-accent));transition:background-size .25s var(--ease), color .2s var(--ease);background-position:0 100%;background-repeat:no-repeat;background-size:0% 1px;text-decoration:none}.link-draw:hover{background-size:100% 1px}.js-ready .reveal{opacity:0;transition:opacity .4s var(--ease), transform .4s var(--ease);transform:translateY(8px)}.js-ready .reveal.visible{opacity:1;transform:none}@keyframes rowIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}.site-header{border-bottom:1px solid var(--color-border);min-height:var(--header-h);justify-content:space-between;align-items:center;gap:1rem;padding:.8rem 1.5rem;display:flex}.masthead{white-space:nowrap;align-items:center;margin:0;display:flex}.masthead a{color:var(--color-primary);font-family:var(--font-display);letter-spacing:.08rem;align-items:center;gap:.5rem;font-size:clamp(1.05rem,2vw,1.2rem);font-weight:600;line-height:1;text-decoration:none;display:inline-flex}.masthead .logo-mark{flex:none}.masthead .logo-dark,:root[data-theme=dark] .masthead .logo-light{display:none}:root[data-theme=dark] .masthead .logo-dark{display:inline-block}.site-nav{letter-spacing:.12em;text-transform:uppercase;align-items:center;gap:1.5rem;font-size:.875rem;display:flex}.site-nav a{color:var(--color-secondary);transition:color .2s var(--ease);padding:2px 0;text-decoration:none;position:relative}.site-nav a:after{content:"";background:var(--color-accent);transform-origin:0;width:100%;height:2px;transition:transform .3s var(--ease);position:absolute;bottom:0;left:0;transform:scaleX(0)}.site-nav a:hover:after,.site-nav a[aria-current=page]:after{transform:scaleX(1)}.site-nav a:hover,.site-nav a[aria-current=page]{color:var(--color-accent-text)}.nav-drop{align-items:center;display:inline-flex;position:relative}.nav-drop-chevron{transition:transform .3s var(--ease)}.nav-drop:hover .nav-drop-chevron,.nav-drop:focus-within .nav-drop-chevron{transform:rotate(180deg)}.nav-drop-menu{top:calc(100% + var(--nav-drop-gap));left:calc(-1 * var(--nav-drop-pad-x));background:var(--color-background);border:1px solid var(--color-border);z-index:50;opacity:0;visibility:hidden;transition:opacity .25s var(--ease), transform .25s var(--ease), visibility 0s linear .25s;border-radius:12px;padding:.35rem .2rem;position:absolute;transform:translateY(-6px);box-shadow:0 12px 32px -12px #0000002e}.nav-drop:hover .nav-drop-menu,.nav-drop:focus-within .nav-drop-menu{opacity:1;visibility:visible;transition:opacity .25s var(--ease), transform .25s var(--ease), visibility 0s;transform:translateY(0)}.nav-drop-menu:before{content:"";height:var(--nav-drop-gap);position:absolute;bottom:100%;left:0;right:0}.nav-drop-menu a{padding:.6rem var(--nav-drop-pad-x);color:var(--color-secondary);letter-spacing:.05em;text-transform:uppercase;white-space:nowrap;font-size:.875rem;display:block}.nav-drop-menu a:after{display:none}.nav-drop-menu a span{padding-bottom:.25rem;display:inline-block;position:relative}.nav-drop-menu a span:after{content:"";background:var(--color-accent);transform-origin:0;width:100%;height:2px;transition:transform .3s var(--ease);position:absolute;bottom:0;left:0;transform:scaleX(0)}.nav-drop-menu a:hover span:after,.nav-drop-menu a[aria-current=page] span:after{transform:scaleX(1)}.nav-drop-menu a[aria-current=page]{color:var(--color-accent-text)}.nav-drop:hover>a:after,.nav-drop:focus-within>a:after{transform:scaleX(1)}.nav-toggle{border:1px solid var(--color-border);cursor:pointer;width:2.2rem;height:2.2rem;color:var(--color-primary);transition:border-color .2s var(--ease), color .2s var(--ease), background .2s var(--ease), transform .2s var(--ease);background:0 0;border-radius:999px;padding:0;display:none}.nav-toggle:hover{border-color:var(--color-primary);background:var(--color-muted)}.nav-toggle:active{transform:scale(.94)}.nav-toggle[aria-expanded=true]{border-color:var(--color-primary);background:var(--color-muted)}.js-ready .nav-toggle{justify-content:center;align-items:center;display:flex}.nav-toggle svg path{transform-box:fill-box;transform-origin:50%;transition:transform .35s var(--ease), opacity .3s var(--ease)}.nav-toggle[aria-expanded=true] .h-l1{transform:translateY(5px)rotate(45deg)}.nav-toggle[aria-expanded=true] .h-l2{opacity:0}.nav-toggle[aria-expanded=true] .h-l3{transform:translateY(-5px)rotate(-45deg)}.js-ready .site-header.compact .site-nav,.nav-overlay{display:none}.js-ready .nav-overlay{z-index:140;opacity:0;visibility:hidden;transition:opacity .25s var(--ease), visibility .25s;background:#0006;display:block;position:fixed;inset:0}.js-ready .nav-overlay.open{opacity:1;visibility:visible}.nav-drawer{display:none}.js-ready .nav-drawer{z-index:150;background:var(--color-background);border-left:1px solid var(--color-border);visibility:hidden;width:min(280px,85vw);height:100dvh;transition:transform .3s var(--ease), visibility 0s .3s;flex-direction:column;display:flex;position:fixed;top:0;right:0;transform:translate(100%)}.js-ready .nav-drawer.open{visibility:visible;transition:transform .3s var(--ease), visibility 0s;transform:none}.nav-drawer-head{min-height:var(--header-h);border-bottom:1px solid var(--color-border);justify-content:center;align-items:center;padding:.8rem 1.2rem;display:flex}.nav-drawer-close{border:1px solid var(--color-border);width:2.2rem;height:2.2rem;color:var(--color-secondary);cursor:pointer;transition:border-color .2s var(--ease), color .2s var(--ease);background:0 0;border-radius:999px;justify-content:center;align-items:center;padding:0;display:inline-flex}.nav-drawer-close:hover{border-color:var(--color-primary);color:var(--color-primary);background:var(--color-muted)}.js-ready .nav-drawer .site-nav{flex-direction:column;align-items:stretch;gap:0;padding:.6rem 1.2rem 1.2rem;display:flex}.js-ready .nav-drawer .site-nav a{color:var(--color-primary);border-bottom:1px solid var(--color-border);padding:.8rem .3rem;font-size:1rem}.js-ready .nav-drawer .site-nav a:before{content:"→";opacity:0;color:var(--color-accent-text);transition:opacity .2s var(--ease), transform .2s var(--ease);position:absolute;top:50%;right:.4rem;transform:translateY(-50%)translate(-6px)}.js-ready .nav-drawer .site-nav a:hover:before{opacity:1;transform:translateY(-50%)translate(0)}.js-ready .nav-drawer .site-nav a:last-child{border-bottom:none}.js-ready .nav-drawer .site-nav a:after{height:2px}.js-ready .nav-drawer .nav-group-children a:after{width:calc(100% - 1.6rem);left:1.3rem}.js-ready .nav-drawer .site-nav a:hover,.js-ready .nav-drawer .site-nav a[aria-current=page]{color:var(--color-accent-text)}.js-ready .nav-drawer.open .site-nav a{animation:rowIn .4s var(--ease) both}.js-ready .nav-drawer.open .site-nav a:nth-child(2){animation-delay:90ms}.js-ready .nav-drawer.open .site-nav a:nth-child(4){animation-delay:.27s}.js-ready .nav-drawer .nav-group{border-bottom:1px solid var(--color-border)}.js-ready .nav-drawer .nav-group-toggle{cursor:pointer;width:100%;color:var(--color-primary);font:inherit;letter-spacing:.12em;text-transform:uppercase;transition:color .2s var(--ease);background:0 0;border:none;justify-content:space-between;align-items:center;padding:.8rem .3rem;font-size:1rem;display:flex}.js-ready .nav-drawer .nav-group-toggle:hover{color:var(--color-accent-text)}.js-ready .nav-drawer .nav-group-toggle{position:relative}.js-ready .nav-drawer .nav-group-toggle:after{content:"";background:var(--color-accent);transform-origin:0;width:100%;height:2px;transition:transform .3s var(--ease);position:absolute;bottom:0;left:0;transform:scaleX(0)}.js-ready .nav-drawer .nav-group-toggle:hover:after,.js-ready .nav-drawer .nav-group-toggle.teaching-active:after{transform:scaleX(1)}.js-ready .nav-drawer .nav-group-chevron{transition:transform .3s var(--ease);flex:none}.js-ready .nav-drawer .nav-group-toggle[aria-expanded=true] .nav-group-chevron{transform:rotate(180deg)}.js-ready .nav-drawer .nav-group-children{display:none}.js-ready .nav-drawer .nav-group-children.open{display:block}.js-ready .nav-drawer .nav-group-children.open a{animation:rowIn .3s var(--ease) both}.js-ready .nav-drawer .nav-group-children.open a:nth-child(2){animation-delay:60ms}.js-ready .nav-drawer .nav-group-children.open a:nth-child(3){animation-delay:.12s}.js-ready .nav-drawer .nav-group-children a{color:var(--color-secondary);border-bottom:none;padding:.7rem .3rem .7rem 1.3rem;font-size:.9375rem;display:block}.js-ready .nav-drawer .nav-group-children a:hover,.js-ready .nav-drawer .nav-group-children a[aria-current=page]{color:var(--color-accent-text)}.home-top{min-height:calc(100vh - var(--header-h));min-height:calc(100dvh - var(--header-h));flex-direction:column;justify-content:center;display:flex;position:relative}.home-top #about{padding-bottom:4.5rem}.scroll-hint{flex-direction:column;align-items:center;gap:.6rem;display:flex;position:absolute;bottom:12px;left:50%;transform:translate(-50%)}.scroll-line{background:var(--color-border);width:2px;height:3.2rem;position:relative;overflow:hidden}.scroll-dot{background:var(--color-accent);width:5px;height:5px;animation:scrollDot 2s var(--ease) infinite;border-radius:50%;position:absolute;top:0;left:-1.5px}.scroll-dot:after{content:"";background:linear-gradient(to top, var(--color-accent), transparent);width:2px;height:14px;position:absolute;bottom:4px;left:50%;transform:translate(-50%)}@keyframes scrollDot{0%{opacity:1;top:0}70%{opacity:.5;top:calc(100% - 5px)}to{opacity:0;top:calc(100% - 5px)}}.scroll-text{letter-spacing:.24em;text-transform:uppercase;color:var(--color-secondary);font-size:.75rem}.hero{text-align:center;padding:3.2rem 1.5rem 2.6rem}.hero-title{font-family:var(--font-display);letter-spacing:0;margin:2rem 0 0;font-size:clamp(2.8rem,8vw,5.5rem);font-weight:600;line-height:1.15}.hero-title .word{opacity:0;animation:letterIn .5s var(--ease) forwards;display:inline-block;transform:translateY(14px)}@keyframes letterIn{to{opacity:1;transform:none}}.hero-tagline{font-family:var(--font-display);letter-spacing:.08em;color:var(--color-secondary);margin:1.5rem auto 0;font-size:clamp(1.3rem,2.8vw,1.8rem);font-style:italic;display:inline-block;position:relative}.hero-tagline:after{content:"";background:var(--color-accent);transform-origin:0;height:1px;animation:drawLine .5s .45s var(--ease) forwards;position:absolute;bottom:-10px;left:0;right:0;transform:scaleX(0)}@keyframes drawLine{to{transform:scaleX(1)}}.section{max-width:var(--max-width);margin:0 auto;padding:3rem 1.5rem}.section-head{border-bottom:1px solid var(--color-border);justify-content:space-between;align-items:baseline;margin-bottom:1.6rem;padding-bottom:.7rem;display:flex}.section-title{font-family:var(--font-display);letter-spacing:.06em;margin:0;font-size:1.4rem;font-weight:500}.page-head{text-align:center;padding:2.5rem 1.5rem 0}.page-title{font-family:var(--font-display);margin:0;font-size:clamp(1.75rem,3.5vw,2.5rem);font-weight:600;line-height:1.15}.page-head+.section{padding-top:2.5rem}.about-copy{max-width:var(--content-width);text-align:center;margin:0 auto}.home-top .section{width:100%}.about-headline{width:100%;max-width:var(--content-width);flex-wrap:wrap;justify-content:center;align-items:center;gap:.9rem;margin:3.5rem auto 1.6rem;display:flex}.about-headline:before,.about-headline:after{content:"";background:var(--color-border);flex:1;height:1px}.ah-name{font-family:var(--font-display);text-transform:uppercase;flex:none;font-size:1.5rem;font-weight:600;line-height:1.15}.ah-role{font-family:var(--font-display);color:var(--color-accent-text);flex:none;font-size:1.35rem;font-style:italic;font-weight:500}@media (width<=768px){.about-headline:before,.about-headline:after{display:none}.about-headline{margin-top:1.9rem}.ah-name{font-size:1.4rem}.ah-role{font-size:1.25rem}}.about-tags{flex-direction:column;align-items:center;gap:1rem;margin-top:2.4rem;display:flex}.at{text-align:center;margin:0;line-height:1.3}.at-traits{font-family:var(--font-body);letter-spacing:.12em;text-transform:uppercase;color:var(--color-secondary);font-size:.9rem;font-weight:500}.at-sep{color:var(--color-secondary);margin:0 .7em}.type-tag{letter-spacing:.06em;color:var(--color-primary);white-space:nowrap;font-size:.875rem;display:inline-block}.product-grid{grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:2.4rem 2rem;display:grid}.product-card{text-align:center;border:1px solid var(--color-border);transition:transform .25s var(--ease), box-shadow .25s var(--ease), border-color .25s var(--ease);animation:rowIn .4s var(--ease) both;border-radius:6px;flex-direction:column;align-items:center;gap:1rem;padding:1.8rem 1.8rem 1.6rem;display:flex;position:relative}.product-grid:has(.product-card:only-child) .product-card{max-width:520px;margin-inline:auto}.product-body{width:100%}.product-card:hover{border-color:var(--color-secondary);box-shadow:0 4px 8px -4px #09090b66}.product-name{font-family:var(--font-display);margin:0 0 .35rem;font-size:1.6rem;font-weight:600}.product-icon{object-fit:contain;flex:none;width:100%;height:7.5rem;padding:.5rem 1.5rem}.product-tagline{color:var(--color-secondary);margin:0 0 .5rem}.product-desc{color:var(--color-secondary);margin:0 0 1rem}.product-actions{margin-top:.2rem;gap:.6rem;width:100%;max-width:360px;margin-inline:auto;display:flex}.product-btn{border:1px solid var(--color-border);color:var(--color-secondary);font:inherit;letter-spacing:.04em;cursor:pointer;transition:color .2s var(--ease), border-color .2s var(--ease), background .2s var(--ease);background:0 0;border-radius:6px;flex:1;justify-content:center;align-items:center;gap:.45rem;padding:.35rem .6rem;font-size:1rem;text-decoration:none;display:inline-flex}.product-btn:hover{border-color:var(--color-primary);color:var(--color-primary)}.product-btn.active{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-background)}.product-btn svg{flex:none}.gh-stars{font-variant-numeric:tabular-nums;align-items:center;gap:.4rem;display:inline-flex}.product-panel{transition:grid-template-rows .3s var(--ease);grid-template-rows:0fr;width:100%;display:grid}.product-panel.open{grid-template-rows:1fr}.product-panel-inner{min-width:0;overflow:hidden}.panel-box{border:1px solid var(--color-border);text-align:left;border-radius:6px;margin-top:.9rem;padding:.9rem 1rem 1rem;font-size:1rem}.panel-box .file-meta{font-size:.875rem}.panel-ver{font-family:var(--font-display);letter-spacing:.03em;color:var(--color-primary);align-items:baseline;gap:.6rem;margin:0 0 .5rem;font-size:1rem;font-weight:600;display:flex}.panel-ver .panel-date{font-family:var(--font-body);color:var(--color-secondary);font-size:.875rem;font-weight:400}.chg-inner,.upd-content{color:var(--color-secondary);max-width:var(--content-width);margin:0 0 .3rem;font-size:1rem;line-height:1.8}.chg-inner p,.upd-content p{margin:0 0 .3rem}.chg-inner .chg-h,.upd-content .chg-h{font-family:var(--font-display);color:var(--color-primary);margin:.5rem 0 .25rem;font-size:1rem;font-weight:600}.chg-inner code,.upd-content code{background:var(--color-muted);border-radius:3px;padding:.1em .3em;font-family:ui-monospace,Consolas,Courier New,monospace;font-size:.875em}.chg-inner ul,.chg-inner ol,.upd-content ul,.upd-content ol{margin:0 0 .3rem;padding-left:1.25rem}.chg-inner li,.upd-content li{margin:0 0 .2rem}.chg-inner li::marker,.upd-content li::marker{color:var(--color-accent)}.panel-empty{color:var(--color-secondary);padding:.5rem .1rem .2rem;font-size:1rem}.file-row{border-top:1px solid var(--color-border);color:var(--color-foreground);animation:rowIn .3s var(--ease) both;flex-wrap:wrap;align-items:center;gap:1rem;padding:.75rem .2rem;text-decoration:none;display:flex}.file-row:first-child{border-top:none}.file-audio{flex:100%;order:10;align-items:center;gap:.6rem;padding-top:.45rem;display:flex}.file-audio[hidden]{display:none}.file-audio:not([hidden]){animation:playerIn .25s var(--ease)}@keyframes playerIn{0%{opacity:0;transform:translateY(-6px)}}.file-audio.closing{opacity:0;transition:opacity .2s var(--ease), transform .2s var(--ease);transform:translateY(-6px)}.file-audio audio{display:none}.audio-toggle{border:1px solid var(--color-border);background:var(--color-background);width:2rem;height:2rem;color:var(--color-primary);cursor:pointer;transition:all .3s var(--ease);border-radius:50%;flex:none;justify-content:center;align-items:center;display:inline-flex;position:relative}.audio-toggle:hover{border-color:var(--color-primary);color:var(--color-primary)}.audio-toggle.active{background:var(--color-primary);color:var(--color-background);border-color:var(--color-primary)}.audio-ic-play,.audio-ic-pause{transition:opacity .3s var(--ease);position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.audio-ic-pause,.audio-toggle.active .audio-ic-play{opacity:0}.audio-toggle.active .audio-ic-pause{opacity:1}.audio-range{cursor:pointer;appearance:none;background:0 0;flex:1;min-width:0;height:1rem;margin:0}.audio-range::-webkit-slider-runnable-track{background:linear-gradient(to right, var(--color-primary) var(--p,0%), var(--color-muted) var(--p,0%));border-radius:999px;height:4px}.audio-range::-webkit-slider-thumb{-webkit-appearance:none;background:var(--color-accent);border:none;border-radius:50%;width:12px;height:12px;margin-top:-4px;box-shadow:0 1px 3px #00000040}.audio-range::-moz-range-track{background:var(--color-muted);border-radius:999px;height:4px}.audio-range::-moz-range-progress{background:var(--color-primary);border-radius:999px;height:4px}.audio-range::-moz-range-thumb{background:var(--color-accent);border:none;border-radius:50%;width:12px;height:12px;box-shadow:0 1px 3px #00000040}.audio-time{color:var(--color-secondary);letter-spacing:.04em;flex:none;font-size:.875rem}.audio-seek{border:1px solid var(--color-border);background:var(--color-background);width:2rem;height:2rem;color:var(--color-primary);cursor:pointer;transition:all .3s var(--ease);border-radius:50%;flex:none;justify-content:center;align-items:center;display:inline-flex}.audio-seek:hover{border-color:var(--color-primary);color:var(--color-primary)}.audio-seek svg{flex:none;width:1rem;height:1rem}.file-icon{color:var(--color-secondary);flex:none;align-items:center;gap:3px;display:inline-flex}.file-ext{letter-spacing:.04em;font-size:.75rem}.file-name{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.file-meta{color:var(--color-secondary);flex:none;font-size:.875rem}.file-actions{flex:none;align-items:center;gap:.5rem;display:inline-flex}.dl-btn{border:1px solid var(--color-border);background:var(--color-background);width:2rem;height:2rem;color:var(--color-primary);cursor:pointer;transition:all .3s var(--ease);border-radius:50%;flex:none;justify-content:center;align-items:center;text-decoration:none;display:inline-flex;position:relative}.dl-btn svg{flex:none;width:1rem;height:1rem}.dl-btn:hover{border-color:var(--color-primary);color:var(--color-primary)}.dl-btn.active{background:var(--color-primary);color:var(--color-background);border-color:var(--color-primary)}.dl-btn .dl-ic-play,.dl-btn .dl-ic-pause{transition:opacity .3s var(--ease);position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.dl-btn .dl-ic-pause,.dl-btn.active .dl-ic-play{opacity:0}.dl-btn.active .dl-ic-pause{opacity:1}.dash-toggle{background:var(--color-muted);border:1px solid var(--color-border);cursor:pointer;width:100%;font:inherit;color:var(--color-primary);transition:border-color .2s var(--ease), color .2s var(--ease);border-radius:6px;justify-content:space-between;align-items:center;margin-top:1.2rem;padding:.7rem 1.1rem;display:flex}.dash-toggle:hover{border-color:var(--color-secondary)}.dash-toggle-title{font-family:var(--font-display);letter-spacing:.05em;align-items:center;gap:.5rem;font-size:1.125rem;font-weight:500;display:inline-flex}.dash-toggle-title svg{color:var(--color-accent);flex:none}.dash-toggle-summary{letter-spacing:.05em;color:var(--color-accent-text);text-overflow:ellipsis;white-space:nowrap;margin-left:auto;padding:0 .9rem;font-size:.875rem;overflow:hidden}.dash-toggle-summary[hidden]{display:none}.dash-toggle-chevron{transition:transform .3s var(--ease);color:var(--color-accent);align-items:center;display:inline-flex}.dash-toggle-chevron svg{width:16px;height:16px}.dash-toggle.active .dash-toggle-chevron{transform:rotate(90deg)}.dash-body{opacity:0;height:0;transition:height .45s var(--ease), opacity .35s var(--ease);overflow:hidden}.dash-body.open{opacity:1;height:auto;margin-top:1.2rem}.dash-body.expand{transition:height .75s var(--ease-bounce), opacity .35s var(--ease)}.dash-body.anim .dash-body-inner>*{animation:dashItem .45s var(--ease) both}.dash-body.anim .dash-body-inner>:first-child{animation-delay:0s}.dash-body.anim .dash-body-inner>:nth-child(2){animation-delay:80ms}.dash-body.anim .dash-body-inner>:nth-child(3){animation-delay:.16s}.dash-body.anim .dash-body-inner>:nth-child(4){animation-delay:.24s}@keyframes dashItem{0%{opacity:0;transform:translateY(10px)}}.dash-body-inner{min-width:0}.dash-body .stat-grid{margin-top:0}.stat-grid{background:var(--color-border);border:1px solid var(--color-border);grid-template-columns:repeat(4,1fr);gap:1px;margin:1.6rem 0;display:grid}.stat-card{background:var(--color-background);text-align:center;padding:1.3rem 1rem}.stat-value{font-family:var(--font-display);color:var(--color-primary);font-variant-numeric:tabular-nums;margin:0;font-size:2.1rem;font-weight:600;line-height:1.2}.stat-label{letter-spacing:.12em;color:var(--color-secondary);margin:.25rem 0 0;font-size:.875rem}.filter-bar{flex-wrap:wrap;align-items:center;gap:.5rem 1.2rem;margin:1.2rem 0;font-size:.875rem;display:flex}.filter-bar .rec-filter{color:var(--color-secondary);letter-spacing:.08em;align-items:center;gap:.4rem;display:inline-flex}select{font:inherit;background:var(--color-background);border:1px solid var(--color-border);color:var(--color-primary);border-radius:999px;padding:.28rem .9rem;font-size:.875rem}select:focus{outline:2px solid var(--color-accent)}option{background:var(--color-background);color:var(--color-primary)}option:checked{background:var(--color-accent);color:var(--color-background)}.chips{flex-wrap:wrap;gap:.5rem;min-height:1.4rem;margin:.6rem 0;display:flex}.chip{border:1px solid var(--color-accent);color:var(--color-accent-text);font:inherit;cursor:pointer;transition:background .2s var(--ease), color .2s var(--ease);background:0 0;border-radius:999px;align-items:center;gap:.45rem;padding:.14rem .7rem;font-size:.875rem;display:inline-flex}.chip:hover{background:var(--color-accent-text);color:var(--color-background)}.charts-grid{grid-template-columns:1fr 1fr;gap:2.2rem;margin:.8rem 0;display:grid}.chart-box{padding-top:0}.chart-box h2{font-family:var(--font-display);letter-spacing:.05em;margin:0 0 .6rem;font-size:1.125rem;font-weight:500}.chart-hint{letter-spacing:.04em;color:var(--color-secondary);font-size:.75rem;font-weight:400;font-family:var(--font-body);margin-left:.7rem}.chart-hint[hidden]{display:none}.chart-canvas{width:100%;height:280px}.bar-legend{justify-content:center;align-items:center;gap:1.2rem;margin:0 0 .4rem;padding:.2rem 0;display:flex}.bar-legend-item{cursor:pointer;font:inherit;color:var(--color-secondary);transition:opacity .2s var(--ease), background .2s var(--ease);background:0 0;border:none;border-radius:4px;align-items:center;gap:.4rem;padding:.15rem .45rem;font-size:.875rem;display:inline-flex}.bar-legend-item:hover{background:var(--color-muted)}.bar-legend-item.off{opacity:.4}.bar-legend-dot{border-radius:50%;flex-shrink:0;width:.55rem;height:.55rem}.pie-box{margin:0 0 1.8rem;padding-top:1rem}.pie-toolbar{flex-wrap:wrap;align-items:center;gap:1rem;margin-bottom:.4rem;display:flex}.pie-box h2{font-family:var(--font-display);letter-spacing:.05em;margin:0;font-size:1.125rem;font-weight:500}.dim-btn{border:1px solid var(--color-border);color:var(--color-secondary);font:inherit;letter-spacing:.08em;cursor:pointer;transition:all .2s var(--ease);background:0 0;border-radius:2px;padding:.3rem .5rem;font-size:1rem}.dim-btn.active{border-color:var(--color-primary);background:var(--color-primary);color:var(--color-background)}.dim-select{display:none}.list-meta{color:var(--color-secondary);justify-content:space-between;align-items:baseline;margin:1.2rem 0 .4rem;font-size:.875rem;display:flex}.log-card-list{margin-top:.4rem}.log-card-list .log-card:first-child{border-top:none}.log-card{border-top:1px solid var(--color-border);animation:rowIn .35s var(--ease) both;padding:1.5rem .2rem 1.7rem}.log-card-head{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:1rem 1.4rem;margin-bottom:1rem;display:flex}.log-card-date{font-family:var(--font-display);font-size:1.25rem;font-weight:600}.log-card-weekday{color:var(--color-secondary);margin-left:.6rem;font-size:.875rem;font-weight:400}.log-card-meta{color:var(--color-secondary);flex-wrap:wrap;align-items:center;gap:.9rem;font-size:.875rem;display:flex}.log-card-class{color:var(--color-primary);font-weight:600}.log-card-section{margin-bottom:1.1rem}.log-card-section:last-child{margin-bottom:0}.log-card-label{letter-spacing:.08rem;text-transform:uppercase;color:var(--color-accent-text);margin:0 0 .45rem;font-size:.875rem}.log-card-text{margin:0;font-size:1rem;line-height:1.8}.empty-note{color:var(--color-secondary);padding:1rem .2rem}.pager{flex-wrap:wrap;justify-content:center;align-items:center;gap:.4rem;margin:1.6rem 0 .4rem;display:none}.pager.show{display:flex}.page-btn{border:1px solid var(--color-border);min-width:2.1rem;color:var(--color-secondary);font:inherit;letter-spacing:.05em;cursor:pointer;transition:all .2s var(--ease);background:0 0;border-radius:2px;padding:.32rem .6rem;font-size:.875rem}.page-btn:hover:not(:disabled):not(.active){border-color:var(--color-primary);color:var(--color-primary)}.page-btn.active{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-background)}.page-btn:disabled{opacity:.35;cursor:default;pointer-events:none}.page-ellipsis{color:var(--color-secondary);padding:0 .2rem;font-size:.875rem}button.add-log-btn{border-color:var(--color-primary);background:var(--color-primary);color:var(--color-background);transition:background .2s var(--ease), transform .2s var(--ease), box-shadow .2s var(--ease);border-radius:999px;align-items:center;padding:.32rem 1.1rem;font-size:.875rem;display:inline-flex;box-shadow:0 1px 2px #00000014}button.add-log-btn:hover{background:var(--color-primary);color:var(--color-background);transform:translateY(-1px);box-shadow:0 3px 10px #00000026}button.add-log-btn:active{transform:translateY(0);box-shadow:0 1px 2px #00000014}.log-card-del-wrap{align-items:center;gap:.15rem;margin-left:.2rem;display:inline-flex}.log-card-edit,.log-card-del{width:1.7rem;height:1.7rem;color:var(--color-secondary);cursor:pointer;font:inherit;white-space:nowrap;transition:color .2s var(--ease), background .2s var(--ease);background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;padding:0;font-size:.875rem;display:inline-flex}.log-card-edit:hover{color:var(--color-accent-text);background:var(--color-muted)}.log-card-del:hover{color:var(--color-destructive);background:var(--color-muted)}.modal.form-modal{text-align:left;flex-direction:column;width:100%;max-width:480px;max-height:88vh;display:flex}.modal.form-modal form{min-height:0;overflow-y:auto}.modal-title{font-family:var(--font-display);color:var(--color-primary);margin:0 0 .9rem;font-size:1.125rem;font-weight:600}.form-grid{grid-template-columns:1fr 1fr;gap:.7rem .9rem;display:grid}.form-grid label[hidden]{display:none}@media (width<=480px){.form-grid{grid-template-columns:1fr}}.form-grid label{min-width:0;color:var(--color-secondary);letter-spacing:.05em;flex-direction:column;gap:.3rem;font-size:.875rem;display:flex}.form-grid label.full{grid-column:1/-1}.form-grid input,.form-grid select,.form-grid textarea{font:inherit;background:var(--color-background);border:1px solid var(--color-border);width:100%;color:var(--color-primary);border-radius:2px;padding:.34rem .5rem;font-size:1rem}.form-grid textarea{resize:vertical;min-height:3rem;line-height:1.6}.form-grid input:focus,.form-grid select:focus,.form-grid textarea:focus{border-color:var(--color-accent);outline:2px solid var(--color-accent);outline-offset:-2px}.pwd-wrap{position:relative}.pwd-wrap input{padding-right:2.3rem}.pwd-eye{color:var(--color-secondary);cursor:pointer;transition:color .2s var(--ease);background:0 0;border:none;border-radius:2px;justify-content:center;align-items:center;padding:.3rem;display:inline-flex;position:absolute;top:50%;right:.15rem;transform:translateY(-50%)}.pwd-eye:hover{color:var(--color-primary)}.pwd-eye .eye-open{display:none}.pwd-eye .eye-off,.pwd-eye.visible .eye-open{display:inline-flex}.pwd-eye.visible .eye-off{display:none}.form-actions{background:var(--color-background);align-items:center;gap:.7rem;margin-top:.5rem;padding-top:.7rem;display:flex;position:sticky;bottom:0}.form-error{color:var(--color-accent-text);margin:.4rem 0 0;font-size:.875rem}.ghost-btn{border:1px solid var(--color-border);color:var(--color-secondary);font:inherit;letter-spacing:.08em;cursor:pointer;transition:all .2s var(--ease);background:0 0;border-radius:2px;padding:.4rem 1.3rem;font-size:1rem}.ghost-btn:hover{border-color:var(--color-primary);color:var(--color-primary)}.acc-toolbar{z-index:40;background:var(--color-background);border-bottom:1px solid var(--color-border);color:var(--color-secondary);justify-content:space-between;align-items:center;margin-bottom:.8rem;padding:.4rem 0;font-size:.875rem;display:flex;position:sticky;top:0}.acc-actions{align-items:center;gap:.5rem;display:inline-flex}button.pill-btn{border-radius:999px}.acc-actions .pill-btn{letter-spacing:.05em;padding:.28rem .9rem;font-size:.875rem}.dl-filters{flex-wrap:wrap;align-items:center;gap:.5rem;margin:0 0 1.2rem;display:flex}.dl-subs{flex-wrap:wrap;gap:.5rem;display:flex}.dl-subs[hidden]{display:none}.acc+.acc{border-top:1px solid var(--color-border)}.dl-empty{color:var(--color-secondary);margin:0;padding:1.2rem .2rem;font-size:.875rem}.acc-head{cursor:pointer;text-align:left;width:100%;font-family:var(--font-display);letter-spacing:.04em;color:var(--color-primary);transition:color .2s var(--ease);background:0 0;border:none;justify-content:space-between;align-items:center;padding:1.15rem .2rem;font-size:1.35rem;font-weight:500;display:flex}.acc-head:hover{color:var(--color-accent-text)}.acc-chevron{transition:transform .3s var(--ease);color:var(--color-accent);align-items:center;display:inline-flex}.acc-chevron svg{width:16px;height:16px}.acc.open>.acc-head>.acc-chevron{transform:rotate(90deg)}.acc-body{display:none}.acc.open>.acc-body{display:block}.acc-sub{padding-left:1.6rem}.acc-sub .acc-head{padding:.7rem .2rem;font-size:1.125rem}.acc-sub .file-row{padding:.65rem .2rem}.upd-list{flex-direction:column;display:flex}.upd-card{border-top:1px solid var(--color-border);animation:rowIn .3s var(--ease) both;padding:1.2rem .2rem}.upd-card:first-child{border-top:none}.upd-head{justify-content:space-between;align-items:baseline;gap:1rem;margin-bottom:.35rem;display:flex}.upd-date{color:var(--color-secondary);font-size:.875rem}.upd-title{font-family:var(--font-display);color:var(--color-primary);margin:0;font-size:1.125rem;font-weight:600}.upd-link{font-size:1rem}.teach-nav{flex-wrap:wrap;gap:.5rem;margin:0 0 1.6rem;display:flex}.teach-nav-item{border:1px solid var(--color-border);color:var(--color-secondary);font:inherit;letter-spacing:.05em;transition:all .2s var(--ease);background:0 0;border-radius:999px;padding:.28rem 1rem;font-size:.875rem;text-decoration:none}.teach-nav-item:hover{border-color:var(--color-primary);color:var(--color-primary)}.teach-nav-item.active{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-background)}.upd-filters{flex-wrap:wrap;gap:.5rem;margin-bottom:1.2rem;display:flex}.js-only{display:none}.js-ready .js-only{display:inline-flex}.js-ready select.no-js{display:none}.dd{position:relative}.dd-btn{font:inherit;letter-spacing:.05em;border:1px solid var(--color-border);background:var(--color-background);color:var(--color-primary);cursor:pointer;transition:border-color .2s var(--ease), color .2s var(--ease), background .2s var(--ease), transform .25s var(--ease);border-radius:999px;align-items:center;gap:.35rem;padding:.28rem .9rem;font-size:.875rem;display:inline-flex}.dd-btn[aria-expanded=true]{background:var(--color-primary);color:var(--color-background);border-color:var(--color-primary);transform:scaleY(1.04)}.dd-btn .dd-chev{transition:transform .3s var(--ease)}.dd-btn[aria-expanded=true] .dd-chev{transform:rotate(180deg)}.dd-menu{transform-origin:top;background:var(--color-muted);border:1px solid var(--color-border);z-index:60;border-radius:12px;width:max-content;min-width:100%;max-width:min(100vw - 2rem,22rem);padding:.35rem .3rem;animation:.35s cubic-bezier(.34,1.56,.64,1) ddPop;position:absolute;top:calc(100% + 6px);left:0;box-shadow:0 12px 32px -12px #0000002e}@keyframes ddPop{0%{opacity:0;transform:scaleY(0)}70%{opacity:1;transform:scaleY(1.03)}to{opacity:1;transform:scaleY(1)}}.footer-right .dd-menu{transform-origin:bottom;top:auto;bottom:calc(100% + 6px)}@media (prefers-reduced-motion:reduce){.dd-menu{animation:none}.dd-btn[aria-expanded=true]{transform:none}}.dd-opt{text-align:left;width:100%;font:inherit;letter-spacing:.05em;cursor:pointer;color:var(--color-primary);transition:color .2s var(--ease), background .2s var(--ease);background:0 0;border:none;border-radius:6px;margin:.3rem 0;padding:.45rem .8rem;font-size:.875rem;display:block}.dd-opt:hover,.dd-opt:focus-visible{background:var(--color-primary);color:var(--color-background);outline:none}.upd-chip{border:1px solid var(--color-border);color:var(--color-secondary);font:inherit;letter-spacing:.05em;cursor:pointer;transition:all .2s var(--ease);background:0 0;border-radius:999px;padding:.25rem .9rem;font-size:.875rem}.upd-chip:hover{border-color:var(--color-primary);color:var(--color-primary)}.upd-chip.active{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-background)}.upd-more{margin:1.2rem auto 0;display:block}.upd-more[hidden]{display:none}.asg-list{flex-direction:column;display:flex}.asg-card{border-top:1px solid var(--color-border);animation:rowIn .3s var(--ease) both;padding:1.2rem .2rem}.asg-card:first-child{border-top:none}.asg-head{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:.8rem;display:flex}.asg-title{font-family:var(--font-display);color:var(--color-primary);margin:0;font-size:1.125rem;font-weight:600}.asg-meta{flex:none;align-items:center;gap:.6rem;display:flex}.asg-class{letter-spacing:.03em;background:var(--color-secondary);color:var(--color-background);border-radius:999px;padding:.1rem .5rem;font-size:.75rem;display:inline-block}.asg-class+.asg-class{margin-left:.3rem}.asg-pub{color:var(--color-secondary);margin:.3rem 0 .6rem;font-size:.875rem;display:block}.asg-time{align-items:baseline;gap:1rem;margin:.3rem 0 .6rem;display:flex}.asg-time .asg-pub:not(.asg-due){opacity:.75;margin:0}.asg-due{color:var(--color-primary);font-weight:500}.asg-due.soon{color:var(--color-assignment)}.asg-due.overdue{color:var(--color-destructive)}.asg-items{margin:0 0 .6rem;padding:0;list-style:none}.asg-item{color:var(--color-secondary);padding:.18rem 0;font-size:1rem}.asg-status{font-family:var(--font-body);letter-spacing:.03em;vertical-align:.15em;border-radius:999px;margin-left:.35rem;padding:.1rem .5rem;font-size:.75rem;font-weight:400;display:inline-block}.asg-status.ongoing{background:var(--color-assignment);color:var(--color-background)}.asg-status.finished{color:#fafafa;background:#52525b}.tl-wrap{max-width:var(--content-width);margin:0 auto;padding-left:2.4rem;position:relative}.tl-line{background:var(--color-border);transform-origin:top;width:1px;position:absolute;top:6px;bottom:0;left:4px}.js-ready .tl-line{transition:transform .8s var(--ease);transform:scaleY(0)}.tl-wrap.tl-in .tl-line{transform:scaleY(1)}.tl-item{padding:0 0 2.1rem;position:relative}.tl-item:last-child{padding-bottom:.4rem}.js-ready .tl-item{opacity:0;transition:opacity .6s var(--ease), transform .6s var(--ease);transform:translateY(24px)}.js-ready .tl-item.tl-seen{opacity:1;transition-delay:calc(.2s + var(--i,0) * 60ms);transform:none}.tl-dot{background:var(--color-background);border:1px solid var(--color-accent);border-radius:50%;width:9px;height:9px;position:absolute;top:.42rem;left:-2.4rem}.js-ready .tl-dot{transition:transform .4s var(--ease-bounce);transform:scale(0)}.tl-item.tl-seen .tl-dot{transition-delay:calc(.2s + var(--i,0) * 60ms);transform:scale(1)}.tl-item:last-child .tl-dot{background:var(--color-accent);width:11px;height:11px;top:.38rem;left:calc(-2.4rem - 1px)}.tl-dot:after{content:"";border:1px solid var(--color-accent);opacity:0;border-radius:50%;position:absolute;inset:-4px}.tl-item.tl-seen .tl-dot:after{animation:tlRipple .6s var(--ease) both;animation-delay:calc(.25s + var(--i,0) * 60ms)}@keyframes tlRipple{0%{opacity:.6;transform:scale(.4)}to{opacity:0;transform:scale(1.6)}}.tl-period{font-family:var(--font-display);color:var(--color-accent-text);letter-spacing:.16em;font-size:.95rem;font-style:italic;display:block}.js-ready .tl-period{opacity:0;transition:transform .5s var(--ease), opacity .5s var(--ease), letter-spacing .5s var(--ease);transform:translate(-14px)}.tl-item.tl-seen .tl-period{opacity:1;letter-spacing:.06em;transition-delay:calc(.2s + var(--i,0) * 60ms);transform:none}.tl-title{font-family:var(--font-display);color:var(--color-primary);margin:.25rem 0 .15rem;font-size:1.25rem;font-weight:600}.tl-role{color:var(--color-secondary);margin:0 0 .2rem;font-size:.875rem}.tl-desc{color:var(--color-secondary);margin:0;font-size:1rem}html.no-scrollbar{scrollbar-width:none}html.no-scrollbar::-webkit-scrollbar{display:none}.site-footer{border-top:1px solid var(--color-border);min-height:var(--header-h);color:var(--color-secondary);margin-top:4.5rem;padding:.95rem 1.5rem;font-size:.875rem}.footer-row{flex-wrap:wrap;align-items:center;gap:1.2rem 2rem;display:flex}.footer-left{flex:1;align-items:center;gap:.6rem;display:flex}.footer-icon{border:1px solid var(--color-border);width:2.2rem;height:2.2rem;color:var(--color-secondary);cursor:pointer;transition:color .2s var(--ease), border-color .2s var(--ease);background:0 0;border-radius:50%;justify-content:center;align-items:center;padding:0;text-decoration:none;display:inline-flex}.footer-icon:hover{color:var(--color-accent);border-color:var(--color-accent)}.copyright{text-align:center;letter-spacing:.06em;margin:0;font-size:.875rem}.footer-right{flex-wrap:wrap;flex:1;justify-content:flex-end;align-items:center;gap:1.4rem;display:flex}.footer-right select.no-js{color:var(--color-secondary);cursor:pointer;transition:color .2s var(--ease);background:0 0;border:none;padding:0 .2rem;font-size:.875rem}.footer-right select.no-js:hover{color:var(--color-accent-text)}.footer-right select.no-js:focus{outline:2px solid var(--color-accent);outline-offset:2px;color:var(--color-accent-text)}.modal-overlay{z-index:200;background:#09090b8c;justify-content:center;align-items:flex-start;padding:1.5rem;display:flex;position:fixed;inset:0;overflow-y:auto}.modal-overlay[hidden]{display:none}.modal{background:var(--color-background);text-align:center;width:100%;max-width:320px;animation:rowIn .3s var(--ease) both;border-radius:6px;margin:auto;padding:1.8rem 1.8rem 1.6rem;position:relative;box-shadow:0 24px 60px -24px #09090b73}.modal-qr{border-radius:4px;width:220px;height:220px;margin:0 auto;display:block}.modal-caption{color:var(--color-secondary);margin:1rem 0 0;font-size:1rem}.modal-close{color:var(--color-secondary);cursor:pointer;transition:color .2s var(--ease);background:0 0;border:none;padding:.3rem;font-size:1.35rem;line-height:1;position:absolute;top:.5rem;right:.8rem}.modal-close:hover{color:var(--color-primary)}.del-summary{color:var(--color-secondary);text-align:left;word-break:break-word;margin:0 0 .9rem;font-size:1rem;line-height:1.6}.del-token-note{color:var(--color-accent-text);margin:0 0 .9rem;font-size:.875rem}.del-actions{justify-content:flex-end;gap:.6rem;display:flex}.del-ok{border-color:var(--color-destructive);color:var(--color-destructive)}.del-ok:hover{background:var(--color-destructive);border-color:var(--color-destructive);color:var(--color-background)}@media (width<=768px){:root{--header-h:5rem}.charts-grid{grid-template-columns:1fr}.site-header{flex-wrap:wrap;padding:.8rem 1.1rem}.site-nav{gap:1.1rem}.nav-toggle{width:2.75rem;height:2.75rem}.dl-btn,.audio-toggle,.audio-seek{width:2.5rem;height:2.5rem}.audio-range{height:1.5rem}.audio-range::-webkit-slider-thumb{width:14px;height:14px;margin-top:-5px}.nav-drop-menu,.nav-drop-chevron{display:none}.hero-title{font-size:clamp(2.1rem,8.5vw,2.7rem)}.hero-tagline{font-size:clamp(1.05rem,4.5vw,1.5rem)}.stat-grid{grid-template-columns:repeat(2,1fr)}.product-grid{grid-template-columns:1fr}.file-row{flex-wrap:wrap;gap:.5rem 1rem}.file-name{white-space:normal;-webkit-line-clamp:2;-webkit-box-orient:vertical;flex:100%;order:-1;display:-webkit-box}.acc-sub{padding-left:.8rem}}@media (height<=700px){.hero{padding:2rem 1.5rem 1.5rem}.hero-title{margin-top:0}.hero-tagline{margin-top:1rem}.home-top #about{padding-top:1.5rem;padding-bottom:3rem}.scroll-hint{display:none}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}html{scroll-behavior:auto}.hero-title .word,.reveal{opacity:1!important;transform:none!important}}.astro-route-announcer{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;top:0;left:0;overflow:hidden}
