:root {
  --sigvelo-duration-reduced: 100ms;
  --sigvelo-duration-fast: 150ms;
  --sigvelo-duration-medium: 240ms;
  --sigvelo-duration-slow: 360ms;

  --sigvelo-ease-standard: cubic-bezier(0.2, 0, 0, 1);
  --sigvelo-ease-emphasized: cubic-bezier(0.16, 1, 0.3, 1);
  --sigvelo-ease-accelerate: cubic-bezier(0.4, 0, 1, 1);
  /* Nearly all of the distance in the first third, then a long settle. Reads
     as responsive on entrances that also move a long way. */
  --sigvelo-ease-snappy: cubic-bezier(0.23, 1, 0.32, 1);
  /* Press and release. A damped spring settling in three shrinking bounces —
     a cubic-bezier can only overshoot once, which reads as a wobble rather
     than a physical button. Keep it on transform; on color it just looks slow. */
  --sigvelo-ease-press: linear(
    0,
    0.3505,
    0.7432,
    0.9336,
    0.9951,
    1.0062,
    1.0045,
    1.0019,
    1.0005,
    1
  );

  /* Semantic motion roles keep component families on one quiet rhythm. */
  --sigvelo-motion-duration-interaction: var(--sigvelo-duration-fast);
  --sigvelo-motion-duration-presence: var(--sigvelo-duration-fast);
  --sigvelo-motion-duration-disclosure: var(--sigvelo-duration-medium);
  --sigvelo-motion-duration-layout: var(--sigvelo-duration-slow);
  /* Looping "busy/streaming" text shimmer sweep. Not reduced with the
     interaction scale — reduced motion turns the shimmer off entirely. */
  --sigvelo-motion-duration-shimmer: 2400ms;
  /* Breathing rate of a live-state indicator. Slower than a heartbeat on
     purpose: fast enough to read as ongoing, slow enough to sit at the edge of
     vision for minutes without demanding attention. Like the shimmer, reduced
     motion switches it off rather than shortening it. */
  --sigvelo-motion-duration-pulse: 1400ms;
  /* One full turn of a spinner. A loop rate, not a transition duration: the
     transition scale tops out at 360ms, which as a rotation period is a blur —
     which is why every surface that wanted a spinner used to write its own
     literal instead of the shared class. */
  --sigvelo-motion-duration-spin: 900ms;

  --sigvelo-motion-ease-enter: var(--sigvelo-ease-emphasized);
  --sigvelo-motion-ease-exit: var(--sigvelo-ease-accelerate);
  --sigvelo-motion-ease-change: var(--sigvelo-ease-standard);

  /* Delay between neighbours in a revealed list, so a group of rows arrives
     as a sequence instead of a single block. Keep the total under ~200ms. */
  --sigvelo-motion-stagger-step: 35ms;

  --sigvelo-motion-distance-xs: 1px;
  --sigvelo-motion-distance-sm: 4px;
  --sigvelo-motion-distance-md: 8px;
  --sigvelo-motion-presence-scale: 0.98;
}

@media (prefers-reduced-motion: reduce) {
  :root {
    --sigvelo-duration-fast: var(--sigvelo-duration-reduced);
    --sigvelo-duration-medium: var(--sigvelo-duration-reduced);
    --sigvelo-duration-slow: var(--sigvelo-duration-reduced);
  }
}

:root[data-motion="reduce"] {
  --sigvelo-duration-fast: var(--sigvelo-duration-reduced);
  --sigvelo-duration-medium: var(--sigvelo-duration-reduced);
  --sigvelo-duration-slow: var(--sigvelo-duration-reduced);
}
