/* VBedits Store – Main Stylesheet
 * Dual-mode (dark default, light optional). Switch via <html data-theme="light">.
 * Brand palette: deep blue + vibrant orange.
 */

/* ── COLOR TOKENS ───────────────────────────────────────────── */
:root,
:root[data-theme="dark"] {
  --bg:           #0a0e1a;
  --bg2:          #101728;
  --bg3:          #1a2238;
  --bg-elevated:  #141d33;
  --border:       rgba(96,165,250,0.16);
  --border2:      rgba(96,165,250,0.36);
  --text:         #e8edf7;
  --text2:        #94a3b8;
  --text3:        #64748b;
  --brand:        #3b82f6;       /* royal blue */
  --brand2:       #60a5fa;       /* lighter blue, hover */
  --brand-deep:   #1e40af;       /* deep navy, for "edits" word in light mode */
  --accent:       #f97316;       /* vibrant orange */
  --accent2:      #fb923c;       /* lighter orange, hover */
  --accent-soft:  rgba(249,115,22,0.18);
  --brand-soft:   rgba(59,130,246,0.14);
  --green:        #10b981;
  --red:          #ef4444;
  --amber:        #f59e0b;
  --shadow:       0 10px 40px rgba(2,8,23,0.5), 0 0 30px rgba(59,130,246,0.06);
  --shadow-hover: 0 16px 50px rgba(2,8,23,0.6), 0 0 40px rgba(249,115,22,0.08);
  --hero-glow:    radial-gradient(ellipse, rgba(249,115,22,0.18) 0%, rgba(59,130,246,0.10) 40%, transparent 70%);
  --header-bg:    rgba(10,14,26,0.78);
  --radius:       12px;
  --radius-sm:    8px;
  --radius-lg:    20px;
  color-scheme: dark;
}

:root[data-theme="light"] {
  --bg:           #f7f9fc;       /* warm off-white */
  --bg2:          #ffffff;
  --bg3:          #eef2f7;       /* light gray */
  --bg-elevated:  #ffffff;
  --border:       rgba(15,23,42,0.10);
  --border2:      rgba(15,23,42,0.22);
  --text:         #0a0e1a;       /* user-picked: dark-mode bg as foreground tone */
  --text2:        #101728;
  --text3:        #1a2238;
  --brand:        #101728;       /* links + blue buttons — uses dark-mode bg2 */
  --brand2:       #1a2238;
  --brand-deep:   #0a0e1a;
  --accent:       #ea580c;       /* darker orange for contrast on white */
  --accent2:      #f97316;
  --accent-soft:  rgba(234,88,12,0.14);
  --brand-soft:   rgba(37,99,235,0.10);
  --green:        #059669;
  --red:          #dc2626;
  --amber:        #d97706;
  --shadow:       0 4px 24px rgba(15,23,42,0.06), 0 0 0 1px rgba(15,23,42,0.04);
  --shadow-hover: 0 10px 36px rgba(15,23,42,0.10);
  --hero-glow:    radial-gradient(ellipse, rgba(234,88,12,0.14) 0%, rgba(37,99,235,0.08) 40%, transparent 70%);
  --header-bg:    rgba(255,255,255,0.85);
  color-scheme: light;
}

@media (prefers-color-scheme: light) {
  :root:not([data-theme]) {
    --bg:           #f7f9fc;
    --bg2:          #ffffff;
    --bg3:          #eef2f7;
    --bg-elevated:  #ffffff;
    --border:       rgba(15,23,42,0.10);
    --border2:      rgba(15,23,42,0.22);
    --text:         #0a0e1a;
    --text2:        #101728;
    --text3:        #1a2238;
    --brand:        #101728;
    --brand2:       #1a2238;
    --brand-deep:   #0a0e1a;
    --accent:       #ea580c;
    --accent2:      #f97316;
    --accent-soft:  rgba(234,88,12,0.14);
    --brand-soft:   rgba(37,99,235,0.10);
    --green:        #059669;
    --red:          #dc2626;
    --amber:        #d97706;
    --shadow:       0 4px 24px rgba(15,23,42,0.06), 0 0 0 1px rgba(15,23,42,0.04);
    --shadow-hover: 0 10px 36px rgba(15,23,42,0.10);
    --hero-glow:    radial-gradient(ellipse, rgba(234,88,12,0.14) 0%, rgba(37,99,235,0.08) 40%, transparent 70%);
    --header-bg:    rgba(255,255,255,0.85);
    color-scheme: light;
  }
}

*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

html { scroll-behavior: smooth; }

/* ── FONT SIZE CUSTOM PROPERTIES (overridable from Admin → Apariencia) ─────
 * Each var has the design default as its initial value. The admin can
 * override any of them from /admin/settings.php?tab=appearance — the
 * chosen pixel value is emitted as an inline <style> block in
 * includes/partials/site_header.php, which trumps these defaults.
 */
:root {
  --font-body:                16px;
  --font-hero-title:          clamp(48px, 7vw, 88px);  /* "VBedits" big mark */
  --font-hero-tagline:        22px;
  --font-hero-sub:            16px;
  --font-section-title:       26px;                    /* product-section, etc. */
  --font-card-title:          18px;                    /* product card title */
  --font-card-desc:           14px;                    /* product card excerpt */
  --font-product-hero-title:  42px;                    /* /product/ hero h1 */
  --font-product-hero-tagline:20px;
  --font-post-title:          32px;                    /* blog post h1 (post.php) */
  --font-post-card-title:     17px;                    /* blog index card h2 */
  --font-footer:              12px;
}

/* ── Custom scrollbars (matches the orange→blue brand gradient) ──────────
 * Strategy: a transparent border on the thumb plus background-clip:padding-box
 * gives the thumb a "floating pill" look — the gradient stays intact and
 * we visually shrink the thumb without losing the larger hit area.
 * Works on Chromium-based browsers + Safari via ::-webkit-scrollbar.
 * Firefox uses scrollbar-width / scrollbar-color (declared on <html>).
 */
* { scrollbar-width: thin; scrollbar-color: var(--accent) transparent; }

*::-webkit-scrollbar { width: 12px; height: 12px; }
*::-webkit-scrollbar-track {
  background: transparent;
}
*::-webkit-scrollbar-thumb {
  background: linear-gradient(180deg, var(--accent) 0%, var(--brand) 100%);
  border-radius: 999px;
  background-clip: padding-box;
  border: 3px solid transparent;
  min-height: 40px;
  transition: background 0.15s;
}
*::-webkit-scrollbar-thumb:hover {
  background: linear-gradient(180deg, var(--accent2) 0%, var(--brand2) 100%);
  background-clip: padding-box;
  box-shadow: inset 0 0 0 1px rgba(255,255,255,0.08);
}
*::-webkit-scrollbar-thumb:active {
  background: linear-gradient(180deg, var(--accent) 0%, var(--brand-deep) 100%);
  background-clip: padding-box;
}
*::-webkit-scrollbar-corner { background: transparent; }

/* Horizontal scrollers (the carousel, the admin tables) get the same
 * gradient but rotated so it reads left→right instead of top→bottom. */
.home-carousel::-webkit-scrollbar-thumb,
[data-h-scroll]::-webkit-scrollbar-thumb {
  background: linear-gradient(90deg, var(--accent) 0%, var(--brand) 100%);
  background-clip: padding-box;
}

/* On native scrollers that we want to stay completely invisible (image
 * galleries, etc.), opt-out with .scrollbar-hidden. */
.scrollbar-hidden { scrollbar-width: none; }
.scrollbar-hidden::-webkit-scrollbar { display: none; }

body {
  font-family: 'Space Grotesk', system-ui, sans-serif;
  background: var(--bg);
  color: var(--text);
  font-size: var(--font-body);
  line-height: 1.6;
  overflow-x: hidden;
  transition: background-color 0.2s ease, color 0.2s ease;
}

a { color: var(--brand2); text-decoration: none; }
a:hover { text-decoration: underline; }
img { max-width: 100%; height: auto; display: block; }

.container { max-width: 1200px; margin: 0 auto; padding: 0 24px; }

/* ── BUTTONS ────────────────────────────────────────────────── */
.btn-primary {
  display: inline-flex; align-items: center; gap: 8px;
  background: var(--accent);
  color: #fff;
  padding: 14px 28px;
  border-radius: var(--radius-sm);
  font-weight: 600;
  font-size: 15px;
  border: none;
  cursor: pointer;
  transition: all 0.2s;
}
.btn-primary:hover { background: var(--accent2); transform: translateY(-1px); text-decoration: none; }

.btn-secondary {
  display: inline-flex; align-items: center;
  background: transparent;
  color: var(--text);
  padding: 12px 24px;
  border-radius: var(--radius-sm);
  font-weight: 500;
  border: 1px solid var(--border2);
  cursor: pointer;
  transition: all 0.2s;
}
.btn-secondary:hover { background: var(--brand-soft); color: var(--brand2); border-color: var(--brand); }

/* ── HEADER ─────────────────────────────────────────────────── */
.site-header {
  position: sticky;
  top: 0;
  z-index: 100;
  background: var(--header-bg);
  backdrop-filter: blur(16px);
  -webkit-backdrop-filter: blur(16px);
  border-bottom: 1px solid var(--border);
}
.header-inner {
  display: flex;
  align-items: center;
  gap: 32px;
  padding-top: 14px;
  padding-bottom: 14px;
}
.logo {
  display: flex;
  align-items: center;
  gap: 10px;
}
.logo-img {
  height: 36px;
  width: auto;
  display: block;
}
/* v2.20.60 — In mixed mode the body is light but the header stays dark,
   so we want the same logo variant we use in pure dark mode (the bright
   one). Without this rule both <img> tags render side by side because
   the only filters above match "dark" or "light", not "mixed". */
[data-theme="dark"] .logo-img.logo-light,
[data-theme="mixed"] .logo-img.logo-light,
:root:not([data-theme]) .logo-img.logo-light { display: none; }
[data-theme="light"] .logo-img.logo-dark { display: none; }
@media (prefers-color-scheme: light) {
  :root:not([data-theme]) .logo-img.logo-dark { display: none; }
  :root:not([data-theme]) .logo-img.logo-light { display: block; }
}

/* Brand wordmark: VBedits — "VB" orange, "edits" white(dark)/navy(light) */
.brand {
  font-size: 22px;
  font-weight: 700;
  letter-spacing: -0.01em;
  display: inline-flex;
  align-items: baseline;
  line-height: 1;
}
.brand-vb {
  color: var(--accent);
}
.brand-edits {
  color: var(--text);  /* white in dark mode, deep navy (--text=#1e40af) in light */
}

.main-nav { display: flex; gap: 28px; margin-left: auto; }
.main-nav a {
  color: var(--text2);
  font-size: 14px;
  font-weight: 500;
  transition: color 0.2s;
  position: relative;
}
.main-nav a:hover { color: var(--text); text-decoration: none; }
.main-nav a:hover::after,
.main-nav a.active::after {
  content: '';
  position: absolute;
  left: 0; right: 0; bottom: -6px;
  height: 2px;
  background: var(--accent);
  border-radius: 2px;
}
/* v2.20.63 — active section indicator. Same underline as hover but
   doesn't disappear when the cursor leaves, and the label is bolder +
   uses the strong text colour so the user can tell at a glance which
   section they're in (Tienda / Blog / Sobre mí / Contacto). "Inicio"
   never receives this state on purpose. */
.main-nav a.active {
  color: var(--text);
  font-weight: 600;
}

.header-actions { display: flex; align-items: center; gap: 8px; }

/* Theme toggle */
.theme-toggle {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 38px; height: 38px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--border);
  background: transparent;
  color: var(--text2);
  cursor: pointer;
  transition: all 0.2s;
}
.theme-toggle:hover { color: var(--accent); border-color: var(--accent); background: var(--accent-soft); }
.theme-toggle .icon-sun { display: none; }
.theme-toggle .icon-moon { display: block; }
[data-theme="light"] .theme-toggle .icon-sun { display: block; }
[data-theme="light"] .theme-toggle .icon-moon { display: none; }
@media (prefers-color-scheme: light) {
  :root:not([data-theme]) .theme-toggle .icon-sun { display: block; }
  :root:not([data-theme]) .theme-toggle .icon-moon { display: none; }
}

/* ── LANGUAGE SWITCHER (native <details>, no JS needed) ─────── */
.lang-switcher {
  position: relative;
}
.lang-switcher summary {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: 38px;
  padding: 0 10px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--border);
  background: transparent;
  color: var(--text2);
  cursor: pointer;
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.04em;
  list-style: none;
  user-select: none;
  transition: all 0.2s;
}
.lang-switcher summary::-webkit-details-marker { display: none; }
.lang-switcher summary::marker { content: ''; }
.lang-switcher summary:hover,
.lang-switcher[open] summary {
  color: var(--accent);
  border-color: var(--accent);
  background: var(--accent-soft);
}
.lang-current { letter-spacing: 0.06em; }

.lang-menu {
  position: absolute;
  top: calc(100% + 6px);
  right: 0;
  min-width: 170px;
  background: var(--bg2);
  border: 1px solid var(--border2);
  border-radius: var(--radius-sm);
  box-shadow: 0 12px 32px rgba(0,0,0,0.25);
  padding: 6px;
  list-style: none;
  margin: 0;
  z-index: 120;
}
[data-theme="light"] .lang-menu,
:root:not([data-theme]) .lang-menu {
  box-shadow: 0 10px 28px rgba(15,23,42,0.12);
}
.lang-menu li { list-style: none; }
.lang-menu a {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 10px;
  border-radius: var(--radius-sm);
  color: var(--text);
  font-size: 13.5px;
  font-weight: 500;
  text-decoration: none;
  transition: background 0.12s, color 0.12s;
}
.lang-menu a:hover {
  background: var(--brand-soft);
  color: var(--accent);
  text-decoration: none;
}
.lang-menu a.active {
  background: var(--accent-soft);
  color: var(--accent);
  font-weight: 600;
}
.lang-menu a.active::after {
  content: '✓';
  margin-left: auto;
  color: var(--accent);
  font-weight: 700;
}
.lang-menu .lang-code {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11px;
  letter-spacing: 0.06em;
  padding: 2px 6px;
  border-radius: 3px;
  background: var(--brand-soft);
  color: var(--text2);
  min-width: 28px;
  text-align: center;
}
.lang-menu a.active .lang-code {
  background: var(--accent);
  color: #fff;
}
.lang-menu .lang-name { flex: 1; }

.btn-cart {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 38px; height: 38px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--border);
  background: transparent;
  color: var(--text);
  cursor: pointer;
  transition: all 0.2s;
}
.btn-cart:hover { color: var(--accent); border-color: var(--accent); background: var(--accent-soft); }
/* Cart count: ALWAYS visible — even when 0 — so the badge doesn't flash
 * in and out as the JS layer reads localStorage on every page load.
 * Toned-down slate grey when 0, switches to orange when items > 0
 * (JS toggles the [data-zero] attribute). */
.cart-count {
  position: absolute;
  top: -6px; right: -6px;
  background: var(--accent);
  color: #fff;
  font-size: 10px;
  font-weight: 700;
  min-width: 18px; height: 18px; padding: 0 4px;
  border-radius: 999px;
  display: flex; align-items: center; justify-content: center;
  box-sizing: border-box;
  transition: background 0.15s, color 0.15s;
}
.cart-count[data-zero="1"] {
  background: var(--bg3);
  color: var(--text2);
  border: 1px solid var(--border);
}
.menu-toggle { display: none; }

/* ── HERO ───────────────────────────────────────────────────── */
.hero {
  position: relative;
  padding: 120px 0 80px;
  overflow: hidden;
}
.hero-bg {
  position: absolute;
  inset: 0;
  pointer-events: none;
}
.hero-grid {
  position: absolute;
  inset: 0;
  background-image:
    linear-gradient(var(--border) 1px, transparent 1px),
    linear-gradient(90deg, var(--border) 1px, transparent 1px);
  background-size: 60px 60px;
  opacity: 0.5;
}
.hero-glow {
  position: absolute;
  top: -200px; left: 50%;
  transform: translateX(-50%);
  width: 800px; height: 600px;
  background: var(--hero-glow);
}
.hero-content {
  position: relative;
  text-align: center;
  max-width: 780px;
  margin: 0 auto;
}
.hero-label {
  display: inline-block;
  padding: 6px 14px;
  background: var(--accent-soft);
  border: 1px solid var(--border2);
  border-radius: 100px;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--accent);
  margin-bottom: 20px;
}
.hero-title {
  font-size: clamp(36px, 5vw, 64px);
  font-weight: 700;
  line-height: 1.1;
  margin-bottom: 20px;
  background: linear-gradient(135deg, var(--text) 30%, var(--accent) 100%);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
}
.hero-sub {
  font-size: 18px;
  color: var(--text2);
  max-width: 560px;
  margin: 0 auto 36px;
}

/* ── FILTER ─────────────────────────────────────────────────── */
.filter-section { padding: 48px 0 24px; }
.filter-tabs { display: flex; gap: 8px; flex-wrap: wrap; }
.filter-tab {
  padding: 8px 20px;
  border-radius: 100px;
  border: 1px solid var(--border);
  background: transparent;
  color: var(--text2);
  font-size: 13px;
  font-weight: 500;
  cursor: pointer;
  font-family: inherit;
  transition: all 0.2s;
}
.filter-tab:hover { border-color: var(--accent); color: var(--accent); }
.filter-tab.active {
  background: var(--accent);
  border-color: var(--accent);
  color: #fff;
}

/* ── PRODUCTS ───────────────────────────────────────────────── */
.products-section { padding: 24px 0 80px; }
.products-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  gap: 24px;
}
.product-card {
  position: relative;
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  overflow: hidden;
  transition: all 0.3s;
  box-shadow: var(--shadow);
}
.product-card:hover {
  border-color: var(--accent);
  transform: translateY(-4px);
  box-shadow: var(--shadow-hover);
}
.product-card[data-hidden] { display: none; }
.badge-featured {
  position: absolute;
  /* v2.20.91 — moved to top-left so the "Destacado" pill never overlaps
   * the diagonal sale ribbon (which lives at top-right). */
  top: 12px; left: 12px;
  z-index: 2;
  background: var(--accent);
  color: #fff;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  padding: 4px 10px;
  border-radius: 100px;
}
.product-cover {
  width: 100%;
  aspect-ratio: 16/9;
  background: var(--bg3);
  overflow: hidden;
}
.product-cover img { width: 100%; height: 100%; object-fit: cover; }
.cover-placeholder {
  width: 100%; height: 100%;
  display: flex; align-items: center; justify-content: center;
  color: var(--text3);
}
.product-body { padding: 20px; }
.product-meta { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; }
/* Category badges. Categories are admin-managed now, so all badges share a
 * single brand-colored style instead of one rule per known slug. */
.cat-badge {
  font-size: 11px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  padding: 3px 8px;
  border-radius: 4px;
  background: var(--brand-soft);
  color: var(--brand2);
}
/* Version pill on product cards — kept prominent so buyers can see at a
 * glance which version of a plugin/app/game is currently shipping. */
