/* ==========================================================================
   T-Blocks — Brand layer over Elementor. See BRAND.md.
   Load order: elementor kit → tblocks-overrides.css → tokens.css → this file.

   This maps the Elementor global kit onto the brand tokens, so the exported
   WordPress site and the product consoles resolve to one system. It also
   supplies the things the export never had: a letter-spacing / line-height
   system, hover and focus states, and an accessible accent.
   (Supersedes tblocks-polish.css — its five fixes are folded in below.)
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. Elementor global kit → brand tokens
   -------------------------------------------------------------------------- */
:root,
.elementor-kit-15 {
  --e-global-color-primary:   var(--navy-800);
  --e-global-color-0e138ab:   var(--navy-700);
  /* These two stay literal #000000. They fill the footer and the interior page
     heroes, and tblocks.io renders them as true black — remapping them to
     navy-900 visibly changed the footer, so fidelity wins over tidiness here. */
  --e-global-color-c2643f2:   #000000;
  --e-global-color-926fafe:   #000000;

  /* The accent's job depends on the ground. These are the LIGHT-ground values;
     §3b re-declares both inside dark sections. On white, #67BBD6 is 2.18:1 and
     fails AA, so the token resolves to sky-700 (4.86:1). */
  --e-global-color-accent:    var(--sky-700);
  --e-global-color-de3b834:   var(--sky-400);
  --e-global-color-6c12082:   var(--sky-500);

  /* #818181 body text is 3.89:1 on white — also below AA. */
  --e-global-color-text:      var(--n-700);
  --e-global-color-cb32880:   var(--n-300);

  --e-global-color-f02c9a1:   var(--n-0);
  --e-global-color-a68f361:   var(--n-0);
  --e-global-color-secondary: transparent;
}

/* --------------------------------------------------------------------------
   2. Typography — the export had 10 line-height and 0 letter-spacing rules
   -------------------------------------------------------------------------- */
/* Rendering only. The line-height and letter-spacing system that used to live
   here was applied to every Elementor heading and changed the site's vertical
   rhythm — the hero went 80/80 to 80/88 with -1.6px tracking and the homepage
   grew 137px. Elementor's own values are the reference; leave them alone. */
