/* US PET Foundation V1 — one small companion on safe UI rims.
   Autonomous motion stays CSS-driven; Maudit Gravity V1 uses a short JS timer
   only while the user has just released the cat and it is physically falling. */
.us-pet-layer{position:fixed;z-index:var(--us-layer-ambient);left:50%;bottom:calc(max(8px,var(--us-safe-bottom)) + var(--us-pet-nav-h,68px) - 3px);width:var(--us-pet-track,min(456px,calc(100% - 18px)));height:40px;transform:translateX(-50%);pointer-events:none;contain:layout style size;transition:opacity 220ms var(--us-ease-standard),visibility 0s linear 0s}
.us-pet-layer[hidden]{display:none!important}
.us-pet-layer,.us-pet-layer *{pointer-events:none!important;user-select:none;-webkit-user-select:none}
.us-pet-actor{position:absolute;left:14px;bottom:0;width:40px;height:40px;transform:translate3d(calc(var(--us-pet-x,6px) + var(--us-pet-dx,0px)),var(--us-pet-dy,0px),0);transition:transform var(--us-pet-move,0ms) linear;will-change:transform}
/* Maudit V1 — the layer above stays pointer-transparent. Only this bounded
   target on the cat itself takes a touch; it moves with the actor and it is
   gone whenever Maudit is (hidden layer, visibility:hidden, inert, Off). Its
   bottom stays clear of the nav so a tab never loses its tap. */
.us-pet-layer .us-pet-hit{position:absolute;left:14px;bottom:4px;width:40px;height:34px;transform:translate3d(calc(var(--us-pet-x,6px) + var(--us-pet-dx,0px)),var(--us-pet-dy,0px),0);transition:transform var(--us-pet-move,0ms) linear;pointer-events:auto!important;touch-action:pan-y;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;cursor:grab}
/* On a card plane the layer is a short segment of that card's rim, placed in
   document coordinates so it scrolls with the card; off the safe band it hides. */
.us-pet-layer[data-pet-plane]:not([data-pet-plane="nav"]){position:absolute;left:var(--us-pet-plane-left);top:var(--us-pet-plane-top);bottom:auto;width:var(--us-pet-plane-w);transform:none}
.us-pet-layer[data-pet-offstage]{opacity:0;visibility:hidden;transition:opacity 120ms var(--us-ease-standard),visibility 0s linear 120ms}
.us-pet-layer[data-pet-state="held"] .us-pet-actor,.us-pet-layer[data-pet-state="held"] .us-pet-hit{transition:transform 70ms cubic-bezier(.2,.7,.3,1);cursor:grabbing}
.us-pet-layer[data-pet-state="fall"] .us-pet-actor,.us-pet-layer[data-pet-state="fall"] .us-pet-hit{transition:none!important}
.us-pet-layer[data-pet-state="fall"] .us-pet-hit{pointer-events:none!important}
.us-pet-layer[data-pet-state="snap"] .us-pet-actor,.us-pet-layer[data-pet-state="snap"] .us-pet-hit{transition:transform 120ms cubic-bezier(.3,.6,.35,1)}
.us-pet-layer[data-pet-flip] .us-pet-actor,.us-pet-layer[data-pet-flip] .us-pet-hit{transition:none!important}
.us-pet-layer[data-pet-arrive] .us-pet-actor{animation:us-pet-arrive 240ms var(--us-ease-standard) both}
/* Each renderer owns one host inside the actor, so replacing a renderer is atomic. */
.us-pet-renderer{position:absolute;inset:0;display:block}
.us-pet-figure{position:absolute;inset:0;transform-origin:50% 100%;transition:transform 160ms var(--us-ease-standard)}
.us-pet-layer[data-pet-facing="left"] .us-pet-figure{transform:scaleX(-1)}
.us-pet-shadow{position:absolute;left:9px;right:9px;bottom:-1px;height:5px;border-radius:50%;background:radial-gradient(closest-side,rgba(0,0,0,.45),transparent);transform-origin:50% 50%}

/* Notices and the Ti penso arrival sit below this pointer-transparent layer.
   Exclusive shell states still own the screen and make the PET step aside;
   the list mirrors blockers() in pet.js. */
