/* =====================================================================
 * HOVER SYSTEM — the single source of truth for BUTTON and CARD hover
 * across every Hire / Services-landing / Services-inner / AI page.
 * Added 2026-09-18.
 *
 * WHY THIS FILE EXISTS
 * --------------------
 * On 2026-09-16 the button + card hover effects were unified across the
 * three Figma page families and the rules lived at the bottom of
 * css/figma-pages-base.css. That file is only enqueued for those three
 * families, so the four AI pages and the two hire pages still sitting on
 * the legacy hire-template-2025.php never got any of it:
 *
 *   - the 4 AI pages had FOUR different ad-hoc button hovers
 *     (brightness(1.06), brightness(.94), background -> #ffef52, and one
 *     chip with no hover at all) and ZERO card hover on 17 card
 *     components;
 *   - /hire-shopify-developer/ and /hire-bigcommerce-developer/ lifted
 *     their cards with translateY(-4px) + a purple shadow and scaled
 *     their button by 1.08.
 *
 * LOCAL AND STAGING DISAGREE ABOUT THOSE LAST TWO (measured 2026-09-18,
 * after deploying). In the LOCAL database they are on the legacy
 * hire-template-2025.php + css/shopify.css, which is what made them
 * diverge. In the STAGING database they are already on
 * hire/page-hire-shopify-developer.php and
 * hire/page-hire-bigcommerce-developer.php, and NO staging page uses
 * hire-template-2025.php at all — so on staging they were always part of
 * the Hire family. The shopify-* classes below are therefore live on
 * local only. They stay in this file regardless: the local tree is what
 * gets developed against, /flutter-developers/ and /react-js-developers/
 * are on that template locally too, and a page could be pointed back at
 * it at any time.
 *
 * The whole block therefore MOVED here verbatim and grew the missing
 * component classes. figma-pages-base.css no longer carries any of it.
 * This file is enqueued LAST on every page of all six families (see
 * tbi_ai_hover_fx_templates() in functions.php), so it always wins the
 * cascade over a family or per-page stylesheet.
 *
 * SCOPE CLASS
 * -----------
 * Everything is scoped under body.tbi-hover-fx, which
 * tbi_ai_hover_fx_body_class() adds to exactly the pages this file is
 * enqueued for. Nothing here leaks to the home page, portfolio, blog,
 * about, careers or the legal pages — those keep their own hovers.
 *
 * ADDING A PAGE / COMPONENT
 * -------------------------
 * 1. Put the template filename in tbi_ai_hover_fx_templates().
 * 2. Add the component's class to ONE of the four selector lists below:
 *      §1  BUTTON, amber         the #f7e934 CTA buttons
 *      §2  BUTTON, own-ink       buttons that are not amber
 *      §3  CARD, lift            a card with its own background + radius
 *                                sitting in a gap >= ~14px
 *      §4  CARD, hairline cell   a bordered grid cell at gap 0
 * 3. If the card sits on a LIGHT surface, add it to the light-variant
 *    override in §3 as well.
 * Do not invent a fifth treatment — that is what this file exists to
 * prevent.
 *
 * WHAT IS DELIBERATELY EXCLUDED
 * -----------------------------
 * - Full-width CTA banner panels (hrf-cta2__card, automate__card,
 *   aiaa-midcta__card, aiaa-final__card, aib-final__card,
 *   aib-jovian__card, aud-final__card, aids-midcta__card,
 *   aids-final__card). They are sections that happen to be named
 *   "card"; they are not in a set, there is nothing to distinguish them
 *   from, and the button inside them is the hover target.
 * - Interaction controls that are not CTA buttons: carousel arrows,
 *   video play buttons, FAQ toggles, filter chips and tabs. They carry
 *   their own state affordances (is-active, pressed, playing) and an
 *   amber CTA glow on them would read as a second call to action.
 * ===================================================================== */

/* =====================================================================
 * §1  BUTTON HOVER — matched to the header CTA
 *
 * The reference is `.site-header__cta` in css/header.css:
 *     transition: filter 0.25s ease;
 *     filter: drop-shadow(0 0 6px rgba(229, 175, 1, 0.64));   <- resting
 *   :hover, :focus-visible {
 *     filter: drop-shadow(0 0 10px rgba(229, 175, 1, 0.82));  <- hover
 *   }
 *
 * NO ZOOM. Buttons used to also `scale(1.05)` on hover — the zoom was
 * removed from every button in the theme, and from the header CTA, on
 * 2026-09-18 at the user's request ("remove the button zoom in effect
 * accross all pages button and header also"). The glow brightening is now
 * the whole effect. `transform` is therefore not in the transition list,
 * and there is nothing left for the reduced-motion / touch blocks to
 * neutralise on a button. **Cards still scale** — the request was about
 * buttons; see §3.
 *
 * Every button in this list is filled with the same #f7e934 as the
 * header CTA (verified in the browser, not from the stylesheets — all
 * of them compute to rgb(247, 233, 52)), so they take the reference's
 * glow values verbatim.
 *
 *   hrf-cta2__btn       43 pages  hire + service inner + service landing
 *   hrf-ai__cta-btn     43 pages  hire + service inner + service landing
 *   automate__btn       43 pages  hire + service inner + service landing
 *   aiaa-lm__cta-btn     1 page   /ai/ai-automation-agency/
 *   aiaa-midcta__btn     1 page   /ai/ai-automation-agency/
 *   aiaa-final__btn      1 page   /ai/ai-automation-agency/
 *   aib-btn              1 page   /ai/ai-in-business/ (3 buttons)
 *   aud-form__submit     1 page   /ai/audit/
 *   aids-btn             1 page   /artificial-intelligence-development-services/ (4 buttons)
 *
 * aud-form__submit is a <button type="submit">, not an <a>. It gets the
 * same treatment because it is the same yellow CTA in the same visual
 * role; nothing about the glow depends on the element being a link.
 * ===================================================================== */

