/* ═══════════════════════════════════════════════════════════════════════════
   LUSKI — the interaction system
   ───────────────────────────────────────────────────────────────────────────
   One place that owns how EVERY interactive element on the site moves, focuses
   and disables. Before this file existed each component invented its own:
   lifts at -2/-3/-4px, ten different scale(1.01)/scale(1.02) hover-grows,
   exactly three press states in the entire codebase, and ruby focus rings at
   four different offsets. Tuning the feel meant finding forty rules.

   ── PROPERTY OWNERSHIP (the rule that keeps this file from fighting others) ──
   THIS file owns:      transform, box-shadow, outline, opacity, cursor
   COMPONENTS still own: color, background-color, border-color, text-decoration

   That split is why a component can keep its own ruby hover colour while its
   motion comes from here. It only holds if components never re-declare the
   owned properties, AND never use a `transition:` SHORTHAND -- a shorthand
   resets transition-property and silently deletes the transform timing set
   below. Component shorthands on tiered selectors were removed for exactly
   this reason; do not reintroduce one. Use longhands (transition-property,
   transition-duration) in component CSS if you need to animate a colour.

   ── SIX FAMILIES ──
   T0  inline link   colour + underline only. No transform. Text in prose.
   T1  chip / tab    lift -4px, no shadow. Small pill controls.
   T2  button        lift -2px + ruby glow. Real actions. Half the chip lift
                     because a 4px hop on a row of buttons reads as a wobble.
   T3  card          lift -4px + deep shadow. Whole-surface click targets.
   T4  dense row     no lift at all -- rows sit in tight lists where lifting
                     one shoves the eye off the others. Press only.
   T5  field         focus ring + border. Never moves; a moving input is
                     hostile while you are typing into it.

   ── DELIBERATE EXCLUSIONS (do not add these to a tier) ──
   .arc-nav__link      keeps its own -4px/300ms bounce in nav.css. It predates
                       this file by a day and Eric signed it off as-is.
   .boot-overlay and every descendant (.boot-scene--title, .boot-menu__btn,
                       .boot-start, .boot-start-hit) -- the boot sequence is
                       off-limits by standing instruction.
   [data-cursor-plain] opts out of the cursor reticle; it opts out here too.
   .g-* garage classes garage/ pages load NO arcade CSS (see garage/index.html),
                       so garage selectors here would be dead code. The garage
                       is aligned to these same values by hand in garage.css.

   ── CONTAINING-BLOCK WARNING ──
   A non-none `transform` on an element makes it the containing block for any
   position:fixed descendant, which would trap a full-screen modal inside a
   card. Verified safe today: .res-overlay and .cart-overlay are both direct
   children of <body> with no tiered ancestor. Before adding a selector to
   T1-T4, confirm it can never wrap a fixed-position overlay.

   ── FOCUS COLOUR ──
   Ruby, by Eric's explicit call (Aug 2026), not the blue garage/tokens.css
   uses. Ruby measures 3.21:1 on --arc-parchment and ~9:1 on --arc-bg, so it
   clears the 3:1 floor SC 1.4.11 sets for focus indicators on both grounds.
   Known accepted cost: on controls whose hover is also ruby, focused and
   hovered look similar. The two-tone ring below is what buys back most of the
   difference -- the inner --arc-focus-ground gap is a SHAPE change, so it
   still reads as focus at the same hue.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── (a) REST ──────────────────────────────────────────────────────────────
   Each tier declares its FULL transition list here, at rest, so the element
   animates both into and out of every state. Declaring transitions only
   inside :hover gives you an animated entry and an instant snap back. */

.ft-links a, .crumbs a, .prose a, .rg-links a, .areas-grid a,
.text-link, .sc-link, .dlg-back, .res-direct a {
  transition-property: color, text-decoration-color, text-decoration-thickness;
  transition-duration: var(--arc-transition);
  transition-timing-function: var(--arc-ease);
}

