/* Loading characters. Resting pose is the static drawing; motion only under prefers-reduced-motion: no-preference. */
.tl{display:grid;justify-items:center;gap:14px;text-align:center;color:var(--ink)}
.tl-art{width:150px;height:122px;display:block;overflow:visible}
.tl-boot .tl-art{width:196px;height:159px}
.tl-text{margin:0;font:700 15px/1.4 Jakarta,system-ui,sans-serif;color:var(--subtle);word-spacing:.12em}
.tl-dots{display:inline-flex;gap:4px;margin-left:6px;vertical-align:middle}.tl-dots i{width:5px;height:5px;border-radius:50%;background:var(--brand);display:block}
.tl .ln{fill:none;stroke:currentColor;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round}.tl .ln.thin{stroke-width:2.4}
.tl .body{fill:var(--brand);fill-opacity:.5;stroke:currentColor;stroke-width:3.5;stroke-linejoin:round}
.tl .leg,.tl .paw{fill:var(--brand);fill-opacity:.7;stroke:currentColor;stroke-width:3}
.tl .fl{fill:var(--lime);stroke:currentColor;stroke-width:3}
.tl .eye{fill:currentColor}.tl .lamp,.tl .ant{fill:var(--lime)}.tl .nose{fill:var(--lime);stroke:currentColor;stroke-width:2;stroke-linejoin:round}
.tl .lap{fill:color-mix(in srgb,var(--ink) 8%,transparent);stroke:currentColor;stroke-width:3}.tl .tear{fill:#8fd3ff;stroke:none}.tl .sh{fill:currentColor;opacity:.14}
.tl text{font:800 18px Jakarta,system-ui,sans-serif;fill:var(--brand)}
.tl-error .ant.spark{fill:#ffd24c}
.tl .tl-arm-r,.tl .tl-arm-l,.tl .tl-head,.tl .tl-beak,.tl .tl-wing,.tl .tl-leg,.tl .tl-breath,.tl .eye,.tl .ant,.tl .tl-bob,.tl .tl-run{transform-box:fill-box}
@media (prefers-reduced-motion:no-preference){
 .tl-bob{animation:tl-bob 1.7s ease-in-out infinite}.tl-bob.slow{animation-duration:2.4s}
 @keyframes tl-bob{0%,100%{transform:translateY(0)}50%{transform:translateY(-5px)}}
 .tl .eye{transform-origin:center;animation:tl-blink 4.2s infinite}@keyframes tl-blink{0%,93%,100%{transform:scaleY(1)}96%{transform:scaleY(.1)}}
 .tl-boot .tl-arm-r{transform-origin:0% 100%;animation:tl-wave .9s ease-in-out infinite}@keyframes tl-wave{0%,100%{transform:rotate(-8deg)}50%{transform:rotate(28deg)}}
 .tl .ant{transform-origin:center;animation:tl-glow 1.4s ease-in-out infinite}@keyframes tl-glow{0%,100%{transform:scale(1)}50%{transform:scale(1.35)}}
 .tl-head{transform-origin:50% 100%;animation:tl-nod 3s ease-in-out infinite}@keyframes tl-nod{0%,100%{transform:rotate(-2deg)}50%{transform:rotate(2deg)}}
 .tl-work .tl-tail{transform-box:view-box;transform-origin:106px 100px;animation:tl-tail 1.8s ease-in-out infinite}@keyframes tl-tail{0%,100%{transform:rotate(-8deg)}50%{transform:rotate(10deg)}}
 .tl-work .paw.p1{animation:tl-tap .5s ease-in-out infinite}.tl-work .paw.p2{animation:tl-tap .5s ease-in-out -.25s infinite}@keyframes tl-tap{0%,100%{transform:translateY(0)}50%{transform:translateY(-4px)}}
 .tl-work .keys{stroke-dasharray:3 6;animation:tl-keys .6s linear infinite}@keyframes tl-keys{to{stroke-dashoffset:-9}}
 .tl-voice .tl-wing{transform-origin:100% 100%;animation:tl-flap .45s ease-in-out infinite}@keyframes tl-flap{0%,100%{transform:rotate(0)}50%{transform:rotate(-28deg)}}
 .tl-voice .tl-beak{transform-origin:0% 50%;animation:tl-sing .6s ease-in-out infinite}@keyframes tl-sing{0%,100%{transform:scaleY(.7)}50%{transform:scaleY(1.2)}}
 .tl-note{opacity:0;animation:tl-note 2.4s ease-out infinite}.tl-note.n2{animation-delay:.8s}.tl-note.n3{animation-delay:1.6s}
 @keyframes tl-note{0%{opacity:0;transform:translate(-6px,10px)}20%{opacity:1}100%{opacity:0;transform:translate(8px,-14px)}}
 .tl-render .tl-run{animation:tl-hop .36s ease-in-out infinite}@keyframes tl-hop{0%,100%{transform:translateY(0)}50%{transform:translateY(-4px)}}
 .tl-render .tl-leg{transform-origin:50% 0%;animation:tl-step .36s ease-in-out infinite}.tl-render .tl-leg.r{animation-delay:-.18s}@keyframes tl-step{0%,100%{transform:rotate(26deg)}50%{transform:rotate(-26deg)}}
 .tl-render .tl-arm-l,.tl-render .tl-arm-r{transform-origin:50% 0%;animation:tl-step .36s ease-in-out infinite}.tl-render .tl-arm-r{animation-delay:-.18s}
 .tl-render .floor{stroke-dasharray:10 12;animation:tl-floor .5s linear infinite}@keyframes tl-floor{to{stroke-dashoffset:22}}
 .tl-render .speed{animation:tl-speed .5s linear infinite}@keyframes tl-speed{0%{transform:translateX(8px);opacity:0}30%{opacity:.8}100%{transform:translateX(-10px);opacity:0}}
 .tl-error .tl-head{transform-origin:50% 100%;animation:tl-sad 3s ease-in-out infinite}@keyframes tl-sad{0%,100%{transform:rotate(-7deg)}50%{transform:rotate(-3deg)}}
 .tl-error .tear{animation:tl-tear 2s ease-in infinite}@keyframes tl-tear{0%{transform:translateY(0);opacity:0}15%{opacity:1}100%{transform:translateY(34px);opacity:0}}
 .tl-error .ant.spark{animation:tl-spark .5s steps(2) infinite}@keyframes tl-spark{0%{opacity:1}50%{opacity:.2}}
 .tl-empty .tl-breath{transform-origin:50% 100%;animation:tl-breath 3.2s ease-in-out infinite}@keyframes tl-breath{0%,100%{transform:scale(1,1)}50%{transform:scale(1.02,1.05)}}
 .tl-z{opacity:0;animation:tl-z 3.2s ease-out infinite}.tl-z.z2{animation-delay:1s}.tl-z.z3{animation-delay:2s}@keyframes tl-z{0%{opacity:0;transform:translate(0,8px)}30%{opacity:1}100%{opacity:0;transform:translate(8px,-10px)}}
 .tl-dots i{animation:tl-dot 1.2s ease-in-out infinite}.tl-dots i:nth-child(2){animation-delay:.15s}.tl-dots i:nth-child(3){animation-delay:.3s}@keyframes tl-dot{0%,80%,100%{transform:translateY(0);opacity:.4}40%{transform:translateY(-4px);opacity:1}}
}
@media (prefers-reduced-motion:reduce){.tl-note,.tl-z{opacity:.9}.tl-note.n2,.tl-note.n3,.tl-z.z2,.tl-z.z3{opacity:.6}.tl-render .speed{opacity:.7}}
.boot{display:grid;place-items:center;min-height:100vh;min-height:100dvh}
.u-load{display:grid;place-items:center;min-height:50vh;padding:40px 0}
