/* Nine registered, distinct phoneme frames. One sprite at a time; no double lips. */
:is(.studio-viseme,.studio-player-viseme){background-image:url('/assets/studio/img/teacher-visemes-v2.png');background-size:300% 300%}
:is(.studio-viseme,.studio-player-viseme).viseme-a{background-position:0 0;transform-origin:52.392% 57.895%;transform:translate(-52.392%,-57.895%) scaleY(var(--mouth-opening,1))}
:is(.studio-viseme,.studio-player-viseme).viseme-b{background-position:50% 0;transform-origin:49.761% 58.493%;transform:translate(-49.761%,-58.493%) scaleY(var(--mouth-opening,1))}
:is(.studio-viseme,.studio-player-viseme).viseme-c{background-position:100% 0;transform-origin:49.163% 59.091%;transform:translate(-49.163%,-59.091%) scaleY(var(--mouth-opening,1))}
:is(.studio-viseme,.studio-player-viseme).viseme-d{background-position:0 50%;transform-origin:52.99% 48.445%;transform:translate(-52.99%,-48.445%) scaleY(var(--mouth-opening,1))}
:is(.studio-viseme,.studio-player-viseme).viseme-e{background-position:50% 50%;transform-origin:49.761% 48.923%;transform:translate(-49.761%,-48.923%) scaleY(var(--mouth-opening,1))}
:is(.studio-viseme,.studio-player-viseme).viseme-f{background-position:100% 50%;transform-origin:49.641% 49.88%;transform:translate(-49.641%,-49.88%) scaleY(var(--mouth-opening,1))}
:is(.studio-viseme,.studio-player-viseme).viseme-g{background-position:0 100%;transform-origin:52.273% 42.225%;transform:translate(-52.273%,-42.225%) scaleY(var(--mouth-opening,1))}
:is(.studio-viseme,.studio-player-viseme).viseme-h{background-position:50% 100%;transform-origin:50.478% 38.636%;transform:translate(-50.478%,-38.636%) scaleY(var(--mouth-opening,1))}
:is(.studio-viseme,.studio-player-viseme).viseme-x{background-position:100% 100%;transform-origin:48.565% 39.952%;transform:translate(-48.565%,-39.952%) scaleY(var(--mouth-opening,1))}
/* Expression smile is used only for X (silent/rest), never replaces spoken phonemes. */
.expression-smile :is(.studio-viseme,.studio-player-viseme).viseme-x{background-image:url('/assets/studio/img/teacher-smile-v1.png');background-size:100% 100%;background-position:center;transform:translate(-50%,-51.2%);transform-origin:50% 51.2%}
.expanded-character{--head-left:36%;--head-right:70%;--head-width:34%;--head-mask-x:54.545%;--eye-x:53%;--eye-y:60%}
.expanded-character[data-animation-profile="right"]{--head-left:30%;--head-right:65%;--head-width:35%;--head-mask-x:46.154%;--eye-x:47.5%;--eye-y:62%}
/* A single complete silhouette, including hips/legs, replaces the resting body.
   Keep only the registered original head: no skirt crossfade or stray pose hair.
   Pose masks are in SOURCE coordinates; translation aligns them with that head. */
