/* =============================================================================
   GENERATED FILE — DO NOT EDIT.

   Built from css/index.css by tools/build-css.mjs. Edit the component files,
   then run:  node tools/build-css.mjs
   ============================================================================= */

/* ===== tokens.css ================================================== */
/* =============================================================================
   KUENTA COMPONENTS — TOKENS
   Single source of truth: color, type, spacing, radius, motion. Components must
   reference these — never hard-code a color or a type size. To re-skin a site
   (or a single city), override these in theme-override.css; the whole system
   shifts together.

   ── BREAKPOINT CONTRACT ──────────────────────────────────────────────────
   Mobile-first. There are exactly TWO breakpoints, used consistently:
     • base                 phones (the default; design here first)
     • @media (min-width: 600px)   large phone / portrait tablet — multi-column
                                   GRIDS go 2-up here (cards, stats). Single-
                                   column components stay stacked.
     • @media (min-width: 1024px)  desktop — full layouts (hero/split 2-col,
                                   grids to final column count, nav expands).
   Tablets (768–1023) intentionally get the mobile layout (stacked + swipe
   carousels) — it degrades gracefully and never breaks. Do not invent new
   breakpoints in components.
   ============================================================================= */

:root {
  /* === COLOR — brand ===================================================== */
  --k-paper:        #FFFFFF;
  --k-canvas:       #FBFDFB;   /* page/section base. Standard value: guidelines/color-core.html declares
                                  it, and the deck's slide surface is the same hex. The green here is +2
                                  on one channel, i.e. imperceptible, so it is NOT the clinical read.
                                  Cards stay --k-paper (#FFF) so they pop. */
  --k-ink:          #0A0A0A;
  --k-muted:        #5B635D;   /* body gray — lightened one notch for a more refined read */
  --k-body:         #3C4642;   /* lead/intro copy — darker than muted, matches the deck's .lead */
  --k-deep:         #2C6355;
  --k-deep-2:       #0F2A24;
  --k-jade:         #09D3A0;
  --k-jade-press:   #0BC295;
  --k-mint:         #F2FBF7;
  /* Escalera de tintes (50 = mint). Todo stop de gradiente-wash vive aquí. */
  --k-tint-100:     #EFFAF4;
  --k-tint-200:     #D8F0E6;
  --k-tint-300:     #C6E9D8;
  --k-tint-400:     #9BD6BD;

  /* === COLOR — derived tints (theme these, not raw rgba in components) === */
  --k-jade-soft:    rgba(9, 211, 160, 0.14);   /* pills, soft fills on light */
  --k-line:         rgba(44, 99, 85, 0.12);    /* hairline border on light */
  --k-line-strong:  rgba(44, 99, 85, 0.28);    /* hover/emphasis border on light */
  --k-line-hover:   rgba(11, 211, 160, 0.55);  /* jade border on card hover — was 3 loose rgbas */
  --k-mint-line:    rgba(44, 99, 85, 0.16);
  /* --k-scrim removed: .k-tile's overlay is a 3-stop gradient (transparent →
     .30 → .82), which a single flat value cannot express. Nothing referenced it. */

  /* === COLOR — per-product card gradients (tonal-green ladder) =========== */
  --k-prod-cobros:   linear-gradient(160deg, #2C6355 0%, #0F2A24 100%);  /* deep   */
  --k-prod-credito:  linear-gradient(160deg, #2A9B74 0%, #13684E 100%);  /* mid    */
  /* The two pale steps go NEUTRAL. A big pale-green panel is what read as clinical;
     cobros/crédito keep the deep greens because dark green is the brand anchor. */
  --k-prod-software: linear-gradient(160deg, #E9EBE9 0%, #DFE3E1 100%);  /* pale neutral  */
  --k-prod-seguros:  linear-gradient(160deg, #DFE3E1 0%, #C9D3CE 100%);  /* light neutral */

  /* === COLOR — semantic surfaces ========================================= */
  --k-surface:      var(--k-canvas);
  --k-surface-alt:  linear-gradient(180deg, var(--k-tint-200) 0%, var(--k-tint-100) 100%);  /* livelier green wash — a real beat vs canvas */
  --k-surface-gray: #F5F6F4;   /* clean modern off-white beat (Shopify/Square), flat — no grain */
  --k-surface-sunken: #F1EFE8;   /* warm "inert/dead" fill — e.g. the one-time-sale panel in Cómo ganas */
  /* Dead-state tonal ladder (the "una venta normal" panel) — kept as tokens so the
     grayed/inert look stays one system, not four loose hexes. */
  --k-sunken-ink:    #6E6959;   /* headline on the dead panel — 4.77:1, valor del deck */
  --k-sunken-line:   #D3CFC4;   /* dashed empty-coin border          */
  --k-sunken-coin:   #BCB6A8;   /* the single paid coin              */
  --k-sunken-label:  #ACA695;   /* month labels under the dead coins */
  --k-sunken-disabled: #8A8475; /* disabled button label — exempt from contrast (WCAG) */
  --k-jade-deep:    #1D9E75;   /* solid mid-jade for fills/bars on light (the brighter --k-jade is for accents) */
  --k-jade-ink:     #15805E;   /* texto jade <18px sobre claro (4.80:1); espejo de jadeInk del deck */
  --k-deep-flat:    #12402F;   /* fallback plano del gradiente deep (impresión / PowerPoint) */
  /* Dark sections get a jade light-glow + a richer (less gray) green — Shopify's
     "dark base + bright pop" energy. Glow sits top-right so white text stays readable. */
  --k-surface-deep: radial-gradient(115% 115% at 88% 6%, rgba(11, 211, 160, 0.24) 0%, rgba(11, 211, 160, 0) 46%), linear-gradient(155deg, #15553F 0%, #0B201B 100%);

  /* === COLOR — text + fills on deep-green surfaces ======================= */
  --k-on-deep:        #FFFFFF;
  --k-on-deep-soft:   rgba(255, 255, 255, 0.85);
  --k-on-deep-faint:  rgba(255, 255, 255, 0.42);  /* SOLO rellenos no informativos, nunca texto */
  --k-on-deep-line:   rgba(255, 255, 255, 0.16);
  --k-on-deep-fill:   rgba(255, 255, 255, 0.12);  /* translucent pills/chips on deep */
  --k-on-deep-glass:  rgba(255, 255, 255, 0.10);  /* pill-rail track */
  --k-on-deep-gov:    rgba(255, 255, 255, 0.72);  /* texto informativo pequeño sobre deep (5.38:1) */

  /* === COLOR — DECK / PRINT-FLAT SET =====================================
     Promoted from the merchant deck (Sales material/wireframes.html), which had
     been inventing these eleven hexes outside the system. Fable ruling
     2026-07-29: the deck keeps authority over DECISIONS (patterns, layouts, the
     competitor-verified moves) but not over VALUES. So the values move here and
     the deck's appearance does not change at all.

     Why they are solid rather than rgba like the --k-on-deep set above: the deck
     is exported to PDF and PowerPoint, where alpha over a gradient is unreliable.
     These are the flat equivalents. Prefer the rgba set on the web.
     Law: no surface invents a hex. Enforced by tools/check-palette.mjs. */
  --k-deep-border:      #0B241D;   /* border of a deep panel (deck .s.deep)      */
  --k-deep-well:        #1B4636;   /* image well ON deep                         */
  --k-deep-circle:      #1E4A3A;   /* circle fill ON deep                        */
  --k-deep-rule:        #385F50;   /* divider/rule ON deep                       */
  --k-on-deep-flat:     #DBE0DE;   /* body text ON deep, flat (= on-deep-soft)   */
  --k-on-deep-flat-dim: #BCC4C1;   /* footnote text ON deep, flat                */
  --k-faint:            #8A948F;   /* faint meta text on light (deck .src/.foot) */
  --k-connector:        #C1D2CC;   /* neutral connector line between figures     */
  --k-line-flat:        #C9D3CE;   /* solid hairline (= --k-line, no alpha)      */
  --k-well-light:       #E4E8E6;   /* placeholder well on light                  */
  --k-tint-object:      #EAF3EF;   /* pale green, objects UNDER 64px only        */
  --k-tint-box:         #F7FBF9;   /* pale green fill of one bordered box        */

  /* === COLOR — feedback ================================================== */
  --k-error:        #B0413E;
  --k-error-soft:   rgba(176, 65, 62, 0.12);
  --k-warn:         #96621F;   /* advertencia — 5.2:1 sobre blanco, pasa 4.5 a cualquier tamaño */
  --k-warn-soft:    rgba(150, 98, 31, 0.12);
  /* éxito = --k-jade-ink texto / --k-jade-soft fondo (no se inventa otro verde) */
  /* RESERVADO (aún sin uso, a propósito): --k-warn, --k-warn-soft y la paleta de
     gráficas. Los contrastes ya están verificados; no se borran ni se reinventan
     cuando haga falta una advertencia o una gráfica. */
  /* Gráficas: máximo 4 series, escalones de luminosidad distintos */
  --k-chart-1:      #1D9E75;
  --k-chart-2:      #2C6355;
  --k-chart-3:      #46818B;   /* escalón azul-verde: 4.4:1, distinguible de 1 y 2 */
  --k-chart-4:      #6E6959;
  --k-placeholder:  rgba(74, 79, 75, 0.60);

  /* === TYPE =============================================================== */
  --k-font: 'Plus Jakarta Sans', system-ui, -apple-system, 'Segoe UI', sans-serif;

  --k-fw-regular: 400;
  --k-fw-medium:  500;
  --k-fw-semi:    600;
  --k-fw-bold:    700;

  /* Fluid display + section headings (retune per breakpoint below). */
  --k-fs-display: clamp(40px, 7.5vw, 64px);
  --k-fs-hero:    clamp(36px, 6.4vw, 72px);   /* landing hero (aliados) — big but balanced, ~Shopify scale */
  --k-fs-h2:      clamp(30px, 5vw, 46px);
  --k-fs-h3:      clamp(20px, 2.2vw, 24px);
  --k-fs-lead:    clamp(17px, 1.2vw, 20px);

  /* Fixed steps — every body/label size in the system maps to one of these. */
  --k-fs-body:    16px;   /* default body (→ 17 desktop)                     */
  --k-fs-md:      17px;   /* emphasized body                                 */
  --k-fs-sm:      15px;   /* secondary copy (cards, steps, testimonials…)    */
  --k-fs-xs:      14px;   /* meta, footer links, brand sublabel              */
  --k-fs-eyebrow: 13px;   /* section eyebrow, form hints                     */
  --k-fs-2xs:     12px;   /* logo-strip eyebrow                              */
  --k-fs-3xs:     11px;   /* legal fine print                                */
  --k-fs-cta:     16px;   /* buttons — keeps every button identical          */

  --k-lh-display: 1.04;
  --k-lh-tight:   1.1;
  --k-lh-snug:    1.2;
  --k-lh-normal:  1.5;
  --k-lh-relaxed: 1.6;

  --k-tr-display: -0.02em;
  --k-tr-snug:    -0.014em;
  --k-tr-flat:    -0.005em;

  /* === SPACING =========================================================== */
  --k-sp-xs:  8px;
  --k-sp-sm:  12px;
  --k-sp-md:  16px;
  --k-sp-lg:  24px;
  --k-sp-xl:  32px;
  --k-sp-2xl: 48px;
  --k-sp-3xl: 64px;
  /* Per-section vertical padding = HALF the inter-section gap. Every section pads
     itself top AND bottom by this, with no collapse hack, so the gap between any
     two sections is 2× this (identical to the old rhythm) and colour boundaries
     split breathing room evenly — no per-section spacing tweaks needed. */
  --k-section-y: clamp(36px, 3vw + 16px, 64px);
  --k-gap:       clamp(16px, 2vw, 24px);

  /* === LAYOUT ============================================================ */
  --k-container: 1280px;
  --k-pad:       24px;
  --k-card-pad:  clamp(24px, 2.4vw, 32px);   /* pad canónico de tarjeta; escala base 4 (extremos = pasos) */

  /* === RADIUS ============================================================ */
  --k-r-sm:    12px;
  --k-r-md:    16px;
  --k-r-lg:    20px;
  --k-r-xl:    24px;
  --k-r-2xl:   28px;
  --k-r-pill:  999px;
  --k-r-image: 20px;

  /* === MOTION ============================================================ */
  --k-ease: cubic-bezier(0.2, 0.7, 0.2, 1);
  --k-dur:  0.2s;

  /* === ELEVATION (used sparingly — the system prefers borders) ===========
     One coherent ladder. Light-surface UI shadows are green-tinted and subtle;
     "float" shadows are darker, only for chips/mockups that hover over photos or
     dark panels (where a tinted shadow would vanish). Same blur/opacity rhythm. */
  --k-shadow-xs:    0 1px 3px rgba(16, 42, 36, 0.06);                                      /* rest lift, clickable cards */
  --k-shadow-sm:    0 4px 18px rgba(16, 42, 36, 0.06);                                     /* sticky nav on light        */
  --k-shadow-md:    0 1px 2px rgba(16, 42, 36, 0.04), 0 10px 28px rgba(16, 42, 36, 0.07);  /* raised cards               */
  --k-shadow-lg:    0 18px 44px rgba(15, 42, 36, 0.20);                                    /* hero media image           */
  --k-shadow-float:    0 10px 24px rgba(0, 0, 0, 0.28);                                    /* chips/tiles over imagery   */
  --k-shadow-float-lg: 0 28px 60px rgba(0, 0, 0, 0.42);                                    /* device mockups             */

  /* === FIXED CHROME ====================================================== */
  --k-nav-h:   64px;
}

@media (min-width: 1024px) {
  :root {
    --k-fs-body:    18px;
    --k-fs-display: clamp(56px, 4vw, 68px);
    --k-fs-h2:      clamp(44px, 3.4vw, 60px);
    --k-pad:        32px;
    --k-r-image:    24px;
    --k-nav-h:      72px;
  }
}


/* ===== base.css ==================================================== */
/* =============================================================================
   KUENTA COMPONENTS — BASE
   Reset, document defaults, shared layout primitives (.k-container,
   .k-section), accessibility helpers. Loaded right after tokens.css.
   ============================================================================= */

*, *::before, *::after { box-sizing: border-box; }

* { margin: 0; padding: 0; }

html {
  scroll-behavior: smooth;
  scroll-padding-top: calc(var(--k-nav-h) + 12px);   /* clear the sticky header on anchor jumps */
  -webkit-text-size-adjust: 100%;
  -webkit-tap-highlight-color: transparent;          /* no gray flash on mobile tap */
}

body {
  font-family: var(--k-font);
  font-size: var(--k-fs-body);
  line-height: var(--k-lh-normal);
  color: var(--k-ink);
  background: var(--k-canvas);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  overflow-x: hidden;
}

img, svg, video { display: block; max-width: 100%; }
img { height: auto; }

a { color: inherit; text-decoration: none; }

button { font: inherit; color: inherit; background: none; border: 0; cursor: pointer; }

ul, ol { list-style: none; }

h1, h2, h3, h4 {
  font-weight: var(--k-fw-bold);
  line-height: var(--k-lh-tight);
  text-wrap: balance;            /* even, no orphan words — headlines wrap like a designer set them */
}

/* Leads/body get widow control (last word never alone on its own line). */
p { text-wrap: pretty; }

/* Branded text selection — jade wash, deep-green ink. Reads on light and dark. */
::selection { background: var(--k-jade); color: var(--k-deep-2); }

/* Tabular figures on money/metric displays: digits share one width so amounts
   align in columns and never jitter — the correct default for a payments brand. */
.k-stat__metric, .k-hero__chip-sub, .k-review__proof { font-variant-numeric: tabular-nums; }

:focus-visible {
  outline: 2px solid var(--k-jade-deep);
  outline-offset: 3px;
  border-radius: 4px;
}
/* Sobre deep el anillo vuelve a jade brillante: ahí sí contrasta (4.5:1+). */
.k-section--deep :focus-visible,
.k-hero--deep :focus-visible,
.k-cta--deep :focus-visible { outline-color: var(--k-jade); }

/* === LAYOUT PRIMITIVES =================================================== */
.k-container {
  width: 100%;
  max-width: var(--k-container);
  margin-inline: auto;
  padding-inline: var(--k-pad);
}

.k-section {
  padding-block: var(--k-section-y);
  background: var(--k-surface);
  color: var(--k-ink);
}
.k-section--alt  { background: var(--k-surface-alt); }
/* Clean off-white inner-panel beat — flat and modern (Shopify/Square), no grain. */
.k-section--gray {
  background-color: var(--k-surface-gray);
}
.k-section--deep { background: var(--k-surface-deep); color: var(--k-on-deep); }

/* Section rhythm: every section pads itself by HALF the gap (--k-section-y) on
   top and bottom. The visible gap between two sections is the two halves added
   together — one consistent value everywhere — and at a colour boundary each
   section keeps its own breathing room. No collapse hack, no per-section tweaks. */

/* Soft jade "daylight" glow behind a hero/section — warm and human, NOT a tech
   grid. Put on an absolutely-positioned child; the parent must be position:relative. */
.k-glow {
  position: absolute; inset: 0; z-index: 0; pointer-events: none;
  /* The jade layer is gone: a 16% green wash across the top of a hero is exactly
     the "clinical" read. What's left is a neutral vignette that gives the same
     depth with no hue. */
  background:
    radial-gradient(80% 70% at 50% 6%,  rgba(10,10,10,.035), transparent 60%),
    radial-gradient(60% 45% at 50% 0%,  rgba(10,10,10,.02),  transparent 70%);
}

/* === ACCESSIBILITY ====================================================== */
.k-sr-only {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

.k-skip-link {
  position: absolute;
  left: -9999px; top: auto;
}
.k-skip-link:focus {
  position: fixed; left: 16px; top: 16px; z-index: 9999;
  background: var(--k-ink); color: var(--k-paper);
  padding: 10px 16px; border-radius: 8px; font-weight: var(--k-fw-bold);
}

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    transition-duration: 0.01ms !important;
  }
}


/* ===== buttons.css ================================================= */
/* =============================================================================
   KUENTA COMPONENTS — BUTTONS
   Primary  : deep-green pill on light surfaces; flips to jade on dark ones.
   Secondary: outline pill — adapts to light or dark surface via currentColor.
   Link     : text + optional arrow, no chrome.
   Block    : full-width tap target (forms / bottom-of-page conversion only).
   No glow, no decorative shadow. Subtle 1px hover lift on the primary.
   ============================================================================= */

.k-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  height: 48px;
  padding: 0 26px;
  font-family: inherit;
  font-size: var(--k-fs-cta, 16px);
  font-weight: var(--k-fw-bold);
  letter-spacing: var(--k-tr-flat);
  line-height: 1;
  white-space: nowrap;
  border-radius: var(--k-r-pill);
  transition: transform var(--k-dur) var(--k-ease),
              background-color var(--k-dur) var(--k-ease),
              border-color var(--k-dur) var(--k-ease),
              color var(--k-dur) var(--k-ease);
}
.k-btn svg { width: 18px; height: 18px; flex: 0 0 auto; }

/* --- Primary -------------------------------------------------------------- */
/* Hierarchy by surface (Shopify pattern): a confident DEEP-GREEN pill on light
   sections, flipping to the loud JADE pill on dark sections — so the bright
   accent is reserved for the dark "energy" moments instead of firing everywhere. */
.k-btn--primary {
  background: var(--k-deep);
  color: var(--k-paper);
}
.k-btn--primary:hover  { background: var(--k-deep-2); transform: translateY(-1px); }
.k-btn--primary:active { transform: translateY(0) scale(.97); }

/* On a dark surface the primary becomes the jade pill (the loud one). */
.k-section--deep .k-btn--primary,
.k-cta--deep    .k-btn--primary,
.k-hero--deep   .k-btn--primary,
.al-cta         .k-btn--primary {
  background: var(--k-jade);
  color: var(--k-ink);
}
.k-section--deep .k-btn--primary:hover,
.k-cta--deep    .k-btn--primary:hover,
.k-hero--deep   .k-btn--primary:hover,
.al-cta         .k-btn--primary:hover { background: var(--k-jade-press); }

/* --- Secondary (outline) — works on light and dark via currentColor ------- */
.k-btn--secondary {
  background: transparent;
  color: currentColor;
  border: 1.5px solid currentColor;
}
.k-btn--secondary:hover  { transform: translateY(-1px); }
.k-btn--secondary:active { transform: scale(.97); }
/* On a light surface, fill on hover for contrast */
.k-section:not(.k-section--deep) .k-btn--secondary:hover,
.k-btn--secondary.k-btn--on-light:hover {
  background: var(--k-ink); color: var(--k-paper); border-color: var(--k-ink);
}

/* --- Link (text + arrow) -------------------------------------------------- */
.k-btn--link {
  height: auto;
  padding: 0;
  border-radius: 0;
  background: transparent;
  color: var(--k-deep);
  font-weight: var(--k-fw-semi);
}
.k-btn--link:hover {
  color: var(--k-ink);
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 4px;
}
.k-section--deep .k-btn--link { color: var(--k-jade); }

/* --- Estados: deshabilitado + foco ---------------------------------------- */
.k-btn:disabled,
.k-btn[aria-disabled="true"] {
  background: var(--k-surface-sunken);
  color: var(--k-sunken-disabled);               /* deshabilitado: exento de contraste (WCAG) */
  border-color: transparent;
  pointer-events: none;
  transform: none;
}
.k-btn:focus-visible { outline: 2px solid var(--k-jade-deep); outline-offset: 3px; }
.k-section--deep .k-btn:focus-visible,
.k-cta--deep    .k-btn:focus-visible,
.k-hero--deep   .k-btn:focus-visible,
.al-cta         .k-btn:focus-visible { outline-color: var(--k-jade); }

/* --- Size / width variants ----------------------------------------------- */
.k-btn--sm { height: 42px; padding: 0 22px; font-size: var(--k-fs-sm); }

@media (max-width: 1023px) {
  /* Full-width block: reserve for form submits + dedicated conversion bands.
     NOT for hero CTAs — hero CTAs stay compact, set by hero.css. */
  .k-btn--block { width: 100%; height: 50px; font-size: var(--k-fs-md); }
}


/* ===== header.css ================================================== */
/* =============================================================================
   KUENTA COMPONENTS — HEADER (+ promo)
   Sticky bar: logo (left) · nav (center-left) · CTA (right) on desktop;
   logo · hamburger on mobile. Two moods — light (paper pages) and dark
   (deep-green pages) — chosen to match the hero it sits above.

   Optional promo bar above the nav: a thin deep-green cross-sell strip
   (e.g. merchant page → "Sé Aliado"). It scrolls away; the nav stays.

   On scroll, js/ui.js adds .is-scrolled to .k-header for a hairline + faint
   shadow so the bar separates from page content.

   Structure (HTML):
     <a class="k-promo" href="/aliados/">                         <!-- optional -->
       <span>Lleva Kuenta a comercios.</span> <strong>Sé Aliado →</strong>
     </a>
     <header class="k-header k-header--light">
       <div class="k-header__bar">
         <div class="k-header__inner k-container">
           <a class="k-header__logo" href="/" aria-label="Inicio Kuenta">
             <img class="k-header__logo-dark"  src="/assets/logos/kuenta-logo.svg" alt="Kuenta">
             <img class="k-header__logo-light" src="/assets/logos/kuenta-logo-white.svg" alt="Kuenta">
           </a>
           <nav class="k-header__nav" aria-label="Principal">
             <a href="#productos">Productos</a> …
           </nav>
           <a class="k-header__cta k-btn k-btn--primary k-btn--sm" href="/hablar-con-kuenta/">Hablar con Kuenta</a>
           <button class="k-header__menu" type="button" aria-label="Abrir menú"
                   aria-expanded="false" aria-controls="k-menu" data-menu-open>
             <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><line x1="4" y1="8" x2="20" y2="8"/><line x1="4" y1="16" x2="20" y2="16"/></svg>
           </button>
         </div>
       </div>
     </header>
   ============================================================================= */

/* === HEADER (sticky) ==================================================== */
.k-header {
  position: sticky;
  top: 0;
  z-index: 50;
  width: 100%;
}

.k-header__bar {
  background: var(--k-paper);
  transition: box-shadow var(--k-dur) var(--k-ease),
              border-color var(--k-dur) var(--k-ease);
  border-bottom: 1px solid transparent;
}
.k-header.is-scrolled .k-header__bar {
  border-bottom-color: var(--k-line);
  box-shadow: var(--k-shadow-sm);
}

.k-header__inner {
  height: var(--k-nav-h);
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
}

/* --- Logo (col 1) --------------------------------------------------------- */
.k-header__logo {
  grid-column: 1;
  display: inline-flex;
  align-items: center;
  justify-self: start;
}
.k-header__logo img { width: 104px; height: auto; }
.k-header__logo-light { display: none; }   /* dark mood swaps these */

/* --- Nav (col 2, desktop only) ------------------------------------------- */
.k-header__nav { display: none; grid-column: 2; }

/* --- CTA (col 3, desktop only) ------------------------------------------- */
.k-header__cta { display: none; grid-column: 3; justify-self: end; }

/* --- Hamburger (col 3, mobile only) -------------------------------------- */
.k-header__menu {
  grid-column: 3;
  justify-self: end;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px; height: 44px;
  margin-right: -10px;          /* optical: icon edge aligns to container edge */
  color: var(--k-ink);
}
.k-header__menu svg { width: 24px; height: 24px; }

/* === MOOD: DARK ========================================================= */
.k-header--dark .k-header__bar    { background: var(--k-deep); }
.k-header--dark .k-header__menu   { color: var(--k-on-deep); }
.k-header--dark .k-header__logo-dark  { display: none; }
.k-header--dark .k-header__logo-light { display: block; }
.k-header--dark.is-scrolled .k-header__bar {
  border-bottom-color: var(--k-on-deep-line);
  box-shadow: var(--k-shadow-sm);
}

/* === DESKTOP ============================================================ */
@media (min-width: 1024px) {
  .k-header__menu { display: none; }

  .k-header__logo img { width: 112px; }

  .k-header__nav {
    display: flex;
    align-items: center;
    gap: 30px;
    padding-left: 48px;
  }
  .k-header__nav a {
    font-size: var(--k-fs-sm);
    font-weight: var(--k-fw-semi);
    letter-spacing: var(--k-tr-snug);
    color: var(--k-ink);
    line-height: 1;
    transition: color var(--k-dur) var(--k-ease);
  }
  .k-header__nav a:hover { color: var(--k-deep); }

  .k-header__cta { display: inline-flex; }

  .k-header--dark .k-header__nav a        { color: var(--k-on-deep); }
  .k-header--dark .k-header__nav a:hover   { color: var(--k-jade); }
}


/* ===== menu.css ==================================================== */
/* =============================================================================
   KUENTA COMPONENTS — MOBILE MENU (drawer)
   Full-screen paper overlay. Mirrors the header top row (logo + close),
   large stacked links, primary CTA pinned at the bottom. Mobile only —
   never shows at desktop. Opened by any [data-menu-open]; wired in js/ui.js.

   Structure (HTML) — place once near the end of <body>:
     <div class="k-menu" id="k-menu" aria-hidden="true">
       <div class="k-menu__panel" role="dialog" aria-modal="true" aria-label="Menú">
         <div class="k-menu__top k-container">
           <a class="k-menu__logo" href="/" aria-label="Inicio Kuenta">
             <img src="/assets/logos/kuenta-logo.svg" alt="Kuenta">
           </a>
           <button class="k-menu__close" type="button" aria-label="Cerrar menú" data-menu-close>
             <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><line x1="6" y1="6" x2="18" y2="18"/><line x1="6" y1="18" x2="18" y2="6"/></svg>
           </button>
         </div>
         <nav class="k-menu__nav k-container" aria-label="Principal">
           <a href="#productos">Productos</a>
           <a href="#como-trabajamos">Cómo te ayudamos</a>
           <a href="/aliados/">Aliados</a>
           <a href="#preguntas">Preguntas</a>
         </nav>
         <div class="k-menu__foot k-container">
           <a class="k-btn k-btn--primary k-btn--block" href="/hablar-con-kuenta/">Hablar con Kuenta</a>
         </div>
       </div>
     </div>
   ============================================================================= */

.k-menu {
  position: fixed;
  inset: 0;
  z-index: 100;
  background: var(--k-paper);
  opacity: 0;
  visibility: hidden;
  transition: opacity var(--k-dur) var(--k-ease),
              visibility var(--k-dur) var(--k-ease);
}
.k-menu.is-open { opacity: 1; visibility: visible; }

.k-menu__panel {
  height: 100dvh;
  display: flex;
  flex-direction: column;
  transform: translateY(-8px);
  transition: transform 0.25s var(--k-ease);
}
.k-menu.is-open .k-menu__panel { transform: none; }

.k-menu__top {
  flex: 0 0 auto;
  height: var(--k-nav-h);
  display: flex;
  align-items: center;
  justify-content: space-between;
}
.k-menu__logo img { width: 104px; height: auto; }

.k-menu__close {
  width: 44px; height: 44px;
  margin-right: -10px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: var(--k-ink);
}
.k-menu__close svg { width: 24px; height: 24px; }

.k-menu__nav {
  flex: 1 1 auto;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
  padding-top: var(--k-sp-xs);
}
.k-menu__nav a {
  font-size: clamp(24px, 7vw, 30px);
  font-weight: var(--k-fw-semi);
  letter-spacing: var(--k-tr-display);
  color: var(--k-ink);
  padding: 18px 0;
  border-bottom: 1px solid var(--k-line);
  transition: color var(--k-dur) var(--k-ease);
}
.k-menu__nav a:first-child { border-top: 1px solid var(--k-line); }
.k-menu__nav a:hover { color: var(--k-deep); }

.k-menu__foot {
  flex: 0 0 auto;
  padding-top: var(--k-sp-lg);
  padding-bottom: max(var(--k-sp-lg), env(safe-area-inset-bottom));
}

/* Scroll lock applied to <body> while the drawer is open (set by ui.js) */
.k-no-scroll { overflow: hidden; }

/* Desktop never shows the drawer */
@media (min-width: 1024px) {
  .k-menu { display: none !important; }
}


/* ===== footer.css ================================================== */
/* =============================================================================
   KUENTA COMPONENTS — FOOTER
   Deep-green footer. Mobile-first: link groups are native <details> accordions
   (zero JS). Desktop: the groups force open as static columns and the toggle
   is disabled. Brand + legal row at the bottom. Stori pattern.

   Structure (HTML):
     <footer class="k-footer">
       <div class="k-container">
         <div class="k-footer__brand">
           <a href="/" aria-label="Inicio Kuenta"><img src="/assets/logos/kuenta-logo-white.svg" alt="Kuenta"></a>
         </div>
         <div class="k-footer__cols">
           <details class="k-footer__col">
             <summary class="k-footer__col-head">Productos <span class="k-footer__mark" aria-hidden="true"></span></summary>
             <ul class="k-footer__links"><li><a href="#">Cobros</a></li>…</ul>
           </details>
           …
         </div>
         <div class="k-footer__bottom">
           <p class="k-footer__legal">© 2026 Kuenta. Todos los derechos reservados.</p>
           <p class="k-footer__fine">Kuenta es un distribuidor de soluciones…</p>
         </div>
       </div>
     </footer>
   ============================================================================= */

.k-footer {
  background: var(--k-deep-2);
  color: var(--k-on-deep);
  padding-block: 40px 32px;
}

.k-footer__brand { margin-bottom: 28px; }
.k-footer__brand img { height: 24px; width: auto; }

/* === LINK GROUPS — mobile accordion ==================================== */
.k-footer__cols { display: flex; flex-direction: column; }

.k-footer__col { border-top: 1px solid var(--k-on-deep-line); }
.k-footer__col:last-of-type { border-bottom: 1px solid var(--k-on-deep-line); }

.k-footer__col-head {
  list-style: none;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 18px 0;
  font-size: var(--k-fs-sm);
  font-weight: var(--k-fw-bold);
  letter-spacing: var(--k-tr-flat);
  color: var(--k-on-deep);
}
.k-footer__col-head::-webkit-details-marker { display: none; }
.k-footer__col-head::marker { content: ''; }

/* +/− mark (rotates to × when open) */
.k-footer__mark {
  position: relative;
  width: 18px; height: 18px;
  flex: 0 0 auto;
}
.k-footer__mark::before,
.k-footer__mark::after {
  content: '';
  position: absolute;
  background: var(--k-on-deep);
  transition: transform var(--k-dur) var(--k-ease), opacity var(--k-dur) var(--k-ease);
}
.k-footer__mark::before { top: 50%; left: 0; right: 0; height: 2px; transform: translateY(-1px); }
.k-footer__mark::after  { left: 50%; top: 0; bottom: 0; width: 2px; transform: translateX(-1px); }
.k-footer__col[open] .k-footer__mark::after { transform: translateX(-1px) scaleY(0); opacity: 0; }

.k-footer__links {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding-bottom: 14px;
}
.k-footer__links a {
  display: inline-block;
  padding: 8px 0;              /* bigger mobile tap target (links were ~18px tall) */
  font-size: var(--k-fs-xs);
  line-height: 1.5;
  color: var(--k-on-deep-soft);
  transition: color var(--k-dur) var(--k-ease);
}
.k-footer__links a:hover { color: var(--k-jade); }

/* === BOTTOM ============================================================ */
.k-footer__bottom { padding-top: 24px; }
.k-footer__legal { font-size: var(--k-fs-eyebrow); color: var(--k-on-deep-soft); line-height: 1.5; }
.k-footer__fine  { font-size: var(--k-fs-3xs); color: var(--k-on-deep-gov); line-height: 1.55; max-width: 880px; margin-top: 12px; }

/* === DESKTOP — static expanded columns ================================= */
@media (min-width: 1024px) {
  .k-footer { padding-block: 64px 40px; }
  .k-footer__brand { margin-bottom: 40px; }

  .k-footer__cols {
    flex-direction: row;
    gap: clamp(32px, 5vw, 96px);
    flex-wrap: wrap;
  }
  .k-footer__col {
    border: 0 !important;
    flex: 0 0 auto;
  }
  /* Force the groups open + disable the toggle on desktop. Newer Chrome wraps
     a closed <details>'s content in ::details-content { content-visibility:
     hidden }, which display/visibility on the children can't override — so we
     reveal the pseudo directly. The display:flex keeps older engines working. */
  .k-footer__col::details-content { content-visibility: visible; }
  .k-footer__col-head { pointer-events: none; padding: 0 0 16px; cursor: default; }
  .k-footer__mark { display: none; }
  .k-footer__links { display: flex !important; padding-bottom: 0; }

  .k-footer__bottom {
    margin-top: 48px;
    padding-top: 28px;
    border-top: 1px solid var(--k-on-deep-line);
  }
}


/* ===== hero.css ==================================================== */
/* =============================================================================
   KUENTA COMPONENTS — HERO
   Left text + right media. One component, two moods (paper / deep).
   Reference: Instacart Enterprise + Shopify (medium-weight large headline,
   short lead, compact CTA, balanced media panel).

   Mobile : stacked — title → lead → actions → media. CTA is a
            compact left-aligned pill (NOT full width).
   Desktop: two balanced columns, text left, media right, vertically centered.

   Structure (HTML):
     <section class="k-hero k-hero--paper">
       <div class="k-hero__inner k-container">
         <div class="k-hero__content">
           <h1 class="k-hero__title">Cobra mejor y crece con <em class="k-accent">Kuenta</em>.</h1>
           <p  class="k-hero__lead">…</p>
           <div class="k-hero__actions">
             <a class="k-btn k-btn--primary" href="#">Hablar con Kuenta</a>
           </div>
         </div>
         <div class="k-hero__media">
           <img class="k-hero__image" src="…" alt="…">
         </div>
       </div>
     </section>
   ============================================================================= */

.k-hero {
  position: relative;
  overflow: hidden;
  isolation: isolate;
  background: var(--k-canvas);
  color: var(--k-ink);
}

.k-hero__inner {
  display: flex;
  flex-direction: column;
  gap: clamp(28px, 6vw, 40px);
  padding-block: clamp(36px, 6vw, 64px) clamp(52px, 9vw, 96px);
}

/* --- Content -------------------------------------------------------------- */
.k-hero__content {
  display: flex;
  flex-direction: column;
  gap: var(--k-sp-md);
  max-width: 600px;
}

.k-hero__title {
  font-size: var(--k-fs-display);
  font-weight: var(--k-fw-semi);
  line-height: var(--k-lh-display);
  letter-spacing: var(--k-tr-display);
  color: inherit;
}
.k-hero__title .k-accent { color: var(--k-jade-deep); font-style: normal; }

.k-hero__lead {
  font-size: var(--k-fs-lead);
  line-height: var(--k-lh-normal);
  color: var(--k-muted);
  max-width: 46ch;
}

.k-hero__actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 12px;
  margin-top: var(--k-sp-xs);
}

/* --- Media ---------------------------------------------------------------- */
.k-hero__media {
  width: 100%;
  aspect-ratio: 4 / 3;
  border-radius: var(--k-r-image);
  background: var(--k-surface-gray);
  position: relative;       /* anchor for floating overlay chips */
  overflow: visible;        /* let chips spill past the photo edge (Shopify style) */
}
/* Image carries its own radius so it stays rounded even though the media no
   longer clips. */
.k-hero__image { width: 100%; height: 100%; object-fit: cover; border-radius: var(--k-r-image); }

/* === MEDIA: PRODUCT STAGE (product-led hero — no stock/AI photo) =========
   Soft brand-green stage holds the real product render floating, with one small
   UI chip for life. The product is the proof, so it can't look bought. */
.k-hero__media--stage {
  background: linear-gradient(165deg, var(--k-surface-gray) 0%, #DFE3E1 100%);
  display: flex;
  align-items: center;
  justify-content: center;
  position: relative;
  padding: clamp(20px, 4vw, 44px);
}
.k-hero__stage-art {
  width: auto;
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
  filter: drop-shadow(var(--k-shadow-lg));
}
.k-hero__chip {
  position: absolute;
  bottom: 8%;
  right: 4%;
  z-index: 2;
  display: flex;
  align-items: center;
  gap: 10px;
  background: var(--k-paper);
  border-radius: var(--k-r-md);
  padding: 11px 15px;
  box-shadow: var(--k-shadow-md);
}
.k-hero__chip-dot {
  width: 26px; height: 26px;
  flex: 0 0 auto;
  border-radius: var(--k-r-pill);
  background: var(--k-jade);
  display: flex; align-items: center; justify-content: center;
}
.k-hero__chip-dot svg { width: 15px; height: 15px; }
.k-hero__chip-text { font-size: var(--k-fs-xs); font-weight: var(--k-fw-semi); color: var(--k-ink); line-height: 1.2; }
.k-hero__chip-sub  { display: block; font-size: var(--k-fs-2xs); font-weight: var(--k-fw-regular); color: var(--k-muted); margin-top: 2px; }

/* Floating overlays that STRADDLE the photo edge (Shopify-affiliates style):
   half on the image, half spilling into the space around it. */
.k-hero__chip--bl { top: auto; bottom: 6%; left: 4%; right: auto; }   /* mobile: kept inside */
.k-hero__chip--tr { display: none; }                                  /* mobile: one chip only */
@media (min-width: 1024px) {
  .k-hero__chip--bl { bottom: 12%; right: -30px; left: auto; animation: alFloat 5s ease-in-out infinite; }         /* straddles bottom-right edge, gentle float */
  .k-hero__chip--tr { display: flex; top: 13%; left: -30px; right: auto; bottom: auto; animation: alFloat 6.2s ease-in-out infinite reverse; }  /* straddles left edge, gentle float */
}
@media (prefers-reduced-motion: reduce) { .k-hero__chip { animation: none !important; } }

/* === MOOD: DEEP ========================================================== */
.k-hero--deep {
  background: var(--k-surface-deep);
  color: var(--k-on-deep);
}
.k-hero--deep .k-hero__lead         { color: var(--k-on-deep-soft); }
.k-hero--deep .k-hero__title .k-accent { color: var(--k-jade); }

/* === MOBILE CTA — compact, left-aligned (never full width) =============== */
@media (max-width: 1023px) {
  .k-hero .k-hero__actions .k-btn--primary {
    min-width: 208px;
    align-self: flex-start;
  }
}

/* === DESKTOP ============================================================= */
@media (min-width: 1024px) {
  .k-hero__inner {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    align-items: center;
    column-gap: clamp(48px, 5vw, 88px);
    row-gap: 0;
    padding-block: clamp(56px, 6vw, 88px);
  }
  .k-hero__content { grid-column: 1; gap: var(--k-sp-lg); }
  .k-hero__actions { margin-top: var(--k-sp-sm); }
  .k-hero__media {
    grid-column: 2;
    aspect-ratio: auto;
    height: clamp(440px, 38vw, 540px);
  }
}


/* ===== section.css ================================================= */
/* =============================================================================
   KUENTA COMPONENTS — SECTION HEAD
   The shared heading block every content component reuses: H2 title and an
   optional lead. The .k-section WRAPPER (padding + bg moods) lives
   in base.css; this file is just the head typography + alignment.

   Reference: Instacart / Shopify / DoorDash section intros — medium-weight
   large H2, one supporting line. Center for grids/carousels,
   left for split/editorial sections.

   Structure (HTML):
     <section class="k-section">                     <!-- or --alt / --deep -->
       <div class="k-container">
         <header class="k-section__head k-section__head--center">  <!-- or --left -->
           <h2 class="k-section__title">Soluciones para lo que tu comercio <em class="k-accent">necesita</em></h2>
           <p  class="k-section__lead">Una línea de apoyo, no un catálogo.</p>  <!-- optional -->
         </header>
         <!-- component body (cards, split, tabs…) -->
       </div>
     </section>
   ============================================================================= */

.k-section__head {
  display: flex;
  flex-direction: column;
  gap: var(--k-sp-sm);
  margin-bottom: clamp(32px, 4vw, 56px);
}

.k-section__head--center {
  align-items: center;
  text-align: center;
  max-width: 680px;
  margin-inline: auto;
}
.k-section__head--left {
  align-items: flex-start;
  text-align: left;
  max-width: 640px;
}

.k-section__title {
  font-size: var(--k-fs-h2);
  font-weight: var(--k-fw-semi);
  line-height: var(--k-lh-tight);
  letter-spacing: var(--k-tr-snug);
  color: inherit;
}
.k-section__title .k-accent { color: var(--k-jade-deep); font-style: normal; }
/* Break a two-idea headline onto its own second line (the line break separates
   the two ideas, so no period is needed between them). */
.k-line2 { display: block; }   /* global: también h1 de hero (regla sin punto) */

/* Centered action under a section header (e.g. a bridge/cross-sell beat). */
.k-section__cta { margin-top: clamp(22px, 2.6vw, 30px); display: flex; justify-content: center; }

.k-section__lead {
  font-size: var(--k-fs-lead);
  line-height: var(--k-lh-normal);
  /* was --k-muted; the deck sets leads a notch darker than small copy */
  color: var(--k-body);
  max-width: 56ch;
}

/* === ON A DEEP-GREEN SECTION ============================================ */
.k-section--deep .k-section__lead         { color: var(--k-on-deep-soft); }
.k-section--deep .k-section__title .k-accent { color: var(--k-jade); }

/* === DESKTOP ============================================================ */
@media (min-width: 1024px) {
  .k-section__head {
    gap: var(--k-sp-md);
    margin-bottom: clamp(48px, 4vw, 72px);
  }
  .k-section__head--center { max-width: 760px; }
  .k-section__head--left   { max-width: 680px; }
}

/* Mint mood — a soft beat to break two pale sections running together. */
.k-section--mint { background: var(--k-surface-gray); }


/* Bridge trio — three products as a centered icon row on deep-green (replaces a
   prose lead naming them). */
.k-bridge__trio { list-style: none; display: flex; flex-wrap: wrap; justify-content: center; gap: clamp(20px, 4vw, 56px); margin: clamp(6px, 1.4vw, 16px) 0 clamp(26px, 3vw, 34px); padding: 0; }
.k-bridge__trio li { display: flex; flex-direction: column; align-items: center; gap: 5px; font-size: var(--k-fs-md); font-weight: var(--k-fw-semi); color: var(--k-on-deep); }
.k-bridge__trio li span { font-size: var(--k-fs-sm); font-weight: var(--k-fw-regular); color: var(--k-on-deep-soft); }
.k-bridge__trio svg { width: 30px; height: 30px; stroke: var(--k-jade); stroke-width: 1.8; fill: none; stroke-linecap: round; stroke-linejoin: round; }

/* "Qué pasa después" — a compact 3-step reassurance under an intake form,
   resolving the "I submitted, now what?" anxiety at the point of conversion. */
.k-next { margin-top: clamp(18px, 2.4vw, 26px); padding-top: clamp(16px, 2vw, 20px); border-top: 1px solid var(--k-line); }
/* Sentence case on purpose: an all-caps letterspaced label above a block is the
   same template tell as the eyebrows removed 2026-08-02. */
.k-next__head { font-size: var(--k-fs-sm); font-weight: var(--k-fw-bold); color: var(--k-ink); margin: 0 0 12px; }
.k-next__list { list-style: none; margin: 0; padding: 0; display: grid; gap: 10px; }
.k-next__list li { display: flex; align-items: center; gap: 11px; font-size: var(--k-fs-sm); color: var(--k-ink); }
.k-next__num { flex: 0 0 auto; width: 24px; height: 24px; border-radius: var(--k-r-pill); background: var(--k-jade-soft); color: var(--k-deep); font-size: var(--k-fs-2xs); font-weight: var(--k-fw-bold); display: inline-flex; align-items: center; justify-content: center; }


/* ===== cards.css =================================================== */
/* =============================================================================
   KUENTA COMPONENTS — CARDS (flexible grid)
   The workhorse. One grid (.k-cards) + one item (.k-card). Drives feature
   grids, "cómo trabajamos", the aliado opportunity grid, the 3-audience
   router, "why us" — by swapping a variant, not a component.

   Column count is flexible: --2 / --3 / --4 for fixed layouts, or --auto for
   "any count" sets (3, 5, 7…) that wrap responsively. 3-up and 4-up fall to
   2-up on tablet, 1-up on phones.

   Card anatomy (all optional except title):
     [icon | num | symbol] → title → copy → link

   Variants:
     --bordered (default) Instacart "Marketplace advantage" / DoorDash — paper
                          fill + hairline, for scan-and-compare grids.
     --bare               Shopify "diseñada para el futuro" / Partners — no box,
                          icon + text only, for feature lists where rhythm carries.
     --mint / --dark      filled emphasis moods (Instacart "capabilities").

   Structure (HTML):
     <div class="k-cards k-cards--3">
       <article class="k-card k-card--bordered">
         <span class="k-card__icon"><svg …></svg></span>      <!-- or __num / __symbol -->
         <h3 class="k-card__title">Te escuchamos</h3>
         <p  class="k-card__copy">Entendemos tu negocio y lo que necesitas resolver.</p>
         <a  class="k-card__link" href="#">Saber más &rarr;</a>  <!-- optional -->
       </article>
       …
     </div>
   ============================================================================= */

/* === GRID =============================================================== */
.k-cards {
  display: grid;
  grid-template-columns: 1fr;
  gap: clamp(14px, 2vw, 24px);
}
/* "Any count" — wraps to fit; use for 3, 5, 7-item sets. */
.k-cards--auto { grid-template-columns: repeat(auto-fit, minmax(232px, 1fr)); }

/* === CARD ============================================================== */
.k-card {
  display: flex;
  flex-direction: column;
  gap: var(--k-sp-sm);
  color: var(--k-ink);
  text-align: left;
}

.k-card__icon {
  display: inline-flex;
  width: 28px; height: 28px;
  color: var(--k-deep);
}
.k-card__icon svg { width: 100%; height: 100%; stroke-width: 1.8; fill: none; stroke-linecap: round; stroke-linejoin: round; }

.k-card__num {
  font-size: var(--k-fs-md);
  font-weight: var(--k-fw-bold);
  letter-spacing: 0.02em;
  color: var(--k-deep);
  line-height: 1;
}

.k-card__symbol {
  width: 52px; height: 52px;
  border-radius: var(--k-r-pill);
  /* Placeholder soft-jade puck; replace with the real symbol asset later. */
  background: radial-gradient(circle at 30% 30%, rgba(9,211,160,0.5) 0%, rgba(9,211,160,0.16) 70%);
}

.k-card__title {
  font-size: var(--k-fs-h3);
  font-weight: var(--k-fw-semi);
  line-height: var(--k-lh-snug);
  letter-spacing: var(--k-tr-flat);
  color: inherit;
}

.k-card__copy {
  font-size: var(--k-fs-body);
  line-height: var(--k-lh-normal);
  color: var(--k-muted);
}

.k-card__link {
  margin-top: auto;
  padding-top: var(--k-sp-xs);
  font-size: var(--k-fs-sm);
  font-weight: var(--k-fw-semi);
  color: var(--k-deep);
}
.k-card__link:hover { text-decoration: underline; text-underline-offset: 4px; }

/* === VARIANT: BARE (feature list) ======================================= */
.k-card--bare {
  background: transparent;
  border: 0;
  padding: var(--k-sp-xs) 0;
}

/* === MOOD: MINT ========================================================= */
.k-card--mint {
  background: var(--k-surface-gray);
  border: 0;
  border-radius: var(--k-r-md);
  padding: var(--k-card-pad);
}

/* === MOOD: DARK ========================================================= */
.k-card--dark {
  background: var(--k-deep);
  border: 0;
  border-radius: var(--k-r-md);
  padding: var(--k-card-pad);
  color: var(--k-on-deep);
}
.k-card--dark .k-card__icon,
.k-card--dark .k-card__num   { color: var(--k-jade); }
.k-card--dark .k-card__copy  { color: var(--k-on-deep-soft); }
.k-card--dark .k-card__link  { color: var(--k-jade); }

/* If a card group sits on a deep-green section, bordered/bare adopt light text */
.k-section--deep .k-card--bare { color: var(--k-on-deep); }
.k-section--deep .k-card--bare .k-card__copy { color: var(--k-on-deep-soft); }
.k-section--deep .k-card--bare .k-card__icon,
.k-section--deep .k-card--bare .k-card__num  { color: var(--k-jade); }

/* === TABLET (3-up / 4-up → 2-up) ======================================== */
@media (min-width: 600px) and (max-width: 1023px) {
  .k-cards--3, .k-cards--4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* === DESKTOP ============================================================ */
@media (min-width: 1024px) {
  .k-cards { gap: 24px; }
  .k-cards--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .k-cards--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .k-cards--4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }

  .k-card__icon { width: 30px; height: 30px; }
  .k-card__symbol { width: 56px; height: 56px; }
}


/* ===== product.css ================================================= */
/* =============================================================================
   KUENTA COMPONENTS — PRODUCT CARD
   ONE product card, used for the merchant product suite AND the cobros terminal
   lineup. The ONLY per-page difference is the column count on desktop:
     .k-products--2  (merchant: 4 products → 2×2)
     .k-products--3  (cobros: 3 terminals → 3-up)
   Never branch the card itself into per-page subtypes — change column count only.

   Mobile-first: a single column of big, full-width cards (one on top of another,
   no carousel), sized like the persona cards. Desktop: the grid above.

   Card anatomy: big mockup stage (4/3) → brand+title → one-line copy →
   one inline row of icon features (optional) → text-link CTA with nudging arrow.

   Structure (HTML):
     <div class="k-products k-products--2">
       <article class="k-product k-product--cobros">
         <div class="k-product__media"><img src="…sol-cobros-mockup.webp" alt=""></div>
         <div class="k-product__body">
           <h3 class="k-product__title"><span class="k-product__brand">kuenta</span> cobros</h3>
           <p  class="k-product__copy">Cobra con terminal, link o desde tu celular.</p>
           <ul class="k-product__feats">
             <li class="k-product__feat"><svg …></svg> Terminal POS</li> …
           </ul>
           <a class="k-product__cta" href="#">Ver cobros <svg …></svg></a>
         </div>
       </article> …
     </div>
   ============================================================================= */

/* === GRID — mobile: 1-col stack of big cards ========================== */
.k-products {
  display: grid;
  grid-template-columns: 1fr;
  gap: 16px;
}

/* === CARD ============================================================== */
.k-product {
  position: relative;                 /* anchor for the stretched-link overlay */
  display: flex;
  flex-direction: column;
  min-width: 0;
  border-radius: var(--k-r-xl);
  overflow: hidden;
  background: var(--k-paper);
  color: var(--k-ink);
  border: 1px solid var(--k-line);
  transition: transform var(--k-dur) var(--k-ease), box-shadow var(--k-dur) var(--k-ease), border-color var(--k-dur) var(--k-ease);
}
/* The WHOLE card is clickable and lights up on hover (Shopify enterprise cards). */
.k-product:hover { transform: translateY(-4px); box-shadow: var(--k-shadow-md); border-color: var(--k-line-hover); }
@media (hover: none) { .k-product:hover { transform: none; box-shadow: none; border-color: var(--k-line); } }

/* Mockup stage — neutral gray, kept SHORT on mobile so stacked cards don't make
   the phone scroll heavy. IMPORTANT: use a DEFINITE height, not aspect-ratio.
   With aspect-ratio, the image's `max-height:100%` is a % that resolves against
   an (indefinite) aspect-ratio height — iOS Safari then won't clamp it, so a
   landscape mockup pushes the box taller and the card balloons. A definite
   height makes max-height resolve correctly and the image contains on every
   browser. Desktop already does this below. */
.k-product__media {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: clamp(16px, 4vw, 26px);
  height: clamp(190px, 57vw, 228px);
  background: var(--k-surface-gray);
  border-bottom: 1px solid var(--k-line);
}
.k-product__media img { max-width: 100%; max-height: 100%; width: auto; object-fit: contain; }
.k-product__media svg { width: 100%; height: 100%; display: block; }
.k-product__media svg text { font-family: var(--k-font); }

/* Merchant suite only: color-code the four product stages with the existing
   per-product tokens (scoped to #productos so cobros's terminal cards — which
   reuse k-product--cobros — keep the neutral gray stage). */
#productos .k-product--cobros   .k-product__media { background: var(--k-prod-cobros);   border-bottom-color: transparent; }
#productos .k-product--credito  .k-product__media { background: var(--k-prod-credito);  border-bottom-color: transparent; }
#productos .k-product--software .k-product__media { background: var(--k-prod-software); border-bottom-color: var(--k-line); }
#productos .k-product--seguros  .k-product__media { background: var(--k-prod-seguros);  border-bottom-color: var(--k-line); }

.k-product__body {
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding: clamp(18px, 2.4vw, 24px) clamp(18px, 2vw, 26px) clamp(20px, 2.2vw, 26px);
  flex: 1;
}

.k-product__title {
  font-size: clamp(21px, 2.2vw, 27px);
  font-weight: var(--k-fw-semi);
  line-height: 1.05;
  letter-spacing: -0.02em;
  color: inherit;
}
.k-product__brand { font-weight: var(--k-fw-medium); opacity: 0.82; }

.k-product__copy {
  font-size: var(--k-fs-md);
  line-height: 1.4;
  color: var(--k-muted);
}

/* Features — ONE inline row: small icon + short label, scannable in a glance. */
.k-product__feats {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 7px 16px;
  margin: 8px 0 0;
  padding: 0;
  list-style: none;
}
.k-product__feat {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  font-size: var(--k-fs-sm);
  font-weight: var(--k-fw-medium);
  color: var(--k-ink);
}
.k-product__feat svg {
  width: 17px; height: 17px;
  flex: 0 0 auto;
  stroke: currentColor; stroke-width: 1.8; fill: none;
  stroke-linecap: round; stroke-linejoin: round;
  color: var(--k-deep);
}

/* CTA — text link with a nudging arrow (light + premium, like Shopify). */
.k-product__cta {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  margin-top: auto;
  padding-top: 14px;
  font-size: var(--k-fs-cta);
  font-weight: var(--k-fw-bold);
  color: var(--k-deep);
}
.k-product__cta svg {
  width: 17px; height: 17px; stroke-width: 2.4; fill: none; stroke-linecap: round;
  transition: transform var(--k-dur) var(--k-ease);
}
.k-product__cta:hover svg { transform: translateX(3px); }
@media (prefers-reduced-motion: reduce) { .k-product__cta:hover svg { transform: none; } }
/* Stretched link — the CTA's hit area covers the whole card, so a click anywhere
   follows it. Safe here because each product card has exactly ONE link. */
.k-product__cta::after { content: ""; position: absolute; inset: 0; z-index: 1; }

/* === DESKTOP — column count is the ONLY per-page difference =========== */
@media (min-width: 768px) {
  .k-products { gap: clamp(20px, 2vw, 28px); }
  .k-products--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .k-products--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .k-products--4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }

  /* Desktop: drop the tall 4/3 frame back to ~the old height, and shrink the
     padding so the MOCKPUP grows inside the same frame (not the frame itself).
     Mobile keeps the big 4/3 media untouched. */
  .k-product__media { height: clamp(228px, 21vw, 250px); padding: 10px; }
}


/* ===== split.css =================================================== */
/* =============================================================================
   KUENTA COMPONENTS — SPLIT (image + text)
   The narrative connective tissue: one idea, one image, side by side. Same
   code for image-left and image-right; alternate them down a page for rhythm
   (DoorDash / Toast / Instacart / Stone / Shopify).

   Mobile: ALWAYS stacks content-first → image (lead with the point, then show
   it). Desktop: two balanced columns; the variant picks which side the image
   sits on. Content is always first in the DOM so the mobile order is correct
   regardless of variant — desktop placement is handled by grid, not source.

   Structure (HTML):
     <section class="k-split k-split--paper k-split--image-right">
       <div class="k-split__inner k-container">
         <div class="k-split__content">
           <h2 class="k-split__title">No es un catálogo. Es un <em class="k-accent">equipo</em>.</h2>
           <p  class="k-split__copy">…</p>
           <div class="k-split__actions">
             <a class="k-btn k-btn--primary" href="#">Hablar con Kuenta</a>
           </div>
         </div>
         <div class="k-split__media">
           <img class="k-split__image" src="…" alt="…">
         </div>
       </div>
     </section>

   Moods: --paper (default), --mint, --deep.
   Sides: --image-right (default), --image-left  (desktop only).
   ============================================================================= */

.k-split {
  padding-block: var(--k-section-y);
  background: var(--k-canvas);
  color: var(--k-ink);
}

.k-split__inner {
  display: flex;
  flex-direction: column;
  gap: 28px;
}

.k-split__content {
  display: flex;
  flex-direction: column;
  gap: var(--k-sp-md);
}

.k-split__title {
  font-size: var(--k-fs-h2);
  font-weight: var(--k-fw-semi);
  line-height: var(--k-lh-tight);
  letter-spacing: var(--k-tr-snug);
  color: inherit;
}
.k-split__title .k-accent { color: var(--k-deep); font-style: normal; }

.k-split__copy {
  font-size: var(--k-fs-lead);
  line-height: var(--k-lh-normal);
  color: var(--k-muted);
  max-width: 52ch;
}

/* Optional detail bullets (e.g. product deep-dive rows). */
.k-split__list {
  display: flex;
  flex-direction: column;
  gap: 12px;
  margin-top: var(--k-sp-xs);
  font-size: var(--k-fs-md);          /* match the body/subhead size — 15px read too small on desktop */
  line-height: var(--k-lh-normal);
  color: var(--k-ink);
}
.k-split__list li { display: flex; align-items: flex-start; gap: 10px; }
.k-split__list li::before {
  content: '✓';
  flex: 0 0 auto;
  color: var(--k-deep);
  font-weight: var(--k-fw-bold);
}
.k-split--deep .k-split__list { color: var(--k-on-deep); }
.k-split--deep .k-split__list li::before { color: var(--k-jade); }

/* Versus: Ellos / Kuenta contrast — replaces a prose paragraph + look-alike
   bullets with a scannable ✕→✓ list (used in the "Por qué Kuenta" split). */
.k-versus { list-style: none; margin: var(--k-sp-xs) 0 0; padding: 0; display: grid; gap: 16px; }
/* Positives only. The paired "bad vs good" contrast rows were removed 2026-07-29:
   six negative lines up front read as complaining rather than confident. */
.k-versus__row { display: grid; }
.k-versus__good { display: flex; align-items: flex-start; line-height: var(--k-lh-snug);
        color: var(--k-ink); font-weight: var(--k-fw-semi); font-size: var(--k-fs-md); }

.k-split__actions {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 12px;
  margin-top: var(--k-sp-md);
}

/* Optional inline mini-stats (e.g. on an "About Kuenta" split). */
.k-split__stats {
  display: flex;
  flex-wrap: wrap;
  gap: 32px;
  margin-top: var(--k-sp-xs);
}
.k-split__stat { display: flex; flex-direction: column; }
.k-split__stat-num {
  font-size: 28px;
  font-weight: var(--k-fw-bold);
  letter-spacing: -0.02em;
  line-height: 1;
  color: inherit;
}
.k-split__stat-label {
  font-size: var(--k-fs-xs);
  color: var(--k-muted);
  margin-top: 4px;
}
.k-split--deep .k-split__stat-label { color: var(--k-on-deep-soft); }

.k-split__media {
  width: 100%;
  aspect-ratio: 4 / 3;
  border-radius: var(--k-r-image);
  overflow: hidden;
  background: var(--k-surface-gray);
}
.k-split__image { width: 100%; height: 100%; object-fit: cover; }

/* Graphic media (e.g. the tile-grid): no photo frame — let the graphic breathe
   on the page background, centered, sizing to its own square. */
.k-split__media--graphic {
  background: none;
  border-radius: 0;
  overflow: visible;
  aspect-ratio: auto;
  display: flex;
  align-items: center;
  justify-content: center;
}

/* === MOODS ============================================================== */
.k-split--mint { background: var(--k-surface-alt); }

.k-split--deep {
  background: var(--k-surface-deep);
  color: var(--k-on-deep);
}
.k-split--deep .k-split__copy        { color: var(--k-on-deep-soft); }
.k-split--deep .k-split__title .k-accent { color: var(--k-jade); }

/* === DESKTOP ============================================================ */
@media (min-width: 1024px) {
  .k-split__inner {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    align-items: center;
    column-gap: clamp(48px, 5vw, 88px);
    row-gap: 0;
  }
  .k-split__content { gap: var(--k-sp-md); }
  .k-split__actions { flex-direction: row; align-items: center; gap: 14px; }

  .k-split__media {
    aspect-ratio: auto;
    height: clamp(420px, 36vw, 520px);
  }

  /* Default (image-right): content col 1, media col 2 — matches DOM order. */
  .k-split--image-right .k-split__content { grid-column: 1; grid-row: 1; }
  .k-split--image-right .k-split__media   { grid-column: 2; grid-row: 1; }

  /* image-left: swap columns (DOM order unchanged, so mobile stays content-first). */
  .k-split--image-left .k-split__media   { grid-column: 1; grid-row: 1; }
  .k-split--image-left .k-split__content { grid-column: 2; grid-row: 1; }
}


/* ===== ganas.css =================================================== */
/* =============================================================================
   KUENTA COMPONENTS — CÓMO GANAS (k-ganas)
   The most important teaching block on the aliados page: a normal sale pays once
   and dies; a comercio CON KUENTA pays you every month. Shown as two panels —
   left grayed and dead (one payment, then empty months), right bright and alive
   (a payment every month). Desktop: side by side. Mobile: stacked, bright under
   dead. "Cada mes" is literally countable; the brightness does the persuading.
   No invented peso amounts — the coins are payments, the labels carry meaning.
   ============================================================================= */

.k-ganas { display: grid; }

.k-ganas__cmp { display: grid; gap: 20px; }
@media (min-width: 768px) { .k-ganas__cmp { grid-template-columns: 1fr 1fr; gap: clamp(18px, 2vw, 22px); align-items: stretch; } }

/* Each column is just the card now — the headline lives inside it. */
.k-ganas__col { display: flex; flex-direction: column; }

.k-ganas__panel {
  border-radius: var(--k-r-xl);
  padding: clamp(20px, 2.4vw, 30px);
  display: flex; flex-direction: column;
  flex: 1;                       /* both cards equal height even if headlines wrap differently */
}
/* Short label naming each side — subordinate to the section headline; the
   coins below do the teaching. */
.k-ganas__headline {
  font-size: clamp(16px, 1.7vw, 19px);
  font-weight: var(--k-fw-semi);
  line-height: var(--k-lh-snug);
  letter-spacing: var(--k-tr-flat);
}

/* the month row sits at the bottom so the two panels' visuals line up */
.k-ganas__months { margin-top: auto; padding-top: 26px; display: flex; gap: 8px; }
.k-ganas__m { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 8px; }
.k-ganas__coin {
  width: clamp(28px, 5vw, 34px); aspect-ratio: 1; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-size: var(--k-fs-eyebrow); font-weight: var(--k-fw-bold);
}
.k-ganas__mlab { font-size: var(--k-fs-3xs); }

/* LEFT — dead / grayed: one payment, then empty months */
.k-ganas__panel--dead { background: var(--k-surface-sunken); }
.k-ganas__panel--dead .k-ganas__headline { color: var(--k-sunken-ink); }
.k-ganas__panel--dead .k-ganas__coin { background: transparent; border: 1.5px dashed var(--k-sunken-line); color: transparent; }
.k-ganas__panel--dead .k-ganas__coin--pay { background: var(--k-sunken-coin); border: 0; color: var(--k-paper); }
.k-ganas__panel--dead .k-ganas__mlab { color: var(--k-sunken-label); }

/* RIGHT — alive / bright: a payment every month */
.k-ganas__panel--live {
  background: linear-gradient(155deg, var(--k-tint-100) 0%, var(--k-tint-200) 100%);
  color: var(--k-deep-2);
  box-shadow: 0 14px 36px rgba(9, 211, 160, .18);
  border: 1px solid rgba(9, 211, 160, .22);
}
.k-ganas__panel--live .k-ganas__headline { color: var(--k-deep-2); }

/* (Earnings ladder retired: replaced by the leveled ladder .al-niveles in
   aliados.css — the four levels ARE the earnings ladder now.) */
.k-ganas__panel--live .k-ganas__coin { background: var(--k-jade); color: var(--k-deep-2); box-shadow: 0 4px 10px rgba(9, 211, 160, .42); }
.k-ganas__panel--live .k-ganas__mlab { color: var(--k-deep); font-weight: var(--k-fw-medium); }


/* ===== tabs.css ==================================================== */
/* =============================================================================
   KUENTA COMPONENTS — TABS (swap-in-place changer)
   A category switcher. Pills act as real tabs; clicking one crossfades its
   panel in the SAME full-width spot — no horizontal scroll, no peek. Standard,
   accessible (role=tablist/tab/tabpanel), and easy to keep pixel-clean because
   there's a single full-bleed panel. Best for verticals ("¿qué tipo de
   negocio?") and any "pick a category, see a focused panel" moment.

   Mobile-first: the pill rail scrolls horizontally when labels overflow (5+
   verticals on a phone) and the panel swaps below it. Any tab count.

   Panels are stacked in one grid cell, so the section height = the TALLEST
   panel and never jumps when you switch tabs.

   Structure (HTML):
     <section class="k-tabs">
       <div class="k-container">
         <header class="k-tabs__head"><h2 class="k-tabs__title">…</h2></header>
         <div class="k-tabs__pills" role="tablist" aria-label="Tipos de negocio">
           <button class="k-tabs__pill is-active" role="tab" id="tt-0"
                   aria-selected="true"  aria-controls="tp-0">Restaurantes</button>
           <button class="k-tabs__pill"           role="tab" id="tt-1"
                   aria-selected="false" aria-controls="tp-1">Comercio</button>
           …
         </div>
         <div class="k-tabs__panels">
           <article class="k-tabs__panel is-active" role="tabpanel" id="tp-0" aria-labelledby="tt-0">
             <div class="k-tabs__panel-content">
               <h3 class="k-tabs__panel-title">…</h3>
               <p  class="k-tabs__panel-copy">…</p>
             </div>
             <div class="k-tabs__panel-media"><img src="…" alt=""></div>
           </article>
           <article class="k-tabs__panel" role="tabpanel" id="tp-1" aria-labelledby="tt-1" hidden>…</article>
           …
         </div>
       </div>
     </section>
   ============================================================================= */

.k-tabs {
  padding-block: var(--k-section-y);
  background: var(--k-surface-deep);
  color: var(--k-on-deep);
}

.k-tabs__head {
  display: flex;
  flex-direction: column;
  gap: var(--k-sp-sm);
  margin-bottom: 28px;
  text-align: center;
  align-items: center;
  max-width: 760px;
  margin-inline: auto;
}
.k-tabs__title {
  font-size: var(--k-fs-h2);
  font-weight: var(--k-fw-semi);
  line-height: var(--k-lh-tight);
  letter-spacing: var(--k-tr-snug);
  color: var(--k-on-deep);
}

/* === PILL RAIL ========================================================= */
.k-tabs__pills {
  display: flex;
  align-items: center;
  gap: 4px;
  padding: 6px;
  width: max-content;
  max-width: 100%;
  margin: 0 auto 28px;
  background: var(--k-on-deep-glass);
  border-radius: var(--k-r-pill);
  overflow-x: auto;
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
}
.k-tabs__pills::-webkit-scrollbar { display: none; }

.k-tabs__pill {
  flex: 0 0 auto;
  padding: 11px 20px;
  border-radius: var(--k-r-pill);
  font-family: inherit;
  font-size: var(--k-fs-xs);
  font-weight: var(--k-fw-semi);
  letter-spacing: var(--k-tr-flat);
  white-space: nowrap;
  color: var(--k-on-deep-soft);
  transition: background var(--k-dur) var(--k-ease), color var(--k-dur) var(--k-ease);
}
.k-tabs__pill:hover { color: var(--k-on-deep); }
.k-tabs__pill.is-active { background: var(--k-paper); color: var(--k-deep); }

/* === PANELS (crossfade in one grid cell) =============================== */
.k-tabs__panels { display: grid; }

.k-tabs__panel {
  grid-area: 1 / 1;
  display: flex;
  flex-direction: column;
  gap: 20px;
  min-width: 0;
  background: var(--k-paper);
  color: var(--k-ink);
  border-radius: var(--k-r-lg);
  padding: 24px;
  opacity: 0;
  visibility: hidden;
  transition: opacity var(--k-dur) var(--k-ease), visibility var(--k-dur) var(--k-ease);
}
.k-tabs__panel.is-active { opacity: 1; visibility: visible; }
.k-tabs__panel[hidden] { display: flex; }   /* keep in the grid cell; visibility handles show/hide */

.k-tabs__panel-content { display: flex; flex-direction: column; gap: 11px; }

.k-tabs__panel-title {
  font-size: clamp(22px, 5.6vw, 28px);
  font-weight: var(--k-fw-semi);
  line-height: 1.14;
  letter-spacing: -0.018em;
  color: var(--k-ink);
  text-wrap: balance;
}

.k-tabs__panel-copy {
  font-size: var(--k-fs-body);
  line-height: var(--k-lh-relaxed);
  color: var(--k-muted);
  max-width: 54ch;
}

.k-tabs__panel-media {
  width: 100%;
  aspect-ratio: 16 / 9;
  border-radius: 14px;
  overflow: hidden;
  background: var(--k-surface-gray);
}
.k-tabs__panel-media img { width: 100%; height: 100%; object-fit: cover; }

/* === DESKTOP =========================================================== */
@media (min-width: 1024px) {
  .k-tabs__head  { margin-bottom: 36px; }
  .k-tabs__pills { margin-bottom: 40px; padding: 7px; gap: 6px; }
  .k-tabs__pill  { padding: 14px 26px; font-size: var(--k-fs-sm); }

  .k-tabs__panel {
    flex-direction: row;
    align-items: center;
    gap: clamp(32px, 4vw, 56px);
    padding: clamp(28px, 3vw, 44px);
    border-radius: var(--k-r-2xl);
  }
  .k-tabs__panel-content { flex: 1; gap: 16px; }
  .k-tabs__panel-title   { font-size: clamp(30px, 2.4vw, 40px); line-height: 1.08; letter-spacing: var(--k-tr-snug); }
  .k-tabs__panel-copy    { font-size: var(--k-fs-md); }

  .k-tabs__panel-media {
    flex: 1.1;
    aspect-ratio: 16 / 11;
    height: auto;
    border-radius: var(--k-r-lg);
  }
}


/* ===== steps.css =================================================== */
/* =============================================================================
   KUENTA COMPONENTS — STEPS (numbered process)
   "Cómo ser Aliado en 4 pasos." Numbered, minimal, airy — number circle +
   title + one line, no boxes. A thin connector line links the steps: vertical
   down the number column on mobile, horizontal across the row on desktop.

   Reference: Instacart shoppers "Sign up in 3 steps" + Shopify Partners
   process. Any step count — set --k-steps on the list to match your item count
   (defaults to 3); on desktop that becomes the column count.

   Structure (HTML):
     <section class="k-steps">                          <!-- or --alt for mint -->
       <div class="k-container">
         <header class="k-section__head k-section__head--center">…</header>  <!-- optional -->
         <ol class="k-steps__list" style="--k-steps: 4;">
           <li class="k-step">
             <span class="k-step__num">1</span>
             <div class="k-step__body">
               <h3 class="k-step__title">Aplicas en 2 minutos</h3>
               <p  class="k-step__copy">Cuéntanos de ti y de tu zona. Sin requisitos complicados.</p>
             </div>
           </li>
           …
         </ol>
         <div class="k-steps__cta">                       <!-- optional -->
           <a class="k-btn k-btn--primary" href="#">Quiero ser Aliado</a>
         </div>
       </div>
     </section>
   ============================================================================= */

.k-steps {
  padding-block: var(--k-section-y);
  background: var(--k-canvas);
  color: var(--k-ink);
}
.k-steps--alt { background: var(--k-surface-alt); }

/* === LIST =============================================================== */
.k-steps__list {
  display: flex;
  flex-direction: column;
}

.k-step {
  position: relative;
  display: flex;
  gap: 18px;
  align-items: flex-start;
  padding-bottom: 28px;
}
.k-step:last-child { padding-bottom: 0; }

.k-step__num {
  flex: 0 0 40px;
  width: 40px;
  height: 40px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--k-r-pill);
  background: var(--k-jade);
  color: var(--k-deep);
  font-size: var(--k-fs-body);
  font-weight: var(--k-fw-bold);
  line-height: 1;
  position: relative;
  z-index: 1;
}

.k-step__body { display: flex; flex-direction: column; gap: 6px; padding-top: 8px; }
.k-step__title {
  font-size: 20px;
  font-weight: var(--k-fw-semi);
  line-height: var(--k-lh-snug);
  letter-spacing: var(--k-tr-flat);
  color: var(--k-ink);
}
.k-step__copy { font-size: var(--k-fs-md); line-height: var(--k-lh-normal); color: var(--k-muted); }

/* Optional per-step icon — gives each step a distinct shape (not just a number). */

/* On a deep-green section, lighten text + circle contrast.
   (.k-steps.k-section--deep beats the .k-steps canvas background.) */
.k-steps.k-section--deep { background: var(--k-surface-deep); color: var(--k-on-deep); }
.k-section--deep .k-step__title { color: var(--k-on-deep); }
.k-section--deep .k-step__copy  { color: var(--k-on-deep-soft); }
.k-section--deep .k-step:not(:last-child)::before,
.k-section--deep .k-step:not(:last-child)::after { background: var(--k-on-deep-line); }

/* === MOBILE — vertical connector through the number column ============= */
.k-step:not(:last-child)::before {
  content: '';
  position: absolute;
  top: 44px;
  left: 19px;             /* center of the 40px circle */
  bottom: -4px;
  width: 2px;
  background: var(--k-line);
  z-index: 0;
}

/* === optional CTA after the steps ====================================== */
.k-steps__cta { margin-top: 36px; }

/* === DESKTOP — horizontal row with horizontal connector ================ */
@media (min-width: 1024px) {
  .k-steps__list {
    display: grid;
    grid-template-columns: repeat(var(--k-steps, 3), minmax(0, 1fr));
    column-gap: 40px;
    row-gap: 0;
  }
  .k-step {
    flex-direction: column;
    align-items: flex-start;
    gap: 22px;
    padding-bottom: 0;
  }
  .k-step__body { padding-top: 0; gap: 10px; }
  .k-step__title { font-size: clamp(22px, 1.9vw, 27px); }
  .k-step__copy  { font-size: var(--k-fs-md); }
  /* Bigger number circle on desktop so the timeline carries the big headline. */
  .k-step__num { flex-basis: 48px; width: 48px; height: 48px; font-size: 18px; }
  .k-step:not(:last-child)::after { top: 24px; left: 48px; }

  /* swap the connector: hide the vertical one, draw a horizontal one */
  .k-step:not(:last-child)::before { display: none; }
  .k-step:not(:last-child)::after {
    content: '';
    position: absolute;
    top: 19px;            /* vertical center of the 40px circle */
    left: 40px;           /* right edge of the circle */
    width: 100%;          /* spans the column-gap to the next circle */
    height: 2px;
    background: var(--k-line);
    z-index: 0;
  }
  .k-steps__cta { margin-top: 48px; }
}


/* ===== media-tile.css ============================================== */
/* =============================================================================
   KUENTA COMPONENTS — MEDIA TILE
   Photo-led category tile: image fills the card, label overlaid at the bottom,
   the whole tile is a link. Use for verticals ("Restaurantes y bares"…),
   cities (the 20 agent sites — "CDMX", "Guadalajara"…), or any photo-led
   category grid. All options visible at once — scannable, warm, image-forward.

   Reference: Square / Uber category tiles. Mobile-first: a swipe carousel with
   edge peek; desktop: an auto-fitting grid that wraps for any count.

   Structure (HTML):
     <div class="k-tiles">
       <a class="k-tile" href="#">
         <img class="k-tile__img" src="…" alt="">
         <span class="k-tile__label">Restaurantes y bares</span>
       </a>
       …
     </div>

   Photos should be portrait (≈4:5). Keep the label short — one line, two max.
   ============================================================================= */

.k-tiles {
  display: flex;
  gap: 14px;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
  margin-inline: calc(var(--k-pad) * -1);
  padding-inline: var(--k-pad);
  padding-bottom: 6px;
  scroll-padding-inline: var(--k-pad);
}
.k-tiles::-webkit-scrollbar { display: none; }
.k-tiles > .k-tile { flex: 0 0 64%; scroll-snap-align: start; }

.k-tile {
  position: relative;
  display: block;
  aspect-ratio: 4 / 5;
  border-radius: var(--k-r-image);
  overflow: hidden;
  isolation: isolate;
  background: var(--k-surface-gray);
  color: var(--k-paper);
  text-decoration: none;
  transition: transform var(--k-dur) var(--k-ease), box-shadow var(--k-dur) var(--k-ease);
}
.k-tile:hover { transform: translateY(-4px); box-shadow: var(--k-shadow-md); }

.k-tile__img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  z-index: 0;
  transition: transform 0.5s var(--k-ease);
}
/* Slow image push-in on hover — the photo feels alive (Instacart/Square). */
.k-tile:hover .k-tile__img { transform: scale(1.05); }
@media (hover: none) { .k-tile:hover .k-tile__img { transform: none; } }

/* Bottom scrim so the label always reads — stronger + earlier ramp so it holds
   up even on bright photos (salon/clinic), where a light scrim let the label go soft. */
.k-tile::after {
  content: '';
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(180deg, transparent 26%, rgba(10, 10, 10, 0.30) 60%, rgba(10, 10, 10, 0.82) 100%);
}

.k-tile__label {
  position: absolute;
  left: 0; right: 0; bottom: 0;
  z-index: 2;
  padding: 18px 18px 20px;
  color: var(--k-paper);
  display: flex;
  flex-direction: column;
  gap: 3px;
}
.k-tile__cat {
  font-size: 18px;
  font-weight: var(--k-fw-semi);
  line-height: var(--k-lh-snug);
  letter-spacing: var(--k-tr-flat);
  text-wrap: balance;   /* even line breaks when a label goes to two lines */
}
/* Diagonal arrow rides inline with the last word of the category (Square/Fresha).
   Kept inline + a non-breaking space so it can NEVER orphan onto its own line. */
.k-tile__cat::after {
  content: '\00A0\2197';
  font-weight: var(--k-fw-bold);
}
/* Optional product hint under the category (verticals: the lead product). */
.k-tile__sub {
  font-size: 13px;
  font-weight: var(--k-fw-medium);
  color: rgba(255, 255, 255, 0.85);
  line-height: 1.2;
}

/* === DESKTOP — auto-fitting grid (any count wraps) ===================== */
@media (min-width: 1024px) {
  .k-tiles {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: 16px;
    overflow: visible;
    scroll-snap-type: none;
    margin-inline: 0;
    padding-inline: 0;
    padding-bottom: 0;
  }
  .k-tiles > .k-tile { flex: none; }
  .k-tile { aspect-ratio: 2 / 3; }   /* taller, portrait — Square/Fresha proportions */
  .k-tile__label { padding: 22px; }
  .k-tile__cat { font-size: 19px; }
}


/* ===== acceptance.css ============================================== */
/* =============================================================================
   KUENTA COMPONENTS — ACCEPTANCE STRIP (k-accept)
   A seamless, auto-scrolling marquee of accepted payment-method logos. Used on
   payment/cobros pages to say "we take everything" at a glance. The track holds
   the logo set TWICE; the animation slides exactly -50% so it loops seamlessly.
   Edge mask fades both sides. Pauses for reduced-motion.

   Structure (HTML):
     <section class="k-accept">
       <h2 class="k-accept__title">Acepta <em class="k-accent">todas…</em></h2>
       <div class="k-accept__strip">
         <div class="k-accept__track">
           …N logos… then the SAME N again (aria-hidden) for the seamless loop…
         </div>
       </div>
     </section>
   ============================================================================= */

.k-accept { padding-block: var(--k-section-y); overflow: hidden; }
.k-accept__title {
  font-size: var(--k-fs-h2);
  font-weight: var(--k-fw-bold);
  letter-spacing: var(--k-tr-snug);
  line-height: var(--k-lh-snug);
  color: var(--k-ink);
  text-align: center;
  margin: 0 auto clamp(28px, 4vw, 44px);
  padding-inline: var(--k-pad);
  max-width: 22ch;
}
.k-accept__strip {
  width: 100%;
  overflow: hidden;
  position: relative;
  -webkit-mask-image: linear-gradient(to right, transparent 0%, #000 8%, #000 92%, transparent 100%);
          mask-image: linear-gradient(to right, transparent 0%, #000 8%, #000 92%, transparent 100%);
}
.k-accept__track {
  display: flex;
  align-items: center;
  width: max-content;
  animation: k-accept-scroll 26s linear infinite;
}
/* Spacing via per-image margin (NOT flex gap): every image — including the last
   of each set — carries the same right margin, so the duplicated set is EXACTLY
   half the track width. That makes translateX(-50%) land seamlessly, with no
   jump or growing gap on each loop. */
.k-accept__track img {
  height: clamp(34px, 4vw, 46px);
  width: auto;
  display: block;
  flex: none;
  object-fit: contain;
  margin-inline-end: clamp(32px, 5vw, 56px);
}
@keyframes k-accept-scroll {
  from { transform: translateX(0); }
  to   { transform: translateX(-50%); }
}
@media (prefers-reduced-motion: reduce) {
  .k-accept__track { animation: none; flex-wrap: wrap; justify-content: center; width: auto; }
}


/* ===== offer.css =================================================== */
/* =============================================================================
   KUENTA COMPONENTS — OFFER CARD
   The "what you're selling" card: a real product render floating on a soft mint
   panel, over a benefit line and a row of "what's inside" tags. Use it where the
   products themselves are the pitch (Aliados "lo que vendes", product index).

   Structure (HTML):
     <ul class="k-offers">
       <li class="k-offer k-offer--cobros">
         <div class="k-offer__mock">
           <img class="k-offer__shot" src="/assets/img/products/sol-cobros-mockup.webp" alt="" loading="lazy">
         </div>
         <div class="k-offer__body">
           <h3 class="k-offer__title">kuenta cobros</h3>
           <p  class="k-offer__copy">Acepta pagos como quiera tu cliente.</p>
           <ul class="k-offer__tags"><li class="k-offer__tag">Terminal</li>…</ul>
         </div>
       </li>
       …
     </ul>
   The --cobros/--credito/--software/--seguros classes stay as per-product hooks;
   each card now shows its own render, so no tone styling is needed.
   ============================================================================= */

.k-offers {
  display: grid;
  grid-template-columns: 1fr 1fr;   /* phones: 2×2 so all four are visible together */
  gap: 12px;
  list-style: none;
  margin: 0;
}

.k-offer {
  position: relative;
  display: flex;
  flex-direction: column;
  background: var(--k-paper);
  border: 1px solid var(--k-line);
  border-radius: var(--k-r-xl);
  overflow: hidden;
}

/* Clickable card — the whole card links to the product page (stretched-link
   pattern). Only used where a real product page exists (e.g. cobros). */
.k-offer--link { transition: transform var(--k-dur) var(--k-ease), border-color var(--k-dur) var(--k-ease), box-shadow var(--k-dur) var(--k-ease); }
.k-offer--link:hover,
.k-offer--link:focus-within { transform: translateY(-2px); border-color: var(--k-line-hover); box-shadow: var(--k-shadow-md); }
.k-offer__link { position: absolute; inset: 0; z-index: 1; }

/* Mockup tile — a real product render floating on a soft mint panel. -------- */
.k-offer__mock {
  position: relative;
  height: clamp(104px, 26vw, 132px);   /* compact on phones; grows ≥600 */
  background: var(--k-surface-gray);
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
}
.k-offer__shot { width: 100%; height: 100%; object-fit: contain; padding: clamp(10px, 2.4vw, 18px); }

/* Body --------------------------------------------------------------------- */
.k-offer__body {
  display: flex;
  flex-direction: column;
  gap: 7px;
  flex: 1;
  padding: 13px 14px;
}
.k-offer__title { font-size: var(--k-fs-md); font-weight: var(--k-fw-semi); letter-spacing: var(--k-tr-flat); }
.k-offer__copy  { font-size: var(--k-fs-eyebrow); line-height: var(--k-lh-normal); color: var(--k-muted); }

.k-offer__tags {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin: 0;
  margin-top: auto;
  padding-top: 4px;
  list-style: none;
}
.k-offer__tag {
  font-size: var(--k-fs-3xs);
  font-weight: var(--k-fw-semi);
  color: var(--k-jade-ink);
  background: var(--k-surface-gray);
  border-radius: var(--k-r-pill);
  padding: 4px 9px;
}

@media (min-width: 600px) {
  .k-offers { gap: 24px; }
  .k-offer__mock { height: clamp(132px, 14vw, 168px); }
  .k-offer__body { gap: 10px; padding: clamp(20px, 2.4vw, 26px); }
  .k-offer__title { font-size: 20px; }
  .k-offer__copy { font-size: var(--k-fs-sm); }
  .k-offer__tags { gap: 8px; }
  .k-offer__tag { font-size: var(--k-fs-2xs); padding: 5px 11px; }
}
@media (min-width: 1024px) {
  .k-offers { grid-template-columns: repeat(2, 1fr); gap: 24px; }
  /* Wide cards read better horizontal: mock beside the copy. */
  .k-offer { flex-direction: row; align-items: stretch; }
  .k-offer__mock { flex: 0 0 42%; height: auto; }
  .k-offer__body { flex: 1; justify-content: center; padding: clamp(24px, 2.4vw, 34px); }
  .k-offer__title { font-size: 22px; }
  .k-offer__copy  { font-size: var(--k-fs-body); }
}


/* ===== stats.css =================================================== */
/* =============================================================================
   KUENTA COMPONENTS — STATS
   The big-number credibility band, Shopify-style: large LIGHTWEIGHT numerals
   with a short label, no boxed cards, no descriptive sentence. Desktop = a slim
   row with hairline dividers between metrics. Mobile = a tight stack.

   Flexible count — --2 / --3 / --4.

   Structure (HTML):
     <section class="k-section k-section--deep">
       <div class="k-container">
         <div class="k-stats k-stats--3">
           <div class="k-stat">
             <span class="k-stat__metric">+1,000</span>
             <span class="k-stat__label">comercios</span>
           </div> …
         </div>
       </div>
     </section>
   ============================================================================= */

.k-stats {
  display: grid;
  grid-template-columns: 1fr;
  gap: clamp(20px, 4vw, 26px);
}

.k-stat { display: flex; flex-direction: column; }

.k-stat__metric {
  font-size: clamp(44px, 5vw, 52px);         /* big + confident, not shouty (was 64 — read huge next to the label) */
  font-weight: var(--k-fw-regular);
  line-height: 0.98;
  letter-spacing: -0.03em;
  color: inherit;
  margin-bottom: 8px;
}

.k-stat__label {
  font-size: 18px;                           /* up from 16 so the label doesn't read tiny under the number */
  font-weight: var(--k-fw-semi);
  line-height: var(--k-lh-snug);
  letter-spacing: var(--k-tr-flat);
  color: inherit;
}
/* On a deep-green section, soften the label a touch under the white number. */
.k-section--deep .k-stat__label { color: var(--k-on-deep-soft); }

@media (min-width: 768px) {
  .k-stats { gap: 0; align-items: start; }
  .k-stats--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .k-stats--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .k-stats--4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }

  .k-stat { padding-inline: clamp(24px, 3vw, 48px); }
  .k-stat:first-child { padding-inline-start: 0; }
  .k-stat:last-child  { padding-inline-end: 0; }
  /* hairline divider between metrics (the only chrome) */
  .k-stat + .k-stat { border-left: 1px solid var(--k-line); }
  .k-section--deep .k-stat + .k-stat { border-left-color: var(--k-on-deep-line); }
}


/* ===== testimonials.css ============================================ */
/* =============================================================================
   KUENTA COMPONENTS — TESTIMONIALS
   Deep-green section, white quote cards. Mobile-first: swipe carousel with an
   edge peek; desktop: 3-up grid. Quote → author (avatar + name + brand).
   No star ratings, no centered-single variant — one confident shape.

   Reference: Shopify / Nu testimonial rows; Tiendanube mobile carousel.

   Structure (HTML):
     <section class="k-testimonials">
       <div class="k-container">
         <header class="k-section__head k-section__head--center">…</header>  <!-- optional -->
         <ul class="k-testimonials__list">
           <li class="k-testimonial">
             <blockquote class="k-testimonial__quote">Me entendieron primero…</blockquote>
             <figcaption class="k-testimonial__author">
               <span class="k-testimonial__avatar"><img src="…" alt=""></span>
               <span class="k-testimonial__meta">
                 <span class="k-testimonial__name">María G.</span>
                 <span class="k-testimonial__brand">Cafetería · Guadalajara</span>
               </span>
             </figcaption>
           </li>
           …
         </ul>
       </div>
     </section>
   ============================================================================= */

.k-testimonials {
  padding-block: var(--k-section-y);
  background: var(--k-surface-deep);
  color: var(--k-on-deep);
}

/* When the section head sits on this deep section, lighten its text. */
.k-testimonials .k-section__title { color: var(--k-on-deep); }
.k-testimonials .k-section__title .k-accent { color: var(--k-jade); }  /* was deep-green → invisible on the deep bg */
.k-testimonials .k-section__lead  { color: var(--k-on-deep-soft); }

/* === LIST — mobile swipe carousel ====================================== */
.k-testimonials__list {
  display: flex;
  gap: 14px;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
  margin-inline: calc(var(--k-pad) * -1);
  padding-inline: var(--k-pad);
  padding-bottom: 8px;
  scroll-padding-inline: var(--k-pad);
}
.k-testimonials__list::-webkit-scrollbar { display: none; }
.k-testimonials__list > .k-testimonial {
  flex: 0 0 86%;
  scroll-snap-align: start;
  min-width: 0;
}

/* === CARD ============================================================== */
.k-testimonial {
  display: flex;
  flex-direction: column;
  gap: 24px;
  background: var(--k-paper);
  color: var(--k-ink);
  border-radius: var(--k-r-lg);
  padding: 28px 26px;
}

/* 5-star rating — leads the card (replaces the decorative quote mark). */
.k-testimonial__stars { color: var(--k-jade); font-size: 18px; letter-spacing: 4px; line-height: 1; }

.k-testimonial__quote {
  font-size: var(--k-fs-md);
  line-height: var(--k-lh-normal);
  color: var(--k-ink);
  font-style: normal;
}

.k-testimonial__author {
  display: flex;
  align-items: center;
  gap: 14px;
  margin-top: auto;
}
/* Monogram avatar — soft-jade chip with the person's initials. Human and
   personal without a (often fake-looking) tiny headshot. Pattern: clean SaaS
   testimonial monograms (Stripe / Linear) rather than stock face photos. */
.k-testimonial__avatar {
  width: 48px; height: 48px;
  border-radius: var(--k-r-pill);
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--k-surface-gray);  /* neutral: el verde vive en la tinta, no en el relleno */
  color: var(--k-deep-2);
  font-size: var(--k-fs-sm);
  font-weight: var(--k-fw-bold);
  letter-spacing: 0.02em;
  text-transform: uppercase;
}
.k-testimonial__meta { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.k-testimonial__name { font-size: var(--k-fs-body); font-weight: var(--k-fw-semi); line-height: var(--k-lh-snug); }
.k-testimonial__brand { font-size: var(--k-fs-xs); color: var(--k-muted); }

/* === DESKTOP — 3-up grid =============================================== */
@media (min-width: 1024px) {
  .k-testimonials__list {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 24px;
    overflow: visible;
    scroll-snap-type: none;
    margin-inline: 0;
    padding-inline: 0;
    padding-bottom: 0;
  }
  .k-testimonials__list > .k-testimonial { flex: none; }
  .k-testimonial { padding: 36px 32px; gap: 28px; border-radius: var(--k-r-xl); }
  .k-testimonial__quote { font-size: 18px; }
}


/* ===== reviews.css ================================================= */
/* =============================================================================
   KUENTA COMPONENTS — REVIEWS (static 2-up)
   Two compact quote cards, side by side on desktop, stacked on mobile. No
   carousel, no arrows, no counter — both testimonials are always visible, which
   reads cleaner (especially on mobile) than a paged one-at-a-time slider.
   Pattern: Stripe / Square testimonial row, trimmed to two.

   Structure (HTML):
     <div class="k-reviews__stage">
       <article class="k-review">
         <blockquote class="k-review__quote">“…”</blockquote>
         <div class="k-review__person">
           <div class="k-review__photo"><img …></div>   (or monogram text)
           <div class="k-review__meta">
             <span class="k-review__name">…</span>
             <span class="k-review__role">…</span>
             <span class="k-review__stat">…</span>
           </div>
         </div>
       </article>
       … one more …
     </div>
   ============================================================================= */


/* The 2-up grid. */
.k-reviews__stage {
  display: grid;
  gap: clamp(16px, 2vw, 24px);
}
@media (min-width: 768px) {
  .k-reviews__stage { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* One review = a calm card: quote on top, person row at the bottom. */
.k-review {
  display: flex;
  flex-direction: column;
  gap: clamp(18px, 2.4vw, 28px);
  background: var(--k-paper);
  border: 1px solid var(--k-line);
  border-radius: var(--k-r-xl);
  padding: clamp(22px, 2.6vw, 34px);
  box-shadow: var(--k-shadow-md);
}

.k-review__quote {
  margin: 0;
  font-size: clamp(17px, 1.5vw, 21px);
  font-weight: var(--k-fw-medium);
  line-height: 1.45;
  letter-spacing: -0.005em;
  color: var(--k-ink);
  text-wrap: pretty;
}

/* Person row — small round avatar + name/role/stat, pinned to the card bottom. */
.k-review__person {
  display: flex;
  align-items: center;
  gap: 14px;
  margin-top: auto;
}
.k-review__photo {
  width: 64px;
  height: 64px;
  flex: 0 0 auto;
  border-radius: 50%;
  overflow: hidden;
  background: var(--k-surface-deep);
  color: var(--k-on-deep);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: var(--k-fs-md);
  font-weight: var(--k-fw-semi);
  letter-spacing: -0.02em;
}
.k-review__photo img { width: 100%; height: 100%; object-fit: cover; }

.k-review__meta { display: flex; flex-direction: column; min-width: 0; }
.k-review__name { font-size: var(--k-fs-md); font-weight: var(--k-fw-bold); color: var(--k-ink); }
.k-review__role { font-size: var(--k-fs-sm); color: var(--k-muted); margin-top: 1px; }
.k-review__stat {
  align-self: flex-start;
  margin-top: 8px;
  font-size: var(--k-fs-eyebrow);
  font-weight: var(--k-fw-semi);
  color: var(--k-jade-ink);
  background: var(--k-surface-gray);
  border-radius: var(--k-r-pill);
  padding: 5px 12px;
}


/* ===== faq.css ===================================================== */
/* =============================================================================
   KUENTA COMPONENTS — FAQ
   Accordion built on native <details>/<summary> — zero JS, works without it,
   accessible by default. Line dividers, CSS-drawn +/− icon (vertical bar
   collapses when open). Always on a paper section. Instacart / Nu pattern.

   Structure (HTML):
     <section class="k-faq">
       <div class="k-container">
         <header class="k-section__head k-section__head--left">…</header>  <!-- optional -->
         <div class="k-faq__list">
           <details class="k-faq__item" open>
             <summary class="k-faq__q">
               <span>¿Cuánto cuesta trabajar con Kuenta?</span>
               <span class="k-faq__icon" aria-hidden="true"></span>
             </summary>
             <div class="k-faq__a"><p>…</p></div>
           </details>
           …
         </div>
       </div>
     </section>
   ============================================================================= */

.k-faq {
  padding-block: var(--k-section-y);
  background: var(--k-canvas);
  color: var(--k-ink);
}

.k-faq__list { border-top: 1px solid var(--k-line); }

.k-faq__item { border-bottom: 1px solid var(--k-line); }

.k-faq__q {
  list-style: none;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
  padding: 22px 4px;
  font-size: var(--k-fs-md);
  font-weight: var(--k-fw-semi);
  line-height: 1.35;
  letter-spacing: var(--k-tr-flat);
  color: var(--k-ink);
}
.k-faq__q::-webkit-details-marker { display: none; }
.k-faq__q::marker { content: ''; }

/* +/− icon — two bars; the vertical one collapses on open */
.k-faq__icon {
  position: relative;
  flex: 0 0 auto;
  width: 20px; height: 20px;
}
.k-faq__icon::before,
.k-faq__icon::after {
  content: '';
  position: absolute;
  background: var(--k-deep);
  border-radius: 1px;
}
.k-faq__icon::before { top: 50%; left: 0; right: 0; height: 2px; transform: translateY(-1px); }
.k-faq__icon::after  { left: 50%; top: 0; bottom: 0; width: 2px; transform: translateX(-1px);
  transition: transform var(--k-dur) var(--k-ease), opacity var(--k-dur) var(--k-ease); }
.k-faq__item[open] .k-faq__icon::after { transform: translateX(-1px) scaleY(0); opacity: 0; }

.k-faq__a { padding: 0 4px 22px; max-width: 760px; }
.k-faq__a p { font-size: var(--k-fs-body); line-height: var(--k-lh-relaxed); color: var(--k-muted); }
.k-faq__a p + p { margin-top: 12px; }

@media (min-width: 1024px) {
  .k-faq__q { padding: 28px 4px; gap: 32px; font-size: 19px; }
  .k-faq__a { padding: 0 4px 28px; max-width: 820px; }
  .k-faq__a p { font-size: var(--k-fs-md); }
}


/* ===== form.css ==================================================== */
/* =============================================================================
   KUENTA COMPONENTS — FORM
   Lead capture. Label above field, single column, full-width pill submit.
   Inputs are 16px so iOS doesn't zoom on focus. Custom select arrow.
   Error / success field states. Optional mint form-card wrapper for the
   intake / application moment. Toast / Nu pattern.

   Structure (HTML):
     <form class="k-form" novalidate>
       <div class="k-form__field">
         <label class="k-form__label" for="nombre">Nombre</label>
         <input class="k-form__input" id="nombre" name="nombre" type="text" required>
       </div>
       <div class="k-form__field">
         <label class="k-form__label" for="negocio">Tipo de negocio</label>
         <select class="k-form__select" id="negocio" name="negocio">…</select>
       </div>
       <div class="k-form__field">
         <label class="k-form__label" for="msg">¿Qué necesitas resolver?</label>
         <textarea class="k-form__textarea" id="msg" name="msg" rows="4"></textarea>
         <p class="k-form__hint">Te respondemos en menos de 24 horas.</p>
       </div>
       <div class="k-form__actions">
         <button class="k-btn k-btn--primary k-btn--block" type="submit">Hablar con Kuenta</button>
       </div>
     </form>

   Optional wrapper:  <section class="k-form-card"><div class="k-container">
                        <div class="k-form-card__inner"> … form … </div></div></section>
   ============================================================================= */

.k-form {
  display: flex;
  flex-direction: column;
  gap: 18px;
  max-width: 520px;
}

.k-form__field { display: flex; flex-direction: column; gap: 8px; }

/* Two-up row — short fields side by side on tablet+ so forms stay short
   (standard contact-form layout). Stacks on phones. */
.k-form__row { display: grid; grid-template-columns: 1fr; gap: 18px; }
@media (min-width: 600px) { .k-form__row { grid-template-columns: 1fr 1fr; } }

.k-form__label {
  font-size: var(--k-fs-xs);
  font-weight: var(--k-fw-semi);
  letter-spacing: var(--k-tr-flat);
  color: var(--k-ink);
}
.k-form__optional { font-weight: var(--k-fw-regular); color: var(--k-muted); }   /* "(opcional)" tag on a label */

.k-form__input,
.k-form__select,
.k-form__textarea {
  width: 100%;
  font-family: inherit;
  font-size: var(--k-fs-body);                /* 16px min → no iOS zoom-on-focus */
  line-height: 1.4;
  color: var(--k-ink);
  background: var(--k-paper);
  border: 1px solid var(--k-line);
  border-radius: var(--k-r-sm);
  padding: 14px 16px;
  transition: border-color var(--k-dur) var(--k-ease), box-shadow var(--k-dur) var(--k-ease);
}
.k-form__input::placeholder,
.k-form__textarea::placeholder { color: var(--k-placeholder); }

.k-form__input:focus,
.k-form__select:focus,
.k-form__textarea:focus {
  outline: 0;
  border-color: var(--k-deep);
  box-shadow: 0 0 0 3px rgba(44, 99, 85, 0.14);
}

.k-form__select {
  appearance: none;
  -webkit-appearance: none;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8' fill='none'><path d='M1 1.5 6 6.5 11 1.5' stroke='%232C6355' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/></svg>");
  background-repeat: no-repeat;
  background-position: right 16px center;
  padding-right: 40px;
}

.k-form__textarea { resize: vertical; min-height: 96px; line-height: 1.5; }

.k-form__hint  { font-size: var(--k-fs-eyebrow); line-height: 1.4; color: var(--k-muted); }
.k-form__error { font-size: var(--k-fs-eyebrow); line-height: 1.4; color: var(--k-error); }

.k-form__field.is-error .k-form__input,
.k-form__field.is-error .k-form__select,
.k-form__field.is-error .k-form__textarea {
  border-color: var(--k-error);
  box-shadow: 0 0 0 3px var(--k-error-soft);
}
.k-form__field.is-success .k-form__input,
.k-form__field.is-success .k-form__select,
.k-form__field.is-success .k-form__textarea { border-color: var(--k-deep); }

.k-form__actions { margin-top: 6px; }

/* === FORM CARD WRAPPER (mint section + white card) ====================== */
.k-form-card {
  padding-block: var(--k-section-y);
  background: var(--k-surface-gray);
  color: var(--k-ink);
}
.k-form-card__inner {
  background: var(--k-paper);
  border: 1px solid var(--k-line);
  border-radius: var(--k-r-lg);
  padding: 28px 24px;
  max-width: 560px;
  margin-inline: auto;
}
.k-form-card__head { display: flex; flex-direction: column; gap: 10px; margin-bottom: 22px; }
.k-form-card__title { font-size: var(--k-fs-h3); font-weight: var(--k-fw-semi); line-height: var(--k-lh-snug); color: var(--k-ink); }
.k-form-card__copy  { font-size: var(--k-fs-sm); line-height: var(--k-lh-normal); color: var(--k-muted); }

@media (min-width: 1024px) {
  .k-form { gap: 20px; max-width: 560px; }
  .k-form__label { font-size: var(--k-fs-sm); }
  .k-form__input,
  .k-form__select,
  .k-form__textarea { font-size: var(--k-fs-md); padding: 16px 18px; border-radius: var(--k-r-md); }
  .k-form__textarea { min-height: 120px; }
  .k-form-card__inner { padding: 40px 36px; border-radius: var(--k-r-xl); max-width: 600px; }
  .k-form-card__title { font-size: 24px; }
  .k-form-card__copy  { font-size: var(--k-fs-md); }
}

/* === WHATSAPP HAND-OFF NOTICE ==========================================
   JS inserts <p class="k-form__notice" role="status"> into the form after a
   submit that opens WhatsApp. Small, mint, reassuring. The entrance is a CSS
   keyframe (not a JS toggle) so it plays even when the new WhatsApp tab steals
   focus and backgrounds this one. */
.k-form__notice {
  margin-top: 14px;
  padding: 12px 14px;
  font-size: var(--k-fs-eyebrow);
  line-height: 1.45;
  color: var(--k-deep);
  background: var(--k-mint);
  border: 1px solid var(--k-mint-line);
  border-radius: var(--k-r-sm);
  /* Slide-only entrance — never touches opacity, so the note is visible even if
     the animation clock is frozen (this tab gets backgrounded by the new
     WhatsApp tab the moment it's inserted). */
  animation: k-notice-in var(--k-dur) var(--k-ease);
}
@keyframes k-notice-in {
  from { transform: translateY(4px); }
  to   { transform: none; }
}
@media (prefers-reduced-motion: reduce) { .k-form__notice { animation: none; } }
.k-form__notice a { color: var(--k-deep); font-weight: var(--k-fw-semi); text-decoration: underline; }


/* ===== intake.css ================================================== */
/* =============================================================================
   KUENTA COMPONENTS — INTAKE (lead-capture / contact pages)
   The conversion pages: "Hablar con Kuenta", "Ser Aliado", "Distribuir".
   Two columns — a value-prop intro on the left, the form card on the right.
   Clean canvas + faint grid (.k-glow), no color washes — matches the
   Aliados aesthetic. The form itself is the shared .k-form-card (form.css).

   Structure (HTML):
     <section class="k-intake">
       <div class="k-glow" aria-hidden="true"></div>
       <div class="k-container k-intake__grid">
         <div class="k-intake__intro">
           <h1 class="k-intake__title">…</h1>
           <p class="k-intake__lead">…</p>
           <ul class="k-intake__trust"> <li><svg/> …</li> </ul>
         </div>
         <div class="k-form-card"> … the form … </div>
       </div>
     </section>
   ============================================================================= */

.k-intake { position: relative; overflow: hidden; padding-block: var(--k-section-y); background: var(--k-canvas); }

.k-intake__grid { position: relative; z-index: 1; display: flex; flex-direction: column; gap: clamp(32px, 4vw, 48px); }
.k-intake__intro { max-width: 520px; }

.k-intake__title { font-size: var(--k-fs-h2); font-weight: var(--k-fw-semi); line-height: var(--k-lh-tight); letter-spacing: var(--k-tr-snug); margin-top: var(--k-sp-sm); }
.k-intake__lead { font-size: var(--k-fs-lead); line-height: var(--k-lh-normal); color: var(--k-muted); margin-top: var(--k-sp-md); }

.k-intake__trust { list-style: none; margin: var(--k-sp-lg) 0 0; display: flex; flex-direction: column; gap: 14px; }
.k-intake__trust li { display: flex; align-items: center; gap: 12px; font-size: var(--k-fs-md); font-weight: var(--k-fw-semi); }
.k-intake__trust svg { width: 22px; height: 22px; flex: 0 0 auto; fill: none; stroke: var(--k-deep); stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }

@media (min-width: 1024px) {
  .k-intake__grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 560px); gap: clamp(48px, 5vw, 88px); align-items: center; }
  .k-intake__intro { padding-top: 0; }
}


/* ===== cta.css ===================================================== */
/* =============================================================================
   KUENTA COMPONENTS — CTA BANNER
   The pre-footer conversion band. ACTION ONLY — title + copy + button, no
   media slot (that's what split is for). Moods: --deep / --light. Layout:
   --center (centered) or default left.

   Structure (HTML):
     <section class="k-cta k-cta--deep k-cta--center">
       <div class="k-container">
         <div class="k-cta__content">
           <h2 class="k-cta__title">Es un gusto conocer tu negocio</h2>
           <p  class="k-cta__copy">Cuéntanos qué necesitas resolver.</p>
           <div class="k-cta__actions">
             <a class="k-btn k-btn--primary" href="#">Hablar con Kuenta</a>
           </div>
         </div>
       </div>
     </section>
   ============================================================================= */

.k-cta {
  padding-block: clamp(56px, 4vw + 32px, 88px);
  background: var(--k-canvas);
  color: var(--k-ink);
}

.k-cta__content {
  display: flex;
  flex-direction: column;
  gap: var(--k-sp-md);
  max-width: 720px;
}

.k-cta__title {
  font-size: clamp(28px, 5vw, 40px);
  font-weight: var(--k-fw-semi);
  line-height: var(--k-lh-tight);
  letter-spacing: -0.018em;
  color: inherit;
}
.k-cta__title .k-accent { color: var(--k-deep); font-style: normal; }

.k-cta__copy {
  font-size: var(--k-fs-lead);
  line-height: var(--k-lh-normal);
  color: var(--k-muted);
  max-width: 56ch;
}

.k-cta__actions {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
  margin-top: var(--k-sp-sm);
}

/* === MOODS ============================================================= */
.k-cta--light { background: var(--k-surface-alt); }

.k-cta--deep {
  background: var(--k-surface-deep);
  color: var(--k-on-deep);
}
.k-cta--deep .k-cta__copy        { color: var(--k-on-deep-soft); }
.k-cta--deep .k-cta__title .k-accent { color: var(--k-jade); }

/* === LAYOUT: CENTERED ================================================== */
.k-cta--center .k-cta__content {
  align-items: center;
  text-align: center;
  margin-inline: auto;
  max-width: 680px;
}
.k-cta--center .k-cta__actions { justify-content: center; }

@media (min-width: 1024px) {
  .k-cta__title { font-size: clamp(36px, 3.4vw, 52px); }
}


/* ===== aliados.css ================================================= */
/* =============================================================================
   KUENTA COMPONENTS — ALIADOS / HIGH-ENERGY LANDING LAYER
   Reusable components for the dark, high-energy "build a business" pages
   (patterned on the Shopify Affiliates page). Everything here is token-driven
   so it can be reskinned and reused on future recruit/partner landing pages.

   Components in this file:
     .al-hero            oversized two-tone display hero on a faint grid
     .al-personas        tall, full-bleed horizontal "who's a good fit" scroller
     .al-feat            feature cards with floating chips (mockup canvas)
     .al-cta / __wires   hero-scale CTA with looping animated wires
     .al-section(--deep) section helpers + on-deep contrast fixes
     [data-reveal]       scroll-reveal motion (reduced-motion safe)
     .k-ph               image placeholder (swap for real images)
   ============================================================================= */

/* ---- Image placeholder (temporary, swap for real images) ---------------- */
.k-ph { display:flex; align-items:center; justify-content:center; text-align:center;
        background: rgba(44,99,85,0.06); border:1px dashed var(--k-line-strong);
        border-radius: var(--k-r-image); color: var(--k-muted);
        font-size:var(--k-fs-3xs); font-weight:700; letter-spacing:.12em; text-transform:uppercase; }
.k-section--deep .k-ph, .al-cta .k-ph, .k-ph--dark {
        background: var(--k-on-deep-fill); border-color: var(--k-on-deep-line); color: var(--k-on-deep-gov); }
/* Persona photo slot: an intentional tonal-green block (not a dashed "empty"
   box) so the band looks designed until a real photo drops in. */
.al-persona .k-ph { border:0; color: rgba(255,255,255,0.55);
        background: linear-gradient(155deg, var(--k-tint-300) 0%, var(--k-tint-400) 45%, var(--k-deep) 100%); }

/* The final CTA is .k-cta--deep (not a .k-section--deep), so tint its accent jade. */
.al-cta .k-accent { color: var(--k-jade); }

/* ---- Rules / expectations list ------------------------------------------ */
/* ---- Pact: "lo que esperamos" / "lo que es tuyo" (on a light section) --- */
.al-pact { display:grid; gap:16px; margin:0; }
@media (min-width:768px){ .al-pact { grid-template-columns:1fr 1fr; gap: clamp(20px,2.6vw,32px); } }
.al-pact__col { background: var(--k-paper); border:1px solid var(--k-line); border-radius: var(--k-r-xl); padding: var(--k-card-pad); box-shadow: var(--k-shadow-md); }
.al-pact__col--yours { border-color: var(--k-line-hover); background: var(--k-surface-gray); }
.al-pact__head { font-size: var(--k-fs-h3); font-weight: var(--k-fw-semi); color: var(--k-ink); margin-bottom: 18px; }
.al-pact__list { list-style:none; margin:0; display:grid; gap:13px; }
.al-pact__list li { position:relative; padding-left:30px; color: var(--k-muted); font-size: var(--k-fs-md); line-height: var(--k-lh-normal); }
/* Left ("lo que esperamos") — neutral dash mark = the ask. */
.al-pact__list li::before { content:""; position:absolute; left:2px; top:13px; width:12px; height:2.5px; border-radius:2px; background: var(--k-line-strong); }
/* Right ("lo que es tuyo") — green checkmark on a mint card = what you get. */
.al-pact__col--yours .al-pact__list li::before { width:9px; height:14px; top:4px; left:5px; border:solid var(--k-jade-deep); border-width:0 2.6px 2.6px 0; border-radius:0; background:transparent; transform:rotate(45deg); }

/* ---- Ownership hook: "Tu cartera es tuya. No de Kuenta." (deep band) ----
   The single biggest differentiator: the agent OWNS the book. Big, isolated,
   first — before any number. Chips make the asset claim scannable. */
.al-own { background: var(--k-surface-deep); color: var(--k-on-deep); }
.al-own__title { font-size: var(--k-fs-h2); font-weight: var(--k-fw-bold); line-height: var(--k-lh-tight); letter-spacing: var(--k-tr-flat); margin:0; max-width: 18ch; }
.al-own__title-2 { display:block; color: var(--k-tint-400); }
.al-own__lead { margin: clamp(14px,1.6vw,18px) 0 0; max-width: 46ch; font-size: var(--k-fs-lead); line-height: var(--k-lh-normal); color: var(--k-on-deep-soft); }
.al-own__lead strong { color: var(--k-on-deep); font-weight: var(--k-fw-semi); }

/* ---- Niveles: the four levels ARE the earnings ladder (light section) ----
   More comercios activos -> higher level -> bigger % -> more of the book is
   yours. "hasta" + inline math turn each number from a claim into a sum; the
   fine print keeps it credible. */
.al-niveles__intro { font-size: var(--k-fs-md); color: var(--k-muted); line-height: var(--k-lh-normal); max-width: 58ch; margin:0 0 clamp(18px,2.2vw,24px); }
.al-niveles__entry { display:flex; align-items:center; flex-wrap:wrap; gap:6px 12px; background: var(--k-surface-gray); border:1px dashed var(--k-line-strong); border-radius: var(--k-r-lg); padding:12px 16px; margin-bottom:12px; }
.al-niveles__entry-txt { font-size: var(--k-fs-sm); color: var(--k-muted); }
.al-levels { list-style:none; margin:0; padding:0; display:grid; gap:12px; }
.al-level { background: var(--k-paper); border:1px solid var(--k-line); border-radius: var(--k-r-lg); padding: clamp(15px,1.8vw,18px); }
.al-level__row { display:flex; align-items:flex-start; justify-content:space-between; gap:14px; }
.al-level__name { margin:0; font-size: var(--k-fs-h3); font-weight: var(--k-fw-bold); color: var(--k-ink); letter-spacing:.01em; }
.al-level__meta { display:block; margin-top:3px; font-size: var(--k-fs-sm); font-weight: var(--k-fw-regular); color: var(--k-muted); letter-spacing:0; }
.al-level__own { display:inline-block; margin-top:11px; font-size: var(--k-fs-xs); font-weight: var(--k-fw-semi); color: var(--k-deep); }
.al-level__right { text-align:right; flex:0 0 auto; }
.al-level__amt { margin:0; font-size: clamp(22px,3.2vw,28px); font-weight: var(--k-fw-bold); color: var(--k-ink); letter-spacing:-.02em; line-height:1; white-space:nowrap; }
.al-level__pre { font-size: var(--k-fs-sm); font-weight: var(--k-fw-medium); color: var(--k-muted); letter-spacing:0; }
.al-level__unit { font-size: var(--k-fs-sm); font-weight: var(--k-fw-medium); color: var(--k-muted); letter-spacing:0; }
.al-level__math { margin:4px 0 0; font-size: var(--k-fs-xs); color: var(--k-muted); white-space:nowrap; }
.al-level__bar { display:block; height:6px; border-radius: var(--k-r-pill); background: var(--k-surface-sunken); margin-top:14px; overflow:hidden; }
.al-level__bar i { display:block; height:100%; border-radius: var(--k-r-pill); background: var(--k-jade-deep); }
.al-level--top { background: var(--k-surface-gray); border:2px solid var(--k-deep); padding: calc(clamp(15px,1.8vw,18px) - 1px); }
.al-level--top .al-level__own { color: var(--k-deep-2); }
.al-level--top .al-level__amt { color: var(--k-deep-2); }
.al-level--top .al-level__bar { background: rgba(44,99,85,.18); }
.al-level--top .al-level__bar i { background: var(--k-deep); }
/* No longer inside a pill, so the two ownership phrases need a visible break. */
.al-level__own-note { display:inline-block; margin-left:8px; font-size: var(--k-fs-xs); font-weight: var(--k-fw-regular); color: var(--k-muted); }
.al-level__own-note::before { content:"· "; }
.al-level__left { min-width:0; }
/* Mobile: stack each rung so the ownership line gets full width. */
@media (max-width:599px){
  .al-level__row { flex-direction:column; gap:10px; }
  .al-level__right { text-align:left; }
}
/* Subtle metal accent per tier — a thin inset edge; the card stays neutral so
   it nods to bronce/plata/oro/platino without going gaudy/MLM. */
.al-level { position:relative; overflow:hidden; }
.al-level__accent { position:absolute; left:0; top:12px; bottom:12px; width:4px; border-radius:999px; background: var(--metal, transparent); }
.al-level--plata { --metal:var(--k-tint-400); }
.al-level--oro   { --metal:var(--k-jade-deep); }
.al-level--top   { --metal:var(--k-muted); }
.al-level--plata .al-level__bar i { background:var(--k-tint-400); }
.al-level--oro   .al-level__bar i { background:var(--k-jade-deep); }
/* "Sin tope" — Platino is open-ended; spell out that it keeps climbing. */
.al-niveles__nocap { margin: clamp(14px,1.8vw,18px) 0 0; font-size: var(--k-fs-sm); line-height: var(--k-lh-normal); color: var(--k-ink); }
.al-niveles__nocap strong { color: var(--k-deep); font-weight: var(--k-fw-bold); }
/* Rung reskin (compliance): the ladder is now a pure MECHANIC of progression —
   no tier names, no %, no peso amounts. Metal accents + graduated bar widths
   live here (moved off inline styles / tier class names) so the HTML carries no
   "%", peso figure, or tier word. Same growing-ladder visual, mechanic copy. */
.al-level--r1 { --metal:var(--k-tint-400); }
.al-level--r2 { --metal:var(--k-jade-deep); }
.al-level--r1 .al-level__bar i { background:var(--k-tint-400); width:40%; }
.al-level--r2 .al-level__bar i { background:var(--k-jade-deep); width:68%; }
.al-level--top .al-level__bar i { width:100%; }

/* ---- Hero: oversized two-tone display on a faint grid ------------------- */
/* Tighter top/bottom so the persona faces peek into the first screen (Shopify). */
.al-hero { position:relative; overflow:hidden; background: var(--k-canvas); text-align:center;
        padding-block: clamp(44px,5.5vw,84px) var(--k-section-y); }
.al-hero > .k-container { position:relative; z-index:1; }   /* grid bg = shared .k-glow utility */
/* Light weight + sized so each phrase stays on ONE line (matches Shopify). */
.al-hero__title { font-size: var(--k-fs-hero); font-weight: var(--k-fw-semi); line-height: 1.04; letter-spacing:-.025em;
        max-width: 17ch; margin-inline:auto; text-wrap: balance; }
.al-hero__title .k-line2 { display:block; color: var(--k-deep); }
/* Subhead — a real reading size, not a caption (the tiny lead was the problem). */
.al-hero__lead { font-size: clamp(20px,1.7vw,24px); line-height: var(--k-lh-normal); color: var(--k-muted); max-width: 46ch; margin: clamp(22px,2.4vw,32px) auto 0; }
.al-hero__actions { margin-top: clamp(24px,3vw,40px); display:flex; flex-wrap:wrap; gap:12px; justify-content:center; }
/* Trust line under the CTA — fills the hero now that it flows straight to the
   persona faces, and reduces friction (free / no investment / paid monthly). */
/* Mobile: left-aligned column centered as a block, so the checkmarks line up
   (a centered wrap staircases). Desktop: centered inline row. */
.al-hero__meta { display:flex; flex-direction:column; align-items:flex-start;
        width:fit-content; margin: clamp(22px,2.6vw,32px) auto 0; gap:9px; list-style:none; }
.al-hero__meta li { display:inline-flex; align-items:center; gap:10px;
        font-size: clamp(15px,1.4vw,18px); font-weight: var(--k-fw-medium); color: var(--k-muted); }
.al-hero__check { width:19px; height:19px; flex:0 0 auto; color: var(--k-deep); }

@media (min-width:600px) {
  .al-hero__meta { flex-direction:row; flex-wrap:wrap; align-items:center;
          justify-content:center; width:auto; gap:12px 28px; }
}

/* ---- Personas: tall full-bleed horizontal scroller --------------------- */
.al-personas-sec { background: var(--k-surface-alt); padding-block: var(--k-section-y); }   /* green-wash energy beat — the "own your business" moment */
.al-personas { display:flex; gap:16px; margin:0; list-style:none;
        overflow-x:auto; scroll-snap-type:x mandatory; scrollbar-width:none; -webkit-overflow-scrolling:touch;
        padding-block: 4px;
        padding-inline: max(var(--k-pad), calc((100% - var(--k-container)) / 2 + var(--k-pad)));
        scroll-padding-inline: max(var(--k-pad), calc((100% - var(--k-container)) / 2 + var(--k-pad))); }
.al-personas::-webkit-scrollbar { display:none; }
/* Card = photo on top + light body below (name, one line, "para ti si…" checks).
   grid-auto-rows isn't available in a flex scroller, so equal height comes from
   align-items:stretch (default) + each body flex-growing to fill. */
.al-persona { position:relative; flex:0 0 82%; scroll-snap-align:start; min-width:0;
        display:flex; flex-direction:column;
        background: var(--k-paper); border:1px solid var(--k-line);
        border-radius: var(--k-r-xl); overflow:hidden; box-shadow: var(--k-shadow-md); }
.al-persona .k-ph { position:relative; inset:auto; border:0; border-radius:0; }
/* Persona photo sits on top at a fixed ratio. CONVENTION: frame each subject by
   baking the crop into the .webp (head in the upper third, eyes on a common
   line) — never with a per-card object-position override, which would diverge
   this shared component between pages. */
.al-persona__photo { width:100%; aspect-ratio: 16 / 11; object-fit:cover; display:block; }
.al-persona__body { flex:1 1 auto; text-align:left; padding: clamp(18px,2vw,24px);
        display:flex; flex-direction:column; }
/* Time/commitment pill — the parallel axis the reader self-selects on. */
.al-persona__time { align-self:flex-start; background: var(--k-surface-gray); color: var(--k-jade-ink);
        font-size:var(--k-fs-eyebrow); font-weight: var(--k-fw-bold); padding:6px 12px; border-radius: var(--k-r-pill); }
.al-persona__title { font-size: clamp(20px,2.2vw,26px); font-weight: var(--k-fw-semi); line-height: var(--k-lh-snug); color: var(--k-ink); margin-top:13px; }
@media (min-width: 600px){ .al-persona { flex-basis: 47%; } }
/* Desktop: stop being a full-bleed scroller. Become a container-bounded grid of
   3 equal columns so the row aligns flush to the container's left AND right edges
   (Shopify-style), instead of leaving trailing space. The scroller above is for
   touch/peek on smaller screens only. */
@media (min-width: 1024px){
  .al-personas {
    display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 24px;
    overflow: visible; scroll-snap-type: none;
    max-width: var(--k-container); margin-inline: auto;
    padding-inline: var(--k-pad); scroll-padding-inline: 0;
  }
  .al-persona { flex: initial; }
}

/* Round icon button — prev/next control (shared by the reviews carousel). */
.al-arrow { width:48px; height:48px; border-radius:50%; border:1.5px solid var(--k-line-strong);
        display:inline-flex; align-items:center; justify-content:center; color:var(--k-deep);
        transition: background-color var(--k-dur) var(--k-ease), color var(--k-dur) var(--k-ease),
                    border-color var(--k-dur) var(--k-ease), transform var(--k-dur) var(--k-ease); }
.al-arrow svg { width:20px; height:20px; }
.al-arrow:hover { background: var(--k-ink); border-color: var(--k-ink); color: var(--k-paper); transform: translateY(-1px); }
.al-arrow:disabled { opacity:.32; cursor:default; pointer-events:none; }

/* ---- Feature cards: dark mockup canvas + floating chips ----------------- */
/* grid-auto-rows:1fr makes EVERY row equal to the tallest, so cards stay the
   same height even when copy length differs — on one column (mobile) and two
   (desktop) alike. The media is a fixed ratio; the body flex-grows to fill. */
.al-feat { display:grid; gap:20px; grid-auto-rows: 1fr; }
@media (min-width: 600px){ .al-feat { grid-template-columns:1fr 1fr; } }
.al-feat__card { background: var(--k-on-deep-fill); border:1px solid var(--k-on-deep-line); border-radius: var(--k-r-xl); overflow:hidden; display:flex; flex-direction:column; height:100%; }
/* Near-square media (Shopify proportion) — was a wide short strip. */
.al-feat__media { position:relative; aspect-ratio: 4 / 3; overflow:hidden;
        display:flex; align-items:center; justify-content:center;
        background: linear-gradient(160deg, rgba(255,255,255,.06), rgba(255,255,255,.015)); }
/* Soft jade spotlight behind the mockup (replaces the white tech grid). */
.al-feat__media::before { content:""; position:absolute; inset:0; z-index:0;
        background: radial-gradient(58% 55% at 50% 42%, rgba(127,214,180,.22), transparent 62%); }
.al-feat__body { padding: clamp(22px,2.2vw,28px); flex:1 1 auto; }
.al-feat__title { font-size: clamp(23px, 2.3vw, 30px); font-weight: var(--k-fw-semi); color: var(--k-on-deep); letter-spacing:-.01em; }
.al-feat__copy { font-size: var(--k-fs-md); line-height: var(--k-lh-normal); color: var(--k-on-deep-soft); margin-top:10px; }

/* Floating overlays sit BIG on the photo (Shopify) — prominent, not tiny. */
.al-chip { position:absolute; z-index:2; display:inline-flex; align-items:center; gap:11px;
        background: rgba(15,42,36,.78); -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px);
        border:1px solid var(--k-on-deep-line); color: var(--k-on-deep);
        border-radius: var(--k-r-pill); padding:12px 19px; font-size:var(--k-fs-body); font-weight: var(--k-fw-semi); white-space:nowrap;
        box-shadow: var(--k-shadow-float); }
.al-chip strong { color: var(--k-jade); font-weight: var(--k-fw-bold); }
.al-chip__dot { width:20px; height:20px; border-radius:50%; background: var(--k-jade); display:inline-block; }
/* Jade icon-circle inside a chip (illustrative dashboard stats — our take on
   Shopify's floating stat pills, without copying their style). */
.al-chip__ic { width:34px; height:34px; border-radius:50%; background: var(--k-jade); color: var(--k-deep-2);
        display:inline-flex; align-items:center; justify-content:center; flex:0 0 auto; }
.al-chip__ic svg { width:19px; height:19px; }
/* Two-line stat pill (label small + big amount) — Shopify "Next payout / $1,800". */
.al-chip--stat { flex-direction:column; align-items:flex-start; gap:1px; padding:11px 18px; }
.al-chip__lbl { font-size:var(--k-fs-eyebrow); font-weight: var(--k-fw-semi); color: var(--k-on-deep-soft); letter-spacing:.01em; }
.al-chip__amt { font-size:26px; font-weight: var(--k-fw-bold); color: var(--k-jade); line-height:1.04; letter-spacing:-.02em; }
.al-chip--a { top:24px; left:24px; animation: alFloat 5s ease-in-out infinite; }
.al-chip--b { bottom:28px; right:24px; animation: alFloat 6.2s ease-in-out infinite reverse; }
.al-chip--c { top:50%; left:50%; animation: alFloatC 5.6s ease-in-out infinite; }
@keyframes alFloat  { 0%,100%{ transform: translateY(0); } 50%{ transform: translateY(-9px); } }
@keyframes alFloatC { 0%,100%{ transform: translate(-50%,-50%); } 50%{ transform: translate(-50%,calc(-50% - 9px)); } }
.al-feat__tags { position:absolute; inset:0; z-index:2; display:flex; flex-wrap:wrap; gap:10px; align-content:center; justify-content:center; padding:28px; }
.al-feat__tag { background: var(--k-on-deep-fill); border:1px solid var(--k-on-deep-line); color: var(--k-on-deep);
        border-radius: var(--k-r-pill); padding:9px 16px; font-size:var(--k-fs-xs); font-weight: var(--k-fw-semi); }
@media (prefers-reduced-motion: reduce){ .al-chip { animation:none !important; } }

/* ---- Photo media variant (Shopify "Guides / Payouts" cards) ------------- */
/* Generous inset so the photo sits SMALLER inside the card and the overlays
   float into the dark space around it (Shopify). */
.al-feat__media--photo { padding: clamp(26px,3.2vw,48px); background: var(--k-surface-deep); }
.al-feat__media--photo::before { display:none; }   /* no grid behind a photo */
.al-feat__photo { width:100%; height:100%; object-fit:cover; border-radius: var(--k-r-lg); display:block; }

/* ---- App-screen media variant: illustrative phone showing the dashboard --
   A vague device + skeleton dashboard (NO real numbers — those live in the
   floating chips). Reads instantly as "the app" without a literal screenshot. */
.al-phone { position:absolute; z-index:1; top:50%; left:50%; transform:translate(-50%,-50%);
        height:88%; aspect-ratio: 9 / 19; border-radius: clamp(24px,2.6vw,32px);
        background: linear-gradient(165deg, var(--k-deep-flat), var(--k-deep-2));
        border:1px solid var(--k-on-deep-line); box-shadow: var(--k-shadow-float-lg);
        padding: clamp(7px,0.8vw,10px); }
.al-phone__screen { width:100%; height:100%; border-radius: clamp(18px,2vw,24px); overflow:hidden;
        background: linear-gradient(175deg, var(--k-deep-2), var(--k-deep-flat));
        display:flex; flex-direction:column; gap: clamp(8px,1vw,11px); padding: clamp(12px,1.4vw,16px); }
.al-sk { border-radius:var(--k-r-pill); background: rgba(255,255,255,.14); }      /* skeleton line */
.al-sk--title { height:8px; width:46%; }
.al-phone__hero { border-radius: var(--k-r-md); margin-top:2px; padding: clamp(11px,1.3vw,15px);
        background: linear-gradient(150deg, rgba(9,211,160,.26), rgba(9,211,160,.10));
        border:1px solid rgba(9,211,160,.30); display:flex; flex-direction:column; gap:7px; }
.al-phone__hero .al-sk--a { height:7px; width:38%; background: rgba(255,255,255,.30); }
.al-phone__hero .al-sk--b { height:13px; width:66%; background: var(--k-jade); opacity:.92; }
.al-phone__bars { display:flex; align-items:flex-end; gap: clamp(5px,0.7vw,8px); height: clamp(34px,4vw,48px); margin-top:2px; }
.al-phone__bars i { flex:1; border-radius:4px 4px 0 0; background: rgba(9,211,160,.45); }
/* Illustrative chart heights — kept in CSS (not inline) so the mock stays a component. */
.al-phone__bars i:nth-child(1){ height:42%; }
.al-phone__bars i:nth-child(2){ height:64%; }
.al-phone__bars i:nth-child(3){ height:52%; }
.al-phone__bars i:nth-child(4){ height:84%; }
.al-phone__bars i:nth-child(5){ height:60%; }
.al-phone__bars i:nth-child(6){ height:74%; }
.al-phone__row .al-sk--short { flex-basis:70%; }
.al-phone__row { display:flex; align-items:center; gap:9px; }
.al-phone__row .dot { width:16px; height:16px; border-radius:50%; background: rgba(255,255,255,.16); flex:0 0 auto; }
.al-phone__row .al-sk { height:7px; flex:1; }
/* chips ride the centered phone's edges — scoped so default chip slots
   (used by the photo cards) stay exactly where they are. */
.al-feat__media--app .al-chip--a { top:14%; left:11%; }
.al-feat__media--app .al-chip--c { top:45%; left:auto; right:10%; transform:none; animation: alFloat 5.6s ease-in-out infinite; }
.al-feat__media--app .al-chip--b { bottom:13%; left:15%; right:auto; }

/* Mobile: the dashboard chips are sized for desktop and overlap the phone on a
   narrow card. Shrink them and push them to the corners so the device shows. */
@media (max-width:600px){
  .al-feat__media--app .al-chip { padding:7px 11px; font-size:13px; gap:8px; }
  .al-feat__media--app .al-chip__ic { width:24px; height:24px; }
  .al-feat__media--app .al-chip__ic svg { width:13px; height:13px; }
  .al-feat__media--app .al-chip--a { top:7%; left:4%; }
  .al-feat__media--app .al-chip--c { top:44%; right:4%; left:auto; }
  .al-feat__media--app .al-chip--b { bottom:8%; left:8%; right:auto; }
}

/* ---- WhatsApp-style support chat mock (al-chat) ------------------------- */
/* An illustrative chat — NOT a copy of WhatsApp's UI. Our green palette, our
   bubble shapes. Lives in a feat__media as a "soporte por WhatsApp" cue. */
.al-feat__media--chat { padding: clamp(20px,2.4vw,30px); align-items: stretch; }
.al-feat__media--chat::before { display:none; }
.al-chat { width:100%; align-self:center; display:flex; flex-direction:column; gap:10px; }
.al-chat__bubble { max-width:80%; padding:10px 14px; border-radius:16px; font-size:var(--k-fs-xs); line-height:1.35;
        box-shadow: var(--k-shadow-float); }
/* Incoming (the aliado asking) — light bubble, left. */
.al-chat__bubble--in { align-self:flex-start; background: var(--k-paper); color: var(--k-ink); border-bottom-left-radius:5px; }
/* Outgoing (Kuenta support replying) — jade bubble, right. */
.al-chat__bubble--out { align-self:flex-end; background: var(--k-jade); color: var(--k-deep-2); border-bottom-right-radius:5px; font-weight: var(--k-fw-medium); }
.al-chat__meta { display:flex; align-items:center; gap:7px; font-size:var(--k-fs-3xs); color: var(--k-on-deep-soft); align-self:flex-end; margin-top:-4px; }
.al-chat__meta svg { width:13px; height:13px; color: var(--k-jade); }
.al-chat__time { opacity:.7; }

/* ---- Feature-card mockups (illustrative, NOT literal screenshots) ------- */
.al-mock { position:relative; z-index:1; }

/* Product app-tiles — a 2×2 stack in the product tones (the growing portfolio). */
.al-mock--stack { display:grid; grid-template-columns:1fr 1fr; gap:12px; width: min(82%, 340px); }
.al-tile { display:flex; flex-direction:column; justify-content:space-between; gap:14px;
        aspect-ratio: 1 / 0.62; padding: 11px 12px; border-radius: 13px; color: var(--k-on-deep);
        font-size: var(--k-fs-eyebrow); font-weight: var(--k-fw-semi); box-shadow: var(--k-shadow-float); }
.al-tile svg { width:20px; height:20px; }
.al-tile--cobros   { background: var(--k-prod-cobros); }
.al-tile--credito  { background: var(--k-prod-credito); }
.al-tile--software { background: var(--k-prod-software); color: var(--k-deep-2); }
.al-tile--seguros  { background: var(--k-prod-seguros);  color: var(--k-deep-2); }
/* "+ Próximamente" slot — makes "un catálogo que crece" literal (spans the row). */
.al-tile--soon { grid-column:1 / -1; aspect-ratio:auto; flex-direction:row; align-items:center; justify-content:center; gap:8px; padding:12px; background: var(--k-on-deep-fill); border:1.5px dashed var(--k-on-deep-line); color: var(--k-on-deep-soft); box-shadow:none; }

/* Card 4: real material names as labeled pills (replaces generic icon circles),
   so "materiales listos" is concrete, not decorative. */
.al-feat__mats { position:absolute; left: clamp(8px,1.2vw,16px); top:50%; transform:translateY(-50%); z-index:2; display:flex; flex-direction:column; gap:10px; }
.al-feat__mat { background: rgba(15,42,36,.80); -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px); border:1px solid var(--k-on-deep-line); color: var(--k-on-deep); border-radius: var(--k-r-pill); padding:9px 15px; font-size: var(--k-fs-xs); font-weight: var(--k-fw-semi); box-shadow: var(--k-shadow-float); white-space:nowrap; }

