/* Native document navigation; local panels commit immediately without snapshots. */
@view-transition{navigation:auto}
:root{color-scheme:light}
#site-header-root{view-transition-name:yantu-header}
/* Keep the page content in the root snapshot rather than splitting it into
 * another full-page compositing surface. The header remains independent. */
.login-bg-stage{view-transition-name:yantu-login-background}
.login-campus-bar{view-transition-name:yantu-campus-controls}
/* These are unrelated surfaces. A shared name stretches the old login card
 * into the incoming full-screen hero and leaves it underneath the new text. */
.login-shell{view-transition-name:yantu-login-card}
body.yantu-home-page .hero{view-transition-name:yantu-home-content}
::view-transition{pointer-events:none}
/* Named photo layers must stay behind the header and form, regardless of
 * whether the incoming carousel script ran before snapshot capture. */
::view-transition-group(root){z-index:0}
::view-transition-group(yantu-login-background){z-index:1}
::view-transition-group(yantu-login-card),
::view-transition-group(yantu-home-content){z-index:2}
::view-transition-group(yantu-campus-controls){z-index:3}
::view-transition-group(yantu-header){z-index:4}
::view-transition-group(*){animation-duration:140ms;animation-timing-function:ease-out}
::view-transition-group(root),
::view-transition-group(yantu-header),
::view-transition-group(yantu-login-card),
::view-transition-group(yantu-home-content),
::view-transition-group(yantu-panel),
::view-transition-group(yantu-login-background),
::view-transition-group(yantu-campus-controls){animation:none}
::view-transition-image-pair(*){isolation:isolate}
::view-transition-old(*){animation:none;opacity:1;mix-blend-mode:normal}
::view-transition-new(*){animation:yantu-arrive 140ms ease-out both;mix-blend-mode:normal}
::view-transition-new(yantu-header),
::view-transition-new(yantu-campus-controls),
::view-transition-new(yantu-login-background){animation:none;opacity:1}
/* Incoming glass is translucent. Retaining the outgoing opaque white header
 * underneath it creates a white strip until the transition ends. The new
 * header snapshot is already ready and remains fully visible throughout. */
::view-transition-old(yantu-header){opacity:0}
/* Do not retain opaque form / title snapshots beneath unrelated incoming
 * content. The photo root and incoming content are already available. */
::view-transition-old(yantu-login-card),
::view-transition-old(yantu-home-content){opacity:0}
/* A tab open before this update can still send the previous snapshot name. */
::view-transition-old(yantu-entry){opacity:0}
/* Orphaned login-only layers must not float above an ordinary page or home. */
:root:not(:has(body.login-background))::view-transition-old(yantu-login-background),
:root:not(:has(body.login-background))::view-transition-old(yantu-campus-controls){opacity:0}
@keyframes yantu-arrive{from{opacity:.94}to{opacity:1}}
/* Rise only content. Photographic pages keep their root/background still;
 * their card/hero gets its own entry snapshot, not a full-page main layer. */
:root:not(:has(body.login-background)):not(:has(body.yantu-home-page))::view-transition-new(root),
::view-transition-new(yantu-login-card),
::view-transition-new(yantu-home-content){animation:yantu-soft-rise 180ms cubic-bezier(.22,.61,.36,1) both}
@keyframes yantu-soft-rise{from{opacity:.96;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
/* Login arrival is a scene change, not a nearly opaque first-frame swap.
 * All arriving layers use one clock; the outgoing root stays visible below
 * them. Keep the prepared header fully visible: crossfading dark and white
 * artwork cancels their contrast halfway through on narrow screens. */
:root:has(body.login-background)::view-transition-new(root),
:root:has(body.login-background)::view-transition-new(yantu-login-background),
:root:has(body.login-background)::view-transition-new(yantu-campus-controls){animation:yantu-login-reveal 180ms ease-out both}
:root:has(body.login-background)::view-transition-old(yantu-home-content){animation:yantu-login-leave 180ms ease-out both}
:root:has(body.login-background)::view-transition-new(yantu-login-card){animation:yantu-login-rise 180ms ease-out both}
@keyframes yantu-login-reveal{from{opacity:0}to{opacity:1}}
@keyframes yantu-login-leave{from{opacity:1}to{opacity:0}}
@keyframes yantu-login-rise{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
/* Older browsers: no outgoing fade, no artificial loading delay, no invisible BFCache page. */
html.yantu-page-enter main{animation:yantu-soft-rise 180ms cubic-bezier(.22,.61,.36,1) both}
/* Native dialogs / popovers keep their top layer for the short exit animation. */
@supports(transition-behavior:allow-discrete){
 :is(dialog,[popover]){opacity:0;transform:translateY(5px);transition:opacity 180ms ease,transform 180ms ease,display 180ms allow-discrete,overlay 180ms allow-discrete}
 :is(dialog[open],[popover]:popover-open){opacity:1;transform:none}
 dialog::backdrop{opacity:0;transition:opacity 180ms ease,display 180ms allow-discrete,overlay 180ms allow-discrete}
 dialog[open]::backdrop{opacity:1}
 @starting-style{
  :is(dialog[open],[popover]:popover-open){opacity:0;transform:translateY(5px)}
  dialog[open]::backdrop{opacity:0}
 }
}
@media(prefers-reduced-motion:reduce){
 @view-transition{navigation:none}
 ::view-transition-group(*),::view-transition-old(*),::view-transition-new(*){animation:none!important}
 html.yantu-page-enter main{animation:none}
 :is(dialog,[popover]),dialog::backdrop{transition:none!important}
}