body.tbi-hover-fx .hrf-cta2__btn,
body.tbi-hover-fx .hrf-ai__cta-btn,
body.tbi-hover-fx .automate__btn,
body.tbi-hover-fx .aiaa-lm__cta-btn,
body.tbi-hover-fx .aiaa-midcta__btn,
body.tbi-hover-fx .aiaa-final__btn,
body.tbi-hover-fx .aib-btn,
body.tbi-hover-fx .aud-form__submit,
body.tbi-hover-fx .aids-btn {
  filter: drop-shadow(0 0 6px rgba(229, 175, 1, 0.64));
  transition: filter 0.25s ease;
}

body.tbi-hover-fx .hrf-cta2__btn:hover,
body.tbi-hover-fx .hrf-cta2__btn:focus-visible,
body.tbi-hover-fx .hrf-ai__cta-btn:hover,
body.tbi-hover-fx .hrf-ai__cta-btn:focus-visible,
body.tbi-hover-fx .automate__btn:hover,
body.tbi-hover-fx .automate__btn:focus-visible,
body.tbi-hover-fx .aiaa-lm__cta-btn:hover,
body.tbi-hover-fx .aiaa-lm__cta-btn:focus-visible,
body.tbi-hover-fx .aiaa-midcta__btn:hover,
body.tbi-hover-fx .aiaa-midcta__btn:focus-visible,
body.tbi-hover-fx .aiaa-final__btn:hover,
body.tbi-hover-fx .aiaa-final__btn:focus-visible,
body.tbi-hover-fx .aib-btn:hover,
body.tbi-hover-fx .aib-btn:focus-visible,
body.tbi-hover-fx .aud-form__submit:hover,
body.tbi-hover-fx .aud-form__submit:focus-visible,
body.tbi-hover-fx .aids-btn:hover,
body.tbi-hover-fx .aids-btn:focus-visible {
  filter: drop-shadow(0 0 10px rgba(229, 175, 1, 0.82));
}

/* The four AI stylesheets used to repaint their own background on hover
   (#ffef52) or shift brightness. Those declarations are gone from the
   per-page files; this re-states the resting fill so nothing depends on
   a rule that no longer exists, and so the glow sits on a flat colour
   rather than a colour that is itself mid-transition. */