.arc-nav__stars, .arc-nav__mute, .dos-chip, .dos-tab, .arc-bay-tab, .ql-tab,
.arc-page-btn, .tab-btn, .calc-term-btn, .gen-pill, .f-pill,
.dos-file__photo-btn, .res-modal-x, .luski-toast__close,
.dos-file__cta, .enquire-btn, .reserve-btn, .res-pay-btn, .alert-btn,
.empty-cta, .sell-banner-btn, .tool-btn, .submit-btn, .pkg-add-btn,
.notify-btn, .full-btn, .ck-btn, .checkout-btn, .pay-btn,
.btn, .btn-p, .btn-s, .ig-btn, .copy-btn, .extras-toggle,
.car-card, .brand-card, .pkg-card, .model-card, .build-card, .notify-card,
.who-card, .founder-card, .mat-card, .bq-card,
.dos-row, .dlg-choice, .dlg-topic, .extra-item, .warranty-row, .gallery-thumb {
  /* Per-property timing, deliberately not one duration for all five. Motion
     wants the slow 300ms bounce; colour wants the original quick 160ms ease.
     Running a colour change on a bouncy curve overshoots the target colour and
     reads as a flicker, and 300ms on a row highlight feels laggy under the
     cursor. The lists are positional -- keep all three the same length and in
     the same order. */
  transition-property: transform, box-shadow, color, background-color, border-color;
  transition-duration: var(--arc-dur-lift), var(--arc-dur-lift), var(--arc-transition), var(--arc-transition), var(--arc-transition);
  transition-timing-function: var(--arc-ease-bounce), var(--arc-ease-bounce), var(--arc-ease), var(--arc-ease), var(--arc-ease);
}

/* The photo inside a card zooms on the CARD's hover, so it needs the timing
   even though it is never itself a hover target. */
.car-card .cc-stage img, .build-card .bc-img img,
.dos-tile .dos-tile__photo img {
  transition-property: transform;
  transition-duration: var(--arc-dur-lift);
  transition-timing-function: var(--arc-ease);
}

/* ── (b) HOVER ─────────────────────────────────────────────────────────────
   Gated behind a real mouse. On touch, :hover latches after a tap and stays
   stuck until you tap elsewhere -- an element frozen mid-lift reads as broken.
   This gate covers the TRANSFORM layer; colour hovers declared in component
   CSS are not gated and can still latch. That is a known remaining gap, not a
   claim that hover never fires on touch. */
@media (hover: hover) and (pointer: fine) {

  .arc-nav__stars:hover, .arc-nav__mute:hover, .dos-chip:hover, .dos-tab:hover,
  .arc-bay-tab:hover, .ql-tab:hover, .arc-page-btn:hover, .tab-btn:hover,
  .calc-term-btn:hover, .gen-pill:hover, .f-pill:hover,
  .dos-file__photo-btn:hover, .res-modal-x:hover, .luski-toast__close:hover {
    transform: translateY(var(--arc-lift-chip));
  }

  .dos-file__cta:hover, .enquire-btn:hover, .reserve-btn:hover,
  .res-pay-btn:hover, .alert-btn:hover, .empty-cta:hover,
  .sell-banner-btn:hover, .tool-btn:hover, .submit-btn:hover,
  .pkg-add-btn:hover, .notify-btn:hover, .full-btn:hover, .ck-btn:hover,
  .checkout-btn:hover, .pay-btn:hover, .btn:hover, .btn-p:hover, .btn-s:hover,
  .ig-btn:hover, .copy-btn:hover, .extras-toggle:hover {
    transform: translateY(var(--arc-lift-btn));
    box-shadow: var(--arc-glow-btn-hover);
  }

  /* The doubled class is a deliberate specificity bump, not a typo. It changes
     nothing about WHAT these rules match -- only how loudly they say it.
     Cards on several pages also carry .rv, the sitewide scroll-reveal, whose
     revealed state `.rv.in{transform:translateY(0)}` scores the same 0-2-0 as
     a bare `.card:hover` and is declared LATER (page <style> after this link),
     so it silently won and the hover lift never happened -- confirmed dead on
     .brand-card on /cars/. Doubling to 0-3-0 lets the owner of transform
     actually own it. The alternative, editing the .rv pattern in twenty-odd
     generated and hand-authored files, is far more surface area for the same
     outcome. */
  .car-card.car-card:hover, .brand-card.brand-card:hover,
  .pkg-card.pkg-card:hover, .model-card.model-card:hover,
  .build-card.build-card:hover, .notify-card.notify-card:hover,
  .who-card.who-card:hover, .founder-card.founder-card:hover,
  .mat-card.mat-card:hover, .bq-card.bq-card:hover,
  /* .dos-tile is a photo card, so it lifts like one -- even though it also
     carries .dos-row and therefore inherits T4's press and focus ring. It is
     listed HERE and not in T4 because the family is decided by what the thing
     IS to a visitor (a picture of a car you can pick up), not by which classes
     it happens to share. Safe to lift only because item-card.css sets
     overflow:visible on .dos-shell--tiles .dos-index; the default
     .dos-index{overflow:hidden} would clip the shadow at the container edge. */
  .dos-tile:hover {
    transform: translateY(var(--arc-lift-card));
    box-shadow: var(--arc-shadow-card-hover);
  }

  /* The two photo zooms that survive the scale() cull. They are kept because
     they animate an IMAGE inside a clipped frame, which is a real depth cue,
     not the scale(1.01) whole-element grow that made buttons look inflated. */
  .car-card:hover .cc-stage img { transform: scale(1.045); }
  .build-card:hover .bc-img img { transform: scale(1.06); }
  .dos-tile:hover .dos-tile__photo img { transform: scale(1.045); }
}

