/* ---- 1. Typography: clamp illegal weights & unify ProstoOne leak ---- */
.tdt-logo__word{ font-weight:var(--fw-bold)!important; }
.tdt-logo b{ font-weight:var(--fw-bold)!important; }
.tdt-tag--deal,.tdt-tag--sponsored,.tdt-tag--inhouse{ font-weight:var(--fw-bold)!important; }
.tdt-partner-card__logo.no-logo::after{ font-weight:var(--fw-bold)!important; }
.tdt-filter-group__label{ font-weight:var(--fw-semi)!important; color:var(--faint)!important; }
.tdt-disc-card__mono{ font-weight:var(--fw-bold)!important; }
.hostinger-ai-page-title,.single-post .wp-block-post-content h2,.tdt-archive-head h1,
.tdt-llm-ranking__head h2,.tdt-oss-stat__n{ font-weight:var(--fw-bold)!important; }
.tdt-prose h3,.single-post .wp-block-post-content h3,.tdt-prose th,
.single-post .wp-block-post-content th,.tdt-empty__title,
.tdt-swap__label,.tdt-swap__from a,.tdt-swap__alts a,.tdt-faq-trigger,
.tdt-form-group label,.tdt-form-submit,.single-post .wp-block-post-content strong,
.tdt-tool__facts span{ font-weight:var(--fw-semi)!important; }

/* Override global WP preset that still injects Catamaran/ProstoOne via inline CSS.
   body[class] already remaps --e-global-* but pure .wp-block-* contexts still
   fell through to the preset. This pins them to the token stack. */
body,.wp-block-post-content,.wp-block-post-excerpt,.entry-content{
  font-family:var(--font-sans)!important;
}
h1,h2,h3,h4,h5,h6,
.wp-block-heading,.wp-block-post-title,.tdt-archive-head h1,
.tdt-tool__title,.tdt-newsletter h2{
  font-family:var(--font-display)!important;
  letter-spacing:var(--ls-heading)!important;
}

/* ---- 2. Cards: single radius / shadow / gap language ---- */
.tdt-card{ border-radius:14px!important; box-shadow:0 1px 2px rgba(23,23,23,.04)!important; }
.tdt-card:hover{ border-color:var(--line-hover)!important; box-shadow:var(--shadow-lg)!important; }
.tdt-card__cover{ background:var(--wash)!important; }
.tdt-card--placeholder .tdt-card__cover{ background:var(--wash)!important; }
.tdt-partner-card__banner{ background:var(--wash)!important; background-image:linear-gradient(135deg, hsl(var(--tint,220) 72% 94%) 0%, hsl(calc(var(--tint,220) + 38) 66% 88%) 100%)!important; }
.tdt-deal-card{ border-radius:14px!important; }
.tdt-deal-card:hover{ border-color:var(--line-hover)!important; }
.tdt-deal-card__banner{ height:116px!important; }
.tdt-partner-card__logo{ width:56px!important; height:56px!important; border-radius:13px!important; }

/* ---- 3. Grids: one gap, one breakpoint system ---- */
.tdt-grid{ gap:16px!important; }
.tdt-grid.tdt-deal-grid{ gap:16px!important; }
.tdt-disc-grid{ gap:16px!important; }
.wp-block-post-template{ gap:16px!important; }
body.blog .wp-block-post-template,
body.archive .wp-block-post-template,
body.search .wp-block-post-template{ gap:16px!important; }
/* Polish had pushed .tdt-grid to auto-fill 260px; cohere with system 248px base */
.tdt-grid{ grid-template-columns:repeat(auto-fill,minmax(248px,1fr))!important; }
.tdt-grid.tdt-deal-grid{ grid-template-columns:repeat(auto-fill,minmax(280px,1fr))!important; }

/* ---- 4. Tags: tokenized backgrounds that survive dark mode ---- */
.tdt-tag--freemium{ background:var(--inhouse-bg)!important; color:var(--accent)!important; }
.tdt-tag--paid,.tdt-tag--onetime{ background:var(--wash)!important; color:var(--sub)!important; }
.tdt-tag--tax{ background:var(--wash)!important; color:var(--ink-2)!important; }
.tdt-tag--tax:hover{ background:var(--solid)!important; color:var(--solid-ink)!important; }
.tdt-code-chip--link{ background:var(--accent)!important; color:var(--accent-ink)!important; }