.version {
  margin-left: auto;
  display: inline-flex;
  align-items: center;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11px;
  font-weight: 600;
  padding: 3px 9px;
  border-radius: 999px;
  background: var(--brand-soft);
  color: var(--brand);
  border: 1px solid var(--border);
}
.product-name { font-size: var(--font-card-title); font-weight: 600; margin-bottom: 8px; color: var(--text); }
.product-desc { font-size: var(--font-card-desc); color: var(--text2); line-height: 1.5; margin-bottom: 20px; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
/* Card footer: precio en una fila, botones SIEMPRE en otra fila debajo
 * (ocupando el ancho completo y dividiéndose 50/50). Antes era flex
 * horizontal con flex-wrap, y eso provocaba que la card de productos
 * gratis dejara "Gratis" + Detalles + Descargar todo en una sola fila
 * (porque "Gratis" es corta) mientras las cards de pago empujaban los
 * botones a una segunda fila. Ahora todas las cards tienen el mismo
 * layout independientemente de la longitud del precio. */
.product-footer {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: 12px;
}
.price {
  font-size: 22px;
  font-weight: 700;
  font-family: 'JetBrains Mono', monospace;
  color: var(--accent);
}
.product-actions {
  display: flex;
  gap: 8px;
  width: 100%;
}
.product-actions > .btn-detail,
.product-actions > .btn-buy {
  flex: 1;
  text-align: center;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.btn-detail {
  padding: 8px 14px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--border2);
  background: transparent;
  color: var(--text2);
  font-size: 13px;
  font-weight: 500;
  transition: all 0.2s;
  font-family: inherit;
  cursor: pointer;
}
.btn-detail:hover { color: var(--text); border-color: var(--brand); text-decoration: none; }
.btn-buy {
  padding: 8px 16px;
  border-radius: var(--radius-sm);
  background: var(--accent);
  color: #fff;
  font-size: 13px;
  font-weight: 600;
  border: none;
  cursor: pointer;
  transition: all 0.2s;
  font-family: inherit;
}
.btn-buy:hover { background: var(--accent2); }

/* ── Cart "in-cart" state ───────────────────────────────────────────────
 * Applied by Cart.refreshButtons(). Buttons turn green with a check mark;
 * cards gain a corner ribbon. Hovering an .in-cart button hints at the
 * remove-on-click behaviour by shifting the hue toward red.
 */
.btn-buy.in-cart,
.btn-primary.in-cart,
.btn-secondary.in-cart {
  background: var(--green, #10b981) !important;
  color: #fff !important;
  border-color: var(--green, #10b981) !important;
  box-shadow: 0 0 0 1px rgba(255,255,255,0.12) inset;
}
.btn-buy.in-cart:hover,
.btn-primary.in-cart:hover,
.btn-secondary.in-cart:hover {
  background: var(--red, #ef4444) !important;
  border-color: var(--red, #ef4444) !important;
}
.btn-buy.in-cart::before,
.btn-primary.in-cart::before,
.btn-secondary.in-cart::before {
  /* The label already includes "✓" — no extra pseudo content needed.
   * Kept here as an anchor for future tweaks (e.g. swap "✓" → "✕" on hover
   * via the existing label text). */
}

/* Corner ribbon — hidden by default, fades in when the parent card carries
 * .in-cart. Top-left corner so it doesn't fight the "Featured" badge that
 * already sits at top-right. */
.cart-ribbon {
  position: absolute;
  top: 10px;
  left: 10px;
  z-index: 3;
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 4px 9px;
  border-radius: 999px;
  background: var(--green, #10b981);
  color: #fff;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  line-height: 1;
  box-shadow: 0 4px 12px rgba(16,185,129,0.35);
  opacity: 0;
  transform: translateY(-4px) scale(0.92);
  transition: opacity 0.18s, transform 0.18s;
  pointer-events: none;
}
.cart-ribbon-sm {
  padding: 4px 6px;
  font-size: 10px;
}
.product-card.in-cart .cart-ribbon,
.carousel-card.in-cart .cart-ribbon,
.home-featured-card.in-cart .cart-ribbon {
  opacity: 1;
  transform: translateY(0) scale(1);
}

/* Cards in cart get a subtle green outline so the in-cart state is
 * visible from across the grid even if the ribbon is partially clipped. */
.product-card.in-cart,
.carousel-card.in-cart {
  box-shadow: 0 0 0 1px rgba(16,185,129,0.45), var(--shadow);
}
.product-card.in-cart:hover,
.carousel-card.in-cart:hover {
  box-shadow: 0 0 0 1px rgba(16,185,129,0.55), var(--shadow-hover);
}

/* Cart-total hint on the product page sidebar */
.cart-total-empty { color: var(--text2) !important; }

/* ── TRUST ──────────────────────────────────────────────────── */
.trust-section { padding: 60px 0; border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); }
.trust-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 32px; text-align: center; }
.trust-item svg { margin: 0 auto 12px; stroke: var(--accent); }
.trust-item h4 { font-size: 15px; font-weight: 600; margin-bottom: 6px; color: var(--text); }
.trust-item p { font-size: 13px; color: var(--text2); }

/* ── FOOTER ─────────────────────────────────────────────────── */
.site-footer { padding: 48px 0; border-top: 1px solid var(--border); }
.footer-inner { display: flex; flex-direction: column; align-items: center; gap: 20px; text-align: center; }
.footer-brand .brand { font-size: 20px; }
.footer-brand p { font-size: 13px; color: var(--text2); margin-top: 6px; }
.footer-links { display: flex; gap: 24px; }
.footer-links a { font-size: 13px; color: var(--text2); }
.footer-links a:hover { color: var(--accent); text-decoration: none; }
.footer-copy { font-size: var(--font-footer); color: var(--text3); }

/* ── EMPTY STATE ─────────────────────────────────────────────── */
.empty-state { text-align: center; padding: 80px 20px; color: var(--text2); }

/* ── ADMIN CMS (unchanged structure, new colors) ─────────────── */
.admin-layout { display: flex; min-height: 100vh; background: var(--bg); }
.admin-sidebar {
  width: 260px;
  background: var(--bg2);
  border-right: 1px solid var(--border);
  display: flex;
  flex-direction: column;
  position: sticky;
  top: 0;
  height: 100vh;
  overflow-y: auto;
  flex-shrink: 0;
}
.sidebar-logo {
  padding: 24px 20px;
  border-bottom: 1px solid var(--border);
}
.sidebar-logo .brand { font-size: 20px; }
.sidebar-badge {
  display: inline-block;
  background: var(--accent-soft);
  color: var(--accent);
  font-size: 10px;
  font-weight: 700;
  padding: 2px 8px;
  border-radius: 4px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  margin-left: 8px;
}
.sidebar-nav { padding: 16px 12px; flex: 1; }
.sidebar-section { font-size: 10px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: var(--text2); padding: 8px 8px 4px; margin-top: 12px; }
.sidebar-link {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 12px;
  border-radius: var(--radius-sm);
  color: var(--text2);
  font-size: 14px;
  font-weight: 500;
  transition: all 0.15s;
  margin-bottom: 2px;
}
.sidebar-link:hover { background: var(--brand-soft); color: var(--text); text-decoration: none; }
.sidebar-link.active { background: var(--accent-soft); color: var(--accent); }
.sidebar-link svg { opacity: 0.7; flex-shrink: 0; }
.sidebar-link.active svg { opacity: 1; }
.sidebar-footer {
  padding: 16px 20px;
  border-top: 1px solid var(--border);
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.sidebar-version {
  font-size: 11px;
  color: var(--text3);
  font-family: 'JetBrains Mono', monospace;
  letter-spacing: 0.04em;
}
.sidebar-version strong { color: var(--accent); font-weight: 700; }
.admin-main { flex: 1; overflow-y: auto; }
.admin-topbar {
  padding: 16px 32px;
  border-bottom: 1px solid var(--border);
  display: flex;
  align-items: center;
  justify-content: space-between;
  background: var(--bg2);
  position: sticky;
  top: 0;
  z-index: 10;
}
.page-title { font-size: 20px; font-weight: 600; color: var(--text); }
.admin-content { padding: 32px; }
.stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 16px; margin-bottom: 32px; }
.stat-card {
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 20px;
}
.stat-card .label { font-size: 12px; color: var(--text2); text-transform: uppercase; letter-spacing: 0.06em; margin-bottom: 8px; }
.stat-card .value { font-size: 28px; font-weight: 700; font-family: 'JetBrains Mono', monospace; color: var(--text); }
.stat-card .change { font-size: 12px; color: var(--green); margin-top: 4px; }
.table-container {
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  overflow: hidden;
}
.admin-table { width: 100%; border-collapse: collapse; }
.admin-table th {
  padding: 14px 16px;
  font-size: 12px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--text2);
  background: var(--bg3);
  text-align: left;
  border-bottom: 1px solid var(--border);
}
.admin-table td {
  padding: 14px 16px;
  font-size: 14px;
  border-bottom: 1px solid var(--border);
  vertical-align: middle;
  color: var(--text);
}
.admin-table tr:last-child td { border-bottom: none; }
.admin-table tr:hover td { background: var(--brand-soft); }
.form-card {
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 28px;
  margin-bottom: 24px;
}
.form-card h3 { font-size: 16px; font-weight: 600; margin-bottom: 20px; padding-bottom: 12px; border-bottom: 1px solid var(--border); color: var(--text); }
.form-group { margin-bottom: 18px; }
.form-label { display: block; font-size: 13px; font-weight: 500; color: var(--text2); margin-bottom: 6px; }
.form-control {
  width: 100%;
  padding: 10px 14px;
  background: var(--bg3);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  color: var(--text);
  font-size: 14px;
  font-family: inherit;
  transition: border-color 0.2s;
  outline: none;
}
.form-control:focus { border-color: var(--accent); }
.form-control::placeholder { color: var(--text3); }
textarea.form-control { resize: vertical; min-height: 100px; }
select.form-control { cursor: pointer; }
.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.btn-save {
  background: var(--accent);
  color: #fff;
  padding: 11px 24px;
  border: none;
  border-radius: var(--radius-sm);
  font-size: 14px;
  font-weight: 600;
  cursor: pointer;
  font-family: inherit;
  transition: all 0.2s;
}
.btn-save:hover { background: var(--accent2); }
.btn-danger {
  background: transparent;
  color: var(--red);
  padding: 6px 12px;
  border: 1px solid rgba(239,68,68,0.3);
  border-radius: var(--radius-sm);
  font-size: 12px;
  font-weight: 500;
  cursor: pointer;
  font-family: inherit;
  transition: all 0.2s;
}
.btn-danger:hover { background: rgba(239,68,68,0.1); }
.alert {
  padding: 12px 16px;
  border-radius: var(--radius-sm);
  font-size: 14px;
  margin-bottom: 20px;
}
.alert-success { background: rgba(16,185,129,0.12); border: 1px solid rgba(16,185,129,0.3); color: var(--green); }
.alert-error   { background: rgba(239,68,68,0.12);  border: 1px solid rgba(239,68,68,0.3);  color: var(--red); }

/* Logo preview thumbnails in settings */
.logo-preview {
  display: inline-block;
  padding: 10px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--border);
  margin-bottom: 8px;
}
.logo-preview.dark  { background: #0a0e1a; }
.logo-preview.light { background: #ffffff; }
.logo-preview img { max-height: 48px; display: block; }

/* ── LOGIN PAGE ──────────────────────────────────────────────── */
.login-page {
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  background:
    radial-gradient(ellipse at 50% -20%, var(--accent-soft) 0%, transparent 60%),
    var(--bg);
}
.login-card {
  width: 100%;
  max-width: 400px;
  background: var(--bg2);
  border: 1px solid var(--border2);
  border-radius: var(--radius);
  padding: 40px;
  box-shadow: var(--shadow);
}
.login-header { text-align: center; margin-bottom: 32px; }
.login-header h1 { font-size: 24px; font-weight: 700; margin-bottom: 8px; color: var(--text); }
.login-header p { font-size: 14px; color: var(--text2); }
.login-header .brand { font-size: 28px; display: block; margin-bottom: 8px; }

/* ── MOBILE ──────────────────────────────────────────────────── */
@media (max-width: 768px) {
  .main-nav { display: none; }
  .menu-toggle {
    display: flex; align-items: center; justify-content: center;
    width: 36px; height: 36px;
    background: transparent;
    border: 1px solid var(--border);
    border-radius: var(--radius-sm);
    cursor: pointer;
    color: var(--text);
  }
  .hero { padding: 80px 0 60px; }
  .form-row { grid-template-columns: 1fr; }
  .admin-sidebar { display: none; }
  .admin-sidebar.open { display: flex; position: fixed; z-index: 200; inset: 0 auto 0 0; }
  .header-inner { gap: 16px; }
}

/* ── BLOG ────────────────────────────────────────────────────── */
.posts-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 24px;
}
.post-card {
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  overflow: hidden;
  transition: all 0.25s;
  box-shadow: var(--shadow);
  display: flex;
  flex-direction: column;
}
.post-card:hover {
  border-color: var(--accent);
  transform: translateY(-3px);
  box-shadow: var(--shadow-hover);
}
.post-card-cover {
  display: block;
  width: 100%;
  aspect-ratio: 16/9;
  background: var(--bg3);
  overflow: hidden;
}
.post-card-cover img {
  width: 100%; height: 100%;
  object-fit: cover;
  transition: transform 0.4s;
}
.post-card:hover .post-card-cover img { transform: scale(1.03); }
.post-cover-placeholder {
  width: 100%; height: 100%;
  display: flex; align-items: center; justify-content: center;
  color: var(--text3);
}
.post-card-body { padding: 18px 20px 20px; display: flex; flex-direction: column; flex: 1; }
.post-card-meta {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 12px;
  color: var(--text2);
  margin-bottom: 8px;
}
.post-card-lang {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 10px;
  font-weight: 700;
  padding: 2px 6px;
  border-radius: 3px;
  background: var(--accent-soft);
  color: var(--accent);
  letter-spacing: 0.08em;
}
.post-card-title { font-size: var(--font-post-card-title); font-weight: 600; line-height: 1.35; margin-bottom: 8px; }
.post-card-title a { color: var(--text); text-decoration: none; }
.post-card-title a:hover { color: var(--accent); }
.post-card-excerpt {
  font-size: 13.5px;
  color: var(--text2);
  line-height: 1.55;
  margin-bottom: 14px;
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.post-card-link {
  font-size: 13px;
  font-weight: 600;
  color: var(--accent);
  text-decoration: none;
  margin-top: auto;
}
.post-card-link:hover { color: var(--accent2); text-decoration: underline; }

/* Single post view */
.post-article { color: var(--text); }
.post-meta-row {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-size: 13px;
  color: var(--text2);
  margin-bottom: 14px;
}
.post-title {
  font-size: clamp(28px, 4vw, 40px);
  font-weight: 700;
  letter-spacing: -0.02em;
  line-height: 1.2;
  margin-bottom: 14px;
  color: var(--text);
}
.post-excerpt {
  font-size: 18px;
  color: var(--text2);
  line-height: 1.55;
  margin-bottom: 28px;
  font-weight: 400;
}
.post-cover {
  margin: 0 0 32px;
  border-radius: var(--radius);
  overflow: hidden;
  border: 1px solid var(--border);
}
.post-cover img { width: 100%; display: block; }

.post-content { font-size: 16.5px; line-height: 1.7; color: var(--text); }
.post-content h2 { font-size: 24px; font-weight: 600; margin: 36px 0 14px; color: var(--text); letter-spacing: -0.01em; }
.post-content h3 { font-size: 19px; font-weight: 600; margin: 28px 0 10px; color: var(--text); }
.post-content h4 { font-size: 16px; font-weight: 600; margin: 22px 0 8px; color: var(--text); }
.post-content p  { margin-bottom: 18px; color: var(--text); }
.post-content a  { color: var(--accent); text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 3px; }
.post-content a:hover { color: var(--accent2); }
.post-content ul, .post-content ol { margin: 0 0 18px 24px; }
.post-content li { margin-bottom: 6px; }
.post-content blockquote {
  border-left: 3px solid var(--accent);
  padding: 4px 18px;
  margin: 22px 0;
  color: var(--text2);
  font-style: italic;
}
.post-content code {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 0.9em;
  background: var(--bg3);
  padding: 2px 6px;
  border-radius: 4px;
  color: var(--accent);
}
.post-content pre:not(.vbe-code) {
  background: var(--bg3);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 16px 18px;
  overflow-x: auto;
  margin-bottom: 18px;
}
.post-content pre:not(.vbe-code) code {
  background: none;
  padding: 0;
  color: var(--text);
  font-size: 13.5px;
  line-height: 1.6;
}
.post-content img {
  max-width: 100%;
  border-radius: var(--radius);
  margin: 18px 0;
  border: 1px solid var(--border);
}
.post-content hr {
  border: none;
  border-top: 1px solid var(--border);
  margin: 32px 0;
}

/* ── WORDPRESS landing page ──────────────────────────────────── */
.section-hero {
  position: relative;
  padding: 80px 0 40px;
  overflow: hidden;
  text-align: center;
}
.section-hero-inner {
  position: relative;
  max-width: 760px;
  margin: 0 auto;
}
.section-hero-mark {
  display: inline-flex;
  width: 88px; height: 88px;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: var(--accent-soft);
  color: var(--accent);
  margin-bottom: 22px;
  border: 1px solid var(--border2);
}
.section-hero-title {
  font-size: clamp(32px, 4.5vw, 52px);
  font-weight: 700;
  letter-spacing: -0.02em;
  line-height: 1.1;
  margin-bottom: 18px;
  color: var(--text);
}
.section-hero-sub {
  font-size: 17px;
  color: var(--text2);
  line-height: 1.6;
  max-width: 620px;
  margin: 0 auto 28px;
}
.section-hero-ctas {
  display: inline-flex;
  gap: 12px;
  flex-wrap: wrap;
  justify-content: center;
}

.section-strip-title {
  display: flex;
  align-items: baseline;
  gap: 10px;
  font-size: 18px;
  font-weight: 600;
  color: var(--text);
  margin-bottom: 8px;
  text-transform: uppercase;
  letter-spacing: 0.06em;
}
.section-strip-count {
  font-size: 12px;
  font-weight: 600;
  color: var(--text2);
  background: var(--bg2);
  border: 1px solid var(--border);
  padding: 2px 8px;
  border-radius: 100px;
  letter-spacing: 0;
}

/* "Tested up to WP x.y" pill shown on WP plugin cards */
.compat-row { margin: -4px 0 14px; }
.compat-pill {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: 11px;
  font-weight: 600;
  padding: 3px 9px;
  border-radius: 100px;
  background: var(--brand-soft);
  color: var(--brand2);
  letter-spacing: 0.02em;
}

/* ── HOME landing ─────────────────────────────────────────────── */
.home-hero {
  position: relative;
  padding: 100px 0 72px;
  overflow: hidden;
  text-align: center;
}
.home-hero-content {
  position: relative;
  max-width: 760px;
  margin: 0 auto;
  text-align: center;
}
.home-hero-title {
  font-size: var(--font-hero-title);
  font-weight: 700;
  letter-spacing: -0.03em;
  line-height: 1;
  margin: 14px 0 18px;
}
.home-hero-title .brand { font-size: inherit; }
.home-hero-tagline {
  font-size: var(--font-hero-tagline);
  font-weight: 500;
  color: var(--text);
  margin-bottom: 18px;
  letter-spacing: -0.01em;
}
.home-hero-sub {
  font-size: var(--font-hero-sub);
  color: var(--text2);
  line-height: 1.6;
  max-width: 600px;
  margin: 0 auto 32px;
}
.home-hero-ctas {
  display: inline-flex;
  gap: 12px;
  flex-wrap: wrap;
  justify-content: center;
}

/* Featured product on the home */
.home-featured { padding: 32px 0 24px; }
.home-featured-card {
  position: relative;  /* anchor for the .cart-ribbon corner badge */
  display: grid;
  grid-template-columns: 1.1fr 1fr;
  gap: 0;
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  overflow: hidden;
  box-shadow: var(--shadow);
}
.home-featured-cover {
  background: var(--bg3);
  overflow: hidden;
  aspect-ratio: 16/10;
}
.home-featured-cover img,
.home-featured-cover .cover-placeholder {
  width: 100%; height: 100%;
  object-fit: cover;
}
.home-featured-body {
  padding: 40px 44px;
  display: flex;
  flex-direction: column;
  justify-content: center;
}
.home-featured-tag {
  display: inline-block;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--accent);
  background: var(--accent-soft);
  padding: 4px 10px;
  border-radius: 4px;
  margin-bottom: 14px;
  align-self: flex-start;
}
.home-featured-title {
  font-size: clamp(24px, 3vw, 32px);
  font-weight: 700;
  letter-spacing: -0.01em;
  line-height: 1.15;
  margin-bottom: 12px;
  color: var(--text);
}
.home-featured-desc {
  font-size: 15.5px;
  color: var(--text2);
  line-height: 1.6;
  margin-bottom: 24px;
}
.home-featured-footer {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 14px;
  flex-wrap: wrap;
  padding-top: 18px;
  border-top: 1px solid var(--border);
}
.home-featured-price {
  font-size: 30px;
  font-weight: 700;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  color: var(--accent);
}

/* Carousel — fully centered: "Just shipped" label + title stack on top
 * centered, prev/next/view-all sit underneath also centered. */
.home-carousel-section { padding: 48px 0 80px; text-align: center; }
.home-carousel-header {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 14px;
  margin-bottom: 22px;
}
.home-carousel-header .hero-label { text-align: center; }
.home-carousel-title {
  font-size: var(--font-section-title);
  font-weight: 700;
  letter-spacing: -0.01em;
  color: var(--text);
  text-align: center;
  margin: 0;
}
.home-carousel-header .carousel-controls {
  display: inline-flex;
  align-items: center;
  gap: 8px;
}
.carousel-controls {
  display: inline-flex;
  align-items: center;
  gap: 6px;
}
.carousel-btn {
  width: 36px; height: 36px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--border2);
  background: var(--bg2);
  color: var(--text);
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: all 0.15s;
}
.carousel-btn:hover { border-color: var(--accent); color: var(--accent); background: var(--accent-soft); }
.carousel-btn[disabled] { opacity: 0.35; cursor: not-allowed; }
.carousel-view-all {
  margin-left: 10px;
  font-size: 13px;
  font-weight: 600;
  color: var(--accent);
  text-decoration: none;
}
.carousel-view-all:hover { color: var(--accent2); text-decoration: underline; }

.home-carousel {
  display: flex;
  gap: 18px;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scroll-behavior: smooth;
  /* Top + bottom padding give the cards room to translateY(-3px) on hover
     + room for the box-shadow + room for the SALE ribbon to overflow the
     card corner without being clipped by overflow:auto's implicit y-clip. */
  padding: 14px 2px 10px;
  /* Hide scrollbar (still scrollable) */
  scrollbar-width: thin;
}
.home-carousel::-webkit-scrollbar { height: 6px; }
.home-carousel::-webkit-scrollbar-thumb { background: var(--border2); border-radius: 3px; }

/* Centre cards when there are few enough that horizontal scrolling is not
 * needed. Without this, 1-3 cards stick to the left and the whole carousel
 * looks unbalanced. The `:has()` query targets only carousels whose LAST
 * card is among the first 4 — i.e. there are ≤4 cards total. With 5+ the
 * default flex-start kicks back in so scrolling still works correctly
 * (centered overflow scrolls weirdly). */
.home-carousel:has(.carousel-card:nth-child(-n+4):last-child) {
  justify-content: center;
}

.carousel-card {
  position: relative;  /* anchor for the .cart-ribbon corner badge */
  flex: 0 0 280px;
  scroll-snap-align: start;
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  overflow: hidden;
  transition: all 0.2s;
  display: flex;
  flex-direction: column;
}
.carousel-card:hover {
  border-color: var(--accent);
  transform: translateY(-3px);
  box-shadow: var(--shadow-hover);
}
.carousel-card-cover {
  display: block;
  aspect-ratio: 16/9;
  background: var(--bg3);
  overflow: hidden;
}
.carousel-card-cover img {
  width: 100%; height: 100%; object-fit: cover;
}
.carousel-card-body { padding: 14px 16px 16px; }
.carousel-card-title {
  font-size: 15px;
  font-weight: 600;
  margin: 6px 0 4px;
  line-height: 1.3;
}
.carousel-card-title a { color: var(--text); text-decoration: none; }
.carousel-card-title a:hover { color: var(--accent); }
.carousel-card-price {
  font-size: 14px;
  font-weight: 700;
  color: var(--accent);
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  margin-top: 6px;
}

/* ── STORE page (e-commerce layout) ───────────────────────────── */
.store-main { background: var(--bg); }

/* Toolbar bar that sits below the site header. Sticky so it follows
   you as you scroll the grid. */
.store-toolbar-wrap {
  background: var(--bg2);
  border-bottom: 1px solid var(--border);
  position: sticky;
  top: 64px; /* clears the site-header */
  z-index: 50;
}
.store-toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 18px;
  padding-top: 14px;
  padding-bottom: 14px;
  flex-wrap: wrap;
}
.store-toolbar-title {
  display: flex;
  align-items: baseline;
  gap: 14px;
}
.store-toolbar-title h1 {
  font-size: 22px;
  font-weight: 700;
  letter-spacing: -0.01em;
  color: var(--text);
  margin: 0;
}
.store-toolbar-count {
  font-size: 12px;
  font-weight: 600;
  color: var(--text2);
  background: var(--brand-soft);
  padding: 3px 10px;
  border-radius: 100px;
  letter-spacing: 0.02em;
}
.store-toolbar-tools {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
}

/* Search input */
.store-search {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  background: var(--bg);
  border: 1px solid var(--border2);
  border-radius: var(--radius-sm);
  padding: 6px 12px;
  width: 240px;
  transition: border-color 0.15s, box-shadow 0.15s;
}
.store-search:focus-within {
  border-color: var(--accent);
  box-shadow: 0 0 0 3px var(--accent-soft);
}
.store-search svg { color: var(--text3); flex-shrink: 0; }
.store-search input {
  border: none;
  background: transparent;
  outline: none;
  font: inherit;
  color: var(--text);
  font-size: 13.5px;
  width: 100%;
}
.store-search input::placeholder { color: var(--text3); }

/* Sort select */
.store-sort {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 13px;
  color: var(--text2);
}
.store-sort-label { white-space: nowrap; }
.store-sort select {
  appearance: none;
  -webkit-appearance: none;
  border: 1px solid var(--border2);
  border-radius: var(--radius-sm);
  padding: 6px 28px 6px 12px;
  background:
    linear-gradient(45deg, transparent 50%, var(--text2) 50%) calc(100% - 14px) 50% / 5px 5px no-repeat,
    linear-gradient(135deg, var(--text2) 50%, transparent 50%) calc(100% - 9px) 50% / 5px 5px no-repeat,
    var(--bg);
  color: var(--text);
  font: inherit;
  font-size: 13px;
  cursor: pointer;
  transition: border-color 0.15s;
}
.store-sort select:focus { border-color: var(--accent); outline: none; }

/* Mobile filter toggle (shows the sidebar as a drawer below 900px) */
.store-filter-toggle {
  display: none;
  align-items: center;
  gap: 6px;
  background: var(--bg);
  border: 1px solid var(--border2);
  border-radius: var(--radius-sm);
  padding: 7px 12px;
  color: var(--text);
  font: inherit;
  font-size: 13px;
  cursor: pointer;
}
.store-filter-toggle:hover { border-color: var(--accent); color: var(--accent); }

/* Main 2-column layout */
.store-layout {
  display: grid;
  grid-template-columns: 240px 1fr;
  gap: 32px;
  padding-top: 28px;
  padding-bottom: 48px;
  align-items: start;
}

/* Sidebar */
.store-sidebar {
  position: sticky;
  top: 140px; /* under both site-header + store-toolbar */
  max-height: calc(100vh - 160px);
  overflow-y: auto;
  padding-right: 6px;
}
.store-filter-group { margin-bottom: 22px; }
.store-filter-title {
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--text3);
  margin-bottom: 10px;
}
.store-cat-tree { list-style: none; padding: 0; margin: 0; }
.store-cat-tree ul { list-style: none; padding: 0; margin: 0; }
.store-cat-children { margin: 2px 0 8px 0; padding-left: 10px !important; border-left: 1px solid var(--border); }
.store-cat-row {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 6px 8px;
  border-radius: var(--radius-sm);
  cursor: pointer;
  font-size: 13.5px;
  color: var(--text2);
  transition: background 0.12s, color 0.12s;
}
.store-cat-row:hover { background: var(--brand-soft); color: var(--text); }
.store-cat-row input[type="radio"],
.store-cat-row input[type="checkbox"] {
  accent-color: var(--accent);
  flex-shrink: 0;
}
.store-cat-row input:checked ~ .store-cat-name { color: var(--accent); font-weight: 600; }
.store-cat-name { flex: 1; }
.store-cat-count {
  font-size: 11px;
  color: var(--text3);
  background: var(--bg3);
  padding: 1px 7px;
  border-radius: 100px;
  font-weight: 500;
}
.store-cat-top > .store-cat-row { font-weight: 600; color: var(--text); }
.store-cat-child { font-size: 13px; }