/* ── (c) FOCUS ─────────────────────────────────────────────────────────────
   NOT gated: keyboard focus must work regardless of pointer type.
   :focus-visible, never :focus -- a plain :focus paints the ring on mouse
   clicks too, which is why so many sites end up removing outlines entirely. */

.arc-nav__stars:focus-visible, .arc-nav__mute:focus-visible,
.dos-chip:focus-visible, .dos-tab:focus-visible, .ql-tab:focus-visible,
.arc-page-btn:focus-visible, .tab-btn:focus-visible,
.calc-term-btn:focus-visible, .gen-pill:focus-visible, .f-pill:focus-visible,
.dos-file__photo-btn:focus-visible, .res-modal-x:focus-visible,
.luski-toast__close:focus-visible,
.dos-file__cta:focus-visible, .enquire-btn:focus-visible,
.reserve-btn:focus-visible, .res-pay-btn:focus-visible,
.alert-btn:focus-visible, .empty-cta:focus-visible,
.sell-banner-btn:focus-visible, .tool-btn:focus-visible,
.submit-btn:focus-visible, .pkg-add-btn:focus-visible,
.notify-btn:focus-visible, .full-btn:focus-visible, .ck-btn:focus-visible,
.checkout-btn:focus-visible, .pay-btn:focus-visible, .btn:focus-visible,
.btn-p:focus-visible, .btn-s:focus-visible, .ig-btn:focus-visible,
.copy-btn:focus-visible, .extras-toggle:focus-visible,
.car-card:focus-visible, .brand-card:focus-visible, .pkg-card:focus-visible,
.model-card:focus-visible, .build-card:focus-visible,
.notify-card:focus-visible, .who-card:focus-visible,
.founder-card:focus-visible, .mat-card:focus-visible, .bq-card:focus-visible,
.dlg-choice:focus-visible, .dlg-topic:focus-visible,
.extra-item:focus-visible, .warranty-row:focus-visible,
.gallery-thumb:focus-visible,
.ft-links a:focus-visible, .crumbs a:focus-visible, .prose a:focus-visible,
.rg-links a:focus-visible, .areas-grid a:focus-visible,
.text-link:focus-visible, .sc-link:focus-visible, .dlg-back:focus-visible,
.res-direct a:focus-visible {
  outline: 2px solid transparent;   /* holds the ring in forced-colors mode, where box-shadow is dropped */
  outline-offset: 2px;
  box-shadow: var(--arc-focus-ring);
}

/* Inset variant. An outset box-shadow ring is CLIPPED by an ancestor that
   scrolls or hides overflow -- .arc-nav__strip{overflow-x:auto},
   .arc-bay-tabs, .dos-index{overflow:hidden} -- leaving a focused control with
   no visible ring at all. An outline is never clipped by ancestor overflow,
   so these three draw the ring inside their own box instead. */
