/* Mochi moods. A mood is a pose; only the live reply moves, and nothing moves under reduced motion. */
/* ---------- Mochi ---------- */
.jv-mochi .av{display:block;width:100%;height:100%;overflow:visible;
  --mBody:color-mix(in oklab,var(--pri) 13%,#fffaf4);--mLine:color-mix(in oklab,var(--pri) 62%,#1d1714);
  --mEye:#2b211d;--mCheek:#ff8fa3;--mHeart:#ff6b8b}
.jv-mochi .av .eyes,.jv-mochi .av .shine,.jv-mochi .av .happy,.jv-mochi .av .halo,.jv-mochi .av .bubble,.jv-mochi .av .dots circle{transform-box:fill-box;transform-origin:center}
.jv-mochi .av .armL{transform-box:view-box;transform-origin:14.5px 43.5px}.jv-mochi .av .armR{transform-box:view-box;transform-origin:49.5px 43.5px}
.jv-mochi .av .orb{transform-box:view-box;transform-origin:32px 8px}.jv-mochi .av .curl{transform-box:view-box;transform-origin:33px 21px}
.jv-mochi .av .team{opacity:0;transform-box:view-box;transform-origin:32px 39px;transition:opacity .3s ease}.jv-mochi .av .mini{transform-box:fill-box;transform-origin:center}
.jv-mochi .av .whole{transform-box:view-box;transform-origin:32px 57px}
.jv-mochi .av .happy,.jv-mochi .av .bubble,.jv-mochi .av .dots{opacity:0}

@keyframes mBlink{0%,100%{transform:scaleY(1)}45%,55%{transform:scaleY(.12)}}
@keyframes mWave{0%,100%{transform:rotate(0)}25%{transform:rotate(-80deg)}50%{transform:rotate(-55deg)}75%{transform:rotate(-80deg)}}
@keyframes mReach{0%,100%{transform:rotate(-72deg)}50%{transform:rotate(-86deg)}}
@keyframes mReachL{0%,100%{transform:rotate(72deg)}50%{transform:rotate(86deg)}}
@keyframes mBob{0%,100%{transform:translateY(0)}50%{transform:translateY(-2.5px)}}
@keyframes mTilt{0%,100%{transform:rotate(-7deg) translateY(0)}50%{transform:rotate(-4deg) translateY(-1.5px)}}
@keyframes mHalo{0%,100%{transform:scale(1);opacity:.3}50%{transform:scale(1.7);opacity:0}}
@keyframes mWiggle{0%,100%{transform:rotate(0)}25%{transform:rotate(-12deg)}75%{transform:rotate(12deg)}}
@keyframes mLook{0%,100%{transform:translate(0,0)}30%{transform:translate(-1.4px,-1.2px)}70%{transform:translate(1.4px,-1.2px)}}
@keyframes mPopIn{0%{transform:scale(.4) translateY(4px);opacity:0}100%{transform:scale(1) translateY(0);opacity:1}}
@keyframes mDots{0%,100%{opacity:.2}50%{opacity:1}}
@keyframes mSquish{0%{transform:scale(1)}35%{transform:scale(1.1,.9)}65%{transform:scale(.95,1.06)}100%{transform:scale(1)}}
@keyframes mFloat{0%,100%{transform:translateY(0)}50%{transform:translateY(-2.2px)}}
@keyframes mOrbit{to{transform:rotate(360deg)}}
@keyframes mUpright{to{transform:rotate(-360deg)}}
@keyframes mSparkle{0%,100%{transform:scale(1)}50%{transform:scale(1.35)}}
/* idle: still; it waves and blinks when you point at it */
.jv-mochi.mood-idle[data-greeting="true"] .eyes{animation:mBlink .35s ease-in-out}
.jv-mochi.mood-idle[data-greeting="true"] .armR{animation:mWave 1s ease-in-out}
/* Every mood reads as a still pose. Only the Mochi marked live (the reply in progress) moves, so a list of waiting
   or running items never fills the screen with motion that cannot be paused. */
.jv-mochi.mood-thinking .team{opacity:1}.jv-mochi.mood-thinking .dots{opacity:1}
.jv-mochi.mood-working .team{opacity:1}.jv-mochi.mood-working .armL{transform:rotate(72deg)}.jv-mochi.mood-working .armR{transform:rotate(-72deg)}
/* asking: puppy eyes, head tilt, both arms reaching up, a little heart bubble */
.jv-mochi.mood-asking .whole{transform:rotate(-7deg)}.jv-mochi.mood-asking .armL{transform:rotate(72deg)}.jv-mochi.mood-asking .armR{transform:rotate(-72deg)}
.jv-mochi.mood-asking .eyes{transform:scale(1.14)}.jv-mochi.mood-asking .bubble{opacity:1}
.jv-mochi.mood-done .whole{animation:mSquish .6s ease-out 1}.jv-mochi.mood-done .team{opacity:1}.jv-mochi.mood-done .eyes{opacity:0}.jv-mochi.mood-done .happy{opacity:1}
.jv-mochi.mood-done .armL{transform:rotate(80deg)}.jv-mochi.mood-done .armR{transform:rotate(-80deg)}
/* live thinking and working loop for as long as the reply runs: a progress indicator */
.jv-mochi[data-live].mood-thinking .eyes{animation:mLook 1.8s ease-in-out infinite}
.jv-mochi[data-live].mood-thinking .orb{animation:mFloat 1.6s ease-in-out infinite}.jv-mochi[data-live].mood-thinking .halo{animation:mHalo 1.3s ease-out infinite}
.jv-mochi[data-live].mood-thinking .mini{animation:mFloat 1.4s ease-in-out infinite}.jv-mochi[data-live].mood-thinking .m2{animation-delay:.3s}.jv-mochi[data-live].mood-thinking .m3{animation-delay:.6s}
.jv-mochi[data-live].mood-thinking .curl{animation:mWiggle 1.4s ease-in-out infinite}
.jv-mochi[data-live].mood-thinking .dots circle{animation:mDots 1.2s ease-in-out infinite}
.jv-mochi[data-live].mood-thinking .dots circle:nth-child(2){animation-delay:.2s}.jv-mochi[data-live].mood-thinking .dots circle:nth-child(3){animation-delay:.4s}
.jv-mochi[data-live].mood-working .whole{animation:mBob .6s ease-in-out infinite}.jv-mochi[data-live].mood-working .orb{animation:mFloat .8s ease-in-out infinite}.jv-mochi[data-live].mood-working .curl{animation:mWiggle .6s ease-in-out infinite}
.jv-mochi[data-live].mood-working .team{animation:mOrbit 7s linear infinite}.jv-mochi[data-live].mood-working .mini{animation:mUpright 7s linear infinite}
.jv-mochi[data-live].mood-working .armL{animation:mReachL .6s ease-in-out infinite}.jv-mochi[data-live].mood-working .armR{animation:mReach .6s ease-in-out infinite .3s}
/* live asking may wait for hours: it asks twice, then holds the pose */
.jv-mochi[data-live].mood-asking .whole{animation:mTilt 1.8s ease-in-out 2}
.jv-mochi[data-live].mood-asking .armL{animation:mReachL 1.2s ease-in-out 2}.jv-mochi[data-live].mood-asking .armR{animation:mReach 1.2s ease-in-out 2}
.jv-mochi[data-live].mood-asking .shine{animation:mSparkle 1.2s ease-in-out 2}.jv-mochi[data-live].mood-asking .bubble{animation:mPopIn .5s ease-out 1 backwards}
@media (prefers-reduced-motion:reduce){.jv-mochi .av *{animation:none!important;transition:none!important}}

.jv-mochi{--pri:var(--jv-btn);display:inline-block;flex-shrink:0;vertical-align:middle;pointer-events:auto}
.jv-mochi-home{display:inline-flex;align-items:center;border-radius:8px}
.jv-mochi-activity{display:flex;align-items:center;gap:8px;color:var(--jv-text-muted);font-size:12px;flex-shrink:0}
.jv-job-status.jv-mochi-activity::before{display:none}
.jv-msg[data-role="jarvis"]{position:relative;padding-left:40px;box-sizing:border-box}
.jv-msg[data-role="jarvis"]>.jv-mochi{position:absolute;left:0;top:0}
.jv-msg[data-role="jarvis"]>.jv-provisional{margin-top:0}
.jv-approval-lead{display:inline-flex;align-items:center;gap:8px}