.store-reset-btn {
  width: 100%;
  background: transparent;
  border: 1px solid var(--border2);
  color: var(--text2);
  font: inherit;
  font-size: 13px;
  padding: 8px 12px;
  border-radius: var(--radius-sm);
  cursor: pointer;
  transition: all 0.15s;
}
.store-reset-btn:hover { border-color: var(--accent); color: var(--accent); background: var(--accent-soft); }

/* Main content (denser grid than the home carousel) */
.store-content { min-width: 0; }
.store-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
  gap: 18px;
}
.store-grid .product-card { box-shadow: var(--shadow); }
.store-grid .product-body { padding: 16px 18px; }
.store-grid .product-name { font-size: 16px; }
.store-grid .product-desc { font-size: 13px; line-height: 1.5; -webkit-line-clamp: 2; }
.store-grid .product-actions { gap: 6px; }
.store-grid .btn-buy,
.store-grid .btn-detail { padding: 7px 12px; font-size: 12.5px; }
.store-grid .price { font-size: 18px; }

/* Slim trust strip at the bottom */
.store-trust {
  border-top: 1px solid var(--border);
  background: var(--bg2);
  padding: 18px 0;
}
.store-trust-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 14px;
  font-size: 13px;
  color: var(--text2);
  text-align: center;
}
.store-trust strong { color: var(--text); margin-right: 4px; }

/* Mobile: sidebar collapses to a drawer triggered by the Filters button */
@media (max-width: 900px) {
  .store-toolbar { gap: 10px; }
  .store-search { width: 100%; order: 10; }
  .store-filter-toggle { display: inline-flex; }
  .store-layout { grid-template-columns: 1fr; }
  .store-sidebar {
    position: fixed;
    top: 0; left: 0; bottom: 0;
    width: 280px;
    max-width: 85vw;
    max-height: none;
    background: var(--bg2);
    border-right: 1px solid var(--border);
    padding: 24px 20px;
    z-index: 200;
    overflow-y: auto;
    transform: translateX(-100%);
    transition: transform 0.22s;
    box-shadow: 0 0 40px rgba(0,0,0,0.3);
  }
  .store-sidebar.open { transform: translateX(0); }
  .store-sidebar.open::before {
    content: '';
    position: fixed;
    inset: 0;
    background: rgba(0,0,0,0.35);
    z-index: -1;
  }
}

/* ── ABOUT page ───────────────────────────────────────────────── */
.about-article {
  padding: 56px 24px 80px;
  max-width: 880px;
}
.about-title {
  font-size: clamp(32px, 4.5vw, 48px);
  font-weight: 700;
  letter-spacing: -0.02em;
  line-height: 1.1;
  color: var(--text);
  margin-bottom: 18px;
}
.about-lead {
  font-size: 19px;
  color: var(--text2);
  line-height: 1.55;
  margin-bottom: 40px;
}
.about-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 22px;
}
/* Full-width CTA card — span both grid columns. Used for the "Necesitas
 * algo a medida?" card at the bottom of /about so it reads as a footer
 * call-to-action, not a third orphan column-aligned card. */
.about-card-full {
  grid-column: 1 / -1;
  text-align: center;
  background: linear-gradient(135deg,
    color-mix(in srgb, var(--accent) 10%, var(--bg2)) 0%,
    color-mix(in srgb, var(--accent2) 8%, var(--bg2)) 100%);
  border-color: color-mix(in srgb, var(--accent) 30%, var(--border));
}
.about-card-full p { margin-left: auto; margin-right: auto; max-width: 56ch; }
.about-card {
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 26px 28px;
}
.about-card h2 {
  font-size: 17px;
  font-weight: 600;
  color: var(--text);
  margin-bottom: 14px;
}
.about-card p { font-size: 15px; color: var(--text2); line-height: 1.6; margin-bottom: 10px; }
.about-card ul { list-style: none; padding: 0; margin: 0; }
.about-card li {
  font-size: 14.5px;
  color: var(--text2);
  line-height: 1.55;
  padding: 6px 0;
  border-bottom: 1px solid var(--border);
}
.about-card li:last-child { border-bottom: none; }
.about-card li strong { color: var(--text); }

/* ── CONTACT page ─────────────────────────────────────────────── */
.contact-section {
  padding: 56px 24px 80px;
  max-width: 980px;
}
.contact-title {
  font-size: clamp(32px, 4.5vw, 48px);
  font-weight: 700;
  letter-spacing: -0.02em;
  line-height: 1.1;
  color: var(--text);
  margin-bottom: 14px;
}
.contact-lead {
  font-size: 17px;
  color: var(--text2);
  margin-bottom: 36px;
}
.contact-grid {
  display: grid;
  grid-template-columns: 1.6fr 1fr;
  gap: 32px;
  align-items: start;
}
.contact-form-wrap {
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 28px 30px;
  box-shadow: var(--shadow);
}
.contact-form .form-control {
  width: 100%;
  padding: 10px 14px;
  background: var(--bg3);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  color: var(--text);
  font-size: 14px;
  font-family: inherit;
  outline: none;
  transition: border-color 0.15s, box-shadow 0.15s;
}
.contact-form .form-control:focus {
  border-color: var(--accent);
  box-shadow: 0 0 0 3px var(--accent-soft);
}
.contact-form textarea.form-control { resize: vertical; min-height: 140px; }
.contact-form .form-group { margin-bottom: 16px; }
.contact-form .form-label {
  display: block;
  font-size: 13px;
  font-weight: 500;
  color: var(--text);
  margin-bottom: 6px;
}
.contact-form .form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }

.contact-aside {
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 26px 26px;
}
.contact-aside h3 {
  font-size: 14px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--text2);
  margin-bottom: 16px;
}
.contact-aside-item {
  padding: 10px 0;
  border-bottom: 1px solid var(--border);
  font-size: 14px;
  color: var(--text2);
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.contact-aside-item:last-child { border-bottom: none; }
.contact-aside-item a { color: var(--accent); }

/* v2.21.13 — Mixed-mode legibility for /contact page. Same recipe used
   by .cart-summary-box / .account-card: redeclare the inherited vars
   to their dark-mode values inside the dark surfaces so everything
   reads correctly without per-element overrides. */
[data-theme="mixed"] .contact-form-wrap,
[data-theme="mixed"] .contact-aside {
  --bg:          #0a0e1a;
  --bg2:         #101728;
  --bg3:         #1a2238;
  --bg-elevated: #101728;
  --card:        #101728;
  --text:        #e8edf7;
  --text1:       #e8edf7;
  --text2:       #94a3b8;
  --text3:       #64748b;
  --border:      rgba(255, 255, 255, 0.08);
  --border2:     rgba(255, 255, 255, 0.18);
  color: #e8edf7;
}
/* Inputs inside the contact card need explicit light text + translucent
   background so they don't render as white-on-dark per browser default. */
[data-theme="mixed"] .contact-form .form-control {
  background: rgba(255, 255, 255, .06);
  color: #e8edf7;
  border-color: rgba(255, 255, 255, .15);
}
[data-theme="mixed"] .contact-form .form-control::placeholder {
  color: #94a3b8;
  opacity: 1;
}
.contact-aside-label {
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--text3);
}

/* ── Admin shortcut chip — sits next to the brand name in the header ──── */
/* Wraps the logo + the chip so they stay side-by-side as a group. */
.logo-group {
  display: inline-flex;
  align-items: center;
  gap: 10px;
}
.admin-shortcut {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 5px 11px 5px 9px;
  border-radius: 999px;
  background: var(--accent);
  color: #fff;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  text-decoration: none;
  line-height: 1;
  box-shadow: 0 2px 8px rgba(249,115,22,0.35), 0 0 0 1px rgba(255,255,255,0.12) inset;
  transition: background 0.15s, transform 0.15s, box-shadow 0.15s;
}
.admin-shortcut:hover {
  background: var(--accent2);
  transform: translateY(-1px);
  box-shadow: 0 4px 12px rgba(249,115,22,0.45), 0 0 0 1px rgba(255,255,255,0.16) inset;
}
.admin-shortcut svg { flex-shrink: 0; }
.admin-shortcut-label { line-height: 1; }

/* On narrow viewports the chip collapses to icon-only so it doesn't
 * steal space from the brand name in the header. */
@media (max-width: 720px) {
  .admin-shortcut { padding: 5px 8px; }
  .admin-shortcut-label { display: none; }
}

/* Mobile tweaks for the new pages */
@media (max-width: 820px) {
  .home-featured-card { grid-template-columns: 1fr; }
  .home-featured-body { padding: 28px 26px; }
  .about-grid         { grid-template-columns: 1fr; }
  .contact-grid       { grid-template-columns: 1fr; }
  .contact-form .form-row { grid-template-columns: 1fr; }
  .carousel-card      { flex-basis: 240px; }
}

/* ════════════════════════════════════════════════════════════════════
 * PRODUCT LANDING PAGE (product.php)
 * Rich layout: hero + features grid + screenshots + body+sidebar + cta
 * ════════════════════════════════════════════════════════════════════ */

/* HERO -------------------------------------------------------------- */
.product-hero {
  padding: 56px 0 40px;
  background:
    radial-gradient(ellipse 80% 60% at 80% 0%, var(--accent-soft), transparent 70%),
    radial-gradient(ellipse 60% 50% at 20% 100%, var(--brand-soft), transparent 70%);
  border-bottom: 1px solid var(--border);
}
.product-hero-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 48px;
  align-items: center;
}
.product-hero-cover {
  position: relative;          /* anchor for the platform badges overlay */
  border-radius: var(--radius-lg);
  overflow: visible;           /* so the platform badge can sit on the corner */
  background: transparent;
}
.product-hero-cover-frame {
  border-radius: var(--radius-lg);
  overflow: hidden;
  background: var(--bg2);
  border: 1px solid var(--border);
  box-shadow: var(--shadow);
}
.product-hero-cover img {
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 16 / 10;
  object-fit: cover;
  transition: opacity .18s ease;
}
/* v2.20.62 — Animated hero variants share the same 16:10 frame so the
   layout doesn't shift when the user toggles between video / Lottie /
   image at runtime. */
.product-hero-video {
  display: block;
  width: 100%;
  aspect-ratio: 16 / 10;
  object-fit: cover;
  background: var(--bg3);
}
.product-hero-lottie {
  display: block;
  width: 100%;
  aspect-ratio: 16 / 10;
  background: var(--bg3);
}
.product-hero-lottie svg { display: block; width: 100%; height: 100%; }
.product-hero-cover .cover-placeholder {
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--bg3);
  color: var(--text3);
}

/* ── v2.20.51 — Platform badges (Windows / Mac / WordPress / …) ─────────
 * Stacked horizontally in the TOP-LEFT corner of the hero cover. Each
 * badge is a coloured circle with a white SVG icon — pulled from
 * includes/platform_icons.php. */
.product-platform-badges {
  position: absolute;
  top: 12px;
  left: 12px;
  z-index: 4;
  display: flex;
  gap: 6px;
  pointer-events: none;        /* purely informational, no click target */
}
.platform-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 34px;
  height: 34px;
  border-radius: 50%;
  color: #fff;
  pointer-events: auto;
  cursor: default;
  /* v2.20.52 — Soft diffused halo around the badge so it lifts off the
   * cover image regardless of the photo behind it. Three layers:
   *   1. wide soft glow that fades out (the "halo")
   *   2. tighter drop shadow for the lift
   *   3. inset highlight on the rim to mimic a glossy chip
   */
  box-shadow:
    0 0 28px 4px rgba(15, 23, 42, .35),
    0 6px 14px rgba(15, 23, 42, .28),
    0 0 0 2px rgba(255, 255, 255, .35) inset;
}
.platform-badge svg { display: block; }

/* ── v2.20.51 — Thumbnail strip below the hero cover ────────────────────
 * Visible only when the product has more than the cover image (i.e. at
 * least one screenshot). Click a thumb → hero image swaps. */
.product-hero-thumbs {
  display: flex;
  gap: 10px;
  margin-top: 14px;
  padding: 4px 0;
  overflow-x: auto;
  scrollbar-width: thin;
}
.product-hero-thumb {
  flex: 0 0 auto;
  width: 96px;
  height: 60px;
  padding: 0;
  border: 2px solid var(--border);
  border-radius: 8px;
  background: var(--bg2);
  cursor: pointer;
  overflow: hidden;
  transition: border-color .15s, transform .15s, box-shadow .15s;
}
.product-hero-thumb img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.product-hero-thumb:hover {
  border-color: var(--accent);
  transform: translateY(-1px);
  box-shadow: 0 6px 16px rgba(249, 115, 22, .18);
}
.product-hero-thumb.is-active {
  border-color: var(--accent);
  box-shadow: 0 0 0 3px var(--accent-soft);
}

/* Mixed-mode tweak: thumbs sit on light bg in mixed body. */
[data-theme="mixed"] .product-hero-thumb {
  background: #fff;
  border-color: #e2e8f0;
}

.product-hero-body { display: flex; flex-direction: column; gap: 16px; }

.product-back-link {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 13px;
  font-weight: 500;
  color: var(--text2);
  text-decoration: none;
  width: fit-content;
}
.product-back-link:hover { color: var(--accent); }

.product-hero-meta {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}
.product-hero-meta .cat-badge {
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  padding: 4px 10px;
  border-radius: 999px;
  background: var(--accent-soft);
  color: var(--accent);
}
.product-version-pill {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11px;
  padding: 4px 10px;
  border-radius: 999px;
  background: var(--brand-soft);
  color: var(--brand);
}

.product-hero-title {
  font-size: var(--font-product-hero-title);
  line-height: 1.1;
  font-weight: 800;
  margin: 0;
  color: var(--text);
  letter-spacing: -0.02em;
}
.product-hero-tagline {
  font-size: var(--font-product-hero-tagline);
  line-height: 1.4;
  font-weight: 500;
  color: var(--text);
  margin: 0;
  opacity: 0.9;
}
.product-hero-short {
  font-size: 15px;
  line-height: 1.6;
  color: var(--text2);
  margin: 0;
}

.product-hero-cta {
  display: flex;
  align-items: center;
  gap: 16px;
  flex-wrap: wrap;
  margin-top: 8px;
}
.product-hero-price {
  font-size: 28px;
  font-weight: 700;
  color: var(--accent);
}
.product-hero-note {
  font-size: 12px;
  color: var(--text2);
  margin: -4px 0 0;
}

/* SECTION TITLES ---------------------------------------------------- */
.product-section-title {
  font-size: var(--font-section-title);
  font-weight: 700;
  margin: 0 0 28px;
  color: var(--text);
  letter-spacing: -0.01em;
}
.product-subsection-title {
  font-size: 18px;
  font-weight: 600;
  margin: 0 0 12px;
  color: var(--text);
}

/* FEATURES GRID ----------------------------------------------------- */
.product-features-section { padding: 64px 0; }
.product-features-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: 20px;
}
.product-feature {
  padding: 24px;
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  transition: all 0.2s;
}
.product-feature:hover {
  border-color: var(--border2);
  transform: translateY(-2px);
  box-shadow: var(--shadow-hover);
}
.product-feature-icon {
  font-size: 28px;
  line-height: 1;
  margin-bottom: 14px;
}
.product-feature-title {
  font-size: 16px;
  font-weight: 600;
  margin: 0 0 8px;
  color: var(--text);
}
.product-feature-desc {
  font-size: 14px;
  line-height: 1.55;
  color: var(--text2);
  margin: 0;
}
/* Compact rich-text override inside feature cards and FAQ answers — the
 * generic .product-rich-content paragraph spacing is meant for long-form
 * body copy and looks airy inside these tighter containers. */
.product-feature-desc.product-rich-content { font-size: 14px; line-height: 1.55; color: var(--text2); }
.product-feature-desc.product-rich-content p,
.product-feature-desc.product-rich-content ul,
.product-feature-desc.product-rich-content ol { margin: 0 0 6px; color: var(--text2); }
.product-feature-desc.product-rich-content :last-child { margin-bottom: 0; }

.product-faq-answer.product-rich-content { font-size: 14px; line-height: 1.6; }
.product-faq-answer.product-rich-content p,
.product-faq-answer.product-rich-content ul,
.product-faq-answer.product-rich-content ol { margin: 0 0 8px; }
.product-faq-answer.product-rich-content :last-child { margin-bottom: 0; }

.product-changelog.product-rich-content { font-family: inherit; padding: 18px 20px; white-space: normal; }
.product-changelog.product-rich-content p,
.product-changelog.product-rich-content ul,
.product-changelog.product-rich-content ol { margin: 0 0 10px; }
.product-changelog.product-rich-content :last-child { margin-bottom: 0; }

/* SCREENSHOTS ------------------------------------------------------- */
.product-screenshots-section {
  padding: 24px 0 64px;
  border-top: 1px solid var(--border);
}
.product-screenshots-grid {
  display: grid;
  /* v2.20.85 — Fixed 3-column grid so every screenshot is the same
   * size regardless of how many there are. Pre-2.20.85 we used
   * auto-fit with 1fr, which made a single screenshot stretch to fill
   * the whole row (looked enormous). With repeat(3, 1fr) the first 3
   * fill the row; any extras wrap; if there are only 1 or 2, they
   * keep the 1/3-width slot and the remaining columns stay empty —
   * exactly what the user asked for. The mobile breakpoint
   * (line ~2630 below) reduces to 2 columns at <=768px. */
  grid-template-columns: repeat(3, 1fr);
  gap: 14px;
  padding-top: 24px;
  /* Keep items pinned to the left so the empty slots in the last row
   * don't redistribute the remaining items to fill the gap. */
  justify-content: start;
}
.product-screenshot {
  display: block;
  overflow: hidden;
  border-radius: var(--radius-sm);
  border: 1px solid var(--border);
  background: var(--bg2);
  transition: transform 0.2s;
}
.product-screenshot:hover { transform: scale(1.02); }
.product-screenshot img {
  display: block;
  width: 100%;
  height: 100%;
  aspect-ratio: 16 / 10;
  object-fit: cover;
}
.product-screenshot { cursor: zoom-in; }

/* v2.20.82 — Lightbox modal for product screenshots ──────────────────
 * Plain CSS, no library. The grid thumbnails open this overlay; JS
 * positions the image at the clicked thumb's bounding-rect first and
 * then clears the transform — the browser tweens between the two
 * states for a smooth "zoom from thumb" effect.
 *
 * Backdrop is a flex container that centres the image. Clicking the
 * backdrop (anywhere outside the image) closes the modal — handled
 * in JS by comparing event.target === modal. */
.vbe-lightbox {
  position: fixed; inset: 0;
  z-index: 9000;
  display: flex; align-items: center; justify-content: center;
  background: rgba(8, 12, 22, 0);
  backdrop-filter: blur(0);
  transition: background .2s ease, backdrop-filter .2s ease;
  padding: 24px;
  cursor: zoom-out;
}
.vbe-lightbox.is-open {
  background: rgba(8, 12, 22, 0.88);
  backdrop-filter: blur(6px);
}
.vbe-lightbox[hidden] { display: none; }
body.vbe-lightbox-open { overflow: hidden; }

.vbe-lightbox-frame {
  margin: 0;
  max-width: min(85vw, 1400px);
  max-height: 85vh;
  pointer-events: none;        /* clicks on the white border fall to backdrop */
}
.vbe-lightbox-frame img {
  display: block;
  max-width: min(85vw, 1400px);
  max-height: 85vh;
  width: auto; height: auto;
  border-radius: 10px;
  box-shadow: 0 20px 60px rgba(0,0,0,0.5);
  transform-origin: center center;
  transition: transform .26s cubic-bezier(.2, .8, .2, 1), opacity .2s ease;
  cursor: default;
  pointer-events: auto;        /* image itself is not clickable through */
}

/* Close button (top-right) */
.vbe-lightbox-close {
  position: absolute; top: 16px; right: 16px;
  width: 40px; height: 40px;
  border-radius: 50%;
  background: rgba(255,255,255,0.12);
  border: 0;
  color: #fff;
  display: inline-flex; align-items: center; justify-content: center;
  cursor: pointer;
  transition: background .15s ease, transform .15s ease;
}
.vbe-lightbox-close:hover { background: rgba(255,255,255,0.22); transform: scale(1.06); }

/* Prev/Next nav arrows */
.vbe-lightbox-nav {
  position: absolute; top: 50%; transform: translateY(-50%);
  width: 44px; height: 44px;
  border-radius: 50%;
  background: rgba(255,255,255,0.10);
  border: 0;
  color: #fff;
  display: inline-flex; align-items: center; justify-content: center;
  cursor: pointer;
  transition: background .15s ease;
}
.vbe-lightbox-nav:hover { background: rgba(255,255,255,0.22); }
.vbe-lightbox-prev { left: 18px; }
.vbe-lightbox-next { right: 18px; }
@media (max-width: 640px) {
  .vbe-lightbox-nav { width: 38px; height: 38px; }
  .vbe-lightbox-prev { left: 8px; }
  .vbe-lightbox-next { right: 8px; }
}

/* Respect user preference */
@media (prefers-reduced-motion: reduce) {
  .vbe-lightbox, .vbe-lightbox-frame img { transition: none !important; }
}

/* BODY + SIDEBAR ---------------------------------------------------- */
.product-body-section {
  padding: 56px 0 72px;
  border-top: 1px solid var(--border);
  background: var(--bg2);
}
.product-body-grid {
  display: grid;
  grid-template-columns: 1fr 320px;
  gap: 48px;
  align-items: start;
}
.product-body-main { min-width: 0; }
.product-block { margin-top: 36px; }

/* Rich content from the TinyMCE editor */
.product-rich-content {
  font-size: 15px;
  line-height: 1.7;
  color: var(--text);
}
.product-rich-content p { margin: 0 0 14px; color: var(--text); }
.product-rich-content h2 {
  font-size: 20px;
  font-weight: 700;
  margin: 28px 0 12px;
  color: var(--text);
}
.product-rich-content h3 {
  font-size: 17px;
  font-weight: 600;
  margin: 22px 0 10px;
  color: var(--text);
}
.product-rich-content ul,
.product-rich-content ol { margin: 0 0 14px; padding-left: 22px; color: var(--text2); }
.product-rich-content li { margin-bottom: 6px; }
.product-rich-content a { color: var(--accent); text-decoration: underline; }
.product-rich-content code {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 13px;
  background: var(--bg3);
  padding: 2px 6px;
  border-radius: 4px;
  color: var(--accent);
}
.product-rich-content blockquote {
  margin: 16px 0;
  padding: 12px 16px;
  border-left: 3px solid var(--accent);
  background: var(--accent-soft);
  font-style: italic;
  color: var(--text);
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
}
.product-rich-content img {
  max-width: 100%;
  border-radius: var(--radius-sm);
  margin: 16px 0;
}

.product-changelog {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 13px;
  line-height: 1.6;
  background: var(--bg3);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 16px;
  white-space: pre-wrap;
  color: var(--text2);
}

/* FAQ accordion */
.product-faqs { display: flex; flex-direction: column; gap: 10px; }
.product-faq {
  background: var(--bg3);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  overflow: hidden;
}
.product-faq summary {
  padding: 14px 18px;
  font-size: 14px;
  font-weight: 600;
  color: var(--text);
  cursor: pointer;
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
}
.product-faq summary::after {
  content: '+';
  font-size: 20px;
  color: var(--accent);
  transition: transform 0.2s;
}
.product-faq[open] summary::after { content: '−'; }
.product-faq summary::-webkit-details-marker { display: none; }
.product-faq-answer {
  padding: 0 18px 16px;
  font-size: 14px;
  line-height: 1.6;
  color: var(--text2);
  white-space: pre-line;
}

/* SIDEBAR ----------------------------------------------------------- */
.product-sidebar { position: sticky; top: 88px; }
.product-sidebar-card {
  padding: 24px;
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
}
.product-sidebar-price {
  font-size: 32px;
  font-weight: 800;
  color: var(--accent);
  margin-bottom: 4px;
}