/* Two rules on purpose: a browser without :has() must still honour the first. */
body.us-keyboard-open .us-pet-layer,
.us-pet-layer[inert],
body[data-us-surface="open"] .us-pet-layer{opacity:0;visibility:hidden;transition:opacity 160ms var(--us-ease-standard),visibility 0s linear 160ms}
body:has(#homeHero.us-oggi-focus) .us-pet-layer,
body:has(.auth-overlay:not(.hidden)) .us-pet-layer{opacity:0;visibility:hidden;transition:opacity 160ms var(--us-ease-standard),visibility 0s linear 160ms}

/* ---------- PREVIEW renderer: "kitten preview v0" (not the final asset) ----------
   Follows the approved concept in docs/missions/us-pet-asset-spec-v1.md: small
   white/gray kitten, blue eyes. Poses are static transforms per state (they
   survive reduced motion); loops are short and paused in background. Part
   names (k-tail, k-leg-*, k-body, k-head, k-ear-*, k-eyes-*) match the final
   asset naming so the same poses can drive the approved SVG. */
.us-pet-kitten{position:absolute;inset:0;width:100%;height:100%;overflow:visible;filter:drop-shadow(0 1px 1.5px rgba(0,0,0,.35))}
.us-pet-kitten g{transform-box:fill-box;transition:transform 220ms var(--us-ease-standard),opacity 160ms var(--us-ease-standard)}
.us-pet-kitten .k-tail{transform-origin:100% 100%}
.us-pet-kitten .k-leg{transform-origin:50% 0}
.us-pet-kitten .k-body{transform-origin:50% 100%}
.us-pet-kitten .k-head{transform-origin:35% 95%}
.us-pet-kitten .k-ear{transform-origin:50% 100%}
.us-pet-kitten .k-eyes-open{transform-origin:50% 50%}
.us-pet-kitten .k-eyes-closed{opacity:0}
.us-pet-kitten .k-collar{display:none}
.us-pet-layer[data-pet-accessory="collar"] .us-pet-kitten .k-collar{display:inline}

/* idle — sits tall, breathes, tail sways, blinks now and then. */
.us-pet-layer[data-pet-state="idle"] .k-body{animation:us-kitten-breathe 3.2s ease-in-out infinite}
.us-pet-layer[data-pet-state="idle"] .k-tail{animation:us-kitten-sway 3.8s ease-in-out infinite alternate}
.us-pet-layer[data-pet-state="idle"] .k-eyes-open{animation:us-kitten-blink 5.4s ease-in-out infinite}
/* walk — diagonal leg pairs, tail carried high, a soft head bob. */
.us-pet-layer[data-pet-state="walk"] .k-tail{transform:rotate(16deg)}
.us-pet-layer[data-pet-state="walk"] .k-leg-front-near,.us-pet-layer[data-pet-state="walk"] .k-leg-hind-far{animation:us-kitten-stride .42s ease-in-out infinite alternate}
.us-pet-layer[data-pet-state="walk"] .k-leg-front-far,.us-pet-layer[data-pet-state="walk"] .k-leg-hind-near{animation:us-kitten-stride .42s ease-in-out infinite alternate-reverse}
.us-pet-layer[data-pet-state="walk"] .k-head{animation:us-kitten-bob .42s ease-in-out infinite alternate}
/* rest — a loaf: legs tucked, head lowered, eyes closed, tail laid down, slow breath. */
.us-pet-layer[data-pet-state="rest"] .k-leg{opacity:0}
.us-pet-layer[data-pet-state="rest"] .k-body{transform:translateY(3.4px) scale(1.06,.9);animation:us-kitten-sleep 4.6s ease-in-out infinite}
.us-pet-layer[data-pet-state="rest"] .k-head{transform:translate(-1px,5px) rotate(-6deg)}
.us-pet-layer[data-pet-state="rest"] .k-ear{transform:rotate(-8deg) scale(.94)}
.us-pet-layer[data-pet-state="rest"] .k-tail{transform:translate(3px,4px) rotate(-74deg) scale(.72)}
.us-pet-layer[data-pet-state="rest"] .k-eyes-open{opacity:0}
.us-pet-layer[data-pet-state="rest"] .k-eyes-closed{opacity:1}
/* react — ears perk, eyes open a touch wider, tail straight up, one small hop. */
.us-pet-layer[data-pet-state="react"] .us-pet-figure>*{animation:us-pet-hop .8s cubic-bezier(.3,.7,.3,1) 2}
.us-pet-layer[data-pet-state="react"] .us-pet-shadow{animation:us-pet-shadow .8s cubic-bezier(.3,.7,.3,1) 2}
.us-pet-layer[data-pet-state="react"] .k-ear{transform:scale(1.14)}
.us-pet-layer[data-pet-state="react"] .k-eyes-open{transform:scale(1.1)}
.us-pet-layer[data-pet-state="react"] .k-tail{transform:rotate(34deg);animation:us-kitten-quiver .18s ease-in-out 4 alternate}
/* pet — a stroke: head lifts into the hand, ears ease back, eyes soften shut,
   the body settles and the tail answers once. No text, no hop, no heart. */
.us-pet-layer[data-pet-state="pet"] .k-head{transform:rotate(-9deg) translateY(-.3px)}
.us-pet-layer[data-pet-state="pet"] .k-ear{transform:rotate(-12deg) scale(.94)}
.us-pet-layer[data-pet-state="pet"] .k-eyes-open{opacity:0}
.us-pet-layer[data-pet-state="pet"] .k-eyes-closed{opacity:1}
.us-pet-layer[data-pet-state="pet"] .k-body{transform:scale(1.025,.97)}
.us-pet-layer[data-pet-state="pet"] .k-tail{animation:us-kitten-pet-tail 1.3s ease-in-out 1}
/* held — carried by the scruff: the whole kitten hangs from the back of the
   neck, legs dangle loose, tail hangs relaxed, head stays calm and a little up. */
.us-pet-kitten{transition:transform 200ms var(--us-ease-standard)}
.us-pet-layer[data-pet-state="held"] .us-pet-shadow{opacity:0;transform:scale(.5)}
.us-pet-layer[data-pet-state="held"] .us-pet-kitten{transform-origin:62% 38%;transform:rotate(-28deg);animation:us-kitten-dangle 1.9s ease-in-out .2s infinite alternate}
.us-pet-layer[data-pet-state="held"] .k-head{transform:rotate(14deg)}
.us-pet-layer[data-pet-state="held"] .k-ear{transform:rotate(-8deg)}
.us-pet-layer[data-pet-state="held"] .k-eyes-open{transform:scaleY(.8)}
.us-pet-layer[data-pet-state="held"] .k-body{transform:scale(.95,1.05)}
.us-pet-layer[data-pet-state="held"] .k-leg-front-near,.us-pet-layer[data-pet-state="held"] .k-leg-front-far{transform:rotate(30deg) scaleY(1.08)}
.us-pet-layer[data-pet-state="held"] .k-leg-hind-near,.us-pet-layer[data-pet-state="held"] .k-leg-hind-far{transform:rotate(30deg) scaleY(1.12)}
.us-pet-layer[data-pet-state="held"] .k-tail{transform:rotate(-118deg) scale(.86)}
/* fall — finger is gone: body straightens under gravity, legs and tail trail naturally. */
.us-pet-layer[data-pet-state="fall"] .us-pet-shadow{opacity:0}
.us-pet-layer[data-pet-state="fall"] .us-pet-kitten{transform-origin:50% 55%;transform:rotate(-4deg) scale(.98,1.04)}
.us-pet-layer[data-pet-state="fall"] .k-leg{transform:rotate(8deg) scaleY(1.06)}
.us-pet-layer[data-pet-state="fall"] .k-tail{transform:rotate(-92deg) scale(.9)}
/* snap — gravity already reached the rim; only a tiny landing compression remains. */
.us-pet-layer[data-pet-state="snap"] .us-pet-kitten{animation:us-pet-land 180ms ease-out 1}
@keyframes us-kitten-breathe{0%,100%{transform:none}50%{transform:scale(1.02,1.035)}}
@keyframes us-kitten-sway{from{transform:rotate(-6deg)}to{transform:rotate(9deg)}}
@keyframes us-kitten-blink{0%,90%,96%,100%{transform:none}93%{transform:scaleY(.1)}}
@keyframes us-kitten-stride{from{transform:rotate(14deg)}to{transform:rotate(-14deg)}}
@keyframes us-kitten-bob{from{transform:none}to{transform:translateY(.7px)}}
@keyframes us-kitten-sleep{0%,100%{transform:translateY(3.4px) scale(1.06,.9)}50%{transform:translateY(3.2px) scale(1.08,.93)}}
@keyframes us-kitten-quiver{from{transform:rotate(30deg)}to{transform:rotate(38deg)}}
@keyframes us-pet-hop{0%,100%{transform:none}35%{transform:translateY(-9px)}60%{transform:translateY(0) scale(1.05,.94)}}
@keyframes us-kitten-pet-tail{0%,100%{transform:none}35%{transform:rotate(14deg)}70%{transform:rotate(-5deg)}}
@keyframes us-kitten-dangle{from{transform:rotate(-31deg)}to{transform:rotate(-25deg)}}
@keyframes us-pet-land{0%,100%{transform:none}45%{transform:scale(1.05,.93)}}
@keyframes us-pet-arrive{from{opacity:0}to{opacity:1}}
@keyframes us-pet-shadow{0%,100%{transform:none}35%{transform:scale(.6);opacity:.5}}

/* Background, reduced motion: same poses, no movement at all. */
html[data-us-visibility="hidden"] .us-pet-layer *{animation-play-state:paused!important}
:root[data-us-motion="reduced"] .us-pet-layer *{animation:none!important;transition:none!important}
@media(prefers-reduced-motion:reduce){.us-pet-layer *{animation:none!important;transition:none!important}}
