/* ══════════════════════════════════════════════════════════════════════════
   TARJETAS DE PLAN — el MISMO diseño que la landing de campaña (3 ago 2026)

   🔴 POR QUÉ ESTE ARCHIVO EXISTE. Las tarjetas de plan estaban escritas TRES
   veces (hub.html inline, app.html inline y upgrade-modal.js, que lo usan 13
   páginas). El proyecto ya se había quemado con eso: en hub.html hay un bloque
   de CSS entero cuyo comentario dice "el MISMO modal tenía dos acabados según
   desde dónde lo abrieras". Cuatro copias del mismo diseño divergen siempre.
   Aquí hay UNA, y las tres implementaciones la usan.

   ⚠️ El CSS de las tarjetas es COPIA LITERAL de temporada2627.html (las reglas
   .key/.plan). Se copió en vez de importarse porque no hay build step y la
   landing no puede depender de un archivo que se sirve con caché de un día. Si
   se retoca el diseño en un sitio, retocarlo en el otro: son las MISMAS
   tarjetas y el objetivo es justo que no se distingan.

   ⚠️ Depende de dos variables que la landing define en :root. Aquí se declaran
   con valores propios para que funcione en cualquier página de la app.
   ══════════════════════════════════════════════════════════════════════════ */

.tq-planes{--wh:#F4FAF7;--ink:#F4FAF7;--mut:#F4FAF7;--mut2:#F4FAF7;
  --chrome:rgba(244,250,247,.45);--g:#1D9E75;--g-dark:#0F6E56;
  font-family:'DM Sans','Inter',system-ui,sans-serif;color:#F4FAF7;}

.tq-planes .key{display:inline-flex;align-items:center;justify-content:center;gap:9px;cursor:pointer;text-align:center;
  height:34px;padding:0 15px;border:1px solid #000;border-radius:2px;background:#161918;color:#e8e8e8;
  font-family:'DM Mono',monospace;font-size:.62rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase;
  box-shadow:0 0 0 1px #3a3d3b,0 3px 0 #000,inset 0 1px 0 rgba(255,255,255,.14);
  transition:transform .1s,box-shadow .12s,filter .12s;white-space:nowrap;}
.tq-planes .key:hover{color:#fff;box-shadow:0 0 0 1px #aab0aa,0 3px 0 #000,inset 0 1px 0 rgba(255,255,255,.2);}
.tq-planes .key:active{transform:translateY(2px);box-shadow:0 0 0 1px #3a3d3b,0 1px 0 #000,inset 0 1px 0 rgba(0,0,0,.6);}
.tq-planes .key-g{background:linear-gradient(180deg,#1D9E75 0%,#128163 55%,#0B5A45 100%);border-color:#000;color:#fff;
  box-shadow:0 0 0 1px #0F6E56,0 4px 0 #063D2F,0 9px 18px rgba(0,0,0,.5),inset 0 1px 0 rgba(255,255,255,.18);}
.tq-planes .key-g:hover{filter:brightness(1.07);box-shadow:0 0 0 1px #128163,0 5px 0 #063D2F,0 12px 22px rgba(0,0,0,.55),inset 0 1px 0 rgba(255,255,255,.22);}
.tq-planes .key-g:active{transform:translateY(3px);box-shadow:0 0 0 1px #0F6E56,0 1px 0 #063D2F,inset 0 2px 5px rgba(0,0,0,.45);}
.tq-planes .key-xl{height:54px;padding:0 34px;font-size:.82rem;letter-spacing:.16em;}
.tq-planes .key-lg{height:46px;padding:0 26px;font-size:.72rem;letter-spacing:.14em;}
.tq-planes .cta-row{display:flex;flex-wrap:wrap;align-items:center;gap:14px;}

/* ── CTA principal ────────────────────────────────────────────────────
   La tecla que lleva al registro. Etiqueta más larga (dice lo que pasa al
   pulsar), así que el interletrado baja para que siga entrando en una línea.
   La flecha avanza al pasar por encima y un brillo la recorre cada pocos
   segundos: es lo que la separa del resto de teclas de la página. */
.tq-planes .key-cta{letter-spacing:.09em;position:relative;overflow:hidden;}
.tq-planes .key-cta.key-xl{height:60px;padding:0 38px;font-size:.84rem;}
.tq-planes .key-cta.key-lg{height:50px;padding:0 30px;font-size:.74rem;}
.tq-planes .key-cta .kb-ar{flex-shrink:0;transition:transform .16s ease;}
.tq-planes .key-cta:hover .kb-ar{transform:translateX(4px);}
.tq-planes .key-cta::after{content:'';position:absolute;top:0;left:-65%;width:42%;height:100%;pointer-events:none;
  background:linear-gradient(100deg,rgba(255,255,255,0) 0%,rgba(255,255,255,.30) 50%,rgba(255,255,255,0) 100%);
  transform:skewX(-18deg);animation:key-brillo 5s ease-in-out infinite;}
@keyframes key-brillo{0%,74%{left:-65%}100%{left:135%}}
.tq-planes .key-cta:active{transform:translateY(3px);}
@media (prefers-reduced-motion:reduce){ .tq-planes .key-cta::after{display:none;} }

.tq-planes .plan .key-cta{padding:0 14px;letter-spacing:.06em;}

.tq-planes .plans{display:grid;grid-template-columns:repeat(3,1fr);gap:22px;margin-top:34px;margin-bottom:14px;align-items:stretch;
  max-width:930px;}
/* Cada plan lleva su fondo propio (haz de luz, pizarra, gráficas y radar). Van
   como imagen de la tarjeta, no como adorno suelto, y encima se pinta un velo
   oscuro de abajo arriba para que el texto se lea siempre: la parte baja de la
   tarjeta es donde caen las características y el botón. */
.tq-planes .plan{position:relative;display:flex;flex-direction:column;overflow:hidden;
  background:#0a0d0c top center/cover no-repeat;
  /* RELIEVE. El volumen sale de cuatro capas, no de una sombra:
     1) un halo verde permanente que la despega del fondo negro de la sección,
     2) un aro verde de 1px que dibuja el canto superior de la pieza,
     3) un CANTO SÓLIDO de 9px debajo (sombra con 0 de difuminado) = el grosor,
     4) la sombra proyectada al suelo, esa sí difuminada.
     Es el idioma del proyecto (el color va en el filo, nunca en el fondo)
     llevado al máximo. Sin degradados de color y sin cristal. */
  border:1px solid #06100d;border-radius:7px;
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.30),
    inset 0 -1px 0 rgba(0,0,0,.7),
    0 0 0 1px rgba(52,140,113,.75),
    0 9px 0 #081512,
    0 11px 2px rgba(0,0,0,.55),
    0 26px 50px rgba(0,0,0,.78),
    0 0 46px -14px rgba(29,158,117,.45);
  transition:transform .22s cubic-bezier(.2,.7,.3,1),box-shadow .22s ease;}
/* Filo de luz que recorre el borde superior: es lo que hace que se lea como
   una pieza con canto y no como un rectángulo pintado. */
.tq-planes .plan::after{content:'';position:absolute;top:0;left:12%;right:12%;height:1px;z-index:2;
  background:linear-gradient(90deg,transparent,rgba(255,255,255,.55),transparent);
  pointer-events:none;}
.tq-planes .plan::before{content:'';position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(180deg,rgba(5,7,6,0) 0%,rgba(5,7,6,.06) 46%,rgba(5,7,6,.34) 74%,rgba(5,7,6,.72) 100%);}
.tq-planes .plan-b{position:relative;z-index:1;}
.tq-planes .plan-e{background-image:url('/img/fondo_plan_entrenador.webp?v=1');}
.tq-planes .plan-a{background-image:url('/img/fondo_plan_analista.webp?v=1');}
.tq-planes .plan-l{background-image:url('/img/fondo_plan_elite.webp?v=1');}
@media(hover:hover){
  /* Al pasar por encima, el canto CRECE (de 7 a 11 px) y la tarjeta sube lo
     mismo: parece que se levanta de la mesa en vez de moverse sobre ella. */
  .tq-planes .plan:hover{transform:translateY(-5px);
    box-shadow:
      inset 0 1px 0 rgba(255,255,255,.42),
      inset 0 -1px 0 rgba(0,0,0,.7),
      0 0 0 1px rgba(29,158,117,1),
      0 14px 0 #081512,
      0 16px 3px rgba(0,0,0,.55),
      0 34px 62px rgba(0,0,0,.8),
      0 0 60px -12px rgba(29,158,117,.7);}
  .tq-planes .plan:hover .plan-ico{filter:brightness(1.2);}
}
.tq-planes .plan-b{padding:30px 18px 20px;min-height:430px;display:flex;flex-direction:column;flex:1;text-align:center;
  text-shadow:0 1px 6px rgba(0,0,0,.75);}

/* Icono y nombre en la MISMA fila: gana altura y la tarjeta arranca con más
   fuerza que con el icono suelto ocupando una línea entera. */
/* El icono, solo y centrado: es el protagonista. */
.tq-planes .plan-hd{display:block;}
/* 🔴 LA ILUSTRACION DEL PLAN, A TAMAÑO DE VERDAD. Iba a 64px, que para un
   dibujo de 475x525 es tirarlo: no se distinguia nada y pesaba igual. A 132px se
   lee, y es lo que da el aspecto de tarjeta cuidada.
   ⚠️ La imagen ES el contenido de esa franja, asi que no lleva marco ni fondo:
   el relieve lo pone la tarjeta. */
.tq-planes .plan-ico{width:auto;height:92px;max-width:100%;display:block;margin:0 auto 10px;object-fit:contain;
  transition:filter .2s ease;}
/* La chapa del numero de partidos. Es el dato que se compara entre planes, asi
   que se lee antes que el resto de la linea. */
.tq-planes .plan-b li .li-n{display:inline-flex;align-items:center;justify-content:center;
  min-width:21px;height:21px;padding:0 5px;margin-right:8px;border-radius:3px;
  background:rgba(29,158,117,.16);border:1px solid rgba(29,158,117,.42);
  color:#fff;font-family:'DM Mono',monospace;font-size:.74rem;font-weight:700;
  line-height:1;vertical-align:middle;}
.tq-planes .plan-nm{font-size:1.22rem;font-weight:800;letter-spacing:-.02em;line-height:1.1;}
.tq-planes .plan-for{font-size:.79rem;color:rgba(244,250,247,.82);line-height:1.5;margin-top:9px;
  min-height:35px;}

/* ── Casilla de Vídeo Propio en cada tarjeta ────────────────────────────────
   Acabado industrial de la página: esquina viva de 2px, filo negro y anillo
   fino, sin degradados. Texto en BLANCO como todo lo demás de esta landing (la
   jerarquía la da el tamaño y el peso, no el color).
   Va pegada al CTA a propósito: es la última decisión antes de pulsar. */
.tq-planes .plan-va{margin-top:auto;padding-top:16px;}
/* 🔴 LA CASILLA VA EN VERDE APAGADO, NO EN NEGRO COMO EL RESTO. Es lo único de
   la tarjeta que NO es el plan: es otro producto que se compra aparte, y en
   negro sobre negro se leía como una condición más de la lista. Con su propia
   placa se ve que es una pieza distinta antes de leer una palabra.
   El tono está entre el Deep (#085041) y el Dark (#0F6E56) del brand kit,
   bajado hasta que el blanco encima sigue teniendo contraste de sobra (~11:1).
   ⚠️ El COLOR está en el fondo, no en el texto: el texto sigue blanco. Verde
   sobre verde es justo lo que no se lee.
   ⚠️ El logo del add-on trae su propia placa NEGRA dentro de la imagen, así que
   sobre este verde se despega en vez de fundirse. Si algún día ese icono cambia
   a fondo transparente, hay que volver a mirarlo. */
.tq-planes .plan-va label{display:flex;align-items:flex-start;gap:10px;text-align:left;cursor:pointer;
  background:linear-gradient(180deg,#123a2f 0%,#0b241d 100%);border:1px solid #000;
  box-shadow:0 0 0 1px #2f7a63,inset 0 1px 0 rgba(93,202,165,.18);border-radius:2px;
  padding:11px 12px;transition:box-shadow .16s ease,filter .16s ease;}
.tq-planes .plan-va label:hover{filter:brightness(1.14);
  box-shadow:0 0 0 1px #5DCAA5,inset 0 1px 0 rgba(93,202,165,.28);}
.tq-planes .plan-va input{appearance:none;-webkit-appearance:none;flex-shrink:0;width:17px;height:17px;
  /* El anillo pasa de gris a verde apagado: sobre la placa verde, el gris
     neutro se veía sucio. Sigue siendo más claro que el fondo, que es lo que
     hace que la casilla se distinga de la placa. */
  margin:1px 0 0;background:#061410;border:1px solid #000;box-shadow:0 0 0 1px #3f8a72;
  border-radius:2px;cursor:pointer;position:relative;transition:background .16s ease;}
.tq-planes .plan-va input:checked{background:#1D9E75;box-shadow:0 0 0 1px #1D9E75;}
/* La marca de verificación se dibuja con dos bordes girados: sin SVG y sin emoji. */
.tq-planes .plan-va input:checked::after{content:'';position:absolute;left:5px;top:1px;width:4px;height:9px;
  border:solid #061410;border-width:0 2px 2px 0;transform:rotate(42deg);}
.tq-planes .plan-va input:focus-visible{outline:2px solid #F4FAF7;outline-offset:2px;}
.tq-planes .plan-va .va-t{font-size:.76rem;font-weight:700;letter-spacing:-.01em;line-height:1.3;
  /* Se ensancha con lo que sobre y parte por donde le toque. Sin `min-width:0`
     un hijo flex no baja de su palabra más larga y desborda la casilla. */
  flex:1 1 auto;min-width:0;}
.tq-planes .plan-va .va-p{display:block;margin-top:4px;
  font-family:'DM Mono',monospace;font-size:.66rem;letter-spacing:.06em;white-space:nowrap;}
.tq-planes .plan-va .va-d{font-size:.68rem;line-height:1.45;margin-top:4px;color:rgba(244,250,247,.82);}
/* Sin `flex-wrap`: el título es quien se parte, no la fila. Con envoltura, el
   logo se caía a una segunda línea en cuanto el título crecía. */
.tq-planes .plan-va .va-hd{display:flex;align-items:flex-start;gap:8px;}
/* El add-on es lo único que se vende DENTRO de la tarjeta, así que lleva su
   propia marca en pequeño: sin ella la casilla se lee como una condición del
   plan y no como un producto aparte, que es lo que es. */
/* ⚠️ MÁS GRANDE Y MÁS ARRIBA SIN QUE LA CASILLA CREZCA. La imagen mide 42px
   pero solo APORTA 28 a la altura de la fila, porque los márgenes negativos le
   restan 7 por arriba y 7 por abajo; con `align-self:flex-start` esos 7 de
   arriba la sacan por encima de la línea, que es lo que la sube. Subirla a
   42px a secas engordaba la casilla 12px en las tres tarjetas.
   ⚠️ Si se cambia el tamaño, los dos márgenes negativos son (nuevo-28)/2. */
.tq-planes .plan-va .va-logo{width:42px;height:42px;flex-shrink:0;object-fit:contain;display:block;
  align-self:flex-start;margin-top:-7px;margin-bottom:-7px;
  /* A la DERECHA de la fila: pegado al titulo competia con el, y el titulo es
     lo que hay que leer primero. Order alto + margen automatico lo empujan al
     final pase lo que pase con el orden del marcado. */
  order:9;margin-left:auto;}
/* `.cta-w` ya empuja con margin-top:auto. Con DOS márgenes automáticos en la
   misma columna flex, el hueco sobrante se reparte a medias entre los dos y la
   separación deja de ser predecible. Aquí manda la casilla y el CTA la sigue. */
.tq-planes .plan-va + .cta-w{margin-top:0;padding-top:10px;}

.tq-planes .plan-pr{display:flex;align-items:baseline;justify-content:center;gap:6px;margin-top:18px;}
.tq-planes .plan-pr b{font-family:'DM Sans',sans-serif;font-size:2.2rem;font-weight:800;color:var(--wh);
  line-height:1;letter-spacing:-.045em;}
.tq-planes .plan-pr span{font-family:'DM Mono',monospace;font-size:.65rem;color:rgba(244,250,247,.72);}
.tq-planes .plan-eq{font-family:'DM Mono',monospace;font-size:.58rem;letter-spacing:.05em;
  color:rgba(244,250,247,.45);margin-top:5px;min-height:14px;}

/* El BLOQUE va centrado, pero su texto alineado a la izquierda: una lista con
   cada línea centrada es ilegible, y una pegada al borde rompe la simetría del
   resto de la tarjeta. `width:max-content` + `margin auto` da las dos cosas. */
/* 🔴 LAS TRES LISTAS MIDEN LO MISMO, PASE LO QUE PASE CON LOS SALTOS DE LÍNEA.
   Las tarjetas se miran a la vez y se comparan fila por fila: si una lista es
   más alta, la casilla de Vídeo Propio y el botón de las otras dos quedan
   desalineados y parece un fallo de maquetación. Igualar el NÚMERO de viñetas
   (5 en las tres) no basta, porque una frase más larga parte en dos renglones
   en una tarjeta y en una sola en otra según el ancho de la pantalla.
   El suelo son 6 renglones, que es lo que ocupa la lista mas larga (la
   segunda viñeta parte en dos y el resto entra en uno).
   ⚠️ La cuenta es 6 renglones × 17.95px + 4 huecos × 9px. Si cambia
   `font-size`, `line-height` o el `gap` de abajo, rehacerla. */
.tq-planes .plan ul{list-style:none;display:flex;flex-direction:column;gap:9px;
  width:max-content;max-width:100%;margin:15px auto 0;text-align:left;
  min-height:148px;}
.tq-planes .plan li{display:flex;gap:9px;align-items:flex-start;font-size:.79rem;
  color:#F4FAF7;line-height:1.42;}
.tq-planes .plan li::before{content:'';width:11px;height:11px;flex-shrink:0;margin-top:3px;
  background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231D9E75' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.5 12.5 9.5 17.5 19.5 6.5'/%3E%3C/svg%3E") center/11px 11px no-repeat;}
.tq-planes .plan .key{width:100%;}
/* El filo que separa las características cruza TODA la tarjeta: si se dejara
   dentro del <ul> mediría solo lo que mide el texto y quedaría descolgado. */
.tq-planes .plan-sep{height:1px;background:rgba(255,255,255,.18);margin-top:16px;}
.tq-planes .plan .cta-w{margin-top:auto;padding-top:18px;}
.tq-planes .plan .key-cta{padding:0 12px;font-size:.63rem;}

/* El recomendado: filo verde y chapa. Nada más: antes llevaba tres anillos y
   cabecera tintada y competía con su propio contenido. */
/* El recomendado: el MISMO relieve, con el filo en verde vivo y el canto algo
   más verdoso. Se distingue por el borde, no por ser otra pieza. */
.tq-planes .plan.top{border-color:#06100d;
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.38),
    inset 0 -1px 0 rgba(0,0,0,.7),
    0 0 0 1px #1D9E75,
    0 9px 0 #0a2b21,
    0 11px 2px rgba(0,0,0,.55),
    0 26px 50px rgba(0,0,0,.78),
    0 0 56px -12px rgba(29,158,117,.6);}
.tq-planes .plan-r{position:absolute;top:-1px;right:14px;font-family:'DM Mono',monospace;
  font-size:.5rem;font-weight:700;letter-spacing:.13em;text-transform:uppercase;
  color:#04140f;background:#1D9E75;padding:4px 9px;border-radius:0 0 3px 3px;}

/* ── EL PLAN QUE YA TIENE ────────────────────────────────────────────────────
   Estas reglas NO existen en `temporada2627.html` y no hacen falta allí: la
   landing es pública, no sabe quién mira, y sin `planActual` el módulo no marca
   ninguna tarjeta. Son de más, no una divergencia entre las dos copias. */
.tq-planes .plan-r.tuyo{background:#c8ddd0;color:#0b1a14;}
/* Su tarjeta se apaga un punto: sigue ahí para comparar, pero deja de pedir
   que la pulses. La atención tiene que irse a las de arriba. */
.tq-planes .plan.es-actual{opacity:.82;}
.tq-planes .plan.es-actual:hover{opacity:1;}
/* Un botón apagado en una tarjeta de precio tiene que parecer apagado a la
   primera: sin brillo, sin canto y sin cursor de mano. */
.tq-planes .key-cta.key-off,
.tq-planes .key-cta[disabled]{cursor:not-allowed;opacity:.42;filter:grayscale(.55);
  transform:none!important;}
.tq-planes .key-cta.key-off::after,
.tq-planes .key-cta[disabled]::after{display:none;}
.tq-planes .key-cta[disabled]:hover .kb-ar{transform:none;}
.tq-planes .plan-nota{margin-top:8px;font-family:'Inter',sans-serif;font-size:.6rem;
  line-height:1.4;text-align:center;color:rgba(244,250,247,.42);}
.tq-planes .plan-nota[hidden]{display:none;}
/* Cuando el botón de su propia tarjeta ES la compra del add-on, la casilla del
   add-on de esa tarjeta sobra: diría dos veces lo mismo. */
.tq-planes .plan.solo-addon .plan-va{display:none;}
/* 🔴 LAS TRES A LA MISMA ALTURA. La recomendada iba subida 10px, asi que no
   empezaba ni acababa donde las otras dos y se leia como "otra tarjeta"
   en vez de como el mismo producto en otro tamaño. Destaca de sobra con su
   aro verde y su chapa de Recomendado. */
/* (El realce al pasar por encima ya lo da la regla .plan:hover de arriba.) */

/* ── Pestañas con los tres nombres ───────────────────────────────────────── */
/* 🔴 SOLO CUANDO HAY CARRUSEL. En escritorio las tres tarjetas se ven a la vez,
   así que unas pestañas para "elegir plan" encima no ayudan: son una fila más
   de mandos delante de lo único que hay que mirar, y encima sugieren que hay
   algo escondido cuando no lo hay. Existen para el teléfono, donde las tarjetas
   se pasan de lado y sin ellas no se sabe cuántos planes hay.
   Lo enciende `_pintarNav()` con el ancho REAL de la fila, no un `@media`: este
   componente se incrusta en un modal que puede ser estrecho en escritorio. */
.tq-planes .plan-nav{display:none;gap:8px;justify-content:center;flex-wrap:nowrap;margin-top:22px;}
.tq-planes .plan-nav.on{display:flex;}
.tq-planes .plan-nav-b{flex:1 1 0;min-width:0;cursor:pointer;
  font-family:'DM Mono',monospace;font-size:.6rem;font-weight:700;letter-spacing:.1em;
  text-transform:uppercase;color:rgba(244,250,247,.6);
  background:#0b0d0c;border:1px solid #000;box-shadow:0 0 0 1px #3a3d3b;border-radius:2px;
  padding:9px 6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  transition:color .18s ease,box-shadow .18s ease,background .18s ease;}
.tq-planes .plan-nav-b:hover{color:var(--wh,#F4FAF7);box-shadow:0 0 0 1px #5c615e;}
/* La activa se HUNDE, como el resto de teclas del proyecto: el filo de arriba
   se apaga y el de abajo se marca. Es lo que distingue pulsado de disponible
   sin recurrir a color, que aquí no jerarquiza. */
.tq-planes .plan-nav-b.on{color:#F4FAF7;background:#111614;
  box-shadow:0 0 0 1px #1D9E75,inset 0 2px 5px rgba(0,0,0,.75);}

/* ── La fila y su flecha ─────────────────────────────────────────────────── */
.tq-planes .plans-wrap{position:relative;}
/* 🔴 SOLO SE VE CUANDO QUEDA ALGO A LA DERECHA. Lo decide `_pintarNav()` con el
   ancho real del contenedor, no un `@media`: este componente se incrusta en un
   modal de escritorio donde también puede no caber. */
.tq-planes .plan-next{position:absolute;top:50%;right:-4px;z-index:5;
  width:42px;height:42px;display:none;align-items:center;justify-content:center;
  cursor:pointer;color:#F4FAF7;border-radius:50%;
  background:radial-gradient(circle at 38% 32%,#1b201e 0%,#0a0d0c 70%);
  border:1px solid #000;
  box-shadow:0 0 0 1px #1D9E75,0 6px 16px rgba(0,0,0,.8),0 0 26px -6px rgba(29,158,117,.75);
  transform:translateY(-50%);
  animation:tqp-late 2.4s ease-in-out infinite;}
.tq-planes .plan-next.on{display:flex;}
.tq-planes .plan-next svg{width:19px;height:19px;}
.tq-planes .plan-next:active{box-shadow:0 0 0 1px #1D9E75,inset 0 3px 7px rgba(0,0,0,.8);}
/* El latido lleva el desplazamiento DENTRO del `translateY(-50%)`: en dos
   propiedades distintas la segunda gana y la flecha se descoloca al centro. */
@keyframes tqp-late{
  0%,70%,100%{transform:translateY(-50%) translateX(0);
              box-shadow:0 0 0 1px #1D9E75,0 6px 16px rgba(0,0,0,.8),0 0 26px -6px rgba(29,158,117,.75);}
  85%        {transform:translateY(-50%) translateX(4px);
              box-shadow:0 0 0 1px #5DCAA5,0 6px 16px rgba(0,0,0,.8),0 0 34px -4px rgba(29,158,117,.95);}
}
@media(prefers-reduced-motion:reduce){ .tq-planes .plan-next{animation:none;} }
/* Señalar una tarjeta desde su pestaña cuando no hay carrusel que mover. */
.tq-planes .plan.foco{box-shadow:0 0 0 2px #1D9E75,0 26px 50px rgba(0,0,0,.78);}

@media(max-width:900px){
  /* 🔴 EN FILA, NO APILADAS. Una debajo de otra obliga a bajar tres pantallas
     para comparar tres precios, que es justo lo que nadie hace: se mira la
     primera y se cierra. En fila, con ajuste a la tarjeta, se pasan de lado y
     las tres se comparan en el mismo gesto.
     ⚠️ Los márgenes negativos sacan el carrusel a sangre para que la siguiente
     tarjeta ASOME por el borde. Sin ese trozo visible no se ve que hay más, y
     ni la flecha lo arregla. */
  .tq-planes .plans{display:flex;grid-template-columns:none;max-width:none;gap:12px;
    overflow-x:auto;overscroll-behavior-x:contain;
    scroll-snap-type:x mandatory;scroll-padding:0 16px;
    padding:4px 16px 12px;margin-left:-16px;margin-right:-16px;
    scrollbar-width:none;-ms-overflow-style:none;}
  .tq-planes .plans::-webkit-scrollbar{display:none;}
  .tq-planes .plan{flex:0 0 min(83vw,320px);scroll-snap-align:center;}

  /* 🔴 LA TARJETA TIENE QUE CABER EN LA PANTALLA SIN HACER SCROLL, o deja de
     compararse con las otras dos: se lee media y se pasa a la siguiente.
     De ahí que aquí se recorte todo lo que se puede recortar sin quitar
     información. El `min-height:500px` que había hacía justo lo contrario.
     🔴 LO QUE SE RECORTA ES LA MITAD DE ARRIBA, y es a propósito: la
     ilustración y los aires que la rodean no dan ni un dato, y son los que
     empujaban el precio y las viñetas fuera de la pantalla. La ilustración pasa
     de 104px (escritorio) a 56, que sigue leyéndose a tamaño de teléfono.
     ⚠️ De la mitad de abajo no se toca el TAMAÑO DE LETRA de las viñetas ni del
     precio: ahí es donde está lo que se compara, y ganar 20px ilegibles no es
     ganar nada. Lo que se aprieta abajo son solo las separaciones. */
  .tq-planes .plan-b{padding:13px 15px 14px;min-height:0;}
  .tq-planes .plan-ico{height:56px;margin-bottom:5px;}
  .tq-planes .plan-nm{font-size:1.04rem;line-height:1;}
  .tq-planes .plan-pr{margin-top:7px;}
  .tq-planes .plan-pr b{font-size:1.85rem;}
  .tq-planes .plan-eq{margin-top:3px;min-height:12px;}
  .tq-planes .plan-for{min-height:0;}
  .tq-planes .plan ul{margin-top:10px;gap:6px;min-height:0;}
  .tq-planes .plan li{font-size:.76rem;}
  .tq-planes .plan-sep{margin-top:10px;}
  .tq-planes .plan-va{padding-top:10px;}
  .tq-planes .plan-va label{padding:9px 10px;}
  .tq-planes .plan-va .va-d{line-height:1.4;}
  .tq-planes .plan .cta-w{padding-top:10px;}
  /* La chapa de "Recomendado" muerde el borde de arriba, y con el relleno
     recortado quedaba pegada al icono. */
  .tq-planes .plan.top .plan-b{padding-top:17px;}

  .tq-planes .plan-nav{margin-top:18px;gap:6px;}
  .tq-planes .plan-nav-b{font-size:.54rem;letter-spacing:.06em;padding:9px 4px;}
  .tq-planes .plan-next{right:2px;width:38px;height:38px;}
}


/* ══════════════════════════════════════════════════════════════════════════
   QUE EL MODAL QUEPA SIN SCROLL

   🔴 SE MIDE POR ALTURA DE VENTANA, NO POR ANCHO. El problema nunca fue el
   ancho: en un portátil de 1366×768 la ventana deja unos 630px útiles después
   de la barra del navegador, y el modal va con `max-height:94vh`, así que a
   partir de ahí aparece el scroll. Un `@media` por ancho no se entera de eso;
   la pantalla ancha y baja es justo el caso peor.

   🔴 Y APLICA A LOS TRES MODALES A LA VEZ. `hub.html`, `app.html` y
   `upgrade-modal.js` tienen cada uno su copia del marco, pero los tres cargan
   ESTE archivo y comparten `#modal-upgrade-overlay`, `.upg-body`, `.upg-sub`
   y `.upg-x`.
   Escrito aquí, se arregla una vez.
   ⚠️ Las tres copias llevan el relleno en estilo EN LÍNEA, así que hace falta
   `!important` para ganarles. No es pereza: cambiar eso a clases obligaría a
   tocar tres archivos y a mantenerlos iguales, que es el problema de siempre.

   ⚠️ Estas reglas NO tocan la landing: allí las tarjetas viven en su propia
   copia del CSS y la página scrollea de todas formas, que es lo natural.
   ══════════════════════════════════════════════════════════════════════════ */

/* Pantalla normal de portátil (~1440×900 y por debajo). Se aprieta todo lo que
   no es información: aires, rellenos y el tamaño de la ilustración. */
@media(max-height:900px){
  .tq-planes .plans{margin-top:18px;margin-bottom:8px;}
  .tq-planes .plan-b{padding:20px 16px 16px;}
  .tq-planes .plan-ico{height:76px;margin-bottom:8px;}
  .tq-planes .plan-nm{font-size:1.12rem;}
  .tq-planes .plan-pr{margin-top:12px;}
  .tq-planes .plan-pr b{font-size:1.95rem;}
  /* El hueco de la lista baja con el `gap`, no con el tamaño de letra: las
     viñetas son lo que se compara y no se tocan. 6 renglones × 17.95 + 4 × 7. */
  .tq-planes .plan ul{margin-top:11px;gap:7px;min-height:136px;}
  .tq-planes .plan-sep{margin-top:12px;}
  .tq-planes .plan-va{padding-top:12px;}
  .tq-planes .plan-va label{padding:9px 10px;}
  .tq-planes .plan .cta-w{padding-top:12px;}
  #modal-upgrade-overlay .upg-body{padding:14px 20px 12px!important;}
}

/* Portátil de 1366×768 y similares, que es donde de verdad no cabía.
   🔴 AQUÍ SE VA LA ILUSTRACIÓN, y es la decisión correcta: es lo ÚNICO de la
   tarjeta que no aporta un dato. Antes que recortar una viñeta, un precio o la
   casilla del add-on, se quita el dibujo. */
@media(max-height:760px){
  .tq-planes .plan-hd{display:none;}
  .tq-planes .plan-b{padding:16px 14px 14px;}
  .tq-planes .plan-pr{margin-top:4px;}
  .tq-planes .plan-pr b{font-size:1.8rem;}
  .tq-planes .plans{margin-top:12px;}
  #modal-upgrade-overlay .upg-body{padding:12px 18px 10px!important;}
}

/* Último escalón: el portátil de 1366×768, que deja unos 630px de ventana. Aquí
   se retira lo que se puede DEDUCIR o mirar en otro sitio, nunca lo que se
   compara: fuera la coletilla de "sin permanencia" (está en el pie de la
   landing y en los términos) y fuera el equivalente mensual del plan anual, que
   es una división del precio que ya está a la vista.
   ⚠️ Lo que NO se toca en ningún escalón: las viñetas, el precio, la casilla de
   Vídeo Propio con su explicación y el botón. Eso es la decisión de compra. */
@media(max-height:660px){
  #modal-upgrade-overlay .upg-sub{display:none!important;}
  .tq-planes .plan-eq{display:none;}
  .tq-planes .plans{margin-top:8px;margin-bottom:4px;}
}

/* ── La X de cerrar del modal ─────────────────────────────────────────────
   🔴 SUSTITUYE AL "AHORA NO" DE ABAJO. Aquel botón ocupaba unos 50px al final
   del modal, o sea justo donde empieza el scroll, y encima obligaba a bajar
   hasta el final para poder cerrar. La X está donde todo el mundo la busca y
   no ocupa alto: el modal entra ahora en pantallas donde antes no cabía.
   ⚠️ NO se puede quitar sin poner otra salida. La caja para el clic fuera y el
   overlay solo cierra si pinchas justo el fondo, así que sin la X habría
   pantallas sin forma evidente de salir, que es la norma del proyecto.
   ⚠️ Vive aquí y no en las tres copias del modal porque las tres cargan este
   archivo y comparten `#modal-upgrade-overlay`. */
#modal-upgrade-overlay .upg-x{position:absolute;top:11px;right:11px;z-index:3;
  width:30px;height:30px;display:flex;align-items:center;justify-content:center;
  cursor:pointer;color:rgba(244,250,247,.55);border-radius:2px;
  background:#0b0d0c;border:1px solid #000;box-shadow:0 0 0 1px #3a3d3b;
  transition:color .15s ease,box-shadow .15s ease;}
#modal-upgrade-overlay .upg-x:hover{color:#F4FAF7;box-shadow:0 0 0 1px #aab0aa;}
#modal-upgrade-overlay .upg-x:active{box-shadow:0 0 0 1px #3a3d3b,inset 0 2px 5px rgba(0,0,0,.6);}
/* El título va centrado y la X flota encima: se le deja aire a la derecha para
   que en pantallas estrechas no se solapen. */
#modal-upgrade-overlay .upg-body{padding-right:48px!important;}