body.tbi-hover-fx .aud-form__submit:hover,
body.tbi-hover-fx .aud-form__submit:focus-visible,
body.tbi-hover-fx .aids-btn:hover,
body.tbi-hover-fx .aids-btn:focus-visible {
  background-color: var(--color-cta-bg, #f7e934);
}

/* =====================================================================
 * §2  BUTTON HOVER — buttons that are not the amber CTA
 *
 * Same MECHANIC as §1 — 0.25s ease, :focus-visible parity, no zoom —
 * but a lifted shadow in the button's own ink instead of the amber
 * glow, which on a non-amber fill reads as a stray smudge. These have no
 * amber to brighten, so the shadow appearing IS their whole hover.
 *
 *   svcl-insights__all    service landing   outline, 1.5px #171717 on white
 *   shopify-cta__button   legacy hire x2    solid #543582 on #fff
 *   shopify-stats__cta    legacy hire       (not rendered on the two live
 *                                            pages, listed so its old
 *                                            scale(1.08) cannot come back)
 * ===================================================================== */

body.tbi-hover-fx .svcl-insights__all,
body.tbi-hover-fx .shopify-cta__button,
body.tbi-hover-fx .shopify-stats__cta {
  transition: box-shadow 0.25s ease;
}

body.tbi-hover-fx .svcl-insights__all:hover,
body.tbi-hover-fx .svcl-insights__all:focus-visible {
  box-shadow: 0 6px 18px 0 rgba(23, 23, 23, 0.18);
}

body.tbi-hover-fx .shopify-cta__button:hover,
body.tbi-hover-fx .shopify-cta__button:focus-visible,
body.tbi-hover-fx .shopify-stats__cta:hover,
body.tbi-hover-fx .shopify-stats__cta:focus-visible {
  box-shadow: 0 6px 18px 0 rgba(84, 53, 130, 0.35);
}

/* =====================================================================
 * §3  CARD HOVER, tier 1 — holographic sheen + lift
 *
 * Adapted from the reference .holographic-card snippet supplied with the
 * original 2026-09-16 request. Its geometry is kept verbatim — a
 * 200%x200% ::before carrying a
 * `linear-gradient(0deg, transparent, transparent 30%, <tint>)`, rotated
 * -45deg, faded in and swept with `translateY(100%)` on hover — so the
 * diagonal sweep reads exactly the same. Three things are deliberately
 * changed for this theme:
 *
 * 1. COLOUR. The snippet is cyan (#0ff) on #000. This theme's accent is
 *    --color-accent-purple (#a100ff), so the sheen and glow use that. A
 *    cyan sheen appears nowhere else in the design system.
 * 2. SCALE. The snippet uses scale(1.05). Card gaps here are 14-56px,
 *    and 1.05 on an 840-920px wide card would grow it ~42-46px (21-23px
 *    a side) against a 20px gap, overlapping its neighbour. Cards
 *    therefore lift by 1.03, and the wide ones (>= 800px) by 1.02.
 * 3. `transition: all` is replaced with an explicit property list.
 *    `all` on these cards would also animate the background gradients
 *    and border-radius on every state change.
 *
 * Applied to the elements that are genuinely cards — each has its own
 * background AND its own border-radius AND sits in a set with a real
 * gap. Measured in the browser at 1440px; the gap column is what makes
 * the chosen scale safe:
 *
 *   COMPONENT                PAGES  SIZE      GAP     SURFACE
 *   hrf-ai__card              43    ~300x260  53px    dark
 *   hrf-svc__card             43    ~416x520  24px    dark
 *   hrf-work__card            43    ~840x800  20px    dark   -> 1.02
 *   hrf-hm__card              13    ~325x300  20px    LIGHT
 *   hrf-related__card          1    ~560x150  12px    LIGHT
 *   svcl-platforms__card       5    ~300x220  20px    LIGHT
 *   svcl-insights__card        5    ~416x480  24px    dark
 *   aiaa-gap__card             1     429x200  16px    dark
 *   aiaa-lm__card              1     326x594  19px    dark
 *   aiaa-work__card            1     920x799  20px    dark   -> 1.02
 *   aib-problems__card         1     389x200  16px    dark
 *   aib-work__card             1     326x621  19px    dark
 *   aib-opps__card             1     325x240  20px    LIGHT
 *   aud-numcard                1     325x221  20px    dark
 *   aids-gap__card             1     389x200  16px    dark
 *   aids-cap__card             1     441x653  19px    dark
 *   aids-ess__card             1     300x129  14px    LIGHT
 *   shopify-hiring-card        2     420x292  50px    dark
 *   shopify-hire-card          0    ~300x420  25px    dark  (defined in
 *                                     shopify.css, on neither live page —
 *                                     listed so it cannot drift back)
 *   shopify-services-card      2     416x520  56px    dark
 *   shopify-work-card          2     808x805  20px    dark   -> 1.02
 *   shopify-team-card          2     292x239  n/a     LIGHT
 *
 * `overflow: hidden` is required for the sheen to be clipped to the card
 * and `isolation: isolate` keeps the ::before behind the content without
 * a z-index war with the rest of the page. Every direct child is lifted
 * to z-index 1 so the sheen never paints over text; the content of these
 * cards is static, so that is safe (svcl-catalog__card and
 * hrf-other__link, the two with absolutely-positioned children, are in
 * §4 instead).
 * ===================================================================== */

body.tbi-hover-fx .hrf-ai__card,
body.tbi-hover-fx .hrf-svc__card,
body.tbi-hover-fx .hrf-work__card,
body.tbi-hover-fx .hrf-hm__card,
body.tbi-hover-fx .hrf-related__card,
body.tbi-hover-fx .svcl-platforms__card,
body.tbi-hover-fx .svcl-insights__card,
body.tbi-hover-fx .aiaa-gap__card,
body.tbi-hover-fx .aiaa-lm__card,
body.tbi-hover-fx .aiaa-work__card,
body.tbi-hover-fx .aib-problems__card,
body.tbi-hover-fx .aib-work__card,
body.tbi-hover-fx .aib-opps__card,
body.tbi-hover-fx .aud-numcard,
body.tbi-hover-fx .aids-gap__card,
body.tbi-hover-fx .aids-cap__card,
body.tbi-hover-fx .aids-ess__card,
body.tbi-hover-fx .shopify-hire-card,
body.tbi-hover-fx .shopify-hiring-card,
body.tbi-hover-fx .shopify-services-card,
body.tbi-hover-fx .shopify-work-card,
body.tbi-hover-fx .shopify-team-card {
  --tbi-card-scale: 1.03;
  --tbi-card-sheen: rgba(161, 0, 255, 0.3);
  --tbi-card-glow: 0 0 24px 0 rgba(161, 0, 255, 0.38);
  position: relative;
  overflow: hidden;
  isolation: isolate;
  transition: transform 0.45s ease, box-shadow 0.45s ease;
}

/* Every direct child must sit above the sheen. z-index is stated at full
   specificity because nothing else in the theme sets one on these. */
body.tbi-hover-fx .hrf-ai__card > *,
body.tbi-hover-fx .hrf-svc__card > *,
body.tbi-hover-fx .hrf-work__card > *,
body.tbi-hover-fx .hrf-hm__card > *,
body.tbi-hover-fx .hrf-related__card > *,
body.tbi-hover-fx .svcl-platforms__card > *,
body.tbi-hover-fx .svcl-insights__card > *,
body.tbi-hover-fx .aiaa-gap__card > *,
body.tbi-hover-fx .aiaa-lm__card > *,
body.tbi-hover-fx .aiaa-work__card > *,
body.tbi-hover-fx .aib-problems__card > *,
body.tbi-hover-fx .aib-work__card > *,
body.tbi-hover-fx .aib-opps__card > *,
body.tbi-hover-fx .aud-numcard > *,
body.tbi-hover-fx .aids-gap__card > *,
body.tbi-hover-fx .aids-cap__card > *,
body.tbi-hover-fx .aids-ess__card > *,
body.tbi-hover-fx .shopify-hire-card > *,
body.tbi-hover-fx .shopify-hiring-card > *,
body.tbi-hover-fx .shopify-services-card > *,
body.tbi-hover-fx .shopify-work-card > *,
body.tbi-hover-fx .shopify-team-card > * {
  z-index: 1;
}

/* `position` is a DEFAULT, not an override, and is therefore written at ZERO
   specificity with :where(). z-index only applies to a positioned element, so
   a static child needs `position: relative` — but a child the page positions
   ITSELF must keep its own positioning. Writing this at full specificity
   broke `.aiaa-work__card-foot` on /ai/ai-automation-agency/: that child is
   `position: absolute; top: 616px` inside a 799px card, and forcing it to
   `relative` re-based that 616px on its static position and pushed the whole
   footer 521px out of the bottom of the card, where the card's own
   `overflow: hidden` then clipped it. Any rule that positions a child now
   wins, and the child still gets z-index: 1 from the block above.
   This is the same hazard §4 handles by naming the two corner arrows. */
:where(body.tbi-hover-fx .hrf-ai__card) > *,
:where(body.tbi-hover-fx .hrf-svc__card) > *,
:where(body.tbi-hover-fx .hrf-work__card) > *,
:where(body.tbi-hover-fx .hrf-hm__card) > *,
:where(body.tbi-hover-fx .hrf-related__card) > *,
:where(body.tbi-hover-fx .svcl-platforms__card) > *,
:where(body.tbi-hover-fx .svcl-insights__card) > *,
:where(body.tbi-hover-fx .aiaa-gap__card) > *,
:where(body.tbi-hover-fx .aiaa-lm__card) > *,
:where(body.tbi-hover-fx .aiaa-work__card) > *,
:where(body.tbi-hover-fx .aib-problems__card) > *,
:where(body.tbi-hover-fx .aib-work__card) > *,
:where(body.tbi-hover-fx .aib-opps__card) > *,
:where(body.tbi-hover-fx .aud-numcard) > *,
:where(body.tbi-hover-fx .aids-gap__card) > *,
:where(body.tbi-hover-fx .aids-cap__card) > *,
:where(body.tbi-hover-fx .aids-ess__card) > *,
:where(body.tbi-hover-fx .shopify-hire-card) > *,
:where(body.tbi-hover-fx .shopify-hiring-card) > *,
:where(body.tbi-hover-fx .shopify-services-card) > *,
:where(body.tbi-hover-fx .shopify-work-card) > *,
:where(body.tbi-hover-fx .shopify-team-card) > * {
  position: relative;
}

body.tbi-hover-fx .hrf-ai__card::before,
body.tbi-hover-fx .hrf-svc__card::before,
body.tbi-hover-fx .hrf-work__card::before,
body.tbi-hover-fx .hrf-hm__card::before,
body.tbi-hover-fx .hrf-related__card::before,
body.tbi-hover-fx .svcl-platforms__card::before,
body.tbi-hover-fx .svcl-insights__card::before,
body.tbi-hover-fx .aiaa-gap__card::before,
body.tbi-hover-fx .aiaa-lm__card::before,
body.tbi-hover-fx .aiaa-work__card::before,
body.tbi-hover-fx .aib-problems__card::before,
body.tbi-hover-fx .aib-work__card::before,
body.tbi-hover-fx .aib-opps__card::before,
body.tbi-hover-fx .aud-numcard::before,
body.tbi-hover-fx .aids-gap__card::before,
body.tbi-hover-fx .aids-cap__card::before,
body.tbi-hover-fx .aids-ess__card::before,
body.tbi-hover-fx .shopify-hire-card::before,
body.tbi-hover-fx .shopify-hiring-card::before,
body.tbi-hover-fx .shopify-services-card::before,
body.tbi-hover-fx .shopify-work-card::before,
body.tbi-hover-fx .shopify-team-card::before {
  content: "";
  position: absolute;
  top: -50%;
  left: -50%;
  z-index: 0;
  width: 200%;
  height: 200%;
  background: linear-gradient(
    0deg,
    transparent,
    transparent 30%,
    var(--tbi-card-sheen)
  );
  transform: rotate(-45deg);
  opacity: 0;
  pointer-events: none;
  transition: transform 0.55s ease, opacity 0.45s ease;
}

body.tbi-hover-fx .hrf-ai__card:hover,
body.tbi-hover-fx .hrf-svc__card:hover,
body.tbi-hover-fx .hrf-work__card:hover,
body.tbi-hover-fx .hrf-hm__card:hover,
body.tbi-hover-fx .hrf-related__card:hover,
body.tbi-hover-fx .hrf-related__card:focus-visible,
body.tbi-hover-fx .svcl-platforms__card:hover,
body.tbi-hover-fx .svcl-insights__card:hover,
body.tbi-hover-fx .aiaa-gap__card:hover,
body.tbi-hover-fx .aiaa-lm__card:hover,
body.tbi-hover-fx .aiaa-work__card:hover,
body.tbi-hover-fx .aib-problems__card:hover,
body.tbi-hover-fx .aib-work__card:hover,
body.tbi-hover-fx .aib-opps__card:hover,
body.tbi-hover-fx .aud-numcard:hover,
body.tbi-hover-fx .aids-gap__card:hover,
body.tbi-hover-fx .aids-cap__card:hover,
body.tbi-hover-fx .aids-ess__card:hover,
body.tbi-hover-fx .shopify-hire-card:hover,
body.tbi-hover-fx .shopify-hire-card:focus-within,
body.tbi-hover-fx .shopify-hiring-card:hover,
body.tbi-hover-fx .shopify-hiring-card:focus-within,
body.tbi-hover-fx .shopify-services-card:hover,
body.tbi-hover-fx .shopify-services-card:focus-within,
body.tbi-hover-fx .shopify-work-card:hover,
body.tbi-hover-fx .shopify-team-card:hover,
body.tbi-hover-fx .shopify-team-card:focus-within {
  transform: scale(var(--tbi-card-scale));
  box-shadow: var(--tbi-card-glow);
  /* a lifted card must never slide under the neighbour it grew into */
  z-index: 2;
}

body.tbi-hover-fx .hrf-ai__card:hover::before,
body.tbi-hover-fx .hrf-svc__card:hover::before,
body.tbi-hover-fx .hrf-work__card:hover::before,
body.tbi-hover-fx .hrf-hm__card:hover::before,
body.tbi-hover-fx .hrf-related__card:hover::before,
body.tbi-hover-fx .hrf-related__card:focus-visible::before,
body.tbi-hover-fx .svcl-platforms__card:hover::before,
body.tbi-hover-fx .svcl-insights__card:hover::before,
body.tbi-hover-fx .aiaa-gap__card:hover::before,
body.tbi-hover-fx .aiaa-lm__card:hover::before,
body.tbi-hover-fx .aiaa-work__card:hover::before,
body.tbi-hover-fx .aib-problems__card:hover::before,
body.tbi-hover-fx .aib-work__card:hover::before,
body.tbi-hover-fx .aib-opps__card:hover::before,
body.tbi-hover-fx .aud-numcard:hover::before,
body.tbi-hover-fx .aids-gap__card:hover::before,
body.tbi-hover-fx .aids-cap__card:hover::before,
body.tbi-hover-fx .aids-ess__card:hover::before,
body.tbi-hover-fx .shopify-hire-card:hover::before,
body.tbi-hover-fx .shopify-hire-card:focus-within::before,
body.tbi-hover-fx .shopify-hiring-card:hover::before,
body.tbi-hover-fx .shopify-hiring-card:focus-within::before,
body.tbi-hover-fx .shopify-services-card:hover::before,
body.tbi-hover-fx .shopify-services-card:focus-within::before,
body.tbi-hover-fx .shopify-work-card:hover::before,
body.tbi-hover-fx .shopify-team-card:hover::before,
body.tbi-hover-fx .shopify-team-card:focus-within::before {
  opacity: 1;
  transform: rotate(-45deg) translateY(100%);
}

/* The wide cards grow into a 20px gap, so they lift less. 1.03 on 840-920px
   would add 25-28px of width (13-14px a side) against that 20px gap and
   collide with the neighbour; 1.02 adds 17-18px (9px a side) and clears. */
body.tbi-hover-fx .hrf-work__card,
body.tbi-hover-fx .aiaa-work__card,
body.tbi-hover-fx .shopify-work-card {
  --tbi-card-scale: 1.02;
}

/* LIGHT-SURFACE VARIANT. These cards sit on a white or near-white
   section, where a neon bloom reads as a blur rather than a glow. They
   get a lifted shadow plus a purple rim, and a lighter sheen.
     hrf-hm__card           #fff on #fff
     hrf-related__card      #faf9fd on #fff
     svcl-platforms__card   rgba(255,255,255,.02) on #fff — a hairline card
     aib-opps__card         #fff on #faf9fd
     aids-ess__card         rgba(255,255,255,.02) on #fefefe
     shopify-team-card      #fff on #fff                                  */
body.tbi-hover-fx .hrf-hm__card,
body.tbi-hover-fx .hrf-related__card,
body.tbi-hover-fx .aib-opps__card,
body.tbi-hover-fx .shopify-team-card {
  --tbi-card-sheen: rgba(161, 0, 255, 0.14);
  --tbi-card-glow: 0 10px 28px 0 rgba(161, 0, 255, 0.22),
                   0 0 0 1px rgba(161, 0, 255, 0.28);
}

body.tbi-hover-fx .svcl-platforms__card,
body.tbi-hover-fx .aids-ess__card {
  --tbi-card-sheen: rgba(161, 0, 255, 0.16);
  --tbi-card-glow: 0 10px 28px 0 rgba(161, 0, 255, 0.2),
                   0 0 0 1px rgba(161, 0, 255, 0.24);
}

@media (prefers-reduced-motion: reduce) {
  body.tbi-hover-fx .hrf-ai__card,
  body.tbi-hover-fx .hrf-svc__card,
  body.tbi-hover-fx .hrf-work__card,
  body.tbi-hover-fx .hrf-hm__card,
  body.tbi-hover-fx .hrf-related__card,
  body.tbi-hover-fx .svcl-platforms__card,
  body.tbi-hover-fx .svcl-insights__card,
  body.tbi-hover-fx .aiaa-gap__card,
  body.tbi-hover-fx .aiaa-lm__card,
  body.tbi-hover-fx .aiaa-work__card,
  body.tbi-hover-fx .aib-problems__card,
  body.tbi-hover-fx .aib-work__card,
  body.tbi-hover-fx .aib-opps__card,
  body.tbi-hover-fx .aud-numcard,
  body.tbi-hover-fx .aids-gap__card,
  body.tbi-hover-fx .aids-cap__card,
  body.tbi-hover-fx .aids-ess__card,
  body.tbi-hover-fx .shopify-hire-card,
  body.tbi-hover-fx .shopify-hiring-card,
  body.tbi-hover-fx .shopify-services-card,
  body.tbi-hover-fx .shopify-work-card,
  body.tbi-hover-fx .shopify-team-card {
    transition: box-shadow 0.2s ease;
  }

  body.tbi-hover-fx .hrf-ai__card:hover,
  body.tbi-hover-fx .hrf-svc__card:hover,
  body.tbi-hover-fx .hrf-work__card:hover,
  body.tbi-hover-fx .hrf-hm__card:hover,
  body.tbi-hover-fx .hrf-related__card:hover,
  body.tbi-hover-fx .svcl-platforms__card:hover,
  body.tbi-hover-fx .svcl-insights__card:hover,
  body.tbi-hover-fx .aiaa-gap__card:hover,
  body.tbi-hover-fx .aiaa-lm__card:hover,
  body.tbi-hover-fx .aiaa-work__card:hover,
  body.tbi-hover-fx .aib-problems__card:hover,
  body.tbi-hover-fx .aib-work__card:hover,
  body.tbi-hover-fx .aib-opps__card:hover,
  body.tbi-hover-fx .aud-numcard:hover,
  body.tbi-hover-fx .aids-gap__card:hover,
  body.tbi-hover-fx .aids-cap__card:hover,
  body.tbi-hover-fx .aids-ess__card:hover,
  body.tbi-hover-fx .shopify-hire-card:hover,
  body.tbi-hover-fx .shopify-hire-card:focus-within,
  body.tbi-hover-fx .shopify-hiring-card:hover,
  body.tbi-hover-fx .shopify-hiring-card:focus-within,
  body.tbi-hover-fx .shopify-services-card:hover,
  body.tbi-hover-fx .shopify-services-card:focus-within,
  body.tbi-hover-fx .shopify-work-card:hover,
  body.tbi-hover-fx .shopify-team-card:hover,
  body.tbi-hover-fx .shopify-team-card:focus-within {
    transform: none;
  }

  /* keep the glow as the hover affordance, drop the moving sheen */
  body.tbi-hover-fx .hrf-ai__card::before,
  body.tbi-hover-fx .hrf-svc__card::before,
  body.tbi-hover-fx .hrf-work__card::before,
  body.tbi-hover-fx .hrf-hm__card::before,
  body.tbi-hover-fx .hrf-related__card::before,
  body.tbi-hover-fx .svcl-platforms__card::before,
  body.tbi-hover-fx .svcl-insights__card::before,
  body.tbi-hover-fx .aiaa-gap__card::before,
  body.tbi-hover-fx .aiaa-lm__card::before,
  body.tbi-hover-fx .aiaa-work__card::before,
  body.tbi-hover-fx .aib-problems__card::before,
  body.tbi-hover-fx .aib-work__card::before,
  body.tbi-hover-fx .aib-opps__card::before,
  body.tbi-hover-fx .aud-numcard::before,
  body.tbi-hover-fx .aids-gap__card::before,
  body.tbi-hover-fx .aids-cap__card::before,
  body.tbi-hover-fx .aids-ess__card::before,
  body.tbi-hover-fx .shopify-hire-card::before,
  body.tbi-hover-fx .shopify-hiring-card::before,
  body.tbi-hover-fx .shopify-services-card::before,
  body.tbi-hover-fx .shopify-work-card::before,
  body.tbi-hover-fx .shopify-team-card::before {
    display: none;
  }
}

/* =====================================================================
 * §4  CARD HOVER, tier 2 — the hairline-grid cells
 *
 * Same holographic sheen as §3, applied to the other card pattern in
 * these families: a bordered grid cell carrying a title, a description
 * and a corner arrow.
 *
 *   svcl-catalog__card  "What we do" routing grid, 11-20 cells, 4 columns,
 *                       dark #0c0819 section, purple hairlines.
 *                       Service LANDING pages only (5 templates).
 *   hrf-other__link     cross-sell row, 4 cells, light #faf9fd section,
 *                       grey #e4e2e9 hairlines. All three Figma families.
 *
 * **These two deliberately do NOT scale, unlike §3.** The grid lines here
 * are drawn by the cells themselves — `.svcl-catalog__grid` sets
 * border-top/left and each card adds border-right/bottom;
 * `.hrf-other__row` sets border-top and each link adds border-left — and
 * the cells sit at a measured gap of exactly 0. Scaling one cell
 * therefore moves its own borders out of alignment with its neighbours'
 * and visibly tears the grid. The hover affordance is instead the sheen
 * sweep, a background tint and a brightened border, which leaves every
 * border on its pixel.
 *
 * The corner arrow is `position: absolute` in both, so the content lift
 * below excludes it (turning it into `position: relative` would drop it
 * out of its top/right corner); it gets its own z-index instead. This is
 * the card that made a blanket `> *` rule unsafe.
 * ===================================================================== */

body.tbi-hover-fx .svcl-catalog__card,
body.tbi-hover-fx .hrf-other__link {
  overflow: hidden;
  isolation: isolate;
  transition: background-color 0.4s ease, border-color 0.4s ease;
}

body.tbi-hover-fx .svcl-catalog__card > *:not(.svcl-catalog__card-arrow),
body.tbi-hover-fx .hrf-other__link > *:not(.hrf-other__link-arrow) {
  position: relative;
  z-index: 1;
}

body.tbi-hover-fx .svcl-catalog__card-arrow,
body.tbi-hover-fx .hrf-other__link-arrow {
  z-index: 1;
}

body.tbi-hover-fx .svcl-catalog__card::before,
body.tbi-hover-fx .hrf-other__link::before {
  content: "";
  position: absolute;
  top: -50%;
  left: -50%;
  z-index: 0;
  width: 200%;
  height: 200%;
  background: linear-gradient(
    0deg,
    transparent,
    transparent 30%,
    var(--tbi-cell-sheen)
  );
  transform: rotate(-45deg);
  opacity: 0;
  pointer-events: none;
  transition: transform 0.55s ease, opacity 0.45s ease;
}

body.tbi-hover-fx .svcl-catalog__card:hover::before,
body.tbi-hover-fx .hrf-other__link:hover::before {
  opacity: 1;
  transform: rotate(-45deg) translateY(100%);
}

/* dark grid — purple hairlines on #0c0819 */
body.tbi-hover-fx .svcl-catalog__card {
  --tbi-cell-sheen: rgba(161, 0, 255, 0.26);
}

body.tbi-hover-fx .svcl-catalog__card:hover {
  background-color: rgba(112, 55, 255, 0.07);
  border-right-color: rgba(112, 55, 255, 0.42);
  border-bottom-color: rgba(112, 55, 255, 0.42);
}

/* light grid — grey hairlines on #faf9fd */
body.tbi-hover-fx .hrf-other__link {
  --tbi-cell-sheen: rgba(161, 0, 255, 0.12);
}

body.tbi-hover-fx .hrf-other__link:hover,
body.tbi-hover-fx .hrf-other__link:focus-visible {
  background-color: rgba(161, 0, 255, 0.10);
  border-left-color: rgba(161, 0, 255, 0.55);
}

body.tbi-hover-fx .hrf-other__link:hover .hrf-other__link-title,
body.tbi-hover-fx .hrf-other__link:focus-visible .hrf-other__link-title {
  color: #7037ff;
}

body.tbi-hover-fx .hrf-other__link .hrf-other__link-arrow {
  transition: transform 0.25s ease;
}

body.tbi-hover-fx .hrf-other__link:hover .hrf-other__link-arrow,
body.tbi-hover-fx .hrf-other__link:focus-visible .hrf-other__link-arrow {
  transform: translate(3px, -3px);
}

@media (prefers-reduced-motion: reduce) {
  body.tbi-hover-fx .svcl-catalog__card::before,
  body.tbi-hover-fx .hrf-other__link::before {
    display: none;
  }
}

/* =====================================================================
 * §5  REDUCED MOTION for the buttons
 *
 * Buttons no longer move at all — the zoom was removed on 2026-09-18 — so
 * there is no transform for reduced motion to neutralise. What is left is
 * the colour/shadow fade, which is dropped here so a hover is instant
 * rather than animated. The glow itself is a static affordance and stays.
 * Kept at the end of the file so it wins over §1/§2 on load order rather
 * than on a specificity hack.
 * ===================================================================== */

@media (prefers-reduced-motion: reduce) {
  body.tbi-hover-fx .hrf-cta2__btn,
  body.tbi-hover-fx .hrf-ai__cta-btn,
  body.tbi-hover-fx .automate__btn,
  body.tbi-hover-fx .aiaa-lm__cta-btn,
  body.tbi-hover-fx .aiaa-midcta__btn,
  body.tbi-hover-fx .aiaa-final__btn,
  body.tbi-hover-fx .aib-btn,
  body.tbi-hover-fx .aud-form__submit,
  body.tbi-hover-fx .aids-btn,
  body.tbi-hover-fx .svcl-insights__all,
  body.tbi-hover-fx .shopify-cta__button,
  body.tbi-hover-fx .shopify-stats__cta {
    transition: none;
  }
}

/* =====================================================================
 * §6  TOUCH GUARD
 *
 * On a touch device :hover latches on tap and does not clear until the
 * next tap elsewhere, so a tapped card stays scaled and glowing while
 * the page scrolls under it, and the sheen re-sweeps on every tap. The
 * legacy shopify.css already had a guard like this for its own cards;
 * nothing else did, which was one more way these pages differed. It now
 * covers every component in this file.
 *
 * Only the MOTION and the bloom are dropped. The tier-2 cells keep their
 * background tint, which is a useful "you tapped this" acknowledgement
 * and costs no layout. Buttons need no entry at all any more: since the
 * zoom was removed on 2026-09-18 their hover is a filter change, which
 * neither latches visibly nor moves anything.
 * ===================================================================== */

@media (hover: none) and (pointer: coarse) {
  body.tbi-hover-fx .hrf-ai__card:hover,
  body.tbi-hover-fx .hrf-svc__card:hover,
  body.tbi-hover-fx .hrf-work__card:hover,
  body.tbi-hover-fx .hrf-hm__card:hover,
  body.tbi-hover-fx .hrf-related__card:hover,
  body.tbi-hover-fx .svcl-platforms__card:hover,
  body.tbi-hover-fx .svcl-insights__card:hover,
  body.tbi-hover-fx .aiaa-gap__card:hover,
  body.tbi-hover-fx .aiaa-lm__card:hover,
  body.tbi-hover-fx .aiaa-work__card:hover,
  body.tbi-hover-fx .aib-problems__card:hover,
  body.tbi-hover-fx .aib-work__card:hover,
  body.tbi-hover-fx .aib-opps__card:hover,
  body.tbi-hover-fx .aud-numcard:hover,
  body.tbi-hover-fx .aids-gap__card:hover,
  body.tbi-hover-fx .aids-cap__card:hover,
  body.tbi-hover-fx .aids-ess__card:hover,
  body.tbi-hover-fx .shopify-hire-card:hover,
  body.tbi-hover-fx .shopify-hiring-card:hover,
  body.tbi-hover-fx .shopify-services-card:hover,
  body.tbi-hover-fx .shopify-work-card:hover,
  body.tbi-hover-fx .shopify-team-card:hover,
  body.tbi-hover-fx .shopify-hiring-card:focus-within,
  body.tbi-hover-fx .shopify-services-card:focus-within,
  body.tbi-hover-fx .shopify-team-card:focus-within,
  body.tbi-hover-fx .shopify-hire-card:focus-within {
    transform: none;
    box-shadow: none;
  }

  body.tbi-hover-fx .hrf-ai__card:hover::before,
  body.tbi-hover-fx .hrf-svc__card:hover::before,
  body.tbi-hover-fx .hrf-work__card:hover::before,
  body.tbi-hover-fx .hrf-hm__card:hover::before,
  body.tbi-hover-fx .hrf-related__card:hover::before,
  body.tbi-hover-fx .svcl-platforms__card:hover::before,
  body.tbi-hover-fx .svcl-insights__card:hover::before,
  body.tbi-hover-fx .aiaa-gap__card:hover::before,
  body.tbi-hover-fx .aiaa-lm__card:hover::before,
  body.tbi-hover-fx .aiaa-work__card:hover::before,
  body.tbi-hover-fx .aib-problems__card:hover::before,
  body.tbi-hover-fx .aib-work__card:hover::before,
  body.tbi-hover-fx .aib-opps__card:hover::before,
  body.tbi-hover-fx .aud-numcard:hover::before,
  body.tbi-hover-fx .aids-gap__card:hover::before,
  body.tbi-hover-fx .aids-cap__card:hover::before,
  body.tbi-hover-fx .aids-ess__card:hover::before,
  body.tbi-hover-fx .shopify-hire-card:hover::before,
  body.tbi-hover-fx .shopify-hiring-card:hover::before,
  body.tbi-hover-fx .shopify-services-card:hover::before,
  body.tbi-hover-fx .shopify-work-card:hover::before,
  body.tbi-hover-fx .shopify-team-card:hover::before,
  body.tbi-hover-fx .svcl-catalog__card:hover::before,
  body.tbi-hover-fx .hrf-other__link:hover::before {
    opacity: 0;
  }
}
