/* Liquid Glass controls: CSS fallback plus cached SVG refraction. Game art stays original. */
html,body{margin:0;padding:0;background:transparent!important}
.gf-demo{
 --gf-text:#eef3e5;--gf-muted:#b6c1a8;--gf-accent:#c8df9e;
 --gf-glass:rgba(172,200,139,.025);--gf-edge:rgba(225,241,199,.54);
 --gf-edge-top:rgba(250,255,235,.96);--gf-edge-bottom:rgba(196,216,159,.4);
 --gf-light:rgba(240,252,217,.14);
 --gf-selected:rgba(184,210,145,.1);--gf-active:rgba(131,168,63,.16);
 --gf-play-fill:rgba(104,139,45,.44);--gf-play-text:#f5fbe9;
 --gf-shadow:rgba(0,0,0,.2);--gf-solid:#28301e;
 max-width:820px;margin:0 auto;padding:8px 20px 22px;box-sizing:border-box;background:transparent;
 color:var(--gf-text);font:14px/1.5 -apple-system,BlinkMacSystemFont,"SF Pro Text","PingFang SC","Segoe UI","Microsoft YaHei",sans-serif
}
html[data-theme=light] .gf-demo{
 --gf-text:#263723;--gf-muted:#4d6143;--gf-accent:#365d24;
 --gf-glass:rgba(129,156,109,.12);--gf-edge:rgba(76,106,55,.34);
 --gf-edge-top:rgba(115,142,95,.36);--gf-edge-bottom:rgba(65,96,45,.44);
 --gf-light:rgba(255,255,255,.6);
 --gf-selected:rgba(128,166,94,.3);--gf-active:rgba(116,157,72,.19);
 --gf-play-fill:#42621e;--gf-play-text:#ffffff;
 --gf-shadow:rgba(36,53,19,.1);--gf-solid:#edf3e4
}
.gf-demo *{box-sizing:border-box}
.gf-stage{height:185px;position:relative;display:flex;align-items:center;justify-content:center;isolation:isolate}
.gf-launcher{all:unset;display:block;width:min(100%,440px);height:200px;position:relative;cursor:pointer;border-radius:24px;-webkit-tap-highlight-color:transparent}
.gf-launcher:focus-visible{outline:2px solid var(--gf-accent);outline-offset:-20px}
#gf-canvas{width:100%;height:100%;display:block;object-fit:contain}
.gf-loading{position:absolute;inset:45% 0;text-align:center;font-size:13px;pointer-events:none}
.gf-controls{max-width:700px;margin:0 auto;display:flex;flex-direction:column;align-items:center}
/* One fine contour, like a clear lens: bright upper arc and a quieter lower edge.
   The SVG enhancement below adds a static, cached displacement map. */