.expanded-character .studio-gesture-layer{--pose-head-x:var(--eye-x);--pose-head-y:11%;-webkit-mask-image:radial-gradient(ellipse 23% 13% at var(--pose-head-x) var(--pose-head-y),transparent 98%,#000 100%)!important;mask-image:radial-gradient(ellipse 23% 13% at var(--pose-head-x) var(--pose-head-y),transparent 98%,#000 100%)!important;clip-path:none}
.expanded-character :is(.studio-character-body,.studio-player-character-body){-webkit-mask-image:radial-gradient(ellipse 23% 13% at var(--eye-x) 11%,#000 98%,transparent 100%),linear-gradient(rgba(0,0,0,var(--gesture-rest-opacity,1)),rgba(0,0,0,var(--gesture-rest-opacity,1)));mask-image:radial-gradient(ellipse 23% 13% at var(--eye-x) 11%,#000 98%,transparent 100%),linear-gradient(rgba(0,0,0,var(--gesture-rest-opacity,1)),rgba(0,0,0,var(--gesture-rest-opacity,1)));-webkit-mask-size:100% 100%;mask-size:100% 100%;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-composite:source-over;mask-composite:add}
.expanded-character[data-animation-profile="middle"] .studio-gesture-layer.board{--pose-head-x:53.8%;transform:translateX(-.8%)}
.expanded-character[data-animation-profile="middle"] .studio-gesture-layer.explain{--pose-head-x:48.5%;transform:translateX(4.5%)}
.expanded-character[data-animation-profile="middle"] .studio-gesture-layer.wave{--pose-head-x:53.5%;--pose-head-y:9.2%;transform:translate(-.5%,1.8%)}
.expanded-character[data-animation-profile="middle"] .studio-gesture-layer.emphasize{--pose-head-x:54.1%;--pose-head-y:9.2%;transform:translate(-1.1%,1.8%)}
.expanded-character[data-animation-profile="right"] .studio-gesture-layer:is(.board,.explain){--pose-head-x:49%;transform:translateX(-1.5%)}
.expanded-character[data-animation-profile="right"] .studio-gesture-layer:is(.wave,.emphasize){--pose-head-x:49%;--pose-head-y:8.9%;transform:translate(-1.5%,2.1%)}
/* Nose is independently registered and never participates in a gesture/blink.
   Only the repaired bridge/tip is shown; original eyes and blank mouth stay intact. */
.studio-nose-layer{position:absolute!important;z-index:6;left:0!important;top:0!important;width:100%!important;height:25%!important;object-fit:fill!important;pointer-events:none;mask-image:radial-gradient(ellipse 5% 9% at var(--eye-x) 68.5%,#000 70%,transparent 100%);-webkit-mask-image:radial-gradient(ellipse 5% 9% at var(--eye-x) 68.5%,#000 70%,transparent 100%)}
.expanded-character :is(.studio-viseme,.studio-player-viseme){z-index:7}
/* Direct the expansive presentation hand toward the board, not outside the
   video frame. Reflect the pose around its anatomical axis, never the face. */
.expanded-character[data-animation-profile="middle"] .studio-gesture-layer.present{--pose-head-x:46.7%;--pose-head-y:9.2%;transform:translate(-.3%,1.8%) scaleX(-1)}
.expanded-character[data-animation-profile="right"] .studio-gesture-layer.present{--pose-head-x:49.2%;--pose-head-y:8.9%;transform:translate(-3.3%,2.1%) scaleX(-1)}
.expanded-character :is(.studio-blink,.studio-player-blink),.studio-expression-layer{position:absolute!important;z-index:5;left:0!important;top:0!important;width:100%!important;height:25%!important;object-fit:fill!important;pointer-events:none;opacity:0;mask-image:radial-gradient(ellipse 13% 11% at var(--eye-x) var(--eye-y),#000 68%,transparent 100%);-webkit-mask-image:radial-gradient(ellipse 13% 11% at var(--eye-x) var(--eye-y),#000 68%,transparent 100%)}
.expression-wink .studio-expression-layer.wink,.expression-playful .studio-expression-layer.playful{opacity:var(--expression-opacity,0)}
.expression-wink :is(.studio-blink,.studio-player-blink),.expression-playful :is(.studio-blink,.studio-player-blink){animation:none!important;opacity:0!important}
/* Separate eye islands leave the nose bridge out of all facial expressions. */
.expanded-character :is(.studio-blink,.studio-player-blink,.studio-expression-layer){mask-image:radial-gradient(ellipse 7% 10% at calc(var(--eye-x) - 7.5%) var(--eye-y),#000 68%,transparent 100%),radial-gradient(ellipse 7% 10% at calc(var(--eye-x) + 7.5%) var(--eye-y),#000 68%,transparent 100%);-webkit-mask-image:radial-gradient(ellipse 7% 10% at calc(var(--eye-x) - 7.5%) var(--eye-y),#000 68%,transparent 100%),radial-gradient(ellipse 7% 10% at calc(var(--eye-x) + 7.5%) var(--eye-y),#000 68%,transparent 100%)}
