/* CATMOS V3 — styles.css */
:root{
  --radius-lg:32px; --radius-md:20px; --radius-sm:12px;
  --ease:cubic-bezier(.22,.61,.36,1); --ease-spring:cubic-bezier(.34,1.56,.64,1);
  --sp-4:20px; --sp-6:48px; --sp-8:104px;
  --wind-speed:1;
}
*{box-sizing:border-box;}
html{scroll-behavior:smooth;}
html,body{margin:0;padding:0;}
body{
  min-height:100vh; font-family:'Inter',sans-serif; color:var(--text-primary);
  background:linear-gradient(160deg,var(--bg-1),var(--bg-2) 55%,var(--bg-3));
  transition:background 1100ms var(--ease), color 1100ms var(--ease);
  overflow-x:hidden; position:relative;
}
body.tod-morning{ --bg-1:#FDF6E9; --bg-2:#F6E7C9; --bg-3:#EAD7A8; --text-primary:#2B2013; --text-secondary:#7a6a4a; --surface:rgba(255,255,255,.5); --surface-2:rgba(255,255,255,.7); --surface-border:rgba(255,255,255,.75); --accent:#E8A94A; --accent-soft:rgba(232,169,74,.16); --ground:#d8b989; }
body.tod-day{ --bg-1:#F7F6F3; --bg-2:#E9EEF2; --bg-3:#DCE6EC; --text-primary:#12151C; --text-secondary:#5b6470; --surface:rgba(255,255,255,.55); --surface-2:rgba(255,255,255,.75); --surface-border:rgba(255,255,255,.85); --accent:#3E6E8E; --accent-soft:rgba(62,110,142,.13); --ground:#c9d3d8; }
body.tod-sunset{ --bg-1:#2C1B2E; --bg-2:#7A3B34; --bg-3:#E8A94A; --text-primary:#FBEEE0; --text-secondary:#e6c3a8; --surface:rgba(35,18,20,.34); --surface-2:rgba(50,26,26,.5); --surface-border:rgba(255,214,170,.26); --accent:#F2A65A; --accent-soft:rgba(242,166,90,.2); --ground:#4a2a2a; }
body.tod-night{ --bg-1:#05070C; --bg-2:#0B0E1A; --bg-3:#1B2740; --text-primary:#EDEFF5; --text-secondary:#8b93a8; --surface:rgba(22,26,40,.46); --surface-2:rgba(22,26,40,.66); --surface-border:rgba(255,255,255,.08); --accent:#8FB3D9; --accent-soft:rgba(143,179,217,.15); --ground:#141a29; }
body.cond-rain{ --accent:#4E8FB8; }
body.cond-snow{ --accent:#9FC7DB; }
body.cond-storm{ filter:saturate(.9); }

@media (prefers-reduced-motion: reduce){ *{animation-duration:.001ms !important; animation-iteration-count:1 !important; transition-duration:.001ms !important;} }

a{color:inherit;}
.wrap{max-width:980px;margin:0 auto;padding:0 24px 60px;position:relative;z-index:2;}

#sky{position:fixed;inset:0;z-index:0;width:100%;height:100%;pointer-events:none;}
.lightning-flash{position:fixed;inset:0;background:#eef3ff;opacity:0;pointer-events:none;z-index:1;}
.lightning-flash.flash{animation:flash 480ms ease-out;}
@keyframes flash{0%{opacity:0;}8%{opacity:.85;}16%{opacity:.1;}24%{opacity:.55;}100%{opacity:0;}}
.fog-veil{position:fixed;inset:0;z-index:1;pointer-events:none;opacity:0;background:radial-gradient(ellipse at 50% 30%,rgba(255,255,255,.35),transparent 70%);backdrop-filter:blur(2px);transition:opacity 1100ms var(--ease);}
body.cond-fog .fog-veil{opacity:1;}

header{ position:relative; z-index:3; display:flex;align-items:center;justify-content:space-between;gap:16px; padding:28px 24px 0; max-width:980px;margin:0 auto; }
.wordmark{font-family:'Fraunces',serif;font-weight:600;font-size:20px;letter-spacing:.06em;display:flex;align-items:baseline;gap:9px;}
.wordmark small{font-family:'Inter';font-size:9px;letter-spacing:.24em;color:var(--text-secondary);font-weight:600;}
.controls{display:flex;align-items:center;gap:8px;}
.glass-btn{ background:var(--surface);border:1px solid var(--surface-border);backdrop-filter:blur(20px);
  border-radius:999px;display:flex;align-items:center;gap:8px;cursor:pointer;color:var(--text-primary);
  transition:transform 260ms var(--ease-spring), border-color 260ms, box-shadow 260ms;}
.glass-btn:hover{transform:translateY(-2px);border-color:var(--accent);box-shadow:0 14px 30px -16px rgba(0,0,0,.35);}
.icon-btn{width:38px;height:38px;justify-content:center;}
#searchTrigger{padding:9px 16px 9px 14px;font-family:'IBM Plex Mono';font-size:12px;color:var(--text-secondary);}
#searchTrigger kbd{font-family:'IBM Plex Mono';font-size:10px;border:1px solid var(--surface-border);border-radius:5px;padding:1px 5px;margin-left:4px;}
.unit-toggle{background:var(--surface);border:1px solid var(--surface-border);backdrop-filter:blur(20px);border-radius:999px;padding:4px;display:flex;font-family:'IBM Plex Mono';font-size:11px;}
.unit-toggle button{background:none;border:none;color:var(--text-secondary);padding:6px 11px;border-radius:999px;cursor:pointer;font-family:inherit;transition:background 220ms, color 220ms;}
.unit-toggle button.active{background:var(--accent);color:#0b0e14;}

.hero{position:relative;z-index:2;min-height:88vh;display:flex;flex-direction:column;justify-content:center;max-width:980px;margin:0 auto;padding:40px 24px 0;}
.hero-grid{display:grid;grid-template-columns:1.15fr 0.85fr;gap:40px;align-items:center;}
@media (max-width:820px){.hero-grid{grid-template-columns:1fr;text-align:center;}}
.loc-row{display:flex;align-items:center;gap:8px;font-family:'IBM Plex Mono';font-size:13px;color:var(--text-secondary);}
@media (max-width:820px){.loc-row{justify-content:center;}}
.temp-row{display:flex;align-items:flex-start;gap:16px;margin-top:6px;}
@media (max-width:820px){.temp-row{justify-content:center;}}
.temp-big{font-family:'Fraunces',serif;font-weight:300;font-size:clamp(88px,14vw,168px);line-height:.86;letter-spacing:-.03em;}
.temp-unit{font-size:clamp(22px,3vw,36px);font-weight:300;opacity:.55;margin-top:.35em;}
.condition-text{font-family:'Fraunces',serif;font-size:clamp(20px,2.6vw,28px);font-style:italic;font-weight:500;margin-top:0;}
.sub-stats{display:flex;gap:26px;margin-top:14px;font-family:'IBM Plex Mono';font-size:13px;color:var(--text-secondary);flex-wrap:wrap;}
@media (max-width:820px){.sub-stats{justify-content:center;}}
.sub-stats b{color:var(--text-primary);font-weight:500;}
.insight-line{margin-top:22px;font-family:'Fraunces',serif;font-style:italic;font-size:15px;color:var(--text-secondary);max-width:440px;}
@media (max-width:820px){.insight-line{margin-left:auto;margin-right:auto;}}

.scene-outer{position:relative;display:flex;justify-content:center;}
.scene{ width:min(380px,80vw);height:min(380px,80vw);border-radius:50%;position:relative;overflow:hidden;
  display:grid;
  background:radial-gradient(circle at 30% 26%, color-mix(in srgb, var(--accent) 20%, var(--surface)), var(--surface));
  border:1px solid var(--surface-border);backdrop-filter:blur(26px);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.34),
    inset 0 -28px 54px rgba(0,0,0,.15),
    inset 0 0 0 1px rgba(255,255,255,.07),
    0 40px 80px -30px rgba(0,0,0,.32); }
/* .scene is always a perfect circle (width == height), so it doubles as the
   container-query reference for the caption's geometric sizing below. */
.scene{ container-type:size; }
.scene::before{content:"";position:absolute;bottom:10%;right:14%;width:26%;height:14%;border-radius:50%;background:radial-gradient(circle, rgba(255,255,255,.16), rgba(255,255,255,0) 75%);pointer-events:none;z-index:2;}
.scene::after{content:"";position:absolute;top:6%;left:10%;width:42%;height:24%;border-radius:50%;background:radial-gradient(circle, rgba(255,255,255,.4), rgba(255,255,255,0) 72%);filter:blur(2px);pointer-events:none;z-index:2;}
.scene svg{grid-area:1/1;width:100%;height:100%;position:relative;z-index:1;}
.scene-caption{
  grid-area:1/1;
  align-self:end;
  justify-self:center;
  margin:0;
  /* Optical, not just mathematical, centering: uppercase + letter-spacing adds
     trailing space after the last glyph but not before the first, which pulls
     text-align:center visibly right of true center. Pull back by exactly the
     letter-spacing value to compensate. */
  margin-inline-end:-0.09em;
  text-align:center;
  font-size:10px;
  line-height:1.5;
  letter-spacing:.09em;
  color:var(--text-secondary);
  font-family:'IBM Plex Mono';
  z-index:3;
  text-transform:uppercase;
  opacity:.85;
  overflow-wrap:break-word;
  text-wrap:balance;
  /* Fallback for browsers without CSS sqrt()/container query units — identical
     to the previously verified fixed-percentage version, so nothing regresses. */
  max-width:50%;
  padding:0 1ch 11%;
}
/* Geometric derivation: solve the circle's own chord equation in real CSS
   instead of guessing a percentage, so it stays correct if the orb's size
   (currently min(380px,80vw)) ever changes.
     R        = 50cqw                    orb radius, in container-relative units
     inset    = 11cqw                    how far up from the pole the caption sits
     chord(y) = 2 * sqrt(y * (2R - y))   the circle's true visible width at height y
   A 0.8 safety factor keeps the caption comfortably inside that chord — with
   breathing room — rather than touching the mask at its exact edge. */
@supports (container-type:size) and (width:calc(sqrt(1px))) {
  .scene-caption{
    --inset:11cqw;
    --chord:calc(2 * sqrt(var(--inset) * (100cqw - var(--inset))));
    max-width:calc(var(--chord) * 0.8);
    padding:0 1ch calc(var(--inset) + 2cqw);
  }
}

.scroll-cue{margin:36px auto 0;width:34px;height:34px;border-radius:50%;border:1px solid var(--surface-border);background:var(--surface);backdrop-filter:blur(16px);display:flex;align-items:center;justify-content:center;cursor:pointer;animation:bob 2.4s ease-in-out infinite;}
@keyframes bob{0%,100%{transform:translateY(0);}50%{transform:translateY(6px);}}

.fallback-banner{max-width:980px;margin:0 auto;padding:0 24px;}
.fallback-banner .inner{display:none;font-family:'IBM Plex Mono';font-size:12px;color:var(--text-secondary);background:var(--surface);border:1px solid var(--surface-border);backdrop-filter:blur(16px);border-radius:14px;padding:12px 18px;margin-top:10px;}
.fallback-banner.show .inner{display:block;}
.status-line{font-family:'IBM Plex Mono';font-size:11px;color:var(--text-secondary);text-align:center;margin-top:8px;min-height:16px;display:flex;align-items:center;justify-content:center;gap:8px;}

section{margin-top:var(--sp-8);position:relative;z-index:2;}
.section-head{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:var(--sp-4);}
.section-label{font-family:'IBM Plex Mono';font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--text-secondary);}
.section-sub{font-family:'IBM Plex Mono';font-size:10px;color:var(--text-secondary);opacity:.6;}
.reveal{opacity:0;transform:translateY(18px);transition:opacity 700ms var(--ease), transform 700ms var(--ease);}
.reveal.in-view{opacity:1;transform:translateY(0);}

.graph-card{position:relative;background:var(--surface);border:1px solid var(--surface-border);backdrop-filter:blur(22px);border-radius:var(--radius-lg);padding:26px 20px 12px;box-shadow:0 30px 60px -40px rgba(0,0,0,.4);}
#graphCanvas{width:100%;height:150px;display:block;}
.graph-tooltip{position:absolute;top:10px;transform:translateX(-50%);background:var(--surface-2);border:1px solid var(--surface-border);backdrop-filter:blur(20px);border-radius:10px;padding:6px 10px;font-family:'IBM Plex Mono';font-size:11px;display:flex;gap:8px;align-items:center;opacity:0;transition:opacity 200ms;pointer-events:none;white-space:nowrap;}
.graph-tooltip b{font-family:'Fraunces';font-size:14px;font-weight:600;}
.graph-tooltip span{color:var(--text-secondary);}
.hourly-strip{display:flex;gap:10px;overflow-x:auto;padding:18px 2px 4px;scrollbar-width:thin;}
.hour-card{flex:0 0 auto;min-width:64px;text-align:center;padding:6px;cursor:default;}
.hour-card .h-time{font-family:'IBM Plex Mono';font-size:10px;color:var(--text-secondary);}
.hour-card .h-icon{margin:8px 0;height:20px;display:flex;align-items:center;justify-content:center;}
.hour-card .h-temp{font-family:'Fraunces';font-size:16px;}
.hour-card .h-pop{font-family:'IBM Plex Mono';font-size:9px;color:var(--accent);margin-top:3px;}

.motion-grid{display:grid;grid-template-columns:220px 1fr;gap:24px;align-items:center;background:var(--surface);border:1px solid var(--surface-border);backdrop-filter:blur(22px);border-radius:var(--radius-lg);padding:24px;box-shadow:0 30px 60px -40px rgba(0,0,0,.4);}
@media (max-width:640px){.motion-grid{grid-template-columns:1fr;justify-items:center;text-align:center;}}
#radarCanvas{width:200px;height:200px;}
.motion-readout .m-row{display:flex;justify-content:space-between;font-family:'IBM Plex Mono';font-size:12px;padding:7px 0;border-bottom:1px solid var(--surface-border);gap:16px;}
.motion-readout .m-row:last-child{border-bottom:none;}
.motion-readout .m-row span:last-child{color:var(--accent);text-align:right;}

.env-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;}
@media (max-width:720px){.env-grid{grid-template-columns:repeat(2,1fr);}}
.env-card{background:var(--surface);border:1px solid var(--surface-border);backdrop-filter:blur(20px);border-radius:var(--radius-md);padding:18px 20px;transition:transform 280ms var(--ease-spring), border-color 280ms, box-shadow 280ms;position:relative;overflow:hidden;}
.env-card::before{content:"";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.5),transparent);opacity:.5;}
.env-card:hover{transform:translateY(-4px);border-color:var(--accent);box-shadow:0 20px 40px -24px rgba(0,0,0,.4);}
.env-card .e-label{font-family:'IBM Plex Mono';font-size:10px;letter-spacing:.09em;text-transform:uppercase;color:var(--text-secondary);}
.env-card .e-value{font-family:'Fraunces';font-size:26px;margin-top:8px;}
.env-card .e-value.e-glyph{font-size:24px;}
.env-card .e-value span{font-size:13px;opacity:.6;}
.env-card .e-sub{font-family:'IBM Plex Mono';font-size:11px;color:var(--text-secondary);margin-top:3px;}

.daily-list{display:flex;flex-direction:column;border-radius:var(--radius-lg);overflow:hidden;border:1px solid var(--surface-border);backdrop-filter:blur(20px);background:var(--surface);box-shadow:0 30px 60px -40px rgba(0,0,0,.35);}
.day-row{display:grid;grid-template-columns:96px 34px 1fr 54px;align-items:center;padding:15px 22px;border-bottom:1px solid var(--surface-border);gap:14px;transition:background 220ms;}
.day-row:hover{background:var(--accent-soft);}
.day-row:last-child{border-bottom:none;}
.day-row .d-name{font-family:'IBM Plex Mono';font-size:12px;}
.day-row .d-pop{font-family:'IBM Plex Mono';font-size:11px;color:var(--accent);text-align:right;}
.bar-track{height:4px;border-radius:2px;background:var(--accent-soft);position:relative;}
.bar-fill{position:absolute;top:0;bottom:0;border-radius:2px;background:var(--accent);}
.d-range{display:flex;align-items:center;gap:10px;font-family:'IBM Plex Mono';font-size:12px;}
@media (max-width:600px){.day-row{grid-template-columns:60px 28px 1fr;}.d-range span:last-child{display:none;}.d-pop{display:none;}}

/* ---------- search overlay ---------- */
.search-overlay{position:fixed;inset:0;z-index:20;display:flex;align-items:flex-start;justify-content:center;padding-top:12vh;background:rgba(5,7,12,.4);backdrop-filter:blur(6px);opacity:0;pointer-events:none;transition:opacity 320ms var(--ease);}
.search-overlay.open{opacity:1;pointer-events:auto;}
.search-panel{width:min(560px,90vw);max-height:76vh;overflow-y:auto;background:var(--surface-2);border:1px solid var(--surface-border);backdrop-filter:blur(30px);border-radius:24px;padding:22px;transform:translateY(-14px) scale(.98);opacity:0;transition:transform 340ms var(--ease-spring), opacity 320ms var(--ease);box-shadow:0 40px 90px -30px rgba(0,0,0,.5);}
.search-overlay.open .search-panel{transform:translateY(0) scale(1);opacity:1;}
.search-panel-head{display:flex;align-items:center;gap:10px;border-bottom:1px solid var(--surface-border);padding-bottom:14px;position:sticky;top:-22px;background:var(--surface-2);z-index:2;}
.search-panel-head input{flex:1;background:none;border:none;outline:none;font-family:'Fraunces';font-size:20px;color:var(--text-primary);}
.search-panel-head input::placeholder{color:var(--text-secondary);opacity:.6;}
.close-x{cursor:pointer;color:var(--text-secondary);width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:50%;transition:background 200ms;flex:0 0 auto;}
.close-x:hover{background:var(--accent-soft);}
.spinner{width:14px;height:14px;border-radius:50%;border:2px solid var(--surface-border);border-top-color:var(--accent);animation:spin .7s linear infinite;flex:0 0 auto;display:none;}
.spinner.show{display:block;}
@keyframes spin{to{transform:rotate(360deg);}}
#resultsList{margin-top:8px;}
.result-row{display:flex;align-items:center;gap:12px;padding:11px 8px;border-radius:10px;cursor:pointer;font-size:14px;transition:background 160ms;}
.result-row:hover,.result-row.active{background:var(--accent-soft);}
.result-icon{flex:0 0 auto;font-size:15px;width:22px;text-align:center;}
.result-text{flex:1;min-width:0;}
.result-name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.result-name mark{background:none;color:var(--accent);font-weight:600;}
.result-sub{font-family:'IBM Plex Mono';font-size:11px;color:var(--text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.result-empty,.result-error{font-family:'IBM Plex Mono';font-size:12px;color:var(--text-secondary);padding:14px 8px;}
.result-error{color:#d97b6b;}
.search-lists{display:flex;flex-direction:column;gap:14px;margin-top:16px;}
.search-lists .s-label{display:flex;justify-content:space-between;font-family:'IBM Plex Mono';font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--text-secondary);margin-bottom:8px;}
.chip-row{display:flex;flex-wrap:wrap;gap:8px;}
.chip{display:inline-flex;align-items:center;gap:6px;background:var(--surface);border:1px solid var(--surface-border);border-radius:999px;padding:7px 6px 7px 12px;font-family:'IBM Plex Mono';font-size:12px;cursor:pointer;color:var(--text-primary);transition:border-color 200ms;}
.chip:hover{border-color:var(--accent);}
.chip-star,.chip-del{color:var(--accent);font-size:13px;padding:3px 4px;border-radius:6px;line-height:1;}
.chip-del{color:var(--text-secondary);}
.chip-star:hover,.chip-del:hover{background:var(--accent-soft);}
.empty-hint{font-family:'IBM Plex Mono';font-size:11px;color:var(--text-secondary);opacity:.6;}
.use-location-btn{display:flex;align-items:center;gap:8px;width:100%;text-align:left;background:var(--surface);border:1px solid var(--surface-border);border-radius:12px;padding:11px 14px;font-family:'IBM Plex Mono';font-size:12px;cursor:pointer;color:var(--text-primary);margin-top:14px;transition:border-color 200ms;}
.use-location-btn:hover{border-color:var(--accent);}

footer{margin-top:var(--sp-8);padding:40px 24px 50px;text-align:center;position:relative;z-index:2;}
.footer-divider{width:56px;height:1px;background:var(--surface-border);margin:0 auto 22px;}
.footer-nimbus-line{font-family:'IBM Plex Mono';font-size:11px;color:var(--text-secondary);margin-bottom:22px;opacity:.85;}
.footer-brand{font-family:'Fraunces',serif;font-size:16px;letter-spacing:.05em;color:var(--text-secondary);}
.footer-tagline{font-family:'IBM Plex Mono';font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:var(--text-secondary);opacity:.7;margin-top:6px;}
.credit{margin-top:24px;display:inline-flex;flex-direction:column;align-items:center;gap:3px;padding:16px 30px;border-radius:18px;border:1px solid transparent;transition:border-color 440ms var(--ease), box-shadow 440ms var(--ease), transform 440ms var(--ease), background 440ms var(--ease);}
.credit:hover{border-color:var(--surface-border);background:var(--surface);backdrop-filter:blur(20px);transform:translateY(-3px);box-shadow:0 22px 46px -20px rgba(0,0,0,.4);}
.credit .c-eyebrow{font-family:'IBM Plex Mono';font-size:9px;letter-spacing:.18em;text-transform:uppercase;color:var(--text-secondary);opacity:.75;}
.credit .c-name{font-family:'Fraunces',serif;font-size:16px;font-weight:600;letter-spacing:.03em;position:relative;}
.credit .c-name::after{content:"";position:absolute;left:0;bottom:-3px;width:0%;height:1px;background:var(--accent);transition:width 440ms var(--ease);}
.credit:hover .c-name::after{width:100%;}
.credit .c-handle{font-family:'IBM Plex Mono';font-size:11px;color:var(--accent);opacity:.85;transition:opacity 440ms var(--ease);}
.credit:hover .c-handle{opacity:1;text-shadow:0 0 16px var(--accent-soft);}
.footer-copy{margin-top:22px;font-family:'IBM Plex Mono';font-size:10px;color:var(--text-secondary);opacity:.55;}

.nimbus [data-part]{transition:opacity 600ms var(--ease);}
.nimbus .tail{transform-origin:10px 150px;animation:tailsway 3.4s ease-in-out infinite;}
@keyframes tailsway{0%,100%{transform:rotate(-6deg);}50%{transform:rotate(10deg);}}
.nimbus .body-grp{animation:breathe 3.6s ease-in-out infinite;transform-origin:140px 160px;}
@keyframes breathe{0%,100%{transform:scaleY(1);}50%{transform:scaleY(1.016);}}
.nimbus .ear-l,.nimbus .ear-r{transform-origin:center;animation:eartwitch 5s ease-in-out infinite;}
@keyframes eartwitch{0%,92%,100%{transform:rotate(0deg);}94%{transform:rotate(-6deg);}96%{transform:rotate(4deg);}}
.nimbus .eye{animation:blink 5.5s infinite;transform-origin:center;}
@keyframes blink{0%,94%,100%{transform:scaleY(1);}96%{transform:scaleY(.1);}}
.nimbus[data-weather="storm"] .body-grp{animation:shiverstorm 260ms ease-in-out infinite;}
@keyframes shiverstorm{0%,100%{transform:translateX(0);}50%{transform:translateX(1.2px);}}

.nimbus.idle-anim[data-idle="blink-extra"] .eye{animation:blinkfast 350ms ease-in-out 2;}
@keyframes blinkfast{0%,100%{transform:scaleY(1);}50%{transform:scaleY(.1);}}
.nimbus.idle-anim[data-idle="look-around"] .body-grp,
.nimbus.idle-anim[data-idle="curious-look"] .body-grp{animation:lookaround 2s ease-in-out 1;}
@keyframes lookaround{0%,100%{transform:rotate(0deg);}30%{transform:rotate(-4deg);}70%{transform:rotate(4deg);}}
.nimbus.idle-anim[data-idle="tail-flick"] .tail{animation:tailflick 900ms ease-in-out 1;}
@keyframes tailflick{0%,100%{transform:rotate(-6deg);}50%{transform:rotate(24deg);}}
.nimbus.idle-anim[data-idle="ear-swivel"] .ear-l,
.nimbus.idle-anim[data-idle="ear-swivel"] .ear-r{animation:earswivel 1.1s ease-in-out 1;}
@keyframes earswivel{0%,100%{transform:rotate(0deg);}50%{transform:rotate(-14deg);}}
.nimbus.idle-anim[data-idle="yawn"] .body-grp,
.nimbus.idle-anim[data-idle="stretch-micro"] .body-grp,
.nimbus.idle-anim[data-idle="walk-a-little"] .body-grp{animation:stretchy 1.8s ease-in-out 1;}
@keyframes stretchy{0%,100%{transform:scale(1,1) translateX(0);}40%{transform:scale(1.06,0.94) translateX(-4px);}70%{transform:scale(1.06,0.94) translateX(4px);}}
.nimbus.idle-anim[data-idle="pounce-tease"] .body-grp{animation:pounce 1.4s ease-in-out 1;}
@keyframes pounce{0%,100%{transform:translateY(0);}35%{transform:translateY(-6px) scaleX(1.04);}55%{transform:translateY(2px);}}
.nimbus.idle-anim[data-idle="dream-twitch"] .ear-l,
.nimbus.idle-anim[data-idle="dream-twitch"] .tail{animation:dreamtwitch 1s ease-in-out 1;}
@keyframes dreamtwitch{0%,100%{transform:rotate(0deg);}50%{transform:rotate(6deg);}}
.nimbus.idle-anim[data-idle="curl-shift"] .body-grp{animation:curlshift 1.6s ease-in-out 1;}
@keyframes curlshift{0%,100%{transform:translateY(0);}50%{transform:translateY(2px) scale(.99);}}
.nimbus.idle-anim[data-idle="peek-out"] .body-grp{animation:peekout 1.4s ease-in-out 1;}
@keyframes peekout{0%,100%{transform:translateX(0);}50%{transform:translateX(-6px);}}
.nimbus.idle-anim[data-idle="shake-off"] .body-grp{animation:shakeoff 700ms ease-in-out 1;}
@keyframes shakeoff{0%,100%{transform:rotate(0deg);}25%{transform:rotate(-5deg);}50%{transform:rotate(5deg);}75%{transform:rotate(-3deg);}}
.nimbus.idle-anim[data-idle="paw-tap"] .body-grp{animation:pawtap 1.2s ease-in-out 1;}
@keyframes pawtap{0%,100%{transform:translateY(0);}50%{transform:translateY(-2px);}}

.ground-wrap{position:relative;height:70px;margin-top:-40px;overflow:hidden;z-index:1;}
.grass{position:absolute;bottom:0;width:100%;height:100%;}
.blade{transform-origin:bottom center;animation:sway calc(2.4s / var(--wind-speed)) ease-in-out infinite;}
@keyframes sway{0%,100%{transform:rotate(-4deg);}50%{transform:rotate(6deg);}}

.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;}
