/* OMHM motion tokens (batch 41, 2026-10-04). The one shared file for site motion numbers.
   Source: handoff R2 sections 5 and 7, ruling "Bright and still". Every motion rule that ships reads these properties, so a timing changes in one place.
   Rules that never change: transform, translate, opacity and filter on decorative or isolated layers only, never a layout property; no visible control;
   reduced motion means static; the root plaid never moves. */
:root{
  /* Hero art: one upward float, 24 to 40px over 850 to 1100ms, ease-out. */
  --om41-hero-float-y:32px;
  --om41-hero-float-ms:950ms;
  --om41-hero-float-ease:cubic-bezier(0,0,.2,1);
  /* Section entrance: rise 12 to 20px, 450 to 650ms, once. The blur is the batch 33 value, kept. */
  --om41-enter-y:16px;
  --om41-enter-ms:550ms;
  --om41-enter-ease:cubic-bezier(.2,.7,.2,1);
  --om41-enter-blur:6px;
  /* Related cards: 60 to 90ms between cards, capped at 240ms across a group. */
  --om41-stagger-ms:80ms;
  --om41-stagger-cap-ms:240ms;
  /* Photo change: 350 to 550ms crossfade, 6 to 8 seconds between changes. */
  --om41-crossfade-ms:450ms;
  --om41-photo-hold-ms:7000ms;
  /* Hover and focus response: 160 to 220ms, lift 2 to 4px. */
  --om41-hover-ms:180ms;
  --om41-hover-lift:2px;
  /* Accordion 180 to 260ms, modal 180 to 240ms. */
  --om41-accordion-ms:220ms;
  --om41-modal-ms:200ms;
  /* Tree plate drift: 6 to 12px travel on the plate image only, slow and calm (the plain plaid is stationary). */
  --om41-drift-px:10px;
  --om41-drift-ms:16000ms;
}

/* ---------- Reveal: batch 33 (data-reveal) reads the tokens ---------- */
html.rv33-js [data-reveal]:not([data-reveal="group"]):not(.is-in),
html.rv33-js [data-reveal-child]{translate:0 var(--om41-enter-y);filter:blur(var(--om41-enter-blur))}
html.rv33-js body.om-mvp [data-reveal].is-in:not([data-reveal="group"]),
html.rv33-js body.om-mvp [data-reveal].is-in [data-reveal-child]{
  transition:opacity var(--om41-enter-ms) var(--om41-enter-ease) var(--rv33-d,0ms),translate var(--om41-enter-ms) var(--om41-enter-ease) var(--rv33-d,0ms),filter var(--om41-enter-ms) var(--om41-enter-ease) var(--rv33-d,0ms),
    transform var(--om41-hover-ms) ease,box-shadow var(--om41-hover-ms) ease,background-color var(--om41-hover-ms) ease,border-color var(--om41-hover-ms) ease;
}
html.rv33-js body.om-mvp [data-reveal].is-in [data-reveal-child]{opacity:1;translate:0 0;filter:none}
[data-reveal],[data-reveal-child]{--rv33-d:min(calc(var(--rv33-i) * var(--om41-stagger-ms)),var(--om41-stagger-cap-ms))}
/* ---------- Reveal: the Guide copy of the same system (batch 31, data-gd31) reads the same tokens ---------- */
html.gd31-js [data-gd31]{--gd31-rv:opacity var(--om41-enter-ms) var(--om41-enter-ease) var(--gd31-d,0ms),translate var(--om41-enter-ms) var(--om41-enter-ease) var(--gd31-d,0ms),filter var(--om41-enter-ms) var(--om41-enter-ease) var(--gd31-d,0ms);translate:0 var(--om41-enter-y);filter:blur(var(--om41-enter-blur))}
html.gd31-js [data-gd31].is-in{translate:0 0;filter:none}
.editorial-choices>[data-gd31]{--gd31-d:min(calc(var(--gd31-i,0) * var(--om41-stagger-ms)),var(--om41-stagger-cap-ms))}
.gd20-entrance>[data-gd31]{--gd31-d:min(calc(var(--gd31-i,0) * var(--om41-stagger-ms)),var(--om41-stagger-cap-ms))}
.gd30-fan>[data-gd31]{--gd31-d:min(calc(var(--gd31-i,0) * var(--om41-stagger-ms)),var(--om41-stagger-cap-ms))}
html.gd31-js :is(.gd20-photo,.gd30-fan figure)[data-gd31]{transition:var(--gd31-rv),transform var(--om41-hover-ms) ease}

/* ---------- Hover: the batch 33 button family, the Guide copy of it (batch 31) and the ticket comparison choice read the hover tokens ----------
   Only where motion is allowed, so the reduced motion rules of the older sheets keep their static state. */
@media(prefers-reduced-motion:no-preference){
  body.om-mvp :is(.om-btn--primary,.om-btn--secondary,.om-btn-primary,.om-btn-secondary,.journey-button,.ticket-action,.hm12-btn,.album-gift-browse,.om-site-call-button,.om17-btn,.om17-btn-secondary,.editorial-actions a){transition:transform var(--om41-hover-ms) ease,box-shadow var(--om41-hover-ms) ease!important}
  body.om-mvp :is(.om-btn--primary,.om-btn--secondary,.om-btn-primary,.om-btn-secondary,.journey-button,.ticket-action,.hm12-btn,.album-gift-browse,.om-site-call-button,.om17-btn,.om17-btn-secondary,.editorial-actions a):hover{transform:translateY(calc(var(--om41-hover-lift) * -1))!important}
  body.om-mvp .ticket-comparison-choice:hover{transform:translateY(calc(var(--om41-hover-lift) * -1))!important}
  body.om-mvp .editorial-shell :is(.editorial-actions a,.editorial-choice-links a,a.editorial-choice-link){transition:transform var(--om41-hover-ms) ease,box-shadow var(--om41-hover-ms) ease}
  body.om-mvp .editorial-shell :is(.editorial-actions a,.editorial-choice-links a,a.editorial-choice-link):hover{transform:translateY(calc(var(--om41-hover-lift) * -1))!important}
}

/* ---------- Ready-made token consumers for the next batches (no element carries them yet) ---------- */
@keyframes om41-hero-float{from{opacity:0;translate:0 var(--om41-hero-float-y)}to{opacity:1;translate:0 0}}
html.rv33-js .om41-hero-float{animation:om41-hero-float var(--om41-hero-float-ms) var(--om41-hero-float-ease) both}
.om41-crossfade{transition:opacity var(--om41-crossfade-ms) ease}
@media(prefers-reduced-motion:reduce){html.rv33-js .om41-hero-float{animation:none}.om41-crossfade{transition:none}}
