/* ============================================================
   COSMICA ARTWEAR — One Page Store
   style.css — página completa en HTML + CSS real (sin slices).
   Patrón full-width: cada sección pinta su fondo de borde a
   borde del navegador; el contenido se centra dentro de .wrap
   (máx. 1440px) para mantener la lectura cómoda en pantallas
   anchas, igual que un ecommerce real.
   ============================================================ */

/* ---------- Fuentes (Brand Book: Syne + Inter) ----------
   font-display:swap no es opcional: sin él el navegador deja el texto invisible
   hasta tres segundos mientras baja la fuente. Con swap se ve de inmediato con
   la de respaldo y cambia al llegar la buena.
   Estas declaraciones ganan sobre cualquier hoja externa que venga antes, y por
   eso se quitó el <link> a Google Fonts: se descargaba para nada. */
@font-face{ font-family:"Syne"; font-weight:400; font-style:normal; font-display:swap; src:url("assets/fonts/syne-latin-400-normal.woff2") format("woff2"); }
@font-face{ font-family:"Syne"; font-weight:500; font-style:normal; font-display:swap; src:url("assets/fonts/syne-latin-500-normal.woff2") format("woff2"); }
@font-face{ font-family:"Syne"; font-weight:600; font-style:normal; font-display:swap; src:url("assets/fonts/syne-latin-600-normal.woff2") format("woff2"); }
@font-face{ font-family:"Syne"; font-weight:700; font-style:normal; font-display:swap; src:url("assets/fonts/syne-latin-700-normal.woff2") format("woff2"); }
@font-face{ font-family:"Syne"; font-weight:800; font-style:normal; font-display:swap; src:url("assets/fonts/syne-latin-800-normal.woff2") format("woff2"); }
@font-face{ font-family:"Inter"; font-weight:300; font-style:normal; font-display:swap; src:url("assets/fonts/inter-latin-300-normal.woff2") format("woff2"); }
@font-face{ font-family:"Inter"; font-weight:600; font-style:normal; font-display:swap; src:url("assets/fonts/inter-latin-600-normal.woff2") format("woff2"); }
@font-face{ font-family:"Inter"; font-weight:400; font-style:normal; font-display:swap; src:url("assets/fonts/inter-latin-400-normal.woff2") format("woff2"); }
@font-face{ font-family:"Inter"; font-weight:500; font-style:normal; font-display:swap; src:url("assets/fonts/inter-latin-500-normal.woff2") format("woff2"); }

/* ---------- Tokens (Brand Book) ---------- */
:root{
  --void:   #0D0D0D;
  --ink:    #1A1A1A;
  --dust:   #2E2E2E;
  --cosmic: #F2EDE4;
  --nebula: #7B5EA7;
  --nebula-lt: #B8A8D4;
  --acid:   #C6F135;
  --flux:   #FF4B6E;
  --neon:   #00E5CC;
  --gold:   #EFC048;
  --smoke:  #8f8f8f;
  --font-display: "Syne", sans-serif;
  --font-body: "Inter", sans-serif;
}

/* ---------- Reset ---------- */
*,*::before,*::after{ box-sizing:border-box; margin:0; padding:0; }
html,body{ width:100%; background:var(--void); }
body{
  color:var(--cosmic);
  font-family:var(--font-body);
  font-size:15px;
  line-height:1.5;
  overflow-x:hidden;
}
h1,h2,h3{ font-family:var(--font-display); line-height:1; letter-spacing:-.02em; }
p{ color:rgba(242,237,228,.72); }
a{ color:inherit; text-decoration:none; }
button{ font-family:var(--font-body); border:none; cursor:pointer; background:none; color:inherit; }
img{ display:block; max-width:100%; }
ul{ list-style:none; }
svg{ width:100%; height:100%; fill:none; stroke:currentColor; stroke-width:1.6; stroke-linecap:round; stroke-linejoin:round; }

/* ---------- Wrap: columna centrada reutilizable ---------- */
.wrap{
  width:100%;
  max-width:1440px;
  margin:0 auto;
  padding:0 101px;
}

