:root{--layout-max:624px;--layout-gutter:32px;--layout-workspace-max:var(--layout-max);--layout-apps-max:var(--layout-max)}@media (width<=760px){:root{--layout-gutter:20px}}:root{--paper:#f8f5ec;--hero:#dfe5d5;--ink:#253c31;--muted:#536250;--accent:#a3422d;--forest:#263e33;--light:#f4f0dc;--line:#cbd0be;--font:-apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", "Noto Sans SC", sans-serif;--serif:"Iowan Old Style", "Palatino Linotype", "Songti SC", "Noto Serif CJK SC", serif;--mono:"SFMono-Regular", Consolas, monospace}*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:104px}body{color:var(--ink);background:var(--paper);font-family:var(--font);-webkit-font-smoothing:antialiased;margin:0;font-size:16px}h1,h2,h3,p,figure{margin:0}p{text-wrap:pretty;line-height:1.85}a{color:inherit;text-decoration:none}button{font:inherit;color:inherit}img{max-width:100%;height:auto;display:block}button,a,summary{-webkit-tap-highlight-color:transparent}a:focus-visible,button:focus-visible,summary:focus-visible{outline:3px solid var(--accent);outline-offset:6px}::selection{color:#1b2d24;background:#d9a77b}.shell{width:min(var(--layout-max),calc(100% - 2 * var(--layout-gutter)));margin-inline:auto}.skip{background:var(--paper);z-index:100;padding:15px;position:fixed;top:-100px;left:16px}.skip:focus{top:12px}.site-header{background:var(--paper);z-index:20;border-bottom:1px solid #0000;transition:background .25s,color .25s;position:sticky;top:0}.site-header[data-tone=paper]{background:var(--paper);border-color:var(--line)}.site-header[data-tone=forest]{background:var(--forest);color:var(--light);border-color:#ffffff24}.eyebrow{font-family:var(--mono);letter-spacing:.12em;align-items:center;gap:10px;font-size:11px;line-height:1.5;display:flex}.mono{font-family:var(--mono);letter-spacing:.08em;font-size:10px}.noscript-note{text-align:center;background:var(--paper);padding:12px;font-size:12px}@media (width<=760px){html{scroll-padding-top:85px}.eyebrow{font-size:9px}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,:before,:after{transition:none!important;animation:none!important}}.hero{--layout-max:1080px}.section-space{padding-block:56px 0}.find-me{padding-bottom:56px}.section-heading{margin-bottom:24px}.section-label{color:var(--muted);font:11px/1.7 var(--mono);letter-spacing:.12em;align-items:center;gap:16px;display:flex}.section-label:after{content:"";background:var(--line);flex:1;height:1px}.section-heading h2{font:500 28px/1.5 var(--serif);letter-spacing:.02em;margin-top:20px}.section-intro{color:var(--muted);margin-top:12px;font-size:15px;line-height:1.8}.project-list,.note-list{margin:0;padding:0;list-style:none}.project-list>li+li,.note-list>li+li{border-top:1px solid var(--line)}.project-entry,.note{grid-template-columns:minmax(0,1fr) 152px;align-items:center;gap:28px;padding-block:24px;display:grid}.project-list>li:first-child .project-entry{padding-top:4px}.project-copy{min-width:0}.project-heading{flex-wrap:wrap;align-items:baseline;gap:4px 12px;display:flex}.project-heading h3{text-decoration:underline;text-decoration-color:var(--line);text-underline-offset:5px;font-size:18px;font-weight:600;line-height:1.6;text-decoration-thickness:1px;transition:color .15s,text-decoration-color .15s}.project-platform{color:var(--muted);font:11px/1.7 var(--mono)}.project-copy>p{color:var(--muted);margin-top:10px;font-size:15px;line-height:1.8}.project-cover,.note-cover{aspect-ratio:4/3;object-fit:cover;border-radius:3px;width:100%}.project-entry:hover h3,.project-entry:focus-visible h3,.note:hover h3,.note:focus-visible h3{color:var(--accent);text-decoration-color:var(--accent)}.text-link{min-height:44px;color:var(--ink);text-decoration:underline;text-decoration-color:var(--line);text-underline-offset:5px;align-items:center;margin-top:8px;font-size:14px;transition:color .15s,text-decoration-color .15s;display:inline-flex}.text-link:hover,.text-link:focus-visible{color:var(--accent);text-decoration-color:var(--accent)}.note-copy{min-width:0}.note-list>li:first-child .note{padding-top:4px}.note h3{text-decoration:underline;text-decoration-color:var(--line);text-underline-offset:5px;font-size:18px;font-weight:500;line-height:1.7;text-decoration-thickness:1px;transition:color .15s,text-decoration-color .15s}.note p{color:var(--muted);margin-top:8px;font-size:15px;line-height:1.8}.contact-profile{align-items:center;gap:16px;display:flex}.contact-avatar{object-fit:cover;border-radius:50%;flex:none;width:48px;height:48px}.contact-identity-name{flex-wrap:wrap;align-items:baseline;gap:4px 10px;font-size:21px;font-weight:500;line-height:1.5;display:flex}.contact-identity-name>span{color:var(--muted);font-size:14px;font-weight:400}.contact-socials{--contact-target:44px;--contact-gap:8px;margin-top:12px;position:relative}.contact-links{gap:var(--contact-gap);display:flex}.contact-icon{width:var(--contact-target);height:var(--contact-target);color:var(--muted);border-radius:50%;justify-content:center;align-items:center;transition:color .15s,background-color .15s;display:flex}.contact-icon:hover,.contact-icon:focus-visible,.contact-wechat[open]>summary{color:var(--ink);background:var(--hero)}.contact-icon svg{width:18px;height:18px}.contact-wechat summary{top:0;left:calc(3 * (var(--contact-target) + var(--contact-gap)));cursor:pointer;list-style:none;position:absolute}.contact-wechat summary::-webkit-details-marker{display:none}.contact-qr{border:1px solid var(--line);background:var(--paper);border-radius:4px;width:min(260px,100%);margin-top:12px;padding:20px}.contact-qr img{width:172px;height:172px;margin-inline:auto}.contact-qr p{color:var(--muted);text-align:center;margin-top:12px;font-size:13px}.contact-sr-only{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.project-entry:active h3,.note:active h3,.text-link:active,.contact-icon:active{color:var(--accent)}footer{background:var(--paper);color:var(--muted)}.footer-bottom{border-top:1px solid var(--line);font:11px/1.7 var(--mono);white-space:nowrap;justify-content:space-between;align-items:center;gap:12px;padding-block:16px 72px;display:flex}.footer-bottom a{align-items:center;min-height:44px;display:inline-flex}.footer-bottom a:hover{color:var(--accent)}.footer-apps-link{gap:6px;margin-right:auto}@media (width<=760px){.section-space{padding-top:44px}.find-me{padding-bottom:44px}.section-heading h2{font-size:26px}}@media (width<=520px){.project-entry,.note{grid-template-columns:minmax(0,1fr) 96px;align-items:start;gap:16px}.project-cover,.note-cover{margin-top:4px}.project-heading{gap:2px 10px}.project-heading h3,.note h3{font-size:17px}.project-platform{font-size:10px}.contact-identity-name{font-size:19px}}:root{--hero-surface:var(--paper);--hero-reverse:var(--paper);--hero-ease:cubic-bezier(.2, .8, .2, 1);--hero-spring:cubic-bezier(.2, 1.5, .4, 1)}html:has(body[data-workshop-home]){overflow-anchor:none}.site-header[data-tone=hero],.hero{background:var(--hero-surface)}.hero-inner{padding-block:36px 44px}.hero-identity{min-height:0;max-height:var(--origin-height,240px);transition:max-height .6s var(--hero-ease), opacity .2s;align-items:center;gap:38px;display:flex}.hero[data-mascot-state=drawing] .hero-identity,.hero[data-mascot-instant] .hero-identity{transition:none}.hero:is([data-mascot-state=travel],[data-mascot-state=welcome]) .hero-identity{opacity:0;pointer-events:none;max-height:0;overflow:hidden}.hero:is([data-mascot-state=travel],[data-mascot-state=welcome]) .hero-avatar{visibility:hidden}.hero-avatar{flex:0 0 148px;position:relative}.hero-avatar svg{width:100%;height:auto;display:block}.hero-redraw{white-space:nowrap;min-width:44px;min-height:44px;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:2px;justify-content:center;align-items:center;gap:5px;padding:0 4px;font-size:11px;display:inline-flex}.hero-redraw[hidden]{display:none}.hero-redraw span{margin-right:3px;font-size:16px;display:inline-block}.hero-redraw:hover{color:var(--accent)}.hero-redraw:active{transform:translateY(1px)}.hero-redraw:disabled{cursor:default;opacity:.5}.hero-greeting{padding-bottom:3px}.hero-greeting .eyebrow{color:var(--muted);letter-spacing:.14em;font-size:10px}.hero h1{font-family:var(--serif);letter-spacing:-.035em;margin:11px 0 8px;font-size:clamp(40px,4.8vw,66px);font-weight:500;line-height:1.4}.hero-name{white-space:nowrap}.hero-period{color:var(--accent)}.hero-statement{max-width:40em;margin-top:28px;font-size:17px;font-weight:400;line-height:1.85}.hero-statement p+p{margin-top:14px}.hero-statement a{text-decoration:underline;text-decoration-color:var(--line);text-underline-offset:4px}.hero-statement a:hover{color:var(--accent);text-decoration-color:currentColor}.hero-actions{flex-wrap:wrap;align-items:center;gap:16px 34px;margin-top:24px;display:flex}.hero-actions a{justify-content:space-between;align-items:center;gap:24px;min-height:48px;font-size:14px;transition:color .2s,background .2s,transform .2s;display:inline-flex}.hero-actions a span{font-size:19px;transition:transform .2s}.hero-primary{border:1px solid var(--ink);background:var(--ink);color:var(--hero-reverse);border-radius:2px;padding:0 21px}.hero-primary:hover{background:var(--accent);border-color:var(--accent)}.hero-secondary{border-bottom:1px solid var(--line)}.hero-secondary:hover{color:var(--accent);border-color:currentColor}.hero-actions a:hover span{transform:translate(2px,-2px)}.hero-actions a:active{transform:translateY(1px)}.hero-actions a:focus-visible,.hero-statement a:focus-visible,.hero-redraw:focus-visible{outline:2px solid var(--accent);outline-offset:5px}.hero-scene{width:min(100%,700px);margin:24px auto -16px;position:relative}.workshop-welcome{opacity:0;pointer-events:none;width:clamp(64px,16%,102px);position:absolute;bottom:24%;left:51%;transform:translate(-50%)}.hero[data-mascot-state=welcome] .workshop-welcome{opacity:1}.workshop-bubble{border:1px solid var(--line);background:var(--paper);width:clamp(180px,17vw,230px);box-shadow:0 5px 16px color-mix(in srgb, var(--ink) 9%, transparent);color:var(--ink);transform-origin:0 100%;border-radius:16px 16px 16px 3px;padding:13px 16px;position:absolute;bottom:calc(100% - 44px);left:calc(100% - 5px)}.workshop-bubble:after{content:"";border-left:1px solid var(--line);border-bottom:1px solid var(--line);background:var(--paper);width:12px;height:12px;position:absolute;bottom:13px;left:-7px;transform:rotate(45deg)}.bubble-eyebrow{font-family:var(--mono);letter-spacing:.04em;color:var(--muted);font-size:8px;display:block}.bubble-greeting{font-family:var(--serif);white-space:nowrap;margin-block:5px;font-size:clamp(18px,1.6vw,23px);font-weight:500;line-height:1.45;display:block}.hero[data-mascot-state=welcome] .workshop-bubble{animation:workshop-hello .35s var(--hero-spring) both}.hero[data-mascot-instant] .workshop-welcome,.hero[data-mascot-instant] .workshop-welcome *{transition:none!important;animation:none!important}@keyframes workshop-hello{0%{opacity:0;transform:translate(-5px,7px)scale(.94)}to{opacity:1;transform:none}}@media (width>=1001px){.hero-inner{grid-template-columns:minmax(0,1.2fr) minmax(0,1fr);column-gap:36px;padding-block:36px 44px;display:grid}.hero-identity{grid-area:1/1;gap:24px}.hero-avatar{flex-basis:112px}.hero h1{font-size:clamp(34px,3.1vw,42px)}.hero-greeting .eyebrow{font-size:9px}.hero-statement{grid-area:2/1;margin-top:24px}.hero-actions{grid-area:3/1;margin-top:28px}.hero-scene{grid-area:1/2/4;align-self:center;width:100%;margin:0}}@media (prefers-reduced-motion:no-preference){.hero-greeting,.hero-statement,.hero-actions{animation:hero-appear .6s var(--hero-ease) both}.hero-statement{animation-delay:70ms}.hero-actions{animation-delay:.14s}@keyframes hero-appear{0%{opacity:.2;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}}@media (width<=1000px){.hero-inner{max-width:760px;padding-block:32px 40px}.hero-avatar{flex-basis:132px}.hero-identity{gap:30px}}@media (width<=760px){.hero-inner{padding-block:25px 40px}.hero-identity{gap:18px}.hero-avatar{flex-basis:98px}.hero-greeting .eyebrow{letter-spacing:.07em;font-size:8px}.hero h1{letter-spacing:-.04em;margin-block:8px 5px;font-size:clamp(29px,6.2vw,46px);line-height:1.45}.hero-redraw{font-size:10px}.hero-statement{margin-top:24px;font-size:16px}.hero-actions{gap:16px 26px;margin-top:28px}.hero-actions a{gap:20px;font-size:13px}.hero-primary{padding-inline:16px}.workshop-bubble{transform-origin:50% 100%;border-radius:13px;width:180px;margin-left:-90px;padding:10px 13px;bottom:calc(100% + 4px);left:50%}.workshop-bubble:after{bottom:-7px;left:calc(50% - 6px);transform:rotate(-45deg)}.bubble-eyebrow{display:none}.bubble-greeting{margin-top:0;font-size:18px}}@media (width<=380px){.hero-avatar{flex-basis:80px}.hero-identity{gap:12px}.hero-greeting .eyebrow{max-width:170px;font-size:7px}.hero h1{font-size:27px}.hero-actions{gap:18px}}.hero-portrait[data-astro-cid-dkb2nt6j]{--portrait-line:#342c28;--portrait-hood:#9b7159;--portrait-hood-light:#b58a6d;--portrait-hood-shade:#87614e;--portrait-hood-inside:#694e41;--portrait-skin:#f2d2ae;--portrait-hair:#38302b;--portrait-cheek:#e89d7d;--portrait-shirt:#f6efdc;--portrait-eye-white:#fffdf7;width:100%;height:auto;display:block;overflow:visible}.hood[data-astro-cid-dkb2nt6j]{fill:var(--portrait-hood)}.hood-light[data-astro-cid-dkb2nt6j]{fill:var(--portrait-hood-light)}.hood-shade[data-astro-cid-dkb2nt6j]{fill:var(--portrait-hood-shade)}.hood-inside[data-astro-cid-dkb2nt6j]{fill:var(--portrait-hood-inside)}.skin[data-astro-cid-dkb2nt6j]{fill:var(--portrait-skin)}.hair[data-astro-cid-dkb2nt6j]{fill:var(--portrait-hair)}.cheek[data-astro-cid-dkb2nt6j]{fill:var(--portrait-cheek);opacity:.44}.shirt[data-astro-cid-dkb2nt6j]{fill:var(--portrait-shirt)}.eye-white[data-astro-cid-dkb2nt6j]{fill:var(--portrait-eye-white)}.portrait-lines[data-astro-cid-dkb2nt6j]{fill:none;stroke:var(--portrait-line);stroke-width:2.2px;stroke-linecap:round;stroke-linejoin:round}.fine[data-astro-cid-dkb2nt6j]{stroke-width:1.5px}.brows[data-astro-cid-dkb2nt6j]{stroke-width:3.5px}.glasses[data-astro-cid-dkb2nt6j]{stroke-width:4.5px}.eyes[data-astro-cid-dkb2nt6j]{stroke-width:13px}.eye-sparkle[data-astro-cid-dkb2nt6j]{stroke:var(--portrait-eye-white);stroke-width:4.8px}.cord[data-astro-cid-dkb2nt6j]{stroke:var(--portrait-shirt);stroke-width:2.7px}.stroke[data-astro-cid-dkb2nt6j]{stroke-dasharray:1 2;stroke-dashoffset:0}.hero-portrait[data-astro-cid-dkb2nt6j][data-drawing] .stroke[data-astro-cid-dkb2nt6j]{animation:.46s ease-out both portrait-line;animation-delay:calc(var(--order) * .135s)}.hero-portrait[data-astro-cid-dkb2nt6j][data-drawing] .portrait-colour[data-astro-cid-dkb2nt6j]{animation:.65s ease-out 1.55s both portrait-colour}@keyframes portrait-line{0%{stroke-dashoffset:1px}to{stroke-dashoffset:0}}@keyframes portrait-colour{0%{opacity:0}to{opacity:1}}@media (prefers-reduced-motion:reduce){.hero-portrait[data-astro-cid-dkb2nt6j][data-drawing] .stroke[data-astro-cid-dkb2nt6j],.hero-portrait[data-astro-cid-dkb2nt6j][data-drawing] .portrait-colour[data-astro-cid-dkb2nt6j]{animation:none}}.hero-workshop[data-astro-cid-psphdsn7]{aspect-ratio:3/2;mix-blend-mode:multiply;min-width:0;mask-image:linear-gradient(to right, transparent, var(--ink) 6%, var(--ink) 94%, transparent), linear-gradient(to bottom, transparent, var(--ink) 13%, var(--ink) 86%, transparent);margin:0;position:relative;mask-composite:intersect}.scene-image[data-astro-cid-psphdsn7]{object-fit:contain;width:100%;height:100%;display:block}.scene-outline[data-astro-cid-psphdsn7]{opacity:0;pointer-events:none;width:100%;height:100%;position:absolute;inset:0}.scene-structure[data-astro-cid-psphdsn7],.scene-pipes[data-astro-cid-psphdsn7]{fill:none;stroke:var(--ink);stroke-width:3.5px;stroke-linecap:round;stroke-linejoin:round}.scene-pipes[data-astro-cid-psphdsn7]{stroke:var(--accent);stroke-width:4px}.scene-fine[data-astro-cid-psphdsn7]{stroke-width:2.4px}.scene-line[data-astro-cid-psphdsn7]{stroke-dasharray:1 2;stroke-dashoffset:0}.hero-workshop[data-astro-cid-psphdsn7][data-drawing] .scene-line[data-astro-cid-psphdsn7]{animation:scene-stroke .56s ease-out var(--delay) both}.hero-workshop[data-astro-cid-psphdsn7][data-drawing] .scene-outline[data-astro-cid-psphdsn7]{animation:2.8s linear both scene-outline-out}.hero-workshop[data-astro-cid-psphdsn7][data-drawing] .scene-image[data-astro-cid-psphdsn7]{animation:2.8s ease-in-out both scene-image-in}@keyframes scene-stroke{0%{stroke-dashoffset:1px}to{stroke-dashoffset:0}}@keyframes scene-outline-out{0%,65%{opacity:1}to{opacity:0}}@keyframes scene-image-in{0%,65%{opacity:0}to{opacity:1}}.hero-workshop[data-astro-cid-psphdsn7][data-image-error] .scene-image[data-astro-cid-psphdsn7]{display:none}.hero-workshop[data-astro-cid-psphdsn7][data-image-error] .scene-outline[data-astro-cid-psphdsn7]{opacity:1}.hero-workshop[data-astro-cid-psphdsn7][data-image-error] .scene-line[data-astro-cid-psphdsn7]{stroke-dashoffset:0}.hero-workshop[data-astro-cid-psphdsn7][data-image-error] .scene-image[data-astro-cid-psphdsn7],.hero-workshop[data-astro-cid-psphdsn7][data-image-error] .scene-outline[data-astro-cid-psphdsn7],.hero-workshop[data-astro-cid-psphdsn7][data-image-error] .scene-line[data-astro-cid-psphdsn7]{animation:none}@media (prefers-reduced-motion:reduce){.hero-workshop[data-astro-cid-psphdsn7][data-drawing] .scene-image[data-astro-cid-psphdsn7],.hero-workshop[data-astro-cid-psphdsn7][data-drawing] .scene-outline[data-astro-cid-psphdsn7],.hero-workshop[data-astro-cid-psphdsn7][data-drawing] .scene-line[data-astro-cid-psphdsn7]{animation:none}}.workshop-mascot[data-astro-cid-epbpjiu3]{--mascot-line:#342c28;--mascot-hood:#9b7159;--mascot-hood-shade:#87614e;--mascot-cuff:#b58a6d;--mascot-skin:#f2d2ae;--mascot-pants:#69665f;--mascot-pants-shade:#53524d;--mascot-shoe:#ac8970;--mascot-cream:#f6efdc;--mascot-shadow:var(--ink);pointer-events:none;width:100%}.mascot-character[data-astro-cid-epbpjiu3]{aspect-ratio:260/330;width:100%;position:relative}.mascot-body[data-astro-cid-epbpjiu3]{width:100%;height:100%;display:block;position:absolute;inset:0;overflow:visible}.mascot-face[data-astro-cid-epbpjiu3]{width:76.9231%;position:absolute;top:0;left:11.5385%}.mascot-shadow[data-astro-cid-epbpjiu3]{fill:var(--mascot-shadow);opacity:.16}.mascot-clothes[data-astro-cid-epbpjiu3]{stroke:var(--mascot-line);stroke-width:2.2px;stroke-linecap:round;stroke-linejoin:round}.mascot-pants[data-astro-cid-epbpjiu3]{fill:var(--mascot-pants)}.mascot-pants-shade[data-astro-cid-epbpjiu3]{fill:var(--mascot-pants-shade);stroke:none}.mascot-hand[data-astro-cid-epbpjiu3]{fill:var(--mascot-skin)}.mascot-hand-detail[data-astro-cid-epbpjiu3],.mascot-seam[data-astro-cid-epbpjiu3],.mascot-pocket[data-astro-cid-epbpjiu3]{fill:none;stroke-width:1.4px}.mascot-sleeve[data-astro-cid-epbpjiu3],.mascot-hoodie[data-astro-cid-epbpjiu3]{fill:var(--mascot-hood)}.mascot-cuff[data-astro-cid-epbpjiu3]{fill:var(--mascot-cuff)}.mascot-hoodie-shade[data-astro-cid-epbpjiu3]{fill:var(--mascot-hood-shade);stroke:none}.mascot-shoe[data-astro-cid-epbpjiu3]{fill:var(--mascot-shoe)}.mascot-shoe-panel[data-astro-cid-epbpjiu3],.mascot-sole[data-astro-cid-epbpjiu3]{fill:var(--mascot-cream)}.mascot-shoe-panel[data-astro-cid-epbpjiu3]{stroke-width:1.3px}.mascot-laces[data-astro-cid-epbpjiu3]{fill:none;stroke:var(--mascot-cream);stroke-width:3.2px}.mascot-arm[data-astro-cid-epbpjiu3]{transform-box:view-box}.mascot-arm-left[data-astro-cid-epbpjiu3]{transform-origin:70px 195px}.mascot-arm-right[data-astro-cid-epbpjiu3]{transform-origin:192px 195px}@media (prefers-reduced-motion:no-preference){.hero[data-mascot-state=welcome] .mascot-arm-left[data-astro-cid-epbpjiu3]{animation:.5s ease-out both mascot-open}.hero[data-mascot-state=welcome] .mascot-arm-right[data-astro-cid-epbpjiu3]{animation:.9s ease-in-out both mascot-wave}@keyframes mascot-open{0%{transform:rotate(-14deg)}to{transform:rotate(0)}}@keyframes mascot-wave{0%{transform:rotate(8deg)}25%{transform:rotate(-12deg)}50%{transform:rotate(7deg)}75%{transform:rotate(-7deg)}to{transform:rotate(0)}}}
