.ff-hero-name,.ff-terminal-navigation{display:none}.ff-testimonials-group,.ff-testimonials-track{display:contents}[data-template=ff-beginner] .ff-testimonials-group{display:block}[data-template=ff-indify] [data-ff-carousel=projects]{overscroll-behavior-inline:contain;scroll-snap-type:x mandatory;scrollbar-width:thin;cursor:grab;align-items:stretch;gap:16px;padding-block:12px 24px;display:flex;overflow-x:auto}[data-template=ff-indify] [data-ff-carousel=projects]>*{scroll-snap-align:start;flex:0 0 100%;min-width:0}[data-template=ff-indify] [data-ff-carousel=projects]>.card{box-shadow:none;background:0 0;border:0;grid-template-columns:1fr 1fr;align-items:center;gap:clamp(24px,4vw,64px);display:grid}[data-template=ff-indify] [data-ff-carousel=projects] .proj-media{border-radius:12px;width:100%;margin:0}[data-template=ff-indify] [data-ff-carousel=projects]>[data-has-cover=false]{border:1px solid var(--line);padding:32px;display:block}:is(html[data-template=ff-indify],[data-template=ff-beginner]) .ff-carousel-controls{justify-content:center;align-items:center;gap:16px;margin-top:20px;display:flex}:is(html[data-template=ff-indify],[data-template=ff-beginner]) .ff-carousel-controls>button{border:1px solid var(--line);background:var(--ground);color:var(--accent-text);cursor:pointer;border-radius:50%;width:40px;height:40px}:is(html[data-template=ff-indify],[data-template=ff-beginner]) .ff-carousel-controls>button:disabled{opacity:.35;cursor:default}:is(html[data-template=ff-indify],[data-template=ff-beginner]) .ff-carousel-dots{flex-wrap:wrap;justify-content:center;gap:8px;display:flex}:is(html[data-template=ff-indify],[data-template=ff-beginner]) .ff-carousel-dots button{border:1px solid var(--accent-text);cursor:pointer;background:0 0;border-radius:50%;width:12px;height:12px;padding:0}:is(html[data-template=ff-indify],[data-template=ff-beginner]) .ff-carousel-dots button[aria-current]{background:var(--accent-text)}[data-template=ff-beginner] .ff-carousel-controls .ff-carousel-pause{border-radius:8px;width:auto;padding-inline:15px;font-size:13px}[data-template=ff-beginner] .ff-testimonials-track{scroll-snap-type:x mandatory;overscroll-behavior-inline:contain;display:flex;overflow-x:auto}[data-template=ff-beginner] .ff-testimonials-track>.section{scroll-snap-align:start;flex:0 0 100%;min-width:0}[data-template=ff-hacker] .hero{background:0 0;border:0;align-content:center;min-height:min(76svh,720px);padding:0}[data-template=ff-hacker] .hero:before{content:none}[data-template=ff-hacker] .site-main:has(>.hero-section:first-child):before{content:"";z-index:5;background:var(--accent-text);pointer-events:none;width:16px;height:4px;position:fixed;top:44px;left:6px}[data-template=ff-hacker] .hero h1{color:var(--accent-text)}:is([data-template=ff-hacker] .grid:has(>.card .proj-body),[data-template=ff-hacker] .skill-groups){grid-template-columns:1fr}[data-template=ff-hacker] .card,[data-template=ff-hacker] .skill-group{background:color-mix(in srgb, var(--ink) 7%, var(--ground));border:0;border-radius:4px;padding:28px;transition:box-shadow .3s}[data-template=ff-hacker] :is(.card,.skill-group):hover{box-shadow:0 7px 18px color-mix(in srgb, var(--ink) 18%, transparent)}[data-template=ff-deepsea] :is(.ff-hero-name,.hero h1,.section-head h2){color:var(--accent-text)}@supports ((-webkit-background-clip:text) or (background-clip:text)){[data-template=ff-deepsea] :is(.ff-hero-name,.hero h1,.section-head h2){background-image:linear-gradient(270deg, var(--ink), var(--accent-text));-webkit-text-fill-color:transparent;background-size:300% 300%;-webkit-background-clip:text;background-clip:text}}[data-template=ff-indify] .hero-portrait{aspect-ratio:1;border-radius:8px}[data-template=ff-indify] .hero-portrait-frame{display:none}[data-template=ff-flower] .hero-copy:before{transform-origin:bottom}[data-template=ff-flower] .skill-group:before{content:"";background:color-mix(in srgb, var(--accent) 35%, transparent);border:1px solid var(--accent-text);border-radius:60% 12%;width:38px;height:38px;margin:0 auto 16px;display:block}[data-template=ff-flower] .card{transition:box-shadow .3s}[data-template=ff-flower] .card:hover{box-shadow:0 12px 32px color-mix(in srgb, var(--accent) 18%, transparent);transform:none}[data-template=ff-dark-hack] [data-ff-glitch]{position:relative}[data-template=ff-dark-hack] [data-ff-glitch]:before,[data-template=ff-dark-hack] [data-ff-glitch]:after{content:attr(data-ff-glitch) / "";pointer-events:none;opacity:0;position:absolute;inset:0;overflow:clip}[data-template=ff-dark-hack] [data-ff-glitch]:before{color:var(--accent-text)}[data-template=ff-dark-hack] [data-ff-glitch]:after{color:var(--brand-lit)}[data-template=ff-dark-hack] [data-ff-glow]{isolation:isolate;position:relative;overflow:clip}[data-template=ff-dark-hack] [data-ff-glow]:before{content:"";z-index:-1;background:radial-gradient(circle 110px at var(--ff-pointer-x,50%) var(--ff-pointer-y,60%), color-mix(in srgb, var(--accent) 35%, transparent), transparent 80%);pointer-events:none;position:absolute;inset:0}@keyframes ff-terminal-cursor{0%,49%{opacity:1}50%,to{opacity:0}}@keyframes ff-deepsea-gradient{0%,to{background-position:0%}50%{background-position:100%}}@keyframes ff-icon-bounce{0%,to{translate:0}50%{translate:0 -10px}}@keyframes ff-glitch-a{0%,8%,14%,28%,42%,to{opacity:0;transform:none}10%,26%,40%{opacity:.65;clip-path:inset(15% 0 48%);transform:translate(-3px,-1px)}12%,30%{opacity:.65;clip-path:inset(60% 0 8%);transform:translate(3px,1px)}}@keyframes ff-glitch-b{0%,8%,14%,28%,42%,to{opacity:0;transform:none}10%,26%,40%{opacity:.65;clip-path:inset(50% 0 15%);transform:translate(3px,1px)}12%,30%{opacity:.65;clip-path:inset(8% 0 65%);transform:translate(-3px,-1px)}}@media (prefers-reduced-motion:no-preference){:is(html[data-template=ff-deepsea][data-motion=native]:not([data-editing]) .section:not([data-section-motion]),html[data-template=ff-deepsea]:not([data-editing]) .section[data-section-motion=native]) :is(.ff-hero-name,.hero h1,.section-head h2){animation:7s infinite ff-deepsea-gradient}:is(html[data-template=ff-hacker][data-motion=native]:not([data-editing]) .site-main:has(>.hero-section:first-child:not([data-section-motion])),html[data-template=ff-hacker]:not([data-editing]) .site-main:has(>.hero-section:first-child[data-section-motion=native])):before{animation:1.5s step-end infinite ff-terminal-cursor}:is(html[data-template=ff-flower][data-motion=native] .section:not([data-section-motion]),html[data-template=ff-flower] .section[data-section-motion=native]) .skill-group:hover:before{animation:1s infinite ff-icon-bounce}:is(html[data-template=ff-dark-hack][data-motion=native] .hero-section:not([data-section-motion]),html[data-template=ff-dark-hack] .hero-section[data-section-motion=native]) [data-ff-glitch]:before{animation:2s linear infinite ff-glitch-a}:is(html[data-template=ff-dark-hack][data-motion=native] .hero-section:not([data-section-motion]),html[data-template=ff-dark-hack] .hero-section[data-section-motion=native]) [data-ff-glitch]:after{animation:2s linear infinite ff-glitch-b}}@media (max-width:700px){[data-template=ff-indify] [data-ff-carousel=projects]>.card{display:block}[data-template=ff-indify] [data-ff-carousel=projects] .proj-media{margin-bottom:24px}}@media (prefers-reduced-motion:reduce){[data-template^=ff-] :is(.card,.skill-group):hover{transform:none}}[data-template^=ff-][data-motion=none] :is(.card,.skill-group):hover{transform:none}[data-template=ff-deepsea] .hero-portrait{aspect-ratio:auto;box-shadow:none;border:0;border-radius:0}[data-template=ff-deepsea] .hero-portrait img{object-fit:contain;height:auto;max-height:480px}[data-template=ff-deepsea] .hero-portrait-wrap{width:min(100%,360px)}[data-template=ff-dark-hack] .hero-copy{border:0;padding-inline-start:0}[data-template=ff-dark-hack] .hero h1{text-shadow:none}[data-template=ff-beginner][data-font=carter] :is(h2,h3){font-family:var(--font-poppins), var(--cjk-sans), sans-serif}[data-template=ff-beginner] .btn-accent{box-shadow:4px 4px 0 var(--brand);border:1px solid var(--brand);color:var(--ink);background:0 0;border-radius:5px}[data-template=ff-beginner] .btn-accent:hover{box-shadow:none;background:var(--brand);color:var(--brand-ink,white);border-color:#0000;transform:none}[data-template=ff-easy][data-weight=light] :is(h1,h2){font-weight:300}[data-template=ff-classic] .hero-section>.wrap{background:var(--surface);border:1px solid var(--line);box-shadow:0 4px 8px color-mix(in srgb, var(--ink) 5%, transparent);border-radius:6px;padding:clamp(24px,4vw,48px)}[data-template=ff-classic] .hero-section{padding:32px var(--gut)}[data-template=ff-classic] .hero-section>.wrap{width:100%;max-width:var(--max)}[data-template=ff-classic] .grid-2:has(>.card .proj-body){grid-template-columns:repeat(auto-fit,minmax(min(260px,100%),1fr))}[data-template=ff-classic] .card:has(.proj-body){border:1px solid var(--line);box-shadow:0 4px 8px color-mix(in srgb, var(--ink) 5%, transparent);border-radius:6px}@media (forced-colors:active){[data-template=ff-deepsea] :is(.ff-hero-name,.hero h1,.section-head h2),[data-template=ff-aurora] :is(.ff-hero-name,.hero h1,.section-head h2){-webkit-text-fill-color:currentColor;background-image:none}}html[data-template^=ff-][data-editing] .hero-copy:after,html[data-template^=ff-][data-editing] .hero-copy:before,html[data-template^=ff-][data-editing] [data-ff-glitch]:before,html[data-template^=ff-][data-editing] [data-ff-glitch]:after,html[data-template^=ff-][data-editing] .skill-group:before{animation:none}[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-easy]) .ff-hero-name{color:var(--accent-text);font-family:var(--font-display);font-weight:clamp(300, calc(var(--h1-weight) - var(--ff-name-weight-offset,0)), 900);font-size:calc(var(--h1-size) * var(--font-width-rel,1) * var(--ff-name-scale,.9));font-synthesis-weight:var(--display-synthesis);letter-spacing:-.035em;overflow-wrap:anywhere;margin:0 0 14px;line-height:1.12;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-easy]) .hero-copy[data-ff-has-name] h1{font-size:calc(var(--h3-size) * 1.4);letter-spacing:-.02em;max-width:28ch;line-height:1.35;font-family:var(--font-sans);font-weight:var(--h3-weight);margin:0 0 24px}[data-template]:is([data-template=ff-hacker],[data-template=ff-deepsea],[data-template=ff-indify],[data-template=ff-basic],[data-template=ff-easy]) .hero[data-has-portrait]{align-items:center}[data-template]:is([data-template=ff-hacker],[data-template=ff-deepsea],[data-template=ff-indify],[data-template=ff-basic],[data-template=ff-easy],[data-template=ff-beginner]) .site-main>.hero-section:first-child:not(.hero-full){min-height:calc(100svh - 72px);padding-block:clamp(48px,8vh,90px)}[data-template]:is([data-template=ff-flower],[data-template=ff-classic]) .hero .rotor{font-family:inherit;font-style:normal;font-weight:inherit}[data-template=ff-hacker] .masthead[data-hero-navigation]{display:none}[data-template=ff-hacker] .site-main,[data-template=ff-hacker] .site-footer{margin-inline-start:0;padding-top:0}[data-template=ff-hacker] .hero-section>.wrap{max-width:1100px}[data-template=ff-hacker] .hero-section .hero[data-has-portrait]{grid-template-columns:minmax(0,1fr);gap:32px;min-height:0;padding:0}[data-template=ff-hacker] .hero-copy{max-width:760px}[data-template=ff-hacker][data-template] .ff-hero-name{--ff-name-weight-offset:300;--ff-name-scale:1.6}[data-template=ff-hacker] .hero-copy[data-ff-has-name] h1{color:var(--accent-text);font-weight:calc(var(--h1-weight) - 200);font-size:calc(var(--h3-size) * 1.35)}[data-template=ff-hacker] .hero-copy>.eyebrow{margin-bottom:12px;font-size:13px}[data-template=ff-hacker] .hero .lede{max-width:64ch;font-size:16px}[data-template=ff-hacker] .hero .btn-row{gap:12px;margin-top:24px}[data-template=ff-hacker][data-button=square] .hero .btn{border:1px solid var(--accent-text);color:var(--accent-text);box-shadow:none;background:0 0;border-radius:0;padding:9px 14px}[data-template=ff-hacker] .hero-meta{margin-top:24px;padding-top:20px;font-size:12px}[data-template=ff-hacker] .hero-portrait-wrap{order:1;justify-self:start;width:120px}[data-template=ff-hacker] .hero-portrait-frame{display:none}[data-template=ff-hacker] .ff-terminal-navigation{margin-top:28px;display:block}[data-template=ff-hacker] .ff-terminal-links{flex-wrap:wrap;align-items:center;gap:8px 18px;display:flex}[data-template=ff-hacker] .ff-terminal-links :is(a,button){color:var(--accent-text);font:500 14px/1.5 var(--font-mono)}[data-template=ff-hacker] .ff-terminal-links>a{overflow-wrap:anywhere;background:0 0;border-radius:0;padding:8px 0}[data-template=ff-hacker] .ff-terminal-links>a:before,[data-template=ff-hacker] .ff-terminal-links .nav-group-row:before{content:"/" / ""}[data-template=ff-hacker] .ff-terminal-links>.nav-cta{border:1px solid var(--accent-text);padding:8px 12px}[data-template=ff-hacker] .ff-terminal-links .nav-group-row{background:0 0;border-radius:0}[data-template=ff-hacker] .ff-terminal-links .nav-submenu{z-index:5}[data-template=ff-hacker] .ff-terminal-languages{flex-wrap:wrap;gap:18px;margin-top:18px;font-size:13px;display:flex}[data-template=ff-hacker] .ff-terminal-languages [aria-current]{text-underline-offset:4px;text-decoration:underline}[data-template=ff-hacker] .card[data-has-cover=true]{flex-direction:column;display:flex}[data-template=ff-hacker] .card .proj-media{aspect-ratio:16/9;width:min(100%,480px);margin:0 0 24px}[data-template=ff-flower] .hero-section .hero[data-has-portrait]{text-align:center;grid-template-columns:minmax(0,1fr);justify-items:center;gap:34px}[data-template=ff-flower] .hero-copy{max-width:900px;margin-inline:auto}[data-template=ff-flower] .hero :is(h1,.lede){margin-inline:auto}[data-template=ff-flower] .hero :is(.btn-row,.hero-meta){justify-content:center}[data-template=ff-flower][data-template] .ff-hero-name{background:linear-gradient(100deg, var(--accent-text), var(--brand-lit));color:#0000;-webkit-background-clip:text;background-clip:text}[data-template=ff-flower] .hero-section .hero[data-has-portrait] .hero-portrait-wrap{order:1;justify-self:center;width:140px}[data-template=ff-flower] .hero-portrait{border-radius:50%}[data-template=ff-flower] .hero-portrait-frame{display:none}[data-template=ff-flower] .hero-section{padding-block:clamp(64px,9vh,110px)}[data-template=ff-deepsea]:is([data-nav=classic],[data-nav=centered],[data-nav=condense]) .masthead .wrap{height:54px}[data-template=ff-deepsea] .nav-brand-tile{width:30px;height:30px}[data-template=ff-deepsea] .nav>a{font-weight:400}[data-template=ff-deepsea] .hero-copy{padding-block:0}[data-template=ff-deepsea] .hero-portrait-wrap{justify-self:center}[data-template=ff-deepsea][data-button=outline] .hero .btn{border:1px solid var(--accent-text);color:var(--accent-text);box-shadow:none;background:0 0;border-radius:3px}[data-template=ff-deepsea] .hero-meta{border-top-width:1px}[data-template=ff-deepsea][data-template] .ff-hero-name{--ff-name-scale:.7}[data-template=ff-basic][data-template] .ff-hero-name{--ff-name-scale:.7;-webkit-box-decoration-break:clone;box-decoration-break:clone;border-bottom:5px solid var(--accent-text);line-height:1.5;display:inline}[data-template=ff-basic] .hero-copy>.eyebrow{margin-top:20px}[data-template=ff-basic] .hero h1{border:0;padding-bottom:0}[data-template=ff-basic] .section.has-rail>.wrap:has(>.section-head)>.grid-2:has(>.card .proj-body){grid-template-columns:repeat(2,minmax(0,1fr))}[data-template=ff-basic] .hero-portrait{border-radius:0}[data-template=ff-easy][data-template] .ff-hero-name{color:var(--ink);--ff-name-weight-offset:200;--ff-name-scale:.7}[data-template=ff-easy] .hero-copy[data-ff-has-name] h1{font-weight:calc(var(--h1-weight) - 200)}[data-template=ff-easy][data-button=link] .hero .btn{color:var(--accent-text);box-shadow:none;background:0 0;border:0;border-radius:0;padding:10px 0;font-weight:400}[data-template=ff-easy][data-button=link] .hero .btn:after{content:" ›" / "";margin-inline-start:12px}[data-template=ff-easy] .hero .btn-row{gap:28px}[data-template=ff-easy] .section.has-rail>.wrap:has(>.section-head)>.grid-2:has(>.card .proj-body){grid-template-columns:repeat(2,minmax(0,1fr));gap:36px}[data-template=ff-easy] .card:has(.proj-body){border-radius:0;padding:clamp(24px,3.5vw,42px)}[data-template=ff-easy] .card .proj-media{aspect-ratio:16/9;border-radius:0}[data-template=ff-easy] .masthead{-webkit-backdrop-filter:none;backdrop-filter:none;background:0 0;border:0;position:relative}[data-template=ff-easy] .nav>a{font-weight:300}[data-template=ff-indify] .hero-copy[data-ff-has-name] h1{color:var(--accent-text)}[data-template=ff-indify][data-button=rounded] .hero .btn{border-radius:12px;font-weight:400}[data-template=ff-beginner] .hero-copy{text-align:center}[data-template=ff-beginner] .hero-copy>.eyebrow{border:0;padding:0}[data-template=ff-beginner] .hero-copy .btn-row{justify-content:center}[data-template=ff-beginner] .hero-copy[data-ff-has-name] h1{font-size:calc(var(--h3-size) * 1.3);font-family:var(--font-sans)}[data-template=ff-beginner] .section.has-rail>.wrap:has(>.section-head)>.grid-2:has(>.card .proj-body){grid-template-columns:repeat(2,minmax(0,1fr))}[data-template=ff-beginner] .card:has(.proj-body){border-radius:20px;padding:28px}[data-template=ff-beginner] .hero .hero-portrait-wrap{align-self:center}[data-template=ff-beginner] .ff-testimonials-group{background:color-mix(in srgb, var(--accent) 18%, var(--ground))}[data-template=ff-classic] .masthead{color:#fff;background:#333}[data-template=ff-classic] .masthead :is(.nav-brand,.nav>a:not(.nav-cta),.nav-group-row>:is(a,button),.nav-meta,.nav-lang a,.nav-burger){color:#fff}[data-template=ff-classic] .nav-burger{border-color:#bbb}[data-template=ff-classic] .hero-portrait,[data-template=ff-classic] .card .proj-media{border-radius:4px}[data-template=ff-dark-hack] .hero h1{text-transform:uppercase;font-size:calc(var(--h1-size) * .6);line-height:1.15}[data-template=ff-dark-hack] .hero[data-has-portrait]{align-items:center}[data-template=ff-dark-hack] .nav>a:before{content:"<" / ""}[data-template=ff-dark-hack] .nav>a:not(.nav-cta){padding-inline:8px}[data-template=ff-dark-hack] .nav>a:after{content:" />" / "";background:0 0;height:auto;position:static;transform:none}@media (min-width:900px){[data-template=ff-hacker] .hero-section .hero[data-has-portrait=true]{grid-template-columns:minmax(0,1fr) 120px}[data-template=ff-hacker] .hero-portrait-wrap{align-self:start;margin-top:18px}[data-template]:is([data-template=ff-deepsea],[data-template=ff-indify]) .hero[data-has-portrait=true]{grid-template-columns:minmax(0,1.2fr) minmax(0,1fr);gap:clamp(36px,5vw,80px)}}@media (max-width:700px){[data-template]:is([data-template=ff-basic],[data-template=ff-easy],[data-template=ff-beginner]) .section.has-rail>.wrap:has(>.section-head)>.grid-2:has(>.card .proj-body){grid-template-columns:minmax(0,1fr)}[data-template=ff-flower] .hero .hero-portrait-wrap{width:110px}[data-template=ff-hacker][data-template] .ff-hero-name{--ff-name-scale:1.3}}[data-template^=ff-] .ff-hero-name>a{color:inherit;text-decoration:none}@supports ((-webkit-background-clip:text) or (background-clip:text)){[data-template=ff-deepsea][data-template] .ff-hero-name{background-image:linear-gradient(270deg, var(--ink), var(--accent-text));color:#0000;-webkit-text-fill-color:transparent;background-size:300% 300%;-webkit-background-clip:text;background-clip:text}}[data-template=ff-hacker]:is([data-nav=sidebar],[data-nav=floating],[data-nav=condense]) .site-main,[data-template=ff-hacker][data-nav=sidebar] .site-footer{margin-left:0;padding-top:0}[data-template=ff-hacker] .masthead:not([data-hero-navigation]){border-right:0;width:100%;position:sticky;inset:0 0 auto}[data-template=ff-hacker] .masthead:not([data-hero-navigation]) .wrap{width:calc(100% - 2 * var(--gut));flex-flow:wrap;align-items:center;gap:20px;height:auto;min-height:64px;padding:12px 0;display:flex}[data-template=ff-hacker] .masthead:not([data-hero-navigation]) .nav{flex-flow:wrap;width:auto;margin-left:auto}[data-template=ff-hacker] .masthead:not([data-hero-navigation]) .nav-meta{border:0;width:auto;margin:0;padding:0}@media (forced-colors:active){[data-template]:is([data-template=ff-flower],[data-template=ff-deepsea]) .ff-hero-name{color:canvastext;-webkit-text-fill-color:CanvasText;background:0 0}}[data-template=ff-beginner] .ff-hero-name{--ff-name-scale:1.25}[data-template^=ff-] .ff-hero-name:lang(zh){font-size:calc(var(--h1-size) * var(--font-width-rel,1) * var(--ff-name-scale,.9) * var(--zh-h1-scale,.8));font-weight:min(var(--h1-weight), 700);line-height:1.2}[data-template]:is([data-template=ff-basic],[data-template=ff-easy],[data-template=ff-beginner]) .card:only-child{grid-column:1/-1}[data-template=ff-indify] .card:only-child:has(.proj-body){box-shadow:none;background:0 0;border:0;grid-column:1/-1;grid-template-columns:minmax(0,1fr) minmax(0,1fr);align-items:center;gap:clamp(24px,4vw,64px);display:grid}[data-template=ff-indify] .card:only-child .proj-media{border-radius:12px;width:100%;margin:0}[data-template=ff-indify] .card:only-child[data-has-cover=false]{display:block}@media (max-width:700px){[data-template=ff-indify] .card:only-child:has(.proj-body){display:block}}[data-template=ff-beginner] .skill-list.dots{clip-path:none;gap:8px;margin-inline-start:0}[data-template=ff-beginner] .skill-list.dots>li{text-indent:0}[data-template=ff-beginner][data-font=carter]{--font-display:var(--font-poppins,"Poppins"), var(--cjk-sans), sans-serif}[data-template=ff-beginner][data-font=carter] .ff-hero-name{font-family:var(--font-carter,"Carter One"), var(--cjk-sans), sans-serif}[data-template=ff-dark-hack] .nav>a:after{display:inline}[data-template]:is([data-template=ff-aurora],[data-template=ff-plain],[data-template=ff-flower],[data-template=ff-indify]) .section-head>.lede{margin-inline:auto}[data-template=ff-flower]{--ff-fl-pink:var(--accent);--ff-fl-green:color-mix(in srgb, var(--brand) 35%, var(--paper));--ff-fl-purple:color-mix(in srgb, var(--accent) 60%, var(--brand-lit));--ff-fl-yellow:var(--accent-tint);--ff-fl-pink-ink:var(--accent-text);--ff-fl-green-ink:var(--accent-text);--ff-fl-purple-ink:var(--accent-text);--ff-fl-yellow-ink:var(--accent-text);--ff-fl-name-from:var(--accent-text);--ff-fl-name-to:var(--brand)}[data-template=ff-flower][data-colorway=source-petal]{--ff-fl-pink:#ffb6c1;--ff-fl-green:#90ee90;--ff-fl-purple:plum;--ff-fl-yellow:#ffe4b5;--ff-fl-pink-ink:#be185d;--ff-fl-green-ink:#15803d;--ff-fl-purple-ink:#7e22ce;--ff-fl-yellow-ink:#a16207;--ff-fl-name-from:#d6598f;--ff-fl-name-to:#ab64c9}[data-template=ff-flower] :is(.site-main>.section,.ff-testimonials-track>.section):not([data-bg])[data-theme=light]{background:0 0}[data-template=ff-flower] .site-main{background-image:radial-gradient(circle at 20% 50%, color-mix(in srgb, var(--ff-fl-pink) 10%, transparent), transparent 50%), radial-gradient(circle at 80% 80%, color-mix(in srgb, var(--ff-fl-green) 10%, transparent), transparent 50%), radial-gradient(circle at 40% 20%, color-mix(in srgb, var(--ff-fl-purple) 10%, transparent), transparent 50%), linear-gradient(135deg, var(--brand-tint), var(--paper) 50%, var(--accent-tint))}[data-template=ff-flower] .hero-section:not([data-bg]){background-image:none}[data-template=ff-flower] .masthead .nav-brand{color:var(--brand)}[data-template=ff-flower] .masthead .nav>a.nav-cta{background:var(--brand);color:var(--brand-ink)}[data-template=ff-flower] .masthead .nav>a.nav-cta:hover{background:var(--brand-hover)}[data-template=ff-flower] .ff-flower-petal{background:linear-gradient(135deg, var(--ff-fl-pink), color-mix(in srgb, var(--ff-fl-pink) 70%, var(--paper)))}[data-template=ff-flower] .ff-flower-center{background:var(--ff-fl-yellow);width:40px;height:40px;top:calc(50% - 20px);left:calc(50% - 20px)}[data-template=ff-flower] .ff-flower-orb{background:linear-gradient(135deg, var(--ff-fl-pink), var(--ff-fl-purple))}[data-template=ff-flower][data-template] .ff-hero-name{--ff-name-scale:.82;color:var(--ink);-webkit-text-fill-color:currentColor;text-wrap:balance;background:0 0}[data-template=ff-flower] .ff-hero-name:lang(en):before{content:"Hi, I'm "}[data-template=ff-flower] .ff-hero-name:lang(zh):before{content:"你好，我是"}[data-template=ff-flower][data-template] .ff-hero-name>a{color:var(--ff-fl-name-from)}@supports ((-webkit-background-clip:text) or (background-clip:text)){[data-template=ff-flower][data-template] .ff-hero-name>a{background-image:linear-gradient(90deg, var(--ff-fl-name-from), var(--ff-fl-name-to));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-flower][data-template] .hero-copy[data-ff-has-name] h1{color:var(--body);max-width:40ch;font-size:clamp(19px,1.7vw,24px);font-weight:400;line-height:1.4}[data-template=ff-flower] .hero .lede{color:var(--muted);max-width:42rem}[data-template=ff-flower] .btn-accent{background:var(--brand);color:var(--brand-ink)}[data-template=ff-flower] .btn-accent:hover{background:var(--brand-hover)}[data-template=ff-flower][data-template] .hero .btn-ghost{border:2px solid var(--brand);color:var(--brand)}[data-template=ff-flower][data-template] .hero .btn-ghost:hover{background:var(--brand);color:var(--brand-ink)}[data-template=ff-flower] .section-head>h2{font-size:max(28px, calc(var(--h2-size) * var(--h2-script,1) * var(--font-width-rel,1) * .7))}[data-template=ff-flower] :is(.hl,.rotor){font-family:inherit;font-style:normal;font-weight:inherit}@media (min-width:768px){[data-template=ff-flower][data-template] .section.has-rail>.wrap:has(>.ff-flower-orb){max-width:calc(896px + 2 * var(--gut));grid-template-columns:minmax(0,1fr) minmax(0,1fr);align-items:center;column-gap:48px;display:grid}[data-template=ff-flower][data-template] .section.has-rail>.wrap:has(>.ff-flower-orb)>:not(.about-body){grid-area:auto/1/auto/-1}[data-template=ff-flower][data-template] .section.has-rail>.wrap:has(>.ff-flower-orb)>.about-body{grid-column:1}[data-template=ff-flower][data-template] .section.has-rail>.wrap:has(>.ff-flower-orb)>.ff-flower-orb{grid-column:2}[data-template=ff-flower] .wrap>.about-body{margin:0}[data-template=ff-flower] .wrap>.ff-flower-orb{width:min(256px,100%);margin:0 auto}[data-template=ff-flower] .wrap>.ff-flower-orb+.grid{margin-top:clamp(32px,4vw,56px)}}[data-template=ff-flower][data-template] .skill-group{text-align:center;background:0 0;border:0;border-radius:0;padding:0}[data-template=ff-flower][data-template] .skill-group:before{background:linear-gradient(135deg, var(--ff-fl-pink), color-mix(in srgb, var(--ff-fl-pink) 60%, var(--paper)));border:0;border-radius:50%;width:80px;height:80px;margin:0 auto 16px}[data-template=ff-flower][data-template] .skill-group:nth-child(4n+2):before{background:linear-gradient(135deg, var(--ff-fl-green), color-mix(in srgb, var(--ff-fl-green) 60%, var(--paper)))}[data-template=ff-flower][data-template] .skill-group:nth-child(4n+3):before{background:linear-gradient(135deg, var(--ff-fl-purple), color-mix(in srgb, var(--ff-fl-purple) 60%, var(--paper)))}[data-template=ff-flower][data-template] .skill-group:nth-child(4n):before{background:linear-gradient(135deg, var(--ff-fl-yellow), color-mix(in srgb, var(--ff-fl-yellow) 60%, #fde047))}[data-template=ff-flower] .skill-group>.kicker{color:var(--ink);letter-spacing:0;text-transform:none;border:0;margin-bottom:6px;padding:0;font-size:16px;font-weight:600}[data-template=ff-flower] .skill-group .skill-list{color:var(--muted);justify-content:center;font-size:14px}@media (min-width:768px){[data-template=ff-flower] .skill-groups{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));max-width:896px;margin-inline:auto}}[data-template=ff-flower] .grid-3>.card>.stat-value{color:var(--ff-fl-pink-ink)}[data-template=ff-flower] .grid-3>.card:nth-child(3n+2)>.stat-value{color:var(--ff-fl-green-ink)}[data-template=ff-flower] .grid-3>.card:nth-child(3n)>.stat-value{color:var(--ff-fl-purple-ink)}[data-template=ff-flower][data-template] .card:has(.proj-body){background:var(--paper);border:0;border-radius:8px;padding:0;overflow:hidden;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a}[data-template=ff-flower][data-template] .card:has(.proj-body):hover{box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}[data-template=ff-flower] .card:has(.proj-body)>.proj-media{background:linear-gradient(135deg, var(--ff-fl-pink), color-mix(in srgb, var(--ff-fl-pink) 45%, var(--paper)));border-radius:0;width:100%;margin:0}[data-template=ff-flower] .card:has(.proj-body):nth-child(3n+2)>.proj-media{background:linear-gradient(135deg, var(--ff-fl-green), color-mix(in srgb, var(--ff-fl-green) 45%, var(--paper)))}[data-template=ff-flower] .card:has(.proj-body):nth-child(3n)>.proj-media{background:linear-gradient(135deg, var(--ff-fl-purple), color-mix(in srgb, var(--ff-fl-purple) 45%, var(--paper)))}[data-template=ff-flower] .card[data-has-cover=false]:before{content:"";background:linear-gradient(135deg, var(--ff-fl-pink), color-mix(in srgb, var(--ff-fl-pink) 45%, var(--paper)));height:72px;display:block}[data-template=ff-flower] .card:has(.proj-body)>.proj-body{padding:24px}[data-template=ff-flower] .card:has(.proj-body) .card-title{color:var(--ink)}[data-template=ff-flower] .card:has(.proj-body) .tags{--tag-sep:none;--tag-sep-w:0px;white-space:normal;flex-wrap:wrap;gap:8px}[data-template=ff-flower] .card:has(.proj-body) .tag{background:color-mix(in srgb, var(--ff-fl-pink) 20%, transparent);color:var(--ff-fl-pink-ink);border-radius:999px;padding:4px 12px;font-size:13px}[data-template=ff-flower] .card:has(.proj-body) .tag:nth-child(3n+2){background:color-mix(in srgb, var(--ff-fl-green) 20%, transparent);color:var(--ff-fl-green-ink)}[data-template=ff-flower] .card:has(.proj-body) .tag:nth-child(3n){background:color-mix(in srgb, var(--ff-fl-purple) 20%, transparent);color:var(--ff-fl-purple-ink)}@media (min-width:900px){[data-template=ff-flower] .grid-2:has(>.card .proj-body){grid-template-columns:repeat(3,minmax(0,1fr))}}[data-template=ff-easy]{--ff-ea-1:color-mix(in srgb, var(--accent) 55%, var(--paper));--ff-ea-2:color-mix(in srgb, var(--brand) 45%, var(--paper));--ff-ea-3:color-mix(in srgb, var(--accent-text) 40%, var(--paper));--ff-ea-4:color-mix(in srgb, var(--link) 35%, var(--paper))}[data-template=ff-easy][data-colorway=source-studio]{--ff-ea-1:#af77e3;--ff-ea-2:#e377bf;--ff-ea-3:#77e3ba;--ff-ea-4:#77c1e3}[data-template=ff-easy] .ff-easy-cube:first-child{--ff-cube-color:var(--ff-ea-1);box-shadow:-45px 45px 20px #32323226}[data-template=ff-easy] .ff-easy-cube:nth-child(2){--ff-cube-color:var(--ff-ea-2);box-shadow:-75px 75px 20px #32323226}[data-template=ff-easy] .ff-easy-cube:nth-child(3){--ff-cube-color:var(--ff-ea-3);box-shadow:-30px 30px 20px #32323226}[data-template=ff-easy] .ff-easy-cube:nth-child(4){--ff-cube-color:var(--ff-ea-4);box-shadow:-60px 60px 20px #32323226}[data-template=ff-easy][data-nav=classic] .masthead .nav-brand-tile{display:none}[data-template=ff-easy][data-nav=classic] .masthead .nav-brand{font-weight:300}@media (min-width:901px){[data-template=ff-easy][data-nav=classic] .masthead :is(.nav,.nav-meta){display:none}[data-template=ff-easy][data-nav=classic] .masthead .nav-burger{border:var(--border-w) solid var(--line);width:46px;height:46px;color:var(--ink);background:0 0;border-radius:999px;place-items:center;margin-left:auto;display:grid}}[data-template=ff-easy][data-nav=classic] .masthead .nav-burger{border-radius:999px}[data-template=ff-easy][data-template] .card:has(.proj-body){background:var(--surface);text-align:center;min-height:clamp(360px,40vw,600px);box-shadow:none;border:0;border-radius:0;flex-direction:column;padding:clamp(32px,3.6vw,50px) clamp(20px,3vw,44px) clamp(20px,3vw,40px);display:flex}[data-template=ff-easy][data-template] .card:has(.proj-body):nth-child(2n){background:var(--surface)}[data-template=ff-easy] .card:has(.proj-body)>.proj-body{order:1}[data-template=ff-easy] .card:has(.proj-body)>.proj-media{background:0 0;order:2;margin:auto 0 0;padding-top:clamp(24px,3vw,40px)}[data-template=ff-easy] .card:has(.proj-body)>.proj-media img{aspect-ratio:16/9}[data-template=ff-easy] .card:has(.proj-body) .card-title{letter-spacing:-.01em;margin:0 0 10px;font-size:clamp(28px,2.8vw,40px);font-weight:300;line-height:1.1}[data-template=ff-easy] .card:has(.proj-body) .proj-body>p:not(.kicker,.link-more){color:var(--body);font-size:clamp(16px,1.3vw,20px)}[data-template=ff-easy] .card:has(.proj-body) :is(.tags,.proj-links){justify-content:center}[data-template=ff-easy] .card:has(.proj-body) .link-more{color:var(--accent-text);margin-top:18px;font-size:clamp(16px,1.3vw,20px);font-weight:300;text-decoration:none}[data-template=ff-easy] .card:has(.proj-body) .kicker{color:var(--muted)}[data-template=ff-easy][data-template] .hero-copy[data-ff-has-name] h1{font-family:var(--font-sans);letter-spacing:0;max-width:40ch;font-size:clamp(17px,1.4vw,20px);font-weight:400;line-height:1.5}[data-template=ff-easy][data-template][data-button=link] .hero .btn{font-size:clamp(16px,1.4vw,20px);font-weight:300;text-decoration:none}[data-template=ff-indify] .hero-copy[data-ff-has-name]:before{color:var(--muted);margin-bottom:4px;font-size:clamp(16px,1.4vw,20px);line-height:1.4;display:block}[data-template=ff-indify] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .hero-copy[data-ff-has-name]:before{color:#a2acbd}[data-template=ff-indify] .hero-copy[data-ff-has-name]:lang(en):before{content:"HELLO,"}[data-template=ff-indify] .hero-copy[data-ff-has-name]:lang(zh):before{content:"你好，"}[data-template=ff-indify][data-template] .ff-hero-name{--ff-name-scale:.78;--ff-name-weight-offset:300;letter-spacing:-.01em;margin-bottom:6px;line-height:1.15}[data-template=ff-indify] .ff-hero-name:lang(en):before{content:"I'm "}[data-template=ff-indify] .ff-hero-name:lang(zh):before{content:"我是"}[data-template=ff-indify][data-template] .hero-copy[data-ff-has-name] h1{letter-spacing:0;max-width:40ch;margin-bottom:20px;font-size:clamp(16px,1.35vw,19.2px);font-weight:500;line-height:1.5}[data-template=ff-indify] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .hero .lede{color:#a2acbd;font-size:clamp(15px,1.1vw,16px)}[data-template=ff-indify][data-template][data-button=rounded] .hero .btn{text-transform:uppercase;letter-spacing:0;border-radius:10px;padding:.5rem 2rem;font-size:14px;font-weight:500}[data-template=ff-indify][data-template] .hero .btn-ghost{border:1px solid var(--accent-text);color:var(--accent-text);padding-inline:.9rem}[data-template=ff-indify] .section-head>h2{font-size:max(24px, calc(var(--h2-size) * var(--h2-script,1) * var(--font-width-rel,1) * .62));font-weight:max(300, calc(var(--h2-weight) - 300));letter-spacing:.1rem;text-transform:uppercase;line-height:1.3}[data-template=ff-indify] .section-head>h2 :is(.hl,.rotor){color:inherit;font-family:inherit;font-style:normal;font-weight:inherit}[data-template=ff-indify] .section-head>h2:after{width:56px;height:.15rem;margin-top:.6rem}[data-template=ff-indify] .section-head>.lede{font-size:16px}[data-template=ff-indify][data-template] .card[data-pick-field^=steps\.]{--ink:#fff;--body:#ffffffe6;--muted:#c3cad6;--accent-text:var(--accent-on-dark);--line:#ffffff24;background:var(--brand-deep);color:var(--body);border:0;border-radius:.5rem;padding:2rem 1rem;box-shadow:0 2px 5px #c7c3c34d}[data-template=ff-indify] .card[data-pick-field^=steps\.] .card-title{color:var(--accent-on-dark);font-weight:600}:is([data-template=ff-indify][data-template] [data-ff-carousel=projects]>.card,[data-template=ff-indify][data-template] .card:only-child:has(.proj-body)){--ink:#fff;--body:#ffffffe6;--muted:#c3cad6;--accent-text:var(--accent-on-dark);--link:var(--accent-on-dark);--line:#ffffff29;--tag-ink:#c3cad6;--tag-bg:#ffffff14;background:var(--brand-deep);color:var(--body);text-align:center;border:0;border-radius:.5rem;flex-direction:column;align-items:center;gap:0;padding:1.5rem clamp(16px,5vw,5rem) 2.5rem;display:flex;box-shadow:0 2px 5px #c7c3c34d}[data-template=ff-indify] :is([data-ff-carousel=projects]>.card,.card:only-child:has(.proj-body))>.proj-body{display:contents}[data-template=ff-indify] :is([data-ff-carousel=projects]>.card,.card:only-child:has(.proj-body)) .kicker{order:1;margin:0 0 6px}[data-template=ff-indify] :is([data-ff-carousel=projects]>.card,.card:only-child:has(.proj-body)) .card-title{color:var(--accent-on-dark);order:2;margin:0 0 1rem;font-size:clamp(20px,1.8vw,24px)}[data-template=ff-indify][data-template] :is([data-ff-carousel=projects]>.card,.card:only-child:has(.proj-body))>.proj-media{border-radius:8px;order:3;width:min(100%,550px);margin:0 0 1.5rem;box-shadow:0 1px 2.2px #00000013,0 2.3px 5.3px #0000001c,0 4.4px 10px #0002,0 7.8px 17.9px #00000029,0 14.6px 33.4px #00000031,0 35px 80px #00000045}[data-template=ff-indify] :is([data-ff-carousel=projects]>.card,.card:only-child:has(.proj-body)) .proj-body>p:not(.kicker,.link-more){order:4;max-width:60ch;margin:0 0 1.25rem}[data-template=ff-indify] :is([data-ff-carousel=projects]>.card,.card:only-child:has(.proj-body)) :is(.tags,.proj-links){order:5;justify-content:center;margin-bottom:1.25rem}[data-template=ff-indify] :is([data-ff-carousel=projects]>.card,.card:only-child:has(.proj-body)) .link-more{border:1px solid var(--accent-on-dark);color:var(--accent-on-dark);border-radius:8px;order:6;margin:0;padding:.5rem 1rem}@media (max-width:700px){[data-template=ff-indify][data-template] :is([data-ff-carousel=projects]>.card,.card:only-child:has(.proj-body)){display:flex}}[data-template=ff-basic][data-template] .ff-hero-name{--ff-name-scale:.47;color:var(--ink);font-size:max(2.25rem, calc(var(--h1-size) * var(--font-width-rel,1) * var(--ff-name-scale)));font-weight:clamp(300, calc(var(--h1-weight) + 200), 900);letter-spacing:-.01em;border:0;margin:0 0 14px;line-height:1.25;display:block}[data-template=ff-basic] .ff-hero-name:lang(en):before{content:"Hi, I'm "}[data-template=ff-basic] .ff-hero-name:lang(zh):before{content:"你好，我是"}[data-template=ff-basic][data-template] .ff-hero-name>a{border-bottom:3px solid var(--accent);padding-bottom:.02em}[data-template=ff-basic] .hero-copy>.eyebrow{width:fit-content;margin-top:0;display:flex}[data-template=ff-basic][data-template] .hero-copy[data-ff-has-name] h1{max-width:30ch;color:var(--muted);font-family:var(--font-sans);font-size:clamp(22px,2.2vw,32px);font-weight:var(--h3-weight);letter-spacing:-.01em;margin:0 0 18px;line-height:1.3}[data-template=ff-basic] .hero .lede{text-align:justify;-webkit-hyphens:auto;hyphens:auto;max-width:640px;font-size:16px}[data-template=ff-basic][data-template][data-button=square] .hero .btn{border:2px solid var(--accent-text);min-width:140px;min-height:48px;color:var(--accent-text);letter-spacing:-.05em;text-transform:none;box-shadow:none;background:0 0;justify-content:center;padding:0 17px;font-size:16px;font-weight:600}[data-template=ff-basic] .masthead .nav>a.nav-cta{color:var(--accent-text);border:2px solid var(--accent-text);background:0 0;border-radius:0}[data-template=ff-basic] .masthead .nav-brand{font-size:20px;font-weight:800}[data-template=ff-basic][data-template] .hero-section .hero[data-has-portrait] .hero-portrait-wrap{order:-1;justify-self:center;width:min(100%,300px)}@media (min-width:861px){[data-template=ff-basic][data-template] .hero-section .hero[data-has-portrait=true]{grid-template-columns:minmax(0,1.12fr) minmax(0,.88fr);align-items:center}[data-template=ff-basic][data-template] .hero-section .hero[data-has-portrait] .hero-portrait-wrap{order:1;justify-self:end;width:min(100%,560px)}}[data-template=ff-basic] .section-head>h2{font-size:max(28px, calc(var(--h2-size) * var(--h2-script,1) * var(--font-width-rel,1) * .84));font-weight:min(900, calc(var(--h2-weight) + 100))}[data-template=ff-basic] .skill-groups{border-block:1px solid color-mix(in srgb, var(--accent) 20%, transparent);gap:clamp(28px,4vw,48px) clamp(24px,3vw,48px);padding-block:clamp(32px,4vw,56px)}[data-template=ff-basic][data-template] .skill-group{border:0;padding:0}[data-template=ff-basic][data-template] .skill-group>.kicker{color:var(--ink);letter-spacing:-.01em;text-transform:none;border:0;margin:0 0 .15em;padding:0;font-size:clamp(28px,2.6vw,36px);font-weight:800;line-height:1.15}[data-template=ff-basic] .skill-group .skill-list{color:var(--body);font-size:14px}@media (min-width:1025px){[data-template=ff-basic][data-template] .section.has-rail .skill-groups{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:769px) and (max-width:1024px){[data-template=ff-basic][data-template] .section.has-rail .skill-groups{grid-template-columns:repeat(2,minmax(0,1fr))}}[data-template=ff-basic][data-template] .card:has(.proj-body){border:0;padding:0 0 12px}[data-template=ff-basic] .card:has(.proj-body) .card-title{font-size:clamp(20px,1.8vw,24px);font-weight:800}[data-template=ff-basic] .card:has(.proj-body) .tags{--tag-font:var(--font-sans);--tag-size:14px;--tag-ink:color-mix(in srgb, var(--ink) 80%, transparent);text-transform:uppercase;letter-spacing:.02em}[data-template=ff-beginner]{--ff-bg-band:var(--brand-deep);--ff-bg-purple:var(--brand);--ff-bg-blue:var(--accent);--ff-bg-edge:var(--accent)}[data-template=ff-beginner][data-colorway=source-violet]{--ff-bg-band:#7757ae;--ff-bg-purple:#6c26ff;--ff-bg-blue:#419df1;--ff-bg-edge:salmon}[data-template=ff-beginner] .hero-section:not([data-bg]){background-image:radial-gradient(66.32% 66.32% at 54.13% 113.95%, color-mix(in srgb, var(--ff-bg-purple) 20%, transparent), transparent), linear-gradient(211.99deg, color-mix(in srgb, var(--ff-bg-blue) 20%, transparent) -4.17%, transparent 68.7%), radial-gradient(100% 100% at 28.65% 0, color-mix(in srgb, var(--ff-bg-purple) 25%, transparent), transparent)}[data-template=ff-beginner] .hero-copy[data-ff-has-name]:before{color:var(--body);margin-bottom:4px;font-weight:800;line-height:1.4;display:block}[data-template=ff-beginner] .hero-copy[data-ff-has-name]:lang(en):before{content:"Hello, I'm"}[data-template=ff-beginner] .hero-copy[data-ff-has-name]:lang(zh):before{content:"你好，我是"}[data-template=ff-beginner][data-template] .ff-hero-name{--ff-name-scale:1;margin-bottom:6px}[data-template=ff-beginner][data-template] .hero-copy[data-ff-has-name] h1{color:var(--body);margin:0 auto 10px;font-size:clamp(18px,1.4vw,20.8px);font-weight:700;line-height:1.4}[data-template=ff-beginner] .hero .lede{color:var(--muted);font-size:16px}[data-template=ff-beginner] .section-head{text-align:center;margin-inline:auto}[data-template=ff-beginner] .section-head>.eyebrow{justify-content:center}[data-template=ff-beginner] .section-head>.lede{margin-inline:auto}[data-template=ff-beginner] .section-head>h2{font-size:max(22px, calc(var(--h2-size) * var(--h2-script,1) * var(--font-width-rel,1) * .74))}[data-template=ff-beginner][data-template] .card:has(.proj-body){background:var(--paper);border:0;border-radius:12px;padding:0;overflow:hidden;box-shadow:0 48px 100px #110c2e26}[data-template=ff-beginner][data-template] .card:has(.proj-body):hover{box-shadow:0 50px 100px -20px #32325d40,0 30px 60px -30px #0000004d}[data-template=ff-beginner][data-template] .card:has(.proj-body)>.proj-media{border-radius:12px 12px 0 0;width:100%;margin:0}[data-template=ff-beginner] .card:has(.proj-body)>.proj-body{flex-direction:column;padding:1.25rem;display:flex}[data-template=ff-beginner] .card:has(.proj-body) .card-title{font-size:17px;font-weight:700}[data-template=ff-beginner] .card:has(.proj-body) .link-more{border:1px solid var(--brand);background:var(--paper);color:var(--ink);text-align:center;border-radius:5px;margin-top:auto;padding:.5rem;font-weight:500;display:block}[data-template=ff-beginner] .card:has(.proj-body) .link-more:hover{background:var(--brand);color:var(--brand-ink)}[data-template=ff-beginner] .card:has(.proj-body) .tags+.link-more{margin-top:16px}[data-template=ff-beginner] .card:has(.proj-body) .proj-body>p+.link-more{margin-top:16px}@media (min-width:901px){[data-template=ff-beginner][data-template] .section.has-rail>.wrap:has(>.section-head)>.grid-2:has(>.card .proj-body){grid-template-columns:repeat(3,minmax(0,1fr));gap:clamp(28px,4vw,60px)}}[data-template=ff-beginner] .ff-testimonials-group{--ground:var(--ff-bg-band);background:var(--ff-bg-band);color:#fff}[data-template=ff-beginner] .site-main>.section:has(>.wrap>.quote):not([data-bg]){--ground:var(--ff-bg-band);background:var(--ff-bg-band);color:#fff}[data-template=ff-beginner] .ff-testimonials-track>.section{background:0 0}[data-template=ff-beginner] .section:has(>.wrap>.quote):not([data-bg])>.wrap{max-width:min(calc(100% - 2 * var(--gut)), 960px);border:2px solid var(--ff-bg-edge);border-radius:10px;padding:clamp(28px,5vw,4rem)}[data-template=ff-beginner][data-template] .section:has(>.wrap>.quote) .quote{color:#fff;max-width:none;font-family:var(--font-sans);letter-spacing:0;text-indent:1ch;text-align:start;border:0;border-radius:0;padding:clamp(8px,2vw,2rem);font-size:clamp(17px,1.3vw,18px);font-style:italic;font-weight:400;line-height:1.6}[data-template=ff-beginner] .section:has(>.wrap>.quote) .quote :is(.hl,.rotor){color:inherit}[data-template=ff-beginner] .section:has(>.wrap>.quote) .quote-cite{color:#ffffffeb;text-align:end;padding-inline:clamp(8px,3vw,4rem);font-size:clamp(16px,1.3vw,20px);font-style:italic}[data-template=ff-beginner] .ff-testimonials-group .ff-carousel-controls>button{color:#fff;background:0 0;border-color:#fff6}[data-template=ff-beginner] .ff-testimonials-group .ff-carousel-dots button{border-color:#fff}[data-template=ff-beginner] .ff-testimonials-group .ff-carousel-dots button[aria-current]{background:var(--ff-bg-edge);border-color:var(--ff-bg-edge)}[data-template]:is([data-template=ff-outlines],[data-template=ff-plain],[data-template=ff-indify],[data-template=ff-easy],[data-template=ff-hacker]) .ff-hero-name:lang(zh){font-weight:clamp(300, calc(var(--h1-weight) - var(--ff-name-weight-offset,0)), 700)}[data-template=ff-dark-hack] .section-head{text-align:center;max-width:960px;margin-inline:auto}[data-template=ff-dark-hack] .section-head>.eyebrow{justify-content:center}[data-template=ff-dark-hack] .section-head>.lede{margin-inline:auto}[data-template=ff-dark-hack][data-template] .section-head h2{color:#fff;width:fit-content;max-width:100%;font-size:calc(var(--h2-size) * var(--h2-script,1) * var(--font-width-rel,1) * 1.25);border:0;margin:0 auto 40px;padding-bottom:0;font-weight:800;line-height:1.15;display:block;position:relative}[data-template=ff-dark-hack] .section-head h2:after{content:"";width:min(125%, 100% + 2 * var(--gut), 100vw - 2 * var(--gut));border-bottom:3px dashed var(--accent);pointer-events:none;position:absolute;bottom:-14px;left:50%;transform:translate(-50%)}[data-template=ff-dark-hack] .section-head h2 :is(.hl,.rotor){color:var(--accent-text)}[data-template=ff-dark-hack] .section:is([data-theme=light],[data-theme=surface],[data-theme=accent]):not([data-bg]) .section-head h2{color:var(--ink)}[data-template=ff-dark-hack][data-template] .card[data-pick-field^=steps\.]{border:2px solid color-mix(in srgb, var(--accent) 22%, var(--paper));background-image:radial-gradient(circle at 0 0, color-mix(in srgb, var(--accent) 85%, transparent) 0, color-mix(in srgb, var(--accent) 38%, transparent) 42px, transparent 96px);border-radius:15px}[data-template=ff-dark-hack] .card[data-pick-field^=steps\.] .card-title{color:var(--accent-text);margin-top:2rem;font-weight:800}[data-template=ff-dark-hack] .card[data-pick-field^=steps\.] p:not(.kicker){color:var(--ink);font-weight:600}[data-template=ff-dark-hack] [data-ff-glow]:before{background:radial-gradient(circle 80px at var(--ff-pointer-x,0px) var(--ff-pointer-y,0px), color-mix(in srgb, var(--accent) 45%, transparent), transparent 80%)}[data-template=ff-dark-hack][data-template] .card:has(.proj-body){background-color:color-mix(in srgb, var(--brand-lit) 10%, var(--surface));background-image:none;border:0;border-radius:7px}[data-template=ff-dark-hack] .card:has(.proj-body)>.proj-media{border-radius:7px}[data-template=ff-dark-hack] .card:has(.proj-body) .tags{--tag-sep:none;--tag-sep-w:0px;white-space:normal;flex-wrap:wrap;gap:10px}[data-template=ff-dark-hack] .card:has(.proj-body) .tag{background:color-mix(in srgb, var(--accent-text) 11%, transparent);color:var(--ink);border-radius:10px;padding:6px 12px;font-weight:700}[data-template=ff-dark-hack] .masthead .nav>a.nav-cta{color:var(--accent-text);border:1px dashed var(--accent-text);background:0 0}[data-template=ff-deepsea] .section-head{text-align:center;margin-inline:auto}[data-template=ff-deepsea] .section-head>.eyebrow{justify-content:center}[data-template=ff-deepsea] .section-head>.lede{margin-inline:auto}[data-template=ff-deepsea][data-template] .section-head>h2{font-size:max(28px, calc(var(--h2-size) * var(--h2-script,1) * var(--font-width-rel,1) * .75));font-weight:max(300, calc(var(--h2-weight) - 300));letter-spacing:0;border-bottom:0;padding-bottom:0}@supports ((-webkit-background-clip:text) or (background-clip:text)){[data-template=ff-deepsea][data-template] :is(.ff-hero-name,.hero h1,.section-head h2){background-image:linear-gradient(270deg, var(--ink), var(--accent), color-mix(in srgb, var(--accent) 70%, var(--surface-2)))}}[data-template=ff-deepsea] :is(.hl,.rotor){font-family:inherit;font-style:normal;font-weight:inherit;-webkit-text-fill-color:inherit}[data-template=ff-deepsea] .hero-copy[data-ff-has-name]:before{color:var(--ink);margin-bottom:2px;font-size:16px;display:block}[data-template=ff-deepsea] .hero-copy[data-ff-has-name]:lang(en):before{content:"Hi there! I am"}[data-template=ff-deepsea] .hero-copy[data-ff-has-name]:lang(zh):before{content:"你好！我是"}[data-template=ff-deepsea][data-template] .hero-copy[data-ff-has-name] h1{color:var(--ink);-webkit-text-fill-color:currentColor;font-size:clamp(24px,2.6vw,37px);font-weight:max(300, calc(var(--h1-weight) - 300));letter-spacing:0;background-image:none;margin-bottom:14px;line-height:1.3;animation:none}[data-template=ff-classic] .hero-copy{flex-direction:column;align-items:center;display:flex}[data-template=ff-classic] .hero-copy>*{max-width:100%}[data-template=ff-classic] .hero-copy>.eyebrow{text-align:center;order:0;display:block}[data-template=ff-classic] .hero-copy>.eyebrow:before{vertical-align:middle;margin-inline-end:var(--eyebrow-gap,12px);display:inline-block}[data-template=ff-classic] .hero-copy>h1{font-size:max(30px, calc(var(--h1-size) * var(--h1-script,1) * var(--font-width-rel,1) * .64));order:1}[data-template=ff-classic][data-template] .ff-hero-name{color:var(--ink);font-family:var(--font-display);font-size:max(22px, calc(var(--h1-size) * var(--font-width-rel,1) * var(--ff-name-scale,.43)));font-weight:var(--h1-weight);letter-spacing:-.01em;order:2;margin:0 0 18px;line-height:1.3;display:block}[data-template=ff-classic] .hero-copy>:is(.lede,.btn-row,.ff-terminal-navigation,.hero-meta){order:3}[data-template=ff-classic] .hero-copy>.hero-meta{order:4}[data-template=ff-classic] :is(.hl,.rotor){font-family:inherit;font-style:normal;font-weight:inherit}[data-template=ff-classic][data-template] .section-head{text-align:start;margin-inline:0}[data-template=ff-classic] .section-head>.eyebrow{justify-content:flex-start}[data-template=ff-classic] .section-head>.eyebrow:after{content:none}[data-template=ff-hacker] .section-head h2:before{margin-inline-end:0}[data-template=ff-hacker] .ff-terminal-links :is(a,button){letter-spacing:.089em;text-transform:uppercase}[data-template=ff-hacker] :is(.card[data-pick-field^=steps\.]>p:not(.kicker),.card:has(.proj-body) .proj-body>p:not(.kicker,.link-more)):before{content:":" / ""}[data-template=ff-hacker] .skill-group>.kicker{color:var(--accent-text);letter-spacing:0;text-transform:none;font-size:15px}[data-template=ff-hacker] .skill-group>.kicker:before{content:"> " / ""}html[data-template=ff-hacker]:not([data-effect-spotlight]) .section:not([data-fx~=spotlight]) :is(.card[data-pick-field^=steps\.],.card:has(.proj-body),.skill-group):after{content:"~/.works" / "";background:color-mix(in srgb, var(--ink) 4%, var(--ground));color:var(--accent-text);font:12px/1.6 var(--font-mono);text-align:end;align-self:stretch;margin:24px -28px -28px;padding:6px 16px;display:block}html[data-template=ff-hacker]:not([data-effect-spotlight]) .section:not([data-fx~=spotlight]) .skill-groups>.skill-group:after{content:"~/.skills" / ""}html[data-template=ff-hacker]:not([data-effect-spotlight]) .section:not([data-fx~=spotlight]) .card[data-pick-field^=steps\.]:after{content:"~/.about" / ""}[data-template=ff-hacker] .card:has(.proj-body){flex-direction:column;display:flex}[data-template=ff-hacker] .card:has(.proj-body)>.proj-body{flex:1}[data-template=ff-beginner] .gallery{grid-template-columns:repeat(auto-fit,minmax(min(170px,100%),1fr))}[data-template=ff-hacker] :is(.card[data-pick-field^=steps\.],.skill-group){flex-direction:column;display:flex}html[data-template=ff-hacker]:not([data-effect-spotlight]) .section:not([data-fx~=spotlight]) :is(.card[data-pick-field^=steps\.],.card:has(.proj-body),.skill-group):after{margin-top:auto}[data-template=ff-hacker] :is(.card[data-pick-field^=steps\.],.skill-group)>:last-child{margin-bottom:24px}[data-template=ff-plain][data-template] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .ff-hero-name,[data-template=ff-plain] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .hero-copy[data-ff-has-name] h1{color:#fff}[data-template=ff-plain] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .hero .lede{color:#fffc}[data-template=ff-plain][data-template] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .hero .btn{color:#fff}[data-template=ff-plain][data-template] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .hero .btn:hover{background:#ffffff1a}@media (min-width:901px){[data-template=ff-plain][data-nav=centered] .masthead[data-over] .nav>a.nav-cta{color:#fff}[data-template=ff-plain][data-nav=centered] .masthead[data-over] .nav>a.nav-cta:hover{background:#ffffff1a}}[data-template=ff-basic][data-template] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .ff-hero-name{color:#fff}[data-template=ff-basic][data-template] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .hero-copy[data-ff-has-name] h1{color:#ffffffb8}[data-template=ff-beginner] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .hero-copy[data-ff-has-name]:before,[data-template=ff-beginner][data-template] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .hero-copy[data-ff-has-name] h1{color:#ffffffe6}[data-template=ff-beginner] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .hero .lede{color:#ffffffbd}[data-template=ff-classic] .section.hero-section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy])))>.wrap{border-color:var(--line-dark);box-shadow:none;background:#ffffff0d}[data-template=ff-classic][data-template] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .ff-hero-name,[data-template=ff-easy][data-template] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .ff-hero-name{color:#fff}@media (min-width:901px){[data-template=ff-easy][data-nav=classic] .masthead[data-over] .nav-burger{color:#fff;border-color:#ffffff4d}}[data-template=ff-flower][data-template] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .ff-hero-name{color:#fff}[data-template=ff-flower][data-template] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .hero-copy[data-ff-has-name] h1{color:#ffffffe6}[data-template=ff-flower] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .hero .lede{color:#ffffffbd}[data-template=ff-flower] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .btn-accent{background:var(--accent-on-dark);color:var(--brand-deep)}[data-template=ff-flower] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .btn-accent:hover{background:color-mix(in srgb, var(--accent-on-dark) 75%, #fff)}[data-template=ff-flower][data-template] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .hero .btn-ghost{border-color:var(--accent-on-dark);color:var(--accent-on-dark)}[data-template=ff-flower][data-template] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .hero .btn-ghost:hover{background:var(--accent-on-dark);color:var(--brand-deep)}:is([data-template=ff-plain][data-template] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) :is(.card,.skill-group),[data-template=ff-beginner][data-template] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .card:has(.proj-body),[data-template=ff-easy][data-template] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .card:has(.proj-body),[data-template=ff-flower][data-template] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .card:has(.proj-body)){box-shadow:none;background:#ffffff0d}[data-template=ff-plain] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .card:has(.proj-body) .card-title{color:#ffffffdb}[data-template=ff-flower] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .skill-group>.kicker,[data-template=ff-basic][data-template] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .skill-group>.kicker{color:#fff}[data-template=ff-flower] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .card:has(.proj-body) .card-title{color:#fff}[data-template=ff-basic] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .skill-group .skill-list{color:#fffc}[data-template=ff-easy] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .card:has(.proj-body) .proj-body>p:not(.kicker,.link-more){color:#fffc}[data-template=ff-flower] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .skill-group .skill-list{color:#ffffffbd}[data-template=ff-easy] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .card:has(.proj-body) .kicker{color:#fff9}[data-template=ff-basic] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .card:has(.proj-body) .tags{--tag-ink:var(--tag-ink-dark)}[data-template=ff-flower]{--ff-fl-pink-on-dark:var(--accent-on-dark);--ff-fl-green-on-dark:var(--accent-on-dark);--ff-fl-purple-on-dark:var(--accent-on-dark)}[data-template=ff-flower][data-colorway=source-petal]{--ff-fl-pink-on-dark:#ffb6c1;--ff-fl-green-on-dark:#90ee90;--ff-fl-purple-on-dark:plum}[data-template=ff-flower] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))){--ff-fl-pink-ink:var(--ff-fl-pink-on-dark);--ff-fl-green-ink:var(--ff-fl-green-on-dark);--ff-fl-purple-ink:var(--ff-fl-purple-on-dark)}[data-template=ff-flower] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .card:has(.proj-body) .tag{background:color-mix(in srgb, var(--ff-fl-pink) 12%, transparent)}[data-template=ff-flower] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .card:has(.proj-body) .tag:nth-child(3n+2){background:color-mix(in srgb, var(--ff-fl-green) 12%, transparent)}[data-template=ff-flower] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .card:has(.proj-body) .tag:nth-child(3n){background:color-mix(in srgb, var(--ff-fl-purple) 12%, transparent)}[data-template=ff-flower] .hero-copy:not(:has(.ff-flower-bloom)):before{background:0 0;border:0;border-radius:0;width:150px;height:150px;margin:0 auto 36px;transform:none}[data-template=ff-easy] .hero-portrait-wrap:not(:has(.ff-easy-cubes)):after{content:"";pointer-events:none;height:clamp(260px,24vw,350px);margin-top:24px;display:block}[data-template=ff-easy] .hero[data-has-portrait=false]:not(:has(.ff-easy-cubes)):after{content:"";pointer-events:none;height:clamp(260px,24vw,350px);margin-top:24px;display:block}[data-template=ff-easy] .hero[data-has-portrait=false] .hero-copy{padding-inline-end:0;padding-top:24px}[data-template=ff-easy] .hero[data-has-portrait=false] .hero-copy:after{content:none}@media (min-width:861px){[data-template=ff-easy] .hero[data-has-portrait=false]{grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr);align-items:center}}@media (min-width:769px) and (max-width:1024px){[data-template=ff-basic][data-template] .section.has-rail .skill-groups:has(>:nth-child(3)):has(>:last-child:nth-child(odd)){grid-template-columns:repeat(3,minmax(0,1fr))}[data-template=ff-basic][data-template] .section.has-rail .skill-groups:has(>:last-child:nth-child(2n))>:last-child{grid-column:auto}[data-template=ff-basic][data-template] .section.has-rail .skill-groups:has(>:nth-child(7)):has(>:last-child:nth-child(odd))>:last-child:nth-child(3n+1){grid-column:1/-1}}@media (min-width:1025px){[data-template=ff-basic][data-template] .section.has-rail .skill-groups:has(>:nth-child(4):last-child){grid-template-columns:repeat(2,minmax(0,1fr))}[data-template=ff-basic][data-template] .section.has-rail .skill-groups:has(>:nth-child(7))>:last-child:nth-child(3n+1){grid-column:1/-1}}:is(html[data-template=ff-indify],[data-template=ff-beginner]) .ff-carousel-controls>button:disabled{opacity:1;color:color-mix(in srgb, var(--accent-text) 40%, var(--ground));border-color:color-mix(in srgb, var(--line) 50%, var(--ground))}[data-template=ff-beginner] .ff-testimonials-group .ff-carousel-controls>button:disabled{color:#ffffff73;border-color:#ffffff2e}[data-template=ff-dark-hack] .card[data-pick-field^=steps\.]>.kicker{color:var(--ink)}[data-template=ff-dark-hack][data-template] .card[data-pick-field^=steps\.]{padding:max(1.5rem, var(--card-pad,clamp(20px, 2.4vw, 30px)))}[data-template=ff-dark-hack][data-template] .card[data-pick-field^=steps\.][data-ff-glow]{background-image:none}[data-template=ff-dark-hack] .card[data-pick-field^=steps\.][data-ff-glow]:before{background:radial-gradient(circle at var(--ff-pointer-x,0px) var(--ff-pointer-y,0px), color-mix(in srgb, var(--accent) 85%, transparent) 0, color-mix(in srgb, var(--accent) 38%, transparent) 42px, transparent 96px)}@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-text) 100%)}}[data-template^=ff-] .site-footer{--ff-foot-accent:var(--accent-text)}:is([data-template=ff-outlines],[data-template=ff-aurora],[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]) .footer-row{text-align:center;flex-direction:column;justify-content:center;gap:8px}:is([data-template=ff-outlines],[data-template=ff-aurora],[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]) :is(.footer-copy,.footer-row>nav){justify-content:center}:is([data-template=ff-plain],[data-template=ff-hacker]) .footer-strip{--accent:var(--ff-foot-accent);--accent-text:var(--ff-foot-accent);padding-block:8px;font-size:12px}:is([data-template=ff-plain],[data-template=ff-hacker]) .footer-row{justify-content:flex-end;gap:4px 24px}:is([data-template=ff-plain],[data-template=ff-hacker]) .footer-strip :is(.footer-credit,.footer-dot){color:var(--muted)}[data-template=ff-plain] .footer-strip{background:var(--surface);color:var(--ink)}[data-template=ff-plain] .footer-strip :is(a,.footer-credit):hover{color:var(--ink);text-underline-offset:3px;text-decoration:underline}[data-template=ff-hacker] .footer-strip{background:var(--surface);color:var(--body)}[data-template=ff-hacker] .footer-strip :is(a,.footer-credit):hover{color:var(--accent-text)}[data-template=ff-outlines] .footer-strip{--accent:var(--brand-ink);--accent-text:var(--brand-ink);background:var(--brand);min-height:150px;color:var(--brand-ink);align-items:center;padding-block:28px;font-size:12px;display:flex}[data-template=ff-outlines] .footer-strip .footer-credit{color:var(--brand-ink)}[data-template=ff-outlines] .footer-strip .footer-dot{color:color-mix(in srgb, var(--brand-ink) 55%, transparent)}[data-template=ff-outlines] .footer-strip a{text-underline-offset:.22em;text-decoration:underline}[data-template=ff-outlines] .footer-strip :is(a,.footer-credit):hover{color:var(--brand-ink);text-decoration-thickness:2px}[data-template=ff-aurora] .footer-strip{--accent:var(--ff-foot-accent);--accent-text:var(--ff-foot-accent);border-top:1px solid var(--line);box-shadow:none;color:var(--muted);background:0 0;padding-block:32px;font-size:15px}[data-template=ff-aurora] .footer-row{flex-direction:column;gap:16px}[data-template=ff-aurora] .footer-row>:is(.ff-footer-links,nav){order:-1}[data-template=ff-aurora] .footer-strip :is(.footer-credit,.footer-dot){color:var(--muted)}[data-template=ff-aurora] .footer-row>nav{font-size:16px}[data-template=ff-aurora] .footer-row>nav a{color:var(--body)}[data-template=ff-aurora] .footer-row>nav a:nth-child(4n+1):hover,[data-template=ff-aurora] .footer-strip .footer-credit:hover{color:var(--ff-au-green)}[data-template=ff-aurora] .footer-row>nav a:nth-child(4n+2):hover{color:var(--ff-au-blue)}[data-template=ff-aurora] .footer-row>nav a:nth-child(4n+3):hover{color:var(--ff-au-purple-text)}[data-template=ff-aurora] .footer-row>nav a:nth-child(4n):hover{color:var(--ff-au-pink-text)}[data-template=ff-flower] .footer-strip{--accent:var(--ff-foot-accent);--accent-text:var(--ff-foot-accent);background:linear-gradient(to top, color-mix(in srgb, var(--brand) 12%, var(--paper)), transparent);color:var(--body);padding-block:32px;font-size:15px}[data-template=ff-flower] .footer-strip .footer-credit{color:var(--body)}[data-template=ff-flower] .footer-strip .footer-dot{color:var(--muted)}[data-template=ff-flower] .footer-row>nav a{color:var(--accent-text)}[data-template=ff-flower] .footer-strip :is(a,.footer-credit):hover{color:var(--accent-text);text-underline-offset:3px;text-decoration:underline}[data-template=ff-deepsea] .footer-strip{--accent:var(--brand-ink);--accent-text:var(--brand-ink);background:var(--brand);min-height:64px;color:var(--brand-ink);align-items:center;padding-block:12px;font-size:14px;display:flex}[data-template=ff-deepsea] .footer-row{gap:2px}[data-template=ff-deepsea] .footer-strip .footer-credit{color:var(--brand-ink)}[data-template=ff-deepsea] .footer-strip .footer-dot{color:color-mix(in srgb, var(--brand-ink) 55%, transparent)}[data-template=ff-deepsea] .footer-strip :is(a,.footer-credit):hover{color:var(--brand-ink);text-underline-offset:3px;text-decoration:underline}[data-template=ff-indify] .footer-strip{background:var(--brand-deep);color:var(--accent-on-dark);padding-block:32px 28px;font-size:15px;font-weight:300}[data-template=ff-indify] .footer-strip :is(.footer-credit,.footer-row>nav a){color:var(--accent-on-dark)}[data-template=ff-indify] .footer-strip .footer-dot{color:color-mix(in srgb, var(--accent-on-dark) 50%, transparent)}[data-template=ff-indify] .footer-strip :is(a,.footer-credit):hover{color:var(--accent-on-dark);text-underline-offset:3px;text-decoration:underline}[data-template=ff-beginner] .footer-strip{color:#e5e5e5;background:#262626;align-items:center;min-height:10vh;padding-block:20px;display:flex}[data-template=ff-beginner] .footer-strip .footer-credit{color:#e5e5e5bf}[data-template=ff-beginner] .footer-strip .footer-dot{color:#e5e5e566}[data-template=ff-beginner] .footer-strip :is(a,.footer-credit):hover{color:#fff;text-underline-offset:3px;text-decoration:underline}[data-template=ff-basic] .footer-strip{--accent:var(--ff-foot-accent);--accent-text:var(--ff-foot-accent);background:var(--paper);color:var(--ink);padding-block:0;font-size:16px}[data-template=ff-basic] .footer-row{background:linear-gradient(color-mix(in srgb, var(--ff-foot-accent) 22%, transparent), color-mix(in srgb, var(--ff-foot-accent) 22%, transparent)) top center / calc(100% - 2 * var(--gut)) 1px no-repeat;min-height:64px;padding-block:18px}[data-template=ff-basic] .footer-copy{font-weight:800}[data-template=ff-basic] .footer-strip :is(.footer-credit,.footer-dot){color:var(--muted);font-weight:500}[data-template=ff-basic] .footer-strip :is(a,.footer-credit):hover{color:var(--accent-text)}[data-template=ff-dark-hack] .footer-strip{--accent:var(--ff-foot-accent);--accent-text:var(--ff-foot-accent);background:var(--paper);color:var(--ink);padding-block:14px;font-size:14px;font-weight:700}[data-template=ff-dark-hack] .footer-strip :is(.footer-credit,.footer-dot){color:var(--muted);font-weight:600}[data-template=ff-dark-hack] .footer-row>nav a{color:var(--accent-text)}[data-template=ff-dark-hack] .footer-strip :is(a,.footer-credit):hover{color:var(--ink);text-underline-offset:3px;text-decoration:underline}[data-template=ff-easy] .footer-strip{color:#111;background:#888;padding-block:100px;font-size:16px}[data-template=ff-easy] .footer-strip :is(.footer-credit,.footer-row>nav a){color:#111}[data-template=ff-easy] .footer-strip .footer-dot{color:#333}[data-template=ff-easy] .footer-strip :is(a,.footer-credit):hover{color:#000;text-underline-offset:3px;text-decoration:underline}[data-template=ff-classic] .footer-strip{color:#ffffffe0;background:#333;padding-block:16px}[data-template=ff-classic] .footer-strip .footer-credit{color:#ffffffb8}[data-template=ff-classic] .footer-strip .footer-dot{color:#fff6}[data-template=ff-classic] .footer-strip :is(a,.footer-credit):hover{color:#fff;text-underline-offset:3px;text-decoration:underline}[data-template=ff-outlines] .site-footer>.section{text-align:start}[data-template=ff-outlines] .site-footer>.section :is(.section-head,.lede){text-align:start;margin-inline:0}[data-template=ff-outlines] .site-footer>.section .btn-row{flex-direction:column;align-items:flex-start;gap:8px;margin-top:18px}[data-template=ff-outlines][data-template] .site-footer>.section .btn{min-height:0;box-shadow:none;color:var(--accent-text);letter-spacing:0;text-align:start;text-transform:none;background:0 0;border:0;border-radius:0;padding:0;font-size:14px;font-weight:400}[data-template=ff-outlines][data-template] .site-footer>.section .btn:hover{color:var(--accent-text);text-underline-offset:.2em;background:0 0;text-decoration:underline;transform:none}[data-template=ff-outlines][data-template] .site-footer>.section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .btn{color:var(--accent-on-dark)}:is([data-template=ff-plain],[data-template=ff-hacker]) .site-footer>.section .btn-row{gap:8px}[data-template=ff-plain] .site-footer>.section .btn-row{justify-content:center}:is([data-template=ff-plain],[data-template=ff-hacker])[data-template] .site-footer>.section .btn{min-height:36px;box-shadow:none;letter-spacing:.0892857em;text-transform:uppercase;background:0 0;border:1px solid;border-radius:28px;padding:0 16px;font-size:14px;font-weight:500}:is([data-template=ff-plain],[data-template=ff-hacker])[data-template] .site-footer>.section .btn:hover{background:color-mix(in srgb, currentColor 9%, transparent);transform:none}[data-template=ff-plain][data-template] .site-footer>.section .btn{color:var(--ink)}[data-template=ff-hacker][data-template] .site-footer>.section .btn{color:var(--accent-text)}[data-template=ff-plain][data-template] .site-footer>.section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .btn{color:#fff}[data-template=ff-plain] .site-footer>.section{align-content:center;min-height:min(100svh,960px);padding-block:clamp(64px,10vh,120px);display:grid}[data-template=ff-plain] .site-footer>.section>.wrap{min-width:0}[data-template=ff-flower] .site-footer>.section .btn-row{justify-content:center;align-items:center;gap:16px 28px}[data-template=ff-flower][data-template] .site-footer>.section .btn{min-height:0;box-shadow:none;color:var(--accent-text);letter-spacing:0;text-transform:none;background:0 0;border:0;border-radius:0;padding:4px 0;font-size:16px;font-weight:500}[data-template=ff-flower][data-template] .site-footer>.section .btn:hover{color:var(--ink);text-underline-offset:4px;background:0 0;text-decoration:underline;transform:none}[data-template=ff-flower][data-template] .site-footer>.section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .btn:hover{color:#fff}@media (max-width:767px){[data-template=ff-flower] .site-footer>.section .btn-row{flex-direction:column}}[data-template=ff-deepsea] .site-footer>.section .btn-row{justify-content:space-evenly;align-items:flex-start;gap:12px 20px;max-width:512px;margin-inline:auto}[data-template=ff-deepsea][data-template] .site-footer>.section .btn{min-height:0;box-shadow:none;color:var(--ink);letter-spacing:0;text-transform:none;background:0 0;border:0;border-radius:4px;flex-direction:column;justify-content:center;gap:6px;padding:8px 10px;font-size:15px;font-weight:400}[data-template=ff-deepsea][data-template] .site-footer>.section .btn:hover{background:color-mix(in srgb, var(--ink) 9%, transparent);color:var(--ink);transform:none}[data-template=ff-deepsea][data-template] .site-footer>.section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .btn{color:#fff}[data-template=ff-deepsea][data-template] .site-footer>.section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .btn:hover{color:#fff;background:#ffffff1a}[data-template=ff-classic] .site-footer>.section :is(.section-head,.lede){text-align:start;margin-inline:0}[data-template=ff-classic] .site-footer>.section .btn-row{justify-content:flex-start}[data-template=ff-classic] .site-footer>.section>.wrap>.ff-classic-mail{margin:0 auto 32px}@media (min-width:701px){[data-template=ff-classic] .site-footer>.section>.wrap{grid-template-columns:minmax(0,.85fr) minmax(0,1.15fr);align-items:center;column-gap:clamp(32px,5vw,72px);display:grid}[data-template=ff-classic] .site-footer>.section>.wrap>*{grid-column:2}[data-template=ff-classic] .site-footer>.section>.wrap>.ff-classic-mail{grid-area:1/1/span 6;width:min(100%,300px);height:200px;margin:0 auto}[data-template=ff-classic] .site-footer>.section>.wrap:not(:has(>.ff-classic-mail)):before{content:"";grid-area:1/1/span 6;height:200px}}@media (min-width:1024px){[data-template=ff-classic] .site-footer>.section>.wrap>.ff-classic-mail{scale:1.25}}[data-template=ff-dark-hack]{--ff-dh-mint:var(--accent)}[data-template=ff-dark-hack][data-colorway=source-neon]{--ff-dh-mint:#64fcd9}[data-template=ff-dark-hack] .site-footer>.section:not([data-bg]){background-image:radial-gradient(ellipse 48% 56% at 50% 56%, color-mix(in srgb, var(--ff-dh-mint) 22%, transparent), transparent 72%)}[data-template=ff-aurora] .site-footer>.section:not([data-bg]):is([data-theme=light],[data-theme=surface]){background-color:color-mix(in srgb, var(--surface) 30%, var(--ground))}[data-template=ff-aurora][data-template] .site-footer .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}:is(html[data-template=ff-plain],html[data-template=ff-indify],html[data-template=ff-deepsea],html[data-template=ff-beginner],html[data-template=ff-dark-hack],html[data-template=ff-easy],html[data-template=ff-classic],html[data-template=ff-aurora],html[data-template=ff-flower]):not([data-effect-chapter-marks]) :is(.section[data-theme=light]:not([data-bg])+.section[data-theme=light],.section[data-theme=surface]:not([data-bg])+.section[data-theme=surface]):not([data-bg])>.wrap{background-image:none}:is(html[data-template=ff-aurora],html[data-template=ff-flower]):not([data-effect-chapter-marks]) :is(.section[data-theme=light]:not([data-bg])+.section[data-theme=light],.section[data-theme=surface]:not([data-bg])+.section[data-theme=surface]):not([data-bg]){padding-top:var(--pad)}html[data-template=ff-plain]:not([data-effect-chapter-marks]) :is(.section[data-theme=light]:not([data-bg])+.section[data-theme=light],.section[data-theme=surface]:not([data-bg])+.section[data-theme=surface]):not([data-bg]){padding-top:clamp(64px,10vh,120px)}:is(html[data-template=ff-aurora],html[data-template=ff-flower],html[data-template=ff-plain]):not([data-effect-chapter-marks]) :is(.section[data-theme=light]:not([data-bg])+.section[data-theme=light],.section[data-theme=surface]:not([data-bg])+.section[data-theme=surface]):not([data-bg])>.wrap{padding-top:0}html[data-template=ff-outlines]:not([data-effect-chapter-marks]) :is(.section[data-theme=light]:not([data-bg])+.section[data-theme=light],.section[data-theme=surface]:not([data-bg])+.section[data-theme=surface]):not([data-bg]):not(.hero-section)>.wrap{background-image:none;padding-top:clamp(20px,2.4vw,34px)}@media (max-width:600px){html[data-template=ff-outlines]:not([data-effect-chapter-marks]) :is(.section[data-theme=light]:not([data-bg])+.section[data-theme=light],.section[data-theme=surface]:not([data-bg])+.section[data-theme=surface]):not([data-bg]):not(.hero-section)>.wrap{padding-top:22px}}html[data-template=ff-beginner]:not([data-effect-chapter-marks]) .ff-testimonials-track>:is(.section[data-theme=light]:not([data-bg])+.section[data-theme=light],.section[data-theme=surface]:not([data-bg])+.section[data-theme=surface]):has(>.wrap>.quote):not([data-bg]){padding-top:var(--pad)}html[data-template=ff-beginner]:not([data-effect-chapter-marks]) .ff-testimonials-track>:is(.section[data-theme=light]:not([data-bg])+.section[data-theme=light],.section[data-theme=surface]:not([data-bg])+.section[data-theme=surface]):has(>.wrap>.quote):not([data-bg])>.wrap{padding-top:clamp(28px,5vw,4rem)}[data-template=ff-aurora] :is(.site-main>.section:nth-last-child(2n):not(.hero-section)):not([data-bg])[data-theme=light],[data-template=ff-aurora] .site-main>.ff-testimonials-group:nth-last-child(2n){background-color:color-mix(in srgb, var(--surface) 30%, transparent)}[data-template=ff-flower] :is(.site-main>.section:nth-last-child(2n):not(.hero-section),.site-main>.ff-testimonials-group:nth-last-child(2n)>.ff-testimonials-track>.section):not([data-bg])[data-theme=light]{background-color:color-mix(in srgb, var(--paper) 50%, transparent)}[data-template=ff-hacker] .gallery{grid-template-columns:repeat(auto-fit,minmax(min(170px,100%),1fr))}[data-template=ff-hacker] .gallery:has(>:nth-child(4):last-child){grid-template-columns:repeat(2,minmax(0,1fr))}@media (min-width:720px){[data-template=ff-hacker] .gallery:has(>:nth-child(4):last-child){grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width:768px){html[data-template=ff-outlines][data-template] .section>.wrap>.grid-2:has(>.card>.proj-body){grid-template-columns:repeat(2,minmax(0,1fr))}html[data-template=ff-outlines][data-template] .section>.wrap>.grid-2:has(>.card>.proj-body)>.card:nth-child(odd):last-child:not(:first-child){grid-column:1/-1}html[data-template=ff-outlines][data-template] .section>.wrap>.grid-2:has(>.card>.proj-body)>.card:nth-child(odd):last-child:not(:first-child):has(>.proj-media){grid-template-columns:minmax(0,1fr) minmax(0,1fr);align-items:center;gap:0 24px;display:grid}html[data-template=ff-outlines][data-template] .section>.wrap>.grid-2:has(>.card>.proj-body)>.card:nth-child(odd):last-child:not(:first-child)>.proj-media{margin:0}}[data-template=ff-outlines] .card>.proj-body{flex-direction:column;display:flex}[data-template=ff-outlines] .card>.proj-body>.card-title{order:1;margin-bottom:2px}[data-template=ff-outlines][data-template] .card>.proj-body>.kicker{color:var(--muted);letter-spacing:0;text-align:center;text-transform:none;order:2;margin:0 0 12px;font-size:13px;font-weight:600}[data-template=ff-outlines] .card>.proj-body>p:not(.kicker,.link-more){order:3}[data-template=ff-outlines] .card>.proj-body>.tags{order:4}[data-template=ff-outlines] .card>.proj-body>.link-more{order:5;align-self:flex-end;margin-top:12px;font-size:13px}@media (min-width:768px){[data-template=ff-indify][data-template] .section .wrap>.grid:has(>.card[data-pick-field^=steps\.]):has(>:last-child:nth-child(2n)){grid-template-columns:repeat(2,minmax(0,1fr))}}[data-template=ff-hacker][data-template][data-template] .section.has-rail>.wrap>.grid:has(>.card[data-pick-field^=steps\.]){grid-template-columns:minmax(0,1fr)}:is([data-template=ff-aurora],[data-template=ff-deepsea]) .card:has(.proj-body) .tags{--tag-sep:none;--tag-sep-w:0px;white-space:normal;flex-wrap:wrap;gap:8px}[data-template=ff-aurora] .card:has(.proj-body) .tag{background:color-mix(in srgb, var(--ff-au-green) 16%, transparent);color:var(--ff-au-green);border-radius:4px;padding:4px 8px;font-size:12px}[data-template=ff-aurora] .card:has(.proj-body) .tag:nth-child(3n+2){background:color-mix(in srgb, var(--ff-au-blue) 16%, transparent);color:var(--ff-au-blue)}[data-template=ff-aurora] .card:has(.proj-body) .tag:nth-child(3n){background:color-mix(in srgb, var(--ff-au-purple) 16%, transparent);color:var(--ff-au-purple-text)}[data-template=ff-deepsea] .card:has(.proj-body) .tag{background:var(--surface-2);color:var(--body);border-radius:4px;padding:6px 8px;font-size:13px;font-weight:400}[data-template=ff-deepsea] .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))) .card:has(.proj-body) .tag{color:#ffffffdb;background:#ffffff1a}[data-template=ff-aurora]:not([data-colorway=source-lights]) .section:is([data-theme=dark],:where([data-bg]:is([data-overlay=medium],[data-overlay=heavy]))){--ff-au-green:var(--accent-on-dark);--ff-au-blue:var(--accent-on-dark);--ff-au-purple-text:var(--accent-on-dark);--ff-au-pink-text:var(--accent-on-dark)}[data-template=ff-aurora] .exp-list>.exp-row :is(.exp-head,.exp-head>.card-link){flex-direction:column;display:flex}[data-template=ff-aurora] .exp-list>.exp-row .exp-role{color:var(--ff-au-row-text);font:600 clamp(18px, 1.5vw, 20px)/1.35 var(--font-display);letter-spacing:-.01em;order:-1;margin:0 0 6px}[data-template=ff-aurora][data-template] .exp-list>.exp-row .exp-head:has(.exp-role) .exp-co{color:var(--body);letter-spacing:0;font-size:16px;font-weight:500}[data-template=ff-outlines] .masthead .nav-brand-tile{display:none}[data-template=ff-outlines] .masthead .nav-brand{letter-spacing:0;font-size:clamp(24px,2.5vw,36px);font-weight:600}[data-template=ff-outlines] .masthead .nav-brand>span:last-child{color:var(--accent-text)}[data-template=ff-aurora] .masthead .nav-brand-tile{display:none}[data-template=ff-aurora] .masthead .nav-brand{--ff-au-word:linear-gradient(135deg, var(--ff-au-green) 0%, var(--ff-au-blue) 50%, var(--ff-au-purple-text) 100%);letter-spacing:-.01em;font-size:24px;font-weight:700}[data-template=ff-aurora]:not([data-colorway=source-lights]) .masthead[data-over] .nav-brand{--ff-au-word:linear-gradient(135deg, var(--accent-on-dark), color-mix(in srgb, var(--accent-on-dark) 45%, #fff))}@supports ((-webkit-background-clip:text) or (background-clip:text)){[data-template=ff-aurora][data-template] .masthead .nav-brand>span:last-child{background-image:var(--ff-au-word);color:#0000;-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text}}@media (forced-colors:active){[data-template=ff-aurora][data-template] .masthead .nav-brand>span:last-child{color:canvastext;-webkit-text-fill-color:CanvasText;background:0 0}}html[data-template=ff-aurora]::-webkit-scrollbar{width:10px}html[data-template=ff-aurora]::-webkit-scrollbar-track{background:var(--paper)}html[data-template=ff-aurora]::-webkit-scrollbar-thumb{background:linear-gradient(to bottom, var(--ff-au-green), var(--ff-au-blue));border-radius:5px}[data-template=ff-indify] .masthead .nav-brand-tile{display:none}[data-template=ff-indify] .masthead .nav-brand{letter-spacing:0;font-size:19px;font-weight:900}[data-template=ff-indify][data-template] .masthead .nav-brand:hover{color:var(--accent-text)}[data-template=ff-indify] .masthead .nav>a:not(.nav-cta)[data-ff-current]:after{height:3px;transform:scaleX(.7)}[data-template=ff-indify] .masthead .nav>a:not(.nav-cta)[data-ff-current]:hover:after{transform:scaleX(1)}[data-template=ff-flower] .masthead .nav-brand{gap:10px;font-size:20px;font-weight:700}[data-template=ff-flower][data-template] .masthead .nav-brand-tile{color:#0000;background:radial-gradient(circle at 16px 16px, var(--ff-fl-yellow) 0 4.5px, transparent 5px), radial-gradient(circle at 16px 9px, var(--ff-fl-pink) 0 5.5px, transparent 6px), radial-gradient(circle at 22.7px 13.8px, var(--ff-fl-pink) 0 5.5px, transparent 6px), radial-gradient(circle at 20.1px 21.7px, var(--ff-fl-pink) 0 5.5px, transparent 6px), radial-gradient(circle at 11.9px 21.7px, var(--ff-fl-pink) 0 5.5px, transparent 6px), radial-gradient(circle at 9.3px 13.8px, var(--ff-fl-pink) 0 5.5px, transparent 6px);border-radius:0;width:32px;height:32px;font-size:0}[data-template=ff-flower] .masthead .nav-brand-tile>img,[data-template=ff-classic] .masthead .nav-brand-tile{display:none}[data-template=ff-classic] .masthead .nav-brand{letter-spacing:0;font-size:14px;font-weight:400}[data-template=ff-classic] .masthead .nav-brand>span:last-child{color:#ffffffbd}@media (min-width:1100px){[data-template=ff-classic][data-nav=centered] .masthead .wrap{grid-template-columns:minmax(0,1fr) auto minmax(max-content,1fr)}[data-template=ff-classic][data-nav=centered] .masthead .nav-brand{grid-column:1;justify-self:start}[data-template=ff-classic][data-nav=centered] .masthead .nav{grid-column:2;justify-content:center}}[data-template=ff-dark-hack] .masthead .nav-brand-tile{display:none}[data-template=ff-dark-hack] .masthead .nav-brand{letter-spacing:0;font-size:14px;font-weight:600}[data-template=ff-dark-hack] .masthead .nav-brand>span:last-child{color:var(--muted)}[data-template=ff-dark-hack] .masthead[data-over] .nav-brand>span:last-child{color:#ffffff9e}[data-template=ff-dark-hack][data-template] .masthead .nav>a:not(.nav-cta){color:var(--muted);background:linear-gradient(var(--accent-text), var(--accent-text)) no-repeat 50% calc(100% - 3px) / 0% 3px;font-weight:800}[data-template=ff-dark-hack][data-template] .masthead[data-over] .nav>a:not(.nav-cta){color:#ffffff9e}[data-template=ff-dark-hack][data-template] .masthead .nav>a:not(.nav-cta):is(:hover,:focus-visible,[data-ff-current]){color:var(--accent-text);background-size:100% 3px}[data-template=ff-dark-hack]{--ff-dh-glow:0 0 60px 10px color-mix(in srgb, var(--accent-solid) 75%, transparent);--ff-dh-glow-hover:0 0 60px -8px color-mix(in srgb, var(--accent-solid) 75%, transparent)}[data-template=ff-dark-hack]:not([data-button=link]) .btn-accent{box-shadow:var(--ff-dh-glow)}[data-template=ff-dark-hack]:not([data-button=link]) .btn-accent:is(:hover,:focus-visible){box-shadow:var(--ff-dh-glow-hover)}[data-template=ff-beginner] .masthead .nav>a:not(.nav-cta):after{content:none}[data-template=ff-beginner] .masthead .nav>a:not(.nav-cta){background:linear-gradient(125deg, var(--ff-bg-blue), var(--ff-bg-purple)) no-repeat 50% 100% / 0% 3px}[data-template=ff-beginner] .masthead .nav>a:not(.nav-cta):is(:hover,:focus-visible){background-size:100% 3px}[data-template=ff-beginner] .nav-burger{background:linear-gradient(currentColor,currentColor) 50%/26px 3px no-repeat;border-color:#0000;position:relative}[data-template=ff-beginner] .nav-burger>svg{display:none}[data-template=ff-beginner] .nav-burger:before,[data-template=ff-beginner] .nav-burger:after{content:"";background:currentColor;border-radius:2px;width:26px;height:3px;margin:-1.5px 0 0 -13px;position:absolute;top:50%;left:50%}[data-template=ff-beginner] .nav-burger:before{translate:0 -8px}[data-template=ff-beginner] .nav-burger:after{translate:0 8px}[data-template=ff-beginner] .section:has(>.wrap>.quote) .quote:before{content:"“" / ""}[data-template=ff-beginner] .section:has(>.wrap>.quote) .quote:after{content:"”" / ""}[data-template=ff-beginner] .section:has(>.wrap>.quote) .quote:before{color:currentColor;text-indent:0;vertical-align:-.38em;margin-inline:.1em .18em;font:700 1.8em/0 Georgia,Times New Roman,serif;display:inline-block}[data-template=ff-beginner] .section:has(>.wrap>.quote) .quote:after{color:currentColor;text-indent:0;vertical-align:-.38em;margin-inline:.1em .18em;font:700 1.8em/0 Georgia,Times New Roman,serif;display:inline-block}[data-template=ff-deepsea]:is([data-nav=classic],[data-nav=centered]) .masthead:not([data-over]){background:var(--surface)}@supports (animation-timeline:scroll(root)){@media (prefers-reduced-motion:no-preference){html[data-template=ff-deepsea]:is([data-nav=classic],[data-nav=centered]) .masthead:not([data-over]){animation:linear both ff-deepsea-bar;animation-timeline:scroll(root);animation-range:0 10px}html[data-template=ff-indify]:is([data-nav=classic],[data-nav=centered]) .masthead[data-over=dark]{animation:linear both ff-indify-bar;animation-timeline:scroll(root);animation-range:540px 560px}html[data-template=ff-indify]:is([data-nav=classic],[data-nav=centered]) .masthead[data-over=dark] :is(.nav-brand,.nav>a:not(.nav-cta),.nav-group-row:not(.nav-group-cta)>:is(a,button),.nav-lang a[aria-current=true]){animation:linear both ff-indify-ink;animation-timeline:scroll(root);animation-range:540px 560px}html[data-template=ff-indify]:is([data-nav=classic],[data-nav=centered]) .masthead[data-over=dark] :is(.nav-meta,.nav-lang a:not([aria-current=true])){animation:linear both ff-indify-meta;animation-timeline:scroll(root);animation-range:540px 560px}html[data-template=ff-indify]:is([data-nav=classic],[data-nav=centered]) .masthead[data-over=dark] .nav-burger{animation:linear both ff-indify-burger;animation-timeline:scroll(root);animation-range:540px 560px}}}@keyframes ff-deepsea-bar{0%{background-color:#0000;border-bottom-color:#0000}to{background-color:var(--surface);border-bottom-color:var(--line)}}@keyframes ff-indify-bar{0%{background-color:color-mix(in srgb, var(--brand-deep) 94%, transparent);border-bottom-color:var(--line-dark);box-shadow:none}to{background-color:var(--paper);border-bottom-color:#0000;box-shadow:0 2px 5px #1816164d}}@keyframes ff-indify-ink{0%{color:#fff}to{color:var(--ink)}}@keyframes ff-indify-meta{0%{color:#ffffff9e;border-left-color:var(--line-dark)}to{color:var(--muted);border-left-color:var(--line)}}@keyframes ff-indify-burger{0%{color:#fff;border-color:#ffffff4d}to{color:var(--ink);border-color:var(--line)}}html:is([data-template=ff-deepsea],[data-template=ff-indify],[data-template=ff-beginner],[data-template=ff-dark-hack]) .mobile-menu{text-align:center;align-items:center;gap:0}html:is([data-template=ff-deepsea],[data-template=ff-indify],[data-template=ff-beginner],[data-template=ff-dark-hack]) .mobile-menu :is(.mobile-menu>a,.nav-group-link,.nav-group-only){letter-spacing:0;text-align:center;line-height:1.4}html[data-template=ff-deepsea]{--ff-ds-menu:var(--brand-deep)}html[data-template=ff-deepsea][data-colorway=source-depth]{--ff-ds-menu:var(--surface)}html[data-template=ff-deepsea] .mobile-menu{background:var(--ff-ds-menu);padding-top:76px}html[data-template=ff-deepsea] .mobile-menu>a{border-bottom:3px solid #0000;align-self:stretch;padding:10px 16px;font-size:18px;font-weight:400}html[data-template=ff-deepsea] .mobile-menu .mobile-nav-group :is(.nav-group-link,.nav-group-only){font-size:18px;font-weight:400}html[data-template=ff-deepsea] .mobile-menu>a:hover{background:#ffffff1a;border-bottom-color:#fff}html[data-template=ff-indify] .mobile-menu{background:var(--brand-deep);padding-top:84px}html[data-template=ff-indify] .mobile-menu>a{color:#f9f9f9;margin-bottom:20px;padding:4px 0;font-size:17px;font-weight:500}html[data-template=ff-indify] .mobile-menu .mobile-nav-group :is(.nav-group-link,.nav-group-only){color:#f9f9f9;font-size:17px;font-weight:500}html[data-template=ff-indify] .mobile-menu>a:hover{color:var(--accent-on-dark);text-underline-offset:4px;text-decoration:underline}html[data-template=ff-beginner] .mobile-menu{background:var(--paper);color:var(--ink);padding-top:92px}html[data-template=ff-beginner] .mobile-menu>a{color:var(--ink);background:linear-gradient(125deg, var(--ff-bg-blue), var(--ff-bg-purple)) no-repeat 50% 100% / 0% 3px;margin-block:10px;padding:6px 8px;font-size:18px;font-weight:500}html[data-template=ff-beginner] .mobile-menu>a:is(:hover,:focus-visible){background-size:100% 3px}html[data-template=ff-beginner] .mobile-menu .mobile-nav-group :is(.nav-group-link,.nav-group-only,.nav-submenu-toggle,.nav-submenu){color:var(--ink);font-size:18px;font-weight:500}html[data-template=ff-beginner] .mobile-menu .mobile-nav-group :is(.nav-submenu-toggle,.nav-submenu){border-color:var(--line)}html[data-template=ff-beginner] .mobile-menu-close{color:var(--ink);background:linear-gradient(currentColor,currentColor) 50%/0 3px no-repeat;border-color:#0000;top:20px}html[data-template=ff-beginner] .mobile-menu-close>svg{display:none}html[data-template=ff-beginner] .mobile-menu-close:before,html[data-template=ff-beginner] .mobile-menu-close:after{content:"";background:currentColor;border-radius:2px;width:26px;height:3px;margin:-1.5px 0 0 -13px;position:absolute;top:50%;left:50%}html[data-template=ff-beginner] .mobile-menu-close:before{rotate:45deg}html[data-template=ff-beginner] .mobile-menu-close:after{rotate:-45deg}html[data-template=ff-dark-hack] .mobile-menu{background:var(--paper);justify-content:center;padding-block:72px}html[data-template=ff-dark-hack] .mobile-menu>a{color:var(--muted);background:linear-gradient(var(--accent-text), var(--accent-text)) no-repeat 50% 100% / 0% 3px;margin-bottom:36px;padding:4px 0 10px;font-size:20px;font-weight:800}html[data-template=ff-dark-hack] .mobile-menu>a:before{content:"<" / ""}html[data-template=ff-dark-hack] .mobile-menu>a:after{content:" />" / ""}html[data-template=ff-dark-hack] .mobile-menu>a:is(:hover,:focus-visible,[data-ff-current]){color:var(--accent-text);background-size:100% 3px}html[data-template=ff-dark-hack] .mobile-menu .mobile-nav-group :is(.nav-group-link,.nav-group-only){color:var(--muted);font-size:20px;font-weight:800}html:is([data-template=ff-beginner],[data-template=ff-dark-hack]) .mobile-menu-close{color:var(--ink);border-color:var(--line)}html[data-template=ff-beginner] .mobile-menu-close{border-color:#0000}html:is([data-template=ff-beginner],[data-template=ff-dark-hack]) .mobile-menu-lang{border-top-color:var(--line)}html:is([data-template=ff-beginner],[data-template=ff-dark-hack]) .mobile-menu-lang a{color:var(--muted)}html:is([data-template=ff-beginner],[data-template=ff-dark-hack]) .mobile-menu-lang a[aria-current=true]{color:var(--ink)}html:is([data-template=ff-beginner],[data-template=ff-dark-hack]) .mobile-menu .mobile-nav-group .nav-submenu{background:0 0}@media (prefers-reduced-motion:no-preference){html:is([data-template=ff-deepsea],[data-template=ff-indify],[data-template=ff-beginner])[data-motion=native]:not([data-editing]) .mobile-menu{animation:.3s both ff-menu-drop}html:is([data-template=ff-deepsea],[data-template=ff-indify],[data-template=ff-beginner])[data-motion=native]:not([data-editing]) .mobile-menu[data-closing]{animation:.18s ease-in both ff-menu-lift}html:is([data-template=ff-deepsea],[data-template=ff-indify],[data-template=ff-beginner],[data-template=ff-dark-hack])[data-motion=native] .mobile-menu>:is(a,.mobile-nav-group,.mobile-menu-lang),html[data-template=ff-dark-hack][data-motion=native]:not([data-editing]) .mobile-menu{animation:none}html[data-template=ff-beginner][data-motion=native]:not([data-editing]) .mobile-menu-close:before{animation:.3s cubic-bezier(.8,.5,.2,1.4) both ff-bars-cross-a}html[data-template=ff-beginner][data-motion=native]:not([data-editing]) .mobile-menu-close:after{animation:.3s cubic-bezier(.8,.5,.2,1.4) both ff-bars-cross-b}html[data-template=ff-beginner][data-motion=native]:not([data-editing]) .mobile-menu-close{animation:50ms linear both ff-bars-middle}html[data-template=ff-beginner][data-motion=native] .nav-burger:before,html[data-template=ff-beginner][data-motion=native] .nav-burger:after{transition:translate .3s cubic-bezier(.8,.5,.2,1.4)}html[data-template=ff-beginner][data-motion=native] .nav-burger:hover:before{translate:-5px -8px}html[data-template=ff-beginner][data-motion=native] .nav-burger:hover:after{translate:5px 8px}html[data-template=ff-beginner]:not([data-motion=none]) .masthead .nav>a:not(.nav-cta),html[data-template=ff-beginner]:not([data-motion=none]) .mobile-menu>a{transition:background-size .3s}html[data-template=ff-dark-hack]:not([data-motion=none]) .masthead .nav>a:not(.nav-cta),html[data-template=ff-dark-hack]:not([data-motion=none]) .mobile-menu>a{transition:color .15s ease-in-out,background-size .15s ease-in-out}html[data-template=ff-dark-hack]:not([data-motion=none]):not([data-button=link]) :is(.btn-accent,.hero .ff-hero-resume>.btn){transition:transform var(--t-fast), box-shadow .15s ease-in-out, background var(--t-base), color var(--t-base)}html[data-template=ff-aurora]:not([data-motion=none]):not([data-editing]) .site-footer .btn-accent:is(:hover,:focus-visible){transform:scale(1.05)}}@keyframes ff-menu-drop{0%{translate:0 -100%}}@keyframes ff-menu-lift{to{translate:0 -100%}}@keyframes ff-bars-cross-a{0%{translate:0 -8px;rotate:none}to{translate:0;rotate:45deg}}@keyframes ff-bars-cross-b{0%{translate:0 8px;rotate:none}to{translate:0;rotate:-45deg}}@keyframes ff-bars-middle{0%{background-size:26px 3px}to{background-size:0 3px}}@media print{[data-template=ff-hacker] .site-main:before{content:none}[data-template^=ff-] .site-footer>.section{background-image:none}}