.product-spec-list {
  margin-top: 22px;
  padding-top: 18px;
  border-top: 1px solid var(--border);
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.product-spec-row {
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size: 13px;
  padding: 4px 0;
}
.product-spec-label { color: var(--text2); }
.product-spec-val   { color: var(--text); font-weight: 500; }

.product-trust-grid {
  margin-top: 18px;
  padding-top: 16px;
  border-top: 1px solid var(--border);
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
}
.product-trust-item {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 12px;
  color: var(--text2);
}
.product-trust-item span { font-size: 14px; }

/* BOTTOM CTA -------------------------------------------------------- */
.product-bottom-cta {
  padding: 56px 0;
  background:
    radial-gradient(ellipse 60% 80% at 50% 100%, var(--accent-soft), transparent 70%),
    var(--bg);
  border-top: 1px solid var(--border);
}
.product-bottom-inner {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 28px;
  flex-wrap: wrap;
}
.product-bottom-inner h3 {
  font-size: 24px;
  font-weight: 700;
  margin: 0 0 6px;
  color: var(--text);
}
.product-bottom-inner p {
  font-size: 14px;
  color: var(--text2);
  margin: 0;
}

/* MOBILE ------------------------------------------------------------ */
@media (max-width: 920px) {
  .product-hero-grid  { grid-template-columns: 1fr; gap: 32px; }
  .product-hero-title { font-size: 32px; }
  .product-hero-tagline { font-size: 17px; }
  .product-body-grid  { grid-template-columns: 1fr; gap: 32px; }
  .product-sidebar    { position: static; }
  .product-bottom-inner { flex-direction: column; align-items: flex-start; text-align: left; }
  .product-features-section { padding: 48px 0; }
}

/* ════════════════════════════════════════════════════════════════════
 * RESPONSIVE OVERHAUL (v2.8.4)
 * Consolidated mobile-first adjustments that didn't fit cleanly inside
 * the per-section blocks above. Three breakpoints:
 *   ≤ 1024 px   tablet  → reduce paddings, allow 2-col grids
 *   ≤ 768  px   mobile  → single-col grids, slide-in nav, tighter spacing
 *   ≤ 480  px   small   → smaller hero, narrower header chrome
 * ════════════════════════════════════════════════════════════════════ */

/* TABLET -------------------------------------------------------------- */
@media (max-width: 1024px) {
  .container { padding: 0 20px; }
  .home-featured-card  { grid-template-columns: 1fr; }
  .home-featured-body  { padding: 28px 24px; }
  .product-hero        { padding: 40px 0 32px; }
  .product-features-grid { grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); }
}

/* MOBILE (the main breakpoint — everything stacks to one column) ----- */
@media (max-width: 768px) {
  /* Container + general spacing */
  .container { padding: 0 16px; }
  main       { padding-top: 0; }

  /* Header: nav becomes a slide-down drawer triggered by .nav-open on body */
  .site-header             { position: relative; }
  .header-inner            { gap: 8px; }
  .main-nav {
    display: none;
    position: absolute;
    top: 100%; left: 0; right: 0;
    flex-direction: column;
    background: var(--bg2);
    border-bottom: 1px solid var(--border);
    padding: 8px 16px 16px;
    gap: 0;
    box-shadow: 0 12px 24px rgba(0,0,0,0.18);
    z-index: 95;
  }
  body.nav-open .main-nav { display: flex; }
  .main-nav a {
    padding: 14px 4px;
    border-bottom: 1px solid var(--border);
    font-size: 15px;
    min-height: 44px;       /* touch target */
    display: flex;
    align-items: center;
  }
  .main-nav a:last-child { border-bottom: none; }
  /* v2.20.63 — in mobile (vertical drawer) the underline trick from
     desktop floats in the wrong place, so we drop it and lean on the
     bold + accent color of .active alone. We also add a left accent
     bar to make it more obvious in the stacked layout. */
  .main-nav a:hover::after,
  .main-nav a.active::after { display: none; }
  .main-nav a.active {
    color: var(--accent);
    border-left: 3px solid var(--accent);
    padding-left: 10px;
  }

  /* Header actions tighten up — keep the cart, language, theme always visible */
  .header-actions { gap: 4px; }
  .btn-cart, .theme-toggle, .lang-switcher summary {
    width: 36px; height: 36px;
  }
  .lang-switcher .lang-current { display: none; }   /* icon-only on phone */
  .admin-shortcut-label { display: none; }
  .logo-group .brand   { font-size: 18px; }
  .logo-img            { max-height: 28px; }

  /* Hero: smaller breathing room, scale font down with the existing clamp */
  .home-hero            { padding: 64px 0 32px; }
  .home-hero-content    { padding: 0 4px; }
  .home-hero-ctas       { flex-direction: column; align-items: stretch; }
  .home-hero-ctas .btn-primary,
  .home-hero-ctas .btn-secondary { width: 100%; justify-content: center; }
  .home-hero-tagline    { font-size: 18px; }

  /* Storefront grid + filters */
  .store-grid          { grid-template-columns: 1fr; gap: 16px; }
  .store-layout        { grid-template-columns: 1fr; gap: 16px; }
  .store-sidebar       { position: fixed; inset: 0 auto 0 0; transform: translateX(-100%);
                         transition: transform 0.2s; z-index: 200; max-width: 320px;
                         background: var(--bg); padding: 20px; overflow-y: auto;
                         box-shadow: 4px 0 20px rgba(0,0,0,0.3); }
  .store-sidebar.open  { transform: translateX(0); }
  .store-toolbar       { flex-wrap: wrap; gap: 12px; }
  .store-toolbar-tools { flex-wrap: wrap; gap: 8px; }
  .store-search        { flex: 1 1 100%; }
  .home-carousel-section { padding: 32px 0 48px; }

  /* Product cards stack their footer cleanly */
  .product-card        { font-size: 14px; }
  .product-footer      { gap: 8px; }
  .product-actions     { width: 100%; }
  .product-actions .btn-buy { flex: 1; }

  /* Product detail page — everything single-column */
  .product-hero        { padding: 32px 0 24px; }
  .product-hero-cta    { flex-direction: column; align-items: stretch; }
  .product-hero-cta .btn-primary,
  .product-hero-cta .btn-secondary { width: 100%; justify-content: center; text-align: center; }
  .product-screenshots-grid { grid-template-columns: 1fr 1fr; gap: 10px; }
  .product-features-grid    { grid-template-columns: 1fr; gap: 14px; }
  .product-trust-grid       { grid-template-columns: 1fr 1fr; gap: 8px; }

  /* Blog grid */
  .posts-grid     { grid-template-columns: 1fr; gap: 18px; }
  .post-article   { padding: 32px 16px 48px !important; }

  /* About / contact */
  .about-grid     { grid-template-columns: 1fr; gap: 16px; }
  .contact-grid   { grid-template-columns: 1fr; gap: 24px; }
  .contact-form .form-row { grid-template-columns: 1fr; }

  /* Footer */
  .footer-inner   { flex-direction: column; align-items: flex-start; gap: 18px; text-align: left; }
  .footer-links   { flex-wrap: wrap; gap: 10px 16px; }

  /* Hero glow / decorative bits stay contained */
  .hero-glow      { transform: scale(0.7); }

  /* Touch-friendly buttons everywhere */
  .btn-primary, .btn-secondary, .btn-buy, .btn-detail {
    min-height: 40px;
    padding-left: 18px; padding-right: 18px;
  }
}

/* SMALL PHONES (≤ 480 px) — final compaction --------------------------- */
@media (max-width: 480px) {
  .container             { padding: 0 14px; }
  .home-hero-tagline     { font-size: 16px; }
  .home-hero-sub         { font-size: 14px; }
  .home-featured-tag     { font-size: 11px; }
  .home-featured-title   { font-size: 22px; }
  .product-hero-title    { font-size: 26px; }
  .product-hero-tagline  { font-size: 15px; }
  .product-section-title { font-size: 20px; }
  .product-screenshots-grid { grid-template-columns: 1fr; }
  .carousel-card         { flex-basis: 78vw; }
  .cart-ribbon-label, .cart-ribbon span { display: none; }
  .footer-links          { font-size: 13px; }
}

/* ════════════════════════════════════════════════════════════════════════════
 * v2.10.4 — Back-to-top + Cookie banner + Elegant blog redesign
 * ════════════════════════════════════════════════════════════════════════════ */

.footer-legal-row {
  margin-top: 6px;
  padding-top: 12px;
  border-top: 1px dashed var(--border);
  font-size: 12.5px;
  opacity: 0.75;
}

