/**
 * SDS Motion Forge — combined entry.
 * The library source lives in src/categories/ (lossless v5 split).
 * postcss-import inlines these in order at build time, producing a
 * dist/motion.css equivalent to the pre-split monolith.
 *
 * Import order is part of the cascade contract — do not reorder.
 */
/*!
 * SDS Motion Forge — core.css
 * Core — design tokens, utility modifiers, reduced-motion neutralization,
 * and scroll-gate infrastructure shared by every category.
 * Part of the lossless v5 category split — combined entry: src/motion.css
 */
/**
 * SDS Motion Forge — Premium CSS Animation System
 * Version: 5.0.0
 * Author: Salkom Design Studio
 * License: MIT
 * https://github.com/salkomdesignstudio/SDS-Motion-Forge
 *
 * 600+ production-ready CSS animations · Framework-agnostic
 * Text (104) · Buttons (100) · Inputs (100) · Cards (100) · Loaders (100) · Scroll (100)
 *
 * Optional engines (load with defer):
 *   sds-scroll.min.js          — scroll-gate via [data-sds] attribute
 *   motion-interactive.min.js  — cursor-reactive & hover interactive animations
 *
 * ─── HOW TO INSTALL ──────────────────────────────────────────
 *
 * CDN (simplest — paste in <head>):
 *   <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@salkomdesignstudio/sds-motion-forge/dist/motion.min.css">
 *
 * npm + Angular (styles.css or styles.scss):
 *   @import '@salkomdesignstudio/sds-motion-forge/dist/motion.css';
 *
 * npm + React / Next.js (in index.js, _app.js or layout.js):
 *   import '@salkomdesignstudio/sds-motion-forge/dist/motion.css';
 *
 * npm + Vue (in main.js):
 *   import '@salkomdesignstudio/sds-motion-forge/dist/motion.css';
 *
 * npm + Flutter Web (in web/index.html):
 *   <link rel="stylesheet" href="packages/sds_motion_forge/motion.min.css">
 *
 * ─── USAGE ───────────────────────────────────────────────────
 *
 *   <h1 class="sds-velvet-drop">Heading</h1>
 *   <p  class="sds-liquid-rise">Paragraph</p>
 *   <button class="sds-btn-magnetic">Button</button>
 *   <div class="sds-card-float">Card</div>
 *   <span class="sds-loader-orbit"></span>
 *
 * ─── MODIFIERS ───────────────────────────────────────────────
 *
 *   sds-slow       slower animation (1.6× duration)
 *   sds-fast       faster animation (0.5× duration)
 *   sds-delay-1    0.1s delay  (up to sds-delay-10 = 1.0s)
 *   sds-loop       loop forever
 *   sds-once       play once then stop
 *   sds-pause-hover  pause on hover
 *
 * ─── STAGGER / CHILDREN ANIMATIONS ──────────────────────────
 *
 *   Some animations target children (> *). Apply to the PARENT:
 *   <div class="sds-kinetic-wave">
 *     <span>Word</span><span>By</span><span>Word</span>
 *   </div>
 *
 *   Classes that need this: sds-kinetic-wave, sds-stagger-chars,
 *   sds-arc-orbit, sds-signal-wave, sds-card-stagger,
 *   sds-card-cascade, sds-card-slice, sds-loader-dots,
 *   sds-loader-wave, sds-loader-signal, sds-loader-cascade,
 *   sds-loader-grid, sds-scroll-stagger-pop, sds-scroll-stagger-grid,
 *   sds-scroll-cascade
 *
 * ─── SCROLL ANIMATIONS ───────────────────────────────────────
 *
 *   Scroll animations fire when the class is added to the element,
 *   not automatically on scroll. Use one of these two methods:
 *
 *   Method 1 — data-sds-scroll (works everywhere, paste once):
 *   <div data-sds-scroll class="sds-scroll-rise">Content</div>
 *   <script>
 *   (function(){
 *     var io=new IntersectionObserver(function(e){
 *       e.forEach(function(x){if(x.isIntersecting){x.target.classList.add('sds-in');io.unobserve(x.target);}});
 *     },{threshold:0.08,rootMargin:'0px 0px -40px 0px'});
 *     document.querySelectorAll('[data-sds-scroll]').forEach(function(el){io.observe(el);});
 *   })();
 *   </script>
 *
 *   Method 2 — sds-scroll-auto (Chrome 115+, zero JS):
 *   <div class="sds-scroll-auto sds-scroll-rise">Content</div>
 *
 * ─── BUG FIXES IN THIS BUILD ─────────────────────────────────
 *
 *   ✓ sds-loader-progress/data/bar — position:relative added
 *   ✓ will-change on GPU-heavy animations — no jank
 *   ✓ backface-visibility on 3D transforms — no Chrome flicker
 *   ✓ max-width:max-content on typewriter — no text clipping
 *   ✓ prefers-reduced-motion — scroll elements stay visible
 *   ✓ CSS scroll-driven animations via .sds-scroll-auto
 *
 */
/* ============================================================
   DESIGN TOKENS
   Override these in :root to theme SDS Motion to your brand.
   ============================================================ */
:root {
  --sds-primary: #0015d1;
  --sds-primary-dim: rgba(0, 21, 209, 0.08);
  --sds-primary-glow: rgba(0, 21, 209, 0.3);
  --sds-accent: #d10028;
  --sds-success: #00c48c;

  /* ── v5 Motion Token Scale ──────────────────────────────────
     Source of truth: tokens/motion.tokens.json (W3C Design Tokens).
     Regenerate with `npm run build:tokens`. See SPEC.md.        */
  /* @sds-generated-tokens:start — generated from tokens/motion.tokens.json by scripts/generate-tokens.js; do not edit by hand */
  --sds-duration-instant: 0.3s;
  --sds-duration-fast: 0.4s;
  --sds-duration-base: 0.8s;
  --sds-duration-slow: 1.4s;
  --sds-duration-slower: 2.2s;
  --sds-duration-dramatic: 3s;
  --sds-ease-standard: cubic-bezier(0.22, 1, 0.36, 1);
  --sds-ease-decelerate: cubic-bezier(0.16, 1, 0.3, 1);
  --sds-ease-accelerate: cubic-bezier(0.6, -0.28, 0.74, 0.05);
  --sds-ease-emphasized: cubic-bezier(0.215, 0.61, 0.355, 1);
  --sds-ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
  --sds-ease-bounce: cubic-bezier(0.68, -0.55, 0.27, 1.55);
  --sds-distance-sm: 24px;
  --sds-distance-md: 48px;
  --sds-distance-lg: 80px;
  /* @sds-generated-tokens:end */

  /* Legacy tokens — permanent public API (R2). They now resolve
     through the v5 scale; computed defaults are unchanged
     (0.8s / cubic-bezier(0.22, 1, 0.36, 1)).                    */
  --sds-duration: var(--sds-duration-base, 0.8s);
  --sds-easing: var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1));
}
/* ============================================================
   ACCESSIBILITY — REDUCED MOTION
   Matches the user's OS preference. Skips all animation.
   ============================================================ */
@media (prefers-reduced-motion: reduce) {
  /* `> *` added in v5 (R5 gate): child-driven effects (kinetic-wave,
     staggers, loader dots/bars) animate plain child elements that carry no
     sds- class of their own — without it they kept moving under reduced
     motion in <= 4.0.3. */
  [class*="sds-"],
  [class*="sds-"] > *,
  [class*="sds-"]::before,
  [class*="sds-"]::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    animation-delay: 0ms !important;
    transition-duration: 0.01ms !important;
    transition-delay: 0ms !important;
    scroll-behavior: auto !important;
  }
  /* Scroll-animated elements must stay visible under reduced motion */
  [class*="sds-scroll-"],
  [class*="sds-scroll-"] > * {
    opacity: 1 !important;
    transform: none !important;
    filter: none !important;
    clip-path: none !important;
    -webkit-clip-path: none !important;
  }
}
/* ============================================================
   UTILITY MODIFIERS
   Stack these on any animation class.
   ============================================================ */
/* Delay helpers */
.sds-delay-1 {
  animation-delay: 0.1s !important;
}
.sds-delay-2 {
  animation-delay: 0.2s !important;
}
.sds-delay-3 {
  animation-delay: 0.3s !important;
}
.sds-delay-4 {
  animation-delay: 0.4s !important;
}
.sds-delay-5 {
  animation-delay: 0.5s !important;
}
.sds-delay-6 {
  animation-delay: 0.6s !important;
}
.sds-delay-8 {
  animation-delay: 0.8s !important;
}
.sds-delay-10 {
  animation-delay: 1s !important;
}
/* Duration helpers — override --sds-duration token */
.sds-fast {
  --sds-duration: var(--sds-duration-fast, 0.4s);
}
.sds-normal {
  --sds-duration: var(--sds-duration-base, 0.8s);
}
.sds-slow {
  --sds-duration: var(--sds-duration-slow, 1.4s);
}
.sds-xslow {
  --sds-duration: var(--sds-duration-slower, 2.2s);
}
/* Iteration helpers */
.sds-once {
  animation-iteration-count: 1 !important;
  animation-fill-mode: both !important;
}
/* Cascade to > * so stagger/wave containers (arc-orbit, kinetic-wave, signal-wave,
   stagger-pop, stagger-grid) loop correctly — their animations live on children. */
.sds-loop,
.sds-loop > * {
  animation-iteration-count: infinite !important;
}
.sds-alt,
.sds-alt > * {
  animation-direction: alternate;
  animation-iteration-count: infinite !important;
}
/* Fill modes */
.sds-fill-both {
  animation-fill-mode: both !important;
}
.sds-fill-forward {
  animation-fill-mode: forwards !important;
}
/* Pause on hover */
.sds-pause-hover:hover,
.sds-pause-hover:hover *,
.sds-pause-hover:hover::before,
.sds-pause-hover:hover::after {
  animation-play-state: paused !important;
}
/* ============================================================
   SCROLL ANIMATION ACTIVATION
   ============================================================
   Add data-sds-scroll to your element, then include this
   script once in your page. The animation fires when the
   element enters the viewport.

   <div data-sds-scroll class="sds-scroll-rise">Your content</div>

   <script>
   (function(){
     var io=new IntersectionObserver(function(e){
       e.forEach(function(x){
         if(x.isIntersecting){
           x.target.classList.add('sds-in');
           io.unobserve(x.target);
         }
       });
     },{threshold:0.08,rootMargin:'0px 0px -40px 0px'});
     document.querySelectorAll('[data-sds-scroll]').forEach(function(el){
       io.observe(el);
     });
   })();
   </script>
   ============================================================ */
[data-sds-scroll][class*="sds-scroll-"] {
  opacity: 0;
  animation-play-state: paused;
}
[data-sds-scroll].sds-in[class*="sds-scroll-"] {
  opacity: 1;
  animation-play-state: running;
}
/* CSS Scroll-Driven Animations — Chrome 115+, zero JS */
@supports (animation-timeline: scroll()) {
  .sds-scroll-auto[class*="sds-scroll-"] {
    animation-timeline: view();
    animation-range: entry 0% entry 40%;
    animation-play-state: running;
    opacity: 1;
  }
}
/* ============================================================
   SCROLL GATE — sds-scroll.js engine (data-sds attribute)
   ============================================================
   Requires: <script src="sds-scroll.min.js" defer></script>
   The JS adds "sds-js" to <html> and "sds-play" to each
   [data-sds] element when it enters the viewport.
   ============================================================ */
/* Gate: hidden + paused until JS grants sds-play */
[data-sds]:not(.sds-play) {
  animation-play-state: paused !important;
  animation-delay: -1ms !important;
  opacity: 0 !important;
}
/* Release: visible + running */
[data-sds].sds-play {
  opacity: 1;
  animation-play-state: running !important;
}
/* Fallback: if JS never loads, show content normally */
html:not(.sds-js) [data-sds] {
  opacity: 1 !important;
  animation-play-state: running !important;
}
/* v5 fix (additive): while an element is scroll-gated it is opacity:0, but
   its PAUSED 0% keyframe still applied clip-path/transform — and Chromium
   computes IntersectionObserver geometry AFTER the target's own clip and
   transform. Effects whose first frame fully clips (curtain, clip-left/right,
   radial, ink, scan, split) or moves the box off-screen (velvet, gravity)
   therefore NEVER intersected and never played in <= 4.0.3, with every
   documented scroll method. Neutralizing clip/transform only in the hidden,
   gated state restores the element's real box for the observer; the moment
   sds-play / sds-in lands, these rules stop matching and the animation plays
   from its true 0% frame. */
[data-sds]:not(.sds-play),
[data-sds-scroll][class*="sds-scroll-"]:not(.sds-in) {
  clip-path: none !important;
  -webkit-clip-path: none !important;
  transform: none !important;
}
/*!
 * SDS Motion Forge — text.css
 * Text animations (Section 1) + interactive base rules.
 * Part of the lossless v5 category split — combined entry: src/motion.css
 */
/* ============================================================
   SECTION 1 — TEXT ANIMATIONS
   Namespace: .sds-*  (text / inline elements)
   ============================================================ */
/* 1 · Velvet Drop ------------------------------------------ */
.sds-velvet-drop {
  animation: sds-velvetDrop var(--sds-duration) var(--sds-easing) both;
}
@keyframes sds-velvetDrop {
  0% {
    opacity: 0;
    transform: translateY(-24px) scaleY(0.8);
    filter: blur(6px);
  }
  60% {
    opacity: 1;
    transform: translateY(3px) scaleY(1.02);
    filter: blur(0);
  }
  80% {
    transform: translateY(-1px) scaleY(0.99);
  }
  100% {
    opacity: 1;
    transform: translateY(0) scaleY(1);
    filter: blur(0);
  }
}
/* 2 · Liquid Rise ------------------------------------------ */
.sds-liquid-rise {
  animation: sds-liquidRise var(--sds-duration) var(--sds-ease-decelerate, cubic-bezier(0.16, 1, 0.3, 1)) both;
}
@keyframes sds-liquidRise {
  0% {
    opacity: 0;
    transform: translateY(30px) scaleX(0.85) skewX(4deg);
    filter: blur(4px);
  }
  50% {
    transform: translateY(-3px) scaleX(1.02) skewX(-1deg);
    filter: blur(0);
    opacity: 1;
  }
  100% {
    opacity: 1;
    transform: translateY(0) scaleX(1) skewX(0);
  }
}
/* 3 · Refract ---------------------------------------------- */
/*   Chromatic aberration: RGB channels split with skew steps  */
.sds-refract {
  animation: sds-refract var(--sds-duration-slow, 1.4s) steps(3) infinite;
  display: inline-block;
}
@keyframes sds-refract {
  0%,
  100% {
    text-shadow:
      -1.5px -1.5px 0 var(--sds-accent),
      1.5px 1.5px 0 var(--sds-primary);
    transform: skewX(0deg);
  }
  20% {
    text-shadow:
      -3px 1.5px 0 var(--sds-accent),
      3px -1.5px 0 var(--sds-primary);
    transform: skewX(-4deg);
  }
  40% {
    text-shadow:
      1.5px -3px 0 var(--sds-accent),
      -1.5px 3px 0 var(--sds-primary);
    transform: skewX(4deg);
  }
  60% {
    text-shadow:
      -1.5px 1.5px 0 var(--sds-accent),
      1.5px -1.5px 0 var(--sds-primary);
    transform: skewY(-1deg);
  }
  80% {
    text-shadow:
      3px 3px 0 var(--sds-accent),
      -3px -3px 0 var(--sds-primary);
    transform: skewY(1deg);
  }
}
/* 4 · Phantom Blur ----------------------------------------- */
.sds-phantom-blur {
  animation: sds-phantomBlur var(--sds-duration) ease both;
}
@keyframes sds-phantomBlur {
  0% {
    opacity: 0;
    filter: blur(24px) brightness(2);
    transform: scale(1.15);
  }
  40% {
    opacity: 1;
    filter: blur(2px) brightness(1.2);
    transform: scale(1.03);
  }
  100% {
    opacity: 1;
    filter: blur(0) brightness(1);
    transform: scale(1);
  }
}
/* 5 · Gravity Drop ----------------------------------------- */
.sds-gravity-drop {
  animation: sds-gravityDrop var(--sds-duration) var(--sds-ease-bounce, cubic-bezier(0.68, -0.55, 0.27, 1.55)) both;
}
@keyframes sds-gravityDrop {
  0% {
    opacity: 0;
    transform: translateY(-60px) scaleY(0.5);
  }
  65% {
    opacity: 1;
    transform: translateY(6px) scaleY(1.08);
  }
  82% {
    transform: translateY(-2px) scaleY(0.98);
  }
  100% {
    transform: translateY(0) scaleY(1);
  }
}
/* 6 · Static Burst ----------------------------------------- */
.sds-static-burst {
  animation: sds-staticBurst var(--sds-duration-dramatic, 3s) steps(1) infinite;
}
@keyframes sds-staticBurst {
  0%,
  100% {
    opacity: 1;
    transform: none;
    clip-path: none;
  }
  10% {
    transform: translate(2px, -1px) skewX(2deg);
    clip-path: polygon(0 20%, 100% 20%, 100% 45%, 0 45%);
  }
  20% {
    transform: translate(-2px, 1px) skewX(-1deg);
    clip-path: none;
    opacity: 0.7;
  }
  30% {
    transform: translate(3px, 2px);
    clip-path: polygon(0 60%, 100% 60%, 100% 80%, 0 80%);
  }
  40% {
    transform: none;
    clip-path: none;
    opacity: 1;
  }
}
/* 7 · Elastic Stamp ---------------------------------------- */
.sds-elastic-stamp {
  animation: sds-elasticStamp var(--sds-duration) var(--sds-easing) both;
  display: inline-block;
}
@keyframes sds-elasticStamp {
  0% {
    transform: scale(0) rotate(-6deg);
    opacity: 0;
  }
  55% {
    transform: scale(1.15) rotate(1.5deg);
    opacity: 1;
  }
  72% {
    transform: scale(0.94) rotate(-0.5deg);
  }
  86% {
    transform: scale(1.04) rotate(0.3deg);
  }
  100% {
    transform: scale(1) rotate(0);
    opacity: 1;
  }
}
/* 8 · Slice Reveal ----------------------------------------- */
.sds-slice-reveal {
  animation: sds-sliceReveal var(--sds-duration) var(--sds-easing) both;
  display: inline-block;
}
@keyframes sds-sliceReveal {
  from {
    clip-path: inset(0 100% 0 0 round 2px);
  }
  to {
    clip-path: inset(0 0% 0 0 round 2px);
  }
}
/* 9 · Char Orbit ------------------------------------------- */
.sds-char-orbit {
  animation: sds-charOrbit var(--sds-duration) var(--sds-easing) both;
  display: inline-block;
}
@keyframes sds-charOrbit {
  0% {
    opacity: 0;
    transform: translateY(-16px) rotate(-20deg) scale(0.4);
  }
  70% {
    opacity: 1;
    transform: translateY(2px) rotate(2deg) scale(1.05);
  }
  100% {
    opacity: 1;
    transform: translateY(0) rotate(0) scale(1);
  }
}
/* 10 · Ink Bleed ------------------------------------------- */
.sds-ink-bleed {
  animation: sds-inkBleed var(--sds-duration) var(--sds-ease-decelerate, cubic-bezier(0.16, 1, 0.3, 1)) both;
  display: inline-block;
}
@keyframes sds-inkBleed {
  0% {
    opacity: 0;
    letter-spacing: 12px;
    filter: blur(8px);
    transform: scaleX(1.4);
  }
  60% {
    opacity: 1;
    letter-spacing: 1px;
    filter: blur(1px);
    transform: scaleX(1.01);
  }
  100% {
    opacity: 1;
    letter-spacing: 0;
    filter: blur(0);
    transform: scaleX(1);
  }
}
/* 11 · Neon Flare ------------------------------------------ */
.sds-neon-flare {
  color: var(--sds-primary);
  animation: sds-neonFlare 2s ease infinite;
}
@keyframes sds-neonFlare {
  0%,
  100% {
    text-shadow:
      0 0 4px var(--sds-primary),
      0 0 8px var(--sds-primary-glow);
    color: var(--sds-primary);
  }
  50% {
    text-shadow:
      0 0 12px var(--sds-primary),
      0 0 30px var(--sds-primary-glow),
      0 0 60px var(--sds-primary-dim);
    color: #fff;
  }
}
/* 12 · Scramble Decode ------------------------------------- */
.sds-scramble-decode {
  animation: sds-scramblePulse 2.5s ease infinite;
  display: inline-block;
}
@keyframes sds-scramblePulse {
  0%,
  100% {
    opacity: 1;
    filter: none;
  }
  40% {
    opacity: 0.4;
    letter-spacing: 3px;
    filter: blur(2px);
    transform: skewX(3deg);
  }
  80% {
    opacity: 0.8;
    letter-spacing: 0.5px;
  }
}
/* 13 · Kinetic Wave (up to 12 children) -------------------- */
.sds-kinetic-wave > * {
  display: inline-block;
  animation: sds-kineticWave 1.6s ease infinite;
}
.sds-kinetic-wave > *:nth-child(1) {
  animation-delay: 0s;
}
.sds-kinetic-wave > *:nth-child(2) {
  animation-delay: 0.08s;
}
.sds-kinetic-wave > *:nth-child(3) {
  animation-delay: 0.16s;
}
.sds-kinetic-wave > *:nth-child(4) {
  animation-delay: 0.24s;
}
.sds-kinetic-wave > *:nth-child(5) {
  animation-delay: 0.32s;
}
.sds-kinetic-wave > *:nth-child(6) {
  animation-delay: 0.4s;
}
.sds-kinetic-wave > *:nth-child(7) {
  animation-delay: 0.48s;
}
.sds-kinetic-wave > *:nth-child(8) {
  animation-delay: 0.56s;
}
.sds-kinetic-wave > *:nth-child(9) {
  animation-delay: 0.64s;
}
.sds-kinetic-wave > *:nth-child(10) {
  animation-delay: 0.72s;
}
.sds-kinetic-wave > *:nth-child(11) {
  animation-delay: 0.8s;
}
.sds-kinetic-wave > *:nth-child(12) {
  animation-delay: 0.88s;
}
@keyframes sds-kineticWave {
  0%,
  100% {
    transform: translateY(0) rotate(0);
  }
  25% {
    transform: translateY(-10px) rotate(-4deg);
  }
  75% {
    transform: translateY(4px) rotate(2deg);
  }
}
/* 14 · Perspective Swing ----------------------------------- */
.sds-perspective-swing {
  will-change: transform;
  backface-visibility: hidden;
  animation: sds-perspSwing var(--sds-duration) var(--sds-easing) both;
  display: inline-block;
  transform-origin: left center;
}
@keyframes sds-perspSwing {
  0% {
    opacity: 0;
    transform: perspective(500px) rotateY(-70deg);
  }
  60% {
    opacity: 1;
    transform: perspective(500px) rotateY(8deg);
  }
  80% {
    transform: perspective(500px) rotateY(-4deg);
  }
  100% {
    transform: perspective(500px) rotateY(0);
  }
}
/* 15 · Focus Pull ------------------------------------------ */
.sds-focus-pull {
  animation: sds-focusPull var(--sds-duration) ease both;
  display: inline-block;
}
@keyframes sds-focusPull {
  0% {
    opacity: 0;
    filter: blur(12px) contrast(0.5) brightness(1.5);
    transform: scale(1.08);
  }
  70% {
    opacity: 1;
    filter: blur(1px) contrast(1.1);
    transform: scale(1.01);
  }
  100% {
    opacity: 1;
    filter: blur(0) contrast(1);
    transform: scale(1);
  }
}
/* 16 · Gradient Sweep -------------------------------------- */
.sds-gradient-sweep {
  background: linear-gradient(
    90deg,
    var(--sds-primary),
    var(--sds-accent),
    var(--sds-primary)
  );
  background-size: 300% auto;
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
  animation: sds-gradSweep var(--sds-duration-dramatic, 3s) linear infinite;
}
@keyframes sds-gradSweep {
  0% {
    background-position: -200% center;
  }
  100% {
    background-position: 300% center;
  }
}
/* 17 · Depth Warp ------------------------------------------ */
.sds-depth-warp {
  animation: sds-depthWarp var(--sds-duration) var(--sds-easing) both;
  display: inline-block;
}
@keyframes sds-depthWarp {
  0% {
    opacity: 0;
    transform: perspective(300px) translateZ(-120px) rotateX(15deg);
    filter: blur(6px);
  }
  65% {
    opacity: 1;
    transform: perspective(300px) translateZ(6px) rotateX(-2deg);
    filter: blur(0);
  }
  100% {
    opacity: 1;
    transform: perspective(300px) translateZ(0) rotateX(0);
  }
}
/* 18 · Typewriter Pro -------------------------------------- */
.sds-typewriter-pro {
  display: inline-block;
  overflow: hidden;
  white-space: nowrap;
  width: 0;
  max-width: -moz-max-content;
  max-width: max-content;
  animation:
    sds-typewriterPrem 2.5s steps(20) both,
    sds-cursorBlink var(--sds-duration-base, 0.8s) step-end infinite;
  border-right: 2px solid var(--sds-primary);
}
@keyframes sds-typewriterPrem {
  from {
    width: 0;
  }
  to {
    width: 100%;
  }
}
@keyframes sds-cursorBlink {
  0%,
  100% {
    border-color: var(--sds-primary);
  }
  50% {
    border-color: transparent;
  }
}
/* 19 · Highlight Burn -------------------------------------- */
.sds-highlight-burn {
  background: linear-gradient(transparent 60%, var(--sds-primary-dim) 60%);
  background-size: 0% 100%;
  background-repeat: no-repeat;
  animation: sds-highlightBurn var(--sds-duration) var(--sds-easing) both;
  display: inline;
}
@keyframes sds-highlightBurn {
  from {
    background-size: 0% 100%;
  }
  to {
    background-size: 100% 100%;
  }
}
/* 20 · Shatter In ------------------------------------------ */
.sds-shatter-in {
  animation: sds-shatterIn var(--sds-duration) var(--sds-easing) both;
  display: inline-block;
}
@keyframes sds-shatterIn {
  0% {
    opacity: 0;
    transform: scale(2.5) rotate(8deg);
    filter: blur(20px);
  }
  50% {
    opacity: 0.8;
    transform: scale(1.05) rotate(-1deg);
    filter: blur(1px);
  }
  100% {
    opacity: 1;
    transform: scale(1) rotate(0);
    filter: blur(0);
  }
}
/* 21 · Film Burn ------------------------------------------- */
.sds-film-burn {
  will-change: filter, opacity;
  animation: sds-phantomBlur 1.2s ease both;
  display: inline-block;
  filter: sepia(0.2) contrast(1.1);
}
/* 22 · Prism Split ----------------------------------------- */
/*   Full-spectrum rainbow chromatic dispersion loop           */
.sds-prism-split {
  animation: sds-prismSplit 2s cubic-bezier(0.25, 1, 0.5, 1) infinite;
  display: inline-block;
}
@keyframes sds-prismSplit {
  0%,
  100% {
    text-shadow:
      0px 0 rgba(255, 0, 0, 0),
      0px 0 rgba(255, 127, 0, 0),
      0px 0 rgba(255, 255, 0, 0),
      0px 0 rgba(0, 255, 0, 0),
      0px 0 rgba(0, 0, 255, 0),
      0px 0 rgba(75, 0, 130, 0),
      0px 0 rgba(148, 0, 211, 0);
    letter-spacing: normal;
    transform: scale(1);
  }
  50% {
    text-shadow:
      -5.5px 0 1px rgba(255, 0, 0, 0.85),
      -3.5px 0 1px rgba(255, 127, 0, 0.85),
      -1.5px 0 1px rgba(255, 255, 0, 0.85),
      0px 0 1px rgba(0, 255, 0, 0.85),
      1.5px 0 1px rgba(0, 0, 255, 0.85),
      3.5px 0 1px rgba(75, 0, 130, 0.85),
      5.5px 0 1px rgba(148, 0, 211, 0.85);
    letter-spacing: 0.06em;
    transform: scale(1.025);
  }
}
/* 23 · Weight Drop ----------------------------------------- */
.sds-weight-drop {
  animation: sds-gravityDrop 1.2s var(--sds-ease-accelerate, cubic-bezier(0.6, -0.28, 0.74, 0.05)) both;
  display: inline-block;
}
/* 24 · Smoke Reveal ---------------------------------------- */
.sds-smoke-reveal {
  will-change: transform, filter, opacity;
  animation: sds-focusPull 1.6s ease both;
  display: inline-block;
  filter: blur(0);
}
/* 25 · Arc Orbit stagger (up to 12 children) --------------- */
.sds-arc-orbit > * {
  display: inline-block;
  animation: sds-charOrbit var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
.sds-arc-orbit > *:nth-child(1) {
  animation-delay: 0s;
}
.sds-arc-orbit > *:nth-child(2) {
  animation-delay: 0.08s;
}
.sds-arc-orbit > *:nth-child(3) {
  animation-delay: 0.16s;
}
.sds-arc-orbit > *:nth-child(4) {
  animation-delay: 0.24s;
}
.sds-arc-orbit > *:nth-child(5) {
  animation-delay: 0.32s;
}
.sds-arc-orbit > *:nth-child(6) {
  animation-delay: 0.4s;
}
.sds-arc-orbit > *:nth-child(7) {
  animation-delay: 0.48s;
}
.sds-arc-orbit > *:nth-child(8) {
  animation-delay: 0.56s;
}
.sds-arc-orbit > *:nth-child(9) {
  animation-delay: 0.64s;
}
.sds-arc-orbit > *:nth-child(10) {
  animation-delay: 0.72s;
}
.sds-arc-orbit > *:nth-child(11) {
  animation-delay: 0.8s;
}
.sds-arc-orbit > *:nth-child(12) {
  animation-delay: 0.88s;
}
/* 26 · Depth Charge ---------------------------------------- */
.sds-depth-charge {
  animation: sds-depthWarp var(--sds-duration-slow, 1.4s) ease 0.2s both;
  display: inline-block;
}
/* 27 · Signal Wave (up to 12 children) --------------------- */
.sds-signal-wave > * {
  display: inline-block;
  animation: sds-kineticWave 2s ease infinite;
}
.sds-signal-wave > *:nth-child(1) {
  animation-delay: 0s;
}
.sds-signal-wave > *:nth-child(2) {
  animation-delay: 0.14s;
}
.sds-signal-wave > *:nth-child(3) {
  animation-delay: 0.28s;
}
.sds-signal-wave > *:nth-child(4) {
  animation-delay: 0.42s;
}
.sds-signal-wave > *:nth-child(5) {
  animation-delay: 0.56s;
}
.sds-signal-wave > *:nth-child(6) {
  animation-delay: 0.7s;
}
.sds-signal-wave > *:nth-child(7) {
  animation-delay: 0.84s;
}
.sds-signal-wave > *:nth-child(8) {
  animation-delay: 0.98s;
}
.sds-signal-wave > *:nth-child(9) {
  animation-delay: 1.12s;
}
.sds-signal-wave > *:nth-child(10) {
  animation-delay: 1.26s;
}
.sds-signal-wave > *:nth-child(11) {
  animation-delay: 1.4s;
}
.sds-signal-wave > *:nth-child(12) {
  animation-delay: 1.54s;
}
/* 28 · Glitch Flicker -------------------------------------- */
.sds-glitch-flicker {
  animation: sds-glitchFlicker 2.5s linear infinite;
  display: inline-block;
}
@keyframes sds-glitchFlicker {
  0%,
  100% {
    transform: none;
    opacity: 1;
    text-shadow: none;
  }
  7% {
    transform: skewX(12deg);
    opacity: 0.8;
    text-shadow:
      -2px 0 var(--sds-accent),
      2px 0 var(--sds-primary);
  }
  10% {
    transform: none;
    opacity: 0.9;
  }
  15% {
    transform: translateY(-2px);
    opacity: 0.6;
  }
  20% {
    transform: none;
    opacity: 1;
    text-shadow: 2px -1px var(--sds-success);
  }
  45% {
    transform: skewY(1.5deg);
    opacity: 0.8;
  }
  50% {
    transform: none;
    opacity: 1;
    text-shadow: none;
  }
}
/* 29 · Velocity Blur Text ---------------------------------- */
.sds-velocity-blur-text {
  display: inline-block;
  animation: sds-velocityBlur 0.9s var(--sds-easing) both;
  will-change: transform, filter;
}
@keyframes sds-velocityBlur {
  0% {
    transform: translateX(-120px);
    filter: blur(24px) brightness(1.5);
    opacity: 0;
  }
  30% {
    transform: translateX(8px);
    filter: blur(8px) brightness(1.2);
    opacity: 1;
  }
  55% {
    transform: translateX(-4px);
    filter: blur(2px) brightness(1);
    opacity: 1;
  }
  70% {
    transform: translateX(2px);
    filter: blur(0);
    opacity: 1;
  }
  100% {
    transform: translateX(0);
    filter: blur(0);
    opacity: 1;
  }
}
/* 30 · Neon Pulse Text ------------------------------------- */
.sds-neon-pulse-text {
  animation:
    sds-neonPulseText 2s ease-in-out infinite,
    sds-neonFlickerText 6s linear infinite;
  will-change: text-shadow;
}
@keyframes sds-neonPulseText {
  0%,
  100% {
    text-shadow:
      0 0 4px var(--sds-primary-glow),
      0 0 12px var(--sds-primary-glow),
      0 0 28px var(--sds-primary-dim);
  }
  50% {
    text-shadow:
      0 0 8px var(--sds-primary),
      0 0 24px var(--sds-primary-glow),
      0 0 60px var(--sds-primary-glow),
      0 0 100px var(--sds-primary-dim);
  }
}
@keyframes sds-neonFlickerText {
  0%,
  19%,
  21%,
  23%,
  25%,
  54%,
  56%,
  100% {
    opacity: 1;
  }
  20%,
  24%,
  55% {
    opacity: 0.6;
  }
}
/* 31 · Morph Word ------------------------------------------ */
.sds-morph-word {
  display: inline-block;
  animation: sds-morphWord var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-morphWord {
  0%,
  100% {
    transform: scaleX(1);
    letter-spacing: 0;
  }
  25% {
    transform: scaleX(1.08) skewX(-4deg);
    letter-spacing: 0.06em;
  }
  50% {
    transform: scaleX(0.94) skewX(2deg);
    letter-spacing: -0.03em;
  }
  75% {
    transform: scaleX(1.04) skewX(-1deg);
    letter-spacing: 0.02em;
  }
}
/* 32 · Cipher Reveal --------------------------------------- */
.sds-cipher-reveal {
  display: inline-block;
  animation: sds-cipherReveal 1.6s var(--sds-easing) both;
}
@keyframes sds-cipherReveal {
  0% {
    opacity: 0;
    filter: brightness(3) blur(3px);
    color: var(--sds-primary);
    letter-spacing: 0.3em;
  }
  40% {
    opacity: 1;
    filter: brightness(1.6) blur(1px);
    color: var(--sds-primary);
    letter-spacing: 0.06em;
  }
  100% {
    opacity: 1;
    filter: brightness(1) blur(0);
    letter-spacing: 0;
  }
}
/* 33 · Levitate -------------------------------------------- */
.sds-levitate {
  display: inline-block;
  animation: sds-levitateText 2.8s ease-in-out infinite;
}
@keyframes sds-levitateText {
  0%,
  100% {
    transform: translateY(0) rotate(0deg);
  }
  30% {
    transform: translateY(-10px) rotate(0.5deg);
  }
  60% {
    transform: translateY(-6px) rotate(-0.3deg);
  }
}
/* 34 · Streak In ------------------------------------------- */
.sds-streak-in {
  display: inline-block;
  animation: sds-streakIn 0.7s cubic-bezier(0.25, 0.46, 0.45, 0.94) both;
}
@keyframes sds-streakIn {
  0% {
    opacity: 0;
    transform: translateX(-180px) scaleX(2.5);
    filter: blur(16px);
  }
  30% {
    opacity: 1;
    filter: blur(4px);
  }
  70% {
    transform: translateX(6px) scaleX(0.98);
    filter: blur(0);
  }
  100% {
    opacity: 1;
    transform: translateX(0) scaleX(1);
    filter: blur(0);
  }
}
/* 35 · Hologram Text --------------------------------------- */
.sds-hologram-text {
  display: inline-block;
  animation: sds-hologramText 4s linear infinite;
}
@keyframes sds-hologramText {
  0%,
  100% {
    opacity: 1;
    transform: none;
    filter: none;
  }
  4% {
    opacity: 0.7;
    transform: skewX(18deg) scaleY(0.98);
    filter: blur(0.5px) hue-rotate(60deg);
  }
  5% {
    opacity: 1;
    transform: none;
    filter: none;
  }
  35% {
    filter: hue-rotate(160deg) brightness(1.2);
  }
  36% {
    filter: none;
  }
  78% {
    opacity: 0.85;
    transform: skewX(-6deg);
    filter: blur(0.3px);
  }
  79% {
    opacity: 1;
    transform: none;
    filter: none;
  }
}
/* 36 · Aurora Text ----------------------------------------- */
.sds-aurora-text {
  background: linear-gradient(
    90deg,
    var(--sds-primary),
    #8b5cf6,
    var(--sds-accent),
    #06b6d4,
    #10b981,
    var(--sds-primary)
  );
  background-size: 500% auto;
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
  animation: sds-auroraFlow 5s linear infinite;
}
@keyframes sds-auroraFlow {
  0% {
    background-position: 0% center;
  }
  100% {
    background-position: 500% center;
  }
}
/* 37 · Elastic Bounce -------------------------------------- */
.sds-elastic-bounce {
  display: inline-block;
  will-change: transform;
  transform-origin: bottom center;
  animation: sds-elasticBounce 1s var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) both;
}
@keyframes sds-elasticBounce {
  0% {
    opacity: 0;
    transform: scaleY(0) translateY(24px);
  }
  50% {
    opacity: 1;
    transform: scaleY(1.12) translateY(-6px);
  }
  70% {
    transform: scaleY(0.94) translateY(2px);
  }
  85% {
    transform: scaleY(1.04) translateY(-1px);
  }
  100% {
    opacity: 1;
    transform: scaleY(1) translateY(0);
  }
}
/* 38 · Oscillate ------------------------------------------- */
.sds-oscillate {
  display: inline-block;
  animation: sds-oscillateText var(--sds-duration-slower, 2.2s) ease-in-out infinite;
}
@keyframes sds-oscillateText {
  0%,
  100% {
    transform: translateY(0) rotate(0) scaleX(1);
  }
  25% {
    transform: translateY(-8px) rotate(-1.2deg) scaleX(1.02);
  }
  75% {
    transform: translateY(8px) rotate(1.2deg) scaleX(0.98);
  }
}
/* 39 · Flicker On ------------------------------------------ */
.sds-flicker-on {
  display: inline-block;
  animation: sds-flickerOn 1.8s steps(1) both;
}
@keyframes sds-flickerOn {
  0% {
    opacity: 0;
  }
  8% {
    opacity: 0.6;
  }
  9% {
    opacity: 0;
  }
  18% {
    opacity: 0.9;
  }
  19% {
    opacity: 0;
  }
  28% {
    opacity: 1;
  }
  29% {
    opacity: 0.4;
  }
  38% {
    opacity: 1;
  }
  40% {
    opacity: 0.7;
  }
  50% {
    opacity: 1;
  }
  100% {
    opacity: 1;
  }
}
/* 40 · Magnetic Drift -------------------------------------- */
.sds-magnetic-drift {
  display: inline-block;
  animation: sds-magnetDrift 4s ease-in-out infinite;
}
@keyframes sds-magnetDrift {
  0%,
  100% {
    transform: translate(0, 0);
  }
  20% {
    transform: translate(4px, -3px);
  }
  40% {
    transform: translate(-3px, 2px);
  }
  60% {
    transform: translate(2px, 4px);
  }
  80% {
    transform: translate(-4px, -1px);
  }
}
/* 41 · Data Stream ----------------------------------------- */
.sds-data-stream {
  display: inline-block;
  animation: sds-dataStream 1s var(--sds-easing) both;
}
@keyframes sds-dataStream {
  0% {
    clip-path: inset(0 0 100% 0);
    transform: translateY(10px);
    filter: brightness(2);
    opacity: 0;
  }
  45% {
    clip-path: inset(0 0 0% 0);
    filter: brightness(1.4);
    opacity: 1;
    transform: translateY(-2px);
  }
  100% {
    clip-path: inset(0 0 0% 0);
    filter: brightness(1);
    transform: translateY(0);
  }
}
/* 42 · Chromatic Shift ------------------------------------- */
.sds-chromatic-shift {
  display: inline-block;
  animation: sds-chromaticShift 5s linear infinite;
}
@keyframes sds-chromaticShift {
  0% {
    filter: hue-rotate(0deg) saturate(1);
  }
  25% {
    filter: hue-rotate(90deg) saturate(1.4);
  }
  50% {
    filter: hue-rotate(180deg) saturate(1);
  }
  75% {
    filter: hue-rotate(270deg) saturate(1.4);
  }
  100% {
    filter: hue-rotate(360deg) saturate(1);
  }
}
/* 43 · Ripple Text ----------------------------------------- */
.sds-ripple-text {
  display: inline-block;
  animation: sds-rippleText 1.2s var(--sds-easing) both;
}
@keyframes sds-rippleText {
  0% {
    letter-spacing: -0.18em;
    opacity: 0;
    transform: scale(0.65);
    filter: blur(8px);
  }
  50% {
    letter-spacing: 0.08em;
    opacity: 1;
    transform: scale(1.04);
    filter: blur(0);
  }
  100% {
    letter-spacing: 0;
    opacity: 1;
    transform: scale(1);
  }
}
/* 44 · Stagger Chars (up to 12 children) ------------------- */
.sds-stagger-chars > * {
  display: inline-block;
  animation: sds-staggerChar 0.5s var(--sds-easing) both;
}
.sds-stagger-chars > *:nth-child(1) {
  animation-delay: 0s;
}
.sds-stagger-chars > *:nth-child(2) {
  animation-delay: 0.06s;
}
.sds-stagger-chars > *:nth-child(3) {
  animation-delay: 0.12s;
}
.sds-stagger-chars > *:nth-child(4) {
  animation-delay: 0.18s;
}
.sds-stagger-chars > *:nth-child(5) {
  animation-delay: 0.24s;
}
.sds-stagger-chars > *:nth-child(6) {
  animation-delay: 0.3s;
}
.sds-stagger-chars > *:nth-child(7) {
  animation-delay: 0.36s;
}
.sds-stagger-chars > *:nth-child(8) {
  animation-delay: 0.42s;
}
.sds-stagger-chars > *:nth-child(9) {
  animation-delay: 0.48s;
}
.sds-stagger-chars > *:nth-child(10) {
  animation-delay: 0.54s;
}
.sds-stagger-chars > *:nth-child(11) {
  animation-delay: 0.6s;
}
.sds-stagger-chars > *:nth-child(12) {
  animation-delay: 0.66s;
}
@keyframes sds-staggerChar {
  from {
    opacity: 0;
    transform: translateY(20px) skewY(6deg) scaleY(0.8);
  }
  to {
    opacity: 1;
    transform: translateY(0) skewY(0) scaleY(1);
  }
}
/* 45 · Word Blur In ---------------------------------------- */
.sds-word-blur-in {
  display: inline-block;
  animation: sds-wordBlurIn 1.1s ease both;
}
@keyframes sds-wordBlurIn {
  0% {
    opacity: 0;
    filter: blur(22px);
    transform: scale(1.12);
  }
  55% {
    opacity: 1;
    filter: blur(3px);
    transform: scale(1.02);
  }
  100% {
    opacity: 1;
    filter: blur(0);
    transform: scale(1);
  }
}
/* 46 · Split Reveal ---------------------------------------- */
.sds-split-reveal {
  display: inline-block;
  animation: sds-splitReveal 0.9s var(--sds-easing) both;
}
@keyframes sds-splitReveal {
  0% {
    clip-path: polygon(50% 0%, 50% 0%, 50% 100%, 50% 100%);
    opacity: 0;
  }
  50% {
    clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%);
    opacity: 1;
    transform: scaleX(1.03);
  }
  100% {
    clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%);
    opacity: 1;
    transform: scaleX(1);
  }
}
/* 47 · Bounce In Up ---------------------------------------- */
.sds-bounce-in-up {
  display: inline-block;
  animation: sds-bounceInUp 0.85s var(--sds-ease-emphasized, cubic-bezier(0.215, 0.61, 0.355, 1)) both;
}
@keyframes sds-bounceInUp {
  0% {
    opacity: 0;
    transform: translateY(56px);
  }
  55% {
    opacity: 1;
    transform: translateY(-12px);
  }
  72% {
    transform: translateY(5px);
  }
  85% {
    transform: translateY(-3px);
  }
  100% {
    opacity: 1;
    transform: translateY(0);
  }
}
/* 48 · Cinema Title ---------------------------------------- */
.sds-cinema-title {
  display: inline-block;
  animation: sds-cinematicTitle var(--sds-duration-slow, 1.4s) var(--sds-easing) both;
}
@keyframes sds-cinematicTitle {
  0% {
    opacity: 0;
    letter-spacing: 0.45em;
    transform: scale(0.82);
    filter: blur(14px);
  }
  55% {
    opacity: 1;
    letter-spacing: -0.01em;
    filter: blur(0);
    transform: scale(1.01);
  }
  100% {
    opacity: 1;
    letter-spacing: 0;
    transform: scale(1);
  }
}
/* 49 · Heat Shimmer ---------------------------------------- */
.sds-heat-shimmer {
  display: inline-block;
  animation: sds-heatShimmer 2.6s ease-in-out infinite;
}
@keyframes sds-heatShimmer {
  0%,
  100% {
    transform: skewX(0deg) scaleY(1);
    filter: blur(0);
  }
  20% {
    transform: skewX(1.8deg) scaleY(1.012);
    filter: blur(0.4px);
  }
  45% {
    transform: skewX(-1.2deg) scaleY(0.989);
    filter: blur(0.6px);
  }
  70% {
    transform: skewX(0.9deg) scaleY(1.008);
    filter: blur(0.3px);
  }
}
/* 50 · Unfurl ---------------------------------------------- */
.sds-unfurl {
  display: inline-block;
  will-change: transform, opacity;
  transform-origin: left center;
  animation: sds-unfurlText 1s var(--sds-easing) both;
}
@keyframes sds-unfurlText {
  0% {
    clip-path: inset(0 100% 0 0 round 2px);
    transform: scaleX(0.4) rotate(-1.5deg);
    opacity: 0;
  }
  50% {
    clip-path: inset(0 0% 0 0 round 2px);
    transform: scaleX(1.04) rotate(0.4deg);
    opacity: 1;
  }
  100% {
    clip-path: inset(0 0% 0 0 round 2px);
    transform: scaleX(1) rotate(0);
    opacity: 1;
  }
}
/* ─── PART A: 5 CSS-ONLY PHYSICS ANIMATIONS ─────────────────
   These use .sds-char children with --i CSS counter variable.
   Developer wraps chars in <span class="sds-char" style="--i:N">
   ─────────────────────────────────────────────────────────── */
/* 51 · Gravity Bounce -------------------------------------- */
.sds-gravity-bounce {
  display: inline-block;
  animation: sds-gravityBounce 1.2s var(--sds-ease-emphasized, cubic-bezier(0.215, 0.61, 0.355, 1)) both;
}
@keyframes sds-gravityBounce {
  0% {
    opacity: 0;
    transform: translateY(-160px) scaleY(0.6);
  }
  38% {
    opacity: 1;
    transform: translateY(0) scaleY(0.8) scaleX(1.2);
  }
  55% {
    transform: translateY(-40px) scaleY(1.05) scaleX(0.97);
  }
  72% {
    transform: translateY(0) scaleY(0.88) scaleX(1.1);
  }
  84% {
    transform: translateY(-14px) scaleY(1.02) scaleX(0.99);
  }
  93% {
    transform: translateY(0) scaleY(0.94) scaleX(1.05);
  }
  100% {
    opacity: 1;
    transform: translateY(0) scaleY(1) scaleX(1);
  }
}
/* 52 · Drop Settle (parent + .sds-char children) ------------ */
.sds-drop-settle .sds-char {
  display: inline-block;
  animation: sds-dropSettle 0.65s var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) both;
  animation-delay: calc(var(--i, 0) * 0.05s);
}
@keyframes sds-dropSettle {
  0% {
    opacity: 0;
    transform: translateY(-80px) scaleY(0.5);
  }
  60% {
    opacity: 1;
    transform: translateY(6px) scaleY(1.04);
  }
  80% {
    transform: translateY(-2px) scaleY(0.98);
  }
  100% {
    opacity: 1;
    transform: translateY(0) scaleY(1);
  }
}
/* 53 · Wave Cascade (parent + .sds-char children) ----------- */
.sds-wave-cascade .sds-char {
  display: inline-block;
  animation: sds-waveCascade var(--sds-duration-slow, 1.4s) ease-in-out infinite;
  animation-delay: calc(var(--i, 0) * 0.07s);
}
@keyframes sds-waveCascade {
  0%,
  100% {
    transform: translateY(0);
  }
  30% {
    transform: translateY(-12px) scaleY(1.05);
  }
  60% {
    transform: translateY(4px) scaleY(0.96);
  }
}
/* 54 · Center Burst (parent + .sds-char children) ----------- */
.sds-center-burst .sds-char {
  display: inline-block;
  animation: sds-centerBurst 0.75s var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) both;
  animation-delay: calc(var(--i, 0) * 0.04s);
}
@keyframes sds-centerBurst {
  0% {
    opacity: 0;
    transform: translateX(calc(var(--burst, 0) * -1px)) scale(0.3);
    filter: blur(4px);
  }
  65% {
    opacity: 1;
    transform: translateX(0) scale(1.06);
    filter: blur(0);
  }
  100% {
    opacity: 1;
    transform: translateX(0) scale(1);
  }
}
/* 55 · Explode Formation (parent + .sds-char children) ------ */
.sds-explode-formation .sds-char {
  display: inline-block;
  animation: sds-explodeFormation 0.9s var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) both;
  animation-delay: calc(var(--i, 0) * 0.06s);
}
@keyframes sds-explodeFormation {
  0% {
    opacity: 0;
    transform: translate(var(--dx, 0px), var(--dy, 0px)) rotate(var(--dr, 0deg))
      scale(0.4);
    filter: blur(6px);
  }
  65% {
    opacity: 1;
    transform: translate(0, 0) rotate(0deg) scale(1.06);
    filter: blur(0);
  }
  100% {
    opacity: 1;
    transform: translate(0, 0) rotate(0) scale(1);
  }
}
/* ─── PART B: 45 NEW UNIQUE CSS TEXT ANIMATIONS ───────────── */
/* 56 · Fold Down (3D fold from above, origin top) ----------- */
.sds-fold-down {
  display: inline-block;
  transform-origin: top center;
  animation: sds-foldDown var(--sds-duration) var(--sds-easing) both;
}
@keyframes sds-foldDown {
  0% {
    opacity: 0;
    transform: perspective(400px) rotateX(-90deg) scaleY(0.5);
  }
  55% {
    opacity: 1;
    transform: perspective(400px) rotateX(8deg) scaleY(1.02);
  }
  80% {
    transform: perspective(400px) rotateX(-3deg) scaleY(0.99);
  }
  100% {
    opacity: 1;
    transform: perspective(400px) rotateX(0) scaleY(1);
  }
}
/* 57 · Fold Up (3D fold from below, origin bottom) ---------- */
.sds-fold-up {
  display: inline-block;
  transform-origin: bottom center;
  animation: sds-foldUp var(--sds-duration) var(--sds-easing) both;
}
@keyframes sds-foldUp {
  0% {
    opacity: 0;
    transform: perspective(400px) rotateX(90deg) scaleY(0.5);
  }
  55% {
    opacity: 1;
    transform: perspective(400px) rotateX(-8deg) scaleY(1.02);
  }
  80% {
    transform: perspective(400px) rotateX(3deg) scaleY(0.99);
  }
  100% {
    opacity: 1;
    transform: perspective(400px) rotateX(0) scaleY(1);
  }
}
/* 58 · Flip X (180° horizontal axis flip entrance) ---------- */
.sds-flip-x {
  display: inline-block;
  backface-visibility: hidden;
  animation: sds-flipX var(--sds-duration) var(--sds-easing) both;
}
@keyframes sds-flipX {
  0% {
    opacity: 0;
    transform: perspective(400px) rotateX(-180deg) scaleY(0.6);
  }
  60% {
    opacity: 1;
    transform: perspective(400px) rotateX(10deg) scaleY(1.04);
  }
  80% {
    transform: perspective(400px) rotateX(-4deg) scaleY(0.98);
  }
  100% {
    opacity: 1;
    transform: perspective(400px) rotateX(0) scaleY(1);
  }
}
/* 59 · Flip Y (180° vertical axis flip entrance) ------------ */
.sds-flip-y {
  display: inline-block;
  backface-visibility: hidden;
  animation: sds-flipY var(--sds-duration) var(--sds-easing) both;
}
@keyframes sds-flipY {
  0% {
    opacity: 0;
    transform: perspective(400px) rotateY(-180deg) scaleX(0.6);
  }
  60% {
    opacity: 1;
    transform: perspective(400px) rotateY(10deg) scaleX(1.04);
  }
  80% {
    transform: perspective(400px) rotateY(-4deg) scaleX(0.98);
  }
  100% {
    opacity: 1;
    transform: perspective(400px) rotateY(0) scaleX(1);
  }
}
/* 60 · Door Open (rotateY from left edge, hinged entrance) -- */
.sds-door-open {
  display: inline-block;
  transform-origin: left center;
  backface-visibility: hidden;
  animation: sds-doorOpen var(--sds-duration) var(--sds-easing) both;
}
@keyframes sds-doorOpen {
  0% {
    opacity: 0;
    transform: perspective(600px) rotateY(-90deg);
  }
  55% {
    opacity: 1;
    transform: perspective(600px) rotateY(6deg);
  }
  75% {
    transform: perspective(600px) rotateY(-2deg);
  }
  100% {
    opacity: 1;
    transform: perspective(600px) rotateY(0);
  }
}
/* 61 · Zoom Punch (scale 0.2→1.12→1 spring) ---------------- */
.sds-zoom-punch {
  display: inline-block;
  animation: sds-zoomPunch 0.7s var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) both;
}
@keyframes sds-zoomPunch {
  0% {
    opacity: 0;
    transform: scale(0.2);
    filter: blur(8px);
  }
  60% {
    opacity: 1;
    transform: scale(1.12);
    filter: blur(0);
  }
  78% {
    transform: scale(0.96);
  }
  90% {
    transform: scale(1.04);
  }
  100% {
    opacity: 1;
    transform: scale(1);
  }
}
/* 62 · Zoom Far (scale 2→1 with blur — coming from distance) */
.sds-zoom-out-in {
  display: inline-block;
  animation: sds-zoomFar 0.9s var(--sds-ease-decelerate, cubic-bezier(0.16, 1, 0.3, 1)) both;
}
@keyframes sds-zoomFar {
  0% {
    opacity: 0;
    transform: scale(2.2);
    filter: blur(20px) brightness(1.5);
  }
  45% {
    opacity: 1;
    filter: blur(4px) brightness(1.1);
    transform: scale(1.08);
  }
  100% {
    opacity: 1;
    transform: scale(1);
    filter: blur(0) brightness(1);
  }
}
/* 63 · Vapor Rise (translateY + blur + scale, ghostly rise) - */
.sds-vapor-rise {
  display: inline-block;
  animation: sds-vaporRise 1.2s var(--sds-ease-decelerate, cubic-bezier(0.16, 1, 0.3, 1)) both;
}
@keyframes sds-vaporRise {
  0% {
    opacity: 0;
    transform: translateY(40px) scale(0.8);
    filter: blur(16px) brightness(2) saturate(0.4);
  }
  40% {
    opacity: 1;
    filter: blur(4px) brightness(1.2);
  }
  100% {
    opacity: 1;
    transform: translateY(0) scale(1);
    filter: blur(0) brightness(1) saturate(1);
  }
}
/* 64 · Light Speed (translateX + multi-step skewX entrance) - */
.sds-light-speed {
  display: inline-block;
  animation: sds-lightSpeed 0.6s ease-out both;
}
@keyframes sds-lightSpeed {
  0% {
    opacity: 0;
    transform: translateX(-200%) skewX(-30deg);
  }
  20% {
    transform: translateX(0) skewX(20deg);
    opacity: 1;
  }
  40% {
    transform: translateX(0) skewX(-8deg);
  }
  60% {
    transform: translateX(0) skewX(5deg);
  }
  80% {
    transform: translateX(0) skewX(-2deg);
  }
  100% {
    opacity: 1;
    transform: translateX(0) skewX(0);
  }
}
/* 65 · Roll In (translateX + full rotation, rolls into place) */
.sds-roll-in {
  display: inline-block;
  animation: sds-rollIn var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-rollIn {
  0% {
    opacity: 0;
    transform: translateX(-120px) rotate(-360deg) scale(0.4);
  }
  60% {
    opacity: 1;
    transform: translateX(4px) rotate(8deg) scale(1.02);
  }
  80% {
    transform: translateX(-2px) rotate(-3deg);
  }
  100% {
    opacity: 1;
    transform: translateX(0) rotate(0) scale(1);
  }
}
/* 66 · Swing In (rotateX from top origin, pendular swing) --- */
.sds-swing-in {
  display: inline-block;
  transform-origin: top center;
  animation: sds-swingIn 0.9s var(--sds-easing) both;
}
@keyframes sds-swingIn {
  0% {
    opacity: 0;
    transform: perspective(400px) rotateX(-80deg);
  }
  45% {
    opacity: 1;
    transform: perspective(400px) rotateX(12deg);
  }
  65% {
    transform: perspective(400px) rotateX(-6deg);
  }
  80% {
    transform: perspective(400px) rotateX(4deg);
  }
  100% {
    opacity: 1;
    transform: perspective(400px) rotateX(0);
  }
}
/* 67 · Skew Slide (translateX + skewX — arrives at an angle) */
.sds-skew-slide {
  display: inline-block;
  animation: sds-skewSlide 0.75s var(--sds-ease-decelerate, cubic-bezier(0.16, 1, 0.3, 1)) both;
}
@keyframes sds-skewSlide {
  0% {
    opacity: 0;
    transform: translateX(-80px) skewX(20deg);
  }
  60% {
    opacity: 1;
    transform: translateX(4px) skewX(-4deg);
  }
  80% {
    transform: translateX(-2px) skewX(2deg);
  }
  100% {
    opacity: 1;
    transform: translateX(0) skewX(0);
  }
}
/* 68 · Pop In (scale 0 → spring overshoot, punchy entrance) - */
.sds-pop-in {
  display: inline-block;
  animation: sds-popIn 0.6s var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) both;
}
@keyframes sds-popIn {
  0% {
    opacity: 0;
    transform: scale(0) rotate(-4deg);
  }
  55% {
    opacity: 1;
    transform: scale(1.18) rotate(2deg);
  }
  72% {
    transform: scale(0.93) rotate(-1deg);
  }
  86% {
    transform: scale(1.06) rotate(0.5deg);
  }
  100% {
    opacity: 1;
    transform: scale(1) rotate(0);
  }
}
/* 69 · Tracking Expand (compressed spacing → normal) -------- */
.sds-tracking-expand {
  display: inline-block;
  animation: sds-trackingExpand 0.9s var(--sds-easing) both;
}
@keyframes sds-trackingExpand {
  0% {
    opacity: 0;
    letter-spacing: -0.5em;
    transform: scaleX(0.4);
  }
  55% {
    opacity: 1;
    letter-spacing: 0.04em;
    transform: scaleX(1.02);
  }
  100% {
    opacity: 1;
    letter-spacing: 0;
    transform: scaleX(1);
  }
}
/* 70 · Tracking Contract (wide spacing collapses inward) ---- */
.sds-tracking-contract {
  display: inline-block;
  animation: sds-trackingContract 1s var(--sds-easing) both;
}
@keyframes sds-trackingContract {
  0% {
    opacity: 0;
    letter-spacing: 0.7em;
    filter: blur(10px);
    transform: scaleX(1.6);
  }
  55% {
    opacity: 1;
    letter-spacing: -0.02em;
    filter: blur(0);
    transform: scaleX(0.98);
  }
  100% {
    opacity: 1;
    letter-spacing: 0;
    transform: scaleX(1);
  }
}
/* 71 · Blur Focus (blur + letter-spacing → sharp focus) ----- */
.sds-blur-focus {
  display: inline-block;
  animation: sds-blurFocus 1.1s ease both;
}
@keyframes sds-blurFocus {
  0% {
    filter: blur(20px) contrast(0.5);
    letter-spacing: 0.25em;
    transform: scaleY(1.12);
    opacity: 0;
  }
  50% {
    filter: blur(5px) contrast(0.8);
    letter-spacing: 0.06em;
    opacity: 1;
  }
  100% {
    filter: blur(0) contrast(1);
    letter-spacing: 0;
    transform: scaleY(1);
    opacity: 1;
  }
}
/* 72 · Wipe Right (polygon clip expands left→right + skewY) - */
.sds-wipe-right {
  display: inline-block;
  animation: sds-wipeRight var(--sds-duration) var(--sds-easing) both;
}
@keyframes sds-wipeRight {
  0% {
    clip-path: polygon(0 0, 0 0, 0 100%, 0 100%);
    transform: skewY(-3deg) scaleX(0.85);
    opacity: 0;
  }
  55% {
    clip-path: polygon(0 0, 105% 0, 105% 100%, 0 100%);
    transform: skewY(1deg) scaleX(1.02);
    opacity: 1;
  }
  100% {
    clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
    transform: skewY(0) scaleX(1);
    opacity: 1;
  }
}
/* 73 · Wipe Left (polygon clip expands right→left + skewY) -- */
.sds-wipe-left {
  display: inline-block;
  animation: sds-wipeLeft var(--sds-duration) var(--sds-easing) both;
}
@keyframes sds-wipeLeft {
  0% {
    clip-path: polygon(100% 0, 100% 0, 100% 100%, 100% 100%);
    transform: skewY(3deg) scaleX(0.85);
    opacity: 0;
  }
  55% {
    clip-path: polygon(-5% 0, 100% 0, 100% 100%, -5% 100%);
    transform: skewY(-1deg) scaleX(1.02);
    opacity: 1;
  }
  100% {
    clip-path: polygon(0% 0, 100% 0, 100% 100%, 0% 100%);
    transform: skewY(0) scaleX(1);
    opacity: 1;
  }
}
/* 74 · Reveal Up (polygon mask slides up, scaleX settle) ---- */
.sds-reveal-up-mask {
  display: inline-block;
  overflow: hidden;
  animation: sds-revealUp var(--sds-duration) var(--sds-easing) both;
}
@keyframes sds-revealUp {
  0% {
    clip-path: polygon(0 100%, 100% 100%, 100% 100%, 0 100%);
    transform: scaleX(0.9) translateY(8px);
    opacity: 0;
  }
  55% {
    clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
    transform: scaleX(1.02) translateY(-2px);
    opacity: 1;
  }
  100% {
    clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
    transform: scaleX(1) translateY(0);
    opacity: 1;
  }
}
/* 75 · Reveal Down (polygon mask slides down, rotate settle) - */
.sds-reveal-down-mask {
  display: inline-block;
  overflow: hidden;
  animation: sds-revealDown var(--sds-duration) var(--sds-easing) both;
}
@keyframes sds-revealDown {
  0% {
    clip-path: polygon(0 0, 100% 0, 100% 0, 0 0);
    transform: scaleX(0.9) translateY(-8px) rotate(-1.5deg);
    opacity: 0;
  }
  55% {
    clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
    transform: scaleX(1.02) translateY(2px) rotate(0.5deg);
    opacity: 1;
  }
  100% {
    clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
    transform: scaleX(1) translateY(0) rotate(0);
    opacity: 1;
  }
}
/* 76 · Iris Open (circle clip-path grows from center) ------- */
.sds-iris-open {
  display: inline-block;
  animation: sds-irisOpen 0.9s var(--sds-easing) both;
}
@keyframes sds-irisOpen {
  0% {
    clip-path: circle(0% at 50% 50%);
    transform: scale(0.85);
    opacity: 0;
  }
  55% {
    clip-path: circle(65% at 50% 50%);
    transform: scale(1.04);
    opacity: 1;
  }
  75% {
    clip-path: circle(72% at 50% 50%);
    transform: scale(0.98);
  }
  100% {
    clip-path: circle(75% at 50% 50%);
    transform: scale(1);
    opacity: 1;
  }
}
/* 77 · Shimmer Sweep (gradient bg sweep over branded colors) - */
.sds-shimmer-sweep {
  background:
    linear-gradient(
      105deg,
      transparent 40%,
      rgba(255, 255, 255, 0.55) 50%,
      transparent 60%
    ),
    linear-gradient(
      135deg,
      var(--sds-primary) 0%,
      #8b5cf6 50%,
      var(--sds-accent) 100%
    );
  background-size:
    300% 100%,
    100% 100%;
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
  animation: sds-shimmerSweep var(--sds-duration-slower, 2.2s) ease-in-out infinite;
}
@keyframes sds-shimmerSweep {
  0% {
    background-position:
      -200% center,
      center;
  }
  100% {
    background-position:
      300% center,
      center;
  }
}
/* 78 · Color Cycle (hue-rotating gradient, background-clip) -- */
.sds-color-cycle {
  background: linear-gradient(
    90deg,
    var(--sds-primary),
    #8b5cf6,
    var(--sds-accent),
    #06b6d4,
    #10b981,
    var(--sds-primary)
  );
  background-size: 400% auto;
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
  animation: sds-colorCycle 4s linear infinite;
}
@keyframes sds-colorCycle {
  0% {
    filter: hue-rotate(0deg);
    background-position: 0% center;
  }
  50% {
    background-position: 200% center;
  }
  100% {
    filter: hue-rotate(360deg);
    background-position: 400% center;
  }
}
/* 79 · Glow Pulse (text-shadow expand + contract loop) ------- */
.sds-glow-pulse {
  animation: sds-glowPulse 2s ease-in-out infinite;
}
@keyframes sds-glowPulse {
  0%,
  100% {
    text-shadow:
      0 0 4px rgba(0, 21, 209, 0.3),
      0 0 8px rgba(0, 21, 209, 0.15);
    transform: scale(1);
  }
  50% {
    text-shadow:
      0 0 12px var(--sds-primary),
      0 0 28px var(--sds-primary-glow),
      0 0 56px var(--sds-primary-dim);
    transform: scale(1.03);
  }
}
/* 80 · Neon Flicker In (stepped opacity + glow entrance) ----- */
.sds-neon-flicker-in {
  display: inline-block;
  color: var(--sds-primary);
  animation: sds-neonFlickerIn 1.6s steps(1) both;
}
@keyframes sds-neonFlickerIn {
  0% {
    opacity: 0;
    text-shadow: none;
    transform: none;
  }
  5% {
    opacity: 0.6;
    text-shadow: 0 0 12px var(--sds-primary-glow);
  }
  6% {
    opacity: 0;
  }
  18% {
    opacity: 0.9;
    text-shadow: 0 0 16px var(--sds-primary-glow);
    transform: skewX(-2deg);
  }
  19% {
    opacity: 0.1;
  }
  32% {
    opacity: 1;
    text-shadow:
      0 0 24px var(--sds-primary-glow),
      0 0 48px var(--sds-primary-dim);
    transform: skewX(0);
  }
  38% {
    opacity: 0.7;
  }
  45% {
    opacity: 1;
    text-shadow: 0 0 12px var(--sds-primary-glow);
  }
  55% {
    opacity: 0.4;
  }
  100% {
    opacity: 1;
    text-shadow:
      0 0 8px var(--sds-primary-glow),
      0 0 20px var(--sds-primary-dim);
  }
}
/* 81 · Echo Out (layered offset text-shadow appear) --------- */
.sds-echo-out {
  display: inline-block;
  animation: sds-echoOut 1s var(--sds-easing) both;
}
@keyframes sds-echoOut {
  0% {
    opacity: 0;
    text-shadow: 0 0 0 rgba(0, 21, 209, 0);
    transform: scale(0.8);
  }
  30% {
    opacity: 1;
    text-shadow:
      4px 4px 0 rgba(0, 21, 209, 0.28),
      8px 8px 0 rgba(0, 21, 209, 0.14),
      12px 12px 0 rgba(0, 21, 209, 0.06);
    transform: scale(1.04);
  }
  100% {
    opacity: 1;
    text-shadow: 1px 1px 0 rgba(0, 21, 209, 0.08);
    transform: scale(1);
  }
}
/* 82 · Shadow Lift (float up + layered text-shadow grows) ---- */
.sds-shadow-lift {
  display: inline-block;
  animation: sds-shadowLift 1.6s ease-in-out infinite;
}
@keyframes sds-shadowLift {
  0%,
  100% {
    transform: translateY(0);
    text-shadow: 0 2px 4px rgba(0, 21, 209, 0.15);
  }
  50% {
    transform: translateY(-10px);
    text-shadow:
      0 18px 36px rgba(0, 21, 209, 0.28),
      0 8px 16px rgba(0, 21, 209, 0.15),
      0 2px 4px rgba(0, 21, 209, 0.08);
  }
}
/* 83 · Spotlight Text (cyclic brightness + blur radial) ------ */
.sds-spotlight {
  display: inline-block;
  animation: sds-spotlightText 2.4s ease-in-out infinite;
}
@keyframes sds-spotlightText {
  0%,
  100% {
    filter: brightness(0.55) blur(1.5px) saturate(0.6);
    transform: scale(0.97);
  }
  50% {
    filter: brightness(1.5) blur(0) saturate(1.3);
    transform: scale(1.04);
  }
}
/* 84 · Pixel In (blur + contrast step-based entrance) ------- */
.sds-pixel-in {
  display: inline-block;
  animation: sds-pixelIn var(--sds-duration-base, 0.8s) steps(5) both;
}
@keyframes sds-pixelIn {
  0% {
    opacity: 0;
    filter: blur(14px) contrast(0.2) brightness(2.5);
    transform: scale(1.25) rotate(-3deg);
  }
  25% {
    opacity: 1;
    filter: blur(8px) contrast(0.5) brightness(1.8);
    transform: scale(1.12);
  }
  50% {
    filter: blur(5px) contrast(0.7) brightness(1.4);
    transform: scale(1.06) rotate(1deg);
  }
  75% {
    filter: blur(2px) contrast(0.9) brightness(1.1);
    transform: scale(1.02);
  }
  100% {
    filter: blur(0) contrast(1) brightness(1);
    transform: scale(1) rotate(0);
    opacity: 1;
  }
}
/* 85 · Glitch Slide (translateX step displacement + clip) ---- */
.sds-glitch-slide {
  display: inline-block;
  animation: sds-glitchSlide var(--sds-duration-dramatic, 3s) steps(1) infinite;
}
@keyframes sds-glitchSlide {
  0%,
  100% {
    transform: translateX(0);
    clip-path: none;
    color: inherit;
  }
  5% {
    transform: translateX(-6px);
    clip-path: polygon(0 15%, 100% 15%, 100% 40%, 0 40%);
    color: var(--sds-accent);
  }
  6% {
    transform: translateX(4px);
    clip-path: none;
    color: inherit;
  }
  12% {
    transform: translateX(-3px);
    clip-path: polygon(0 60%, 100% 60%, 100% 85%, 0 85%);
  }
  13% {
    transform: translateX(0);
    clip-path: none;
  }
  35% {
    transform: translateX(3px) skewX(2deg);
  }
  36% {
    transform: translateX(0) skewX(0);
  }
}
/* 86 · Squash Stretch (scaleY compress → spring expand up) -- */
.sds-squash-stretch {
  display: inline-block;
  transform-origin: bottom center;
  animation: sds-squashStretch var(--sds-duration-base, 0.8s) var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) both;
}
@keyframes sds-squashStretch {
  0% {
    opacity: 0;
    transform: scaleY(0.15) scaleX(1.4);
  }
  30% {
    opacity: 1;
    transform: scaleY(1.35) scaleX(0.72);
  }
  50% {
    transform: scaleY(0.86) scaleX(1.1);
  }
  68% {
    transform: scaleY(1.08) scaleX(0.94);
  }
  82% {
    transform: scaleY(0.96) scaleX(1.03);
  }
  100% {
    opacity: 1;
    transform: scaleY(1) scaleX(1);
  }
}
/* 87 · Bounce Drop (multi-bounce drop from high above) ------- */
.sds-bounce-drop-in {
  display: inline-block;
  animation: sds-bounceDrop 1.1s var(--sds-ease-emphasized, cubic-bezier(0.215, 0.61, 0.355, 1)) both;
}
@keyframes sds-bounceDrop {
  0% {
    opacity: 0;
    transform: translateY(-120px);
  }
  38% {
    opacity: 1;
    transform: translateY(0) scaleY(0.88) scaleX(1.12);
  }
  52% {
    transform: translateY(-28px) scaleY(1.05) scaleX(0.96);
  }
  65% {
    transform: translateY(0) scaleY(0.92) scaleX(1.07);
  }
  77% {
    transform: translateY(-10px) scaleY(1.02) scaleX(0.99);
  }
  86% {
    transform: translateY(0) scaleY(0.97) scaleX(1.02);
  }
  100% {
    opacity: 1;
    transform: translateY(0) scaleY(1) scaleX(1);
  }
}
/* 88 · Slant Rise (translateY + rotate + skewX entrance) ---- */
.sds-slant-rise {
  display: inline-block;
  animation: sds-slantRise var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-slantRise {
  0% {
    opacity: 0;
    transform: translateY(40px) rotate(-8deg) skewX(8deg);
  }
  55% {
    opacity: 1;
    transform: translateY(-3px) rotate(1deg) skewX(-1deg);
  }
  75% {
    transform: translateY(1px) rotate(-0.5deg) skewX(0.5deg);
  }
  100% {
    opacity: 1;
    transform: translateY(0) rotate(0) skewX(0);
  }
}
/* 89 · Grand Entrance (translateY + scale + rotate + blur) -- */
.sds-grand-entrance {
  display: inline-block;
  animation: sds-grandEntrance var(--sds-duration-slow, 1.4s) var(--sds-easing) both;
}
@keyframes sds-grandEntrance {
  0% {
    opacity: 0;
    transform: translateY(80px) scale(0.3) rotate(-12deg);
    filter: blur(24px) brightness(2);
  }
  35% {
    opacity: 1;
    filter: blur(6px) brightness(1.4);
  }
  60% {
    transform: translateY(-6px) scale(1.08) rotate(2deg);
    filter: blur(0) brightness(1.1);
  }
  80% {
    transform: translateY(2px) scale(0.97) rotate(-0.5deg);
  }
  100% {
    opacity: 1;
    transform: translateY(0) scale(1) rotate(0);
    filter: blur(0) brightness(1);
  }
}
/* 90 · Slide Blur Left (enters from left with motion blur) -- */
.sds-slide-blur-left {
  display: inline-block;
  animation: sds-slideBlurLeft var(--sds-duration-base, 0.8s) var(--sds-ease-decelerate, cubic-bezier(0.16, 1, 0.3, 1)) both;
}
@keyframes sds-slideBlurLeft {
  0% {
    opacity: 0;
    transform: translateX(-80px) scaleX(1.2);
    filter: blur(16px);
  }
  45% {
    opacity: 1;
    filter: blur(4px);
    transform: translateX(4px) scaleX(0.98);
  }
  70% {
    filter: blur(0);
    transform: translateX(-2px) scaleX(1.01);
  }
  100% {
    opacity: 1;
    transform: translateX(0) scaleX(1);
    filter: blur(0);
  }
}
/* 91 · Slide Blur Right (enters from right with motion blur) */
.sds-slide-blur-right {
  display: inline-block;
  animation: sds-slideBlurRight var(--sds-duration-base, 0.8s) var(--sds-ease-decelerate, cubic-bezier(0.16, 1, 0.3, 1)) both;
}
@keyframes sds-slideBlurRight {
  0% {
    opacity: 0;
    transform: translateX(80px) scaleX(1.2);
    filter: blur(16px);
  }
  45% {
    opacity: 1;
    filter: blur(4px);
    transform: translateX(-4px) scaleX(0.98);
  }
  70% {
    filter: blur(0);
    transform: translateX(2px) scaleX(1.01);
  }
  100% {
    opacity: 1;
    transform: translateX(0) scaleX(1);
    filter: blur(0);
  }
}
/* 92 · Wobble (translateX + rotate oscillating loop) --------- */
.sds-wobble {
  display: inline-block;
  animation: sds-wobbleText 1.2s ease-in-out infinite;
}
@keyframes sds-wobbleText {
  0%,
  100% {
    transform: translateX(0) rotate(0);
  }
  15% {
    transform: translateX(-8px) rotate(-4deg);
  }
  30% {
    transform: translateX(6px) rotate(3deg);
  }
  45% {
    transform: translateX(-5px) rotate(-2deg);
  }
  60% {
    transform: translateX(4px) rotate(1.5deg);
  }
  75% {
    transform: translateX(-2px) rotate(-0.8deg);
  }
  90% {
    transform: translateX(1px) rotate(0.4deg);
  }
}
/* 93 · Rubber Band (rapid scaleX + scaleY spring stretch) ---- */
.sds-rubber-band {
  display: inline-block;
  animation: sds-rubberBand 1.1s ease infinite;
}
@keyframes sds-rubberBand {
  0%,
  100% {
    transform: scaleX(1) scaleY(1);
  }
  15% {
    transform: scaleX(1.32) scaleY(0.72);
  }
  30% {
    transform: scaleX(0.78) scaleY(1.24);
  }
  45% {
    transform: scaleX(1.16) scaleY(0.86);
  }
  60% {
    transform: scaleX(0.93) scaleY(1.07);
  }
  75% {
    transform: scaleX(1.07) scaleY(0.95);
  }
  90% {
    transform: scaleX(0.97) scaleY(1.02);
  }
}
/* 94 · Jello (skewX + skewY rapid decay loop) --------------- */
.sds-jello {
  display: inline-block;
  transform-origin: center;
  animation: sds-jelloText 1.2s ease infinite;
}
@keyframes sds-jelloText {
  0%,
  100% {
    transform: skewX(0) skewY(0);
  }
  12% {
    transform: skewX(-12deg) skewY(-3deg);
  }
  22% {
    transform: skewX(10deg) skewY(2deg);
  }
  32% {
    transform: skewX(-7deg) skewY(-1.5deg);
  }
  42% {
    transform: skewX(5deg) skewY(1deg);
  }
  52% {
    transform: skewX(-4deg) skewY(-0.6deg);
  }
  62% {
    transform: skewX(3deg) skewY(0.4deg);
  }
  72% {
    transform: skewX(-2deg) skewY(-0.2deg);
  }
  82% {
    transform: skewX(1deg) skewY(0.1deg);
  }
}
/* 95 · Tada (scale + rotate rapid attention-seeker) ---------- */
.sds-tada {
  display: inline-block;
  animation: sds-tadaText var(--sds-duration-slow, 1.4s) ease infinite;
}
@keyframes sds-tadaText {
  0%,
  100% {
    transform: scale(1) rotate(0);
  }
  10% {
    transform: scale(0.88) rotate(-3deg);
  }
  20% {
    transform: scale(1.16) rotate(-3deg);
  }
  30% {
    transform: scale(1.16) rotate(3deg);
  }
  40% {
    transform: scale(1.16) rotate(-3deg);
  }
  50% {
    transform: scale(1.16) rotate(3deg);
  }
  60% {
    transform: scale(1.16) rotate(-3deg);
  }
  70% {
    transform: scale(1.16) rotate(3deg);
  }
  80% {
    transform: scale(1.12) rotate(-2deg);
  }
  90% {
    transform: scale(1.06) rotate(1deg);
  }
}
/* 96 · Heartbeat Text (double-pulse scale loop) -------------- */
.sds-heartbeat-text {
  display: inline-block;
  animation: sds-heartbeatText var(--sds-duration-slow, 1.4s) ease-in-out infinite;
}
@keyframes sds-heartbeatText {
  0%,
  100% {
    transform: scale(1);
  }
  14% {
    transform: scale(1.16);
  }
  28% {
    transform: scale(0.96);
  }
  42% {
    transform: scale(1.12);
  }
  56% {
    transform: scale(1);
  }
}
/* 97 · Typing Caret (width 0→100% with blinking caret) ------ */
.sds-typing-caret {
  display: inline-block;
  overflow: hidden;
  white-space: nowrap;
  width: 0;
  max-width: -moz-max-content;
  max-width: max-content;
  border-right: 2px solid var(--sds-primary);
  animation:
    sds-typingCaretExpand 2s steps(22) both,
    sds-cursorBlink var(--sds-duration-base, 0.8s) step-end infinite;
}
@keyframes sds-typingCaretExpand {
  from {
    width: 0;
  }
  to {
    width: 100%;
  }
}
/* 98 · Float Bob (gentle Y float + micro-rotate loop) ------- */
.sds-float-bob {
  display: inline-block;
  animation: sds-floatBob var(--sds-duration-slower, 2.2s) ease-in-out infinite;
}
@keyframes sds-floatBob {
  0%,
  100% {
    transform: translateY(0) rotate(0);
  }
  35% {
    transform: translateY(-12px) rotate(0.6deg);
  }
  65% {
    transform: translateY(-7px) rotate(-0.3deg);
  }
}
/* 99 · Underline Grow (scaleX ::after underline expands) ----- */
.sds-underline-grow {
  display: inline-block;
  position: relative;
}
.sds-underline-grow::after {
  content: "";
  position: absolute;
  bottom: -2px;
  left: 0;
  width: 100%;
  height: 2px;
  background: var(--sds-primary);
  transform: scaleX(0);
  transform-origin: left center;
  animation: sds-underlineGrow var(--sds-duration) var(--sds-easing) both;
}
@keyframes sds-underlineGrow {
  from {
    transform: scaleX(0);
  }
  to {
    transform: scaleX(1);
  }
}
/* 100 · Strike Through (scaleX ::after strikeout line) ------- */
.sds-strike-through {
  display: inline-block;
  position: relative;
}
.sds-strike-through::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 0;
  width: 100%;
  height: 2px;
  background: var(--sds-accent);
  transform: scaleX(0);
  transform-origin: left center;
  animation: sds-strikeThrough var(--sds-duration) var(--sds-easing) 0.3s both;
}
@keyframes sds-strikeThrough {
  from {
    transform: scaleX(0);
  }
  to {
    transform: scaleX(1);
  }
}
/* ─────────────────────────────────────────────────────────────
   INTERACTIVE ANIMATION BASE RULES (v4)
   JS engine in motion-interactive.js handles the actual effects.
   Developer adds only the class. Engine auto-wires events.
   ───────────────────────────────────────────────────────────── */
.sds-jelly-hover {
  display: inline-block;
  cursor: default;
}
@keyframes sds-jellyKf {
  0%,
  100% {
    transform: scale(1, 1);
  }
  30% {
    transform: scaleX(1.25) scaleY(0.75);
  }
  40% {
    transform: scaleX(0.75) scaleY(1.25);
  }
  55% {
    transform: scaleX(1.15) scaleY(0.85);
  }
  70% {
    transform: scaleX(0.95) scaleY(1.05);
  }
  85% {
    transform: scaleX(1.02) scaleY(0.98);
  }
}
.sds-word-morph {
  display: inline-block;
}
.sds-scatter-return {
  display: inline-block;
}
.sds-scatter-return .sds-char {
  display: inline-block;
  will-change: transform;
}
.sds-shockwave {
  display: inline-block;
  cursor: pointer;
}
.sds-shockwave .sds-char {
  display: inline-block;
  will-change: transform;
}
.sds-spring-kerning {
  display: inline-block;
}
.sds-magnetic-pull {
  display: inline-block;
}
.sds-magnetic-pull .sds-char {
  display: inline-block;
  will-change: transform;
}
.sds-repulsion-field {
  display: inline-block;
}
.sds-repulsion-field .sds-char {
  display: inline-block;
  will-change: transform;
}
.sds-bounce-loop {
  display: inline-block;
  transform-origin: center bottom;
  will-change: transform;
  animation: sds-bounceLoop var(--sds-duration-slow, 1.4s) cubic-bezier(0.28, 0.84, 0.42, 1) infinite;
}
@keyframes sds-bounceLoop {
  0%,
  100% {
    transform: translateY(0) scaleY(1);
  }
  40% {
    transform: translateY(-16px) scaleY(1.05);
  }
  55% {
    transform: translateY(0) scaleY(0.92);
  }
  70% {
    transform: translateY(-6px);
  }
}
.sds-char-orbit {
  display: inline-block;
}
.sds-char-orbit .sds-char {
  display: inline-block;
  will-change: transform;
  animation: sds-charOrbitBob 2s ease-in-out infinite;
  animation-delay: calc(var(--i, 0) * 0.15s);
}
.sds-drop-bounce {
  display: inline-block;
  will-change: transform, opacity;
  animation: sds-dropBounce 1.1s var(--sds-ease-emphasized, cubic-bezier(0.215, 0.61, 0.355, 1)) both;
}
@keyframes sds-dropBounce {
  0% {
    opacity: 0;
    transform: translateY(-120px);
  }
  38% {
    opacity: 1;
    transform: translateY(0) scaleY(0.88) scaleX(1.12);
  }
  52% {
    transform: translateY(-28px) scaleY(1.05) scaleX(0.96);
  }
  65% {
    transform: translateY(0) scaleY(0.93);
  }
  78% {
    transform: translateY(-10px);
  }
  100% {
    transform: translateY(0) scaleY(1);
  }
}
.sds-pendulum {
  display: inline-block;
  transform-origin: top center;
  will-change: transform;
  animation: sds-pendulum 2.4s ease-in-out infinite;
}
@keyframes sds-pendulum {
  0%,
  100% {
    transform: rotate(-8deg);
  }
  50% {
    transform: rotate(8deg);
  }
}
.sds-vibrate {
  display: inline-block;
  will-change: transform;
  animation: sds-vibrate var(--sds-duration-instant, 0.3s) linear infinite;
}
@keyframes sds-vibrate {
  0%,
  100% {
    transform: translate(0, 0);
  }
  20% {
    transform: translate(-1px, 1px);
  }
  40% {
    transform: translate(-1px, -1px);
  }
  60% {
    transform: translate(1px, 1px);
  }
  80% {
    transform: translate(1px, -1px);
  }
}
.sds-ink-bleed {
  display: inline-block;
  will-change: filter, opacity;
  animation: sds-inkBleed var(--sds-duration-slow, 1.4s) cubic-bezier(0.25, 0.46, 0.45, 0.94) both;
}
/*  GPU compositing hints (text) — split from the global will-change rule; must stay after the class definitions above  */
.sds-refract,
.sds-prism-split,
.sds-glitch-flicker,
.sds-static-burst,
.sds-neon-flare,
.sds-scramble-decode,
.sds-velocity-blur-text,
.sds-neon-pulse-text,
.sds-aurora-text,
.sds-hologram-text,
.sds-morph-word,
.sds-levitate,
.sds-oscillate,
.sds-magnetic-drift,
.sds-heat-shimmer,
.sds-chromatic-shift {
  will-change: transform, opacity;
}
/*!
 * SDS Motion Forge — buttons.css
 * Button animations (Section 2).
 * Part of the lossless v5 category split — combined entry: src/motion.css
 */
/* ============================================================
   SECTION 2 — BUTTON ANIMATIONS
   Namespace: .sds-btn-*
   ============================================================ */
/* 31 · Magnetic Pulse -------------------------------------- */
.sds-btn-magnetic {
  animation: sds-magnetPulse 2s ease infinite;
  outline: 2px solid transparent;
}
@keyframes sds-magnetPulse {
  0%,
  100% {
    box-shadow: 0 0 0 0 var(--sds-primary-glow);
  }
  50% {
    box-shadow: 0 0 0 8px rgba(0, 21, 209, 0);
    transform: scale(1.02);
  }
}
/* 32 · Liquid Fill ----------------------------------------- */
.sds-btn-liquid {
  background-image: linear-gradient(
    90deg,
    var(--sds-primary) 50%,
    transparent 50%
  );
  background-size: 200% 100%;
  background-position: 100% 0;
  animation: sds-liquidFill 2s ease infinite alternate;
}
@keyframes sds-liquidFill {
  from {
    background-position: 100% 0;
  }
  to {
    background-position: 0% 0;
  }
}
/* 33 · Energy Ripple --------------------------------------- */
.sds-btn-energy {
  animation: sds-energyRipple 2s ease infinite;
}
@keyframes sds-energyRipple {
  0% {
    box-shadow:
      0 0 0 0 var(--sds-primary-glow),
      0 0 0 0 var(--sds-primary-dim);
  }
  70% {
    box-shadow:
      0 0 0 12px rgba(0, 21, 209, 0),
      0 0 0 24px rgba(0, 21, 209, 0);
  }
  100% {
    box-shadow:
      0 0 0 0 rgba(0, 21, 209, 0),
      0 0 0 0 rgba(0, 21, 209, 0);
  }
}
/* 34 · Press Depth ----------------------------------------- */
.sds-btn-press {
  animation: sds-pressDepth 1.8s ease infinite;
}
@keyframes sds-pressDepth {
  0%,
  100% {
    transform: translateY(0);
    box-shadow:
      0 8px 0 rgba(0, 21, 209, 0.15),
      0 4px 16px rgba(0, 21, 209, 0.08);
  }
  50% {
    transform: translateY(4px);
    box-shadow:
      0 4px 0 rgba(0, 21, 209, 0.15),
      0 2px 8px rgba(0, 21, 209, 0.08);
  }
}
/* 35 · Edge Trace ------------------------------------------ */
.sds-btn-edge {
  border: none;
  background-image:
    linear-gradient(var(--sds-primary), var(--sds-primary)),
    linear-gradient(var(--sds-primary), var(--sds-primary)),
    linear-gradient(var(--sds-primary), var(--sds-primary)),
    linear-gradient(var(--sds-primary), var(--sds-primary));
  background-repeat: no-repeat;
  background-position:
    top left,
    right top,
    bottom right,
    left bottom;
  animation: sds-edgeTrace 2s linear infinite alternate;
}
@keyframes sds-edgeTrace {
  0% {
    background-size:
      0% 2px,
      2px 0%,
      0% 2px,
      2px 0%;
  }
  25% {
    background-size:
      100% 2px,
      2px 0%,
      0% 2px,
      2px 0%;
  }
  50% {
    background-size:
      100% 2px,
      2px 100%,
      0% 2px,
      2px 0%;
  }
  75% {
    background-size:
      100% 2px,
      2px 100%,
      100% 2px,
      2px 0%;
  }
  100% {
    background-size:
      100% 2px,
      2px 100%,
      100% 2px,
      2px 100%;
  }
}
/* 36 · Plasma Glow ----------------------------------------- */
.sds-btn-plasma {
  animation: sds-plasmaGlow var(--sds-duration-dramatic, 3s) ease infinite;
}
@keyframes sds-plasmaGlow {
  0% {
    box-shadow:
      0 0 12px var(--sds-primary-glow),
      inset 0 0 12px var(--sds-primary-dim);
  }
  33% {
    box-shadow:
      0 0 24px var(--sds-primary-glow),
      inset 0 0 18px var(--sds-primary-dim);
  }
  66% {
    box-shadow:
      0 0 20px rgba(209, 0, 40, 0.35),
      inset 0 0 14px rgba(209, 0, 40, 0.06);
  }
  100% {
    box-shadow:
      0 0 12px var(--sds-primary-glow),
      inset 0 0 12px var(--sds-primary-dim);
  }
}
/* 37 · Morph Pill ------------------------------------------ */
.sds-btn-morph {
  animation: sds-morphPill 2s ease infinite;
}
@keyframes sds-morphPill {
  0%,
  100% {
    border-radius: 10px;
  }
  50% {
    border-radius: 40px;
    transform: scaleX(0.95);
  }
}
/* 38 · Lift Shadow ----------------------------------------- */
.sds-btn-lift {
  animation: sds-liftShadow 2s ease infinite;
}
@keyframes sds-liftShadow {
  0%,
  100% {
    transform: translateY(0);
    box-shadow: 0 2px 8px rgba(0, 21, 209, 0.1);
  }
  50% {
    transform: translateY(-6px);
    box-shadow:
      0 20px 40px rgba(0, 21, 209, 0.18),
      0 8px 16px rgba(0, 21, 209, 0.12);
  }
}
/* 39 · Shockwave ------------------------------------------- */
.sds-btn-shock {
  outline-style: solid;
  outline-color: transparent;
  animation: sds-shockwave 2s ease infinite;
}
@keyframes sds-shockwave {
  0% {
    outline-offset: 0;
    outline-width: 0;
    outline-color: var(--sds-primary-glow);
  }
  40% {
    outline-offset: 8px;
    outline-width: 2px;
    outline-color: rgba(0, 21, 209, 0.3);
  }
  100% {
    outline-offset: 20px;
    outline-width: 0;
    outline-color: rgba(0, 21, 209, 0);
  }
}
/* 40 · Neon Sign ------------------------------------------- */
.sds-btn-neon {
  animation: sds-neonSign 4s ease infinite;
}
@keyframes sds-neonSign {
  0%,
  95%,
  100% {
    box-shadow:
      0 0 8px var(--sds-primary-glow),
      0 0 20px var(--sds-primary-dim),
      inset 0 0 8px var(--sds-primary-dim);
  }
  96% {
    box-shadow: 0 0 2px rgba(0, 21, 209, 0.2);
  }
  97.5% {
    box-shadow:
      0 0 8px var(--sds-primary-glow),
      0 0 20px var(--sds-primary-dim);
  }
  98.5% {
    box-shadow: 0 0 1px rgba(0, 21, 209, 0.1);
  }
}
/* 41 · Volt Strike ----------------------------------------- */
.sds-btn-volt {
  animation: sds-voltagePulse 2.5s ease infinite;
}
/* 42 · Glow Surge ------------------------------------------ */
.sds-btn-glow-surge {
  animation: sds-glowSurge 2s ease infinite;
}
@keyframes sds-glowSurge {
  0%,
  100% {
    box-shadow:
      0 0 0 1px rgba(0, 21, 209, 0.15),
      0 4px 20px rgba(0, 21, 209, 0.06);
  }
  50% {
    box-shadow:
      0 0 0 1px rgba(0, 21, 209, 0.5),
      0 0 24px rgba(0, 21, 209, 0.2),
      0 4px 30px rgba(0, 21, 209, 0.1);
  }
}
/* 43 · Quantum Stamp --------------------------------------- */
.sds-btn-quantum {
  animation: sds-elasticStamp var(--sds-duration-base, 0.8s) var(--sds-easing) both;
  display: inline-block;
}
/* 44 · Ripple -------------------------------------------- */
.sds-btn-ripple {
  animation: sds-btnRipple 2s ease infinite;
}
@keyframes sds-btnRipple {
  0% {
    box-shadow:
      0 0 0 0 var(--sds-primary-glow),
      0 0 0 0 rgba(0, 21, 209, 0.12);
  }
  60% {
    box-shadow:
      0 0 0 10px rgba(0, 21, 209, 0),
      0 0 0 20px rgba(0, 21, 209, 0);
  }
  100% {
    box-shadow:
      0 0 0 0 rgba(0, 21, 209, 0),
      0 0 0 0 rgba(0, 21, 209, 0);
  }
}
/* 45 · Swipe ---------------------------------------------- */
.sds-btn-swipe {
  background-image: linear-gradient(
    90deg,
    transparent 0%,
    rgba(0, 21, 209, 0.12) 40%,
    rgba(0, 21, 209, 0.18) 50%,
    rgba(0, 21, 209, 0.12) 60%,
    transparent 100%
  );
  background-size: 300% 100%;
  animation: sds-btnSwipe 2.4s ease infinite;
}
@keyframes sds-btnSwipe {
  0% {
    background-position: -200% center;
  }
  100% {
    background-position: 300% center;
  }
}
/* 46 · Burst ---------------------------------------------- */
.sds-btn-burst {
  outline-style: solid;
  outline-color: transparent;
  animation: sds-btnBurst var(--sds-duration-slower, 2.2s) ease-in-out infinite;
}
@keyframes sds-btnBurst {
  0% {
    outline-width: 0;
    outline-offset: 0;
    outline-color: var(--sds-primary-glow);
    transform: scale(1);
  }
  30% {
    outline-width: 3px;
    outline-offset: 4px;
    outline-color: rgba(0, 21, 209, 0.3);
    transform: scale(1.03);
  }
  80% {
    outline-width: 0;
    outline-offset: 14px;
    outline-color: rgba(0, 21, 209, 0);
    transform: scale(1);
  }
  100% {
    outline-width: 0;
    outline-offset: 0;
  }
}
/* 47 · Scan ---------------------------------------------- */
.sds-btn-scan {
  background-image: linear-gradient(
    90deg,
    transparent 0%,
    rgba(255, 255, 255, 0.3) 48%,
    rgba(255, 255, 255, 0.5) 50%,
    rgba(255, 255, 255, 0.3) 52%,
    transparent 100%
  );
  background-size: 250% 100%;
  animation: sds-btnScan 2s linear infinite;
}
@keyframes sds-btnScan {
  0% {
    background-position: -150% center;
  }
  100% {
    background-position: 250% center;
  }
}
/* 48 · Bounce -------------------------------------------- */
.sds-btn-bounce {
  animation: sds-btnBounce var(--sds-duration-slow, 1.4s) var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) infinite;
}
@keyframes sds-btnBounce {
  0%,
  100% {
    transform: scale(1);
  }
  40% {
    transform: scale(1.07);
  }
  60% {
    transform: scale(0.96);
  }
}
/* 49 · Gradient Shift ------------------------------------- */
.sds-btn-gradient-shift {
  background-image: linear-gradient(
    135deg,
    var(--sds-primary),
    #6366f1,
    var(--sds-accent),
    #8b5cf6,
    var(--sds-primary)
  );
  background-size: 400% 100%;
  animation: sds-btnGradShift 4s ease infinite;
}
@keyframes sds-btnGradShift {
  0% {
    background-position: 0% center;
  }
  50% {
    background-position: 100% center;
  }
  100% {
    background-position: 0% center;
  }
}
/* 50 · Outline Grow --------------------------------------- */
.sds-btn-outline-grow {
  animation: sds-btnOutlineGrow 2s ease infinite;
  outline-style: solid;
  outline-offset: 0;
}
@keyframes sds-btnOutlineGrow {
  0%,
  100% {
    outline-width: 0;
    outline-offset: 0;
    outline-color: var(--sds-primary-glow);
  }
  50% {
    outline-width: 2px;
    outline-offset: 5px;
    outline-color: rgba(0, 21, 209, 0.4);
  }
}
/* 51 · Shimmer -------------------------------------------- */
.sds-btn-shimmer {
  background-image: linear-gradient(
    105deg,
    transparent 40%,
    rgba(255, 255, 255, 0.45) 50%,
    transparent 60%
  );
  background-size: 200% 100%;
  animation: sds-btnShimmer 1.8s ease-in-out infinite;
}
@keyframes sds-btnShimmer {
  0% {
    background-position: -100% center;
  }
  100% {
    background-position: 200% center;
  }
}
/* 52 · Float --------------------------------------------- */
.sds-btn-float {
  animation: sds-btnFloat 2.6s ease-in-out infinite;
}
@keyframes sds-btnFloat {
  0%,
  100% {
    transform: translateY(0);
    box-shadow: 0 2px 8px rgba(0, 21, 209, 0.1);
  }
  50% {
    transform: translateY(-5px);
    box-shadow: 0 16px 32px rgba(0, 21, 209, 0.16);
  }
}
/* 53 · Border Flow ---------------------------------------- */
.sds-btn-border-flow {
  animation: sds-btnBorderFlow var(--sds-duration-dramatic, 3s) linear infinite;
  outline: 2px solid transparent;
}
@keyframes sds-btnBorderFlow {
  0%,
  100% {
    box-shadow:
      inset 0 0 0 1.5px var(--sds-primary),
      0 0 8px var(--sds-primary-glow);
  }
  25% {
    box-shadow:
      inset 0 0 0 1.5px #8b5cf6,
      0 0 8px rgba(139, 92, 246, 0.3);
  }
  50% {
    box-shadow:
      inset 0 0 0 1.5px var(--sds-accent),
      0 0 8px rgba(209, 0, 40, 0.2);
  }
  75% {
    box-shadow:
      inset 0 0 0 1.5px #06b6d4,
      0 0 8px rgba(6, 182, 212, 0.25);
  }
}
/* 54 · Glow Core ------------------------------------------ */
.sds-btn-glow-core {
  animation: sds-btnGlowCore var(--sds-duration-slower, 2.2s) ease-in-out infinite;
}
@keyframes sds-btnGlowCore {
  0%,
  100% {
    box-shadow:
      inset 0 0 0 rgba(0, 21, 209, 0),
      0 0 0 rgba(0, 21, 209, 0);
  }
  50% {
    box-shadow:
      inset 0 0 20px var(--sds-primary-dim),
      0 0 30px var(--sds-primary-glow),
      0 0 60px rgba(0, 21, 209, 0.08);
  }
}
/* 55 · Kinetic -------------------------------------------- */
.sds-btn-kinetic {
  animation: sds-btnKinetic var(--sds-duration-base, 0.8s) ease-in-out infinite;
}
@keyframes sds-btnKinetic {
  0%,
  100% {
    transform: scale(1) rotate(0deg);
  }
  20% {
    transform: scale(1.04) rotate(0.3deg);
  }
  40% {
    transform: scale(0.97) rotate(-0.2deg);
  }
  60% {
    transform: scale(1.02) rotate(0.15deg);
  }
  80% {
    transform: scale(0.99) rotate(-0.1deg);
  }
}
/* 56 · Charge -------------------------------------------- */
.sds-btn-charge {
  animation: sds-btnCharge 2.4s ease-in-out infinite;
}
@keyframes sds-btnCharge {
  0% {
    box-shadow: 0 0 0 rgba(0, 21, 209, 0);
    filter: brightness(1);
  }
  60% {
    box-shadow:
      0 0 24px var(--sds-primary-glow),
      0 0 48px rgba(0, 21, 209, 0.12);
    filter: brightness(1.15);
    transform: scale(1.03);
  }
  80% {
    box-shadow: 0 0 4px rgba(0, 21, 209, 0.1);
    filter: brightness(1);
    transform: scale(1);
  }
  100% {
    box-shadow: 0 0 0 rgba(0, 21, 209, 0);
  }
}
/* 57 · Aurora -------------------------------------------- */
.sds-btn-aurora {
  animation: sds-btnAurora 4s ease-in-out infinite;
}
@keyframes sds-btnAurora {
  0%,
  100% {
    box-shadow:
      0 0 12px rgba(0, 21, 209, 0.25),
      0 0 30px rgba(0, 21, 209, 0.1);
  }
  25% {
    box-shadow:
      0 0 20px rgba(139, 92, 246, 0.35),
      0 0 40px rgba(139, 92, 246, 0.12);
  }
  50% {
    box-shadow:
      0 0 16px rgba(6, 182, 212, 0.3),
      0 0 35px rgba(6, 182, 212, 0.1);
  }
  75% {
    box-shadow:
      0 0 18px rgba(16, 185, 129, 0.3),
      0 0 36px rgba(16, 185, 129, 0.1);
  }
}
/* 58 · Heartbeat ----------------------------------------- */
.sds-btn-heartbeat {
  animation: sds-btnHeartbeat 1.2s ease-in-out infinite;
}
@keyframes sds-btnHeartbeat {
  0%,
  100% {
    transform: scale(1);
  }
  14% {
    transform: scale(1.08);
  }
  28% {
    transform: scale(0.97);
  }
  42% {
    transform: scale(1.05);
  }
  56% {
    transform: scale(1);
  }
}
/* 59 · Neon Trace ---------------------------------------- */
.sds-btn-neon-trace {
  animation: sds-btnNeonTrace var(--sds-duration-dramatic, 3s) ease infinite;
}
@keyframes sds-btnNeonTrace {
  0%,
  90%,
  100% {
    box-shadow:
      0 0 6px var(--sds-primary-glow),
      inset 0 0 6px var(--sds-primary-dim);
  }
  92% {
    box-shadow: 0 0 1px rgba(0, 21, 209, 0.1);
  }
  94% {
    box-shadow:
      0 0 10px var(--sds-primary-glow),
      inset 0 0 10px var(--sds-primary-dim);
  }
  96% {
    box-shadow: 0 0 2px rgba(0, 21, 209, 0.1);
  }
}
/* 60 · Gravity ------------------------------------------- */
.sds-btn-gravity {
  animation: sds-btnGravity 1.8s var(--sds-ease-bounce, cubic-bezier(0.68, -0.55, 0.27, 1.55)) infinite;
}
@keyframes sds-btnGravity {
  0%,
  100% {
    transform: translateY(0);
    box-shadow: 0 6px 0 rgba(0, 21, 209, 0.2);
  }
  50% {
    transform: translateY(4px);
    box-shadow: 0 2px 0 rgba(0, 21, 209, 0.2);
  }
}
/* 61 · Momentum ------------------------------------------ */
.sds-btn-momentum {
  animation: sds-btnMomentum 2s var(--sds-easing) both;
}
@keyframes sds-btnMomentum {
  0% {
    transform: translateX(-40px);
    filter: blur(8px);
    opacity: 0;
  }
  40% {
    filter: blur(0);
    opacity: 1;
    transform: translateX(4px);
  }
  60% {
    transform: translateX(-2px);
  }
  100% {
    transform: translateX(0);
    opacity: 1;
  }
}
/* 62 · Ice ----------------------------------------------- */
.sds-btn-ice {
  animation: sds-btnIce var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-btnIce {
  0%,
  100% {
    box-shadow:
      0 0 8px rgba(6, 182, 212, 0.3),
      inset 0 0 8px rgba(6, 182, 212, 0.08);
    filter: brightness(1);
  }
  50% {
    box-shadow:
      0 0 24px rgba(6, 182, 212, 0.5),
      inset 0 0 16px rgba(6, 182, 212, 0.12);
    filter: brightness(1.1);
  }
}
/* 63 · Fire ---------------------------------------------- */
.sds-btn-fire {
  animation: sds-btnFire 2s ease-in-out infinite;
}
@keyframes sds-btnFire {
  0%,
  100% {
    box-shadow:
      0 0 8px rgba(251, 113, 133, 0.35),
      0 4px 16px rgba(239, 68, 68, 0.15);
    filter: brightness(1);
  }
  33% {
    box-shadow:
      0 0 20px rgba(251, 146, 60, 0.5),
      0 6px 24px rgba(239, 68, 68, 0.2);
    filter: brightness(1.1);
  }
  66% {
    box-shadow:
      0 0 14px rgba(239, 68, 68, 0.4),
      0 4px 12px rgba(251, 113, 133, 0.15);
  }
}
/* 64 · Flux ---------------------------------------------- */
.sds-btn-flux {
  animation: sds-btnFlux 1.6s ease-in-out infinite;
}
@keyframes sds-btnFlux {
  0%,
  100% {
    filter: brightness(1) saturate(1);
    transform: scale(1);
  }
  25% {
    filter: brightness(1.12) saturate(1.3);
    transform: scale(1.02);
  }
  50% {
    filter: brightness(0.95) saturate(0.8);
    transform: scale(0.99);
  }
  75% {
    filter: brightness(1.08) saturate(1.2);
    transform: scale(1.01);
  }
}
/* 65 · Radar --------------------------------------------- */
.sds-btn-radar {
  position: relative;
  overflow: hidden;
  animation: sds-btnRadar 2s ease infinite;
}
@keyframes sds-btnRadar {
  0%,
  100% {
    box-shadow: inset 0 0 0 1px rgba(0, 21, 209, 0.25);
  }
  50% {
    box-shadow:
      inset 0 0 0 1px rgba(0, 21, 209, 0.6),
      inset 0 0 20px rgba(0, 21, 209, 0.06);
  }
}
/* 66 · Tilt ---------------------------------------------- */
.sds-btn-tilt {
  animation: sds-btnTilt var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-btnTilt {
  0%,
  100% {
    transform: perspective(400px) rotateY(0deg) rotateX(0deg);
  }
  25% {
    transform: perspective(400px) rotateY(6deg) rotateX(-2deg);
  }
  75% {
    transform: perspective(400px) rotateY(-6deg) rotateX(2deg);
  }
}
/* 67 · Stretch ------------------------------------------- */
.sds-btn-stretch {
  animation: sds-btnStretch 2s var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) infinite;
}
@keyframes sds-btnStretch {
  0%,
  100% {
    transform: scaleX(1) scaleY(1);
  }
  30% {
    transform: scaleX(1.1) scaleY(0.94);
  }
  60% {
    transform: scaleX(0.96) scaleY(1.04);
  }
}
/* 68 · Recoil -------------------------------------------- */
.sds-btn-recoil {
  animation: sds-btnRecoil 2.4s ease-in-out infinite;
}
@keyframes sds-btnRecoil {
  0%,
  100% {
    transform: scale(1);
  }
  10% {
    transform: scale(0.9);
  }
  20% {
    transform: scale(1.06);
  }
  30% {
    transform: scale(0.98);
  }
  40% {
    transform: scale(1.02);
  }
  50% {
    transform: scale(1);
  }
}
/* 69 · Depth Press --------------------------------------- */
.sds-btn-depth-press {
  animation: sds-btnDepthPress 2s ease-in-out infinite;
}
@keyframes sds-btnDepthPress {
  0%,
  100% {
    transform: perspective(300px) translateZ(0);
    box-shadow:
      0 10px 0 rgba(0, 21, 209, 0.18),
      0 5px 20px rgba(0, 21, 209, 0.1);
  }
  50% {
    transform: perspective(300px) translateZ(-8px);
    box-shadow:
      0 4px 0 rgba(0, 21, 209, 0.18),
      0 2px 8px rgba(0, 21, 209, 0.08);
  }
}
/* 70 · Rotate -------------------------------------------- */
.sds-btn-rotate {
  animation: sds-btnRotate 4s linear infinite;
}
@keyframes sds-btnRotate {
  0% {
    transform: perspective(500px) rotateY(0deg);
  }
  100% {
    transform: perspective(500px) rotateY(360deg);
  }
}
/* 71 · Pulse Border -------------------------------------- */
.sds-btn-pulse-border {
  animation: sds-btnPulseBorder 2s ease-in-out infinite;
  border: 1px solid rgba(0, 21, 209, 0.3);
}
@keyframes sds-btnPulseBorder {
  0%,
  100% {
    border-color: rgba(0, 21, 209, 0.3);
    border-width: 1px;
  }
  50% {
    border-color: var(--sds-primary);
    border-width: 2px;
    box-shadow: 0 0 12px var(--sds-primary-glow);
  }
}
/* 72 · Gravity Pull -------------------------------------- */
.sds-btn-gravity-pull {
  animation: sds-btnGravityPull 2.4s ease-in-out infinite;
}
@keyframes sds-btnGravityPull {
  0%,
  100% {
    box-shadow: 0 4px 6px rgba(0, 21, 209, 0.12);
    transform: translateY(0);
  }
  50% {
    box-shadow:
      0 24px 40px rgba(0, 21, 209, 0.22),
      0 8px 12px rgba(0, 21, 209, 0.1);
    transform: translateY(-4px);
  }
}
/* 73 · Warp --------------------------------------------- */
.sds-btn-warp {
  animation: sds-btnWarp 2.6s ease-in-out infinite;
}
@keyframes sds-btnWarp {
  0%,
  100% {
    transform: scaleX(1) scaleY(1) skewX(0deg);
  }
  25% {
    transform: scaleX(1.06) scaleY(0.95) skewX(-2deg);
  }
  75% {
    transform: scaleX(0.96) scaleY(1.04) skewX(2deg);
  }
}
/* 74 · Dissolve ------------------------------------------ */
.sds-btn-dissolve {
  animation: sds-btnDissolve var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-btnDissolve {
  0%,
  100% {
    opacity: 1;
    filter: blur(0);
  }
  40% {
    opacity: 0.7;
    filter: blur(1px) brightness(1.3);
  }
  60% {
    opacity: 1;
    filter: blur(0);
  }
}
/* 75 · Split -------------------------------------------- */
.sds-btn-split {
  animation: sds-btnSplit 2.8s ease-in-out infinite;
}
@keyframes sds-btnSplit {
  0%,
  100% {
    box-shadow:
      inset 0 0 0 1.5px rgba(0, 21, 209, 0.25),
      0 0 0 rgba(0, 21, 209, 0);
  }
  40% {
    box-shadow:
      inset 0 0 0 1.5px var(--sds-primary),
      0 0 20px var(--sds-primary-glow);
    transform: scaleX(1.04);
  }
  60% {
    box-shadow: inset 0 0 0 1.5px rgba(0, 21, 209, 0.4);
    transform: scaleX(0.97);
  }
}
/* 76 · Magnetic Trail ------------------------------------ */
.sds-btn-magnetic-trail {
  animation: sds-btnMagTrail 2s ease-in-out infinite;
}
@keyframes sds-btnMagTrail {
  0%,
  100% {
    box-shadow:
      -8px 0 20px rgba(0, 21, 209, 0),
      8px 0 20px rgba(0, 21, 209, 0);
  }
  50% {
    box-shadow:
      -12px 0 24px rgba(0, 21, 209, 0.2),
      12px 0 24px rgba(0, 21, 209, 0.1);
    transform: scale(1.02);
  }
}
/* 77 · Hologram ------------------------------------------ */
.sds-btn-hologram {
  animation: sds-btnHologram 4s linear infinite;
}
@keyframes sds-btnHologram {
  0%,
  100% {
    filter: hue-rotate(0deg) brightness(1);
  }
  5% {
    filter: hue-rotate(30deg) brightness(1.2);
  }
  6% {
    filter: hue-rotate(0deg) brightness(1);
  }
  40% {
    filter: hue-rotate(200deg) brightness(1.15);
  }
  41% {
    filter: hue-rotate(0deg) brightness(1);
  }
  80% {
    filter: hue-rotate(100deg) brightness(1.1);
  }
  81% {
    filter: hue-rotate(0deg) brightness(1);
  }
}
/* 78 · Crystal ------------------------------------------- */
.sds-btn-crystal {
  animation: sds-btnCrystal 2.4s ease-in-out infinite;
}
@keyframes sds-btnCrystal {
  0%,
  100% {
    filter: brightness(1) contrast(1);
  }
  30% {
    filter: brightness(1.25) contrast(1.1);
    box-shadow:
      0 0 16px rgba(255, 255, 255, 0.4),
      0 0 4px rgba(0, 21, 209, 0.2);
  }
  60% {
    filter: brightness(1) contrast(1);
  }
}
/* 79 · Flare -------------------------------------------- */
.sds-btn-flare {
  animation: sds-btnFlare 2.5s ease-in-out infinite;
}
@keyframes sds-btnFlare {
  0%,
  100% {
    box-shadow: 0 0 0 rgba(0, 21, 209, 0);
  }
  50% {
    box-shadow:
      0 0 40px rgba(0, 21, 209, 0.25),
      0 0 80px rgba(0, 21, 209, 0.08),
      0 0 120px rgba(0, 21, 209, 0.04);
    transform: scale(1.02);
  }
}
/* 80 · Amp ---------------------------------------------- */
.sds-btn-amp {
  animation: sds-btnAmp 0.6s ease-in-out infinite;
}
@keyframes sds-btnAmp {
  0%,
  100% {
    transform: scaleY(1);
  }
  25% {
    transform: scaleY(1.05);
  }
  75% {
    transform: scaleY(0.96);
  }
}
/*  GPU compositing hints (buttons) — split from the global will-change rule; must stay after the class definitions above  */
.sds-btn-neon,
.sds-btn-plasma,
.sds-btn-aurora,
.sds-btn-float,
.sds-btn-tilt,
.sds-btn-rotate {
  will-change: transform, opacity;
}
/* ============================================================
   SECTION 2b — BUTTON ANIMATIONS (v5 additions, 81–130)
   Compositor-only (R4): transform / opacity / filter / clip-path.
   Token-driven (SPEC §2): --sds-duration-*, --sds-ease-*.
   ============================================================ */
/* ─── Family: Liquid & Morph Fill ──────────────────────────── */
/* 81 · Fill Rise -------------------------------------------- */
.sds-btn-fill-rise {
  position: relative;
  overflow: hidden;
}
.sds-btn-fill-rise::before {
  content: "";
  position: absolute;
  left: -5%;
  right: -5%;
  bottom: 0;
  height: 130%;
  background: var(--sds-primary);
  opacity: 0.22;
  clip-path: polygon(0 18%, 25% 14%, 50% 19%, 75% 13%, 100% 17%, 100% 100%, 0 100%);
  transform: translateY(101%);
  animation: sds-btnFillRise var(--sds-duration-slower, 2.2s) var(--sds-ease-decelerate, cubic-bezier(0.16, 1, 0.3, 1)) infinite;
}
@keyframes sds-btnFillRise {
  0% {
    transform: translateY(101%);
    clip-path: polygon(0 18%, 25% 14%, 50% 19%, 75% 13%, 100% 17%, 100% 100%, 0 100%);
  }
  45% {
    transform: translateY(12%);
    clip-path: polygon(0 13%, 25% 19%, 50% 12%, 75% 18%, 100% 14%, 100% 100%, 0 100%);
  }
  60% {
    transform: translateY(-2%);
    clip-path: polygon(0 17%, 25% 13%, 50% 18%, 75% 14%, 100% 18%, 100% 100%, 0 100%);
  }
  70%,
  82% {
    transform: translateY(0%);
    clip-path: polygon(0 15%, 25% 15%, 50% 15%, 75% 15%, 100% 15%, 100% 100%, 0 100%);
  }
  100% {
    transform: translateY(101%);
  }
}
/* 82 · Fill Sweep ------------------------------------------- */
.sds-btn-fill-sweep {
  position: relative;
  overflow: hidden;
}
.sds-btn-fill-sweep::before {
  content: "";
  position: absolute;
  inset: 0 auto 0 -40%;
  width: 120%;
  background: var(--sds-primary);
  opacity: 0.2;
  transform: translateX(-110%) skewX(-18deg);
  animation: sds-btnFillSweep var(--sds-duration-slower, 2.2s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) infinite;
}
@keyframes sds-btnFillSweep {
  0% {
    transform: translateX(-110%) skewX(-18deg);
    filter: brightness(1);
  }
  42% {
    transform: translateX(28%) skewX(-18deg);
    filter: brightness(1.35);
  }
  55%,
  70% {
    transform: translateX(4%) skewX(-18deg);
    filter: brightness(1);
  }
  100% {
    transform: translateX(120%) skewX(-18deg);
  }
}
/* 83 · Fill Iris -------------------------------------------- */
.sds-btn-fill-iris {
  position: relative;
  overflow: hidden;
  animation: sds-btnFillIrisHost var(--sds-duration-slower, 2.2s) var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) infinite;
}
.sds-btn-fill-iris::before {
  content: "";
  position: absolute;
  inset: 0;
  background: var(--sds-primary);
  opacity: 0.24;
  clip-path: circle(0% at 50% 50%);
  animation: sds-btnFillIris var(--sds-duration-slower, 2.2s) var(--sds-ease-decelerate, cubic-bezier(0.16, 1, 0.3, 1)) infinite;
}
@keyframes sds-btnFillIris {
  0%,
  8% {
    clip-path: circle(0% at 50% 50%);
  }
  42% {
    clip-path: circle(75% at 50% 50%);
  }
  62%,
  78% {
    clip-path: circle(72% at 50% 50%);
    opacity: 0.24;
  }
  100% {
    clip-path: circle(75% at 50% 50%);
    opacity: 0;
  }
}
@keyframes sds-btnFillIrisHost {
  0%,
  8% {
    transform: scale(0.985);
  }
  46% {
    transform: scale(1.012);
  }
  64%,
  100% {
    transform: scale(1);
  }
}
/* 84 · Fill Split ------------------------------------------- */
.sds-btn-fill-split {
  position: relative;
  overflow: hidden;
}
.sds-btn-fill-split::before,
.sds-btn-fill-split::after {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  width: 51%;
  background: var(--sds-primary);
  opacity: 0.2;
}
.sds-btn-fill-split::before {
  left: 0;
  transform: translateX(-102%);
  animation: sds-btnFillSplitL var(--sds-duration-slower, 2.2s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) infinite;
}
.sds-btn-fill-split::after {
  right: 0;
  transform: translateX(102%);
  animation: sds-btnFillSplitR var(--sds-duration-slower, 2.2s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) infinite;
}
@keyframes sds-btnFillSplitL {
  0%,
  6% {
    transform: translateX(-102%);
    filter: brightness(1);
  }
  38% {
    transform: translateX(0);
    filter: brightness(1.45);
  }
  46%,
  74% {
    transform: translateX(0);
    filter: brightness(1);
  }
  100% {
    transform: translateX(-102%);
  }
}
@keyframes sds-btnFillSplitR {
  0%,
  6% {
    transform: translateX(102%);
    filter: brightness(1);
  }
  38% {
    transform: translateX(0);
    filter: brightness(1.45);
  }
  46%,
  74% {
    transform: translateX(0);
    filter: brightness(1);
  }
  100% {
    transform: translateX(102%);
  }
}
/* 85 · Fill Corner ------------------------------------------ */
.sds-btn-fill-corner {
  position: relative;
  overflow: hidden;
  animation: sds-btnFillCornerHost var(--sds-duration-slower, 2.2s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) infinite;
}
.sds-btn-fill-corner::before {
  content: "";
  position: absolute;
  inset: 0;
  background: var(--sds-primary);
  opacity: 0.22;
  clip-path: polygon(0 0, 0 0, 0 0);
  animation: sds-btnFillCorner var(--sds-duration-slower, 2.2s) var(--sds-ease-decelerate, cubic-bezier(0.16, 1, 0.3, 1)) infinite;
}
@keyframes sds-btnFillCorner {
  0%,
  6% {
    clip-path: polygon(0 0, 0 0, 0 0);
  }
  44% {
    clip-path: polygon(0 0, 230% 0, 0 230%);
  }
  58%,
  78% {
    clip-path: polygon(0 0, 220% 0, 0 220%);
    opacity: 0.22;
  }
  100% {
    clip-path: polygon(0 0, 230% 0, 0 230%);
    opacity: 0;
  }
}
@keyframes sds-btnFillCornerHost {
  0%,
  40% {
    transform: rotate(0deg);
  }
  52% {
    transform: rotate(-0.5deg);
  }
  66%,
  100% {
    transform: rotate(0deg);
  }
}
/* 86 · Fill Drain ------------------------------------------- */
.sds-btn-fill-drain {
  position: relative;
  overflow: hidden;
}
.sds-btn-fill-drain::before {
  content: "";
  position: absolute;
  inset: 0;
  background: var(--sds-primary);
  opacity: 0.22;
  animation: sds-btnFillDrain var(--sds-duration-dramatic, 3s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) infinite;
}
@keyframes sds-btnFillDrain {
  0%,
  12% {
    transform: translateY(0);
  }
  38% {
    transform: translateY(96%);
  }
  44%,
  56% {
    transform: translateY(101%);
  }
  62% {
    transform: translateY(96%);
  }
  88%,
  100% {
    transform: translateY(0);
  }
}
/* 87 · Fill Wave -------------------------------------------- */
.sds-btn-fill-wave {
  position: relative;
  overflow: hidden;
}
.sds-btn-fill-wave::before {
  content: "";
  position: absolute;
  left: -15%;
  right: -15%;
  top: 30%;
  bottom: -10%;
  background: var(--sds-primary);
  opacity: 0.2;
  transform: translateY(120%) rotate(-8deg);
  animation: sds-btnFillWave var(--sds-duration-slower, 2.2s) var(--sds-ease-decelerate, cubic-bezier(0.16, 1, 0.3, 1)) infinite;
}
.sds-btn-fill-wave > * {
  display: inline-block;
  animation: sds-btnFillWaveLabel var(--sds-duration-slower, 2.2s) var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) infinite;
}
@keyframes sds-btnFillWave {
  0%,
  8% {
    transform: translateY(120%) rotate(-8deg);
  }
  45% {
    transform: translateY(6%) rotate(-3deg);
  }
  62%,
  80% {
    transform: translateY(0%) rotate(0deg);
  }
  100% {
    transform: translateY(120%) rotate(-6deg);
  }
}
@keyframes sds-btnFillWaveLabel {
  0%,
  38% {
    transform: translateY(0);
  }
  52% {
    transform: translateY(-2px);
  }
  68%,
  100% {
    transform: translateY(0);
  }
}
/* ─── Family: Border Draw & Corner Trace ───────────────────── */
/* 88 · Draw Perimeter --------------------------------------- */
.sds-btn-draw-perimeter {
  position: relative;
}
.sds-btn-draw-perimeter::before {
  content: "";
  position: absolute;
  inset: 0;
  border: 2px solid var(--sds-primary);
  border-radius: inherit;
  clip-path: polygon(0 0, 0 0, 0 0);
  animation: sds-btnDrawPerimeter var(--sds-duration-slower, 2.2s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) infinite;
}
@keyframes sds-btnDrawPerimeter {
  0% {
    clip-path: polygon(0 0, 0 0, 0 0, 0 0, 0 0, 0 0);
    opacity: 1;
  }
  24% {
    clip-path: polygon(0 0, 100% 0, 100% 50%, 100% 50%, 100% 50%, 0 0);
  }
  48% {
    clip-path: polygon(0 0, 100% 0, 100% 100%, 50% 100%, 50% 100%, 0 0);
  }
  52% {
    transform: scale(1.012);
  }
  70%,
  84% {
    clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%, 0 50%, 0 0);
    opacity: 1;
    transform: scale(1);
  }
  100% {
    clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%, 0 50%, 0 0);
    opacity: 0;
  }
}
/* 89 · Draw Corners ----------------------------------------- */
.sds-btn-draw-corners {
  position: relative;
}
.sds-btn-draw-corners::before,
.sds-btn-draw-corners::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  border: 2px solid var(--sds-primary);
}
.sds-btn-draw-corners::before {
  clip-path: polygon(0 0, 26% 0, 26% 3px, 3px 3px, 3px 26%, 0 26%, 0 0, 74% 0, 74% 3px, 100% 3px, 100% 0, 100% 26%, calc(100% - 3px) 26%, calc(100% - 3px) 0, 74% 0, 74% 0);
  animation: sds-btnDrawCornersA var(--sds-duration-slower, 2.2s) var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) infinite;
}
.sds-btn-draw-corners::after {
  clip-path: polygon(0 74%, 3px 74%, 3px calc(100% - 3px), 26% calc(100% - 3px), 26% 100%, 0 100%, 0 74%, 74% 100%, 74% calc(100% - 3px), calc(100% - 3px) calc(100% - 3px), calc(100% - 3px) 74%, 100% 74%, 100% 100%, 74% 100%, 74% 100%, 0 74%);
  animation: sds-btnDrawCornersB var(--sds-duration-slower, 2.2s) var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) infinite;
}
@keyframes sds-btnDrawCornersA {
  0%,
  10% {
    opacity: 0;
    transform: scale(1.18);
  }
  34% {
    opacity: 1;
    transform: scale(0.99);
  }
  44%,
  82% {
    opacity: 1;
    transform: scale(1);
  }
  100% {
    opacity: 0;
    transform: scale(1.12);
  }
}
@keyframes sds-btnDrawCornersB {
  0%,
  16% {
    opacity: 0;
    transform: scale(1.18);
  }
  40% {
    opacity: 1;
    transform: scale(0.99);
  }
  50%,
  82% {
    opacity: 1;
    transform: scale(1);
  }
  100% {
    opacity: 0;
    transform: scale(1.12);
  }
}
/* 90 · Draw Dash -------------------------------------------- */
.sds-btn-draw-dash {
  position: relative;
}
.sds-btn-draw-dash::before {
  content: "";
  position: absolute;
  inset: 0;
  border: 2px dashed var(--sds-primary);
  border-radius: inherit;
  animation: sds-btnDrawDash var(--sds-duration-slower, 2.2s) steps(6) infinite;
}
@keyframes sds-btnDrawDash {
  0% {
    clip-path: inset(0 100% 0 0);
    opacity: 1;
    filter: brightness(1);
  }
  48% {
    clip-path: inset(0 0 0 0);
    filter: brightness(1);
  }
  60% {
    clip-path: inset(0 0 0 0);
    filter: brightness(0.75);
  }
  72%,
  86% {
    clip-path: inset(0 0 0 0);
    filter: brightness(1.15);
    opacity: 1;
  }
  100% {
    clip-path: inset(0 0 0 0);
    opacity: 0;
  }
}
/* 91 · Draw Cross ------------------------------------------- */
.sds-btn-draw-cross {
  position: relative;
  overflow: hidden;
}
.sds-btn-draw-cross::before,
.sds-btn-draw-cross::after {
  content: "";
  position: absolute;
  top: -60%;
  bottom: -60%;
  width: 2px;
  background: var(--sds-primary);
  opacity: 0;
}
.sds-btn-draw-cross::before {
  left: 20%;
  transform: rotate(28deg) translateX(-60px);
  animation: sds-btnDrawCrossA var(--sds-duration-slower, 2.2s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) infinite;
}
.sds-btn-draw-cross::after {
  right: 20%;
  transform: rotate(-28deg) translateX(60px);
  animation: sds-btnDrawCrossB var(--sds-duration-slower, 2.2s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) infinite;
}
@keyframes sds-btnDrawCrossA {
  0%,
  8% {
    transform: rotate(28deg) translateX(-70px);
    opacity: 0;
  }
  22% {
    opacity: 0.9;
  }
  46% {
    transform: rotate(28deg) translateX(70px);
    opacity: 0;
  }
  100% {
    transform: rotate(28deg) translateX(70px);
    opacity: 0;
  }
}
@keyframes sds-btnDrawCrossB {
  0%,
  18% {
    transform: rotate(-28deg) translateX(70px);
    opacity: 0;
  }
  32% {
    opacity: 0.9;
  }
  56% {
    transform: rotate(-28deg) translateX(-70px);
    opacity: 0;
  }
  100% {
    transform: rotate(-28deg) translateX(-70px);
    opacity: 0;
  }
}
/* 92 · Draw Pulse Frame ------------------------------------- */
.sds-btn-draw-pulse-frame {
  position: relative;
}
.sds-btn-draw-pulse-frame::before {
  content: "";
  position: absolute;
  inset: 0;
  border: 1.5px solid var(--sds-primary);
  border-radius: inherit;
  animation: sds-btnDrawPulseFrame var(--sds-duration-dramatic, 3s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) infinite;
}
@keyframes sds-btnDrawPulseFrame {
  0% {
    clip-path: inset(0 100% 98% 0);
    opacity: 1;
    transform: scale(1);
  }
  20% {
    clip-path: inset(0 0 0 0);
    transform: scale(1);
  }
  38% {
    transform: scale(1.04);
    opacity: 0.55;
  }
  52% {
    transform: scale(1);
    opacity: 1;
  }
  68% {
    transform: scale(1.04);
    opacity: 0.55;
  }
  82%,
  100% {
    clip-path: inset(0 0 0 0);
    transform: scale(1);
    opacity: 1;
  }
}
/* 93 · Draw Underline Orbit --------------------------------- */
.sds-btn-draw-underline-orbit {
  position: relative;
}
.sds-btn-draw-underline-orbit::before {
  content: "";
  position: absolute;
  left: 18%;
  bottom: 4px;
  width: 64%;
  height: 2px;
  border-radius: 2px;
  background: var(--sds-primary);
  transform-origin: 50% -14px;
  animation: sds-btnDrawUnderlineOrbit var(--sds-duration-dramatic, 3s) var(--sds-ease-emphasized, cubic-bezier(0.215, 0.61, 0.355, 1)) infinite;
}
@keyframes sds-btnDrawUnderlineOrbit {
  0% {
    transform: scaleX(0);
    opacity: 0;
  }
  14% {
    transform: scaleX(1) rotate(0deg);
    opacity: 1;
  }
  28%,
  40% {
    transform: scaleX(1) rotate(0deg);
  }
  64% {
    transform: scaleX(0.5) rotate(180deg);
    opacity: 0.7;
  }
  82% {
    transform: scaleX(1) rotate(360deg);
    opacity: 1;
  }
  100% {
    transform: scaleX(1) rotate(360deg);
  }
}
/* ─── Family: Depth & Press Physics ────────────────────────── */
/* 94 · Press Spring ----------------------------------------- */
.sds-btn-press-spring {
  animation: sds-btnPressSpring var(--sds-duration-slower, 2.2s) var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) infinite;
}
@keyframes sds-btnPressSpring {
  0%,
  18% {
    transform: translateY(0) scale(1, 1);
  }
  26% {
    transform: translateY(-1px) scale(1.005, 1);
  }
  38% {
    transform: translateY(3px) scale(1.04, 0.96);
  }
  50% {
    transform: translateY(-2px) scale(0.99, 1.02);
  }
  60% {
    transform: translateY(1px) scale(1.01, 0.995);
  }
  70%,
  100% {
    transform: translateY(0) scale(1, 1);
  }
}
/* 95 · Press Coin ------------------------------------------- */
.sds-btn-press-coin {
  position: relative;
  backface-visibility: hidden;
  animation: sds-btnPressCoin var(--sds-duration-slower, 2.2s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) infinite;
}
.sds-btn-press-coin::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  background: #000;
  opacity: 0;
  animation: sds-btnPressCoinShade var(--sds-duration-slower, 2.2s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) infinite;
}
@keyframes sds-btnPressCoin {
  0%,
  20% {
    transform: perspective(400px) rotateX(0deg);
  }
  36% {
    transform: perspective(400px) rotateX(12deg);
  }
  48% {
    transform: perspective(400px) rotateX(-3deg);
  }
  58%,
  100% {
    transform: perspective(400px) rotateX(0deg);
  }
}
@keyframes sds-btnPressCoinShade {
  0%,
  20% {
    opacity: 0;
  }
  36% {
    opacity: 0.18;
  }
  58%,
  100% {
    opacity: 0;
  }
}
/* 96 · Press Pop -------------------------------------------- */
.sds-btn-press-pop {
  animation: sds-btnPressPop var(--sds-duration-slower, 2.2s) var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) infinite;
}
.sds-btn-press-pop > * {
  display: inline-block;
  animation: sds-btnPressPopLabel var(--sds-duration-slower, 2.2s) var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) infinite;
}
@keyframes sds-btnPressPop {
  0%,
  22% {
    transform: scale(1);
  }
  32% {
    transform: scale(0.97);
  }
  46% {
    transform: scale(1.06);
  }
  58% {
    transform: scale(0.99);
  }
  68%,
  100% {
    transform: scale(1);
  }
}
@keyframes sds-btnPressPopLabel {
  0%,
  19% {
    transform: scale(1);
  }
  29% {
    transform: scale(0.95);
  }
  43% {
    transform: scale(1.1);
  }
  55% {
    transform: scale(0.99);
  }
  65%,
  100% {
    transform: scale(1);
  }
}
/* 97 · Press Seesaw ----------------------------------------- */
.sds-btn-press-seesaw {
  animation: sds-btnPressSeesaw var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-btnPressSeesaw {
  0%,
  100% {
    transform: perspective(420px) rotateX(0) rotateY(0);
  }
  12% {
    transform: perspective(420px) rotateX(3deg) rotateY(-2.4deg);
  }
  28% {
    transform: perspective(420px) rotateX(-2.4deg) rotateY(2deg);
  }
  44% {
    transform: perspective(420px) rotateX(1.6deg) rotateY(-1.2deg);
  }
  58% {
    transform: perspective(420px) rotateX(-1deg) rotateY(0.8deg);
  }
  70% {
    transform: perspective(420px) rotateX(0.5deg) rotateY(-0.4deg);
  }
  80% {
    transform: perspective(420px) rotateX(0) rotateY(0);
  }
}
/* 98 · Press Drop ------------------------------------------- */
.sds-btn-press-drop {
  position: relative;
  animation: sds-btnPressDrop var(--sds-duration-base, 0.8s) var(--sds-ease-emphasized, cubic-bezier(0.215, 0.61, 0.355, 1)) both;
}
.sds-btn-press-drop::after {
  content: "";
  position: absolute;
  left: 50%;
  bottom: -6px;
  width: 70%;
  height: 8px;
  border-radius: 50%;
  border: 1.5px solid var(--sds-primary);
  opacity: 0;
  transform: translateX(-50%) scale(0.4);
  animation: sds-btnPressDropDust var(--sds-duration-base, 0.8s) var(--sds-ease-decelerate, cubic-bezier(0.16, 1, 0.3, 1)) both;
}
@keyframes sds-btnPressDrop {
  0% {
    opacity: 0;
    transform: translateY(-12px);
  }
  40% {
    opacity: 1;
    transform: translateY(0) scale(1.05, 0.94);
  }
  60% {
    transform: translateY(-3px) scale(0.99, 1.02);
  }
  78% {
    transform: translateY(0) scale(1.01, 0.99);
  }
  100% {
    opacity: 1;
    transform: translateY(0) scale(1, 1);
  }
}
@keyframes sds-btnPressDropDust {
  0%,
  38% {
    opacity: 0;
    transform: translateX(-50%) scale(0.4);
  }
  52% {
    opacity: 0.55;
    transform: translateX(-50%) scale(0.9);
  }
  100% {
    opacity: 0;
    transform: translateX(-50%) scale(1.5);
  }
}
/* 99 · Press Elastic ---------------------------------------- */
.sds-btn-press-elastic {
  animation: sds-btnPressElastic var(--sds-duration-slower, 2.2s) ease-in-out infinite;
}
@keyframes sds-btnPressElastic {
  0%,
  18% {
    transform: scale(1, 1);
  }
  30% {
    transform: scale(1.08, 0.94);
  }
  42% {
    transform: scale(0.95, 1.05);
  }
  54% {
    transform: scale(1.04, 0.97);
  }
  64% {
    transform: scale(0.99, 1.01);
  }
  74%,
  100% {
    transform: scale(1, 1);
  }
}
/* ─── Family: Glow & Energy (drop-shadow only) ─────────────── */
/* 100 · Halo Breathe ---------------------------------------- */
.sds-btn-halo-breathe {
  animation: sds-btnHaloBreathe var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-btnHaloBreathe {
  0%,
  100% {
    filter: drop-shadow(0 0 2px var(--sds-primary-glow)) brightness(1);
  }
  50% {
    filter: drop-shadow(0 0 14px var(--sds-primary-glow)) brightness(1.08);
  }
}
/* 101 · Halo Flicker On ------------------------------------- */
.sds-btn-halo-flicker-on {
  animation: sds-btnHaloFlickerOn var(--sds-duration-slow, 1.4s) steps(1) both;
}
@keyframes sds-btnHaloFlickerOn {
  0% {
    opacity: 0;
    filter: drop-shadow(0 0 0 transparent);
  }
  10% {
    opacity: 0.7;
    filter: drop-shadow(0 0 6px var(--sds-primary-glow));
  }
  14% {
    opacity: 0.15;
    filter: drop-shadow(0 0 0 transparent);
  }
  30% {
    opacity: 0.9;
    filter: drop-shadow(0 0 10px var(--sds-primary-glow));
  }
  36% {
    opacity: 0.4;
  }
  52% {
    opacity: 1;
    filter: drop-shadow(0 0 16px var(--sds-primary-glow)) brightness(1.15);
  }
  72%,
  100% {
    opacity: 1;
    filter: drop-shadow(0 0 8px var(--sds-primary-glow)) brightness(1);
  }
}
/* 102 · Spark Orbit ----------------------------------------- */
.sds-btn-spark-orbit {
  position: relative;
}
.sds-btn-spark-orbit::before {
  content: "";
  position: absolute;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--sds-primary);
  filter: drop-shadow(0 0 5px var(--sds-primary-glow));
  /* the spark rides the button's own border box; browsers without
     offset-path support simply show no orbiting spark (decorative) */
  offset-path: border-box;
  offset-rotate: 0deg;
  animation: sds-btnSparkOrbit var(--sds-duration-dramatic, 3s) linear infinite;
}
@keyframes sds-btnSparkOrbit {
  0% {
    offset-distance: 0%;
    opacity: 1;
  }
  46% {
    opacity: 1;
  }
  50% {
    offset-distance: 50%;
    opacity: 0.45;
  }
  54% {
    opacity: 1;
  }
  100% {
    offset-distance: 100%;
    opacity: 1;
  }
}
/* 103 · Surge Charge ---------------------------------------- */
.sds-btn-surge-charge {
  animation: sds-btnSurgeCharge var(--sds-duration-dramatic, 3s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) infinite;
}
@keyframes sds-btnSurgeCharge {
  0%,
  14% {
    filter: brightness(1) drop-shadow(0 0 0 transparent);
    transform: scale(1);
  }
  38% {
    filter: brightness(0.85) saturate(1.15) drop-shadow(0 0 1px var(--sds-primary-glow));
    transform: scale(0.99);
  }
  52% {
    filter: brightness(1.3) drop-shadow(0 0 18px var(--sds-primary-glow));
    transform: scale(1.025);
  }
  64% {
    filter: brightness(1.05) drop-shadow(0 0 6px var(--sds-primary-glow));
    transform: scale(1);
  }
  80%,
  100% {
    filter: brightness(1) drop-shadow(0 0 0 transparent);
    transform: scale(1);
  }
}
/* 104 · Halo Split ------------------------------------------ */
.sds-btn-halo-split {
  position: relative;
}
.sds-btn-halo-split::before,
.sds-btn-halo-split::after {
  content: "";
  position: absolute;
  inset: 15% 30%;
  border-radius: 50%;
  background: var(--sds-primary);
  filter: blur(12px);
  opacity: 0;
  z-index: -1;
}
.sds-btn-halo-split::before {
  animation: sds-btnHaloSplitL var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
.sds-btn-halo-split::after {
  animation: sds-btnHaloSplitR var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-btnHaloSplitL {
  0%,
  100% {
    transform: translateX(0);
    opacity: 0.4;
  }
  45% {
    transform: translateX(-58%);
    opacity: 0.12;
  }
  62% {
    transform: translateX(-62%);
    opacity: 0;
  }
  80% {
    transform: translateX(-10%);
    opacity: 0.3;
  }
}
@keyframes sds-btnHaloSplitR {
  0%,
  100% {
    transform: translateX(0);
    opacity: 0.4;
  }
  45% {
    transform: translateX(58%);
    opacity: 0.12;
  }
  62% {
    transform: translateX(62%);
    opacity: 0;
  }
  80% {
    transform: translateX(10%);
    opacity: 0.3;
  }
}
/* 105 · Ember ----------------------------------------------- */
.sds-btn-ember {
  animation: sds-btnEmber var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-btnEmber {
  0%,
  100% {
    transform: skewX(0deg);
    filter: hue-rotate(0deg) brightness(1) drop-shadow(0 0 2px rgba(209, 64, 0, 0.25));
  }
  22% {
    transform: skewX(0.6deg);
    filter: hue-rotate(8deg) brightness(1.04) drop-shadow(0 0 5px rgba(209, 64, 0, 0.3));
  }
  48% {
    transform: skewX(-0.4deg);
    filter: hue-rotate(14deg) brightness(1.12) drop-shadow(0 0 10px rgba(209, 64, 0, 0.4));
  }
  72% {
    transform: skewX(0.3deg);
    filter: hue-rotate(6deg) brightness(1.03) drop-shadow(0 0 4px rgba(209, 64, 0, 0.28));
  }
}
/* ─── Family: Split & Slice ────────────────────────────────── */
/* 106 · Slice Reveal ---------------------------------------- */
.sds-btn-slice-reveal {
  animation: sds-btnSliceReveal var(--sds-duration-base, 0.8s) var(--sds-ease-decelerate, cubic-bezier(0.16, 1, 0.3, 1)) both;
}
@keyframes sds-btnSliceReveal {
  0% {
    opacity: 0;
    clip-path: polygon(0 0, 0 0, 0 50%, 100% 50%, 100% 100%, 100% 100%);
    transform: translateX(-14px);
  }
  45% {
    opacity: 1;
    clip-path: polygon(0 0, 80% 0, 80% 50%, 20% 50%, 20% 100%, 0 100%);
    transform: translateX(4px);
    filter: brightness(1.2);
  }
  70% {
    clip-path: polygon(0 0, 100% 0, 100% 50%, 0 50%, 0 100%, 0 100%);
    filter: brightness(1);
  }
  100% {
    opacity: 1;
    clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%, 0 100%, 0 0);
    transform: translateX(0);
  }
}
/* 107 · Slice Hover ----------------------------------------- */
.sds-btn-slice-hover {
  animation: sds-btnSliceHover var(--sds-duration-dramatic, 3s) steps(1) infinite;
}
@keyframes sds-btnSliceHover {
  0%,
  100% {
    clip-path: none;
    transform: none;
  }
  6% {
    clip-path: inset(0 0 48% 0);
    transform: translateX(4px);
  }
  8% {
    clip-path: inset(52% 0 0 0);
    transform: translateX(-4px);
  }
  10% {
    clip-path: none;
    transform: none;
  }
  54% {
    clip-path: inset(0 0 48% 0);
    transform: translateX(-3px);
  }
  56% {
    clip-path: inset(52% 0 0 0);
    transform: translateX(3px);
  }
  58% {
    clip-path: none;
    transform: none;
  }
}
/* 108 · Blinds ---------------------------------------------- */
.sds-btn-blinds {
  position: relative;
  animation: sds-btnBlindsHost var(--sds-duration-base, 0.8s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) both;
}
.sds-btn-blinds::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  background: repeating-linear-gradient(
    90deg,
    var(--sds-primary) 0 25%,
    rgba(0, 21, 209, 0.65) 25% 50%
  );
  opacity: 0.85;
  animation: sds-btnBlinds var(--sds-duration-base, 0.8s) steps(4) both;
}
@keyframes sds-btnBlinds {
  0% {
    clip-path: inset(0 0 0 0);
    opacity: 0.85;
  }
  99% {
    clip-path: inset(0 0 0 100%);
    opacity: 0.5;
  }
  100% {
    clip-path: inset(0 0 0 100%);
    opacity: 0;
  }
}
@keyframes sds-btnBlindsHost {
  0% {
    opacity: 0;
    transform: scale(0.97);
  }
  35% {
    opacity: 1;
  }
  100% {
    opacity: 1;
    transform: scale(1);
  }
}
/* 109 · Guillotine ------------------------------------------ */
.sds-btn-guillotine {
  animation: sds-btnGuillotine var(--sds-duration-base, 0.8s) var(--sds-ease-emphasized, cubic-bezier(0.215, 0.61, 0.355, 1)) both;
}
@keyframes sds-btnGuillotine {
  0% {
    opacity: 0;
    clip-path: inset(0 0 50% 0);
    transform: translateY(-10px);
  }
  34% {
    opacity: 1;
    clip-path: inset(0 0 50% 0);
    transform: translateY(-2px);
  }
  52% {
    clip-path: inset(0 0 0 0);
    transform: translateY(2px) scale(1.03, 0.95);
  }
  70% {
    transform: translateY(-1px) scale(0.99, 1.02);
  }
  100% {
    opacity: 1;
    clip-path: inset(0 0 0 0);
    transform: translateY(0) scale(1, 1);
  }
}
/* 110 · Shutter Snap ---------------------------------------- */
.sds-btn-shutter-snap {
  animation: sds-btnShutterSnap var(--sds-duration-slower, 2.2s) var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) infinite;
}
@keyframes sds-btnShutterSnap {
  0%,
  16% {
    clip-path: polygon(50% -60%, 160% 50%, 50% 160%, -60% 50%);
    transform: scale(1);
  }
  34% {
    clip-path: polygon(50% 38%, 62% 50%, 50% 62%, 38% 50%);
    transform: scale(0.98);
  }
  40% {
    clip-path: polygon(50% 34%, 66% 50%, 50% 66%, 34% 50%);
  }
  58% {
    clip-path: polygon(50% -75%, 175% 50%, 50% 175%, -75% 50%);
    transform: scale(1.02);
  }
  70%,
  100% {
    clip-path: polygon(50% -60%, 160% 50%, 50% 160%, -60% 50%);
    transform: scale(1);
  }
}
/* ─── Family: Icon & Label Orchestration (child spans) ─────── */
/* 111 · Label Slide ----------------------------------------- */
.sds-btn-label-slide {
  overflow: hidden;
}
.sds-btn-label-slide > * {
  display: inline-block;
  animation: sds-btnLabelSlide var(--sds-duration-dramatic, 3s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) infinite;
}
@keyframes sds-btnLabelSlide {
  0%,
  62% {
    transform: translateY(0);
    opacity: 1;
  }
  70% {
    transform: translateY(-130%);
    opacity: 0;
  }
  70.1% {
    transform: translateY(130%);
    opacity: 0;
  }
  80% {
    transform: translateY(-6%);
    opacity: 1;
  }
  88%,
  100% {
    transform: translateY(0);
  }
}
/* 112 · Label Wave ------------------------------------------ */
.sds-btn-label-wave > * {
  display: inline-block;
  animation: sds-btnLabelWave var(--sds-duration-slower, 2.2s) ease-in-out infinite;
}
.sds-btn-label-wave > *:nth-child(2) { animation-delay: 0.09s; }
.sds-btn-label-wave > *:nth-child(3) { animation-delay: 0.18s; }
.sds-btn-label-wave > *:nth-child(4) { animation-delay: 0.27s; }
.sds-btn-label-wave > *:nth-child(5) { animation-delay: 0.36s; }
.sds-btn-label-wave > *:nth-child(6) { animation-delay: 0.45s; }
@keyframes sds-btnLabelWave {
  0%,
  30%,
  100% {
    transform: translateY(0) rotate(0);
  }
  10% {
    transform: translateY(-2px) rotate(-2deg);
  }
  20% {
    transform: translateY(1px) rotate(1.4deg);
  }
}
/* 113 · Icon Launch ----------------------------------------- */
.sds-btn-icon-launch > *:first-child {
  display: inline-block;
  animation: sds-btnIconLaunch var(--sds-duration-slower, 2.2s) var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) infinite;
}
.sds-btn-icon-launch > *:last-child {
  display: inline-block;
  animation: sds-btnIconLaunchLabel var(--sds-duration-slower, 2.2s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) infinite;
}
@keyframes sds-btnIconLaunch {
  0%,
  22% {
    transform: translateX(0);
    filter: blur(0);
  }
  36% {
    transform: translateX(-2px);
    filter: blur(0);
  }
  48% {
    transform: translateX(6px);
    filter: blur(1.5px);
  }
  62% {
    transform: translateX(4px);
    filter: blur(0);
  }
  76%,
  100% {
    transform: translateX(0);
  }
}
@keyframes sds-btnIconLaunchLabel {
  0%,
  40% {
    transform: skewX(0deg) translateX(0);
  }
  54% {
    transform: skewX(-4deg) translateX(1.5px);
  }
  70%,
  100% {
    transform: skewX(0deg) translateX(0);
  }
}
/* 114 · Icon Spin Settle ------------------------------------ */
.sds-btn-icon-spin-settle > *:first-child {
  display: inline-block;
  animation: sds-btnIconSpinSettle var(--sds-duration-slower, 2.2s) var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) infinite;
}
.sds-btn-icon-spin-settle > *:last-child {
  display: inline-block;
  animation: sds-btnIconSpinLabel var(--sds-duration-slower, 2.2s) ease-in-out infinite;
}
@keyframes sds-btnIconSpinSettle {
  0%,
  20% {
    transform: rotate(0deg);
  }
  56% {
    transform: rotate(380deg);
  }
  68% {
    transform: rotate(356deg);
  }
  78%,
  100% {
    transform: rotate(360deg);
  }
}
@keyframes sds-btnIconSpinLabel {
  0%,
  20%,
  78%,
  100% {
    transform: scaleX(1);
  }
  50% {
    transform: scaleX(0.98);
  }
}
/* 115 · Swap Flip ------------------------------------------- */
.sds-btn-swap-flip > *:first-child {
  display: inline-block;
  animation: sds-btnSwapFlipA var(--sds-duration-dramatic, 3s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) infinite;
}
.sds-btn-swap-flip > *:last-child {
  display: inline-block;
  animation: sds-btnSwapFlipB var(--sds-duration-dramatic, 3s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) infinite;
}
@keyframes sds-btnSwapFlipA {
  0%,
  30% {
    transform: translateX(0);
    opacity: 1;
  }
  46% {
    transform: translateX(14px) translateY(-4px);
    opacity: 0.55;
  }
  62%,
  76% {
    transform: translateX(0);
    opacity: 1;
  }
  100% {
    transform: translateX(0);
  }
}
@keyframes sds-btnSwapFlipB {
  0%,
  30% {
    transform: translateX(0);
    opacity: 1;
  }
  46% {
    transform: translateX(-14px) translateY(4px);
    opacity: 0.55;
  }
  62%,
  76% {
    transform: translateX(0);
    opacity: 1;
  }
  100% {
    transform: translateX(0);
  }
}
/* 116 · Label Typewrite ------------------------------------- */
.sds-btn-label-typewrite > * {
  display: inline-block;
  animation: sds-btnLabelTypewrite var(--sds-duration-slower, 2.2s) steps(2) infinite;
}
.sds-btn-label-typewrite > *:nth-child(2) { animation-delay: 0.12s; }
.sds-btn-label-typewrite > *:nth-child(3) { animation-delay: 0.24s; }
.sds-btn-label-typewrite > *:nth-child(4) { animation-delay: 0.36s; }
.sds-btn-label-typewrite > *:nth-child(5) { animation-delay: 0.48s; }
.sds-btn-label-typewrite > *:nth-child(6) { animation-delay: 0.6s; }
.sds-btn-label-typewrite > *:nth-child(7) { animation-delay: 0.72s; }
.sds-btn-label-typewrite > *:nth-child(8) { animation-delay: 0.84s; }
@keyframes sds-btnLabelTypewrite {
  0% {
    opacity: 0;
    transform: translateY(2px);
  }
  12%,
  86% {
    opacity: 1;
    transform: translateY(0);
  }
  93% {
    opacity: 0.4;
  }
  100% {
    opacity: 0;
  }
}
/* 117 · Nudge ----------------------------------------------- */
.sds-btn-nudge > *:last-child {
  display: inline-block;
  animation: sds-btnNudge var(--sds-duration-slower, 2.2s) var(--sds-ease-emphasized, cubic-bezier(0.215, 0.61, 0.355, 1)) infinite;
}
@keyframes sds-btnNudge {
  0%,
  40%,
  76%,
  100% {
    transform: translateX(0);
  }
  50% {
    transform: translateX(5px);
  }
  60% {
    transform: translateX(0);
  }
  66% {
    transform: translateX(2.5px);
  }
}
/* ─── Family: CSS-only Magnetic Tilt ───────────────────────── */
/* 118 · Tilt Orbit ------------------------------------------ */
.sds-btn-tilt-orbit {
  will-change: transform;
  animation: sds-btnTiltOrbit var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-btnTiltOrbit {
  0%,
  100% {
    transform: perspective(420px) rotateX(4deg) rotateY(0deg);
  }
  25% {
    transform: perspective(420px) rotateX(0deg) rotateY(5deg);
  }
  50% {
    transform: perspective(420px) rotateX(-4deg) rotateY(0deg);
  }
  75% {
    transform: perspective(420px) rotateX(0deg) rotateY(-5deg);
  }
}
/* 119 · Tilt Pendulum --------------------------------------- */
.sds-btn-tilt-pendulum {
  transform-origin: top center;
  animation: sds-btnTiltPendulum var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-btnTiltPendulum {
  0%,
  100% {
    transform: rotate(0deg);
  }
  14% {
    transform: rotate(4deg);
  }
  32% {
    transform: rotate(-3deg);
  }
  48% {
    transform: rotate(2deg);
  }
  62% {
    transform: rotate(-1.2deg);
  }
  74% {
    transform: rotate(0.5deg);
  }
  84% {
    transform: rotate(0deg);
  }
}
/* 120 · Tilt Scan ------------------------------------------- */
.sds-btn-tilt-scan {
  animation: sds-btnTiltScan var(--sds-duration-dramatic, 3s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) infinite;
}
@keyframes sds-btnTiltScan {
  0%,
  10% {
    transform: perspective(420px) rotateX(3deg) rotateY(-4deg);
  }
  24%,
  36% {
    transform: perspective(420px) rotateX(3deg) rotateY(4deg);
  }
  50%,
  62% {
    transform: perspective(420px) rotateX(-3deg) rotateY(4deg);
  }
  74%,
  86% {
    transform: perspective(420px) rotateX(-3deg) rotateY(-4deg);
  }
  100% {
    transform: perspective(420px) rotateX(3deg) rotateY(-4deg);
  }
}
/* 121 · Tilt Float ------------------------------------------ */
.sds-btn-tilt-float {
  animation: sds-btnTiltFloat var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-btnTiltFloat {
  0%,
  100% {
    transform: translateY(0) rotate(0deg);
    filter: drop-shadow(0 3px 3px rgba(0, 21, 209, 0.18));
  }
  35% {
    transform: translateY(-5px) rotate(1.2deg);
    filter: drop-shadow(0 10px 8px rgba(0, 21, 209, 0.12));
  }
  65% {
    transform: translateY(-3px) rotate(-0.8deg);
    filter: drop-shadow(0 7px 6px rgba(0, 21, 209, 0.14));
  }
}
/* ─── Family: Sheen & Spotlight Overlays ───────────────────── */
/* 122 · Sheen Pass ------------------------------------------ */
.sds-btn-sheen-pass {
  position: relative;
  overflow: hidden;
}
.sds-btn-sheen-pass::before {
  content: "";
  position: absolute;
  top: -20%;
  bottom: -20%;
  left: 0;
  width: 34%;
  background: rgba(255, 255, 255, 0.45);
  filter: blur(6px);
  transform: translateX(-180%) skewX(-20deg);
  animation: sds-btnSheenPass var(--sds-duration-slower, 2.2s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) infinite;
}
@keyframes sds-btnSheenPass {
  0%,
  18% {
    transform: translateX(-180%) skewX(-20deg);
    opacity: 0;
  }
  30% {
    opacity: 1;
  }
  48% {
    transform: translateX(180%) skewX(-20deg);
    opacity: 1;
  }
  60%,
  100% {
    transform: translateX(320%) skewX(-20deg);
    opacity: 0;
  }
}
/* 123 · Sheen Double ---------------------------------------- */
.sds-btn-sheen-double {
  position: relative;
  overflow: hidden;
}
.sds-btn-sheen-double::before,
.sds-btn-sheen-double::after {
  content: "";
  position: absolute;
  top: -20%;
  bottom: -20%;
  width: 26%;
  background: rgba(255, 255, 255, 0.38);
  filter: blur(5px);
}
.sds-btn-sheen-double::before {
  left: 0;
  transform: translateX(-200%) skewX(-18deg);
  animation: sds-btnSheenDoubleA var(--sds-duration-slower, 2.2s) ease-in-out infinite;
}
.sds-btn-sheen-double::after {
  right: 0;
  transform: translateX(200%) skewX(18deg);
  animation: sds-btnSheenDoubleB var(--sds-duration-slower, 2.2s) ease-in-out infinite;
}
@keyframes sds-btnSheenDoubleA {
  0%,
  14% {
    transform: translateX(-200%) skewX(-18deg);
    opacity: 0;
  }
  26% {
    opacity: 1;
  }
  44% {
    transform: translateX(190%) skewX(-18deg);
    opacity: 1;
    filter: blur(5px) brightness(1.5);
  }
  58%,
  100% {
    transform: translateX(420%) skewX(-18deg);
    opacity: 0;
  }
}
@keyframes sds-btnSheenDoubleB {
  0%,
  14% {
    transform: translateX(200%) skewX(18deg);
    opacity: 0;
  }
  26% {
    opacity: 1;
  }
  44% {
    transform: translateX(-190%) skewX(18deg);
    opacity: 1;
    filter: blur(5px) brightness(1.5);
  }
  58%,
  100% {
    transform: translateX(-420%) skewX(18deg);
    opacity: 0;
  }
}
/* 124 · Prism Edge ------------------------------------------ */
.sds-btn-prism-edge {
  position: relative;
}
.sds-btn-prism-edge::before {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  border: 1.5px solid var(--sds-primary);
  animation: sds-btnPrismEdge var(--sds-duration-dramatic, 3s) linear infinite;
}
@keyframes sds-btnPrismEdge {
  0% {
    filter: hue-rotate(0deg) brightness(1.1);
    clip-path: inset(0 0 0 0);
    opacity: 0.9;
  }
  25% {
    filter: hue-rotate(90deg) brightness(1.3);
    clip-path: inset(0 0 55% 0);
  }
  50% {
    filter: hue-rotate(180deg) brightness(1.1);
    clip-path: inset(0 0 0 0);
    opacity: 0.65;
  }
  75% {
    filter: hue-rotate(270deg) brightness(1.3);
    clip-path: inset(55% 0 0 0);
  }
  100% {
    filter: hue-rotate(360deg) brightness(1.1);
    clip-path: inset(0 0 0 0);
    opacity: 0.9;
  }
}
/* 125 · Night Sweep ----------------------------------------- */
.sds-btn-night-sweep {
  position: relative;
  overflow: hidden;
}
.sds-btn-night-sweep::after {
  content: "";
  position: absolute;
  inset: 0;
  background: #06060c;
  opacity: 0.55;
  animation: sds-btnNightSweep var(--sds-duration-dramatic, 3s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) infinite;
}
@keyframes sds-btnNightSweep {
  0%,
  12% {
    clip-path: inset(0 0 0 0);
    opacity: 0.55;
  }
  46% {
    clip-path: inset(0 0 0 100%);
    opacity: 0.45;
  }
  56%,
  72% {
    clip-path: inset(0 0 0 100%);
    opacity: 0;
  }
  84% {
    clip-path: inset(0 0 0 0);
    opacity: 0.3;
  }
  100% {
    clip-path: inset(0 0 0 0);
    opacity: 0.55;
  }
}
/* 126 · Spotlight Pan --------------------------------------- */
.sds-btn-spotlight-pan {
  position: relative;
  overflow: hidden;
}
.sds-btn-spotlight-pan::before {
  content: "";
  position: absolute;
  top: -75%;
  left: -25%;
  width: 90%;
  aspect-ratio: 1;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(255, 255, 255, 0.4) 0%, rgba(255, 255, 255, 0) 65%);
  animation: sds-btnSpotlightPan var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-btnSpotlightPan {
  0%,
  100% {
    transform: translate(-30%, 0);
    opacity: 0.4;
  }
  50% {
    transform: translate(130%, 55%);
    opacity: 1;
  }
}
/* ─── Family: Attention Rhythms ────────────────────────────── */
/* 127 · Beacon ---------------------------------------------- */
.sds-btn-beacon {
  position: relative;
}
.sds-btn-beacon::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  border: 1.5px solid var(--sds-primary);
  opacity: 0;
  animation: sds-btnBeacon var(--sds-duration-slower, 2.2s) var(--sds-ease-decelerate, cubic-bezier(0.16, 1, 0.3, 1)) infinite;
}
@keyframes sds-btnBeacon {
  0%,
  58% {
    transform: scale(1);
    opacity: 0;
  }
  62% {
    opacity: 0.8;
    transform: scale(1);
  }
  88%,
  100% {
    transform: scale(1.28, 1.65);
    opacity: 0;
  }
}
/* 128 · Tick Tock ------------------------------------------- */
.sds-btn-tick-tock {
  animation: sds-btnTickTock var(--sds-duration-slower, 2.2s) var(--sds-ease-emphasized, cubic-bezier(0.215, 0.61, 0.355, 1)) infinite;
}
@keyframes sds-btnTickTock {
  0%,
  8% {
    transform: rotate(-1.5deg) scale(1);
  }
  25%,
  33% {
    transform: rotate(1.5deg) scale(1);
  }
  50%,
  58% {
    transform: rotate(-1.5deg) scale(1);
  }
  75%,
  80% {
    transform: rotate(1.5deg) scale(1);
  }
  90% {
    transform: rotate(0deg) scale(1.04);
  }
  100% {
    transform: rotate(-1.5deg) scale(1);
  }
}
/* 129 · Breath Hold ----------------------------------------- */
.sds-btn-breath-hold {
  animation: sds-btnBreathHold var(--sds-duration-dramatic, 3s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) infinite;
}
@keyframes sds-btnBreathHold {
  0%,
  10% {
    transform: scale(1);
    filter: brightness(1);
  }
  42% {
    transform: scale(1.03);
    filter: brightness(1.09);
  }
  58% {
    transform: scale(1.03);
    filter: brightness(1.09);
  }
  70% {
    transform: scale(0.995);
    filter: brightness(0.98);
  }
  80%,
  100% {
    transform: scale(1);
    filter: brightness(1);
  }
}
/* 130 · Wink ------------------------------------------------ */
.sds-btn-wink {
  position: relative;
  overflow: hidden;
}
.sds-btn-wink::before {
  content: "";
  position: absolute;
  top: 0;
  right: 0;
  width: 38%;
  height: 60%;
  background: rgba(255, 255, 255, 0.5);
  filter: blur(7px);
  clip-path: polygon(35% 0, 100% 0, 100% 100%, 0 100%);
  opacity: 0;
  animation: sds-btnWink var(--sds-duration-dramatic, 3s) steps(1) infinite;
}
@keyframes sds-btnWink {
  0%,
  72% {
    opacity: 0;
    transform: translateX(0);
  }
  76% {
    opacity: 0.85;
    transform: translateX(-8%);
  }
  80% {
    opacity: 0;
    transform: translateX(0);
  }
  84% {
    opacity: 0.5;
    transform: translateX(-4%);
  }
  88%,
  100% {
    opacity: 0;
  }
}
/*!
 * SDS Motion Forge — inputs.css
 * Input animations (Section 3).
 * Part of the lossless v5 category split — combined entry: src/motion.css
 */
/* ============================================================
   SECTION 3 — INPUT ANIMATIONS
   Namespace: .sds-input-*
   ============================================================ */
/* 44 · Focus Field ----------------------------------------- */
.sds-input-focus:focus {
  animation: sds-focusField var(--sds-duration-instant, 0.3s) ease both;
}
@keyframes sds-focusField {
  from {
    box-shadow:
      0 0 0 0 var(--sds-primary-glow),
      0 0 0 0 var(--sds-primary-dim);
  }
  to {
    box-shadow:
      0 0 0 3px var(--sds-primary-dim),
      0 0 16px rgba(0, 21, 209, 0.08);
  }
}
/* 45 · Border Morph ---------------------------------------- */
.sds-input-morph {
  animation: sds-borderMorph 2.5s ease infinite;
}
@keyframes sds-borderMorph {
  0%,
  100% {
    border-radius: 8px;
  }
  50% {
    border-radius: 16px 4px 16px 4px;
  }
}
/* 46 · Shimmer Scan ---------------------------------------- */
.sds-input-shimmer {
  background: linear-gradient(
    90deg,
    transparent 40%,
    rgba(0, 21, 209, 0.08) 50%,
    transparent 60%
  );
  background-size: 300% 100%;
  animation: sds-shimmerScan 2.5s ease infinite;
}
@keyframes sds-shimmerScan {
  from {
    background-position: -200% center;
  }
  to {
    background-position: 300% center;
  }
}
/* 47 · Voltage Pulse --------------------------------------- */
.sds-input-voltage {
  animation: sds-voltagePulse 2s ease infinite;
}
@keyframes sds-voltagePulse {
  0%,
  100% {
    border-color: rgba(0, 21, 209, 0.3);
  }
  10% {
    border-color: var(--sds-primary);
    box-shadow: 0 0 12px var(--sds-primary-glow);
  }
  20% {
    border-color: rgba(0, 21, 209, 0.3);
    box-shadow: none;
  }
  30% {
    border-color: var(--sds-primary);
    box-shadow: 0 0 8px var(--sds-primary-glow);
  }
  40% {
    border-color: rgba(0, 21, 209, 0.3);
  }
}
/* 48 · Seismic Shake --------------------------------------- */
.sds-input-shake {
  animation: sds-seismicShake 0.5s ease both;
}
@keyframes sds-seismicShake {
  0%,
  100% {
    transform: translateX(0);
  }
  10% {
    transform: translateX(-6px) rotate(-0.5deg);
  }
  25% {
    transform: translateX(6px) rotate(0.5deg);
  }
  40% {
    transform: translateX(-5px);
  }
  55% {
    transform: translateX(4px);
  }
  70% {
    transform: translateX(-2px);
  }
  85% {
    transform: translateX(2px);
  }
}
/* 49 · Success Glow ---------------------------------------- */
.sds-input-success {
  animation: sds-successGlow 0.6s ease both;
}
@keyframes sds-successGlow {
  0% {
    border-color: rgba(0, 196, 140, 0.3);
    box-shadow: none;
  }
  40% {
    border-color: var(--sds-success);
    box-shadow:
      0 0 16px rgba(0, 196, 140, 0.3),
      0 0 4px rgba(0, 196, 140, 0.5);
  }
  100% {
    border-color: rgba(0, 196, 140, 0.5);
    box-shadow: 0 0 8px rgba(0, 196, 140, 0.15);
  }
}
/* 50 · Caret Trail ----------------------------------------- */
.sds-input-caret {
  animation: sds-caretTrail 2s ease infinite;
}
@keyframes sds-caretTrail {
  0%,
  100% {
    box-shadow: 0 0 0 0 rgba(0, 21, 209, 0);
  }
  50% {
    box-shadow:
      0 0 0 4px var(--sds-primary-dim),
      inset 0 0 0 1px rgba(0, 21, 209, 0.3);
  }
}
/* 51 · Morph Placeholder ----------------------------------- */
.sds-input-morph-ph::-moz-placeholder {
  animation: sds-morphPlaceholder 2s ease infinite;
}
.sds-input-morph-ph::placeholder {
  animation: sds-morphPlaceholder 2s ease infinite;
}
@keyframes sds-morphPlaceholder {
  0%,
  100% {
    letter-spacing: 0;
    opacity: 0.4;
  }
  50% {
    letter-spacing: 2px;
    opacity: 0.1;
    filter: blur(1px);
  }
}
/* 52 · Elevate Focus --------------------------------------- */
.sds-input-elevate-wrap {
  position: relative;
}
.sds-input-elevate-wrap label {
  position: absolute;
  left: 14px;
  top: 50%;
  transform: translateY(-50%) scale(1);
  transform-origin: left;
  pointer-events: none;
  transition:
    transform 0.25s var(--sds-easing),
    color 0.25s ease;
  color: rgba(0, 0, 0, 0.4);
}
.sds-input-elevate-wrap input:not(:-moz-placeholder) ~ label {
  transform: translateY(-140%) scale(0.82);
  color: var(--sds-primary);
}
.sds-input-elevate-wrap input:focus ~ label,
.sds-input-elevate-wrap input:not(:placeholder-shown) ~ label {
  transform: translateY(-140%) scale(0.82);
  color: var(--sds-primary);
}
/* 53 · Ink Stroke ------------------------------------------ */
.sds-input-ink:focus {
  outline-style: solid;
  animation: sds-inkStroke var(--sds-duration-instant, 0.3s) ease both;
}
@keyframes sds-inkStroke {
  0% {
    outline-offset: 0;
    outline-color: rgba(0, 21, 209, 0);
  }
  100% {
    outline-offset: 2px;
    outline-color: rgba(0, 21, 209, 0.2);
  }
}
/* 54 · Plasma Field ---------------------------------------- */
.sds-input-plasma {
  animation: sds-plasmaGlow var(--sds-duration-dramatic, 3s) ease infinite;
}
/* 55 · Ring Pulse ------------------------------------------ */
.sds-input-ring {
  animation: sds-magnetPulse 2s ease 0.5s infinite;
}
/* 56 · Neon Input ------------------------------------------ */
.sds-input-neon {
  animation: sds-neonSign 4s ease infinite;
}
/* 57 · Scan ---------------------------------------------- */
.sds-input-scan {
  background-image: linear-gradient(
    90deg,
    transparent 30%,
    rgba(0, 21, 209, 0.1) 50%,
    transparent 70%
  );
  background-size: 300% 100%;
  animation: sds-inputScan 2s ease infinite;
}
@keyframes sds-inputScan {
  0% {
    background-position: -200% center;
  }
  100% {
    background-position: 300% center;
  }
}
/* 58 · Glow Border --------------------------------------- */
.sds-input-glow-border {
  animation: sds-inputGlowBorder 2s ease-in-out infinite;
}
@keyframes sds-inputGlowBorder {
  0%,
  100% {
    box-shadow:
      0 0 0 1.5px rgba(0, 21, 209, 0.2),
      0 0 0 rgba(0, 21, 209, 0);
  }
  50% {
    box-shadow:
      0 0 0 1.5px var(--sds-primary),
      0 0 16px var(--sds-primary-glow);
  }
}
/* 59 · Neural -------------------------------------------- */
.sds-input-neural {
  animation: sds-inputNeural var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-inputNeural {
  0%,
  100% {
    box-shadow:
      0 0 0 2px rgba(0, 21, 209, 0.15),
      0 0 0 6px rgba(0, 21, 209, 0);
  }
  33% {
    box-shadow:
      0 0 0 2px rgba(0, 21, 209, 0.5),
      0 0 0 6px rgba(0, 21, 209, 0.08);
  }
  66% {
    box-shadow:
      0 0 0 2px rgba(0, 21, 209, 0.3),
      0 0 0 10px rgba(0, 21, 209, 0.04);
  }
}
/* 60 · Aurora -------------------------------------------- */
.sds-input-aurora {
  animation: sds-inputAurora 4s ease-in-out infinite;
}
@keyframes sds-inputAurora {
  0%,
  100% {
    box-shadow: 0 0 8px rgba(0, 21, 209, 0.2);
  }
  25% {
    box-shadow: 0 0 12px rgba(139, 92, 246, 0.35);
  }
  50% {
    box-shadow: 0 0 10px rgba(6, 182, 212, 0.3);
  }
  75% {
    box-shadow: 0 0 10px rgba(16, 185, 129, 0.3);
  }
}
/* 61 · Border Beam --------------------------------------- */
.sds-input-border-beam {
  animation: sds-inputBorderBeam 2s linear infinite;
  outline-style: solid;
  outline-color: transparent;
}
@keyframes sds-inputBorderBeam {
  0% {
    outline-offset: 0;
    outline-width: 0;
    outline-color: var(--sds-primary-glow);
  }
  40% {
    outline-offset: 3px;
    outline-width: 2px;
    outline-color: rgba(0, 21, 209, 0.5);
  }
  100% {
    outline-offset: 8px;
    outline-width: 0;
    outline-color: rgba(0, 21, 209, 0);
  }
}
/* 62 · Depth -------------------------------------------- */
.sds-input-depth {
  animation: sds-inputDepth 2.4s ease-in-out infinite;
}
@keyframes sds-inputDepth {
  0%,
  100% {
    transform: perspective(300px) translateZ(0);
    box-shadow: 0 2px 6px rgba(0, 21, 209, 0.08);
  }
  50% {
    transform: perspective(300px) translateZ(4px);
    box-shadow: 0 8px 24px rgba(0, 21, 209, 0.16);
  }
}
/* 63 · Charge ------------------------------------------- */
.sds-input-charge {
  animation: sds-inputCharge var(--sds-duration-slower, 2.2s) ease-in-out infinite;
}
@keyframes sds-inputCharge {
  0% {
    border-color: rgba(0, 21, 209, 0.2);
    box-shadow: none;
  }
  70% {
    border-color: var(--sds-primary);
    box-shadow:
      0 0 20px var(--sds-primary-glow),
      0 0 4px var(--sds-primary-glow);
  }
  100% {
    border-color: rgba(0, 21, 209, 0.2);
    box-shadow: none;
  }
}
/* 64 · Ripple ------------------------------------------- */
.sds-input-ripple {
  animation: sds-inputRipple 2.4s ease infinite;
}
@keyframes sds-inputRipple {
  0% {
    box-shadow: 0 0 0 0 var(--sds-primary-glow);
  }
  60% {
    box-shadow: 0 0 0 8px rgba(0, 21, 209, 0);
  }
  100% {
    box-shadow: 0 0 0 0 rgba(0, 21, 209, 0);
  }
}
/* 65 · Pulse Dot ---------------------------------------- */
.sds-input-pulse-dot {
  border-left: 3px solid var(--sds-primary);
  animation: sds-inputPulseDot var(--sds-duration-slow, 1.4s) ease-in-out infinite;
}
@keyframes sds-inputPulseDot {
  0%,
  100% {
    border-left-color: rgba(0, 21, 209, 0.3);
  }
  50% {
    border-left-color: var(--sds-primary);
    box-shadow: -4px 0 12px var(--sds-primary-glow);
  }
}
/* 66 · Orbit ------------------------------------------- */
.sds-input-orbit {
  animation: sds-inputOrbit 2s linear infinite;
  outline: 2px solid transparent;
}
@keyframes sds-inputOrbit {
  0% {
    outline-color: rgba(0, 21, 209, 0.6);
    outline-offset: 0;
  }
  50% {
    outline-offset: 4px;
    outline-color: rgba(0, 21, 209, 0.2);
  }
  100% {
    outline-color: rgba(0, 21, 209, 0);
    outline-offset: 8px;
  }
}
/* 67 · Gradient Border ---------------------------------- */
.sds-input-gradient-border {
  border: none;
  background-image:
    linear-gradient(white, white),
    linear-gradient(
      135deg,
      var(--sds-primary),
      #8b5cf6,
      var(--sds-accent),
      var(--sds-primary)
    );
  background-clip: padding-box, border-box;
  background-origin: padding-box, border-box;
  animation: sds-inputGradBorder var(--sds-duration-dramatic, 3s) linear infinite;
}
@keyframes sds-inputGradBorder {
  0% {
    filter: hue-rotate(0deg);
  }
  100% {
    filter: hue-rotate(360deg);
  }
}
/* 68 · Active Line -------------------------------------- */
.sds-input-active-line {
  border-bottom: 2px solid var(--sds-primary);
  border-radius: 0;
  animation: sds-inputActiveLine 1.8s ease-in-out infinite;
}
@keyframes sds-inputActiveLine {
  0%,
  100% {
    border-bottom-color: rgba(0, 21, 209, 0.25);
  }
  50% {
    border-bottom-color: var(--sds-primary);
    box-shadow: 0 2px 8px var(--sds-primary-glow);
  }
}
/* 69 · Glitch Valid ------------------------------------- */
.sds-input-glitch-valid {
  animation: sds-inputGlitchValid var(--sds-duration-fast, 0.4s) steps(1) both;
}
@keyframes sds-inputGlitchValid {
  0% {
    transform: translateX(0);
    border-color: var(--sds-success);
  }
  10% {
    transform: translateX(-3px);
  }
  20% {
    transform: translateX(3px);
    border-color: var(--sds-primary);
  }
  30% {
    transform: translateX(0);
    border-color: var(--sds-success);
  }
  40% {
    transform: translateX(-2px);
  }
  100% {
    transform: translateX(0);
    border-color: var(--sds-success);
  }
}
/* 70 · Flicker ------------------------------------------ */
.sds-input-flicker {
  animation: sds-inputFlicker 4s steps(1) infinite;
}
@keyframes sds-inputFlicker {
  0%,
  100% {
    opacity: 1;
  }
  45% {
    opacity: 0.85;
  }
  46% {
    opacity: 1;
  }
  80% {
    opacity: 0.92;
  }
  81% {
    opacity: 1;
  }
}
/* 71 · Kinetic ------------------------------------------ */
.sds-input-kinetic {
  animation: sds-inputKinetic var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-inputKinetic {
  0%,
  100% {
    transform: scaleX(1);
  }
  25% {
    transform: scaleX(1.015);
  }
  75% {
    transform: scaleX(0.988);
  }
}
/* 72 · Waveform ----------------------------------------- */
.sds-input-waveform {
  animation: sds-inputWaveform 1.6s ease-in-out infinite;
}
@keyframes sds-inputWaveform {
  0%,
  100% {
    transform: scaleY(1);
    border-color: rgba(0, 21, 209, 0.3);
  }
  25% {
    transform: scaleY(1.03) scaleX(1.008);
    border-color: var(--sds-primary);
  }
  75% {
    transform: scaleY(0.97) scaleX(0.992);
  }
}
/* 73 · Solar -------------------------------------------- */
.sds-input-solar {
  animation: sds-inputSolar 2.8s ease-in-out infinite;
}
@keyframes sds-inputSolar {
  0%,
  100% {
    box-shadow: 0 0 0 rgba(251, 191, 36, 0);
  }
  50% {
    box-shadow:
      0 0 20px rgba(251, 191, 36, 0.35),
      0 0 40px rgba(251, 191, 36, 0.12),
      0 0 60px rgba(251, 191, 36, 0.04);
  }
}
/* 74 · Burst -------------------------------------------- */
.sds-input-burst {
  animation: sds-inputBurst 1.8s var(--sds-easing) both;
}
@keyframes sds-inputBurst {
  0% {
    transform: scale(0.92);
    opacity: 0;
    box-shadow: 0 0 0 rgba(0, 21, 209, 0);
  }
  40% {
    transform: scale(1.04);
    box-shadow: 0 0 24px var(--sds-primary-glow);
  }
  70% {
    transform: scale(0.98);
    box-shadow: 0 0 8px rgba(0, 21, 209, 0.1);
  }
  100% {
    transform: scale(1);
    opacity: 1;
    box-shadow: none;
  }
}
/* 75 · Momentum ----------------------------------------- */
.sds-input-momentum {
  animation: sds-inputMomentum 0.7s var(--sds-easing) both;
}
@keyframes sds-inputMomentum {
  0% {
    opacity: 0;
    transform: translateY(16px) scaleY(0.85);
    filter: blur(4px);
  }
  60% {
    opacity: 1;
    transform: translateY(-2px) scaleY(1.02);
    filter: blur(0);
  }
  100% {
    opacity: 1;
    transform: translateY(0) scaleY(1);
  }
}
/* 76 · Echo -------------------------------------------- */
.sds-input-echo {
  animation: sds-inputEcho 2.4s ease-out infinite;
  outline-style: solid;
  outline-color: transparent;
}
@keyframes sds-inputEcho {
  0% {
    outline-offset: 0;
    outline-width: 0;
    outline-color: var(--sds-primary-glow);
  }
  20% {
    outline-width: 2px;
  }
  100% {
    outline-offset: 12px;
    outline-width: 0;
    outline-color: rgba(0, 21, 209, 0);
  }
}
/* 77 · Laser -------------------------------------------- */
.sds-input-laser {
  background-image: linear-gradient(
    90deg,
    transparent 0%,
    rgba(0, 21, 209, 0.15) 40%,
    rgba(0, 21, 209, 0.25) 50%,
    rgba(0, 21, 209, 0.15) 60%,
    transparent 100%
  );
  background-size: 200% 100%;
  animation: sds-inputLaser 1.5s linear infinite;
}
@keyframes sds-inputLaser {
  0% {
    background-position: -100% center;
  }
  100% {
    background-position: 200% center;
  }
}
/* 78 · Gravity ------------------------------------------ */
.sds-input-gravity {
  animation: sds-inputGravity var(--sds-duration-base, 0.8s) var(--sds-ease-bounce, cubic-bezier(0.68, -0.55, 0.27, 1.55)) both;
}
@keyframes sds-inputGravity {
  0% {
    opacity: 0;
    transform: translateY(-30px);
  }
  70% {
    opacity: 1;
    transform: translateY(4px);
  }
  85% {
    transform: translateY(-2px);
  }
  100% {
    opacity: 1;
    transform: translateY(0);
  }
}
/* 79 · Void -------------------------------------------- */
.sds-input-void {
  animation: sds-inputVoid 2.6s ease-in-out infinite;
}
@keyframes sds-inputVoid {
  0%,
  100% {
    box-shadow: inset 0 0 0 rgba(0, 21, 209, 0);
  }
  50% {
    box-shadow:
      inset 0 0 24px rgba(0, 21, 209, 0.1),
      inset 0 0 8px rgba(0, 21, 209, 0.08);
  }
}
/* 80 · Comet ------------------------------------------- */
.sds-input-comet {
  animation: sds-inputComet var(--sds-duration-dramatic, 3s) linear infinite;
}
@keyframes sds-inputComet {
  0% {
    box-shadow:
      -4px 0 0 0 transparent,
      0 0 0 0 transparent;
  }
  50% {
    box-shadow:
      0 0 0 1.5px rgba(0, 21, 209, 0.5),
      0 0 12px var(--sds-primary-glow);
  }
  100% {
    box-shadow:
      4px 0 0 0 transparent,
      0 0 0 0 transparent;
  }
}
/* 81 · Zap --------------------------------------------- */
.sds-input-zap {
  animation: sds-inputZap var(--sds-duration-dramatic, 3s) ease infinite;
}
@keyframes sds-inputZap {
  0%,
  100% {
    transform: none;
    border-color: rgba(0, 21, 209, 0.3);
  }
  8% {
    transform: skewX(3deg);
    border-color: var(--sds-primary);
    box-shadow: 0 0 12px var(--sds-primary-glow);
  }
  10% {
    transform: skewX(-2deg);
  }
  12% {
    transform: none;
    border-color: rgba(0, 21, 209, 0.3);
    box-shadow: none;
  }
}
/* 82 · Ghost ------------------------------------------- */
.sds-input-ghost {
  background-image: linear-gradient(
    90deg,
    rgba(255, 255, 255, 0) 0%,
    rgba(255, 255, 255, 0.6) 50%,
    rgba(255, 255, 255, 0) 100%
  );
  background-size: 200% 100%;
  animation: sds-inputGhost var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-inputGhost {
  0% {
    background-position: -100% center;
    opacity: 0.8;
  }
  50% {
    opacity: 1;
  }
  100% {
    background-position: 200% center;
    opacity: 0.8;
  }
}
/* 83 · Crystal ----------------------------------------- */
.sds-input-crystal {
  animation: sds-inputCrystal 2.4s ease-in-out infinite;
}
@keyframes sds-inputCrystal {
  0%,
  100% {
    filter: brightness(1) contrast(1);
    border-color: rgba(0, 21, 209, 0.25);
  }
  50% {
    filter: brightness(1.15) contrast(1.05);
    border-color: rgba(6, 182, 212, 0.6);
    box-shadow: 0 0 12px rgba(6, 182, 212, 0.2);
  }
}
/* 84 · Prism ------------------------------------------- */
.sds-input-prism {
  animation: sds-inputPrism 4s linear infinite;
}
@keyframes sds-inputPrism {
  0% {
    border-color: rgba(0, 21, 209, 0.4);
    box-shadow: 0 0 6px rgba(0, 21, 209, 0.2);
  }
  25% {
    border-color: rgba(139, 92, 246, 0.4);
    box-shadow: 0 0 6px rgba(139, 92, 246, 0.2);
  }
  50% {
    border-color: rgba(209, 0, 40, 0.4);
    box-shadow: 0 0 6px rgba(209, 0, 40, 0.15);
  }
  75% {
    border-color: rgba(6, 182, 212, 0.4);
    box-shadow: 0 0 6px rgba(6, 182, 212, 0.2);
  }
  100% {
    border-color: rgba(0, 21, 209, 0.4);
    box-shadow: 0 0 6px rgba(0, 21, 209, 0.2);
  }
}
/* 85 · Fire -------------------------------------------- */
.sds-input-fire {
  animation: sds-inputFire 2s ease-in-out infinite;
}
@keyframes sds-inputFire {
  0%,
  100% {
    border-color: rgba(239, 68, 68, 0.3);
    box-shadow: 0 0 4px rgba(239, 68, 68, 0.1);
  }
  33% {
    border-color: rgba(251, 113, 133, 0.6);
    box-shadow: 0 0 14px rgba(251, 146, 60, 0.25);
  }
  66% {
    border-color: rgba(239, 68, 68, 0.5);
    box-shadow: 0 0 10px rgba(239, 68, 68, 0.2);
  }
}
/* 86 · Quantum ----------------------------------------- */
.sds-input-quantum {
  animation: sds-inputQuantum var(--sds-duration-dramatic, 3s) steps(1) infinite;
}
@keyframes sds-inputQuantum {
  0%,
  100% {
    border-color: rgba(0, 21, 209, 0.35);
  }
  10% {
    border-color: var(--sds-primary);
  }
  11% {
    border-color: rgba(0, 21, 209, 0.35);
  }
  50% {
    border-color: rgba(139, 92, 246, 0.5);
  }
  51% {
    border-color: rgba(0, 21, 209, 0.35);
  }
}
/* 87 · Expand ------------------------------------------ */
.sds-input-expand {
  animation: sds-inputExpand 0.6s var(--sds-easing) both;
}
@keyframes sds-inputExpand {
  from {
    transform: scaleX(0.6);
    opacity: 0;
    border-radius: 99px;
  }
  to {
    transform: scaleX(1);
    opacity: 1;
    border-radius: inherit;
  }
}
/* 88 · Unlock ------------------------------------------ */
.sds-input-unlock {
  animation: sds-inputUnlock var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-inputUnlock {
  0% {
    transform: rotate(-8deg) scale(0.9);
    opacity: 0;
  }
  60% {
    transform: rotate(2deg) scale(1.02);
    opacity: 1;
  }
  100% {
    transform: rotate(0) scale(1);
    opacity: 1;
  }
}
/* 89 · Flow -------------------------------------------- */
.sds-input-flow {
  background-image: linear-gradient(
    90deg,
    rgba(0, 21, 209, 0.05),
    rgba(139, 92, 246, 0.08),
    rgba(0, 21, 209, 0.05)
  );
  background-size: 300% 100%;
  animation: sds-inputFlow var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-inputFlow {
  0%,
  100% {
    background-position: 0% center;
  }
  50% {
    background-position: 100% center;
  }
}
/* 90 · Frost ------------------------------------------- */
.sds-input-frost {
  animation: sds-inputFrost 2s ease both;
}
@keyframes sds-inputFrost {
  0% {
    filter: blur(4px) brightness(1.4);
    transform: scale(1.04);
    opacity: 0;
  }
  50% {
    filter: blur(1px) brightness(1.1);
    transform: scale(1.01);
    opacity: 1;
  }
  100% {
    filter: blur(0) brightness(1);
    transform: scale(1);
    opacity: 1;
  }
}
/* 91 · Electric ---------------------------------------- */
.sds-input-electric {
  animation: sds-inputElectric 2s ease infinite;
}
@keyframes sds-inputElectric {
  0%,
  100% {
    border-color: rgba(0, 21, 209, 0.3);
    box-shadow: none;
  }
  15% {
    border-color: var(--sds-primary);
    box-shadow: 0 0 8px var(--sds-primary-glow);
  }
  17% {
    border-color: rgba(0, 21, 209, 0.3);
    box-shadow: none;
  }
  30% {
    border-color: rgba(0, 21, 209, 0.6);
    box-shadow: 0 0 4px var(--sds-primary-glow);
  }
  32% {
    border-color: rgba(0, 21, 209, 0.3);
    box-shadow: none;
  }
}
/* 92 · Radar ------------------------------------------- */
.sds-input-radar {
  animation: sds-inputRadar 2s linear infinite;
}
@keyframes sds-inputRadar {
  0% {
    box-shadow:
      0 0 0 0 var(--sds-primary-glow),
      0 0 0 0 rgba(0, 21, 209, 0.08);
  }
  50% {
    box-shadow:
      0 0 0 6px rgba(0, 21, 209, 0),
      0 0 0 12px rgba(0, 21, 209, 0);
  }
  100% {
    box-shadow:
      0 0 0 0 rgba(0, 21, 209, 0),
      0 0 0 0 rgba(0, 21, 209, 0);
  }
}
/* 93 · Bloom ------------------------------------------- */
.sds-input-bloom {
  animation: sds-inputBloom 2.4s ease-in-out infinite;
}
@keyframes sds-inputBloom {
  0%,
  100% {
    box-shadow: 0 0 0 rgba(0, 21, 209, 0);
    filter: brightness(1);
  }
  50% {
    box-shadow:
      0 0 28px rgba(0, 21, 209, 0.18),
      0 0 56px rgba(0, 21, 209, 0.06);
    filter: brightness(1.06);
  }
}
.sds-input-focus-glow:focus {
  animation: sds-focusField 0.45s ease both;
}
/* ============================================================
   SECTION 3b — INPUT ANIMATIONS (v5 additions, 131–179)
   Compositor-only (R4). Wrapper classes (div around the input)
   are used wherever pseudo-element overlays are needed —
   <input> elements cannot render ::before/::after.
   ============================================================ */
/* ─── Family: Focus Choreography ───────────────────────────── */
/* 131 · Label Spring (wrap: input + label) ------------------ */
.sds-input-label-spring {
  position: relative;
  display: inline-block;
}
.sds-input-label-spring label {
  position: absolute;
  left: 14px;
  top: 50%;
  transform: translateY(-50%);
  transform-origin: left center;
  pointer-events: none;
  opacity: 0.55;
}
.sds-input-label-spring input:not(:-moz-placeholder) ~ label {
  animation: sds-inputLabelSpring var(--sds-duration-fast, 0.4s) var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) both;
}
.sds-input-label-spring:focus-within label,
.sds-input-label-spring input:not(:placeholder-shown) ~ label {
  animation: sds-inputLabelSpring var(--sds-duration-fast, 0.4s) var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) both;
}
.sds-input-label-spring:focus-within input {
  animation: sds-inputLabelSpringField var(--sds-duration-fast, 0.4s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) both;
}
@keyframes sds-inputLabelSpring {
  0% {
    transform: translateY(-50%) scale(1);
    opacity: 0.55;
  }
  60% {
    transform: translateY(-158%) scale(0.8);
    opacity: 1;
  }
  80% {
    transform: translateY(-146%) scale(0.83);
  }
  100% {
    transform: translateY(-150%) scale(0.82);
    opacity: 1;
  }
}
@keyframes sds-inputLabelSpringField {
  0% {
    transform: scale(1);
  }
  55% {
    transform: scale(1.013);
  }
  100% {
    transform: scale(1.01);
  }
}
/* 132 · Underline Draw (wrap) ------------------------------- */
.sds-input-underline-draw {
  position: relative;
  display: inline-block;
}
.sds-input-underline-draw::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 2px;
  border-radius: 2px;
  background: var(--sds-primary);
  transform: scaleX(0);
  transform-origin: center;
}
.sds-input-underline-draw:focus-within::after {
  animation: sds-inputUnderlineDraw var(--sds-duration-fast, 0.4s) var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) both;
}
@keyframes sds-inputUnderlineDraw {
  0% {
    transform: scaleX(0);
    opacity: 0;
  }
  60% {
    transform: scaleX(1.04);
    opacity: 1;
  }
  100% {
    transform: scaleX(1);
    opacity: 1;
  }
}
/* 133 · Underline Trail (wrap) ------------------------------ */
.sds-input-underline-trail {
  position: relative;
  display: inline-block;
}
.sds-input-underline-trail::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 2px;
  border-radius: 2px;
  background: var(--sds-primary);
  transform: scaleX(0);
  transform-origin: left center;
}
.sds-input-underline-trail::before {
  content: "";
  position: absolute;
  left: 0;
  bottom: -2px;
  width: 8px;
  height: 6px;
  border-radius: 50%;
  background: var(--sds-primary);
  filter: blur(2px) brightness(1.6);
  opacity: 0;
}
.sds-input-underline-trail:focus-within::after {
  animation: sds-inputUnderlineTrail var(--sds-duration-instant, 0.3s) var(--sds-ease-decelerate, cubic-bezier(0.16, 1, 0.3, 1)) both;
}
.sds-input-underline-trail:focus-within::before {
  animation: sds-inputUnderlineTrailHead var(--sds-duration-instant, 0.3s) var(--sds-ease-decelerate, cubic-bezier(0.16, 1, 0.3, 1)) both;
}
@keyframes sds-inputUnderlineTrail {
  from {
    transform: scaleX(0);
  }
  to {
    transform: scaleX(1);
  }
}
@keyframes sds-inputUnderlineTrailHead {
  0% {
    transform: translateX(0);
    opacity: 1;
  }
  85% {
    opacity: 1;
  }
  100% {
    transform: translateX(min(28vw, 240px));
    opacity: 0;
  }
}
/* 134 · Frame Bloom (wrap) ---------------------------------- */
.sds-input-frame-bloom {
  position: relative;
  display: inline-block;
}
.sds-input-frame-bloom::before,
.sds-input-frame-bloom::after {
  content: "";
  position: absolute;
  inset: -3px;
  border: 2px solid var(--sds-primary);
  border-radius: 8px;
  opacity: 0;
}
.sds-input-frame-bloom::before {
  clip-path: polygon(0 0, 30% 0, 30% 18%, 18% 18%, 18% 30%, 0 30%, 0 0, 100% 0, 100% 30%, 82% 30%, 82% 18%, 70% 18%, 70% 0, 100% 0);
}
.sds-input-frame-bloom::after {
  clip-path: polygon(0 70%, 18% 70%, 18% 82%, 30% 82%, 30% 100%, 0 100%, 0 70%, 100% 70%, 100% 100%, 70% 100%, 70% 82%, 82% 82%, 82% 70%, 100% 70%);
}
.sds-input-frame-bloom:focus-within::before {
  animation: sds-inputFrameBloom var(--sds-duration-fast, 0.4s) var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) both;
}
.sds-input-frame-bloom:focus-within::after {
  animation: sds-inputFrameBloom var(--sds-duration-fast, 0.4s) var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) 0.06s both;
}
@keyframes sds-inputFrameBloom {
  0% {
    opacity: 0;
    transform: scale(1.12);
  }
  55% {
    opacity: 1;
    transform: scale(0.985);
  }
  100% {
    opacity: 1;
    transform: scale(1);
  }
}
/* 135 · Tilt In --------------------------------------------- */
.sds-input-tilt-in:focus {
  animation: sds-inputTiltIn var(--sds-duration-fast, 0.4s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) both;
}
@keyframes sds-inputTiltIn {
  0% {
    transform: perspective(500px) rotateX(4deg);
    filter: drop-shadow(0 1px 1px rgba(0, 21, 209, 0.1));
  }
  60% {
    transform: perspective(500px) rotateX(-1deg);
    filter: drop-shadow(0 5px 7px rgba(0, 21, 209, 0.16));
  }
  100% {
    transform: perspective(500px) rotateX(0);
    filter: drop-shadow(0 4px 6px rgba(0, 21, 209, 0.14));
  }
}
/* 136 · Zoom Focus ------------------------------------------ */
.sds-input-zoom-focus:focus {
  animation: sds-inputZoomFocus var(--sds-duration-instant, 0.3s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) both;
}
@keyframes sds-inputZoomFocus {
  0% {
    transform: scale(1);
    filter: blur(0.4px) brightness(0.98);
  }
  65% {
    transform: scale(1.024);
    filter: blur(0) brightness(1.05);
  }
  100% {
    transform: scale(1.02);
    filter: blur(0) brightness(1.02);
  }
}
/* 137 · Gate Open (wrap) ------------------------------------ */
.sds-input-gate-open {
  position: relative;
  display: inline-block;
  overflow: hidden;
}
.sds-input-gate-open::before,
.sds-input-gate-open::after {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  width: 51%;
  background: var(--sds-primary);
  opacity: 0.12;
  pointer-events: none;
}
.sds-input-gate-open::before {
  left: 0;
}
.sds-input-gate-open::after {
  right: 0;
}
.sds-input-gate-open:focus-within::before {
  animation: sds-inputGateOpenL var(--sds-duration-fast, 0.4s) var(--sds-ease-decelerate, cubic-bezier(0.16, 1, 0.3, 1)) both;
}
.sds-input-gate-open:focus-within::after {
  animation: sds-inputGateOpenR var(--sds-duration-fast, 0.4s) var(--sds-ease-decelerate, cubic-bezier(0.16, 1, 0.3, 1)) both;
}
@keyframes sds-inputGateOpenL {
  from {
    transform: translateX(0);
    opacity: 0.12;
  }
  to {
    transform: translateX(-102%);
    opacity: 0.2;
  }
}
@keyframes sds-inputGateOpenR {
  from {
    transform: translateX(0);
    opacity: 0.12;
  }
  to {
    transform: translateX(102%);
    opacity: 0.2;
  }
}
/* 138 · Caret Pop (wrap) ------------------------------------ */
.sds-input-caret-pop {
  position: relative;
  display: inline-block;
}
.sds-input-caret-pop::before {
  content: "";
  position: absolute;
  left: 8px;
  top: 25%;
  bottom: 25%;
  width: 2px;
  border-radius: 1px;
  background: var(--sds-primary);
  opacity: 0;
}
.sds-input-caret-pop:focus-within::before {
  animation: sds-inputCaretPop var(--sds-duration-base, 0.8s) var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) both;
}
@keyframes sds-inputCaretPop {
  0% {
    opacity: 0;
    transform: scaleY(0.2);
  }
  25% {
    opacity: 1;
    transform: scaleY(1.25);
  }
  40% {
    transform: scaleY(0.9);
  }
  55% {
    opacity: 1;
    transform: scaleY(1);
  }
  70% {
    opacity: 0.2;
  }
  85% {
    opacity: 1;
  }
  100% {
    opacity: 0;
    transform: scaleY(1);
  }
}
/* ─── Family: Validation Drama ─────────────────────────────── */
/* 139 · Success Ripple -------------------------------------- */
.sds-input-success-ripple {
  animation: sds-inputSuccessRipple var(--sds-duration-base, 0.8s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) both;
}
@keyframes sds-inputSuccessRipple {
  0% {
    transform: scale(1);
    filter: drop-shadow(0 0 0 rgba(0, 196, 140, 0));
  }
  25% {
    transform: scale(1.012);
    filter: drop-shadow(0 0 10px rgba(0, 196, 140, 0.45));
  }
  45% {
    transform: scale(1);
    filter: drop-shadow(0 0 2px rgba(0, 196, 140, 0.15));
  }
  62% {
    transform: scale(1.008);
    filter: drop-shadow(0 0 7px rgba(0, 196, 140, 0.3));
  }
  100% {
    transform: scale(1);
    filter: drop-shadow(0 0 0 rgba(0, 196, 140, 0));
  }
}
/* 140 · Success Tick (wrap) --------------------------------- */
.sds-input-success-tick {
  position: relative;
  display: inline-block;
}
.sds-input-success-tick::after {
  content: "";
  position: absolute;
  right: 10px;
  top: 50%;
  width: 14px;
  height: 8px;
  margin-top: -6px;
  border-left: 2.5px solid var(--sds-success);
  border-bottom: 2.5px solid var(--sds-success);
  transform: rotate(-45deg);
  clip-path: polygon(0 0, 0 0, 0 100%, 0 100%);
  animation: sds-inputSuccessTick var(--sds-duration-fast, 0.4s) var(--sds-ease-emphasized, cubic-bezier(0.215, 0.61, 0.355, 1)) both;
}
@keyframes sds-inputSuccessTick {
  0% {
    clip-path: polygon(0 0, 0 0, 0 100%, 0 100%);
    transform: rotate(-45deg) scale(1);
  }
  45% {
    clip-path: polygon(0 0, 45% 0, 45% 100%, 0 100%);
    transform: rotate(-45deg) scale(1);
  }
  75% {
    clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
    transform: rotate(-45deg) scale(1.18);
  }
  100% {
    clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
    transform: rotate(-45deg) scale(1);
  }
}
/* 141 · Error Quake (wrap; caret-safe counter-shift) -------- */
.sds-input-error-quake {
  display: inline-block;
  animation: sds-inputErrorQuake var(--sds-duration-fast, 0.4s) ease-in-out both;
}
.sds-input-error-quake input {
  animation: sds-inputErrorQuakeInner var(--sds-duration-fast, 0.4s) ease-in-out both;
}
@keyframes sds-inputErrorQuake {
  0%,
  100% {
    transform: translateX(0);
  }
  18% {
    transform: translateX(-5px);
  }
  38% {
    transform: translateX(4px);
  }
  58% {
    transform: translateX(-2.5px);
  }
  78% {
    transform: translateX(1.5px);
  }
}
@keyframes sds-inputErrorQuakeInner {
  0%,
  100% {
    transform: translateX(0);
  }
  18% {
    transform: translateX(2.5px);
  }
  38% {
    transform: translateX(-2px);
  }
  58% {
    transform: translateX(1.2px);
  }
  78% {
    transform: translateX(-0.7px);
  }
}
/* 142 · Error Buzz ------------------------------------------ */
.sds-input-error-buzz {
  animation: sds-inputErrorBuzz var(--sds-duration-instant, 0.3s) linear both;
}
@keyframes sds-inputErrorBuzz {
  0%,
  100% {
    transform: translate(0, 0);
    filter: none;
  }
  12% {
    transform: translate(-1px, 0.5px);
    filter: hue-rotate(-12deg) brightness(1.08) saturate(1.4);
  }
  28% {
    transform: translate(1px, -0.5px);
  }
  44% {
    transform: translate(-1px, 0);
    filter: hue-rotate(-8deg) saturate(1.25);
  }
  60% {
    transform: translate(1px, 0);
  }
  76% {
    transform: translate(0, 0);
    filter: none;
  }
}
/* 143 · Error Sink ------------------------------------------ */
.sds-input-error-sink {
  animation: sds-inputErrorSink var(--sds-duration-slow, 1.4s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) both;
}
@keyframes sds-inputErrorSink {
  0% {
    transform: translateY(0);
    filter: saturate(1);
  }
  22% {
    transform: translateY(2.5px);
    filter: saturate(0.35) brightness(0.97);
  }
  55% {
    transform: translateY(2px);
    filter: saturate(0.5);
  }
  100% {
    transform: translateY(0);
    filter: saturate(1) brightness(1);
  }
}
/* 144 · Warn Tilt ------------------------------------------- */
.sds-input-warn-tilt {
  animation: sds-inputWarnTilt var(--sds-duration-base, 0.8s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) both;
}
@keyframes sds-inputWarnTilt {
  0% {
    transform: rotate(0deg);
    filter: none;
  }
  22% {
    transform: rotate(-1deg);
    filter: sepia(0.5) saturate(1.6) brightness(1.04);
  }
  48% {
    transform: rotate(-0.7deg);
    filter: sepia(0.4) saturate(1.4);
  }
  78% {
    transform: rotate(0.2deg);
    filter: sepia(0.12);
  }
  100% {
    transform: rotate(0deg);
    filter: none;
  }
}
/* 145 · Saved Flash ----------------------------------------- */
.sds-input-saved-flash {
  animation: sds-inputSavedFlash var(--sds-duration-fast, 0.4s) var(--sds-ease-emphasized, cubic-bezier(0.215, 0.61, 0.355, 1)) both;
}
@keyframes sds-inputSavedFlash {
  0% {
    transform: scale(1, 1);
    filter: brightness(1);
  }
  30% {
    transform: scale(1.01, 0.97);
    filter: brightness(1.18);
  }
  55% {
    transform: scale(0.998, 1.005);
    filter: brightness(1.05);
  }
  100% {
    transform: scale(1, 1);
    filter: brightness(1);
  }
}
/* ─── Family: Placeholder Morphs ───────────────────────────────
   ::placeholder reliably animates ONLY opacity across engines —
   these six are pure opacity choreography with distinct rhythms. */
/* 146 · Placeholder Breathe --------------------------------- */
.sds-input-ph-breathe::-moz-placeholder {
  animation: sds-inputPhBreathe var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
.sds-input-ph-breathe::placeholder {
  animation: sds-inputPhBreathe var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-inputPhBreathe {
  0%,
  100% {
    opacity: 0.55;
  }
  35% {
    opacity: 0.25;
  }
  55% {
    opacity: 0.6;
  }
  70% {
    opacity: 0.5;
  }
}
/* 147 · Placeholder Fade Steps ------------------------------ */
.sds-input-ph-fade-steps:focus::-moz-placeholder {
  animation: sds-inputPhFadeSteps var(--sds-duration-fast, 0.4s) steps(1) both;
}
.sds-input-ph-fade-steps:focus::placeholder {
  animation: sds-inputPhFadeSteps var(--sds-duration-fast, 0.4s) steps(1) both;
}
@keyframes sds-inputPhFadeSteps {
  0% {
    opacity: 0.55;
  }
  30% {
    opacity: 0.3;
  }
  60% {
    opacity: 0.12;
  }
  100% {
    opacity: 0;
  }
}
/* 148 · Placeholder Ghost ----------------------------------- */
.sds-input-ph-ghost:focus::-moz-placeholder {
  animation: sds-inputPhGhost var(--sds-duration-base, 0.8s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) both;
}
.sds-input-ph-ghost:focus::placeholder {
  animation: sds-inputPhGhost var(--sds-duration-base, 0.8s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) both;
}
@keyframes sds-inputPhGhost {
  0% {
    opacity: 0.55;
  }
  30% {
    opacity: 0.15;
  }
  55% {
    opacity: 0.22;
  }
  75% {
    opacity: 0.1;
  }
  100% {
    opacity: 0;
  }
}
/* 149 · Placeholder Flicker In ------------------------------ */
.sds-input-ph-flicker-in::-moz-placeholder {
  animation: sds-inputPhFlickerIn var(--sds-duration-slow, 1.4s) steps(1) both;
}
.sds-input-ph-flicker-in::placeholder {
  animation: sds-inputPhFlickerIn var(--sds-duration-slow, 1.4s) steps(1) both;
}
@keyframes sds-inputPhFlickerIn {
  0% {
    opacity: 0;
  }
  12% {
    opacity: 0.4;
  }
  18% {
    opacity: 0;
  }
  34% {
    opacity: 0.5;
  }
  40% {
    opacity: 0.1;
  }
  56% {
    opacity: 0.55;
  }
  68% {
    opacity: 0.35;
  }
  80%,
  100% {
    opacity: 0.55;
  }
}
/* 150 · Placeholder Wave ------------------------------------ */
.sds-input-ph-wave::-moz-placeholder {
  animation: sds-inputPhWave var(--sds-duration-slower, 2.2s) ease-in-out infinite;
}
.sds-input-ph-wave::placeholder {
  animation: sds-inputPhWave var(--sds-duration-slower, 2.2s) ease-in-out infinite;
}
@keyframes sds-inputPhWave {
  0%,
  100% {
    opacity: 0.5;
  }
  18% {
    opacity: 0.62;
  }
  32% {
    opacity: 0.38;
  }
  48% {
    opacity: 0.58;
  }
  64% {
    opacity: 0.42;
  }
  80% {
    opacity: 0.55;
  }
}
/* 151 · Placeholder Blink ----------------------------------- */
.sds-input-ph-blink::-moz-placeholder {
  animation: sds-inputPhBlink var(--sds-duration-dramatic, 3s) steps(1) infinite;
}
.sds-input-ph-blink::placeholder {
  animation: sds-inputPhBlink var(--sds-duration-dramatic, 3s) steps(1) infinite;
}
@keyframes sds-inputPhBlink {
  0%,
  100% {
    opacity: 0.55;
  }
  70% {
    opacity: 0.1;
  }
  76% {
    opacity: 0.55;
  }
  82% {
    opacity: 0.1;
  }
  88% {
    opacity: 0.55;
  }
}
/* ─── Family: Border Energy Ambient (wrap classes) ─────────── */
/* 152 · Border Comet Loop (wrap) ---------------------------- */
.sds-input-border-comet-loop {
  position: relative;
  display: inline-block;
}
.sds-input-border-comet-loop::before {
  content: "";
  position: absolute;
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: var(--sds-primary);
  filter: drop-shadow(0 0 4px var(--sds-primary-glow));
  offset-path: border-box;
  offset-rotate: 0deg;
  animation: sds-inputBorderCometLoop var(--sds-duration-dramatic, 3s) linear infinite;
}
@keyframes sds-inputBorderCometLoop {
  0% {
    offset-distance: 0%;
    opacity: 0.9;
  }
  50% {
    offset-distance: 50%;
    opacity: 0.5;
  }
  100% {
    offset-distance: 100%;
    opacity: 0.9;
  }
}
/* 153 · Border Tide (wrap) ---------------------------------- */
.sds-input-border-tide {
  position: relative;
  display: inline-block;
}
.sds-input-border-tide::before {
  content: "";
  position: absolute;
  inset: -2px;
  border: 1.5px solid var(--sds-primary);
  border-radius: 8px;
  opacity: 0.18;
}
.sds-input-border-tide::after {
  content: "";
  position: absolute;
  inset: -2px;
  border: 1.5px solid var(--sds-primary);
  border-radius: 8px;
  filter: drop-shadow(0 0 3px var(--sds-primary-glow));
  animation: sds-inputBorderTide var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-inputBorderTide {
  0%,
  100% {
    clip-path: inset(0 65% 65% 0);
    opacity: 0.85;
  }
  25% {
    clip-path: inset(0 0 65% 35%);
    opacity: 0.7;
  }
  50% {
    clip-path: inset(65% 0 0 35%);
    opacity: 0.85;
  }
  75% {
    clip-path: inset(65% 65% 0 0);
    opacity: 0.7;
  }
}
/* 154 · Border Corners (wrap) ------------------------------- */
.sds-input-border-corners {
  position: relative;
  display: inline-block;
}
.sds-input-border-corners::before {
  content: "";
  position: absolute;
  inset: -3px;
  border: 2px solid var(--sds-primary);
  border-radius: 8px;
  animation: sds-inputBorderCorners var(--sds-duration-dramatic, 3s) steps(1) infinite,
    sds-inputBorderCornersFade var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-inputBorderCorners {
  0%,
  100% {
    clip-path: polygon(70% 0, 100% 0, 100% 55%, calc(100% - 3px) 55%, calc(100% - 3px) 3px, 70% 3px);
  }
  25% {
    clip-path: polygon(100% 45%, 100% 100%, 70% 100%, 70% calc(100% - 3px), calc(100% - 3px) calc(100% - 3px), calc(100% - 3px) 45%);
  }
  50% {
    clip-path: polygon(30% 100%, 0 100%, 0 45%, 3px 45%, 3px calc(100% - 3px), 30% calc(100% - 3px));
  }
  75% {
    clip-path: polygon(0 55%, 0 0, 30% 0, 30% 3px, 3px 3px, 3px 55%);
  }
}
@keyframes sds-inputBorderCornersFade {
  0%,
  20%,
  25%,
  45%,
  50%,
  70%,
  75%,
  95%,
  100% {
    opacity: 0.85;
  }
  22%,
  47%,
  72%,
  97% {
    opacity: 0.2;
  }
}
/* 155 · Border Static (wrap) -------------------------------- */
.sds-input-border-static {
  position: relative;
  display: inline-block;
}
.sds-input-border-static::before {
  content: "";
  position: absolute;
  inset: -2px;
  border: 1.5px solid var(--sds-primary);
  border-radius: 8px;
  opacity: 0.35;
  animation: sds-inputBorderStatic var(--sds-duration-dramatic, 3s) steps(1) infinite;
}
@keyframes sds-inputBorderStatic {
  0%,
  100% {
    transform: translate(0, 0);
    clip-path: none;
    opacity: 0.35;
  }
  64% {
    transform: translate(1px, -1px);
    clip-path: inset(0 0 38% 0);
    opacity: 0.7;
  }
  66% {
    transform: translate(-1px, 1px);
    clip-path: inset(42% 0 0 0);
    opacity: 0.55;
  }
  68% {
    transform: translate(0, 0);
    clip-path: none;
    opacity: 0.35;
  }
}
/* 156 · Border Rain (wrap) ---------------------------------- */
.sds-input-border-rain {
  position: relative;
  display: inline-block;
  overflow: hidden;
}
.sds-input-border-rain::before,
.sds-input-border-rain::after {
  content: "";
  position: absolute;
  top: 0;
  width: 2px;
  height: 45%;
  border-radius: 2px;
  background: var(--sds-primary);
  opacity: 0;
}
.sds-input-border-rain::before {
  left: 0;
  animation: sds-inputBorderRain var(--sds-duration-slower, 2.2s) var(--sds-ease-accelerate, cubic-bezier(0.6, -0.28, 0.74, 0.05)) infinite;
}
.sds-input-border-rain::after {
  right: 0;
  animation: sds-inputBorderRain var(--sds-duration-slower, 2.2s) var(--sds-ease-accelerate, cubic-bezier(0.6, -0.28, 0.74, 0.05)) 1.1s infinite;
}
@keyframes sds-inputBorderRain {
  0% {
    transform: translateY(-110%);
    opacity: 0;
  }
  18% {
    opacity: 0.7;
  }
  60% {
    transform: translateY(240%);
    opacity: 0.4;
  }
  61%,
  100% {
    transform: translateY(240%);
    opacity: 0;
  }
}
/* 157 · Border Heartline (wrap) ----------------------------- */
.sds-input-border-heartline {
  position: relative;
  display: inline-block;
  overflow: hidden;
}
.sds-input-border-heartline::before {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: -1px;
  height: 1.5px;
  background: var(--sds-primary);
  opacity: 0.25;
}
.sds-input-border-heartline::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: 0;
  width: 14px;
  height: 8px;
  background: var(--sds-primary);
  clip-path: polygon(0 70%, 30% 70%, 45% 0, 60% 100%, 75% 70%, 100% 70%, 100% 85%, 0 85%);
  filter: drop-shadow(0 0 3px var(--sds-primary-glow));
  opacity: 0;
  animation: sds-inputBorderHeartline var(--sds-duration-dramatic, 3s) linear infinite;
}
@keyframes sds-inputBorderHeartline {
  0%,
  54% {
    transform: translateX(0);
    opacity: 0;
  }
  58% {
    opacity: 0.9;
  }
  74% {
    transform: translateX(calc(100% + 160px));
    opacity: 0.9;
  }
  78%,
  100% {
    transform: translateX(calc(100% + 180px));
    opacity: 0;
  }
}
/* 158 · Border Orbiters (wrap) ------------------------------ */
.sds-input-border-orbiters {
  position: relative;
  display: inline-block;
}
.sds-input-border-orbiters::before,
.sds-input-border-orbiters::after {
  content: "";
  position: absolute;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: var(--sds-primary);
  opacity: 0.5;
  offset-path: border-box;
  offset-rotate: 0deg;
}
.sds-input-border-orbiters::before {
  animation: sds-inputBorderOrbiterA var(--sds-duration-dramatic, 3s) linear infinite;
}
.sds-input-border-orbiters::after {
  animation: sds-inputBorderOrbiterB var(--sds-duration-dramatic, 3s) linear infinite;
}
@keyframes sds-inputBorderOrbiterA {
  0% {
    offset-distance: 0%;
  }
  100% {
    offset-distance: 100%;
  }
}
@keyframes sds-inputBorderOrbiterB {
  0% {
    offset-distance: 50%;
  }
  100% {
    offset-distance: 150%;
  }
}
/* ─── Family: Fill-Progress Focus (wrap classes) ───────────── */
/* 159 · Fill Rise (wrap) ------------------------------------ */
.sds-input-fill-rise {
  position: relative;
  display: inline-block;
  overflow: hidden;
}
.sds-input-fill-rise::before {
  content: "";
  position: absolute;
  inset: 0;
  background: var(--sds-primary);
  opacity: 0.1;
  transform: translateY(101%);
  pointer-events: none;
}
.sds-input-fill-rise:focus-within::before {
  animation: sds-inputFillRise var(--sds-duration-fast, 0.4s) var(--sds-ease-decelerate, cubic-bezier(0.16, 1, 0.3, 1)) both;
}
@keyframes sds-inputFillRise {
  0% {
    transform: translateY(101%);
  }
  60% {
    transform: translateY(78%);
  }
  100% {
    transform: translateY(82%);
  }
}
/* 160 · Fill Scanline (wrap) -------------------------------- */
.sds-input-fill-scanline {
  position: relative;
  display: inline-block;
  overflow: hidden;
}
.sds-input-fill-scanline::before {
  content: "";
  position: absolute;
  top: 15%;
  bottom: 15%;
  left: 0;
  width: 18%;
  background: var(--sds-primary);
  opacity: 0;
  filter: blur(6px);
  pointer-events: none;
}
.sds-input-fill-scanline:focus-within::before {
  animation: sds-inputFillScanline var(--sds-duration-base, 0.8s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) both;
}
@keyframes sds-inputFillScanline {
  0% {
    transform: translateX(-120%);
    opacity: 0;
  }
  20% {
    opacity: 0.3;
  }
  55% {
    transform: translateX(480%);
    opacity: 0.3;
  }
  80% {
    transform: translateX(-40%);
    opacity: 0.22;
  }
  100% {
    transform: translateX(-60%);
    opacity: 0.18;
  }
}
/* 161 · Fill Meter (wrap) ----------------------------------- */
.sds-input-fill-meter {
  position: relative;
  display: inline-block;
  overflow: hidden;
}
.sds-input-fill-meter::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0;
  bottom: 0;
  width: 100%;
  background: var(--sds-primary);
  opacity: 0.12;
  transform: scaleX(0);
  transform-origin: left center;
  pointer-events: none;
}
.sds-input-fill-meter:focus-within::before {
  animation: sds-inputFillMeter var(--sds-duration-dramatic, 3s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) infinite;
}
@keyframes sds-inputFillMeter {
  0% {
    transform: scaleX(0);
  }
  14% {
    transform: scaleX(0.22);
  }
  22%,
  30% {
    transform: scaleX(0.34);
  }
  44% {
    transform: scaleX(0.58);
  }
  52%,
  62% {
    transform: scaleX(0.66);
  }
  74% {
    transform: scaleX(0.9);
  }
  82%,
  92% {
    transform: scaleX(1);
    opacity: 0.12;
  }
  100% {
    transform: scaleX(1);
    opacity: 0;
  }
}
/* 162 · Fill Corner Shade (wrap) ---------------------------- */
.sds-input-fill-corner-shade {
  position: relative;
  display: inline-block;
  overflow: hidden;
}
.sds-input-fill-corner-shade::before {
  content: "";
  position: absolute;
  inset: 0;
  background: var(--sds-primary);
  opacity: 0.14;
  clip-path: polygon(100% 100%, 100% 100%, 100% 100%);
  pointer-events: none;
}
.sds-input-fill-corner-shade:focus-within::before {
  animation: sds-inputFillCornerShade var(--sds-duration-fast, 0.4s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) both;
}
@keyframes sds-inputFillCornerShade {
  0% {
    clip-path: polygon(100% 100%, 100% 100%, 100% 100%);
  }
  65% {
    clip-path: polygon(100% 100%, 100% -80%, -80% 100%);
  }
  100% {
    clip-path: polygon(100% 100%, 100% -60%, -60% 100%);
  }
}
/* 163 · Fill Pulse Floor (wrap) ----------------------------- */
.sds-input-fill-pulse-floor {
  position: relative;
  display: inline-block;
}
.sds-input-fill-pulse-floor::before {
  content: "";
  position: absolute;
  left: 6%;
  right: 6%;
  bottom: 0;
  height: 2px;
  border-radius: 2px;
  background: var(--sds-primary);
  opacity: 0.2;
  pointer-events: none;
}
.sds-input-fill-pulse-floor:focus-within::before {
  animation: sds-inputFillPulseFloor var(--sds-duration-slower, 2.2s) ease-in-out infinite;
}
@keyframes sds-inputFillPulseFloor {
  0%,
  100% {
    opacity: 0.25;
    transform: scaleX(0.96);
    filter: drop-shadow(0 0 0 transparent);
  }
  50% {
    opacity: 0.9;
    transform: scaleX(1);
    filter: drop-shadow(0 0 5px var(--sds-primary-glow));
  }
}
/* 164 · Fill Flood (wrap) ----------------------------------- */
.sds-input-fill-flood {
  position: relative;
  display: inline-block;
  overflow: hidden;
}
.sds-input-fill-flood::before {
  content: "";
  position: absolute;
  inset: 0;
  background: var(--sds-primary);
  opacity: 0;
  pointer-events: none;
}
.sds-input-fill-flood:focus-within::before {
  animation: sds-inputFillFlood var(--sds-duration-base, 0.8s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) both;
}
@keyframes sds-inputFillFlood {
  0% {
    transform: translateY(101%);
    opacity: 0.18;
  }
  32% {
    transform: translateY(0);
    opacity: 0.18;
  }
  55% {
    transform: translateY(0);
    opacity: 0.14;
  }
  100% {
    transform: translateY(96%);
    opacity: 0.35;
  }
}
/* ─── Family: Entrance Personalities ───────────────────────── */
/* 165 · Arrive Slide Label (wrap: input + label) ------------ */
.sds-input-arrive-slide-label {
  position: relative;
  display: inline-block;
}
.sds-input-arrive-slide-label label {
  position: absolute;
  left: 14px;
  top: -1.4em;
  pointer-events: none;
  animation: sds-inputArriveLabelDrop var(--sds-duration-base, 0.8s) var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) both;
}
.sds-input-arrive-slide-label input {
  animation: sds-inputArriveFieldSlide var(--sds-duration-base, 0.8s) var(--sds-ease-decelerate, cubic-bezier(0.16, 1, 0.3, 1)) both;
}
@keyframes sds-inputArriveFieldSlide {
  0% {
    opacity: 0;
    transform: translateX(-26px);
  }
  55% {
    opacity: 1;
    transform: translateX(3px);
  }
  75% {
    transform: translateX(-1px) scaleY(0.97);
  }
  100% {
    opacity: 1;
    transform: translateX(0) scaleY(1);
  }
}
@keyframes sds-inputArriveLabelDrop {
  0% {
    opacity: 0;
    transform: translateY(-14px);
  }
  45% {
    opacity: 0;
  }
  70% {
    opacity: 1;
    transform: translateY(2px);
  }
  100% {
    opacity: 1;
    transform: translateY(0);
  }
}
/* 166 · Arrive Unzip ---------------------------------------- */
.sds-input-arrive-unzip {
  animation: sds-inputArriveUnzip var(--sds-duration-base, 0.8s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) both;
}
@keyframes sds-inputArriveUnzip {
  0% {
    opacity: 0;
    clip-path: inset(48% 0 48% 0);
    filter: brightness(2.2);
  }
  45% {
    opacity: 1;
    clip-path: inset(12% 0 12% 0);
    filter: brightness(1.4);
  }
  100% {
    opacity: 1;
    clip-path: inset(0 0 0 0);
    filter: brightness(1);
  }
}
/* 167 · Arrive Drop ----------------------------------------- */
.sds-input-arrive-drop {
  animation: sds-inputArriveDrop var(--sds-duration-base, 0.8s) var(--sds-ease-emphasized, cubic-bezier(0.215, 0.61, 0.355, 1)) both;
}
@keyframes sds-inputArriveDrop {
  0% {
    opacity: 0;
    transform: translateY(-16px);
    filter: drop-shadow(0 14px 8px rgba(0, 21, 209, 0.12));
  }
  42% {
    opacity: 1;
    transform: translateY(0) scale(1.03, 0.94);
    filter: drop-shadow(0 1px 1px rgba(0, 21, 209, 0.22)) blur(0);
  }
  62% {
    transform: translateY(-2.5px) scale(0.99, 1.02);
    filter: drop-shadow(0 5px 4px rgba(0, 21, 209, 0.14));
  }
  80% {
    transform: translateY(0) scale(1.01, 0.99);
  }
  100% {
    opacity: 1;
    transform: translateY(0) scale(1, 1);
    filter: drop-shadow(0 2px 2px rgba(0, 21, 209, 0.08));
  }
}
/* 168 · Arrive Materialize ---------------------------------- */
.sds-input-arrive-materialize {
  animation: sds-inputArriveMaterialize var(--sds-duration-base, 0.8s) steps(4) both;
}
@keyframes sds-inputArriveMaterialize {
  0% {
    opacity: 0;
    clip-path: inset(0 88% 0 0);
    filter: blur(8px) brightness(1.6);
    transform: scale(1.04);
  }
  30% {
    opacity: 0.7;
    clip-path: inset(0 44% 0 22%);
    filter: blur(5px) brightness(1.35);
  }
  60% {
    opacity: 0.9;
    clip-path: inset(0 12% 0 44%);
    filter: blur(2.5px) brightness(1.15);
    transform: scale(1.02);
  }
  99% {
    clip-path: inset(0 0 0 0);
  }
  100% {
    opacity: 1;
    clip-path: inset(0 0 0 0);
    filter: blur(0) brightness(1);
    transform: scale(1);
  }
}
/* 169 · Arrive Pendulum ------------------------------------- */
.sds-input-arrive-pendulum {
  transform-origin: top center;
  animation: sds-inputArrivePendulum var(--sds-duration-slow, 1.4s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) both;
}
@keyframes sds-inputArrivePendulum {
  0% {
    opacity: 0;
    transform: rotate(-5deg) translateY(-8px);
  }
  28% {
    opacity: 1;
    transform: rotate(3.4deg) translateY(0);
  }
  52% {
    transform: rotate(-2deg);
  }
  72% {
    transform: rotate(1deg);
  }
  88% {
    transform: rotate(-0.4deg);
  }
  100% {
    opacity: 1;
    transform: rotate(0deg) translateY(0);
  }
}
/* 170 · Arrive Stretch -------------------------------------- */
.sds-input-arrive-stretch {
  animation: sds-inputArriveStretch var(--sds-duration-base, 0.8s) var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) both;
}
@keyframes sds-inputArriveStretch {
  0% {
    opacity: 0;
    transform: scaleX(0.4);
  }
  55% {
    opacity: 1;
    transform: scaleX(1.05);
  }
  72% {
    transform: scaleX(0.98);
  }
  86% {
    transform: scaleX(1.01);
  }
  100% {
    opacity: 1;
    transform: scaleX(1);
  }
}
/* 171 · Arrive Spotlight (wrap) ----------------------------- */
.sds-input-arrive-spotlight {
  position: relative;
  display: inline-block;
  overflow: hidden;
  animation: sds-inputArriveSpotlightHost var(--sds-duration-slow, 1.4s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) both;
}
.sds-input-arrive-spotlight::before {
  content: "";
  position: absolute;
  top: -80%;
  left: -30%;
  width: 70%;
  aspect-ratio: 1;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(255, 255, 255, 0.55) 0%, rgba(255, 255, 255, 0) 65%);
  pointer-events: none;
  animation: sds-inputArriveSpotlightBeam var(--sds-duration-slow, 1.4s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) both;
}
@keyframes sds-inputArriveSpotlightHost {
  0% {
    opacity: 0;
    filter: brightness(0.6);
  }
  35% {
    opacity: 1;
    filter: brightness(0.85);
  }
  100% {
    opacity: 1;
    filter: brightness(1);
  }
}
@keyframes sds-inputArriveSpotlightBeam {
  0% {
    transform: translate(-40%, 0);
    opacity: 0;
  }
  30% {
    opacity: 1;
  }
  85% {
    transform: translate(200%, 60%);
    opacity: 0.8;
  }
  100% {
    transform: translate(230%, 70%);
    opacity: 0;
  }
}
/* 172 · Arrive Stack (wrap) --------------------------------- */
.sds-input-arrive-stack {
  position: relative;
  display: inline-block;
}
.sds-input-arrive-stack::before {
  content: "";
  position: absolute;
  inset: -3px;
  border: 1.5px solid var(--sds-primary);
  border-radius: 8px;
  animation: sds-inputArriveStackFrame var(--sds-duration-base, 0.8s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) both;
}
.sds-input-arrive-stack::after {
  content: "";
  position: absolute;
  inset: 0;
  background: var(--sds-primary);
  border-radius: 6px;
  pointer-events: none;
  animation: sds-inputArriveStackTint var(--sds-duration-base, 0.8s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) 0.12s both;
}
.sds-input-arrive-stack input {
  animation: sds-inputArriveStackField var(--sds-duration-base, 0.8s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) 0.22s both;
}
@keyframes sds-inputArriveStackFrame {
  0% {
    opacity: 0;
    transform: translateY(8px);
  }
  100% {
    opacity: 0.6;
    transform: translateY(0);
  }
}
@keyframes sds-inputArriveStackTint {
  0% {
    opacity: 0;
    transform: translateY(8px);
  }
  55% {
    opacity: 0.14;
    transform: translateY(0);
  }
  100% {
    opacity: 0.06;
    transform: translateY(0);
  }
}
@keyframes sds-inputArriveStackField {
  0% {
    opacity: 0;
    transform: translateY(8px);
  }
  100% {
    opacity: 1;
    transform: translateY(0);
  }
}
/* ─── Family: Ambient Idle ─────────────────────────────────── */
/* 173 · Idle Floatline (wrap) ------------------------------- */
.sds-input-idle-floatline {
  position: relative;
  display: inline-block;
}
.sds-input-idle-floatline::before {
  content: "";
  position: absolute;
  left: 10%;
  right: 10%;
  bottom: -1px;
  height: 2px;
  border-radius: 2px;
  background: var(--sds-primary);
  opacity: 0.4;
  animation: sds-inputIdleFloatline var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-inputIdleFloatline {
  0%,
  100% {
    transform: translateX(-2px);
  }
  50% {
    transform: translateX(2px);
  }
}
/* 174 · Idle Glimmer (wrap) --------------------------------- */
.sds-input-idle-glimmer {
  position: relative;
  display: inline-block;
}
.sds-input-idle-glimmer::before {
  content: "";
  position: absolute;
  top: -4px;
  right: 6px;
  width: 9px;
  height: 9px;
  background: var(--sds-primary);
  clip-path: polygon(50% 0, 62% 38%, 100% 50%, 62% 62%, 50% 100%, 38% 62%, 0 50%, 38% 38%);
  opacity: 0;
  animation: sds-inputIdleGlimmer var(--sds-duration-dramatic, 3s) var(--sds-ease-standard, cubic-bezier(0.22, 1, 0.36, 1)) infinite;
}
@keyframes sds-inputIdleGlimmer {
  0%,
  76%,
  100% {
    opacity: 0;
    transform: scale(0.3) rotate(0deg);
  }
  82% {
    opacity: 0.9;
    transform: scale(1.15) rotate(40deg);
    filter: drop-shadow(0 0 4px var(--sds-primary-glow));
  }
  88% {
    opacity: 0.5;
    transform: scale(0.8) rotate(70deg);
  }
  94% {
    opacity: 0;
    transform: scale(0.3) rotate(90deg);
  }
}
/* 175 · Idle Depth ------------------------------------------ */
.sds-input-idle-depth {
  animation: sds-inputIdleDepth var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-inputIdleDepth {
  0%,
  100% {
    filter: drop-shadow(0 1px 1.5px rgba(0, 21, 209, 0.12));
    transform: translateY(0);
  }
  50% {
    filter: drop-shadow(0 6px 8px rgba(0, 21, 209, 0.16));
    transform: translateY(-1.5px);
  }
}
/* 176 · Idle Lean ------------------------------------------- */
.sds-input-idle-lean {
  animation: sds-inputIdleLean var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-inputIdleLean {
  0%,
  100% {
    transform: rotate(-0.35deg);
  }
  50% {
    transform: rotate(0.35deg);
  }
}
/* 177 · Idle Noise (wrap) ----------------------------------- */
.sds-input-idle-noise {
  position: relative;
  display: inline-block;
  overflow: hidden;
}
.sds-input-idle-noise::before {
  content: "";
  position: absolute;
  inset: -8px;
  background-image: radial-gradient(circle at 25% 35%, var(--sds-primary) 1px, transparent 1.5px),
    radial-gradient(circle at 65% 70%, var(--sds-primary) 1px, transparent 1.5px),
    radial-gradient(circle at 85% 20%, var(--sds-primary) 1px, transparent 1.5px),
    radial-gradient(circle at 45% 85%, var(--sds-primary) 1px, transparent 1.5px);
  background-size: 36px 36px;
  opacity: 0.07;
  pointer-events: none;
  animation: sds-inputIdleNoise var(--sds-duration-slower, 2.2s) steps(5) infinite;
}
@keyframes sds-inputIdleNoise {
  0% {
    transform: translate(0, 0);
  }
  20% {
    transform: translate(3px, -2px);
  }
  40% {
    transform: translate(-2px, 3px);
  }
  60% {
    transform: translate(2px, 2px);
  }
  80% {
    transform: translate(-3px, -1px);
  }
  100% {
    transform: translate(0, 0);
  }
}
/* 178 · Idle Perimeter Dot (wrap) --------------------------- */
.sds-input-idle-perimeter-dot {
  position: relative;
  display: inline-block;
}
.sds-input-idle-perimeter-dot::before {
  content: "";
  position: absolute;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: var(--sds-primary);
  top: -2px;
  left: -2px;
  animation: sds-inputIdlePerimeterDot var(--sds-duration-dramatic, 3s) steps(1) infinite;
}
@keyframes sds-inputIdlePerimeterDot {
  0%,
  100% {
    transform: translate(0, 0);
    opacity: 0.85;
  }
  12%,
  24% {
    opacity: 0;
    transform: translate(0, 0);
  }
  25% {
    transform: translate(min(78vw, 210px), 0);
    opacity: 0.85;
  }
  37%,
  49% {
    opacity: 0;
    transform: translate(min(78vw, 210px), 0);
  }
  50% {
    transform: translate(min(78vw, 210px), 34px);
    opacity: 0.85;
  }
  62%,
  74% {
    opacity: 0;
    transform: translate(min(78vw, 210px), 34px);
  }
  75% {
    transform: translate(0, 34px);
    opacity: 0.85;
  }
  87%,
  99% {
    opacity: 0;
    transform: translate(0, 34px);
  }
}
/* 179 · Idle Soft Zoom -------------------------------------- */
.sds-input-idle-soft-zoom {
  animation: sds-inputIdleSoftZoom var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-inputIdleSoftZoom {
  0%,
  100% {
    transform: scale(1);
  }
  50% {
    transform: scale(1.006);
  }
}
/*!
 * SDS Motion Forge — cards.css
 * Card animations (Section 4).
 * Part of the lossless v5 category split — combined entry: src/motion.css
 */
/* ============================================================
   SECTION 4 — CARD ANIMATIONS
   Namespace: .sds-card-*
   ============================================================ */
/* 57 · Cinematic Reveal ------------------------------------ */
.sds-card-cinematic {
  animation: sds-cinematicReveal var(--sds-duration) var(--sds-easing) both;
}
@keyframes sds-cinematicReveal {
  0% {
    clip-path: inset(50% 0 50% 0);
    opacity: 0;
  }
  50% {
    clip-path: inset(0% 0 0% 0);
    opacity: 1;
  }
  100% {
    clip-path: inset(0% 0 0% 0);
    opacity: 1;
  }
}
/* 58 · Holographic Tilt ------------------------------------ */
.sds-card-holo {
  animation: sds-holographicTilt 4s ease infinite;
}
@keyframes sds-holographicTilt {
  0%,
  100% {
    transform: perspective(600px) rotateX(0) rotateY(0);
    filter: hue-rotate(0deg);
  }
  25% {
    transform: perspective(600px) rotateX(4deg) rotateY(-5deg);
    filter: hue-rotate(20deg);
  }
  75% {
    transform: perspective(600px) rotateX(-3deg) rotateY(5deg);
    filter: hue-rotate(-20deg);
  }
}
/* 59 · Depth Portal ---------------------------------------- */
.sds-card-portal {
  animation: sds-depthPortal var(--sds-duration) var(--sds-easing) both;
}
@keyframes sds-depthPortal {
  0% {
    opacity: 0;
    transform: perspective(500px) translateZ(-200px) scale(0.6);
    filter: blur(12px);
  }
  60% {
    opacity: 1;
    transform: perspective(500px) translateZ(8px) scale(1.02);
    filter: blur(0);
  }
  100% {
    opacity: 1;
    transform: perspective(500px) translateZ(0) scale(1);
  }
}
/* 60 · Refraction Shimmer ---------------------------------- */
.sds-card-shimmer {
  background: linear-gradient(
    135deg,
    rgba(0, 21, 209, 0.06) 0%,
    rgba(0, 21, 209, 0.02) 50%,
    rgba(0, 21, 209, 0.06) 100%
  );
  background-size: 300% 300%;
  animation: sds-refractionShimmer 4s ease infinite;
}
@keyframes sds-refractionShimmer {
  0%,
  100% {
    background-position: 0% 50%;
  }
  50% {
    background-position: 100% 50%;
  }
}
/* 61 · Magnetic Hover -------------------------------------- */
.sds-card-magnetic {
  animation: sds-magneticHover var(--sds-duration-dramatic, 3s) ease infinite;
}
@keyframes sds-magneticHover {
  0%,
  100% {
    transform: translateY(0) rotate(0);
    box-shadow: 0 4px 20px rgba(0, 21, 209, 0.08);
  }
  50% {
    transform: translateY(-8px) rotate(0.5deg);
    box-shadow:
      0 20px 40px rgba(0, 21, 209, 0.14),
      0 4px 8px rgba(0, 21, 209, 0.08);
  }
}
/* 62 · Warp Gate ------------------------------------------- */
.sds-card-warp {
  animation: sds-warpGate var(--sds-duration) var(--sds-easing) both;
}
@keyframes sds-warpGate {
  0% {
    opacity: 0;
    transform: perspective(400px) rotateY(-90deg) translateX(-40px);
  }
  60% {
    opacity: 1;
    transform: perspective(400px) rotateY(6deg) translateX(3px);
  }
  100% {
    opacity: 1;
    transform: perspective(400px) rotateY(0) translateX(0);
  }
}
/* 63 · Ambient Float --------------------------------------- */
.sds-card-float {
  animation: sds-ambientFloat var(--sds-duration-dramatic, 3s) ease infinite;
}
@keyframes sds-ambientFloat {
  0%,
  100% {
    transform: translateY(0);
    box-shadow:
      0 8px 24px rgba(0, 21, 209, 0.07),
      0 2px 6px rgba(0, 0, 0, 0.05);
  }
  50% {
    transform: translateY(-7px);
    box-shadow:
      0 20px 48px rgba(0, 21, 209, 0.12),
      0 8px 16px rgba(0, 21, 209, 0.06);
  }
}
/* 64 · Slice Up (children) --------------------------------- */
.sds-card-slice {
  overflow: hidden;
}
.sds-card-slice > * {
  animation: sds-sliceUp 0.6s var(--sds-easing) both;
  transform: translateY(100%);
}
.sds-card-slice > *:nth-child(1) {
  animation-delay: 0s;
}
.sds-card-slice > *:nth-child(2) {
  animation-delay: 0.08s;
}
.sds-card-slice > *:nth-child(3) {
  animation-delay: 0.16s;
}
.sds-card-slice > *:nth-child(4) {
  animation-delay: 0.24s;
}
@keyframes sds-sliceUp {
  from {
    transform: translateY(100%);
    opacity: 0;
  }
  to {
    transform: translateY(0);
    opacity: 1;
  }
}
/* 65 · Glow Surge ------------------------------------------ */
.sds-card-glow {
  animation: sds-glowSurge 2.5s ease infinite;
}
/* 66 · Parallax Depth -------------------------------------- */
.sds-card-parallax {
  animation: sds-parallaxDepth 4s ease infinite;
}
@keyframes sds-parallaxDepth {
  0%,
  100% {
    transform: perspective(400px) rotateX(0) translateZ(0);
  }
  50% {
    transform: perspective(400px) rotateX(3deg) translateZ(12px);
  }
}
/* 67 · Tilt --------------------------------------------- */
.sds-card-tilt {
  animation: sds-cardTilt 4s ease-in-out infinite;
}
@keyframes sds-cardTilt {
  0%,
  100% {
    transform: perspective(600px) rotateX(0) rotateY(0);
  }
  25% {
    transform: perspective(600px) rotateX(-4deg) rotateY(6deg);
  }
  75% {
    transform: perspective(600px) rotateX(4deg) rotateY(-6deg);
  }
}
/* 68 · Expand ------------------------------------------- */
.sds-card-expand {
  animation: sds-cardExpand 0.9s var(--sds-easing) both;
}
@keyframes sds-cardExpand {
  0% {
    opacity: 0;
    transform: scale(0.72) translateY(20px);
    filter: blur(8px);
  }
  60% {
    opacity: 1;
    transform: scale(1.04) translateY(-4px);
    filter: blur(0);
  }
  80% {
    transform: scale(0.98);
  }
  100% {
    opacity: 1;
    transform: scale(1) translateY(0);
  }
}
/* 69 · Flip Reveal --------------------------------------- */
.sds-card-flip-reveal {
  animation: sds-cardFlipReveal var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-cardFlipReveal {
  0% {
    opacity: 0;
    transform: perspective(600px) rotateY(-80deg);
  }
  60% {
    opacity: 1;
    transform: perspective(600px) rotateY(6deg);
  }
  100% {
    opacity: 1;
    transform: perspective(600px) rotateY(0);
  }
}
/* 70 · Spotlight ---------------------------------------- */
.sds-card-spotlight {
  animation: sds-cardSpotlight 4s ease infinite;
  background-image: radial-gradient(
    circle at 50% 50%,
    rgba(255, 255, 255, 0.08) 0%,
    rgba(255, 255, 255, 0) 60%
  );
  background-size: 200% 200%;
}
@keyframes sds-cardSpotlight {
  0%,
  100% {
    background-position: 0% 0%;
  }
  25% {
    background-position: 100% 0%;
  }
  50% {
    background-position: 100% 100%;
  }
  75% {
    background-position: 0% 100%;
  }
}
/* 71 · Glitch ------------------------------------------- */
.sds-card-glitch {
  animation: sds-cardGlitch 4s steps(1) infinite;
}
@keyframes sds-cardGlitch {
  0%,
  100% {
    transform: none;
    filter: none;
  }
  8% {
    transform: translate(3px, -1px) skewX(2deg);
    filter: hue-rotate(30deg);
  }
  9% {
    transform: none;
    filter: none;
  }
  45% {
    transform: translate(-2px, 1px);
    filter: brightness(1.2);
  }
  46% {
    transform: none;
    filter: none;
  }
}
/* 72 · Morph ------------------------------------------- */
.sds-card-morph {
  animation: sds-cardMorph var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-cardMorph {
  0%,
  100% {
    border-radius: 12px;
  }
  33% {
    border-radius: 24px 8px 24px 8px;
  }
  66% {
    border-radius: 8px 24px 8px 24px;
  }
}
/* 73 · Rise --------------------------------------------- */
.sds-card-rise {
  animation: sds-cardRise var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-cardRise {
  from {
    opacity: 0;
    transform: translateY(60px) scale(0.95);
    filter: blur(6px);
  }
  to {
    opacity: 1;
    transform: translateY(0) scale(1);
    filter: blur(0);
  }
}
/* 74 · Drift ------------------------------------------- */
.sds-card-drift {
  animation: sds-cardDrift 5s ease-in-out infinite;
}
@keyframes sds-cardDrift {
  0%,
  100% {
    transform: translate(0, 0) rotate(0deg);
  }
  25% {
    transform: translate(4px, -6px) rotate(0.4deg);
  }
  50% {
    transform: translate(-2px, -10px) rotate(-0.2deg);
  }
  75% {
    transform: translate(-4px, -4px) rotate(0.3deg);
  }
}
/* 75 · Glass ------------------------------------------- */
.sds-card-glass {
  animation: sds-cardGlass 0.7s ease both;
  backdrop-filter: blur(12px);
  background: rgba(255, 255, 255, 0.1);
}
@keyframes sds-cardGlass {
  from {
    opacity: 0;
    backdrop-filter: blur(0);
    transform: scale(0.95);
  }
  to {
    opacity: 1;
    backdrop-filter: blur(12px);
    transform: scale(1);
  }
}
/* 76 · Breath ------------------------------------------ */
.sds-card-breath {
  animation: sds-cardBreath var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-cardBreath {
  0%,
  100% {
    transform: scale(1);
    box-shadow: 0 4px 20px rgba(0, 21, 209, 0.06);
  }
  50% {
    transform: scale(1.025);
    box-shadow: 0 12px 40px rgba(0, 21, 209, 0.12);
  }
}
/* 77 · Aurora ------------------------------------------ */
.sds-card-aurora {
  animation: sds-cardAurora 5s ease-in-out infinite;
}
@keyframes sds-cardAurora {
  0%,
  100% {
    box-shadow:
      0 0 20px rgba(0, 21, 209, 0.1),
      0 0 60px rgba(0, 21, 209, 0.04);
  }
  25% {
    box-shadow:
      0 0 20px rgba(139, 92, 246, 0.15),
      0 0 60px rgba(139, 92, 246, 0.05);
  }
  50% {
    box-shadow:
      0 0 20px rgba(6, 182, 212, 0.12),
      0 0 60px rgba(6, 182, 212, 0.04);
  }
  75% {
    box-shadow:
      0 0 20px rgba(16, 185, 129, 0.12),
      0 0 60px rgba(16, 185, 129, 0.04);
  }
}
/* 78 · Scan -------------------------------------------- */
.sds-card-scan {
  overflow: hidden;
  animation: sds-cardScan 0.9s var(--sds-easing) both;
}
@keyframes sds-cardScan {
  from {
    clip-path: inset(0 100% 0 0);
  }
  to {
    clip-path: inset(0 0% 0 0);
  }
}
/* 79 · Rotate ------------------------------------------ */
.sds-card-rotate {
  animation: sds-cardRotate var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-cardRotate {
  0% {
    opacity: 0;
    transform: perspective(600px) rotateX(40deg) translateY(30px);
    filter: blur(4px);
  }
  65% {
    opacity: 1;
    transform: perspective(600px) rotateX(-3deg) translateY(-4px);
    filter: blur(0);
  }
  100% {
    opacity: 1;
    transform: perspective(600px) rotateX(0) translateY(0);
  }
}
/* 80 · Unfold ------------------------------------------ */
.sds-card-unfold {
  transform-origin: top center;
  animation: sds-cardUnfold var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-cardUnfold {
  0% {
    opacity: 0;
    transform: scaleY(0) perspective(400px) rotateX(-20deg);
  }
  60% {
    opacity: 1;
    transform: scaleY(1.04) perspective(400px) rotateX(2deg);
  }
  100% {
    opacity: 1;
    transform: scaleY(1) perspective(400px) rotateX(0);
  }
}
/* 81 · Ink --------------------------------------------- */
.sds-card-ink {
  animation: sds-cardInk 1s var(--sds-easing) both;
}
@keyframes sds-cardInk {
  from {
    clip-path: circle(0% at 0% 0%);
    opacity: 0;
  }
  to {
    clip-path: circle(150% at 0% 0%);
    opacity: 1;
  }
}
/* 82 · Electric ---------------------------------------- */
.sds-card-electric {
  animation: sds-cardElectric 2.4s ease infinite;
}
@keyframes sds-cardElectric {
  0%,
  100% {
    box-shadow: 0 0 0 1px rgba(0, 21, 209, 0.15);
  }
  10% {
    box-shadow:
      0 0 0 1px var(--sds-primary),
      0 0 20px var(--sds-primary-glow);
  }
  12% {
    box-shadow: 0 0 0 1px rgba(0, 21, 209, 0.15);
  }
  30% {
    box-shadow:
      0 0 0 1px rgba(0, 21, 209, 0.4),
      0 0 10px rgba(0, 21, 209, 0.12);
  }
  32% {
    box-shadow: 0 0 0 1px rgba(0, 21, 209, 0.15);
  }
}
/* 83 · Prism ------------------------------------------- */
.sds-card-prism {
  animation: sds-cardPrism 5s linear infinite;
}
@keyframes sds-cardPrism {
  0% {
    filter: hue-rotate(0deg) brightness(1);
  }
  25% {
    filter: hue-rotate(60deg) brightness(1.05);
  }
  50% {
    filter: hue-rotate(120deg) brightness(1);
  }
  75% {
    filter: hue-rotate(200deg) brightness(1.05);
  }
  100% {
    filter: hue-rotate(360deg) brightness(1);
  }
}
/* 84 · Levitate ---------------------------------------- */
.sds-card-levitate {
  animation: sds-cardLevitate 3.5s ease-in-out infinite;
}
@keyframes sds-cardLevitate {
  0%,
  100% {
    transform: translateY(0) perspective(500px) rotateX(0);
    box-shadow: 0 6px 20px rgba(0, 21, 209, 0.08);
  }
  50% {
    transform: translateY(-12px) perspective(500px) rotateX(2deg);
    box-shadow: 0 24px 56px rgba(0, 21, 209, 0.16);
  }
}
/* 85 · Vortex ------------------------------------------ */
.sds-card-vortex {
  animation: sds-cardVortex 0.7s var(--sds-easing) both;
}
@keyframes sds-cardVortex {
  0% {
    opacity: 0;
    transform: perspective(400px) translateZ(-300px) rotate(-15deg) scale(0.5);
    filter: blur(20px);
  }
  60% {
    opacity: 1;
    transform: perspective(400px) translateZ(8px) rotate(2deg) scale(1.02);
    filter: blur(0);
  }
  100% {
    opacity: 1;
    transform: perspective(400px) translateZ(0) rotate(0) scale(1);
  }
}
/* 86 · Iris -------------------------------------------- */
.sds-card-iris {
  animation: sds-cardIris var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-cardIris {
  from {
    clip-path: circle(0% at 50% 50%);
    opacity: 0;
  }
  to {
    clip-path: circle(150% at 50% 50%);
    opacity: 1;
  }
}
/* 87 · Spring ------------------------------------------ */
.sds-card-spring {
  animation: sds-cardSpring 0.9s var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) both;
}
@keyframes sds-cardSpring {
  0% {
    opacity: 0;
    transform: scale(0.6) rotate(-3deg);
  }
  65% {
    opacity: 1;
    transform: scale(1.06) rotate(1deg);
  }
  80% {
    transform: scale(0.97) rotate(-0.5deg);
  }
  100% {
    opacity: 1;
    transform: scale(1) rotate(0);
  }
}
/* 88 · Shadow Lift -------------------------------------- */
.sds-card-shadow-lift {
  animation: sds-cardShadowLift 2.8s ease-in-out infinite;
}
@keyframes sds-cardShadowLift {
  0%,
  100% {
    transform: translateY(0);
    box-shadow:
      0 2px 8px rgba(0, 0, 0, 0.06),
      0 1px 2px rgba(0, 0, 0, 0.04);
  }
  50% {
    transform: translateY(-10px);
    box-shadow:
      0 28px 60px rgba(0, 0, 0, 0.12),
      0 10px 20px rgba(0, 0, 0, 0.07);
  }
}
/* 89 · Neon Border -------------------------------------- */
.sds-card-neon-border {
  animation: sds-cardNeonBorder var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-cardNeonBorder {
  0%,
  85%,
  100% {
    box-shadow:
      0 0 6px var(--sds-primary-glow),
      inset 0 0 6px var(--sds-primary-dim);
  }
  87% {
    box-shadow: none;
  }
  89% {
    box-shadow: 0 0 10px var(--sds-primary-glow);
  }
  91% {
    box-shadow: none;
  }
}
/* 90 · Wave -------------------------------------------- */
.sds-card-wave {
  animation: sds-cardWave 0.9s var(--sds-easing) both;
}
@keyframes sds-cardWave {
  0% {
    opacity: 0;
    transform: perspective(500px) translateZ(-100px) rotateX(25deg) scaleX(0.85);
    filter: blur(8px);
  }
  60% {
    opacity: 1;
    transform: perspective(500px) translateZ(4px) rotateX(-2deg) scaleX(1.02);
    filter: blur(0);
  }
  100% {
    opacity: 1;
    transform: perspective(500px) translateZ(0) rotateX(0) scaleX(1);
  }
}
/* 91 · Snap -------------------------------------------- */
.sds-card-snap {
  animation: sds-cardSnap 0.5s var(--sds-ease-bounce, cubic-bezier(0.68, -0.55, 0.27, 1.55)) both;
}
@keyframes sds-cardSnap {
  0% {
    opacity: 0;
    transform: scale(1.3) rotate(4deg);
  }
  60% {
    opacity: 1;
    transform: scale(0.95) rotate(-1deg);
  }
  80% {
    transform: scale(1.03) rotate(0.5deg);
  }
  100% {
    opacity: 1;
    transform: scale(1) rotate(0);
  }
}
/* 92 · Gravity ----------------------------------------- */
.sds-card-gravity {
  animation: sds-cardGravity var(--sds-duration-base, 0.8s) var(--sds-ease-bounce, cubic-bezier(0.68, -0.55, 0.27, 1.55)) both;
}
@keyframes sds-cardGravity {
  0% {
    opacity: 0;
    transform: translateY(-80px) scaleY(0.6);
  }
  65% {
    opacity: 1;
    transform: translateY(8px) scaleY(1.04);
  }
  80% {
    transform: translateY(-3px) scaleY(0.98);
  }
  100% {
    opacity: 1;
    transform: translateY(0) scaleY(1);
  }
}
/* 93 · Bloom ------------------------------------------- */
.sds-card-bloom {
  animation: sds-cardBloom var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-cardBloom {
  0%,
  100% {
    box-shadow: 0 0 0 rgba(0, 21, 209, 0);
    filter: brightness(1);
  }
  50% {
    box-shadow:
      0 0 40px rgba(0, 21, 209, 0.14),
      0 0 80px rgba(0, 21, 209, 0.06);
    filter: brightness(1.04);
  }
}
/* 94 · Fold -------------------------------------------- */
.sds-card-fold {
  transform-origin: bottom center;
  animation: sds-cardFold var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-cardFold {
  0% {
    opacity: 0;
    transform: perspective(500px) rotateX(-60deg) scaleY(0.7);
  }
  60% {
    opacity: 1;
    transform: perspective(500px) rotateX(4deg) scaleY(1.02);
  }
  100% {
    opacity: 1;
    transform: perspective(500px) rotateX(0) scaleY(1);
  }
}
/* 95 · Burst ------------------------------------------- */
.sds-card-burst {
  animation: sds-cardBurst 0.7s var(--sds-easing) both;
}
@keyframes sds-cardBurst {
  0% {
    opacity: 0;
    transform: scale(0.3);
    filter: blur(24px) brightness(3);
  }
  50% {
    opacity: 1;
    transform: scale(1.08);
    filter: blur(2px) brightness(1.2);
  }
  70% {
    transform: scale(0.97);
    filter: blur(0);
  }
  100% {
    opacity: 1;
    transform: scale(1);
    filter: blur(0) brightness(1);
  }
}
/* 96 · Liquid Border ----------------------------------- */
.sds-card-liquid-border {
  animation: sds-cardLiquidBorder 4s ease-in-out infinite;
}
@keyframes sds-cardLiquidBorder {
  0%,
  100% {
    border-radius: 12px;
    box-shadow: 0 0 0 1px rgba(0, 21, 209, 0.2);
  }
  25% {
    border-radius: 20px 8px 20px 8px;
    box-shadow: 0 0 0 1px rgba(0, 21, 209, 0.4);
  }
  50% {
    border-radius: 8px 20px 8px 20px;
    box-shadow: 0 0 0 1px rgba(0, 21, 209, 0.3);
  }
  75% {
    border-radius: 16px 4px 16px 4px;
    box-shadow: 0 0 0 1px rgba(0, 21, 209, 0.35);
  }
}
/* 97 · Stagger (up to 6 children) --------------------- */
.sds-card-stagger {
  overflow: hidden;
}
.sds-card-stagger > * {
  animation: sds-cardStaggerChild 0.5s var(--sds-easing) both;
}
.sds-card-stagger > *:nth-child(1) {
  animation-delay: 0s;
}
.sds-card-stagger > *:nth-child(2) {
  animation-delay: 0.08s;
}
.sds-card-stagger > *:nth-child(3) {
  animation-delay: 0.16s;
}
.sds-card-stagger > *:nth-child(4) {
  animation-delay: 0.24s;
}
.sds-card-stagger > *:nth-child(5) {
  animation-delay: 0.32s;
}
.sds-card-stagger > *:nth-child(6) {
  animation-delay: 0.4s;
}
@keyframes sds-cardStaggerChild {
  from {
    opacity: 0;
    transform: translateY(100%);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}
/* 98 · Deep Float -------------------------------------- */
.sds-card-deep-float {
  animation: sds-cardDeepFloat 4s ease-in-out infinite;
}
@keyframes sds-cardDeepFloat {
  0%,
  100% {
    transform: perspective(600px) translateZ(0) translateY(0);
    box-shadow: 0 4px 24px rgba(0, 21, 209, 0.06);
  }
  50% {
    transform: perspective(600px) translateZ(20px) translateY(-8px);
    box-shadow: 0 24px 60px rgba(0, 21, 209, 0.14);
  }
}
/* 99 · Force ------------------------------------------- */
.sds-card-force {
  animation: sds-cardForce 2s ease-in-out infinite;
}
@keyframes sds-cardForce {
  0%,
  100% {
    transform: scaleX(1) scaleY(1);
    box-shadow: 0 4px 16px rgba(0, 21, 209, 0.08);
  }
  25% {
    transform: scaleX(1.03) scaleY(0.97);
  }
  50% {
    transform: scaleX(0.97) scaleY(1.03);
    box-shadow: 0 12px 32px rgba(0, 21, 209, 0.14);
  }
  75% {
    transform: scaleX(1.01) scaleY(0.99);
  }
}
/* 100 · Cascade (up to 6 children) -------------------- */
.sds-card-cascade > * {
  animation: sds-cardCascadeChild 0.6s var(--sds-easing) both;
}
.sds-card-cascade > *:nth-child(1) {
  animation-delay: 0s;
}
.sds-card-cascade > *:nth-child(2) {
  animation-delay: 0.1s;
}
.sds-card-cascade > *:nth-child(3) {
  animation-delay: 0.2s;
}
.sds-card-cascade > *:nth-child(4) {
  animation-delay: 0.3s;
}
.sds-card-cascade > *:nth-child(5) {
  animation-delay: 0.4s;
}
.sds-card-cascade > *:nth-child(6) {
  animation-delay: 0.5s;
}
@keyframes sds-cardCascadeChild {
  from {
    opacity: 0;
    transform: translateX(-40px);
    filter: blur(4px);
  }
  to {
    opacity: 1;
    transform: translateX(0);
    filter: blur(0);
  }
}
/* 101 · Smoke ------------------------------------------ */
.sds-card-smoke {
  animation: sds-cardSmoke 1.1s ease both;
}
@keyframes sds-cardSmoke {
  0% {
    opacity: 0;
    filter: blur(28px) brightness(2);
    transform: scale(1.2);
  }
  40% {
    opacity: 1;
    filter: blur(4px) brightness(1.2);
    transform: scale(1.04);
  }
  100% {
    opacity: 1;
    filter: blur(0) brightness(1);
    transform: scale(1);
  }
}
/* 102 · Momentum --------------------------------------- */
.sds-card-momentum {
  animation: sds-cardMomentum 0.85s var(--sds-easing) both;
}
@keyframes sds-cardMomentum {
  0% {
    opacity: 0;
    transform: translateX(-80px) skewX(-6deg);
    filter: blur(10px);
  }
  40% {
    filter: blur(0);
    opacity: 1;
    transform: translateX(8px) skewX(1deg);
  }
  65% {
    transform: translateX(-3px) skewX(-0.5deg);
  }
  100% {
    opacity: 1;
    transform: translateX(0) skewX(0);
  }
}
.sds-card-neon {
  animation: sds-glowSurge 2.5s ease infinite;
}
.sds-card-depth {
  animation: sds-parallaxDepth 4s ease infinite;
}
.sds-card-flip {
  animation: sds-sliceUp 0.6s var(--sds-easing) both;
}
/*  GPU compositing hints (cards) — split from the global will-change rule; must stay after the class definitions above  */
.sds-card-float,
.sds-card-holo,
.sds-card-magnetic,
.sds-card-tilt,
.sds-card-drift,
.sds-card-levitate,
.sds-card-deep-float {
  will-change: transform, opacity;
}
/* ====================================================================
   BATCH 8 � Cards: 3D Depth & Parallax (7) + Clip Reveals (7)
   ==================================================================== */
/* -- 3D Depth & Parallax ------------------------------------------- */
/* 103 � Tilt Orbit ------------------------------------------ */
@keyframes sds-tiltOrbit {
  0%,100% { transform: perspective(600px) rotateX(7deg) rotateY(-10deg); filter: drop-shadow(4px 8px 10px rgba(0,0,0,.22)); }
  25%     { transform: perspective(600px) rotateX(-5deg) rotateY(10deg);  filter: drop-shadow(-3px 6px 14px rgba(0,0,0,.18)); }
  50%     { transform: perspective(600px) rotateX(-7deg) rotateY(-8deg);  filter: drop-shadow(-4px -8px 10px rgba(0,0,0,.22)); }
  75%     { transform: perspective(600px) rotateX(5deg) rotateY(8deg);    filter: drop-shadow(3px 6px 14px rgba(0,0,0,.18)); }
}
.sds-card-tilt-orbit {
  animation: sds-tiltOrbit 6s cubic-bezier(.45,.05,.55,.95) infinite;
  transform-style: preserve-3d;
}
/* 104 � Layers (up to 3 children, parallax-bob) --------------- */
@keyframes sds-layerBobA {
  0%,100% { transform: translateY(0); }
  50%     { transform: translateY(-5px); }
}
@keyframes sds-layerBobB {
  0%,100% { transform: translateY(0); }
  50%     { transform: translateY(-9px); }
}
@keyframes sds-layerBobC {
  0%,100% { transform: translateY(0); }
  50%     { transform: translateY(-13px); }
}
.sds-card-layers > *:nth-child(1) { animation: sds-layerBobA 3s ease-in-out infinite; }
.sds-card-layers > *:nth-child(2) { animation: sds-layerBobB 3s ease-in-out infinite .2s; }
.sds-card-layers > *:nth-child(3) { animation: sds-layerBobC 3s ease-in-out infinite .4s; }
/* 105 � Door Peek ------------------------------------------- */
@keyframes sds-doorPeek {
  0%,100% { transform: perspective(600px) rotateY(0deg); }
  15%     { transform: perspective(600px) rotateY(-18deg); }
  70%     { transform: perspective(600px) rotateY(-18deg); }
  88%     { transform: perspective(600px) rotateY(0deg); }
}
.sds-card-door-peek {
  animation: sds-doorPeek 3.2s cubic-bezier(.25,.46,.45,.94) infinite;
  transform-origin: left center;
}
/* 106 � Flip Loop ------------------------------------------- */
@keyframes sds-flipLoop {
  0%   { transform: perspective(800px) rotateY(0deg);   filter: brightness(1); }
  22%  { transform: perspective(800px) rotateY(90deg);  filter: brightness(.35); }
  45%  { transform: perspective(800px) rotateY(180deg); filter: brightness(1); }
  68%  { transform: perspective(800px) rotateY(270deg); filter: brightness(.35); }
  82%  { transform: perspective(800px) rotateY(375deg); filter: brightness(1); }
  90%  { transform: perspective(800px) rotateY(352deg); filter: brightness(1); }
  100% { transform: perspective(800px) rotateY(360deg); filter: brightness(1); }
}
.sds-card-flip-loop {
  animation: sds-flipLoop 2.8s cubic-bezier(.34,1.2,.64,1) infinite;
}
/* 107 � Carousel Step --------------------------------------- */
@keyframes sds-carouselStep {
  0%,12%   { transform: perspective(800px) rotateY(0deg); }
  18%,32%  { transform: perspective(800px) rotateY(-30deg); }
  38%,52%  { transform: perspective(800px) rotateY(-60deg); }
  58%,72%  { transform: perspective(800px) rotateY(-90deg); }
  78%,88%  { transform: perspective(800px) rotateY(-45deg); }
  94%,100% { transform: perspective(800px) rotateY(0deg); }
}
.sds-card-carousel-step {
  animation: sds-carouselStep 5s ease-in-out infinite;
}
/* 108 � Dive ----------------------------------------------- */
@keyframes sds-cardDive {
  0%   { transform: perspective(800px) rotateX(65deg) translateY(-36px) scale(.86); filter: blur(4px); opacity: 0; }
  50%  { transform: perspective(800px) rotateX(10deg) translateY(-8px) scale(.97);  filter: blur(1px); opacity: 1; }
  75%  { transform: perspective(800px) rotateX(-4deg) translateY(2px) scale(1.01);  filter: blur(0px); opacity: 1; }
  88%  { transform: perspective(800px) rotateX(2deg) translateY(-1px) scale(1);     filter: blur(0px); opacity: 1; }
  100% { transform: perspective(800px) rotateX(0deg) translateY(0px) scale(1);      filter: blur(0px); opacity: 1; }
}
.sds-card-dive {
  animation: sds-cardDive 1s cubic-bezier(.2,.6,.3,1) both;
}
/* 109 � Float Gimbal --------------------------------------- */
@keyframes sds-floatGimbal {
  0%   { transform: perspective(600px) translateY(0px)   rotateX(2deg) rotateY(-3deg); }
  25%  { transform: perspective(600px) translateY(-8px)  rotateX(-2deg) rotateY(3deg); }
  50%  { transform: perspective(600px) translateY(-4px)  rotateX(3deg) rotateY(-2deg); }
  75%  { transform: perspective(600px) translateY(-10px) rotateX(-1deg) rotateY(2deg); }
  100% { transform: perspective(600px) translateY(0px)   rotateX(2deg) rotateY(-3deg); }
}
.sds-card-float-gimbal {
  animation: sds-floatGimbal 5s ease-in-out infinite;
}
/* -- Clip Reveals -------------------------------------------------- */
/* 110 � Iris Bloom ------------------------------------------ */
@keyframes sds-irisBloom {
  0%   { clip-path: circle(0% at 35% 42%); opacity: .7; filter: brightness(1); }
  60%  { clip-path: circle(85% at 50% 50%); opacity: 1; filter: brightness(1.25); }
  80%  { clip-path: circle(100% at 50% 50%); filter: brightness(1.12); }
  100% { clip-path: circle(100% at 50% 50%); filter: brightness(1); }
}
.sds-card-iris-bloom {
  animation: sds-irisBloom .85s cubic-bezier(.2,.6,.2,1) both;
}
/* 111 � Diagonal Wipe --------------------------------------- */
@keyframes sds-diagWipe {
  0%   { clip-path: polygon(0% 0%, 0% 0%, 0% 100%, 0% 100%); filter: brightness(1); }
  70%  { clip-path: polygon(0% 0%, 90% 0%, 100% 100%, 0% 100%); filter: brightness(1); }
  80%  { clip-path: polygon(0% 0%, 98% 0%, 100% 100%, 0% 100%); filter: brightness(1.14); }
  100% { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); filter: brightness(1); }
}
.sds-card-diagonal-wipe {
  animation: sds-diagWipe .75s cubic-bezier(.4,0,.2,1) both;
}
/* 112 � Shutter --------------------------------------------- */
@keyframes sds-cardShutter {
  0%   { clip-path: inset(100% 0 0 0); }
  100% { clip-path: inset(0 0 0 0); }
}
.sds-card-shutter {
  animation: sds-cardShutter .55s steps(5, start) both;
}
/* 113 � Spiral Reveal --------------------------------------- */
@keyframes sds-spiralReveal {
  /* 10 fixed points: center + 9 swept clockwise from 12-o'clock */
  0%   { clip-path: polygon(50% 50%, 50% 0%, 51% 0%, 51% 0%, 51% 0%, 51% 0%, 51% 0%, 51% 0%, 51% 0%, 51% 0%); opacity: .8; }
  11%  { clip-path: polygon(50% 50%, 50% 0%, 100% 0%, 100% 0%, 100% 0%, 100% 0%, 100% 0%, 100% 0%, 100% 0%, 100% 0%); opacity: 1; }
  22%  { clip-path: polygon(50% 50%, 50% 0%, 100% 0%, 100% 25%, 100% 25%, 100% 25%, 100% 25%, 100% 25%, 100% 25%, 100% 25%); }
  33%  { clip-path: polygon(50% 50%, 50% 0%, 100% 0%, 100% 25%, 100% 75%, 100% 75%, 100% 75%, 100% 75%, 100% 75%, 100% 75%); }
  44%  { clip-path: polygon(50% 50%, 50% 0%, 100% 0%, 100% 25%, 100% 75%, 100% 100%, 100% 100%, 100% 100%, 100% 100%, 100% 100%); }
  55%  { clip-path: polygon(50% 50%, 50% 0%, 100% 0%, 100% 25%, 100% 75%, 100% 100%, 50% 100%, 0% 100%, 0% 100%, 0% 100%); }
  66%  { clip-path: polygon(50% 50%, 50% 0%, 100% 0%, 100% 25%, 100% 75%, 100% 100%, 50% 100%, 0% 100%, 0% 50%, 0% 50%); }
  77%  { clip-path: polygon(50% 50%, 50% 0%, 100% 0%, 100% 25%, 100% 75%, 100% 100%, 50% 100%, 0% 100%, 0% 50%, 0% 0%); }
  88%  { clip-path: polygon(50% 50%, 50% 0%, 100% 0%, 100% 25%, 100% 75%, 100% 100%, 50% 100%, 0% 100%, 0% 0%, 30% 0%); }
  100% { clip-path: polygon(50% 50%, 50% 0%, 100% 0%, 100% 25%, 100% 75%, 100% 100%, 50% 100%, 0% 100%, 0% 0%, 50% 0%); }
}
.sds-card-spiral-reveal {
  animation: sds-spiralReveal 1.2s cubic-bezier(.4,0,.6,1) both;
}
/* 114 � Letterbox ------------------------------------------- */
@keyframes sds-letterbox {
  0%   { clip-path: inset(22% 0 22% 0); transform: scale(1.04); }
  50%  { clip-path: inset(10% 0 10% 0); transform: scale(1.02); }
  100% { clip-path: inset(0% 0 0% 0);   transform: scale(1); }
}
.sds-card-letterbox {
  animation: sds-letterbox .9s cubic-bezier(.4,0,.2,1) both;
}
/* 115 � Tear ----------------------------------------------- */
@keyframes sds-cardTear {
  0%   { clip-path: polygon(0% 0%, 0% 0%, 0% 0%, 0% 0%); transform: rotate(-4deg); opacity: .9; }
  30%  { clip-path: polygon(0% 0%, 55% 0%, 22% 55%, 0% 100%); transform: rotate(-2.5deg); opacity: 1; }
  60%  { clip-path: polygon(0% 0%, 100% 0%, 72% 48%, 88% 100%, 0% 100%); transform: rotate(-1deg); }
  85%  { clip-path: polygon(0% 0%, 100% 0%, 100% 68%, 88% 100%, 0% 100%); transform: rotate(-.3deg); }
  100% { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); transform: rotate(0deg); }
}
.sds-card-tear {
  animation: sds-cardTear .85s cubic-bezier(.34,1.1,.64,1) both;
}
/* 116 � Checker (4 quadrant children, diagonal pairs) --------- */
@keyframes sds-checkerPop {
  0%   { transform: scale(0); opacity: 0; }
  100% { transform: scale(1); opacity: 1; }
}
.sds-card-checker {
  display: grid;
  grid-template-columns: 1fr 1fr;
  overflow: hidden;
}
.sds-card-checker > * {
  flex: 1;
}
.sds-card-checker > *:nth-child(1),
.sds-card-checker > *:nth-child(4) {
  animation: sds-checkerPop .35s cubic-bezier(.2,0,.2,1) both;
}
.sds-card-checker > *:nth-child(2),
.sds-card-checker > *:nth-child(3) {
  animation: sds-checkerPop .35s cubic-bezier(.2,0,.2,1) .2s both;
}
/*  GPU compositing hints � Batch 8 */
.sds-card-tilt-orbit,
.sds-card-door-peek,
.sds-card-flip-loop,
.sds-card-carousel-step,
.sds-card-dive,
.sds-card-float-gimbal {
  will-change: transform, filter;
}
/* ====================================================================
   BATCH 9 � Cards: Staged Content Choreography (6) + Border Beam & Frame (6)
   ==================================================================== */
/* -- Staged Content Choreography ---------------------------------- */
/* 117 � Reveal Stack � children stagger-slide up from beneath */
@keyframes sds-revealStack {
  0%   { transform: translateY(24px); opacity: 0; }
  100% { transform: translateY(0px);  opacity: 1; }
}
.sds-card-reveal-stack > *:nth-child(1) { animation: sds-revealStack .45s cubic-bezier(.2,0,.2,1) both; }
.sds-card-reveal-stack > *:nth-child(2) { animation: sds-revealStack .45s cubic-bezier(.2,0,.2,1) .1s both; }
.sds-card-reveal-stack > *:nth-child(3) { animation: sds-revealStack .45s cubic-bezier(.2,0,.2,1) .2s both; }
.sds-card-reveal-stack > *:nth-child(4) { animation: sds-revealStack .45s cubic-bezier(.2,0,.2,1) .3s both; }
/* 118 � Curtain Fall � pseudo-curtain drops then retracts, revealing card */
@keyframes sds-curtainFallKf {
  0%   { transform: translateY(-100%); }
  35%  { transform: translateY(0%); }
  65%  { transform: translateY(0%); }
  100% { transform: translateY(100%); }
}
.sds-card-curtain-fall {
  position: relative;
  overflow: hidden;
}
.sds-card-curtain-fall::before {
  content: "";
  position: absolute;
  inset: 0;
  background: rgba(20, 20, 50, 0.88);
  animation: sds-curtainFallKf 1.4s cubic-bezier(.4,0,.6,1) both;
  z-index: 1;
}
/* 119 � Accordion In � children unfold from scaleY(0) with stagger */
@keyframes sds-accordionIn {
  0%   { transform: scaleY(0); opacity: 0; }
  100% { transform: scaleY(1); opacity: 1; }
}
.sds-card-accordion-in {
  overflow: hidden;
}
.sds-card-accordion-in > * {
  transform-origin: top center;
}
.sds-card-accordion-in > *:nth-child(1) { animation: sds-accordionIn .3s cubic-bezier(.2,0,.2,1) both; }
.sds-card-accordion-in > *:nth-child(2) { animation: sds-accordionIn .3s cubic-bezier(.2,0,.2,1) .12s both; }
.sds-card-accordion-in > *:nth-child(3) { animation: sds-accordionIn .3s cubic-bezier(.2,0,.2,1) .24s both; }
.sds-card-accordion-in > *:nth-child(4) { animation: sds-accordionIn .3s cubic-bezier(.2,0,.2,1) .36s both; }
/* 120 � Fan Spread � children rotate out from bottom-left origin */
@keyframes sds-fanSpread1 { 0% { transform: rotate(0deg); opacity: 0; } 100% { transform: rotate(-2deg);  opacity: 1; } }
@keyframes sds-fanSpread2 { 0% { transform: rotate(0deg); opacity: 0; } 100% { transform: rotate(-8deg);  opacity: 1; } }
@keyframes sds-fanSpread3 { 0% { transform: rotate(0deg); opacity: 0; } 100% { transform: rotate(-14deg); opacity: 1; } }
@keyframes sds-fanSpread4 { 0% { transform: rotate(0deg); opacity: 0; } 100% { transform: rotate(-20deg); opacity: 1; } }
.sds-card-fan-spread > * {
  transform-origin: bottom left;
}
.sds-card-fan-spread > *:nth-child(1) { animation: sds-fanSpread1 .5s cubic-bezier(.34,1.3,.64,1) both; }
.sds-card-fan-spread > *:nth-child(2) { animation: sds-fanSpread2 .5s cubic-bezier(.34,1.3,.64,1) .08s both; }
.sds-card-fan-spread > *:nth-child(3) { animation: sds-fanSpread3 .5s cubic-bezier(.34,1.3,.64,1) .16s both; }
.sds-card-fan-spread > *:nth-child(4) { animation: sds-fanSpread4 .5s cubic-bezier(.34,1.3,.64,1) .24s both; }
/* 121 � Content Flood � diagonal clip-path fill from top-left corner */
@keyframes sds-contentFlood {
  0%   { clip-path: polygon(0% 0%, 0% 0%, 0% 0%); opacity: .5; }
  40%  { clip-path: polygon(0% 0%, 100% 0%, 0% 100%); opacity: 1; }
  100% { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); opacity: 1; }
}
.sds-card-content-flood {
  animation: sds-contentFlood .7s cubic-bezier(.4,0,.2,1) both;
}
/* 122 � Unpack � spring-expand from compressed vertical state */
@keyframes sds-unpack {
  0%   { transform: perspective(600px) scaleY(.25) rotateX(22deg); opacity: 0; filter: blur(2px); }
  55%  { transform: perspective(600px) scaleY(1.06) rotateX(-2deg); opacity: 1; filter: blur(0px); }
  75%  { transform: perspective(600px) scaleY(.97) rotateX(1deg); }
  90%  { transform: perspective(600px) scaleY(1.01) rotateX(0deg); }
  100% { transform: perspective(600px) scaleY(1) rotateX(0deg); opacity: 1; filter: blur(0px); }
}
.sds-card-unpack {
  animation: sds-unpack .8s cubic-bezier(.34,1.1,.64,1) both;
  transform-origin: bottom center;
}
/* -- Border Beam & Frame ------------------------------------------ */
/* 123 � Border Beam � orbiting light bead via CSS Motion Path */
@keyframes sds-borderBeamOrbit {
  to { offset-distance: 100%; }
}
.sds-card-border-beam {
  position: relative;
}
.sds-card-border-beam::before {
  content: "";
  position: absolute;
  width: 28%;
  height: 2px;
  background: linear-gradient(90deg, transparent, rgba(255,255,255,.95), transparent);
  border-radius: 2px;
  offset-path: border-box;
  offset-distance: 0%;
  animation: sds-borderBeamOrbit 2s linear infinite;
}
/* 124 � Frame Draw � border ring revealed left to right */
@keyframes sds-frameDrawKf {
  0%   { clip-path: polygon(0% 0%, 0% 0%, 0% 100%, 0% 100%); opacity: .8; }
  100% { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); opacity: 1; }
}
.sds-card-frame-draw {
  position: relative;
}
.sds-card-frame-draw::before {
  content: "";
  position: absolute;
  inset: 1px;
  border: 2px solid rgba(255,255,255,.85);
  border-radius: inherit;
  animation: sds-frameDrawKf .7s cubic-bezier(.4,0,.2,1) both;
  pointer-events: none;
}
/* 125 � Corner Charge � alternating diagonal corner pair flash */
@keyframes sds-cornerChargeKf {
  0%,100% { opacity: 0; filter: brightness(1); }
  30%,70% { opacity: 1; filter: brightness(2.2); }
}
.sds-card-corner-charge {
  position: relative;
}
.sds-card-corner-charge::before {
  content: "";
  position: absolute;
  inset: 0;
  border: 2px solid transparent;
  border-top-color: rgba(255,255,255,.9);
  border-right-color: rgba(255,255,255,.9);
  border-radius: inherit;
  animation: sds-cornerChargeKf 1.4s ease-in-out infinite;
}
.sds-card-corner-charge::after {
  content: "";
  position: absolute;
  inset: 0;
  border: 2px solid transparent;
  border-bottom-color: rgba(255,255,255,.9);
  border-left-color: rgba(255,255,255,.9);
  border-radius: inherit;
  animation: sds-cornerChargeKf 1.4s ease-in-out infinite .7s;
}
/* 126 � Edge Scan � gloss scan line sweeps top then bottom edge */
@keyframes sds-edgeScanKf {
  0%,4%    { transform: translateX(-110%); opacity: 0; }
  8%       { opacity: 1; }
  44%,56%  { transform: translateX(110%); opacity: 0; }
  60%      { transform: translateX(-110%); opacity: 0; }
  64%      { opacity: 1; }
  96%,100% { transform: translateX(110%); opacity: 0; }
}
.sds-card-edge-scan {
  position: relative;
  overflow: hidden;
}
.sds-card-edge-scan::before {
  content: "";
  position: absolute;
  left: 0; top: 0;
  width: 100%; height: 2px;
  background: linear-gradient(90deg, transparent, rgba(255,255,255,.9) 50%, transparent);
  animation: sds-edgeScanKf 3s ease-in-out infinite;
}
.sds-card-edge-scan::after {
  content: "";
  position: absolute;
  left: 0; bottom: 0;
  width: 100%; height: 2px;
  background: linear-gradient(90deg, transparent, rgba(255,255,255,.9) 50%, transparent);
  animation: sds-edgeScanKf 3s ease-in-out infinite 1.5s;
}
/* 127 � Frame Breathe � border ring opacity-blur pulse */
@keyframes sds-frameBreathKf {
  0%,100% { opacity: .15; filter: blur(1px); }
  50%     { opacity: .75; filter: blur(0px); }
}
.sds-card-frame-breathe {
  position: relative;
}
.sds-card-frame-breathe::before {
  content: "";
  position: absolute;
  inset: -1px;
  border: 2px solid rgba(255,255,255,.8);
  border-radius: inherit;
  animation: sds-frameBreathKf 2.4s ease-in-out infinite;
}
/* 128 � Border Tide � twin beads 180� apart tracing the border */
.sds-card-border-tide {
  position: relative;
}
.sds-card-border-tide::before {
  content: "";
  position: absolute;
  width: 26%;
  height: 2px;
  background: linear-gradient(90deg, transparent, rgba(255,255,255,.9), transparent);
  offset-path: border-box;
  offset-distance: 0%;
  animation: sds-borderBeamOrbit 2.2s linear infinite;
}
.sds-card-border-tide::after {
  content: "";
  position: absolute;
  width: 26%;
  height: 2px;
  background: linear-gradient(90deg, transparent, rgba(180,200,255,.85), transparent);
  offset-path: border-box;
  offset-distance: 50%;
  animation: sds-borderBeamOrbit 2.2s linear infinite;
}
/* ====================================================================
   BATCH 10 � Cards: Glass & Refraction (6) + Stack & Shuffle (6)
   ==================================================================== */
/* -- Glass & Refraction -------------------------------------------- */
/* 129 � Glass Frost � blur + brightness frost breath loop */
@keyframes sds-glassFrost {
  0%,100% { filter: blur(0px) brightness(1) saturate(1); opacity: 1; }
  35%     { filter: blur(5px) brightness(1.1) saturate(.75); opacity: .82; }
  65%     { filter: blur(5px) brightness(1.1) saturate(.75); opacity: .82; }
}
.sds-card-glass-frost {
  animation: sds-glassFrost 3.5s ease-in-out infinite;
}
/* 130 � Lens Bulge � scale + perspective pulse (lens-like magnification) */
@keyframes sds-lensBulge {
  0%,100% { transform: perspective(400px) scale(1) rotateX(0deg); filter: brightness(1); }
  50%     { transform: perspective(300px) scale(1.04) rotateX(-1deg); filter: brightness(1.1); }
}
.sds-card-lens-bulge {
  animation: sds-lensBulge 3s ease-in-out infinite;
}
/* 131 � Hue Shift � full hue-rotate sweep through spectrum */
@keyframes sds-hueShift {
  0%   { filter: hue-rotate(0deg) brightness(1); }
  50%  { filter: hue-rotate(180deg) brightness(1.08); }
  100% { filter: hue-rotate(360deg) brightness(1); }
}
.sds-card-hue-shift {
  animation: sds-hueShift 4s linear infinite;
}
/* 132 � Refract Slide � diagonal caustic-light beam passes over card */
@keyframes sds-refractSlide {
  0%   { transform: translate(-120%, -120%); opacity: 0; }
  12%  { opacity: .55; }
  50%  { transform: translate(10%, 10%); opacity: .35; }
  88%  { opacity: .55; }
  100% { transform: translate(120%, 120%); opacity: 0; }
}
.sds-card-refract-slide {
  position: relative;
  overflow: hidden;
}
.sds-card-refract-slide::before {
  content: "";
  position: absolute;
  inset: -30%;
  background: linear-gradient(135deg, transparent 35%, rgba(255,255,255,.4) 50%, transparent 65%);
  filter: blur(3px);
  animation: sds-refractSlide 4s ease-in-out infinite;
}
/* 133 � Crystal Pulse � brightness + contrast + scale energy pulse */
@keyframes sds-crystalPulse {
  0%,100% { transform: scale(1);    filter: brightness(1) contrast(1); }
  45%     { transform: scale(1.025); filter: brightness(1.28) contrast(1.06); }
}
.sds-card-crystal-pulse {
  animation: sds-crystalPulse 2.2s ease-in-out infinite;
}
/* 134 � Glass Wipe � frosted-glass strip sweeps across card */
@keyframes sds-glassWipe {
  0%   { transform: translateX(-140%) skewX(-12deg); opacity: 0; }
  12%  { opacity: 1; }
  88%  { opacity: 1; }
  100% { transform: translateX(140%) skewX(-12deg); opacity: 0; }
}
.sds-card-glass-wipe {
  position: relative;
  overflow: hidden;
}
.sds-card-glass-wipe::before {
  content: "";
  position: absolute;
  inset: 0;
  width: 38%;
  background: rgba(255,255,255,.22);
  filter: blur(6px);
  animation: sds-glassWipe 3s ease-in-out infinite;
}
/* -- Stack & Shuffle ----------------------------------------------- */
/* 135 � Stack Pop � card lifts from stack with growing drop-shadow */
@keyframes sds-stackPop {
  0%,100% { transform: translateY(0) scale(1);    filter: drop-shadow(0 2px 4px rgba(0,0,0,.15)); }
  40%     { transform: translateY(-16px) scale(1.04); filter: drop-shadow(0 12px 20px rgba(0,0,0,.3)); }
  70%     { transform: translateY(-12px) scale(1.03); filter: drop-shadow(0 10px 16px rgba(0,0,0,.25)); }
}
.sds-card-stack-pop {
  animation: sds-stackPop 2.2s cubic-bezier(.34,1.2,.64,1) infinite;
}
/* 136 � Shuffle Deal � dealt from upper-left with translate + rotate */
@keyframes sds-shuffleDeal {
  0%   { transform: translate(-60px, -18px) rotate(-14deg) scale(.86); opacity: 0; filter: blur(2px); }
  55%  { transform: translate(4px, 2px) rotate(1deg) scale(1.02); opacity: 1; filter: blur(0px); }
  75%  { transform: translate(-2px, -1px) rotate(-.5deg) scale(.99); }
  100% { transform: translate(0, 0) rotate(0deg) scale(1); opacity: 1; filter: blur(0px); }
}
.sds-card-shuffle-deal {
  animation: sds-shuffleDeal .72s cubic-bezier(.34,1.1,.64,1) both;
}
/* 137 � Deck Peek � two ghost cards peek from behind with stagger */
@keyframes sds-deckPeekB {
  0%,100% { transform: translate(-5px, 5px) rotate(-2deg); opacity: .55; }
  50%     { transform: translate(-10px, 10px) rotate(-4deg); opacity: .75; }
}
@keyframes sds-deckPeekA {
  0%,100% { transform: translate(-10px, 10px) rotate(-4deg); opacity: .35; }
  50%     { transform: translate(-18px, 18px) rotate(-7deg); opacity: .55; }
}
.sds-card-deck-peek {
  position: relative;
  overflow: visible;
}
.sds-card-deck-peek::before {
  content: "";
  position: absolute;
  inset: 0;
  background: rgba(180, 190, 230, .82);
  border-radius: inherit;
  z-index: -1;
  animation: sds-deckPeekB 2.5s ease-in-out infinite;
}
.sds-card-deck-peek::after {
  content: "";
  position: absolute;
  inset: 0;
  background: rgba(160, 172, 220, .65);
  border-radius: inherit;
  z-index: -2;
  animation: sds-deckPeekA 2.5s ease-in-out infinite .15s;
}
/* 138 � Deck Cycle � perspective yaw cycle like advancing a deck */
@keyframes sds-deckCycle {
  0%,15%  { transform: perspective(700px) rotateY(0deg) translateX(0); }
  35%,55% { transform: perspective(700px) rotateY(22deg) translateX(8px); }
  70%     { transform: perspective(700px) rotateY(-4deg) translateX(-2px); }
  85%,100% { transform: perspective(700px) rotateY(0deg) translateX(0); }
}
.sds-card-deck-cycle {
  animation: sds-deckCycle 2.8s ease-in-out infinite;
}
/* 139 � Stack Drop � entrance: card drops onto stack from above */
@keyframes sds-stackDrop {
  0%   { transform: translateY(-38px) scale(1.08); opacity: 0; filter: blur(3px); }
  52%  { transform: translateY(4px) scale(.98);   opacity: 1; filter: blur(0px); }
  70%  { transform: translateY(-2px) scale(1.01); }
  85%  { transform: translateY(1px) scale(.998); }
  100% { transform: translateY(0) scale(1);       opacity: 1; filter: blur(0px); }
}
.sds-card-stack-drop {
  animation: sds-stackDrop .65s cubic-bezier(.34,1.15,.64,1) both;
}
/* 140 � Deal Arc � entrance: arc-sweep from upper-left like dealing */
@keyframes sds-dealArc {
  0%   { transform: translate(-72px, -12px) rotate(-18deg) scale(.82); opacity: 0; }
  55%  { transform: translate(5px, -3px) rotate(1.5deg) scale(1.02); opacity: 1; }
  75%  { transform: translate(-2px, 1px) rotate(-.4deg) scale(.99); }
  100% { transform: translate(0, 0) rotate(0deg) scale(1); opacity: 1; }
}
.sds-card-deal-arc {
  animation: sds-dealArc .7s cubic-bezier(.2,.6,.3,1) both;
}
/* ====================================================================
   BATCH 11 � Cards: Entrance Physics (7) + Ambient Loops (6)
   Cards category complete: 100 effects
   ==================================================================== */
/* -- Entrance Physics ---------------------------------------------- */
/* 141 � Bounce In � spring-bounce entrance from below */
@keyframes sds-bounceIn {
  0%   { transform: translateY(50px) scale(.9); opacity: 0; }
  45%  { transform: translateY(-12px) scale(1.04); opacity: 1; }
  65%  { transform: translateY(5px) scale(.98); }
  80%  { transform: translateY(-4px) scale(1.01); }
  92%  { transform: translateY(2px) scale(1); }
  100% { transform: translateY(0) scale(1); opacity: 1; }
}
.sds-card-bounce-in {
  animation: sds-bounceIn .75s cubic-bezier(.2,0,.2,1) both;
}
/* 142 � Elastic Drop � oscillating drop from above, 3-cycle settle */
@keyframes sds-elasticDrop {
  0%   { transform: translateY(-55px) scaleY(.85); opacity: 0; filter: blur(2px); }
  30%  { transform: translateY(8px) scaleY(1.06); opacity: 1; filter: blur(0px); }
  48%  { transform: translateY(-5px) scaleY(.97); }
  62%  { transform: translateY(3px) scaleY(1.02); }
  74%  { transform: translateY(-2px) scaleY(.99); }
  84%  { transform: translateY(1px) scaleY(1.005); }
  100% { transform: translateY(0) scaleY(1); opacity: 1; filter: blur(0px); }
}
.sds-card-elastic-drop {
  animation: sds-elasticDrop .9s cubic-bezier(.34,1.4,.64,1) both;
}
/* 143 � Slingshot � diagonal launch from lower-left with decel arc */
@keyframes sds-slingshot {
  0%   { transform: translate(-80px, 30px) rotate(-8deg) scale(.8); opacity: 0; }
  40%  { transform: translate(10px, -6px) rotate(2deg) scale(1.03); opacity: 1; }
  60%  { transform: translate(-4px, 2px) rotate(-1deg) scale(.99); }
  80%  { transform: translate(2px, -1px) rotate(.4deg) scale(1.005); }
  100% { transform: translate(0, 0) rotate(0deg) scale(1); opacity: 1; }
}
.sds-card-slingshot {
  animation: sds-slingshot .65s cubic-bezier(.2,.6,.3,1) both;
}
/* 144 � Rubber Band � squeeze-stretch XY oscillation settle */
@keyframes sds-cardRubberBand {
  0%   { transform: scale(.6, .6); opacity: 0; }
  22%  { transform: scale(1.2, .82); opacity: 1; }
  40%  { transform: scale(.88, 1.14); }
  55%  { transform: scale(1.07, .95); }
  68%  { transform: scale(.97, 1.03); }
  80%  { transform: scale(1.02, .99); }
  100% { transform: scale(1, 1); opacity: 1; }
}
.sds-card-rubber-band {
  animation: sds-cardRubberBand .78s cubic-bezier(.34,1.3,.64,1) both;
}
/* 145 � Free Fall � gravity-curve accelerating entrance from above */
@keyframes sds-freeFall {
  0%   { transform: translateY(-64px) scale(.92); opacity: 0; filter: blur(2px); }
  55%  { transform: translateY(4px) scale(1.01); opacity: 1; filter: blur(0px); }
  72%  { transform: translateY(-2px) scale(1); }
  100% { transform: translateY(0) scale(1); opacity: 1; filter: blur(0px); }
}
.sds-card-free-fall {
  animation: sds-freeFall .68s cubic-bezier(.4,0,.2,1) both;
}
/* 146 � Pinball � ricochets with direction changes before settling */
@keyframes sds-pinball {
  0%   { transform: translate(-60px, -38px) rotate(-12deg); opacity: 0; }
  20%  { transform: translate(12px, 18px) rotate(6deg); opacity: 1; }
  38%  { transform: translate(-8px, -10px) rotate(-3deg); }
  54%  { transform: translate(4px, 5px) rotate(1.5deg); }
  70%  { transform: translate(-2px, -2px) rotate(-.5deg); }
  84%  { transform: translate(1px, 1px) rotate(.2deg); }
  100% { transform: translate(0, 0) rotate(0deg); opacity: 1; }
}
.sds-card-pinball {
  animation: sds-pinball .88s cubic-bezier(.2,.6,.3,1) both;
}
/* 147 � Snap Back � overshoots left then snaps to rest with rotate */
@keyframes sds-snapBack {
  0%   { transform: translateX(-50px) rotate(-10deg) scale(.9); opacity: 0; }
  30%  { transform: translateX(18px) rotate(5deg) scale(1.04); opacity: 1; }
  50%  { transform: translateX(-6px) rotate(-1.5deg) scale(.98); }
  68%  { transform: translateX(3px) rotate(.5deg) scale(1.01); }
  84%  { transform: translateX(-1px) rotate(-.2deg) scale(1); }
  100% { transform: translateX(0) rotate(0deg) scale(1); opacity: 1; }
}
.sds-card-snap-back {
  animation: sds-snapBack .72s cubic-bezier(.34,1.25,.64,1) both;
}
/* -- Ambient Loops ------------------------------------------------- */
/* 148 � Idle Breathe � micro scale pulse (barely perceptible) */
@keyframes sds-idleBreathe {
  0%,100% { transform: scale(1); }
  50%     { transform: scale(1.018); }
}
.sds-card-idle-breathe {
  animation: sds-idleBreathe 3s ease-in-out infinite;
}
/* 149 � Idle Sway � slow side-to-side lateral sway */
@keyframes sds-idleSway {
  0%,100% { transform: translateX(0px); }
  35%     { transform: translateX(-6px); }
  65%     { transform: translateX(6px); }
}
.sds-card-idle-sway {
  animation: sds-idleSway 4s ease-in-out infinite;
}
/* 150 � Idle Bob � gentle vertical float */
@keyframes sds-idleBob {
  0%,100% { transform: translateY(0px); }
  50%     { transform: translateY(-8px); }
}
.sds-card-idle-bob {
  animation: sds-idleBob 2.5s ease-in-out infinite;
}
/* 151 � Idle Pulse � opacity + scale attention loop */
@keyframes sds-idlePulse {
  0%,100% { transform: scale(1);     opacity: 1; }
  45%,55% { transform: scale(1.025); opacity: .82; }
}
.sds-card-idle-pulse {
  animation: sds-idlePulse 2s ease-in-out infinite;
}
/* 152 � Idle Glow � drop-shadow glow breathe */
@keyframes sds-idleGlow {
  0%,100% { filter: drop-shadow(0 0 0px rgba(100,120,255,.0)); }
  50%     { filter: drop-shadow(0 0 18px rgba(100,120,255,.55)); }
}
.sds-card-idle-glow {
  animation: sds-idleGlow 2.8s ease-in-out infinite;
}
/* 153 � Idle Rock � rotation rock left-right */
@keyframes sds-idleRock {
  0%,100% { transform: rotate(0deg); }
  25%     { transform: rotate(-2deg); }
  75%     { transform: rotate(2deg); }
}
.sds-card-idle-rock {
  animation: sds-idleRock 3.5s ease-in-out infinite;
}
/*!
 * SDS Motion Forge — loaders.css
 * Loader animations (Section 5).
 * Part of the lossless v5 category split — combined entry: src/motion.css
 */
/* ============================================================
   SECTION 5 — LOADER ANIMATIONS
   Namespace: .sds-loader-*
   ============================================================ */
/* 67 · Orbital System -------------------------------------- */
.sds-loader-orbital {
  position: relative;
  width: 48px;
  height: 48px;
}
.sds-loader-orbital::before,
.sds-loader-orbital::after {
  content: "";
  position: absolute;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--sds-primary);
  top: 50%;
  left: 50%;
  margin: -4px 0 0 -4px;
}
.sds-loader-orbital::before {
  animation: sds-orbitalA 1.2s linear infinite;
}
.sds-loader-orbital::after {
  animation: sds-orbitalB 1.8s linear infinite;
}
@keyframes sds-orbitalA {
  from {
    transform: rotate(0deg) translateX(18px) rotate(0deg);
  }
  to {
    transform: rotate(360deg) translateX(18px) rotate(-360deg);
  }
}
@keyframes sds-orbitalB {
  from {
    transform: rotate(120deg) translateX(26px) rotate(-120deg);
  }
  to {
    transform: rotate(480deg) translateX(26px) rotate(-480deg);
  }
}
/* 68 · Fluid Flow ------------------------------------------ */
.sds-loader-fluid {
  width: 36px;
  height: 36px;
  background: var(--sds-primary);
  animation: sds-fluidFlow 2s ease infinite;
}
@keyframes sds-fluidFlow {
  0% {
    border-radius: 50%;
    transform: scale(1) rotate(0);
  }
  25% {
    border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%;
    transform: scale(1.15) rotate(45deg);
  }
  50% {
    border-radius: 50%;
    transform: scale(0.9) rotate(90deg);
  }
  75% {
    border-radius: 70% 30% 30% 70% / 70% 70% 30% 30%;
    transform: scale(1.1) rotate(135deg);
  }
  100% {
    border-radius: 50%;
    transform: scale(1) rotate(180deg);
  }
}
/* 69 · Particle Sync --------------------------------------- */
.sds-loader-dots {
  display: inline-flex;
  gap: 6px;
}
.sds-loader-dots > * {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--sds-primary);
  animation: sds-particleSync 1s ease infinite;
}
.sds-loader-dots > *:nth-child(2) {
  animation-delay: 0.2s;
}
.sds-loader-dots > *:nth-child(3) {
  animation-delay: 0.4s;
}
@keyframes sds-particleSync {
  0%,
  100% {
    transform: scale(1);
    opacity: 0.8;
  }
  50% {
    transform: scale(0);
    opacity: 0;
  }
}
/* 70 · Comet Trail ----------------------------------------- */
.sds-loader-comet {
  position: relative;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  border: 2px solid var(--sds-primary-dim);
}
.sds-loader-comet::before {
  content: "";
  position: absolute;
  top: -2px;
  left: -2px;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  border: 2px solid transparent;
  border-top-color: var(--sds-primary);
  animation: sds-cometSpin 1s linear infinite;
}
@keyframes sds-cometSpin {
  to {
    transform: rotate(360deg);
  }
}
/* 71 · Waveform -------------------------------------------- */
.sds-loader-wave {
  display: inline-flex;
  gap: 3px;
  align-items: center;
  height: 32px;
}
.sds-loader-wave > * {
  width: 4px;
  border-radius: 2px;
  background: var(--sds-primary);
  animation: sds-waveBar 0.9s ease infinite;
}
.sds-loader-wave > *:nth-child(1) {
  animation-delay: 0s;
  height: 60%;
}
.sds-loader-wave > *:nth-child(2) {
  animation-delay: 0.15s;
  height: 90%;
}
.sds-loader-wave > *:nth-child(3) {
  animation-delay: 0.3s;
  height: 50%;
}
.sds-loader-wave > *:nth-child(4) {
  animation-delay: 0.1s;
  height: 80%;
}
.sds-loader-wave > *:nth-child(5) {
  animation-delay: 0.25s;
  height: 65%;
}
@keyframes sds-waveBar {
  0%,
  100% {
    transform: scaleY(0.2);
  }
  50% {
    transform: scaleY(1);
  }
}
/* 72 · Ping Cascade ---------------------------------------- */
.sds-loader-ping {
  position: relative;
  width: 16px;
  height: 16px;
}
/* Pseudo-elements get content:''; real <span> does not need it */
.sds-loader-ping::before,
.sds-loader-ping::after {
  content: "";
}
.sds-loader-ping::before,
.sds-loader-ping::after,
.sds-loader-ping > span {
  position: absolute;
  inset: 0;
  border-radius: 50%;
  border: 1.5px solid var(--sds-primary);
  animation: sds-pingCascade 2s ease infinite;
}
.sds-loader-ping::after {
  animation-delay: 0.6s;
}
.sds-loader-ping > span {
  animation-delay: 1.2s;
}
@keyframes sds-pingCascade {
  0% {
    transform: scale(0.5);
    opacity: 1;
  }
  100% {
    transform: scale(3);
    opacity: 0;
  }
}
/* 73 · Progress Glow --------------------------------------- */
/*   Uses transform:scaleX to avoid width-animation reflow    */
.sds-loader-progress {
  width: 100%;
  height: 4px;
  background: var(--sds-primary-dim);
  border-radius: 99px;
  overflow: hidden;
  position: relative;
}
.sds-loader-progress::after {
  content: "";
  display: block;
  height: 100%;
  width: 100%;
  background: var(--sds-primary);
  border-radius: 99px;
  transform-origin: left center;
  animation: sds-progressGlow 2s ease infinite;
}
@keyframes sds-progressGlow {
  0% {
    transform: scaleX(0);
    box-shadow: none;
  }
  50% {
    box-shadow:
      0 0 12px var(--sds-primary-glow),
      4px 0 16px var(--sds-primary-glow);
  }
  85% {
    transform: scaleX(1);
    box-shadow: 0 0 8px var(--sds-primary-glow);
  }
  100% {
    transform: scaleX(1);
    box-shadow: 0 0 8px var(--sds-primary-glow);
  }
}
/* 74 · Skeleton Pulse -------------------------------------- */
.sds-loader-skeleton {
  background: linear-gradient(
    90deg,
    var(--sds-primary-dim) 25%,
    rgba(0, 21, 209, 0.04) 50%,
    var(--sds-primary-dim) 75%
  );
  background-size: 400% 100%;
  animation: sds-skeletonPulse 1.6s ease infinite;
  border-radius: 4px;
}
@keyframes sds-skeletonPulse {
  0% {
    background-position: -300% 0;
  }
  100% {
    background-position: 300% 0;
  }
}
/* 75 · Vortex Spin ----------------------------------------- */
.sds-loader-vortex {
  width: 36px;
  height: 36px;
  border-radius: 50%;
  background: conic-gradient(
    var(--sds-primary),
    var(--sds-accent),
    var(--sds-primary)
  );
  animation: sds-vortexSpin 1.6s ease infinite;
}
@keyframes sds-vortexSpin {
  from {
    transform: rotate(0deg) scale(1);
  }
  50% {
    transform: rotate(180deg) scale(0.7);
  }
  to {
    transform: rotate(360deg) scale(1);
  }
}
/* 76 · Typewriter Loader ----------------------------------- */
.sds-loader-type {
  font-family: monospace;
  border-right: 2px solid var(--sds-primary);
  overflow: hidden;
  white-space: nowrap;
  animation:
    sds-typewriterPrem 2s steps(10) infinite alternate,
    sds-cursorBlink var(--sds-duration-base, 0.8s) step-end infinite;
}
/* 77 · Target Lock ----------------------------------------- */
.sds-loader-target {
  position: relative;
  width: 40px;
  height: 40px;
}
.sds-loader-target::before {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: 50%;
  border: 1px dashed rgba(0, 21, 209, 0.3);
  animation: sds-cometSpin 4s linear infinite;
}
/* 78 · DNA Helix ------------------------------------------- */
.sds-loader-dna {
  position: relative;
  width: 10px;
  height: 48px;
}
.sds-loader-dna::before,
.sds-loader-dna::after {
  content: "";
  position: absolute;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  left: 0;
  animation: sds-loaderDna var(--sds-duration-slow, 1.4s) ease-in-out infinite;
}
.sds-loader-dna::before {
  background: var(--sds-primary);
}
.sds-loader-dna::after {
  background: var(--sds-accent);
  animation-delay: 0.7s;
}
@keyframes sds-loaderDna {
  0%,
  100% {
    top: 0;
    transform: scaleX(1);
    opacity: 1;
  }
  25% {
    transform: scaleX(0.4);
    opacity: 0.4;
  }
  50% {
    top: 38px;
    transform: scaleX(1);
    opacity: 1;
  }
  75% {
    transform: scaleX(0.4);
    opacity: 0.4;
  }
}
/* 79 · Pulse ------------------------------------------- */
.sds-loader-pulse {
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: var(--sds-primary);
  animation: sds-loaderPulse 1s ease-in-out infinite;
}
@keyframes sds-loaderPulse {
  0%,
  100% {
    transform: scale(1);
    opacity: 1;
  }
  50% {
    transform: scale(1.5);
    opacity: 0.4;
  }
}
/* 80 · Arc -------------------------------------------- */
.sds-loader-arc {
  position: relative;
  width: 44px;
  height: 44px;
}
.sds-loader-arc::before,
.sds-loader-arc::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: 50%;
  border: 3px solid transparent;
}
.sds-loader-arc::before {
  border-top-color: var(--sds-primary);
  border-right-color: var(--sds-primary);
  animation: sds-cometSpin 0.9s linear infinite;
}
.sds-loader-arc::after {
  border-bottom-color: var(--sds-accent);
  border-left-color: var(--sds-accent);
  animation: sds-cometSpin var(--sds-duration-slow, 1.4s) linear infinite reverse;
  inset: 6px;
}
/* 81 · Signal Bars ------------------------------------- */
.sds-loader-signal {
  display: inline-flex;
  align-items: flex-end;
  gap: 4px;
  height: 36px;
}
.sds-loader-signal > * {
  width: 7px;
  border-radius: 3px 3px 0 0;
  background: var(--sds-primary);
  animation: sds-loaderSignal 1.2s ease-in-out infinite;
}
.sds-loader-signal > *:nth-child(1) {
  height: 35%;
  animation-delay: 0s;
}
.sds-loader-signal > *:nth-child(2) {
  height: 60%;
  animation-delay: 0.15s;
}
.sds-loader-signal > *:nth-child(3) {
  height: 85%;
  animation-delay: 0.3s;
}
.sds-loader-signal > *:nth-child(4) {
  height: 100%;
  animation-delay: 0.45s;
}
@keyframes sds-loaderSignal {
  0%,
  100% {
    opacity: 1;
  }
  50% {
    opacity: 0.2;
  }
}
/* 82 · Bounce ----------------------------------------- */
.sds-loader-bounce {
  width: 24px;
  height: 24px;
  border-radius: 50%;
  background: var(--sds-primary);
  animation: sds-loaderBounce var(--sds-duration-base, 0.8s) var(--sds-ease-emphasized, cubic-bezier(0.215, 0.61, 0.355, 1)) infinite;
}
@keyframes sds-loaderBounce {
  0%,
  100% {
    transform: translateY(0) scaleY(1) scaleX(1);
  }
  20% {
    transform: translateY(-22px) scaleY(1.08) scaleX(0.94);
  }
  80% {
    transform: translateY(0) scaleY(0.72) scaleX(1.28);
  }
  90% {
    transform: translateY(0) scaleY(1.04) scaleX(0.97);
  }
}
/* 83 · Radar ------------------------------------------ */
.sds-loader-radar {
  position: relative;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  border: 1px solid rgba(0, 21, 209, 0.2);
  overflow: hidden;
}
.sds-loader-radar::before {
  content: "";
  position: absolute;
  width: 50%;
  height: 2px;
  background: linear-gradient(90deg, transparent, var(--sds-primary));
  top: 50%;
  left: 50%;
  transform-origin: left center;
  animation: sds-cometSpin 2s linear infinite;
}
.sds-loader-radar::after {
  content: "";
  position: absolute;
  inset: 30%;
  border-radius: 50%;
  background: var(--sds-primary);
}
/* 84 · Morph ------------------------------------------ */
.sds-loader-morph {
  width: 36px;
  height: 36px;
  background: linear-gradient(135deg, var(--sds-primary), var(--sds-accent));
  animation: sds-loaderMorph var(--sds-duration-slower, 2.2s) ease-in-out infinite;
}
@keyframes sds-loaderMorph {
  0%,
  100% {
    border-radius: 50%;
    transform: rotate(0deg) scale(1);
  }
  25% {
    border-radius: 20% 80% 80% 20% / 20% 20% 80% 80%;
    transform: rotate(90deg) scale(1.1);
  }
  50% {
    border-radius: 50% 50% 50% 50% / 80% 80% 20% 20%;
    transform: rotate(180deg) scale(0.9);
  }
  75% {
    border-radius: 80% 20% 20% 80% / 80% 20% 80% 20%;
    transform: rotate(270deg) scale(1.05);
  }
}
/* 85 · Cascade Bars ------------------------------------ */
.sds-loader-cascade {
  display: inline-flex;
  align-items: flex-end;
  gap: 4px;
  height: 36px;
}
.sds-loader-cascade > * {
  width: 6px;
  border-radius: 3px;
  background: var(--sds-primary);
  animation: sds-loaderCascade 1s ease infinite;
}
.sds-loader-cascade > *:nth-child(1) {
  animation-delay: 0s;
}
.sds-loader-cascade > *:nth-child(2) {
  animation-delay: 0.1s;
}
.sds-loader-cascade > *:nth-child(3) {
  animation-delay: 0.2s;
}
.sds-loader-cascade > *:nth-child(4) {
  animation-delay: 0.3s;
}
.sds-loader-cascade > *:nth-child(5) {
  animation-delay: 0.4s;
}
@keyframes sds-loaderCascade {
  0%,
  100% {
    height: 8px;
    opacity: 0.4;
  }
  50% {
    height: 36px;
    opacity: 1;
  }
}
/* 86 · Dot Grid --------------------------------------- */
.sds-loader-grid {
  display: grid;
  grid-template-columns: repeat(3, 10px);
  gap: 5px;
}
.sds-loader-grid > * {
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: var(--sds-primary);
  animation: sds-loaderGrid 1.6s ease-in-out infinite;
}
.sds-loader-grid > *:nth-child(1) {
  animation-delay: 0s;
}
.sds-loader-grid > *:nth-child(2) {
  animation-delay: 0.1s;
}
.sds-loader-grid > *:nth-child(3) {
  animation-delay: 0.2s;
}
.sds-loader-grid > *:nth-child(4) {
  animation-delay: 0.3s;
}
.sds-loader-grid > *:nth-child(5) {
  animation-delay: 0.4s;
}
.sds-loader-grid > *:nth-child(6) {
  animation-delay: 0.5s;
}
.sds-loader-grid > *:nth-child(7) {
  animation-delay: 0.6s;
}
.sds-loader-grid > *:nth-child(8) {
  animation-delay: 0.7s;
}
.sds-loader-grid > *:nth-child(9) {
  animation-delay: 0.8s;
}
@keyframes sds-loaderGrid {
  0%,
  100% {
    transform: scale(1);
    opacity: 0.8;
  }
  50% {
    transform: scale(0.2);
    opacity: 0.1;
  }
}
/* 87 · Ring System ------------------------------------ */
.sds-loader-ring {
  position: relative;
  width: 44px;
  height: 44px;
}
.sds-loader-ring::before,
.sds-loader-ring::after {
  content: "";
  position: absolute;
  border-radius: 50%;
  border: 2px solid transparent;
}
.sds-loader-ring::before {
  inset: 0;
  border-top-color: var(--sds-primary);
  animation: sds-cometSpin 1s linear infinite;
}
.sds-loader-ring::after {
  inset: 8px;
  border-bottom-color: var(--sds-accent);
  animation: sds-cometSpin 1.6s linear infinite reverse;
}
/* 88 · Ripple Rings ----------------------------------- */
.sds-loader-ripple {
  position: relative;
  width: 44px;
  height: 44px;
}
.sds-loader-ripple::before,
.sds-loader-ripple::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: 50%;
  border: 2px solid var(--sds-primary);
  animation: sds-loaderRipple 2s ease-out infinite;
}
.sds-loader-ripple::after {
  animation-delay: 0.8s;
}
@keyframes sds-loaderRipple {
  0% {
    transform: scale(0.2);
    opacity: 1;
  }
  100% {
    transform: scale(2);
    opacity: 0;
  }
}
/* 89 · Neon Ring -------------------------------------- */
.sds-loader-neon-ring {
  width: 44px;
  height: 44px;
  border-radius: 50%;
  border: 2px solid transparent;
  border-top-color: var(--sds-primary);
  animation:
    sds-cometSpin 1s linear infinite,
    sds-loaderNeonRing 2s ease-in-out infinite;
}
@keyframes sds-loaderNeonRing {
  0%,
  100% {
    box-shadow:
      0 0 8px var(--sds-primary-glow),
      inset 0 0 8px var(--sds-primary-dim);
  }
  50% {
    box-shadow:
      0 0 20px var(--sds-primary-glow),
      inset 0 0 16px var(--sds-primary-dim);
  }
}
/* 90 · Triple Orbit ----------------------------------- */
.sds-loader-orbit-3 {
  position: relative;
  width: 44px;
  height: 44px;
}
.sds-loader-orbit-3::before,
.sds-loader-orbit-3::after {
  content: "";
  position: absolute;
  width: 7px;
  height: 7px;
  border-radius: 50%;
  top: 50%;
  left: 50%;
  margin: -3.5px 0 0 -3.5px;
}
.sds-loader-orbit-3::before {
  background: var(--sds-primary);
  animation: sds-orbitalA 1s linear infinite;
}
.sds-loader-orbit-3::after {
  background: var(--sds-accent);
  animation: sds-orbitalB var(--sds-duration-slow, 1.4s) linear infinite;
}
/* 91 · Electric Arc ----------------------------------- */
.sds-loader-electric {
  position: relative;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  border: 2px solid rgba(0, 21, 209, 0.15);
  animation: sds-loaderElectric 1.5s ease infinite;
}
@keyframes sds-loaderElectric {
  0%,
  100% {
    box-shadow: 0 0 0 rgba(0, 21, 209, 0);
    border-color: rgba(0, 21, 209, 0.15);
  }
  10% {
    box-shadow: 0 0 12px var(--sds-primary-glow);
    border-color: var(--sds-primary);
  }
  12% {
    box-shadow: 0 0 2px rgba(0, 21, 209, 0.1);
    border-color: rgba(0, 21, 209, 0.15);
  }
  30% {
    box-shadow: 0 0 8px var(--sds-primary-glow);
    border-color: rgba(0, 21, 209, 0.5);
  }
  32% {
    box-shadow: none;
    border-color: rgba(0, 21, 209, 0.15);
  }
}
/* 92 · Expand ----------------------------------------- */
.sds-loader-expand {
  width: 12px;
  height: 12px;
  background: var(--sds-primary);
  animation: sds-loaderExpand 1.6s ease-in-out infinite;
}
@keyframes sds-loaderExpand {
  0%,
  100% {
    transform: scale(1);
    border-radius: 4px;
  }
  50% {
    transform: scale(2.5);
    border-radius: 50%;
    opacity: 0.5;
  }
}
/* 93 · Prism ------------------------------------------ */
.sds-loader-prism {
  width: 36px;
  height: 36px;
  background: conic-gradient(
    var(--sds-primary),
    #8b5cf6,
    var(--sds-accent),
    #06b6d4,
    #10b981,
    var(--sds-primary)
  );
  border-radius: 50%;
  animation: sds-cometSpin 2s linear infinite;
}
/* 94 · Neural ----------------------------------------- */
.sds-loader-neural {
  position: relative;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  border: 1.5px solid rgba(0, 21, 209, 0.2);
  animation: sds-loaderNeural var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-loaderNeural {
  0%,
  100% {
    box-shadow:
      0 0 0 0 rgba(0, 21, 209, 0.15),
      0 0 0 0 rgba(0, 21, 209, 0.05);
  }
  33% {
    box-shadow:
      0 0 0 6px rgba(0, 21, 209, 0.1),
      0 0 0 12px rgba(0, 21, 209, 0.03);
  }
  66% {
    box-shadow:
      0 0 0 10px rgba(0, 21, 209, 0.06),
      0 0 0 20px rgba(0, 21, 209, 0.02);
  }
}
/* 95 · Breath ----------------------------------------- */
.sds-loader-breath {
  width: 36px;
  height: 36px;
  border-radius: 50%;
  background: var(--sds-primary);
  animation: sds-loaderBreath 2s ease-in-out infinite;
}
@keyframes sds-loaderBreath {
  0%,
  100% {
    transform: scale(0.7);
    opacity: 0.5;
  }
  50% {
    transform: scale(1.1);
    opacity: 1;
  }
}
/* 96 · Pendulum --------------------------------------- */
.sds-loader-pendulum {
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: var(--sds-primary);
  animation: sds-loaderPendulum 1.2s ease-in-out infinite;
  transform-origin: center -18px;
}
@keyframes sds-loaderPendulum {
  0%,
  100% {
    transform: rotate(-28deg);
  }
  50% {
    transform: rotate(28deg);
  }
}
/* 97 · Cube ------------------------------------------- */
.sds-loader-cube {
  width: 28px;
  height: 28px;
  background: var(--sds-primary);
  animation: sds-loaderCube 2s ease-in-out infinite;
}
@keyframes sds-loaderCube {
  0% {
    transform: perspective(200px) rotateX(0deg) rotateY(0deg);
    border-radius: 4px;
  }
  25% {
    transform: perspective(200px) rotateX(90deg) rotateY(0deg);
    border-radius: 50%;
  }
  50% {
    transform: perspective(200px) rotateX(90deg) rotateY(90deg);
    border-radius: 4px;
  }
  75% {
    transform: perspective(200px) rotateX(0deg) rotateY(90deg);
    border-radius: 50%;
  }
  100% {
    transform: perspective(200px) rotateX(0deg) rotateY(180deg);
    border-radius: 4px;
  }
}
/* 98 · Solar ------------------------------------------ */
.sds-loader-solar {
  position: relative;
  width: 44px;
  height: 44px;
}
.sds-loader-solar::before {
  content: "";
  position: absolute;
  inset: 12px;
  border-radius: 50%;
  background: var(--sds-primary);
  animation: sds-loaderSolar 2s ease-in-out infinite;
}
.sds-loader-solar::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: 50%;
  border: 1.5px dashed rgba(0, 21, 209, 0.4);
  animation: sds-cometSpin var(--sds-duration-dramatic, 3s) linear infinite;
}
@keyframes sds-loaderSolar {
  0%,
  100% {
    box-shadow: 0 0 8px var(--sds-primary-glow);
    transform: scale(1);
  }
  50% {
    box-shadow:
      0 0 20px var(--sds-primary-glow),
      0 0 40px rgba(0, 21, 209, 0.1);
    transform: scale(1.15);
  }
}
/* 99 · Infinity --------------------------------------- */
.sds-loader-infinity {
  position: relative;
  width: 56px;
  height: 28px;
}
.sds-loader-infinity::before,
.sds-loader-infinity::after {
  content: "";
  position: absolute;
  width: 20px;
  height: 20px;
  border-radius: 50%;
  border: 2.5px solid var(--sds-primary);
  top: 50%;
  margin-top: -10px;
}
.sds-loader-infinity::before {
  left: 0;
  animation: sds-cometSpin 1.2s linear infinite;
  border-top-color: transparent;
}
.sds-loader-infinity::after {
  right: 0;
  animation: sds-cometSpin 1.2s linear infinite reverse;
  border-bottom-color: transparent;
}
/* 100 · Star ------------------------------------------ */
.sds-loader-star {
  width: 36px;
  height: 36px;
  background: var(--sds-primary);
  clip-path: polygon(
    50% 0%,
    61% 35%,
    98% 35%,
    68% 57%,
    79% 91%,
    50% 70%,
    21% 91%,
    32% 57%,
    2% 35%,
    39% 35%
  );
  animation:
    sds-cometSpin 2s linear infinite,
    sds-loaderStar 2s ease-in-out infinite;
}
@keyframes sds-loaderStar {
  0%,
  100% {
    opacity: 1;
    transform: scale(1) rotate(0);
  }
  50% {
    opacity: 0.6;
    transform: scale(0.8) rotate(180deg);
  }
}
/* 101 · Matrix Bars ----------------------------------- */
.sds-loader-matrix {
  display: inline-flex;
  align-items: center;
  gap: 3px;
  height: 36px;
}
.sds-loader-matrix > * {
  width: 4px;
  border-radius: 2px;
  background: var(--sds-primary);
  animation: sds-loaderMatrix 1.2s steps(4) infinite;
}
.sds-loader-matrix > *:nth-child(1) {
  animation-delay: 0s;
}
.sds-loader-matrix > *:nth-child(2) {
  animation-delay: 0.1s;
}
.sds-loader-matrix > *:nth-child(3) {
  animation-delay: 0.2s;
}
.sds-loader-matrix > *:nth-child(4) {
  animation-delay: 0.3s;
}
.sds-loader-matrix > *:nth-child(5) {
  animation-delay: 0.4s;
}
@keyframes sds-loaderMatrix {
  0% {
    height: 100%;
    opacity: 1;
  }
  25% {
    height: 40%;
    opacity: 0.6;
  }
  50% {
    height: 80%;
    opacity: 0.9;
  }
  75% {
    height: 20%;
    opacity: 0.3;
  }
  100% {
    height: 100%;
    opacity: 1;
  }
}
/* 102 · Snake ----------------------------------------- */
.sds-loader-snake {
  position: relative;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  border: 3px solid var(--sds-primary-dim);
}
.sds-loader-snake::before {
  content: "";
  position: absolute;
  inset: -3px;
  border-radius: 50%;
  border: 3px solid transparent;
  border-top-color: var(--sds-primary);
  border-right-color: var(--sds-primary);
  animation: sds-cometSpin 1.2s var(--sds-ease-bounce, cubic-bezier(0.68, -0.55, 0.27, 1.55)) infinite;
}
/* 103 · Glitch ---------------------------------------- */
.sds-loader-glitch {
  width: 36px;
  height: 36px;
  background: var(--sds-primary);
  border-radius: 4px;
  animation: sds-loaderGlitch 2s steps(1) infinite;
}
@keyframes sds-loaderGlitch {
  0%,
  100% {
    transform: none;
    opacity: 1;
    filter: none;
  }
  8% {
    transform: translate(3px, -2px) scaleX(1.1);
    filter: hue-rotate(60deg);
  }
  9% {
    transform: none;
    filter: none;
  }
  40% {
    transform: translate(-2px, 1px);
    opacity: 0.7;
  }
  41% {
    transform: none;
    opacity: 1;
  }
  75% {
    transform: scaleY(1.2) scaleX(0.9);
  }
  76% {
    transform: none;
  }
}
/* 104 · Warp ------------------------------------------ */
.sds-loader-warp {
  width: 44px;
  height: 44px;
  border-radius: 50%;
  background: conic-gradient(
    from 0deg,
    var(--sds-primary),
    var(--sds-primary-dim),
    var(--sds-primary)
  );
  animation:
    sds-cometSpin 1.2s linear infinite,
    sds-loaderWarp 2s ease-in-out infinite;
}
@keyframes sds-loaderWarp {
  0%,
  100% {
    transform: scale(1) rotate(0);
  }
  50% {
    transform: scale(0.7) rotate(180deg);
  }
}
/* 105 · Hex ------------------------------------------- */
.sds-loader-hex {
  width: 36px;
  height: 36px;
  background: var(--sds-primary);
  clip-path: polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%);
  animation:
    sds-cometSpin 2s linear infinite,
    sds-loaderHex 2s ease-in-out infinite;
}
@keyframes sds-loaderHex {
  0%,
  100% {
    opacity: 1;
    filter: brightness(1);
  }
  50% {
    opacity: 0.6;
    filter: brightness(1.4);
  }
}
/* 106 · Quantum --------------------------------------- */
.sds-loader-quantum {
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: var(--sds-primary);
  animation: sds-loaderQuantum 1.6s steps(1) infinite;
}
@keyframes sds-loaderQuantum {
  0%,
  100% {
    opacity: 1;
    transform: scale(1);
  }
  10% {
    opacity: 0;
    transform: scale(0.5);
  }
  20% {
    opacity: 1;
    transform: scale(1.2);
  }
  30% {
    opacity: 0.5;
    transform: scale(0.8);
  }
  40% {
    opacity: 1;
    transform: scale(1);
  }
  50% {
    opacity: 0;
    transform: scale(1.4);
  }
  60% {
    opacity: 1;
    transform: scale(1);
  }
}
/* 107 · Liquid Ring ----------------------------------- */
.sds-loader-liquid-ring {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  border: 3px solid transparent;
  border-top-color: var(--sds-primary);
  border-bottom-color: var(--sds-accent);
  animation:
    sds-cometSpin 1s linear infinite,
    sds-loaderLiquidRing var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-loaderLiquidRing {
  0%,
  100% {
    filter: blur(0);
  }
  50% {
    filter: blur(1px) brightness(1.3);
  }
}
/* 108 · Hourglass ------------------------------------- */
.sds-loader-hourglass {
  width: 20px;
  height: 36px;
  background: var(--sds-primary);
  clip-path: polygon(0 0, 100% 0, 60% 50%, 100% 100%, 0 100%, 40% 50%);
  animation: sds-loaderHourglass 1.8s ease-in-out infinite;
}
@keyframes sds-loaderHourglass {
  0%,
  100% {
    transform: rotate(0deg);
  }
  50% {
    transform: rotate(180deg);
  }
}
/* 109 · Crystal --------------------------------------- */
.sds-loader-crystal {
  width: 32px;
  height: 32px;
  background: linear-gradient(
    135deg,
    rgba(6, 182, 212, 0.6),
    var(--sds-primary),
    rgba(139, 92, 246, 0.6)
  );
  clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
  animation:
    sds-cometSpin var(--sds-duration-dramatic, 3s) linear infinite,
    sds-loaderCrystal var(--sds-duration-dramatic, 3s) ease-in-out infinite;
}
@keyframes sds-loaderCrystal {
  0%,
  100% {
    filter: brightness(1);
  }
  50% {
    filter: brightness(1.5) saturate(1.4);
  }
}
/* 110 · Plasma Ring ----------------------------------- */
.sds-loader-plasma-ring {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  animation:
    sds-cometSpin 1.6s linear infinite,
    sds-loaderPlasmaRing 2.4s ease-in-out infinite;
  border: 2px solid var(--sds-primary);
}
@keyframes sds-loaderPlasmaRing {
  0%,
  100% {
    box-shadow:
      0 0 8px var(--sds-primary-glow),
      inset 0 0 8px var(--sds-primary-dim);
    filter: hue-rotate(0deg);
  }
  33% {
    box-shadow:
      0 0 16px rgba(139, 92, 246, 0.4),
      inset 0 0 12px rgba(139, 92, 246, 0.1);
    filter: hue-rotate(120deg);
  }
  66% {
    box-shadow:
      0 0 12px rgba(209, 0, 40, 0.3),
      inset 0 0 8px rgba(209, 0, 40, 0.08);
    filter: hue-rotate(240deg);
  }
}
/* 111 · Helix Dots ------------------------------------ */
.sds-loader-helix {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  height: 36px;
}
.sds-loader-helix > * {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--sds-primary);
  animation: sds-loaderHelix 1.2s ease-in-out infinite;
}
.sds-loader-helix > *:nth-child(1) {
  animation-delay: 0s;
}
.sds-loader-helix > *:nth-child(2) {
  animation-delay: 0.12s;
  background: color-mix(in srgb, var(--sds-primary) 70%, var(--sds-accent));
}
.sds-loader-helix > *:nth-child(3) {
  animation-delay: 0.24s;
}
.sds-loader-helix > *:nth-child(4) {
  animation-delay: 0.36s;
  background: color-mix(in srgb, var(--sds-primary) 70%, var(--sds-accent));
}
.sds-loader-helix > *:nth-child(5) {
  animation-delay: 0.48s;
}
@keyframes sds-loaderHelix {
  0%,
  100% {
    transform: translateY(0) scale(1);
    opacity: 1;
  }
  50% {
    transform: translateY(-16px) scale(0.7);
    opacity: 0.5;
  }
}
/* 112 · Clock ----------------------------------------- */
.sds-loader-clock {
  position: relative;
  width: 36px;
  height: 36px;
  border-radius: 50%;
  border: 2px solid rgba(0, 21, 209, 0.25);
}
.sds-loader-clock::before {
  content: "";
  position: absolute;
  width: 2px;
  height: 40%;
  background: var(--sds-primary);
  top: 10%;
  left: calc(50% - 1px);
  transform-origin: bottom center;
  animation: sds-cometSpin 2s linear infinite;
}
.sds-loader-clock::after {
  content: "";
  position: absolute;
  width: 2px;
  height: 30%;
  background: var(--sds-accent);
  top: 20%;
  left: calc(50% - 1px);
  transform-origin: bottom center;
  animation: sds-cometSpin 24s linear infinite;
}
/* 113 · Mosaic ---------------------------------------- */
.sds-loader-mosaic {
  display: grid;
  grid-template-columns: repeat(3, 12px);
  gap: 3px;
}
.sds-loader-mosaic > * {
  width: 12px;
  height: 12px;
  border-radius: 2px;
  background: var(--sds-primary);
  animation: sds-loaderMosaic 1.8s ease-in-out infinite;
}
.sds-loader-mosaic > *:nth-child(1) {
  animation-delay: 0s;
}
.sds-loader-mosaic > *:nth-child(2) {
  animation-delay: 0.1s;
}
.sds-loader-mosaic > *:nth-child(3) {
  animation-delay: 0.2s;
}
.sds-loader-mosaic > *:nth-child(4) {
  animation-delay: 0.3s;
}
.sds-loader-mosaic > *:nth-child(5) {
  animation-delay: 0.4s;
  background: var(--sds-accent);
}
.sds-loader-mosaic > *:nth-child(6) {
  animation-delay: 0.5s;
}
.sds-loader-mosaic > *:nth-child(7) {
  animation-delay: 0.6s;
}
.sds-loader-mosaic > *:nth-child(8) {
  animation-delay: 0.7s;
}
.sds-loader-mosaic > *:nth-child(9) {
  animation-delay: 0.8s;
}
@keyframes sds-loaderMosaic {
  0%,
  100% {
    transform: scale(1);
    opacity: 1;
  }
  50% {
    transform: scale(0);
    opacity: 0;
  }
}
/* 114 · Data ------------------------------------------ */
.sds-loader-data {
  width: 44px;
  height: 6px;
  border-radius: 3px;
  background: var(--sds-primary-dim);
  overflow: hidden;
  position: relative;
}
.sds-loader-data::before {
  content: "";
  display: block;
  height: 100%;
  width: 40%;
  border-radius: 3px;
  background: var(--sds-primary);
  animation: sds-loaderData var(--sds-duration-slow, 1.4s) ease-in-out infinite;
}
@keyframes sds-loaderData {
  0% {
    transform: translateX(-100%);
    opacity: 1;
  }
  50% {
    opacity: 0.8;
  }
  100% {
    transform: translateX(260%);
    opacity: 0.4;
  }
}
/* 115 · Bar ------------------------------------------- */
.sds-loader-bar {
  width: 44px;
  height: 4px;
  border-radius: 2px;
  background: var(--sds-primary-dim);
  overflow: hidden;
  position: relative;
}
.sds-loader-bar::after {
  content: "";
  display: block;
  height: 100%;
  border-radius: 2px;
  background: linear-gradient(90deg, var(--sds-primary), #8b5cf6);
  animation: sds-loaderBar 1.8s ease-in-out infinite;
}
@keyframes sds-loaderBar {
  0% {
    transform: scaleX(0);
    transform-origin: left;
  }
  45% {
    transform: scaleX(1);
    transform-origin: left;
  }
  55% {
    transform: scaleX(1);
    transform-origin: right;
  }
  100% {
    transform: scaleX(0);
    transform-origin: right;
  }
}
/* 116 · Spark ----------------------------------------- */
.sds-loader-spark {
  position: relative;
  width: 36px;
  height: 36px;
  border-radius: 50%;
  border: 2px solid var(--sds-primary);
  animation: sds-loaderSpark 1.8s ease-in-out infinite;
}
.sds-loader-spark::before {
  content: "";
  position: absolute;
  inset: 6px;
  border-radius: 50%;
  background: var(--sds-primary);
  animation: sds-loaderPulse 1.8s ease-in-out infinite;
}
@keyframes sds-loaderSpark {
  0%,
  100% {
    transform: scale(1);
    box-shadow: 0 0 0 rgba(0, 21, 209, 0);
  }
  50% {
    transform: scale(1.05);
    box-shadow: 0 0 16px var(--sds-primary-glow);
  }
}
.sds-loader-progress-glow {
  animation: sds-progressGlow 2.4s ease infinite;
}
/*  GPU compositing hints (loaders) — split from the global will-change rule; must stay after the class definitions above  */
.sds-loader-vortex,
.sds-loader-fluid,
.sds-loader-morph,
.sds-loader-prism,
.sds-loader-warp,
.sds-loader-plasma-ring,
.sds-loader-orbital::before,
.sds-loader-orbital::after {
  will-change: transform, opacity;
}
/* ====================================================================
   BATCH 12 � Loaders: Dots & Blobs (7) + Ring & Circle (6)
   ==================================================================== */
/* -- Dots & Blobs -------------------------------------------------- */
/* 117 � Dots Wave � children Y-wave in sequence */
@keyframes sds-dotsWaveKf {
  0%,60%,100% { transform: translateY(0px); }
  30%         { transform: translateY(-10px); }
}
.sds-loader-dots-wave {
  display: inline-flex;
  gap: 5px;
  align-items: center;
}
.sds-loader-dots-wave > * {
  width: 8px; height: 8px;
  border-radius: 50%;
  background: var(--sds-primary, currentColor);
  animation: sds-dotsWaveKf .9s ease-in-out infinite;
}
.sds-loader-dots-wave > *:nth-child(2) { animation-delay: .15s; }
.sds-loader-dots-wave > *:nth-child(3) { animation-delay: .3s; }
.sds-loader-dots-wave > *:nth-child(4) { animation-delay: .45s; }
/* 118 � Dots Fade � children opacity pulse in sequence */
@keyframes sds-dotsFadeKf {
  0%,80%,100% { opacity: .2; }
  40%         { opacity: 1; }
}
.sds-loader-dots-fade {
  display: inline-flex;
  gap: 5px;
  align-items: center;
}
.sds-loader-dots-fade > * {
  width: 8px; height: 8px;
  border-radius: 50%;
  background: var(--sds-primary, currentColor);
  animation: sds-dotsFadeKf .9s ease-in-out infinite;
}
.sds-loader-dots-fade > *:nth-child(2) { animation-delay: .15s; }
.sds-loader-dots-fade > *:nth-child(3) { animation-delay: .3s; }
.sds-loader-dots-fade > *:nth-child(4) { animation-delay: .45s; }
/* 119 � Dots Flip � children rotateY flip in sequence */
@keyframes sds-dotsFlipKf {
  0%,50%,100% { transform: rotateY(0deg); }
  25%         { transform: rotateY(180deg); }
}
.sds-loader-dots-flip {
  display: inline-flex;
  gap: 6px;
  align-items: center;
  perspective: 60px;
}
.sds-loader-dots-flip > * {
  width: 8px; height: 8px;
  border-radius: 50%;
  background: var(--sds-primary, currentColor);
  animation: sds-dotsFlipKf 1.2s ease-in-out infinite;
}
.sds-loader-dots-flip > *:nth-child(2) { animation-delay: .2s; }
.sds-loader-dots-flip > *:nth-child(3) { animation-delay: .4s; }
.sds-loader-dots-flip > *:nth-child(4) { animation-delay: .6s; }
/* 120 � Dots Bounce � children Y bounce with gravity curve */
@keyframes sds-dotsBounceKf {
  0%,20%,50%,80%,100% { transform: translateY(0px); }
  40%                  { transform: translateY(-12px); }
  60%                  { transform: translateY(-5px); }
}
.sds-loader-dots-bounce {
  display: inline-flex;
  gap: 5px;
  align-items: flex-end;
}
.sds-loader-dots-bounce > * {
  width: 8px; height: 8px;
  border-radius: 50%;
  background: var(--sds-primary, currentColor);
  animation: sds-dotsBounceKf 1.1s ease infinite;
}
.sds-loader-dots-bounce > *:nth-child(2) { animation-delay: .15s; }
.sds-loader-dots-bounce > *:nth-child(3) { animation-delay: .3s; }
.sds-loader-dots-bounce > *:nth-child(4) { animation-delay: .45s; }
/* 121 � Dots Expand � children scale 0?1?0 in sequence */
@keyframes sds-dotsExpandKf {
  0%,100% { transform: scale(0); opacity: 0; }
  40%,60% { transform: scale(1); opacity: 1; }
}
.sds-loader-dots-expand {
  display: inline-flex;
  gap: 5px;
  align-items: center;
}
.sds-loader-dots-expand > * {
  width: 8px; height: 8px;
  border-radius: 50%;
  background: var(--sds-primary, currentColor);
  animation: sds-dotsExpandKf 1.2s ease-in-out infinite;
}
.sds-loader-dots-expand > *:nth-child(2) { animation-delay: .2s; }
.sds-loader-dots-expand > *:nth-child(3) { animation-delay: .4s; }
.sds-loader-dots-expand > *:nth-child(4) { animation-delay: .6s; }
/* 122 � Blob � clip-path polygon morphing organic shape */
@keyframes sds-blobMorphKf {
  0%,100% { clip-path: polygon(50% 5%, 93% 25%, 93% 75%, 50% 95%, 7% 75%, 7% 25%); }
  33%     { clip-path: polygon(28% 0%, 100% 28%, 78% 100%, 22% 100%, 0% 28%, 22% 0%); }
  66%     { clip-path: polygon(50% 0%, 100% 22%, 100% 78%, 50% 100%, 0% 78%, 0% 22%); }
}
.sds-loader-blob {
  display: inline-block;
  width: 36px; height: 36px;
  background: var(--sds-primary, currentColor);
  animation: sds-blobMorphKf 2.4s ease-in-out infinite;
}
/* 123 � Bubble � ring expands and pops on loop */
@keyframes sds-bubblePopKf {
  0%   { transform: scale(.15); opacity: .9; }
  70%  { transform: scale(1);   opacity: .3; }
  100% { transform: scale(1.3); opacity: 0; }
}
.sds-loader-bubble {
  display: inline-block;
  width: 28px; height: 28px;
  border: 2px solid var(--sds-primary, currentColor);
  border-radius: 50%;
  animation: sds-bubblePopKf 1.2s ease-out infinite;
}
/* -- Ring & Circle ------------------------------------------------- */
/* 124 � Dual Ring � concentric rings spinning opposite directions */
@keyframes sds-dualRingCW  { to { transform: rotate(360deg); } }
@keyframes sds-dualRingCCW { to { transform: rotate(-360deg); } }
.sds-loader-dual-ring {
  display: inline-block;
  position: relative;
  width: 36px; height: 36px;
  border: 3px solid transparent;
  border-top-color: var(--sds-primary, currentColor);
  border-radius: 50%;
  animation: sds-dualRingCW .8s linear infinite;
}
.sds-loader-dual-ring::before {
  content: "";
  position: absolute;
  inset: 4px;
  border: 2px solid transparent;
  border-bottom-color: var(--sds-primary, currentColor);
  border-radius: 50%;
  animation: sds-dualRingCCW .6s linear infinite;
}
/* 125 � Ring Split � two opposing half-arcs counter-rotate */
@keyframes sds-ringSplitCW  { to { transform: rotate(360deg); } }
@keyframes sds-ringSplitCCW { to { transform: rotate(-360deg); } }
.sds-loader-ring-split {
  display: inline-block;
  position: relative;
  width: 36px; height: 36px;
  border: 3px solid transparent;
  border-top-color: var(--sds-primary, currentColor);
  border-right-color: var(--sds-primary, currentColor);
  border-radius: 50%;
  animation: sds-ringSplitCW .9s linear infinite;
}
.sds-loader-ring-split::before {
  content: "";
  position: absolute;
  inset: -1px;
  border: 3px solid transparent;
  border-bottom-color: var(--sds-primary, currentColor);
  border-left-color: var(--sds-primary, currentColor);
  border-radius: 50%;
  animation: sds-ringSplitCCW .9s linear infinite;
}
/* 126 � Spin Dot � ring with orbiting bead via offset-path */
@keyframes sds-spinDotOrbit { to { transform: rotate(360deg); } }
@keyframes sds-spinDotBead  { to { offset-distance: 100%; } }
.sds-loader-spin-dot {
  display: inline-block;
  position: relative;
  width: 36px; height: 36px;
  border: 2px solid rgba(0, 0, 0, .14);
  border-radius: 50%;
  animation: sds-spinDotOrbit 2.4s linear infinite;
}
.sds-loader-spin-dot::before {
  content: "";
  position: absolute;
  width: 8px; height: 8px;
  background: var(--sds-primary, currentColor);
  border-radius: 50%;
  offset-path: border-box;
  offset-distance: 0%;
  animation: sds-spinDotBead 1s linear infinite;
}
/* 127 � Ring Chase � twin beads chase each other around border-box */
@keyframes sds-ringChaseKf { to { offset-distance: 100%; } }
.sds-loader-ring-chase {
  display: inline-block;
  position: relative;
  width: 36px; height: 36px;
  border: 2px solid rgba(0, 0, 0, .1);
  border-radius: 50%;
}
.sds-loader-ring-chase::before {
  content: "";
  position: absolute;
  width: 32%; height: 3px;
  background: var(--sds-primary, currentColor);
  border-radius: 3px;
  offset-path: border-box;
  offset-distance: 0%;
  animation: sds-ringChaseKf 1.2s cubic-bezier(.4,0,.6,1) infinite;
}
.sds-loader-ring-chase::after {
  content: "";
  position: absolute;
  width: 22%; height: 3px;
  background: var(--sds-primary, currentColor);
  border-radius: 3px;
  offset-path: border-box;
  offset-distance: 48%;
  animation: sds-ringChaseKf 1.2s cubic-bezier(.4,0,.6,1) infinite .35s;
}
/* 128 � Eclipse � two discs slide past each other */
@keyframes sds-eclipseKf {
  0%,100% { transform: translateX(-7px); opacity: .75; }
  50%     { transform: translateX(7px);  opacity: .9; }
}
.sds-loader-eclipse {
  display: inline-block;
  position: relative;
  width: 40px; height: 20px;
}
.sds-loader-eclipse::before,
.sds-loader-eclipse::after {
  content: "";
  position: absolute;
  width: 20px; height: 20px;
  border-radius: 50%;
  background: var(--sds-primary, currentColor);
}
.sds-loader-eclipse::before {
  left: 0;
  animation: sds-eclipseKf 1.5s ease-in-out infinite;
}
.sds-loader-eclipse::after {
  right: 0;
  animation: sds-eclipseKf 1.5s ease-in-out infinite .75s;
}
/* 129 � Halo � two staggered expanding-fading rings */
@keyframes sds-haloExpandKf {
  0%   { transform: scale(.2); opacity: .85; }
  100% { transform: scale(2);  opacity: 0; }
}
.sds-loader-halo {
  display: inline-block;
  position: relative;
  width: 28px; height: 28px;
  border: 2px solid var(--sds-primary, currentColor);
  border-radius: 50%;
  animation: sds-haloExpandKf 1.4s ease-out infinite;
}
.sds-loader-halo::before {
  content: "";
  position: absolute;
  inset: -2px;
  border: 2px solid var(--sds-primary, currentColor);
  border-radius: 50%;
  animation: sds-haloExpandKf 1.4s ease-out infinite .7s;
}
/* ====================================================================
   BATCH 13 � Loaders: Line & Bar (6) + Morph & Shape (6)
   ==================================================================== */
/* -- Line & Bar ---------------------------------------------------- */
/* 130 � Fill Bar � progress fill sweeps left?right then fades */
@keyframes sds-ldBarFill {
  0%   { transform: scaleX(0); opacity: 1; }
  65%  { transform: scaleX(1); opacity: 1; }
  100% { transform: scaleX(1); opacity: 0; }
}
.sds-loader-fill-bar {
  display: inline-block;
  position: relative;
  width: 60px; height: 6px;
  border-radius: 3px;
  background: rgba(0, 0, 0, .12);
  overflow: hidden;
}
.sds-loader-fill-bar::before {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: 3px;
  background: var(--sds-primary, currentColor);
  transform-origin: left;
  animation: sds-ldBarFill 1.4s cubic-bezier(.4, 0, .2, 1) infinite;
}
/* 131 � Bar Pulse � bar breathes scale on center axis */
@keyframes sds-ldBarPulse {
  0%,100% { transform: scaleX(.2); opacity: .45; }
  50%     { transform: scaleX(1);  opacity: 1; }
}
.sds-loader-bar-pulse {
  display: inline-block;
  width: 60px; height: 6px;
  border-radius: 3px;
  background: var(--sds-primary, currentColor);
  transform-origin: center;
  animation: sds-ldBarPulse 1.2s ease-in-out infinite;
}
/* 132 � Bar Swing � bright sliver slides end to end across track */
@keyframes sds-ldBarSwing {
  0%   { transform: translateX(-16px); }
  100% { transform: translateX(76px); }
}
.sds-loader-bar-swing {
  display: inline-block;
  position: relative;
  width: 60px; height: 6px;
  border-radius: 3px;
  background: rgba(0, 0, 0, .12);
  overflow: hidden;
}
.sds-loader-bar-swing::before {
  content: "";
  position: absolute;
  inset: 0;
  width: 12px;
  border-radius: 3px;
  background: var(--sds-primary, currentColor);
  animation: sds-ldBarSwing 1s cubic-bezier(.4, 0, .6, 1) infinite alternate;
}
/* 133 � Track � dot races back and forth along a rail */
@keyframes sds-ldTrackRun {
  0%   { transform: translateX(0)    translateY(-50%); }
  100% { transform: translateX(40px) translateY(-50%); }
}
.sds-loader-track {
  display: inline-block;
  position: relative;
  width: 56px; height: 4px;
  border-radius: 4px;
  background: rgba(0, 0, 0, .12);
}
.sds-loader-track::before {
  content: "";
  position: absolute;
  top: 50%; left: 0;
  width: 12px; height: 12px;
  border-radius: 50%;
  background: var(--sds-primary, currentColor);
  animation: sds-ldTrackRun 1s cubic-bezier(.4, 0, .6, 1) infinite alternate;
}
/* 134 � Stripes � diagonal stripe pattern scrolls across bar */
@keyframes sds-ldStripes {
  from { transform: translateX(0); }
  to   { transform: translateX(14px); }
}
.sds-loader-stripes {
  display: inline-block;
  position: relative;
  width: 64px; height: 8px;
  border-radius: 4px;
  background: rgba(0, 0, 0, .1);
  overflow: hidden;
}
.sds-loader-stripes::before {
  content: "";
  position: absolute;
  inset: 0;
  width: 200%;
  background: repeating-linear-gradient(
    -45deg,
    var(--sds-primary, currentColor) 0px,
    var(--sds-primary, currentColor) 5px,
    transparent 5px,
    transparent 14px
  );
  animation: sds-ldStripes .7s linear infinite;
}
/* 135 � Equalizer � 4 bars pulse to different heights (requiresChildren) */
@keyframes sds-ldEqualizerA { 0%,100% { transform: scaleY(.2); } 50% { transform: scaleY(1);    } }
@keyframes sds-ldEqualizerB { 0%,100% { transform: scaleY(.7); } 50% { transform: scaleY(.25); } }
@keyframes sds-ldEqualizerC { 0%,100% { transform: scaleY(.4); } 50% { transform: scaleY(.85); } }
@keyframes sds-ldEqualizerD { 0%,100% { transform: scaleY(.9); } 50% { transform: scaleY(.3);  } }
.sds-loader-equalizer {
  display: inline-flex;
  gap: 3px;
  align-items: flex-end;
  height: 24px;
}
.sds-loader-equalizer > * {
  width: 5px; height: 24px;
  border-radius: 2px 2px 0 0;
  background: var(--sds-primary, currentColor);
  transform-origin: bottom;
}
.sds-loader-equalizer > *:nth-child(1) { animation: sds-ldEqualizerA .8s ease-in-out infinite; }
.sds-loader-equalizer > *:nth-child(2) { animation: sds-ldEqualizerB .8s ease-in-out infinite .1s; }
.sds-loader-equalizer > *:nth-child(3) { animation: sds-ldEqualizerC .8s ease-in-out infinite .2s; }
.sds-loader-equalizer > *:nth-child(4) { animation: sds-ldEqualizerD .8s ease-in-out infinite .3s; }
/* -- Morph & Shape ------------------------------------------------- */
/* 136 � Morph Geo � square ? diamond ? circle via clip-path */
@keyframes sds-ldMorphGeo {
  0%,100% { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); }
  33%     { clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%); }
  66%     { clip-path: circle(50% at 50% 50%); }
}
.sds-loader-morph-geo {
  display: inline-block;
  width: 28px; height: 28px;
  background: var(--sds-primary, currentColor);
  animation: sds-ldMorphGeo 1.8s ease-in-out infinite;
}
/* 137 � Fold � square folds in 3D perspective on each axis in turn */
@keyframes sds-ldFold {
  0%,100% { transform: perspective(60px) rotateX(0deg)   rotateY(0deg); }
  25%     { transform: perspective(60px) rotateX(0deg)   rotateY(180deg); }
  50%     { transform: perspective(60px) rotateX(180deg) rotateY(180deg); }
  75%     { transform: perspective(60px) rotateX(180deg) rotateY(0deg); }
}
.sds-loader-fold {
  display: inline-block;
  width: 22px; height: 22px;
  background: var(--sds-primary, currentColor);
  animation: sds-ldFold 1.6s ease-in-out infinite;
}
/* 138 � Pinwheel � 4 petal-dots fade in sequence (requiresChildren) */
@keyframes sds-ldPinwheelFade { 0%,100% { opacity: .1; } 50% { opacity: 1; } }
.sds-loader-pinwheel {
  display: inline-block;
  position: relative;
  width: 28px; height: 28px;
}
.sds-loader-pinwheel > * {
  position: absolute;
  width: 9px; height: 9px;
  border-radius: 50%;
  background: var(--sds-primary, currentColor);
  animation: sds-ldPinwheelFade .8s ease-in-out infinite;
}
.sds-loader-pinwheel > *:nth-child(1) { top: 0; left: 50%; transform: translateX(-50%); animation-delay: 0s; }
.sds-loader-pinwheel > *:nth-child(2) { right: 0; top: 50%; transform: translateY(-50%); animation-delay: .2s; }
.sds-loader-pinwheel > *:nth-child(3) { bottom: 0; left: 50%; transform: translateX(-50%); animation-delay: .4s; }
.sds-loader-pinwheel > *:nth-child(4) { left: 0; top: 50%; transform: translateY(-50%); animation-delay: .6s; }
/* 139 � Coil � three nested arcs spinning at different speeds */
@keyframes sds-ldCoilCW  { to { transform: rotate(360deg); } }
@keyframes sds-ldCoilCCW { to { transform: rotate(-360deg); } }
.sds-loader-coil {
  display: inline-block;
  position: relative;
  width: 30px; height: 30px;
  border: 3px solid transparent;
  border-top-color: var(--sds-primary, currentColor);
  border-radius: 50%;
  animation: sds-ldCoilCW .8s linear infinite;
}
.sds-loader-coil::before {
  content: "";
  position: absolute;
  inset: 4px;
  border: 2px solid transparent;
  border-top-color: var(--sds-primary, currentColor);
  border-radius: 50%;
  animation: sds-ldCoilCCW .5s linear infinite;
}
.sds-loader-coil::after {
  content: "";
  position: absolute;
  inset: 10px;
  border: 2px solid transparent;
  border-top-color: var(--sds-primary, currentColor);
  border-radius: 50%;
  animation: sds-ldCoilCW .3s linear infinite;
}
/* 140 � Flip Card � rectangle flips on Y axis like turning a card */
@keyframes sds-ldFlipCard {
  0%   { transform: perspective(80px) rotateY(0deg); }
  49%  { transform: perspective(80px) rotateY(90deg); opacity: .3; }
  51%  { transform: perspective(80px) rotateY(-90deg); opacity: .3; }
  100% { transform: perspective(80px) rotateY(0deg); }
}
.sds-loader-flip-card {
  display: inline-block;
  width: 22px; height: 22px;
  background: var(--sds-primary, currentColor);
  border-radius: 3px;
  animation: sds-ldFlipCard 1.2s ease-in-out infinite;
}
/* 141 � Diamond � square rotates 180� and pulses scale */
@keyframes sds-ldDiamond {
  0%,100% { transform: rotate(45deg) scale(1);   opacity: 1; }
  50%     { transform: rotate(225deg) scale(.6); opacity: .45; }
}
.sds-loader-diamond {
  display: inline-block;
  width: 20px; height: 20px;
  background: var(--sds-primary, currentColor);
  animation: sds-ldDiamond 1.2s ease-in-out infinite;
}
/* ====================================================================
   BATCH 14 � Loaders: Geometric Spinners (6) + Glow & Filter (6)
   ==================================================================== */
/* -- Geometric Spinners -------------------------------------------- */
/* 142 � Squares � 2�2 grid cells pop in rolling sequence (requiresChildren) */
@keyframes sds-ldSquaresKf {
  0%,100% { transform: scale(0); opacity: 0; }
  50%     { transform: scale(1); opacity: 1; }
}
.sds-loader-squares {
  display: inline-grid;
  grid-template-columns: 1fr 1fr;
  gap: 3px;
  width: 24px; height: 24px;
}
.sds-loader-squares > * {
  background: var(--sds-primary, currentColor);
  border-radius: 2px;
  animation: sds-ldSquaresKf .9s ease-in-out infinite;
}
.sds-loader-squares > *:nth-child(1) { animation-delay: 0s; }
.sds-loader-squares > *:nth-child(2) { animation-delay: .15s; }
.sds-loader-squares > *:nth-child(3) { animation-delay: .3s; }
.sds-loader-squares > *:nth-child(4) { animation-delay: .45s; }
/* 143 � Isocube � square spins on a tilted perspective axis */
@keyframes sds-ldIsocube { to { transform: perspective(60px) rotateX(-22deg) rotateY(360deg); } }
.sds-loader-isocube {
  display: inline-block;
  width: 22px; height: 22px;
  background: var(--sds-primary, currentColor);
  animation: sds-ldIsocube 1.8s linear infinite;
}
/* 144 � Metronome � thin bar pivots left-right from its base */
@keyframes sds-ldMetronome {
  0%,100% { transform: rotate(-38deg); }
  50%     { transform: rotate(38deg); }
}
.sds-loader-metronome {
  display: inline-block;
  width: 4px; height: 30px;
  border-radius: 2px;
  background: var(--sds-primary, currentColor);
  transform-origin: bottom center;
  animation: sds-ldMetronome 1s ease-in-out infinite;
}
/* 145 � Tape � ball squashes and stretches on each bounce */
@keyframes sds-ldTape {
  0%,100% { transform: translateY(-10px) scaleX(.8)  scaleY(1.25); }
  40%     { transform: translateY(4px)   scaleX(1.25) scaleY(.75); }
  60%     { transform: translateY(-6px)  scaleX(.9)  scaleY(1.1); }
}
.sds-loader-tape {
  display: inline-block;
  width: 18px; height: 18px;
  border-radius: 50%;
  background: var(--sds-primary, currentColor);
  animation: sds-ldTape .85s cubic-bezier(.4, 0, .2, 1) infinite;
}
/* 146 � Chase Box � bead races along host border via offset-path */
@keyframes sds-ldChaseBox { to { offset-distance: 100%; } }
.sds-loader-chase-box {
  display: inline-block;
  position: relative;
  width: 32px; height: 32px;
  border: 2px solid rgba(0, 0, 0, .1);
  border-radius: 4px;
}
.sds-loader-chase-box::before {
  content: "";
  position: absolute;
  width: 8px; height: 8px;
  background: var(--sds-primary, currentColor);
  border-radius: 2px;
  offset-path: border-box;
  offset-distance: 0%;
  animation: sds-ldChaseBox 1.2s linear infinite;
}
/* 147 � Windmill � 4 rectangular blades fade in cardinal sequence (requiresChildren) */
@keyframes sds-ldWindmillFade { 0%,100% { opacity: .08; } 50% { opacity: 1; } }
.sds-loader-windmill {
  display: inline-block;
  position: relative;
  width: 28px; height: 28px;
}
.sds-loader-windmill > * {
  position: absolute;
  top: 50%; left: 50%;
  width: 10px; height: 4px;
  border-radius: 2px;
  background: var(--sds-primary, currentColor);
  animation: sds-ldWindmillFade 1s ease-in-out infinite;
}
.sds-loader-windmill > *:nth-child(1) { transform: translate(-50%, -14px) rotate(0deg);   animation-delay: 0s; }
.sds-loader-windmill > *:nth-child(2) { transform: translate(4px, -50%)   rotate(90deg);  animation-delay: .25s; }
.sds-loader-windmill > *:nth-child(3) { transform: translate(-50%, 10px)  rotate(0deg);   animation-delay: .5s; }
.sds-loader-windmill > *:nth-child(4) { transform: translate(-14px, -50%) rotate(90deg);  animation-delay: .75s; }
/* -- Glow & Filter ------------------------------------------------- */
/* 148 � Glow Pulse � dot radiates a breathing drop-shadow glow */
@keyframes sds-ldGlowPulse {
  0%,100% { filter: drop-shadow(0 0 2px currentColor); transform: scale(.88); opacity: .65; }
  50%     { filter: drop-shadow(0 0 14px currentColor); transform: scale(1.1); opacity: 1; }
}
.sds-loader-glow-pulse {
  display: inline-block;
  width: 20px; height: 20px;
  border-radius: 50%;
  background: var(--sds-primary, currentColor);
  animation: sds-ldGlowPulse 1.5s ease-in-out infinite;
}
/* 149 � Neon Flicker � bar sputters like a neon tube warming up */
@keyframes sds-ldNeonFlicker {
  0%,18%,22%,55%,57%,100% { opacity: 1;   filter: drop-shadow(0 0 8px currentColor); }
  20%,56%                 { opacity: .12; filter: none; }
}
.sds-loader-neon-flicker {
  display: inline-block;
  width: 4px; height: 28px;
  border-radius: 2px;
  background: var(--sds-primary, currentColor);
  animation: sds-ldNeonFlicker 2.4s ease-in-out infinite;
}
/* 150 � Scanner � horizontal scan line sweeps down a bordered box */
@keyframes sds-ldScanner {
  0%   { transform: translateY(0); opacity: 1; }
  90%  { transform: translateY(36px); opacity: .3; }
  100% { transform: translateY(0); opacity: 0; }
}
.sds-loader-scanner {
  display: inline-block;
  position: relative;
  width: 36px; height: 36px;
  border: 2px solid rgba(0, 0, 0, .12);
  border-radius: 3px;
  overflow: hidden;
}
.sds-loader-scanner::before {
  content: "";
  position: absolute;
  inset: 0 0 auto 0;
  height: 2px;
  border-radius: 1px;
  background: var(--sds-primary, currentColor);
  filter: drop-shadow(0 2px 4px currentColor);
  animation: sds-ldScanner 1.6s ease-in-out infinite;
}
/* 151 � Spotlight � conic wedge sweeps in a circle like a spotlight */
@keyframes sds-ldSpotlight { to { transform: rotate(360deg); } }
.sds-loader-spotlight {
  display: inline-block;
  position: relative;
  width: 32px; height: 32px;
  border-radius: 50%;
  overflow: hidden;
  background: rgba(0, 0, 0, .07);
}
.sds-loader-spotlight::before {
  content: "";
  position: absolute;
  inset: 0;
  background: conic-gradient(
    from 0deg,
    transparent 0deg,
    transparent 255deg,
    var(--sds-primary, currentColor) 272deg,
    transparent 289deg
  );
  animation: sds-ldSpotlight 1.2s linear infinite;
}
/* 152 � Beam � bar wipes in from left then exits right via clip-path */
@keyframes sds-ldBeam {
  0%   { clip-path: polygon(0 0, 0 0, 0 100%, 0 100%); opacity: 1; }
  45%  { clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%); opacity: 1; }
  55%  { clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%); opacity: 1; }
  100% { clip-path: polygon(100% 0, 100% 0, 100% 100%, 100% 100%); opacity: 0; }
}
.sds-loader-beam {
  display: inline-block;
  width: 44px; height: 3px;
  border-radius: 2px;
  background: var(--sds-primary, currentColor);
  filter: drop-shadow(0 0 4px currentColor);
  animation: sds-ldBeam 1.4s ease-in-out infinite;
}
/* 153 � Blur Pulse � dot dissolves in and out through a blur */
@keyframes sds-ldBlurPulse {
  0%,100% { filter: blur(7px); transform: scale(1.5); opacity: 0; }
  50%     { filter: blur(0px); transform: scale(1);   opacity: 1; }
}
.sds-loader-blur-pulse {
  display: inline-block;
  width: 20px; height: 20px;
  border-radius: 50%;
  background: var(--sds-primary, currentColor);
  animation: sds-ldBlurPulse 1.6s ease-in-out infinite;
}
/* ====================================================================
   BATCH 15 � Loaders: Finale mix (12) � loaders complete at 100/100
   ==================================================================== */
/* 154 � Timer � pie-fill sweeps around like a countdown clock */
@keyframes sds-ldTimerKf {
  0%   { clip-path: polygon(50% 50%, 50% 0%, 50% 0%); }
  25%  { clip-path: polygon(50% 50%, 50% 0%, 100% 0%, 100% 50%); }
  50%  { clip-path: polygon(50% 50%, 50% 0%, 100% 0%, 100% 100%, 50% 100%); }
  75%  { clip-path: polygon(50% 50%, 50% 0%, 100% 0%, 100% 100%, 0% 100%, 0% 50%); }
  100% { clip-path: polygon(50% 50%, 50% 0%, 100% 0%, 100% 100%, 0% 100%, 0% 0%, 50% 0%); }
}
.sds-loader-timer {
  display: inline-block;
  width: 28px; height: 28px;
  border-radius: 50%;
  background: var(--sds-primary, currentColor);
  animation: sds-ldTimerKf 1.8s linear infinite;
}
/* 155 � Cursor � hard-blinking I-beam using step-end */
@keyframes sds-ldCursor {
  0%,100% { opacity: 1; }
  50%     { opacity: 0; }
}
.sds-loader-cursor {
  display: inline-block;
  width: 2px; height: 22px;
  border-radius: 1px;
  background: var(--sds-primary, currentColor);
  animation: sds-ldCursor .9s step-end infinite;
}
/* 156 � Bounce Bar � 4 bars translate-Y bounce in sequence (requiresChildren) */
@keyframes sds-ldBounceBar {
  0%,100% { transform: translateY(0); }
  40%     { transform: translateY(-14px); }
  60%     { transform: translateY(-5px); }
}
.sds-loader-bounce-bar {
  display: inline-flex;
  gap: 3px;
  align-items: flex-end;
  height: 24px;
}
.sds-loader-bounce-bar > * {
  width: 5px; height: 16px;
  border-radius: 2px 2px 0 0;
  background: var(--sds-primary, currentColor);
}
.sds-loader-bounce-bar > *:nth-child(1) { animation: sds-ldBounceBar .8s ease-in-out infinite; }
.sds-loader-bounce-bar > *:nth-child(2) { animation: sds-ldBounceBar .8s ease-in-out infinite .13s; }
.sds-loader-bounce-bar > *:nth-child(3) { animation: sds-ldBounceBar .8s ease-in-out infinite .26s; }
.sds-loader-bounce-bar > *:nth-child(4) { animation: sds-ldBounceBar .8s ease-in-out infinite .39s; }
/* 157 � Ripple Dot � central dot radiates two expanding ring waves */
@keyframes sds-ldRippleDotRing {
  0%   { transform: scale(1);   opacity: .7; }
  100% { transform: scale(3.2); opacity: 0; }
}
.sds-loader-ripple-dot {
  display: inline-block;
  position: relative;
  width: 10px; height: 10px;
  border-radius: 50%;
  background: var(--sds-primary, currentColor);
}
.sds-loader-ripple-dot::before,
.sds-loader-ripple-dot::after {
  content: "";
  position: absolute;
  inset: 0;
  border: 1.5px solid var(--sds-primary, currentColor);
  border-radius: 50%;
  animation: sds-ldRippleDotRing 1.6s ease-out infinite;
}
.sds-loader-ripple-dot::after { animation-delay: .8s; }
/* 158 � Yo-Yo � ball drops, mini-bounces at bottom, snaps back */
@keyframes sds-ldYoYo {
  0%,100% { transform: translateY(-14px); }
  40%     { transform: translateY(4px); }
  55%     { transform: translateY(-4px); }
  70%     { transform: translateY(2px); }
}
.sds-loader-yo-yo {
  display: inline-block;
  width: 14px; height: 14px;
  border-radius: 50%;
  background: var(--sds-primary, currentColor);
  animation: sds-ldYoYo 1s cubic-bezier(.4, 0, .2, 1) infinite;
}
/* 159 � Swivel � dot oscillates side to side with alternate timing */
@keyframes sds-ldSwivel {
  0%,100% { transform: translateX(-14px) scaleY(.85); }
  50%     { transform: translateX(14px)  scaleY(1.15); }
}
.sds-loader-swivel {
  display: inline-block;
  width: 10px; height: 10px;
  border-radius: 50%;
  background: var(--sds-primary, currentColor);
  animation: sds-ldSwivel 1s cubic-bezier(.4, 0, .6, 1) infinite alternate;
}
/* 160 � Gear � jagged polygon rotates like a mechanical cog */
@keyframes sds-ldGearSpin { to { transform: rotate(360deg); } }
.sds-loader-gear {
  display: inline-block;
  width: 28px; height: 28px;
  background: var(--sds-primary, currentColor);
  clip-path: polygon(
    50% 0%,  63% 11%, 79% 7%,  83% 23%,
    98% 32%, 93% 48%, 100% 62%, 87% 71%,
    88% 88%, 71% 89%, 62% 100%, 47% 93%,
    31% 98%, 26% 82%, 10% 76%, 15% 60%,
    3% 47%,  16% 37%, 13% 20%, 30% 18%, 37% 3%
  );
  animation: sds-ldGearSpin 2s linear infinite;
}
/* 161 � Drop � teardrop shape squashes on impact and lifts off */
@keyframes sds-ldDropKf {
  0%,100% { transform: translateY(-8px)  scaleX(1)    scaleY(1.25); }
  60%     { transform: translateY(5px)   scaleX(1.35) scaleY(.7); }
  75%     { transform: translateY(2px)   scaleX(.9)   scaleY(1.1); }
  88%     { transform: translateY(4px)   scaleX(1.1)  scaleY(.95); }
}
.sds-loader-drop {
  display: inline-block;
  width: 16px; height: 20px;
  background: var(--sds-primary, currentColor);
  clip-path: polygon(50% 0%, 100% 55%, 80% 100%, 20% 100%, 0% 55%);
  animation: sds-ldDropKf 1.1s ease-in infinite;
}
/* 162 � Ticker � rectangle flips on X axis like a flip-board tile */
@keyframes sds-ldTickerFlip {
  0%   { transform: perspective(50px) rotateX(0deg);   opacity: 1; }
  44%  { transform: perspective(50px) rotateX(-90deg); opacity: 0; }
  56%  { transform: perspective(50px) rotateX(90deg);  opacity: 0; }
  100% { transform: perspective(50px) rotateX(0deg);   opacity: 1; }
}
.sds-loader-ticker {
  display: inline-block;
  width: 22px; height: 16px;
  border-radius: 3px;
  background: var(--sds-primary, currentColor);
  animation: sds-ldTickerFlip 1.2s ease-in-out infinite;
}
/* 163 � Expand Ring � three concentric rings radiate outward */
@keyframes sds-ldExpandRingKf {
  0%   { transform: scale(0); opacity: 1; }
  100% { transform: scale(2.8); opacity: 0; }
}
.sds-loader-expand-ring {
  display: inline-block;
  position: relative;
  width: 16px; height: 16px;
  border: 2px solid var(--sds-primary, currentColor);
  border-radius: 50%;
  animation: sds-ldExpandRingKf 1.6s ease-out infinite;
}
.sds-loader-expand-ring::before,
.sds-loader-expand-ring::after {
  content: "";
  position: absolute;
  inset: -2px;
  border: 2px solid var(--sds-primary, currentColor);
  border-radius: 50%;
  animation: sds-ldExpandRingKf 1.6s ease-out infinite;
}
.sds-loader-expand-ring::before { animation-delay: .5s; }
.sds-loader-expand-ring::after  { animation-delay: 1s; }
/* 164 � Spin Fade � 4 horizontal bars fade in rotational sequence (requiresChildren) */
@keyframes sds-ldSpinFadeKf { 0%,100% { opacity: .08; } 50% { opacity: 1; } }
.sds-loader-spin-fade {
  display: inline-block;
  position: relative;
  width: 28px; height: 28px;
}
.sds-loader-spin-fade > * {
  position: absolute;
  top: 50%; left: 50%;
  width: 12px; height: 3px;
  border-radius: 3px;
  background: var(--sds-primary, currentColor);
  animation: sds-ldSpinFadeKf 1s ease-in-out infinite;
}
.sds-loader-spin-fade > *:nth-child(1) { transform: translate(-50%, -11px) rotate(0deg);   animation-delay: 0s; }
.sds-loader-spin-fade > *:nth-child(2) { transform: translate(1px, -50%)   rotate(90deg);  animation-delay: .25s; }
.sds-loader-spin-fade > *:nth-child(3) { transform: translate(-50%, 8px)   rotate(0deg);   animation-delay: .5s; }
.sds-loader-spin-fade > *:nth-child(4) { transform: translate(-13px, -50%) rotate(90deg);  animation-delay: .75s; }
/* 165 � Throb � energetic overshoot pulse, more forceful than breath */
@keyframes sds-ldThrob {
  0%,100% { transform: scale(1);   opacity: .8; }
  40%     { transform: scale(1.45); opacity: 1; }
  60%     { transform: scale(.88); opacity: .9; }
}
.sds-loader-throb {
  display: inline-block;
  width: 20px; height: 20px;
  border-radius: 50%;
  background: var(--sds-primary, currentColor);
  animation: sds-ldThrob 1.1s ease-in-out infinite;
}
/*!
 * SDS Motion Forge — scroll.css
 * Scroll / viewport animations (Section 6) + scroll legacy alias.
 * Part of the lossless v5 category split — combined entry: src/motion.css
 */
/* ============================================================
   SECTION 6 — SCROLL / VIEWPORT ANIMATIONS
   Namespace: .sds-scroll-*
   Usage: Add the class via IntersectionObserver when the
   element enters the viewport. The animation fires once on
   class add (fill-mode: both holds the final state).
   ============================================================ */
/* 78 · Viewport Rise --------------------------------------- */
.sds-scroll-rise {
  animation: sds-viewportRise var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-viewportRise {
  from {
    opacity: 0;
    transform: translateY(50px) scale(0.95);
  }
  to {
    opacity: 1;
    transform: translateY(0) scale(1);
  }
}
/* 79 · Curtain Lift ---------------------------------------- */
.sds-scroll-curtain {
  animation: sds-curtainLift var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-curtainLift {
  from {
    clip-path: inset(0 0 100% 0);
    opacity: 0;
  }
  to {
    clip-path: inset(0 0 0% 0);
    opacity: 1;
  }
}
/* 80 · Scroll Warp ----------------------------------------- */
.sds-scroll-warp {
  animation: sds-scrollWarp 0.9s var(--sds-easing) both;
}
@keyframes sds-scrollWarp {
  from {
    opacity: 0;
    transform: perspective(600px) rotateX(20deg) translateY(30px);
    filter: blur(4px);
  }
  to {
    opacity: 1;
    transform: perspective(600px) rotateX(0) translateY(0);
    filter: blur(0);
  }
}
/* 81 · Momentum Slide -------------------------------------- */
.sds-scroll-slide {
  animation: sds-momentumSlide var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-momentumSlide {
  from {
    opacity: 0;
    transform: translateX(-60px);
  }
  70% {
    transform: translateX(6px);
  }
  100% {
    opacity: 1;
    transform: translateX(0);
  }
}
/* 82 · Scale Reveal ---------------------------------------- */
.sds-scroll-scale {
  animation: sds-scaleReveal var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-scaleReveal {
  from {
    opacity: 0;
    transform: scale(0.7);
    filter: blur(8px);
  }
  70% {
    opacity: 1;
    transform: scale(1.02);
    filter: blur(0);
  }
  100% {
    opacity: 1;
    transform: scale(1);
  }
}
/* 83 · Radial Expand --------------------------------------- */
.sds-scroll-radial {
  animation: sds-radialExpand 0.9s var(--sds-easing) both;
}
@keyframes sds-radialExpand {
  from {
    clip-path: circle(0% at 50% 100%);
    opacity: 0;
  }
  to {
    clip-path: circle(150% at 50% 100%);
    opacity: 1;
  }
}
/* 84 · Blur Ascend ----------------------------------------- */
.sds-scroll-blur {
  animation: sds-blurAscend var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-blurAscend {
  from {
    opacity: 0;
    transform: translateY(40px);
    filter: blur(16px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
    filter: blur(0);
  }
}
/* 85 · Tilt Reveal ----------------------------------------- */
.sds-scroll-tilt {
  animation: sds-tiltReveal var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-tiltReveal {
  from {
    opacity: 0;
    transform: perspective(400px) rotateX(50deg) translateY(20px);
  }
  to {
    opacity: 1;
    transform: perspective(400px) rotateX(0) translateY(0);
  }
}
/* 86 · Scan Line ------------------------------------------- */
.sds-scroll-scan {
  animation: sds-scanLine var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-scanLine {
  from {
    clip-path: inset(0 100% 0 0);
  }
  to {
    clip-path: inset(0 0% 0 0);
  }
}
/* 87 · Stagger Pop (up to 12 children) --------------------- */
.sds-scroll-stagger-pop > * {
  animation: sds-staggerPop 0.7s var(--sds-easing) both;
}
.sds-scroll-stagger-pop > *:nth-child(1) {
  animation-delay: 0s;
}
.sds-scroll-stagger-pop > *:nth-child(2) {
  animation-delay: 0.1s;
}
.sds-scroll-stagger-pop > *:nth-child(3) {
  animation-delay: 0.2s;
}
.sds-scroll-stagger-pop > *:nth-child(4) {
  animation-delay: 0.3s;
}
.sds-scroll-stagger-pop > *:nth-child(5) {
  animation-delay: 0.4s;
}
.sds-scroll-stagger-pop > *:nth-child(6) {
  animation-delay: 0.5s;
}
.sds-scroll-stagger-pop > *:nth-child(7) {
  animation-delay: 0.6s;
}
.sds-scroll-stagger-pop > *:nth-child(8) {
  animation-delay: 0.7s;
}
.sds-scroll-stagger-pop > *:nth-child(9) {
  animation-delay: 0.8s;
}
.sds-scroll-stagger-pop > *:nth-child(10) {
  animation-delay: 0.9s;
}
.sds-scroll-stagger-pop > *:nth-child(11) {
  animation-delay: 1s;
}
.sds-scroll-stagger-pop > *:nth-child(12) {
  animation-delay: 1.1s;
}
@keyframes sds-staggerPop {
  0% {
    opacity: 0;
    transform: scale(0.7) rotate(-4deg);
  }
  60% {
    opacity: 1;
    transform: scale(1.06) rotate(1deg);
  }
  100% {
    opacity: 1;
    transform: scale(1) rotate(0);
  }
}
/* 88 · Depth Enter ----------------------------------------- */
.sds-scroll-depth {
  animation: sds-depthPortal 0.9s var(--sds-easing) both;
}
/* 89 · Shatter Enter --------------------------------------- */
.sds-scroll-shatter {
  animation: sds-shatterIn var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
/* 90 · Phantom Rise ---------------------------------------- */
.sds-scroll-phantom {
  animation: sds-phantomBlur var(--sds-duration-base, 0.8s) ease both;
}
/* 91 · Gravity Land ---------------------------------------- */
.sds-scroll-gravity {
  animation: sds-gravityDrop var(--sds-duration-base, 0.8s) var(--sds-ease-bounce, cubic-bezier(0.68, -0.55, 0.27, 1.55)) both;
}
/* 92 · Liquid Enter ---------------------------------------- */
.sds-scroll-liquid {
  animation: sds-liquidRise var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
/* 93 · Velvet Drop Scroll ---------------------------------- */
.sds-scroll-velvet {
  animation: sds-velvetDrop var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
/* 94 · Stagger Grid (up to 12 children) -------------------- */
.sds-scroll-stagger-grid > * {
  animation: sds-viewportRise 0.6s var(--sds-easing) both;
}
.sds-scroll-stagger-grid > *:nth-child(1) {
  animation-delay: 0s;
}
.sds-scroll-stagger-grid > *:nth-child(2) {
  animation-delay: 0.08s;
}
.sds-scroll-stagger-grid > *:nth-child(3) {
  animation-delay: 0.16s;
}
.sds-scroll-stagger-grid > *:nth-child(4) {
  animation-delay: 0.24s;
}
.sds-scroll-stagger-grid > *:nth-child(5) {
  animation-delay: 0.32s;
}
.sds-scroll-stagger-grid > *:nth-child(6) {
  animation-delay: 0.4s;
}
.sds-scroll-stagger-grid > *:nth-child(7) {
  animation-delay: 0.48s;
}
.sds-scroll-stagger-grid > *:nth-child(8) {
  animation-delay: 0.56s;
}
.sds-scroll-stagger-grid > *:nth-child(9) {
  animation-delay: 0.64s;
}
.sds-scroll-stagger-grid > *:nth-child(10) {
  animation-delay: 0.72s;
}
.sds-scroll-stagger-grid > *:nth-child(11) {
  animation-delay: 0.8s;
}
.sds-scroll-stagger-grid > *:nth-child(12) {
  animation-delay: 0.88s;
}
/* 95 · Orbit Enter ----------------------------------------- */
.sds-scroll-orbit {
  animation: sds-perspSwing var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
/* 96 · Glitch Reveal --------------------------------------- */
.sds-scroll-glitch {
  animation:
    sds-staticBurst 0.6s steps(1) both,
    sds-viewportRise var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
/* 97 · Flip Reveal -------------------------------------- */
.sds-scroll-flip {
  animation: sds-scrollFlip var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-scrollFlip {
  from {
    opacity: 0;
    transform: perspective(600px) rotateX(60deg) translateY(30px);
    filter: blur(4px);
  }
  to {
    opacity: 1;
    transform: perspective(600px) rotateX(0) translateY(0);
    filter: blur(0);
  }
}
/* 98 · Zoom Blur ---------------------------------------- */
.sds-scroll-zoom-blur {
  animation: sds-scrollZoomBlur 0.9s var(--sds-easing) both;
}
@keyframes sds-scrollZoomBlur {
  from {
    opacity: 0;
    transform: scale(1.3);
    filter: blur(20px);
  }
  to {
    opacity: 1;
    transform: scale(1);
    filter: blur(0);
  }
}
/* 99 · Split Reveal ------------------------------------- */
.sds-scroll-split {
  animation: sds-scrollSplit 0.9s var(--sds-easing) both;
}
@keyframes sds-scrollSplit {
  from {
    clip-path: polygon(50% 0%, 50% 0%, 50% 100%, 50% 100%);
    opacity: 0;
  }
  to {
    clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%);
    opacity: 1;
  }
}
/* 100 · Morph Rise -------------------------------------- */
.sds-scroll-morph {
  animation: sds-scrollMorph 0.9s var(--sds-easing) both;
}
@keyframes sds-scrollMorph {
  from {
    opacity: 0;
    transform: translateY(40px) skewY(4deg) scaleX(0.94);
  }
  to {
    opacity: 1;
    transform: translateY(0) skewY(0) scaleX(1);
  }
}
/* 101 · Spring ------------------------------------------ */
.sds-scroll-spring {
  animation: sds-scrollSpring 0.9s var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) both;
}
@keyframes sds-scrollSpring {
  from {
    opacity: 0;
    transform: translateY(60px) scale(0.8);
  }
  to {
    opacity: 1;
    transform: translateY(0) scale(1);
  }
}
/* 102 · Clip Left --------------------------------------- */
.sds-scroll-clip-left {
  animation: sds-scrollClipLeft var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-scrollClipLeft {
  from {
    clip-path: inset(0 0 0 100%);
    opacity: 0;
  }
  to {
    clip-path: inset(0 0 0 0%);
    opacity: 1;
  }
}
/* 103 · Clip Right -------------------------------------- */
.sds-scroll-clip-right {
  animation: sds-scrollClipRight var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-scrollClipRight {
  from {
    clip-path: inset(0 100% 0 0);
    opacity: 0;
  }
  to {
    clip-path: inset(0 0% 0 0);
    opacity: 1;
  }
}
/* 104 · Elastic ----------------------------------------- */
.sds-scroll-elastic {
  animation: sds-scrollElastic 1s var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) both;
}
@keyframes sds-scrollElastic {
  0% {
    opacity: 0;
    transform: translateY(80px) scaleY(0.6);
  }
  60% {
    opacity: 1;
    transform: translateY(-8px) scaleY(1.08);
  }
  80% {
    transform: translateY(3px) scaleY(0.97);
  }
  100% {
    opacity: 1;
    transform: translateY(0) scaleY(1);
  }
}
/* 105 · Cinema ------------------------------------------ */
.sds-scroll-cinema {
  animation: sds-scrollCinema 1.2s var(--sds-easing) both;
}
@keyframes sds-scrollCinema {
  from {
    opacity: 0;
    letter-spacing: 0.4em;
    transform: scale(0.85);
    filter: blur(12px);
  }
  to {
    opacity: 1;
    letter-spacing: 0;
    transform: scale(1);
    filter: blur(0);
  }
}
/* 106 · Fog --------------------------------------------- */
.sds-scroll-fog {
  animation: sds-scrollFog 1.2s ease both;
}
@keyframes sds-scrollFog {
  from {
    opacity: 0;
    filter: blur(30px) brightness(2);
    transform: scale(1.1);
  }
  to {
    opacity: 1;
    filter: blur(0) brightness(1);
    transform: scale(1);
  }
}
/* 107 · Neon Reveal ------------------------------------- */
.sds-scroll-neon {
  animation: sds-scrollNeon 1s var(--sds-easing) both;
}
@keyframes sds-scrollNeon {
  0% {
    opacity: 0;
    text-shadow: 0 0 0 var(--sds-primary);
    transform: translateY(20px);
  }
  60% {
    opacity: 1;
    text-shadow:
      0 0 20px var(--sds-primary-glow),
      0 0 40px var(--sds-primary-dim);
    transform: translateY(-3px);
  }
  100% {
    opacity: 1;
    text-shadow: none;
    transform: translateY(0);
  }
}
/* 108 · Prism Reveal ------------------------------------ */
.sds-scroll-prism {
  animation: sds-scrollPrism 1s var(--sds-easing) both;
}
@keyframes sds-scrollPrism {
  0% {
    opacity: 0;
    filter: hue-rotate(180deg) blur(8px) brightness(2);
    transform: scale(0.9);
  }
  60% {
    opacity: 1;
    filter: hue-rotate(30deg) blur(0) brightness(1.1);
    transform: scale(1.02);
  }
  100% {
    opacity: 1;
    filter: hue-rotate(0deg) blur(0) brightness(1);
    transform: scale(1);
  }
}
/* 109 · Charge Reveal ----------------------------------- */
.sds-scroll-charge {
  animation: sds-scrollCharge var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-scrollCharge {
  0% {
    opacity: 0;
    transform: translateY(30px);
    filter: brightness(3) blur(6px);
  }
  50% {
    opacity: 1;
    transform: translateY(-4px);
    filter: brightness(1.4) blur(0);
  }
  100% {
    opacity: 1;
    transform: translateY(0);
    filter: brightness(1);
  }
}
/* 110 · Magnetic Pull ----------------------------------- */
.sds-scroll-magnetic {
  animation: sds-scrollMagnetic 0.9s var(--sds-ease-decelerate, cubic-bezier(0.16, 1, 0.3, 1)) both;
}
@keyframes sds-scrollMagnetic {
  0% {
    opacity: 0;
    transform: scale(1.2) translateY(-20px);
    filter: blur(8px);
  }
  60% {
    opacity: 1;
    transform: scale(0.98) translateY(3px);
    filter: blur(0);
  }
  100% {
    opacity: 1;
    transform: scale(1) translateY(0);
  }
}
/* 111 · Wave Rise --------------------------------------- */
.sds-scroll-wave-rise > * {
  animation: sds-viewportRise 0.7s var(--sds-easing) both;
}
.sds-scroll-wave-rise > *:nth-child(1) {
  animation-delay: 0s;
}
.sds-scroll-wave-rise > *:nth-child(2) {
  animation-delay: 0.08s;
}
.sds-scroll-wave-rise > *:nth-child(3) {
  animation-delay: 0.16s;
}
.sds-scroll-wave-rise > *:nth-child(4) {
  animation-delay: 0.24s;
}
.sds-scroll-wave-rise > *:nth-child(5) {
  animation-delay: 0.32s;
}
.sds-scroll-wave-rise > *:nth-child(6) {
  animation-delay: 0.4s;
}
.sds-scroll-wave-rise > *:nth-child(7) {
  animation-delay: 0.48s;
}
.sds-scroll-wave-rise > *:nth-child(8) {
  animation-delay: 0.56s;
}
.sds-scroll-wave-rise > *:nth-child(9) {
  animation-delay: 0.64s;
}
.sds-scroll-wave-rise > *:nth-child(10) {
  animation-delay: 0.72s;
}
.sds-scroll-wave-rise > *:nth-child(11) {
  animation-delay: 0.8s;
}
.sds-scroll-wave-rise > *:nth-child(12) {
  animation-delay: 0.88s;
}
/* 112 · Dissolve ---------------------------------------- */
.sds-scroll-dissolve {
  animation: sds-scrollDissolve 1s ease both;
}
@keyframes sds-scrollDissolve {
  0% {
    opacity: 0;
    filter: blur(16px) saturate(0);
    transform: scale(1.05);
  }
  60% {
    opacity: 1;
    filter: blur(2px) saturate(0.6);
    transform: scale(1.01);
  }
  100% {
    opacity: 1;
    filter: blur(0) saturate(1);
    transform: scale(1);
  }
}
/* 113 · Unfold ------------------------------------------ */
.sds-scroll-unfold {
  will-change: transform, opacity;
  transform-origin: top center;
  animation: sds-scrollUnfold var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-scrollUnfold {
  from {
    opacity: 0;
    transform: perspective(500px) rotateX(-70deg) scaleY(0.6);
  }
  to {
    opacity: 1;
    transform: perspective(500px) rotateX(0) scaleY(1);
  }
}
/* 114 · Perspective Left -------------------------------- */
.sds-scroll-perspective-left {
  animation: sds-scrollPerspLeft var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-scrollPerspLeft {
  from {
    opacity: 0;
    transform: perspective(600px) rotateY(-50deg) translateX(-30px);
  }
  to {
    opacity: 1;
    transform: perspective(600px) rotateY(0) translateX(0);
  }
}
/* 115 · Bounce ------------------------------------------ */
.sds-scroll-bounce {
  animation: sds-scrollBounce 0.9s var(--sds-ease-emphasized, cubic-bezier(0.215, 0.61, 0.355, 1)) both;
}
@keyframes sds-scrollBounce {
  0% {
    opacity: 0;
    transform: translateY(70px);
  }
  60% {
    opacity: 1;
    transform: translateY(-16px);
  }
  78% {
    transform: translateY(8px);
  }
  90% {
    transform: translateY(-4px);
  }
  100% {
    opacity: 1;
    transform: translateY(0);
  }
}
/* 116 · Ink --------------------------------------------- */
.sds-scroll-ink {
  animation: sds-scrollInk 1s var(--sds-easing) both;
}
@keyframes sds-scrollInk {
  from {
    clip-path: circle(0% at 0% 50%);
    opacity: 0;
  }
  to {
    clip-path: circle(150% at 0% 50%);
    opacity: 1;
  }
}
/* 117 · Snap -------------------------------------------- */
.sds-scroll-snap {
  animation: sds-scrollSnap 0.5s var(--sds-ease-bounce, cubic-bezier(0.68, -0.55, 0.27, 1.55)) both;
}
@keyframes sds-scrollSnap {
  0% {
    opacity: 0;
    transform: scale(1.25) rotate(3deg);
  }
  60% {
    opacity: 1;
    transform: scale(0.95) rotate(-1deg);
  }
  80% {
    transform: scale(1.03) rotate(0.5deg);
  }
  100% {
    opacity: 1;
    transform: scale(1) rotate(0);
  }
}
/* 118 · Spiral ------------------------------------------ */
.sds-scroll-spiral {
  animation: sds-scrollSpiral 0.9s var(--sds-easing) both;
}
@keyframes sds-scrollSpiral {
  0% {
    opacity: 0;
    transform: rotate(-180deg) scale(0.3);
    filter: blur(12px);
  }
  60% {
    opacity: 1;
    transform: rotate(8deg) scale(1.04);
    filter: blur(0);
  }
  80% {
    transform: rotate(-3deg) scale(0.98);
  }
  100% {
    opacity: 1;
    transform: rotate(0) scale(1);
  }
}
/* 119 · Vortex ------------------------------------------ */
.sds-scroll-vortex {
  animation: sds-scrollVortex var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-scrollVortex {
  0% {
    opacity: 0;
    transform: perspective(400px) translateZ(-200px) rotate(-20deg) scale(0.5);
    filter: blur(16px);
  }
  60% {
    opacity: 1;
    transform: perspective(400px) translateZ(8px) rotate(4deg) scale(1.03);
    filter: blur(0);
  }
  100% {
    opacity: 1;
    transform: perspective(400px) translateZ(0) rotate(0) scale(1);
  }
}
/* 120 · Skew -------------------------------------------- */
.sds-scroll-skew {
  animation: sds-scrollSkew var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-scrollSkew {
  from {
    opacity: 0;
    transform: translateX(-40px) skewX(-12deg) scaleX(0.85);
  }
  to {
    opacity: 1;
    transform: translateX(0) skewX(0) scaleX(1);
  }
}
/* 121 · Punch ------------------------------------------- */
.sds-scroll-punch {
  animation: sds-scrollPunch 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) both;
}
@keyframes sds-scrollPunch {
  0% {
    opacity: 0;
    transform: scale(0.4);
    filter: blur(16px) brightness(3);
  }
  50% {
    opacity: 1;
    transform: scale(1.1);
    filter: blur(1px) brightness(1.3);
  }
  70% {
    transform: scale(0.96);
    filter: blur(0);
  }
  100% {
    opacity: 1;
    transform: scale(1);
    filter: brightness(1);
  }
}
/* 122 · Crystallize ------------------------------------- */
.sds-scroll-crystallize {
  animation: sds-scrollCrystallize 1s ease both;
}
@keyframes sds-scrollCrystallize {
  0% {
    opacity: 0;
    filter: blur(20px) brightness(2) contrast(0.5);
    transform: scale(0.95);
  }
  40% {
    opacity: 1;
    filter: blur(4px) brightness(1.3) contrast(0.8);
    transform: scale(1.02);
  }
  100% {
    opacity: 1;
    filter: blur(0) brightness(1) contrast(1);
    transform: scale(1);
  }
}
/* 123 · Cascade (up to 12 children) -------------------- */
.sds-scroll-cascade > * {
  animation: sds-scrollCascadeChild 0.6s var(--sds-easing) both;
}
.sds-scroll-cascade > *:nth-child(1) {
  animation-delay: 0s;
}
.sds-scroll-cascade > *:nth-child(2) {
  animation-delay: 0.08s;
}
.sds-scroll-cascade > *:nth-child(3) {
  animation-delay: 0.16s;
}
.sds-scroll-cascade > *:nth-child(4) {
  animation-delay: 0.24s;
}
.sds-scroll-cascade > *:nth-child(5) {
  animation-delay: 0.32s;
}
.sds-scroll-cascade > *:nth-child(6) {
  animation-delay: 0.4s;
}
.sds-scroll-cascade > *:nth-child(7) {
  animation-delay: 0.48s;
}
.sds-scroll-cascade > *:nth-child(8) {
  animation-delay: 0.56s;
}
.sds-scroll-cascade > *:nth-child(9) {
  animation-delay: 0.64s;
}
.sds-scroll-cascade > *:nth-child(10) {
  animation-delay: 0.72s;
}
.sds-scroll-cascade > *:nth-child(11) {
  animation-delay: 0.8s;
}
.sds-scroll-cascade > *:nth-child(12) {
  animation-delay: 0.88s;
}
@keyframes sds-scrollCascadeChild {
  from {
    opacity: 0;
    transform: translateY(30px) scale(0.9);
    filter: blur(4px);
  }
  to {
    opacity: 1;
    transform: translateY(0) scale(1);
    filter: blur(0);
  }
}
/* 124 · Hologram ---------------------------------------- */
.sds-scroll-hologram {
  animation: sds-scrollHologram 1s var(--sds-easing) both;
}
@keyframes sds-scrollHologram {
  0% {
    opacity: 0;
    transform: translateY(20px);
    filter: hue-rotate(180deg) brightness(2) blur(6px);
  }
  50% {
    opacity: 1;
    filter: hue-rotate(20deg) brightness(1.2) blur(0);
    transform: translateY(-4px);
  }
  100% {
    opacity: 1;
    filter: hue-rotate(0deg) brightness(1);
    transform: translateY(0);
  }
}
/* 125 · Drift ------------------------------------------- */
.sds-scroll-drift {
  animation: sds-scrollDrift 1.2s var(--sds-easing) both;
}
@keyframes sds-scrollDrift {
  from {
    opacity: 0;
    transform: translate(-24px, 24px) rotate(-3deg);
    filter: blur(8px);
  }
  to {
    opacity: 1;
    transform: translate(0, 0) rotate(0);
    filter: blur(0);
  }
}
/* 126 · Streak ------------------------------------------ */
.sds-scroll-streak {
  animation: sds-scrollStreak 0.7s var(--sds-ease-decelerate, cubic-bezier(0.16, 1, 0.3, 1)) both;
}
@keyframes sds-scrollStreak {
  0% {
    opacity: 0;
    transform: translateX(-200px) scaleX(3);
    filter: blur(20px);
  }
  40% {
    opacity: 1;
    filter: blur(4px);
  }
  70% {
    transform: translateX(6px) scaleX(0.98);
    filter: blur(0);
  }
  100% {
    opacity: 1;
    transform: translateX(0) scaleX(1);
  }
}
/* 127 · Elastic Pop ------------------------------------- */
.sds-scroll-elastic-pop {
  animation: sds-scrollElasticPop 0.7s var(--sds-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1)) both;
}
@keyframes sds-scrollElasticPop {
  0% {
    opacity: 0;
    transform: scale(0.4) rotate(-8deg);
  }
  60% {
    opacity: 1;
    transform: scale(1.1) rotate(3deg);
  }
  80% {
    transform: scale(0.96) rotate(-1deg);
  }
  100% {
    opacity: 1;
    transform: scale(1) rotate(0);
  }
}
/* 128 · Slide Right ------------------------------------- */
.sds-scroll-slide-right {
  animation: sds-scrollSlideRight var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-scrollSlideRight {
  from {
    opacity: 0;
    transform: translateX(60px);
  }
  70% {
    transform: translateX(-6px);
  }
  100% {
    opacity: 1;
    transform: translateX(0);
  }
}
/* 129 · Warp Enter -------------------------------------- */
.sds-scroll-warp-in {
  animation: sds-scrollWarpIn 0.9s var(--sds-easing) both;
}
@keyframes sds-scrollWarpIn {
  from {
    opacity: 0;
    transform: perspective(500px) rotateX(25deg) scaleX(0.8) translateY(40px);
    filter: blur(6px);
  }
  to {
    opacity: 1;
    transform: perspective(500px) rotateX(0) scaleX(1) translateY(0);
    filter: blur(0);
  }
}
/* 130 · Bright Flash ------------------------------------ */
.sds-scroll-flash {
  animation: sds-scrollFlash 0.7s ease both;
}
@keyframes sds-scrollFlash {
  0% {
    opacity: 0;
    filter: brightness(5) blur(12px);
    transform: scale(0.9);
  }
  30% {
    opacity: 1;
    filter: brightness(2) blur(2px);
    transform: scale(1.04);
  }
  60% {
    filter: brightness(1.2);
  }
  100% {
    opacity: 1;
    filter: brightness(1) blur(0);
    transform: scale(1);
  }
}
.sds-scroll-fade-up {
  animation: sds-viewportRise var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
/* ====================================================================
   BATCH 16 � Scroll: Clean Entrances (6) + Drama & Emphasis (6)
   ==================================================================== */
/* 131 � Zoom In ----------------------------------------- */
.sds-scroll-zoom-in {
  animation: sds-scrollZoomIn var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-scrollZoomIn {
  from {
    transform: scale(0.5);
    opacity: 0;
  }
  to {
    transform: scale(1);
    opacity: 1;
  }
}
/* 132 � Zoom Out ---------------------------------------- */
.sds-scroll-zoom-out {
  animation: sds-scrollZoomOut var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-scrollZoomOut {
  from {
    transform: scale(1.35);
    opacity: 0;
  }
  to {
    transform: scale(1);
    opacity: 1;
  }
}
/* 133 � Rotate In --------------------------------------- */
.sds-scroll-rotate-in {
  animation: sds-scrollRotateIn var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-scrollRotateIn {
  from {
    transform: rotate(-8deg) translateY(24px);
    opacity: 0;
  }
  to {
    transform: rotate(0deg) translateY(0);
    opacity: 1;
  }
}
/* 134 � Hinge In ---------------------------------------- */
.sds-scroll-hinge-in {
  animation: sds-scrollHingeIn var(--sds-duration-base, 0.8s) var(--sds-easing) both;
  transform-origin: top;
}
@keyframes sds-scrollHingeIn {
  from {
    transform: perspective(600px) rotateX(-55deg);
    opacity: 0;
  }
  to {
    transform: perspective(600px) rotateX(0deg);
    opacity: 1;
  }
}
/* 135 � Roll In ----------------------------------------- */
.sds-scroll-roll-in {
  animation: sds-scrollRollIn var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-scrollRollIn {
  from {
    transform: translateX(-60px) rotate(-10deg);
    opacity: 0;
  }
  to {
    transform: translateX(0) rotate(0deg);
    opacity: 1;
  }
}
/* 136 � Rise Right -------------------------------------- */
.sds-scroll-rise-right {
  animation: sds-scrollRiseRight var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-scrollRiseRight {
  from {
    transform: translate(-28px, 28px);
    opacity: 0;
  }
  to {
    transform: translate(0, 0);
    opacity: 1;
  }
}
/* 137 � Cinematic --------------------------------------- */
.sds-scroll-cinematic {
  animation: sds-scrollCinematic var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-scrollCinematic {
  from {
    clip-path: inset(22% 0);
    transform: scale(1.06);
    opacity: 0.5;
  }
  to {
    clip-path: inset(0% 0);
    transform: scale(1);
    opacity: 1;
  }
}
/* 138 � Kaboom ------------------------------------------ */
.sds-scroll-kaboom {
  animation: sds-scrollKaboom 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) both;
}
@keyframes sds-scrollKaboom {
  from {
    transform: scale(0);
    opacity: 0;
  }
  to {
    transform: scale(1);
    opacity: 1;
  }
}
/* 139 � Lean -------------------------------------------- */
.sds-scroll-lean {
  animation: sds-scrollLean var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-scrollLean {
  from {
    transform: perspective(400px) rotateY(-20deg) translateX(30px);
    opacity: 0;
  }
  to {
    transform: perspective(400px) rotateY(0deg) translateX(0);
    opacity: 1;
  }
}
/* 140 � Peel -------------------------------------------- */
.sds-scroll-peel {
  animation: sds-scrollPeel var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-scrollPeel {
  from {
    clip-path: polygon(0 100%, 100% 100%, 100% 100%, 0 100%);
    opacity: 0.4;
  }
  to {
    clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
    opacity: 1;
  }
}
/* 141 � Stretch ----------------------------------------- */
.sds-scroll-stretch {
  animation: sds-scrollStretchIn var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-scrollStretchIn {
  from {
    transform: scaleX(0.08) scaleY(1.3);
    opacity: 0;
  }
  55% {
    transform: scaleX(1.05) scaleY(0.94);
    opacity: 1;
  }
  to {
    transform: scaleX(1) scaleY(1);
    opacity: 1;
  }
}
/* 142 � Jello ------------------------------------------- */
.sds-scroll-jello {
  animation: sds-scrollJello 0.85s ease both;
}
@keyframes sds-scrollJello {
  0% {
    transform: scale(0) skewX(0deg);
    opacity: 0;
  }
  20% {
    transform: scale(1.1) skewX(-8deg);
    opacity: 1;
  }
  40% {
    transform: scale(0.95) skewX(5deg);
  }
  60% {
    transform: scale(1.03) skewX(-3deg);
  }
  80% {
    transform: scale(0.99) skewX(1deg);
  }
  100% {
    transform: scale(1) skewX(0deg);
    opacity: 1;
  }
}
/* ====================================================================
   BATCH 17 � Scroll: 3D Hinges (4) + Filter Reveals (4) + Clip Wipes (4)
   ==================================================================== */
/* 143 � Flip Up ----------------------------------------- */
.sds-scroll-flip-up {
  animation: sds-scrollFlipUp var(--sds-duration-base, 0.8s) var(--sds-easing) both;
  transform-origin: bottom;
}
@keyframes sds-scrollFlipUp {
  from {
    transform: perspective(600px) rotateX(50deg);
    opacity: 0;
  }
  to {
    transform: perspective(600px) rotateX(0deg);
    opacity: 1;
  }
}
/* 144 � Door Left --------------------------------------- */
.sds-scroll-door-left {
  animation: sds-scrollDoorLeft var(--sds-duration-base, 0.8s) var(--sds-easing) both;
  transform-origin: left;
}
@keyframes sds-scrollDoorLeft {
  from {
    transform: perspective(800px) rotateY(-70deg);
    opacity: 0;
  }
  to {
    transform: perspective(800px) rotateY(0deg);
    opacity: 1;
  }
}
/* 145 � Door Right -------------------------------------- */
.sds-scroll-door-right {
  animation: sds-scrollDoorRight var(--sds-duration-base, 0.8s) var(--sds-easing) both;
  transform-origin: right;
}
@keyframes sds-scrollDoorRight {
  from {
    transform: perspective(800px) rotateY(70deg);
    opacity: 0;
  }
  to {
    transform: perspective(800px) rotateY(0deg);
    opacity: 1;
  }
}
/* 146 � Barrel ------------------------------------------ */
.sds-scroll-barrel {
  animation: sds-scrollBarrel 0.9s var(--sds-easing) both;
}
@keyframes sds-scrollBarrel {
  from {
    transform: perspective(600px) rotate3d(1, 1, 0, -90deg);
    opacity: 0;
  }
  to {
    transform: perspective(600px) rotate3d(1, 1, 0, 0deg);
    opacity: 1;
  }
}
/* 147 � Saturate ---------------------------------------- */
.sds-scroll-saturate {
  animation: sds-scrollSaturate var(--sds-duration-base, 0.8s) ease-out both;
}
@keyframes sds-scrollSaturate {
  from {
    filter: saturate(0);
    opacity: 0;
    transform: scale(0.98);
  }
  to {
    filter: saturate(1);
    opacity: 1;
    transform: scale(1);
  }
}
/* 148 � Sepia ------------------------------------------- */
.sds-scroll-sepia {
  animation: sds-scrollSepia var(--sds-duration-base, 0.8s) ease-out both;
}
@keyframes sds-scrollSepia {
  from {
    filter: sepia(1) contrast(0.9);
    opacity: 0;
    transform: scale(0.98);
  }
  to {
    filter: sepia(0) contrast(1);
    opacity: 1;
    transform: scale(1);
  }
}
/* 149 � Overexpose -------------------------------------- */
.sds-scroll-overexpose {
  animation: sds-scrollOverexpose var(--sds-duration-base, 0.8s) ease-out both;
}
@keyframes sds-scrollOverexpose {
  from {
    filter: brightness(4) contrast(0.55);
    opacity: 0.3;
  }
  50% {
    filter: brightness(1.4) contrast(0.9);
    opacity: 0.9;
  }
  to {
    filter: brightness(1) contrast(1);
    opacity: 1;
  }
}
/* 150 � Thermal ----------------------------------------- */
.sds-scroll-thermal {
  animation: sds-scrollThermal var(--sds-duration-base, 0.8s) ease-out both;
}
@keyframes sds-scrollThermal {
  from {
    filter: hue-rotate(120deg) saturate(3);
    opacity: 0;
  }
  45% {
    filter: hue-rotate(40deg) saturate(1.6);
    opacity: 0.85;
  }
  to {
    filter: hue-rotate(0deg) saturate(1);
    opacity: 1;
  }
}
/* 151 � Iris -------------------------------------------- */
.sds-scroll-iris {
  animation: sds-scrollIris var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-scrollIris {
  from {
    clip-path: circle(0% at 50% 50%);
    opacity: 0.6;
  }
  to {
    clip-path: circle(150% at 50% 50%);
    opacity: 1;
  }
}
/* 152 � Wipe Up ----------------------------------------- */
.sds-scroll-wipe-up {
  animation: sds-scrollWipeUp var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-scrollWipeUp {
  from {
    clip-path: inset(100% 0 0 0);
    opacity: 0.7;
  }
  to {
    clip-path: inset(0% 0 0 0);
    opacity: 1;
  }
}
/* 153 � Wipe Right -------------------------------------- */
.sds-scroll-wipe-right {
  animation: sds-scrollWipeRight var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-scrollWipeRight {
  from {
    clip-path: inset(0 100% 0 0);
    opacity: 0.7;
  }
  to {
    clip-path: inset(0 0% 0 0);
    opacity: 1;
  }
}
/* 154 � Drop In ----------------------------------------- */
.sds-scroll-drop-in {
  animation: sds-scrollDropIn var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-scrollDropIn {
  0% {
    transform: translateY(-60px) scaleY(0.8);
    opacity: 0;
  }
  65% {
    transform: translateY(8px) scaleY(1.04);
    opacity: 1;
  }
  82% {
    transform: translateY(-3px) scaleY(0.98);
  }
  100% {
    transform: translateY(0) scaleY(1);
    opacity: 1;
  }
}
/* ====================================================================
   BATCH 18 � Scroll: Subtle Motion (5) + Stagger (2) + Kinetic (4)
   ==================================================================== */
/* 155 � Float ------------------------------------------- */
.sds-scroll-float {
  animation: sds-scrollFloat 1.2s cubic-bezier(0.2, 0, 0, 1) both;
}
@keyframes sds-scrollFloat {
  from {
    transform: translateY(6px);
    opacity: 0;
    filter: blur(2px);
  }
  to {
    transform: translateY(0);
    opacity: 1;
    filter: blur(0);
  }
}
/* 156 � Sink -------------------------------------------- */
.sds-scroll-sink {
  animation: sds-scrollSink var(--sds-duration-base, 0.8s) var(--sds-easing) both;
}
@keyframes sds-scrollSink {
  from {
    transform: translateY(-18px) scale(1.02);
    opacity: 0;
  }
  to {
    transform: translateY(0) scale(1);
    opacity: 1;
  }
}
/* 157 � Shudder ----------------------------------------- */
.sds-scroll-shudder {
  animation: sds-scrollShudder 0.7s ease both;
}
@keyframes sds-scrollShudder {
  0%   { transform: translateX(-8px) scaleX(0.92); opacity: 0; }
  15%  { transform: translateX(6px) scaleX(1.04); opacity: 0.8; }
  30%  { transform: translateX(-5px) scaleX(0.97); opacity: 1; }
  50%  { transform: translateX(3px); }
  65%  { transform: translateX(-2px); }
  80%  { transform: translateX(1px); }
  100% { transform: translateX(0); opacity: 1; }
}
/* 158 � Spin Y ------------------------------------------ */
.sds-scroll-spin-y {
  animation: sds-scrollSpinY 0.9s var(--sds-easing) both;
}
@keyframes sds-scrollSpinY {
  from {
    transform: perspective(500px) rotateY(-180deg);
    opacity: 0;
  }
  to {
    transform: perspective(500px) rotateY(0deg);
    opacity: 1;
  }
}
/* 159 � Rubber Band ------------------------------------- */
.sds-scroll-rubber-band {
  animation: sds-scrollRubberBand 0.8s ease both;
}
@keyframes sds-scrollRubberBand {
  0%   { transform: scaleX(0.5) scaleY(1.3); opacity: 0; }
  25%  { transform: scaleX(1.2) scaleY(0.82); opacity: 1; }
  45%  { transform: scaleX(0.9) scaleY(1.1); }
  65%  { transform: scaleX(1.06) scaleY(0.96); }
  80%  { transform: scaleX(0.98) scaleY(1.02); }
  100% { transform: scaleX(1) scaleY(1); opacity: 1; }
}
/* 160 � Stagger Fade � children fade in sequence (requiresChildren) */
.sds-scroll-stagger-fade > * {
  animation: sds-scrollStaggerFadeChild 0.5s ease both;
}
.sds-scroll-stagger-fade > *:nth-child(2) { animation-delay: .1s; }
.sds-scroll-stagger-fade > *:nth-child(3) { animation-delay: .2s; }
.sds-scroll-stagger-fade > *:nth-child(4) { animation-delay: .3s; }
.sds-scroll-stagger-fade > *:nth-child(5) { animation-delay: .4s; }
.sds-scroll-stagger-fade > *:nth-child(6) { animation-delay: .5s; }
@keyframes sds-scrollStaggerFadeChild {
  from { opacity: 0; }
  to   { opacity: 1; }
}
/* 161 � Stagger Rise � children rise up in sequence (requiresChildren) */
.sds-scroll-stagger-rise > * {
  animation: sds-scrollStaggerRiseChild 0.6s var(--sds-easing) both;
}
.sds-scroll-stagger-rise > *:nth-child(2) { animation-delay: .1s; }
.sds-scroll-stagger-rise > *:nth-child(3) { animation-delay: .2s; }
.sds-scroll-stagger-rise > *:nth-child(4) { animation-delay: .3s; }
.sds-scroll-stagger-rise > *:nth-child(5) { animation-delay: .4s; }
.sds-scroll-stagger-rise > *:nth-child(6) { animation-delay: .5s; }
@keyframes sds-scrollStaggerRiseChild {
  from { transform: translateY(20px); opacity: 0; }
  to   { transform: translateY(0); opacity: 1; }
}
/* 162 � Glare ------------------------------------------- */
.sds-scroll-glare {
  animation: sds-scrollGlare 0.7s ease-out both;
}
@keyframes sds-scrollGlare {
  0%   { filter: brightness(3.5) contrast(0.5); opacity: 0; transform: scale(1.06); }
  40%  { filter: brightness(1.3) contrast(0.9); opacity: 1; }
  100% { filter: brightness(1) contrast(1); transform: scale(1); opacity: 1; }
}
/* 163 � Skid In ----------------------------------------- */
.sds-scroll-skid-in {
  animation: sds-scrollSkidIn 0.7s cubic-bezier(0.2, 0, 0.3, 1) both;
}
@keyframes sds-scrollSkidIn {
  0%   { transform: translateX(80px); opacity: 0; }
  60%  { transform: translateX(-12px); opacity: 1; }
  80%  { transform: translateX(6px); }
  100% { transform: translateX(0); opacity: 1; }
}
/* 164 � Slingshot --------------------------------------- */
.sds-scroll-slingshot {
  animation: sds-scrollSlingshot 0.8s cubic-bezier(0.34, 1.56, 0.64, 1) both;
}
@keyframes sds-scrollSlingshot {
  0%   { transform: translateX(-40px) scaleX(0.6); opacity: 0; }
  50%  { transform: translateX(12px) scaleX(1.08); opacity: 1; }
  75%  { transform: translateX(-4px) scaleX(0.97); }
  100% { transform: translateX(0) scaleX(1); opacity: 1; }
}
/* 165 � Blink In ---------------------------------------- */
.sds-scroll-blink-in {
  animation: sds-scrollBlinkIn 0.8s linear both;
}
@keyframes sds-scrollBlinkIn {
  0%,19%  { opacity: 0; }
  20%,39% { opacity: 0.3; }
  40%,59% { opacity: 0.6; }
  60%,79% { opacity: 0.85; }
  80%,100% { opacity: 1; }
}
/* ====================================================================
   BATCH 19 � Scroll: Stagger (1) + Reveal FX (5) + Character (5)
   scroll complete at 100/100
   ==================================================================== */
/* 166 � Stagger Slide � children slide from left in sequence (requiresChildren) */
.sds-scroll-stagger-slide > * {
  animation: sds-scrollStaggerSlideChild 0.6s var(--sds-easing) both;
}
.sds-scroll-stagger-slide > *:nth-child(2) { animation-delay: .1s; }
.sds-scroll-stagger-slide > *:nth-child(3) { animation-delay: .2s; }
.sds-scroll-stagger-slide > *:nth-child(4) { animation-delay: .3s; }
.sds-scroll-stagger-slide > *:nth-child(5) { animation-delay: .4s; }
.sds-scroll-stagger-slide > *:nth-child(6) { animation-delay: .5s; }
@keyframes sds-scrollStaggerSlideChild {
  from { transform: translateX(-24px); opacity: 0; }
  to   { transform: translateX(0); opacity: 1; }
}
/* 167 � Neon Pop ---------------------------------------- */
.sds-scroll-neon-pop {
  animation: sds-scrollNeonPop 0.7s ease-out both;
}
@keyframes sds-scrollNeonPop {
  0%   { transform: scale(0.8); opacity: 0; filter: drop-shadow(0 0 0px currentColor); }
  55%  { transform: scale(1.05); opacity: 1; filter: drop-shadow(0 0 14px currentColor); }
  100% { transform: scale(1); opacity: 1; filter: drop-shadow(0 0 4px currentColor); }
}
/* 168 � Pixel In ---------------------------------------- */
.sds-scroll-pixel-in {
  animation: sds-scrollPixelIn 0.8s ease-out both;
}
@keyframes sds-scrollPixelIn {
  from {
    filter: blur(16px);
    transform: scale(1.08);
    opacity: 0.4;
  }
  to {
    filter: blur(0);
    transform: scale(1);
    opacity: 1;
  }
}
/* 169 � Tidal ------------------------------------------- */
.sds-scroll-tidal {
  animation: sds-scrollTidal 0.9s ease both;
}
@keyframes sds-scrollTidal {
  0%   { transform: translateX(-30px); opacity: 0; }
  40%  { transform: translateX(10px); opacity: 1; }
  60%  { transform: translateX(-6px); }
  75%  { transform: translateX(3px); }
  88%  { transform: translateX(-1px); }
  100% { transform: translateX(0); opacity: 1; }
}
/* 170 � Materialize ------------------------------------- */
.sds-scroll-materialize {
  animation: sds-scrollMaterialize 1s steps(4, end) both;
}
@keyframes sds-scrollMaterialize {
  0%   { opacity: 0;    transform: scale(0.9);  filter: blur(8px); }
  25%  { opacity: 0.25; transform: scale(0.93); filter: blur(6px); }
  50%  { opacity: 0.5;  transform: scale(0.96); filter: blur(3px); }
  75%  { opacity: 0.8;  transform: scale(0.99); filter: blur(1px); }
  100% { opacity: 1;    transform: scale(1);    filter: blur(0); }
}
/* 171 � Exhale ------------------------------------------ */
.sds-scroll-exhale {
  animation: sds-scrollExhale 1s cubic-bezier(0.2, 0, 0, 1) both;
}
@keyframes sds-scrollExhale {
  from {
    transform: scale(1.12);
    opacity: 0.6;
  }
  to {
    transform: scale(1);
    opacity: 1;
  }
}
/* 172 � Typewriter -------------------------------------- */
.sds-scroll-typewriter {
  animation: sds-scrollTypewriter 0.9s steps(14, end) both;
}
@keyframes sds-scrollTypewriter {
  from { clip-path: inset(0 100% 0 0); }
  to   { clip-path: inset(0 0% 0 0); }
}
/* 173 � Glitch In --------------------------------------- */
.sds-scroll-glitch-in {
  animation: sds-scrollGlitchIn 0.7s ease-out both;
}
@keyframes sds-scrollGlitchIn {
  0%   { transform: translateX(-6px); opacity: 0; filter: hue-rotate(90deg); clip-path: inset(40% 0 10% 0); }
  20%  { transform: translateX(4px);  opacity: 0.6; filter: hue-rotate(-40deg); clip-path: inset(5% 0 30% 0); }
  40%  { transform: translateX(-2px); opacity: 0.85; clip-path: inset(0 0 0 0); filter: hue-rotate(15deg); }
  65%  { transform: translateX(1px); filter: hue-rotate(0deg); }
  100% { transform: translateX(0); opacity: 1; filter: hue-rotate(0deg); clip-path: inset(0 0 0 0); }
}
/* 174 � Unfurl ------------------------------------------ */
.sds-scroll-unfurl {
  animation: sds-scrollUnfurl var(--sds-duration-base, 0.8s) var(--sds-easing) both;
  transform-origin: top left;
}
@keyframes sds-scrollUnfurl {
  from {
    transform: rotate(-12deg) translate(-20px, -20px) scale(0.8);
    opacity: 0;
  }
  60% {
    transform: rotate(3deg) translate(5px, 5px) scale(1.02);
    opacity: 1;
  }
  100% {
    transform: rotate(0deg) translate(0, 0) scale(1);
    opacity: 1;
  }
}
/* 175 � Pop In ------------------------------------------ */
.sds-scroll-pop-in {
  animation: sds-scrollPopIn 0.65s ease both;
}
@keyframes sds-scrollPopIn {
  0%   { transform: scale(0); opacity: 0; }
  55%  { transform: scale(1.15); opacity: 1; }
  75%  { transform: scale(0.94); }
  90%  { transform: scale(1.04); }
  100% { transform: scale(1); opacity: 1; }
}
/* 176 � Contrast In ------------------------------------- */
.sds-scroll-contrast-in {
  animation: sds-scrollContrastIn 0.8s ease-out both;
}
@keyframes sds-scrollContrastIn {
  from {
    filter: contrast(3) brightness(0.6);
    opacity: 0;
    transform: scale(0.97);
  }
  50% {
    filter: contrast(1.4) brightness(0.9);
    opacity: 0.9;
  }
  to {
    filter: contrast(1) brightness(1);
    opacity: 1;
    transform: scale(1);
  }
}