.arc-bay-tab:focus-visible, .dos-row:focus-visible,
.arc-page-btn:focus-visible {
  outline: 2px solid var(--arc-focus);
  outline-offset: -2px;
  box-shadow: none;
}

/* Case File gallery thumbnails belong in the inset group twice over: their
   column .dos-file__thumbs is overflow-y:auto AND the thumb itself is
   overflow:hidden, so an outset ring is clipped away to nothing. Until this
   rule existed they carried no author focus style at all and painted Chrome's
   default blue ring -- the one colour the rest of this site never uses. */
.dos-file__thumb:focus-visible {
  outline: 2px solid var(--arc-focus);
  outline-offset: -2px;
  box-shadow: none;
}

/* The SELECTED thumb already wears a 2px gold outline at offset 0
   (`.dos-file__thumb.is-active`, dossier.css). That scores the same 0-2-0 as
   the rule directly above and dossier.css is linked AFTER this file, so on the
   active thumb the gold simply won: focusing the selected thumb looked
   identical to not focusing it, and keyboard users lost the caret entirely.
   Fixed with two rings instead of one contested ring. 0-3-0 here re-states the
   gold deliberately -- the selected signal is NOT removed -- and the ruby focus
   ring moves onto the <img> inside, where a negative offset keeps it within the
   button's own content box so overflow:hidden cannot clip it.
   It has to be an OUTLINE on the img and not an inset box-shadow on the button:
   the img fills the padding box and paints over any inset shadow, whereas
   outlines are painted above descendant content.
   Result -- selected: one gold ring. Selected AND focused: the same gold ring
   with a ruby ring nested inside it. Both legible, neither mistakable for the
   other.
   The gap is -4px and not the -2px the inset group above uses, and that is
   measured, not taste: ruby (#F3037E) and gold (#9c7a2e) sit 1.02:1 apart in
   relative luminance, so two rings 1px apart would fuse into one thick band in
   greyscale or for a red-green deficient eye. Pushing the inner ring to 4px
   leaves a clear strip of photo between them, which makes the signal a COUNT
   of rings -- one versus two -- rather than a hue anyone has to be able to
   tell apart. The thumb is 84x52px, so 6px of inset costs nothing. */
.dos-file__thumb.is-active:focus-visible {
  outline: 2px solid var(--arc-gold-strong);
  outline-offset: 0;
  box-shadow: none;
}
.dos-file__thumb.is-active:focus-visible img {
  outline: 2px solid var(--arc-focus);
  outline-offset: -4px;
}

/* T5 fields: ring plus a border colour change, matching the garage's existing
   field treatment. No transform -- see the family table. */
input:focus-visible, select:focus-visible, textarea:focus-visible {
  outline: 2px solid transparent;
  outline-offset: 2px;
  box-shadow: var(--arc-focus-ring);
  border-color: var(--arc-focus);
}

/* Parchment surfaces re-ground the ring's inner gap. --arc-focus-ground
   defaults to --arc-bg (near-black), which would draw a black halo around a
   ruby ring on a cream card. The ring COLOUR stays ruby -- only the gap
   changes -- because ruby already clears 3:1 on parchment. */
.dos-file, .tool-card {
  --arc-focus-ground: var(--arc-parchment);
}

/* ── (d) PRESS ─────────────────────────────────────────────────────────────
   Ungated: a press is real on touch too, and unlike hover it ends when the
   finger lifts, so it cannot latch. Excludes disabled controls so a dead
   button does not appear to respond.
   Cards and rows sink without the extra 1px because they are large -- a big
   surface moving 1px down AND scaling reads as a jolt. */
