/* Duke startup artwork and Magnetic Snap + Heartbeat timelines, copied from
   Duke's bibbs_engine/ui/index.html and pwa.css (Duke-logo @ db190be).
   Only the page wrapper and visibility trigger differ from the app. */
.duke-startup{--duke-bond-connect:2.2s;overflow:visible}
.duke-launch-halo{opacity:.5}
.duke-launch-figure{transform-box:fill-box;transform-origin:center;animation:duke-launch-join 3.2s both}
.duke-launch-left{--duke-bond-side:-1}
.duke-launch-right{--duke-bond-side:1}
/* Sampled source springs: stiffness 70/85, damping 12/14, mass .85. */
@keyframes duke-launch-join{
  0%,37.5%{transform:translateX(calc(var(--duke-bond-side)*140px)) rotate(calc(var(--duke-bond-side)*12deg));opacity:.95;animation-timing-function:cubic-bezier(.22,1.04,.38,1);animation-timing-function:linear(0,.0811,.2546,.4484,.6242,.7655,.8694,.9396,.983,1.0069,1.0177,1.0205,1.0189,1.0153,1.0114,1.0078,1.0048,1.0027,1.0013,1.0004,1)}
  68.75%{transform:translateX(calc(var(--duke-bond-side)*21px)) rotate(calc(var(--duke-bond-side)*3deg));opacity:1;animation-timing-function:cubic-bezier(.22,1.02,.38,1);animation-timing-function:linear(0,.0948,.2875,.4909,.6652,.7975,.8894,.9482,.9826,1.0006,1.0084,1.0104,1.0096,1.0076,1.0055,1.0036,1.0022,1.0012,1.0006,1.0002,1)}
  100%{transform:translateX(0) rotate(0);opacity:1}
}
.duke-launch-heartbeat{transform-origin:250px 250px;animation:duke-launch-heartbeat 1.4s ease-in-out var(--duke-bond-connect) infinite}
@keyframes duke-launch-heartbeat{0%,100%{transform:scale(1)}25%{transform:scale(1.05)}50%{transform:scale(1.01)}75%{transform:scale(1.07)}}
.duke-launch-head-left{transform-origin:165px 115px}
.duke-launch-head-right{transform-origin:335px 115px}
.duke-launch-head{animation:duke-launch-double-blink .98s ease-in-out var(--duke-bond-connect),duke-launch-blink 4.2s ease-in-out 6.4s infinite}
.duke-launch-eye{opacity:.8;animation:duke-launch-double-eye .98s steps(1,end) var(--duke-bond-connect),duke-launch-eye 4.2s steps(1,end) 6.4s infinite}
.duke-launch-eyelid{opacity:0;animation:duke-launch-double-lid .98s steps(1,end) var(--duke-bond-connect),duke-launch-lid 4.2s steps(1,end) 6.4s infinite}
@keyframes duke-launch-double-blink{0%,28.5714%,71.4286%,100%{transform:scaleY(1)}10%,81.4286%{transform:scaleY(.08)}20%,91.4286%{transform:scaleY(1.15)}}
@keyframes duke-launch-blink{0%,6.6667%,100%{transform:scaleY(1)}2.3333%{transform:scaleY(.08)}4.6667%{transform:scaleY(1.15)}}
@keyframes duke-launch-double-eye{0%,71.4286%{opacity:0}34.6939%,100%{opacity:.8}}
@keyframes duke-launch-double-lid{0%,71.4286%{opacity:1}34.6939%,100%{opacity:0}}
@keyframes duke-launch-eye{0%{opacity:0}5.7143%,100%{opacity:.8}}
@keyframes duke-launch-lid{0%{opacity:1}5.7143%,100%{opacity:0}}
.duke-launch-weave{transform-origin:285px 280px;animation:duke-launch-reveal .35s ease-out var(--duke-bond-connect) both}
.duke-launch-smile{transform-origin:250px 340px;animation:duke-launch-reveal .5s ease-out var(--duke-bond-connect) both}
.duke-launch-smile-line{stroke-dasharray:1;stroke-dashoffset:0;animation:duke-launch-draw .6s ease-in-out var(--duke-bond-connect) both}
.duke-launch-dimple{transform-box:fill-box;transform-origin:center;animation:duke-launch-reveal .3s ease-out 2.5s both}
.duke-launch-cheeks{opacity:.26;animation:duke-launch-blush .5s ease-out var(--duke-bond-connect) both}
@keyframes duke-launch-reveal{from{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}
@keyframes duke-launch-draw{from{stroke-dashoffset:1}to{stroke-dashoffset:0}}
@keyframes duke-launch-blush{from{opacity:0}to{opacity:.26}}
.duke-launch-ring{transform-origin:250px 250px;opacity:0;animation:duke-launch-ring 1.4s ease-out var(--duke-bond-connect) infinite}
.duke-launch-ring-later{animation-name:duke-launch-ring-later;animation-delay:2.42s}
@keyframes duke-launch-ring{from{opacity:.85;transform:scale(1)}to{opacity:0;transform:scale(4.3333)}}
@keyframes duke-launch-ring-later{from{opacity:.85;transform:scale(1)}to{opacity:0;transform:scale(4.6667)}}
.duke-launch-sparkle{transform-origin:250px 275px;opacity:0;animation:duke-launch-sparkle .8s ease-in-out var(--duke-bond-connect)}
@keyframes duke-launch-sparkle{0%,100%{opacity:0;transform:scale(0)}50%{opacity:1;transform:scale(1.6)}}

.duke-startup:not(.is-playing) *{animation:none!important}
@media(prefers-reduced-motion:reduce){
  .duke-startup,.duke-startup *{animation:none!important;transition:none!important}
}