/* ---- 5. Buttons: single pill hierarchy (999px) ---- */
.tdt-btn,.tdt-cta{ border-radius:999px!important; }
.tdt-see-all{ border-radius:999px!important; font-weight:var(--fw-semi)!important; }
.tdt-load-more{ border-radius:999px!important; font-weight:var(--fw-semi)!important; }
.tdt-btn:hover{ box-shadow:0 4px 14px rgba(36,84,255,.28)!important; }
.tdt-see-all:hover{ box-shadow:0 4px 12px rgba(36,84,255,.25)!important; }

/* ---- 6. Borders: replace literals with tokens ---- */
.tdt-card:hover,.tdt-card__cover,.tdt-empty,.tdt-swap__row:hover,.tdt-adv-card:hover{
  border-color:var(--line-hover)!important;
}
.tdt-card__arrow{ border-color:var(--line)!important; }

/* ---- 7. Container widths: blog/single hug --max with measure only on prose ---- */
.blog main .wp-block-query,
.archive main .wp-block-query,
.search main .wp-block-query,
.blog main h1{ max-width:var(--max)!important; padding-left:var(--gutter)!important; padding-right:var(--gutter)!important; }
.single-post .wp-block-post-content,
.single-post .entry-content{ max-width:68ch!important; }
:root{ --wp--style--global--content-size:820px; }

/* ---- 8. Section rhythm: remove double gap before first heading ---- */
.elementor-widget-tdt_section_heading:first-child{ margin-top:0!important; }
.tdt-section-head{ margin-bottom:20px!important; }
.tdt-section-head::after{ opacity:.6; }
.tdt-section-head h2{ font-size:var(--fs-xl)!important; }

/* ---- 9. Header pill + nav: unify glass vs solid ---- */
.tdt-header-inner{ gap:16px!important; }

/* ---- 10. Newsletter: shared radius, no hover lift incoherence ---- */
.tdt-newsletter{ border-radius:14px!important; }

/* ---- 11. Dark-mode fixes for remaining literals ---- */
:root[data-theme="dark"] .tdt-card{ border-color:rgba(255,255,255,.10)!important; }
:root[data-theme="dark"] .tdt-tag--freemium{ background:rgba(125,155,255,.16)!important; color:var(--accent)!important; }
:root[data-theme="dark"] .tdt-tag--paid,
:root[data-theme="dark"] .tdt-tag--onetime,
:root[data-theme="dark"] .tdt-tag--tax{ background:rgba(255,255,255,.07)!important; color:var(--ink-2)!important; }
:root[data-theme="dark"] .tdt-newsletter__form button{ background:var(--accent)!important; color:var(--accent-ink)!important; }
:root[data-theme="dark"] .tdt-empty{ background:rgba(255,255,255,.04)!important; border-color:rgba(255,255,255,.10)!important; }

/* ---- 12. Focus ring floor already 0 spec via :where; ensure token contrast ---- */
:where(a,button,input,select,textarea):focus-visible{
  outline:2px solid var(--accent)!important; outline-offset:2px!important;
}

/* ---- 13. Empty / placeholder: visible sponsored surface, not wash-on-wash ----
   Wash (#FAFAFB) with a hairline (#E6E6E6, 1.25:1) made open-slot cards blend
   into the page — reported as "Your product here / 6/6 spots left not visible".
   Sponsored tint + solid sponsored boundary reads as an offer in both themes
   while keeping the dashed "open" signal. */
.tdt-card.tdt-card--placeholder{ background:var(--sponsored-bg)!important; border:1.5px dashed var(--sponsored)!important; }
.tdt-card--placeholder .tdt-card__cover{ background:var(--sponsored-bg)!important; background-image:none!important; }
.tdt-card__logo--dash{ color:var(--sponsored)!important; border:1.5px dashed var(--sponsored); background:var(--paper); }
.tdt-deal-card.tdt-deal-card--placeholder{ background:var(--sponsored-bg)!important; border:1.5px dashed var(--sponsored)!important; }
.tdt-deal-card__banner--dash{ color:var(--sponsored)!important; }
.tdt-code-chip--soon{ background:var(--paper)!important; color:var(--ink-2)!important; border:1px solid var(--control-line); }
.tdt-deals-empty{ background:var(--wash)!important; border:1px dashed var(--control-line)!important; color:var(--ink-2)!important; }

/* ---- 14. Footer head contrast: bereits 4.83 but ensure token ---- */
.tdt-footer-col h3{ color:var(--footer-head)!important; }