.arc-nav__stars:active:not(:disabled):not([aria-disabled="true"]),
.arc-nav__mute:active:not(:disabled):not([aria-disabled="true"]),
.dos-chip:active:not(:disabled):not([aria-disabled="true"]),
.dos-tab:active:not(:disabled):not([aria-disabled="true"]),
.arc-bay-tab:active:not(:disabled):not([aria-disabled="true"]),
.ql-tab:active:not(:disabled):not([aria-disabled="true"]),
.arc-page-btn:active:not(:disabled):not([aria-disabled="true"]),
.tab-btn:active:not(:disabled):not([aria-disabled="true"]),
.calc-term-btn:active:not(:disabled):not([aria-disabled="true"]),
.gen-pill:active:not(:disabled):not([aria-disabled="true"]),
.f-pill:active:not(:disabled):not([aria-disabled="true"]),
.dos-file__photo-btn:active:not(:disabled):not([aria-disabled="true"]),
.res-modal-x:active:not(:disabled):not([aria-disabled="true"]),
.luski-toast__close:active:not(:disabled):not([aria-disabled="true"]),
.dos-file__cta:active:not(:disabled):not([aria-disabled="true"]),
.enquire-btn:active:not(:disabled):not([aria-disabled="true"]),
.reserve-btn:active:not(:disabled):not([aria-disabled="true"]),
.res-pay-btn:active:not(:disabled):not([aria-disabled="true"]),
.alert-btn:active:not(:disabled):not([aria-disabled="true"]),
.empty-cta:active:not(:disabled):not([aria-disabled="true"]),
.sell-banner-btn:active:not(:disabled):not([aria-disabled="true"]),
.tool-btn:active:not(:disabled):not([aria-disabled="true"]),
.submit-btn:active:not(:disabled):not([aria-disabled="true"]),
.pkg-add-btn:active:not(:disabled):not([aria-disabled="true"]),
.notify-btn:active:not(:disabled):not([aria-disabled="true"]),
.full-btn:active:not(:disabled):not([aria-disabled="true"]),
.ck-btn:active:not(:disabled):not([aria-disabled="true"]),
.checkout-btn:active:not(:disabled):not([aria-disabled="true"]),
.pay-btn:active:not(:disabled):not([aria-disabled="true"]),
.btn:active:not(:disabled):not([aria-disabled="true"]),
.btn-p:active:not(:disabled):not([aria-disabled="true"]),
.btn-s:active:not(:disabled):not([aria-disabled="true"]),
.ig-btn:active:not(:disabled):not([aria-disabled="true"]),
.copy-btn:active:not(:disabled):not([aria-disabled="true"]),
.extras-toggle:active:not(:disabled):not([aria-disabled="true"]) {
  transform: translateY(var(--arc-press-sink)) scale(var(--arc-press-scale));
  transition-duration: var(--arc-dur-press);
  transition-timing-function: var(--arc-ease-press);
}

.car-card:active:not([aria-disabled="true"]),
.brand-card:active:not([aria-disabled="true"]),
.pkg-card:active:not([aria-disabled="true"]),
.model-card:active:not([aria-disabled="true"]),
.build-card:active:not([aria-disabled="true"]),
.notify-card:active:not([aria-disabled="true"]),
.who-card:active:not([aria-disabled="true"]),
.founder-card:active:not([aria-disabled="true"]),
.mat-card:active:not([aria-disabled="true"]),
.bq-card:active:not([aria-disabled="true"]),
.dos-row:active:not([aria-disabled="true"]),
.dlg-choice:active:not(:disabled):not([aria-disabled="true"]),
.dlg-topic:active:not(:disabled):not([aria-disabled="true"]),
.extra-item:active:not([aria-disabled="true"]),
.warranty-row:active:not([aria-disabled="true"]),
.gallery-thumb:active:not(:disabled):not([aria-disabled="true"]) {
  transform: translateY(0) scale(var(--arc-press-scale));
  transition-duration: var(--arc-dur-press);
  transition-timing-function: var(--arc-ease-press);
}

/* ── (e) DISABLED ──────────────────────────────────────────────────────────
   Never pointer-events:none. That would make the control invisible to hit
   testing, so it could not receive focus, could not show a tooltip explaining
   WHY it is disabled, and would be skipped silently by a screen reader user
   trying to find it. */
