/* ─────────────────────────────────────────────────────────────────────
 * EL CATÁLOGO
 *
 * El mismo mundo visual de la ficha del club —negro, Fraunces, los mismos
 * tokens— aplicado a las pantallas que listan productos: la categoría, la
 * familia y la búsqueda. Antes vivían en la vitrina clara de cada tienda, y
 * el que venía desde la página del club cruzaba de un mundo al otro en un
 * clic.
 *
 * LA FICHA DEL PRODUCTO ES LA MISMA DE SIEMPRE. `partials/ficha.ejs` no se
 * duplicó: acá se le pone otra piel. Esa ficha carga cosas que el diseño de
 * referencia no tenía —el badge de «últimas», las specs que deciden la
 * compra, las cuotas, el aviso de stock bajo, el botón de comparar— y una
 * copia nueva las habría perdido de entrada, o peor: las habría perdido más
 * adelante, cuando alguien arregle una de las dos y no sepa de la otra.
 * ───────────────────────────────────────────────────────────────────── */

.ct {
  --bg: #0B0C0E;
  --surface: #141619;
  --accent: #1F4D3A;
  --text: #F2EFE9;
  --muted: #B7BCB7;
  --line: #3D423F;
  --serif: 'Fraunces', Georgia, serif;
  --sans: 'Instrument Sans', system-ui, sans-serif;
  --gutter: clamp(24px, 5vw, 80px);
  --curva: cubic-bezier(.16, 1, .3, 1);

  /* LOS TOKENS DEL MUNDO CLARO, EN OSCURO.
     Adentro del catálogo viven componentes compartidos con la vitrina —la
     ficha del producto, el carro, el checkout— y hasta los estilos escritos
     a mano en el marcado cuelgan de estos nombres: el nombre del producto en
     el carro lleva `style="color: var(--text-primary)"`, que ninguna regla
     nuestra puede ganarle porque va en el atributo. Redefiniéndolos acá, todo
     lo prestado se adapta solo en vez de irse persiguiendo uno por uno.
     `--accent` no está en la lista porque arriba ya se definió: el azul del
     sistema claro pasa a ser el verde de este mundo, que es lo que se quiere. */
  --text-primary: #F2EFE9;
  --text-secondary: #B7BCB7;
  --text-tertiary: #8A908C;
  --surface-raised: #16181B;
  --surface-sunken: #1C1F24;
  --surface-page: #0B0C0E;
  --border: #3D423F;
  --border-strong: #545A55;
  --accent-hover: #2C6B51;
  --accent-soft: #16241E;
  --accent-contrast: #F2EFE9;
  --success: #5FBF8B; --success-soft: #12281F;
  --warning: #E0912F; --warning-soft: #2A1E0C;
  --danger:  #F0564A; --danger-soft:  #2C1210;

  margin: 0;
  background: var(--bg);
  color: var(--text);
  font: 1.0625rem/1.6 var(--sans);
  padding-inline: var(--gutter);
  padding-bottom: 96px;
}
/* `pagina-catalogo` y no `catalogo`: `.catalogo` YA ERA una clase de este
   sistema —la grilla de barra lateral más productos de la vitrina clara— y
   ponerla en el <body> convirtió la página entera en dos columnas, con la
   cabecera apretada en la primera. Es el mismo choque de nombres que ya costó
   `[hidden]`, `.pcard`/`.fila` y `main.club`. */
