/* Calque des personnages : au-dessus de la page, jamais cliquable */
.cast-layer{position:absolute;left:0;top:0;width:100%;overflow:hidden;pointer-events:none;z-index:35}
.cast-actor{position:absolute;left:0;top:0;transform-origin:50% 100%;opacity:0;transition:opacity .25s;will-change:transform}
.cast-actor.is-on{opacity:1}
.cast-actor.is-emerge .cast-lean{animation:emerge .45s ease-out both}
.cast-actor.is-vanish{opacity:0;transition:opacity .35s}
@keyframes emerge{from{opacity:0;filter:blur(6px) brightness(1.6)}to{opacity:1;filter:none}}
.cast-body{position:absolute;inset:0;transform-origin:50% 100%}
.cast-body img,.cast-body video,.cast-body canvas{width:100%;height:100%;object-fit:contain;object-position:50% 100%;
  filter:drop-shadow(0 10px 8px rgba(20,25,45,.35)) drop-shadow(0 2px 2px rgba(20,25,45,.25));
  -webkit-mask-image:linear-gradient(#000 82%,transparent);mask-image:linear-gradient(#000 82%,transparent)} /* bustes de remplacement : bas fondu */
.cast-actor.is-fading{transition:none}
.cast-actor.is-front{z-index:5}
/* Clips : chaque média dans une enveloppe .cast-face (sens du regard) ; fondu enchaîné de 160 ms, l'ancien reste opaque dessous */
.cast-face{position:absolute;inset:0;opacity:0;visibility:hidden;transition:opacity .16s linear}
.cast-face.is-active{opacity:1;visibility:visible;z-index:2}
.cast-face.is-leaving{opacity:1;visibility:visible;z-index:1;transition:none}
/* Ombre de contact : posée au sol, rétrécit et pâlit avec la hauteur du saut */
.cast-shadow{position:absolute;left:0;top:0;height:12px;border-radius:50%;opacity:0;pointer-events:none;will-change:transform,opacity;
  background:radial-gradient(closest-side,rgba(20,25,45,.5),rgba(20,25,45,.18) 60%,transparent)}
/* Mouvements de remplacement (en attendant les vrais clips) */
.cast-actor.is-on .cast-lean > *{animation:idle 2.4s ease-in-out infinite}
.cast-actor.is-walk .cast-lean > *{animation:waddle .42s ease-in-out infinite}
.cast-actor.is-hop .cast-lean > *{animation:none;transform:scaleY(1.04)}
.cast-actor.is-land .cast-lean > *{animation:land .26s ease-out}
.cast-actor.is-talk .cast-lean > *{animation:talk .5s ease-in-out infinite}
.cast-lean{position:absolute;inset:0;transform-origin:50% 100%}
.cast-actor.is-point .cast-lean{transform:rotate(calc(var(--lean,5deg)));transition:transform .3s}
.cast-actor.is-sigh .cast-lean > *{animation:sigh 1.6s ease-in-out}
@keyframes idle{0%,100%{transform:translateY(0)}50%{transform:translateY(-3px) scaleY(1.006)}}
@keyframes waddle{0%,100%{transform:rotate(-3deg) translateY(0)}50%{transform:rotate(3deg) translateY(-6px)}}
@keyframes land{0%{transform:scale(1.08,.9)}100%{transform:none}}
@keyframes talk{0%,100%{transform:rotate(0)}50%{transform:rotate(1.4deg) translateY(-2px)}}
@keyframes sigh{0%,100%{transform:none}40%{transform:translateY(5px) scaleY(.97)}}
/* Bulles */
.cast-bubble{position:absolute;left:50%;bottom:83%;margin-bottom:12px;width:max-content;max-width:min(270px,78vw);z-index:3;
  transform:translateX(calc(-50% + var(--shift,0px))) scale(.6);opacity:0;transform-origin:50% 100%;transition:transform .2s cubic-bezier(.2,1.5,.4,1),opacity .15s;
  /* bulle jaune « post-it / surligneur » : #111 sur #FFE14D = contraste 14,5:1 (WCAG AAA ; Monsieur #111 sur #CFE6FF = 14,8:1) ; liseré sombre + ombre douce pour se lire sur photos et vidéos */
  --bg:#FFE14D;--ink:#111;--line:#111;
  background:var(--bg);color:var(--ink);border:2px solid var(--line);border-radius:12px;padding:.6rem .9rem .62rem;
  font:700 max(16px,1rem)/1.32 system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif;letter-spacing:.005em;text-wrap:balance;
  filter:drop-shadow(0 4px 10px rgba(0,0,0,.35)) drop-shadow(0 1px 1.5px rgba(0,0,0,.35))}
@media (min-width:600px){.cast-bubble{font-size:17px;max-width:300px}}
.cast-bubble.is-on{opacity:1;transform:translateX(calc(-50% + var(--shift,0px))) scale(1)}
/* queue vers le personnage : contour sombre (::before) + remplissage (::after), décalée quand la bulle est poussée vers l'intérieur */
.cast-bubble::before,.cast-bubble::after{content:"";position:absolute;left:calc(50% - var(--shift,0px) - 11px);border:11px solid transparent;border-bottom:0}
.cast-bubble::before{bottom:-13px;border-top-color:var(--line)}
.cast-bubble::after{bottom:-9.5px;border-top-color:var(--bg)}
/* Madame : jaune + accent rouge stylo ; Monsieur : bleu clair + accent jaune surligneur */
.cast-actor[data-a="madame"] .cast-bubble{box-shadow:inset 4px 0 0 #d0312d}
.cast-actor[data-a="monsieur"] .cast-bubble{--bg:#CFE6FF;box-shadow:inset 4px 0 0 #f2c200}
/* Annotations au stylo rouge */
.cast-mark{position:absolute;overflow:visible;pointer-events:none}
.cast-mark path{fill:none;stroke:#d0312d;stroke-width:3.5;stroke-linecap:round;stroke-dasharray:1;stroke-dashoffset:1;animation:draw .6s ease-out forwards}
.cast-mark.is-out{opacity:0;transition:opacity .5s}
@keyframes draw{to{stroke-dashoffset:0}}
/* Commandes */
.cast-ui{position:fixed;left:10px;bottom:calc(var(--bandeau-h) + 12px + env(safe-area-inset-bottom));z-index:45;display:none;gap:.3rem;align-items:center;
  background:#1d2a4d;color:#fff;border-radius:999px;padding:.25rem .35rem .25rem .6rem;box-shadow:0 6px 16px -8px rgba(0,0,0,.5)}
.cast-ui.is-on{display:flex}
.cast-ui button{width:32px;height:32px;border-radius:50%;border:0;background:rgba(255,255,255,.12);color:#fff;font-size:.9rem;cursor:pointer}
@media (prefers-reduced-motion:reduce){.cast-actor .cast-lean > *{animation:none!important}}

/* Avec de vrais clips : pas d'animation CSS de remplacement, pas de fondu du bas */
.cast-actor.is-clip .cast-lean > *{animation:none!important}
/* Vrais clips : pas de drop-shadow animé sur la vidéo (coûteux sur mobile), l'ombre de contact suffit */
.cast-actor[data-a="madame"] .cast-media{filter:none}
.cast-actor[data-a="madame"] .cast-media{-webkit-mask-image:none;mask-image:none}

/* Entrée « toc-toc » : bout de doigt flou pressé derrière la vitre + ondes de choc */
.cast-knock{position:absolute;left:0;top:0;width:0;height:0;pointer-events:none}
.cast-knock.is-out{opacity:0;transition:opacity .45s}
.cast-knock__finger{position:absolute;left:-17px;top:-23px;width:34px;height:46px;border-radius:50% 50% 45% 45%;opacity:0;transform:scale(.8);
  background:radial-gradient(ellipse 50% 50% at 50% 42%,rgba(238,196,172,.9),rgba(214,160,136,.65) 55%,rgba(214,160,136,0) 75%);filter:blur(3.5px)}
.cast-knock__finger::after{content:"";position:absolute;left:30%;top:22%;width:30%;height:18%;border-radius:50%;background:rgba(255,255,255,.55);filter:blur(2px)}
.cast-knock.is-tap .cast-knock__finger{animation:q-press .32s ease-out forwards}
@keyframes q-press{0%{opacity:.3;transform:scale(.82)}35%{opacity:.75;transform:scale(1.05)}100%{opacity:.6;transform:scale(1)}}
.cast-knock__ring{position:absolute;left:-28px;top:-28px;width:56px;height:56px;border-radius:50%;border:2px solid rgba(29,42,77,.5);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.7),0 0 6px rgba(255,255,255,.5);animation:q-ring .8s cubic-bezier(.15,.7,.3,1) forwards;will-change:transform,opacity}
.cast-knock__ring--2{animation-delay:.09s;border-color:rgba(29,42,77,.3);opacity:0}
@keyframes q-ring{from{transform:scale(.25);opacity:.9}to{transform:scale(2.3);opacity:0}}
@media (prefers-reduced-motion:reduce){.cast-knock__ring{display:none}.cast-face{transition:none}}

/* Entrées filmées : clip plein cadre posé sur la page ; dégradés pour ne jamais montrer un bord de cadre net */
.cast-entree{position:absolute;left:0;top:0;pointer-events:none;will-change:transform,opacity;z-index:4}
.cast-entree video,.cast-entree canvas{position:absolute;display:block;transform-origin:50% 50%}
.cast-entree.is-fade-top{-webkit-mask-image:linear-gradient(transparent,#000 6%);mask-image:linear-gradient(transparent,#000 6%)}
.cast-entree.is-fade-right{-webkit-mask-image:linear-gradient(to right,#000 80%,transparent);mask-image:linear-gradient(to right,#000 80%,transparent)}
.cast-entree.is-front{z-index:6}
.cast-rope{position:absolute;left:0;top:0;height:0;border-radius:2px;pointer-events:none;
  background:repeating-linear-gradient(170deg,#b98f5e 0 3px,#8a6640 3px 5px,#c9a06c 5px 8px);box-shadow:1px 0 1px rgba(0,0,0,.25)}
.cast-prop{position:absolute;object-fit:cover;border-radius:2px;border:1.5px solid #fff;box-shadow:0 2px 3px rgba(20,25,45,.35);transform-origin:50% 100%;
  animation:q-drop .42s cubic-bezier(.3,1.4,.5,1) both;pointer-events:none;z-index:3}
@keyframes q-drop{from{transform:translateY(-40px) rotate(-14deg);opacity:0}to{transform:none;opacity:1}}