.dos-file__cta:disabled, .enquire-btn:disabled, .reserve-btn:disabled,
.res-pay-btn:disabled, .alert-btn:disabled, .empty-cta:disabled,
.sell-banner-btn:disabled, .tool-btn:disabled, .submit-btn:disabled,
.pkg-add-btn:disabled, .notify-btn:disabled, .full-btn:disabled,
.ck-btn:disabled, .checkout-btn:disabled, .pay-btn:disabled, .btn:disabled,
.btn-p:disabled, .btn-s:disabled, .ig-btn:disabled, .copy-btn:disabled,
.extras-toggle:disabled, .tab-btn:disabled, .calc-term-btn:disabled,
.f-pill:disabled, .gen-pill:disabled, .arc-page-btn:disabled,
.dlg-choice:disabled, .dlg-topic:disabled, .gallery-thumb:disabled,
[aria-disabled="true"] {
  opacity: var(--arc-disabled-opacity);
  cursor: not-allowed;
  transform: none;
  box-shadow: none;
}

/* ── (e2) TOUCH TARGET SIZE ────────────────────────────────────────────────
   WCAG 2.5.8 sets a 24x24 CSS-px floor for pointer targets. Measured on a
   375px viewport, the footer link rows failed it on every page on the site:
   11-15 links per page at 13-15px tall. They are the correct SIZE as type --
   the problem is only that the tappable BOX is the text's own line box, with
   nothing around it. Padding fixes that without changing how anything looks,
   because these rows are already laid out with flex `gap`, so the extra box
   grows into space that was empty anyway.
   Scoped to coarse pointers: on a mouse a 14px link is easy to hit, and
   padding every footer link on desktop would loosen a deliberately tight row
   for no benefit. */
@media (pointer: coarse) {
  .ft-links a, .ft-links-row a, .ft-contact, .ft-soc,
  .footer-links a,
  /* Not only footers. These were measured failing the same floor: the legal
     links under the pay button on /checkout/ (13px), and the breadcrumb trail
     on every model page (14px). .g-footer__links is NOT listed -- the garage
     loads no arcade CSS at all, so it is handled by the twin of this rule in
     garage/garage.css. */
  .pay-note a, .breadcrumb a,
  /* `footer > a` catches checkout's, which hangs directly off a bare
     <footer> with no class and so matched none of the .ft-* selectors
     above. */
  footer > a {
    /* min-height + centred flex rather than raw padding: padding alone still
       misses the floor when the line box is short, and this keeps the visual
       baseline where it already sits. */
    display: inline-flex;
    align-items: center;
    min-height: 24px;
    padding-block: 4px;
  }

  /* A dismiss control fails the floor on WIDTH, not height: measured 13x25.
     A close button is also the one control where a miss is most annoying,
     because the thing you are trying to dismiss stays. */
  .cd-x, .res-modal-x, .luski-toast__close {
    min-width: 24px;
    min-height: 24px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
  }
}

/* ── (f) REDUCED MOTION ────────────────────────────────────────────────────
   The token block in tokens.css already collapses the durations to 1ms. This
   goes further and removes the transform itself: a 1ms lift is still a lift,
   and the point of the preference is that things do not move. Colour, focus
   rings and disabled treatment all survive -- they carry meaning, and this
   preference is about motion, not about stripping feedback. */
