/* GENERATED from packages/design-tokens — DO NOT EDIT. Run: make sync-tokens */
/* csplog shared keyframes — SINGLE SOURCE OF TRUTH.
 *
 * Only hand-edited copy. Per-app copies are generated by `make sync-tokens`.
 * @keyframes can't be CSS variables, so what motion the brand has lives here as
 * real CSS that both consumers import. The dashboard names it as an `animation:`
 * utility in the @theme block of resources/css/app.css; the keyframe itself
 * resolves from this file.
 *
 * There are three. The system's *interaction* vocabulary is colour, not movement
 * (ADR-0052); a keyframe earns its place only where something is in a state —
 * arriving, or working. `blinkLook` animated the logo's eyes, which neither
 * surface draws any more, and `pulseDot` never had a caller at all.
 */

/* Dialog entrance — fade + rise. The one place something moves, because a
 * dialog arriving instantly reads as a rendering fault rather than a response.
 * Components/ui/dialog/Dialog.vue, via the animate-reveal-up utility. */
@keyframes revealUp {
  from { opacity: 0; transform: translateY(16px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* Scan pending — an indeterminate progress rule under the scan form. The
 * scanner fetches a third-party site before the next page can render, which the
 * hero itself advertises as ~5 seconds; a static label cannot say "still
 * working". A CSS animation rather than JS because the page is navigating while
 * this runs, and a main-thread animation drops frames exactly when this is the
 * only thing on screen.
 *
 * The bar is 40% of the track and travels 150% of its own width, so it reaches
 * the right edge and no further — which is what lets it sweep without a
 * clipping ancestor, and is why it alternates rather than looping one way.
 * Constant-speed on purpose: this reads as an instrument sweeping, not as an
 * interface easing. csp-marketing/src/components.css, .scan-form.is-scanning. */
@keyframes scanSweep {
  from { transform: translateX(0); }
  to   { transform: translateX(150%); }
}

/* Waiting — a ring that grows out of an ink dot and fades. The project page's
 * phase bar marks a phase where csplog is the one waiting (first reports, a
 * clean week) with it, so "nothing for you, we are on it" reads as working and
 * not as stalled. transform and opacity only. Reduced motion keeps the dot and
 * drops the ring; the words beside it say the same thing.
 * csp-dashboard/resources/css/app.css, csplog-wait-dot. */
@keyframes waitPulse {
  from { transform: scale(1); opacity: 0.55; }
  to   { transform: scale(2.8); opacity: 0; }
}