/* Reviews: pull the proof number above the quote so the outcome is scannable. */
.k-review__proof { font-size: clamp(28px,3.4vw,40px); font-weight: var(--k-fw-bold); color: var(--k-deep); line-height:1; letter-spacing:-.02em; margin:0 0 14px; }
.k-review__proof span { display:block; margin-top:6px; font-size: var(--k-fs-sm); font-weight: var(--k-fw-semi); color: var(--k-muted); letter-spacing:0; }

/* ---- Big CTA with looping animated wires -------------------------------- */
.al-cta { position:relative; overflow:hidden; }
.al-cta > .k-container { position:relative; z-index:2; }
.al-cta .k-cta__title { font-size: clamp(34px, 4.4vw, 60px); line-height: 1.04; letter-spacing:-.025em; max-width: 16ch; margin-inline: auto; }
.al-cta__wires { position:absolute; left:0; right:0; bottom:0; width:100%; height: clamp(140px,22vw,260px); z-index:0; pointer-events:none; }
.al-cta__wires path { fill:none; stroke-width:2.5; stroke-linecap:round; stroke-dasharray: 14 340; animation: alDash 7s linear infinite; }
.al-cta__wires path:nth-child(2){ animation-duration: 9s; }
.al-cta__wires path:nth-child(3){ animation-duration: 8s; animation-direction: reverse; }
.al-cta__wires path:nth-child(4){ animation-duration: 11s; }
@keyframes alDash { to { stroke-dashoffset: -354; } }
@media (prefers-reduced-motion: reduce){ .al-cta__wires path { animation:none; stroke-dasharray:none; opacity:.5; } }