body {
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

/* Sora shipped on 41 blog posts as an undeclared second family. One face. */
.elementor-widget-theme-post-content,
.elementor-widget-theme-post-title,
.elementor-widget-theme-post-excerpt,
[style*="Sora"] { font-family: var(--sans) !important; }

/* The signature ALL-CAPS micro-eyebrow. */
.tb-eyebrow {
  font-family: var(--mono);
  font-size: var(--fs-micro);
  font-weight: var(--fw-bold);
  letter-spacing: var(--ls-eyebrow);
  text-transform: uppercase;
}

/* --------------------------------------------------------------------------
   3. Accent on dark — where sky-400 belongs (7.55:1 on navy)
   -------------------------------------------------------------------------- */
.tb-on-dark a,
.tb-on-dark .elementor-heading-title { color: var(--sky-400); }
.tb-on-dark a:hover { color: var(--sky-300); }

/* --------------------------------------------------------------------------
   3b. Ground-scoped tokens — the core accessibility fix
   Elementor uses one --e-global-color-text and one --e-global-color-accent on
   BOTH light and dark sections. No single value can pass WCAG AA on white and
   on navy at once (it would need relative luminance <=0.183 and >=0.217), so
   the tokens are re-declared inside the dark sections and cascade down.
   These 46 selectors are every container whose background resolves to a brand
   dark. Regenerate if sections are added.
   -------------------------------------------------------------------------- */
.elementor-element-ac43bee,
.elementor-element-030df37,
.elementor-element-877625b,
.elementor-element-541552c,
.elementor-element-525932e,
.elementor-element-d3e48c8,
.elementor-element-99c5db5,
.elementor-element-bcac920,
.elementor-element-dfaae60,
.elementor-element-4d7237b,
.elementor-element-09b93f7,
.elementor-element-259f314,
.elementor-element-f792ab9,
.elementor-element-d2933ac,
.elementor-element-6740983,
.elementor-element-4c6e633,
.elementor-element-82f146f,
.elementor-element-25b4304,
.elementor-element-80a61c9,
.elementor-element-8e135e0,
.elementor-element-c89af0c,
.elementor-element-0ba3141,
.elementor-element-4be06c3,
.elementor-element-8b7a06c,
.elementor-element-06d65f8,
.elementor-element-89a9702,
.elementor-element-adceb85,
.elementor-element-9f94a50,
.elementor-element-bd7b30d,
.elementor-element-dd0fae5,
.elementor-element-07df6a2,
.elementor-element-5dc15a6,
.elementor-element-004955a,
.elementor-element-bcf58fd,
.elementor-element-02660a0,
.elementor-element-b800381,
.elementor-element-7a6ef39,
.elementor-element-d31bf73,
.elementor-element-438d33e,
.elementor-element-d2309dd,
.elementor-element-c08077b,
.elementor-element-807cc94,
.elementor-element-9c81aa2,
.elementor-element-8461436,
.elementor-element-68a166f6,
.elementor-element-4e48b11 {
  --e-global-color-text: var(--n-200);
  --e-global-color-accent: var(--sky-400);
}

/* --------------------------------------------------------------------------
   4. Buttons — one geometry, and the hover states the export never had
      (exactly one button in the whole export had a hover state)
   -------------------------------------------------------------------------- */
/* Interaction only — geometry, family and weight stay as Elementor set them. */
.elementor-button,
button[type="submit"],
.elementor-field-type-submit button {
  transition: background-color var(--dur) var(--ease),
              color var(--dur) var(--ease),
              transform var(--dur-fast) var(--ease),
              box-shadow var(--dur) var(--ease);
}
.elementor-button:hover,
button[type="submit"]:hover {
  transform: translateY(-1px);
  box-shadow: var(--e-2);
}
.elementor-button:active,
button[type="submit"]:active {
  transform: translateY(0);
  box-shadow: var(--e-1);
}

/* The primary CTA fill and its hover, promoted from one-off to systematic. */
.elementor-button[class*="elementor-size-"]:not(.elementor-button-link):hover {
  background-color: var(--sky-600);
}

/* Labels on a sky fill must be navy, not white: white on sky-500 is 3.33:1 and
   fails AA at label size, navy is 5.34:1. This is already the site's own
   footer-Subscribe pattern (sky fill, navy text) — now applied consistently.
   !important is required: Elementor emits `.elementor-11 .elementor-element
   .elementor-element-xxx .elementor-button` (0,4,0), which outranks any
   selector we can write here without it. */
.elementor-element-6e1c8ac .elementor-button,
.elementor-element-7209f44 .elementor-button,
.elementor-element-b0c1756 .elementor-button,
.elementor-element-028a709 .elementor-button,
.elementor-element-a4f8087 .elementor-button,
.elementor-element-6e1c8ac .elementor-button-text,
.elementor-element-7209f44 .elementor-button-text,
.elementor-element-b0c1756 .elementor-button-text,
.elementor-element-028a709 .elementor-button-text,
.elementor-element-a4f8087 .elementor-button-text,
.elementor-element-c0030c8 .elementor-field-type-submit button {
  color: var(--navy-900) !important;
  fill: var(--navy-900) !important;
  font-weight: var(--fw-semibold);
}

/* Translucent navy body text (#00233380) composites to 3.27:1 on light.
   Solid n-600 is 5.51:1 and reads the same weight. */
.elementor-element-094945b,
.elementor-element-12c0e52,
.elementor-element-1596d0e,
.elementor-element-2d52b23,
.elementor-element-3a2ae9f,
.elementor-element-5cd8301 { color: var(--n-600) !important; }

/* Elementor Pro's animated headline defaults to #AEBCB9 — 1.96:1 on white.
   It is used once, in the dark hero on the homepage, so white reads best and
   keeps the rotating line consistent with the headline above it. */
.elementor-headline-dynamic-text { --dynamic-text-color: #fff; }

a { transition: color var(--dur) var(--ease), opacity var(--dur) var(--ease); }

/* --------------------------------------------------------------------------
   5. Radius — REMOVED, deliberately.
   This section used to normalise radii onto the token scale. On a hand-built
   UI that is right; over an Elementor export it is not, because the selectors
   are structural. `.e-con.e-child[class*="elementor-element"]` flattened the
   49px header pill to 8px, and `.elementor-widget-image img` put an 8px radius
   on every image including the logo. Elementor already carries a deliberate
   radius per element — do not restyle it globally.
   -------------------------------------------------------------------------- */

/* --------------------------------------------------------------------------
   6. Forms — focus affordance
   -------------------------------------------------------------------------- */
.elementor-field-textual {
  font-family: var(--sans);
  transition: border-color var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
}
.elementor-field-textual:focus {
  border-color: var(--sky-500) !important;
  box-shadow: var(--focus-ring);
  outline: none;
}
.elementor-field-textual::placeholder { color: var(--n-400); opacity: 1; }

/* --------------------------------------------------------------------------
   7. Focus rings — non-negotiable, every interactive element
   -------------------------------------------------------------------------- */
a:focus-visible,
button:focus-visible,
input:focus-visible,
textarea:focus-visible,
select:focus-visible,
[role="button"]:focus-visible {
  outline: 2px solid var(--sky-600);
  outline-offset: 2px;
}

/* --------------------------------------------------------------------------
   8. Motion — mandatory reduced-motion kill switch
   -------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
    scroll-behavior: auto !important;
  }
}

/* --------------------------------------------------------------------------
   9. Layout fixes carried over from the polish layer
   -------------------------------------------------------------------------- */
@media (min-width: 700px) and (max-width: 1180px) {
  [data-elementor-type="footer"] .e-con.e-child:has(#form_footer),
  [data-elementor-type="footer"] .e-con.e-child:has(.elementor-widget-social-icons) {
    max-width: 640px;
    width: 100%;
    margin-inline: auto;
  }
}
/* Carried over from the polish layer to stop the footer newsletter photo from
   jumping height while it loads. It was written for that photo but applied to
   every image in the footer, which cropped the T-Blocks wordmark: the logo is
   149x43 (3.5:1) and was being forced into 16/7 with object-fit:cover, so its
   sides were cut off. Raster images only — the logo is an SVG. */
[data-elementor-type="footer"] .elementor-widget-image img:not([src$=".svg"]) {
  aspect-ratio: 16 / 7;
  object-fit: cover;
  width: 100%;
}
/* The wordmark keeps its own proportions. Without this it inherits Elementor's
   img { width: auto } and collapses to 0x0 until the file loads. */
[data-elementor-type="footer"] .elementor-widget-image img[src$=".svg"] {
  aspect-ratio: auto;
  object-fit: contain;
  width: auto;
  max-width: 100%;
  height: auto;
}

/* Dead values from the kit. */
.e-page-transition { background-color: var(--navy-900); }

/* --------------------------------------------------------------------------
   10. Mobile overflow guards (UI sweep 2026-08-04)
   --------------------------------------------------------------------------
   The single-post meta row (calendar icon · date · reading time) runs 8px past
   a 375px viewport and gets cut by the global overflow-x clip. Let it wrap. */
@media (max-width: 480px) {
  .elementor-widget-post-info .elementor-icon-list-items.elementor-inline-items {
    flex-wrap: wrap;
    max-width: 100%;
  }
  .elementor-widget-post-info .elementor-icon-list-items.elementor-inline-items .elementor-icon-list-item {
    max-width: 100%;
  }
}

/* Hero sections are white text over a background video with no fallback — on a
   slow connection (or if the video CDN fails) the headline sits invisible on
   white until the video paints. Six pages use .hero-video-section. */
.hero-video-section { background-color: var(--navy-900); }

/* ==========================================================================
   Comfort scale + mobile pass
   A deliberate divergence from tblocks.io, approved after side-by-side review:
   the source design is fixed at a 1400px container with an 80px hero, which
   fills 93% of a MacBook viewport and reads as zoomed in.
   ========================================================================== */

/* The design is built at a fixed 1400px container with an 80px hero, so on a
   1512px MacBook it fills 93% of the viewport and reads as zoomed in. Scaling
   the page to 85% renders that container at ~1190px — roughly 79% of the
   screen — and shrinks type, spacing and imagery together, so proportions and
   Elementor's own breakpoints stay intact. Desktop only: phones and tablets
   are already sized correctly and must not shrink further. */
@media (min-width: 1025px) {
  /* Scoped to the site's own three top-level blocks, NOT <body>. Third-party
     widgets are injected as body children — the HubSpot chat iframe positions
     and sizes itself in real pixels, so scaling it broke its panel. */
  body > header.elementor-location-header,
  body > main,
  body > div.elementor-location-archive,   /* /blog/ and /blogs/ sit outside <main> */
  body > footer.elementor-location-footer { zoom: 0.85; }
}

/* --- Mobile pass ---------------------------------------------------------- */
@media (max-width: 1024px) {
  /* iOS zooms the page when focusing an input under 16px. */
  .elementor-field-textual,
  input[type="text"], input[type="email"], input[type="tel"], select, textarea {
    font-size: max(16px, 1rem);
  }

  /* Touch targets: 44px is the accessible minimum. */
  .elementor-menu-toggle {
    min-width: 44px;
    min-height: 44px;
  }
  .elementor-nav-menu--dropdown a.elementor-item {
    min-height: 44px;
    display: flex;
    align-items: center;
  }
  .elementor-button {
    min-height: 44px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
  }

  /* Long ISINs and URLs in prose should wrap rather than force a scrollbar. */
  .elementor-widget-text-editor,
  .elementor-widget-theme-post-content { overflow-wrap: anywhere; }
}

/* Horizontal overflow is already clipped in tblocks-overrides.css; repeating it
   here only risked a second source of truth for a rule that affects scrolling
   on the whole document. */

/* ==========================================================================
   Dealflow regulatory disclaimer (see assets/tblocks-disclaimer.js)
   Black ground with white text, matching the original popup. Type is Inter
   throughout — the page body inherits a system stack, so the modal sets its
   own family rather than picking that up.
   ========================================================================== */
.tb-disc-open, .tb-disc-open body { overflow: hidden; }

.tb-disc-ov {
  position: fixed;
  inset: 0;
  z-index: 100000;
  display: grid;
  place-items: center;
  padding: clamp(16px, 4vw, 40px);
  background: rgba(0, 0, 0, .82);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  font-family: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  animation: tb-disc-in 160ms ease both;
}
@keyframes tb-disc-in { from { opacity: 0 } to { opacity: 1 } }

.tb-disc:focus { outline: none; }
.tb-disc {
  position: relative;
  display: flex;
  flex-direction: column;
  width: 100%;
  max-width: 660px;
  max-height: min(82vh, 740px);
  background: #000;
  color: #fff;
  border: 1px solid rgba(255, 255, 255, .14);
  border-radius: 16px;
  box-shadow: 0 32px 90px rgba(0, 0, 0, .6);
  overflow: hidden;
  animation: tb-disc-rise 240ms cubic-bezier(.2,.6,.35,1) both;
}
@keyframes tb-disc-rise { from { opacity: 0; transform: translateY(10px) } to { opacity: 1; transform: none } }

/* The brand gradient, as a rule along the top edge. */
.tb-disc::before {
  content: "";
  position: absolute;
  inset: 0 0 auto 0;
  height: 3px;
  background: linear-gradient(90deg, #002B40, #67BBD6);
}

.tb-disc-hd { padding: 26px clamp(22px, 4vw, 34px) 16px; }
.tb-disc-logo {
  display: block;
  width: 132px;
  height: auto;
  margin-bottom: 18px;
}
.tb-disc-hd h2 {
  margin: 0;
  font-family: inherit;
  font-size: clamp(21px, 2.4vw, 27px);
  line-height: 1.2;
  font-weight: 600;
  letter-spacing: -0.01em;
  color: #fff;
}

.tb-disc-bd {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  overscroll-behavior: contain;
  padding: 4px clamp(22px, 4vw, 34px) 20px;
  font-family: inherit;
  font-size: 14.5px;
  line-height: 1.65;
  color: rgba(255, 255, 255, .80);
}
.tb-disc-bd p { margin: 0 0 12px; }
.tb-disc-bd p:empty { display: none; margin: 0; }
.tb-disc-bd strong, .tb-disc-bd b { color: #fff; font-weight: 600; }
.tb-disc-bd a { color: #67BBD6; }
.tb-disc-bd::-webkit-scrollbar { width: 10px; }
.tb-disc-bd::-webkit-scrollbar-thumb {
  background: rgba(255, 255, 255, .20);
  border-radius: 999px;
  border: 3px solid transparent;
  background-clip: content-box;
}

/* Only hint "more below" while there actually is more. */
.tb-disc.has-more .tb-disc-ft::before {
  content: "";
  position: absolute;
  left: 0; right: 0; top: -48px;
  height: 48px;
  pointer-events: none;
  background: linear-gradient(to bottom, rgba(0, 0, 0, 0), #000);
}

.tb-disc-ft {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 18px;
  flex-wrap: wrap;
  padding: 16px clamp(22px, 4vw, 34px) 22px;
  border-top: 1px solid rgba(255, 255, 255, .12);
  background: #000;
}
.tb-disc-note {
  margin: 0;
  flex: 1 1 220px;
  font-size: 12px;
  line-height: 1.45;
  color: rgba(255, 255, 255, .55);
}
.tb-disc .tb-disc-accept {
  flex: 0 0 auto;
  appearance: none;
  border: 1px solid #fff;
  cursor: pointer;
  padding: 12px 30px;
  border-radius: 50px;              /* the site's button radius */
  background: #000;
  color: #fff;
  font-family: inherit;
  font-size: 15px;
  font-weight: 500;
  transition: background-color 160ms ease, color 160ms ease, transform 120ms ease;
}
.tb-disc .tb-disc-accept:hover { background: #fff; color: #000; transform: translateY(-1px); }
.tb-disc .tb-disc-accept:active { transform: translateY(0); }
.tb-disc .tb-disc-accept:focus-visible { outline: 2px solid #fff; outline-offset: 3px; }

@media (max-width: 560px) {
  .tb-disc { max-height: 88vh; border-radius: 14px; }
  .tb-disc-logo { width: 112px; }
  .tb-disc-ft {
    flex-direction: column;
    align-items: stretch;
    gap: 10px;                 /* was 18px — the button drifted from its line */
    padding: 14px clamp(22px, 4vw, 34px) 18px;
  }
  .tb-disc-note { flex: 0 0 auto; }
  .tb-disc .tb-disc-accept { width: 100%; min-height: 48px; }
}
@media (prefers-reduced-motion: reduce) {
  .tb-disc-ov, .tb-disc { animation: none; }
}

/* ==========================================================================
   Interior hero clearance
   The header is a floating pill (absolute, 60px from the top, ~70px tall) that
   overlays the hero. On the interior pages the hero content is bottom-aligned
   inside a fixed-height box, so its eyebrow and gradient bar sat *under* the
   menu — a 14px overlap that is present on tblocks.io too, not something the
   brand layer introduced. Anchoring the content to the top with explicit
   clearance is deterministic; a margin was absorbed by the flex layout until it
   crossed a threshold, which would have needed tuning per page.
   The homepage is excluded: its hero is 100vh and already sits correctly.
   ========================================================================== */
body:not(.home) .hero-video-section > .e-con-inner,
.elementor-element-f792ab9 > .e-con-inner,      /* dealflow hero  */
.elementor-element-4538760 > .e-con-inner {     /* investors hero */
  justify-content: flex-start;
  padding-top: 165px;              /* header bottom ~110px + ~30px breathing */
}
@media (max-width: 1024px) {
  /* No page zoom below 1025px and the header sits flush, so it needs less. */
  body:not(.home) .hero-video-section > .e-con-inner,
  .elementor-element-f792ab9 > .e-con-inner,
  .elementor-element-4538760 > .e-con-inner { padding-top: 118px; }
}

/* Mobile menu items read black, not the sky accent. */
@media (max-width: 1024px) {
  .elementor-nav-menu--dropdown a.elementor-item,
  .elementor-nav-menu--dropdown .elementor-item {
    color: var(--navy-900, #001A27);
  }
  .elementor-nav-menu--dropdown a.elementor-item:hover,
  .elementor-nav-menu--dropdown a.elementor-item.elementor-item-active {
    color: #000;
  }
}

/* ==========================================================================
   Blog article clearance — THE single source of truth for .tb-art top padding
   --------------------------------------------------------------------------
   Articles use the tb-art shell rather than an Elementor hero, so they need the
   same header clearance every other non-home page gets, and it is set here so
   there is exactly one place to change it.

   The t-blocks-blog-writer skill also specifies a top padding (120px desktop /
   100px mobile) in each article's own <style> block. That number is a
   WordPress-era value and cannot be right here: this site scales its desktop
   chrome with `zoom: .85` (see "Comfort scale" above), so the skill's 120px
   lands at ~102 real pixels and tucks the category pill under the floating
   menu. Rather than keep two numbers in agreement, the article's own top
   padding is overridden on both breakpoints — and the CMS importer strips it
   out of pasted article CSS entirely, so it never reappears.

   The values are the site's header-clearance constants, the same pair used by
   the hero containers above: 165px desktop, 118px below the zoom breakpoint.
   Side and bottom padding stay with the article; only the top is owned here.

   !important is required: the article ships its <style> block in the page head,
   after this linked stylesheet, and would otherwise win on equal specificity.
   ========================================================================== */
@media (min-width: 1025px) {
  article.tb-art { padding-top: 165px !important; }
}
@media (max-width: 1024px) {
  /* No page zoom below 1025px and the header sits flush, so it needs less. */
  article.tb-art { padding-top: 118px !important; }
}

/* --------------------------------------------------------------------------
   Mobile menu: the selected item was navy-on-black and unreadable. A light sky
   wash with navy text reads clearly and stays on brand.
   -------------------------------------------------------------------------- */
@media (max-width: 1024px) {
  .elementor-nav-menu--dropdown a.elementor-item.elementor-item-active,
  .elementor-nav-menu--dropdown a.elementor-item.highlighted,
  .elementor-nav-menu--dropdown a.elementor-item:hover,
  .elementor-nav-menu--dropdown a.elementor-item:focus {
    background-color: rgba(103, 187, 214, .20) !important;
    color: var(--navy-900, #001A27) !important;
    font-weight: 600;
  }
}

/* --------------------------------------------------------------------------
   Disclaimer, small screens: keep the button next to its confirmation line, and
   get the chat launcher out of the way — it sits at z-index 2147483647 and was
   covering the button.
   -------------------------------------------------------------------------- */
.tb-disc-open #hubspot-messages-iframe-container { display: none !important; }

/* ==========================================================================
   Elementor popups on small screens
   The manifesto popup is authored for desktop: a 95vw x 93vh dialog with 80px
   padding on every side, holding a row of columns one of which is capped at
   70%. On a 414px phone that left the text rendering in a 153px column inside a
   393px dialog, with the page still scrolling behind it.
   ========================================================================== */
@media (max-width: 768px) {
  .elementor-popup-modal .dialog-message {
    width: 94vw !important;
    height: auto !important;
    max-height: 88vh !important;
    padding: 28px 20px 32px !important;
    overflow-y: auto !important;
    overscroll-behavior: contain;
  }
  /* Columns authored side by side have to stack, and stop being capped. */
  .elementor-popup-modal .e-con.e-flex { --flex-direction: column; }
  .elementor-popup-modal .e-con > .e-con-inner > .e-con,
  .elementor-popup-modal [class*="elementor-element"][style*="width"],
  .elementor-popup-modal .elementor-widget {
    --container-widget-width: 100% !important;
  }
  #elementor-popup-modal-305 .elementor-element-789bd6f {
    --flex-direction: column;
    flex-direction: column !important;
  }
  #elementor-popup-modal-305 .elementor-element-75344be {
    width: 100% !important;
    max-width: 100% !important;
    --container-widget-width: 100% !important;
  }
}

/* Keep the page still behind an open popup.
   Deliberately NOT `position: fixed` on <body>: offsetting the body by the
   scroll position moved the dialog off-screen on iOS Safari, where a fixed
   descendant can resolve against an offset ancestor — the manifesto popup
   simply never appeared on an iPhone. Hiding overflow is enough, and the
   scroll position is restored by assets/tblocks-site.js instead. */
html.tb-popup-open { overflow: hidden; scroll-behavior: auto; }
html.tb-popup-open body { overflow: hidden; }

/* ============================================================
   Responsive cleanup — tablet band + touch devices (2026-08-19)
   ============================================================ */

/* Partner-logo carousels (home + deploy). The Elementor export shipped no
   slides_to_show_tablet, so swiper showed ~2 slides at 768–1024px and
   upscaled ~150px logo PNGs 2.4× — oversized and grainy. The pages'
   data-settings now declare slides_to_show_tablet:4; this guard additionally
   pins every strip logo to wordmark scale no matter how wide the slide is. */
@media (max-width: 1024px) {
  .elementor-widget-image-carousel .swiper-slide-image {
    width: auto;
    max-height: 44px;
    object-fit: contain;
    margin-inline: auto;
  }
}
@media (max-width: 767px) {
  .elementor-widget-image-carousel .swiper-slide-image { max-height: 32px; }
}

/* The "direct path" step cards (home: 4, deploy: 3). At 768–1024px the
   desktop row wrapped into a ragged 2-1-1 with staggered offsets; force an
   even, centred two-column grid instead. */
@media (min-width: 768px) and (max-width: 1024px) {
  /* rows */
  .elementor-element-c6326b7,
  .elementor-element-e0e762a {
    flex-wrap: wrap !important;
    justify-content: center !important;
    row-gap: 20px;
  }
  /* per-card wrappers (home: 4, deploy: 3) */
  .elementor-element-4bd62bf, .elementor-element-5c7f016,
  .elementor-element-c1d1b08, .elementor-element-6616fa7,
  .elementor-element-5866024, .elementor-element-e5b6f1f,
  .elementor-element-c141549 {
    --width: calc(50% - 10px);
    width: calc(50% - 10px) !important;
    max-width: calc(50% - 10px) !important;
    flex: 0 0 calc(50% - 10px) !important;
    margin-top: 0 !important;
    margin-bottom: 0 !important;
  }
  /* the visual card fills its wrapper */
  .elementor-element-ad05dd4, .elementor-element-cc0ac3e,
  .elementor-element-030df37, .elementor-element-13fa173,
  .elementor-element-1c924b5, .elementor-element-a18fda9,
  .elementor-element-d868b5d {
    width: 100% !important;
    max-width: 100% !important;
  }

  /* Header: when the nav collapses, only the menu toggle remains in the
     middle slot and it floated centre; park it in the right corner beside
     the Dealflow button instead. */
  .elementor-element-bcac920 {
    margin-left: auto !important;
    margin-right: 8px;
  }
}

/* Touch devices cannot hover, and the export's tap-to-expand script is
   inert (it was pasted inside Elementor custom CSS, so it never executes) —
   card descriptions and buttons were unreachable on phones and tablets.
   Show them expanded wherever hover is unavailable. */
@media (hover: none) {
  .elementor-element-12c0e52, .elementor-element-4fefe8c,
  .elementor-element-3a2ae9f, .elementor-element-25e0136,
  .elementor-element-d5223ec, .elementor-element-e47db5d,
  .elementor-element-5cd8301, .elementor-element-51d234b,
  .elementor-element-094945b, .elementor-element-1596d0e,
  .elementor-element-2d52b23 {
    opacity: 1 !important;
    max-height: none !important;
    margin-top: 12px !important;
  }
}