/* ---------- Botones ---------- */
.btn{
  display:inline-block;
  font-family:var(--font-display);
  font-weight:600;
  font-size:14px;
  line-height:48px;
  height:48px;
  padding:0 24px;
  border-radius:24px;
  text-align:center;
}
.btn-acid{ background:var(--acid); color:var(--void); }
.btn-outline{ background:transparent; color:#F2EDE4; border:1px solid var(--nebula); line-height:46px; }


/* ============================================================
   ANUNCIO
   ============================================================ */
.annbar{
  width:100%; height:52px; background:var(--nebula); text-align:center;
  font-size:14px; line-height:52px; color:#fff;
}

/* ============================================================
   HERO
   ------------------------------------------------------------
   Imagen única (foto + nav + titular + botones ya compuestos
   en el diseño original). Ver nota en index.html.
   ============================================================ */
.hero{ position:relative; width:100%; height:759px; overflow:hidden; background:#3a3236; }
.hero-bg{ position:absolute; inset:0; width:100%; height:100%; object-fit:cover; object-position:center; }

/* La foto mide 1440x757, exactamente la caja del hero a 1440px. Con un alto fijo,
   de ahí en adelante la caja se vuelve más y más apaisada que la foto y object-fit
   recorta por arriba y por abajo: medido, 36px a 1512 (un portátil normal), 250 a
   1920 y 587 a 2560 — ahí ya se pierde media foto.
   Desde 1440 el alto pasa a salir de la proporción del diseño, así que la foto se
   ve entera. El tope es la ventana (menos la barra de anuncio) para que el hero no
   empuje todo lo demás fuera de la pantalla en un monitor muy ancho.
   Por debajo de 1440 no hace falta nada: ahí la caja es MENOS apaisada que la foto
   y el recorte vertical ya era cero. */
@media (min-width:1440px){
  .hero{ height:auto; aspect-ratio:1440 / 759; max-height:calc(100svh - 52px); }
}

/* ---------- Header (sobre la foto) ---------- */
/* z-index alto a propósito. Con z-index:5 esto creaba un contexto de apilamiento
   que encerraba a sus hijos y los dejaba DEBAJO de la barra flotante (8000) por más
   alto que fuera su propio z-index. El buscador y el menú ya no cuelgan de aquí
   (ver src/html/93-barra.html), pero el mega menú sí, y le pasaría lo mismo.
   Fichas y carrito siguen por encima (10000+). */
/* Sin velo translúcido: la franja va limpia sobre la foto y lo blanco se defiende
   con su propia sombra (ver .nav-links a y .nav-icons button). Se probó un fondo
   casi transparente con desenfoque y se descartó — con el encuadre corregido en
   celular (object-position en 90-responsive.css) ya no hacía falta, y ensuciaba
   una foto que el diseño quiere ver entera.
   Nota para quien lo reintente: cuidado con backdrop-filter aquí. Como filter o
   transform, convierte al elemento en el bloque contenedor de sus descendientes
   position:fixed. El buscador —que usa .busca.fija{position:fixed; top:0}— era hijo
   de aquí y con el filtro arriba ese top:0 dejaba de ser el borde de la ventana para
   ser el del header, 52px más abajo: el panel se abría descolgado. Lo cazó r6. Hoy
   el buscador ya no cuelga de aquí, pero el mega menú sí. */
.site-header{ position:absolute; top:0; left:0; right:0; z-index:8200; transition:background .18s; }
.nav{ position:relative; max-width:1440px; height:88px; margin:0 auto; }
.nav::after{ content:""; position:absolute; left:102px; right:98px; bottom:0; height:1px; background:rgba(255,255,255,.35); transition:background .18s; }
.logo{ position:absolute; left:105px; top:36px; display:block; color:#0D0D0D; width:253px; }
.logo-word{ display:block; font-family:var(--font-display); font-weight:800; font-size:30.3px; line-height:29px; letter-spacing:-.02em; white-space:nowrap; }
.logo-deg{ position:absolute; left:237px; top:5px; width:17px; height:11px; border:3px solid var(--nebula); border-radius:50%; }
.logo small{ display:block; font-family:var(--font-body); font-weight:400; font-size:11px; line-height:13px; letter-spacing:.22em; color:#6f6f6f; margin-top:4px; }
.nav-links{ position:absolute; left:530px; top:0; height:88px; display:flex; gap:39px; }
.nav-links li{ height:88px; }
/* La misma defensa que los iconos, pero en texto: text-shadow en vez de filtro.
   Los enlaces caen sobre el pelo oscuro de la modelo y ahí el blanco va sobrado,
   pero "Nuevo" roza el cuero claro y en pantallas anchas la foto se recoloca.
   Dos sombras: una cerrada que define el borde de la letra y otra abierta que la
   despega del fondo sin que se note como sombra. */
.nav-links a{ position:relative; display:flex; align-items:center; height:88px; padding:14px 7px 0; box-sizing:border-box; font-family:var(--font-display); font-weight:500; font-size:18px; letter-spacing:.03em; color:#fff; text-shadow:0 1px 2px rgba(13,13,13,.45), 0 2px 12px rgba(13,13,13,.5); transition:color .18s, text-shadow .18s; }
.nav-links a::after{ content:""; position:absolute; left:0; right:0; bottom:-1px; height:3px; background:var(--nebula); opacity:0; }
.nav-icons{ position:absolute; right:98px; top:42px; display:flex; gap:25px; }
/* Blancos, pero caen justo sobre el cuero rosa claro de la foto y ahí se perdían.
   La sombra los despega sin cambiarles el color, que es lo que hace falta: el
   mismo icono tiene que leerse sobre lo claro y sobre el pelo oscuro. drop-shadow
   y no box-shadow: sigue el trazo del dibujo, no la caja de 20x20. */
.nav-icons button{
  width:20px; height:20px; color:#fff; transition:color .18s;
  filter:drop-shadow(0 1px 3px rgba(0,0,0,.55));
}
.nav-icons svg{ stroke-width:1.7; }
/* Con el mega menú abierto el fondo es claro y sólido: la sombra sobraría. */
.site-header:has(.has-mega:hover, .mega:hover, .has-mega:focus-within) .nav-icons button{ filter:none; }
.nav-burger{ display:none; }

/* ---------- Menú desplegable de Tienda (Menu.pdf) ---------- */
.mega{ position:absolute; left:0; right:0; top:88px; height:569px; background:#F1ECE6; opacity:0; visibility:hidden; transition:opacity .18s, visibility .18s; }
.mega-in{ position:relative; max-width:1440px; height:100%; margin:0 auto; padding:29px 98px 0 102px; display:grid; grid-template-columns:184px 222px 206px 291px 337px; align-content:start; }
.mega-col h4{ font-family:var(--font-display); font-weight:700; font-size:16px; line-height:20px; letter-spacing:0; color:#1A1A1A; margin-bottom:22px; }
.mega-col a{ display:block; font-size:15px; line-height:20px; color:#555; margin-bottom:19.6px; }
/* El morado es la respuesta al cursor, no una marca de "sección activa". */
.mega-col a:hover, .mega-col a:focus-visible{ color:var(--nebula); }
.mega-col{ grid-row:1; }
.mega-img{ grid-column:4; grid-row:1; width:291px; height:333px; object-fit:cover; display:block; }
.mega-img2{ grid-column:5; grid-row:1; width:290px; margin-left:47px; }
.site-header:has(.has-mega:hover, .mega:hover, .has-mega:focus-within){ background:#F1ECE6; }
.site-header:has(.has-mega:hover, .mega:hover, .has-mega:focus-within) .mega{ opacity:1; visibility:visible; }
.site-header:has(.has-mega:hover, .mega:hover, .has-mega:focus-within) .nav::after{ background:var(--nebula); }
/* Con el mega menú abierto el fondo es claro y sólido: texto oscuro y sin sombra. */
.site-header:has(.has-mega:hover, .mega:hover, .has-mega:focus-within) .nav-links a{ color:#1A1A1A; text-shadow:none; }
.site-header:has(.has-mega:hover, .mega:hover, .has-mega:focus-within) .nav-icons button{ color:#1A1A1A; }
.has-mega:hover a::after, .has-mega:focus-within a::after, .site-header:has(.mega:hover) .has-mega a::after{ opacity:1; }

/* ---------- Menú móvil (bajo 1100px) ----------
   No existe diseño para esta pantalla: reusa el fondo y la jerarquía del mega menú. */
/* .mmenu es la capa; .mmenu-panel es el menú. En celular el panel ocupa la capa
   entera (lo de siempre); desde 1101px la capa pasa a ser el velo y el panel se
   va a la derecha — ver 90-responsive.css.
   El marcado cuelga del <body>, no del header: ver la nota en src/html/93-barra.html. */
/* Va por encima incluso de los modales (10002) y no pasa nada: el menú y los
   paneles ya no conviven — 30-menu.js expone cosmicaCerrarMenu() y la ficha lo
   llama antes de abrir. Y desde el menú no se puede abrir una ficha: solo tiene
   enlaces de navegación.
   El 9000 que tenía antes lo dejaba por debajo de la baraja de cartas, que era opaca
   y a pantalla completa: el menú abría DETRÁS y parecía no abrir, con el scroll ya
   bloqueado. La baraja ya no existe, pero el margen se queda. */
.mmenu{
  position:fixed; inset:0; z-index:10050;
  opacity:0; transition:opacity .2s ease;
}
.mmenu[hidden]{ display:none; }
.mmenu.open{ opacity:1; }
.mmenu-panel{
  position:absolute; inset:0; background:#F1ECE6; color:#1A1A1A;
  padding:22px 22px 40px; overflow-y:auto;
  display:flex; flex-direction:column;
}
.mmenu-top{ display:flex; align-items:flex-start; justify-content:space-between; gap:16px; }
.mmenu .logo{ position:relative; left:auto; top:auto; flex:none; }
.mmenu-x{ font-size:34px; line-height:30px; color:#1A1A1A; padding:0 4px; }
.mmenu-main{ display:flex; flex-direction:column; margin-top:38px; }
.mmenu-main a{
  font-family:var(--font-display); font-weight:700; font-size:26px; line-height:1.15;
  padding:15px 0; border-bottom:1px solid rgba(26,26,26,.12); color:#1A1A1A;
}
.mmenu-cols{ display:grid; grid-template-columns:1fr 1fr; gap:26px; margin-top:32px; }
.mmenu-cols h4{
  font-family:var(--font-display); font-weight:700; font-size:12px; letter-spacing:.06em;
  text-transform:uppercase; color:#8a8a8a; margin-bottom:14px;
}
.mmenu-cols a{ display:block; font-size:15px; line-height:20px; color:#555; margin-bottom:14px; }
.mmenu-wa{ margin-top:36px; align-self:flex-start; }

/* ---------- Titular y botones del hero ---------- */
/* En porcentaje y no en píxeles: desde 1440 el hero crece con el ancho, y con un
   top fijo el titular se quedaría pegado arriba en vez de acompañar a la foto.
   49,4071% de 759 son 375px exactos, así que a 1440 no se mueve ni un píxel. */
.hero-content h1{ position:absolute; left:0; right:0; top:49.4071%; text-align:center; font-family:var(--font-display); font-weight:800; font-size:52.5px; line-height:52px; letter-spacing:-.01em; color:#F2EDE4; text-shadow:0 2px 4px rgba(13,13,13,.45), 0 6px 28px rgba(13,13,13,.6); }
.hero-content h1 .deg{ font-weight:800; }
.hero-cta{ position:absolute; left:0; right:0; top:63.5046%;   /* 63,5046% de 759 = 482px */ display:flex; justify-content:center; gap:18px; }
.hero-cta .btn{ width:219px; }
.hero-cta .btn-outline{ width:222px; }

/* ---------- Logo del footer ---------- */
.logo-dark{ color:var(--void); }

/* ============================================================
   SECCIONES GENÉRICAS
   ============================================================ */
.sec{ width:100%; background:var(--void); padding:84px 0 0; }
.sec:last-of-type{ padding-bottom:70px; }
.center{ text-align:center; }
.sh{ display:flex; justify-content:space-between; align-items:flex-end; margin-bottom:36px; }
.sh h2, h2.center{ font-size:34px; font-weight:700; color:var(--cosmic); }
.sh span{ color:var(--smoke); font-size:13px; }

/* ---------- Lo Nuevo ---------- */
.sec-lonuevo{ padding:103px 0 104px; }
.sec-lonuevo .wrap, .sec-edit .wrap{ padding:0 100px 0 102px; }
.sec-lonuevo h2{ font-size:22px; line-height:22px; font-weight:800; margin-bottom:60px; }
/* Sin JavaScript queda la rejilla de siempre; con JS, 55-carrusel.js la
   convierte en pista y agrupa las tarjetas de a cuatro. */
.nu-grid{ display:grid; grid-template-columns:repeat(4, 1fr); gap:38px; }
/* overflow:hidden es lo que esconde los grupos que no toca ver. El problema es que
   recortaba por los cuatro lados, y el botón "+" de cada tarjeta se sale 15px por la
   esquina: se veía cortado por arriba en todas las tarjetas y por la derecha en la
   última columna, como medias lunas.

   El padding da 16px de margen antes del corte y el margen negativo se los devuelve,
   así que la pista mide exactamente lo mismo que antes y las tarjetas siguen
   alineadas con el resto de la página. Lo que no se puede hacer es overflow-x:hidden
   con overflow-y:visible: cuando un eje no es visible, el otro se vuelve auto y
   aparece una barra de scroll.

   Y por eso los grupos llevan HUECO (32px) de separación: sin él, esos 16px que se
   dejan de recortar a la derecha enseñarían el primer centímetro del grupo
   siguiente. El JS lo suma al desplazar — ver HUECO en 55-carrusel.js. */
.nu-vista{ overflow:hidden; padding:16px; margin:-16px; }
.nu-grid.nu-pista{
  display:flex; gap:32px; will-change:transform;
  transition:transform .7s cubic-bezier(.22,.61,.36,1);
}
.nu-grid.nu-pista.sin-transicion{ transition:none; }
.nu-grupo{ flex:0 0 100%; display:grid; grid-template-columns:repeat(4, 1fr); gap:38px; }
@media (prefers-reduced-motion: reduce){ .nu-grid.nu-pista{ transition:none; } }
.nu-card{ cursor:pointer; }
.nu-card:focus-visible{ outline:2px solid var(--acid); outline-offset:4px; }
/* overflow:visible, no hidden. El botón "+" vive dentro de esta caja y se sale 15px
   por la esquina: con hidden se veía cortado en todas las tarjetas del carrusel,
   como una media luna. No hace falta recortar nada aquí — la <img> va
   position:absolute con inset:0 y object-fit:cover, así que ya se recorta sola
   dentro de la caja; el overflow era redundante. (El equivalente de la rejilla, .im,
   se arregló igual en la ronda anterior.) */
.nu-im{ aspect-ratio:281/343; background:#FAFAFA; overflow:visible; position:relative; }
.nu-im img{ position:absolute; inset:0; width:100%; height:100%; object-fit:cover; }
.nu-card.out .nu-im{ filter:saturate(.5) brightness(.7); }
.nu-cat,.nu-nm,.nu-pr{ position:relative; left:-2px; }
.nu-cat{ font-size:13px; line-height:20px; color:#8F8F8F; margin-top:25px; text-align:center; }
.nu-nm{ font-family:var(--font-body); font-size:15px; line-height:20px; font-weight:400; letter-spacing:0; text-align:center; margin-top:5px; color:#fff; }
.nu-pr{ font-size:15px; line-height:20px; font-weight:400; color:var(--flux); text-align:center; margin-top:2px; }
.dots{ display:flex; justify-content:center; gap:12px; margin-top:60px; }
.dots i{ width:11px; height:11px; border-radius:50%; background:var(--cosmic); display:block; }
.dots i.on{ background:var(--nebula); }

/* ---------- Grid editorial (mosaico sin separación) ---------- */
.sec-edit{ width:100%; background:var(--void); padding:0 0 90px; }
.edit-grid{ display:grid; grid-template-columns:477fr 380fr 381fr; grid-template-rows:414px 414px; gap:0; }
.ed-tile{ position:relative; display:block; overflow:hidden; }
.ed-tile img{ width:100%; height:100%; object-fit:cover; }
.ed-sets{ grid-column:1; grid-row:1 / 3; }
.ed-pendientes{ grid-column:2 / 4; grid-row:1; }
.ed-anillos{ grid-column:2; grid-row:2; }
.ed-collares{ grid-column:3; grid-row:2; }
.ed-tile::after{ content:""; position:absolute; inset:0; z-index:1; pointer-events:none; opacity:0; transition:opacity .3s ease; background:linear-gradient(180deg, rgba(198,241,53,0) 8%, #C6F135 100%); }
.ed-label{ position:absolute; z-index:2; left:41px; font-family:var(--font-display); font-weight:800; font-size:22px; line-height:24px; letter-spacing:0; color:#F2EDE4; transform:translateX(0); transition:left .3s ease, top .3s ease, transform .3s ease, color .3s ease; }
.ed-pendientes .ed-label{ top:calc(100% - 95px); } .ed-anillos .ed-label{ top:calc(100% - 90.5px); } .ed-collares .ed-label{ top:calc(100% - 90px); left:44px; } .ed-sets .ed-label{ top:calc(100% - 91px); }
.ed-btn{ position:absolute; z-index:2; left:50%; top:calc(50% + 128px); width:218px; transform:translate(-50%,8px); opacity:0; visibility:hidden; transition:opacity .3s ease, transform .3s ease, visibility .3s; }
.ed-tile:hover::after, .ed-tile:focus-visible::after{ opacity:1; }
.ed-tile:hover .ed-label, .ed-tile:focus-visible .ed-label{ left:50%; top:calc(50% + 87px); transform:translateX(-50%); color:#0D0D0D; }
.ed-tile:hover .ed-btn, .ed-tile:focus-visible .ed-btn{ opacity:1; visibility:visible; transform:translate(-50%,0); }

/* ---------- Tabs de tipo de producto ---------- */
.tabs{
  display:flex; gap:26px;
  font-family:var(--font-display); font-weight:600; font-size:15px; color:var(--smoke);
  margin-bottom:22px; border-bottom:1px solid var(--dust); padding-bottom:16px;
}
.tabs button{ font:inherit; color:inherit; padding:0; }
.tabs button:disabled{ cursor:default; opacity:.55; }
.tabs .on{ color:var(--cosmic); border-bottom:2px solid var(--acid); padding-bottom:16px; margin-bottom:-17px; }
.tabs em{ font-family:var(--font-body); font-style:normal; font-size:10px; color:#5c5c5c; margin-left:4px; }

/* ---------- Barra de filtros ---------- */
.fb{ display:flex; gap:10px; align-items:center; flex-wrap:wrap; }
.pl{ border:1px solid var(--dust); border-radius:30px; padding:9px 16px; font-size:13px; color:var(--cosmic); }
.pl{ font:inherit; }
.pl u{ display:inline-block; text-decoration:none; margin-left:8px; color:var(--smoke); transition:transform .18s; }
.pl[aria-expanded="true"] u{ transform:rotate(180deg); }
.pl.on{ border-color:var(--nebula); color:var(--nebula-lt); }
.srt{ font-size:12px; color:var(--smoke); display:flex; align-items:center; gap:4px; }

/* ---------- Panel de filtros expandido ---------- */
.pn{
  background:var(--ink); border:1px solid var(--dust); margin:14px 0; padding:26px 28px;
  display:grid; grid-template-columns:1.5fr 1fr 1fr 1fr 1fr 170px; gap:24px;
}
.pn[hidden]{ display:none; }   /* el atributo hidden no gana contra display:grid */

/* Rango de precio: dos <input type="range"> superpuestos sobre la misma barra.
   Los inputs no reciben eventos salvo en el pulgar, para que ambos sean agarrables. */
.rng{ position:relative; height:4px; border-radius:2px; background:var(--dust); margin:22px 0 14px; }
.rng-fill{ position:absolute; top:0; bottom:0; background:var(--acid); border-radius:2px; }
.rng-i{
  position:absolute; left:0; top:50%; width:100%; height:13px; margin:0;
  transform:translateY(-50%); background:none; pointer-events:none;
  -webkit-appearance:none; appearance:none;
}
.rng-i::-webkit-slider-thumb{
  -webkit-appearance:none; pointer-events:auto; cursor:pointer;
  width:13px; height:13px; border:none; border-radius:50%; background:var(--acid);
}
.rng-i::-moz-range-thumb{
  pointer-events:auto; cursor:pointer;
  width:13px; height:13px; border:none; border-radius:50%; background:var(--acid);
}
.rng-i:focus-visible::-webkit-slider-thumb{ outline:2px solid var(--cosmic); outline-offset:2px; }
.rng-v{ display:flex; justify-content:space-between; font-size:12px; color:var(--cosmic); }
.pn h4{
  font-family:var(--font-display); font-weight:600; font-size:12px; color:var(--smoke);
  letter-spacing:.04em; text-transform:uppercase; margin-bottom:12px;
}
.op{ display:flex; align-items:center; gap:9px; font-size:13px; margin-bottom:9px; cursor:pointer; }
.op input{ width:14px; height:14px; border:1.5px solid var(--smoke); border-radius:3px; accent-color:var(--acid); }
.op em{ margin-left:auto; font-style:normal; color:#666; font-size:11px; }
.go{
  align-self:end; text-align:center; background:var(--cosmic); color:var(--void);
  font-family:var(--font-display); font-weight:700; font-size:13px; padding:13px; border-radius:30px;
}

/* ---------- Chips activos ---------- */
.chs{ display:flex; gap:8px; align-items:center; margin:16px 0 0; font-size:12px; flex-wrap:wrap; }
.chs[hidden]{ display:none; }
.ch{ background:var(--dust); border-radius:30px; padding:6px 13px; color:var(--cosmic); font:inherit; cursor:pointer; }
.ch:hover{ background:#3a3a3a; }
.cl{ color:var(--nebula-lt); text-decoration:underline; margin-left:6px; font:inherit; cursor:pointer; }

/* Estado vacío: el spec §18 pide que los agotados no dominen, y que no quede una grilla en blanco. */
.vacio{ padding:48px 0 8px; color:var(--smoke); font-size:15px; }
.vacio[hidden]{ display:none; }

/* "Solo disponibles" y el selector de orden viven en la barra, visibles sin desplegar el panel. */
.solo-disp{ display:flex; align-items:center; gap:8px; margin-left:auto; font-size:13px; color:var(--cosmic); cursor:pointer; }
.solo-disp input{ width:14px; height:14px; accent-color:var(--acid); }
.srt select{
  font:inherit; color:var(--smoke); background:none; border:none; cursor:pointer;
  padding:0 2px;
}
.srt select option{ background:var(--ink); color:var(--cosmic); }

/* ---------- Grid de productos ---------- */
/* El margen vive acá y no en los chips: cuando no hay filtros activos los chips se
   ocultan, y el aire antes de la grilla no puede depender de eso. */
.grid{ display:grid; grid-template-columns:repeat(4, 1fr); gap:24px; margin-top:28px; }
.card{ --c:#fff; }
/* overflow visible a propósito: el botón "+" se sale por la esquina y .im no puede
   recortarlo. La foto de dentro sí se recorta, pero con object-fit, no con overflow. */
.im{
  overflow:visible;
  aspect-ratio:1;
  background:radial-gradient(circle at 50% 42%, color-mix(in srgb, var(--c) 26%, transparent), transparent 62%), #141414;
  position:relative; display:grid; place-items:center; border:1px solid #232323;
}
.im .art{ width:52%; color:var(--c); }
.im img{ position:absolute; inset:0; width:100%; height:100%; object-fit:cover; }
/* Botón "+" en la esquina superior derecha (patrón Rappi). Siempre visible, no solo
   en hover: en celular no hay hover y el botón tiene que poder tocarse.

   Va MONTADO sobre la esquina, no dentro: su centro cae justo en el vértice de la
   foto, así que asoma 15px por arriba y por la derecha. Antes quedaba 11px dentro y
   se leía como parte de la foto. El círculo baja de 34 a 30px para que lo que sobresale
   no se coma el hueco entre tarjetas — que en celular sube a 20px por esto mismo
   (ver .grid en 90-responsive.css).

   El área táctil sigue siendo de 44px, el mínimo cómodo con el dedo: el círculo se ve
   de 30 y ::after lo estira 7px por cada lado. */
.add{
  position:absolute; top:-15px; right:-15px; width:30px; height:30px; border-radius:50%;
  background:var(--cosmic); color:var(--nebula);   /* el signo en el morado de firma */
  font-family:var(--font-body); font-weight:300; font-size:20px; line-height:1;
  display:grid; place-items:center; padding:0; z-index:3;
  box-shadow:0 2px 10px rgba(0,0,0,.45); transition:transform .14s, background .14s, color .14s;
}
.add::after{ content:""; position:absolute; top:-7px; right:-7px; bottom:-7px; left:-7px; }
/* En reposo el círculo es Cosmic y el signo Nebula; al pasar el cursor se
   invierten. El verde ácido que había aquí era el único sitio donde aparecía
   fuera de los indicadores de foco, y rompía la paleta de la marca. */
.add:hover{ transform:scale(1.08); background:var(--nebula); color:#fff; }
.add:focus-visible{ outline:2px solid var(--acid); outline-offset:3px; }

/* Segunda foto: se cruza con la primera al pasar el cursor.
   En pantalla táctil no hay cursor, así que el disparador es otro: mientras el
   dedo esté sobre la pantalla y la página se mueva, se muestra la segunda; al
   levantarlo, vuelve la primera. Lo pone y lo quita src/js/65-toque.js con una
   clase en <html>, sin trabajo por tarjeta. */
.im-b{ opacity:0; transition:opacity .24s ease; }
@media (hover:hover){
  .card:hover .im-b, .card:focus-within .im-b,
  .nu-card:hover .im-b, .nu-card:focus-within .im-b{ opacity:1; }
}
html.toca .im-b{ opacity:1; }
.nm{ font-size:16px; font-weight:700; margin-top:14px; }
.mt{ font-size:12px; color:var(--smoke); margin-top:3px; }
.pr{ display:flex; justify-content:space-between; font-size:13px; margin-top:6px; }
.price{ color:var(--cosmic); font-weight:500; }
.dot{ display:inline-block; width:6px; height:6px; border-radius:50%; background:var(--acid); margin-right:5px; }
.one{ color:var(--flux); font-weight:500; }
.av{ color:var(--smoke); }

/* Pieza agotada: atenuada y sin botón de agregar, como en el diseño (Opción B). */
.card.out .im{ filter:saturate(.5) brightness(.7); }
.card.out .nm, .card.out .price{ color:#6e6c69; }
.card.out .mt, .card.out .av{ color:#575757; }
.sold{ color:var(--smoke); font-weight:500; }

/* ---------- Paginación del grid (8 piezas por página) ---------- */
.pg{ display:flex; flex-wrap:wrap; justify-content:center; align-items:center; gap:8px; margin-top:48px; }
.pg button{
  min-width:34px; height:34px; padding:0 6px; border:1px solid var(--dust); border-radius:50%;
  background:transparent; color:var(--cosmic);
  font-family:var(--font-display); font-weight:600; font-size:14px; line-height:1; cursor:pointer;
}
.pg .pg-arrow{ font-size:19px; }
.pg .pg-num.on{ background:var(--cosmic); border-color:var(--cosmic); color:var(--void); }
.pg button:disabled{ color:#4a4a4a; border-color:#232323; cursor:default; }
.pg .pg-dots{ min-width:20px; text-align:center; color:#6e6c69; font-size:15px; line-height:34px; user-select:none; }
.pg button:not(:disabled):not(.on):hover{ border-color:var(--smoke); }

/* ---------- Colecciones° (índice tipográfico) ---------- */
.sec-coll{ padding-bottom:40px; }
.ix-list{ margin-top:4px; }
.ix{ display:grid; grid-template-columns:62px minmax(210px,1fr) minmax(280px,1.4fr) 120px 150px; align-items:center; gap:22px; padding:24px 0; border-top:1px solid var(--dust); }
.ix:last-child{ border-bottom:1px solid var(--dust); }
.ic{
  width:62px; height:62px; border-radius:50%;
  background:color-mix(in srgb, var(--c) 20%, #141414);
  border:1px solid color-mix(in srgb, var(--c) 55%, #2a2a2a);
  display:grid; place-items:center; color:var(--c);
}
.ic .art{ width:58%; }
.ixt h3{ font-size:30px; font-weight:800; color:var(--cosmic); }
.ixt p{ font-size:13px; color:var(--smoke); margin-top:2px; }
/* La descripción tiene COLUMNA PROPIA, entre el nombre y el conteo/botón — no es
   un párrafo más apilado bajo el lema. Por eso la rejilla pasó de cuatro columnas
   a cinco. Acotada a dos líneas con line-clamp. */
.ix-desc{
  font-size:12.5px; line-height:1.45;
  color:rgba(242,237,228,.52);
  display:-webkit-box; -webkit-box-orient:vertical; -webkit-line-clamp:2; overflow:hidden;
}
.ix em{ font-style:normal; font-size:13px; color:var(--smoke); text-align:right; }
.ix-btn{
  justify-self:end; color:var(--void); background:var(--c);
  font-family:var(--font-display); font-weight:700; font-size:13px; padding:10px 18px; border-radius:30px; white-space:nowrap;
}
/* La palabra "colección" va en un <i> para poder esconderla en celular y dejar solo
   "Ver ↓" (ver 90-responsive.css). El <i> es solo el gancho: aquí no hay nada que
   enfatizar, así que se le quita la cursiva que trae de fábrica. Sin esto el botón
   de escritorio cambiaba de aspecto sin que nadie lo pidiera — lo cazó la
   comparación de píxeles, 0,156% en la sección de colecciones. */
.ix-btn i{ font-style:normal; }
.art{ width:100%; height:100%; display:block; }

/* ============================================================
   CONFIANZA + RESEÑAS
   Una sola franja morada continua (igual que el original):
   los íconos de confianza y las reseñas comparten fondo.
   Medidas tomadas del diseño a 1440px de ancho.
   ============================================================ */
/* height:auto desde que las reseñas salieron del build (están en
   src/html/reservado/). Con la altura fija de 803px, pensada para iconos MÁS
   reseñas, quedaba un rectángulo morado enorme y vacío. */
.trust{ width:100%; background:var(--nebula); padding:93px 0 100px; position:relative; }
/* max-width + margin auto: antes solo tenía padding-left:179px fijo, así que a
   1440 quedaba centrada de milagro (179 izq / 176 der) y de ahí en adelante se
   pegaba a la izquierda — a 2560 sobraban 1117px a la derecha. El diseño a 1440
   no cambia: el padding interno es el mismo. */
.trust-row{ display:flex; justify-content:flex-start; align-items:flex-start; gap:0;
  max-width:1440px; margin:0 auto; padding-left:179px; }
.trust-item{ display:flex; align-items:flex-start; gap:15px; }
/* Íconos: los mismos SVG de cosmica.com.co, en el <defs> de la página.
   Las cuatro casillas quedan iguales a 48x48; los PNG del mockup venían en
   cuatro tamaños distintos porque cada recorte traía su propio margen. */
/* Sin fondo: los cuatro iconos se recortaban como cuadrados blancos sobre la
   franja lila. El dibujo sigue oscuro, como en el diseño final — 3,6:1 sobre
   Nebula, por encima del 3:1 que pide un gráfico. */
.trust-ic{ background:transparent; display:grid; place-items:center; flex-shrink:0; color:var(--void); }
.trust-ic svg{ width:28px; height:28px; display:block; }
.trust-item h3{ font-family:var(--font-body); font-weight:500; font-size:18px; letter-spacing:0; line-height:1.3; color:#fff; margin-top:3px; margin-bottom:8.5px; }
.trust-item p{ font-size:14px; line-height:21px; letter-spacing:.02em; color:#fff; max-width:175px; }
.t1 .trust-ic, .t2 .trust-ic, .t3 .trust-ic, .t4 .trust-ic{ width:48px; height:48px; margin-top:1px; }
.t1 > div{ margin-top:1px; } .t2 > div{ margin-top:1px; } .t3 > div{ margin-top:5px; } .t4 > div{ margin-top:3px; margin-left:-6px; } .t4 h3{ margin-bottom:6.5px; }
.t1{ width:284px; } .t2{ width:301px; } .t3{ width:291px; }
.t1 p{ max-width:162px; } .t2 p{ max-width:172px; } .t3 p{ max-width:176px; } .t4 p{ max-width:152px; }

.rev-rule{ margin:0 102px; border-top:1px solid rgba(255,255,255,.22); }
.rev-h{ font-family:var(--font-display); font-weight:800; font-size:22px; letter-spacing:0; text-align:center; color:#fff; margin-top:80px; }
.rev-grid{ display:flex; gap:32px; padding-left:102px; margin-top:84px; }
.rev{ flex:0 0 358px; }
.rev:first-child{ margin-right:8px; }
.stars{ display:flex; gap:8px; margin:13px 0 14px 2px; }
.stars svg{ width:20px; height:20px; fill:#E68B0C; stroke:none; }
.rev h3{ font-family:var(--font-body); font-weight:400; font-size:20px; letter-spacing:0; line-height:24px; color:#FFD236; }
.rev p{ font-size:15px; line-height:21px; letter-spacing:.01em; color:#fff; margin-top:0; margin-bottom:16px; }
.rev-name{ display:block; font-size:15px; line-height:20px; color:#FFD236; }
.rev-date{ display:block; font-size:12px; line-height:16px; color:#fff; margin-top:4px; }
.trust .dots{ gap:11px; margin-top:48px; }
.trust .dots i{ width:12px; height:12px; background:#fff; }
.trust .dots i.on{ background:#1A1A1A; }

/* ============================================================
   BUSCADOR, CONTACTO Y CARRUSEL
   Ninguno existe en el diseño original: reusan el fondo del mega
   menú y el mecanismo de modal que ya tienen la ficha y el carrito.
   ============================================================ */

/* ---------- Buscador ---------- */
/* Cuelga del <body>, no del header (ver la nota en src/html/93-barra.html: dentro del
   hero lo recortaba su overflow:hidden). Eso obliga a dos cosas:
   - top en coordenadas de PÁGINA: 140 = 52 de la barra de anuncio + 88 de alto del
     nav. Las dos son fijas y no cambian en ninguna pantalla. Como es un número
     derivado, hay una prueba que comprueba que el borde de arriba del buscador cae
     justo en el de abajo del nav; si alguien toca la barra de anuncio, salta ahí.
   - z-index propio. Antes no hacía falta: era hijo de .site-header (8200) y heredaba
     su sitio en la pila. Tiene que quedar por encima de la barra flotante (8000) y
     también del header (8200), porque dentro del header vive el mega menú de
     "Tienda": con 8100 bastaba para la barra, pero pasar el cursor por "Tienda" con
     el buscador abierto pintaba el mega ENCIMA de los resultados. Medido: el toque
     en mitad del panel caía en un enlace del mega. */
.busca{
  position:absolute; left:0; right:0; top:140px; z-index:8300;
  background:#F1ECE6; color:#1A1A1A;
  opacity:0; transform:translateY(-8px); transition:opacity .18s, transform .18s;
}
.busca[hidden]{ display:none; }
.busca.open{ opacity:1; transform:none; }
.busca-in{ max-width:1440px; margin:0 auto; padding:26px 102px 32px; }
.busca-campo{
  display:flex; align-items:center; gap:12px;
  border-bottom:1px solid rgba(26,26,26,.25); padding-bottom:12px;
}
.busca-campo > svg{ width:20px; height:20px; flex:none; color:#555; stroke-width:1.7; }
.busca-campo input{
  flex:1; border:none; background:none; outline:none;
  font-family:var(--font-display); font-weight:600; font-size:22px; color:#1A1A1A;
}
.busca-campo input::placeholder{ color:#9a948a; font-weight:500; }
/* Chrome agrega su propia × a input[type=search]: sobra, ya tenemos la nuestra. */
.busca-campo input::-webkit-search-cancel-button{ -webkit-appearance:none; appearance:none; }
/* 44px de área táctil: el objetivo mínimo cómodo con el dedo. */
.busca-limpiar, .busca-x{
  display:grid; place-items:center; width:44px; height:44px; flex:none;
  background:none; color:#555; cursor:pointer; line-height:1;
}
.busca-limpiar{ font-size:20px; }
.busca-limpiar[hidden]{ display:none; }
.busca-x{ font-size:28px; }
.busca-limpiar:hover, .busca-x:hover{ color:#1A1A1A; }
.busca-limpiar:focus-visible, .busca-x:focus-visible{ outline:2px solid var(--nebula); outline-offset:-4px; border-radius:50%; }
.busca-res{ margin-top:18px; display:flex; flex-direction:column; }
.busca-item{
  display:flex; align-items:center; gap:16px; width:100%; padding:10px 6px;
  font:inherit; color:#1A1A1A; text-align:left; border-radius:10px; cursor:pointer;
}
.busca-item:hover, .busca-item:focus-visible{ background:rgba(26,26,26,.06); }
.busca-item img{ width:48px; height:48px; object-fit:cover; flex:none; background:#e4ded3; }
.busca-txt{ display:flex; flex-direction:column; gap:2px; flex:1; min-width:0; }
.busca-txt strong{ font-family:var(--font-display); font-weight:700; font-size:15px; }
.busca-txt em{ font-style:normal; font-size:12px; color:#6b655c; }
.busca-precio{ font-size:14px; color:#1A1A1A; white-space:nowrap; }
.busca-vacio{ color:#6b655c; font-size:14px; padding:6px; }

/* ---------- Contacto ---------- */
.cm{
  position:fixed; z-index:10001; left:50%; top:50%;
  width:min(460px, calc(100vw - 48px));
  transform:translate(-50%,-50%) scale(.97); opacity:0;
  transition:opacity .25s, transform .25s;
  background:var(--cosmic); color:var(--void); border-radius:16px; padding:40px 40px 34px;
}
.cm[hidden]{ display:none; }
.cm.open{ opacity:1; transform:translate(-50%,-50%); }
.cm h2{ font-size:34px; font-weight:800; }
.cm-sub{ margin-top:10px; font-size:15px; color:#555; }
.cm-datos{ margin:26px 0 0; border-top:1px solid #d6d0c4; }
.cm-datos div{
  display:flex; justify-content:space-between; align-items:center; gap:16px;
  height:52px; border-bottom:1px solid #d6d0c4; font-size:14px;
}
.cm-datos dt{ color:#6b655c; }
.cm-datos dd{ margin:0; }
.cm-datos a{ color:var(--void); text-decoration:underline; }
.cm-wa{ display:block; margin-top:26px; }
.cm-nota{ margin-top:16px; text-align:center; font-size:12px; color:#555; }
.cm-nota a{ text-decoration:underline; }

/* ---------- Puntos del carrusel ---------- */
.dots button{
  width:11px; height:11px; padding:0; border-radius:50%;
  background:var(--cosmic); border:none; cursor:pointer;
}
.dots button.on{ background:var(--nebula); }


/* ---------- Páginas del footer (Nuestra historia · Términos) ----------
   Mismo armazón que el modal de contacto, pero para leer: más ancho, con el
   cuerpo desplazable y la × fija fuera de ese scroll (Términos son 12.700
   caracteres y hay que poder llegar al final sin perder el botón de cerrar). */
.cm-pagina{
  width:min(720px, calc(100vw - 48px));
  height:min(85vh, 760px);
  padding:0; overflow:hidden;
  display:flex; flex-direction:column;
}
.pagina-cuerpo{
  flex:1; overflow-y:auto; overscroll-behavior:contain;
  padding:40px 44px 36px;
}
.cm-pagina h2{ font-size:32px; line-height:1.1; margin-bottom:22px; }
/* El color va en cada elemento, no solo en el contenedor: el reset trae
   p{color:rgba(242,237,228,.72)} para el fondo oscuro de la página, y por
   herencia no se gana — una regla de elemento le pega directo al hijo.
   Sin esto el texto salía color crema sobre fondo crema: invisible. */
.pagina-texto{ font-size:15px; line-height:1.62; }
.pagina-texto p, .pagina-texto li{ color:#3a3833; }
.pagina-texto p{ margin:0 0 15px; }
.pagina-texto ul{ list-style:disc; }
.pagina-texto h2, .pagina-texto h3, .pagina-texto h4{
  font-family:var(--font-display); font-weight:700; color:var(--void);
  font-size:17px; line-height:1.3; margin:26px 0 10px;
}
.pagina-texto ul, .pagina-texto ol{ margin:0 0 15px; padding-left:22px; }
.pagina-texto li{ margin-bottom:7px; }
.pagina-texto strong, .pagina-texto b{ font-weight:600; color:var(--void); }
.pagina-texto a{ color:var(--nebula); text-decoration:underline; }
.pg-src{ display:none; }

/* ============================================================
   PANEL DE FILTROS EN CELULAR
   ------------------------------------------------------------
   De 761px para arriba no existe: el panel sigue siendo el
   desplegable en línea de .pn (ver 20-secciones.css). Por debajo
   de 760 se convierte en un panel que entra desde la derecha,
   porque en una pantalla estrecha el desplegable empujaba la
   rejilla tan abajo que al cerrar no se sabía dónde estabas.
   ============================================================ */

/* La cabecera y el envoltorio existen siempre en el marcado, pero en escritorio
   no se ven: .pn-cuerpo es display:contents para que sus hijos sigan siendo
   celdas directas de la rejilla de seis columnas del panel de siempre. */
.pn-cab{ display:none; }
.pn-cuerpo{ display:contents; }
.pn-velo{ display:none; }

@media (max-width:760px){
  .pn{
    position:fixed; top:0; right:0; bottom:0; left:auto; z-index:9500;
    width:min(88vw,360px); margin:0; padding:0;
    border:none; border-left:1px solid var(--dust);
    display:flex; flex-direction:column; gap:0;
    transform:translateX(100%); transition:transform .28s cubic-bezier(.22,.61,.36,1);
    box-shadow:-18px 0 50px rgba(0,0,0,.55);
  }
  .pn.abierto{ transform:none; }

  .pn-cab{
    display:flex; align-items:center; justify-content:space-between;
    flex:none; padding:18px 20px; border-bottom:1px solid var(--dust);
  }
  .pn-cab h3{
    font-family:var(--font-display); font-weight:700; font-size:17px;
    letter-spacing:0; color:var(--cosmic);
  }
  .pn-x{
    width:36px; height:36px; margin-right:-8px; border-radius:50%;
    font-size:24px; line-height:1; color:var(--cosmic);
    display:grid; place-items:center;
  }
  .pn-x:focus-visible{ outline:2px solid var(--acid); outline-offset:2px; }

  /* Deja de ser display:contents: aquí sí es la caja que hace scroll. */
  .pn-cuerpo{
    display:flex; flex-direction:column; gap:24px;
    flex:1; min-height:0; overflow-y:auto; padding:20px 20px 0;
    overscroll-behavior:contain;   /* el gesto no se escapa a la página de atrás */
  }
  /* Pegado abajo dentro del cuerpo: se ve siempre, sin tener que bajar. El margen
     negativo lo saca a los bordes del panel y el fondo opaco hace de barra, con la
     lista pasando por debajo al desplazarse.
     align-self:stretch deshace el align-self:end que .go trae de la rejilla de
     escritorio: en una columna flex eso lo encogía al ancho del texto y lo pegaba
     a la derecha, encima de los colores. */
  .pn-cuerpo .go{
    position:sticky; bottom:0; margin:auto -20px 0; width:auto; align-self:stretch;
    border-radius:0; padding:17px; font-size:14px;
    box-shadow:0 -10px 20px rgba(26,26,26,.55);
  }

  .pn-velo{
    display:block; position:fixed; inset:0; z-index:9400;
    background:rgba(13,13,13,.6); backdrop-filter:blur(3px);
    opacity:0; transition:opacity .28s;
  }
  .pn-velo.abierto{ opacity:1; }
  .pn-velo[hidden]{ display:none; }
}

/* Quien pidió menos movimiento recibe el panel ya puesto, sin deslizamiento. */
@media (max-width:760px) and (prefers-reduced-motion: reduce){
  .pn, .pn-velo{ transition:none; }
}
/* ============================================================
   FOOTER
   ============================================================ */
.site-footer{ width:100%; background:var(--cosmic); color:#111; height:520px; padding-top:65px; }
.footer-grid{ display:grid; grid-template-columns:543px 207px 281px 1fr; height:344px; }
.flogo{ display:inline-block; position:relative; color:#0D0D0D; width:233px; }
.flogo-word{ display:block; font-family:var(--font-display); font-weight:800; font-size:30.3px; line-height:29px; letter-spacing:-.02em; white-space:nowrap; }
.flogo-deg{ position:absolute; left:237px; top:5px; width:17px; height:11px; border:3px solid var(--nebula); border-radius:50%; }
.flogo small{ display:block; font-family:var(--font-body); font-weight:400; font-size:11px; line-height:13px; letter-spacing:.22em; color:#8a8a8a; margin-top:4px; }
.footer-brand p{ color:#555; font-size:14.3px; line-height:27px; letter-spacing:.01em; margin-top:22.5px; max-width:340px; }
.footer-brand p b{ font-weight:500; color:#444; }
.footer-social{ display:flex; gap:12px; margin-top:48.5px; }
.footer-social a{ width:21px; height:21px; display:block; }
.footer-social img{ width:100%; height:100%; display:block; }
.fcol{ padding-top:18px; }
.fcol h4{ font-family:var(--font-display); font-weight:700; font-size:16px; line-height:20px; letter-spacing:0; margin-bottom:21px; color:#111; }
.fcol a{ display:block; font-family:var(--font-display); font-weight:500; font-size:15px; line-height:18px; letter-spacing:.015em; color:#111; }
.fc-tienda a{ margin-bottom:20px; } .fc-ayuda a{ margin-bottom:19px; } .fc-marca a{ margin-bottom:15px; }
.fcol a:hover, .fcol a:focus-visible{ color:var(--nebula); }
.footer-bottom{ display:flex; justify-content:space-between; align-items:center; height:58px; }
.copy{ font-size:14.3px; color:#111; letter-spacing:.02em; padding-left:4px; position:relative; top:1.5px; }
.pay{ display:flex; align-items:flex-end; height:59px; padding-right:10px; }
.pay-label{ align-self:center; margin:0 18px 0 0; font-size:14.5px; color:#111; }
/* Los logos llegaron en JPEG con fondo blanco y el pie es crema (#F2EDE4): a secas
   se verían cuatro rectángulos blancos recortados sobre el fondo. Esto los funde sin
   tener que recortarlos a mano a PNG con transparencia.

   darken y no multiply, y la diferencia se ve. darken se queda con el valor más
   oscuro de cada canal; multiply los multiplica, así que oscurece también lo que ya
   era casi blanco. La imagen de las tarjetas trae cada logo dentro de su propia caja
   gris (241,241,241) horneada en el archivo: con multiply esa caja acababa en
   229,224,215 y se veía como un recuadro sobre el crema; con darken queda en
   241,237,228, que es el crema. Los colores de los logos no se tocan en ninguno de
   los dos casos (el azul de Mercado Pago o el rojo de MasterCard ya son más oscuros
   que el fondo en todos los canales).

   Ojo si alguna vez se oscurece el pie: darken sobre un fondo oscuro deja los logos
   negros. Va atado a que .site-footer siga siendo claro. */
.pay img{ display:block; mix-blend-mode:darken; }
/* Alturas distintas a propósito: cada logo trae su propio aire dentro del archivo,
   así que igualarlos por altura los dejaría ópticamente de tamaños distintos.
   Los anchos salen de la proporción real de cada imagen. */
.pay-mp{ width:74px; height:30px; margin-bottom:9px; }
.pay-tj{ width:173px; height:26px; margin:0 0 11px 16px; }
.pay-nq{ width:66px; height:44px; margin:0 0 2px 14px; }
.pay-bt{ width:30px; height:30px; margin:0 0 9px 14px; }

/* ============================================================
   BARRA FLOTANTE (al hacer scroll)
   ------------------------------------------------------------
   No reemplaza al header del hero: es otra barra, que aparece
   cuando el header original ya quedó arriba. Burbujas, como el
   logo mínimo del Brand Book.
   ============================================================ */
.hdr-mini{
  position:fixed; top:14px; left:0; right:0; z-index:8000;
  display:flex; align-items:center; justify-content:space-between;
  padding:0 22px; pointer-events:none;
  opacity:0; transform:translateY(-10px); transition:opacity .2s ease, transform .2s ease;
}
.hdr-mini[hidden]{ display:none; }
.hdr-mini.on{ opacity:1; transform:none; }
.hdr-mini > *{ pointer-events:auto; }

/* Burbuja negra con la C° en Cosmic — el sello de marca del Brand Book. El borde
   claro y el desenfoque son lo que la hace visible: sobre el fondo Void de la página
   un círculo negro a secas desaparecería. */
.hm-logo, .hm-b{
  width:48px; height:48px; border-radius:50%; position:relative;
  background:rgba(13,13,13,.78); color:var(--cosmic);
  border:1px solid rgba(242,237,228,.22); backdrop-filter:blur(8px);
  box-shadow:0 4px 18px rgba(0,0,0,.45);
}
.hm-logo{
  display:block; text-align:center; line-height:46px;
  font-family:var(--font-display); font-weight:700; font-size:21px; letter-spacing:0;
}
/* Peso 700 y no 800: en Syne ExtraBold la C aislada se cierra tanto que se lee "O".
   El ° va más pequeño y arriba, como en el logo completo. */
.hm-deg{ font-style:normal; color:var(--nebula); font-size:13px; vertical-align:super; margin-left:1px; }
.hm-acts{ display:flex; gap:10px; }
.hm-b{
  display:grid; place-items:center; cursor:pointer;
  transition:background .16s, color .16s, border-color .16s;
}
.hm-b svg{ width:20px; height:20px; stroke-width:1.7; }
.hm-b:hover, .hm-logo:hover{ background:var(--cosmic); color:var(--void); border-color:var(--cosmic); }
.hm-logo:focus-visible, .hm-b:focus-visible{ outline:2px solid var(--acid); outline-offset:3px; }
@media (min-width:1101px){ .hdr-mini{ padding:0 48px; } }

/* El panel del buscador cuelga del header del hero. Abierto desde la barra flotante
   tiene que fijarse al viewport, si no se abriría fuera de pantalla. */
.busca.fija{ position:fixed; top:0; box-shadow:0 10px 30px rgba(0,0,0,.25); }

.tabs [data-tabname]{ cursor:pointer; }

/* ======================= PRODUCTO (modal) + CARRITO (drawer) ======================= */
.card{ cursor:pointer; }
.card:focus-visible{ outline:2px solid var(--acid); outline-offset:4px; }
.add{ border:none; cursor:pointer; }
.cart-count{ position:absolute; top:-7px; right:-9px; min-width:16px; height:16px; padding:0 4px; border-radius:8px; background:var(--acid); color:var(--void); font:700 10px/16px var(--font-display); text-align:center; }
.nav-icons button, .hm-b{ position:relative; }
.cart-count[hidden]{ display:none; }

/* pointer-events:none cuando está apagado, y no es cosmético. El velo tapa la
   ventana entera y se esconde con un setTimeout de 300ms; durante esos 300ms, y en
   cualquier camino que lo dejara sin ocultar, un velo a opacidad 0 SIGUE recibiendo
   todos los toques. Lo que se ve entonces es la página, intacta y quieta: no parece
   un velo, parece que el scroll se trabó. Medido: con hidden=false y sin .open, el
   toque en el centro de la pantalla lo recibe #ov.
   Así el estado invisible es también intocable, y ese síntoma deja de ser posible. */
.ov{ position:fixed; inset:0; z-index:10000; background:rgba(13,13,13,.72); backdrop-filter:blur(4px); opacity:0; transition:opacity .3s; }
.ov:not(.open){ pointer-events:none; }
.ov.open{ opacity:1; }
.ov[hidden],.pm[hidden],.cart[hidden]{ display:none; }

/* Modal de producto — "Detalle de pieza · hoja Cosmic sobre el catálogo" (Opción B) */
/* Franja de ancho completo, sin esquinas redondeadas, centrada en vertical.
   (Sustituye a la "paleta que subía desde abajo" de la ronda anterior.)
   El panel va de borde a borde, pero el CONTENIDO lleva max-width: estirar tres
   columnas a lo ancho de un monitor de 2560px no se lee. */
.pm{ position:fixed; z-index:10001; left:0; right:0; top:50%; width:100%;
  max-height:92vh; border-radius:0; overflow:hidden;
  display:flex; flex-direction:column;
  background:var(--cosmic); color:var(--void);
  opacity:0; transform:translateY(calc(-50% + 22px));
  transition:opacity .3s, transform .34s cubic-bezier(.2,.8,.2,1); }
.pm.open{ opacity:1; transform:translateY(-50%); }
/* El desplazamiento vive en el cuerpo: la × es hija de .pm y por eso no se va con él.
   align-content:start es obligatorio: con height:100% el grid repartía el alto
   entre las filas y, cuando el contenido pasaba de su fila, se montaba encima de
   la siguiente. Se vio en móvil, donde las tres partes van apiladas. */
.pm-body{ flex:1; min-height:0; overflow:auto; overscroll-behavior:contain;
  width:100%; max-width:1440px; margin:0 auto;
  display:grid; grid-template-columns:70px 363px minmax(0,1fr); column-gap:14px;
  align-items:start; align-content:start;
  padding:26px 41px 26px 28px; }
.pm-x,.cart-x{ position:absolute; top:22px; right:26px; width:24px; height:24px; background:none; color:#555; font-size:22px; line-height:24px; z-index:3; }
/* Botón redondo claro: la × se queda encima del contenido que pasa por debajo. */
.pm-x{ width:34px; height:34px; line-height:34px; border-radius:50%; background:rgba(242,237,228,.92); backdrop-filter:blur(4px); text-align:center; }
.pm-x:hover,.cart-x:hover{ color:var(--void); }
.pm-thumbs{ display:flex; flex-direction:column; gap:10px; max-height:548px; overflow-y:auto; scrollbar-width:thin; }
.pm-thumbs button{ flex:0 0 auto; }
.pm-thumbs button{ width:70px; height:70px; padding:0; background:#e9e3d8; border:1px solid #d6d0c4; overflow:hidden; }
.pm-thumbs button.on{ border-color:var(--nebula); }
.pm-thumbs img{ width:100%; height:100%; object-fit:cover; display:block; }
.pm-main{ width:363px; height:548px; background:var(--void); overflow:hidden; }
.pm-main img{ width:100%; height:100%; object-fit:cover; display:block; }
/* min-height en vez de height: con las especificaciones arriba y los atributos
   en dos columnas, el contenido pasa de 548px. Con la altura fija, .pm-buy
   —que lleva margin-top:auto— se quedaba anclado a 548 y el botón se montaba
   encima de los atributos. */
.pm-info{ min-height:548px; margin-left:52px; padding-top:20px; display:flex; flex-direction:column; }
.pm-cat{ font-size:13px; color:#555; line-height:1.2; }
.pm-info h2{ font-weight:800; font-size:48px; line-height:1; letter-spacing:-.02em; margin-top:8px; }
.pm-price{ color:var(--void); font-family:var(--font-display); font-weight:700; font-size:24px; letter-spacing:-.02em; margin-top:2px; }
.pm-av{ font-size:13px; color:var(--void); margin-top:8px; }
.pm-av .dot{ background:#5c9a00; }
.pm-av .one{ color:#d7264b; }
.pm-desc{ color:#3a3833; font-size:15px; line-height:1.4; margin-top:18px; }
/* Opciones de variante (Color / Joya). No existen en el diseño original —
   38 de 66 productos las necesitan — así que reusan la tipografía de la ficha. */
.pm-opts{ margin-top:18px; }
/* En escritorio, los atributos lado a lado: Color y Joya caben en una fila y
   la ficha deja de crecer hacia abajo. */
@media (min-width:1101px){
  .pm-opts:not([hidden]){ display:grid; grid-template-columns:1fr 1fr; gap:18px 24px; }
  .pm-opt + .pm-opt{ margin-top:0; }
}
.pm-opts[hidden]{ display:none; }
.pm-opt + .pm-opt{ margin-top:12px; }
.pm-opt h4{
  font-family:var(--font-body); font-weight:500; font-size:12px; letter-spacing:.04em;
  text-transform:uppercase; color:#6b655c; margin-bottom:8px;
}
.pm-chips{ display:flex; flex-wrap:wrap; gap:8px; }
.pm-chips button{
  border:1px solid #d6d0c4; border-radius:30px; padding:7px 14px;
  font-size:13px; color:#3a3833; background:transparent; cursor:pointer;
  transition:border-color .15s, background .15s, color .15s;
}
.pm-chips button:hover{ border-color:#8e887c; }
.pm-chips button.on{ background:var(--void); border-color:var(--void); color:var(--cosmic); }

.pm-spec{ margin:16px 0 0; border-top:1px solid #d6d0c4; }
.pm-spec div{ display:flex; justify-content:space-between; align-items:center; gap:16px; height:44px; border-bottom:1px solid #d6d0c4; font-size:14px; }
/* El display:flex de arriba pisa el display:none que el navegador le da a
   [hidden], así que una fila oculta seguía pintándose con el valor vacío. Pasa
   siempre que se le pone display a un elemento que luego se oculta por atributo. */
.pm-spec div[hidden]{ display:none; }
.pm-spec dt{ color:#6b655c; }
.pm-spec dd{ margin:0; text-align:right; }
/* margin-top:auto lo empuja al fondo cuando sobra sitio; el padding garantiza
   los 18px de separación —el mismo que usan .pm-desc y .pm-opts— cuando el
   contenido llena la columna y el auto se resuelve en 0. */
.pm-buy{ margin-top:auto; padding-top:18px; }
.pm-cta{ display:block; width:100%; height:52px; border-radius:999px; background:var(--void); color:var(--cosmic); font:700 16px var(--font-display); transition:opacity .18s; }
.pm-cta:hover{ opacity:.88; }
.pm-cta:disabled{ opacity:.45; cursor:default; }
.pm-note{ margin-top:16px; text-align:center; font-size:12px; color:#555; }

/* Carrito — "drawer lateral" (Opción B) */
.cart{ position:fixed; z-index:10002; top:0; right:0; bottom:0; width:420px; max-width:100vw; display:flex; flex-direction:column; background:var(--cosmic); color:var(--void);
  transform:translateX(100%); transition:transform .35s cubic-bezier(.2,.8,.2,1); }
.cart.open{ transform:none; }
.cart-h{ padding:30px 26px 0; position:relative; }
.cart-h h2{ font-weight:700; font-size:22px; letter-spacing:-.01em; line-height:1.2; }
.cart-n{ font-size:13px; color:#6b655c; margin-top:4px; }
.cart-list{ flex:0 1 auto; overflow:auto; padding:0 26px; margin-top:16px; }
.cart-empty{ font-size:14px; color:#6b655c; padding:20px 0; }
.ci{ display:grid; grid-template-columns:64px 1fr; gap:14px; padding:20px 0 24px; border-bottom:1px solid #d6d0c4; }
.ci:first-child{ padding-top:8px; }
.ci-th{ width:64px; height:64px; background:var(--void); display:grid; place-items:center; }
.ci-th svg{ width:58%; color:var(--c); }
.ci-th img{ width:100%; height:100%; object-fit:cover; display:block; }
.ci-t{ display:flex; justify-content:space-between; gap:12px; font-size:15px; line-height:1.3; }
.ci-m{ display:flex; justify-content:space-between; gap:12px; margin-top:4px; font-size:12px; color:#6b655c; }
.ci-rm{ font-size:12px; color:#6b655c; text-decoration:underline; }
.qty{ display:inline-flex; align-items:center; justify-content:space-between; width:97px; height:24px; margin-top:12px; border:1px solid #cfc8bb; border-radius:999px; }
.qty button{ width:32px; height:100%; font-size:13px; color:var(--void); }
.qty button:disabled{ opacity:.3; cursor:default; }
.qty span{ font-size:12px; }
.cart-ship{ padding:16px 26px 0; }
.cart-ship[hidden]{ display:none; }
.cart-ship .bar{ height:4px; background:#d6d0c4; }
.cart-ship .bar i{ display:block; height:100%; width:0; background:var(--nebula); transition:width .3s; }
.cart-ship p{ margin-top:12px; font-size:12px; color:#6b655c; }
.cart-f{ margin-top:auto; padding:20px 26px 28px; }
.cart-sub{ display:flex; justify-content:space-between; align-items:baseline; font-family:var(--font-display); font-weight:700; font-size:20px; letter-spacing:-.01em; }
.cart-wa{ display:block; margin-top:18px; height:56px; text-align:center; border-radius:999px; background:var(--acid); color:var(--void); border:2px solid var(--void); font:700 16px/52px var(--font-display); text-decoration:none; transition:opacity .18s; }
.cart-wa:hover{ opacity:.9; }
.cart-wa.off{ opacity:.4; pointer-events:none; }
.cart-note{ margin-top:16px; text-align:center; font-size:12px; line-height:1.5; color:#7a7468; }


/* Anillo de foco de marca: la × recibe el foco al abrir cualquier panel y el
   azul del navegador se ve fuera de sitio sobre el fondo Cosmic. */
.pm-x:focus-visible, .cart-x:focus-visible, .mmenu-x:focus-visible{
  outline:2px solid var(--nebula); outline-offset:2px; border-radius:50%;
}

/* Enlace a la ficha de WooCommerce: discreto, debajo del botón de comprar.
   Es el camino a la tienda real — donde está el checkout que cobra. */
.pm-ficha{
  display:block; margin-top:10px; text-align:center;
  font-size:13px; color:#6b655c; text-decoration:underline;
}
.pm-ficha:hover{ color:var(--void); }
.pm-ficha[hidden]{ display:none; }

/* Chips de variante con miniatura: WooCommerce ya muestra el color como imagen
   (plugin wcboost-variation-swatches) y la one-page hace lo mismo. El build saca
   esas miniaturas de la ficha pública; los atributos sin imagen (Joya, Tamaño)
   siguen siendo chips de texto, así que los dos conviven en la misma fila. */
.pm-chips button.pm-chip-img{
  padding:0; width:46px; height:46px; border-radius:50%; overflow:hidden;
  border:2px solid #d6d0c4; background:#e9e3d8;
}
.pm-chips button.pm-chip-img img{ width:100%; height:100%; object-fit:cover; display:block; }
.pm-chips button.pm-chip-img.on{ border-color:var(--void); }
.pm-chips button.pm-chip-img:hover{ border-color:#8e887c; }
.pm-chips button.pm-chip-img.on:hover{ border-color:var(--void); }

/* La foto grande se cruza al cambiar de variación. */
#pm-img{ transition:opacity .22s ease; }
#pm-img.pm-cambiando{ opacity:0; }
@media (prefers-reduced-motion: reduce){ #pm-img{ transition:none; } }

/* ---- Zoom manual de la foto ---- */
.pm-main{ position:relative; }
#pm-img{ transform-origin:center center; }
#pm-img.pm-sin-transicion{ transition:none; }
.pm-main.pm-ampliada{ cursor:grab; touch-action:none; }
.pm-main.pm-ampliada:active{ cursor:grabbing; }

/* Burbujas abajo de la foto, centradas. Mismo tratamiento que las de la barra
   flotante: fondo oscuro translúcido y borde claro, que es lo que las hace
   visibles tanto sobre una foto clara como sobre una oscura. */
.pm-zoom{
  position:absolute; left:50%; bottom:14px; transform:translateX(-50%);
  display:flex; gap:8px; z-index:2;
}
.pm-zoom button{
  width:36px; height:36px; border-radius:50%; cursor:pointer;
  background:rgba(13,13,13,.72); color:var(--cosmic);
  border:1px solid rgba(242,237,228,.28); backdrop-filter:blur(6px);
  font:400 17px/1 var(--font-body); display:grid; place-items:center;
  transition:background .15s, color .15s, opacity .15s;
}
.pm-zoom button:hover:not(:disabled){ background:var(--cosmic); color:var(--void); }
.pm-zoom button:disabled{ opacity:.35; cursor:default; }
.pm-zoom button:focus-visible{ outline:2px solid var(--nebula); outline-offset:2px; }
/* ---------- Hecho a mano (Opción B) ---------- */
.sec-hecho{ width:100%; background:var(--void); padding:60px 0 100px; }
.hecho{ display:flex; align-items:center; justify-content:space-between; gap:40px; }
.hecho-t{ max-width:600px; }
.hecho-t h2{ font-weight:800; font-size:70px; line-height:1.04; white-space:nowrap; letter-spacing:-.02em; color:var(--cosmic); }
.hecho-lead{ margin-top:24px; max-width:560px; font-size:17px; line-height:1.55; color:rgba(242,237,228,.68); }
/* Tres notas cortas. "Tu forma de vestir" va primera y a un cuerpo mayor: es la
   que más pesa de las tres. El conjunto se mide para no pasar de 800px de alto. */
.hecho-notas{ margin-top:26px; max-width:560px; display:flex; flex-direction:column; gap:16px; }
.hecho-notas h3{
  font-family:var(--font-display); font-weight:700; font-size:11px; line-height:1;
  letter-spacing:.16em; text-transform:uppercase; color:var(--nebula-lt); margin-bottom:5px;
}
.hecho-notas p{ font-size:14.5px; line-height:1.5; color:rgba(242,237,228,.6); }
.hecho-notas .hn-alta p{ font-size:16.5px; line-height:1.5; color:rgba(242,237,228,.82); }
.hecho-notas .hn-alta h3{ color:var(--acid); }
/* Las tres primeras letras de "Colombia", en los colores de marca. Tokens que ya
   existen (ver 00-tokens.css): no se introduce ningún literal nuevo. */
.hecho-t h2 .hc-c{ color:var(--gold); }
.hecho-t h2 .hc-o{ color:var(--neon); }
.hecho-t h2 .hc-l{ color:var(--flux); }
/* Enlace a "Nuestra historia". El mismo texto vive en el footer; aquí es donde
   la gente lo busca, justo después de leer de qué va la marca. Subrayado con
   borde y no con text-decoration para poder separarlo del texto. */
.hecho-mas{
  display:inline-block; margin-top:26px; font-family:var(--font-display); font-weight:600;
  font-size:15px; letter-spacing:.02em; color:var(--cosmic);
  border-bottom:1.5px solid var(--nebula); padding-bottom:4px; transition:color .18s, border-color .18s;
}
.hecho-mas i{ font-style:normal; color:var(--nebula); }
.hecho-mas:hover{ color:var(--nebula-lt); border-color:var(--nebula-lt); }
.hecho-mas:focus-visible{ outline:2px solid var(--acid); outline-offset:4px; }

.hecho-im{ width:470px; height:470px; object-fit:cover; display:block; flex:none; }

/* ============================================================
   PREGUNTAS FRECUENTES (Opción B)
   Proporciones tomadas del lienzo de B, que está a 1440px 1:1:
   columna de título 30,92% / acordeón 69,08%, filas de 63px,
   líneas divisorias en Dust y 101px de aire antes de la franja morada.
   El acordeón es <details>/<summary> nativo: sin JavaScript.
   ============================================================ */
.faq{ width:100%; background:var(--void); padding:0 0 101px; }
.faq-grid{ display:grid; grid-template-columns:30.92% 69.08%; align-items:start; }
.faq h2{
  font-family:var(--font-display); font-weight:700; font-size:39px; line-height:39px;
  color:var(--cosmic); padding-top:1px;
}
.faq-list{ border-bottom:1px solid var(--dust); }
.faq details{ border-top:1px solid var(--dust); }
.faq summary{
  display:flex; align-items:center; justify-content:space-between; gap:20px;
  height:62px; cursor:pointer; list-style:none;
  font-family:var(--font-display); font-weight:700; font-size:18px; color:var(--cosmic);
}
.faq summary::-webkit-details-marker{ display:none; }
.faq summary::after{
  content:'+'; font-family:var(--font-body); font-weight:300; font-size:21px; line-height:1;
  color:var(--cosmic); flex:none;
}
.faq details[open] summary::after{ content:'−'; }
.faq details p{
  font-size:15px; line-height:1.56; color:rgba(242,237,228,.62);
  max-width:616px; margin-top:-4px; padding-bottom:14px;
}
/* El reset global deja los enlaces con color:inherit y sin subrayado, que está bien
   en el menú y en el pie —donde se sabe que son enlaces por dónde están— pero no en
   mitad de un párrafo: ahí la única señal de que se puede tocar es cómo se ve.
   Subrayado separado del texto y el color entero de la marca frente al 62% del
   párrafo, que es lo que lo despega. */
.faq details p a{
  color:var(--cosmic); text-decoration:underline;
  text-underline-offset:3px; text-decoration-thickness:1px;
  text-decoration-color:rgba(242,237,228,.5);
  transition:color .16s, text-decoration-color .16s;
}
.faq details p a:hover, .faq details p a:focus-visible{
  color:var(--acid); text-decoration-color:var(--acid);
}
.faq details p a:focus-visible{ outline:2px solid var(--acid); outline-offset:3px; border-radius:2px; }

/* ---------- Aviso de cookies ----------
   Abajo y a lo ancho, por encima de todo menos de los paneles (la ficha es
   10001 y el carrito 10002; esto va por debajo a propósito: si alguien abre una
   pieza, el aviso no se le pone encima del botón de comprar). */
.cookies{
  position:fixed; left:0; right:0; bottom:0; z-index:9000;
  display:flex; align-items:center; justify-content:center; gap:18px; flex-wrap:wrap;
  padding:14px 22px calc(14px + env(safe-area-inset-bottom, 0px));
  background:var(--ink); color:rgba(242,237,228,.86);
  border-top:1px solid var(--dust);
}
/* Sin esto, el display:flex de arriba pisa el display:none que el navegador da a
   [hidden] y la barra se ve SIEMPRE: tanto a quien no debería verla como después
   de pulsar un botón. Todos los demás paneles del proyecto (.pm, .cart, .cm,
   .mmenu, .busca, .hdr-mini) llevan su regla equivalente; esta faltaba. */
.cookies[hidden]{ display:none; }
.cookies p{ font-size:13px; line-height:1.45; margin:0; max-width:560px; }
.cookies b{ color:var(--cosmic); font-weight:600; }
.cookies a{ color:var(--acid); text-decoration:underline; text-underline-offset:3px; }
.cookies-btns{ display:flex; gap:10px; flex:none; }
.cookies button{
  font-family:var(--font-display); font-weight:700; font-size:13px;
  padding:10px 18px; border-radius:30px; white-space:nowrap;
}
.ck-si{ background:var(--acid); color:var(--void); }
.ck-no{ background:transparent; color:rgba(242,237,228,.72); border:1px solid var(--dust); }
.ck-no:hover{ color:var(--cosmic); }
/* ============================================================
   RESPONSIVE — SIEMPRE EL ÚLTIMO ARCHIVO
   ------------------------------------------------------------
   Va al final a propósito: así ninguna regla base puede anular
   un media query por venir después. Si añades un bloque nuevo,
   que sea aquí o en un archivo con número mayor que 90.
   Escritorio (1440px) replica el diseño al píxel; por debajo
   se reacomoda en tablet y mobile.
   ============================================================ */

@media (max-width: 1100px){
  .hero{ height:560px; }
  .nav::after{ left:48px; right:48px; }
  .logo{ left:48px; }
  .nav-links{ display:none; }
  .nav-icons{ right:48px; }
  .nav-burger{ display:block !important; }
  .mega{ display:none; }
  .hero-content h1{ top:290px; font-size:40px; line-height:44px; }
  .hero-cta{ top:370px; }
  .wrap, .sec-lonuevo .wrap, .sec-edit .wrap{ padding:0 48px; }
  .busca-in{ padding:22px 48px 28px; }
  .edit-grid{ grid-template-columns:1fr 1fr; grid-template-rows:auto; }
  .ed-sets{ grid-column:1 / 3; grid-row:auto; height:420px; }
  .ed-pendientes{ grid-column:1 / 3; grid-row:auto; height:300px; }
  .ed-anillos,.ed-collares{ grid-column:auto; grid-row:auto; height:300px; }
  .trust{ height:auto; padding:56px 0 64px; }
  .trust-row{ flex-wrap:wrap; gap:32px 40px; height:auto; padding:0 48px; }
  .t1,.t2,.t3{ width:auto; }
  .rev-rule{ margin:56px 48px 0; }
  .rev-h{ margin-top:56px; }
  .rev-grid{ padding-left:48px; margin-top:40px; overflow-x:auto; }
  .site-footer{ height:auto; padding-bottom:32px; }
  .footer-grid{ grid-template-columns:1fr 1fr; height:auto; gap:32px; }
  .footer-bottom{ height:auto; flex-wrap:wrap; gap:16px; margin-top:24px; }
  .pn{ grid-template-columns:1fr 1fr 1fr; }
  .pn .go{ grid-column:1 / -1; justify-self:end; width:176px; }
  .solo-disp{ margin-left:0; }
}
@media (max-width: 760px){
  .hero{ height:520px; }
  /* En una pantalla estrecha la foto apaisada pierde 599 de sus 989px de ancho, y
     centrada el recorte caía sobre el pelo negro de la modelo justo debajo del
     logo, que es casi negro: desaparecía media palabra. Desplazando el encuadre
     al 30% el logo queda entero sobre el cuero rosa claro y la cara sigue bien
     encuadrada. Probé 0 / 18 / 30 / 70%: a 0 se pierde la modelo, a 70 vuelve el
     pelo. 30 es el único que resuelve las dos cosas. */
  .hero-bg{ object-position:30% center; }
  .nav::after{ left:22px; right:22px; }
  .logo{ left:22px; transform:scale(.72); transform-origin:left top; }
  .nav-icons{ right:22px; gap:12px; }
  .hero-content h1{ top:258px; font-size:28px; line-height:34px; padding:0 16px; }
  .hero-cta{ top:350px; gap:10px; }
  .hero-cta .btn, .hero-cta .btn-outline{ width:150px; font-size:13px; }
  .ed-label{ font-size:20px; }
  .wrap, .sec-lonuevo .wrap, .sec-edit .wrap{ padding:0 22px; }
  .busca-in{ padding:18px 22px 24px; }
  .busca-campo input{ font-size:18px; }
  .cm{ padding:30px 24px 26px; } .cm h2{ font-size:28px; }
  .cm-pagina{ padding:0; height:88vh; height:88dvh; } .pagina-cuerpo{ padding:28px 22px 26px; }
  .cm-pagina h2{ font-size:26px; }
  /* 20px y no 16: el botón "+" ahora asoma 15px por la esquina de cada tarjeta
     (ver .add en 20-secciones.css) y con 16 rozaba la tarjeta de al lado. */
  .nu-grid,.grid,.nu-grupo{ grid-template-columns:repeat(2, 1fr); gap:20px; }
  /* El hueco entre grupos no es decorativo: es el sitio por el que asoma el botón
     "+" sin que se vea el grupo de al lado. Tiene que ser el mismo que en
     escritorio, porque el JS lo tiene en cuenta al desplazar la pista. */
  .nu-grid.nu-pista{ gap:32px; }
  .sec-lonuevo{ padding:64px 0 64px; }
  .edit-grid{ grid-template-columns:1fr; }
  .ed-sets,.ed-pendientes,.ed-anillos,.ed-collares{ grid-column:1; height:320px; }
  .ed-pendientes img{ object-position:22% 85%; }
  .tabs{ gap:18px; overflow-x:auto; white-space:nowrap; }
  /* Por debajo de 760 el panel de filtros deja de ser una rejilla en línea y pasa
     a ser el panel lateral de 40-paneles.css. Lo único que queda aquí es deshacer
     el ancho fijo que le puso el tramo de 1100, que también alcanza a este: este
     archivo va después y ganaría. */
  .pn .go{ grid-column:auto; justify-self:stretch; width:auto; }
  .fb{ row-gap:14px; }
  /* overscroll-behavior:contain — la tira es el único scroller horizontal de la
     página, y sin esto el gesto se encadena al documento de atrás. */
  .pm-thumbs{ max-height:none; overflow-x:auto; overflow-y:visible; overscroll-behavior:contain; }
  .pg{ margin-top:32px; }
  /* El botón al lado del nombre, no debajo. Antes la rejilla era
     "icon title" / "icon count" / "btn btn" y el botón se llevaba una fila entera.
     Ahora son tres columnas y el botón ocupa las dos filas, centrado.

     El sitio para el nombre no sale solo de bajar la fuente: medido a 390px, el más
     largo ("Lucky Year°") mide 281px a 30, 224 a 24 y 187 a 20 — ni a 20 cabía en los
     182px que quedaban. Hay que sacarlo también de los lados: el icono baja de 48 a
     40, el hueco de 22 a 12 y el botón se aprieta. Con eso quedan 222px.

     Y la fuente va fluida en vez de fija: 20px es el suelo (por debajo deja de leerse
     como titular) y 26 el techo (el valor de escritorio es 30). Comprobado que los
     cinco nombres caben en una línea de 360px para arriba; a 320 el más largo se
     parte en dos y el botón sigue al lado, que es lo que importa. */
  .ix{
    grid-template-columns:36px 1fr auto;
    /* En celular no cabe una columna propia, así que la descripción baja a su
       propia fila — pero alineada con el nombre y el lema, sin meterse debajo del
       icono ni del botón: la descripción solo ocupa la columna del centro.
       El icono y el botón, en cambio, SÍ abarcan las tres filas: así se centran
       contra el alto real de la tarjeta en vez de quedarse arriba, que es como se
       veían cuando solo abarcaban las dos primeras. */
    grid-template-areas:"icon title btn" "icon count btn" "icon desc btn";
    /* 16px de separación entre columnas, no 12. Los 4px extra NO salen de la
       columna del nombre —ahí no hay de dónde: a 360px "Lucky Year°" ya roza el
       límite y con 15px se parte en dos líneas— sino de recortar el icono de 40
       a 36 y el aire del botón de 14 a 12. Medido a 360/390/430: ni un nombre
       partido y la descripción conserva exactamente el ancho que tenía. */
    column-gap:16px; row-gap:4px; padding:20px 0;
  }
  .ic{ grid-area:icon; width:36px; height:36px; align-self:center; }
  .ixt{ grid-area:title; }
  .ixt h3{ font-size:clamp(20px, 5.6vw, 26px); line-height:1.1; }
  .ixt p{ font-size:12px; }
  /* En celular la descripción queda debajo del lema, dentro del área "title",
     con el botón al lado — por eso el cuerpo baja un punto: la columna mide
     unos 220px y el texto tiene que caber en dos líneas sin recortarse. */
  .ix-desc{ grid-area:desc; font-size:11.5px; line-height:1.4; margin-top:6px; -webkit-line-clamp:3; }
  .ix em{ grid-area:count; text-align:left; }
  /* Centrado contra el alto completo de la tarjeta, igual que el icono. */
  .ix-btn{ grid-area:btn; align-self:center; padding:9px 12px; }
  /* "Ver colección ↓" -> "Ver ↓". La palabra va en su propio <i> justo para esto. */
  .ix-btn i{ display:none; }
  /* Los anchos de .t1-.t4 (284, 301, 291px) y los max-width de los <p> (162-176px)
     vienen del diseño de 1440, donde las cuatro casillas van en fila. En una pantalla
     de 390 dejaban el bloque pegado a la izquierda con un hueco muerto a la derecha.
     Aquí se sueltan: cada casilla usa el ancho que hay, y la columna va centrada. */
  .trust-row{ padding:0 22px; flex-direction:column; align-items:center; }
  .trust-item{ width:100%; max-width:420px; }
  /* width:100% y NO auto. Con auto cada casilla se encogía a su contenido y, al ir
     la columna centrada, cada una se centraba por su cuenta: los cuatro iconos
     acababan en sitios distintos —medido a 430px: 65, 22, 22 y 38— y la franja se
     veía desordenada. Esto es lo que hace que compartan borde izquierdo. */
  .t1, .t2, .t3, .t4{ width:100%; }
  .t1 p, .t2 p, .t3 p, .t4 p, .trust-item p{ max-width:none; }
  .t4 > div{ margin-left:0; }
  .rev-rule{ margin:48px 22px 0; }
  .rev-grid{ padding-left:22px; }
  .rev{ flex:0 0 280px; }
  .footer-grid{ grid-template-columns:1fr; }
  /* height:auto: el alto de 59px venía del diseño de 1440, donde los logos van en
     una sola fila. Aquí se envuelven y con el alto fijo se salían de su caja —se veía
     media fila de logos cortada por abajo. Las alturas dejan de colgar del borde de
     abajo (los márgenes del diseño ancho) y se centran entre ellas. */
  .pay{ flex-wrap:wrap; height:auto; align-items:center; row-gap:14px; }
  .pay img{ margin-bottom:0; margin-top:0; }
  .pay-label{ flex:0 0 100%; margin:0 0 4px; }
}

/* Desde 1101px la hamburguesa abre un panel lateral por la derecha en vez de
   tomarse la pantalla entera: en escritorio hay sitio de sobra y tapar todo
   para enseñar ocho enlaces es desproporcionado. */
@media (min-width:1101px){
  .mmenu{ background:rgba(13,13,13,.5); backdrop-filter:blur(2px); }
  .mmenu-panel{
    left:auto; right:0; top:0; bottom:0; width:420px; max-width:92vw;
    padding:28px 32px 44px; box-shadow:-20px 0 60px rgba(0,0,0,.4);
    transform:translateX(100%); transition:transform .26s cubic-bezier(.2,.8,.2,1);
  }
  .mmenu.open .mmenu-panel{ transform:none; }
  .mmenu-main a{ font-size:24px; }
}

@media (max-width:1100px){
  .hecho-t h2{ font-size:54px; } .hecho-im{ width:360px; height:360px; }
  .hecho-notas .hn-alta p{ font-size:16px; }
  .faq{ padding-bottom:64px; }
  .faq-grid{ grid-template-columns:1fr; gap:28px; }
  .faq h2{ font-size:34px; line-height:34px; padding-top:0; }
}
@media (max-width:760px){
  /* Las dos secciones se tocaban: "hecho" acaba con 16px de padding y el FAQ
     empezaba en 0. 15px más de aire, pedidos a ojo sobre el teléfono. */
  .faq{ padding-top:15px; }
  /* Anclada abajo, no centrada: así el borde superior queda SIEMPRE en el mismo
     sitio (15% de la ventana) en vez de moverse según cuánto contenido tenga el
     producto. Entra deslizándose desde abajo con la misma curva y el mismo tiempo
     que el carrito, que ya era bottom-sheet en celular — ver .cart aquí abajo. */
  .pm{
    top:15vh; bottom:0; height:85vh; max-height:85vh;
    /* dvh y no solo vh: en iOS (Safari y Chrome) `vh` se calcula sobre el viewport
       MÁS GRANDE POSIBLE —el de cuando las barras del navegador están escondidas—,
       no sobre lo que de verdad se ve. Con las barras a la vista, el 85% se iba por
       debajo de la barra inferior y la ficha salía cortada; reportado desde un
       iPhone 15 Plus con Chrome. `dvh` sigue el viewport real y se reajusta solo
       cuando las barras aparecen o se esconden.
       Las dos declaraciones a propósito: un navegador que no entienda dvh descarta
       esta línea y se queda con la de arriba, que es el comportamiento de antes. */
    top:15dvh; height:85dvh; max-height:85dvh;
    transform:translateY(100%);
  }
  .pm.open{ transform:none; }
  /* Columna flex, no grid: con el cuerpo de alto fijo el grid daba filas de
     0.19px a las miniaturas y a la foto, y las tres partes se montaban encima.
     En flex el alto lo pone el contenido y "order" sigue funcionando igual. */
  .pm-body{ display:flex; flex-direction:column; row-gap:12px; padding:16px; overflow-x:hidden; }
  .pm-body > *{ flex:none; }
  /* Miniaturas de verdad: 72px fijos, y la tira se desplaza si no caben.
     Antes era flex:1, o sea que se repartían el ancho de la pantalla: con dos fotos
     cada una medía 172px y a ese tamaño el navegador pide la foto de 678px —unos
     200 KB— solo para pintar una miniatura. Medido contra /nuevo/ con la caché fría
     a 700 kbps, a los 6 segundos la segunda seguía bajando y la tira parecía vacía.
     A 72px el sizes del JS hace que elija la variante de 199px, que son 8 KB, y
     además la foto principal recupera el alto que se llevaban. */
  /* min-width:0 es lo que impide que la tira ensanche la ficha entera. Es un flex
     horizontal cuyos hijos no encogen (flex:0 0 66px), colgando de un .pm-body que
     es columna: sin esto su ancho MÍNIMO es la suma de las miniaturas, así que con
     muchas fotos empuja el ancho del panel aunque el overflow-x ya esté puesto. */
  .pm-thumbs{ flex-direction:row; order:2; gap:8px; min-width:0; width:100%; }
  /* 66px y no 72, y los 6px de diferencia no son estéticos. A 3x —un iPhone normal—
     un cuadro de 72px pide 216px de imagen, y la variante estrecha del catálogo tiene
     199: por 17px el navegador se iba a la de 678 y no se ahorraba nada. Con 66 pide
     198, que entra justo en los 199, así que baja 8 KB en vez de 200 y además la
     pinta uno a uno. Si algún día cambian los anchos del srcset (elegirSrcset en
     src/build/normalizar.mjs, objetivos 300/500/700 con tope 800), hay que rehacer
     esta cuenta: la prueba r13 la comprueba. */
  .pm-thumbs button{ flex:0 0 66px; width:66px; height:66px; aspect-ratio:1; }
  .pm-main{ width:100%; height:auto; aspect-ratio:2/3; max-height:42vh; max-height:42dvh; justify-self:center; }
  .pm-info{ height:auto; margin-left:0; padding-top:8px; order:3; }
  .pm-info h2{ font-size:32px; }
  /* "Agregar al carrito" pegado al borde inferior de la ficha.
     Medido antes de esto: el botón caía en y=1272 con una ventana de 844, o sea
     que había que desplazar 531px DENTRO de la ficha para llegar a él, y al abrir
     no se veía nunca. No es culpa del alto de 85vh —antes, con 94vh, hacían falta
     455px igual— es que la ficha lleva foto, miniaturas, descripción, specs y
     opciones por delante del botón.
     Sticky y no fijo: cuando se llega al final del contenido deja de flotar y se
     queda en su sitio, así no tapa nada de forma permanente.
     Los -16px de margen lateral y el bottom negativo compensan el padding de
     .pm-body, para que la banda llegue de borde a borde y no deje ver el contenido
     colándose por debajo. */
  .pm-buy{
    position:sticky; bottom:-16px; z-index:2;
    margin:22px -16px 0; padding:12px 16px calc(12px + env(safe-area-inset-bottom, 0px));
    background:var(--cosmic);
    box-shadow:0 -10px 16px -10px rgba(13,13,13,.28);
  }
  .pm-x{ top:14px; right:14px; }
  /* El carrito arrastraba el mismo problema de vh en iOS, y ahí es peor: al fondo
     está "Comprar por WhatsApp", que es como se cierra la venta. */
  .cart{ top:auto; left:0; right:0; width:100%; max-height:86vh; max-height:86dvh; border-radius:24px 24px 0 0; transform:translateY(100%); }
  .cart.open{ transform:none; }
  .cart-h{ padding:24px 22px 0; } .cart-list{ padding:0 22px; } .cart-ship{ padding:14px 22px 0; } .cart-f{ padding:16px 22px 24px; }
  .cart-n{ display:inline; font-size:inherit; color:inherit; margin:0; }
  .cart-n:not(:empty)::before{ content:' · '; }
  .cart-h h2{ display:inline; font-size:18px; } .cart-h{ font-family:var(--font-display); font-weight:700; font-size:18px; }
  .ci{ gap:14px; padding:14px 0; } .ci-th{ width:48px; height:48px; } .ci{ grid-template-columns:48px 1fr; } .ci-m{ display:none; } .qty{ margin-top:8px; }
  /* En columna la foto cuadrada dispararía el alto de la sección; se recorta a una
     franja para que el bloque siga cabiendo en los 800px. */
  .hecho{ flex-direction:column; align-items:flex-start; gap:20px; }
  .hecho-t h2{ font-size:44px; }
  .hecho-im{ width:100%; height:178px; aspect-ratio:auto; object-position:center 35%; }
  .hecho-lead{ margin-top:18px; font-size:15.5px; line-height:1.5; }
  .hecho-notas{ margin-top:18px; gap:12px; }
  .hecho-notas p{ font-size:14px; }
  .hecho-notas .hn-alta p{ font-size:15.5px; }
  /* El enlace a "Nuestra historia" añade 54px y en celular la sección ya rozaba
     los 800px que es su tope. Se recorta su separación y la del pie de la franja
     para devolver ese espacio: el bloque sigue cabiendo. */
  .hecho-mas{ margin-top:14px; }
  .faq{ padding-bottom:48px; }
  .faq h2{ font-size:30px; line-height:31px; }
  .faq summary{ font-size:16px; height:auto; min-height:58px; padding:14px 0; }
  .faq details p{ font-size:14px; padding-bottom:20px; }
  .sec-hecho{ padding:40px 0 16px; }
}

/* ---------- Teléfonos estrechos (360px y por debajo) ----------
   A 390px la descripción de colección entra justo en tres líneas, pero a 360 —un
   Galaxy A, un Pixel en varios modos— la columna baja de 218 a 188px y tres de las
   cinco necesitan una cuarta. Con el tope en tres se cortaban con puntos
   suspensivos, y lo que se perdía era siempre el final: "hechas para darte…",
   "…o un martes cualquiera", "…obsequiar suerte" — justo la ocasión de uso, que es
   para lo que se escribieron. Aquí la tarjeta crece unos 16px y no se pierde texto. */
@media (max-width:380px){
  .ix-desc{ -webkit-line-clamp:4; }
}

/* ---------- Aviso de cookies en celular ----------
   En columna: a lo ancho de un teléfono, el texto y los dos botones en la misma
   fila dejarían el texto en una tira de 120px. */
@media (max-width:760px){
  .cookies{ flex-direction:column; align-items:stretch; gap:12px; padding:16px 18px calc(16px + env(safe-area-inset-bottom, 0px)); }
  .cookies p{ font-size:12.5px; max-width:none; }
  .cookies-btns{ justify-content:stretch; }
  .cookies-btns button{ flex:1; }
}