.gf-states,.gf-effect{position:relative;isolation:isolate;overflow:hidden;border:1px solid var(--gf-edge);border-color:var(--gf-edge-top) var(--gf-edge) var(--gf-edge-bottom);background:linear-gradient(172deg,var(--gf-light),rgba(255,255,255,.008) 46%,rgba(225,245,190,.035)),var(--gf-glass);box-shadow:0 1px 1px rgba(0,0,0,.12),0 5px 14px -9px var(--gf-shadow)}
.gf-states{border-top-color:color-mix(in srgb,var(--gf-edge-top) 86%,transparent);background:linear-gradient(175deg,rgba(240,252,217,.065),rgba(255,255,255,.008) 65%),var(--gf-glass)}
.gf-states{width:100%;display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:4px;padding:5px;border-radius:999px}
.gf-controls button{position:relative;z-index:2;appearance:none;-webkit-appearance:none;border:0;font:inherit;cursor:pointer;-webkit-tap-highlight-color:transparent;transition:color .18s,background-color .18s,box-shadow .18s}
.gf-states button{min-height:42px;padding:9px 4px;border-radius:999px;color:var(--gf-muted);background:transparent;white-space:nowrap;font-size:13px}
.gf-states button{transition:color .28s ease,box-shadow .18s}
.gf-states button::before{content:"";position:absolute;inset:0;z-index:-1;border-radius:inherit;pointer-events:none;background:linear-gradient(180deg,rgba(235,249,210,.1),rgba(235,249,210,.025));opacity:0;transition:opacity .3s ease}
@media(hover:hover){.gf-states button:hover{color:var(--gf-text)}.gf-states button:hover::before{opacity:1}}
.gf-states button:focus-visible::before{opacity:1}
.gf-states button[aria-pressed=true]{color:var(--gf-text);font-weight:600}
.gf-selection{position:absolute;z-index:1;left:0;top:0;pointer-events:none;border-radius:999px;border:1px solid var(--gf-edge);border-top-color:var(--gf-edge-top);border-bottom-color:var(--gf-edge-bottom);background:linear-gradient(172deg,rgba(255,255,255,.13),transparent 68%),var(--gf-selected);box-shadow:0 1px 3px rgba(0,0,0,.08);transform:translate(var(--pill-x,0),var(--pill-y,0));width:var(--pill-w,0);height:var(--pill-h,0);visibility:hidden}
.gf-states[data-ready] .gf-selection{visibility:visible;transition:transform .44s cubic-bezier(.22,1,.36,1),width .44s cubic-bezier(.22,1,.36,1),height .44s cubic-bezier(.22,1,.36,1)}
.gf-effects{width:min(100%,640px);display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin-top:22px}
.gf-controls .gf-effect{display:flex;align-items:center;justify-content:center;gap:8px;min-height:46px;padding:11px 10px;border:1px solid var(--gf-edge);border-color:var(--gf-edge-top) var(--gf-edge) var(--gf-edge-bottom);border-radius:999px;color:var(--gf-text);text-align:center}
.gf-effect svg{position:relative;z-index:1;width:20px;height:20px;flex:none;overflow:visible;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;transform-origin:center;transform-box:fill-box}
.gf-effect-copy{position:relative;z-index:1;display:flex;min-width:0}
.gf-effect svg g,.gf-icon-dot,.gf-icon-check-ring{transform-origin:center;transform-box:fill-box}
.gf-icon-check{stroke-dasharray:1;stroke-dashoffset:0}
.gf-ripple{position:absolute;z-index:0;pointer-events:none;border-radius:50%;opacity:0;border:1px solid rgba(227,249,184,.4);background:radial-gradient(circle,rgba(248,255,225,.035) 38%,rgba(226,247,182,.2) 66%,rgba(255,255,243,.025) 72%);transform:scale(.04)}
.gf-effect-title{font-size:13px;font-weight:500;white-space:nowrap;letter-spacing:.01em}
.gf-effect-detail{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
.gf-controls .gf-effect:hover{background-color:rgba(203,227,167,.075)}
.gf-effect[data-effect=autoplay] svg{color:var(--gf-accent)}
.gf-controls .gf-effect[data-active=true]{color:var(--gf-accent);border-color:rgba(248,255,229,1) rgba(202,226,153,.72) rgba(167,195,109,.48);background-color:var(--gf-active)}
.gf-controls .gf-effect[aria-pressed=true]{color:var(--gf-play-text);border-color:rgba(248,255,229,1) rgba(211,232,167,.76) rgba(167,195,109,.5);background-color:var(--gf-play-fill)}
/* Light backgrounds need a green contour and a visible selected tint; white
   highlights stay inside the glass instead of disappearing into the page. */
html[data-theme=light] .gf-states{background:linear-gradient(175deg,rgba(255,255,255,.48),transparent 65%),var(--gf-glass)}
html[data-theme=light] .gf-states button::before{background:linear-gradient(180deg,rgba(102,143,69,.14),rgba(102,143,69,.07))}
html[data-theme=light] .gf-states button[aria-pressed=true]{color:#24401d}
html[data-theme=light] .gf-selection{border-color:rgba(74,109,45,.44);background:linear-gradient(172deg,rgba(255,255,255,.3),transparent 68%),var(--gf-selected)}
html[data-theme=light] .gf-controls .gf-effect:hover{background-color:rgba(116,157,72,.16)}
html[data-theme=light] .gf-controls .gf-effect[data-active=true]{border-color:rgba(78,117,44,.6);background-color:var(--gf-active);background-image:linear-gradient(172deg,rgba(255,255,255,.22),transparent 60%)}
html[data-theme=light] .gf-controls .gf-effect[aria-pressed=true]{border-color:rgba(48,77,24,.64);background-color:var(--gf-play-fill);background-image:linear-gradient(172deg,rgba(245,255,225,.08),transparent 60%)}
html[data-theme=light] .gf-ripple{border-color:rgba(70,108,35,.32);background:radial-gradient(circle,rgba(104,144,64,.025) 38%,rgba(104,144,64,.18) 66%,rgba(104,144,64,.02) 72%)}
html[data-theme=light] .gf-effect[aria-pressed=true] .gf-ripple{border-color:rgba(233,251,205,.4);background:radial-gradient(circle,rgba(248,255,225,.035) 38%,rgba(226,247,182,.2) 66%,rgba(255,255,243,.025) 72%)}
.gf-effect[aria-pressed=true] svg{color:inherit}
.gf-player-icon .gf-autoplay-play,.gf-player-icon .gf-autoplay-pause{transform-box:view-box;transform-origin:12px 12px;transition:opacity .16s ease,transform .24s cubic-bezier(.22,1,.36,1)}
.gf-autoplay-play{opacity:1;transform:scale(1)}
.gf-autoplay-pause{opacity:0;transform:scale(.72)}
.gf-effect[aria-pressed=true] .gf-autoplay-play{opacity:0;transform:scale(.72)}
.gf-effect[aria-pressed=true] .gf-autoplay-pause{opacity:1;transform:scale(1)}
.gf-controls button:active{box-shadow:inset 0 1px 5px rgba(0,0,0,.14)}
.gf-controls button:focus-visible{outline:2px solid var(--gf-accent);outline-offset:1px}
.gf-description{order:3;display:flex;align-items:center;justify-content:center;gap:7px;min-height:18px;margin:16px 0 0;font-size:11px;color:var(--gf-muted);text-align:center}
.gf-status-dot{width:4px;height:4px;flex:none;border-radius:50%;background:var(--gf-accent);opacity:.8}
.gf-demo.gf-compact{padding:0;max-width:none}
.gf-compact .gf-stage{height:100vh}
.gf-compact .gf-controls{display:none}
@media(max-width:640px){.gf-demo{padding:8px 10px 20px}.gf-stage{height:165px}.gf-launcher{height:170px}.gf-states{grid-template-columns:repeat(3,minmax(0,1fr));border-radius:26px}.gf-states button{min-height:39px;font-size:12px}.gf-effects{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-top:18px}.gf-controls .gf-effect{min-height:44px;border-radius:999px}.gf-effect-title{font-size:12px}.gf-description{font-size:10px;margin-top:14px}}
@media(prefers-reduced-motion:reduce){.gf-controls button,.gf-states button::before,.gf-states[data-ready] .gf-selection{transition:none}.gf-ripple{display:none}}
@media(prefers-reduced-transparency:reduce),(prefers-contrast:more){.gf-states,.gf-effect{background:var(--gf-solid);-webkit-backdrop-filter:none;backdrop-filter:none}.gf-description,.gf-states button{color:var(--gf-text)}}

/* shuding/liquid-glass: refract the backdrop only, leaving labels/icons sharp.
   Hover animates only displacement strength; texture and filter IDs stay fixed. */
.gf-glass-defs{position:absolute;width:0;height:0;overflow:hidden;pointer-events:none}
.gf-states[data-glass=svg],.gf-controls .gf-effect[data-glass=svg]{
 -webkit-backdrop-filter:var(--gf-refraction) blur(.25px) saturate(1.12);
 backdrop-filter:var(--gf-refraction) blur(.25px) saturate(1.12);
 box-shadow:inset 0 1px 0 rgba(251,255,235,.22),inset 0 -1px 1px rgba(25,43,14,.1),0 2px 4px rgba(0,0,0,.1),0 8px 20px -13px var(--gf-shadow)
}
/* Hover rhythm inspired by https://codesandbox.io/p/sandbox/nn5q2y.
   Independent scale composes with the finite WAAPI click transform. Layout and
   displacement texture dimensions stay fixed throughout the spring. */
.gf-controls .gf-effect{scale:1;translate:0;transition:scale .4s cubic-bezier(.175,.885,.32,2.2),translate .4s cubic-bezier(.175,.885,.32,2.2),color .18s,background-color .18s,box-shadow .3s}
.gf-effect::before{content:"";position:absolute;inset:0;z-index:0;pointer-events:none;border-radius:inherit;background:linear-gradient(155deg,rgba(250,255,232,.16),rgba(250,255,232,.015) 48%,rgba(233,248,210,.05));opacity:0;transition:opacity .3s ease}
.gf-effect svg{scale:1;transition:scale .4s cubic-bezier(.175,.885,.32,2.2)}
html[data-theme=light] .gf-effect::before{background:linear-gradient(155deg,rgba(255,255,255,.28),transparent 55%)}
html[data-theme=light] .gf-effect[aria-pressed=true]::before{background:linear-gradient(155deg,rgba(247,255,226,.08),transparent 55%)}
@media(hover:hover) and (pointer:fine){
 .gf-controls .gf-effect:hover{scale:1.035 1.085;translate:0 -1px;z-index:3}
 .gf-effect:hover::before{opacity:1}
 .gf-effect:hover svg{scale:.95}
}
.gf-effect:focus-visible::before{opacity:1}
@media(prefers-reduced-motion:reduce){
 .gf-controls .gf-effect,.gf-effect svg,.gf-effect::before{transition:none}
 .gf-controls .gf-effect:hover,.gf-effect:hover svg{scale:1;translate:0}
}
@media(prefers-reduced-transparency:reduce),(prefers-contrast:more){
 .gf-states[data-glass=svg],.gf-controls .gf-effect[data-glass=svg]{-webkit-backdrop-filter:none;backdrop-filter:none}
}

/* Refined glass rim: one 1px optical edge, directional light and a soft shadow.
   The mask is static; hover never swaps layers, filters or textures. */
.gf-demo{
 --gf-rim-top:rgba(246,253,231,.64);--gf-rim-side:rgba(215,234,188,.17);--gf-rim-bottom:rgba(222,239,198,.32);
 --gf-rim-shadow:0 2px 5px rgba(0,0,0,.12),0 8px 16px -10px rgba(0,0,0,.28);
 --gf-selection-shine:rgba(245,255,226,.2)
}
html[data-theme=light] .gf-demo{
 --gf-rim-top:rgba(255,255,255,.98);--gf-rim-side:rgba(85,113,64,.18);--gf-rim-bottom:rgba(65,93,44,.28);
 --gf-rim-shadow:0 2px 4px rgba(35,53,24,.08),0 8px 16px -11px rgba(35,53,24,.2);
 --gf-selection-shine:rgba(255,255,255,.68)
}
.gf-states,.gf-states[data-glass=svg],.gf-controls .gf-effect,.gf-controls .gf-effect[data-glass=svg],.gf-controls .gf-effect[data-active=true],.gf-controls .gf-effect[aria-pressed=true],html[data-theme=light] .gf-controls .gf-effect[data-active=true],html[data-theme=light] .gf-controls .gf-effect[aria-pressed=true]{
 border-color:transparent;box-shadow:var(--gf-rim-shadow)
}
.gf-states::after,.gf-effect::after{
 content:"";position:absolute;inset:0;z-index:2;pointer-events:none;border-radius:inherit;padding:1px;
 background:linear-gradient(145deg,var(--gf-rim-top),var(--gf-rim-side) 34%,var(--gf-rim-side) 66%,var(--gf-rim-bottom));
 -webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);
 -webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude
}
.gf-states::after{opacity:.68}
.gf-effect svg,.gf-effect-copy{z-index:3}
.gf-selection{border-color:transparent;box-shadow:inset 0 1px 0 var(--gf-selection-shine),0 1px 3px rgba(0,0,0,.06)}
html[data-theme=light] .gf-selection{border-color:transparent}
@media(prefers-reduced-motion:reduce){.gf-player-icon .gf-autoplay-play,.gf-player-icon .gf-autoplay-pause{transition:none}}

/* Expansion logo card wall. Two identical sets per column share an exact
   756px stride (6 * (112px + 14px)). Only transforms animate; no filter churn. ResizeObserver fits the rotated
   plane to the full iframe, independently of the centered control width. */
.gf-demo{position:relative;isolation:isolate;max-width:none;width:100%;--gf-card-fill:rgba(17,27,20,.64);--gf-card-edge:rgba(214,232,195,.12);--gf-wall-opacity:.54}
html[data-theme=light] .gf-demo{--gf-card-fill:rgba(234,239,225,.55);--gf-card-edge:rgba(69,92,52,.15);--gf-wall-opacity:.3}
.gf-ambience{position:absolute;inset:0;min-height:100vh;z-index:0;overflow:hidden;pointer-events:none;border-radius:24px;
 -webkit-mask-image:linear-gradient(90deg,rgba(0,0,0,.45),#000 7%,#000 93%,rgba(0,0,0,.45)),linear-gradient(180deg,rgba(0,0,0,.45),#000 12%,#000 88%,rgba(0,0,0,.45));
 -webkit-mask-composite:source-in;mask-image:linear-gradient(90deg,rgba(0,0,0,.45),#000 7%,#000 93%,rgba(0,0,0,.45)),linear-gradient(180deg,rgba(0,0,0,.45),#000 12%,#000 88%,rgba(0,0,0,.45));mask-composite:intersect
}
.gf-card-wall{position:absolute;left:50%;top:50%;width:1246px;height:620px;display:grid;grid-template-columns:repeat(7,166px);gap:14px;transform:translate(-50%,-50%) rotate(-12deg) scale(var(--gf-wall-scale,1));opacity:var(--gf-wall-opacity)}
.gf-card-column{min-width:0;height:1512px;animation:gf-card-drift var(--gf-scroll-duration,90s) linear infinite;animation-delay:var(--gf-scroll-delay,0s);will-change:transform}
.gf-card-column:nth-child(even){animation-direction:reverse}
.gf-card-set{display:grid;grid-template-rows:repeat(6,112px);gap:14px;padding-bottom:14px;height:756px}
.gf-expansion-card{display:flex;align-items:center;justify-content:center;width:166px;height:112px;padding:14px;border-radius:14px;border:1px solid var(--gf-card-edge);background:radial-gradient(ellipse at 50% 38%,rgb(var(--gf-card-tint)/.17),transparent 85%),var(--gf-card-fill);box-shadow:inset 0 1px 0 rgba(255,255,255,.025),0 4px 12px rgba(0,0,0,.06)}
.gf-expansion-card img{display:block;width:144px;height:90px;max-width:none;flex:none;object-fit:contain;opacity:.85;user-select:none}
.gf-stage,.gf-controls{position:relative;z-index:1}
.gf-demo[data-background=off] .gf-ambience,.gf-compact .gf-ambience{display:none}
@keyframes gf-card-drift{from{transform:translate3d(0,0,0)}to{transform:translate3d(0,-756px,0)}}
@media(prefers-reduced-motion:reduce){.gf-card-column{animation:none;will-change:auto}.gf-card-column:nth-child(even){transform:translateY(-126px)}}