/* ---- Scroll-reveal motion ----------------------------------------------- */
/* "Así se construye" now uses the shared .k-steps timeline component (same as the
   merchant "Así te acompañamos") — no bespoke stepper here. */

/* Lighter reveal: shorter, smaller travel, and NO permanent will-change (which
   was promoting dozens of elements to their own layers and making scroll/menu
   feel slow + janky on mobile). */
[data-reveal] { opacity:0; transform: translateY(14px); transition: opacity .5s ease, transform .5s cubic-bezier(.2,.7,.2,1); }
[data-reveal].is-in { opacity:1; transform:none; }
@media (prefers-reduced-motion: reduce){ [data-reveal] { opacity:1; transform:none; transition:none; } }


/* ===== accents.css ================================================= */
/* =============================================================================
   KUENTA COMPONENTS — ENERGY LAYER
   The single place that tunes the system's "energy." Loaded LAST so it tunes
   every component at once. Kept deliberately restrained, Shopify-style:
     - Accent word = COLOR only (jade on light, jade on deep). No underline.
                      One per heading, and NOT always on the last word: an
                      accent that lands on the final word every time reads as
                      a template. Put it on the word that carries the claim.
     - Eyebrow      = none. The headline opens the section by itself.
     - Hero display = a hair bolder + tighter (confident, not fintech-thin).
   Energy comes from section color rhythm + photography + bold type — not from
   decorating the words. Headline copy carries NO trailing periods (house rule).
   ============================================================================= */

/* Accent word — color only, never italic (it's often inside <em>). */
.k-accent { color: var(--k-jade-deep); font-style: normal; }

/* Hero display — el peso del sistema (600, en hero.css); solo tracking más apretado. */
.k-hero__title {
  letter-spacing: -0.025em;
}

/* Eyebrows removed 2026-08-02: the all-caps letterspaced label above a title
   is a generic-template tell, and on every page it only restated the headline
   or the nav. The headline now opens the section on its own. */
