@media (prefers-reduced-motion:no-preference){:is([data-motion=rise] .section:not([data-section-motion]),.section[data-section-motion=rise],[data-motion=wipe] .section:not([data-section-motion]),.section[data-section-motion=wipe],[data-motion=blur] .section:not([data-section-motion]),.section[data-section-motion=blur],[data-motion=scale] .section:not([data-section-motion]),.section[data-section-motion=scale]) [data-rv=armed]{opacity:0;translate:0 var(--rv-rise)}:is([data-motion=fade] .section:not([data-section-motion]),.section[data-section-motion=fade]) [data-rv=armed]{opacity:0}:is([data-motion=slide] .section:not([data-section-motion]),.section[data-section-motion=slide]) [data-rv=armed]{opacity:0;translate:calc(var(--rv-slide) * -1) 0}:is([data-motion=slide] .section:not([data-section-motion]):nth-child(2n),.section[data-section-motion=slide]:nth-child(2n)) [data-rv=armed]{translate:var(--rv-slide) 0}:is([data-motion=scale] .section:not([data-section-motion]),.section[data-section-motion=scale]) :is(.card,.stat-card,.stat-feature,img)[data-rv=armed]{translate:none;scale:var(--rv-scale)}:is([data-motion=scale] .section:not([data-section-motion]),.section[data-section-motion=scale]) :is(.proj,.proj-show,.exp-stack-slot)[data-rv=armed]{translate:none;scale:var(--rv-scale-lg)}:is([data-motion=wipe] .section:not([data-section-motion]),.section[data-section-motion=wipe]) :is([data-rv=armed] img,img[data-rv=armed]){clip-path:inset(0 100% 0 0)}:is([data-motion=wipe] .section:not([data-section-motion]),.section[data-section-motion=wipe]) :is([data-rv=in] img,img[data-rv=in]){clip-path:inset(0)}:is([data-motion=wipe] .section:not([data-section-motion]),.section[data-section-motion=wipe]) img[data-rv=armed]{opacity:1;translate:none}:is([data-motion=blur] .section:not([data-section-motion]),.section[data-section-motion=blur]) [data-rv=armed] .proj-media img{filter:blur(14px);scale:1.06}:is([data-motion=scale] .section:not([data-section-motion]),.section[data-section-motion=scale]) [data-rv=armed] .proj-media img{scale:1.06}:is([data-motion=wipe] .section:not([data-section-motion]),.section[data-section-motion=wipe]) .section-head>h2[data-rv=armed]{opacity:1;clip-path:inset(-.3em 100% -.3em -.2em);translate:none}:is([data-motion=wipe] .section:not([data-section-motion]),.section[data-section-motion=wipe]) .section-head>h2[data-rv=in]{clip-path:inset(-.3em -.2em);transition:clip-path .9s var(--ease-expo) calc(var(--rv-i,0) * var(--rv-stagger))}[data-rv=in]{--rv-d:calc(var(--rv-i,0) * var(--rv-stagger));transition:opacity var(--rv-dur) var(--ease-expo) var(--rv-d), translate var(--rv-dur) var(--ease-expo) var(--rv-d), scale var(--rv-dur) var(--ease-expo) var(--rv-d), transform var(--t-base) var(--ease-out), box-shadow var(--t-base)}:is([data-rv=in] img,img[data-rv=in]){--rv-d:calc(var(--rv-i,0) * var(--rv-stagger));transition:opacity var(--rv-dur) var(--ease-expo) var(--rv-d), clip-path var(--rv-img-dur) var(--ease-expo) var(--rv-d), filter var(--rv-img-dur) var(--ease-expo) var(--rv-d), scale var(--rv-img-dur) var(--ease-expo) var(--rv-d), transform var(--t-slow) var(--ease-out)}:is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])) .stat-card[data-rv=armed]:before{scale:0 1}:is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])) .stat-card[data-rv=in]:before{transition:scale .9s var(--ease-expo) calc(var(--rv-i,0) * var(--rv-stagger) + .12s)}:is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])) [data-rv=armed] :is(.stat-value,.stat-feature-value){clip-path:inset(-.3em -.2em 100%);translate:0 100%}:is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])) [data-rv=in] :is(.stat-value,.stat-feature-value){clip-path:inset(-.3em -.2em);transition:translate .8s var(--ease-expo), clip-path .8s var(--ease-expo);transition-delay:calc(var(--rv-i,0) * var(--rv-stagger) + 80ms)}}.section[data-section-motion=none],.section[data-section-motion=none]:before,.section[data-section-motion=none]:after,.section[data-section-motion=none] *,.section[data-section-motion=none] :before,.section[data-section-motion=none] :after{animation:none!important}[data-motion=slide] .section,.section[data-section-motion=slide]{overflow-x:clip}@supports (animation-timeline:scroll(root)){@media (prefers-reduced-motion:no-preference){[data-effect-scroll-progress] .masthead:after{content:"";background:var(--accent);transform-origin:0;height:2px;animation:linear both scroll-progress;animation-timeline:scroll(root);position:absolute;inset:auto 0 -1px;transform:scaleX(0)}[data-effect-scroll-progress][data-nav=floating] .masthead:after{position:fixed;inset:0 0 auto}[data-effect-scroll-progress][data-nav=floating] .masthead[data-over]:after{animation:linear both scroll-progress,linear progress-over-dark;animation-timeline:scroll(root),scroll(root);animation-range:normal,0 100svh}@media (min-width:1100px){[data-effect-scroll-progress][data-nav=sidebar] .masthead:after{transform-origin:50% 0;width:2px;height:auto;animation-name:scroll-progress-y;inset:0 -1px 0 auto}}}}@keyframes progress-over-dark{0%,to{background:var(--accent-on-dark)}}@keyframes scroll-progress-y{0%{transform:scaleY(0)}to{transform:scaleY(1)}}@keyframes scroll-progress{0%{transform:scaleX(0)}to{transform:scaleX(1)}}@supports (animation-timeline:view()){@media (prefers-reduced-motion:no-preference){:is([data-effect-parallax] .section:not([data-fx]),.section[data-fx~=parallax])[data-bg]:is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])) .section-bg{animation:linear both parallax-drift;animation-timeline:view();animation-range:cover}}}:is([data-effect-parallax] .section:not([data-fx]),.section[data-fx~=parallax])[data-bg]:is([data-motion=none] .section:not([data-section-motion])) .section-bg{transform:translateY(6%)scale(1.12)}@keyframes parallax-drift{0%{transform:translateY(-6%)scale(1.12)}to{transform:translateY(6%)scale(1.12)}}:is([data-effect-sticky-stack] .section:not([data-fx]),.section[data-fx~=stickyStack]) .stack-item{top:calc(var(--nav-h) + clamp(16px, 3vh, 40px));position:sticky}@media (min-width:1100px) and (min-height:700px){[data-nav=sidebar] :is([data-effect-sticky-stack] .section:not([data-fx]),.section[data-fx~=stickyStack]) .stack-item{top:calc(var(--top-bar) + clamp(16px, 3vh, 40px))}}:is([data-effect-sticky-stack] .section:not([data-fx]),.section[data-fx~=stickyStack]) :is(.grid,.proj-list):has(>.stack-item){grid-auto-rows:1fr}:is([data-effect-sticky-stack] .section:not([data-fx]),.section[data-fx~=stickyStack]) .proj-list:has(>.stack-item){row-gap:clamp(48px,7vw,96px);display:grid}:is([data-effect-sticky-stack] .section:not([data-fx]),.section[data-fx~=stickyStack]) .proj-list>.proj.stack-item+.proj{margin-top:0}:is([data-effect-sticky-stack] .section:not([data-fx]),.section[data-fx~=stickyStack]) .proj.stack-item{background:var(--ground,var(--paper));padding-block:clamp(16px,2.4vw,32px);box-shadow:0 -20px 44px -22px #00000038}@supports (container-type:scroll-state){:is([data-effect-sticky-stack] .section:not([data-fx]),.section[data-fx~=stickyStack]) .proj.stack-item{box-shadow:none;container-type:scroll-state}:is([data-effect-sticky-stack] .section:not([data-fx]),.section[data-fx~=stickyStack]) .proj.stack-item:before{content:"";pointer-events:none;transition:opacity var(--t-base) var(--ease-out);position:absolute;inset:0;box-shadow:0 -20px 44px -22px #00000038}@container scroll-state(stuck:top){:is([data-effect-sticky-stack] .section:not([data-fx]),.section[data-fx~=stickyStack]) .proj.stack-item:before{opacity:0}}@media print{:is([data-effect-sticky-stack] .section:not([data-fx]),.section[data-fx~=stickyStack]) .proj.stack-item:before{display:none}}}:is([data-effect-sticky-stack] .section:not([data-fx]),.section[data-fx~=stickyStack]) .card.stack-item{background:linear-gradient(var(--card-bg,var(--paper)), var(--card-bg,var(--paper))) var(--ground,var(--paper))}:is([data-effect-sticky-stack] .section:not([data-fx]),.section[data-fx~=stickyStack]):is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .card.stack-item{background:linear-gradient(#ffffff0d, #ffffff0d) var(--ground)}@media (max-width:860px),(max-height:699px){:is([data-effect-sticky-stack] .section:not([data-fx]),.section[data-fx~=stickyStack]) .stack-item{position:relative;top:auto}}.marquee{overflow:hidden;-webkit-mask-image:linear-gradient(90deg,#0000,#000 8% 92%,#0000);mask-image:linear-gradient(90deg,#0000,#000 8% 92%,#0000)}.marquee:focus-visible{outline-offset:6px}.marquee-track{gap:var(--marquee-gap,8px);width:max-content;display:flex}.marquee-track .tags{gap:var(--marquee-gap,8px);flex-wrap:nowrap;margin-top:0}@media (prefers-reduced-motion:no-preference){.marquee .marquee-track{animation:marquee-scroll var(--marquee-duration,32s) linear infinite}.marquee:is(:hover,:focus-within) .marquee-track{animation-play-state:paused}}@keyframes marquee-scroll{to{translate:calc(-50% - var(--marquee-gap,8px) / 2) 0}}@media (prefers-reduced-motion:reduce){.marquee{overflow:visible;-webkit-mask-image:none;mask-image:none}.marquee-track{width:auto}.marquee-track .tags{flex-wrap:wrap}.marquee [aria-hidden=true]{display:none}}.section[data-section-motion=none] .marquee{overflow:visible;-webkit-mask-image:none;mask-image:none}.section[data-section-motion=none] .marquee-track{width:auto}.section[data-section-motion=none] .marquee-track .tags{flex-wrap:wrap}.section[data-section-motion=none] .marquee [aria-hidden=true]{display:none}[data-motion=none] .section:not([data-section-motion]) .marquee{overflow:visible;-webkit-mask-image:none;mask-image:none}[data-motion=none] .section:not([data-section-motion]) .marquee-track{width:auto;animation:none}[data-motion=none] .section:not([data-section-motion]) .marquee-track .tags{flex-wrap:wrap}[data-motion=none] .section:not([data-section-motion]) .marquee [aria-hidden=true]{display:none}:is([data-effect-magnetic] .hero-section:not([data-fx]),.section[data-fx~=magnetic]) .btn.magnetic{translate:var(--mx,0px) var(--my,0px);transition:translate var(--t-base) var(--ease-out), transform var(--t-fast), box-shadow var(--t-base), background var(--t-base), color var(--t-base), border-color var(--t-base)}:is([data-effect-magnetic] .hero-section:not([data-fx]),.section[data-fx~=magnetic]) .link-more.magnetic{translate:var(--mx,0px) var(--my,0px);transition:translate var(--t-base) var(--ease-out), gap var(--t-base) var(--ease-out), color var(--t-base)}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important}.skeleton-bar{animation:none!important}}@media (prefers-reduced-motion:no-preference){:is([data-motion]:not([data-motion=none]) .site-main>.hero-section:first-child:not([data-section-motion]),.site-main>.hero-section:first-child[data-section-motion]:not([data-section-motion=none])) .hero:not([data-played]) .hword{animation:hero-word var(--hero-word) var(--ease-expo) backwards;animation-delay:calc(var(--hero-t0) + min(var(--i,0), 10) * var(--hero-stagger))}:is([data-motion=fade] .site-main>.hero-section:first-child:not([data-section-motion]),.site-main>.hero-section:first-child[data-section-motion=fade]) .hero:not([data-played]) .hword{animation-name:hero-word-fade}:is([data-motion=blur] .site-main>.hero-section:first-child:not([data-section-motion]),.site-main>.hero-section:first-child[data-section-motion=blur]) .hero:not([data-played]) .hword{animation-name:hero-word-focus}:is([data-motion=wipe] .site-main>.hero-section:first-child:not([data-section-motion]),.site-main>.hero-section:first-child[data-section-motion=wipe]) .hero:not([data-played]) .hword{animation-name:hero-word-wipe}:is([data-motion]:not([data-motion=none]) .site-main>.hero-section:first-child:not([data-section-motion]),.site-main>.hero-section:first-child[data-section-motion]:not([data-section-motion=none])) .hero:not([data-played]) .hero-copy>.eyebrow{animation:hero-rise .6s var(--ease-expo) var(--hero-t0) backwards}:is([data-motion]:not([data-motion=none]) .site-main>.hero-section:first-child:not([data-section-motion]),.site-main>.hero-section:first-child[data-section-motion]:not([data-section-motion=none])) .hero:not([data-played]) .hero-copy>:is(.lede,.btn-row,.hero-meta){animation:hero-rise .7s var(--ease-expo) backwards;animation-delay:calc(var(--hero-t0) + min(var(--n,6), 10) * var(--hero-stagger) + .24s + var(--k,0) * 90ms)}.hero-copy>.btn-row{--k:1}.hero-copy>.hero-meta{--k:2}:is([data-motion]:not([data-motion=none]) .site-main>.hero-section:first-child:not([data-section-motion]),.site-main>.hero-section:first-child[data-section-motion]:not([data-section-motion=none])) .hero:not([data-played]) .hero-portrait{animation:hero-fade .5s var(--ease-out) .12s backwards}:is([data-motion]:not([data-motion=none]) .site-main>.hero-section:first-child:not([data-section-motion]),.site-main>.hero-section:first-child[data-section-motion]:not([data-section-motion=none])) .hero:not([data-played]) .hero-portrait img{animation:portrait-uncover 1.1s var(--ease-expo) .2s backwards}:is([data-motion]:not([data-motion=none]) .site-main>.hero-section:first-child:not([data-section-motion]),.site-main>.hero-section:first-child[data-section-motion]:not([data-section-motion=none])) .hero:not([data-played]) .hero-portrait-frame{animation:frame-in .7s var(--ease-expo) .95s backwards}:is([data-motion]:not([data-motion=none]) .site-main>.hero-section:first-child:not([data-section-motion]),.site-main>.hero-section:first-child[data-section-motion]:not([data-section-motion=none])) .hero:not([data-played]) .hero-portrait-badge{animation:hero-rise .6s var(--ease-expo) 1.1s backwards}:is([data-motion]:not([data-motion=none]) .site-main>.hero-section:first-child:not([data-section-motion]),.site-main>.hero-section:first-child[data-section-motion]:not([data-section-motion=none])):has(.hero:not([data-played])) .hero-cue>*{animation:hero-fade .6s var(--ease-out) 1.3s backwards}:is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])).hero-full .hero-cue-dot{animation:cue-run 2.1s var(--ease-out) infinite}}:root[data-fonts-loading] :is(.masthead>.wrap,.site-main>.section:first-child>:not(.section-bg)){visibility:hidden}:root[data-fonts-loading] :is(.masthead>.wrap,.site-main>.section:first-child>:not(.section-bg)) *,:root[data-fonts-loading] :is(.masthead>.wrap,.site-main>.section:first-child>:not(.section-bg)) :before,:root[data-fonts-loading] :is(.masthead>.wrap,.site-main>.section:first-child>:not(.section-bg)) :after{animation-play-state:paused!important}@keyframes hero-word{0%{clip-path:inset(-.35em -.25em 100%);translate:0 100%}to{clip-path:inset(-.35em -.25em -.25em);translate:none}}@keyframes hero-word-fade{0%{opacity:0}}@keyframes hero-word-focus{0%{opacity:0;filter:blur(3px);translate:0 .15em}}@keyframes hero-word-wipe{0%{clip-path:inset(-.35em 100% -.3em -.25em)}to{clip-path:inset(-.35em -.25em -.3em)}}@keyframes hero-rise{0%{opacity:0;translate:0 12px}}@keyframes hero-fade{0%{opacity:0}}@keyframes frame-in{0%{opacity:0;translate:-10px 10px}}@keyframes portrait-uncover{0%{clip-path:inset(100% 0 0);scale:1.12}to{clip-path:inset(0);scale:none}}@keyframes cue-run{0%{opacity:0;transform:translateY(0)}22%{opacity:1}78%{opacity:1}to{opacity:0;transform:translateY(41px)}}@supports (animation-timeline:scroll(root)){@media (prefers-reduced-motion:no-preference){:is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])).hero-full:before{animation:linear both hero-glow-drift;animation-timeline:scroll(root);animation-range:0 100svh}:is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])).hero-full .hero-cue{animation:linear both cue-fade;animation-timeline:scroll(root);animation-range:0 18svh}:is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])).hero-full .hero-portrait img{animation:linear both portrait-drift;animation-timeline:scroll(root);animation-range:0 100svh}:is([data-motion]:not([data-motion=none]) .site-main>.hero-section:first-child:not([data-section-motion]),.site-main>.hero-section:first-child[data-section-motion]:not([data-section-motion=none])).hero-full .hero:not([data-played]) .hero-portrait img{animation:portrait-uncover 1.1s var(--ease-expo) .2s backwards, portrait-drift linear both;animation-timeline:auto,scroll(root);animation-range:normal,0 100svh}}}@supports (animation-timeline:view()){@media (min-width:1024px) and (prefers-reduced-motion:no-preference){:is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])).hero-full{view-timeline:--hero block}:is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])).hero-full>.wrap{animation:linear both hero-recede;animation-timeline:--hero;animation-range:exit}}}@keyframes hero-recede{to{opacity:.5;translate:0 -32px;scale:.97}}@keyframes hero-glow-drift{0%{opacity:1;transform:none}to{opacity:.5;transform:translateY(9%)scale(1.08)}}@keyframes portrait-drift{0%{transform:translateY(-3.5%)scale(1.08)}to{transform:translateY(3.5%)scale(1.08)}}@keyframes cue-fade{to{opacity:0}}@supports (animation-timeline:view()){@media (min-width:901px) and (prefers-reduced-motion:no-preference){.exp-stack{view-timeline-name:--exp-stack}[data-motion]:not([data-motion=none]) .exp-stack-slot:not(:last-child) .exp-stack-card{animation:linear both exp-stack-recede;animation-timeline:--exp-stack;animation-range:contain calc(var(--i) * 100% / var(--handovers)) contain calc((var(--i) + 1) * 100% / var(--handovers))}}}@keyframes exp-stack-recede{0%,10%{box-shadow:var(--shadow);transform:none}to{transform:scale(var(--stack-scale));box-shadow:0 6px 18px -12px #0006}}@supports (animation-timeline:view()){@media (prefers-reduced-motion:no-preference){[data-motion]:not([data-motion=none]) .gallery-rail{scroll-snap-type:none;overflow:clip}[data-motion]:not([data-motion=none]) .gallery[data-variant=scroller]{animation:linear both strip-travel;animation-timeline:view();animation-range:entry 50% cover 45%}[data-motion]:not([data-motion=none]) .gallery[data-variant=scroller][data-rv-end]{transition:translate .9s var(--ease-expo);translate:min(0px, calc(var(--rail-w,100vw) * .94 - 100%)) 0;animation:none}[data-motion]:not([data-motion=none]) .gallery[data-variant=scroller] img{animation:none}}}@keyframes strip-travel{to{translate:min(0px, calc(var(--rail-w,100vw) * .94 - 100%)) 0}}@supports (animation-timeline:view()){@media (prefers-reduced-motion:no-preference){[data-effect-chapter-marks][data-motion]:not([data-motion=none]) .section:not(.hero-section):after{animation:linear both rule-draw;animation-timeline:view();animation-range:entry 10%}}}@keyframes rule-draw{0%{transform:scaleY(0)}to{transform:scaleY(1)}}@media (prefers-reduced-motion:no-preference){:is([data-motion=native]:not([data-template^=ff-]) .section:not([data-section-motion]),[data-template]:not([data-template^=ff-]) .section[data-section-motion=native]) [data-rv=armed]{opacity:0;translate:0 var(--rv-rise)}}
:is(:root:not([data-effect-rotating-word]) .section:not([data-fx]),.section[data-fx]:not([data-fx~=rotatingWord])) .hero[data-len-rotor] .rotor-word:not(:first-child){display:none}:is([data-effect-rotating-word] .section:not([data-fx]),.section[data-fx~=rotatingWord]) .hero[data-len-rotor]{--h1-fit:1}:is([data-effect-rotating-word] .section:not([data-fx]),.section[data-fx~=rotatingWord]) .hero[data-len-rotor=long]{--h1-fit:.82}:is([data-effect-rotating-word] .section:not([data-fx]),.section[data-fx~=rotatingWord]) .hero[data-len-rotor=xlong]{--h1-fit:.68}@media (min-width:1024px){:is([data-effect-rotating-word] .section:not([data-fx]),.section[data-fx~=rotatingWord]) .hero[data-len-rotor=short]{--h1-fit:1.12}}:is([data-effect-rotating-word] .section:not([data-fx]),.section[data-fx~=rotatingWord]) .hero[data-len-rotor]:not([data-long-word-rotor]) h1{-webkit-hyphens:manual;hyphens:manual;overflow-wrap:inherit}:is([data-effect-rotating-word] .section:not([data-fx]),.section[data-fx~=rotatingWord]) .hero[data-long-word-rotor] h1{-webkit-hyphens:auto;hyphens:auto;overflow-wrap:anywhere}@media (max-width:520px){:is([data-effect-rotating-word] .section:not([data-fx]),.section[data-fx~=rotatingWord]) .hero[data-long-word-rotor]{--h1-fit:.85}}:is(:root:not([data-effect-count-up]) .section:not([data-fx]),.section[data-fx]:not([data-fx~=countUp])) .count[data-live]{display:contents}:is(:root:not([data-effect-count-up]) .section:not([data-fx]),.section[data-fx]:not([data-fx~=countUp])) .count[data-live]>.count-ghost{display:none}@supports (text-fit:shrink){:is(:root:not([data-effect-count-up]) .section:not([data-fx]),.section[data-fx]:not([data-fx~=countUp])) :is(.grid-3>.card,.stat-card)>.stat-value:has(>.count[data-live]){--stat-wide-k:0;text-fit:shrink}}:is(:root:not([data-effect-marquee]) .section:not([data-fx]),.section[data-fx]:not([data-fx~=marquee]))>.wrap>.marquee:has(~.skill-groups){display:none}:is([data-effect-marquee] .section:not([data-fx]),.section[data-fx~=marquee])>.wrap>.marquee~.skill-groups{display:none}:is([data-effect-marquee] .section:not([data-fx]),.section[data-fx~=marquee]).has-rail:has(>.wrap>.marquee){container:none}.to-top{display:none}[data-effect-back-to-top] .to-top{right:max(16px, env(safe-area-inset-right));bottom:max(16px, env(safe-area-inset-bottom));z-index:55;width:46px;height:46px;color:var(--ink);background:color-mix(in srgb, var(--paper) 90%, transparent);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);box-shadow:var(--shadow);transition:color var(--t-base);border-radius:50%;place-items:center;display:grid;position:fixed}[data-effect-back-to-top] .to-top:hover{color:var(--accent-text)}[data-effect-back-to-top]:has(.sample-bar) .to-top{bottom:max(76px, calc(env(safe-area-inset-bottom) + 60px))}.to-top>svg{grid-area:1/1}.to-top-ring{width:46px;height:46px;rotate:-90deg}.to-top-ring circle{fill:none;stroke-width:2px}.to-top-track{stroke:var(--line)}.to-top-fill{stroke:var(--accent);stroke-dasharray:1;stroke-dashoffset:0}.to-top-arrow{fill:none;stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round;width:18px;height:18px}@supports (animation-timeline:scroll(root)){[data-effect-back-to-top] .to-top{animation:step-end both to-top-appear;animation-timeline:scroll(root);animation-range:min(40vh,20%) min(60vh,30%)}@media (prefers-reduced-motion:no-preference){[data-effect-back-to-top] .to-top-fill{animation:linear both to-top-ring;animation-timeline:scroll(root)}[data-effect-back-to-top][data-motion]:not([data-motion=none]) .to-top{animation:linear both to-top-show;animation-timeline:scroll(root);animation-range:min(40vh,20%) min(60vh,30%)}}}@keyframes to-top-ring{0%{stroke-dashoffset:1px}}@keyframes to-top-appear{0%{opacity:0;visibility:hidden}}@keyframes to-top-show{0%{opacity:0;visibility:hidden;translate:0 12px}}[data-effect-grain] body:after{content:"";z-index:59;pointer-events:none;opacity:.05;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.8' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");background-size:180px 180px;position:fixed;inset:0}[data-effect-grain][data-template=brutalist] body:after{opacity:.07}[data-effect-link-underline] :is(.card-title .card-link,.footer-row nav a){background:linear-gradient(currentColor, currentColor) 0 100% / 0% var(--ul-w,1px) no-repeat;transition:background-size var(--t-base) var(--ease-out), color var(--t-base)}[data-effect-link-underline] .exp-row:has(.card-link) .exp-co{background:linear-gradient(currentColor, currentColor) 0 100% / 0% var(--ul-w,1px) no-repeat;transition:background-size var(--t-base) var(--ease-out), color var(--t-base)}[data-effect-link-underline] .link-more{background:linear-gradient(currentColor, currentColor) 0 100% / 0% var(--ul-w,1px) no-repeat;transition:gap var(--t-base) var(--ease-out), color var(--t-base), background-size var(--t-base) var(--ease-out)}[data-effect-link-underline] .proj-body>.link-more{align-self:flex-start}[data-effect-link-underline] .btn-row>.link-more{align-self:center}[data-effect-link-underline] :is(.card,.proj,.proj-show,.exp-row,.exp-stack-link):is(:hover,:focus-within) :is(.card-link,.exp-co,.link-more),[data-effect-link-underline] :is(.link-more,.footer-row nav a):is(:hover,:focus-visible),[data-effect-link-underline] :is(.card-link,.link-more,.footer-row nav a)[data-lit]{background-size:100% var(--ul-w,1px)}[data-effect-link-underline] .exp-row:has(.card-link) .exp-co[data-lit]{background-size:100% var(--ul-w,1px)}[data-effect-link-underline] :is([data-effect-magnetic] .hero-section:not([data-fx]),.section[data-fx~=magnetic]) .link-more.magnetic{transition:translate var(--t-base) var(--ease-out), gap var(--t-base) var(--ease-out), color var(--t-base), background-size var(--t-base) var(--ease-out)}[data-effect-link-underline][data-template=brutalist]{--ul-w:2px}[data-effect-split-titles] .tword{overflow-wrap:break-word;max-width:100%;display:inline-block}:root:not([data-effect-split-titles]) .title-cut,[data-effect-split-titles] .title-whole{display:none}.hl[data-continues]{padding-inline-end:0}@media (prefers-reduced-motion:no-preference){[data-effect-split-titles] :is([data-motion] .section:not([data-section-motion]),.section[data-section-motion]) :is(.section-head,.stats-head>div)>h2:is([data-rv=armed],[data-rv=in]){opacity:1;clip-path:none;translate:none}[data-effect-split-titles] :is([data-motion=rise] .section:not([data-section-motion]),.section[data-section-motion=rise],[data-motion=slide] .section:not([data-section-motion]),.section[data-section-motion=slide],[data-motion=scale] .section:not([data-section-motion]),.section[data-section-motion=scale]) :is(.section-head,.stats-head>div)>h2[data-rv=armed] .tword{clip-path:inset(-.35em -.25em 100%);translate:0 100%}[data-effect-split-titles] :is([data-motion=fade] .section:not([data-section-motion]),.section[data-section-motion=fade]) :is(.section-head,.stats-head>div)>h2[data-rv=armed] .tword{opacity:0}[data-effect-split-titles] :is([data-motion=wipe] .section:not([data-section-motion]),.section[data-section-motion=wipe]) :is(.section-head,.stats-head>div)>h2[data-rv=armed] .tword{clip-path:inset(-.35em 100% -.3em -.25em)}[data-effect-split-titles] :is([data-motion=blur] .section:not([data-section-motion]),.section[data-section-motion=blur]) :is(.section-head,.stats-head>div)>h2[data-rv=armed] .tword{opacity:0;filter:blur(3px);translate:0 .15em}[data-effect-split-titles] :is(.section-head,.stats-head>div)>h2[data-rv=in] .tword{clip-path:inset(-.35em -.25em -.3em);transition:translate .64s var(--ease-expo), clip-path .64s var(--ease-expo), opacity .56s var(--ease-out), filter .56s var(--ease-out);transition-delay:calc(var(--rv-d,0s) + min(var(--i,0), 10) * 45ms)}}[data-effect-highlighter] .hl{--hl-band:color-mix(in srgb, var(--accent) 28%, transparent);color:inherit;background:linear-gradient(var(--hl-band), var(--hl-band)) 0 88% / 100% .38em no-repeat}[data-effect-highlighter] :is(.section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))),.section.hero-full,.stat-feature) .hl{--hl-band:color-mix(in srgb, var(--accent) 42%, transparent)}@supports (color:oklch(from color-mix(in oklch, red 99%, blue 1%) 0.5 max(c, calc(0.1 * (1 - clamp(0, c * 100, 1)))) h)){[data-effect-highlighter] .hl{--hl-colour:oklch(from color-mix(in oklch, var(--accent) 99%, var(--link) 1%) l max(c, calc(.12 * (1 - clamp(0, c * 100, 1)))) h);--hl-band:oklch(from var(--hl-colour) .87 min(c, .15) h)}[data-effect-highlighter] :is(.section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))),.section.hero-full,.stat-feature) .hl{--hl-band:color-mix(in srgb, var(--hl-colour) 42%, transparent)}[data-effect-highlighter][data-scheme=dark] .hl,[data-effect-highlighter][data-scheme=dark] :is(.section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))),.section.hero-full,.stat-feature) .hl{--hl-band:oklch(from var(--hl-colour) .35 min(c, .13) h)}@media print{[data-effect-highlighter][data-scheme=dark] .hl,[data-effect-highlighter][data-scheme=dark] :is(.section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))),.section.hero-full,.stat-feature) .hl{--hl-band:oklch(from var(--hl-colour) .87 min(c, .15) h)}}}[data-effect-highlighter][data-template=brutalist] .hl{background-position:0 0;background-size:100% 100%}@media (prefers-reduced-motion:no-preference){[data-effect-highlighter] .hl{transition:background-size .8s var(--ease-expo) var(--hl-d,0s)}[data-effect-highlighter] [data-rv=armed] .hl{background-size:0% .38em}[data-effect-highlighter][data-template=brutalist] [data-rv=armed] .hl{background-size:0% 100%}[data-effect-highlighter] [data-rv=in] .hl{--hl-d:calc(var(--rv-d,0s) + .2s)}[data-effect-highlighter] :is([data-motion]:not([data-motion=none]) .site-main>.hero-section:first-child:not([data-section-motion]),.site-main>.hero-section:first-child[data-section-motion]:not([data-section-motion=none])) .hero:not([data-played]) .hl{animation:hl-sweep .8s var(--ease-expo) calc(var(--hero-t0) + min(var(--n,6), 10) * var(--hero-stagger) + .26s) backwards}[data-effect-highlighter][data-template=brutalist] :is([data-motion]:not([data-motion=none]) .site-main>.hero-section:first-child:not([data-section-motion]),.site-main>.hero-section:first-child[data-section-motion]:not([data-section-motion=none])) .hero:not([data-played]) .hl{animation-name:hl-sweep-full}}@keyframes hl-sweep{0%{background-size:0% .38em}}@keyframes hl-sweep-full{0%{background-size:0% 100%}}@media (prefers-reduced-motion:no-preference){:is([data-effect-aurora] .section:not([data-fx]),.section[data-fx~=aurora]).hero-full:is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])):before{background:radial-gradient(ellipse 53.85% 42.31% at 74.62% 16.15%, color-mix(in srgb, var(--brand-lit) calc(46% * var(--hero-glow,1)), transparent), transparent 62%), radial-gradient(ellipse 42.31% 34.62% at 17.69% 85.38%, color-mix(in srgb, var(--accent) calc(13% * var(--hero-glow,1)), transparent), transparent 66%);animation:16s ease-in-out infinite alternate aurora-drift;inset:-15%}@supports (animation-timeline:scroll(root)){:is([data-effect-aurora] .section:not([data-fx]),.section[data-fx~=aurora]).hero-full:is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])):before{animation:linear both hero-glow-drift,16s ease-in-out infinite alternate aurora-drift;animation-timeline:scroll(root),auto;animation-range:0 100svh,normal}}}@keyframes aurora-drift{0%{translate:0;rotate:none;scale:1}30%{translate:-6% 4%;rotate:5deg;scale:1.18}65%{translate:5% -2%;rotate:-4deg;scale:1.14}to{translate:3% 5%;rotate:3deg;scale:1.2}}@property --glow-turn{syntax:"<angle>";inherits:false;initial-value:0deg}:is([data-effect-glow-border] .section:not([data-fx]),.section[data-fx~=glowBorder]) .btn-accent{position:relative}:is([data-effect-glow-border] .section:not([data-fx]),.section[data-fx~=glowBorder]) .btn-accent:before{content:"";border-radius:inherit;pointer-events:none;background:conic-gradient(from var(--glow-turn), transparent 0 60%, color-mix(in srgb, #fff 78%, var(--accent)) 80%, transparent 97%);-webkit-mask-composite:xor;opacity:0;transition:opacity var(--t-base);padding:1.5px;position:absolute;inset:0;-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor,source-over;mask:linear-gradient(#000 0 0) content-box exclude,linear-gradient(#000 0 0)}@supports (color:oklch(from red calc(l - 0.45) c h / clamp(0, (l - 0.84) * 200, 1))){:is([data-effect-glow-border] .section:not([data-fx]),.section[data-fx~=glowBorder]) .btn-accent:before{--glow-shade:oklch(from var(--accent-solid) calc(l - .45) c h / clamp(0, (l - .84) * 200, 1));background:conic-gradient(from var(--glow-turn), transparent 0 60%, var(--glow-shade) 80%, transparent 97%), conic-gradient(from var(--glow-turn), transparent 0 60%, color-mix(in srgb, #fff 78%, var(--accent)) 80%, transparent 97%)}}:is([data-effect-glow-border] .section:not([data-fx]),.section[data-fx~=glowBorder]) .btn-accent:is(:hover,:focus-visible):before{opacity:1}@media (prefers-reduced-motion:no-preference){:is([data-effect-glow-border] .section:not([data-fx]),.section[data-fx~=glowBorder]):is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])) .btn-accent:before{animation:2.4s linear 1s 2 glow-turn,4.8s 1s glow-show}:is([data-effect-glow-border] .section:not([data-fx]),.section[data-fx~=glowBorder]):is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])) .btn-accent:is(:hover,:focus-visible):before{animation:2.4s linear 1s 2 glow-turn,4.8s 1s glow-show,2.4s linear infinite glow-spin}:is([data-effect-glow-border] .section:not([data-fx]),.section[data-fx~=glowBorder]):is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])) [data-rv=armed]>.btn-accent:before{animation:none}}@keyframes glow-turn{to{--glow-turn:360deg}}@keyframes glow-spin{to{--glow-turn:360deg}}@keyframes glow-show{0%,to{opacity:0}8%,92%{opacity:1}}:is([data-effect-spotlight] .section:not([data-fx]),.section[data-fx~=spotlight]) :is(.card,.stat-card,.exp-stack-card){isolation:isolate}:is([data-effect-spotlight] .section:not([data-fx]),.section[data-fx~=spotlight]) .exp-stack-card{position:relative}:is([data-effect-spotlight] .section:not([data-fx]),.section[data-fx~=spotlight]) .card:before,:is([data-effect-spotlight] .section:not([data-fx]),.section[data-fx~=spotlight]) .stat-card:after,:is([data-effect-spotlight] .section:not([data-fx]),.section[data-fx~=spotlight]) .exp-stack-card:after{content:"";z-index:-1;border-radius:inherit;pointer-events:none;background:radial-gradient(26rem circle at var(--px,50%) var(--py,50%), color-mix(in srgb, var(--accent) 15%, transparent), transparent 62%);opacity:0;transition:opacity var(--t-base) var(--ease-out);position:absolute;inset:0}:is([data-effect-spotlight] .section:not([data-fx]),.section[data-fx~=spotlight]) .card:after{content:"";inset:calc(var(--border-w) * -1);z-index:-1;padding:max(var(--border-w), 1px);border-radius:inherit;pointer-events:none;background:radial-gradient(14rem circle at var(--px,50%) var(--py,50%), color-mix(in srgb, var(--accent) 85%, transparent), transparent 70%);-webkit-mask-composite:xor;opacity:0;transition:opacity var(--t-base) var(--ease-out);position:absolute;-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor,source-over;mask:linear-gradient(#000 0 0) content-box exclude,linear-gradient(#000 0 0)}:is([data-effect-spotlight] .section:not([data-fx]),.section[data-fx~=spotlight]) .card:is(:hover,[data-lit]):before,:is([data-effect-spotlight] .section:not([data-fx]),.section[data-fx~=spotlight]) .card:is(:hover,[data-lit]):after,:is([data-effect-spotlight] .section:not([data-fx]),.section[data-fx~=spotlight]) .stat-card:is(:hover,[data-lit]):after,:is([data-effect-spotlight] .section:not([data-fx]),.section[data-fx~=spotlight]) .exp-stack-card:is(:hover,[data-lit]):after{opacity:1}:is([data-effect-tilt] .section:not([data-fx]),.section[data-fx~=tilt]) :is(:is(.proj,.proj-show,.card)>.proj-media:not(.image-slot),.hero-portrait-wrap){transition:transform var(--t-slow) var(--ease-out)}:is([data-effect-tilt] .section:not([data-fx]),.section[data-fx~=tilt]) :is(.proj,.proj-show,.card)>.proj-media:not(.image-slot){position:relative}:is([data-effect-tilt] .section:not([data-fx]),.section[data-fx~=tilt]) :is(:is(.proj,.proj-show,.card)>.proj-media:not(.image-slot),.hero-portrait-wrap)[data-tilt]{transform:perspective(900px) rotateX(var(--rx,0deg)) rotateY(var(--ry,0deg));transition-duration:.14s}:is([data-effect-tilt] .section:not([data-fx]),.section[data-fx~=tilt]) .hero-portrait-wrap[data-tilt]{transform-style:preserve-3d}:is([data-effect-tilt] .section:not([data-fx]),.section[data-fx~=tilt]) .hero-portrait-wrap[data-tilt] .hero-portrait-badge{translate:0 0 28px}:is([data-effect-tilt] .section:not([data-fx]),.section[data-fx~=tilt]) :is(:is(.proj,.proj-show,.card)>.proj-media:not(.image-slot),.hero-portrait-wrap .hero-portrait):after{content:"";pointer-events:none;background:radial-gradient(circle at var(--gx,50%) var(--gy,30%), #fff3, transparent 58%);opacity:0;transition:opacity var(--t-base);position:absolute;inset:0}:is([data-effect-tilt] .section:not([data-fx]),.section[data-fx~=tilt]) :is(.proj-media[data-tilt],.hero-portrait-wrap[data-tilt] .hero-portrait):after{opacity:1}:is([data-effect-timeline] .section:not([data-fx]),.section[data-fx~=timeline]) .exp-list{--tl-gutter:30px;view-timeline:--tl block;padding-inline-start:var(--tl-gutter);position:relative}:is([data-effect-timeline] .section:not([data-fx]),.section[data-fx~=timeline]) .exp-list:before,:is([data-effect-timeline] .section:not([data-fx]),.section[data-fx~=timeline]) .exp-list:after{content:"";width:max(var(--border-w), 1px);pointer-events:none;position:absolute;top:0;bottom:0;left:5px}:is([data-effect-timeline] .section:not([data-fx]),.section[data-fx~=timeline]) .exp-list:before{background:var(--line)}:is([data-effect-timeline] .section:not([data-fx]),.section[data-fx~=timeline]) .exp-list:after{background:var(--accent);transform-origin:50% 0}:is([data-effect-timeline] .section:not([data-fx]),.section[data-fx~=timeline]) .exp-row{view-timeline:--tl-row block}:is([data-effect-timeline] .section:not([data-fx]),.section[data-fx~=timeline]) .exp-row:before{content:"";left:calc(var(--tl-gutter) * -1);border:2px solid var(--accent);background:var(--accent);width:11px;height:11px;box-shadow:0 0 0 3px var(--ground,var(--paper));box-sizing:border-box;border-radius:50%;position:absolute;top:calc(clamp(22px,2.6vw,32px) + .55em - 5.5px)}:is([data-effect-timeline] .section:not([data-fx]),.section[data-fx~=timeline]):is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .exp-list:before{background:var(--line-dark)}@supports (animation-timeline:view()){@media (prefers-reduced-motion:no-preference){:is([data-effect-timeline] .section:not([data-fx]),.section[data-fx~=timeline]):is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])) .exp-list:after{animation:linear both tl-fill;animation-timeline:--tl;animation-range:cover 45vh cover calc(100% - 55vh)}:is([data-effect-timeline] .section:not([data-fx]),.section[data-fx~=timeline]):is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])) .exp-list .exp-row:before{animation:linear both tl-node;animation-timeline:--tl-row;animation-range:cover 45vh cover calc(45vh + 40px)}:is([data-effect-timeline] .section:not([data-fx]),.section[data-fx~=timeline]):is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])) .exp-list[data-fx-end]:after{transition:transform .9s var(--ease-expo);animation:none}:is([data-effect-timeline] .section:not([data-fx]),.section[data-fx~=timeline]):is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])) .exp-list[data-fx-end] .exp-row:before{transition:background-color .6s var(--ease-out);animation:none}}}@keyframes tl-fill{0%{transform:scaleY(0)}}@keyframes tl-node{0%{background:var(--ground,var(--paper))}}@supports (animation-timeline:view()){@media (prefers-reduced-motion:no-preference){:is([data-effect-cover-zoom] .section:not([data-fx]),.section[data-fx~=coverZoom]):is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])) :is(.proj,.proj-show,.card)>.proj-media:not(.image-slot){view-timeline:--cover block}:is([data-effect-cover-zoom] .section:not([data-fx]),.section[data-fx~=coverZoom]):is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])) :is(.proj,.proj-show,.card)>.proj-media:not(.image-slot) img{animation:linear both cover-zoom;animation-timeline:--cover;animation-range:entry cover 50%}:is([data-effect-cover-zoom] .section:not([data-fx]),.section[data-fx~=coverZoom]):is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])) :is(.proj,.proj-show,.card)>.proj-media[data-fx-end]:not(.image-slot) img{transition:scale .9s var(--ease-expo), transform var(--t-slow) var(--ease-out);animation:none}}}@keyframes cover-zoom{0%{scale:1.12}}@supports (animation-timeline:view()) and ((-webkit-background-clip:text) or (background-clip:text)){@media (prefers-reduced-motion:no-preference){:is([data-effect-reading-fill] .section:not([data-fx]),.section[data-fx~=readingFill]):is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])) .fill{--fill-ink:var(--ink);--fill-rest:var(--muted);background:linear-gradient(90deg, var(--fill-ink) 50%, var(--fill-rest) 50%) 0 0 / 200% 100% no-repeat;color:#0000;-webkit-background-clip:text;background-clip:text;animation:linear both read-fill;animation-timeline:view();animation-range:cover 20% cover 55%}:is([data-effect-reading-fill] .section:not([data-fx]),.section[data-fx~=readingFill]):is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .fill{--fill-ink:#fff;--fill-rest:#ffffff9e}:is([data-effect-reading-fill] .section:not([data-fx]),.section[data-fx~=readingFill]) .fill .hl{color:var(--accent-text)}:is([data-effect-reading-fill] .section:not([data-fx]),.section[data-fx~=readingFill]):is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])) .fill[data-fx-end]{transition:background-position .9s var(--ease-expo);animation:none}}}@keyframes read-fill{0%{background-position:100% 0}}.gallery img[data-lightbox]{cursor:zoom-in}.lightbox{color:#fff;background:0 0;border:0;width:100vw;max-width:none;height:100dvh;max-height:none;margin:0;padding:clamp(56px,7vh,88px) clamp(16px,6vw,96px);position:fixed;inset:0;overflow:hidden}.lightbox[open]{grid-template:minmax(0,1fr)/minmax(0,1fr);place-items:center;display:grid}.lightbox::backdrop{background:#06080ce6}.lightbox-img{object-fit:contain;border-radius:var(--r-sm);cursor:zoom-out;width:auto;max-width:100%;height:auto;max-height:100%;box-shadow:0 30px 80px -20px #0009}.lightbox-btn{color:#fff;width:44px;height:44px;transition:background var(--t-base);background:#ffffff1a;border:1px solid #ffffff3d;border-radius:50%;place-items:center;padding:0;font-size:26px;line-height:1;display:grid;position:absolute}.lightbox-btn:hover{background:#ffffff38}.lightbox-btn:focus-visible{outline-offset:3px;outline:2px solid #fff}.lightbox-prev{top:50%;left:clamp(10px,2vw,28px);translate:0 -50%}.lightbox-next{top:50%;right:clamp(10px,2vw,28px);translate:0 -50%}.lightbox-close{top:clamp(10px,2vw,24px);right:clamp(10px,2vw,24px)}.lightbox[data-single] :is(.lightbox-prev,.lightbox-next){display:none}::view-transition-group(lightbox-photo){animation-duration:.42s;animation-timing-function:var(--ease-expo)}:root[data-vt=lightbox] :is(.masthead,.masthead>.wrap){view-transition-name:none}@supports (animation-timeline:view()){@media (prefers-reduced-motion:no-preference){.site-footer>:is([data-effect-footer-reveal] .section:not([data-fx]),.section[data-fx~=footerReveal]):is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none])){view-timeline:--foot block;overflow:clip}.site-footer>:is([data-effect-footer-reveal] .section:not([data-fx]),.section[data-fx~=footerReveal]):is([data-motion]:not([data-motion=none]) .section:not([data-section-motion]),.section[data-section-motion]:not([data-section-motion=none]))>.wrap{animation:linear both foot-rise;animation-timeline:--foot;animation-range:entry}}}@keyframes foot-rise{0%{translate:0 -30%}}[data-effect-chapter-marks] :is([data-effect-timeline] .section:not([data-fx]),.section[data-fx~=timeline]):has(>.wrap .exp-list):not(.hero-section):after{display:none}@media print{.to-top{display:none!important}[data-effect-grain] body:after{display:none}[data-rv] .tword{opacity:1!important;clip-path:none!important;filter:none!important;translate:none!important}[data-effect-highlighter] .hl{-webkit-print-color-adjust:exact;print-color-adjust:exact;background-size:100% .38em!important}[data-effect-highlighter][data-template=brutalist] .hl{background-size:100% 100%!important}.fill{color:inherit!important;background:0 0!important}.fill .hl{color:inherit!important}.lightbox{display:none!important}}@media (forced-colors:active){[data-effect-grain] body:after{display:none}.fill{color:inherit!important;background:0 0!important}[data-effect-highlighter] .hl{background:0 0}:is([data-effect-spotlight] .section:not([data-fx]),.section[data-fx~=spotlight]) .card:before,:is([data-effect-spotlight] .section:not([data-fx]),.section[data-fx~=spotlight]) .card:after,:is([data-effect-spotlight] .section:not([data-fx]),.section[data-fx~=spotlight]) .stat-card:after,:is([data-effect-spotlight] .section:not([data-fx]),.section[data-fx~=spotlight]) .exp-stack-card:after,:is([data-effect-glow-border] .section:not([data-fx]),.section[data-fx~=glowBorder]) .btn-accent:before{display:none}}
[data-template=ff-outlines] .site-main>.hero-section:first-child:not(.hero-full){min-height:min(76svh,760px)}[data-template=ff-outlines] .hero-copy{border-inline-start:3px solid var(--accent-text);padding-inline-start:clamp(20px,3.5vw,44px)}[data-template=ff-outlines] .hero-portrait-wrap{width:min(100%,310px)}[data-template=ff-outlines] .hero-portrait-frame{inset:10px -10px -10px 10px}[data-template=ff-outlines] .hero-portrait{box-shadow:none;aspect-ratio:1}[data-template=ff-outlines] :is(.site-main>.section,.ff-testimonials-track>.section):not(.hero-section):not([data-bg])>.wrap{width:calc(100% - 2 * var(--gut));border:var(--border-w) solid var(--line);box-shadow:7px 7px 0 color-mix(in srgb, var(--accent) 24%, transparent);background-image:none;padding:clamp(22px,3.5vw,44px)}[data-template=ff-outlines] .section-head>h2{text-decoration:underline;-webkit-text-decoration-color:var(--accent-text);text-decoration-color:var(--accent-text);text-underline-offset:.2em;text-decoration-thickness:2px}[data-template=ff-outlines] .skill-group{border:var(--border-w) solid var(--line);padding:18px}[data-template=ff-outlines] .card{box-shadow:4px 4px 0 color-mix(in srgb, var(--accent) 16%, transparent)}[data-template=ff-aurora] .hero-section:not([data-bg]){background-image:radial-gradient(ellipse at 12% 14%, color-mix(in srgb, var(--accent) 13%, transparent), transparent 55%), radial-gradient(ellipse at 95% 78%, color-mix(in srgb, var(--brand-lit) 16%, transparent), transparent 50%)}[data-template=ff-aurora] .hero[data-has-portrait=false] .hero-copy{text-align:center;max-width:920px;margin-inline:auto}[data-template=ff-aurora] .hero[data-has-portrait=false] :is(h1,.lede){margin-inline:auto}[data-template=ff-aurora] .hero[data-has-portrait=false] :is(.btn-row,.hero-meta){justify-content:center}[data-template=ff-aurora] .hero-portrait-wrap{width:min(100%,350px);padding:14px}[data-template=ff-aurora] .hero-portrait{aspect-ratio:1;box-shadow:0 0 0 1px var(--line), 0 0 55px color-mix(in srgb, var(--accent) 20%, transparent);border-radius:50%}[data-template=ff-aurora] .hero-portrait-frame{border:1px solid var(--accent-text);border-radius:50%;inset:0}[data-template=ff-aurora] .card{border-color:color-mix(in srgb, var(--accent) 24%, var(--line));background-image:linear-gradient(145deg, color-mix(in srgb, var(--accent) 5%, transparent), transparent 58%)}[data-template=ff-aurora] .skill-group{border:1px solid var(--line);border-radius:var(--r);background:color-mix(in srgb, var(--ground) 94%, var(--accent));padding:clamp(20px,2.6vw,30px)}[data-template=ff-aurora] .exp-list{border-top:0;border-inline-start:2px solid var(--accent-text);padding-inline-start:clamp(22px,3vw,40px)}[data-template=ff-aurora] .exp-row:before{content:"";inset-inline-start:calc(-1*clamp(22px,3vw,40px) - 6px);background:var(--accent-text);width:10px;height:10px;box-shadow:0 0 0 5px var(--ground);border-radius:50%;position:absolute;top:32px}[data-template=ff-plain] .hero-section .hero[data-has-portrait]{text-align:center;grid-template-columns:minmax(0,1fr);justify-items:center}[data-template=ff-plain] .hero-copy{max-width:950px;margin-inline:auto}[data-template=ff-plain] .hero h1{max-width:16ch;margin-inline:auto}[data-template=ff-plain] .hero .lede{max-width:52ch;margin-inline:auto}[data-template=ff-plain] .hero :is(.btn-row,.hero-meta){justify-content:center}[data-template=ff-plain] .hero-portrait-wrap{order:-1;justify-self:center;width:112px}[data-template=ff-plain] .hero-portrait{aspect-ratio:1;border-radius:50%}[data-template=ff-plain] .hero-portrait-frame{border:0}[data-template=ff-plain] .hero-portrait-badge{max-width:100%;margin-top:12px;font-size:11px;position:static}[data-template=ff-plain] .section-head{text-align:center;margin-inline:auto}[data-template=ff-plain] .section-head .eyebrow{justify-content:center}[data-template=ff-plain] .about-body{max-width:65ch;margin-inline:auto}[data-template=ff-plain] .card:has(.proj-body){border:0;border-bottom:2px solid var(--line);background:0 0;padding:0 0 28px}[data-template=ff-plain] .card .proj-media{width:100%;margin:0 0 24px}[data-template=ff-plain] .skill-group{text-align:center;border:1px solid var(--line);padding:20px}[data-template=ff-plain] .skill-list{justify-content:center}[data-template]:is([data-template=ff-aurora],[data-template=ff-plain]) .section.has-rail>.wrap:has(>.section-head){display:block}[data-template]:is([data-template=ff-aurora],[data-template=ff-plain]) .section.has-rail>.wrap>.section-head{--h2-scale:1;margin-bottom:clamp(28px,4vw,48px);position:static}@media (max-width:600px){[data-template=ff-outlines] :is(.site-main>.section,.ff-testimonials-track>.section):not(.hero-section):not([data-bg])>.wrap{box-shadow:4px 4px 0 color-mix(in srgb, var(--accent) 24%, transparent);padding:22px 18px}[data-template=ff-outlines] .hero-copy{padding-inline-start:18px}[data-template=ff-aurora] .hero-portrait-wrap{justify-self:center;width:min(78%,290px)}}[data-template=ff-hacker] .hero{border:1px solid var(--accent-text);padding:clamp(28px,4vw,52px);background-image:linear-gradient(var(--line), var(--line));background-position:0 30px;background-repeat:no-repeat;background-size:100% 1px;padding-top:clamp(55px,6vw,80px);position:relative}[data-template=ff-hacker] .hero:before{content:"";border:1px solid var(--accent-text);width:7px;height:7px;box-shadow:15px 0 0 -1px var(--accent-text), 30px 0 0 -1px var(--accent-text);border-radius:50%;position:absolute;top:12px;left:18px}[data-template=ff-hacker] .hero-portrait-wrap{width:min(100%,240px)}[data-template=ff-hacker] .hero-portrait{aspect-ratio:1}[data-template=ff-hacker] .hero-portrait-frame{border-style:dashed}[data-template=ff-hacker] .section-head h2{color:var(--accent-text)}[data-template=ff-hacker] .section-head h2:before{content:"/" / "";margin-inline-end:.3em}[data-template=ff-hacker] .card{border:1px solid var(--line);border-inline-start:3px solid var(--accent-text)}[data-template=ff-hacker] .card-title:before{content:">" / "";color:var(--accent-text);margin-inline-end:.5em}[data-template=ff-hacker] .skill-group{border-block:1px solid var(--line);padding-block:22px}[data-template=ff-hacker] .exp-row{border-bottom-style:dashed}[data-template=ff-hacker] .hero-meta{letter-spacing:0;text-transform:none}[data-template=ff-flower] .hero-section:not([data-bg]){background-image:radial-gradient(ellipse at 18% 20%, color-mix(in srgb, var(--accent) 12%, transparent), transparent 52%), radial-gradient(ellipse at 88% 80%, color-mix(in srgb, var(--brand) 9%, transparent), transparent 55%)}[data-template=ff-flower] .hero-copy:before{content:"";border:1px solid var(--accent-text);background:color-mix(in srgb, var(--accent) 16%, transparent);border-radius:6px 70%;width:54px;height:54px;margin-bottom:30px;display:block;transform:rotate(-12deg)}[data-template=ff-flower] .hero[data-has-portrait=false] .hero-copy{text-align:center;margin-inline:auto}[data-template=ff-flower] .hero[data-has-portrait=false] :is(h1,.lede){margin-inline:auto}[data-template=ff-flower] .hero[data-has-portrait=false] :is(.btn-row,.hero-meta){justify-content:center}[data-template=ff-flower] .hero-portrait{aspect-ratio:1;border-radius:48% 48% 12%}[data-template=ff-flower] .hero-portrait-frame{border-radius:48% 48% 12%;inset:-14px 14px 14px -14px}[data-template=ff-flower] .card{border-color:color-mix(in srgb, var(--accent) 20%, var(--line));background-image:linear-gradient(145deg, color-mix(in srgb, var(--accent) 5%, transparent), transparent)}[data-template=ff-flower] .section-head{text-align:center;margin-inline:auto}[data-template=ff-flower] .skill-group{border-radius:var(--r-lg) var(--r-lg) var(--r-sm) var(--r-lg);border:1px solid var(--line);padding:26px}[data-template=ff-flower] .exp-list{border-top:0}[data-template=ff-flower] .exp-row{border:1px solid var(--line);border-radius:var(--r);margin-bottom:18px;padding-inline:24px}[data-template=ff-deepsea] .hero-portrait{aspect-ratio:1;border:12px solid color-mix(in srgb, var(--accent) 12%, var(--ground));box-shadow:0 0 0 1px var(--accent-text);border-radius:50%}[data-template=ff-deepsea] .hero-portrait-frame{border:0}[data-template=ff-deepsea] .hero-copy{padding-block:30px}[data-template=ff-deepsea] .hero-meta{border-top:2px solid var(--accent-text)}[data-template=ff-deepsea] .section-head>h2{border-bottom:1px solid var(--accent-text);padding-bottom:22px}[data-template=ff-deepsea] .card:has(.proj-body){background:color-mix(in srgb, var(--ground) 92%, var(--accent));border:1px solid var(--line)}[data-template=ff-deepsea] .skill-group{border-inline-start:2px solid var(--accent-text);padding-inline-start:22px}[data-template=ff-indify] .hero-portrait{aspect-ratio:5/6;border-radius:46% 46% var(--r) var(--r)}[data-template=ff-indify] .hero-portrait-frame{border-radius:46% 46% var(--r) var(--r);background:color-mix(in srgb, var(--accent) 18%, transparent);border:0;inset:20px -16px -16px 20px}[data-template=ff-indify] .section-head{text-align:center;margin-inline:auto}[data-template=ff-indify] .section-head h2:after{content:"";background:var(--accent-text);width:56px;height:3px;margin:20px auto 0;display:block}[data-template=ff-indify] .card:has([data-pick-field^=steps\.]){text-align:center}[data-template=ff-indify] .skill-group{border:1px solid var(--line);border-top:3px solid var(--accent-text);border-radius:var(--r);padding:24px}[data-template=ff-indify] .proj-show{border:1px solid var(--line);border-radius:var(--r-lg);padding:clamp(24px,3.5vw,44px)}[data-template=ff-beginner] .hero-section:not([data-bg]){background-image:radial-gradient(ellipse at 6% 12%, color-mix(in srgb, var(--accent) 18%, transparent), transparent 56%), radial-gradient(ellipse at 100% 95%, color-mix(in srgb, var(--brand-lit) 14%, transparent), transparent 60%)}[data-template=ff-beginner] .hero-portrait{aspect-ratio:1;box-shadow:12px 12px 0 color-mix(in srgb, var(--accent) 18%, transparent);border-radius:50%}[data-template=ff-beginner] .hero-portrait-frame{border:0}[data-template=ff-beginner] .hero-copy>.eyebrow{border-radius:var(--r-pill);border:1px solid var(--accent-text);padding:8px 14px}[data-template=ff-beginner] .card{box-shadow:0 18px 48px -28px color-mix(in srgb, var(--ink) 28%, transparent)}[data-template=ff-beginner] .card .proj-media{border-radius:var(--r) var(--r) 0 0}[data-template=ff-beginner] .skill-list>li{border:1px solid var(--line);border-radius:var(--r-pill);padding:7px 12px}[data-template=ff-beginner] .skill-list>li:before{content:none}[data-template=ff-beginner] .quote{border:2px solid var(--accent-text);border-radius:var(--r-lg);padding:clamp(26px,4vw,52px)}[data-template=ff-basic] .hero h1{border-bottom:4px solid var(--accent-text);padding-bottom:.12em}[data-template=ff-basic] .hero-portrait{aspect-ratio:1;box-shadow:none}[data-template=ff-basic] .hero-portrait-frame{border:0}[data-template=ff-basic] .skill-group{border-top:2px solid var(--accent-text);padding-top:22px}[data-template=ff-basic] .skill-group>.kicker{text-transform:none;letter-spacing:-.02em;border:0;font-size:1.25em}[data-template=ff-basic] .card:has(.proj-body){border:0;border-bottom:1px solid var(--line);background:0 0;padding:0 0 24px}[data-template=ff-basic] .card .proj-media{width:100%;margin:0 0 24px}[data-template=ff-basic] .hero-meta{font-family:var(--stack-mono);letter-spacing:0;font-weight:400}[data-template=ff-dark-hack] .hero h1{text-shadow:3px 2px 0 color-mix(in srgb, var(--accent) 28%, transparent)}[data-template=ff-dark-hack] .hero-copy{border-inline-start:2px dashed var(--accent-text);padding-inline-start:clamp(20px,3vw,38px)}[data-template=ff-dark-hack] .hero-portrait{border:1px solid var(--accent-text);aspect-ratio:1;box-shadow:0 0 50px color-mix(in srgb, var(--accent) 14%, transparent)}[data-template=ff-dark-hack] .hero-portrait-frame{border-style:dashed;inset:-14px 14px 14px -14px}[data-template=ff-dark-hack] .section-head{max-width:900px}[data-template=ff-dark-hack] .section-head h2{border-bottom:2px dashed var(--accent-text);padding-bottom:18px;display:inline-block}[data-template=ff-dark-hack] .card{border-color:color-mix(in srgb, var(--accent) 36%, var(--line));background-image:radial-gradient(ellipse at 0 0, color-mix(in srgb, var(--accent) 9%, transparent), transparent 60%)}[data-template=ff-dark-hack] .skill-group{border:1px dashed var(--accent-text);border-radius:var(--r);padding:24px}[data-template=ff-easy] .hero-copy{padding-block:24px;position:relative}[data-template=ff-easy] .hero[data-has-portrait=false] .hero-copy{max-width:860px;padding-inline-end:clamp(0px,8vw,110px)}[data-template=ff-easy] .hero[data-has-portrait=false] .hero-copy:after{content:"";border:1px solid var(--accent-text);background:color-mix(in srgb, var(--accent) 10%, transparent);width:clamp(36px,5vw,70px);height:clamp(36px,5vw,70px);box-shadow:10px 10px 0 color-mix(in srgb, var(--accent) 16%, transparent);pointer-events:none;position:absolute;top:8%;right:0;transform:rotate(-20deg)skew(10deg)}[data-template=ff-easy] .hero-portrait{aspect-ratio:1;border-radius:var(--r-lg)}[data-template=ff-easy] .hero-portrait-frame{border-radius:var(--r-lg);border-color:var(--accent-text);inset:18px -18px -18px 18px}[data-template=ff-easy] .card:has(.proj-body){background:color-mix(in srgb, var(--ground) 92%, var(--accent));border:0;padding:clamp(24px,4vw,44px)}[data-template=ff-easy] .card:has(.proj-body):nth-child(2n){background:color-mix(in srgb, var(--ground) 94%, var(--brand))}[data-template=ff-easy] .proj-show{border-bottom:1px solid var(--line);padding-block:36px}[data-template=ff-easy] .skill-group{border-inline-start:1px solid var(--line);padding-inline-start:24px}[data-template=ff-classic] .hero-section .hero[data-has-portrait]{text-align:center;grid-template-columns:minmax(0,1fr);justify-items:center}[data-template=ff-classic] .hero-copy{max-width:820px}[data-template=ff-classic] .hero :is(h1,.lede){margin-inline:auto}[data-template=ff-classic] .hero :is(.btn-row,.hero-meta){justify-content:center}[data-template=ff-classic] .hero-portrait-wrap{order:-1;justify-self:center;width:min(100%,660px)}[data-template=ff-classic] .hero-portrait{aspect-ratio:16/7;border-radius:var(--r-lg);box-shadow:var(--shadow-sm)}[data-template=ff-classic] .hero-portrait-frame{border:0}[data-template=ff-classic] .section-head{text-align:center;margin-inline:auto}[data-template=ff-classic] .about-body{max-width:64ch;margin-inline:auto}[data-template=ff-classic] .exp-list{border-top:0;border-inline-start:2px solid var(--line);padding-inline-start:clamp(20px,3vw,36px)}[data-template=ff-classic] .exp-row:before{content:"";inset-inline-start:calc(-1*clamp(20px,3vw,36px) - 7px);border:3px solid var(--accent-text);background:var(--ground);border-radius:50%;width:12px;height:12px;position:absolute;top:30px}[data-template=ff-classic] .skill-group{border-radius:var(--r);border:1px solid var(--line);padding:24px}[data-template]:is([data-template=ff-hacker],[data-template=ff-flower],[data-template=ff-deepsea],[data-template=ff-indify],[data-template=ff-beginner],[data-template=ff-basic],[data-template=ff-dark-hack],[data-template=ff-easy],[data-template=ff-classic]) .section.has-rail>.wrap:has(>.section-head){display:block}[data-template]:is([data-template=ff-hacker],[data-template=ff-flower],[data-template=ff-deepsea],[data-template=ff-indify],[data-template=ff-beginner],[data-template=ff-basic],[data-template=ff-dark-hack],[data-template=ff-easy],[data-template=ff-classic]) .section.has-rail>.wrap>.section-head{--h2-scale:1;margin-bottom:clamp(28px,4vw,48px);position:static}@media (min-width:861px){[data-template=ff-basic] .hero-section .hero[data-has-portrait=true]{grid-template-columns:minmax(0,.7fr) minmax(0,1.3fr);align-items:center}[data-template=ff-basic] .hero-portrait-wrap{order:-1;justify-self:start}[data-template=ff-deepsea] .grid-2:has(>.card .proj-body){grid-template-columns:repeat(auto-fit,minmax(min(280px,100%),1fr))}[data-template=ff-hacker] .grid-2:has(>.card .proj-body){grid-template-columns:minmax(0,1fr)}[data-template=ff-hacker] .card[data-has-cover=true]{grid-template-columns:minmax(0,1fr) minmax(0,2fr);align-items:start;gap:28px;display:grid}[data-template=ff-hacker] .card .proj-media{width:100%;margin:0}}@media (max-width:600px){[data-template=ff-hacker] .hero{padding:55px 22px 26px}[data-template=ff-flower] .hero-portrait-wrap,[data-template=ff-beginner] .hero-portrait-wrap,[data-template=ff-deepsea] .hero-portrait-wrap{justify-self:center;width:min(80%,290px)}[data-template=ff-dark-hack] .hero-copy{padding-inline-start:18px}[data-template=ff-easy] .hero[data-has-portrait=false] .hero-copy{padding-inline-end:0;padding-top:80px}[data-template=ff-easy] .hero[data-has-portrait=false] .hero-copy:after{top:0;right:12px}[data-template=ff-classic] .hero-portrait{aspect-ratio:4/3}}@media print{[data-template^=ff-] .hero-copy:after,[data-template^=ff-] .hero-copy:before{content:none}[data-template^=ff-] .hero{background:0 0;border:0}[data-template^=ff-] :is(.site-main>.section,.ff-testimonials-track>.section)>.wrap{box-shadow:none}}
[data-template=ff-outlines] .site-main>.hero-section:first-child:not(.hero-full){border-bottom:4px solid var(--line);min-height:350px;padding-block:clamp(40px,5vw,76px)}[data-template=ff-outlines] .hero-copy{border:0;padding-inline-start:0}[data-template=ff-outlines] .hero-portrait-wrap{width:min(100%,250px)}[data-template=ff-outlines] :is(.site-main>.section,.ff-testimonials-track>.section,.site-footer>.section):not(.hero-section){padding-block:48px}[data-template=ff-outlines][data-template] .section.has-rail>.wrap:has(>.section-head){display:block}[data-template=ff-outlines][data-template] .section.has-rail>.wrap>.section-head{--h2-scale:1;margin-bottom:28px;position:static}[data-template=ff-outlines] .section-head>h2{text-decoration:none}[data-template=ff-outlines] .section-head>h2:before{content:"> ";color:var(--accent-text)}[data-template=ff-outlines] :is(.site-main>.section,.ff-testimonials-track>.section,.site-footer>.section):not(.hero-section):not([data-bg])>.wrap{border-color:var(--accent-text);box-shadow:4px 4px 0 color-mix(in srgb, var(--accent) 55%, var(--surface))}[data-template=ff-outlines] .hero-section{--ff-button-ink:var(--ink);--ff-button-on:var(--paper)}[data-template=ff-outlines] .hero-section:is([data-theme=dark],[data-bg]:is([data-overlay=medium],[data-overlay=heavy])){--ff-button-ink:var(--accent-on-dark);--ff-button-on:var(--brand-deep)}[data-template=ff-outlines] .hero h1{color:var(--accent-text)}[data-template=ff-outlines] .hero .btn{border:1px solid var(--ff-button-ink);color:var(--ff-button-ink);box-shadow:4px 4px 0 var(--accent-text);background:0 0}[data-template=ff-outlines] .hero .btn:is(:hover,:focus-visible){background:var(--ff-button-ink);color:var(--ff-button-on);box-shadow:6px 6px 0 var(--brand);transform:none}[data-template=ff-outlines] .nav>a:is(:hover,:focus-visible){color:var(--accent-text);font-weight:600}[data-template=ff-outlines] .mobile-menu a{font-family:var(--stack-mono);letter-spacing:0;font-size:clamp(20px,5vw,30px)}[data-template=ff-aurora] .site-main{isolation:isolate;background-image:linear-gradient(-45deg, var(--paper), color-mix(in srgb, var(--brand-lit) 16%, var(--paper)), color-mix(in srgb, var(--accent) 18%, var(--paper)), color-mix(in srgb, var(--brand) 12%, var(--paper)));background-size:400% 400%;position:relative}[data-template=ff-aurora] .site-main:before{content:"";z-index:-1;pointer-events:none;background:radial-gradient(ellipse at top left, color-mix(in srgb, var(--accent) 15%, transparent), transparent 40%), radial-gradient(ellipse at top right, color-mix(in srgb, var(--brand) 15%, transparent), transparent 40%), radial-gradient(ellipse at bottom right, color-mix(in srgb, var(--brand-lit) 10%, transparent), transparent 40%);height:100svh;position:fixed;inset:0}[data-template=ff-aurora] :is(.site-main>.section,.ff-testimonials-track>.section):not([data-bg])[data-theme=light]{background:0 0}[data-template=ff-aurora] .hero-section:not(.hero-full){align-content:center;min-height:calc(100svh - 72px);padding-block:clamp(64px,9vh,120px);display:grid}[data-template=ff-aurora] .hero-section>.wrap{z-index:2;position:relative}[data-template=ff-aurora] .hero-section .hero[data-has-portrait]{text-align:center;grid-template-columns:minmax(0,1fr);justify-items:center;gap:36px}[data-template=ff-aurora] .hero-copy{max-width:1000px;margin-inline:auto}[data-template=ff-aurora] .hero :is(h1,.lede){margin-inline:auto}[data-template=ff-aurora] .hero :is(.btn-row,.hero-meta){justify-content:center}[data-template=ff-aurora] .hero-section .hero[data-has-portrait] .hero-portrait-wrap{order:1;justify-self:center;width:140px;padding:8px}[data-template=ff-aurora] :is(.hero h1,.section-head h2){color:var(--accent-text)}@supports ((-webkit-background-clip:text) or (background-clip:text)){[data-template=ff-aurora] :is(.hero h1,.section-head h2){background-image:linear-gradient(135deg, var(--accent-text), color-mix(in srgb, var(--accent-text) 50%, var(--link)), var(--link));-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text}}[data-template=ff-aurora] .section-head{text-align:center;margin-inline:auto}[data-template=ff-aurora] .card{background-color:color-mix(in srgb, var(--surface) 96%, var(--accent));border-color:var(--line)}[data-template=ff-aurora] :is(.card,.skill-group):is(:hover,:focus-within){border-color:var(--accent-text);box-shadow:0 10px 30px color-mix(in srgb, var(--accent) 20%, transparent)}[data-template=ff-aurora] .ff-aurora-particles:not([hidden]){pointer-events:none;z-index:1;width:100%;display:block;position:absolute;left:0;overflow:hidden}[data-template=ff-aurora] .ff-aurora-particles>span{background:var(--accent-text);border-radius:50%;width:8px;height:8px;position:absolute}[data-template=ff-aurora] .ff-aurora-particles>span:first-child{top:20%;left:10%}[data-template=ff-aurora] .ff-aurora-particles>span:nth-child(2){background:var(--link);animation-delay:1s;top:60%;left:80%}[data-template=ff-aurora] .ff-aurora-particles>span:nth-child(3){background:color-mix(in srgb, var(--accent-text) 60%, var(--brand-lit));animation-delay:2s;top:40%;left:60%}[data-template=ff-aurora] .ff-aurora-particles>span:nth-child(4){background:color-mix(in srgb, var(--accent-text) 60%, var(--ink));animation-delay:3s;top:80%;left:30%}[data-template=ff-plain] :is(.site-main>.section,.ff-testimonials-track>.section){align-content:center;min-height:min(100svh,960px);padding-block:clamp(64px,10vh,120px);display:grid}[data-template=ff-plain] .site-main>.hero-section{min-height:calc(100svh - 72px)}[data-template=ff-plain] :is(.site-main>.section,.ff-testimonials-track>.section)>.wrap,[data-template=ff-aurora] .hero-section>.wrap{min-width:0}[data-template=ff-plain] .section-head>h2:before{content:"#"}[data-template=ff-plain] .card:has(.proj-body){border:1px solid var(--line);border-radius:var(--r);background:var(--surface);box-shadow:0 2px 4px color-mix(in srgb, var(--ink) 15%, transparent);text-align:center;padding:28px}[data-template=ff-plain] .card .proj-media{width:100%;margin:0 0 24px}[data-template=ff-plain] .card :is(.tags,.proj-links){justify-content:center}[data-template=ff-plain] .skill-group{background:var(--surface);border-radius:var(--r);box-shadow:0 2px 4px color-mix(in srgb, var(--ink) 15%, transparent);padding:28px}[data-template=ff-plain] :is(.card,.skill-group):is(:hover,:focus-within){box-shadow:0 8px 18px color-mix(in srgb, var(--ink) 20%, transparent)}[data-template=ff-flower] .hero-copy:has(.ff-flower-bloom):before{content:none;animation:none}[data-template=ff-flower] :is(.ff-flower-bloom,.ff-flower-orb),[data-template=ff-classic] .ff-classic-mail{pointer-events:none}[data-template=ff-flower] .ff-flower-bloom{width:150px;height:150px;margin:0 auto 36px;position:relative}[data-template=ff-flower] .ff-flower-petal{transform-origin:0 0;background:linear-gradient(135deg, var(--accent), color-mix(in srgb, var(--accent) 64%, var(--brand-lit)));width:72px;height:72px;rotate:var(--ff-petal-turn);border-radius:0 100%;position:absolute;top:50%;left:50%}[data-template=ff-flower] .ff-flower-petal:first-child{--ff-petal-turn:0deg}[data-template=ff-flower] .ff-flower-petal:nth-child(2){--ff-petal-turn:72deg;animation-delay:.1s}[data-template=ff-flower] .ff-flower-petal:nth-child(3){--ff-petal-turn:144deg;animation-delay:.2s}[data-template=ff-flower] .ff-flower-petal:nth-child(4){--ff-petal-turn:216deg;animation-delay:.3s}[data-template=ff-flower] .ff-flower-petal:nth-child(5){--ff-petal-turn:288deg;animation-delay:.4s}[data-template=ff-flower] .ff-flower-center{background:color-mix(in srgb, var(--brand-lit) 70%, var(--paper));width:36px;height:36px;box-shadow:0 4px 12px color-mix(in srgb, var(--ink) 12%, transparent);border-radius:50%;position:absolute;top:calc(50% - 18px);left:calc(50% - 18px)}[data-template=ff-flower] .ff-flower-orb{aspect-ratio:1;background:linear-gradient(135deg, var(--accent), var(--brand-lit));border-radius:50%;width:min(256px,70%);margin:48px auto}[data-template=ff-classic] .ff-classic-mail{width:min(240px,100%);height:160px;margin:0 auto 24px;position:relative}[data-template=ff-classic] .ff-classic-envelope{border:3px solid var(--accent-text);background:linear-gradient(145deg, transparent 48%, var(--accent-text) 49% 51%, transparent 52%) left top / 50% 85% no-repeat, linear-gradient(215deg, transparent 48%, var(--accent-text) 49% 51%, transparent 52%) right top / 50% 85% no-repeat, var(--surface);border-radius:9px;width:128px;height:86px;position:absolute;top:48px;left:calc(50% - 64px)}[data-template=ff-classic] .ff-classic-star{background:var(--accent-text);clip-path:polygon(50% 0,63% 37%,100% 50%,63% 63%,50% 100%,37% 63%,0 50%,37% 37%);width:14px;height:14px;position:absolute}[data-template=ff-classic] .ff-classic-star:nth-child(2){top:40%;left:8%}[data-template=ff-classic] .ff-classic-star:nth-child(3){animation-delay:.1s;top:14%;left:22%}[data-template=ff-classic] .ff-classic-star:nth-child(4){animation-delay:.5s;top:3%;left:48%}[data-template=ff-classic] .ff-classic-star:nth-child(5){animation-delay:.7s;top:19%;right:12%}[data-template=ff-classic] .ff-classic-star:nth-child(6){animation-delay:.3s;top:56%;right:3%}[data-template=ff-classic] .ff-classic-star:nth-child(7){animation-delay:.2s;bottom:3%;left:16%}[data-template=ff-easy] .hero:has(.ff-easy-cubes) .hero-copy:after{content:none}[data-template=ff-easy] .hero[data-has-portrait=false]:has(.ff-easy-cubes){grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr);align-items:center}[data-template=ff-easy] .hero[data-has-portrait=false]:has(.ff-easy-cubes) .hero-copy{padding-inline-end:0;padding-top:24px}[data-template=ff-easy] .hero-portrait-wrap:has(.ff-easy-cubes){align-self:center}[data-template=ff-easy] .ff-easy-cubes{--ff-cube-size:clamp(42px, 5vw, 72px);pointer-events:none;width:100%;max-width:440px;height:clamp(260px,24vw,350px);margin:24px auto 0;position:relative}[data-template=ff-easy] .ff-easy-cube{width:var(--ff-cube-size);height:var(--ff-cube-size);background:var(--ff-cube-color);box-shadow:-24px 38px 20px color-mix(in srgb, var(--ink) 12%, transparent);position:absolute;transform:rotate(-25deg)skew(25deg)}[data-template=ff-easy] .ff-easy-cube:before{content:"";background:color-mix(in srgb, var(--ff-cube-color) 70%, var(--paper));width:16px;height:100%;position:absolute;bottom:-8px;left:-16px;transform:skewY(-45deg)}[data-template=ff-easy] .ff-easy-cube:after{content:"";background:color-mix(in srgb, var(--ff-cube-color) 45%, var(--paper));width:100%;height:16px;position:absolute;bottom:-16px;left:-8px;transform:skew(-45deg)}[data-template=ff-easy] .ff-easy-cube:first-child{--ff-cube-color:color-mix(in srgb, var(--accent) 55%, var(--paper));top:53%;left:17%}[data-template=ff-easy] .ff-easy-cube:nth-child(2){--ff-cube-color:color-mix(in srgb, var(--accent) 35%, var(--surface));top:7%;left:42%}[data-template=ff-easy] .ff-easy-cube:nth-child(3){--ff-cube-color:color-mix(in srgb, var(--brand) 50%, var(--paper));top:30%;left:73%}[data-template=ff-easy] .ff-easy-cube:nth-child(4){--ff-cube-color:color-mix(in srgb, var(--brand-lit) 45%, var(--paper));top:69%;left:55%}@media (max-width:860px){[data-template=ff-easy] .hero[data-has-portrait=false]:has(.ff-easy-cubes){grid-template-columns:minmax(0,1fr)}[data-template=ff-easy] .hero>.ff-easy-cubes{width:min(100%,360px)}}@media (min-width:901px){:is([data-template=ff-plain] .grid-2:has(>.card .proj-body),[data-template=ff-plain] .skill-groups){grid-template-columns:repeat(auto-fit,minmax(min(240px,100%),1fr))}}html[data-template^=ff-][data-motion=native] .section:not([data-section-motion]) .hero :is(.hword,.eyebrow,.lede,.btn-row,.hero-meta,.hero-portrait,.hero-portrait img,.hero-portrait-frame,.hero-portrait-badge),[data-template^=ff-] .section[data-section-motion=native] .hero :is(.hword,.eyebrow,.lede,.btn-row,.hero-meta,.hero-portrait,.hero-portrait img,.hero-portrait-frame,.hero-portrait-badge){animation:none!important}html[data-template^=ff-][data-motion=native] .section:not([data-section-motion]) [data-rv=armed] :is(.stat-value,.stat-feature-value){clip-path:none;translate:none}html[data-template^=ff-][data-motion=native] .section:not([data-section-motion]) .stat-card[data-rv=armed]:before{scale:1}[data-template^=ff-] [data-ff-reveal=armed]{opacity:0}html[data-template^=ff-][data-editing] [data-ff-reveal]{opacity:1;translate:none;scale:none}@media (prefers-reduced-motion:no-preference){html[data-template=ff-outlines]:not([data-motion=none]) .hero .btn{transition:color .3s ease-in-out,background .3s ease-in-out,box-shadow .3s ease-in-out}html[data-template=ff-outlines][data-motion=native]:not([data-editing]) .mobile-menu{animation:.35s ease-out both ff-outlines-menu-in}html[data-template=ff-outlines][data-motion=native]:not([data-editing]) .mobile-menu[data-closing]{animation:.18s ease-in both ff-outlines-menu-out}html[data-template=ff-outlines][data-motion=native] .mobile-menu>:is(a,.mobile-menu-lang){animation:none}html[data-template=ff-aurora][data-motion=native]:not([data-editing]) .site-main{animation:15s infinite ff-aurora-flow}html[data-template=ff-aurora]:not([data-editing]) .ff-aurora-particles[data-ff-native]>span{animation-name:ff-aurora-float;animation-duration:6s;animation-timing-function:ease-in-out;animation-iteration-count:infinite}html[data-template=ff-aurora]:not([data-motion=none]) :is(.card,.skill-group){transition:transform .3s,border-color .3s,box-shadow .3s}html[data-template=ff-aurora]:not([data-motion=none]):not([data-editing]) :is(.card,.skill-group):is(:hover,:focus-within){transform:translateY(-5px)}html[data-template=ff-aurora]:not([data-motion=none]):not([data-editing]) .hero .btn:is(:hover,:focus-visible){transform:scale(1.05)}html[data-template=ff-plain]:not([data-motion=none]) :is(.card,.skill-group){transition:box-shadow .28s cubic-bezier(.4,0,.2,1)}html[data-template=ff-flower]:not([data-editing]) .ff-flower-bloom[data-ff-native]{animation:2s ease-out both ff-flower-bloom}html[data-template=ff-flower]:not([data-editing]) .ff-flower-bloom[data-ff-native]>.ff-flower-petal{animation-name:ff-flower-sway;animation-duration:3s;animation-timing-function:ease-in-out;animation-iteration-count:infinite}html[data-template=ff-flower]:not([data-editing]) .ff-flower-orb[data-ff-native]{animation:6s ease-in-out infinite ff-original-float}html[data-template=ff-classic]:not([data-editing]) .ff-classic-mail[data-ff-native]>.ff-classic-envelope{animation:2s ease-in-out infinite ff-original-float}html[data-template=ff-classic]:not([data-editing]) .ff-classic-mail[data-ff-native]>.ff-classic-star{animation-name:ff-classic-twinkle;animation-duration:1s;animation-timing-function:ease-in-out;animation-iteration-count:infinite}}[data-template=ff-aurora] :is(.site-main>.section,.ff-testimonials-track>.section)[data-section-motion]:not([data-section-motion=native]){background-color:var(--ground)}@media (prefers-reduced-motion:no-preference){html[data-template=ff-aurora]:not([data-editing]) .section[data-section-motion=native]{background-image:linear-gradient(-45deg, var(--paper), color-mix(in srgb, var(--brand-lit) 16%, var(--paper)), color-mix(in srgb, var(--accent) 18%, var(--paper)), color-mix(in srgb, var(--brand) 12%, var(--paper)));background-size:400% 400%;animation:15s infinite ff-aurora-flow}}@keyframes ff-flower-bloom{0%{opacity:0;scale:0}50%{opacity:.8;scale:1.1}to{opacity:1;scale:1}}@keyframes ff-flower-sway{0%,to{transform:rotate(-2deg)}50%{transform:rotate(2deg)}}@keyframes ff-original-float{0%,to{translate:0}50%{translate:0 -20px}}@keyframes ff-classic-twinkle{0%{opacity:0}50%{opacity:.5}to{opacity:1}}@keyframes ff-outlines-menu-in{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes ff-outlines-menu-out{0%{transform:translate(0)}to{transform:translate(100%)}}@keyframes ff-aurora-flow{0%,to{background-position:0%;background-size:200% 200%}50%{background-position:100%;background-size:200% 200%}}@keyframes ff-aurora-float{0%,to{transform:translateY(0)}50%{transform:translateY(-20px)}}@media (prefers-reduced-motion:reduce){[data-template^=ff-] [data-ff-reveal]{opacity:1;translate:none;scale:none}}@media print{[data-template=ff-aurora] .ff-aurora-particles{display:none}[data-template=ff-aurora] .site-main:before{content:none}[data-template=ff-plain] :is(.site-main>.section,.ff-testimonials-track>.section){min-height:0}[data-template^=ff-] [data-ff-reveal]{opacity:1}}[data-template=ff-outlines] .site-main>.hero-section:first-child:not(.hero-full){min-height:0;padding-block:clamp(26px,2.6vw,38px) clamp(30px,3vw,44px)}[data-template=ff-outlines] .hero[data-has-portrait]{align-items:center;gap:clamp(24px,4vw,64px)}@media (min-width:861px){[data-template=ff-outlines] .hero[data-has-portrait=true]{grid-template-columns:minmax(0,1fr) clamp(150px,15vw,210px)}}[data-template=ff-outlines] .hero-portrait-wrap{justify-self:end;width:100%;max-width:210px}[data-template=ff-outlines] .hero-copy[data-ff-has-name]:before{color:var(--body);margin-bottom:4px;font-size:clamp(14px,1.4vw,20px);line-height:1.3;display:block}[data-template=ff-outlines] .hero-section:is([data-theme=dark],[data-bg]:is([data-overlay=medium],[data-overlay=heavy])) .hero-copy[data-ff-has-name]:before,[data-template=ff-outlines] .hero-section:is([data-theme=dark],[data-bg]:is([data-overlay=medium],[data-overlay=heavy])) .hero-copy[data-ff-has-name] h1{color:#ffffffe6}[data-template=ff-outlines] .hero-copy[data-ff-has-name]:lang(en):before{content:"Hey there,"}[data-template=ff-outlines] .hero-copy[data-ff-has-name]:lang(zh):before{content:"你好，"}[data-template=ff-outlines][data-template] .ff-hero-name{--ff-name-scale:.74;--ff-name-weight-offset:100;color:var(--accent-text);font-family:var(--font-display);font-weight:clamp(300, calc(var(--h1-weight) - var(--ff-name-weight-offset)), 900);font-size:calc(var(--h1-size) * var(--font-width-rel,1) * var(--ff-name-scale));letter-spacing:0;overflow-wrap:anywhere;margin:0 0 8px;line-height:1.2;display:block}[data-template=ff-outlines] .ff-hero-name:lang(en):before{content:"I am "}[data-template=ff-outlines] .ff-hero-name:lang(zh):before{content:"我是"}[data-template=ff-outlines] .hero-copy>.eyebrow{margin-bottom:10px}[data-template=ff-outlines] .hero-copy[data-ff-has-name] h1{max-width:40ch;color:var(--ink);font-family:var(--font-sans);letter-spacing:0;margin:0 0 12px;font-size:clamp(15px,1.4vw,20px);font-weight:400;line-height:1.4}[data-template=ff-outlines] .hero-copy[data-ff-has-name] h1 :is(.hl,.rotor){color:inherit}[data-template=ff-outlines] .hero .lede{max-width:64ch;font-size:clamp(13px,1vw,15px);line-height:1.65}[data-template=ff-outlines] .hero-section:is([data-theme=dark],[data-bg]:is([data-overlay=medium],[data-overlay=heavy])) .hero .lede{color:#ffffffbd}[data-template=ff-outlines] .hero .btn-row{gap:18px;margin-top:20px}[data-template=ff-outlines][data-template] .hero .btn{letter-spacing:0;text-transform:none;border-radius:0;padding:.8em 1em;font-size:clamp(14px,1.1vw,17px);font-weight:400}[data-template=ff-outlines] .hero .hero-meta{margin-top:22px;padding-top:14px;font-size:11px}[data-template=ff-outlines] .masthead .nav>a.nav-cta{color:var(--accent-text);box-shadow:3px 3px 0 var(--accent);background:0 0;border:1px solid;border-radius:0;padding:8px 14px}[data-template=ff-outlines] :is(.site-main>.section,.ff-testimonials-track>.section,.site-footer>.section):not(.hero-section):not([data-bg])>.wrap{isolation:isolate;width:min(calc(100% - 2 * var(--gut)), calc(75vw - 48px));box-shadow:none;background:0 0;border:0;padding:clamp(20px,2.4vw,34px);position:relative}[data-template=ff-outlines] :is(.site-main>.section,.ff-testimonials-track>.section,.site-footer>.section):not(.hero-section):not([data-bg])>.wrap:before{content:"";z-index:-1;pointer-events:none;background:var(--ground);border:var(--border-w) solid var(--accent-text);box-shadow:4px 4px 0 color-mix(in srgb, var(--accent) 55%, var(--surface));position:absolute;inset:0}[data-template=ff-outlines] :is(.site-main>.section,.ff-testimonials-track>.section,.site-footer>.section):not(.hero-section):not([data-bg]):has(>.wrap>.section-head>.eyebrow){padding-top:clamp(56px,6vw,72px)}[data-template=ff-outlines] :is(.site-main>.section,.ff-testimonials-track>.section,.site-footer>.section):not(.hero-section):not([data-bg])>.wrap>.section-head>.eyebrow{z-index:-2;inset-inline-start:calc(-1*clamp(8px,4.2vw,60px));max-width:calc(100vw - 2*clamp(8px,4.2vw,60px));font-family:var(--font-display);letter-spacing:0;overflow-wrap:anywhere;text-wrap:balance;color:color-mix(in srgb, var(--accent-text) 75%, var(--ground));margin:0;font-size:clamp(28px,7.4vw,64px);font-weight:600;line-height:1;display:block;position:absolute;bottom:calc(100% - .18em)}[data-template=ff-outlines] :is(.site-main>.section,.ff-testimonials-track>.section,.site-footer>.section):not(.hero-section):not([data-bg])>.wrap>.section-head>.eyebrow:is(:lang(zh),:lang(ja)){bottom:calc(100% - .05em)}[data-template=ff-outlines] :is(.site-main>.section,.ff-testimonials-track>.section,.site-footer>.section):not(.hero-section):not([data-bg])>.wrap>.section-head>.eyebrow:before{content:none}[data-template=ff-outlines] .section-head>h2{font-size:calc(var(--h2-size) * var(--h2-script,1) * var(--font-width-rel,1) * .7)}[data-template=ff-outlines][data-template] .card{border-color:var(--accent);box-shadow:none;border-radius:8px}[data-template=ff-outlines] .card:has(.proj-body) .card-title{color:var(--accent-text);text-align:center}@media (max-width:600px){[data-template=ff-outlines] :is(.site-main>.section,.ff-testimonials-track>.section,.site-footer>.section):not(.hero-section):not([data-bg])>.wrap{width:calc(100% - 2 * var(--gut) - 12px);padding:22px 18px}[data-template=ff-outlines] .hero-portrait-wrap{justify-self:start;max-width:120px}[data-template=ff-outlines] .section-head>h2{font-size:calc(var(--h2-size) * var(--h2-script,1) * var(--font-width-rel,1) * .85)}}@media print{[data-template=ff-outlines] .section-head>.eyebrow{opacity:1;font-size:12px;position:static}}[data-template=ff-aurora]{--ff-au-green:var(--accent-text);--ff-au-blue:var(--link);--ff-au-purple:color-mix(in srgb, var(--link) 45%, var(--brand-lit));--ff-au-pink:color-mix(in srgb, var(--accent-text) 50%, var(--brand-lit));--ff-au-purple-text:var(--link);--ff-au-pink-text:var(--accent-text);--ff-au-fill-a:var(--accent);--ff-au-fill-b:color-mix(in srgb, var(--accent) 55%, var(--brand))}[data-template=ff-aurora][data-colorway=source-lights]{--ff-au-green:#0fa;--ff-au-blue:#0af;--ff-au-purple:#a0f;--ff-au-pink:#f0a;--ff-au-purple-text:#c27aff;--ff-au-pink-text:#ff5cc8;--ff-au-fill-a:#0fa;--ff-au-fill-b:#0af}[data-template=ff-aurora] .site-main,html[data-template=ff-aurora]:not([data-editing]) .section[data-section-motion=native]{background-image:linear-gradient(-45deg, var(--paper), color-mix(in srgb, var(--ff-au-purple) 14%, var(--paper)), color-mix(in srgb, var(--ff-au-blue) 16%, var(--paper)), color-mix(in srgb, var(--ff-au-blue) 10%, var(--paper)))}[data-template=ff-aurora] .site-main:before{opacity:.7;background:radial-gradient(ellipse at top left, color-mix(in srgb, var(--ff-au-green) 15%, transparent), transparent 40%), radial-gradient(ellipse at top right, color-mix(in srgb, var(--ff-au-blue) 15%, transparent), transparent 40%), radial-gradient(ellipse at bottom left, color-mix(in srgb, var(--ff-au-purple) 10%, transparent), transparent 40%), radial-gradient(ellipse at bottom right, color-mix(in srgb, var(--ff-au-pink) 10%, transparent), transparent 40%)}[data-template=ff-aurora] .hero-section:not([data-bg]){background-image:none}[data-template=ff-aurora] :is(.hl,.rotor){font-family:inherit;font-style:normal;font-weight:inherit;letter-spacing:inherit}[data-template=ff-aurora][data-template] .ff-hero-name{--ff-name-scale:.58;color:var(--ink);font-family:var(--font-display);font-weight:var(--h1-weight);font-size:max(2.3rem, calc(var(--h1-size) * var(--font-width-rel,1) * var(--ff-name-scale)));letter-spacing:-.03em;overflow-wrap:anywhere;text-wrap:balance;margin:0 0 16px;line-height:1.12;display:block}[data-template=ff-aurora] .ff-hero-name:lang(en):before{content:"Hello, I'm "}[data-template=ff-aurora] .ff-hero-name:lang(zh):before{content:"你好，我是"}[data-template=ff-aurora][data-template] .ff-hero-name>a{color:var(--ff-au-blue)}@supports ((-webkit-background-clip:text) or (background-clip:text)){[data-template=ff-aurora][data-template] .ff-hero-name>a{background-image:linear-gradient(135deg, var(--ff-au-green) 0%, var(--ff-au-blue) 50%, var(--ff-au-purple) 100%);color:#0000;-webkit-text-fill-color:transparent;-webkit-box-decoration-break:clone;box-decoration-break:clone;-webkit-background-clip:text;background-clip:text}[data-template=ff-aurora] .section-head h2{background-image:linear-gradient(135deg, var(--ff-au-green) -150%, var(--ff-au-blue) 50%, var(--ff-au-purple) 250%)}}[data-template=ff-aurora] .hero-copy[data-ff-has-name] h1{max-width:44ch;color:var(--muted);-webkit-text-fill-color:currentColor;font-family:var(--font-sans);letter-spacing:0;background-image:none;margin:0 auto 24px;font-size:clamp(18px,1.7vw,24px);font-weight:400;line-height:1.4}[data-template=ff-aurora] .hero .lede{max-width:42rem;color:var(--muted);font-size:clamp(16px,1.25vw,18px)}[data-template=ff-aurora] .hero .btn-row{gap:16px}[data-template=ff-aurora][data-template] .hero .btn-accent{background-color:var(--ff-au-fill-b);background-image:linear-gradient(90deg, var(--ff-au-fill-a), var(--ff-au-fill-b));color:var(--accent-ink);border:0;font-weight:600}[data-template=ff-aurora][data-template] .hero .btn-ghost{border:2px solid var(--ff-au-fill-a);color:var(--ink);font-weight:500}[data-template=ff-aurora][data-template] .hero .btn-ghost:hover{background:var(--ff-au-fill-a);color:var(--accent-ink)}[data-template=ff-aurora] .masthead .nav>a.nav-cta{background-image:linear-gradient(90deg, var(--ff-au-fill-a), var(--ff-au-fill-b));color:var(--accent-ink)}[data-template=ff-aurora] .ff-aurora-particles>span:first-child{background:var(--ff-au-green)}[data-template=ff-aurora] .ff-aurora-particles>span:nth-child(2){background:var(--ff-au-blue)}[data-template=ff-aurora] .ff-aurora-particles>span:nth-child(3){background:var(--ff-au-purple)}[data-template=ff-aurora] .ff-aurora-particles>span:nth-child(4){background:var(--ff-au-pink)}[data-template=ff-aurora] .hero-portrait-frame{background:linear-gradient(135deg, var(--ff-au-green), var(--ff-au-blue), var(--ff-au-purple)) border-box;border:3px solid #0000;-webkit-mask:linear-gradient(#000 0 0) padding-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor,source-over;mask:linear-gradient(#000 0 0) padding-box exclude,linear-gradient(#000 0 0)}[data-template=ff-aurora] .hero-portrait{box-shadow:0 0 55px color-mix(in srgb, var(--ff-au-blue) 22%, transparent)}[data-template=ff-aurora][data-template] :is(.card,.skill-group){background-color:var(--surface);border:1px solid var(--line);background-image:none;border-radius:8px}[data-template=ff-aurora] .card[data-pick-field^=steps\.]{text-align:center}[data-template=ff-aurora] .card[data-pick-field^=steps\.]>.kicker{background:linear-gradient(135deg, var(--ff-au-green), var(--ff-au-blue));width:64px;height:64px;color:var(--accent-ink);letter-spacing:0;border-radius:50%;place-items:center;margin:0 auto 16px;font-size:18px;display:grid}[data-template=ff-aurora] .card[data-pick-field^=steps\.]:nth-child(3n+2)>.kicker{background:linear-gradient(135deg, var(--ff-au-blue), var(--ff-au-purple));color:#fff}[data-template=ff-aurora] .card[data-pick-field^=steps\.]:nth-child(3n)>.kicker{background:linear-gradient(135deg, var(--ff-au-purple), var(--ff-au-pink));color:#fff}[data-template=ff-aurora][data-template] .exp-list{border:0;max-width:56rem;margin-inline:auto;padding:0}[data-template=ff-aurora] .exp-list>.exp-row{--ff-au-row:var(--ff-au-green);--ff-au-row-text:var(--ff-au-green);border:0;border-inline-start:2px solid var(--ff-au-row);background:linear-gradient(var(--surface), var(--surface)) no-repeat 32px 0 / calc(100% - 32px) 100%;margin-bottom:32px;padding:24px 24px 24px 56px;position:relative}[data-template=ff-aurora] .exp-list>.exp-row:nth-child(3n+2){--ff-au-row:var(--ff-au-blue);--ff-au-row-text:var(--ff-au-blue)}[data-template=ff-aurora] .exp-list>.exp-row:nth-child(3n){--ff-au-row:var(--ff-au-purple);--ff-au-row-text:var(--ff-au-purple-text)}[data-template=ff-aurora] .exp-list>.exp-row:before{inset-inline-start:-9px;background:var(--ff-au-row);width:16px;height:16px;box-shadow:none;top:0}[data-template=ff-aurora] .exp-list>.exp-row .exp-co{color:var(--ff-au-row-text)}[data-template=ff-aurora] .grid-3>.card>.stat-value{color:var(--ff-au-green)}[data-template=ff-aurora] .grid-3>.card:nth-child(4n+2)>.stat-value{color:var(--ff-au-blue)}[data-template=ff-aurora] .grid-3>.card:nth-child(4n+3)>.stat-value{color:var(--ff-au-purple-text)}[data-template=ff-aurora] .grid-3>.card:nth-child(4n)>.stat-value{color:var(--ff-au-pink-text)}[data-template=ff-aurora] .skill-group>.kicker{color:var(--ff-au-green)}[data-template=ff-aurora] .skill-group:nth-child(3n+2)>.kicker{color:var(--ff-au-blue)}[data-template=ff-aurora] .skill-group:nth-child(3n)>.kicker{color:var(--ff-au-purple-text)}[data-template=ff-aurora] .card[data-has-cover]{padding:0;overflow:hidden}[data-template=ff-aurora] .card[data-has-cover]>.proj-media{background-image:linear-gradient(135deg, var(--ff-au-green), var(--ff-au-blue));border-radius:0;width:100%;margin:0}[data-template=ff-aurora] .card[data-has-cover]:nth-child(3n+2)>.proj-media{background-image:linear-gradient(135deg, var(--ff-au-blue), var(--ff-au-purple))}[data-template=ff-aurora] .card[data-has-cover]:nth-child(3n)>.proj-media{background-image:linear-gradient(135deg, var(--ff-au-purple), var(--ff-au-pink))}[data-template=ff-aurora] .card[data-has-cover]>.proj-body{padding:24px}[data-template=ff-aurora] .card[data-has-cover=false]:before{content:"";background:linear-gradient(90deg, var(--ff-au-green), var(--ff-au-blue), var(--ff-au-purple));height:12px;display:block}@media (min-width:900px){[data-template=ff-aurora] .grid-2:has(>.card .proj-body){grid-template-columns:repeat(auto-fit,minmax(min(260px,100%),1fr))}}@media (forced-colors:active){[data-template=ff-aurora][data-template] .ff-hero-name>a{color:linktext;-webkit-text-fill-color:LinkText;background:0 0}}[data-template=ff-plain] .hero-portrait-wrap{display:none}[data-template=ff-plain] .hero-section .hero[data-has-portrait]{grid-template-columns:minmax(0,1fr)}[data-template=ff-plain][data-template] .ff-hero-name{--ff-name-scale:1.72;--ff-name-weight-offset:300;color:var(--ink);font-family:var(--font-display);font-size:max(3.25rem, calc(var(--h1-size) * var(--font-width-rel,1) * var(--ff-name-scale)));font-weight:clamp(300, calc(var(--h1-weight) - var(--ff-name-weight-offset)), 900);letter-spacing:-.016em;overflow-wrap:anywhere;margin:0;line-height:1;display:block}[data-template=ff-plain] .ff-hero-name:lang(zh){letter-spacing:0;line-height:1.2}[data-template=ff-plain] .hero-copy>.eyebrow{margin:18px 0 6px}[data-template=ff-plain] .hero-copy[data-ff-has-name] h1{max-width:30ch;color:var(--ink);font-family:var(--font-display);font-size:clamp(20px,1.7vw,24px);font-weight:var(--h2-weight);letter-spacing:0;margin:0 auto 22px;line-height:1.5}[data-template=ff-plain] .hero-copy[data-ff-has-name] h1 :is(.hl,.rotor){color:inherit}[data-template=ff-plain] .hero .lede{max-width:30rem;color:var(--body);font-size:16px;line-height:1.5}[data-template=ff-plain] .hero .btn-row{gap:8px;margin-top:28px}[data-template=ff-plain][data-template] .hero .btn{min-height:44px;color:var(--ink);letter-spacing:1.25px;text-transform:uppercase;box-shadow:none;background:0 0;border:1px solid #0000;border-radius:4px;padding:0 19px;font-size:14px;font-weight:500}[data-template=ff-plain][data-template] .hero .btn-accent{border-color:currentColor}[data-template=ff-plain][data-template] .hero .btn:hover{background:color-mix(in srgb, var(--ink) 6%, transparent);transform:none}[data-template=ff-plain] .hero .hero-meta{margin-top:28px;padding-top:14px;font-size:11px}[data-template=ff-plain] .section-head>h2{font-size:max(26px, calc(var(--h2-size) * var(--h2-script,1) * var(--font-width-rel,1) * .94))}[data-template=ff-plain] :is(.hl,.rotor){font-family:inherit;font-style:normal;font-weight:inherit}[data-template=ff-plain] .card:has(.proj-body) .card-title{color:color-mix(in srgb, var(--ink) 68%, transparent);font-size:21px}@media (min-width:901px){[data-template=ff-plain][data-nav=centered] .masthead .wrap{flex-wrap:wrap;justify-content:center;align-items:center;gap:4px 6px;height:auto;min-height:60px;padding-block:8px;display:flex}[data-template=ff-plain][data-nav=centered] .masthead :is(.nav,.nav-meta){margin:0}[data-template=ff-plain][data-nav=centered] .masthead .nav-meta{padding-left:12px}[data-template=ff-plain][data-nav=centered] .masthead .nav-brand-tile{display:none}[data-template=ff-plain][data-nav=centered] .masthead :is(.nav-brand,.nav>a){letter-spacing:1.25px;text-transform:uppercase;padding:10px 19px;font-size:14px;font-weight:500}[data-template=ff-plain][data-nav=centered] .masthead .nav>a.nav-cta{color:var(--ink);background:0 0;border:1px solid;border-radius:4px;margin-left:4px;padding:10px 19px}[data-template=ff-plain][data-nav=centered] .masthead .nav>a.nav-cta:hover{background:color-mix(in srgb, var(--ink) 6%, transparent)}}[data-template=ff-plain][data-template] :is(.card,.skill-group){background:var(--paper);border:0;border-radius:4px;box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}[data-template=ff-plain][data-template] :is(.card,.skill-group):is(:hover,:focus-within){box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}