/* ── Back-to-top button ─────────────────────────────────────────────────── */
.back-to-top {
  position: fixed;
  right: 22px;
  bottom: 22px;
  width: 46px;
  height: 46px;
  border-radius: 50%;
  border: none;
  color: #fff;
  background: linear-gradient(135deg, var(--accent, #f97316) 0%, var(--accent2, #3b82f6) 100%);
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.25), 0 0 0 1px rgba(255, 255, 255, 0.08) inset;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 998;
  opacity: 0;
  transform: translateY(12px) scale(0.85);
  transition: opacity .24s ease, transform .24s cubic-bezier(.34, 1.56, .64, 1), box-shadow .2s;
}
.back-to-top.is-visible { opacity: 1; transform: translateY(0) scale(1); }
.back-to-top:hover     { transform: translateY(-2px) scale(1.04); box-shadow: 0 10px 28px rgba(249, 115, 22, .35); }
.back-to-top:active    { transform: translateY(0) scale(0.96); }
.back-to-top:focus-visible { outline: 3px solid var(--accent-soft, #fed7aa); outline-offset: 2px; }

body:has(.cookie-banner.is-visible) .back-to-top {
  bottom: calc(22px + var(--cookie-banner-h, 130px));
}

/* ── Cookie consent banner ──────────────────────────────────────────────── */
.cookie-banner {
  position: fixed;
  left: 16px;
  right: 16px;
  bottom: 16px;
  max-width: 720px;
  margin: 0 auto;
  background: var(--bg2, #fff);
  border: 1px solid var(--border, #e2e2e2);
  border-radius: 14px;
  padding: 18px 22px;
  box-shadow: 0 18px 48px rgba(0, 0, 0, 0.22), 0 0 0 1px rgba(255, 255, 255, 0.04) inset;
  z-index: 999;
  opacity: 0;
  transform: translateY(20px);
  transition: opacity .3s ease, transform .35s cubic-bezier(.22, 1, .36, 1);
}
.cookie-banner::before {
  content: "";
  position: absolute;
  inset: -1px -1px auto -1px;
  height: 3px;
  border-radius: 14px 14px 0 0;
  background: linear-gradient(90deg, var(--accent, #f97316), var(--accent2, #3b82f6));
}
.cookie-banner.is-visible { opacity: 1; transform: translateY(0); }
.cookie-banner-inner {
  display: flex;
  align-items: center;
  gap: 20px;
  flex-wrap: wrap;
}
.cookie-banner-text { flex: 1 1 280px; }
.cookie-banner-title {
  font-size: 15px;
  font-weight: 600;
  margin: 0 0 4px;
  color: var(--text, #111);
}
.cookie-banner-body {
  font-size: 13px;
  line-height: 1.5;
  margin: 0;
  color: var(--text2, #555);
}
.cookie-banner-actions {
  display: flex;
  gap: 8px;
  flex-shrink: 0;
}
.cookie-btn-reject, .cookie-btn-accept {
  font-size: 13px;
  padding: 9px 16px;
  font-weight: 600;
}

@media (max-width: 540px) {
  .cookie-banner       { left: 10px; right: 10px; bottom: 10px; padding: 14px 16px; }
  .cookie-banner-inner { gap: 12px; }
  .cookie-banner-actions { width: 100%; }
  .cookie-btn-reject, .cookie-btn-accept { flex: 1; justify-content: center; }
  .back-to-top         { right: 14px; bottom: 14px; width: 42px; height: 42px; }
}

/* ════════════════════════════════════════════════════════════════════════════
 * Blog redesign — magazine-style, more typographic personality
 * ════════════════════════════════════════════════════════════════════════════ */

/* ── Blog INDEX (blog.php) ─────────────────────────────────────────────── */
.blog-hero-intro {
  position: relative;
  padding: 56px 0 28px;
  isolation: isolate;
}
.blog-hero-intro::before {
  content: "";
  position: absolute;
  inset: 0 -200px;
  z-index: -1;
  background:
    radial-gradient(60% 80% at 20% 30%, rgba(249,115,22,0.08), transparent 60%),
    radial-gradient(50% 70% at 80% 40%, rgba(59,130,246,0.07),  transparent 60%);
  pointer-events: none;
}
.blog-eyebrow {
  display: inline-block;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--accent);
  margin-bottom: 14px;
}
.blog-hero-title {
  font-size: clamp(34px, 5vw, 56px);
  font-weight: 700;
  letter-spacing: -0.025em;
  line-height: 1.05;
  margin-bottom: 16px;
  background: linear-gradient(180deg, var(--text) 0%, var(--text2) 130%);
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
}
.blog-hero-sub {
  font-size: clamp(15px, 1.5vw, 18px);
  color: var(--text2);
  max-width: 620px;
  line-height: 1.55;
  margin: 0;
}

.post-card.is-featured {
  grid-column: 1 / -1;
  flex-direction: row;
  align-items: stretch;
  min-height: 320px;
}
.post-card.is-featured .post-card-cover {
  flex: 1.2 0 50%;
  aspect-ratio: auto;
  min-height: 280px;
}
.post-card.is-featured .post-card-body {
  flex: 1 0 50%;
  padding: 32px 36px;
  justify-content: center;
}
.post-card.is-featured .post-card-title { font-size: clamp(22px, 2.4vw, 30px); line-height: 1.2; letter-spacing: -0.015em; }
.post-card.is-featured .post-card-excerpt { font-size: 15px; -webkit-line-clamp: 4; margin-bottom: 18px; }
.post-card.is-featured .post-card-link { font-size: 14px; }
@media (max-width: 760px) {
  .post-card.is-featured              { flex-direction: column; min-height: 0; }
  .post-card.is-featured .post-card-cover { min-height: 0; aspect-ratio: 16/9; }
  .post-card.is-featured .post-card-body  { padding: 22px 24px 26px; }
}

.post-card {
  border-radius: 18px;
  transition: transform .35s cubic-bezier(.22, 1, .36, 1), box-shadow .35s, border-color .25s;
  box-shadow: 0 1px 0 rgba(255,255,255,0.04) inset, 0 4px 16px rgba(0,0,0,0.08);
  position: relative;
}
.post-card::after {
  content: "";
  position: absolute;
  inset: -1px;
  border-radius: inherit;
  padding: 1px;
  background: linear-gradient(135deg, var(--accent), var(--accent2));
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
          mask-composite: exclude;
  opacity: 0;
  transition: opacity .35s;
  pointer-events: none;
}
.post-card:hover {
  transform: translateY(-4px);
  box-shadow: 0 18px 40px rgba(0,0,0,0.16);
  border-color: transparent;
}
.post-card:hover::after { opacity: 0.7; }

.post-cover-placeholder {
  background: linear-gradient(135deg, color-mix(in srgb, var(--accent) 18%, var(--bg3)) 0%, color-mix(in srgb, var(--accent2) 18%, var(--bg3)) 100%);
  color: rgba(255, 255, 255, 0.7);
  position: relative;
}
.post-cover-placeholder::after {
  content: "";
  position: absolute;
  inset: 0;
  background-image: radial-gradient(rgba(255,255,255,0.04) 1px, transparent 1px);
  background-size: 8px 8px;
  pointer-events: none;
}

/* ── Single post (post.php) ─────────────────────────────────────────────── */
.post-back-link {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 13px;
  color: var(--text2);
  text-decoration: none;
  margin-bottom: 28px;
  padding: 6px 12px 6px 8px;
  border-radius: 999px;
  background: var(--bg2);
  border: 1px solid var(--border);
  transition: all .2s;
}
.post-back-link:hover { color: var(--accent); border-color: var(--accent); transform: translateX(-2px); }

.post-hero {
  text-align: center;
  padding: 12px 0 30px;
  margin-bottom: 36px;
  border-bottom: 1px solid var(--border);
}
.post-hero .post-meta-row {
  justify-content: center;
  margin-bottom: 18px;
}
.post-title {
  font-size: clamp(30px, 4.5vw, 50px) !important;
  font-weight: 700;
  letter-spacing: -0.025em;
  line-height: 1.08;
  margin: 0 auto 18px !important;
  max-width: 18ch;
  color: var(--text);
  background: linear-gradient(180deg, var(--text) 0%, var(--text2) 140%);
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
}
.post-excerpt {
  font-size: clamp(16px, 1.6vw, 19px) !important;
  color: var(--text2);
  line-height: 1.55;
  margin: 0 auto !important;
  max-width: 60ch;
  font-weight: 400;
  font-style: italic;
}

.post-cover {
  margin: 38px -8% 40px !important;
  border-radius: 20px !important;
  overflow: hidden;
  border: 1px solid var(--border);
  box-shadow: 0 24px 60px rgba(0,0,0,0.22);
}
.post-cover img { width: 100%; display: block; transition: transform .8s; }
.post-cover:hover img { transform: scale(1.02); }
@media (max-width: 820px) {
  .post-cover { margin: 30px 0 32px !important; border-radius: 14px !important; }
}

.post-meta-row {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  font-size: 13px;
  color: var(--text2);
  margin-bottom: 16px !important;
}
.post-reading-time {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  color: var(--text3);
}
.post-reading-time svg { width: 13px; height: 13px; }

.post-content {
  font-size: 17.5px;
  line-height: 1.75;
  color: var(--text);
  font-family: 'Charter', 'Iowan Old Style', 'Georgia', ui-serif, serif;
}
.post-content > p:first-of-type::first-letter {
  float: left;
  font-size: 4.2em;
  line-height: 0.9;
  font-weight: 700;
  padding: 8px 12px 0 0;
  margin-top: 4px;
  background: linear-gradient(135deg, var(--accent), var(--accent2));
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
  font-family: 'Space Grotesk', sans-serif;
}
.post-content h2 {
  font-family: 'Space Grotesk', sans-serif;
  font-size: 28px !important;
  font-weight: 700;
  margin: 48px 0 16px !important;
  color: var(--text);
  letter-spacing: -0.015em;
  position: relative;
  padding-left: 18px;
}
.post-content h2::before {
  content: "";
  position: absolute;
  left: 0;
  top: 12px;
  bottom: 12px;
  width: 4px;
  border-radius: 4px;
  background: linear-gradient(180deg, var(--accent), var(--accent2));
}
.post-content h3 {
  font-family: 'Space Grotesk', sans-serif;
  font-size: 22px !important;
  font-weight: 600;
  margin: 36px 0 12px !important;
  color: var(--text);
  letter-spacing: -0.01em;
}
.post-content h4 {
  font-family: 'Space Grotesk', sans-serif;
  font-size: 13px !important;
  font-weight: 600;
  margin: 28px 0 10px !important;
  color: var(--text2);
  text-transform: uppercase;
  letter-spacing: 0.08em;
}
.post-content p  { margin: 0 0 22px; }
.post-content a  {
  color: var(--accent);
  text-decoration: underline;
  text-decoration-thickness: 1.5px;
  text-underline-offset: 4px;
  text-decoration-color: color-mix(in srgb, var(--accent) 40%, transparent);
  transition: text-decoration-color .2s, color .2s;
}
.post-content a:hover {
  color: var(--accent2);
  text-decoration-color: var(--accent2);
}
.post-content ul, .post-content ol { margin: 0 0 22px 26px; }
.post-content li { margin-bottom: 8px; }
.post-content li::marker { color: var(--accent); font-weight: 700; }

.post-content blockquote {
  border-left: 0 !important;
  margin: 32px 0;
  padding: 26px 32px !important;
  background: linear-gradient(135deg, color-mix(in srgb, var(--accent) 8%, var(--bg2)) 0%, color-mix(in srgb, var(--accent2) 6%, var(--bg2)) 100%);
  border-radius: 12px;
  font-size: 1.05em;
  font-style: italic;
  color: var(--text);
  position: relative;
  font-family: 'Space Grotesk', sans-serif;
}
.post-content blockquote::before {
  content: "\201C";
  position: absolute;
  top: -8px;
  left: 18px;
  font-size: 64px;
  line-height: 1;
  color: var(--accent);
  opacity: 0.4;
  font-family: 'Georgia', serif;
}
.post-content blockquote p:last-child { margin-bottom: 0; }

.post-content pre:not(.vbe-code) {
  background: var(--bg3);
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 18px 20px;
  overflow-x: auto;
  margin: 24px 0;
  font-size: 14px;
  line-height: 1.5;
}
.post-content pre:not(.vbe-code) code {
  background: none;
  border: 0;
  padding: 0;
  font-size: inherit;
  color: inherit;
}
.post-content img {
  max-width: 100%;
  height: auto;
  border-radius: 10px;
  margin: 28px 0;
  border: 1px solid var(--border);
}
.post-content hr {
  border: 0;
  border-top: 1px solid var(--border);
  margin: 40px auto;
  width: 80px;
  position: relative;
}
.post-content hr::after {
  content: "\2726";
  position: absolute;
  top: -11px;
  left: 50%;
  transform: translateX(-50%);
  background: var(--bg);
  padding: 0 10px;
  color: var(--accent);
  font-size: 14px;
}

.post-footer-meta {
  margin-top: 56px;
  padding-top: 28px;
  border-top: 1px solid var(--border);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
}
.post-share {
  display: flex;
  gap: 8px;
  align-items: center;
}
.post-share-label {
  font-size: 12px;
  color: var(--text2);
  text-transform: uppercase;
  letter-spacing: 0.08em;
  margin-right: 4px;
}
.post-share-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  border-radius: 50%;
  border: 1px solid var(--border);
  background: var(--bg2);
  color: var(--text2);
  text-decoration: none;
  transition: all .2s;
  cursor: pointer;
}
.post-share-btn:hover {
  color: #fff;
  background: linear-gradient(135deg, var(--accent), var(--accent2));
  border-color: transparent;
  transform: translateY(-2px);
}

.related-posts-section {
  margin-top: 80px;
  padding: 56px 0 40px;
  background: var(--bg2);
  border-top: 1px solid var(--border);
}
.related-posts-section h2 {
  font-size: 14px;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  text-align: center;
  color: var(--text2);
  margin-bottom: 28px;
}
.related-posts-section h2 span {
  background: linear-gradient(90deg, var(--accent), var(--accent2));
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
}

/* ════════════════════════════════════════════════════════════════════════════
 * v2.10.8 — Shortcode widgets + asset panel
 * ════════════════════════════════════════════════════════════════════════════
 * Used by: post.php (rendered output of [download], [callout], etc.)
 *          + admin/posts/add.php (right-column drag-drop assets panel).
 */

/* ── [download id="N"] ─────────────────────────────────────────────────── */
.sc-download {
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 14px 18px;
  margin: 22px 0;
  background: var(--bg2);
  border: 1px solid var(--border);
  border-left: 4px solid var(--accent);
  border-radius: 12px;
  text-decoration: none !important;
  color: var(--text) !important;
  transition: transform .2s cubic-bezier(.22, 1, .36, 1), border-color .2s, box-shadow .25s;
  position: relative;
  font-family: 'Space Grotesk', sans-serif;
}
.sc-download:hover {
  transform: translateY(-2px);
  border-color: var(--accent);
  box-shadow: 0 8px 24px rgba(249, 115, 22, .15);
}
.sc-download-icon {
  width: 44px; height: 44px;
  border-radius: 50%;
  background: linear-gradient(135deg, var(--accent), var(--accent2));
  color: #fff;
  display: flex; align-items: center; justify-content: center;
  flex-shrink: 0;
}
.sc-download-body { flex: 1; min-width: 0; }
.sc-download-label {
  display: block;
  font-size: 15px;
  font-weight: 600;
  color: var(--text);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.sc-download-meta {
  display: flex;
  gap: 10px;
  margin-top: 4px;
  font-size: 12px;
  color: var(--text2);
  align-items: center;
}
.sc-download-ext {
  padding: 1px 7px;
  border-radius: 4px;
  background: var(--bg3);
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  color: var(--accent);
}
.sc-download-cta {
  padding: 8px 16px;
  border-radius: 8px;
  background: var(--accent);
  color: #fff !important;
  font-size: 13px;
  font-weight: 600;
  flex-shrink: 0;
  transition: background .2s;
}
.sc-download:hover .sc-download-cta { background: var(--accent2); }

@media (max-width: 600px) {
  .sc-download { flex-direction: column; align-items: flex-start; gap: 10px; }
  .sc-download-cta { width: 100%; text-align: center; }
}

/* ── [button url label style] ──────────────────────────────────────────── */
.sc-button {
  display: inline-block;
  padding: 11px 22px;
  border-radius: 8px;
  text-decoration: none !important;
  font-size: 14px;
  font-weight: 600;
  margin: 4px 6px 4px 0;
  transition: all .2s;
  font-family: 'Space Grotesk', sans-serif;
}
.sc-button-primary {
  background: linear-gradient(135deg, var(--accent), var(--accent2));
  color: #fff !important;
  box-shadow: 0 4px 14px rgba(249, 115, 22, .2);
}
.sc-button-primary:hover { transform: translateY(-1px); box-shadow: 0 6px 20px rgba(249, 115, 22, .3); }
.sc-button-secondary {
  background: var(--bg2);
  color: var(--text) !important;
  border: 1px solid var(--border);
}
.sc-button-secondary:hover { border-color: var(--accent); }
.sc-button-ghost {
  background: transparent;
  color: var(--accent) !important;
  border: 1px solid var(--accent);
}
.sc-button-ghost:hover { background: var(--accent-soft); }

/* ── [callout type="..." title="..."]...[/callout] ────────────────────── */
.sc-callout {
  margin: 24px 0;
  padding: 18px 22px;
  border-radius: 12px;
  border-left: 4px solid;
  background: var(--bg2);
  font-family: 'Space Grotesk', sans-serif;
}
.sc-callout-title {
  font-size: 14px;
  font-weight: 700;
  margin-bottom: 8px;
  display: flex; align-items: center; gap: 8px;
}
.sc-callout-body { font-size: 14.5px; line-height: 1.6; color: var(--text); }
.sc-callout-body p:last-child { margin-bottom: 0; }
.sc-callout-tip    { border-color: #22c55e; background: color-mix(in srgb, #22c55e 8%, var(--bg2)); }
.sc-callout-warn   { border-color: #f59e0b; background: color-mix(in srgb, #f59e0b 8%, var(--bg2)); }
.sc-callout-note   { border-color: var(--accent2); background: color-mix(in srgb, var(--accent2) 8%, var(--bg2)); }
.sc-callout-danger { border-color: #ef4444; background: color-mix(in srgb, #ef4444 10%, var(--bg2)); }

/* ── [product id="N"] mini-card ────────────────────────────────────────── */
.sc-product {
  display: flex;
  gap: 16px;
  margin: 22px 0;
  padding: 14px;
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: 14px;
  text-decoration: none !important;
  color: var(--text) !important;
  transition: transform .25s cubic-bezier(.22, 1, .36, 1), box-shadow .25s, border-color .2s;
}
.sc-product:hover { transform: translateY(-2px); border-color: var(--accent); box-shadow: 0 8px 24px rgba(0,0,0,.1); }
.sc-product-img {
  width: 90px; height: 90px;
  object-fit: cover;
  border-radius: 8px;
  flex-shrink: 0;
  background: linear-gradient(135deg, color-mix(in srgb, var(--accent) 20%, var(--bg3)), color-mix(in srgb, var(--accent2) 20%, var(--bg3)));
}
.sc-product-img-placeholder { background: linear-gradient(135deg, color-mix(in srgb, var(--accent) 18%, var(--bg3)), color-mix(in srgb, var(--accent2) 18%, var(--bg3))); }
.sc-product-body { flex: 1; min-width: 0; display: flex; flex-direction: column; justify-content: center; }
.sc-product-name  { font-size: 16px; font-weight: 600; margin-bottom: 4px; }
.sc-product-desc  { font-size: 13px; color: var(--text2); margin-bottom: 6px; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; }
.sc-product-price { font-size: 15px; font-weight: 700; color: var(--accent); font-family: 'JetBrains Mono', ui-monospace, monospace; }

/* ── [youtube id="..."] responsive 16:9 ────────────────────────────────── */
.sc-youtube {
  margin: 24px 0;
  border-radius: 12px;
  overflow: hidden;
  border: 1px solid var(--border);
  aspect-ratio: 16 / 9;
  width: 100%;
  background: #000;
}
.sc-youtube iframe { width: 100%; height: 100%; border: 0; display: block; }

/* ════════════════════════════════════════════════════════════════════════════
 * Admin — right-column assets panel (only loaded inside admin pages but the
 * CSS file is shared; selectors are namespaced enough to not collide).
 * ════════════════════════════════════════════════════════════════════════════ */
.asset-dropzone {
  border: 2px dashed var(--border);
  border-radius: 10px;
  padding: 22px 12px;
  text-align: center;
  cursor: pointer;
  color: var(--text2);
  transition: all .18s;
  background: var(--bg);
}
.asset-dropzone:hover         { border-color: var(--accent); color: var(--accent); }
.asset-dropzone.is-drag       { border-color: var(--accent); background: color-mix(in srgb, var(--accent) 10%, var(--bg)); color: var(--accent); transform: scale(1.02); }

.asset-list { list-style: none; padding: 0; margin: 14px 0 0; max-height: 360px; overflow-y: auto; }
.asset-item {
  display: flex; align-items: center; gap: 8px;
  padding: 8px 10px;
  margin-bottom: 6px;
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: 8px;
  transition: border-color .15s;
}
.asset-item:hover { border-color: var(--accent); }
.asset-item-main { flex: 1; min-width: 0; }
.asset-item-name {
  font-size: 12.5px; font-weight: 500;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  color: var(--text);
}
.asset-item-meta {
  display: flex; gap: 5px;
  font-size: 10.5px; color: var(--text3);
  margin-top: 2px;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
}
.asset-item-actions { display: flex; gap: 4px; flex-shrink: 0; }
.asset-btn {
  background: transparent;
  border: 1px solid var(--border);
  border-radius: 5px;
  width: 26px; height: 26px;
  display: flex; align-items: center; justify-content: center;
  cursor: pointer;
  color: var(--text2);
  transition: all .15s;
}
.asset-btn:hover { border-color: var(--accent); color: var(--accent); }
.asset-btn-danger:hover { border-color: #ef4444; color: #ef4444; }

/* Custom scrollbar for the asset list (lightweight, scoped) */
.asset-list::-webkit-scrollbar { width: 6px; }
.asset-list::-webkit-scrollbar-track { background: transparent; }
.asset-list::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }
.asset-list::-webkit-scrollbar-thumb:hover { background: var(--accent); }

/* ════════════════════════════════════════════════════════════════════════════
 * v2.10.9 — Sale ribbon + dual price
 * ════════════════════════════════════════════════════════════════════════════ */

/* ── Diagonal "OFERTA" ribbon, top-right corner of the card ──────────────
 * Implementation notes:
 *  - The card already uses `overflow: hidden` so the ribbon would clip.
 *    We DON'T change that — instead the ribbon's outer container is sized
 *    so the visible band fits exactly inside the corner with the rotated
 *    text running edge-to-edge of the diagonal.
 *  - `.has-sale-ribbon` opt-in class on the card so the ribbon CSS only
 *    runs when the admin actually enabled it. Avoids any reflow cost on
 *    cards without the ribbon.
 *  - Z-index ladder: cover image (auto) → ribbon (3) → cart-ribbon (4).
 */
.product-card.has-sale-ribbon { position: relative; }

.product-card .sale-ribbon {
  position: absolute;
  top: 0;
  right: 0;
  width: 110px;
  height: 110px;
  overflow: hidden;
  pointer-events: none;
  z-index: 3;
}
.product-card .sale-ribbon span {
  position: absolute;
  display: block;
  width: 160px;
  padding: 6px 0;
  /* v2.20.91 — colour comes from inline --ribbon-bg / --ribbon-fg
   * custom properties set by product_card.php, so every ribbon type
   * (sale, blackfriday, cybermonday, …) shares this geometry but its
   * own palette. Fallback to the original red→orange gradient when
   * the inline vars aren't set (back-compat). */
  background: var(--ribbon-bg, linear-gradient(135deg, #dc2626 0%, #ef4444 60%, #f97316 100%));
  color: var(--ribbon-fg, #fff);
  font-family: 'Space Grotesk', system-ui, sans-serif;
  font-size: 11.5px;
  font-weight: 800;
  letter-spacing: 0.18em;
  text-align: center;
  text-transform: uppercase;
  /* Place the band along the corner diagonal. The 28px right + 22px top
     plus 45° rotate is the magic combo for a 110×110 corner. */
  transform: rotate(45deg);
  top: 24px;
  right: -42px;
  box-shadow: 0 2px 8px rgba(0, 0, 0, .25), 0 0 0 1px rgba(255, 255, 255, .12) inset;
  text-shadow: 0 1px 1px rgba(0, 0, 0, .25);
}

/* Variant for the carousel card (slightly smaller corner) */
.carousel-card.has-sale-ribbon { position: relative; }
.carousel-card .sale-ribbon    { width: 92px; height: 92px; position: absolute; top: 0; right: 0; overflow: hidden; pointer-events: none; z-index: 3; }
.carousel-card .sale-ribbon span {
  position: absolute; display: block; width: 140px; padding: 5px 0;
  background: var(--ribbon-bg, linear-gradient(135deg, #dc2626 0%, #ef4444 60%, #f97316 100%));
  color: var(--ribbon-fg, #fff);
  font-family: 'Space Grotesk', system-ui, sans-serif;
  font-size: 10.5px; font-weight: 800; letter-spacing: 0.16em;
  text-align: center; text-transform: uppercase;
  transform: rotate(45deg); top: 20px; right: -38px;
  box-shadow: 0 2px 8px rgba(0, 0, 0, .25), 0 0 0 1px rgba(255, 255, 255, .12) inset;
}

/* ── Dual price (regular + sale) on the card ───────────────────────────── */
.price-group {
  display: inline-flex;
  align-items: baseline;
  gap: 8px;
  flex-wrap: wrap;
}
.price-sale {
  color: var(--accent);
  /* slightly larger than regular price to draw the eye */
  font-size: 1.05em;
}
.price-regular {
  color: var(--text3);
  font-family: 'JetBrains Mono', monospace;
  font-size: 0.78em;
  text-decoration: line-through;
  text-decoration-thickness: 1.5px;
  text-decoration-color: rgba(239, 68, 68, .6);
}
.price-savings {
  display: inline-block;
  padding: 2px 8px;
  border-radius: 999px;
  background: linear-gradient(135deg, #dc2626, #f97316);
  color: #fff;
  font-family: 'Space Grotesk', sans-serif;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.04em;
}

/* ── On the product page hero, larger version of the same idea ─────────── */
.product-hero-price.has-sale {
  display: inline-flex;
  align-items: baseline;
  gap: 14px;
  flex-wrap: wrap;
}
.product-hero-price .price-regular-big {
  color: var(--text3);
  font-family: 'JetBrains Mono', monospace;
  font-size: 0.55em;
  text-decoration: line-through;
  text-decoration-thickness: 2px;
  text-decoration-color: rgba(239, 68, 68, .6);
  font-weight: 500;
}
.product-hero-price .price-savings-big {
  display: inline-block;
  padding: 4px 12px;
  border-radius: 999px;
  background: linear-gradient(135deg, #dc2626, #f97316);
  color: #fff;
  font-family: 'Space Grotesk', sans-serif;
  font-size: 0.42em;
  font-weight: 700;
  letter-spacing: 0.06em;
  vertical-align: middle;
}

.product-sidebar-price.has-sale {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 4px;
}
.product-sidebar-price .price-regular-side {
  color: var(--text3);
  font-family: 'JetBrains Mono', monospace;
  font-size: 0.45em;
  text-decoration: line-through;
  text-decoration-thickness: 1.5px;
  text-decoration-color: rgba(239, 68, 68, .6);
  font-weight: 500;
}
.product-sidebar-price .price-savings-side {
  display: inline-block;
  padding: 2px 8px;
  border-radius: 999px;
  background: linear-gradient(135deg, #dc2626, #f97316);
  color: #fff;
  font-family: 'Space Grotesk', sans-serif;
  font-size: 0.35em;
  font-weight: 700;
  letter-spacing: 0.04em;
}

/* ── Ribbon on the product page hero (top-right of the cover image) ────── */
.product-hero-cover.has-sale-ribbon { position: relative; overflow: hidden; border-radius: var(--radius); }
.product-hero-cover .sale-ribbon { width: 140px; height: 140px; position: absolute; top: 0; right: 0; overflow: hidden; pointer-events: none; z-index: 3; }
.product-hero-cover .sale-ribbon span {
  position: absolute; display: block; width: 200px; padding: 8px 0;
  background: var(--ribbon-bg, linear-gradient(135deg, #dc2626 0%, #ef4444 60%, #f97316 100%));
  color: var(--ribbon-fg, #fff);
  font-family: 'Space Grotesk', system-ui, sans-serif;
  font-size: 13px; font-weight: 800; letter-spacing: 0.20em;
  text-align: center; text-transform: uppercase;
  transform: rotate(45deg); top: 32px; right: -54px;
  box-shadow: 0 4px 14px rgba(220, 38, 38, .3), 0 0 0 1px rgba(255, 255, 255, .12) inset;
  text-shadow: 0 1px 2px rgba(0, 0, 0, .25);
}

/* ════════════════════════════════════════════════════════════════════════════
 * v2.10.10 — Mixed theme
 * ════════════════════════════════════════════════════════════════════════════
 * Light background page + dark header / cards / footer / forms. Best of both
 * worlds: bright readable body areas, dramatic dark brand surfaces.
 *
 * Implementation: define a base "mostly light" palette like data-theme=light,
 * then override the SURFACE variables (bg2, bg3, header-bg, footer) and
 * card-related text colors so anything sitting on a card flips to dark.
 */
:root[data-theme="mixed"] {
  /* ── Mixed-theme root ──────────────────────────────────────────────────
   * The BODY in mixed mode is light, so every variable defined here uses
   * the SAME values as :root[data-theme="light"] — that way any element
   * sitting on the light body inherits LIGHT-mode colours and is exactly
   * as readable as in pure light mode (deep navy headings, slate body
   * text, darker brand accents calibrated for white).
   *
   * The only exception is --bg2 (dark elevated surfaces) — cards, header
   * and footer want to stay dark. But INSIDE those dark surfaces, the
   * variables are re-declared again (v2.11.1 block further down) using
   * dark-mode values, so child content is readable on dark too.
   *
   * Result: identical readability to pure light mode on the body,
   * identical readability to pure dark mode on cards/header/footer.
   */

  /* Light body background (same as light theme) */
  --bg:           #f7f9fc;
  /* Dark elevated surface — only used as default on header/footer/cards.
     Inside those, the v2.11.1 block re-declares it to dark. */
  --bg2:          #101728;
  --bg3:          #1a2238;
  --bg-elevated:  #101728;

  /* Text + brand: aligned with the LIGHT theme block (user-picked values
     using dark-mode bg tones as foreground darks). */
  --text:         #0a0e1a;
  --text2:        #101728;
  --text3:        #1a2238;
  --border:       rgba(15,23,42,0.10);
  --border2:      rgba(15,23,42,0.22);
  --brand:        #101728;
  --brand2:       #1a2238;
  --brand-deep:   #0a0e1a;
  --accent:       #ea580c;       /* darker orange for contrast on white */
  --accent2:      #f97316;
  --accent-soft:  rgba(234,88,12,0.14);
  --brand-soft:   rgba(37,99,235,0.10);
  --green:        #059669;
  --red:          #dc2626;
  --amber:        #d97706;

  --shadow:       0 4px 24px rgba(15,23,42,0.06), 0 0 0 1px rgba(15,23,42,0.04);
  --shadow-hover: 0 10px 36px rgba(15,23,42,0.10);
  --hero-glow:    radial-gradient(ellipse, rgba(234,88,12,0.14) 0%, rgba(37,99,235,0.08) 40%, transparent 70%);
  --header-bg:    rgba(16, 23, 40, 0.92);   /* dark translucent header on light page */
  color-scheme:   light;
}

/* ── Card surfaces flip to dark in mixed mode ────────────────────────────
   Cards live on bg2 which we already redefined to dark. We just need to
   force the inner text back to light so it reads correctly. */
[data-theme="mixed"] .product-card,
[data-theme="mixed"] .post-card,
[data-theme="mixed"] .form-card,
[data-theme="mixed"] .carousel-card,
[data-theme="mixed"] .product-sidebar-card,
[data-theme="mixed"] .about-card,
[data-theme="mixed"] .related-posts-section,
[data-theme="mixed"] .product-spec-list,
[data-theme="mixed"] .product-trust-grid {
  color: #e8edf7;
}
[data-theme="mixed"] .product-card .product-name,
[data-theme="mixed"] .product-card .product-desc,
[data-theme="mixed"] .post-card-title a,
[data-theme="mixed"] .post-card-excerpt,
[data-theme="mixed"] .post-card-meta,
[data-theme="mixed"] .carousel-card-title a,
[data-theme="mixed"] .carousel-card-price,
[data-theme="mixed"] .about-card h2,
[data-theme="mixed"] .about-card li,
[data-theme="mixed"] .about-card p {
  color: #e8edf7;
}
[data-theme="mixed"] .product-card .product-desc,
[data-theme="mixed"] .post-card-excerpt,
[data-theme="mixed"] .about-card p,
[data-theme="mixed"] .product-spec-label {
  color: #cbd5e1;
}
[data-theme="mixed"] .post-card-meta,
[data-theme="mixed"] .carousel-card-price,
[data-theme="mixed"] .product-spec-val {
  color: #94a3b8;
}
[data-theme="mixed"] .cat-badge {
  background: rgba(249, 115, 22, 0.18);
  color: #fdba74;
}
[data-theme="mixed"] .version,
[data-theme="mixed"] .product-version-pill,
[data-theme="mixed"] .compat-pill {
  background: rgba(59, 130, 246, 0.18);
  color: #93c5fd;
  border-color: rgba(59, 130, 246, 0.3);
}

/* ── Header stays dark, sticky on light body ────────────────────────────── */
[data-theme="mixed"] .site-header {
  background: var(--header-bg);
  backdrop-filter: blur(10px);
  border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
[data-theme="mixed"] .site-header .brand,
[data-theme="mixed"] .site-header a:not(.btn-primary):not(.btn-secondary) {
  color: #e8edf7;
}
[data-theme="mixed"] .site-header a:hover { color: var(--accent2); }
[data-theme="mixed"] .lang-switcher,
[data-theme="mixed"] .header-cart,
[data-theme="mixed"] .theme-toggle { color: #cbd5e1; }
[data-theme="mixed"] .theme-toggle:hover { color: var(--accent); }

/* ── Footer dark on light body ────────────────────────────────────────── */
[data-theme="mixed"] .site-footer {
  background: #101728;
  color: #cbd5e1;
  border-top: 1px solid rgba(255, 255, 255, 0.06);
}
[data-theme="mixed"] .site-footer a { color: #cbd5e1; }
[data-theme="mixed"] .site-footer a:hover { color: var(--accent2); }
[data-theme="mixed"] .footer-copy { color: #94a3b8; }

/* ── Hero sections keep light background to stand out ───────────────────── */
[data-theme="mixed"] .hero,
[data-theme="mixed"] .hero-section,
[data-theme="mixed"] .blog-hero-intro {
  background: var(--bg);
  color: var(--text);
}

/* ── Form inputs INSIDE dark cards need dark styling too ───────────────── */
[data-theme="mixed"] .form-card .form-control,
[data-theme="mixed"] .form-card .form-label {
  color: #e8edf7;
}
[data-theme="mixed"] .form-card .form-control {
  background: #0a0e1a;
  border-color: rgba(255, 255, 255, 0.1);
}

/* ── Theme toggle icon: show the mixed-mode glyph when active ──────────── */
.theme-toggle .icon-mixed { display: none; }
[data-theme="mixed"] .theme-toggle .icon-moon  { display: none; }
[data-theme="mixed"] .theme-toggle .icon-sun   { display: none; }
[data-theme="mixed"] .theme-toggle .icon-mixed { display: block; }

/* ════════════════════════════════════════════════════════════════════════════
 * v2.11.0 — Orange-gradient hover glow on cards (all themes)
 * ════════════════════════════════════════════════════════════════════════════
 * Reusable glow effect for any card-like surface on :hover. Composes the
 * existing box-shadow (depth) with a soft orange radial halo that bleeds
 * out from the card border, plus a subtle blue counter-glow on the opposite
 * corner for the brand gradient feel.
 *
 * Why a CSS variable: lets each card override its own glow intensity
 * without touching the colour. Default is calibrated to be visible on
 * dark, mixed and light themes without being garish.
 */
:root {
  --card-glow-orange: rgba(249, 115, 22, .35);
  --card-glow-orange-soft: rgba(249, 115, 22, .15);
  --card-glow-blue:   rgba(59, 130, 246, .18);
}
:root[data-theme="light"] {
  /* Light theme: dial down the orange a touch — pure white is more
     sensitive to colour bleed than dark. */
  --card-glow-orange:      rgba(234, 88, 12, .28);
  --card-glow-orange-soft: rgba(234, 88, 12, .12);
  --card-glow-blue:        rgba(37, 99, 235, .14);
}
:root[data-theme="mixed"] {
  /* Mixed theme: dark cards on light bg — glow should pop against both,
     so keep the brighter intensity. */
  --card-glow-orange:      rgba(249, 115, 22, .42);
  --card-glow-orange-soft: rgba(249, 115, 22, .18);
  --card-glow-blue:        rgba(59, 130, 246, .22);
}

/* The shared rule. Each selector targets a card class that already lifts
 * on hover via transform — we add the glow on top of (not replacing) the
 * existing :hover shadow. */
.product-card:hover,
.carousel-card:hover,
.post-card:hover,
.about-card:hover,
.sc-product:hover,
.tut-card:hover,
.tut-step:hover,
.media-page-card:hover,
.product-sidebar-card:hover,
.form-card:hover {
  box-shadow:
    /* Base depth shadow (kept reasonable) */
    0 14px 36px rgba(0, 0, 0, .12),
    /* Orange halo — softest layer first, sharper one on top */
    0  4px 18px var(--card-glow-orange-soft),
    0  0  28px var(--card-glow-orange),
    /* Blue counter-glow on the opposite side, low opacity */
    0  -2px 16px var(--card-glow-blue);
  /* Lift slightly more on hover so the glow has somewhere to fall */
  transform: translateY(-4px);
  transition:
    box-shadow .35s cubic-bezier(.22, 1, .36, 1),
    transform .35s cubic-bezier(.22, 1, .36, 1),
    border-color .25s;
}

/* The .form-card glow is too distracting inside the admin (it's a content
   container, not a clickable surface). Suppress it there. */
.admin-main .form-card:hover {
  box-shadow: var(--shadow);
  transform: none;
}

/* Reduce the lift for sub-card components that sit INSIDE another card. */
.product-sidebar-card:hover,
.tut-card:hover,
.tut-step:hover {
  transform: translateY(-2px);
}

/* Carousel cards need the glow not to spill out of the carousel container.
   The carousel already has padding-top + bottom to absorb the lift; the
   horizontal glow is fine because overflow-x: auto in the carousel doesn't
   clip a sibling element's box-shadow once the shadow is INSIDE the
   padded area. */
.carousel-card:hover {
  /* Slightly less aggressive lift on these (smaller cards) */
  transform: translateY(-3px);
}

/* Accessibility: respect prefers-reduced-motion just like the rest of the
   site. Keeps the colour glow but skips the lift / animation. */
@media (prefers-reduced-motion: reduce) {
  .product-card:hover,
  .carousel-card:hover,
  .post-card:hover,
  .about-card:hover,
  .sc-product:hover,
  .tut-card:hover,
  .tut-step:hover,
  .media-page-card:hover,
  .product-sidebar-card:hover {
    transform: none;
    transition: box-shadow .15s;
  }
}

/* ════════════════════════════════════════════════════════════════════════════
 * v2.11.1 — Mixed-theme fix: dark-surfaced containers re-inherit dark vars
 * ════════════════════════════════════════════════════════════════════════════
 *
 * In mixed mode the BODY is light but several surfaces stay dark (header,
 * footer, every card). The previous pass only set `color` on those surfaces,
 * which left child elements pulling LIGHT-theme values from the root for
 * variables like --text2, --border, --bg, --brand. Net effect:
 *
 *   - "edits" wordmark in header/footer used --text (#1e293b dark slate)
 *     and was invisible on the dark header surface.
 *   - .btn-detail in product cards used --text2 = #475569 (slate) and
 *     --border2 = rgba(15,23,42,.22) — both invisible on dark.
 *   - .product-sidebar-card used `background: var(--bg)` = #f7f9fc (light)
 *     with text color forced white → unreadable contrast.
 *
 * Fix: re-declare the relevant CSS custom properties INSIDE each dark
 * container in mixed mode, using the same values dark mode uses. Every
 * descendant then resolves to the dark palette automatically — no per-
 * component overrides needed.
 */

[data-theme="mixed"] .site-header,
[data-theme="mixed"] .site-footer,
[data-theme="mixed"] .product-card,
[data-theme="mixed"] .post-card,
[data-theme="mixed"] .carousel-card,
[data-theme="mixed"] .about-card,
[data-theme="mixed"] .product-sidebar-card,
[data-theme="mixed"] .form-card,
[data-theme="mixed"] .related-posts-section,
[data-theme="mixed"] .sc-callout,
[data-theme="mixed"] .sc-download {
  /* Dark-mode palette, copy-pasted from the :root block. Keeps the brand
     accents untouched so they're identical across themes. */
  --bg:          #0a0e1a;
  --bg2:         #101728;
  --bg3:         #1a2238;
  --bg-elevated: #101728;
  --text:        #e8edf7;
  --text2:       #94a3b8;
  --text3:       #64748b;
  --border:      rgba(255, 255, 255, 0.08);
  --border2:     rgba(255, 255, 255, 0.18);
  --brand:       #3b82f6;
  --brand2:      #60a5fa;
  --brand-deep:  #1e40af;
  --brand-soft:  rgba(59, 130, 246, 0.15);
  /* accent / accent2 / accent-soft inherited from root (already brand
     orange across all themes). */
}

/* ── product-sidebar-card uses background:var(--bg) which now resolves
 *    to #0a0e1a inside its own scope — but the *card itself* should
 *    sit on the dark elevated surface. Reset its background to bg2
 *    (the standard dark card surface). */
[data-theme="mixed"] .product-sidebar-card {
  background: #0a0e1a;
  border-color: rgba(255, 255, 255, 0.08);
}

/* ── About cards in mixed mode: the previous pass painted a gradient
 *    background using brand-soft colours that referenced the LIGHT root.
 *    Override to the dark surface so it matches the rest. */
[data-theme="mixed"] .about-card {
  background: var(--bg2);
  border-color: rgba(255, 255, 255, 0.08);
}
[data-theme="mixed"] .about-card-full {
  /* Keep the subtle gradient feel but in dark-theme tones. */
  background:
    linear-gradient(135deg,
      color-mix(in srgb, #f97316 14%, #101728) 0%,
      color-mix(in srgb, #3b82f6 10%, #101728) 100%);
  border-color: rgba(249, 115, 22, .25);
}

/* ── Button colours inside dark surfaces ─────────────────────────────── */
/* .btn-detail in mixed-mode dark cards: light text, light border, hover
 *  with accent. Mirrors how it looks in pure dark mode. */
[data-theme="mixed"] .product-card .btn-detail,
[data-theme="mixed"] .carousel-card .btn-detail {
  color: #cbd5e1;
  border-color: rgba(255, 255, 255, 0.16);
  background: transparent;
}
[data-theme="mixed"] .product-card .btn-detail:hover,
[data-theme="mixed"] .carousel-card .btn-detail:hover {
  color: #fff;
  border-color: var(--accent);
}

/* .btn-buy already uses accent → #fff which works everywhere. Make sure
 *  the in-cart green state stays readable too. */
[data-theme="mixed"] .product-card .btn-buy.in-cart,
[data-theme="mixed"] .carousel-card .btn-buy.in-cart {
  background: #16a34a;
  color: #fff;
}

/* Trust badges in the product sidebar: small text that used --text2.
 *  Now that --text2 is dark-mode slate inside the card, they pick the
 *  right colour automatically. Just adjust the icon container. */
[data-theme="mixed"] .product-trust-item { color: #cbd5e1; }

/* Spec rows inside the product sidebar */
[data-theme="mixed"] .product-spec-label { color: #94a3b8; }
[data-theme="mixed"] .product-spec-val   { color: #e8edf7; }

/* Cat badge inside dark cards reads orange-on-dark (same as pure dark). */
[data-theme="mixed"] .product-card .cat-badge,
[data-theme="mixed"] .carousel-card .cat-badge,
[data-theme="mixed"] .post-card .cat-badge {
  background: rgba(249, 115, 22, 0.18);
  color: #fdba74;
}

/* Version pill same idea */
[data-theme="mixed"] .product-card .version,
[data-theme="mixed"] .carousel-card .version,
[data-theme="mixed"] .product-version-pill,
[data-theme="mixed"] .compat-pill {
  background: rgba(59, 130, 246, 0.18);
  color: #93c5fd;
  border-color: rgba(59, 130, 246, 0.3);
}

/* "edits" wordmark in dark header + footer now resolves through the
 *  re-declared --text variable (= #e8edf7) so it pops white again.
 *  Belt-and-braces explicit rule in case anything overrides --text
 *  closer to the brand element. */
[data-theme="mixed"] .site-header .brand-edits,
[data-theme="mixed"] .site-footer .brand-edits {
  color: #e8edf7;
}
/* "VB" stays orange (the .brand-vb already uses var(--accent) which is
 *  the same hue across all themes). */

/* ════════════════════════════════════════════════════════════════════════════
 * v2.13.1 — Mixed theme: featured product card uses dark-mode internals
 * ════════════════════════════════════════════════════════════════════════════
 * The .home-featured-card on the homepage was missing from the v2.11.1
 * dark-surfaces block, so in mixed mode its contents inherited the
 * (now very dark) light-mode text vars and turned invisible on the
 * already-dark card background.
 *
 * Scope: ONLY .home-featured-card and its descendants. Nothing else
 * changes. Same recipe used for other dark surfaces in mixed mode —
 * re-declare the dark-mode palette inside this single container so
 * every child resolves to the right contrast automatically.
 */
[data-theme="mixed"] .home-featured-card {
  --bg:          #0a0e1a;
  --bg2:         #101728;
  --bg3:         #1a2238;
  --bg-elevated: #101728;
  --text:        #e8edf7;
  --text2:       #94a3b8;
  --text3:       #64748b;
  --border:      rgba(255, 255, 255, 0.08);
  --border2:     rgba(255, 255, 255, 0.18);
  --brand:       #3b82f6;
  --brand2:      #60a5fa;
  --brand-deep:  #1e40af;
  --brand-soft:  rgba(59, 130, 246, 0.15);
  /* accent/accent2/accent-soft inherited from root (orange across all themes) */
}

/* ════════════════════════════════════════════════════════════════════════════
 * v2.14.1 — Mixed theme: product-page sub-cards use dark-mode internals
 * ════════════════════════════════════════════════════════════════════════════
 * Same recipe used by v2.11.1 and v2.13.1: re-declare the dark-mode palette
 * inside each container that has a DARK background in mixed mode, so child
 * elements pick the right text/border/brand contrast automatically.
 *
 * Scope: ONLY the 3 sub-cards INSIDE /product/{slug} confirmed to use
 * --bg2 or --bg3 (both dark in mixed):
 *   - .product-feature       (Highlights grid items)
 *   - .product-faq           (FAQ accordion items)
 *   - .product-screenshot    (screenshot thumbnails)
 *
 * Nothing else is touched. The v2.11.1 block stays untouched. Reverting
 * is as simple as deleting this block.
 */
[data-theme="mixed"] .product-feature,
[data-theme="mixed"] .product-faq,
[data-theme="mixed"] .product-screenshot {
  --bg:          #0a0e1a;
  --bg2:         #101728;
  --bg3:         #1a2238;
  --bg-elevated: #101728;
  --text:        #e8edf7;
  --text2:       #94a3b8;
  --text3:       #64748b;
  --border:      rgba(255, 255, 255, 0.08);
  --border2:     rgba(255, 255, 255, 0.18);
  --brand:       #3b82f6;
  --brand2:      #60a5fa;
  --brand-deep:  #1e40af;
  --brand-soft:  rgba(59, 130, 246, 0.15);
  /* accent / accent2 / accent-soft inherited from root (orange across themes) */
}

/* ════════════════════════════════════════════════════════════════════════════
 * v2.15.2 — Mixed-mode readability for post blockquotes/pre + product body
 * ════════════════════════════════════════════════════════════════════════════
 * Two independent fixes, each in its own block per user request:
 *   A) Blog post quoted text + code blocks
 *   B) Product page description / body
 * Both follow the same recipe used in v2.11.1 / v2.13.1 / v2.14.1:
 * re-declare the dark-mode CSS custom properties inside the dark
 * container so every descendant text resolves to the right contrast.
 * Reverting either fix = delete that block.
 */

/* ── Block A: Blog post — blockquotes + plain <pre> code blocks ─────────
 * vbe-code blocks are styled separately (always dark, regardless of
 * theme), so they're excluded here via :not(.vbe-code). */
[data-theme="mixed"] .post-content blockquote,
[data-theme="mixed"] .post-content pre:not(.vbe-code) {
  --bg:          #0a0e1a;
  --bg2:         #101728;
  --bg3:         #1a2238;
  --bg-elevated: #101728;
  --text:        #e8edf7;
  --text2:       #94a3b8;
  --text3:       #64748b;
  --border:      rgba(255, 255, 255, 0.08);
  --border2:     rgba(255, 255, 255, 0.18);
  --brand:       #3b82f6;
  --brand2:      #60a5fa;
  --brand-deep:  #1e40af;
  --brand-soft:  rgba(59, 130, 246, 0.15);
  color: var(--text);  /* belt-and-braces: blockquote sometimes has its own color */
}
/* The italic blockquote inner paragraphs inherit color from the blockquote
 * via cascade — re-stating the rule keeps it explicit. */
[data-theme="mixed"] .post-content blockquote p,
[data-theme="mixed"] .post-content pre:not(.vbe-code),
[data-theme="mixed"] .post-content pre:not(.vbe-code) code {
  color: var(--text);
}

/* ── Block B: Product page — "Sobre este producto" + features + FAQs ──── */
[data-theme="mixed"] .product-body-section {
  --bg:          #0a0e1a;
  --bg2:         #101728;
  --bg3:         #1a2238;
  --bg-elevated: #101728;
  --text:        #e8edf7;
  --text2:       #94a3b8;
  --text3:       #64748b;
  --border:      rgba(255, 255, 255, 0.08);
  --border2:     rgba(255, 255, 255, 0.18);
  --brand:       #3b82f6;
  --brand2:      #60a5fa;
  --brand-deep:  #1e40af;
  --brand-soft:  rgba(59, 130, 246, 0.15);
}
/* The article body uses `.product-rich-content` for the WYSIWYG output.
 * Force its baseline text colour so paragraphs/headings inherit the
 * dark-mode foreground regardless of any inline-style colour on save. */
[data-theme="mixed"] .product-body-section .product-rich-content,
[data-theme="mixed"] .product-body-section .product-rich-content p,
[data-theme="mixed"] .product-body-section .product-rich-content li,
[data-theme="mixed"] .product-body-section .product-section-title,
[data-theme="mixed"] .product-body-section .product-subsection-title {
  color: var(--text);
}


/* ════════════════════════════════════════════════════════════════════════
 * v2.18.3 — Code blocks (TinyMCE → public site)
 *
 * Markup inserted by the editor's "Insert code block" button:
 *   <pre class="vbe-code" data-lang="php"><code class="language-php">…</code></pre>
 *
 * Prism.js (loaded via includes/partials/code_blocks.php only on pages
 * that need it) handles syntax highlighting. This stylesheet adds:
 *   - dark IDE-style chrome around the block
 *   - language label (top-left) from data-lang
 *   - Copy button (top-right) with success state
 *   - readable horizontal scrollbar for long lines (no word wrap)
 * ════════════════════════════════════════════════════════════════════════ */

/* v2.20.42 — vbe-code blocks MUST render dark in every theme (light /
 * dark / mixed). Prism-tomorrow is a dark-only theme; on a light page bg
 * the pink/red syntax tokens become unreadable. The :not(.vbe-code) on
 * .post-content pre (below) keeps light-mode plain <pre> blocks alone,
 * but our themed code block stays dark always. !important guards against
 * any future cascade collision. */
pre.vbe-code {
  position: relative;
  margin: 22px 0;
  /* Top padding reserves a clear "header bar" zone for the language label
   * (top:10px, ~18px tall) + Copy button so the FIRST line of code never
   * crowds or overlaps them. v2.23.5: bumped 44→54px after the label sat
   * too close to the code on real posts. */
  padding: 54px 18px 18px;
  background: #1e1e2e !important; /* matches prism-tomorrow palette */
  color: #e2e8f0 !important;
  border: 1px solid #313244 !important;
  border-radius: 10px;
  overflow: auto;                 /* horizontal scroll on long lines */
  font-family: ui-monospace, "Cascadia Mono", "Fira Code", Menlo, Consolas, monospace;
  font-size: 13.5px;
  line-height: 1.55;
  box-shadow: 0 6px 22px rgba(15, 23, 42, .15);
  tab-size: 4;
  -moz-tab-size: 4;
}

/* Override prism-tomorrow background so it matches our chrome */
pre.vbe-code[class*="language-"],
pre.vbe-code code[class*="language-"] {
  background: transparent;
  text-shadow: none;
}
pre.vbe-code code {
  display: block;
  background: transparent;
  padding: 0;
  font: inherit;
  color: inherit;
  white-space: pre;               /* preserve indentation, no wrap */
}

/* Language label — top-left */
.vbe-code-lang {
  position: absolute;
  top: 10px;
  left: 14px;
  font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: #94a3b8;
  background: rgba(255,255,255,.06);
  padding: 2px 8px;
  border-radius: 5px;
  user-select: none;
  pointer-events: none;
}

/* Copy button — top-right */
.vbe-code-copy {
  position: absolute;
  top: 8px;
  right: 8px;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  background: rgba(255,255,255,.06);
  color: #cbd5e1;
  border: 1px solid rgba(255,255,255,.10);
  border-radius: 6px;
  padding: 5px 10px;
  font-family: ui-sans-serif, system-ui, sans-serif;
  font-size: 11.5px;
  font-weight: 600;
  cursor: pointer;
  transition: background .12s, color .12s, border-color .12s;
}
.vbe-code-copy:hover {
  background: rgba(255,255,255,.12);
  color: #fff;
  border-color: rgba(255,255,255,.20);
}
.vbe-code-copy.is-copied {
  background: #16a34a;
  color: #fff;
  border-color: #16a34a;
}
.vbe-code-copy svg { opacity: .9; }
@media (max-width: 480px) {
  .vbe-code-copy-label { display: none; }
  .vbe-code-copy { padding: 6px; }
}

/* ── "Header bar" code-block style (Admin → Apariencia → code_block_style
 *    = 'bar'). The JS wraps the <pre> and puts the language label + Copy
 *    button in a real bar ABOVE the code, so they can never overlap the
 *    content regardless of padding/zoom/cache. The 'overlay' style keeps
 *    the absolute label/button rules above. */
.vbe-code-wrap {
  margin: 22px 0;
  border: 1px solid #313244;
  border-radius: 10px;
  overflow: hidden;
  background: #1e1e2e;
  box-shadow: 0 6px 22px rgba(15, 23, 42, .15);
}
.vbe-code-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  padding: 8px 12px;
  background: rgba(255, 255, 255, .04);
  border-bottom: 1px solid #313244;
}
/* Inside the bar the label + Copy button flow normally (not absolute). */
.vbe-code-bar .vbe-code-lang { position: static; top: auto; left: auto; }
.vbe-code-bar .vbe-code-copy { position: static; top: auto; right: auto; }
/* The wrapped <pre> drops its own border/radius/margin + the big top
 * padding (the bar now provides the header zone). */
.vbe-code-wrap pre.vbe-code {
  margin: 0;
  border: 0 !important;
  border-radius: 0;
  box-shadow: none;
  padding: 16px 18px;
}

/* Inline <code> (NOT inside .vbe-code) — small chip style */
.post-body code:not(pre code),
.product-body code:not(pre code),
article code:not(pre code) {
  background: rgba(15, 23, 42, .06);
  color: var(--accent, #ea580c);
  padding: 2px 6px;
  border-radius: 4px;
  font-family: ui-monospace, "Cascadia Mono", monospace;
  font-size: .92em;
}


/* ════════════════════════════════════════════════════════════════════════
 * v2.19.1 — Full-card click target (product & post cards)
 *
 * Each card now contains a <a class="card-link-overlay" ...> right after
 * the opening <article>, covering the whole card via absolute positioning.
 * Clicking anywhere on the card navigates to the detail page.
 *
 * Inner interactive elements (Add to cart button, Download link, Details
 * link, Read more link) sit above the overlay via z-index so they keep
 * their own behaviour.
 * ════════════════════════════════════════════════════════════════════════ */

.post-card  { position: relative; }   /* product-card already had position: relative */

/* v2.20.49 — Fix the stacking so the overlay actually receives clicks.
 *
 * Previous setup (v2.19.1) put EVERY child at z-index:2 and the overlay
 * at z-index:1. Net effect: the visual children (cover, body, meta)
 * covered the overlay and absorbed all clicks. The card was only
 * "clickable" where buttons/links happened to be — never the bare card
 * area.
 *
 * Correct stack (low → high):
 *   - card content (cover, body, meta, etc.) — natural flow, no z-index
 *   - card-link-overlay                       — z-index 1, covers card area
 *   - badge / sale-ribbon                      — z-index 2, stays visible
 *   - interactive children (links, buttons)   — z-index 3, click goes to them
 */
.card-link-overlay {
  position: absolute;
  inset: 0;
  z-index: 1;
  text-indent: -9999px;
  overflow: hidden;
  background: transparent;
  cursor: pointer;
}
/* Badges + sale ribbons float ABOVE the overlay so they stay visible
 * (but aren't interactive — clicks fall through to overlay since they're
 * not <a> or <button>). */
.product-card > .badge-featured,
.product-card > .sale-ribbon {
  position: absolute;
  z-index: 2;
  pointer-events: none;
}
/* Interactive children sit highest so their click handlers win over the
 * overlay's navigation. */
.product-card a:not(.card-link-overlay),
.product-card button,
.product-card input,
.post-card    a:not(.card-link-overlay),
.post-card    button,
.post-card    input {
  position: relative;
  z-index: 3;
}


/* ════════════════════════════════════════════════════════════════════════
 * v2.20.0 — Interactive widgets shared chrome + per-widget styles
 * ════════════════════════════════════════════════════════════════════════ */

.vbe-widget {
  margin: 24px 0;
  padding: 18px;
  background: var(--card, #fff);
  border: 1px solid var(--border, #e2e8f0);
  border-radius: 12px;
  box-shadow: 0 1px 2px rgba(15,23,42,.04), 0 6px 18px rgba(15,23,42,.05);
  color: var(--text1, #0f172a);
  font: inherit;
}
.vbe-widget * { box-sizing: border-box; }
.vbe-widget pre { margin: 12px 0 0; }
.vbe-widget button { font: inherit; cursor: pointer; }

.vbe-color-picker { display: grid; grid-template-columns: 120px 1fr; gap: 18px; align-items: start; }
.vbe-cp-preview { aspect-ratio: 1; border-radius: 10px; border: 1px solid var(--border, #e2e8f0); }
.vbe-cp-controls { display: flex; flex-direction: column; gap: 8px; }
.vbe-cp-row { display: flex; align-items: center; gap: 10px; }
.vbe-cp-row .vbe-cp-native { width: 44px; height: 32px; padding: 0; border: 1px solid var(--border); border-radius: 6px; background: transparent; }
.vbe-cp-slider { display: grid; grid-template-columns: 16px 1fr 40px; gap: 8px; align-items: center; font-size: 13px; }
.vbe-cp-val { font-family: ui-monospace, monospace; font-size: 12px; color: var(--text2, #475569); text-align: right; }
.vbe-cp-output { grid-column: 1 / -1; display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; margin-top: 6px; }
.vbe-cp-copy { background: var(--bg2, #f1f5f9); border: 1px solid var(--border); border-radius: 8px; padding: 8px 10px; display: flex; flex-direction: column; align-items: flex-start; gap: 2px; font-size: 11px; color: var(--text2); }
.vbe-cp-copy:hover { background: var(--card); border-color: var(--accent, #ea580c); }
.vbe-cp-copy code { font-family: ui-monospace, monospace; font-size: 12.5px; color: var(--text1); }
@media (max-width: 560px) { .vbe-color-picker { grid-template-columns: 1fr; } .vbe-cp-preview { aspect-ratio: 4/1; } }

.vbe-hex-decoder { display: grid; grid-template-columns: 1fr 110px; gap: 16px; align-items: start; }
.vbe-hd-input { grid-column: 1 / -1; display: flex; align-items: center; gap: 10px; }
.vbe-hd-input span { font-size: 13px; font-weight: 600; color: var(--text2); }
.vbe-hd-hex { font-family: ui-monospace, monospace; font-size: 15px; padding: 6px 10px; border: 1px solid var(--border); border-radius: 6px; background: var(--bg2); width: 110px; text-transform: uppercase; }
.vbe-hd-color { width: 36px; height: 32px; padding: 0; border: 1px solid var(--border); border-radius: 6px; background: transparent; }
.vbe-hd-channels { display: flex; flex-direction: column; gap: 10px; }
.vbe-hd-ch-head { display: flex; align-items: baseline; gap: 8px; font-size: 13px; }
.vbe-hd-ch-head strong { font-family: ui-monospace, monospace; font-size: 14px; }
.vbe-hd-pair { font-family: ui-monospace, monospace; font-size: 14px; padding: 1px 6px; background: var(--bg2); border-radius: 4px; }
.vbe-hd-dec { margin-left: auto; color: var(--text3, #94a3b8); font-size: 12px; }
.vbe-hd-bar { height: 12px; background: var(--bg2); border-radius: 6px; overflow: hidden; }
.vbe-hd-fill { display: block; height: 100%; width: 0; transition: width .25s, background .25s; }
.vbe-hd-swatch { width: 100%; aspect-ratio: 1; border-radius: 8px; border: 1px solid var(--border); }
@media (max-width: 560px) { .vbe-hex-decoder { grid-template-columns: 1fr; } .vbe-hd-swatch { aspect-ratio: 4/1; } }

.vbe-gradient-builder .vbe-gb-preview { height: 140px; border-radius: 10px; margin-bottom: 12px; }
.vbe-gb-controls { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; font-size: 13px; }
.vbe-gb-controls label { display: flex; align-items: center; gap: 6px; }
.vbe-gb-controls input[type="color"] { width: 40px; height: 30px; border: 1px solid var(--border); border-radius: 6px; padding: 0; }
.vbe-gb-controls input[type="range"] { width: 160px; }
.vbe-gb-swap { background: var(--bg2); border: 1px solid var(--border); border-radius: 6px; width: 32px; height: 32px; font-size: 16px; }
.vbe-gb-code { display: block; width: 100%; margin-top: 12px; background: #1e293b; color: #e2e8f0; padding: 10px 14px; border: 0; border-radius: 8px; text-align: left; font-family: ui-monospace, monospace; font-size: 12.5px; }
.vbe-gb-code:hover { background: #0f172a; }

.vbe-contrast .vbe-cc-sample { padding: 18px 20px; border-radius: 10px; transition: background .2s, color .2s; }
.vbe-cc-sample p { margin: 0 0 8px; }
.vbe-cc-sample p:last-child { margin: 0; }
.vbe-cc-small { font-size: 16px; }
.vbe-cc-large { font-size: 24px; font-weight: 700; }
.vbe-cc-controls { display: flex; gap: 16px; margin: 12px 0; font-size: 13px; }
.vbe-cc-controls label { display: flex; align-items: center; gap: 6px; }
.vbe-cc-controls input[type="color"] { width: 40px; height: 30px; border: 1px solid var(--border); border-radius: 6px; padding: 0; }
.vbe-cc-result { display: grid; grid-template-columns: 100px 1fr; gap: 16px; align-items: center; }
.vbe-cc-ratio { text-align: center; }
.vbe-cc-ratio .vbe-cc-num { font-size: 30px; font-weight: 800; color: var(--accent, #ea580c); display: block; }
.vbe-cc-grades { list-style: none; padding: 0; margin: 0; display: grid; grid-template-columns: 1fr 1fr; gap: 6px; font-size: 13px; }
.vbe-cc-grades li { display: flex; align-items: center; gap: 8px; padding: 6px 10px; border-radius: 6px; background: var(--bg2); }
.vbe-cc-grades li.ok span { color: #16a34a; font-weight: 700; }
.vbe-cc-grades li.fail span { color: #dc2626; font-weight: 700; }
.vbe-cc-grades li span { margin-left: auto; font-size: 12px; }

.vbe-palette-shades .vbe-ps-input { display: flex; align-items: center; gap: 10px; font-size: 13px; margin-bottom: 12px; }
.vbe-ps-input input { width: 40px; height: 32px; padding: 0; border: 1px solid var(--border); border-radius: 6px; }
.vbe-ps-input code { font-family: ui-monospace, monospace; font-size: 13px; background: var(--bg2); padding: 4px 8px; border-radius: 4px; }
.vbe-ps-strip { display: flex; gap: 2px; border-radius: 8px; overflow: hidden; height: 110px; }
.vbe-ps-cell { flex: 1; border: 0; padding: 8px 4px; display: flex; flex-direction: column; align-items: center; justify-content: space-between; color: #fff; text-shadow: 0 1px 2px rgba(0,0,0,.35); transition: transform .15s; }
.vbe-ps-cell:hover { transform: translateY(-3px); }
.vbe-ps-step { font-size: 11px; font-weight: 700; opacity: .85; }
.vbe-ps-cell code { font-size: 10px; font-family: ui-monospace, monospace; color: inherit; text-shadow: inherit; }

.vbe-hsl-wheel { display: grid; grid-template-columns: 220px 1fr; gap: 18px; align-items: center; }
.vbe-hw-wheel-wrap { display: flex; justify-content: center; }
.vbe-hw-wheel { position: relative; width: 200px; height: 200px; border-radius: 50%; cursor: crosshair; background: radial-gradient(circle, #fff 0%, transparent 70%), conic-gradient(from 0deg, red, yellow, lime, cyan, blue, magenta, red); }
.vbe-hw-dot { position: absolute; width: 14px; height: 14px; border-radius: 50%; background: #fff; border: 2px solid #000; transform: translate(-50%, -50%); pointer-events: none; box-shadow: 0 0 0 2px rgba(255,255,255,.7); }
.vbe-hw-controls { display: flex; flex-direction: column; gap: 14px; }
.vbe-hw-light input { width: 100%; }
.vbe-hw-out { display: flex; align-items: center; gap: 12px; }
.vbe-hw-swatch { width: 56px; height: 56px; border-radius: 8px; border: 1px solid var(--border); }
.vbe-hw-out code { display: block; font-family: ui-monospace, monospace; font-size: 12.5px; }
@media (max-width: 560px) { .vbe-hsl-wheel { grid-template-columns: 1fr; } }

.vbe-color-mixer .vbe-mx-stage { position: relative; height: 220px; background: #000; border-radius: 10px; overflow: hidden; margin-bottom: 14px; display: flex; align-items: center; justify-content: center; }
.vbe-mx-light { position: absolute; width: 140px; height: 140px; border-radius: 50%; filter: blur(28px); mix-blend-mode: screen; transition: opacity .15s; }
.vbe-mx-r { background: #f00; left: 26%; top: 25%; }
.vbe-mx-g { background: #0f0; right: 26%; top: 25%; }
.vbe-mx-b { background: #00f; left: 50%; bottom: 18%; transform: translateX(-50%); }
.vbe-mx-result { position: relative; z-index: 2; color: #fff; font-family: ui-monospace, monospace; padding: 6px 12px; background: rgba(0,0,0,.55); border-radius: 6px; }
.vbe-mx-sliders { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; margin-bottom: 12px; }
.vbe-mx-slider { display: flex; flex-direction: column; gap: 4px; font-size: 13px; }
.vbe-mx-slider span { font-family: ui-monospace, monospace; font-weight: 700; }
.vbe-mx-slider-r span { color: #ef4444; }
.vbe-mx-slider-g span { color: #16a34a; }
.vbe-mx-slider-b span { color: #2563eb; }
.vbe-mx-slider output { font-size: 11px; color: var(--text3); }
.vbe-mx-presets { display: flex; flex-wrap: wrap; gap: 6px; }
.vbe-mx-presets button { background: var(--bg2); border: 1px solid var(--border); border-radius: 6px; padding: 5px 10px; font-size: 12px; color: var(--text2); }
.vbe-mx-presets button:hover { border-color: var(--accent); color: var(--text1); }

.vbe-particles-demo { position: relative; padding: 0; overflow: hidden; background: linear-gradient(135deg, #0f172a, #1e293b); border: 0; }
.vbe-particles-demo canvas { display: block; width: 100%; height: 100%; }
.vbe-pd-label { position: absolute; top: 10px; left: 14px; color: rgba(255,255,255,.6); font-size: 11px; font-weight: 600; letter-spacing: .04em; text-transform: uppercase; pointer-events: none; }

.vbe-css-animation { display: grid; grid-template-columns: 1fr 1.4fr; gap: 14px; align-items: start; }
.vbe-ca-stage { background: var(--bg2); border-radius: 10px; min-height: 180px; display: flex; align-items: center; justify-content: center; overflow: hidden; }
.vbe-ca-box { width: 64px; height: 64px; background: linear-gradient(135deg, var(--accent, #ea580c), var(--accent2, #fb923c)); border-radius: 12px; }
.vbe-ca-replay { grid-column: 1; margin-top: 8px; background: var(--bg2); border: 1px solid var(--border); border-radius: 6px; padding: 6px 14px; font-size: 12.5px; color: var(--text2); width: max-content; }
.vbe-ca-replay:hover { border-color: var(--accent); color: var(--accent); }
.vbe-ca-code { grid-column: 2; grid-row: 1 / 3; background: #1e1e2e; color: #e2e8f0; padding: 12px 14px; border-radius: 8px; font-family: ui-monospace, monospace; font-size: 12px; line-height: 1.45; overflow: auto; max-height: 240px; margin: 0; }
.vbe-ca-copy { grid-column: 2; background: var(--bg2); border: 1px solid var(--border); border-radius: 6px; padding: 6px 14px; font-size: 12.5px; color: var(--text2); margin-top: 8px; justify-self: end; }
.vbe-ca-copy:hover { border-color: var(--accent); color: var(--accent); }
@media (max-width: 720px) { .vbe-css-animation { grid-template-columns: 1fr; } .vbe-ca-code { grid-column: 1; grid-row: auto; } .vbe-ca-copy { grid-column: 1; justify-self: stretch; } }

.vbe-mq-demo .vbe-mq-grid { display: grid; grid-template-columns: 1fr; gap: 8px; margin-bottom: 10px; }
@media (min-width: 640px)  { .vbe-mq-demo .vbe-mq-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 960px)  { .vbe-mq-demo .vbe-mq-grid { grid-template-columns: repeat(3, 1fr); } }
@media (min-width: 1280px) { .vbe-mq-demo .vbe-mq-grid { grid-template-columns: repeat(6, 1fr); } }
.vbe-mq-cell { background: linear-gradient(135deg, var(--accent, #ea580c), var(--accent2, #fb923c)); color: #fff; font-weight: 700; text-align: center; padding: 16px 0; border-radius: 8px; }
.vbe-mq-info { display: flex; align-items: baseline; gap: 12px; font-size: 13px; margin-bottom: 10px; }
.vbe-mq-bp { font-weight: 700; color: var(--accent); }
.vbe-mq-w  { font-family: ui-monospace, monospace; color: var(--text3); }
.vbe-mq-code { background: #1e1e2e; color: #e2e8f0; padding: 10px 14px; border-radius: 8px; font-size: 12px; overflow: auto; margin: 0; }

.vbe-flexbox-demo .vbe-fb-controls,
.vbe-grid-demo    .vbe-gd-controls { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 12px; }
.vbe-fb-controls fieldset { border: 1px solid var(--border); border-radius: 8px; padding: 6px 10px; }
.vbe-fb-controls legend { font-size: 11px; color: var(--text3); padding: 0 4px; text-transform: uppercase; letter-spacing: .04em; }
.vbe-fb-controls button { background: transparent; border: 1px solid var(--border); border-radius: 5px; padding: 4px 8px; margin: 0 2px; font-size: 12px; color: var(--text2); }
.vbe-fb-controls button.is-on { background: var(--accent); color: #fff; border-color: var(--accent); }
.vbe-fb-stage,
.vbe-gd-stage { display: flex; min-height: 160px; background: var(--bg2); border: 1px dashed var(--border); border-radius: 8px; padding: 12px; gap: 8px; align-items: stretch; justify-content: flex-start; transition: all .2s; }
.vbe-gd-stage { display: grid; }
.vbe-fb-item,
.vbe-gd-cell { background: linear-gradient(135deg, var(--accent, #ea580c), var(--accent2, #fb923c)); color: #fff; font-weight: 700; min-width: 48px; min-height: 48px; display: flex; align-items: center; justify-content: center; border-radius: 6px; padding: 12px; }
.vbe-fb-code,
.vbe-gd-code { background: #1e1e2e; color: #e2e8f0; padding: 10px 14px; border-radius: 8px; font-size: 12px; margin-top: 10px; }
.vbe-fb-code span,
.vbe-gd-code span { color: #fbbf24; }
.vbe-gd-controls label { display: flex; flex-direction: column; gap: 4px; font-size: 12.5px; flex: 1; min-width: 130px; }
.vbe-gd-controls output { font-size: 11px; color: var(--text3); }


/* ════════════════════════════════════════════════════════════════════════
 * v2.20.1 — Fixes:
 *   (a) share buttons + back-to-blog readable in MIXED theme mode
 *   (b) remove the underline that appears on text inside buttons on hover
 * ════════════════════════════════════════════════════════════════════════ */

/* (a) Force enough contrast on the share strip + back-to-blog link
 * regardless of which theme CSS vars are inherited at that point of the
 * tree. We use a translucent neutral background that adapts to ANY
 * underlying surface (semi-white on dark, semi-black on light). */
.post-back-link,
.post-share-btn {
  background: rgba(127, 127, 127, .14) !important;
  border-color: rgba(127, 127, 127, .35) !important;
  color: var(--text1, #0f172a) !important;
}
.post-back-link svg,
.post-share-btn svg {
  color: inherit;
  opacity: .9;
}
.post-back-link:hover,
.post-share-btn:hover {
  background: linear-gradient(135deg, var(--accent, #ea580c), var(--accent2, #fb923c)) !important;
  border-color: transparent !important;
  color: #fff !important;
  text-decoration: none !important;
}

/* On dark surfaces (header, mixed-mode dark cards, etc.), flip the chip
 * colour so it stays readable. We detect a dark context by reading the
 * --bg var when the post is sitting inside one. */
@media (prefers-color-scheme: dark) {
  .post-back-link, .post-share-btn {
    background: rgba(255, 255, 255, .10) !important;
    border-color: rgba(255, 255, 255, .25) !important;
    color: #e2e8f0 !important;
  }
}
html.dark .post-back-link,
html.dark .post-share-btn,
html[data-theme="dark"] .post-back-link,
html[data-theme="dark"] .post-share-btn {
  background: rgba(255, 255, 255, .10) !important;
  border-color: rgba(255, 255, 255, .25) !important;
  color: #e2e8f0 !important;
}

/* (b) Kill the link underline that appears on hover when an <a> doubles
 * as a button. Covers every button-ish class in the codebase + plain
 * <button> elements. */
.btn-primary:hover, .btn-primary:focus,
.btn-secondary:hover, .btn-secondary:focus,
.btn-detail:hover, .btn-detail:focus,
.btn-buy:hover, .btn-buy:focus,
.btn-action:hover, .btn-action:focus,
.btn-save:hover, .btn-save:focus,
a[class*="btn-"]:hover, a[class*="btn-"]:focus,
a[class*="-btn"]:hover, a[class*="-btn"]:focus,
button:hover, button:focus,
.admin-shortcut:hover, .admin-shortcut:focus,
.post-back-link:hover, .post-back-link:focus,
.post-share-btn:hover, .post-share-btn:focus,
.cookie-banner-actions a:hover,
.card-link-overlay:hover {
  text-decoration: none !important;
}


/* ════════════════════════════════════════════════════════════════════════
 * v2.20.2 — Mixed-theme readability for v2.20.0 widgets + code blocks
 *
 * Same recipe as v2.11.1 / v2.13.1 / v2.14.1 / v2.15.2: re-declare the
 * dark-mode CSS custom properties inside every container that has a DARK
 * background in mixed mode. Once the vars resolve to the dark palette,
 * every descendant (text, borders, sub-cards, inputs) picks the right
 * contrast automatically — no per-element overrides needed.
 *
 * Covers:
 *   - .vbe-widget envelopes (color-picker, hex-decoder, gradient-builder,
 *     contrast-checker, palette-shades, hsl-wheel, color-mixer,
 *     particles-demo, css-animation, media-query-demo, flexbox-demo,
 *     grid-demo)
 *   - pre.vbe-code blocks (Prism-highlighted source code)
 * ════════════════════════════════════════════════════════════════════════ */

[data-theme="mixed"] .vbe-widget,
[data-theme="mixed"] pre.vbe-code {
  /* Dark palette, lifted verbatim from the dark mode :root block + the
   * v2.11.1 override block. Keeps brand accents identical across themes. */
  --bg:          #0a0e1a;
  --bg2:         #101728;
  --bg3:         #1a2238;
  --bg-elevated: #101728;
  --card:        #101728;
  --text:        #e8edf7;
  --text1:       #e8edf7;
  --text2:       #94a3b8;
  --text3:       #64748b;
  --border:      rgba(255, 255, 255, 0.08);
  --border2:     rgba(255, 255, 255, 0.18);
  --brand:       #3b82f6;
  --brand2:      #60a5fa;
  --brand-deep:  #1e40af;
  --brand-soft:  rgba(59, 130, 246, 0.15);
  /* accent / accent2 / accent-soft inherited from root (brand orange
   * is the same across all three themes). */
}

/* Some widget internals reference :root vars by hardcoded fallback
 * (e.g. `var(--card, #fff)`). The fallback only fires when the var is
 * undefined, so the override above already wins. The two extras below
 * cover the rare element where we hardcoded a light value directly. */
[data-theme="mixed"] .vbe-widget .vbe-cp-preview,
[data-theme="mixed"] .vbe-widget .vbe-hd-swatch,
[data-theme="mixed"] .vbe-widget .vbe-hw-swatch {
  border-color: rgba(255, 255, 255, 0.18);
}

/* The light-on-light slate-50 grades cards inside contrast-checker were
 * the original example of "dark text on dark surface" in mixed mode.
 * Override the `var(--bg2)` they fall back on. */
[data-theme="mixed"] .vbe-cc-grades li,
[data-theme="mixed"] .vbe-ps-input code,
[data-theme="mixed"] .vbe-hd-pair,
[data-theme="mixed"] .vbe-hd-hex,
[data-theme="mixed"] .vbe-hd-bar,
[data-theme="mixed"] .vbe-cp-copy,
[data-theme="mixed"] .vbe-mx-presets button,
[data-theme="mixed"] .vbe-fb-controls button,
[data-theme="mixed"] .vbe-ca-replay,
[data-theme="mixed"] .vbe-ca-copy,
[data-theme="mixed"] .vbe-gb-swap,
[data-theme="mixed"] .vbe-fb-stage,
[data-theme="mixed"] .vbe-gd-stage,
[data-theme="mixed"] .vbe-ca-stage {
  background: var(--bg3);
  color: var(--text);
  border-color: var(--border);
}


/* v2.20.3 — Carousel arrows in mixed mode
 * The .carousel-btn used background:var(--bg2) (dark) + color:var(--text)
 * (which in mixed mode resolves to slate-800 from the light root) — net
 * effect: dark icon on dark chip, invisible. Force the dark-palette
 * border + text colours so the arrows pop on the dark chip surface. */
[data-theme="mixed"] .carousel-btn {
  border-color: rgba(255, 255, 255, 0.18);
  color: #e8edf7;
}
[data-theme="mixed"] .carousel-btn:hover {
  color: #fff;
  border-color: var(--accent, #ea580c);
  background: rgba(234, 88, 12, .25);
}


/* ─────────────────────────────────────────────────────────────────────────
 * Blog pagination strip
 * v2.20.4 — initial implementation
 * v2.20.41 — polished for dark / light / mixed themes; matches the storefront
 *            pill-button + orange-gradient accent system used elsewhere.
 *
 * Layout (centred row, wraps on narrow screens):
 *   [← Anterior]   1  2  …  5  6  7  …  12   [Siguiente →]
 *                                       Página 6 de 12
 *
 * The container uses CSS custom properties scoped to the strip so theme-mode
 * overrides only need to set the variables — not duplicate selectors. Light
 * mode keeps the default values; dark + mixed each set their own palette.
 * ───────────────────────────────────────────────────────────────────────── */
.blog-pagination {
  --pg-bg:        var(--bg2);
  --pg-bg-hover:  var(--bg3);
  --pg-text:      var(--text2);
  --pg-text-strong: var(--text);
  --pg-border:    var(--border);
  --pg-shadow:    0 1px 2px rgba(15, 23, 42, .04);
  --pg-shadow-hov:0 6px 16px rgba(249, 115, 22, .18);

  display: flex;
  align-items: center;
  justify-content: center;
  gap: 12px;
  margin: 56px 0 8px;
  flex-wrap: wrap;
}

/* Prev / Next pill buttons */
.blog-pg-btn {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 13px;
  font-weight: 600;
  color: var(--pg-text);
  text-decoration: none;
  padding: 9px 18px;
  border: 1px solid var(--pg-border);
  border-radius: 999px;
  background: var(--pg-bg);
  box-shadow: var(--pg-shadow);
  transition: color .15s, border-color .15s, background-color .15s, transform .15s, box-shadow .2s;
  white-space: nowrap;
}
.blog-pg-btn .blog-pg-arrow {
  font-size: 15px;
  line-height: 1;
  transition: transform .2s ease;
}
.blog-pg-btn:hover {
  color: #fff;
  border-color: var(--accent, #ea580c);
  background: linear-gradient(135deg, var(--accent, #ea580c), var(--accent2, #fb923c));
  text-decoration: none;
  transform: translateY(-1px);
  box-shadow: var(--pg-shadow-hov);
}
.blog-pg-prev:hover .blog-pg-arrow { transform: translateX(-3px); }
.blog-pg-next:hover .blog-pg-arrow { transform: translateX(3px); }
.blog-pg-btn.is-disabled {
  opacity: .4;
  cursor: not-allowed;
  pointer-events: none;
}
.blog-pg-btn:focus-visible {
  outline: 2px solid var(--accent, #ea580c);
  outline-offset: 2px;
}

/* Page number list */
.blog-pg-list {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  list-style: none;
  margin: 0;
  padding: 4px 6px;
  border: 1px solid var(--pg-border);
  border-radius: 999px;
  background: var(--pg-bg);
  box-shadow: var(--pg-shadow);
}
.blog-pg-list li { margin: 0; padding: 0; }
.blog-pg-ellipsis {
  display: inline-flex; align-items: center; justify-content: center;
  width: 30px; height: 32px;
  color: var(--text3); font-size: 14px;
  user-select: none;
}
.blog-pg-num {
  display: inline-flex;
  align-items: center; justify-content: center;
  min-width: 34px; height: 32px;
  padding: 0 10px;
  border-radius: 999px;
  color: var(--pg-text);
  font-size: 13px;
  font-weight: 600;
  text-decoration: none;
  transition: background-color .15s, color .15s, transform .15s;
}
.blog-pg-num:hover {
  background: var(--pg-bg-hover);
  color: var(--pg-text-strong);
  text-decoration: none;
}
.blog-pg-num:focus-visible {
  outline: 2px solid var(--accent, #ea580c);
  outline-offset: 2px;
}
.blog-pg-num.is-current {
  background: linear-gradient(135deg, var(--accent, #ea580c), var(--accent2, #fb923c));
  color: #fff;
  box-shadow: 0 4px 12px rgba(249, 115, 22, .35);
  cursor: default;
}
.blog-pg-num.is-current:hover {
  background: linear-gradient(135deg, var(--accent, #ea580c), var(--accent2, #fb923c));
  color: #fff;
}

/* "Página X de Y" caption under the strip */
.blog-pagination-meta {
  text-align: center;
  margin: 14px 0 8px;
  font-size: 12px;
  color: var(--text3);
  letter-spacing: 0.02em;
}

/* ── Dark theme: invert the pill backgrounds to a deeper navy so they
 *    stand out against the dark page bg. */
[data-theme="dark"] .blog-pagination {
  --pg-bg:        rgba(255, 255, 255, .04);
  --pg-bg-hover:  rgba(255, 255, 255, .08);
  --pg-text:      #94a3b8;
  --pg-text-strong: #e8edf7;
  --pg-border:    rgba(255, 255, 255, .08);
  --pg-shadow:    0 1px 2px rgba(0, 0, 0, .25);
}

/* ── Mixed theme: light page bg with neutral pills so the orange accent
 *    pops on hover/current without competing with the cart's dark cards. */
[data-theme="mixed"] .blog-pagination {
  --pg-bg:        #ffffff;
  --pg-bg-hover:  #f1f5f9;
  --pg-text:      #475569;
  --pg-text-strong: #0f172a;
  --pg-border:    #e2e8f0;
  --pg-shadow:    0 1px 3px rgba(15, 23, 42, .06);
}
[data-theme="mixed"] .blog-pagination-meta { color: #64748b; }

/* Narrow screens: stack the prev/next labels under the arrows so the row
 * doesn't overflow. */
@media (max-width: 520px) {
  .blog-pagination { gap: 8px; }
  .blog-pg-btn { padding: 8px 14px; }
  .blog-pg-btn-label { display: none; }
  .blog-pg-list { padding: 3px 4px; gap: 2px; }
  .blog-pg-num { min-width: 30px; height: 30px; padding: 0 8px; font-size: 12px; }
}


/* v2.20.5 — Categories + tags chips (blog filter bar + per-post chips) */
.blog-filter-bar {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin: 0 auto 24px;
  padding-top: 8px;
}
.blog-chip {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 5px 12px;
  border: 1px solid var(--border);
  border-radius: 999px;
  background: var(--bg2);
  color: var(--text2);
  font-size: 12.5px;
  font-weight: 600;
  text-decoration: none;
  transition: all .15s;
}
.blog-chip:hover { color: var(--accent); border-color: var(--accent); text-decoration: none; }
.blog-chip.is-active { background: linear-gradient(135deg, var(--accent, #ea580c), var(--accent2, #fb923c)); color: #fff; border-color: transparent; }
.blog-chip-tag { font-family: ui-monospace, monospace; }
[data-theme="mixed"] .blog-chip { background: rgba(127,127,127,.10); border-color: rgba(127,127,127,.25); }

/* per-post terms (above the share/footer strip) */
.post-terms {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin: 32px 0 22px;
}
.post-chip {
  display: inline-flex;
  align-items: center;
  padding: 4px 10px;
  border: 1px solid var(--border);
  border-radius: 999px;
  background: rgba(127,127,127,.10);
  color: var(--text2);
  font-size: 12px;
  font-weight: 600;
  text-decoration: none;
  transition: all .15s;
}
.post-chip:hover { color: var(--accent); border-color: var(--accent); text-decoration: none; }
.post-chip-tag { font-family: ui-monospace, monospace; opacity: .85; }


/* v2.20.6 — code-runner widget (HTML/CSS/JS tabs + sandboxed preview) */
.vbe-code-runner { padding: 14px; }
.vbe-cr-title { font-size: 13px; font-weight: 600; color: var(--text2); margin-bottom: 8px; }
.vbe-cr-tabs {
  display: flex; gap: 4px;
  border-bottom: 2px solid var(--border);
  margin-bottom: 10px;
}
.vbe-cr-tab {
  background: transparent; border: 0;
  padding: 8px 14px;
  font-size: 12.5px; font-weight: 600;
  color: var(--text2);
  cursor: pointer;
  border-bottom: 2px solid transparent;
  margin-bottom: -2px;
  transition: color .12s, border-color .12s;
  font-family: ui-monospace, monospace;
}
.vbe-cr-tab:hover { color: var(--text); }
.vbe-cr-tab.is-active { color: var(--accent, #ea580c); border-bottom-color: var(--accent, #ea580c); }
.vbe-cr-pane { display: block; }
.vbe-cr-pane[hidden] { display: none; }
.vbe-cr-pane iframe { display: block; border-radius: 8px; }
.vbe-cr-pane pre.vbe-code { margin: 0; }


/* ════════════════════════════════════════════════════════════════════════
 * v2.20.9 — Cart page (refactor from inline styles to classes + mixed-
 * mode dark-vars override + suggestions strip)
 * ════════════════════════════════════════════════════════════════════════ */

.cart-page { padding: 48px 24px 80px; max-width: 1080px; }
.cart-title { font-size: 28px; font-weight: 700; margin: 0 0 28px; color: var(--text); }
.cart-empty { text-align: center; padding: 80px 20px; color: var(--text2); }
.cart-empty p { font-size: 18px; margin-bottom: 16px; }
.cart-grid { display: grid; grid-template-columns: 1fr 320px; gap: 32px; align-items: start; }
@media (max-width: 800px) { .cart-grid { grid-template-columns: 1fr; } }

.cart-item {
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: 12px;
  padding: 18px 20px;
  margin-bottom: 12px;
  display: flex; align-items: center; justify-content: space-between; gap: 16px;
}
.cart-item-info { flex: 1; }
.cart-item-name { font-size: 16px; font-weight: 600; color: var(--text); margin-bottom: 4px; }
.cart-item-license { font-size: 13px; color: var(--text2); }
.cart-item-side { display: flex; align-items: center; gap: 16px; }
.cart-item-price { font-size: 18px; font-weight: 700; font-family: 'JetBrains Mono', ui-monospace, monospace; color: var(--accent); }
.cart-item-remove {
  background: transparent; border: 1px solid rgba(239, 68, 68, .3); color: #f87171;
  width: 30px; height: 30px; border-radius: 6px;
  display: inline-flex; align-items: center; justify-content: center;
  cursor: pointer; transition: all .15s;
}
.cart-item-remove:hover { background: rgba(239, 68, 68, .15); border-color: #ef4444; color: #ef4444; }

.cart-summary-box {
  background: var(--bg2);
  border: 1px solid var(--border2);
  border-radius: 16px;
  padding: 24px;
  position: sticky; top: 80px;
  color: var(--text);
}
.cart-summary-title { font-size: 18px; font-weight: 600; margin: 0 0 16px; color: var(--text); }
.cart-summary-line {
  display: flex; justify-content: space-between;
  font-size: 13px; color: var(--text2); padding: 4px 0;
}
.cart-total-row {
  padding-top: 16px; border-top: 1px solid var(--border); margin-top: 16px;
  display: flex; justify-content: space-between;
  font-size: 18px; font-weight: 700; color: var(--text);
}
.cart-total-amount { color: var(--accent); font-family: 'JetBrains Mono', ui-monospace, monospace; }
.cart-customer-fields { margin-top: 20px; display: flex; flex-direction: column; gap: 10px; }
.cart-checkout-btn { margin-top: 14px; width: 100%; justify-content: center; }

/* v2.21.5 — adaptive cart UI */
.cart-signed-pill {
  margin-top: 18px;
  padding: 12px 14px;
  background: rgba(34, 197, 94, .10);
  border: 1px solid rgba(34, 197, 94, .35);
  border-radius: 10px;
  display: flex;
  align-items: center;
  gap: 10px;
  font-size: 13px;
  color: var(--text);
}
.cart-signed-dot { color: #22c55e; font-size: 12px; line-height: 1; }
.cart-signed-text small { display: block; font-size: 11px; color: var(--text3); margin-top: 2px; }

.cart-signin-hint {
  margin-top: 18px;
  padding: 12px 14px;
  background: rgba(59, 130, 246, .08);
  border: 1px solid rgba(59, 130, 246, .25);
  border-radius: 10px;
  font-size: 13px;
  color: var(--text2);
  line-height: 1.5;
}

.cart-existing-account-line {
  margin: 18px 0 -4px;
  font-size: 12.5px;
  color: var(--text3);
  text-align: center;
}
.cart-existing-account-line a { color: var(--accent); font-weight: 500; }

.checkout-waiting-banner {
  margin-bottom: 18px;
  padding: 12px 14px;
  background: rgba(249, 115, 22, .10);
  border: 1px solid rgba(249, 115, 22, .30);
  border-radius: 10px;
  font-size: 13px;
  color: var(--text);
  line-height: 1.55;
}
.checkout-waiting-banner a { color: var(--accent); font-weight: 600; }
.cart-secure-line { font-size: 11px; color: var(--text2); text-align: center; margin: 12px 0 0; }

/* ── Mixed-mode override: cart sits on top of the light body but every
 * surface inside it is dark; re-declare the palette so child text/border
 * tokens resolve correctly (same recipe as v2.11.1 / v2.15.2 / v2.20.2). */
[data-theme="mixed"] .cart-item,
[data-theme="mixed"] .cart-summary-box,
[data-theme="mixed"] .cart-sugg-card {
  --bg:          #0a0e1a;
  --bg2:         #101728;
  --bg3:         #1a2238;
  --bg-elevated: #101728;
  --card:        #101728;
  --text:        #e8edf7;
  --text1:       #e8edf7;
  --text2:       #94a3b8;
  --text3:       #64748b;
  --border:      rgba(255, 255, 255, 0.08);
  --border2:     rgba(255, 255, 255, 0.18);
  --brand:       #3b82f6;
  --brand2:      #60a5fa;
  --brand-soft:  rgba(59, 130, 246, 0.15);
}
[data-theme="mixed"] .cart-customer-fields input,
[data-theme="mixed"] .cart-page .form-control {
  background: rgba(255, 255, 255, .06);
  color: #e8edf7;
  border-color: rgba(255, 255, 255, .15);
}
/* v2.20.40 — placeholder color for cart inputs in mixed mode. Browser
 * default placeholder colour is grey + low opacity, which on the dark
 * cart-summary background renders almost invisible. Explicit override. */
[data-theme="mixed"] .cart-customer-fields input::placeholder,
[data-theme="mixed"] .cart-page .form-control::placeholder {
  color: #94a3b8;
  opacity: 1;
}
/* v2.20.40 — empty-state copy + section headings live OUTSIDE .cart-item,
 * so the .cart-page page-level dark surfaces need their own override too.
 * Without this, "Tu carrito" / "Quizás te interese" stay light-mode dark
 * while their bg is light — fine — but inner suggestion-strip headings
 * inherit text/border vars that don't always resolve right. */
[data-theme="mixed"] .cart-item-name,
[data-theme="mixed"] .cart-summary-title,
[data-theme="mixed"] .cart-total-row {
  color: #e8edf7;
}
[data-theme="mixed"] .cart-item-license,
[data-theme="mixed"] .cart-summary-line,
[data-theme="mixed"] .cart-secure-line {
  color: #94a3b8;
}
[data-theme="mixed"] .cart-summary-line span {
  color: #cbd5e1;
}
[data-theme="mixed"] .cart-total-row {
  border-top-color: rgba(255, 255, 255, .15);
}
[data-theme="mixed"] .cart-sugg-name a { color: #e8edf7; }
[data-theme="mixed"] .cart-sugg-name a:hover { color: var(--accent); }
[data-theme="mixed"] .cart-sugg-desc { color: #94a3b8; }
[data-theme="mixed"] .cart-sugg-price s { color: #64748b; }
[data-theme="mixed"] .cart-sugg-cover { background: #1a2238; }
[data-theme="mixed"] .cart-sugg-placeholder { color: #475569; }

/* ── Cart suggestions strip ──────────────────────────────────────────── */
.cart-suggestions { margin-top: 48px; }
.cart-sugg-head { margin-bottom: 16px; }
.cart-sugg-head h2 { font-size: 18px; font-weight: 700; margin: 0 0 4px; color: var(--text); }
.cart-sugg-head p { font-size: 13px; color: var(--text2); margin: 0; }
.cart-sugg-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 14px;
}
.cart-sugg-card {
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: 12px;
  overflow: hidden;
  display: flex; flex-direction: column;
  transition: transform .15s, box-shadow .15s, border-color .15s;
}
.cart-sugg-card:hover { transform: translateY(-3px); box-shadow: 0 8px 22px rgba(15, 23, 42, .15); border-color: var(--accent); }
.cart-sugg-card[hidden] { display: none; }
.cart-sugg-cover { display: block; aspect-ratio: 16 / 9; background: var(--bg3); overflow: hidden; }
.cart-sugg-cover img { width: 100%; height: 100%; object-fit: cover; display: block; }
.cart-sugg-placeholder {
  display: flex; align-items: center; justify-content: center; height: 100%;
  color: var(--text3); opacity: .6;
}
.cart-sugg-body { padding: 12px 14px; display: flex; flex-direction: column; gap: 6px; flex: 1; }
.cart-sugg-name { font-size: 14px; font-weight: 700; margin: 0; line-height: 1.3; }
.cart-sugg-name a { color: var(--text); text-decoration: none; }
.cart-sugg-name a:hover { color: var(--accent); text-decoration: none; }
.cart-sugg-desc {
  font-size: 12px; color: var(--text2);
  margin: 0; line-height: 1.45;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.cart-sugg-footer {
  display: flex; align-items: center; justify-content: space-between;
  margin-top: auto; padding-top: 8px;
}
.cart-sugg-price strong { font-size: 15px; font-weight: 800; color: var(--accent); font-family: 'JetBrains Mono', ui-monospace, monospace; }
.cart-sugg-price s { font-size: 11.5px; color: var(--text3); margin-left: 6px; }
.cart-sugg-add {
  background: linear-gradient(135deg, var(--accent, #ea580c), var(--accent2, #fb923c));
  color: #fff; border: 0;
  width: 36px; height: 36px; border-radius: 8px;
  display: inline-flex; align-items: center; justify-content: center;
  cursor: pointer; transition: transform .15s;
}
.cart-sugg-add:hover { transform: scale(1.05); }
.cart-sugg-add:active { transform: scale(.94); }
.cart-sugg-add.is-added { background: #16a34a; }


/* v2.20.9 — Related products on product.php */
.product-related { padding: 56px 0 24px; }
.product-related-title {
  font-size: 22px; font-weight: 700;
  margin: 0 0 24px; color: var(--text);
}
.product-related-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 16px;
}
.product-related-card {
  position: relative;
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: 12px;
  overflow: hidden;
  display: flex; flex-direction: column;
  transition: transform .15s, box-shadow .15s, border-color .15s;
}
.product-related-card:hover { transform: translateY(-3px); box-shadow: 0 8px 22px rgba(15,23,42,.15); border-color: var(--accent); }
.product-related-cover { aspect-ratio: 16 / 9; background: var(--bg3); overflow: hidden; }
.product-related-cover img { width: 100%; height: 100%; object-fit: cover; display: block; }
.product-related-cover .cover-placeholder { display: flex; align-items: center; justify-content: center; height: 100%; color: var(--text3); opacity: .6; }
.product-related-body { padding: 12px 14px; display: flex; flex-direction: column; gap: 6px; flex: 1; }
.product-related-name { font-size: 14px; font-weight: 700; margin: 0; color: var(--text); line-height: 1.3; }
.product-related-desc {
  font-size: 12px; color: var(--text2); margin: 0; line-height: 1.45;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.product-related-footer {
  display: flex; align-items: center; justify-content: space-between;
  margin-top: auto; padding-top: 8px;
}
.product-related-price strong { font-size: 15px; font-weight: 800; color: var(--accent); font-family: 'JetBrains Mono', ui-monospace, monospace; }
.product-related-price s { font-size: 11px; color: var(--text3); margin-left: 5px; }
.product-related-link {
  position: relative; z-index: 3;
  font-size: 11.5px; font-weight: 600; color: var(--accent);
  text-decoration: none; transition: color .15s;
}
.product-related-link:hover { color: var(--accent2); text-decoration: none; }

/* Mixed-mode dark vars (same recipe as the cart strip) */
[data-theme="mixed"] .product-related-card {
  --bg:     #0a0e1a;
  --bg2:    #101728;
  --bg3:    #1a2238;
  --card:   #101728;
  --text:   #e8edf7;
  --text1:  #e8edf7;
  --text2:  #94a3b8;
  --text3:  #64748b;
  --border: rgba(255,255,255,0.08);
}


/* v2.20.9 — About page expansion (stats + roadmap) */
.about-stats {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
  gap: 14px;
  margin: 48px 0 16px;
}
.about-stat {
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: 12px;
  padding: 18px;
  text-align: center;
}
.about-stat strong {
  display: block;
  font-size: 32px; font-weight: 800; color: var(--accent);
  font-variant-numeric: tabular-nums; line-height: 1;
}
.about-stat span {
  display: block;
  font-size: 12px; color: var(--text2);
  text-transform: uppercase; letter-spacing: .04em;
  margin-top: 6px; font-weight: 600;
}

.about-roadmap { margin-top: 48px; padding-top: 32px; border-top: 1px solid var(--border); }
.about-roadmap h2 { font-size: 22px; font-weight: 700; margin: 0 0 18px; color: var(--text); }
.about-roadmap-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 14px;
}
.about-roadmap-item {
  background: var(--bg2);
  border: 1px solid var(--border);
  border-left: 3px solid var(--accent);
  border-radius: 10px;
  padding: 16px 18px;
}
.about-roadmap-tag {
  display: inline-block;
  font-size: 10.5px; font-weight: 800;
  text-transform: uppercase; letter-spacing: .06em;
  color: var(--accent);
  background: rgba(234, 88, 12, .12);
  padding: 2px 8px; border-radius: 999px;
  margin-bottom: 8px;
}
.about-roadmap-item h3 { font-size: 15px; font-weight: 700; margin: 0 0 6px; color: var(--text); }
.about-roadmap-item p  { font-size: 13px; color: var(--text2); margin: 0; line-height: 1.5; }

/* Mixed-mode override (same recipe) */
[data-theme="mixed"] .about-stat,
[data-theme="mixed"] .about-roadmap-item {
  --bg2:    #101728;
  --text:   #e8edf7;
  --text2:  #94a3b8;
  --border: rgba(255,255,255,0.08);
}


/* ════════════════════════════════════════════════════════════════════════
 * v2.20.10 — Card alignment + featured-badge clip + mixed-mode counters
 *
 * Three pain points in the user's screenshot:
 *
 *   1) Cards on /store had their Detalles / Buy buttons floating at
 *      different heights depending on whether the card had a "Probado
 *      hasta WP" badge or a price line — the footer was natural-flow
 *      and bubbled up when content was shorter. Fix: make the card a
 *      flex column with the body flex:1 and the footer margin-top:auto
 *      so the action row always lands at the bottom of every card.
 *
 *   2) The Featured badge in the top-right got clipped by the card's
 *      `overflow: hidden`. Fix: move the overflow boundary down to
 *      .product-cover (so the image still gets the rounded top) and
 *      let the badge overhang freely with a higher z-index.
 *
 *   3) The category-count pills in the sidebar were dark on dark in
 *      mixed mode. Fix: explicit override via rgba neutral background.
 * ════════════════════════════════════════════════════════════════════════ */

/* (1) + (2) Card stack — body grows, footer sticks to the bottom, badges
 * are not clipped any more. */
.product-card {
  display: flex;
  flex-direction: column;
  overflow: visible;
}
.product-card > .product-cover {
  border-top-left-radius: var(--radius);
  border-top-right-radius: var(--radius);
  /* overflow:hidden already lives on .product-cover, no need to repeat */
}
.product-body {
  display: flex;
  flex-direction: column;
  flex: 1;        /* eat the remaining height */
}
.product-footer { margin-top: auto; }       /* always anchor footer to bottom */
.product-desc   { margin-bottom: 14px; }    /* slight relax so flex:1 can breathe */
.compat-row     { margin-bottom: 12px; }

.badge-featured {
  z-index: 4;                                /* above ribbons + overlay */
  box-shadow: 0 4px 12px rgba(15, 23, 42, .25);
}

/* The .sale-ribbon diagonal overlay needs the same treatment so it doesn't
 * get clipped at the top-right corner now that the card overflows visibly. */
.product-card.has-sale-ribbon { overflow: hidden; }   /* ribbon uses clip-path → keep card clipping */

/* (3) Sidebar count pills in mixed mode — dark text on dark surface fix. */
[data-theme="mixed"] .store-cat-count,
[data-theme="mixed"] .store-sidebar .store-cat-count {
  background: rgba(255, 255, 255, .10);
  color: #cbd5e1;
}

/* ════════════════════════════════════════════════════════════════════════════
 * v2.20.48 — Mixed-mode text rescue for dark surfaces that were missed
 *
 * Pattern: in mixed mode, the page bg is light but several elements use
 * `background: var(--bg2)` (which is dark in mixed mode), turning them into
 * dark cards. Their child text inherits the page-level `var(--text)` which
 * in mixed mode is DARK — so dark text on dark bg = invisible.
 *
 * The cards listed in the v2.11.1 override block above already handle this.
 * The selectors below cover the rest of the site that wasn't caught:
 *
 *   - Storefront toolbar (the sticky "Tienda · 4 productos" bar at top)
 *   - Cookie consent banner
 *   - Checkout order summary box (inline-styled in checkout.php)
 *   - Thank-you order card + license code box (inline-styled in thank-you.php)
 * ════════════════════════════════════════════════════════════════════════════ */

/* ── Storefront toolbar ──────────────────────────────────────────────────── */
[data-theme="mixed"] .store-toolbar-title h1 {
  color: #e8edf7;
}
[data-theme="mixed"] .store-toolbar-count {
  background: rgba(255, 255, 255, .10);
  color: #cbd5e1;
}
[data-theme="mixed"] .store-search input {
  background: rgba(255, 255, 255, .06);
  color: #e8edf7;
  border-color: rgba(255, 255, 255, .15);
}
[data-theme="mixed"] .store-search input::placeholder {
  color: #94a3b8;
  opacity: 1;
}
[data-theme="mixed"] .store-search svg { color: #94a3b8; }
[data-theme="mixed"] .store-sort-label { color: #94a3b8; }
[data-theme="mixed"] .store-sort select {
  background: rgba(255, 255, 255, .06);
  color: #e8edf7;
  border-color: rgba(255, 255, 255, .15);
}
/* The open <option> popup is rendered by the browser on a light system
   background, so the near-white select colour above made the items
   illegible. Force the option text to the same dark tone used in light
   mode (var(--text) = #0a0e1a there). */
[data-theme="mixed"] .store-sort select option { color: #0a0e1a; }

/* ── Cookie consent banner ───────────────────────────────────────────────── */
[data-theme="mixed"] .cookie-banner-title { color: #e8edf7; }
[data-theme="mixed"] .cookie-banner-body { color: #94a3b8; }
[data-theme="mixed"] .cookie-banner-body a { color: var(--accent); }
[data-theme="mixed"] .cookie-btn-reject {
  background: transparent;
  color: #e8edf7;
  border-color: rgba(255, 255, 255, .25);
}
[data-theme="mixed"] .cookie-btn-reject:hover {
  background: rgba(255, 255, 255, .06);
}

/* ── Checkout order summary (right column box) ───────────────────────────── */
[data-theme="mixed"] .checkout-summary-box,
[data-theme="mixed"] .checkout-summary-box * {
  --text:  #e8edf7;
  --text2: #94a3b8;
  --text3: #64748b;
  --border: rgba(255, 255, 255, .10);
}
[data-theme="mixed"] .checkout-summary-title { color: #e8edf7; }

/* ── Thank-you page: order card + nested license code box ────────────────── */
[data-theme="mixed"] .thank-you-order-card,
[data-theme="mixed"] .thank-you-order-card *,
[data-theme="mixed"] .thank-you-license-box,
[data-theme="mixed"] .thank-you-license-box * {
  --text:  #e8edf7;
  --text2: #94a3b8;
  --text3: #64748b;
  --border: rgba(255, 255, 255, .10);
  --border2: rgba(255, 255, 255, .18);
}
[data-theme="mixed"] .thank-you-order-card { color: #e8edf7; }
[data-theme="mixed"] .thank-you-license-box {
  background: rgba(255, 255, 255, .04) !important;
}
[data-theme="mixed"] .thank-you-license-box .js-copy-license {
  background: transparent;
  color: #cbd5e1;
  border-color: rgba(255, 255, 255, .15);
}
[data-theme="mixed"] .thank-you-license-box .js-copy-license:hover {
  background: rgba(255, 255, 255, .08);
}

/* ── Product bottom CTA banner ───────────────────────────────────────────
 * Visually this is a full-width attention-grabbing strip at the end of
 * every product page. In mixed mode the surrounding page bg is light
 * and the CTA was rendering with var(--text) (dark) on a darkened
 * gradient bg — barely visible. Force the dark-on-dark palette here so
 * it always reads as a confident dark banner regardless of the page
 * theme around it. */
[data-theme="mixed"] .product-bottom-cta {
  background:
    radial-gradient(ellipse 60% 80% at 50% 100%, rgba(249, 115, 22, 0.22), transparent 70%),
    #0a0e1a;
  border-top-color: rgba(255, 255, 255, .08);
}
[data-theme="mixed"] .product-bottom-cta .product-bottom-inner h3 {
  color: #e8edf7;
}
[data-theme="mixed"] .product-bottom-cta .product-bottom-inner p {
  color: #94a3b8;
}

/* Como-funciona "Ready to try" CTA — uses inline var(--bg2) for bg.
 * In mixed mode that's dark navy but the h2/p still inherit dark text.
 * Force the readable palette inside this card. */
[data-theme="mixed"] .como-funciona-cta,
[data-theme="mixed"] .como-funciona-cta * {
  --text:  #e8edf7;
  --text1: #e8edf7;
  --text2: #94a3b8;
  --border: rgba(255, 255, 255, .10);
}
[data-theme="mixed"] .como-funciona-cta h2 { color: #e8edf7; }
[data-theme="mixed"] .como-funciona-cta p  { color: #94a3b8; }


/* ════════════════════════════════════════════════════════════════════════
 * v2.20.54 — Compatibility cards (one per platform with metadata)
 * Rendered inside the product page main column under "Compatibility".
 * ════════════════════════════════════════════════════════════════════════ */
.product-platform-meta-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: 14px;
  margin-top: 8px;
}
.product-platform-meta-card {
  border: 1px solid var(--border);
  border-radius: 12px;
  padding: 16px 18px;
  background: var(--bg2);
}
.product-platform-meta-head {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 12px;
}
.product-platform-meta-head .platform-badge {
  width: 28px;
  height: 28px;
  /* override hero box-shadow halo here — inside the card a tighter
   * shadow looks cleaner than the wide blur used on the hero. */
  box-shadow:
    0 2px 6px rgba(15, 23, 42, .18),
    0 0 0 2px rgba(255, 255, 255, .35) inset !important;
}
.product-platform-meta-head strong {
  font-size: 14px;
  color: var(--text);
}
.product-platform-meta-rows {
  margin: 0;
  display: grid;
  gap: 6px;
}
.product-platform-meta-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  gap: 14px;
  align-items: baseline;
  font-size: 13px;
}
.product-platform-meta-row dt {
  color: var(--text2);
  font-weight: 500;
  margin: 0;
}
.product-platform-meta-row dd {
  color: var(--text);
  font-weight: 600;
  text-align: right;
  margin: 0;
}

/* Mixed-mode override — the cards sit on the light main column body but
 * should keep the dark navy look like the rest of the product surfaces. */
[data-theme="mixed"] .product-platform-meta-card,
[data-theme="mixed"] .product-platform-meta-card * {
  --bg2:   #101728;
  --text:  #e8edf7;
  --text2: #94a3b8;
  --border: rgba(255, 255, 255, .10);
}
[data-theme="mixed"] .product-platform-meta-card { background: #101728; color: #e8edf7; }
[data-theme="mixed"] .product-platform-meta-head strong { color: #e8edf7; }
[data-theme="mixed"] .product-platform-meta-row dt      { color: #94a3b8; }
[data-theme="mixed"] .product-platform-meta-row dd      { color: #e8edf7; }