/* ---- 15. Prose link underline already tokenized — enforce none on cards ---- */
.tdt-card a,.tdt-disc-card,.tdt-cat-tile{ text-decoration:none!important; }

/* ---- 16. Buttons: every button is a pill (999px), one hierarchy ----
   Audit Sep 2026: .tdt-btn/.tdt-cta were pill, but newsletter submit was 8px
   rect, sponsor CTA was 8px rect, Elementor + Gutenberg buttons kept theme
   radii (28px / square), and polish had squared tags to 6px. One radius now
   governs every control so the page reads as one system. Placed last so it
   wins over polish + theme + kit. */
.elementor-button,.wp-block-button__link,.wp-element-button,
.tdt-btn,.tdt-cta,.tdt-form-submit,.tdt-newsletter__form button,
.tdt-sponsor-cta__btn,.tdt-board__cta,.tdt-slots-panel__cta,
.tdt-code-chip--link,.tdt-see-all,.tdt-load-more,
.tdt-share__btn,.tdt-search-form__go,.tdt-consent__accept,.tdt-consent__decline,
.tdt-empty__reset,.tdt-adv a.tdt-adv-btn,.tdt-filters-toggle{ border-radius:999px!important; }
.tdt-tag{ border-radius:999px!important; }
.elementor-widget-button .elementor-button{ border-radius:999px!important; min-height:44px; }
/* Elementor kit + Gutenberg defaults have no guaranteed pairing — pin them to
   the fixed CTA token (dark blue #1E40AF + white, ~8.7:1) which never flips
   with the theme, unlike --accent. */
.elementor-button,.wp-block-button__link,.wp-element-button{
  background:var(--cta)!important; color:var(--cta-ink)!important;
  border:1px solid var(--cta)!important; font-weight:650!important;
}
/* Newsletter submit was accent/accent-ink rect — pill + fixed pairing so it
   stays AAA in light AND dark (accent flips, cta does not). */
.tdt-newsletter__form button{
  background:var(--cta)!important; color:var(--cta-ink)!important;
  border:1px solid var(--cta)!important; padding:10px 22px!important;
  font-weight:650!important; min-height:44px;
}
:root[data-theme="dark"] .tdt-newsletter__form button{ background:var(--cta)!important; color:var(--cta-ink)!important; border-color:var(--cta)!important; }
/* Sponsor CTA was paper/ink rect with hairline — pill + solid surface so the
   action reads as primary next to the board. Solid/ink is 17:1 light, ~13:1 dark. */
.tdt-sponsor-cta__btn{
  background:var(--solid)!important; color:var(--solid-ink)!important;
  border:1px solid var(--solid)!important; min-height:44px; font-weight:650!important;
}
/* Deal link chip had hardcoded #fff text — token pairing + pill. */
.tdt-code-chip--link{
  background:var(--cta)!important; color:var(--cta-ink)!important;
  border-radius:999px!important; padding:8px 14px!important;
  display:inline-block; font-weight:700;
}
/* Ghost + secondary buttons keep paper ground but need a 3:1+ boundary:
   control-line (3.42:1 light / 3.72:1 dark) qualifies, hairline does not. */
.tdt-btn--ghost,.tdt-see-all,.tdt-load-more,.tdt-empty__reset{
  border-color:var(--control-line)!important;
}
/* Sponsor open-slot surfaces (rails / strip / board) are owned by snippet 378,
   but this file prints later (99/102 vs 30) so restate the AA pairing here as
   the backstop: ink text on sponsored tint, never sponsored-on-tint or
   transparent-on-canvas. */
.tdt-slot--open{ background:var(--sponsored-bg)!important; border:1.5px dashed var(--sponsored)!important; }
.tdt-slot--open .tdt-slot__name{ color:var(--ink)!important; }
.tdt-slot--open .tdt-slot__tag{ color:var(--ink-2)!important; }
.tdt-strip--offer{ background:var(--sponsored-bg)!important; border-bottom:1px solid var(--sponsored)!important; }
.tdt-strip .tdt-banner{ color:var(--ink)!important; }
.tdt-banner__main{ color:var(--ink)!important; }
.tdt-banner__meta{ color:var(--ink-2)!important; }
.tdt-board__cell--free{ background:var(--sponsored-bg)!important; border:1.5px dashed var(--sponsored)!important; }