/* ===========================================================
   Tecnoprism Talent — main stylesheet
   Colors come from CSS custom properties printed by tp_print_theme_vars()
   in <head> (see inc/helpers.php) — the Sea Mint palette derivation.
   =========================================================== */

/* Inter (secondary/body font) — self-hosted variable font, files from
   the client-supplied Google Fonts export (assets/fonts/, OFL-licensed).
   Josefin Sans (primary/heading font) still loads from Google Fonts —
   see the font <link> in inc/setup.php. */
@font-face {
  font-family: 'Inter';
  src: url('../fonts/Inter-Variable.ttf') format('truetype-variations');
  font-weight: 100 900;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: 'Inter';
  src: url('../fonts/Inter-Italic-Variable.ttf') format('truetype-variations');
  font-weight: 100 900;
  font-style: italic;
  font-display: swap;
}

*, *::before, *::after { box-sizing: border-box; }
html, body { margin: 0; padding: 0; background: #FFFFFF; }
body { font-family: 'Inter', system-ui, sans-serif; color: #141C2B; }
img { max-width: 100%; display: block; }
a { color: #3D1B2E; text-decoration: none; }
a:hover { color: #2B1622; }

.tp-container { max-width: 1240px; margin: 0 auto; padding: 0 40px; }

/* ---- keyframes ---- */
@keyframes heroRise { from { opacity: 0; transform: translateY(18px); } to { opacity: 1; transform: translateY(0); } }
@keyframes riseDrift { from { transform: translateY(6%) scale(1); } to { transform: translateY(-5%) scale(1.1); } }
@keyframes cubeFloat { from { transform: translateY(0) rotate(0deg); } to { transform: translateY(-26px) rotate(9deg); } }
@keyframes tickerScroll { from { transform: translateX(0); } to { transform: translateX(-50%); } }
@keyframes bentoDot { 0%, 100% { opacity: 0.22; } 50% { opacity: 1; } }
@keyframes barPulse { from { transform: scaleY(0.3); } to { transform: scaleY(1); } }

/* ---- scroll reveal (JS flips opacity/transform inline once visible) ---- */
[data-reveal] { opacity: 0; transform: translateY(26px); transition: opacity 800ms cubic-bezier(0.16,1,0.3,1), transform 800ms cubic-bezier(0.16,1,0.3,1); }
/* Homepage-only: slower + a touch of travel distance so the fade is
   clearly perceptible instead of reading as instant — the small
   delay also guards against the browser batching the opacity:0 ->1
   flip into the same frame as first paint, which can make an 800ms
   transition look like it never ran at all. */
body.home [data-reveal] { transform: translateY(36px); transition: opacity 1400ms cubic-bezier(0.16,1,0.3,1) 120ms, transform 1400ms cubic-bezier(0.16,1,0.3,1) 120ms; }

/* ---- hovercard mechanics (services + insights cards) ---- */
[data-hovercard] { position: relative; }
[data-hovercard] [data-fill] { opacity: 0; transition: opacity 700ms cubic-bezier(0.2,0.8,0.2,1); }
[data-hovercard]:hover [data-fill] { opacity: 0.9; }
[data-hovercard] [data-cardtitle], [data-hovercard] [data-cardbody], [data-hovercard] [data-cardnum] { transition: color 400ms cubic-bezier(0.2,0.8,0.2,1); }
[data-hovercard]:hover [data-cardtitle] { color: var(--ink-deep, #2B1622) !important; font-weight: 700 !important; }
[data-hovercard]:hover [data-cardbody] { color: var(--ink-deep, #2B1622) !important; font-weight: 600 !important; }
[data-hovercard]:hover [data-cardnum] { color: var(--ink, #3D1B2E) !important; }
#services [data-hovercard] [data-cardtitle] { background-image: linear-gradient(90deg, var(--mid, #AF8B91) 0%, var(--ink, #3D1B2E) 70%); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; }
#services [data-hovercard]:hover [data-cardtitle] { background-image: none; -webkit-text-fill-color: var(--ink-deep, #2B1622); }
/* Services cards use the shared [data-hovercard]:hover [data-fill]
   rule above with no #services-specific override — a static mint ->
   cyan -> white sweep that fades in and holds, no looping animation. */

/* ---- shared: eyebrow / h2 / pill+solid buttons ---- */
.tp-eyebrow { font-family: 'Inter', sans-serif; font-size: 15px; font-weight: 500; letter-spacing: 0.18em; text-transform: uppercase; color: var(--mid, #AF8B91); }
.tp-eyebrow--light { color: var(--soft, #F8CFD5); }
.tp-h2 { font-family: 'Josefin Sans', sans-serif; font-weight: 500; font-size: clamp(36px, 4vw, 48px); line-height: 1.1; letter-spacing: -0.015em; margin: 0; color: #141C2B; text-wrap: pretty; }
.tp-h2--light { color: #FFFFFF; }

.tp-pill-btn { display: inline-flex; align-items: center; gap: 12px; font-size: 16px; font-weight: 600; color: #141C2B; background: #FFFFFF; border-radius: 999px; padding: 12px 28px 12px 12px; box-shadow: 0 8px 24px rgba(20,28,43,0.14); }
.tp-pill-btn:hover { color: #141C2B; }
.tp-pill-btn__icon { display: flex; align-items: center; justify-content: center; width: 22px; height: 22px; border-radius: 50%; background: var(--mid, #AF8B91); transition: width 240ms cubic-bezier(0.2,0.8,0.2,1), height 240ms cubic-bezier(0.2,0.8,0.2,1); flex: 0 0 auto; }
.tp-pill-btn__arrow { color: #FFFFFF; font-size: 14px; line-height: 1; opacity: 0; transition: opacity 160ms; }
.tp-pill-btn:hover .tp-pill-btn__icon { width: 36px; height: 36px; }
.tp-pill-btn:hover .tp-pill-btn__arrow { opacity: 1; }
.tp-pill-btn--dark { box-shadow: 0 8px 24px rgba(0,0,0,0.28); padding: 10px 24px 10px 10px; font-size: 15px; }
.tp-pill-btn--dark .tp-pill-btn__icon { background: var(--ink, #3D1B2E); }

.tp-solid-btn { display: inline-block; font-size: 16px; font-weight: 600; letter-spacing: 0.01em; color: #FFFFFF; background: #3D1B2E; padding: 15px 30px; border-radius: 10px; box-shadow: 0 8px 20px rgba(61,27,46,0.28); transition: background 220ms cubic-bezier(0.2,0.8,0.2,1), transform 220ms cubic-bezier(0.2,0.8,0.2,1), box-shadow 220ms cubic-bezier(0.2,0.8,0.2,1); }
/* Same lift/scale/shadow treatment as the nav's Find jobs button
   (.tp-nav__cta:hover) — this is the hero's "Browse talent" button. */
.tp-solid-btn:hover { background: #2B1622; color: #FFFFFF; transform: translateY(-2px) scale(1.03); box-shadow: 0 14px 30px rgba(61,27,46,0.4); }
.tp-solid-btn:active { transform: translateY(-1px) scale(1.01); }

/* ===========================================================
   HERO
   =========================================================== */
/* Static approximation of the WebGL shader's own colors (mint -> cyan ->
   white, see tp_shader_url()'s color1/color2/color3) — paints instantly
   on first load, before the ~340KB shader-bg bundle has even finished
   downloading, let alone booted WebGL. <shader-bg> sits on top of this
   at inset:0 and fades itself in once mounted (see shader-bg.js), so
   this is what's visible during that gap instead of a blank/white hero;
   once the canvas starts painting real frames it simply layers over it,
   no coordination needed between this CSS and the shader's own JS. */
.tp-hero { position: relative; width: 100%; overflow: hidden; background: radial-gradient(120% 90% at 25% 8%, var(--p1, #FF8063) 0%, var(--p2, #E5C5FA) 32%, var(--wash-b, #FBE5E8) 62%, #FFFFFF 100%); min-height: 100vh; min-height: 100dvh; display: flex; flex-direction: column; }
/* !important + the descendant wildcard: the shader is a 3rd-party WebGL
   library (@shadergradient/react, loaded from a CDN) that makes its
   canvas mouse-reactive for the distortion effect — it can set
   pointer-events on elements it creates internally, which silently
   defeats a plain pointer-events:none on just the wrapper, since that
   doesn't override a more specific style the library sets on its own
   descendant. This forces every element inside it to stay non-
   interactive regardless of what the library does. */
.tp-hero__shader, .tp-hero__shader * { pointer-events: none !important; }
.tp-hero__shader { display: block; position: absolute; inset: 0; z-index: 0 !important; }
/* Static approximation of the shadergradient (same coral/lavender/white
   palette as tp_palette()) shown instantly behind <shader-bg>, since
   the real WebGL canvas takes a beat to mount. Sits at z-index -1 (one
   below .tp-hero__shader's own 0), so it's fully visible while the
   canvas is still transparent/mounting, then gets naturally covered as
   the canvas fades in on top of it — no JS/timing coordination needed,
   just CSS stacking. */
.tp-hero__shader-poster {
  position: absolute; inset: 0; z-index: -1;
  background:
    radial-gradient(55% 50% at 18% 12%, rgba(255,128,99,0.6) 0%, transparent 62%),
    radial-gradient(50% 45% at 78% 28%, rgba(229,197,250,0.55) 0%, transparent 65%),
    radial-gradient(65% 55% at 45% 85%, rgba(255,255,255,0.45) 0%, transparent 70%),
    radial-gradient(120% 90% at 25% 8%, #FF8063 0%, #E5C5FA 32%, #FBE5E8 62%, #FFFFFF 100%);
  filter: blur(50px);
}
.tp-hero__veil { position: absolute; inset: 0; pointer-events: none; background: linear-gradient(180deg, rgba(255,255,255,0.18) 0%, rgba(255,255,255,0.05) 45%, rgba(255,255,255,0.35) 100%); }

/* z-index must beat .tp-hero__inner's (2) — equal z-index siblings stack
   by DOM order, and .tp-hero__inner comes after <nav> in the markup, so
   it was painting over the dropdown panel where the two visually
   overlap (panel opens downward into the space .tp-hero__inner starts
   in). The panel's own z-index:40 can't fix this alone since it's
   trapped inside .tp-nav's own stacking context. */
/* Gradual-blur strip — layered divs (built in main.js initNavBlur, same
   algorithm as the react-bits GradualBlur component) each masked to a
   horizontal band and given a progressively stronger backdrop-filter,
   so content scrolling past fades from sharp to blurred instead of an
   abrupt cutoff. Mobile-only: pinned to the BOTTOM of the screen there
   (blur strongest right at the bottom edge, fading upward), not shown
   on desktop at all — desktop keeps a plain floating nav with no blur
   strip under it. Only shown while actively scrolling down — toggled
   via .is-visible by the scroll-direction listener — and hidden again
   on scroll-up or near the top of the page. */
.tp-nav-blur { display: none; }
.tp-nav-blur.is-visible { opacity: 1; }
.tp-nav-blur__layer { position: absolute; inset: 0; }
@media (max-width: 980px) {
  .tp-nav-blur { display: block; position: fixed; top: auto; bottom: 0; left: 0; right: 0; height: 6rem; z-index: 8; pointer-events: none; opacity: 0; transition: opacity 320ms ease; isolation: isolate; }
}

/* Fixed (not sticky) deliberately — .tp-hero/.tp-pagehero have
   overflow:hidden (needed to contain the WebGL/canvas backgrounds),
   which clips position:sticky to that box's own height instead of the
   full page, so the nav would only "stick" for the first screen of
   scrolling then vanish once the hero section ends. position:fixed
   isn't affected by an ancestor's overflow, so it stays visible for
   the entire page on every template. Hero/pagehero __inner padding is
   bumped below to compensate for the nav no longer taking up space in
   normal flow. */
.tp-nav { position: relative; z-index: 10; display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; width: 100%; padding: 24px 48px 0 48px; }
/* Navbar redesign ("3c/4c" handoff) — floating pill bar instead of 3
   separate chips (brand / links / CTA). Brand and the item slider both
   drop their own individual chip styling below since they're now one
   continuous glass surface. */
.tp-nav--pill { margin: 24px 40px 0; padding: 10px 10px 10px 8px; border-radius: 999px; background: rgba(255,255,255,0.55); border: 1px solid rgba(255,255,255,0.8); backdrop-filter: blur(16px) saturate(150%); -webkit-backdrop-filter: blur(16px) saturate(150%); box-shadow: 0 14px 40px rgba(20,15,19,0.12), inset 0 1px 0 rgba(255,255,255,0.7); width: auto; }
.tp-nav__brand { display: flex; align-items: center; gap: 14px; justify-self: start; padding: 12px 20px 12px 16px; border: 1.5px solid rgba(255,172,154,0.9); border-radius: 12px; background: rgba(251,229,232,0.6); backdrop-filter: blur(8px); }
.tp-nav--pill .tp-nav__brand { border: none; background: transparent; backdrop-filter: none; -webkit-backdrop-filter: none; padding: 8px 12px; }
/* Logo SVGs (assets/img/logo-*.svg) are already background-free —
   just a fixed-height, auto-width image, no card/backdrop of its own. */
.tp-nav__logo, .tp-subnav__logo, .tp-footer__logo { display: flex; align-items: center; }
/* Brand box height is pinned back to its original (pre-logo-bump) size
   so the pill itself stays the original length — the logo image is
   allowed to render larger than that box and overflow above/below it
   (overflow: visible), rather than growing the whole pill to fit. */
.tp-nav--pill .tp-nav__brand, .tp-subnav--pill .tp-subnav__brand { height: 42px; overflow: visible; }
.tp-nav__logo-img, .tp-subnav__logo-img { height: 58px; width: auto; display: block; }
.tp-nav__slider, .tp-subnav__slider { position: relative; display: flex; align-items: center; gap: 2px; justify-self: center; }
.tp-nav__cta-wrap { display: flex; justify-content: flex-end; align-items: center; }
.tp-nav__cta { font-size: 15px; font-weight: 600; letter-spacing: 0.01em; color: #FFFFFF; padding: 11px 22px; border-radius: 999px; background: #3D1B2E; box-shadow: 0 8px 20px rgba(61,27,46,0.28); transition: background 220ms cubic-bezier(0.2,0.8,0.2,1), transform 220ms cubic-bezier(0.2,0.8,0.2,1), box-shadow 220ms cubic-bezier(0.2,0.8,0.2,1); }
.tp-nav__cta:hover { background: #2B1622; color: #FFFFFF; transform: translateY(-2px) scale(1.03); box-shadow: 0 14px 30px rgba(61,27,46,0.4); }
.tp-nav__cta:active { transform: translateY(-1px) scale(1.01); }

/* ---- desktop dropdowns (Services / Industries / Solutions / Insights / About) ---- */
.tp-nav__dropdown { position: relative; }
/* Shared by both the homepage nav and every subpage's nav (markup
   combines this with .tp-subnav__trigger) — 15px -> 19.5px is the
   requested +30% for laptop/desktop; this rule only ever renders in
   the desktop nav bar (mobile uses the separate .tp-nav-mobile a
   rules), so no extra breakpoint-scoping needed. */
.tp-nav__dropdown-trigger { all: unset; box-sizing: border-box; position: relative; z-index: 1; cursor: pointer; display: inline-flex; align-items: center; gap: 6px; font-family: inherit; font-size: 17px; font-weight: 500; color: #141C2B; padding: 10px 16px 16px; border-radius: 999px; transition: color 180ms; }
.tp-nav__dropdown-trigger:hover { color: #3D1B2E; }
/* 3c hover effect: a thin gradient underline grows from left to right
   under the individual item, instead of a shared sliding highlight pill. */
.tp-nav__dropdown-trigger::after { content: ""; position: absolute; left: 18px; right: 18px; bottom: 5px; height: 3px; border-radius: 2px; background: linear-gradient(90deg, #FFAC9A, #F2A3AF, #3D1B2E); box-shadow: 0 0 8px rgba(242,163,175,0.5); transform: scaleX(0); transform-origin: left center; transition: transform 260ms cubic-bezier(0.2,0.8,0.2,1); pointer-events: none; }
.tp-nav__dropdown:hover .tp-nav__dropdown-trigger::after { transform: scaleX(1); }
.tp-subnav__trigger::after { background: linear-gradient(90deg, #FFAC9A, #F2A3AF, #3D1B2E); box-shadow: 0 0 8px rgba(242,163,175,0.5); }
.tp-nav__caret { display: inline-block; font-size: 10px; transition: transform 200ms cubic-bezier(0.2,0.8,0.2,1); }
/* Opening is click/:focus-within driven (see the rule below), not raw
   :hover, so a real margin-top gap here is safe — no hoverable-hitbox
   to break. Matches the design's floating-below-the-pill look. */
.tp-nav__dropdown-panel { display: none; position: absolute; top: 100%; left: 50%; transform: translateX(-50%); width: 280px; background: rgba(255,255,255,0.98); border: 1px solid rgba(255,172,154,0.9); border-radius: 16px; padding: 18px 8px 8px; margin-top: 10px; box-shadow: 0 28px 70px rgba(20,15,19,0.16); z-index: 40; }
.tp-nav__dropdown-panel a, .tp-nav__dropdown-empty { display: block; font-size: 15px; font-weight: 500; line-height: 1.4; color: #141C2B; padding: 10px 12px; border-radius: 8px; white-space: normal; transition: background 150ms, color 150ms; }
.tp-nav__dropdown-panel a:hover { background: rgba(255,223,216,0.7); color: #3D1B2E; }
.tp-nav__dropdown-empty { color: #8A93A3; cursor: default; }
/* Services mega-dropdown — 3 labeled columns instead of a flat list.
   display:grid is set only in the open-state rules below — setting it
   here unconditionally used to override the panel's own `display:none`
   and left the Services dropdown visibly open on page load. */
.tp-nav__dropdown-panel--mega { width: 640px; grid-template-columns: repeat(3, 1fr); gap: 18px; padding: 20px; }
.tp-nav__dropdown-col { display: flex; flex-direction: column; gap: 2px; }
.tp-nav__dropdown-col-label { font-family: 'Inter', sans-serif; font-size: 11px; font-weight: 500; letter-spacing: 0.12em; text-transform: uppercase; color: var(--mid, #AF8B91); padding: 0 12px 6px; }
.tp-nav__dropdown-col a { font-size: 14px; padding: 8px 12px; }
/* JS-controlled only (.is-open) — raw CSS :hover here was closing the
   panel mid-click if the mouse position flickered out of the hover
   zone for even a frame while moving toward a link, eating the
   navigation. :focus-within kept for keyboard/tab access. */
.tp-nav__dropdown:focus-within .tp-nav__dropdown-panel, .tp-nav__dropdown.is-open .tp-nav__dropdown-panel { display: block; }
.tp-nav__dropdown:focus-within .tp-nav__dropdown-panel--mega, .tp-nav__dropdown.is-open .tp-nav__dropdown-panel--mega { display: grid; }
.tp-nav__dropdown.is-open .tp-nav__caret { transform: rotate(180deg); }
.tp-nav__dropdown:hover .tp-nav__caret, .tp-nav__dropdown:focus-within .tp-nav__caret { transform: rotate(180deg); }

/* ---- plain top-level nav link (Contact) — same box/hover as the
   dropdown triggers, minus the caret/panel. ---- */
.tp-nav__link { position: relative; display: inline-flex; align-items: center; font-size: 17px; font-weight: 500; color: #141C2B; padding: 10px 16px 16px; border-radius: 999px; transition: color 180ms; }
.tp-nav__link:hover { color: #3D1B2E; }
.tp-nav__link::after { content: ""; position: absolute; left: 18px; right: 18px; bottom: 5px; height: 3px; border-radius: 2px; background: linear-gradient(90deg, #FFAC9A, #F2A3AF, #3D1B2E); box-shadow: 0 0 8px rgba(242,163,175,0.5); transform: scaleX(0); transform-origin: left center; transition: transform 260ms cubic-bezier(0.2,0.8,0.2,1); pointer-events: none; }
.tp-nav__link:hover::after { transform: scaleX(1); }
.tp-subnav__link { color: #141C2B; }
.tp-subnav__link:hover { color: #3D1B2E; }
.tp-subnav__link::after { background: linear-gradient(90deg, #FFAC9A, #F2A3AF, #3D1B2E); box-shadow: 0 0 8px rgba(242,163,175,0.5); }

/* ---- mobile nav (burger + dropdown) — inert on desktop, enabled at <=980px ---- */
.tp-nav__burger { display: none; flex-direction: column; justify-content: center; align-items: center; gap: 5px; width: 46px; height: 46px; padding: 0; margin-left: 10px; border: 1.5px solid rgba(255,172,154,0.9); border-radius: 12px; background: rgba(251,229,232,0.72); backdrop-filter: blur(8px); cursor: pointer; }
.tp-nav__burger-bar { display: block; width: 20px; height: 2px; border-radius: 2px; background: #3D1B2E; transition: transform 220ms cubic-bezier(0.2,0.8,0.2,1), opacity 180ms; }
.tp-nav-scope.is-nav-open .tp-nav__burger-bar:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.tp-nav-scope.is-nav-open .tp-nav__burger-bar:nth-child(2) { opacity: 0; }
.tp-nav-scope.is-nav-open .tp-nav__burger-bar:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

/* position:fixed (was absolute) — its old positioned ancestor was
   .tp-hero/.tp-pagehero, which scrolls away with the page now that the
   nav itself is fixed; staying absolute would open the menu wherever
   76px-from-the-hero's-top happened to be instead of just under the
   now-fixed nav bar. */
.tp-nav-mobile { display: none; position: absolute; z-index: 30; left: 14px; right: 14px; top: 76px; padding: 12px; border: 1px solid rgba(255,255,255,0.28); border-radius: 16px; background: rgba(255,255,255,0.12); backdrop-filter: blur(22px) saturate(1.4); -webkit-backdrop-filter: blur(22px) saturate(1.4); box-shadow: 0 24px 60px rgba(20,15,19,0.22); }
.tp-nav-mobile a { display: block; font-size: 17px; font-weight: 600; color: #3D1B2E; padding: 15px 14px; border-radius: 10px; }
.tp-nav-mobile a:hover { background: rgba(255,223,216,0.7); color: #3D1B2E; }
.tp-nav-mobile__cta { text-align: center; color: #FFFFFF !important; background: #3D1B2E; margin-top: 10px; }
.tp-nav-mobile__cta:hover { background: #2B1622; color: #FFFFFF !important; }

/* ---- mobile nested submenus (Services / Insights) — tap to expand in place ---- */
.tp-nav-mobile__group { display: flex; flex-direction: column; }
.tp-nav-mobile__toggle { all: unset; box-sizing: border-box; width: 100%; cursor: pointer; display: flex; align-items: center; justify-content: space-between; font-family: inherit; font-size: 17px; font-weight: 600; color: #3D1B2E; padding: 15px 14px; border-radius: 10px; }
.tp-nav-mobile__toggle:hover { background: rgba(255,223,216,0.7); }
.tp-nav-mobile__group .tp-nav__caret { font-size: 12px; }
.tp-nav-mobile__group.is-open .tp-nav-mobile__toggle .tp-nav__caret { transform: rotate(180deg); }
.tp-nav-mobile__submenu { display: none; flex-direction: column; padding-left: 12px; }
.tp-nav-mobile__group.is-open .tp-nav-mobile__submenu { display: flex; }
.tp-nav-mobile__submenu a { font-size: 15px; font-weight: 500; color: #93757A; padding: 12px 14px; border-radius: 9px; }
.tp-nav-mobile__submenu a:hover { background: rgba(255,223,216,0.5); }
.tp-nav-mobile__empty { display: block; padding: 10px 14px; font-size: 14px; color: #8A93A3; }
.tp-nav-mobile__cat-label { font-family: 'Inter', sans-serif; font-size: 11px; font-weight: 500; letter-spacing: 0.12em; text-transform: uppercase; color: #AF8B91; padding: 12px 14px 4px; }
.tp-nav-mobile__cat-label:first-child { padding-top: 4px; }
.tp-nav-scope.is-nav-open .tp-nav-mobile { display: block; animation: heroRise 260ms cubic-bezier(0.16,1,0.3,1) both; }

/* ===========================================================
   SUBPAGE NAV (service pages + blog posts) — dark re-skin of the same
   .tp-nav__dropdown / .tp-nav-mobile__* structure the homepage nav uses.
   The dropdown flyout panel and the mobile menu panel are already light/
   frosted in the base rules above, so only the dark top bar needs colors
   overridden here — no structural duplication.
   =========================================================== */
.tp-subnav { position: relative; z-index: 5; display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; width: 100%; box-sizing: border-box; padding: 24px 48px 0 48px; }
/* Dark-glass counterpart to .tp-nav--pill — same floating pill shape,
   same sliding-highlight mechanic, tinted for the dark hero. */
/* Light frosted-glass pill (not dark) — the logo's violet gradient
   stops have no contrast against a dark nav background of any tint, so
   the fix is a light pill (like .tp-nav--pill on the homepage), with
   the nav text/caret/burger flipped to dark ink to stay readable on
   top of it. */
.tp-subnav--pill { margin: 24px 40px 0; padding: 10px 10px 10px 8px; border-radius: 999px; background: rgba(255,255,255,0.62); border: 1px solid rgba(255,255,255,0.85); backdrop-filter: blur(24px) saturate(150%); -webkit-backdrop-filter: blur(24px) saturate(150%); box-shadow: 0 14px 40px rgba(20,15,19,0.16), inset 0 1px 0 rgba(255,255,255,0.7); width: auto; }
.tp-subnav__brand { display: flex; align-items: center; gap: 14px; justify-self: start; text-decoration: none; padding: 12px 20px 12px 16px; border-radius: 12px; background: rgba(43,22,34,0.35); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); }
.tp-subnav--pill .tp-subnav__brand { background: transparent; backdrop-filter: none; -webkit-backdrop-filter: none; padding: 8px 12px; }
.tp-subnav__trigger { color: #141C2B; }
.tp-subnav__trigger:hover { color: #3D1B2E; }
.tp-subnav__cta-wrap { display: flex; justify-content: flex-end; align-items: center; }
.tp-subnav__cta { font-size: 15px; font-weight: 600; letter-spacing: 0.01em; color: #FFFFFF; padding: 11px 22px; border-radius: 999px; background: #3D1B2E; box-shadow: 0 8px 20px rgba(61,27,46,0.2); transition: background 220ms cubic-bezier(0.2,0.8,0.2,1), transform 220ms cubic-bezier(0.2,0.8,0.2,1), box-shadow 220ms cubic-bezier(0.2,0.8,0.2,1); }
.tp-subnav__cta:hover { background: #2B1622; color: #FFFFFF; transform: translateY(-2px) scale(1.03); box-shadow: 0 14px 30px rgba(61,27,46,0.4); }
.tp-subnav__cta:active { transform: translateY(-1px) scale(1.01); }
.tp-subnav__burger { background: rgba(61,27,46,0.08); border-color: rgba(61,27,46,0.2); }
.tp-subnav__burger-bar { background: #3D1B2E; }

/* The mobile dropdown panel (.tp-nav-mobile) is a light frosted glass
   card either way, but it sits on the light homepage hero vs. the dark
   service-page hero — dark-green text (correct on light) reads as
   near-invisible dark-on-dark there. Scoped to .tp-pagehero so the
   homepage nav is untouched. */
.tp-pagehero .tp-nav-mobile a,
.tp-pagehero .tp-nav-mobile__toggle { color: #FFFFFF; }
.tp-pagehero .tp-nav-mobile a:hover,
.tp-pagehero .tp-nav-mobile__toggle:hover { color: #3D1B2E; }
.tp-pagehero .tp-nav-mobile__submenu a { color: rgba(255,255,255,0.82); }
.tp-pagehero .tp-nav-mobile__submenu a:hover { color: #3D1B2E; }

.tp-hero__inner { position: relative; z-index: 2; max-width: 1240px; width: 100%; margin: 0 auto; padding: 128px 40px 28px; text-align: center; animation: heroRise 900ms cubic-bezier(0.16,1,0.3,1) both; flex: 1 1 auto; display: flex; flex-direction: column; justify-content: center; }
.tp-hero__headline { font-family: 'Josefin Sans', sans-serif; font-weight: 400; font-size: clamp(52px, 6.4vw, 82px); line-height: 1.02; letter-spacing: -0.02em; margin: 0 auto 28px; max-width: 17ch; color: var(--ink, #3D1B2E); text-wrap: pretty; }
.tp-hero__subhead { font-size: 20px; line-height: 1.55; color: var(--ink, #3D1B2E); max-width: 46ch; margin: 0 auto 40px; text-wrap: pretty; }
@media (min-width: 980px) {
  .tp-hero__subhead { font-size: 23px; }
}
.tp-hero__actions { display: flex; align-items: center; justify-content: center; gap: 16px; flex-wrap: wrap; }
/* Both hero buttons forced to identical radius/width/height — pill-btn's
   icon prefix and solid-btn's plain text would otherwise size the two
   differently since they have different natural content widths. */
/* Radius matches Hire talent's (.tp-solid-btn) original 10px — Browse
   talent conforms to it, not the other way around. */
.tp-hero__actions .tp-pill-btn, .tp-hero__actions .tp-solid-btn { display: inline-flex; align-items: center; box-sizing: border-box; width: 210px; height: 54px; padding: 0; border-radius: 10px; justify-content: center; }

.tp-hero__stats { margin-top: auto; flex: 0 0 auto; display: flex; align-items: center; justify-content: space-between; gap: 48px; text-align: left; padding-top: 36px; }
.tp-hero__metrics { display: flex; gap: 56px; flex: 0 0 auto; }
.tp-metric__value { font-family: 'Josefin Sans', sans-serif; font-weight: 500; font-size: 56px; line-height: 1; color: #3D1B2E; letter-spacing: -0.01em; }
.tp-metric__label { font-family: 'Inter', sans-serif; font-size: 13px; font-weight: 500; letter-spacing: 0.12em; text-transform: uppercase; color: #93757A; margin-top: 12px; }
.tp-hero__divider { align-self: stretch; width: 1px; background: rgba(242,163,175,0.35); flex: 0 0 auto; }

.tp-ticker { flex: 1 1 auto; min-width: 0; position: relative; overflow: hidden; -webkit-mask-image: linear-gradient(90deg, transparent, #000 12%, #000 88%, transparent); mask-image: linear-gradient(90deg, transparent, #000 12%, #000 88%, transparent); }
/* Sole occupant of .tp-hero__stats now that the metrics+divider are
   gone — flex:1 1 auto already expands it to fill the row, this just
   makes that explicit. */
.tp-ticker--full { width: 100%; }
.tp-ticker__track { display: flex; gap: 132px; width: max-content; animation: tickerScroll 90s linear infinite; }
/* Fixed box (not just a fixed height) so every logo scales to fit the
   same footprint via object-fit, regardless of the source image's own
   aspect ratio — otherwise a wide logo and a near-square one render at
   very different visual sizes even with height alone pinned. */
.tp-ticker__logo { height: 59px; width: 123px; flex: 0 0 auto; object-fit: contain; }
/* Tablet tier — was falling through to the full desktop-sized box
   (59x123) with no logo of its own, reading oversized on tablet screens. */
@media (max-width: 980px) {
  .tp-ticker__logo { height: 46px; width: 96px; }
  .tp-ticker__track { gap: 96px; }
}

/* ===========================================================
   NUMBERS — dark band + performance bars (design variant "1b/2b"),
   sits directly after the hero.
   =========================================================== */
.tp-numbers { position: relative; overflow: hidden; background: #37192A; }
.tp-numbers__glow { position: absolute; left: -8%; right: -8%; bottom: -35%; height: 60%; filter: blur(48px); opacity: 0.5; background: radial-gradient(120% 100% at 50% 100%, var(--p1, #FF8063) 0%, var(--p2, #E5C5FA) 45%, transparent 78%); animation: riseDrift 12s ease-in-out infinite alternate; pointer-events: none; }
.tp-numbers__inner { position: relative; z-index: 2; padding: 104px 40px; }
.tp-numbers__heading { margin: 14px 0 72px; max-width: 22ch; font-weight: 400; font-size: clamp(34px, 4vw, 52px); line-height: 1.05; }
.tp-numbers__body { display: grid; grid-template-columns: 1.1fr 1px 1fr; gap: 56px; align-items: start; }
.tp-numbers__stats { display: grid; grid-template-columns: 1fr 1fr; gap: 56px 48px; }
.tp-numbers__stat-value { font-family: 'Josefin Sans', sans-serif; font-weight: 500; font-size: 68px; line-height: 1; color: #FFFFFF; }
.tp-numbers__stat-unit { font-size: 40px; margin-left: 4px; }
.tp-numbers__stat-label { font-family: 'Inter', sans-serif; font-size: 12.5px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--soft, #F8CFD5); margin-top: 14px; }
.tp-numbers__rule { background: rgba(255,172,154,0.25); align-self: stretch; }
.tp-numbers__perf { display: flex; flex-direction: column; gap: 30px; padding-top: 6px; }
.tp-numbers__perf-label { font-family: 'Inter', sans-serif; font-size: 12.5px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--soft, #F8CFD5); }
.tp-numbers__bar-top { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 10px; }
.tp-numbers__bar-label { font-size: 15px; font-weight: 600; color: #FBE5E8; }
.tp-numbers__bar-pct { font-family: 'Josefin Sans', sans-serif; font-size: 28px; font-weight: 500; color: #FFFFFF; }
.tp-numbers__bar-track { height: 5px; border-radius: 3px; background: rgba(255,172,154,0.18); overflow: hidden; }
.tp-numbers__bar-fill { height: 100%; width: 0; border-radius: 3px; background: linear-gradient(90deg, var(--mid, #AF8B91), var(--soft, #F8CFD5)); }

/* ===========================================================
   SERVICES + shared card component (also used by Insights)
   =========================================================== */
.tp-services { position: relative; background: #FFFFFF; overflow: hidden; }
/* Particle field sits *over* the section's own white background
   (canvas is transparent) — never replaces it. Content container sits
   above it via z-index (normal stacking already sends clicks/hovers to
   whichever element is topmost at that point, so the cards stay fully
   clickable without needing pointer-events:none on the canvas — which
   would also kill the particles' mouse-follow effect). */
.tp-services__particles { position: absolute; inset: 0; z-index: 0; }
.tp-services > .tp-container { position: relative; z-index: 1; }
/* +10% wider than the site's normal 1240px container (desktop/tablet
   only — see the mobile override below) so each of the 3 equal-width
   grid columns grows proportionally, i.e. the cards themselves get 10%
   wider without changing the column count. */
.tp-services .tp-container { padding: 112px 40px; max-width: 1240px; }
@media (min-width: 640px) {
  .tp-services .tp-container { max-width: 1364px; }
}
.tp-services__grid { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 24px; }
.tp-services__intro { display: flex; flex-direction: column; gap: 16px; padding: 8px 32px 8px 0; }
.tp-services__lede { font-size: 16px; line-height: 1.55; color: #5A6478; margin: 0; max-width: 34ch; }

.tp-card { position: relative; overflow: hidden; background: #FFFFFF; border: 1px solid #E4E8EF; border-radius: 14px; height: 340px; display: flex; flex-direction: column; text-decoration: none; transition: border-color 200ms cubic-bezier(0.2,0.8,0.2,1); }
.tp-card:hover { border-color: var(--soft, #F8CFD5); }
.tp-card__top { position: relative; z-index: 2; display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; padding: 28px 28px 0; flex: 1; }
.tp-services__grid .tp-card__top { align-items: center; padding: 32px 32px 0; }
.tp-services__grid .tp-card__arrow { position: absolute; top: 28px; right: 28px; z-index: 3; }
.tp-services__grid .tp-card__head { gap: 20px; }
.tp-services__grid .tp-card__badge-row { gap: 16px; }
.tp-services__grid .tp-card__foot { padding: 0 32px 32px; }
.tp-card__head { display: flex; flex-direction: column; gap: 12px; }
.tp-card__badge-row { display: flex; align-items: center; gap: 12px; }
.tp-card__glyph { width: 40px; height: 40px; border-radius: 10px; display: flex; align-items: center; justify-content: center; font-family: 'Inter', sans-serif; font-weight: 700; font-size: 16px; color: var(--ink, #3D1B2E); border: 1px solid rgba(255,255,255,0.6); }
.tp-card__glyph svg { width: 20px; height: 20px; flex: 0 0 auto; }
.tp-card__glyph--a { background: linear-gradient(135deg, var(--p1), var(--p2)); }
.tp-card__glyph--b { background: linear-gradient(135deg, var(--p2), var(--p1)); }
.tp-card__num { font-family: 'Inter', sans-serif; font-size: 12px; letter-spacing: 0.12em; color: var(--soft, #F8CFD5); }
.tp-card__title { font-size: 22px; font-weight: 600; color: #141C2B; }
.tp-card__body { font-size: 15px; line-height: 1.55; color: #5A6478; margin: 0; max-width: 42ch; }
.tp-services__grid .tp-card__body { font-size: 16.5px; line-height: 1.65; }
.tp-card__arrow { width: 34px; height: 34px; flex: 0 0 auto; border: 1px solid #E4E8EF; border-radius: 8px; display: flex; align-items: center; justify-content: center; font-size: 14px; color: var(--mid, #AF8B91); background: rgba(255,255,255,0.7); text-decoration: none; transition: background 200ms cubic-bezier(0.2,0.8,0.2,1), border-color 200ms cubic-bezier(0.2,0.8,0.2,1), color 200ms cubic-bezier(0.2,0.8,0.2,1); }
a.tp-card__arrow:hover { background: var(--ink, #3D1B2E); border-color: var(--ink, #3D1B2E); color: #FFFFFF; }
.tp-card__foot { position: relative; z-index: 2; margin-top: auto; padding: 0 28px 28px; }
.tp-card__more { display: inline-flex; align-items: center; gap: 8px; font-size: 14px; font-weight: 600; color: #141C2B; background: rgba(255,255,255,0.85); backdrop-filter: blur(6px); border: 1px solid rgba(20,28,43,0.1); border-radius: 999px; padding: 10px 16px 10px 18px; transition: background 200ms cubic-bezier(0.2,0.8,0.2,1); }
.tp-card:hover .tp-card__more { background: #FFFFFF; }
.tp-card__fx { position: absolute; inset: 0; z-index: 1; pointer-events: none; }
.tp-card__glow { position: absolute; left: -10%; right: -10%; bottom: -30%; height: 55%; filter: blur(34px); opacity: 0.85; animation: riseDrift 11s ease-in-out infinite alternate; }
.tp-card__glow--a { background: radial-gradient(120% 100% at 50% 100%, var(--ink) 0%, var(--p2) 50%, var(--p1) 80%, transparent 92%); }
.tp-card__glow--b { background: radial-gradient(120% 100% at 50% 100%, var(--ink) 0%, var(--p2) 60%, var(--p1) 85%, transparent 94%); }
/* Static gradient, no flowing/looping animation — background-size:100%
   fits the whole coral -> lavender -> white sweep within the card at
   once, so it's all visible immediately on hover and just holds.
   Lavender (--p2) now holds a wide plateau (30%-70%) instead of an
   even 3-way split, so purple reads as the dominant hover tone and
   coral (--p1) only shows briefly at the very start. */
.tp-card__fill { position: absolute; inset: 0; background-size: 100% 100%; background-image: linear-gradient(115deg, var(--p1) 0%, var(--p2) 30%, var(--p2) 70%, var(--p3) 100%); pointer-events: none; }

/* ===========================================================
   PROOF, IN FOUR FIGURES — split narrative + hiring-funnel panel
   (design handoff option 1e/2e)
   =========================================================== */
.tp-proof { background: #FFFFFF; }
.tp-proof .tp-container { max-width: 1240px; padding: 104px 40px; }
.tp-proof__card { display: grid; grid-template-columns: 1fr 1.2fr; gap: 80px; align-items: start; }
.tp-proof__intro { position: sticky; top: 40px; }
.tp-proof__heading { margin: 14px 0 24px; max-width: 15ch; }
.tp-proof__lede { font-size: 16.5px; line-height: 1.6; color: #93757A; margin: 0 0 32px; max-width: 40ch; text-wrap: pretty; }
.tp-proof__panels { display: flex; flex-direction: column; gap: 16px; }
.tp-proof__stats-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.tp-proof__stats-row--top { order: 1; }
.tp-proof__funnel { order: 2; }
.tp-proof__stats-row--bottom { order: 3; }
.tp-proof__stat { background: #FFFFFF; border: 1px solid #E4E8EF; border-radius: 14px; padding: 30px; }
.tp-proof__stat--tint { background: linear-gradient(135deg, #FADBE0 0%, #FFDFD8 100%); border-color: rgba(255,172,154,0.9); }
.tp-proof__stat--tint .tp-proof__stat-value { color: #2B1622; }
.tp-proof__stat-value { font-family: 'Josefin Sans', sans-serif; font-weight: 500; font-size: 58px; line-height: 1; color: var(--ink, #3D1B2E); }
.tp-proof__stat-label { font-family: 'Inter', sans-serif; font-size: 12px; letter-spacing: 0.12em; text-transform: uppercase; color: #93757A; margin-top: 12px; }
.tp-proof__funnel { background: radial-gradient(120% 150% at 80% 0%, var(--mid, #AF8B91) -25%, var(--ink, #3D1B2E) 45%, var(--ink-deep, #2B1622) 100%); border-radius: 14px; padding: 34px; }
.tp-proof__funnel-label { font-family: 'Inter', sans-serif; font-size: 12.5px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--soft, #F8CFD5); margin-bottom: 26px; }
.tp-proof__funnel-row { display: grid; grid-template-columns: minmax(80px, 170px) 1fr minmax(46px, 70px); align-items: center; gap: 12px; padding: 12px 0; border-top: 1px solid rgba(255,172,154,0.15); }
.tp-proof__funnel-row:first-of-type { border-top: none; }
.tp-proof__funnel-name { font-size: 14px; font-weight: 600; color: #FBE5E8; }
.tp-proof__funnel-track { height: 22px; border-radius: 5px; background: rgba(255,172,154,0.12); overflow: hidden; }
.tp-proof__funnel-fill { height: 100%; width: 0; border-radius: 5px; background: linear-gradient(90deg, var(--mid, #F2A3AF), var(--p1, #FFAC9A)); }
.tp-proof__funnel-pct { font-family: 'Josefin Sans', sans-serif; font-size: 26px; font-weight: 500; color: #FFFFFF; text-align: right; }

/* ===========================================================
   FEATURED CASE STUDY — bento grid (glassy)
   =========================================================== */
.tp-bento { position: relative; overflow: hidden; background: var(--bento-bg); }
.tp-bento__fx { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; }
.tp-bento__inner { position: relative; z-index: 2; padding: 112px 40px; }
.tp-bento__head { display: flex; flex-direction: column; gap: 16px; }
.tp-bento__grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; margin-top: 48px; }

.tp-bento-card { position: relative; overflow: hidden; border-radius: 16px; border: 1.5px solid var(--bento-border, transparent); background: var(--bento-card-bg); box-shadow: var(--bento-shadow, none); backdrop-filter: blur(18px) saturate(1.15); -webkit-backdrop-filter: blur(18px) saturate(1.15); padding: 28px; min-height: 240px; display: flex; flex-direction: column; justify-content: flex-end; gap: 8px; transition: box-shadow 300ms; }
.tp-bento-card:hover { box-shadow: var(--bento-hov, none); }
.tp-bento-card--wide { grid-column: span 2; min-height: 280px; }
.tp-bento-card--cta { background: var(--bento-card-bg2, var(--bento-card-bg)); gap: 14px; }

.tp-bento-card__marquee { position: absolute; left: 0; right: 0; overflow: hidden; -webkit-mask-image: linear-gradient(90deg, transparent, #000 15%, #000 85%, transparent); mask-image: linear-gradient(90deg, transparent, #000 15%, #000 85%, transparent); }
.tp-bento-card__marquee--a { top: 26px; }
.tp-bento-card__marquee--b { top: 78px; opacity: 0.5; }
.tp-bento-card__marquee-track { display: flex; gap: 12px; width: max-content; padding: 4px 0; animation: tickerScroll 22s linear infinite; }
.tp-bento-card__marquee-track--reverse { animation-duration: 30s; animation-direction: reverse; }
.tp-role-chip { flex: 0 0 auto; font-family: 'Inter', sans-serif; font-size: 12px; letter-spacing: 0.06em; color: rgba(255,255,255,0.85); border: 1px solid rgba(255,255,255,0.2); border-radius: 999px; padding: 8px 14px; background: rgba(255,255,255,0.05); }
.tp-role-chip--dim { color: rgba(255,255,255,0.7); border-color: rgba(255,255,255,0.14); background: none; }
.tp-bento-card__title { font-size: 20px; font-weight: 700; color: #FFFFFF; }
.tp-bento-card__body { font-size: 15px; line-height: 1.55; color: rgba(255,255,255,0.92); margin: 0; max-width: 52ch; text-shadow: 0 1px 6px rgba(0,0,0,0.5); }

.tp-bento-card__bars { position: absolute; top: 24px; left: 28px; right: 28px; height: 110px; display: flex; align-items: flex-end; gap: 8px; opacity: 0.75; }
.tp-bento-card__bar { flex: 1; border-radius: 4px 4px 0 0; transform-origin: bottom; animation: barPulse 2.6s ease-in-out infinite alternate; }
.tp-bento-card__bar:nth-child(1), .tp-bento-card__bar:nth-child(2) { background: linear-gradient(180deg, var(--p2), transparent); }
.tp-bento-card__bar:nth-child(3), .tp-bento-card__bar:nth-child(4) { background: linear-gradient(180deg, var(--p2), transparent); }
.tp-bento-card__bar:nth-child(5) { background: linear-gradient(180deg, var(--p2), var(--mid)); }

.tp-bento-card__stat { font-family: 'Josefin Sans', sans-serif; font-weight: 500; font-size: 58px; line-height: 1; color: var(--p2); }
.tp-bento-card__stat--white { color: #FFFFFF; font-size: 46px; }
.tp-bento-card__caption { font-family: 'Inter', sans-serif; font-size: 12px; letter-spacing: 0.14em; text-transform: uppercase; color: rgba(255,255,255,0.88); text-shadow: 0 1px 5px rgba(0,0,0,0.5); }

.tp-bento-card__dots { position: absolute; top: 34px; left: 28px; right: 28px; display: flex; align-items: center; gap: 6px; }
.tp-bento-card__dot-col { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 8px; }
.tp-bento-card__dot { width: 10px; height: 10px; border-radius: 50%; background: var(--p2); animation: bentoDot 3.6s ease-in-out infinite; display: block; }
.tp-bento-card__dot-label { font-family: 'Inter', sans-serif; font-size: 10px; color: rgba(255,255,255,0.75); }

.tp-bento-card__rings { position: absolute; top: 30px; right: 28px; width: 84px; height: 84px; }
.tp-bento-card__ring { position: absolute; border-radius: 50%; animation: bentoDot 3s ease-in-out infinite; }
.tp-bento-card__ring--outer { top: 0; right: 0; width: 84px; height: 84px; border: 2px solid var(--p2); opacity: 0.5; }
.tp-bento-card__ring--inner { top: 14px; right: 14px; width: 56px; height: 56px; border: 2px solid var(--p2); opacity: 0.8; animation-delay: .6s; }

.tp-bento-card__cube { position: absolute; border-radius: 6px; animation: cubeFloat 8s ease-in-out infinite alternate; }
.tp-bento-card__cube--a { top: 24px; left: 28px; width: 26px; height: 26px; background: var(--p2); opacity: 0.7; }
.tp-bento-card__cube--b { top: 48px; left: 64px; width: 15px; height: 15px; background: var(--p2); opacity: 0.55; animation-duration: 6s; animation-direction: alternate-reverse; }
.tp-bento-card__cta-text { font-family: 'Josefin Sans', sans-serif; font-size: 24px; line-height: 1.25; color: #FFFFFF; text-wrap: pretty; }

/* ===========================================================
   TESTIMONIAL
   =========================================================== */
.tp-testimonial { position: relative; overflow: hidden; background: #FFFFFF; }
.tp-testimonial__inner { position: relative; z-index: 2; padding: 96px 40px 72px; }
.tp-testimonial__heading { color: var(--ink, #3D1B2E); }

.tp-kinetic { position: relative; overflow: hidden; margin-top: 26px; border-radius: 20px; border: 1px solid var(--tint-border, #E4E8EF); background: var(--tint-soft, #F7F8F6); padding: 44px 44px 40px; }
.tp-kinetic__ribbon { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0.75; pointer-events: none; }
.tp-kinetic__scrim { position: absolute; inset: 0; background: linear-gradient(180deg, rgba(255,255,255,0.25) 0%, rgba(255,255,255,0.55) 75%, rgba(255,255,255,0.85) 100%); pointer-events: none; }
.tp-kinetic__body { position: relative; z-index: 2; }
.tp-kinetic__eyebrow { font-family: 'Inter', sans-serif; font-size: 12px; font-weight: 500; letter-spacing: 0.24em; text-transform: uppercase; color: #5A6478; }
.tp-kinetic__namewrap { height: 58px; overflow: hidden; margin: 6px 0 2px; }
.tp-kinetic__name { font-family: 'Josefin Sans', sans-serif; font-weight: 500; font-size: 46px; line-height: 1.15; letter-spacing: -0.02em; color: var(--ink, #3D1B2E); }
.tp-kinetic__statwrap { height: 38px; overflow: hidden; display: flex; align-items: baseline; gap: 16px; }
.tp-kinetic__metric { font-size: 27px; color: #141C2B; }
.tp-kinetic__desc { font-family: 'Inter', sans-serif; font-size: 13px; color: #5A6478; }
.tp-kinetic__dots { display: flex; gap: 8px; margin-top: 28px; align-items: center; }
.tp-kinetic__dot { height: 8px; width: 8px; border-radius: 999px; background: #E4E8EF; transition: width 0.4s, background 0.4s; display: inline-block; }

/* Slideshow wrapper — same .tp-quote layout per slide (bar/mark/text/
   name/title unchanged), just one visible at a time with a crossfade
   and dot navigation instead of a single static quote. */
.tp-quote-slider { margin-top: 52px; }
.tp-quote-slider__track { position: relative; min-height: 180px; }
.tp-quote.tp-quote--slide { display: none; margin-top: 0; opacity: 0; position: absolute; top: 0; left: 0; right: 0; transition: opacity 400ms ease; }
.tp-quote.tp-quote--slide.is-active { display: flex; opacity: 1; position: relative; }
.tp-quote-slider__dots { display: flex; gap: 8px; margin-top: 28px; padding-left: 33px; }
.tp-quote-slider__dot { width: 8px; height: 8px; border-radius: 999px; background: #E4E8EF; border: none; padding: 0; cursor: pointer; transition: background 200ms, width 200ms; }
.tp-quote-slider__dot.is-active { background: var(--ink, #3D1B2E); width: 26px; }

.tp-quote { display: flex; gap: 28px; max-width: 840px; }
.tp-quote__bar { width: 5px; border-radius: 3px; flex: 0 0 auto; background: linear-gradient(180deg, var(--p2), var(--ink, #3D1B2E)); }
.tp-quote__mark { font-family: 'Josefin Sans', sans-serif; font-size: 62px; line-height: 0.5; color: var(--ink, #3D1B2E); margin-bottom: 8px; }
.tp-quote__text { font-size: 19px; line-height: 1.65; color: #141C2B; margin: 0; max-width: 60ch; text-wrap: pretty; }
.tp-quote__name { margin-top: 22px; font-size: 16px; font-weight: 600; color: var(--ink, #3D1B2E); }
.tp-quote__title { font-family: 'Inter', sans-serif; font-size: 12px; letter-spacing: 0.06em; color: #5A6478; margin-top: 5px; }

.tp-testimonial__deco { position: absolute; border-radius: 4px; pointer-events: none; }
.tp-testimonial__deco--a { right: 40px; bottom: 40px; width: 28px; height: 28px; background: var(--soft, #F8CFD5); opacity: 0.7; }
.tp-testimonial__deco--b { right: 78px; bottom: 78px; width: 22px; height: 22px; border: 1.5px solid var(--ink, #3D1B2E); opacity: 0.55; }

/* ===========================================================
   CAPABILITIES
   =========================================================== */
.tp-capabilities .tp-container { padding: 72px 40px; }
.tp-capabilities__grid { display: grid; grid-template-columns: 1fr 1.15fr; gap: 64px; align-items: start; }
.tp-capabilities__intro { display: flex; flex-direction: column; gap: 18px; }
.tp-capabilities__intro .tp-h2 { max-width: 14ch; }
.tp-capabilities__lede { font-size: 16px; line-height: 1.55; color: #5A6478; margin: 0; max-width: 34ch; }
.tp-accordion { display: flex; flex-direction: column; }
.tp-accordion__q { all: unset; box-sizing: border-box; width: 100%; cursor: pointer; display: flex; align-items: center; justify-content: space-between; padding: 20px 4px; border-bottom: 1px solid #E4E8EF; font-size: 18px; font-weight: 600; color: #141C2B; }
.tp-accordion__sign { font-family: 'Inter', sans-serif; font-size: 20px; color: var(--mid, #AF8B91); }
.tp-accordion__a { display: none; padding: 14px 4px 20px; border-bottom: 1px solid #E4E8EF; }
.tp-accordion__a p { font-size: 15px; line-height: 1.55; color: #5A6478; margin: 0; }
.tp-accordion__item.is-open .tp-accordion__q { border-bottom: none; }
.tp-accordion__item.is-open .tp-accordion__a { display: block; }

/* ===========================================================
   GLOBAL DELIVERY / MAP
   =========================================================== */
.tp-global { background: var(--map-bg, #2B1622); overflow: hidden; }
/* Widened from 1280px — the regions panel now carries a lot more
   countries (chips), so it needs more room; map size/behavior below is
   untouched, it just sits inside a wider section now. */
.tp-global .tp-container { max-width: 1440px; padding: 72px 40px 0; }
/* Industry pages reuse this section as-is (see page-industry.php), but
   its heading carries a hardcoded <br> from the homepage content
   ("Global expertise,<br>local collaboration") — drop it here only, so
   every H2 on the industry template reads as one line. */
.page-template-page-industry-php .tp-global .tp-h2 br { display: none; }
.tp-global__head { display: grid; grid-template-columns: 1fr 1.3fr; gap: 64px; align-items: start; }
.tp-global__copy { display: flex; flex-direction: column; gap: 20px; }
.tp-global__lede { font-size: 16.5px; line-height: 1.6; color: rgba(255,255,255,0.68); margin: 0; max-width: 42ch; text-wrap: pretty; }
.tp-global__regions { display: flex; flex-direction: column; gap: 24px; border-left: 1px solid rgba(255,255,255,0.16); padding-left: 40px; }
.tp-global__region-label { font-family: 'Inter', sans-serif; font-size: 12px; font-weight: 500; letter-spacing: 0.18em; text-transform: uppercase; color: var(--soft, #F8CFD5); }
/* Anchor cities (bold headline row) + quiet outlined chips for the
   secondary markets — design handoff option 1b/2b. */
.tp-global__region-anchor { font-size: 20px; font-weight: 600; color: #FFFFFF; margin-top: 6px; }
.tp-global__region-chips { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.tp-global__chip { font-size: 13px; font-weight: 500; color: #FFFFFF; background: rgba(255,255,255,0.08); border: 1px solid rgba(255,255,255,0.18); border-radius: 999px; padding: 6px 13px; white-space: nowrap; }
.tp-global__chip--hidden { display: none; }
.tp-global__region.is-expanded .tp-global__chip--hidden { display: inline-flex; }
.tp-global__chip--more { font-family: inherit; cursor: pointer; color: rgba(255,255,255,0.62); background: transparent; transition: color 160ms, border-color 160ms; }
.tp-global__chip--more:hover { color: #FFFFFF; border-color: rgba(255,255,255,0.4); }
.tp-global__region.is-expanded .tp-global__chip--more { display: none; }

.tp-global__map-wrap { position: relative; width: 100%; height: 640px; margin-top: 56px; margin-bottom: 88px; -webkit-mask-image: linear-gradient(180deg, transparent 0%, #000 8%, #000 92%, transparent 100%); mask-image: linear-gradient(180deg, transparent 0%, #000 8%, #000 92%, transparent 100%); }
.tp-global__map { position: absolute; inset: 0; width: 100%; height: 100%; }
.tp-global__map-fade { position: absolute; left: 0; right: 0; height: 120px; pointer-events: none; backdrop-filter: blur(2.5px); -webkit-backdrop-filter: blur(2.5px); }
.tp-global__map-fade--top { top: 0; -webkit-mask-image: linear-gradient(180deg, #000 0%, transparent 100%); mask-image: linear-gradient(180deg, #000 0%, transparent 100%); }
.tp-global__map-fade--bottom { bottom: 0; -webkit-mask-image: linear-gradient(0deg, #000 0%, transparent 100%); mask-image: linear-gradient(0deg, #000 0%, transparent 100%); }

/* ===========================================================
   INSIGHTS (reuses .tp-card)
   =========================================================== */
.tp-insights .tp-container { padding: 56px 40px 112px; }
.tp-insights__head { display: flex; align-items: flex-end; justify-content: space-between; margin-bottom: 40px; gap: 24px; flex-wrap: wrap; }
/* Eyebrow ("Insights") sat flush against the heading below it — every
   other section's eyebrow+heading pairing on this page uses a 16px
   gap wrapper (.tp-services__intro etc.); this one was missing it. */
.tp-insights__head .tp-eyebrow { margin-bottom: 14px; }
.tp-insights__all { font-size: 16px; font-weight: 600; color: var(--ink, #3D1B2E); white-space: nowrap; }
.tp-insights__grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
.tp-card--article { height: auto; min-height: 380px; z-index: 0; }
.tp-card--article .tp-card__fill { z-index: -1; }
.tp-card--article .tp-card__top { padding: 24px 24px 0; }
.tp-card--article .tp-card__title { font-size: 19px; line-height: 1.35; max-width: 24ch; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; }
.tp-card__tags { display: flex; gap: 8px; }
.tp-tag { font-family: 'Inter', sans-serif; font-size: 11px; letter-spacing: 0.08em; color: #5A6478; border: 1px solid #E4E8EF; border-radius: 20px; padding: 3px 9px; }
.tp-card__media { position: relative; flex: 1; margin-top: 18px; pointer-events: none; }
.tp-card__media-glow { position: absolute; left: -8%; right: -8%; bottom: -30%; height: 48%; filter: blur(30px); opacity: 0.55; background: linear-gradient(120deg, var(--p1) 0%, var(--p2) 50%, var(--p3) 100%); }
.tp-card__media-label { position: absolute; left: 50%; bottom: 16px; transform: translateX(-50%); font-family: 'Inter', sans-serif; font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: rgba(20,28,43,0.45); white-space: nowrap; }
.tp-card__media--image { flex: 0 0 auto; overflow: hidden; border-radius: 10px; background: var(--wash-b, #FBE5E8); aspect-ratio: 3 / 2; margin: 0 20px 20px; }
.tp-card__media--image img { width: 100%; height: 100%; object-fit: cover; display: block; }

.tp-card--soon { cursor: default; opacity: 0.75; }
.tp-card--soon:hover { border-color: #E4E8EF; }
.tp-card__title--soon { font-family: 'Inter', sans-serif; font-size: 13px; font-weight: 500; letter-spacing: 0.14em; text-transform: uppercase; color: #8A93A3; }

/* ===========================================================
   CTA BAND
   =========================================================== */
.tp-cta { position: relative; overflow: hidden; background: var(--ink-deep, #2B1622); }
.tp-cta__glow { position: absolute; inset: 0; pointer-events: none; }
.tp-cta__inner { position: relative; z-index: 2; padding: 128px 40px; text-align: center; }
.tp-cta__heading { margin: 0 auto 22px; max-width: 18ch; }
.tp-cta__subhead { font-size: 19px; line-height: 1.6; color: var(--soft, #F8CFD5); max-width: 44ch; margin: 0 auto 40px; text-wrap: pretty; }

/* ===========================================================
   FOOTER
   =========================================================== */
/* Dark theme (was a light pink wash) — matches the reference layout's
   own near-black footer, still on-brand via a dark plum instead of
   flat black, with the violet/coral accents carried through for dots,
   links-on-hover, and the divider. */
.tp-footer { background: var(--wash-a, #FADBE0); }
.tp-footer .tp-container { max-width: 1440px; padding: 64px 40px 40px; }

/* Brand sits on its own full-width row — logo left, tagline+LinkedIn
   right — not one of the link-column grid cells, matching the
   reference exactly instead of the previous "brand as a wide first
   grid column" layout. */
.tp-footer__brand-row { display: flex; align-items: center; justify-content: space-between; gap: 32px; flex-wrap: wrap; padding-bottom: 32px; }
.tp-footer__brand { display: inline-flex; align-items: center; background: transparent; padding: 10px 18px; border-radius: 14px; flex: 0 0 auto; }
.tp-footer__logo-img { height: 51px; width: auto; display: block; }
.tp-footer__brand-side { display: flex; align-items: center; gap: 20px; flex-wrap: wrap; }
.tp-footer__tagline { font-size: 15px; line-height: 1.6; color: rgba(61,27,46,0.72); max-width: 42ch; margin: 0; }
.tp-footer__social { display: flex; align-items: center; justify-content: center; width: 38px; height: 38px; border-radius: 50%; border: 1px solid rgba(61,27,46,0.24); color: var(--ink, #3D1B2E); flex: 0 0 auto; transition: background 180ms, border-color 180ms; }
.tp-footer__social svg { width: 18px; height: 18px; }
.tp-footer__social:hover { background: rgba(61,27,46,0.08); border-color: rgba(61,27,46,0.4); }

.tp-footer__divider { height: 1px; background: rgba(61,27,46,0.16); margin-bottom: 40px; }

/* 4 link columns: Services (wide, explicit width — split into 2
   internal sub-columns of its grouped categories) + Industries +
   Solutions, Company — 4 even columns now that Services is just a
   plain link list like the others. */
.tp-footer__cols { display: grid; grid-template-columns: repeat(4, 1fr); gap: 48px; padding-bottom: 40px; }
.tp-footer__col { display: flex; flex-direction: column; gap: 14px; min-width: 0; }
.tp-footer__col-label { font-family: 'Inter', sans-serif; font-size: 16px; font-weight: 700; color: var(--ink, #3D1B2E); margin-bottom: 6px; }
.tp-footer__col a { font-size: 14.5px; color: rgba(61,27,46,0.72); text-decoration: none; }
.tp-footer__col a:hover { color: var(--ink, #3D1B2E); text-decoration: underline; }

.tp-footer__legal { display: flex; justify-content: space-between; align-items: center; padding-top: 28px; border-top: 1px solid rgba(61,27,46,0.16); font-family: 'Inter', sans-serif; font-size: 12px; letter-spacing: 0.04em; color: rgba(61,27,46,0.6); flex-wrap: wrap; gap: 12px; }
.tp-footer__legal-links { display: flex; gap: 24px; }
.tp-footer__legal-links a { color: rgba(61,27,46,0.6); }
.tp-footer__legal-links a:hover { color: var(--ink, #3D1B2E); }

/* ===========================================================
   SERVICE PAGE (page-service.php) — static gradient hero, shared by all
   3 service pages via inc/service-content.php. NOTE: the design files use
   an animated canvas background here (beam-field.js/grid-glow.js/wave-
   field.js) that hasn't been ported yet — this ships with a static CSS
   gradient animated via the <wave-field> custom element (assets/js/
   wave-field.js, ported from the design 1:1) — the CSS gradient below is
   just the fallback shown behind/before the WebGL canvas.
   =========================================================== */
.tp-pagehero { position: relative; overflow: hidden; display: flex; flex-direction: column; min-height: 100vh; min-height: 100dvh; background: radial-gradient(120% 90% at 50% -10%, var(--ink, #3D1B2E) 0%, var(--ink-deep, #2B1622) 45%, #100E10 100%); }
/* Photo hero (About Us, Blog Index, Case Studies Index) — a lightly
   blurred client photo behind the existing white headline/subhead,
   with a dark scrim over it so the (unchanged) white text stays
   legible. First pass (blur 24px + brightness 0.7) was too heavy —
   the photo was no longer recognizable as anything specific — dropped
   to a much lighter touch that still reads as an actual office/desk
   photo, not an abstract color field. .tp-pagehero__photo-bg is inset
   past the box edges and scaled up before blurring — filter:blur()
   left un-padded would smear the image's own edge pixels into a
   visible lighter/softer border. */
.tp-pagehero__photo-bg { position: absolute; inset: -20px; z-index: 0; background-size: cover; background-position: center; filter: blur(6px) brightness(0.85); transform: scale(1.04); }
.tp-pagehero__photo-scrim { position: absolute; inset: 0; z-index: 1; background: linear-gradient(180deg, rgba(43,22,34,0.42) 0%, rgba(16,14,16,0.58) 100%); }
@media (max-width: 640px) {
  .tp-pagehero__photo-bg { filter: blur(4px) brightness(0.85); }
}
.tp-pagehero__wave { position: absolute; inset: 0; z-index: 0; opacity: 0.9; pointer-events: none; }
/* vortex-bg/particles-bg both react to the pointer (particles swirl/
   drift around the cursor), so they need pointer-events re-enabled —
   nav/content above sit in higher stacking contexts and still receive
   clicks/hovers normally regardless. */
vortex-bg.tp-pagehero__wave, particles-bg.tp-pagehero__wave { pointer-events: auto; }
.tp-pagehero__inner { position: relative; z-index: 2; max-width: 1240px; width: 100%; margin: 0 auto; box-sizing: border-box; flex: 1 1 auto; padding: 64px 40px; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; gap: 22px; animation: heroRise 900ms cubic-bezier(0.16,1,0.3,1) both; }
/* max-width widened from 18ch — the newer generic "X Services"
   headlines (e.g. "Recruiter on Premise Services") are longer than the
   original handful this was tuned against, and were wrapping to enough
   extra lines to push the hero taller than the viewport, breaking the
   "dead center" vertical balance on those specific pages. */
.tp-pagehero__headline { font-family: 'Josefin Sans', sans-serif; font-weight: 400; font-size: clamp(40px, 5.4vw, 72px); line-height: 1.04; letter-spacing: -0.02em; margin: 0; max-width: 24ch; color: #FFFFFF; text-wrap: pretty; text-shadow: 0 2px 30px rgba(0,0,0,0.35); }
.tp-pagehero__subhead { font-size: clamp(17px, 1.5vw, 21px); line-height: 1.6; color: rgba(255,255,255,0.85); margin: 0; max-width: 44ch; text-wrap: pretty; }
.tp-pagehero__actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 14px; margin-top: 8px; }
.tp-pagehero__ghost-btn { font-size: 16px; font-weight: 600; color: #FFFFFF; text-decoration: none; background: rgba(255,255,255,0.08); border: 1.5px solid rgba(255,255,255,0.35); padding: 13.5px 28px; border-radius: 10px; transition: background 240ms cubic-bezier(0.2,0.8,0.2,1), color 240ms cubic-bezier(0.2,0.8,0.2,1), border-color 240ms cubic-bezier(0.2,0.8,0.2,1), transform 240ms cubic-bezier(0.2,0.8,0.2,1), box-shadow 240ms cubic-bezier(0.2,0.8,0.2,1); }
/* Full invert on hover (solid white fill, dark text) rather than just a
   translucent tint bump — reads as a deliberate, designed state change
   instead of a barely-there hover. */
.tp-pagehero__ghost-btn:hover { background: #FFFFFF; color: var(--ink, #3D1B2E); border-color: #FFFFFF; transform: translateY(-2px); box-shadow: 0 14px 30px rgba(0,0,0,0.24); }
.tp-pagehero__ghost-btn:active { transform: translateY(-1px); }
/* Service/industry/solution hero CTAs sized to match the homepage
   hero's fixed pill/solid button box (.tp-hero__actions above) — same
   210x54 box, same 10px radius, text/labels unchanged. */
.tp-pagehero__actions .tp-pill-btn, .tp-pagehero__actions .tp-pagehero__ghost-btn { display: inline-flex; align-items: center; box-sizing: border-box; width: 210px; height: 54px; padding: 0; border-radius: 10px; justify-content: center; }
/* ===========================================================
   SOLUTIONS PAGE — "How it works" 4-step grid.
   =========================================================== */
.tp-sol-steps { position: relative; overflow: hidden; background: #FFFFFF; }
.tp-sol-steps__head { padding: clamp(56px, 6vw, 108px) 40px 0; display: flex; flex-direction: column; gap: 16px; max-width: 720px; }
.tp-sol-steps__intro { font-size: 17px; line-height: 1.6; color: #5A6478; margin: 0; max-width: 60ch; }
.tp-sol-steps__grid { padding: clamp(40px, 5vw, 64px) 40px clamp(56px, 6vw, 108px); display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr)); gap: clamp(28px, 3.5vw, 48px); }
.tp-sol-step-card { display: flex; flex-direction: column; gap: 14px; }
.tp-sol-step-card__num { font-family: 'Inter', sans-serif; font-size: 14px; font-weight: 700; letter-spacing: 0.04em; display: flex; align-items: center; justify-content: center; width: 44px; height: 44px; border-radius: 12px; background: #FBE5E8; color: #3D1B2E; }
.tp-sol-step-card__title { font-family: 'Josefin Sans', sans-serif; font-weight: 500; font-size: 22px; line-height: 1.2; letter-spacing: -0.01em; margin: 0; color: #141C2B; }
.tp-sol-step-card__body { font-size: 15.5px; line-height: 1.6; color: #5A6478; margin: 0; }

/* Frosted-glass client-ticker band, over the dark ink hero (industry/
   solution/blog pages). Most client logos are drawn for a light/white
   backdrop, so a near-transparent 7% tint left them low-contrast
   against the dark hero showing through — pushed the blur/opacity/
   saturation up so the panel reads as an actual frosted-white pane the
   logos sit on, not just a faint tint. */
/* saturate() was pulling the dark hero's own color through the blur,
   reading as grey rather than white — brightness() lightens what's
   behind before the blur/tint is applied, and a much higher white
   background opacity does the rest, for an actual white-frosted-glass
   look instead of a smoky grey pane. */
.tp-pagehero__ticker { position: relative; z-index: 3; backdrop-filter: blur(32px); -webkit-backdrop-filter: blur(32px); background: rgba(255,255,255,0.82); border-top: 1px solid rgba(255,255,255,0.7); box-shadow: inset 0 1px 0 rgba(255,255,255,0.6); }
.tp-pagehero__ticker-inner { max-width: 1240px; margin: 0 auto; padding: 30px 40px 26px; display: flex; align-items: center; gap: 36px; }
/* White text no longer holds up against the now much-whiter frosted
   panel (55% white + brightness boost) — same dark-ink flip the
   service-page override below already used for its light background. */
.tp-pagehero__ticker-label { flex: 0 0 auto; font-family: 'Inter', sans-serif; font-size: 15px; font-weight: 700; letter-spacing: 0.06em; color: var(--ink, #3D1B2E); text-shadow: none; }

/* Service-page hero only — white background instead of the dark ink
   gradient every other .tp-pagehero page (industry/solution/blog) still
   uses. Scoped to the auto page-template body class so the shared
   .tp-pagehero rules above stay untouched for those. The nav pill keeps
   its own self-contained dark glass chip regardless (not derived from
   the hero background), so it needs no change here — only the
   foreground text/controls that were relying on the dark backdrop for
   contrast do. */
/* Service-page hero runs vortex-bg over a plain white backdrop (not the
   dark ink gradient the other hero types use) — headline/subhead get
   the same violet->coral gradient fill as the logo mark instead of a
   flat color; ghost-btn/ticker/nav-mobile flip to dark-on-white to
   stay legible against that white base. */
.page-template-page-service-php .tp-pagehero { background: #FFFFFF; }
.page-template-page-service-php .tp-pagehero__headline,
.page-template-page-service-php .tp-pagehero__subhead {
  background: linear-gradient(90deg, #480E6F 0%, #8A47A9 35%, #C991DA 65%, #FC725D 100%);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  text-shadow: none;
}
.page-template-page-service-php .tp-pagehero__ghost-btn { color: var(--ink, #3D1B2E); background: rgba(61,27,46,0.06); border-color: rgba(61,27,46,0.25); }
/* Same full-invert treatment, mirrored for the light hero: solid dark
   fill + white text instead of the white hero's solid-white-fill. */
.page-template-page-service-php .tp-pagehero__ghost-btn:hover { background: var(--ink, #3D1B2E); color: #FFFFFF; border-color: var(--ink, #3D1B2E); box-shadow: 0 14px 30px rgba(61,27,46,0.28); }
.page-template-page-service-php .tp-pagehero__ticker { background: rgba(61,27,46,0.04); border-top: 1px solid rgba(61,27,46,0.12); box-shadow: none; }
.page-template-page-service-php .tp-pagehero__ticker-label { color: var(--ink, #3D1B2E); text-shadow: none; }
.page-template-page-service-php .tp-pagehero .tp-nav-mobile a,
.page-template-page-service-php .tp-pagehero .tp-nav-mobile__toggle { color: var(--ink, #3D1B2E); }
.page-template-page-service-php .tp-pagehero .tp-nav-mobile a:hover,
.page-template-page-service-php .tp-pagehero .tp-nav-mobile__toggle:hover { color: var(--mid, #AF8B91); }
.page-template-page-service-php .tp-pagehero .tp-nav-mobile__submenu a { color: rgba(61,27,34,0.72); }
.page-template-page-service-php .tp-pagehero .tp-nav-mobile__submenu a:hover { color: var(--ink, #3D1B2E); }

.tp-problems { background: #FFFFFF; }
.tp-problems__inner { padding: 78px 40px; }
.tp-problems__head { display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between; gap: 16px; margin-bottom: 36px; }
.tp-problems__head-copy { display: flex; flex-direction: column; gap: 12px; }
.tp-problems__hint { font-family: 'Inter', sans-serif; font-size: 13px; letter-spacing: 0.1em; color: #8A96A8; }
.tp-problems__grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 330px), 1fr)); gap: 16px; }
.tp-problem-card { position: relative; overflow: hidden; display: flex; flex-direction: column; gap: 11px; padding: 30px; min-height: 166px; box-sizing: border-box; border: 1px solid #E4E8EF; border-radius: 16px; background: #FFFFFF; text-decoration: none; transition: background 340ms cubic-bezier(0.2,0.8,0.2,1), transform 340ms cubic-bezier(0.2,0.8,0.2,1), box-shadow 340ms, border-color 340ms; }
.tp-problem-card__top { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.tp-problem-card__num { font-family: 'Josefin Sans', sans-serif; font-weight: 500; font-size: 46px; line-height: 0.9; letter-spacing: -0.03em; color: var(--mid, #AF8B91); transition: color 340ms; }
.tp-problem-card__tag { display: flex; align-items: center; gap: 7px; font-family: 'Inter', sans-serif; font-size: 11.5px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--p1, #FF8063); opacity: 0; transform: translateX(8px); transition: opacity 300ms, transform 340ms cubic-bezier(0.2,0.8,0.2,1); }
.tp-problem-card__heading { font-family: 'Josefin Sans', sans-serif; font-weight: 500; font-size: clamp(20px, 2vw, 25px); line-height: 1.18; color: #141C2B; transition: color 340ms; }
.tp-problem-card__text { font-size: 15px; line-height: 1.55; margin: 0; color: #5A6478; transition: color 340ms; max-width: 52ch; }
.tp-problem-card::after { content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 3px; background: linear-gradient(90deg, var(--p1), var(--p2)); transform: scaleX(0); transform-origin: left; transition: transform 780ms cubic-bezier(0.33,1,0.68,1); }
.tp-problem-card:hover { background: var(--ink-deep, #2B1622); border-color: transparent; transform: translateY(-6px); box-shadow: 0 24px 48px rgba(43,22,34,0.28); }
.tp-problem-card:hover .tp-problem-card__num { color: var(--p1, #FF8063); }
.tp-problem-card:hover .tp-problem-card__tag { opacity: 1; transform: translateX(0); }
.tp-problem-card:hover .tp-problem-card__heading { color: #FFFFFF; }
.tp-problem-card:hover .tp-problem-card__text { color: rgba(255,255,255,0.78); }
.tp-problem-card:hover::after { transform: scaleX(1); }

/* Industry-page problem cards: same hover-flip base as .tp-problem-card
   above, plus a permanently-visible "Pain point" tag (not hover-only),
   a large ghost outline number, and a 5-segment severity meter. */
.tp-problem-card--industry { min-height: 240px; padding: 34px; }
.tp-problem-card--industry .tp-problem-card__tag { opacity: 1; transform: none; color: var(--mid, #AF8B91); }
.tp-problem-card--industry:hover .tp-problem-card__tag { color: var(--p1, #FF8063); }
.tp-problem-card__ghost { position: absolute; top: -14px; right: 8px; font-family: 'Josefin Sans', sans-serif; font-weight: 500; font-size: clamp(80px, 9vw, 130px); line-height: 1; letter-spacing: -0.04em; color: transparent; -webkit-text-stroke: 1.4px var(--soft, #F8CFD5); opacity: 0.4; pointer-events: none; transition: opacity 340ms, -webkit-text-stroke-color 340ms; }
.tp-problem-card--industry:hover .tp-problem-card__ghost { -webkit-text-stroke-color: rgba(255,128,99,0.55); opacity: 0.75; }
.tp-problem-card__meter { position: relative; display: flex; align-items: center; gap: 12px; margin-top: auto; padding-top: 4px; }
.tp-problem-card__meter-bars { display: flex; align-items: center; gap: 5px; }
.tp-problem-card__meter-seg { width: 20px; height: 5px; border-radius: 3px; background: #E4E8EF; transition: background 340ms; }
.tp-problem-card__meter-seg.is-filled { background: var(--mid, #AF8B91); }
.tp-problem-card--industry:hover .tp-problem-card__meter-seg { background: rgba(255,255,255,0.18); }
.tp-problem-card--industry:hover .tp-problem-card__meter-seg.is-filled { background: var(--p1, #FF8063); }
.tp-problem-card__sev-label { font-family: 'Inter', sans-serif; font-size: 11px; letter-spacing: 0.1em; text-transform: uppercase; color: #8A96A8; transition: color 340ms; }
.tp-problem-card--industry:hover .tp-problem-card__sev-label { color: rgba(255,255,255,0.6); }

.tp-engagement { position: relative; overflow: hidden; background: var(--ink-deep, #2B1622); }
.tp-engagement__inner { padding: 100px 40px; }
.tp-engagement__head { display: flex; flex-direction: column; gap: 14px; margin-bottom: 44px; }
.tp-engagement__timeline { position: relative; padding-left: 64px; display: flex; flex-direction: column; }
.tp-engagement__timeline::before { content: ''; position: absolute; left: 27px; top: 12px; bottom: 12px; width: 2px; background: rgba(255,255,255,0.16); }
.tp-engagement__fill { position: absolute; left: 27px; top: 12px; width: 2px; height: 0%; background: linear-gradient(180deg, var(--p1, #FF8063) 0%, var(--p2, #E5C5FA) 100%); box-shadow: 0 0 14px var(--p1, #FF8063); transition: height 130ms linear; }
.tp-engagement__step { position: relative; display: flex; flex-wrap: wrap; align-items: baseline; column-gap: 48px; row-gap: 8px; padding: 34px 0; border-bottom: 1px solid rgba(255,255,255,0.12); }
.tp-engagement__node { position: absolute; left: -45px; top: 44px; width: 18px; height: 18px; border-radius: 50%; background: var(--ink-deep, #2B1622); border: 2px solid var(--p1, #FF8063); animation: nodePulse 2.8s ease-in-out infinite; }
@keyframes nodePulse { 0%, 100% { box-shadow: 0 0 0 0 rgba(255,128,99,0.35); } 50% { box-shadow: 0 0 0 6px rgba(255,128,99,0); } }
.tp-engagement__num { flex: 0 0 auto; font-family: 'Josefin Sans', sans-serif; font-weight: 500; font-size: clamp(46px, 6vw, 78px); line-height: 0.9; letter-spacing: -0.03em; background: linear-gradient(135deg, var(--p1) 0%, var(--p2) 100%); -webkit-background-clip: text; background-clip: text; color: transparent; min-width: 1.7em; }
.tp-engagement__copy { flex: 1 1 340px; min-width: min(100%, 280px); display: flex; flex-direction: column; gap: 12px; }
.tp-engagement__title { font-family: 'Josefin Sans', sans-serif; font-weight: 500; font-size: clamp(22px, 2.2vw, 28px); line-height: 1.2; color: #FFFFFF; }
.tp-engagement__body { font-size: 16px; line-height: 1.65; color: rgba(255,255,255,0.74); margin: 0; max-width: 62ch; }

.tp-svc-articles { background: var(--wash-b, #FBE5E8); }
.tp-svc-articles__inner { padding: 78px 40px; }
.tp-svc-articles__head { display: flex; flex-direction: column; gap: 12px; margin-bottom: 34px; }
/* .tp-svc-articles__grid removed — every cross-link grid now reuses
   .tp-insights__grid directly (same fixed 3-column layout + responsive
   breakpoints as the homepage Insights section), not a parallel
   auto-fit definition that rendered differently. */
/* .tp-svc-article-card* removed — every "suggested articles/case
   studies" cross-link section (single.php, page-service.php,
   page-industry.php, page-solution.php, page-case-study-single.php)
   now reuses .tp-card.tp-card--article, the exact same component the
   homepage Insights section uses, for standardization. */

.tp-svc-cta { position: relative; overflow: hidden; background: radial-gradient(120% 170% at 50% 0%, var(--ink-deep, #2B1622) 30%, var(--ink, #3D1B2E) 52%, var(--p2, #E5C5FA) 74%, var(--p3, #ffffff) 88%, var(--p1, #FF8063) 100%); }
.tp-svc-cta__inner { position: relative; z-index: 2; padding: 128px 40px; text-align: center; }
.tp-svc-cta__heading { font-family: 'Josefin Sans', sans-serif; font-weight: 400; font-size: clamp(34px, 4.6vw, 54px); line-height: 1.08; letter-spacing: -0.02em; color: #FFFFFF; margin: 0 auto 20px; max-width: 20ch; text-wrap: pretty; }
.tp-svc-cta__subhead { font-size: 18px; line-height: 1.6; color: rgba(255,255,255,0.82); max-width: 46ch; margin: 0 auto 36px; text-wrap: pretty; }

/* ===========================================================
   INDUSTRY PAGE — solutions, testimonial quote, FAQ head
   =========================================================== */
.tp-ind-lede { font-size: clamp(16px, 1.5vw, 19px); line-height: 1.6; color: #5A6478; margin: 8px 0 0; max-width: 60ch; text-wrap: pretty; }
.tp-ind-lede--light { color: rgba(255,255,255,0.72); }

.tp-ind-solutions { position: relative; overflow: hidden; background: var(--ink-deep, #2B1622); }
.tp-ind-solutions__inner { padding: 96px 40px; }
.tp-ind-solutions__head { display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between; gap: 20px; margin-bottom: 44px; }
.tp-ind-solutions__grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 340px), 1fr)); gap: 20px; }
.tp-ind-solution-card { position: relative; overflow: hidden; display: flex; flex-direction: column; border: 1px solid rgba(255,255,255,0.12); border-radius: 18px; background: rgba(255,255,255,0.04); transform: translateY(0); transition: transform 340ms cubic-bezier(0.2,0.8,0.2,1), border-color 340ms, box-shadow 340ms; }
.tp-ind-solution-card:hover { transform: translateY(-8px); border-color: rgba(255,128,99,0.5); box-shadow: 0 26px 54px rgba(0,0,0,0.34); }
.tp-ind-solution-card__media { position: relative; aspect-ratio: 16 / 10; width: 100%; overflow: hidden; background: #140F13; }
.tp-ind-solution-card__media img { width: 100%; height: 100%; object-fit: cover; display: block; }
.tp-ind-solution-card__num { position: absolute; top: 14px; left: 14px; z-index: 2; display: flex; align-items: center; justify-content: center; min-width: 42px; height: 30px; padding: 0 12px; border-radius: 8px; background: rgba(16,11,14,0.7); backdrop-filter: blur(8px); border: 1px solid rgba(255,128,99,0.4); font-family: 'Inter', sans-serif; font-size: 13px; font-weight: 700; color: var(--p1, #FF8063); }
.tp-ind-solution-card__body { display: flex; flex-direction: column; gap: 10px; padding: 28px; flex: 1 1 auto; }
.tp-ind-solution-card__title { font-family: 'Josefin Sans', sans-serif; font-weight: 500; font-size: clamp(20px, 2.1vw, 26px); line-height: 1.16; margin: 0; color: #FFFFFF; text-wrap: pretty; }
.tp-ind-solution-card__text { font-size: 15.5px; line-height: 1.62; color: rgba(255,255,255,0.74); margin: 0; text-wrap: pretty; }

.tp-ind-quote { background: var(--wash-b, #FBE5E8); }
.tp-ind-quote__inner { max-width: 900px; margin: 0 auto; padding: 104px 40px; display: flex; flex-direction: column; align-items: center; gap: 30px; text-align: center; }
.tp-ind-quote__mark { font-family: 'Josefin Sans', sans-serif; font-size: 88px; line-height: 0.5; color: var(--soft, #F8CFD5); }
.tp-ind-quote__text { font-family: 'Josefin Sans', sans-serif; font-style: italic; font-weight: 400; font-size: clamp(24px, 3.2vw, 38px); line-height: 1.32; letter-spacing: -0.01em; color: #141C2B; margin: -30px 0 0; max-width: 26ch; text-wrap: pretty; }
/* Attribution is title/company only now — no name, no avatar (there's
   no person being identified, just the anonymized role + company
   type), per the same anonymization the homepage testimonial rotator/
   quote-slider already used. */
.tp-ind-quote__attr { display: flex; align-items: center; }
.tp-ind-quote__title { font-family: 'Inter', sans-serif; font-size: 13px; letter-spacing: 0.08em; color: #5A6478; text-align: left; }

.tp-ind-faq__inner { padding: 96px 40px; }
.tp-ind-faq__head { text-align: center; max-width: 640px; margin: 0 auto 44px; display: flex; flex-direction: column; align-items: center; gap: 4px; }

/* ===========================================================
   ARTICLE (single.php) — blog posts. Reuses .tp-pagehero for the dark
   header shell and .tp-svc-articles/.tp-svc-cta from the service page
   for Related/CTA, so only the article-specific pieces are new here:
   reading progress bar, header title block, cover, 3-col body (share
   rail / reading column / sticky TOC).
   =========================================================== */
.tp-article-progress-track { position: fixed; top: 0; left: 0; right: 0; height: 4px; z-index: 300; pointer-events: none; }
.tp-article-progress { height: 4px; width: 0%; background: linear-gradient(90deg, #140F13 0%, var(--ink-deep, #2B1622) 55%, var(--ink, #3D1B2E) 85%, var(--mid, #AF8B91) 100%); box-shadow: 0 0 10px rgba(43,22,34,0.55); border-radius: 0 4px 4px 0; transition: width 80ms linear; }

.tp-article-header__inner { position: relative; z-index: 2; flex: 1 1 auto; align-self: center; width: 100%; max-width: 760px; margin: 0 auto; box-sizing: border-box; padding: 80px 40px; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; gap: 20px; animation: heroRise 900ms cubic-bezier(0.16,1,0.3,1) both; }
.tp-article-header__title { font-family: 'Josefin Sans', sans-serif; font-weight: 400; font-size: clamp(30px, 4.4vw, 56px); line-height: 1.1; letter-spacing: -0.02em; margin: 0; color: #FFFFFF; max-width: 20ch; text-wrap: pretty; }
.tp-article-header__dek { font-size: clamp(16px, 1.4vw, 19px); line-height: 1.6; color: rgba(255,255,255,0.85); margin: 0; max-width: 48ch; text-wrap: pretty; }
.tp-article-header__byline { display: flex; flex-direction: column; align-items: center; gap: 2px; margin-top: 4px; }
.tp-article-header__author { font-size: 14px; font-weight: 600; color: #FFFFFF; }
.tp-article-header__date { font-family: 'Inter', sans-serif; font-size: 12px; color: rgba(255,255,255,0.7); }

.tp-article-cover-wrap { max-width: 1240px; margin: 0 auto; padding: 0 40px; }
.tp-article-cover { height: clamp(200px, 32vw, 420px); border-radius: 16px; border: 1px solid #E4E8EF; background: repeating-linear-gradient(135deg, var(--wash-a, #FADBE0) 0 14px, var(--wash-b, #FBE5E8) 14px 28px); display: flex; align-items: center; justify-content: center; margin-top: 40px; overflow: hidden; }
.tp-article-cover--image { height: auto; aspect-ratio: 3 / 2; background: none; }
.tp-article-cover--image img { width: 100%; height: 100%; object-fit: cover; display: block; }
.tp-article-cover span { font-family: 'Inter', sans-serif; font-size: 12px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--metric, #93757A); background: rgba(255,255,255,0.8); padding: 8px 14px; border-radius: 8px; }

.tp-article-body { max-width: 1240px; margin: 0 auto; padding: 64px 40px 96px; display: grid; grid-template-columns: 80px minmax(0, 720px) 260px; gap: 48px; justify-content: center; }
.tp-article-share { display: flex; flex-direction: column; gap: 10px; align-items: center; position: sticky; top: 96px; align-self: start; }
.tp-article-share__label { font-family: 'Inter', sans-serif; font-size: 10px; letter-spacing: 0.2em; text-transform: uppercase; color: #8A96A8; writing-mode: vertical-rl; margin-bottom: 4px; }
.tp-article-share__btn { display: flex; align-items: center; justify-content: center; width: 38px; height: 38px; border-radius: 999px; border: 1px solid #E4E8EF; background: #FFFFFF; text-decoration: none; font-family: 'Inter', sans-serif; font-weight: 700; font-size: 13px; color: var(--ink, #3D1B2E); transition: border-color 200ms; }
.tp-article-share__btn:hover { border-color: var(--soft, #F8CFD5); }

.tp-article-content { min-width: 0; display: flex; flex-direction: column; gap: 26px; font-size: 18px; line-height: 1.75; color: #2A3442; overflow-wrap: anywhere; }
.tp-article-content table { display: block; max-width: 100%; overflow-x: auto; border-collapse: collapse; }
.tp-article-content p { margin: 0; }
.tp-article-content > p:first-of-type { font-size: 20px; line-height: 1.7; color: #1D2634; }
.tp-article__h2 { font-family: 'Josefin Sans', sans-serif; font-weight: 500; font-size: clamp(25px, 2.5vw, 32px); line-height: 1.18; letter-spacing: -0.01em; margin: 30px 0 0; padding-top: 30px; border-top: 1px solid #ECEFF3; color: var(--ink, #3D1B2E); scroll-margin-top: 80px; }
.tp-article-content blockquote { margin: 10px 0; padding-left: 20px; border-left: 3px solid var(--mid, #AF8B91); font-family: 'Josefin Sans', sans-serif; font-style: italic; font-weight: 400; font-size: clamp(21px, 2vw, 26px); line-height: 1.4; color: var(--ink, #3D1B2E); }
.tp-article-content blockquote p { margin: 0; }
.tp-article-content ul { margin: 4px 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 12px; }
.tp-article-content ul li { display: flex; align-items: baseline; gap: 12px; font-size: 17px; line-height: 1.6; }
.tp-article-content ul li::before { content: ''; flex: 0 0 auto; width: 9px; height: 9px; border-radius: 2px; background: var(--mid, #AF8B91); transform: translateY(2px); }

.tp-article-author { margin-top: 24px; display: flex; flex-direction: column; gap: 4px; padding: 24px 26px; border: 1px solid #E4E8EF; border-radius: 14px; background: var(--wash-b, #FBE5E8); }
.tp-article-author__name { font-size: 16px; font-weight: 600; color: #141C2B; }
.tp-article-author__bio { font-size: 14px; line-height: 1.55; color: #5A6478; }

.tp-article-toc { position: sticky; top: 96px; align-self: start; display: flex; flex-direction: column; gap: 2px; padding: 6px 0 6px 24px; border-left: 3px solid var(--mid, #AF8B91); }
.tp-article-toc__label { font-family: 'Inter', sans-serif; font-size: 16px; font-weight: 800; letter-spacing: 0.12em; text-transform: uppercase; color: #141C2B; margin-bottom: 14px; }
.tp-article-toc__link { display: block; font-size: 14.5px; line-height: 1.5; font-weight: 500; color: #5A6478; text-decoration: none; padding: 11px 0; transition: color 200ms, font-weight 200ms; }
.tp-article-toc__link.is-active { font-weight: 700; color: var(--ink, #3D1B2E); }

/* ===========================================================
   RESPONSIVE
   =========================================================== */
@media (max-width: 980px) {
  /* padding is intentionally NOT overridden here anymore — that stale
     "18px 20px 0" (top-heavy, no bottom padding) was left over from the
     old pre-pill nav, which had no rounded card of its own. Against the
     pill's own rounded chip it made brand/burger hug the pill's bottom
     edge with a big gap up top — the "logo not centered / disjointed"
     look. .tp-nav--pill's own symmetric-ish padding (10px 10px 10px 8px)
     applies at every breakpoint now. */
  .tp-nav { grid-template-columns: auto 1fr; }
  .tp-nav--pill { margin: 18px 12px 0; }
  .tp-nav__slider { display: none; }
  .tp-nav__cta { display: none; }
  .tp-nav__burger { display: flex; }
  .tp-subnav { grid-template-columns: auto 1fr; }
  .tp-subnav--pill { margin: 18px 12px 0; }
  .tp-subnav__slider { display: none; }
  .tp-subnav__cta { display: none; }
  .tp-metric__value { font-size: 42px; }
  .tp-bento-card__cube { display: none; }
  .tp-testimonial__deco { display: none; }
  .tp-global__map-wrap { height: 420px; margin-top: 40px; margin-bottom: 56px; }
  .tp-services__grid, .tp-insights__grid, .tp-bento__grid { grid-template-columns: 1fr 1fr; }
  .tp-bento-card--wide { grid-column: span 2; }
  /* Cards previously kept their full desktop stat/title sizes here even
     though the grid had already dropped to 2 columns — numbers read as
     oversized/"zoomed in" relative to the narrower card width. */
  .tp-bento__inner { padding: 72px 24px; }
  .tp-bento-card { padding: 22px; min-height: 210px; }
  .tp-bento-card--wide { min-height: 240px; }
  .tp-bento-card__stat { font-size: 46px; }
  .tp-bento-card__stat--white { font-size: 38px; }
  .tp-bento-card__title { font-size: 18px; }
  .tp-bento-card__body { font-size: 14px; }
  .tp-bento-card__cta-text { font-size: 22px; }
  .tp-capabilities__grid, .tp-global__head { grid-template-columns: 1fr; }
  .tp-global__regions { border-left: none; padding-left: 0; border-top: 1px solid rgba(255,255,255,0.16); padding-top: 24px; }
  .tp-numbers__body { grid-template-columns: 1fr; gap: 40px; }
  .tp-numbers__rule { display: none; }
  .tp-numbers__inner { padding: 72px 24px; }
  .tp-numbers__heading { margin-bottom: 48px; }
  .tp-footer__cols { grid-template-columns: 1fr 1fr; }
  .tp-pagehero__inner { padding: 64px 24px; }
  .tp-sol-steps__head, .tp-sol-steps__grid { padding-left: 24px; padding-right: 24px; }
  .tp-engagement__timeline { padding-left: 48px; }
  .tp-engagement__node { left: -33px; }
  /* "hover a problem" doesn't apply on touch — hidden below desktop */
  .tp-problems__hint { display: none; }
  /* Article: share rail + sticky TOC are desktop-only, matching the design */
  .tp-article-header__inner { padding: 64px 24px; }
  .tp-article-body { grid-template-columns: 1fr; padding: 48px 24px 72px; }
  .tp-article-share, .tp-article-toc { display: none; }
}
@media (max-width: 980px) {
  /* Bare .tp-container (no section-specific override) is used directly
     by several newer pages — About, Terms, Privacy, Contact, Browse
     Talent — and previously kept its full 40px desktop side padding
     all the way down to phone widths since only section-scoped
     variants (.tp-services .tp-container etc., below) had reductions. */
  .tp-container { padding-left: 24px; padding-right: 24px; }
}

@media (max-width: 640px) {
  .tp-container { padding-left: 20px; padding-right: 20px; }
  .tp-services .tp-container, .tp-capabilities .tp-container, .tp-insights .tp-container, .tp-cta__inner, .tp-footer .tp-container, .tp-bento__inner { padding-left: 20px; padding-right: 20px; padding-top: 56px; padding-bottom: 56px; }
  .tp-nav { padding-left: 20px; padding-right: 20px; }
  /* Logo was rendering at full desktop size — too big/heavy for a
     narrow mobile nav bar. Brand box pinned to the original mobile
     height (30px) so the pill length matches desktop's, logo overflows
     it the same way. */
  .tp-nav__brand { gap: 10px; padding: 9px 14px 9px 12px; }
  .tp-nav--pill .tp-nav__brand, .tp-subnav--pill .tp-subnav__brand { height: 30px; }
  .tp-nav__logo-img, .tp-subnav__logo-img { height: 41px; }
  /* Proof-figures (1e/2e): single column, not sticky; both stat rows
     regroup into one continuous 2x2 grid ahead of the funnel panel
     instead of sandwiching it, matching the 2e mobile mock. */
  .tp-proof .tp-container { padding: 56px 20px; }
  .tp-proof__card { grid-template-columns: 1fr; gap: 40px; }
  .tp-proof__intro { position: static; top: auto; }
  .tp-proof__heading { font-size: 28px; max-width: none; }
  .tp-proof__lede { font-size: 15px; }
  .tp-proof__stats-row--bottom { order: 2; }
  .tp-proof__funnel { order: 3; }
  .tp-proof__stat { padding: 22px; }
  .tp-proof__stat-value { font-size: 40px; }
  .tp-proof__funnel { padding: 24px; }
  .tp-proof__funnel-row { grid-template-columns: 1fr auto; grid-template-areas: "name pct" "track track"; row-gap: 8px; }
  .tp-proof__funnel-name { grid-area: name; }
  .tp-proof__funnel-pct { grid-area: pct; font-size: 20px; }
  .tp-proof__funnel-track { grid-area: track; height: 16px; }
  /* Headline/subhead/buttons stay grouped, nudged further down toward
     screen center via extra top padding; the ticker sits right near
     the bottom edge with a small fixed margin — close but not flush. */
  .tp-hero__inner { padding: 135px 24px 0; display: flex; flex-direction: column; justify-content: center; }
  .tp-hero__headline { font-size: 44px; font-weight: 600; margin: 0 auto 12px; }
  .tp-hero__subhead { font-size: 15px; font-weight: 600; margin-bottom: 29px; }
  .tp-hero__actions { flex-direction: column; align-items: center; gap: 12px; margin-top: 0; margin-bottom: 0; }
  .tp-hero__actions .tp-pill-btn, .tp-hero__actions .tp-solid-btn { justify-content: center; font-size: 14px; width: 200px; height: 50px; padding: 0; }
  .tp-hero__stats { margin-top: auto; margin-bottom: 17px; flex-direction: column; align-items: center; text-align: center; gap: 20px; }
  .tp-hero__metrics { justify-content: center; gap: 40px; }
  .tp-hero__divider { display: none; }
  .tp-metric__value { font-size: 40px; }
  .tp-ticker { -webkit-mask-image: none; mask-image: none; width: 100%; background: rgba(255,255,255,0.08); backdrop-filter: blur(6px) saturate(1.05); -webkit-backdrop-filter: blur(6px) saturate(1.05); border: 1px solid rgba(255,255,255,0.18); border-radius: 14px; padding: 12px 0; }
  /* Was only set at the 430px tier below — phones between 431-640px
     wide (a large chunk of real devices) were still getting the full
     130x62 desktop box, rendering visibly oversized/"broader" than the
     rest of the mobile layout. */
  .tp-ticker__logo { height: 64px; width: 137px; }
  .tp-ticker__track { gap: 87px; }
  /* Service-page ticker already sits inside .tp-pagehero__ticker's own
     darkening band — stacking the glass panel on top of that reads as too
     visible there, so it's removed for now (revisit later if desired). */
  .tp-pagehero .tp-ticker { background: none; backdrop-filter: none; -webkit-backdrop-filter: none; border: none; padding: 0; }
  .tp-services__grid, .tp-insights__grid, .tp-bento__grid { grid-template-columns: 1fr; }
  .tp-bento-card--wide { grid-column: span 1; }
  .tp-bento-card { min-height: 325px; padding: 24px; }
  .tp-bento-card__stat { font-size: 44px; }
  .tp-bento-card__stat--white { font-size: 36px; }
  /* Last (CTA) card: bigger body text + button label, clear gap between them */
  .tp-bento-card--cta { gap: 32px; }
  .tp-bento-card__cta-text { font-size: 30px; line-height: 1.3; }
  .tp-bento-card--cta .tp-pill-btn { font-size: 16px; padding: 12px 24px 12px 12px; }
  .tp-bento-card--cta .tp-pill-btn__icon { width: 22px; height: 22px; }
  .tp-bento-card--cta .tp-pill-btn:hover .tp-pill-btn__icon { width: 36px; height: 36px; }
  .tp-bento-card__title { font-size: 18px; }
  .tp-global__map-wrap { height: 300px; margin-top: 32px; margin-bottom: 40px; }
  .tp-kinetic { padding: 28px 24px; }
  .tp-kinetic__name { font-size: 44px; }
  .tp-kinetic__namewrap { height: 52px; }
  .tp-kinetic__statwrap { height: auto; flex-wrap: wrap; gap: 6px; }
  .tp-cta__inner { padding-top: 84px; padding-bottom: 84px; }
  .tp-footer__cols { grid-template-columns: 1fr; }
  .tp-footer__brand-row { flex-direction: column; align-items: flex-start; gap: 20px; }
  .tp-footer__legal { flex-direction: column; align-items: flex-start; gap: 14px; }
  .tp-numbers__inner { padding: 56px 20px; }
  .tp-numbers__heading { font-size: 28px; margin-bottom: 36px; }
  .tp-numbers__stats { gap: 32px 20px; }
  .tp-numbers__stat-value { font-size: 42px; }
  .tp-numbers__stat-unit { font-size: 24px; }
  .tp-pagehero__inner { padding: 100px 20px 48px; gap: 20px; }
  /* Match the homepage hero's exact mobile CTA sizing (.tp-hero__actions
     above) — fixed 200x50 boxes, not full-width stretched buttons, so
     every .tp-pagehero page's two hero CTAs look identical to the
     homepage's on mobile. */
  .tp-pagehero__actions { flex-direction: column; align-items: center; width: 100%; gap: 12px; }
  .tp-pagehero__actions .tp-pill-btn, .tp-pagehero__actions .tp-pagehero__ghost-btn { justify-content: center; font-size: 14px; width: 200px; height: 50px; padding: 0; }
  .tp-pagehero__ticker-inner { flex-direction: column; align-items: stretch; gap: 14px; padding: 22px 20px; }
  .tp-pagehero__ticker-label { text-align: center; }
  .tp-problems__inner, .tp-engagement__inner, .tp-svc-articles__inner, .tp-ind-solutions__inner, .tp-ind-quote__inner, .tp-ind-faq__inner { padding: 56px 20px; }
  .tp-problem-card { padding: 22px; min-height: auto; }
  .tp-engagement__timeline { padding-left: 36px; }
  .tp-engagement__node { left: -27px; width: 14px; height: 14px; }
  .tp-svc-cta__inner { padding: 64px 20px; }
  .tp-article-header__inner { padding: 100px 20px 48px; }
  .tp-article-cover-wrap { padding: 0 20px; }
  .tp-article-cover { margin-top: 24px; }
  .tp-article-body { padding: 40px 20px 56px; }
  .tp-article-content { font-size: 16px; }
  .tp-article-content > p:first-of-type { font-size: 18px; }
}
@media (max-width: 430px) {
  .tp-hero__headline { font-size: 46px; }
  .tp-metric__value { font-size: 32px; }
  .tp-kinetic__name { font-size: 34px; }
  .tp-kinetic__namewrap { height: 40px; }
  .tp-ticker__logo { height: 51px; width: 108px; }
  .tp-ticker__track { gap: 59px; }
}

/* ===========================================================
   LARGE-DESKTOP-ONLY: bento grid ("Case study bento") enlarged to
   fill a full viewport — was reading small/empty on wide screens.
   Threshold raised from 981px to 1400px — anything below that
   (including 13"/14" laptops at ~1280-1366px) was getting the same
   forced-100vh-height + largest-font treatment meant for big desktop
   monitors, which read as oversized/"zoomed in" on a smaller laptop
   viewport. Laptops now fall through to the plain base sizing above
   (58px stat, 28px card padding, no forced full-height layout).
   =========================================================== */
@media (min-width: 1400px) {
  .tp-bento { min-height: 100vh; display: flex; flex-direction: column; }
  .tp-bento .tp-bento__inner { max-width: 1368px; flex: 1 1 auto; display: flex; flex-direction: column; justify-content: center; }
  .tp-bento__grid { gap: 23px; }
  .tp-bento-card { min-height: 270px; padding: 29px; }
  .tp-bento-card--wide { min-height: 311px; }
  .tp-bento-card__stat { font-size: 62px; }
  .tp-bento-card__stat--white { font-size: 50px; }
  .tp-bento-card__title { font-size: 22px; }
  .tp-bento-card__body { font-size: 16px; }
  .tp-bento-card__cta-text { font-size: 26px; }
  .tp-bento-card--cta .tp-pill-btn { font-size: 15px; }
}

/* ===========================================================
   "Hire talent" modal — hidden by default; opened via
   data-modal-open on the hero CTA, closed via backdrop/X/Esc.
   initHireModal() in main.js toggles .is-open, which drives the
   entrance animation (see keyframes below).
   =========================================================== */
.tp-hire-modal { position: fixed; inset: 0; z-index: 200; display: none; }
.tp-hire-modal.is-open { display: block; }
.tp-hire-modal__backdrop { position: absolute; inset: 0; background: rgba(43,22,34,0.55); backdrop-filter: blur(6px) saturate(1.2); -webkit-backdrop-filter: blur(6px) saturate(1.2); opacity: 0; transition: opacity 340ms cubic-bezier(0.2,0.8,0.2,1); }
.tp-hire-modal.is-open .tp-hire-modal__backdrop { opacity: 1; }

.tp-hire-modal__panel { position: absolute; top: 50%; left: 50%; width: min(880px, 92vw); max-height: 88vh; overflow-y: auto; background: #FFFFFF; border-radius: 22px; padding: 44px 48px 40px; box-shadow: 0 40px 90px rgba(43,22,34,0.38); transform: translate(-50%, -50%) scale(0.72) rotate(-4deg); clip-path: circle(18% at 50% 28%); opacity: 0; transition: transform 520ms cubic-bezier(0.34,1.42,0.4,1), clip-path 560ms cubic-bezier(0.22,0.9,0.3,1), opacity 260ms ease; }
.tp-hire-modal.is-open .tp-hire-modal__panel { transform: translate(-50%, -50%) scale(1) rotate(0deg); clip-path: circle(100% at 50% 28%); opacity: 1; }

.tp-hire-modal__close { position: absolute; top: 18px; right: 20px; width: 34px; height: 34px; border-radius: 999px; border: none; background: transparent; font-size: 24px; line-height: 1; color: #5A6478; cursor: pointer; transition: background 180ms, color 180ms; }
.tp-hire-modal__close:hover { background: #F3ECEF; color: var(--ink, #3D1B2E); }

.tp-hire-modal__head { text-align: center; max-width: 620px; margin: 0 auto 30px; }
.tp-hire-modal__title { font-size: 26px; font-weight: 700; color: var(--ink, #3D1B2E); margin: 0 0 10px; line-height: 1.3; }
.tp-hire-modal__subhead { font-size: 17px; color: #5A6478; margin: 0; }

.tp-hire-modal__grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin-bottom: 22px; }
.tp-hire-modal__grid input { width: 100%; box-sizing: border-box; padding: 15px 18px; border-radius: 10px; border: 1px solid #E4E8EF; background: #F7F8F6; font-family: inherit; font-size: 15px; color: #141C2B; transition: border-color 180ms, background 180ms; }
.tp-hire-modal__grid input::placeholder { color: #9AA1AF; }
.tp-hire-modal__grid input:focus { outline: none; border-color: var(--p1, #FF8063); background: #FFFFFF; }

/* Optional standalone message textarea — used by the "Get in touch to
   hire" modal (Browse Talent page), sits below the grid, same field
   styling as the grid inputs. */
.tp-hire-modal__message { width: 100%; box-sizing: border-box; padding: 15px 18px; border-radius: 10px; border: 1px solid #E4E8EF; background: #F7F8F6; font-family: inherit; font-size: 15px; color: #141C2B; resize: vertical; margin-bottom: 22px; transition: border-color 180ms, background 180ms; }
.tp-hire-modal__message::placeholder { color: #9AA1AF; }
.tp-hire-modal__message:focus { outline: none; border-color: var(--p1, #FF8063); background: #FFFFFF; }

.tp-hire-modal__submit { display: block; width: 220px; margin: 0 auto; text-align: center; font-size: 16px; font-weight: 600; color: #FFFFFF; background: var(--ink, #3D1B2E); padding: 15px 30px; border-radius: 10px; border: none; cursor: pointer; transition: background 200ms cubic-bezier(0.2,0.8,0.2,1); }
.tp-hire-modal__submit:hover { background: var(--ink-deep, #2B1622); }
.tp-hire-modal__submit:disabled { opacity: 0.6; cursor: default; }

.tp-hire-modal__success { display: none; text-align: center; margin: 18px 0 0; font-size: 14px; font-weight: 600; color: var(--ink, #3D1B2E); }
.tp-hire-modal__success.is-visible { display: block; }
.tp-hire-modal__form.is-submitted .tp-hire-modal__grid,
.tp-hire-modal__form.is-submitted .tp-hire-modal__message,
.tp-hire-modal__form.is-submitted .tp-hire-modal__submit { display: none; }

@media (max-width: 980px) {
  .tp-hire-modal__panel { width: min(680px, 90vw); padding: 38px 36px 34px; }
  .tp-hire-modal__title { font-size: 24px; }
}

@media (max-width: 640px) {
  .tp-hire-modal__panel { padding: 34px 22px 30px; border-radius: 18px; }
  .tp-hire-modal__grid { grid-template-columns: 1fr; gap: 12px; }
  .tp-hire-modal__title { font-size: 21px; }
  .tp-hire-modal__subhead { font-size: 15px; }
  .tp-hire-modal__submit { width: 100%; }
}

@media (max-width: 430px) {
  .tp-hire-modal__panel { width: 94vw; padding: 28px 16px 26px; border-radius: 16px; max-height: 92vh; }
  .tp-hire-modal__head { margin-bottom: 22px; }
  .tp-hire-modal__title { font-size: 19px; }
  .tp-hire-modal__subhead { font-size: 14px; }
  .tp-hire-modal__grid input { padding: 13px 14px; font-size: 14px; }
  .tp-hire-modal__close { top: 10px; right: 12px; width: 30px; height: 30px; font-size: 20px; }
}

/* ===========================================================
   Browse Talent page — anonymized candidate cards (page-browse-
   talent.php). Generic silhouette avatar + '****' name stand in for
   real photos/candidates; "Placed at" tags use industry shorthand
   (BIG 4, WITCH, ...) instead of real client names.
   =========================================================== */
.tp-talent { background: #FFFFFF; padding: 78px 0; }
.tp-talent__grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 360px), 1fr)); gap: 20px; }

.tp-talent-card { display: flex; flex-direction: column; gap: 14px; height: 100%; min-height: 430px; box-sizing: border-box; background: #FFFFFF; border: 1px solid #E4E8EF; border-radius: 16px; padding: 26px; transition: transform 260ms cubic-bezier(0.2,0.8,0.2,1), box-shadow 260ms, border-color 260ms; }
.tp-talent-card:hover { transform: translateY(-6px); box-shadow: 0 24px 48px rgba(61,27,46,0.14); border-color: var(--soft, #F8CFD5); }

.tp-talent-card__head { display: flex; align-items: center; gap: 14px; }
.tp-talent-card__avatar { flex: 0 0 auto; width: 52px; height: 52px; border-radius: 999px; display: flex; align-items: center; justify-content: center; background: var(--wash-b, #FBE5E8); color: var(--ink, #3D1B2E); }
.tp-talent-card__avatar svg { width: 28px; height: 28px; }
.tp-talent-card__avatar--f { background: rgba(197,143,250,0.18); color: #8A47A9; }

.tp-talent-card__name { display: flex; align-items: center; gap: 6px; font-size: 18px; font-weight: 700; color: var(--ink, #3D1B2E); letter-spacing: 0.08em; }
.tp-talent-card__verified { width: 16px; height: 16px; flex: 0 0 auto; }
.tp-talent-card__role { font-size: 13px; color: #5A6478; margin-top: 2px; }

.tp-talent-card__bio { font-size: 14px; line-height: 1.6; color: #3F4759; margin: 0; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; overflow: hidden; }

.tp-talent-card__skills { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; min-height: 30px; }
.tp-talent-card__tag { font-size: 12px; font-weight: 600; color: var(--ink, #3D1B2E); background: #F7F8F6; border: 1px solid #E4E8EF; border-radius: 999px; padding: 5px 12px; }
.tp-talent-card__tag-more { font-size: 12px; color: #8A96A8; text-decoration: underline; }

.tp-talent-card__firms { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; padding-top: 4px; border-top: 1px solid #F0F1EF; min-height: 34px; }
.tp-talent-card__firms-label { font-family: 'Inter', sans-serif; font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; color: #8A96A8; }
.tp-talent-card__firm-tag { font-size: 12px; font-weight: 600; color: #FFFFFF; background: var(--ink, #3D1B2E); border-radius: 6px; padding: 4px 10px; }

.tp-talent-card__cta { margin-top: auto; display: block; width: 100%; text-align: center; font-size: 14px; font-weight: 600; font-family: inherit; color: #FFFFFF; background: var(--ink, #3D1B2E); padding: 13px 20px; border-radius: 10px; border: none; cursor: pointer; transition: background 200ms cubic-bezier(0.2,0.8,0.2,1); }
.tp-talent-card__cta:hover { background: var(--ink-deep, #2B1622); color: #FFFFFF; }

@media (max-width: 980px) {
  .tp-talent { padding: 60px 0; }
  .tp-talent__grid { grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr)); gap: 16px; }
}

@media (max-width: 640px) {
  .tp-talent { padding: 48px 0; }
  .tp-talent__grid { grid-template-columns: 1fr; }
  .tp-talent-card { padding: 22px; min-height: 0; }
}

@media (max-width: 430px) {
  .tp-talent-card { padding: 18px; gap: 12px; }
  .tp-talent-card__avatar { width: 44px; height: 44px; }
  .tp-talent-card__avatar svg { width: 24px; height: 24px; }
  .tp-talent-card__name { font-size: 16px; }
  .tp-talent-card__bio { font-size: 13px; }
}

/* ===========================================================
   About page (page-about.php) — story copy + values grid, sits
   between the static-gradient pagehero and the reused Numbers band.
   =========================================================== */
.tp-about-story { background: #FFFFFF; padding: 78px 0 20px; }
.tp-about-story__inner { max-width: 760px; display: flex; flex-direction: column; gap: 20px; }
.tp-about-story__para { font-size: 18px; line-height: 1.7; color: #3F4759; margin: 0; }

.tp-about-values { background: #FFFFFF; padding: 58px 0 78px; }
.tp-about-values__head { display: flex; flex-direction: column; gap: 12px; margin-bottom: 36px; max-width: 640px; }
.tp-about-values__grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr)); gap: 16px; }

.tp-value-card { border: 1px solid #E4E8EF; border-radius: 16px; padding: 26px; background: #FFFFFF; transition: transform 260ms cubic-bezier(0.2,0.8,0.2,1), box-shadow 260ms, border-color 260ms; }
.tp-value-card:hover { transform: translateY(-6px); box-shadow: 0 24px 48px rgba(61,27,46,0.14); border-color: var(--soft, #F8CFD5); }
.tp-value-card__title { font-size: 17px; font-weight: 700; color: var(--ink, #3D1B2E); margin-bottom: 10px; }
.tp-value-card__text { font-size: 14px; line-height: 1.6; color: #5A6478; margin: 0; }

@media (max-width: 980px) {
  .tp-about-story { padding: 60px 0 16px; }
  .tp-about-story__para { font-size: 16px; }
  .tp-about-values { padding: 48px 0 60px; }
}

@media (max-width: 640px) {
  .tp-about-values__grid { grid-template-columns: 1fr; }
}

/* ===========================================================
   Terms & Conditions page (page-terms.php) — numbered legal
   sections + a Contact Us split panel (info column + form card),
   matching the client's reference layout.
   =========================================================== */
.tp-terms { background: #FFFFFF; padding: 70px 0 20px; }
.tp-terms__inner { max-width: 820px; }
.tp-terms__lede { font-size: 16px; line-height: 1.7; color: #3F4759; margin: 0 0 16px; }
.tp-terms__section { margin-top: 40px; }
.tp-terms__heading { font-family: 'Josefin Sans', sans-serif; font-weight: 600; font-size: 22px; color: var(--ink, #3D1B2E); margin: 0 0 14px; }
.tp-terms__subheading { font-size: 15px; font-weight: 700; color: var(--ink, #3D1B2E); margin: 18px 0 8px; }
.tp-terms__text { font-size: 15px; line-height: 1.75; color: #3F4759; margin: 0 0 14px; }
.tp-terms__list { margin: 0 0 14px; padding-left: 22px; display: flex; flex-direction: column; gap: 6px; }
.tp-terms__list li { font-size: 15px; line-height: 1.6; color: #3F4759; }

/* Privacy page's section 14 — 3 regional offices, side by side. */
.tp-privacy-offices { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; margin-top: 20px; }
.tp-privacy-office { border: 1px solid #E4E8EF; border-radius: 14px; padding: 22px; }
.tp-privacy-office__region { font-family: 'Josefin Sans', sans-serif; font-size: 17px; font-weight: 700; color: var(--ink, #3D1B2E); margin: 0 0 10px; }
.tp-privacy-office__company { font-size: 14px; font-weight: 600; color: #141C2B; margin-bottom: 6px; }
.tp-privacy-office__address { font-size: 14px; line-height: 1.5; color: #5A6478; margin-bottom: 10px; }
.tp-privacy-office__value { display: block; font-size: 14px; color: #3F4759; text-decoration: none; margin-bottom: 4px; }
.tp-privacy-office__value:hover { color: var(--ink, #3D1B2E); }

@media (max-width: 980px) {
  .tp-privacy-offices { grid-template-columns: 1fr; }
}

/* No separate .tp-pagehero on this page anymore — nav-subpage sits
   directly inside .tp-terms-contact instead, so extra top padding
   makes room for the nav pill instead of the section starting flush
   under it. */
.tp-terms-contact { background: var(--wash-a, #FBF3F0); padding: 0 0 70px; }
.tp-terms-contact__head { padding: 48px 0 40px; }
.tp-terms-contact__head h1 { margin: 0; }
/* Nav's mobile menu panel (.tp-nav-mobile) defaults to white text for
   dark hero backgrounds — this page no longer has one (no .tp-pagehero
   wrapper), so it needs the same light-background flip the Service
   page's white hero already uses. The pill itself (.tp-subnav--pill)
   needs no change — it's a self-contained frosted glass chip with dark
   text regardless of what's behind it. */
.page-template-page-contact-php .tp-nav-mobile a,
.page-template-page-contact-php .tp-nav-mobile__toggle { color: var(--ink, #3D1B2E); }
.page-template-page-contact-php .tp-nav-mobile a:hover,
.page-template-page-contact-php .tp-nav-mobile__toggle:hover { color: var(--mid, #AF8B91); }
.page-template-page-contact-php .tp-nav-mobile__submenu a { color: rgba(61,27,34,0.72); }
.page-template-page-contact-php .tp-nav-mobile__submenu a:hover { color: var(--ink, #3D1B2E); }
.tp-terms-contact__grid { display: grid; grid-template-columns: 1fr 1fr; gap: 60px; align-items: start; }
.tp-terms-contact__info h2 { margin-bottom: 14px; }
.tp-terms-contact__lede { font-size: 15px; line-height: 1.6; color: #5A6478; max-width: 42ch; margin: 0 0 32px; }
.tp-terms-contact__block { margin-bottom: 26px; }
.tp-terms-contact__label { font-size: 18px; font-weight: 700; color: var(--ink, #3D1B2E); margin: 0 0 8px; }
.tp-terms-contact__value { display: block; font-size: 15px; color: #3F4759; text-decoration: none; }
.tp-terms-contact__value:hover { color: var(--ink, #3D1B2E); }
.tp-terms-contact__value--phone { margin-bottom: 4px; }

/* Contact Us page's left column — plain stacked office list (no card
   borders), replacing the generic single email/phone block used on
   the Terms page's embedded contact section. */
.tp-contact-offices { display: flex; flex-direction: column; gap: 26px; }
.tp-contact-office__region { font-family: 'Josefin Sans', sans-serif; font-size: 19px; font-weight: 700; color: var(--ink, #3D1B2E); margin: 0 0 6px; }
.tp-contact-office__address { font-size: 14px; line-height: 1.55; color: #5A6478; margin: 0 0 8px; max-width: 40ch; }
.tp-contact-office__value { display: block; font-size: 14px; color: #3F4759; text-decoration: none; }
.tp-contact-office__value:hover { color: var(--ink, #3D1B2E); }

.tp-terms-contact__panel { background: #FFFFFF; border-radius: 18px; padding: 34px; box-shadow: 0 20px 50px rgba(61,27,46,0.1); }
.tp-terms-contact__row { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-bottom: 18px; }
.tp-terms-contact__form input,
.tp-terms-contact__form textarea { width: 100%; box-sizing: border-box; border: none; border-bottom: 1px solid #E4E8EF; padding: 10px 2px; font-family: inherit; font-size: 15px; color: #141C2B; background: transparent; resize: vertical; }
.tp-terms-contact__form input::placeholder,
.tp-terms-contact__form textarea::placeholder { color: #9AA1AF; }
.tp-terms-contact__form input:focus,
.tp-terms-contact__form textarea:focus { outline: none; border-color: var(--p1, #FF8063); }
.tp-terms-contact__form textarea { margin-bottom: 26px; }
.tp-terms-contact__submit { display: block; width: 100%; text-align: center; font-size: 14px; font-weight: 700; letter-spacing: 0.04em; color: var(--ink, #3D1B2E); background: linear-gradient(90deg, var(--p1, #FF8063) 0%, var(--p2, #E5C5FA) 100%); padding: 16px 24px; border-radius: 999px; border: none; cursor: pointer; transition: opacity 200ms; }
.tp-terms-contact__submit:hover { opacity: 0.88; }
.tp-terms-contact__success { display: none; text-align: center; margin: 16px 0 0; font-size: 14px; font-weight: 600; color: var(--ink, #3D1B2E); }
.tp-terms-contact__success.is-visible { display: block; }
.tp-terms-contact__form.is-submitted .tp-terms-contact__row,
.tp-terms-contact__form.is-submitted textarea,
.tp-terms-contact__form.is-submitted .tp-terms-contact__submit { display: none; }

@media (max-width: 980px) {
  .tp-terms { padding: 56px 0 16px; }
  .tp-terms-contact { padding: 0 0 56px; }
  .tp-terms-contact__head { padding: 36px 0 28px; }
  .tp-terms-contact__grid { grid-template-columns: 1fr; gap: 40px; }
}

@media (max-width: 640px) {
  .tp-terms__heading { font-size: 19px; }
  .tp-terms-contact__row { grid-template-columns: 1fr; gap: 14px; }
  .tp-terms-contact__panel { padding: 24px; }
}

/* ===========================================================
   Certifications strip tucked under the intro text/CTA on the
   homepage's "Proof, in four figures" section
   (template-parts/home/proof-figures.php) — compact, sits in the left
   column beneath the button rather than as its own full-width section
   or in the footer. Real ISO seal badge images + the Automation
   Anywhere partner badge (all client-supplied).
   =========================================================== */
.tp-proof__certs { display: flex; flex-wrap: wrap; align-items: center; gap: 20px; margin-top: 32px; padding-top: 24px; border-top: 1px solid #E4E8EF; }
.tp-proof__certs-badges { display: flex; align-items: center; gap: 14px; }
.tp-proof__certs-badge { width: 54px; height: 54px; object-fit: contain; }

.tp-proof__certs-partner { display: flex; align-items: center; gap: 8px; }
.tp-proof__certs-partner-label { font-family: 'Inter', sans-serif; font-size: 10px; letter-spacing: 0.08em; text-transform: uppercase; color: #8A96A8; }
/* Same rotate-to-straighten fix used elsewhere for this badge — its
   source SVG is authored as a tall vertical card with the wordmark
   rotated to fit that orientation. Sized 50% larger than the initial
   pass to match the enlarged ISO badges. */
.tp-proof__certs-partner-logo-wrap { display: inline-flex; align-items: center; justify-content: center; width: 150px; height: 41px; overflow: hidden; }
.tp-proof__certs-partner-logo { width: 41px; height: 150px; object-fit: contain; transform: rotate(90deg); }

/* ===========================================================
   Split-text hero reveal (initSplitText() in main.js) — every hero
   headline splits into per-character spans that fade + rise in with a
   stagger once scrolled into view. Plain-CSS port of the react-bits
   SplitText component's `from`/`to`/duration/ease defaults.
   =========================================================== */
[data-split-text] { overflow: hidden; }
.tp-split-word { display: inline-block; white-space: nowrap; }
.tp-split-char { display: inline-block; opacity: 0; transform: translateY(40px); transition: opacity 1250ms cubic-bezier(0.215,0.61,0.355,1), transform 1250ms cubic-bezier(0.215,0.61,0.355,1); will-change: transform, opacity; }
[data-split-text].is-split-visible .tp-split-char { opacity: 1; transform: translateY(0); }

/* ===========================================================
   Blog Index page (page-blog-index.php) — search + single content-
   type filter toolbar, then one big horizontal card per article
   (image left, content right) instead of a multi-column grid.
   =========================================================== */
.tp-blog-index { background: #FFFFFF; padding: 70px 0 100px; }

.tp-blog-index__toolbar { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 20px; margin-bottom: 44px; padding-bottom: 24px; border-bottom: 1px solid #E4E8EF; }
.tp-blog-index__search { flex: 1 1 280px; max-width: 420px; display: flex; align-items: center; gap: 10px; border-bottom: 1.5px solid #E4E8EF; padding-bottom: 10px; color: #8A96A8; transition: border-color 180ms; }
.tp-blog-index__search:focus-within { border-color: var(--p1, #FF8063); color: var(--ink, #3D1B2E); }
.tp-blog-index__search svg { width: 18px; height: 18px; flex: 0 0 auto; }
.tp-blog-index__search input { flex: 1 1 auto; border: none; outline: none; font-family: inherit; font-size: 15px; color: #141C2B; background: transparent; }
.tp-blog-index__search input::placeholder { color: #9AA1AF; }

.tp-blog-index__filter { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.tp-blog-index__filter-label { font-family: 'Inter', sans-serif; font-size: 11px; letter-spacing: 0.1em; text-transform: uppercase; color: #8A96A8; white-space: nowrap; }
/* Custom dropdown (not a native <select>, not standalone chips) — a
   trigger button showing the current selection, opening a panel of
   options below it. Same open/close/outside-click/Escape mechanic as
   the site's own nav dropdowns (initDesktopDropdowns() in main.js;
   this one's handled inside initBlogIndexFilter() instead since it
   also needs to drive the filtering). */
.tp-blog-index__filter-dropdown { position: relative; }
.tp-blog-index__filter-trigger { display: inline-flex; align-items: center; gap: 10px; font-family: inherit; font-size: 14px; font-weight: 600; color: var(--ink, #3D1B2E); background: #F7F8F6; border: 1.5px solid #E4E8EF; border-radius: 999px; padding: 10px 18px; cursor: pointer; transition: border-color 180ms, background 180ms; }
.tp-blog-index__filter-trigger:hover { border-color: var(--soft, #F8CFD5); }
.tp-blog-index__filter-dropdown.is-open .tp-blog-index__filter-trigger { background: #FFFFFF; border-color: var(--ink, #3D1B2E); }
.tp-blog-index__filter-caret { width: 14px; height: 14px; flex: 0 0 auto; transition: transform 220ms cubic-bezier(0.2,0.8,0.2,1); }
.tp-blog-index__filter-dropdown.is-open .tp-blog-index__filter-caret { transform: rotate(180deg); }
.tp-blog-index__filter-panel { position: absolute; top: calc(100% + 8px); right: 0; z-index: 20; min-width: 220px; background: #FFFFFF; border: 1px solid #E4E8EF; border-radius: 14px; box-shadow: 0 20px 44px rgba(20,15,19,0.14); padding: 8px; display: flex; flex-direction: column; gap: 2px; opacity: 0; visibility: hidden; transform: translateY(-6px); transition: opacity 180ms cubic-bezier(0.2,0.8,0.2,1), transform 180ms cubic-bezier(0.2,0.8,0.2,1), visibility 180ms; }
.tp-blog-index__filter-dropdown.is-open .tp-blog-index__filter-panel { opacity: 1; visibility: visible; transform: translateY(0); }
.tp-blog-index__filter-option { display: block; width: 100%; text-align: left; font-family: inherit; font-size: 14.5px; font-weight: 500; color: #3A4250; background: none; border: none; border-radius: 8px; padding: 10px 14px; cursor: pointer; transition: background 150ms, color 150ms; }
.tp-blog-index__filter-option:hover { background: var(--wash-b, #FBE5E8); }
.tp-blog-index__filter-option.is-active { background: var(--ink, #3D1B2E); color: #FFFFFF; font-weight: 600; }
.tp-blog-index__filter-option.is-active:hover { background: var(--ink-deep, #2B1622); }

.tp-blog-index__list { display: flex; flex-direction: column; gap: 20px; }
.tp-blog-index__empty { text-align: center; padding: 60px 0; color: #8A96A8; font-size: 15px; }
/* paginate_links(['type' => 'list']) output — plain <ul class="page-numbers">,
   styled to match the pill-button language used everywhere else. */
ul.page-numbers { display: flex; align-items: center; justify-content: center; gap: 8px; list-style: none; margin: 48px 0 0; padding: 0; flex-wrap: wrap; }
ul.page-numbers li { display: inline-flex; }
ul.page-numbers .page-numbers { display: inline-flex; align-items: center; justify-content: center; min-width: 42px; height: 42px; padding: 0 14px; border-radius: 999px; border: 1px solid #E4E8EF; color: var(--ink, #3D1B2E); font-size: 14px; font-weight: 600; text-decoration: none; transition: background 180ms, border-color 180ms, color 180ms; }
ul.page-numbers a.page-numbers:hover { border-color: var(--mid, #AF8B91); background: var(--wash-a, #FADBE0); }
ul.page-numbers .page-numbers.current { background: var(--ink, #3D1B2E); border-color: var(--ink, #3D1B2E); color: #FFFFFF; }
ul.page-numbers .page-numbers.dots { border-color: transparent; }

.tp-blog-card { display: flex; gap: 32px; align-items: stretch; text-decoration: none; border: 1px solid #E4E8EF; border-radius: 18px; padding: 20px; transition: transform 260ms cubic-bezier(0.2,0.8,0.2,1), box-shadow 260ms, border-color 260ms; }
/* Without this, the filter/search JS setting card.hidden = true had no
   visible effect at all: .tp-blog-card's own "display: flex" (an
   author-stylesheet rule) silently overrides the browser's built-in
   "[hidden] { display: none }" default — author CSS always wins over
   the user-agent stylesheet on a specificity tie, regardless of the
   `hidden` attribute being set correctly in the DOM. This is the actual
   root cause of the filter/search looking broken. */
.tp-blog-card[hidden] { display: none; }
.tp-blog-card:hover { transform: translateY(-4px); box-shadow: 0 24px 48px rgba(61,27,46,0.12); border-color: var(--soft, #F8CFD5); }
/* Desktop/tablet (row layout): media stretches to match the content
   column's height (the parent's default align-items:stretch), image
   fills that box exactly via object-fit:cover. On mobile (≤640px,
   column layout below) that stretch no longer makes sense once the
   card stacks, so the media switches to a fixed aspect-ratio banner
   instead — see the override there. */
.tp-blog-card__media { flex: 0 0 320px; align-self: center; aspect-ratio: 3 / 2; border-radius: 12px; overflow: hidden; background: var(--wash-b, #FBE5E8); }
.tp-blog-card__media img { display: block; width: 100%; height: 100%; object-fit: cover; }
.tp-blog-card__media--placeholder { min-height: 180px; }
.tp-blog-card__body { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; justify-content: center; gap: 10px; padding: 8px 4px; }
.tp-blog-card__meta { display: flex; align-items: center; gap: 12px; }
.tp-blog-card__tag { font-size: 12px; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; color: var(--ink, #3D1B2E); background: var(--soft, #F8CFD5); border-radius: 999px; padding: 5px 12px; }
.tp-blog-card__read { font-family: 'Inter', sans-serif; font-size: 12px; color: #8A96A8; }
.tp-blog-card__title { font-family: 'Josefin Sans', sans-serif; font-size: 24px; font-weight: 600; line-height: 1.25; color: #141C2B; margin: 0; text-wrap: pretty; }
.tp-blog-card__excerpt { font-size: 15px; line-height: 1.6; color: #5A6478; margin: 0; max-width: 65ch; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; }
.tp-blog-card__more { font-size: 14px; font-weight: 600; color: var(--ink, #3D1B2E); }

@media (max-width: 980px) {
  .tp-blog-index { padding: 56px 0 70px; }
  .tp-blog-card { gap: 22px; }
  .tp-blog-card__media { flex-basis: 220px; }
  .tp-blog-card__title { font-size: 20px; }
}

@media (max-width: 640px) {
  .tp-blog-index__toolbar { flex-direction: column; align-items: stretch; gap: 16px; }
  .tp-blog-index__search { max-width: none; }
  .tp-blog-index__filter { width: 100%; align-items: flex-start; flex-direction: column; }
  .tp-blog-index__filter-dropdown, .tp-blog-index__filter-trigger { width: 100%; }
  .tp-blog-index__filter-trigger { justify-content: space-between; }
  .tp-blog-index__filter-panel { left: 0; right: 0; min-width: 0; }
  .tp-blog-card { flex-direction: column; padding: 16px; }
  /* Row-layout stretch (align-items:stretch on .tp-blog-card) no
     longer applies meaningfully once the card stacks into a column —
     media becomes a fixed-aspect banner across the full card width
     instead of an oddly-tall sliver. */
  .tp-blog-card__media { flex-basis: auto; align-self: auto; aspect-ratio: 3 / 2; }
  .tp-blog-card__media img { height: auto; aspect-ratio: 3 / 2; }
  .tp-blog-card__body { padding: 0; }
}

@media (max-width: 430px) {
  .tp-blog-index { padding: 44px 0 56px; }
  .tp-blog-index__toolbar { margin-bottom: 32px; padding-bottom: 18px; }
  .tp-blog-card { padding: 14px; gap: 14px; }
  .tp-blog-card__title { font-size: 18px; }
  .tp-blog-card__excerpt { font-size: 14px; }
  .tp-blog-card__tag { font-size: 11px; padding: 4px 10px; }
}

/* ===========================================================
   CASE STUDIES — page-case-studies.php is the index (deliberately a
   plain static-gradient hero like every other .tp-pagehero page, same
   as the Blog Index — the animated background below is reserved for
   the single case-study pages only, not the index).

   page-case-study-single.php (one page per study) uses this
   .tp-cs-hero treatment: <threads-bg> (assets/js/threads-bg.js), a
   self-contained WebGL port of the react-bits Threads component — no
   React/ogl runtime here — over a white hero, with the headline text
   filled in the same violet->coral gradient the thread color's anchor
   tone is drawn from (matches the Services H1/H2 gradient). */
.tp-cs-hero { background: #FFFFFF; }
.tp-cs-hero__waves { position: absolute; inset: 0; z-index: 0; }
.tp-cs-hero .tp-pagehero__inner { position: relative; z-index: 2; }
.tp-cs-hero .tp-pagehero__headline,
.tp-cs-hero .tp-pagehero__subhead {
  background: linear-gradient(90deg, #480E6F 0%, #8A47A9 35%, #C991DA 65%, #FC725D 100%);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  text-shadow: none;
}
.tp-cs-hero .tp-nav-mobile a, .tp-cs-hero .tp-nav-mobile__toggle { color: var(--ink, #3D1B2E); }
.tp-cs-hero .tp-nav-mobile a:hover, .tp-cs-hero .tp-nav-mobile__toggle:hover { color: var(--mid, #AF8B91); }
.tp-cs-hero .tp-nav-mobile__submenu a { color: rgba(61,27,34,0.72); }
.tp-cs-hero .tp-nav-mobile__submenu a:hover { color: var(--ink, #3D1B2E); }

/* Key-results stat tile, used inside .tp-case-single__results-grid
   below — the figure itself is animated via a data-count child span
   (see tp_case_stat_html() in inc/case-studies-content.php),
   initNumbersAnimation() in main.js counts it up once it scrolls into
   view instead of it sitting there static. */
.tp-case-card__stat { background: #FBE5E8; border-radius: 12px; padding: 16px 18px; font-size: 14px; line-height: 1.4; color: var(--ink, #3D1B2E); }
.tp-case-card__stat-figure { display: block; font-family: 'Josefin Sans', sans-serif; font-weight: 500; font-size: 22px; line-height: 1.15; margin-bottom: 4px; }

/* Case Studies index (page-case-studies.php) is deliberately NOT a
   bespoke grid — it reuses .tp-blog-index/.tp-blog-card (Blog Index)
   as-is, cards included, so the two index pages behave identically...
   except the hover: these cards carry the extra [data-hovercard]
   attribute (only on this page's cards, never on real Blog Index
   posts) so they pick up the Services section's flowing-gradient-wash
   hover instead of the Blog Index's lift+shadow — the base
   [data-hovercard]/[data-fill]/[data-cardtitle]/[data-cardbody] rules
   near the top of this file already do the fade-in/text-flip; this
   just cancels .tp-blog-card's own lift/shadow for these specific
   cards and positions/clips + reuses .tp-card__fill's existing
   gradient (var(--p1)/--p2/--p3), same as the homepage Services and
   Insights cards. */
.tp-blog-card[data-hovercard] { overflow: hidden; }
.tp-blog-card[data-hovercard]:hover { transform: none; box-shadow: none; }
.tp-blog-card[data-hovercard] .tp-card__fill { z-index: -1; }
.tp-blog-card[data-hovercard] [data-cardtitle] { transition: color 400ms cubic-bezier(0.2,0.8,0.2,1), font-weight 400ms; }

/* Single case-study page (page-case-study-single.php) — "deep dive"
   scale: reuses the blog post's own .tp-article-body/.tp-article__h2/
   .tp-article-toc/.tp-article-progress machinery directly (see
   single.php) rather than inventing a separate reading layout, so the
   sticky scroll-spy "chapters" behave exactly like the Insights
   reading experience. Only the share rail is dropped (2-col content+
   toc instead of the blog's 3-col share+content+toc), and the content
   itself stays a single vertical column throughout — no left/right
   split. */
.tp-case-single__back { display: inline-block; margin-bottom: 4px; font-size: 14px; font-weight: 600; color: var(--ink, #3D1B2E); opacity: 0.75; text-decoration: none; }
.tp-case-single__back:hover { opacity: 1; }

/* Facts row — "Client Domain / Hiring Manager / Project Nature /
   Timeline" as actual pill-shaped tags (wrapping inline-flex row),
   not the boxed label/value tiles this used to be. Sits inside the
   normal content container with real margin above (gap from the
   cover image) and below (gap before the article body). */
.tp-case-single__facts { display: flex; flex-wrap: wrap; gap: 10px 12px; margin: 36px 0 8px; }
.tp-case-single__fact { display: inline-flex; align-items: center; gap: 6px; background: var(--soft, #F8CFD5); color: var(--ink, #3D1B2E); border-radius: 999px; padding: 9px 18px; font-size: 13.5px; line-height: 1.3; }
.tp-case-single__fact-label { font-family: 'Inter', sans-serif; font-size: 10.5px; letter-spacing: 0.08em; text-transform: uppercase; color: #93757A; }
.tp-case-single__fact-label::after { content: ':'; margin-right: 6px; }

/* Reuses .tp-article-body's grid (80px share-rail / 720px content /
   260px toc) but drops the share rail — 2 columns instead of 3. */
.tp-case-single__article-body { grid-template-columns: minmax(0, 760px) 260px; }
.tp-case-single__article-body .tp-article-content > p { font-size: 18px; line-height: 1.75; color: #2A3442; }
.tp-case-single__results-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; margin-top: 4px; }
.tp-case-single__results-grid .tp-case-card__stat { padding: 22px; font-size: 15px; }
.tp-case-single__results-grid .tp-case-card__stat-figure { font-size: 30px; }

.tp-case-single__approach-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 24px; margin-top: 12px; }
/* Same hover-invert treatment as the Services page's "Where it breaks"
   problem cards (.tp-problem-card) — dark-background flip, lift+
   shadow, accent-colored number, white heading/body, and an animated
   accent bar sliding in along the bottom edge. */
.tp-case-single__step { position: relative; overflow: hidden; display: flex; flex-direction: column; gap: 10px; padding: 26px; border: 1px solid #E4E8EF; border-radius: 14px; background: #FFFFFF; transition: background 340ms cubic-bezier(0.2,0.8,0.2,1), transform 340ms cubic-bezier(0.2,0.8,0.2,1), box-shadow 340ms, border-color 340ms; }
.tp-case-single__step::after { content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 3px; background: linear-gradient(90deg, var(--p1), var(--p2)); transform: scaleX(0); transform-origin: left; transition: transform 780ms cubic-bezier(0.33,1,0.68,1); }
.tp-case-single__step:hover { background: var(--ink-deep, #2B1622); border-color: transparent; transform: translateY(-6px); box-shadow: 0 24px 48px rgba(43,22,34,0.28); }
.tp-case-single__step:hover::after { transform: scaleX(1); }
.tp-case-single__step-num { font-family: 'Inter', sans-serif; font-size: 14px; font-weight: 700; color: var(--mid, #AF8B91); transition: color 340ms; }
.tp-case-single__step:hover .tp-case-single__step-num { color: var(--p1, #FF8063); }
.tp-case-single__step-title { font-family: 'Josefin Sans', sans-serif; font-weight: 500; font-size: 20px; color: #141C2B; transition: color 340ms; }
.tp-case-single__step:hover .tp-case-single__step-title { color: #FFFFFF; }
.tp-case-single__step-body { font-size: 15.5px; line-height: 1.65; color: #5A6478; margin: 0; transition: color 340ms; }
.tp-case-single__step:hover .tp-case-single__step-body { color: rgba(255,255,255,0.78); }

.tp-case-single__quote { position: relative; margin: 12px 0 0; padding: 36px 40px; background: #FBE5E8; border-radius: 16px; border-left: 4px solid var(--ink, #3D1B2E); }
.tp-case-single__quote p { font-family: 'Josefin Sans', sans-serif; font-weight: 500; font-size: clamp(20px, 2.2vw, 25px); line-height: 1.45; color: var(--ink, #3D1B2E); margin: 0; }
.tp-case-single__quote cite { display: block; margin-top: 16px; font-family: 'Inter', sans-serif; font-style: normal; font-size: 13px; letter-spacing: 0.06em; text-transform: uppercase; color: #93757A; }

/* Aggregate figures — same dark-ink treatment as the Engagement Model
   band (.tp-engagement) so it reads as a distinct "proof" pause
   between the 12 individual cards and the closing CTA. */
/* Deliberately --ink here, not --ink-deep — the pre-footer CTA
   (.tp-svc-cta) starts its own gradient at --ink-deep, so matching it
   here made the seam between the two sections invisible (just one
   long flat dark block). --ink is a visibly lighter plum, giving this
   section its own distinct tone instead of bleeding into the CTA. */
/* Redesigned from a full-bleed dark-ink band (which also visually
   merged with the pre-footer CTA's own dark gradient right below it)
   into a light, bordered-card treatment — matches the rest of this
   page (white hero, white blog-card grid) instead of being the one
   dark interruption in an otherwise light page. */
/* White background (was a pink wash), purple text throughout — matches
   the violet anchor of the Services H1/H2 gradient (#480E6F) used
   elsewhere on the case-study pages, instead of the site's default
   dark-ink text color. */
.tp-case-excellence { position: relative; overflow: hidden; background: #FFFFFF; padding: clamp(56px, 6vw, 96px) 0; }
.tp-case-excellence__head { max-width: 640px; margin: 0 auto 40px; text-align: center; display: flex; flex-direction: column; align-items: center; gap: 14px; }
.tp-case-excellence__head .tp-eyebrow { color: #8A47A9; }
.tp-case-excellence__head .tp-h2 { color: #480E6F; }
.tp-case-excellence__intro { font-size: 16px; line-height: 1.6; color: #6B5B75; margin: 0; }
.tp-case-excellence__stats { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; max-width: 900px; margin: 0 auto; }
.tp-case-excellence__stat { background: #FFFFFF; border: 1px solid #E8DCEF; border-radius: 14px; padding: 22px; font-size: 14.5px; line-height: 1.4; color: #6B5B75; box-shadow: 0 10px 28px rgba(72,14,111,0.06); transition: transform 220ms cubic-bezier(0.2,0.8,0.2,1), box-shadow 220ms; }
.tp-case-excellence__stat:hover { transform: translateY(-3px); box-shadow: 0 20px 40px rgba(72,14,111,0.12); }
.tp-case-excellence__stat .tp-case-card__stat-figure { color: #480E6F; }
.tp-case-excellence__capabilities { display: flex; flex-wrap: wrap; justify-content: center; gap: 12px; max-width: 900px; margin: 28px auto 0; }
.tp-case-excellence__capability { font-family: 'Inter', sans-serif; font-size: 12.5px; letter-spacing: 0.04em; color: #480E6F; background: #FFFFFF; border: 1px solid #E8DCEF; border-radius: 999px; padding: 10px 18px; }

@media (max-width: 980px) {
  .tp-case-card__stats-grid { grid-template-columns: repeat(2, 1fr); }
  .tp-case-excellence__stats { grid-template-columns: repeat(2, 1fr); }
  /* Same collapse-to-1-column the base .tp-article-body rule already
     applies at this breakpoint (also hiding .tp-article-toc) — needs
     restating here since this selector was declared later in the
     file and would otherwise win the cascade tie at this width. */
  .tp-case-single__article-body { grid-template-columns: 1fr; }
}
@media (max-width: 780px) {
  .tp-case-single__approach-grid { grid-template-columns: 1fr; }
  .tp-case-single__results-grid { grid-template-columns: 1fr; }
}
@media (max-width: 640px) {
  .tp-case-card__meta { gap: 8px 20px; }
  .tp-case-card__stats-grid { grid-template-columns: 1fr; }
  .tp-case-excellence__stats { grid-template-columns: 1fr; }
  .tp-case-excellence__capability { text-align: center; }
  .tp-case-single__quote { padding: 24px; }
  .tp-case-single__facts { gap: 8px 10px; }
  .tp-case-single__fact { padding: 8px 14px; font-size: 12.5px; }
}

/* Sitewide "back to top" widget (footer.php) — a small circular button,
   bottom-right, shown once the visitor has scrolled down from the hero
   on ANY template (initBackToTop() in main.js toggles .is-visible).
   Fixed positioning + its own stacking context keeps it above every
   page's content regardless of template. */
.tp-back-to-top { position: fixed; right: 24px; bottom: 24px; z-index: 200; width: 48px; height: 48px; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: var(--ink, #3D1B2E); color: #FFFFFF; border: none; cursor: pointer; box-shadow: 0 14px 30px rgba(61,27,46,0.32); opacity: 0; transform: translateY(12px) scale(0.9); pointer-events: none; transition: opacity 240ms cubic-bezier(0.2,0.8,0.2,1), transform 240ms cubic-bezier(0.2,0.8,0.2,1), background 200ms; }
.tp-back-to-top svg { width: 20px; height: 20px; }
.tp-back-to-top.is-visible { opacity: 1; transform: translateY(0) scale(1); pointer-events: auto; }
.tp-back-to-top:hover { background: var(--ink-deep, #2B1622); }
@media (max-width: 640px) {
  .tp-back-to-top { right: 16px; bottom: 16px; width: 44px; height: 44px; }
  .tp-back-to-top svg { width: 18px; height: 18px; }
}
