#grufo-landing,#grufo-landing [data-slot],[data-slot][data-grufo-portal]{--background:#ffffff;--foreground:#0a0f2c;--card:#ffffff;--card-foreground:#0a0f2c;--popover:#ffffff;--popover-foreground:#0a0f2c;--primary:#004dff;--primary-foreground:#ffffff;--secondary:#eef1f8;--secondary-foreground:#0a0f2c;--muted:#f1f4fa;--muted-foreground:#4f5773;--accent:#eef2ff;--accent-foreground:#0a0f2c;--border:#e2e6f0;--input:#d3d9e7;--ring:#004dff;--brand-text:#0041d9;--brand-soft:#eaf0ff;--brand-soft-border:#c9d7fb;--tint:#f5f7fc;--navy:#060a2b;--navy-raised:#0e1440;--navy-foreground:#f1f3ff;--navy-muted:#b3bbe0;--navy-border:rgb(255 255 255/0.12);--stage:#004dff;--stage-light:#3f7dff;--stage-deep:#0032c2;--ok:#13773f;--ok-soft:#e5f5ec;--ok-on-navy:#5dcf8b;--info-soft:#e7eeff;--warn:#9a5b00;--warn-soft:#fdf1dc;--danger:#c0262d;--danger-soft:#fdeaea;--shadow-card:0 1px 2px rgb(10 15 44/0.05),0 12px 32px -18px rgb(10 15 44/0.22);--shadow-float:0 2px 6px rgb(0 18 80/0.14),0 28px 56px -24px rgb(0 18 80/0.55);--neutral-soft:var(--muted);--neutral-soft-foreground:var(--muted-foreground);--neutral-soft-border:var(--border);--font-sans:var(--font-geist-sans),system-ui,-apple-system,"Segoe UI",sans-serif;--font-mono:var(--font-geist-mono),ui-monospace,"SF Mono","Cascadia Mono",monospace;--gl-text-body:0.9375rem}#grufo-landing.dark,#grufo-landing.dark [data-slot],[data-slot][data-grufo-portal].dark{--background:#060a2b;--foreground:#eef0fa;--card:#0d1333;--card-foreground:#eef0fa;--popover:#0f1638;--popover-foreground:#eef0fa;--primary:#004dff;--primary-foreground:#ffffff;--secondary:#151c42;--secondary-foreground:#eef0fa;--muted:#111837;--muted-foreground:#a8b0cf;--accent:#172050;--accent-foreground:#eef0fa;--border:#1f2851;--input:#2a3464;--ring:#7ea3ff;--brand-text:#93b2ff;--brand-soft:#111d4d;--brand-soft-border:#22357a;--tint:#0a0f2a;--navy:#03061a;--navy-raised:#0b1136;--stage:#0a45f0;--stage-light:#3b73ff;--stage-deep:#0029a3;--ok:#5dcf8b;--ok-soft:#0f2e22;--info-soft:#13204f;--warn:#f0b458;--warn-soft:#33250c;--danger:#ff8a8f;--danger-soft:#3a1418;--shadow-card:0 1px 2px rgb(0 0 0/0.4),0 12px 32px -18px rgb(0 0 0/0.7);--shadow-float:0 2px 6px rgb(0 0 0/0.35),0 28px 56px -24px rgb(0 0 0/0.8);--neutral-soft:var(--muted);--neutral-soft-foreground:var(--muted-foreground);--neutral-soft-border:var(--border);color-scheme:dark}#grufo-landing{--wordmark-accent:#004dff}#grufo-landing .gl-on-navy,#grufo-landing.dark{--wordmark-accent:#6b97ff}#grufo-landing .gl-on-navy,#grufo-landing .gl-on-navy [data-slot]{--foreground:var(--navy-foreground);--muted-foreground:var(--navy-muted);--border:var(--navy-border);--ring:#9db8ff}#grufo-landing{background-color:var(--background);color:var(--foreground);font-family:var(--font-sans);font-feature-settings:"ss01","cv11";-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}[data-slot][data-grufo-portal]{font-family:var(--font-sans);color:var(--foreground)}#grufo-landing ::selection{background-color:var(--primary);color:var(--primary-foreground)}#grufo-landing{caret-color:var(--primary);accent-color:var(--primary);scrollbar-color:color-mix(in oklab,var(--muted-foreground) 45%,transparent) transparent}body:has(#grufo-landing),html:has(#grufo-landing){background-color:#ffffff!important}body:has(#grufo-landing.dark),html:has(#grufo-landing.dark){background-color:#060a2b!important}@layer base{#grufo-landing *,#grufo-landing :after,#grufo-landing :before{border-color:var(--border)}#grufo-landing [id]{scroll-margin-top:5.5rem}#grufo-landing :is(p,li,dd,blockquote,figcaption){text-wrap:pretty}#grufo-landing :is(h1,h2,h3,h4){text-wrap:balance}}.gl-container{width:100%;max-width:80rem;margin-inline:auto;padding-inline:1.25rem}@media (min-width:640px){.gl-container{padding-inline:2rem}}@media (min-width:1024px){.gl-container{padding-inline:2.5rem}}.gl-stage{position:relative;isolation:isolate;overflow:hidden;background-color:var(--stage);background-image:radial-gradient(120% 90% at 85% -10%,var(--stage-light) 0,transparent 55%),radial-gradient(90% 80% at -10% 110%,var(--stage-deep) 0,transparent 60%);color:#ffffff}.gl-stage[data-dots]:before{content:"";position:absolute;inset:0;z-index:-1;background-image:radial-gradient(rgb(255 255 255/.16) 1px,transparent 0);background-size:18px 18px;mask-image:linear-gradient(180deg,black,transparent 85%)}.gl-window{border-radius:.875rem;background-color:var(--card);color:var(--card-foreground)}.gl-shot,.gl-window{box-shadow:var(--shadow-float)}.gl-shot{overflow:hidden;border-radius:.75rem;background-color:#ffffff}.gl-shot[data-bleed=right]{border-radius:.75rem 0 0 0}.gl-shot[data-bleed=bottom]{border-radius:.75rem .75rem 0 0}#grufo-landing.dark .gl-shot img{filter:brightness(.93)}@media (prefers-reduced-motion:no-preference){.gl-js [data-reveal]{transition:opacity .64s cubic-bezier(.16,1,.3,1),transform .64s cubic-bezier(.16,1,.3,1),filter .64s cubic-bezier(.16,1,.3,1);transition-delay:calc(var(--stagger, 0) * 80ms)}.gl-js [data-reveal]:not([data-inview]){opacity:0;transform:translateY(18px);filter:blur(6px)}}@media (prefers-reduced-motion:no-preference) and (max-width:767px){.gl-js [data-reveal]:not([data-inview]){filter:none}}@media (prefers-reduced-motion:no-preference){.gl-js [data-log]:not([data-inview]) .gl-log-line{opacity:0}.gl-js [data-log][data-inview] .gl-log-line{animation:gl-line-in .42s cubic-bezier(.16,1,.3,1) both;animation-delay:calc(var(--i) * .42s + .35s)}.gl-js [data-log][data-inview] .gl-log-pending{animation:gl-fade-out .16s ease both;animation-delay:calc(var(--i) * .42s + .68s)}.gl-js [data-log][data-inview] .gl-log-check{animation:gl-pop-in .24s cubic-bezier(.16,1,.3,1) both;animation-delay:calc(var(--i) * .42s + .72s)}.gl-js [data-log]:not([data-inview]) .gl-log-check{opacity:0}.gl-caret{animation:gl-blink 1.1s steps(1) 4}}.gl-log-pending{opacity:0}@media (prefers-reduced-motion:no-preference){.gl-js [data-log]:not([data-inview]) .gl-log-pending,.gl-js [data-log][data-inview] .gl-log-pending{opacity:1}}[data-demo]{--cycle:9s;--rounds:1.9}@media (prefers-reduced-motion:no-preference){.gl-js [data-demo] [data-anim]{animation-duration:var(--cycle);animation-iteration-count:var(--rounds);animation-timing-function:cubic-bezier(.16,1,.3,1);animation-fill-mode:both;animation-play-state:paused}.gl-js [data-demo][data-playing]:not([data-paused]) [data-anim]{animation-play-state:running}.gl-js [data-demo][data-restart] [data-anim]{animation-name:none!important}.gl-js [data-anim=lead-in]{animation-name:gl-lead-in}.gl-js [data-anim=lead-flash]{animation-name:gl-lead-flash}.gl-js [data-anim=spam-dim]{animation-name:gl-spam-dim}.gl-js [data-anim=spam-chip]{animation-name:gl-spam-chip}.gl-js [data-anim=status-old]{animation-name:gl-status-old}.gl-js [data-anim=status-new]{animation-name:gl-status-new}.gl-js [data-anim=var-token]{animation-name:gl-var-token}.gl-js [data-anim=var-value]{animation-name:gl-var-value}.gl-js [data-anim=sent-row]{animation-name:gl-sent-row}.gl-js [data-anim=type]{animation-name:gl-type;animation-timing-function:steps(46)}.gl-js [data-anim=meter]{animation-name:gl-meter}.gl-js [data-anim=nl-test]{animation-name:gl-nl-test}.gl-js [data-anim=nl-press]{animation-name:gl-nl-press}.gl-js [data-anim=nl-progress]{animation-name:gl-nl-progress}.gl-js [data-anim=nl-done]{animation-name:gl-nl-done}.gl-js [data-anim=nl-pending]{animation-name:gl-nl-pending}.gl-js [data-anim=card-move]{animation-name:gl-card-move}.gl-js [data-anim=card-slot]{animation-name:gl-card-slot}.gl-js [data-anim=note-1]{animation-name:gl-note-1}.gl-js [data-anim=note-2]{animation-name:gl-note-2}.gl-js [data-anim=note-3]{animation-name:gl-note-3}.gl-js [data-anim=conn-1]{animation-name:gl-conn-1}.gl-js [data-anim=conn-2]{animation-name:gl-conn-2}.gl-js [data-anim=conn-head-1]{animation-name:gl-conn-head-1}.gl-js [data-anim=conn-head-2]{animation-name:gl-conn-head-2}.gl-js [data-anim=stem]{animation-name:gl-stem}.gl-js [data-anim=note-4]{animation-name:gl-note-4}.gl-js [data-anim=pw-dots]{animation-name:gl-pw-dots}.gl-js [data-anim=pw-value]{animation-name:gl-pw-value}.gl-js [data-anim=pw-timer]{animation-name:gl-pw-timer;animation-timing-function:linear}.gl-js [data-anim=pw-press]{animation-name:gl-pw-press}.gl-js [data-anim=seg-thumb]{animation-name:gl-seg-thumb}.gl-js [data-anim=role-note]{animation-name:gl-role-note}}@keyframes gl-lead-in{0%,6%{opacity:0;transform:translateY(-14px) scale(.98)}14%,92%{opacity:1;transform:none}to{opacity:0;transform:none}}@keyframes gl-lead-flash{0%,12%{opacity:1}40%,to{opacity:0}}@keyframes gl-spam-dim{0%,32%{opacity:1;filter:none}40%,94%{opacity:.45;filter:grayscale(1)}to{opacity:1;filter:none}}@keyframes gl-spam-chip{0%,32%{opacity:0;transform:scale(.8)}38%,94%{opacity:1;transform:none}to{opacity:0}}@keyframes gl-status-old{0%,56%{opacity:1}60%,96%{opacity:0}to{opacity:1}}@keyframes gl-status-new{0%,56%{opacity:0;transform:translateY(4px)}62%,94%{opacity:1;transform:none}to{opacity:0}}@keyframes gl-var-token{0%,26%{opacity:1}30%,94%{opacity:0}to{opacity:1}}@keyframes gl-var-value{0%,28%{opacity:0;transform:translateY(4px)}34%,94%{opacity:1;transform:none}to{opacity:0}}@keyframes gl-sent-row{0%,36%{opacity:0;transform:translateY(8px)}42%,94%{opacity:1;transform:none}to{opacity:0}}@keyframes gl-type{0%,8%{clip-path:inset(0 100% 0 0)}48%,96%{clip-path:inset(0 0 0 0)}to{clip-path:inset(0 100% 0 0)}}@keyframes gl-meter{0%,8%{transform:scaleX(0)}48%,96%{transform:scaleX(1)}to{transform:scaleX(0)}}@keyframes gl-nl-test{0%,14%{opacity:0;transform:translateY(6px)}20%,94%{opacity:1;transform:none}to{opacity:0}}@keyframes gl-nl-press{0%,34%{transform:none}37%{transform:scale(.95)}40%,to{transform:none}}@keyframes gl-nl-progress{0%,38%{transform:scaleX(0)}72%,96%{transform:scaleX(1)}to{transform:scaleX(0)}}@keyframes gl-nl-done{0%,72%{opacity:0;transform:translateY(6px)}78%,94%{opacity:1;transform:none}to{opacity:0}}@keyframes gl-nl-pending{0%,70%{opacity:1;transform:none}75%,96%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}@keyframes gl-card-move{0%{transform:translateX(var(--from-x)) rotate(0deg);box-shadow:var(--shadow-card);opacity:0}16%,4%{transform:translateX(var(--from-x)) rotate(0deg);box-shadow:var(--shadow-card);opacity:1}24%{transform:translateX(var(--from-x)) translateY(-6px) rotate(-2deg);box-shadow:var(--shadow-float)}46%{transform:translateY(-6px) rotate(1.5deg);box-shadow:var(--shadow-float)}54%,92%{transform:none;box-shadow:var(--shadow-card);opacity:1}97%,to{transform:none;box-shadow:var(--shadow-card);opacity:0}}@keyframes gl-card-slot{0%,24%{opacity:0}30%,48%{opacity:1}54%,to{opacity:0}}@keyframes gl-note-1{0%,4%{opacity:0;transform:scale(.94)}12%,94%{opacity:1;transform:none}to{opacity:0}}@keyframes gl-note-2{0%,22%{opacity:0;transform:scale(.94)}30%,94%{opacity:1;transform:none}to{opacity:0}}@keyframes gl-note-3{0%,40%{opacity:0;transform:scale(.94)}48%,94%{opacity:1;transform:none}to{opacity:0}}@keyframes gl-conn-1{0%,12%{transform:scale(0)}20%,94%{transform:none}to{transform:scale(0)}}@keyframes gl-conn-2{0%,30%{transform:scale(0)}38%,94%{transform:none}to{transform:scale(0)}}@keyframes gl-conn-head-1{0%,19%{opacity:0}22%,94%{opacity:1}to{opacity:0}}@keyframes gl-conn-head-2{0%,37%{opacity:0}40%,94%{opacity:1}to{opacity:0}}@keyframes gl-note-4{0%,53%{opacity:0;transform:translateY(-6px) scale(.94)}61%,94%{opacity:1;transform:none}to{opacity:0}}@keyframes gl-stem{0%,48%{transform:scaleY(0)}53%,94%{transform:none}to{transform:scaleY(0)}}@keyframes gl-pw-press{0%,14%{transform:none}17%{transform:scale(.94)}20%,to{transform:none}}@keyframes gl-pw-dots{0%,18%{opacity:1}21%,78%{opacity:0}82%,to{opacity:1}}@keyframes gl-pw-value{0%,18%{opacity:0;filter:blur(4px)}23%,77%{opacity:1;filter:none}81%,to{opacity:0;filter:blur(4px)}}@keyframes gl-pw-timer{0%,20%{transform:scaleX(1);opacity:0}22%{opacity:1}78%{transform:scaleX(0);opacity:1}80%,to{transform:scaleX(0);opacity:0}}@keyframes gl-seg-thumb{0%{transform:translateX(-100%);opacity:0}22%,4%{transform:translateX(-100%);opacity:1}34%,92%{transform:none;opacity:1}97%,to{transform:none;opacity:0}}@keyframes gl-role-note{0%,40%{opacity:0;transform:translateY(6px)}48%,94%{opacity:1;transform:none}to{opacity:0}}@keyframes gl-line-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}@keyframes gl-fade-out{0%{opacity:1}to{opacity:0}}@keyframes gl-pop-in{0%{opacity:0;transform:scale(.6)}to{opacity:1;transform:none}}@keyframes gl-blink{50%{opacity:0}}@media (prefers-reduced-motion:no-preference){.gl-js .gl-welcome .gl-word>span{transition:transform .75s cubic-bezier(.16,1,.3,1) calc(var(--i) * .11s)}.gl-js .gl-welcome:not([data-inview]) .gl-word>span{transform:translateY(105%)}.gl-js .gl-welcome path{transition:stroke-dashoffset .55s cubic-bezier(.45,0,.25,1) .55s}.gl-js .gl-welcome .gl-welcome-head{transition-duration:.25s;transition-delay:1.05s}.gl-js .gl-welcome:not([data-inview]) path{stroke-dashoffset:1}.gl-tour-progress{animation:gl-tour-progress linear both}.gl-tour-panel[data-state=active] .gl-tour-text>*{animation:gl-tour-rise .5s cubic-bezier(.16,1,.3,1) both}.gl-tour-panel[data-state=active] .gl-tour-text>:nth-child(2){animation-delay:60ms}.gl-tour-panel[data-state=active] .gl-tour-text>:nth-child(3){animation-delay:.12s}.gl-tour-panel[data-state=active] .gl-tour-text>:nth-child(n+4){animation-delay:.18s}.gl-tour-panel[data-state=active] .gl-tour-shot>*{animation:gl-tour-shot .7s cubic-bezier(.16,1,.3,1) both}}.gl-tour-shot>.gl-shot{width:max(var(--shot-w),calc((var(--stage-h) - var(--stage-pt)) * var(--ratio)))}@media (max-width:639px){.gl-tour-shot>.gl-shot{width:var(--small-w,max(var(--shot-w),calc((var(--stage-h) - var(--stage-pt)) * var(--ratio))))}}@keyframes gl-tour-progress{0%{transform:scaleX(0)}to{transform:none}}@keyframes gl-tour-rise{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}@keyframes gl-tour-shot{0%{opacity:0;transform:translateY(24px) scale(.985);filter:blur(4px)}to{opacity:1;transform:none;filter:none}}.gl-prose{font-size:1rem;line-height:1.7}.gl-prose section>*+*,.gl-prose>*+*{margin-top:1rem}.gl-prose section+section{margin-top:3rem}.gl-prose h2{font-size:1.5rem;line-height:1.25;font-weight:650;letter-spacing:-.02em}.gl-prose h2+*{margin-top:.75rem}.gl-prose ol,.gl-prose ul{padding-left:1.25rem}.gl-prose ul{list-style:disc}.gl-prose ol{list-style:decimal}.gl-prose li+li{margin-top:.375rem}.gl-prose li::marker{color:var(--muted-foreground)}.gl-prose :not(pre)>code{border:1px solid var(--border);border-radius:.375rem;background-color:var(--muted);padding:.0625rem .3rem;font-family:var(--font-mono);font-size:.875em}.gl-prose pre{overflow-x:auto;border-radius:.75rem;background-color:var(--navy);color:var(--navy-foreground);padding:1rem 1.125rem;font-family:var(--font-mono);font-size:.8125rem;line-height:1.65}.gl-prose a{color:var(--brand-text);text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1px}.gl-prose a:hover{text-decoration-thickness:2px}