@media (prefers-reduced-motion: reduce) {
  .arc-nav__stars, .arc-nav__mute, .dos-chip, .dos-tab, .arc-bay-tab, .ql-tab,
  .arc-page-btn, .tab-btn, .calc-term-btn, .gen-pill, .f-pill,
  .dos-file__photo-btn, .res-modal-x, .luski-toast__close,
  .dos-file__cta, .enquire-btn, .reserve-btn, .res-pay-btn, .alert-btn,
  .empty-cta, .sell-banner-btn, .tool-btn, .submit-btn, .pkg-add-btn,
  .notify-btn, .full-btn, .ck-btn, .checkout-btn, .pay-btn,
  .btn, .btn-p, .btn-s, .ig-btn, .copy-btn, .extras-toggle,
  .car-card, .brand-card, .pkg-card, .model-card, .build-card, .notify-card,
  .who-card, .founder-card, .mat-card, .bq-card,
  .dos-row, .dlg-choice, .dlg-topic, .extra-item, .warranty-row,
  .gallery-thumb,
  .car-card .cc-stage img, .build-card .bc-img img,
  .dos-tile .dos-tile__photo img {
    transition-duration: 1ms;
  }

  .arc-nav__stars:hover, .arc-nav__mute:hover, .dos-chip:hover, .dos-tab:hover,
  .arc-bay-tab:hover, .ql-tab:hover, .arc-page-btn:hover, .tab-btn:hover,
  .calc-term-btn:hover, .gen-pill:hover, .f-pill:hover,
  .dos-file__photo-btn:hover, .res-modal-x:hover, .luski-toast__close:hover,
  .dos-file__cta:hover, .enquire-btn:hover, .reserve-btn:hover,
  .res-pay-btn:hover, .alert-btn:hover, .empty-cta:hover,
  .sell-banner-btn:hover, .tool-btn:hover, .submit-btn:hover,
  .pkg-add-btn:hover, .notify-btn:hover, .full-btn:hover, .ck-btn:hover,
  .checkout-btn:hover, .pay-btn:hover, .btn:hover, .btn-p:hover, .btn-s:hover,
  .ig-btn:hover, .copy-btn:hover, .extras-toggle:hover,
  .car-card:hover, .brand-card:hover, .pkg-card:hover, .model-card:hover,
  .build-card:hover, .notify-card:hover, .who-card:hover,
  .founder-card:hover, .mat-card:hover, .bq-card:hover,
  .car-card:hover .cc-stage img, .build-card:hover .bc-img img,
  .dos-tile:hover, .dos-tile:hover .dos-tile__photo img,
  .arc-nav__stars:active, .arc-nav__mute:active, .dos-chip:active,
  .dos-tab:active, .arc-bay-tab:active, .ql-tab:active, .arc-page-btn:active,
  .tab-btn:active, .calc-term-btn:active, .gen-pill:active, .f-pill:active,
  .dos-file__photo-btn:active, .res-modal-x:active, .luski-toast__close:active,
  .dos-file__cta:active, .enquire-btn:active, .reserve-btn:active,
  .res-pay-btn:active, .alert-btn:active, .empty-cta:active,
  .sell-banner-btn:active, .tool-btn:active, .submit-btn:active,
  .pkg-add-btn:active, .notify-btn:active, .full-btn:active, .ck-btn:active,
  .checkout-btn:active, .pay-btn:active, .btn:active, .btn-p:active,
  .btn-s:active, .ig-btn:active, .copy-btn:active, .extras-toggle:active,
  .car-card:active, .brand-card:active, .pkg-card:active, .model-card:active,
  .build-card:active, .notify-card:active, .who-card:active,
  .founder-card:active, .mat-card:active, .bq-card:active,
  .dos-row:active, .dlg-choice:active, .dlg-topic:active, .extra-item:active,
  .warranty-row:active, .gallery-thumb:active {
    /* !important is load-bearing here, not laziness. The press rules above are
       written as `.btn:active:not(:disabled):not([aria-disabled="true"])`, and
       :not() contributes its ARGUMENT's specificity -- so those selectors score
       0-4-0 while the plain `.btn:active` here scores 0-2-0 and would lose.
       Without !important this whole block silently fails and a visitor who
       asked for reduced motion still gets every press animation. The
       alternative, repeating both :not() chains across ~50 selectors, is far
       easier to get wrong the next time a selector is added. A kill switch is
       exactly the case !important exists for. */
    transform: none !important;
  }

  /* The sitewide scroll-reveal. `.rv{transform:translateY(20-24px)}` plus
     `.rv.in{transform:translateY(0)}` is declared in ~24 page <style> blocks
     and two component sheets -- none of which this file may edit, and every
     one of them parsed AFTER this stylesheet's own <link>. A same-specificity
     0-2-0 rule here would therefore lose the cascade on every single page, so
     !important is load-bearing for exactly the reason the press kill switch
     above needs it: it is the only way this file can outrank a declaration it
     cannot reach. Both states are pinned, not just `.rv.in` -- pinning only the
     revealed state would leave a not-yet-revealed element sitting 20px off and
     then teleporting into place the moment the observer fires, which is a
     bigger jolt than the slide it replaced.
     Opacity is deliberately untouched. A cross-fade is not motion, it is the
     only thing left telling the visitor a section arrived, and the preference
     asks for less movement, not less feedback. */
  .rv, .rv.in {
    transform: none !important;
  }
}