body.pagina-catalogo { background: #0B0C0E; }
.ct a { color: inherit; text-decoration: none; }
.ct img { display: block; width: 100%; object-fit: cover; }
.ct h1, .ct h2, .ct h3, .ct p { margin: 0; }
.ct h1, .ct h2 { font-family: var(--serif); line-height: .98; letter-spacing: -.03em;
                 font-weight: 600; }
.ct h1 { font-size: clamp(4rem, 8vw, 8rem); }
.ct h3 { font-weight: 500; }
.ct em { font-weight: inherit; }
.ct ::selection { background: var(--accent); color: var(--text); }
.ct a:focus-visible, .ct button:focus-visible,
.ct input:focus-visible, .ct select:focus-visible, .ct summary:focus-visible {
  outline: 3px solid var(--text); outline-offset: 4px;
}
.ct button, .ct input, .ct select, .ct summary { font-family: var(--sans); color: inherit; }
.ct button, .ct select, .ct summary { cursor: pointer; }
.ct-tenue { color: var(--muted); }

/* ── La entrada ─────────────────────────────────────────────────────── */
/* Las pantallas del pago son columnas de lectura, no parrillas: un formulario
   de checkout a 1400 píxeles de ancho es un formulario que nadie termina. */
.ct--angosto { max-width: 700px; margin-inline: auto; }
.ct--medio { max-width: 860px; margin-inline: auto; }

.ct-migas { font-size: .875rem; color: var(--muted); padding-top: 32px;
            display: flex; gap: 16px; flex-wrap: wrap; }
.ct-migas a { border-bottom: 1px solid var(--line); }
.ct-migas a:hover { border-bottom-color: var(--text); }
.ct-intro { display: flex; justify-content: space-between; align-items: end;
            gap: 48px; padding-block: 32px 48px; }
.ct-intro p { max-width: 350px; color: var(--muted); font-size: .9375rem; margin-top: 12px; }
.ct-rot { font-size: .875rem; text-transform: uppercase; letter-spacing: .12em; }

/* ── Buscar ─────────────────────────────────────────────────────────── */
.ct-buscar { display: flex; gap: 16px; align-items: center;
             border-bottom: 1px solid var(--text); padding: 16px 0; margin-bottom: 40px; }
.ct-buscar label { font-size: .875rem; white-space: nowrap; }
.ct-buscar input { width: 100%; background: none; border: 0; padding: 8px;
                   font: 1.125rem var(--sans); }
.ct-buscar input::placeholder { color: var(--muted); }
.ct-buscar button { background: none; border: 0; padding: 0; font-size: .875rem;
                    text-decoration: underline; text-underline-offset: 5px;
                    color: var(--muted); white-space: nowrap; }

/* ── Los filtros, arriba y a todo el ancho ──────────────────────────
   El diseño los traía en una barra lateral y terminaba corrigiéndose a sí
   mismo con una regla al final del archivo: «que todos los filtros queden
   visibles sobre los resultados». Acá van así de entrada. La barra lateral
   sólo se ve entera en pantallas grandes, y en el teléfono —que es de donde
   viene casi todo— quedaba escondida detrás de un botón. */
/* EL FILTRO, CERRADO AL ENTRAR. Un `<details>`: abre y cierra sin una línea
   de JavaScript, se lleva bien con el teclado y funciona con la página a
   medio cargar. La barra dice «Filtro» y nada más —ni «Filtrar y ordenar» ni
   un ícono de embudo—: es la palabra que la gente busca. */
.ct-filtro { border: 1px solid var(--line); background: var(--surface);
             margin-bottom: 32px; }
.ct-filtro > summary { display: flex; align-items: center; justify-content: space-between;
                       gap: 16px; padding: 18px 24px; font-size: 1rem; font-weight: 500;
                       list-style: none; }
.ct-filtro > summary::-webkit-details-marker { display: none; }
.ct-filtro > summary:hover { background: var(--bg); }
/* De qué categoría es lo que hay adentro. Sin esto, «Filtro» a secas no dice
   que lo que abre son la forma y el balance de LAS PALAS y no del catálogo
   entero. */
.ct-filtro__n { margin-right: auto; font-weight: 400; font-size: .875rem;
                color: var(--muted); }
/* El signo lo dibuja el CSS y no el HTML: así no hay forma de que el marcado
   diga «+» con el panel abierto. */
.ct-filtro__s { position: relative; width: 14px; height: 14px; flex: none; }
.ct-filtro__s::before, .ct-filtro__s::after {
  content: ''; position: absolute; inset: 50% 0 auto; height: 1.5px;
  background: var(--text); transition: transform .25s var(--curva); }
.ct-filtro__s::after { transform: rotate(90deg); }
.ct-filtro[open] > summary { border-bottom: 1px solid var(--line); }
.ct-filtro[open] .ct-filtro__s::after { transform: rotate(0deg); }
.ct-filtro__c { padding: 24px; }

.ct-panel { background: var(--surface); border: 1px solid var(--line);
            padding: 24px; margin-bottom: 32px; }
.ct-panel__t { font: 500 .875rem var(--sans); margin: 0 0 16px; }
.ct-cats { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 24px; }
.ct-cat { display: flex; align-items: center; gap: 12px; background: var(--bg);
          border: 1px solid var(--line); padding: 12px 16px; font-size: .875rem;
          transition: border-color .25s; }
.ct-cat small { font-size: .75rem; color: var(--muted); }
.ct-cat:hover { border-color: var(--text); }
.ct-cat.on { background: var(--accent); border-color: var(--text); }
.ct-cat.on small { color: var(--text); }

/* Cada faceta: el título y sus valores como fichas con su número al lado.
   El diseño traía un `<select>` por faceta, y un select esconde el dato que
   hace que el filtro sirva —cuántos productos quedan si lo aprietas—: con
   105 palas, «Forma: diamante (12)» ahorra el clic que «Forma ▾» cobra. */
.ct-facetas { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
              gap: 24px; }
.ct-cats + .ct-facetas { border-top: 1px solid var(--line); padding-top: 24px; }
.ct-fac__t { font-size: .8125rem; color: var(--muted); margin-bottom: 12px;
             letter-spacing: .06em; text-transform: uppercase; }
.ct-ops { display: flex; flex-wrap: wrap; gap: 6px; }
.ct-op { display: inline-flex; align-items: baseline; gap: 8px; font-size: .8125rem;
         background: var(--bg); border: 1px solid var(--line); padding: 8px 12px;
         transition: border-color .25s; }
.ct-op:hover { border-color: var(--text); }
.ct-op.on { background: var(--accent); border-color: var(--text); }
.ct-op b { font-weight: 400; }
.ct-op i { font-style: normal; font-size: .6875rem; color: var(--muted);
           font-variant-numeric: tabular-nums; }
.ct-op.on i { color: var(--text); }
/* La que no tiene nada se deja a la vista y apagada: sacarla haría que las
   opciones bailaran de lugar en cada clic. */
.ct-op.cero { opacity: .35; pointer-events: none; }
.ct-fac__ayuda { font-size: .75rem; color: var(--muted); margin-top: 10px; }

/* ── Los chips de lo ya filtrado ─────────────────────────────────────── */
.ct-puestos { display: flex; flex-wrap: wrap; gap: 8px; align-items: center;
              margin-bottom: 24px; }
.ct-chip { display: inline-flex; align-items: center; gap: 10px; font-size: .8125rem;
           background: var(--accent); border: 1px solid var(--text); padding: 8px 12px; }
.ct-chip span { opacity: .7; }
.ct-limpiar { font-size: .8125rem; color: var(--muted); text-decoration: underline;
              text-underline-offset: 5px; }

/* ── La barra de resultados ──────────────────────────────────────────── */
.ct-barra { display: flex; align-items: center; justify-content: space-between;
            gap: 24px; margin-bottom: 24px; }
.ct-barra p { font-size: .875rem; color: var(--muted); }
.ct-orden { display: flex; align-items: center; gap: 16px; }
.ct-orden label { font-size: .8125rem; color: var(--muted); }
.ct-orden select { background: none; border: 0; border-bottom: 1px solid var(--line);
                   padding: 8px 16px 8px 0; font-size: .875rem; color-scheme: dark; }

/* ── La grilla ──────────────────────────────────────────────────────── */
.ct-rejilla { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
              gap: 48px 24px; }
@media (min-width: 1550px) { .ct-rejilla { grid-template-columns: repeat(4, minmax(0, 1fr)); } }

/* ── La ficha del producto, con la piel de acá ───────────────────────
   Es `partials/ficha.ejs`, el mismo de la vitrina clara. Se le cambia el
   fondo, la tipografía del precio y la caja de la foto; lo que dice queda
   igual, porque lo que dice es lo que hace que alguien compre. */
.ct .ficha { display: flex; flex-direction: column; min-width: 0; gap: 0;
             background: none; border: 0; padding: 0; }
.ct .ficha__media { aspect-ratio: 4 / 5; background: #fff; overflow: hidden;
                    position: relative; display: block; border-radius: 0; }
.ct .ficha__media img { height: 100%; object-fit: contain; padding: 16px;
                        transition: transform .4s var(--curva); }
.ct .ficha:hover .ficha__media img { transform: scale(1.05); }
.ct .ficha__marca { font-size: .75rem; letter-spacing: .1em; text-transform: uppercase;
                    color: var(--muted); margin-top: 20px; }
.ct .ficha__nombre { font: 400 1rem/1.45 var(--sans); margin: 8px 0 12px;
                     overflow-wrap: anywhere; color: var(--text) !important; }
.ct .ficha__specs { font-size: .8125rem; color: var(--muted); margin-bottom: 12px; }
.ct .ficha__pie { display: flex; align-items: baseline; flex-wrap: wrap; gap: 10px;
                  margin-top: auto; }
.ct .ficha .precio { font: 500 1.75rem var(--serif); font-variant-numeric: tabular-nums;
                     color: var(--text); }
.ct .ficha .precio-antes { font: 400 .875rem var(--sans); color: var(--muted);
                           text-decoration: line-through; }
.ct .ficha .cuota { font-size: .8125rem; color: var(--muted); width: 100%; }
/* El badge sobre la foto blanca: en el mundo claro es un pill de color, acá
   una placa negra, que es lo único que se lee sobre una foto de producto. */
.ct .ficha__badge { position: absolute; top: 12px; left: 12px; background: var(--bg);
                    color: var(--text); border: 0; border-radius: 0;
                    padding: 6px 10px; font-size: .75rem; letter-spacing: .04em; }
.ct .ficha .badge--ok { background: var(--accent); color: var(--text);
                        border-radius: 0; padding: 4px 8px; font-size: .75rem; }
.ct .ficha [data-comparar] { align-self: flex-start; margin-top: 12px; padding: 0;
                             background: none; border: 0; color: var(--muted);
                             font-size: .8125rem; text-decoration: underline;
                             text-underline-offset: 5px; }
.ct .ficha [data-comparar]:hover { color: var(--text); }

/* ── Paginación ─────────────────────────────────────────────────────── */
.ct-pag { display: flex; justify-content: space-between; align-items: center;
          gap: 16px; border-top: 1px solid var(--line); padding-top: 24px;
          margin-top: 48px; font-size: .875rem; }
.ct-pag nav { display: flex; gap: 8px; align-items: center; }
.ct-pag a, .ct-pag span.on, .ct-pag span.off {
  background: var(--surface); border: 1px solid var(--line); padding: 10px 14px;
  font-variant-numeric: tabular-nums; }
.ct-pag a:hover { background: var(--accent); }
.ct-pag span.on { background: var(--accent); border-color: var(--text); }
.ct-pag span.off { opacity: .4; }

/* ── El vacío ───────────────────────────────────────────────────────── */
.ct-vacio { text-align: center; padding: 64px 24px; border-block: 1px solid var(--line); }
.ct-vacio h2 { font-family: var(--serif); font-size: 2.5rem; margin-bottom: 16px;
               letter-spacing: -.03em; }
.ct-vacio p { color: var(--muted); margin-bottom: 24px; }
/* `.ct a.ct-cta` y no `.ct-cta`: `.ct a { color: inherit }` vale una clase más
   un elemento y le gana a la clase sola, así que el botón —texto oscuro sobre
   relleno claro— salía hueso sobre hueso: un recuadro vacío en la única
   acción que la página tiene que conseguir. Ya había pasado igual con el
   botón de la ficha del club.
   El <button> va en la misma regla: el «Agregar al carro» de la ficha es un
   botón, no un enlace, y dejarlo fuera lo dejó igual de invisible. */
.ct a.ct-cta, .ct button.ct-cta {
  display: inline-flex; align-items: center; justify-content: space-between;
  gap: 32px; padding: 18px 24px; background: var(--text); color: var(--bg);
  font-size: .9375rem; font-weight: 600; border: 0;
  transition: gap .35s var(--curva), transform .35s var(--curva); }
.ct a.ct-cta:hover, .ct button.ct-cta:hover { gap: 48px; transform: translateY(-3px);
                                              color: var(--bg); }

/* ── Las entradas de una familia ─────────────────────────────────────
   No son productos: son las puertas a cada categoría. Placas grandes con la
   foto de la categoría y cuántos productos hay adentro. */
.ct-puertas { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 48px 24px; }
.ct-puerta { display: flex; flex-direction: column; }
.ct-puerta__f { aspect-ratio: 16 / 10; overflow: hidden; background: var(--surface); }
.ct-puerta__f img { height: 100%; transition: transform .4s var(--curva); }
.ct-puerta:hover img { transform: scale(1.04); }
.ct-puerta__r { font-size: .75rem; letter-spacing: .1em; text-transform: uppercase;
                color: var(--muted); margin-top: 20px; }
.ct-puerta h2 { font-size: clamp(1.5rem, 2.4vw, 2.25rem); margin: 8px 0 8px; line-height: 1.05; }
.ct-puerta p { font-size: .9375rem; color: var(--muted); }
.ct-puerta__n { font-size: .875rem; margin-top: 16px;
                display: inline-flex; align-items: center; gap: 16px;
                border-bottom: 1px solid; padding-block: 8px; align-self: flex-start;
                transition: gap .35s var(--curva); }
.ct-puerta:hover .ct-puerta__n { gap: 28px; }

/* ── La portada de la tienda ────────────────────────────────────────
   El titular a la izquierda y la foto a la derecha, del alto del texto. */
.ct-hero { display: grid; grid-template-columns: 1.15fr 1fr; gap: 6vw;
           align-items: center; padding-block: 48px 64px; }
.ct-hero h1 { font-size: clamp(3rem, 5.6vw, 5.5rem); margin-top: 20px; }
.ct-hero p { color: var(--muted); max-width: 46ch; margin-top: 24px; }
.ct-hero__acc { display: flex; gap: 32px; align-items: center;
                flex-wrap: wrap; margin-top: 40px; }
.ct-hero__f { aspect-ratio: 4 / 3; overflow: hidden; background: var(--surface); }
.ct-hero__f img { height: 100%; }

/* Cada tira de la portada: un título de dos líneas y su enlace al lado. */
.ct-tira { margin-top: 96px; }
.ct-tira__cab { display: flex; align-items: end; justify-content: space-between;
                gap: 32px; margin-bottom: 40px; }
.ct-tira__cab h2 { font-family: var(--serif); font-size: clamp(2rem, 4vw, 3.5rem);
                   line-height: 1; letter-spacing: -.03em; font-weight: 600; }

.ct-profes { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 24px; }
.ct-profe { display: flex; gap: 16px; align-items: center; min-width: 0; }
.ct-profe__f { width: 64px; height: 64px; flex: none; overflow: hidden;
               background: var(--accent); border-radius: 999px; }
.ct-profe__f img { height: 100%; }
.ct-profe__c { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.ct-profe__c b { font-weight: 500; }
.ct-profe__c span { font-size: .8125rem; color: var(--muted); }
.ct-profe__c i { font-style: normal; font-size: .875rem;
                 font-variant-numeric: tabular-nums; }

/* La marquesina de marcas viene del mundo claro: acá sólo se le cambian los
   colores, porque lo que hace —correr sola— ya está resuelto. */
.ct .marquesina { border-block: 1px solid var(--line); margin-block: 8px 64px; }
.ct .marquesina__marca { color: var(--muted); }
.ct .marquesina__marca:hover { color: var(--text); }
.ct .marquesina__sep { background: var(--line); }

/* ── LA FICHA DEL PRODUCTO ───────────────────────────────────────────
   La foto pegada a la izquierda y la decisión de compra a la derecha. Los
   nombres que mira `tienda.js` —`label.talla`, `[data-foto]`, `[data-panel]`,
   `#precio-actual`— siguen siendo los mismos: acá sólo se les cambia la piel.
   Renombrarlos dejaría la galería y las variantes muertas sin avisar. */
.pdp { display: grid; grid-template-columns: 1.1fr 1fr; gap: 64px;
       align-items: start; padding-top: 32px; }
.pdp-fotos { position: sticky; top: 24px; }
.pdp-foto { aspect-ratio: 4 / 5; background: #fff; overflow: hidden; }
.pdp-foto img { height: 100%; object-fit: contain; padding: 24px; }
.pdp-tiras { display: flex; gap: 12px; overflow-x: auto; margin-top: 16px; padding: 4px; }
.pdp-tira { flex: 0 0 80px; aspect-ratio: 1; padding: 0; background: #fff;
            border: 1px solid transparent; }
.pdp-tira img { height: 100%; object-fit: contain; padding: 6px; }
.pdp-tira.on { outline: 2px solid var(--text); outline-offset: 3px; }

.pdp-compra { display: flex; flex-direction: column; gap: 32px; }
.pdp-cab { display: flex; flex-direction: column; gap: 10px; }
.pdp-eti { display: flex; gap: 16px; align-items: center; flex-wrap: wrap; }
.pdp-cab h1 { font-family: var(--serif); font-size: clamp(2rem, 3.4vw, 3.25rem);
              line-height: 1.02; letter-spacing: -.03em; font-weight: 600; }
.pdp-badge { padding: 5px 10px; background: var(--accent); font-size: .8125rem;
             letter-spacing: .04em; }
.pdp-precio { display: flex; align-items: baseline; gap: 16px; flex-wrap: wrap;
              margin-top: 8px; }
.pdp-precio .precio { font: 500 clamp(2rem, 3vw, 2.75rem) var(--serif);
                      font-variant-numeric: tabular-nums; }
.pdp-precio del { font-size: 1.125rem; color: var(--muted); }
.pdp-dcto { background: var(--accent); padding: 4px 10px; font-size: .8125rem; }
.pdp-iva, .ct .cuota { font-size: .8125rem; color: var(--muted); }

/* Los cuatro datos que deciden la compra. Vienen del partial compartido con
   la cotización: acá se les cambia el color y nada más. */
/* En el mundo claro es una rejilla de celdas separadas por una línea que se
   pinta con el fondo del contenedor. Acá el fondo no se hereda: hay que
   apagarlo o queda un bloque gris claro en medio de la página negra. */
.ct .destacados { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
                  gap: 24px; background: none; border: 0; border-radius: 0;
                  border-block: 1px solid var(--line); padding-block: 24px; }
.ct .destacados__celda { background: none; padding: 0; }
.ct .destacados__etq { font-size: .8125rem; color: var(--muted); margin-bottom: 8px;
                       letter-spacing: .06em; text-transform: uppercase; }
.ct .destacados__valor { font: 500 1.25rem/1.3 var(--serif); overflow-wrap: anywhere;
                         color: var(--text); }

.pdp-var__cab { display: flex; justify-content: space-between; align-items: baseline;
                gap: 16px; margin-bottom: 16px; font-size: .9375rem; }
.pdp-var__ops { display: flex; gap: 8px; flex-wrap: wrap; }
.ct label.talla { border: 1px solid var(--line); background: none; padding: 12px 16px;
                  font-size: .875rem; cursor: pointer; min-width: 56px; text-align: center;
                  border-radius: 0; color: var(--text); }
.ct label.talla:hover { border-color: var(--text); }
.ct label.talla:has(input:checked) { background: var(--accent); border-color: var(--text); }
.ct label.talla.agotada { text-decoration: line-through; opacity: .45; cursor: default; }
.pdp-stock { display: flex; align-items: center; gap: 8px; font-size: .875rem;
             color: var(--muted); margin-top: 16px; }
.ct .punto { width: 7px; height: 7px; border-radius: 999px; flex: none;
             background: #5FBF8B; display: inline-block; }
.ct .punto--aviso { background: #E0912F; }
.ct .punto--malo { background: #F0564A; }

.pdp-acc { display: grid; grid-template-columns: 1fr auto; gap: 16px; align-items: center; }
.pdp-acc button.ct-cta { justify-content: center; gap: 12px; cursor: pointer; }
.ct button.ct-cta[disabled] { opacity: .45; cursor: default; }
.ct button.ct-cta[disabled]:hover { transform: none; gap: 32px; }
.pdp-comparar { background: none; border: 1px solid var(--line); color: var(--text);
                padding: 18px 24px; font-size: .9375rem; }
.pdp-comparar:hover { border-color: var(--text); }

.pdp-caja { background: var(--surface); border: 1px solid var(--line); padding: 24px;
            display: flex; flex-direction: column; gap: 10px; }
.pdp-caja span { font-size: .875rem; color: var(--muted); }
.pdp-caja b { font-weight: 500; }
.pdp-aviso { display: flex; gap: 12px; margin-top: 6px; }
.pdp-aviso input { flex: 1; min-width: 0; background: var(--bg); border: 1px solid var(--line);
                   color: var(--text); padding: 14px; font-size: .9375rem; }
.pdp-serv { display: flex; justify-content: space-between; gap: 24px; align-items: start; }
.pdp-serv > div { display: flex; flex-direction: column; gap: 6px; }
.pdp-serv .precio { font: 500 1.25rem var(--serif); white-space: nowrap; }
.pdp-check { display: flex; align-items: center; gap: 10px; cursor: pointer;
             margin-top: 6px; }
.pdp-check input { width: 18px; height: 18px; accent-color: var(--accent); }

.pdp-entrega { border: 1px solid var(--line); }
.pdp-entrega__f { display: flex; justify-content: space-between; gap: 16px;
                  align-items: start; padding: 18px 20px;
                  border-bottom: 1px solid var(--line); }
.pdp-entrega__f:last-child { border-bottom: 0; }
.pdp-entrega__f > div { display: flex; flex-direction: column; gap: 4px; }
.pdp-entrega__f b { font-weight: 500; }
.pdp-entrega__f span { font-size: .875rem; color: var(--muted); }

/* ── La ficha larga ─────────────────────────────────────────────────── */
.pdp-info { display: grid; grid-template-columns: minmax(0, 1fr) 300px; gap: 64px;
            margin-top: 96px; }
.pdp-info:not(:has(.pdp-lado > *)) { grid-template-columns: 1fr; }
.pdp-pest { display: flex; gap: 32px; border-bottom: 1px solid var(--line); overflow: auto; }
.pdp-pest button { border: 0; border-bottom: 2px solid transparent; background: none;
                   padding: 16px 0; white-space: nowrap; font-size: 1rem; color: var(--muted); }
.pdp-pest button[aria-selected="true"] { border-bottom-color: var(--text); color: var(--text); }
.pdp-panel { padding-top: 32px; }
.pdp-texto { max-width: 70ch; line-height: 1.65; }
.pdp-nosirve { margin-top: 16px; padding: 14px 18px; border-left: 2px solid #E0912F;
               background: var(--surface); font-size: .9375rem; }
.pdp-juega { margin-top: 32px; max-width: 460px; display: flex; flex-direction: column; gap: 12px; }
.pdp-juega__cab { display: flex; justify-content: space-between; align-items: baseline;
                  gap: 16px; margin-bottom: 4px; }
.pdp-juega__cab span:last-child { font-size: .75rem; color: var(--muted); }
.pdp-barra { display: flex; align-items: center; gap: 16px; font-size: .875rem; }
.pdp-barra > span:first-child { width: 120px; flex: none; }
.pdp-barra__p { flex: 1; height: 6px; background: var(--line); }
.pdp-barra__p i { display: block; height: 100%; background: var(--text); }
.pdp-barra b { width: 44px; text-align: right; font-weight: 400;
               font-variant-numeric: tabular-nums; color: var(--muted); }
.pdp-acordeon details { padding: 20px 0; border-bottom: 1px solid var(--line); }
.pdp-acordeon summary { font-size: 1rem; font-weight: 500; }
.pdp-acordeon details > div { padding-top: 16px; color: var(--muted); }
/* La ficha técnica viene del partial del mundo claro. */
.ct .rejilla--2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0 32px; }
.ct .t-label { font-size: .75rem; letter-spacing: .1em; text-transform: uppercase;
               color: var(--muted); }
.ct .t-sm, .ct .t-xs, .ct .ter { font-size: .875rem; color: var(--muted); }
.ct .fila.entre { display: flex; justify-content: space-between; align-items: baseline;
                  gap: 20px; padding: 14px 0; border-bottom: 1px solid var(--line); }

.pdp-lado { align-self: start; display: flex; flex-direction: column; gap: 32px; }
.pdp-lado > div { display: flex; flex-direction: column; gap: 12px; }
.pdp-mini { display: flex; gap: 14px; align-items: center; }
.pdp-mini__f { width: 64px; height: 64px; flex: none; background: #fff; overflow: hidden; }
.pdp-mini__f img { height: 100%; object-fit: contain; padding: 6px; }
.pdp-mini__c { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.pdp-mini__c b { font-weight: 500; font-size: .9375rem; }
.pdp-mini__c .precio { font: 500 1.125rem var(--serif); }
.pdp-rec { font: 500 1.25rem/1.3 var(--serif); }

/* La barra de compra del teléfono. */
.pdp-fija { display: none; }
@media (max-width: 900px) {
  /* Encima de la barra del pulgar, no sobre ella: `--tabbar-alto` es la
     altura que la tienda ya usa para no tapar el último contenido. Con
     `bottom: 0` las dos barras quedaban una sobre la otra y el botón de
     comprar tapaba «Carro». */
  .pdp-fija { position: fixed; left: 0; right: 0; bottom: var(--tabbar-alto, 64px);
              z-index: 40; display: flex; align-items: center; gap: 16px;
              background: #0B0C0E; border-top: 1px solid #3D423F;
              padding: 12px 16px; }
  .pdp-fija > div { display: flex; flex-direction: column; }
  .pdp-fija .precio { font: 500 1.25rem 'Fraunces', Georgia, serif; color: #F2EFE9; }
  .pdp-fija > div span:last-child { font-size: .75rem; color: #B7BCB7; }
  .pdp-fija .ct-cta { margin-left: auto; padding: 14px 20px; }
  /* Las dos barras tapan el final de la página: se le devuelve el aire. */
  body.pagina-catalogo:has(.pdp-fija) .ct {
    padding-bottom: calc(var(--tabbar-alto, 64px) + 96px); }
}

/* ── EL CARRO Y EL CHECKOUT ──────────────────────────────────────────
   Estas dos pantallas NO se reescribieron: son el camino del pago, están
   probadas, y cambiarles el marcado para cambiarles el color es arriesgar
   plata para ganar tipografía. Lo que se hace acá es repintar el vocabulario
   compartido —botón, campo, tarjeta, resumen— cuando vive dentro de `.ct`.

   Es la misma decisión que con `partials/ficha`: una piel, no una copia. */
.ct .tarjeta, .ct .marco, .ct .estado {
  background: var(--surface); border: 1px solid var(--line); border-radius: 0;
  box-shadow: none; color: var(--text); }
.ct .carro-item { border-bottom: 1px solid var(--line); }
.ct .carro-item__media { background: #fff; border-radius: 0; }
.ct .carro-item__tipo { color: var(--muted); }
.ct .resumen__fila, .ct .resumen__total { color: var(--text); }
.ct .resumen__fila span:first-child { color: var(--muted); }
.ct .divisor, .ct hr { background: var(--line); border: 0; }
.ct .etq, .ct .campo > label { color: var(--muted); font-size: .8125rem;
                               letter-spacing: .06em; text-transform: uppercase; }
.ct .ayuda { color: var(--muted); font-size: .8125rem; }
.ct .precio { color: var(--text); font-family: var(--serif); font-weight: 500;
              font-variant-numeric: tabular-nums; }
.ct .precio-antes { color: var(--muted); font-family: var(--sans); }
.ct .mono { font-variant-numeric: tabular-nums; }
.ct .sec, .ct .ter { color: var(--muted); }

/* Campos: el fondo blanco de un formulario claro sobre negro es una linterna.
   `color-scheme: dark` es lo que hace que el desplegable nativo del select y
   el calendario del navegador salgan oscuros también; sin eso, la lista de
   346 comunas se abre en blanco encima de la página. */
.ct .input, .ct .select, .ct input[type="text"], .ct input[type="email"],
.ct input[type="tel"], .ct input[type="number"], .ct select, .ct textarea {
  background: var(--bg); border: 1px solid var(--line); color: var(--text);
  border-radius: 0; color-scheme: dark; }
.ct .input:focus-visible, .ct .select:focus-visible { border-color: var(--text); }
.ct .input::placeholder { color: var(--muted); }
.ct .stepper { border: 1px solid var(--line); background: var(--bg); border-radius: 0; }
.ct .stepper button { color: var(--text); background: none; }

/* Botones. El primario es el de pagar: relleno claro y letra oscura, igual
   que `.ct-cta`, para que la acción que cierra la compra se vea igual en toda
   la tienda. `.ct a` y `.ct button` pesan más que la clase sola, así que van
   apuntados al elemento —el mismo choque de siempre—. */
.ct a.btn, .ct button.btn { border-radius: 0; border: 1px solid var(--line);
                            background: none; color: var(--text); }
.ct a.btn--primario, .ct button.btn--primario {
  background: var(--text); color: var(--bg); border-color: var(--text); font-weight: 600; }
.ct a.btn--secundario, .ct button.btn--secundario { border-color: var(--text); }
.ct a.btn--terciario, .ct button.btn--terciario { border: 0; color: var(--muted);
                                                  text-decoration: underline;
                                                  text-underline-offset: 5px; padding-inline: 0; }
.ct a.btn--terciario:hover, .ct button.btn--terciario:hover { color: var(--text); }

.ct .nota { background: var(--surface); border: 1px solid var(--line);
            border-radius: 0; color: var(--text); }
.ct .error, .ct .campo--malo .input { border-color: #F0564A; }
.ct .error { color: #F0564A; }

/* ── Volver al club ─────────────────────────────────────────────────
   La banda verde del final: el catálogo se abre desde la página del club y
   sin esto no hay forma de devolverse sin el botón del navegador. */
.ct-volver { background: var(--accent); padding: 48px var(--gutter); margin-top: 64px;
             margin-inline: calc(var(--gutter) * -1);
             display: flex; justify-content: space-between; align-items: center; gap: 32px; }
.ct-volver h2 { font-size: clamp(2rem, 4vw, 3rem); margin-top: 12px; }
.ct-ir { display: inline-flex; align-items: center; gap: 24px; border-bottom: 1px solid;
         padding-block: 10px; font-size: .9375rem; transition: gap .35s var(--curva); }
.ct-ir:hover { gap: 40px; }

/* ── La cabecera y el pie compartidos ───────────────────────────────
   Los mismos dos de toda la tienda, repintados. Sin esto quedan dos franjas
   de hueso arriba y abajo de una página negra —y la marca, que es un enlace
   sin color propio, hereda el del cuerpo y desaparece—. */
body.pagina-catalogo .cab { background: #0B0C0E; border-bottom: 1px solid #3D423F; }
body.pagina-catalogo .cab a, body.pagina-catalogo .cab__marca { color: #F2EFE9; }
body.pagina-catalogo .cab__nav a,
body.pagina-catalogo .cab .t-sm, body.pagina-catalogo .cab__despacho { color: #B7BCB7; }
body.pagina-catalogo .cab__nav a.on, body.pagina-catalogo .cab__nav a:hover { color: #F2EFE9; }
body.pagina-catalogo .cab__sep { background: #3D423F; }
/* `a.cab__carro` y no `.cab__carro`: la regla de arriba pinta TODO enlace de
   la cabecera de color hueso y pesa más que una clase sola, así que el carro
   quedaba hueso sobre hueso —un recuadro blanco vacío en la esquina—. */
body.pagina-catalogo .cab a.cab__carro { background: #F2EFE9; color: #0B0C0E;
                                         border-radius: 0; }
body.pagina-catalogo .cab .select { background: #141619; color: #F2EFE9; border-color: #3D423F;
                             color-scheme: dark; }
body.pagina-catalogo .pie { background: #0B0C0E; border-top: 1px solid #3D423F; color: #B7BCB7; }
body.pagina-catalogo .pie a { color: #F2EFE9; }
body.pagina-catalogo .tabbar { background: #0B0C0E; border-top: 1px solid #3D423F; }
body.pagina-catalogo .tabbar a { color: #B7BCB7; }
body.pagina-catalogo .tabbar a.on { color: #F2EFE9; }

/* El catálogo nacional (/tienda) no lleva la cabecera de una tienda sino la
   de PISTA, la misma de la ficha del club. El `:not(.ps-btn)` de acá no
   filtra nada: está para PESAR. `body.pista a:not(.ps-btn):not(.cl-cta)` vale
   tres clases y se lleva puesta cualquier regla de dos, que es lo que dejó la
   palabra PISTA negra sobre negro la primera vez. */
body.pagina-catalogo .ps-top { position: static; background: #0B0C0E; backdrop-filter: none;
                        -webkit-backdrop-filter: none; border-bottom: 1px solid #3D423F; }
body.pagina-catalogo .ps-top__in { max-width: none; padding-inline: clamp(24px, 5vw, 80px); }
body.pagina-catalogo .ps-top a:not(.ps-btn):not(.cl-cta) { color: #B7BCB7; }
body.pagina-catalogo .ps-top a.ps-marca:not(.ps-btn) { color: #F2EFE9; }
body.pagina-catalogo .ps-top a:not(.ps-btn):not(.cl-cta):hover { color: #F2EFE9; }
body.pagina-catalogo .ps-top .ps-top__zona { background: #16181B; border-color: #3D423F; }
body.pagina-catalogo .ps-top .ps-top__zona i { color: #8A908C; }
body.pagina-catalogo .ps-pie { background: #0B0C0E; color: #B7BCB7;
                        border-top: 1px solid #3D423F; }
body.pagina-catalogo .ps-pie a:not(.ps-btn):not(.cl-cta) { color: #F2EFE9; }
body.pagina-catalogo .ps-fondo { background: #0B0C0E; border-top-color: #3D423F; }
body.pagina-catalogo .ps-fondo .ps-marca { color: #F2EFE9; }
body.pagina-catalogo .ps-fondo a:not(.ps-btn):not(.cl-cta) { color: #F2EFE9; }
/* La zona flotante del móvil, que en el mundo claro es una tarjeta hueso. */
body.pagina-catalogo .ps-zona { background: #141619; border-color: #3D423F; color: #F2EFE9; }

/* ── En el teléfono ─────────────────────────────────────────────────── */
@media (max-width: 1100px) {
  .ct-rejilla { gap: 32px 16px; }
  .ct .ficha__media img { padding: 8px; }
}
@media (max-width: 800px) {
  .ct-intro { display: block; padding-block: 24px 32px; }
  .ct-intro > div { margin-top: 24px; }
  .ct-intro h1 { font-size: clamp(3rem, 14vw, 5rem); }
  .ct-buscar { margin-bottom: 24px; padding: 8px 0; }
  .ct-buscar label { display: none; }
  .ct-buscar input { padding: 12px 0; font-size: 1rem; }
  .ct-panel, .ct-filtro__c { padding: 16px; }
  .ct-filtro > summary { padding: 16px; }
  /* Las categorías se ruedan con el dedo, en una fila: apiladas se comen
     media pantalla antes de que aparezca el primer producto. */
  .ct-cats { flex-wrap: nowrap; overflow-x: auto; overscroll-behavior-inline: contain;
             padding-bottom: 12px; scroll-snap-type: x proximity; }
  .ct-cat { flex: 0 0 auto; white-space: nowrap; scroll-snap-align: start; }
  .ct-barra { gap: 12px; }
  .ct-orden label { display: none; }
  .ct-orden select { max-width: 170px; font-size: .8125rem; }
  .ct-rejilla { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 32px 16px; }
  .ct .ficha__media { aspect-ratio: 3 / 4; }
  .ct .ficha__nombre { font-size: .9375rem; }
  .ct .ficha .precio { font-size: 1.5rem; }
  .ct-puertas { grid-template-columns: 1fr; gap: 40px; }
  .ct-hero { grid-template-columns: 1fr; gap: 32px; padding-block: 24px 40px; }
  .ct-hero__t { order: 2; }
  .ct-hero h1 { font-size: clamp(2.5rem, 11vw, 4rem); }
  .ct-hero__acc { flex-direction: column; align-items: stretch; gap: 16px; }
  .ct-tira { margin-top: 64px; }
  .ct-tira__cab { display: block; margin-bottom: 24px; }
  .ct-tira__cab .ct-ir { margin-top: 16px; }
  .ct-profes { grid-template-columns: 1fr; gap: 20px; }
  .pdp, .pdp-info { grid-template-columns: 1fr; gap: 32px; }
  .pdp-fotos { position: static; }
  .pdp-foto { aspect-ratio: 1; }
  .pdp-info { margin-top: 64px; }
  .pdp-acc { grid-template-columns: 1fr; }
  .ct .destacados { grid-template-columns: 1fr 1fr; gap: 16px; }
  .ct .rejilla--2 { grid-template-columns: 1fr; }
  .ct-pag { display: block; }
  .ct-pag nav { margin-top: 16px; }
  .ct-volver { display: block; }
  .ct-volver .ct-ir { margin-top: 24px; }
}
