/* A short sequence: invite → charge → recognize → lock → impact → settle. */
.scanner { --motion-accent:color-mix(in srgb,var(--zone) 60%,#8aaeff); perspective:700px; transition:border-color .4s,box-shadow .4s; }
.scan-aura { position:absolute; width:240px; height:240px; pointer-events:none; border-radius:50%; background:radial-gradient(circle,color-mix(in srgb,var(--zone) 20%,transparent),#b3d5ff22 45%,transparent 70%); opacity:.75; animation:aura-drift 5s ease-in-out infinite; }
.scanner .scanner-grid { transition:opacity .3s; }
.scan-ripple { position:absolute; width:145px; height:145px; border:1px solid color-mix(in srgb,var(--zone) 28%,transparent); border-radius:50%; pointer-events:none; opacity:0; animation:invitation-ripple 3s ease-out infinite; }
.scan-ripple.two { animation-delay:1.5s; }
.scanner .scan-orbit { width:205px; height:205px; border-color:color-mix(in srgb,var(--zone) 16%,transparent); animation:orbital-turn 12s linear infinite; pointer-events:none; }
.scanner .scan-orbit.second { width:245px; height:245px; opacity:.7; animation:orbital-turn 18s linear infinite reverse; }
.scanner .scan-orbit:after { width:7px; height:7px; opacity:.75; top:26px; left:26px; background:var(--zone); box-shadow:0 0 9px color-mix(in srgb,var(--zone) 40%,transparent); }
.scanner .scan-orbit.second:after { width:4px; height:4px; top:32px; left:32px; }
.energy-motes { position:absolute; inset:0; pointer-events:none; }
.energy-mote { position:absolute; top:50%; left:50%; width:3px; height:3px; border-radius:50%; background:var(--motion-accent); box-shadow:0 0 5px #ffffffcc; opacity:.35; transform:rotate(var(--angle)) translateX(var(--radius)); animation:mote-drift 4s ease-in-out infinite; animation-delay:var(--delay); }
.scanner .scan-target { z-index:2; overflow:visible; animation:target-float 3.6s ease-in-out infinite; box-shadow:inset 0 2px 5px #fff,0 9px 26px #496f9e1d; transition:transform .32s cubic-bezier(.2,.8,.2,1.3),box-shadow .3s; }
.scanner .scan-target:before { content:''; position:absolute; inset:2px; border-radius:inherit; background:linear-gradient(130deg,#fff9,transparent 42%,transparent 70%,#fff4); pointer-events:none; }
.scanner .scan-target>.icon { animation:stamp-invite 3.6s ease-in-out infinite; transform-origin:center 85%; }
.scanner .scan-target span { font-size:8px; letter-spacing:1.4px; }
.scanner .hold-ring { z-index:3; filter:drop-shadow(0 0 4px color-mix(in srgb,var(--zone) 40%,transparent)); }
.scanner .hold-ring circle { stroke-width:3.5; stroke-linecap:round; }
.scanner.charging { border-color:color-mix(in srgb,var(--zone) 35%,white); box-shadow:inset 0 1px 0 #fff,0 0 35px color-mix(in srgb,var(--zone) 13%,transparent); }
.scanner.charging .scan-target { animation:none; transform:scale(.9); box-shadow:inset 0 3px 12px #b6cce666,0 0 30px color-mix(in srgb,var(--zone) 18%,transparent); }
.scanner.charging .scan-target>.icon { animation:charge-icon .9s ease-in both; }
.scanner.charging .scan-aura { animation:charge-aura .9s ease-in forwards; }
.scanner.charging .scan-orbit { animation:charge-orbit .9s ease-in both; }
.scanner.charging .scan-orbit.second { animation:charge-orbit .9s ease-in reverse both; }
.scanner.charging .energy-mote { animation:mote-converge .9s ease-in infinite; animation-delay:var(--delay); opacity:.8; }
.scanner.charging .scan-ripple { animation:none; opacity:0; }
.scanner.processing .scan-target { animation:recognition-core 1.3s ease-in-out both; pointer-events:none; }
.scanner.processing .scan-target>.icon { animation:recognition-icon 1.3s cubic-bezier(.2,.7,.3,1) both; }
.scanner.processing .scan-target span { opacity:.75; font-size:7px; letter-spacing:1px; }
.scanner.processing .scan-orbit { border:1px solid color-mix(in srgb,var(--zone) 20%,transparent); border-top:2px solid var(--zone); border-right-color:var(--zone); animation:recognition-orbit 1.1s cubic-bezier(.35,.05,.65,.95) infinite; }
.scanner.processing .scan-orbit.second { animation:recognition-orbit 1.3s cubic-bezier(.35,.05,.65,.95) infinite reverse; }
.scanner.processing .scan-aura { animation:recognition-aura 1.3s ease-in both; }
.scanner.processing .energy-mote { animation:mote-converge .7s ease-in infinite; animation-delay:var(--delay); }
.scanner.processing .scan-ripple { animation:invitation-ripple 1s ease-out infinite; }
.scanner.processing .scan-line { display:block; height:2px; left:12%; right:12%; background:linear-gradient(90deg,transparent,var(--zone),transparent); box-shadow:0 0 12px var(--wash); opacity:.6; animation:focused-scan 1.1s ease-in-out infinite; }
.scanner-corner { transition:transform .35s,border-color .35s; }
.scanner.locked .scanner-corner { border-color:var(--zone); }
.scanner.locked .scanner-corner.tl { transform:translate(13px,13px); }.scanner.locked .scanner-corner.tr { transform:translate(-13px,13px); }.scanner.locked .scanner-corner.bl { transform:translate(13px,-13px); }.scanner.locked .scanner-corner.br { transform:translate(-13px,-13px); }
.match-lock { position:absolute; z-index:4; width:52px; height:52px; border-radius:50%; background:var(--zone); color:white; display:grid; place-items:center; opacity:0; transform:scale(.5); pointer-events:none; box-shadow:0 0 0 8px #ffffff77,0 6px 20px #234e6626; }
.match-lock .icon { width:25px; height:25px; }
.scanner.locked .match-lock { animation:lock-confirm .45s cubic-bezier(.2,.8,.25,1.4) both; }
.scanner.locked .scan-target { opacity:.16; transition:opacity .2s; }
.scanner.success { overflow:hidden; border-color:color-mix(in srgb,var(--zone) 28%,white); box-shadow:inset 0 1px 0 #fff,0 12px 38px color-mix(in srgb,var(--zone) 10%,transparent); }
.scanner.success .seal { width:172px; height:172px; animation:liquid-stamp-land .9s cubic-bezier(.16,.7,.23,1) both; box-shadow:0 8px 22px color-mix(in srgb,var(--zone) 10%,transparent); }
.scanner.success .seal:after { content:''; position:absolute; inset:-4px; border-radius:50%; background:linear-gradient(115deg,transparent 30%,#ffffff99 47%,transparent 64%); background-size:250% 100%; pointer-events:none; animation:seal-sheen .95s .5s ease-out both; }
.scanner.success:after { display:none; }
.scanner.success .energy-motes,.scanner.success .scan-ripple,.scanner.success .match-lock { display:none; }
.scanner.success .scan-aura { animation:success-aura 1.4s ease-out both; }
.impact-wave { position:absolute; width:160px; height:160px; border:2px solid color-mix(in srgb,var(--zone) 65%,white); border-radius:50%; opacity:0; pointer-events:none; }
.scanner.success .impact-wave { animation:landing-wave 1s .18s cubic-bezier(.12,.6,.2,1) both; }
.scanner.success .impact-wave.two { border-width:1px; animation-delay:.32s; }
.scanner.success .particle { width:5px; height:9px; z-index:3; border-radius:3px; opacity:0; animation:stamp-spark 1.15s cubic-bezier(.15,.65,.2,1) both; animation-delay:var(--delay); }
.scanner.success .spark-particle { width:6px; height:6px; border-radius:50%; box-shadow:0 0 6px #ffffffb3; }
.scanner.settled .seal,.scanner.settled .scan-aura { animation:none; }
.scanner.settled .seal:after,.scanner.settled .impact-wave { display:none; }
.scan-status.complete { animation:success-caption .5s .2s both; }
.stamp-step.active i { transition:background .25s,transform .3s cubic-bezier(.2,.8,.2,1.5); }
.stamp-dialog .primary-button:disabled { opacity:.65; }
@keyframes aura-drift { 0%,100%{transform:translate(-8px,5px) scale(.95);opacity:.65}50%{transform:translate(8px,-5px) scale(1.12);opacity:1} }
@keyframes invitation-ripple { 0%{transform:scale(.93);opacity:0}15%{opacity:.45}100%{transform:scale(1.72);opacity:0} }
@keyframes orbital-turn { to{transform:rotate(360deg)} }
@keyframes mote-drift { 0%,100%{transform:rotate(var(--angle)) translateX(var(--radius));opacity:.2}50%{transform:rotate(calc(var(--angle) + 12deg)) translateX(calc(var(--radius) - 9px));opacity:.65} }
@keyframes target-float { 0%,100%{transform:translateY(2px) scale(.985)}50%{transform:translateY(-3px) scale(1.02)} }
@keyframes stamp-invite { 0%,65%,100%{transform:translateY(0) rotate(0)}78%{transform:translateY(-5px) rotate(-7deg)}88%{transform:translateY(1px) rotate(4deg)} }
@keyframes charge-icon { to{transform:translateY(5px) scale(.9)} }
@keyframes charge-aura { to{transform:scale(.65);opacity:1} }
@keyframes charge-orbit { to{transform:rotate(150deg) scale(.88);opacity:.8} }
@keyframes mote-converge { 0%{transform:rotate(var(--angle)) translateX(var(--radius)) scale(.8);opacity:0}15%{opacity:.85}100%{transform:rotate(calc(var(--angle) + 28deg)) translateX(45px) scale(.3);opacity:0} }
@keyframes recognition-core { 0%{transform:scale(.9)}35%{transform:scale(.97)}65%{transform:scale(.91)}100%{transform:scale(.82)} }
@keyframes recognition-icon { 0%{transform:translateY(4px) rotate(0)}35%{transform:translateY(-8px) rotate(-12deg)}65%{transform:translateY(0) rotate(8deg)}100%{transform:translateY(6px) rotate(0)} }
@keyframes recognition-orbit { 0%{transform:rotate(0) scale(1)}55%{transform:rotate(230deg) scale(.91)}100%{transform:rotate(360deg) scale(1)} }
@keyframes recognition-aura { 0%{transform:scale(.65)}60%{transform:scale(1.2);opacity:1}100%{transform:scale(.8);opacity:.7} }
@keyframes focused-scan { 0%{top:20%;opacity:0}20%,75%{opacity:.7}100%{top:80%;opacity:0} }
@keyframes lock-confirm { 0%{opacity:0;transform:scale(.5)}65%{opacity:1;transform:scale(1.12)}100%{opacity:1;transform:scale(1)} }
@keyframes liquid-stamp-land { 0%{opacity:0;transform:translateY(-48px) rotateX(26deg) rotate(-28deg) scale(1.65)}22%{opacity:1;transform:translateY(5px) rotateX(0) rotate(-12deg) scale(.9)}40%{transform:translateY(-9px) rotate(-8deg) scale(1.08)}62%{transform:translateY(2px) rotate(-14deg) scale(.98)}100%{opacity:1;transform:translateY(0) rotate(-12deg) scale(1)} }
@keyframes landing-wave { 0%{transform:scale(.8);opacity:.7}100%{transform:scale(2.3);opacity:0} }
@keyframes stamp-spark { 0%{opacity:0;transform:translate(-50%,-50%) scale(.4)}12%{opacity:1}75%{opacity:.75}100%{opacity:0;transform:translate(var(--x),var(--y)) rotate(var(--r)) scale(.35)} }
@keyframes success-aura { 0%{transform:scale(.7);opacity:1}35%{transform:scale(1.4);opacity:1}100%{transform:scale(1.1);opacity:.55} }
@keyframes seal-sheen { 0%{background-position:170% 0;opacity:0}20%{opacity:.75}100%{background-position:-70% 0;opacity:0} }
@keyframes success-caption { from{opacity:0;transform:translateY(7px)}to{opacity:1;transform:translateY(0)} }
@media(prefers-reduced-motion:reduce) {
  .scanner,.scanner *, .scanner *:before,.scanner *:after,.scan-status.complete { animation:none!important; transition:none!important; }
  .scan-ripple,.energy-motes,.impact-wave,.particle,.seal:after { display:none!important; }
  .scanner .scan-target,.scanner.charging .scan-target,.scanner.processing .scan-target { transform:none; }
  .scanner.locked .match-lock { opacity:1;transform:none; }
  .scanner.success .seal { opacity:1;transform:rotate(-12deg); }
}
