/* ===========================================================
   tiendasexshop.sexshop99.com
   Línea gráfica tomada del logo de producción: rojo #ce3838 + negro
   =========================================================== */

:root{
  --r:#ce3838;          /* rojo del logo */
  --r-hot:#ff2b45;      /* rojo vivo para CTA */
  --r-dark:#9e2323;
  --ink:#0c0b0d;        /* negro */
  --ink-2:#1a181c;
  --ink-3:#2a262e;
  --tx:#17151a;
  --tx-2:#6f6a75;
  --line:#e7e3e8;
  --bg:#ffffff;
  --bg-2:#f7f5f7;
  --ok:#25d366;
  --wrap:1440px;
  --rad:4px;
}

*{box-sizing:border-box}

/* TAMAÑO GLOBAL DE LA FUENTE
   Antes se heredaba el 16px del navegador y, como casi todo el sitio usa rem
   por debajo de 1, el texto se sentía chico. Subiendo la raíz escala todo
   proporcionalmente sin tocar regla por regla. */
html{font-size:110%}            /* ≈17.6px */
@media (max-width:640px){ html{font-size:105%} }

body{
  margin:0;background:var(--bg);color:var(--tx);
  font-family:'Inter',system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif;
  line-height:1.6;-webkit-font-smoothing:antialiased;
}
img{max-width:100%;display:block}
a{color:inherit;text-decoration:none}
h1,h2,h3,h4{margin:0;line-height:1.08;font-weight:700}
.serif{font-family:'Playfair Display',Georgia,serif}

.wrap{max-width:var(--wrap);margin:0 auto;padding:0 32px}
.ic{width:19px;height:19px;fill:none;stroke:currentColor;stroke-width:1.7;
    stroke-linecap:round;stroke-linejoin:round;flex:0 0 auto}
.skip{position:absolute;left:-9999px}
.skip:focus{left:8px;top:8px;background:#fff;padding:10px 14px;z-index:99}

/* ================= topbar ================= */
.topbar{background:var(--ink);color:#cfc9d2;font-size:.82rem;letter-spacing:.01em}
.topbar-in{display:flex;align-items:center;gap:26px;height:36px}
.tb{display:inline-flex;align-items:center;gap:7px;white-space:nowrap}
.tb b{color:#fff;font-weight:600}
.tb .ic{width:15px;height:15px;color:var(--r)}
.tb-wa{margin-left:auto;color:var(--ok);font-weight:600}
.tb-wa:hover{filter:brightness(1.2)}

/* ================= header ================= */
.hd{background:#fff;border-bottom:1px solid var(--line);position:sticky;top:0;z-index:50}
.hd-in{display:flex;align-items:center;gap:26px;height:82px}
.logo img{height:38px;width:auto}

.search{flex:1;max-width:580px;position:relative;display:flex;align-items:center}
.search-ic{
  position:absolute;left:18px;width:19px;height:19px;pointer-events:none;z-index:1;
  fill:none;stroke:#8e8796;stroke-width:1.8;stroke-linecap:round;transition:stroke .18s;
}
.search input{
  width:100%;border:1.5px solid transparent;border-radius:999px;background:var(--bg-2);
  padding:15px 112px 15px 46px;font-size:.95rem;font-family:inherit;outline:none;
  color:var(--tx);transition:background .18s,border-color .18s,box-shadow .18s;
}
.search input::placeholder{color:#948c9c}
.search input:hover{background:#f1edf1}
.search input:focus{background:#fff;border-color:var(--r);box-shadow:0 0 0 4px rgba(206,56,56,.12)}
.search:focus-within .search-ic{stroke:var(--r)}
/* la X que Chrome mete en los input type=search */
.search input::-webkit-search-cancel-button{-webkit-appearance:none;height:14px;width:14px;
  background:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238e8796' stroke-width='2.4' stroke-linecap='round'><path d='M6 6l12 12M18 6L6 18'/></svg>") center/contain no-repeat;cursor:pointer}

.search button{
  position:absolute;right:5px;border:0;cursor:pointer;background:var(--ink);color:#fff;
  padding:11px 22px;border-radius:999px;font-size:.85rem;font-weight:700;font-family:inherit;
  letter-spacing:.01em;transition:background .18s,transform .18s;
}
.search button:hover{background:var(--r);transform:translateY(-1px)}
.search button:active{transform:none}

.hd-acts{display:flex;align-items:center;gap:8px;margin-left:auto}
.ha{
  display:inline-flex;align-items:center;gap:8px;padding:10px 14px;border-radius:var(--rad);
  font-size:.84rem;font-weight:600;border:1px solid var(--line);
}
.ha:hover{border-color:var(--ink)}
.ha-wa{color:#0e9f4f;border-color:rgba(37,211,102,.4);background:rgba(37,211,102,.07)}
.ha-wa:hover{background:rgba(37,211,102,.15);border-color:var(--ok)}
.ha-cart{position:relative;background:var(--ink);color:#fff;border-color:var(--ink)}
.ha-cart:hover{background:var(--r);border-color:var(--r)}
.ha-cart .n{background:var(--r);color:#fff;font-size:.7rem;font-weight:800;
            padding:1px 7px;border-radius:20px;margin-left:2px}
.ha-cart:hover .n{background:#fff;color:var(--r)}

/* ================= nav ================= */
.nav{background:#fff;border-bottom:1px solid var(--line)}
.nav-in{display:flex;gap:0;overflow-x:auto;scrollbar-width:none}
.nav-in::-webkit-scrollbar{display:none}
.nav-in a{
  padding:14px 13px;font-size:.84rem;font-weight:600;letter-spacing:.045em;
  text-transform:uppercase;color:var(--tx-2);white-space:nowrap;position:relative;
}
.nav-in a::after{
  content:"";position:absolute;left:16px;right:16px;bottom:0;height:2px;
  background:var(--r);transform:scaleX(0);transition:transform .2s;
}
.nav-in a:hover{color:var(--ink)}
.nav-in a:hover::after{transform:scaleX(1)}
.nav-all{color:var(--r) !important}

/* ================= HERO ================= */
.hero{position:relative;background:var(--ink);overflow:hidden;isolation:isolate}

/* mosaico de producto de fondo */
.hero-bg{
  position:absolute;inset:0;z-index:0;
  display:grid;grid-template-columns:repeat(8,1fr);grid-auto-rows:1fr;
}
.hero-bg img{width:100%;height:100%;object-fit:cover;filter:grayscale(.15) contrast(1.05)}
.hero-veil{
  position:absolute;inset:0;z-index:1;
  background:
    linear-gradient(100deg, rgba(12,11,13,.97) 0%, rgba(12,11,13,.93) 38%,
                    rgba(12,11,13,.72) 58%, rgba(12,11,13,.55) 100%),
    radial-gradient(80% 120% at 18% 50%, rgba(206,56,56,.28), transparent 62%);
}

.hero-in{position:relative;z-index:2;display:grid;grid-template-columns:1.08fr .92fr;
         gap:64px;align-items:center;padding:92px 32px 84px}

.kick{
  display:inline-flex;align-items:center;gap:10px;color:#fff;font-size:.72rem;
  font-weight:700;letter-spacing:.18em;text-transform:uppercase;margin-bottom:26px;
}
.kick::before{content:"";width:38px;height:2px;background:var(--r)}

.hero h1{
  font-size:clamp(2.2rem,3.7vw,3.7rem);color:#fff;letter-spacing:-.025em;margin-bottom:22px;
}
.hero h1 em{font-style:italic;color:var(--r);font-weight:500}
.hero p{color:#c8c2cd;font-size:1.1rem;max-width:50ch;margin:0 0 34px}
.hero p b{color:#fff;font-weight:600}

.hero-cta{display:flex;gap:12px;flex-wrap:wrap;margin-bottom:38px}
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:9px;
  padding:15px 32px;border-radius:var(--rad);font-weight:700;font-size:.92rem;
  letter-spacing:.02em;transition:.18s;border:2px solid transparent;
}
.btn-r{background:var(--r);color:#fff}
.btn-r:hover{background:var(--r-hot);transform:translateY(-2px)}
.btn-g{background:transparent;color:#fff;border-color:rgba(255,255,255,.32)}
.btn-g:hover{background:#fff;color:var(--ink);border-color:#fff}

.hero-nums{display:flex;gap:38px;flex-wrap:wrap;border-top:1px solid rgba(255,255,255,.14);padding-top:24px}
.hn b{display:block;color:#fff;font-size:1.6rem;font-weight:800;letter-spacing:-.02em;line-height:1}
.hn span{color:#928c99;font-size:.76rem;text-transform:uppercase;letter-spacing:.1em}

/* tarjeta destacada del hero */
.hero-card{
  background:#fff;border-radius:var(--rad);overflow:hidden;max-width:430px;justify-self:end;
  box-shadow:0 30px 70px rgba(0,0,0,.55);
}
.hc-tag{
  background:var(--r);color:#fff;font-size:.68rem;font-weight:800;letter-spacing:.14em;
  text-transform:uppercase;padding:9px 16px;
}
.hc-img{aspect-ratio:1/.92;background:var(--bg-2);overflow:hidden}
.hc-img img{width:100%;height:100%;object-fit:cover}
.hc-b{padding:19px 20px 22px}
.hc-cat{font-size:.68rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--r)}
.hc-b h3{font-family:'Playfair Display',Georgia,serif;font-size:1.32rem;margin:6px 0 10px;font-weight:700;line-height:1.24}
.hc-f{display:flex;align-items:center;justify-content:space-between;gap:12px}
.hc-p{font-size:1.55rem;font-weight:800;letter-spacing:-.02em}
.hc-p small{font-size:.66rem;color:var(--tx-2);font-weight:600}
.hc-btn{background:var(--ink);color:#fff;padding:11px 20px;border-radius:var(--rad);
        font-size:.82rem;font-weight:700}
.hc-btn:hover{background:var(--r)}

/* ================= barra de garantías ================= */
.gar{background:var(--ink-2);color:#b9b3bf}
.gar-in{display:grid;grid-template-columns:repeat(4,1fr);gap:6px;padding:22px 32px}
.g{display:flex;align-items:center;gap:13px;font-size:.83rem}
.g .ic{width:22px;height:22px;color:var(--r)}
.g b{display:block;color:#fff;font-size:.87rem;font-weight:600}

/* ================= secciones ================= */
.sec{padding:76px 0}
.sec-g{background:var(--bg-2)}
.sec-hd{margin-bottom:38px;display:flex;align-items:flex-end;justify-content:space-between;gap:20px}
.sec-hd h2{font-size:clamp(1.7rem,3.2vw,2.5rem);letter-spacing:-.025em}
.sec-hd h2 em{font-style:italic;color:var(--r);font-weight:500}
.sec-hd p{color:var(--tx-2);margin:9px 0 0;font-size:1rem}
.lnk{color:var(--ink);font-weight:700;font-size:.85rem;border-bottom:2px solid var(--r);padding-bottom:3px;white-space:nowrap}
.lnk:hover{color:var(--r)}

/* --- categorías con foto --- */
.cats{display:grid;grid-template-columns:repeat(8,1fr);gap:22px}
.cx{text-align:center}
.cx-img{
  aspect-ratio:1;border-radius:50%;overflow:hidden;background:var(--bg-2);
  border:2px solid transparent;transition:.2s;margin-bottom:11px;
}
.cx:hover .cx-img{border-color:var(--r);transform:translateY(-4px)}
.cx-img img{width:100%;height:100%;object-fit:cover}
.cx-n{font-size:.86rem;font-weight:600;line-height:1.3;display:block}
.cx-c{font-size:.76rem;color:var(--tx-2)}

/* --- productos --- */
.grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:28px}
.p{
  background:#fff;border:1px solid var(--line);display:flex;flex-direction:column;
  transition:box-shadow .22s,transform .22s,border-color .22s;
}
.p:hover{transform:translateY(-5px);box-shadow:0 22px 46px rgba(12,11,13,.15);border-color:transparent}

.p-img{position:relative;display:block;aspect-ratio:1/1.02;overflow:hidden;
       background:#f4f1f4;padding:16px}
.p-img img{width:100%;height:100%;object-fit:contain;transition:transform .45s}
.p:hover .p-img img{transform:scale(1.06)}

.p-b{padding:20px 20px 22px;display:flex;flex-direction:column;gap:9px;flex:1}
/* .p-cat ahora es un ENLACE al buscador (antes era un <span> muerto): se le da
   afordancia con el subrayado al pasar, sin cambiarle el peso visual. */
.p-cat{display:inline-block;font-size:.66rem;font-weight:700;letter-spacing:.14em;
       text-transform:uppercase;color:var(--r);text-decoration:none;
       border-bottom:1px solid transparent;transition:border-color .15s}
.p-cat:hover{border-bottom-color:var(--r)}
.p-b h3{font-size:1.2rem;font-weight:700;line-height:1.28;letter-spacing:-.01em}
.p:hover .p-b h3 a{color:var(--r)}
.p-d{margin:0;font-size:.94rem;color:var(--tx-2);line-height:1.5}
.p-d a{color:inherit}
.p-d a:hover{color:var(--r)}

.p-f{margin-top:auto;padding-top:16px;border-top:1px solid var(--line);
     display:flex;align-items:center;justify-content:space-between;gap:12px}
.p-pr{display:flex;flex-direction:column;line-height:1.15}
.p-p{font-size:1.4rem;font-weight:800;letter-spacing:-.025em}
.p-p small{font-size:.62rem;color:var(--tx-2);font-weight:600}
.p-sku{font-size:.66rem;color:#a49ead;letter-spacing:.03em}
.p-add{
  display:inline-flex;align-items:center;gap:7px;background:var(--ink);color:#fff;
  padding:11px 16px;border-radius:var(--rad);font-size:.83rem;font-weight:700;white-space:nowrap;
}
.p-add:hover{background:var(--r)}
.p-add .ic{width:16px;height:16px}

/* --- banda CTA --- */
.banda{position:relative;background:var(--ink);overflow:hidden;isolation:isolate}
.banda-bg{position:absolute;inset:0;z-index:0;display:grid;grid-template-columns:repeat(6,1fr)}
.banda-bg img{width:100%;height:100%;object-fit:cover}
.banda::before{
  content:"";position:absolute;inset:0;z-index:1;
  background:linear-gradient(90deg,rgba(158,35,35,.96),rgba(12,11,13,.93));
}
.banda-in{position:relative;z-index:2;display:flex;align-items:center;justify-content:space-between;
          gap:34px;padding:62px 32px;flex-wrap:wrap}
.banda h2{color:#fff;font-size:clamp(1.5rem,3vw,2.15rem);letter-spacing:-.02em;max-width:19ch}
.banda h2 em{font-style:italic;color:#ffb3bb;font-weight:500}
.banda p{color:#e4d7d9;margin:11px 0 0;max-width:46ch;font-size:.96rem}
.btn-wa{background:var(--ok);color:#062e16;font-weight:800}
.btn-wa:hover{background:#fff;color:var(--ink)}

/* ================= footer ================= */
.ft{background:var(--ink);color:#a49ead}

/* franja de contacto */
.ft-top{border-bottom:1px solid rgba(255,255,255,.09);background:rgba(255,255,255,.02)}
.ft-top-in{display:flex;align-items:center;justify-content:space-between;gap:40px;
           padding:34px 32px;flex-wrap:wrap}
.ft-marca img{height:34px;width:auto;margin-bottom:12px}
.ft-marca p{margin:0;font-size:.87rem;line-height:1.55;color:#9990a0}
.ft-cta{display:flex;gap:14px;flex-wrap:wrap}
.ft-wa,.ft-mail{
  display:inline-flex;align-items:center;gap:13px;padding:14px 20px;border-radius:var(--rad);
  border:1px solid rgba(255,255,255,.13);transition:.2s;background:rgba(255,255,255,.02);
}
.ft-wa .ic,.ft-mail .ic{width:22px;height:22px}
.ft-wa{color:var(--ok);border-color:rgba(37,211,102,.3)}
.ft-wa:hover{background:rgba(37,211,102,.12);border-color:var(--ok)}
.ft-mail{color:#cfc7d4}
.ft-mail:hover{border-color:var(--r);color:#fff}
.ft-wa span,.ft-mail span{display:flex;flex-direction:column;line-height:1.25}
.ft-wa small,.ft-mail small{font-size:.68rem;letter-spacing:.1em;text-transform:uppercase;opacity:.72}
.ft-wa b,.ft-mail b{font-size:1rem;color:#fff;font-weight:700}

/* enlaces */
.ft-in{display:grid;grid-template-columns:repeat(4,1fr);gap:44px;padding:46px 32px 42px}
.ft h3{color:#fff;font-size:.74rem;letter-spacing:.16em;text-transform:uppercase;
       margin-bottom:16px;padding-bottom:11px;border-bottom:1px solid rgba(255,255,255,.1);position:relative}
.ft h3::after{content:"";position:absolute;left:0;bottom:-1px;width:34px;height:1px;background:var(--r)}
.ft-c a{display:block;font-size:.9rem;padding:6px 0;color:#a49ead;transition:color .18s,padding-left .18s}
.ft-c a:hover{color:var(--r-hot);padding-left:5px}
.ft-mas{margin-top:8px;color:#fff !important;font-weight:700;font-size:.83rem !important}
.ft-mas:hover{color:var(--r-hot) !important}

.ft-sellos{list-style:none;margin:0 0 20px;padding:0}
.ft-sellos li{display:flex;align-items:flex-start;gap:10px;font-size:.87rem;padding:6px 0;color:#a49ead}
.ft-sellos .ic{width:17px;height:17px;color:var(--r);margin-top:2px}

.ft-redes{display:flex;gap:10px}
.ft-redes a{
  width:38px;height:38px;border-radius:50%;display:grid;place-items:center;
  border:1px solid rgba(255,255,255,.15);color:#cfc7d4;transition:.2s;padding:0;
}
.ft-redes a:hover{background:var(--r);border-color:var(--r);color:#fff;transform:translateY(-2px)}
.ft-redes .ic{width:18px;height:18px}

/* barra inferior */
.ft-b{border-top:1px solid rgba(255,255,255,.09);background:rgba(0,0,0,.25)}
.ft-bin{display:flex;justify-content:space-between;align-items:center;gap:18px;
        padding:18px 32px;font-size:.79rem;flex-wrap:wrap}
.ft-mxn{color:#7d7484}
.ft-18{color:var(--r-hot);font-weight:700}

@media (max-width:980px){
  .ft-in{grid-template-columns:1fr 1fr;gap:32px}
  .ft-top-in{gap:26px}
}
@media (max-width:560px){
  .ft-in{grid-template-columns:1fr;gap:28px;padding:36px 32px}
  .ft-cta{width:100%}
  .ft-wa,.ft-mail{flex:1}
  .ft-bin{justify-content:flex-start;gap:8px}
}

/* ================= wa flotante ================= */
.wa-f{
  position:fixed;right:22px;bottom:22px;width:56px;height:56px;border-radius:50%;
  background:var(--ok);display:grid;place-items:center;z-index:70;
  box-shadow:0 8px 26px rgba(37,211,102,.5);transition:.2s;
}
.wa-f:hover{transform:scale(1.08)}
.wa-f svg{width:29px;height:29px;fill:none;stroke:#fff;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}

/* ================= responsive ================= */
@media (max-width:1080px){
  .cats{grid-template-columns:repeat(4,1fr);gap:20px}
  .grid{grid-template-columns:repeat(3,1fr)}
  .hero-in{grid-template-columns:1fr;gap:44px;padding:64px 22px}
  .hero-card{justify-self:start;max-width:340px}
  .hero-bg{grid-template-columns:repeat(6,1fr)}
}
@media (max-width:860px){
  .hd-in{height:auto;padding:14px 0;flex-wrap:wrap;gap:14px}
  .search{order:3;flex-basis:100%;max-width:none}
  .search input{padding-right:96px;font-size:.92rem}
  .search button{padding:10px 18px}
  .gar-in{grid-template-columns:1fr 1fr;gap:16px}
  .grid{grid-template-columns:repeat(2,1fr);gap:16px}
  .duo{grid-template-columns:1fr}
  .ft-in{grid-template-columns:1fr 1fr;gap:30px}
  .sec{padding:54px 0}
  .tb-2{display:none}
}
@media (max-width:520px){
  .cats{grid-template-columns:repeat(3,1fr);gap:14px}
  .hero h1{font-size:2.3rem}
  .hero-nums{gap:22px}
  .hn b{font-size:1.3rem}
  .ha span{display:none}
  .ft-in{grid-template-columns:1fr}
  .gar-in{grid-template-columns:1fr}
  .btn{padding:13px 24px;flex:1}
}


/* ================= "Sex Shop cerca de mi" (estado > ciudad) ================= */
.zonas{border-top:1px solid var(--line)}
.zonas-hd{display:block;text-align:center;margin-bottom:34px}
.zonas-hd h2{font-size:clamp(1.7rem,3.2vw,2.5rem)}
.zlist{list-style:none;margin:0;padding:0;columns:4;column-gap:34px}
.ze{break-inside:avoid;margin:0 0 22px;display:inline-block;width:100%}
.ze-n{display:block;font-weight:700;font-size:1rem;color:var(--ink);
      padding-bottom:7px;border-bottom:2px solid var(--r);margin-bottom:8px}
.ze-n:hover{color:var(--r)}
.zc-ul{list-style:none;margin:0;padding:0}
.zc-ul li{padding:2px 0}
.zc-ul a{font-size:.88rem;color:var(--tx-2)}
.zc-ul a:hover{color:var(--r)}

@media (max-width:1080px){ .zlist{columns:3} }
@media (max-width:860px){ .zlist{columns:2} }
@media (max-width:520px){ .zlist{columns:1} }


/* ================= confianza + blog (2 columnas) ================= */
.conf{
  position:relative;overflow:hidden;isolation:isolate;padding:92px 0;
  background:
    /* velo: deja ver la seda pero garantiza que el texto se lea */
    linear-gradient(100deg, rgba(10,9,11,.9) 0%, rgba(10,9,11,.7) 34%,
                    rgba(16,7,9,.42) 62%, rgba(22,6,10,.3) 100%),
    url('../img/seda_roja.jpg') center/cover no-repeat fixed,
    linear-gradient(135deg,#1a0e12,var(--ink));
}
/* el parallax se apaga en móvil: en iOS/Android 'fixed' se ve mal y pesa */
@media (max-width:980px), (pointer:coarse){
  .conf{background-attachment:scroll}
}
/* resplandor que respira: da movimiento sin distraer */
.conf-glow{
  position:absolute;z-index:0;width:820px;height:820px;border-radius:50%;
  top:-320px;right:-220px;pointer-events:none;
  background:radial-gradient(circle,rgba(255,43,69,.3),rgba(206,56,56,.06) 45%,transparent 68%);
  animation:respira 9s ease-in-out infinite;
}
@keyframes respira{
  0%,100%{transform:scale(1) translate(0,0);opacity:.85}
  50%    {transform:scale(1.14) translate(-38px,32px);opacity:1}
}
.conf-in{position:relative;z-index:1;display:grid;grid-template-columns:1.05fr .95fr;gap:56px;align-items:start}

/* entrada al hacer scroll */
html.js .reveal{opacity:0;transform:translateY(26px);transition:opacity .7s ease,transform .7s ease}
html.js .reveal.on{opacity:1;transform:none}
.conf-blog.reveal{transition-delay:.14s}
@media (prefers-reduced-motion:reduce){
  html.js .reveal{opacity:1;transform:none;transition:none}
  .conf-glow{animation:none}
}

.conf-txt h2{color:#fff;font-size:clamp(1.7rem,3.2vw,2.5rem);margin-bottom:18px}
.conf-txt h2 em{font-style:italic;color:var(--r-hot);font-weight:500}
.conf-txt p{color:#bdb4c2;margin:0 0 15px;font-size:1.04rem;max-width:52ch}
.conf-txt p b{color:#fff;font-weight:600}
.conf-txt .btn{margin-top:8px}
.conf-txt .edad{
  margin-top:26px;background:rgba(255,255,255,.05);border-left:3px solid var(--r);
  padding:13px 18px;color:#d6cedb !important;font-size:.88rem;border-radius:0 6px 6px 0;
}
.conf-txt .edad b{color:#fff}

/* tarjeta del blog */
.conf-blog{
  background:rgba(10,8,11,.62);border:1px solid rgba(255,255,255,.13);
  border-radius:6px;padding:32px 30px;backdrop-filter:blur(9px) saturate(1.1);
  box-shadow:0 24px 60px rgba(0,0,0,.45);
}
.cb-hd{margin-bottom:22px}
.cb-hd h3{color:#fff;font-size:1.6rem;margin:2px 0 8px}
.cb-hd h3 em{font-style:italic;color:var(--r-hot);font-weight:500}
.cb-hd p{color:#a79eae;font-size:.9rem;margin:0}

.cb-list{list-style:none;margin:0;padding:0}
.cb-list li{border-top:1px solid rgba(255,255,255,.1)}
.cb-list li:last-child{border-bottom:1px solid rgba(255,255,255,.1)}
.cb-list a{
  display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:14px;
  padding:15px 4px;transition:padding .25s,background .25s;
}
.cb-list a:hover{padding-left:12px;padding-right:10px;background:rgba(255,255,255,.05)}
.cb-n{font-family:'Playfair Display',Georgia,serif;font-size:1.05rem;color:var(--r-hot);
      font-weight:700;font-style:italic;opacity:.85}
.cb-t{color:#e6e0ea;font-size:1rem;line-height:1.4;font-weight:500}
.cb-list a:hover .cb-t{color:#fff}
.cb-a{width:17px;height:17px;fill:none;stroke:var(--r-hot);stroke-width:2;
      stroke-linecap:round;stroke-linejoin:round;opacity:0;transform:translateX(-6px);
      transition:opacity .25s,transform .25s}
.cb-list a:hover .cb-a{opacity:1;transform:none}

.cb-todo{
  display:inline-flex;align-items:center;gap:9px;margin-top:22px;color:#fff;
  font-weight:700;font-size:.9rem;border-bottom:2px solid var(--r);padding-bottom:4px;
}
.cb-todo .ic{transition:transform .25s}
.cb-todo:hover{color:var(--r-hot)}
.cb-todo:hover .ic{transform:translateX(5px)}

@media (max-width:980px){
  .conf-in{grid-template-columns:1fr;gap:38px}
  .conf{padding:60px 0}
  .conf-glow{width:520px;height:520px;top:-220px;right:-160px}
}

/* ================= mosaico de categorías ================= */
.bento{
  display:grid;grid-template-columns:repeat(4,1fr);grid-auto-rows:200px;gap:18px;
}
.bt{
  position:relative;overflow:hidden;background:var(--ink);isolation:isolate;
  display:flex;align-items:flex-end;transition:transform .25s,box-shadow .25s;
}
.bt:hover{transform:translateY(-4px);box-shadow:0 22px 46px rgba(12,11,13,.24)}
.bt-big{grid-column:span 2;grid-row:span 2}

/* collage de fotos reales de esa categoría */
.bt-fotos{position:absolute;inset:0;z-index:0;display:grid;gap:2px}
.bt .bt-fotos{grid-template-columns:1fr 1fr}
.bt-big .bt-fotos{grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr}
.bt-fotos img{width:100%;height:100%;object-fit:cover;transition:transform .5s;background:#efeaef}
.bt:hover .bt-fotos img{transform:scale(1.06)}
.bt::after{
  content:"";position:absolute;inset:0;z-index:1;transition:background .25s;
  background:linear-gradient(0deg,rgba(9,8,10,.97) 0%,rgba(9,8,10,.9) 26%,rgba(9,8,10,.55) 52%,rgba(9,8,10,.12) 86%);
}
.bt:hover::after{background:linear-gradient(0deg,rgba(150,26,32,.95) 0%,rgba(60,12,18,.75) 34%,rgba(9,8,10,.3) 78%)}

.bt-b{position:relative;z-index:2;padding:20px 22px;color:#fff;width:100%}
.bt-c{font-size:.68rem;font-weight:800;letter-spacing:.14em;text-transform:uppercase;color:var(--r-hot);
      text-shadow:0 1px 6px rgba(0,0,0,.7)}
.bt-b h3{font-size:1.3rem;margin:5px 0 8px;letter-spacing:-.01em;line-height:1.15;
         text-shadow:0 2px 12px rgba(0,0,0,.55)}
.bt-big .bt-b{padding:28px 30px}
.bt-big .bt-b h3{font-size:2rem}
.bt-v{display:inline-flex;align-items:center;gap:7px;font-size:.86rem;font-weight:600;color:#ded7e0}
.bt-v .ic{width:15px;height:15px;transition:transform .25s}
.bt:hover .bt-v{color:#fff}
.bt:hover .bt-v .ic{transform:translateX(5px)}

@media (max-width:980px){
  .bento{grid-template-columns:repeat(2,1fr);grid-auto-rows:180px}
  .bt-big{grid-column:span 2;grid-row:span 1}
  .bt-big .bt-b h3{font-size:1.5rem}
}
@media (max-width:560px){
  .bento{grid-template-columns:1fr;grid-auto-rows:170px}
  .bt-big{grid-column:span 1}
}

/* en las tarjetas chicas el texto ocupa más: se sube el velo para que se lea */
.bt:not(.bt-big)::after{
  background:linear-gradient(0deg,rgba(9,8,10,.98) 0%,rgba(9,8,10,.94) 38%,
                             rgba(9,8,10,.62) 64%,rgba(9,8,10,.15) 92%);
}

/* crédito de diseño en el cintillo inferior */
.ft-credito{color:#8b8291}
.ft-credito a{color:#cfc7d4;font-weight:600;border-bottom:1px solid rgba(206,56,56,.55);padding-bottom:1px}
.ft-credito a:hover{color:var(--r-hot);border-bottom-color:var(--r-hot)}
.ft-credito i{font-style:normal;opacity:.45;margin:0 4px}

/* ================= arreglos de móvil =================
   Causa del desborde horizontal: las columnas `1fr` equivalen a
   minmax(auto,1fr) y el contenido (precio + botón en una fila) empujaba
   la tarjeta más allá del ancho de pantalla. minmax(0,1fr) permite encoger. */
@media (max-width:860px){
  .grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .bento,.duo,.conf-in,.ft-in,.hero-in{grid-template-columns:minmax(0,1fr)}
  .cats{grid-template-columns:repeat(4,minmax(0,1fr))}
  .p-f{flex-wrap:wrap;row-gap:10px}
  .p-add{flex:1;justify-content:center}
  /* la barra superior no cabía completa: se vuelve deslizable */
  .topbar-in{overflow-x:auto;scrollbar-width:none;gap:16px}
  .topbar-in::-webkit-scrollbar{display:none}
  .tb-wa{margin-left:0}
}
@media (max-width:560px){
  .cats{grid-template-columns:repeat(3,minmax(0,1fr))}
  .bento{grid-template-columns:minmax(0,1fr)}
  .ft-bin{flex-direction:column;align-items:flex-start;gap:6px}
}
@media (max-width:430px){
  .grid{grid-template-columns:minmax(0,1fr)}   /* 1 producto por fila: se ve mejor que 2 apretados */
  .p-img{aspect-ratio:1/.8}
}
/* red de seguridad: nada debe empujar la página de lado */
html,body{overflow-x:hidden;max-width:100%}

@media (max-width:430px){
  /* los dos botones del hero se partían en 2 líneas: mejor uno debajo del otro */
  .hero-cta{flex-direction:column;gap:10px}
  .hero-cta .btn{width:100%;flex:none}
  .hero-nums{gap:18px}
  .banda-in .btn{width:100%}
}

/* ================= ficha de producto ================= */
/* Migas — variante A: <nav class="migas"><div class="wrap">  (ficha de producto).
   El padding va en el .wrap interno y es simétrico. */
.migas{background:var(--bg-2);border-bottom:1px solid var(--line);font-size:.83rem}
/* 🐛 El padding vertical NO va aquí: el `nav.migas` ya lo pone (regla de abajo)
   y en esta variante el nav Y el wrap son elementos distintos, así que se
   sumaba: la ficha de producto medía 81px de alto contra 53px del resto.
   Aquí solo queda la maquetación; el aire lo da `.migas`. */
.migas .wrap{padding-top:0;padding-bottom:0;display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.migas a{color:var(--tx-2)}
.migas a:hover{color:var(--r)}
.migas span{color:#c3bcc9}
.migas b{color:var(--tx);font-weight:600}

.ficha-in{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,.95fr);gap:52px;align-items:start}

/* galería */
.fg-main{background:var(--bg-2);border:1px solid var(--line);aspect-ratio:1;
         display:grid;place-items:center;overflow:hidden;padding:26px}
.fg-main img{width:100%;height:100%;object-fit:contain}
.fg-mini{display:flex;gap:10px;margin-top:12px;flex-wrap:wrap}
.fg-mini button{width:78px;height:78px;padding:6px;background:var(--bg-2);cursor:pointer;
                border:1.5px solid var(--line);transition:border-color .18s}
.fg-mini button:hover{border-color:var(--tx-2)}
.fg-mini button.on{border-color:var(--r)}
.fg-mini img{width:100%;height:100%;object-fit:contain}

/* datos */
/* ============ (1) la categoría: de texto suelto a pastilla-enlace ============
   Antes era un <span> gris-rojo flotando encima del título. Ahora es una
   pastilla con borde que se ve como lo que es: una etiqueta en la que se puede
   hacer clic para ver más de lo mismo. */
.fd-cat{display:inline-flex;align-items:center;gap:7px;font-size:.68rem;font-weight:800;
        letter-spacing:.13em;text-transform:uppercase;color:var(--r);text-decoration:none;
        border:1.5px solid rgba(206,56,56,.28);background:rgba(206,56,56,.06);
        border-radius:999px;padding:6px 14px;margin-bottom:14px;transition:.18s}
.fd-cat::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--r);flex:0 0 auto}
.fd-cat:hover{background:var(--r);border-color:var(--r);color:#fff}
.fd-cat:hover::before{background:#fff}
.fd h1{font-size:clamp(1.7rem,3.2vw,2.4rem);margin:8px 0 18px;letter-spacing:-.02em}
.fd-precio{display:flex;align-items:baseline;gap:16px;flex-wrap:wrap;
           padding-bottom:20px;border-bottom:1px solid var(--line)}
.fd-p{font-size:2.3rem;font-weight:800;letter-spacing:-.03em}
.fd-p small{font-size:.72rem;color:var(--tx-2);font-weight:600}
.fd-consultar{font-size:1.3rem;font-weight:700;color:var(--tx-2)}
.fd-clave{font-size:.78rem;color:#9d97a3}
/* ============ (2) la descripción: que deje de verse triste ============
   El problema no era solo la fuente: era que TODO iba en un solo párrafo gris
   de 1rem, con las medidas perdidas a media frase. Ahora el primer renglón
   entra como entradilla (más grande y en color de texto fuerte), los demás
   como apoyo, y los datos duros salen del párrafo a su propia ficha técnica. */
.fd-desc{padding:18px 0 2px}
.fd-desc p{margin:0 0 9px;color:var(--tx-2);font-size:1rem;line-height:1.68;max-width:56ch}
.fd-desc p:last-child{margin-bottom:0}
.fd-lead{font-size:1.12rem !important;line-height:1.55 !important;color:var(--tx) !important;
         font-weight:500;letter-spacing:-.005em}

/* ficha técnica — los pares "Etiqueta: valor" de la descripción */
.fd-specs{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1px;margin:20px 0 0;
          background:var(--line);border:1px solid var(--line);border-radius:var(--rad);
          overflow:hidden}
.fd-specs>div{background:var(--bg-2);padding:12px 16px;min-width:0}
.fd-specs dt{font-size:.66rem;font-weight:800;letter-spacing:.11em;text-transform:uppercase;
             color:var(--tx-2);margin-bottom:4px}
.fd-specs dd{margin:0;font-size:1rem;font-weight:700;color:var(--ink);line-height:1.35;
             overflow-wrap:break-word}
@media (max-width:520px){ .fd-specs{grid-template-columns:minmax(0,1fr)} }
/* Una sola fila: [cantidad] [Agregar al carrito] [WhatsApp] (Castro, 19-ago).
   Los dos botones se reparten el sobrante a partes iguales con `flex:1 1 0`;
   la base 0 es la que hace que queden del MISMO ancho aunque un texto sea más
   largo que el otro (con `flex:1 1 auto` cada uno arrancaría de su contenido).
   El `min-width` los deja bajar hasta 168px y, más abajo, envolver solos. */
.fd-cta{display:flex;gap:12px;flex-wrap:wrap;margin:22px 0 26px;align-items:stretch}
.fd-cta .fd-cant{flex:0 0 auto}
.fd-cta .btn{flex:1 1 0;min-width:168px;padding-left:18px;padding-right:18px;
             justify-content:center;white-space:nowrap}
.btn-o2{border:1.5px solid var(--line);color:var(--tx)}
.btn-o2:hover{border-color:var(--ink);background:var(--bg-2)}

/* ============ el botón de WhatsApp ============
   Era un botón de contorno gris con un globito genérico: se leía como
   "opción secundaria de relleno". Ahora es verde WhatsApp con el logo real.
   Ocupa TODO el ancho para que no compita de tú a tú con "Agregar al carrito"
   (el rojo sigue siendo la acción principal), pero se ve a la primera. */
.ic-wa{width:22px;height:22px;fill:currentColor;stroke:none;flex:0 0 auto}
.btn-wa2{background:var(--ok);color:#06301a;font-weight:800;gap:10px;
         box-shadow:0 2px 0 rgba(0,0,0,.06)}
.btn-wa2:hover{background:#1fbb5a;transform:translateY(-2px)}
/* Cuando ya no caben los dos en una fila, la cantidad se queda arriba sola y
   los botones bajan juntos: es más legible que partirlos en tres renglones. */
@media (max-width:640px){
  .fd-cta .fd-cant{flex:1 1 100%}
  .fd-cta .btn{min-width:140px;font-size:.88rem}
}

/* 🔴 Entre 861 y 1199 px la ficha SIGUE a dos columnas (la imagen se lleva la
   mitad) pero la columna de datos ya no da para "Preguntar por WhatsApp"
   completo, y la fila se partía en dos renglones — justo lo que Castro pidió
   evitar. Ahí el botón dice solo "WhatsApp": el logo verde ya explica el resto.
   No se puede resolver encogiendo el botón: lleva `white-space:nowrap`, así que
   lo que manda es el largo del texto. */
@media (min-width:861px) and (max-width:1199px){
  .wa-larga{display:none}
  .fd-cta .btn{min-width:0;padding-left:14px;padding-right:14px}
}

.fd-sellos{list-style:none;margin:0;padding:20px 0 0;border-top:1px solid var(--line)}
.fd-sellos li{display:flex;align-items:flex-start;gap:12px;padding:9px 0;font-size:.9rem;color:var(--tx-2)}
.fd-sellos b{color:var(--tx);font-weight:700;margin-right:4px}
.fd-sellos .ic{width:19px;height:19px;color:var(--r);margin-top:2px;flex:0 0 auto}

@media (max-width:860px){
  .ficha-in{grid-template-columns:minmax(0,1fr);gap:30px}
  /* (el reparto de los botones ya lo hace la regla base .fd-cta .btn) */
}

/* ================= carrito y checkout ================= */
.pasos{list-style:none;display:flex;gap:8px;margin:0 0 34px;padding:0;flex-wrap:wrap}
.pasos li{display:flex;align-items:center;gap:9px;font-size:.86rem;color:var(--tx-2);
          padding:9px 18px 9px 9px;border:1px solid var(--line);border-radius:999px}
.pasos span{width:26px;height:26px;border-radius:50%;background:var(--bg-2);display:grid;
            place-items:center;font-weight:800;font-size:.8rem}
.pasos .on{border-color:var(--r);color:var(--tx);font-weight:600}
.pasos .on span{background:var(--r);color:#fff}
.pasos .ok span{background:var(--ok);color:#062e16}

.ck{display:grid;grid-template-columns:minmax(0,1.6fr) minmax(0,.9fr);gap:32px;align-items:start}
.ck-lista{display:flex;flex-direction:column;gap:12px}
.ci{display:grid;grid-template-columns:1fr auto auto auto;gap:18px;align-items:center;
    background:#fff;border:1px solid var(--line);padding:18px 20px}
.ci h3{font-size:1rem;font-weight:600;line-height:1.35}
.ci-c{font-size:.78rem;color:var(--tx-2)}
.ci-cant{display:flex;align-items:center;border:1px solid var(--line);border-radius:999px;overflow:hidden}
.ci-cant button{width:34px;height:38px;border:0;background:#fff;cursor:pointer;font-size:1.1rem;color:var(--tx)}
.ci-cant button:hover{background:var(--bg-2);color:var(--r)}
.ci-cant input{width:44px;height:38px;border:0;text-align:center;font:inherit;font-weight:700;
               -moz-appearance:textfield;outline:none}
.ci-cant input::-webkit-outer-spin-button,.ci-cant input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.ci-sub{font-weight:800;font-size:1.1rem;min-width:78px;text-align:right}
.ci-del{border:0;background:none;cursor:pointer;color:#b9b2bf;padding:6px}
.ci-del:hover{color:var(--r)}
.ci-del .ic{width:19px;height:19px}

.ck-tot{background:#fff;border:1px solid var(--line);padding:24px 24px 26px;position:sticky;top:100px}
.ck-tot h3{font-size:.78rem;letter-spacing:.14em;text-transform:uppercase;margin-bottom:16px;
           padding-bottom:12px;border-bottom:1px solid var(--line)}
.ck-fila{display:flex;justify-content:space-between;gap:12px;padding:8px 0;font-size:.92rem;color:var(--tx-2)}
.ck-fila b{color:var(--tx);font-weight:700}
.ck-mini{font-size:.83rem;padding:5px 0}
.ck-total{border-top:1px solid var(--line);margin-top:10px;padding-top:14px;font-size:1.05rem}
.ck-total b{font-size:1.5rem;font-weight:800;letter-spacing:-.02em}
.ck-nota{font-size:.8rem;color:var(--tx-2);margin:14px 0 0}
.ck-seguir{width:100%;margin-top:18px;justify-content:center;border:0;cursor:pointer;font-family:inherit}
.ck-volver{display:block;text-align:center;margin-top:12px;font-size:.85rem;color:var(--tx-2)}
.ck-volver:hover{color:var(--r)}

/* formulario */
/* ===========================================================
   FORM DE DATOS — bloques (Castro, 19-ago)
   "divídelo en bloques que no se vea amontonado, con colores de fondo suaves
    definidos, y quita el cuadro exterior para que se vea más suelto"

   🔴 El marco de afuera se va: `.ck-form` ya no pinta nada, solo agrupa.
      Antes había caja dentro de caja dentro de caja (form → sección → campo).
      Ahora manda UN nivel: cada bloque.
   =========================================================== */
.ck-form{background:none;border:0;padding:0;display:flex;flex-direction:column;gap:18px}

/* cada bloque: fondo suave propio, sin borde duro. El color no es decorativo —
   separa "tus datos" de "a dónde va" de "cómo pagas" de un vistazo. */
.ck-bloque{border:0;margin:0;padding:24px 26px 12px;border-radius:calc(var(--rad) + 4px);
           min-width:0}
.bl-datos{background:var(--bg-2)}
.bl-envio{background:rgba(206,56,56,.045)}
.bl-pago {background:rgba(37,211,102,.07)}

/* el título del bloque, con su número */
.ck-t{display:flex;align-items:center;gap:11px;float:none;
      font-size:.78rem;letter-spacing:.14em;text-transform:uppercase;
      margin:0 0 18px;padding:0;border:0;color:var(--ink);font-weight:800}
.ck-t-n{width:24px;height:24px;border-radius:50%;background:#fff;border:1.5px solid var(--line);
        display:grid;place-items:center;font-size:.78rem;font-weight:800;letter-spacing:0;
        color:var(--tx-2);flex:0 0 auto}
.bl-envio .ck-t-n{border-color:rgba(206,56,56,.3);color:var(--r)}
.bl-pago  .ck-t-n{border-color:rgba(37,211,102,.45);color:#0f7a3d}
/* los campos en blanco: sobre el fondo tintado se despegan solos, sin bordes duros */
.ck-bloque input,.ck-bloque select,.ck-bloque textarea{background:#fff}
.ck-form label{display:block;font-size:.83rem;font-weight:600;color:var(--tx-2);margin-bottom:14px}
.ck-form input,.ck-form select,.ck-form textarea{
  display:block;width:100%;margin-top:6px;padding:12px 14px;border:1.5px solid var(--line);
  border-radius:var(--rad);font:inherit;font-size:.95rem;font-weight:400;color:var(--tx);
  background:#fff;outline:none;transition:border-color .18s,box-shadow .18s}
.ck-form input:focus,.ck-form select:focus,.ck-form textarea:focus{
  border-color:var(--r);box-shadow:0 0 0 3px rgba(206,56,56,.12)}
.ck-g2{display:grid;grid-template-columns:1fr 1fr;gap:0 16px}
.ck-g3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:0 16px}
.ck-err{background:rgba(206,56,56,.08);border-left:3px solid var(--r);padding:13px 18px;
        margin-bottom:22px;font-size:.9rem;color:var(--tx)}

.ck-pagos{display:grid;gap:12px}
/* 🐛 `.ck-form label` (clase+elemento) pesa MÁS que `.ck-radio` (clase sola) y
   le imponía `display:block`: el botoncito del radio salía ARRIBA del texto en
   vez de a su lado. Venía de antes; se ve al llegar a "¿Cómo quieres pagar?".
   Se sube la especificidad con `.ck-form` delante. Igual para .ck-check. */
.ck-form .ck-radio,
.ck-radio{display:flex;gap:13px;align-items:flex-start;border:1.5px solid transparent;
          background:#fff;padding:16px 18px;border-radius:var(--rad);cursor:pointer;
          margin:0 !important;transition:border-color .18s}
.ck-radio:hover{border-color:var(--tx-2)}
.ck-radio:has(input:checked){border-color:var(--r);background:rgba(206,56,56,.03)}
.ck-radio input{width:auto !important;margin:2px 0 0 !important;accent-color:var(--r)}
.ck-radio span{display:flex;flex-direction:column;gap:3px;font-weight:400;font-size:.85rem;color:var(--tx-2)}
.ck-radio b{font-size:.98rem;color:var(--tx)}
/* la confirmación de edad sale de los bloques y se queda suelta, que es lo que
   es: no pertenece a "tus datos" ni a "el pago", aplica a todo el pedido */
.ck-form .ck-check,
.ck-check{display:flex;gap:11px;align-items:flex-start;margin:0 !important;
          font-weight:400 !important;background:var(--bg-2);border-radius:var(--rad);
          padding:16px 20px}
.ck-check input{width:auto !important;margin:2px 0 0 !important;accent-color:var(--r)}

/* vacío */
.vacio{text-align:center;padding:60px 20px}
.vacio h1{font-size:2rem;margin-bottom:12px}
.vacio h1 em{font-style:italic;color:var(--r);font-weight:500}
.vacio p{color:var(--tx-2);margin-bottom:24px}

/* gracias */
.gr-ok{text-align:center;max-width:640px;margin:0 auto 38px}
.gr-check{width:62px;height:62px;fill:none;stroke:var(--ok);stroke-width:1.8;
          stroke-linecap:round;stroke-linejoin:round;margin-bottom:16px}
.gr-ok h1{font-size:clamp(1.6rem,3vw,2.3rem);margin-bottom:12px}
.gr-ok h1 em{font-style:italic;color:var(--r);font-weight:500}
.gr-ok p{color:var(--tx-2)}
.gr-folio{background:var(--ink);color:#fff;padding:3px 12px;border-radius:5px;letter-spacing:.04em}
.gr-monto{font-size:1.05rem;color:var(--tx-2);margin:0 0 18px}
.gr-monto b{color:var(--tx);font-size:1.5rem;font-weight:800}
.gr-datos{display:grid;gap:12px;margin-bottom:24px}
.gd{background:var(--bg-2);border:1px solid var(--line);padding:15px 18px;
    display:grid;grid-template-columns:1fr auto;align-items:center;gap:8px}
.gd span{grid-column:1/-1;font-size:.72rem;letter-spacing:.1em;text-transform:uppercase;color:var(--tx-2)}
.gd b{font-size:1.12rem;font-weight:800;letter-spacing:.02em}
.gd-num{font-variant-numeric:tabular-nums}
.gd-copy{border:1.5px solid var(--line);background:#fff;cursor:pointer;font:inherit;
         font-size:.78rem;font-weight:700;padding:8px 14px;border-radius:var(--rad);color:var(--tx)}
.gd-copy:hover{border-color:var(--r);color:var(--r)}
.gd-copy.ok{background:var(--ok);border-color:var(--ok);color:#062e16}
.gr-pasos{margin:0 0 22px;padding-left:20px;color:var(--tx-2);font-size:.93rem}
.gr-pasos li{padding:5px 0}
.gr-pasos b{color:var(--tx)}
.gr-aviso{border-left:3px solid var(--ok);padding-left:14px}

/* avisito flotante */
.toast{position:fixed;left:50%;bottom:28px;transform:translate(-50%,20px);z-index:90;
       background:var(--ink);color:#fff;padding:14px 22px;border-radius:999px;font-size:.9rem;
       font-weight:600;opacity:0;transition:opacity .25s,transform .25s;box-shadow:0 10px 30px rgba(0,0,0,.3)}
.toast.on{opacity:1;transform:translate(-50%,0)}
.toast-ok{background:var(--ok);color:#062e16}

@media (max-width:860px){
  .ck{grid-template-columns:minmax(0,1fr)}
  .ck-tot{position:static}
  .ck-g2,.ck-g3{grid-template-columns:1fr}
  .ci{grid-template-columns:1fr auto;gap:12px}
  .ci-sub{grid-column:1;text-align:left}
  .ci-del{grid-column:2}
}

/* selector de cantidad en la ficha */
.fd-cant{display:flex;align-items:center;border:1.5px solid var(--line);border-radius:var(--rad);overflow:hidden}
.fd-cant button{width:40px;height:48px;border:0;background:#fff;cursor:pointer;font-size:1.2rem;color:var(--tx)}
.fd-cant button:hover{background:var(--bg-2);color:var(--r)}
.fd-cant input{width:50px;height:48px;border:0;text-align:center;font:inherit;font-weight:800;font-size:1rem;
               outline:none;-moz-appearance:textfield}
.fd-cant input::-webkit-outer-spin-button,.fd-cant input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.p-add{border:0;font-family:inherit;cursor:pointer}

/* ===========================================================
   ZONAS — estado (/{estado}), ciudad (/{estado}/{ciudad}) y
   lugar (/{estado}/{ciudad}/{ID}/{slug}).
   Las 979 páginas geográficas comparten estos estilos.
   =========================================================== */

/* Migas — variante B: <nav class="wrap migas">  (catálogo, zona, lugar, blog).
   🐛 BUG (Castro, 20-ago: "el texto está cargado hacia abajo, céntralo").
   Esta regla traía `padding-top:26px` **y ningún padding-bottom**: como la
   variante A de arriba sí le pone fondo y borde inferior, la barra se veía con
   26 px de aire arriba y casi nada abajo — el texto pegado al borde.
   Se iguala arriba y abajo. Y ojo: son DOS markups distintos para lo mismo
   (`nav.migas > .wrap` vs `nav.wrap.migas`), por eso hay dos reglas que se
   pisan; si algún día se unifica el HTML, esto se vuelve una sola. */
.migas{display:flex;flex-wrap:wrap;align-items:center;gap:8px;
       padding-top:14px;padding-bottom:14px;
       font-size:.86rem;color:var(--tx-2)}
.migas a{color:var(--tx-2)}
.migas a:hover{color:var(--r)}
.migas b{color:var(--tx);font-weight:700}
.migas span{color:var(--line)}

.z-head{padding:22px 32px 54px}
.z-head h1{font-size:2.6rem;line-height:1.12;letter-spacing:-.02em;font-weight:700;
           margin:14px 0 18px;max-width:19ch}
.z-head h1 em{font-style:italic;color:var(--r);font-weight:500}
.z-intro{font-size:1.12rem;line-height:1.65;color:var(--tx);max-width:74ch;margin-bottom:34px}
.z-intro b{font-weight:700}

.z-h2{font-size:1.95rem;letter-spacing:-.015em;margin:0 0 24px}
.z-h2 em{font-style:italic;color:var(--r);font-weight:500}

/* la rejilla de 5 productos que va debajo del H1 */
.grid-5{grid-template-columns:repeat(5,minmax(0,1fr));gap:22px}

/* los dos botones: catálogo y WhatsApp */
.z-cta{display:flex;flex-wrap:wrap;gap:14px;margin-top:34px}
.z-btn{display:inline-flex;align-items:center;gap:9px;padding:16px 30px;border-radius:var(--rad);
       font-weight:800;font-size:1rem;letter-spacing:.01em;transition:.18s;white-space:nowrap}
.z-btn .ic{width:20px;height:20px;fill:currentColor;stroke:none}
.z-btn1{background:var(--r-hot);color:#fff}
.z-btn1:hover{background:var(--r-dark);color:#fff}
.z-btn2{background:var(--ok);color:#062e16}
.z-btn2:hover{filter:brightness(.93);color:#062e16}

/* listados: ciudades del estado, zonas de la ciudad, categorías */
.z-lista{padding:0 32px 54px}
.z-lista h2{font-size:1.75rem;letter-spacing:-.015em;margin:0 0 10px}
/* el H2 que encabeza la rejilla necesita más aire que el del mensaje de "no hay
   resultados" (aquel lleva un <p> debajo, éste va pegado a las tarjetas) */
.z-h2-lista{margin-bottom:24px !important}
.z-lista h2 em{font-style:italic;color:var(--r);font-weight:500}
.z-lista>p{color:var(--tx-2);margin-bottom:22px;max-width:72ch}
.z-cols{list-style:none;padding:0;margin:0;columns:4;column-gap:34px}
.z-cols li{break-inside:avoid;margin-bottom:9px;font-size:.95rem;line-height:1.45}
.z-cols a{color:var(--tx)}
.z-cols a:hover{color:var(--r);text-decoration:underline}

/* texto de apoyo */
.z-texto{padding:0 32px 64px;max-width:calc(var(--wrap));margin:0 auto}
.z-texto h2{font-size:1.85rem;letter-spacing:-.015em;margin:0 0 18px}
.z-texto h2 em{font-style:italic;color:var(--r);font-weight:500}
.z-texto h3{font-size:1.12rem;font-weight:800;margin:28px 0 8px;color:var(--ink)}
.z-texto p{font-size:1.02rem;line-height:1.72;color:var(--tx);max-width:76ch;margin-bottom:6px}
/* 🐛 BUG (Castro, 19-ago: "botón rojo y texto rojo" / "botón verde y texto rojo
   se pierde"): esta regla era `.z-texto a` a secas. `.z-texto a` pesa más que
   `.z-btn1` (clase + elemento vs clase sola), así que le ganaba a los botones y
   les pintaba el texto rojo y subrayado — sobre fondo rojo desaparecía.
   El `:not(.z-btn)` deja el estilo de enlace SOLO para los enlaces del texto. */
.z-texto a:not(.z-btn){color:var(--r);font-weight:700;text-decoration:underline}
.z-pasos{margin:0 0 8px;padding-left:22px;max-width:76ch}
.z-pasos li{font-size:1.02rem;line-height:1.7;margin-bottom:7px;color:var(--tx)}

.z-404{padding:70px 32px 90px;text-align:center}
.z-404 h1{font-size:2.4rem;margin-bottom:12px}
.z-404 p{color:var(--tx-2);font-size:1.05rem;margin-bottom:8px}
.z-404 .z-cta{justify-content:center}

@media (max-width:1200px){
  .grid-5{grid-template-columns:repeat(3,minmax(0,1fr))}
  .z-cols{columns:3}
}
@media (max-width:860px){
  .z-head{padding:14px 20px 40px}
  .z-head h1{font-size:2rem;max-width:none}
  .z-h2,.z-lista h2,.z-texto h2{font-size:1.5rem}
  .grid-5{grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}
  .z-cols{columns:2;column-gap:20px}
  .z-lista,.z-texto{padding-left:20px;padding-right:20px}
  .migas{padding-left:0;font-size:.8rem}
}
@media (max-width:520px){
  .grid-5{grid-template-columns:minmax(0,1fr)}
  .z-cols{columns:1}
  .z-btn{width:100%;justify-content:center}
}

/* ===========================================================
   CATÁLOGO (/sex-shop/) y páginas de texto (/envios, etc.)
   =========================================================== */

.cat-chips{display:flex;flex-wrap:wrap;gap:9px;margin-top:26px}
.chip{display:inline-flex;align-items:center;gap:6px;padding:9px 16px;border:1.5px solid var(--line);
      border-radius:999px;font-size:.87rem;font-weight:700;color:var(--tx);background:#fff;transition:.16s}
.chip small{color:var(--tx-2);font-weight:600;font-size:.78rem}
.chip:hover{border-color:var(--r);color:var(--r)}
.chip:hover small{color:var(--r)}
.chip.on{background:var(--ink);border-color:var(--ink);color:#fff}
.chip.on small{color:#b9b3bf}

.pager{display:flex;align-items:center;justify-content:center;gap:20px;margin-top:44px;
       font-size:.95rem;font-weight:700}
.pager a{color:var(--r);border-bottom:2px solid var(--r);padding-bottom:2px}
.pager a:hover{color:var(--r-dark);border-color:var(--r-dark)}
.pager span{color:var(--tx-2);font-weight:600}

/* páginas de texto: columna angosta, se leen mejor */
.pg{max-width:900px}
.pg h1{font-size:2.4rem;letter-spacing:-.02em;margin-bottom:18px}
.pg h2{font-size:1.5rem;margin-top:38px}
.pg .z-intro{margin-bottom:8px}

@media (max-width:860px){
  .pg h1{font-size:1.9rem}
  .pg h2{font-size:1.3rem}
  .cat-chips{gap:7px}
  .chip{padding:8px 13px;font-size:.82rem}
}

/* ===========================================================
   BLOG — /blog/ y /blog/detalles/{ID}/{slug}
   =========================================================== */

.bl-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:30px}
.bl{border:1px solid var(--line);border-radius:var(--rad);overflow:hidden;background:#fff;
    display:flex;flex-direction:column;transition:.18s}
.bl:hover{border-color:var(--r);box-shadow:0 10px 30px rgba(0,0,0,.07)}
.bl-img{display:block;aspect-ratio:16/10;background:var(--bg-2);overflow:hidden}
.bl-img img{width:100%;height:100%;object-fit:cover;transition:.4s}
.bl:hover .bl-img img{transform:scale(1.04)}
.bl-b{padding:20px 20px 24px;display:flex;flex-direction:column;gap:10px;flex:1}
.bl-b h2,.bl-b h3{font-size:1.22rem;line-height:1.3;font-weight:700;letter-spacing:-.01em}
.bl-b h3{font-size:1.05rem}
.bl-b h2 a,.bl-b h3 a{color:var(--ink)}
.bl-b h2 a:hover,.bl-b h3 a:hover{color:var(--r)}
.bl-b p{font-size:.92rem;line-height:1.6;color:var(--tx-2);flex:1}
.bl-b .lnk{align-self:flex-start}

.art{max-width:880px}
.art h1{font-size:2.5rem;line-height:1.14;letter-spacing:-.02em;margin-bottom:24px}
.art-img{width:100%;border-radius:var(--rad);margin-bottom:30px}
.art-body{font-size:1.06rem;line-height:1.78;color:var(--tx)}
.art-body h2{font-size:1.6rem;font-family:'Playfair Display',Georgia,serif;margin:36px 0 12px;letter-spacing:-.015em}
.art-body h3{font-size:1.18rem;font-weight:800;margin:28px 0 8px}
.art-body p{margin-bottom:16px}
.art-body ul,.art-body ol{margin:0 0 18px 22px}
.art-body li{margin-bottom:8px}
.art-body img{max-width:100%;height:auto;border-radius:var(--rad);margin:18px 0}
.art-body a{color:var(--r);font-weight:700;text-decoration:underline}
.art-body strong,.art-body b{font-weight:800}

@media (max-width:1000px){ .bl-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:22px} }
@media (max-width:640px){
  .bl-grid{grid-template-columns:minmax(0,1fr)}
  .art h1{font-size:1.85rem}
  .art-body{font-size:1rem}
  .art-body h2{font-size:1.35rem}
}

/* Blindaje de desborde en las páginas nuevas.
   Los nombres de producto y de ciudad pueden traer cadenas largas sin espacios;
   en pantallas de 390px eso empuja la caja y desliza la página de lado.
   (El html,body{overflow-x:hidden} de arriba es la red; esto es el arreglo real.) */
.z-intro,.z-texto p,.z-cols li,.z-cols a,.bl-b p,.bl-b h2,.bl-b h3,.art-body,.migas{overflow-wrap:anywhere}
.art-body pre,.art-body table{max-width:100%;overflow-x:auto;display:block}
.z-head h1,.pg h1,.art h1{overflow-wrap:break-word}

/* ===========================================================
   ARREGLO DE ACOMODO DEL TEXTO (Castro, 18-ago: "está mal acomodado")
   =========================================================== */

/* 🐛 El H1 traía max-width:19ch, pensado para los H1 cortos de zona.
   En el catálogo, "Sex shop en línea: Lencería" se partía en dos con una
   sola palabra abajo. Se sube el tope y, sobre todo, se deja que el
   navegador reparta las líneas parejas (text-wrap:balance). */
.z-head h1{max-width:24ch;text-wrap:balance}
.z-head-cat h1{max-width:30ch}

/* text-wrap:pretty evita la "viuda": esa palabra sola en el último renglón
   ("...en empaque / neutro."). Donde no lo soporte el navegador, no pasa nada. */
.z-intro,.z-texto p,.z-lista>p{text-wrap:pretty}
.z-intro{max-width:66ch}
.z-head-cat .z-intro{margin-bottom:26px}

/* --- interruptor de categorías (CSS puro, sin JS) --- */
.cats-tog:checked ~ .cat-chips .chip-x{display:inline-flex}
.cat-chips .chip-x{display:none}
.chip-mas{cursor:pointer;user-select:none;border-style:dashed;color:var(--r);border-color:var(--r)}
.chip-mas:hover{background:var(--r);color:#fff;border-color:var(--r)}
.chip-mas .mas-b{display:none}
.cats-tog:checked ~ .cat-chips .chip-mas .mas-a{display:none}
.cats-tog:checked ~ .cat-chips .chip-mas .mas-b{display:inline}

@media (max-width:860px){
  .z-head h1,.z-head-cat h1{max-width:none}
}

/* El interruptor va oculto a la vista pero SIGUE siendo enfocable con teclado
   (con `hidden` no se podría tabular hasta él). */
.cats-tog{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}
.cats-tog:focus-visible ~ .cat-chips .chip-mas{outline:2px solid var(--r);outline-offset:2px}

/* El párrafo de entrada del catálogo medía 66ch y partía dejando "empaque
   neutro." casi solo en el segundo renglón. A 56ch las dos líneas quedan
   parejas. (text-wrap:pretty ayuda, pero no todos los navegadores lo aplican.) */
.z-head-cat .z-intro{max-width:56ch}

/* Con max-width fijo el corte caía en medio de la frase en negritas
   ("envío discreto a todo / México"). `balance` reparte las líneas parejas y
   deja el corte donde no estorba. Se quita el tope estrecho para que decida el
   navegador. Donde no haya soporte, se ve como antes (no rompe nada). */
.z-head-cat .z-intro{max-width:70ch;text-wrap:balance}

/* ===========================================================
   ENCABEZADO A TODO EL ANCHO (Castro, 18-ago:
   "hay mucho espacio del lado derecho, hazlo al 100% del container")

   El bloque ocupaba ~60% y el resto quedaba muerto. Se abre a las dos
   columnas del contenedor completo. El texto NO se estira a 150 caracteres
   por renglón (sería ilegible): la columna derecha carga los dos botones y
   los datos de la compra, así el ancho se aprovecha de verdad y los CTA
   suben a la primera pantalla.
   =========================================================== */

.z-head-in{display:grid;grid-template-columns:minmax(0,1.35fr) minmax(0,.65fr);
           gap:56px;align-items:start;width:100%}
.z-head-tx{min-width:0}

/* al vivir en su columna, los topes en `ch` ya no hacen falta:
   la columna misma es el límite de línea */
.z-head-in h1{max-width:none}
.z-head-in .z-intro{max-width:none}

.z-card{border:1.5px solid var(--line);border-radius:var(--rad);padding:26px 26px 28px;
        background:var(--bg-2);position:sticky;top:18px}
.z-card-t{font-family:'Playfair Display',Georgia,serif;font-size:1.4rem;font-weight:700;
          letter-spacing:-.015em;margin-bottom:16px;color:var(--ink)}
.z-card-l{list-style:none;margin:0 0 22px;padding:0;display:flex;flex-direction:column;gap:11px}
.z-card-l li{position:relative;padding-left:26px;font-size:.94rem;line-height:1.5;color:var(--tx)}
.z-card-l li::before{content:"";position:absolute;left:0;top:.42em;width:13px;height:8px;
                     border-left:2.5px solid var(--r);border-bottom:2.5px solid var(--r);
                     transform:rotate(-45deg)}
.z-card-l b{font-weight:800}
/* dentro de la tarjeta los botones van apilados y a todo el ancho */
.z-card .z-cta{margin-top:0;flex-direction:column;gap:10px}
.z-card .z-btn{width:100%;justify-content:center;padding:15px 20px}

@media (max-width:1100px){
  .z-head-in{grid-template-columns:minmax(0,1fr);gap:32px}
  .z-card{position:static}
  .z-card .z-cta{flex-direction:row;flex-wrap:wrap}
  .z-card .z-btn{width:auto;flex:1 1 220px}
}
@media (max-width:520px){
  .z-card{padding:22px 20px 24px}
  .z-card .z-btn{width:100%;flex:1 1 100%}
}

/* Accesos rápidos bajo el texto del encabezado. Cierran el hueco vertical que
   dejaba la columna izquierda (la tarjeta de la derecha es más alta) y reparten
   enlaces internos a las categorías. */
/* "Enviamos a: Hermosillo, Nogales…" — llena la columna izquierda con enlaces
   de verdad en vez de aire, y le da texto propio a cada uno de los 32 estados. */
.z-ciudades{margin-top:16px;color:var(--tx-2);line-height:1.75;max-width:64ch}
.z-ciudades a{color:var(--tx);text-decoration:none;border-bottom:1px solid var(--line)}
.z-ciudades a:hover{color:var(--r);border-bottom-color:var(--r)}

.z-chips{display:flex;flex-wrap:wrap;gap:8px;margin-top:26px}
.z-chips .chip{padding:8px 15px;font-size:.85rem}
.chip-todo{border-color:var(--r);color:var(--r);font-weight:800}
.chip-todo:hover{background:var(--r);color:#fff;border-color:var(--r)}

@media (max-width:1100px){ .z-chips{margin-top:20px} }

/* 🐛 La rejilla base traía `repeat(4,1fr)`. Un `1fr` pelón equivale a
   `minmax(auto,1fr)`: la columna NO puede encogerse por debajo del contenido,
   así que alrededor de 1100 px las tarjetas empujaban 33 px fuera de la
   pantalla. Ya quedó `minmax(0,1fr)` arriba (es el mismo tropiezo que hubo en
   móvil el 17-ago; faltaba corregir la regla base, no solo las media queries).
   Y entre 1100 y 1200 px caben mejor 3 tarjetas que 4 apretadas. */
/* ⚠️ ACOTADA CON min-width A PROPÓSITO. Sin el `min-width:861px`, esta regla
   —que vive al FINAL del archivo— pisaba a las de 860px y 540px (en CSS gana
   la última con la misma especificidad) y ponía 3 columnas en un celular de
   390px: desborde de 11px. Es el mismo tropiezo de la `.p-d` duplicada.
   Al editar este archivo: revisar SIEMPRE contra qué otras media queries choca. */
@media (min-width:861px) and (max-width:1200px){
  .grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:22px}
}

/* ===========================================================
   Columna izquierda del encabezado — HUECO MUERTO
   -----------------------------------------------------------
   🔴 Historia, para que no se vuelva a hacer:

   18-ago: la tarjeta de la derecha es más alta que el texto, así que se ancló
   la fila de chips ABAJO con `margin-top:auto` para que las dos columnas
   cerraran parejo. Funciona **solo si el párrafo es largo**.

   19-ago (Castro, sobre /sonora y sobre el catálogo): en las zonas con pocas
   ciudades el párrafo son 2 renglones, y anclar los chips abajo abre un hueco
   de ~150 px **JUSTO EN MEDIO** de la columna. Se ve como error.

   👉 Regla: **el aire al final no se nota; el aire en medio parece un bug.**
   Los chips van pegados al texto y el sobrante cae abajo, donde no estorba.
   Por eso aquí NO hay `margin-top:auto` ni `align-items:stretch`.
   =========================================================== */
@media (min-width:1101px){
  .z-head-tx .z-chips{margin-top:22px}
  .z-head-tx .cat-chips{margin-top:22px}
  /* ⛔ NO poner display:none al checkbox: ya está oculto con position:absolute
     + opacity:0 (línea 932) justamente para que siga siendo enfocable con
     teclado. Con display:none no se podría tabular hasta "+17 categorías". */
  .z-card{align-self:start}
}

/* aire entre el encabezado y la rejilla de productos */
.z-head-in + .z-h2{margin-top:46px}
@media (max-width:860px){ .z-head-in + .z-h2{margin-top:34px} }

/* ===========================================================
   "Lo que más nos preguntan" — bloque bajo la ficha de producto.
   Acordeón nativo con <details>: sin JS, y el texto de las respuestas está
   en el HTML desde el primer byte (Google lo lee aunque estén cerradas).
   =========================================================== */
.faq{padding-top:0}
/* align-items:start — sin esto, la tarjeta CERRADA se estira hasta la altura de
   la abierta de su misma fila y queda con un hueco blanco raro debajo. */
.faq-lista{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px 26px;
           align-items:start}
.faq-i{border:1.5px solid var(--line);border-radius:var(--rad);background:var(--bg-2);
       padding:0;overflow:hidden;transition:border-color .2s}
.faq-i[open]{border-color:var(--r)}
.faq-i summary{list-style:none;cursor:pointer;padding:17px 20px;display:flex;gap:14px;
               align-items:flex-start;justify-content:space-between}
.faq-i summary::-webkit-details-marker{display:none}
.faq-q{font-weight:700;color:var(--ink);line-height:1.4;position:relative;padding-right:6px}
/* la flechita: gira al abrir */
.faq-i summary::after{content:"";flex:0 0 auto;width:9px;height:9px;margin-top:6px;
                      border-right:2.5px solid var(--r);border-bottom:2.5px solid var(--r);
                      transform:rotate(45deg);transition:transform .2s}
.faq-i[open] summary::after{transform:rotate(-135deg)}
.faq-t{flex:0 0 auto;font-size:.7rem;letter-spacing:.06em;text-transform:uppercase;
       font-weight:800;color:var(--tx-2);background:var(--bg);border:1px solid var(--line);
       border-radius:999px;padding:4px 10px;margin-left:auto;margin-right:12px}
.faq-i p{margin:0;padding:0 20px 19px;color:var(--tx);line-height:1.65;max-width:62ch}
.faq-i summary:focus-visible{outline:2px solid var(--r);outline-offset:-2px}
.faq-pie{margin-top:26px;color:var(--tx-2);font-size:.9rem}
.faq-pie b{color:var(--tx)}

@media (max-width:900px){
  .faq-lista{grid-template-columns:minmax(0,1fr)}
  .faq-t{display:none}          /* en móvil la etiqueta del tema estorba */
}

/* H2 con palabra clave (Castro, 19-ago): al meter "en nuestra tienda sex shop"
   el título creció y a 2.5rem se partía en tres renglones desiguales.
   Se le baja un punto el tamaño y se deja que el navegador reparta las líneas
   parejas con text-wrap:balance. */
.h2-key{font-size:clamp(1.5rem,2.6vw,2.05rem) !important;max-width:22ch;text-wrap:balance}
.sec-hd .h2-key{max-width:30ch}


/* ===========================================================
   El bloque de texto de abajo: se comía media pantalla en blanco
   -----------------------------------------------------------
   Castro (19-ago): "mucho espacio lado derecho".
   El párrafo tiene tope de 76ch (lo cómodo de leer son 45-75), así que en un
   contenedor de 1376px el 45% derecho quedaba muerto — y los botones abajo,
   fuera de vista.

   👉 Mismo criterio que ya se usó en el encabezado: el ancho no se rellena
      estirando el texto (ilegible), se rellena con los CTA. El texto va en la
      columna izquierda y los dos botones suben a la derecha, apilados y
      centrados: se ven sin bajar y el bloque cierra parejo.
   Solo en escritorio; apilado no aplica.
   =========================================================== */
@media (min-width:1101px){
  /* row-gap:0 explícito y no por omisión: el `span` de abajo crea filas vacías
     de 0px, y si alguien pusiera un `gap` general se sumarían todas y abriría
     un hueco enorme. */
  .z-texto{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,.4fr);
           column-gap:56px;row-gap:0;align-items:start}
  .z-texto > :not(.z-cta){grid-column:1}
  /* ⚠️ `grid-row:1 / -1` NO sirve aquí: el `-1` apunta a la última línea de la
     rejilla EXPLÍCITA, y como solo se declararon columnas, todas las filas son
     implícitas → el bloque se quedaba en la fila 1 y la estiraba a su altura,
     abriendo un hueco de 100px debajo del H2. Con `span` sí las cruza todas. */
  .z-texto .z-cta{grid-column:2;grid-row:1 / span 20;align-self:center;
                  flex-direction:column;margin-top:0}
  .z-texto .z-btn{width:100%;justify-content:center}
  /* el artículo del blog NO se parte en dos columnas: ahí el texto es el
     contenido, no un apoyo */
  .z-texto.art,.z-texto.pg{display:block}
}

/* ===========================================================
   Modal "se agregó al carrito" (Castro, 19-ago)
   Antes solo había un toast chiquito abajo: Castro le dio 5 clicks al botón
   sin ver que sí se agregaba. Esto NO se cierra solo, a propósito.
   =========================================================== */
.madd{position:fixed;inset:0;z-index:9999;display:flex;align-items:center;justify-content:center;
      padding:20px;opacity:0;transition:opacity .2s}
.madd.on{opacity:1}
.madd-bg{position:absolute;inset:0;background:rgba(12,11,13,.55);backdrop-filter:blur(2px)}
.madd-caja{position:relative;background:#fff;border-radius:calc(var(--rad) + 6px);
           padding:34px 30px 26px;width:100%;max-width:380px;text-align:center;
           box-shadow:0 24px 60px rgba(0,0,0,.28);transform:translateY(14px) scale(.97);
           transition:transform .22s cubic-bezier(.2,.9,.3,1.2)}
.madd.on .madd-caja{transform:none}
.madd-x{position:absolute;top:10px;right:12px;border:0;background:none;font-size:1.7rem;
        line-height:1;color:var(--tx-2);cursor:pointer;padding:4px 8px;border-radius:8px}
.madd-x:hover{background:var(--bg-2);color:var(--ink)}
/* la palomita: se dibuja sola al abrir, para que el ojo la cache */
.madd-ok{width:56px;height:56px;margin:0 auto 16px;border-radius:50%;background:rgba(37,211,102,.14);
         display:flex;align-items:center;justify-content:center}
.madd-ok svg{width:28px;height:28px;fill:none;stroke:var(--ok);stroke-width:2.6;
             stroke-linecap:round;stroke-linejoin:round;
             stroke-dasharray:26;stroke-dashoffset:26}
.madd.on .madd-ok svg{animation:maddCheck .4s .12s forwards}
@keyframes maddCheck{to{stroke-dashoffset:0}}
.madd-t{font-family:'Playfair Display',Georgia,serif;font-size:1.5rem;font-weight:700;
        letter-spacing:-.02em;color:var(--ink);margin:0 0 14px}
.madd-prod{display:flex;align-items:center;gap:12px;text-align:left;background:var(--bg-2);
           border:1px solid var(--line);border-radius:var(--rad);padding:10px 12px;margin-bottom:14px}
.madd-prod img{width:46px;height:46px;object-fit:contain;flex:0 0 auto;background:#fff;border-radius:6px}
.madd-prod span{font-size:.92rem;font-weight:700;color:var(--tx);line-height:1.35}
.madd-n{margin:0 0 18px;color:var(--tx-2);font-size:.92rem}
.madd-n b{color:var(--ink)}
.madd-ver{width:100%;justify-content:center;text-decoration:none}
.madd-seguir{display:block;width:100%;margin-top:10px;border:0;background:none;cursor:pointer;
             font:inherit;font-size:.9rem;font-weight:700;color:var(--tx-2);padding:11px}
.madd-seguir:hover{color:var(--r)}
@media (prefers-reduced-motion:reduce){
  .madd,.madd-caja{transition:none}
  .madd.on .madd-ok svg{animation:none;stroke-dashoffset:0}
}

/* ===========================================================
   CARRITO — "se ve jodido y triste" (Castro, 19-ago)
   1·2·3 = los pasos, sin color · 4 = medio contenedor vacío a su derecha.
   Se resuelven de una: los pasos dejan de ser tres pastillitas encogidas a la
   izquierda y pasan a ser una BARRA DE PROGRESO a todo el ancho.
   =========================================================== */
.pasos-3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:0;
         margin:0 0 40px;position:relative;border:0}
.pasos-3 li{position:relative;flex-direction:column;gap:10px;text-align:center;
            border:0;padding:0 8px;background:none;font-size:.9rem}
/* la línea que une los pasos: va detrás de los números */
.pasos-3 li::before{content:"";position:absolute;top:19px;left:calc(-50% + 20px);
                    width:calc(100% - 40px);height:3px;background:var(--line);z-index:0}
.pasos-3 li:first-child::before{display:none}
.pasos-3 li.ok::before,.pasos-3 li.on::before{background:var(--ok)}
.pasos-3 span{position:relative;z-index:1;width:38px;height:38px;font-size:.98rem;font-weight:800;
              border:3px solid var(--line);background:#fff;color:var(--tx-2);transition:.2s}
/* el paso ACTUAL: rojo de la marca, con halo, para que se vea dónde va uno */
.pasos-3 .on{color:var(--ink);font-weight:800}
.pasos-3 .on span{background:var(--r);border-color:var(--r);color:#fff;
                  box-shadow:0 0 0 5px rgba(206,56,56,.14)}
/* los ya hechos: verde con palomita en vez del número */
.pasos-3 .ok{color:var(--tx)}
.pasos-3 .ok span{background:var(--ok);border-color:var(--ok);color:#062e16;font-size:0}
.pasos-3 .ok span::after{content:"✓";font-size:1.1rem;font-weight:800}
@media (max-width:560px){
  .pasos-3{margin-bottom:28px}
  .pasos-3 li{font-size:.74rem}
  .pasos-3 span{width:32px;height:32px}
  .pasos-3 li::before{top:16px}
}

/* --- las filas del carrito: con FOTO, que es lo que les faltaba --- */
.ci{grid-template-columns:auto 1fr auto auto auto}
.ci-img{width:66px;height:66px;flex:0 0 auto;border:1px solid var(--line);border-radius:10px;
        background:var(--bg-2);overflow:hidden;display:block}
.ci-img img{width:100%;height:100%;object-fit:contain;transition:transform .3s}
.ci-img:hover img{transform:scale(1.07)}
.ci-img-no{display:block}
.ci h3 a{color:inherit;text-decoration:none}
.ci h3 a:hover{color:var(--r)}
.ci-sub{color:var(--ink)}
@media (max-width:640px){
  .ci{grid-template-columns:auto 1fr;gap:12px 14px}
  .ci-img{width:56px;height:56px;grid-row:span 2}
  .ci-cant{grid-column:2}
  .ci-sub{grid-column:2;text-align:left;font-size:1.15rem}
  .ci-del{position:absolute;top:10px;right:10px}
  .ci{position:relative}
}

/* --- el resumen: que el total se vea y los sellos den confianza --- */
.ck-total b{color:var(--r)}
.ck-sellos{list-style:none;margin:16px 0 0;padding:14px 0 0;border-top:1px solid var(--line)}
.ck-sellos li{display:flex;align-items:flex-start;gap:10px;padding:6px 0;
              font-size:.83rem;color:var(--tx-2);line-height:1.4}
.ck-sellos b{color:var(--tx);font-weight:700}
.ck-sellos .ic{width:17px;height:17px;color:var(--ok);margin-top:1px;flex:0 0 auto}

/* ===========================================================
   CHECKOUT sin distracciones (Castro, 19-ago)
   header/footer propios para /tienda/carrito/, /datos/ y /gracias/.
   Ver include/headercarrito.php para el porqué de cada cosa que NO está.
   =========================================================== */
.body-ck{background:var(--bg)}
.hdck{background:#fff;border-bottom:1px solid var(--line);position:sticky;top:0;z-index:60}
.hdck-in{display:flex;align-items:center;gap:24px;padding:16px 32px}
.hdck-logo{flex:0 0 auto;display:block}
.hdck-logo img{height:34px;width:auto;display:block}
/* el sello del centro: es la razón por la que la gente compra aquí y no en la
   esquina, así que va en el encabezado del checkout, no escondido abajo */
.hdck-seg{display:flex;align-items:center;gap:10px;margin:0 auto 0 auto;color:var(--tx-2);font-size:.82rem}
.hdck-seg .ic{width:20px;height:20px;color:var(--ok);flex:0 0 auto}
.hdck-seg span{display:flex;flex-direction:column;line-height:1.25}
.hdck-seg b{color:var(--tx);font-weight:700;font-size:.86rem}
.hdck-seg small{font-size:.76rem}
.hdck-wa{flex:0 0 auto;display:inline-flex;align-items:center;gap:9px;text-decoration:none;
         border:1.5px solid rgba(37,211,102,.4);background:rgba(37,211,102,.08);
         color:var(--tx);border-radius:999px;padding:9px 16px;font-size:.85rem;transition:.18s}
.hdck-wa .ic-wa{width:18px;height:18px;color:var(--ok)}
.hdck-wa b{font-weight:800}
.hdck-wa:hover{background:var(--ok);border-color:var(--ok);color:#062e16}
.hdck-wa:hover .ic-wa{color:#062e16}

.ftck{border-top:1px solid var(--line);background:var(--bg-2);margin-top:40px;padding:26px 0 22px}
.ftck .wrap{padding-left:32px;padding-right:32px}
.ftck-sellos{list-style:none;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));
             gap:14px 26px;margin:0 0 20px;padding:0}
.ftck-sellos li{display:flex;align-items:flex-start;gap:10px;font-size:.84rem;color:var(--tx-2);line-height:1.4}
.ftck-sellos b{color:var(--tx);font-weight:700}
.ftck-sellos .ic{width:18px;height:18px;color:var(--ok);margin-top:1px;flex:0 0 auto}
.ftck-pie{display:flex;flex-wrap:wrap;gap:10px 22px;justify-content:space-between;
          align-items:center;border-top:1px solid var(--line);padding-top:16px;
          font-size:.78rem;color:var(--tx-2)}
.ftck-legal{display:flex;gap:18px;flex-wrap:wrap}
.ftck-legal a{color:var(--tx-2);text-decoration:none;border-bottom:1px solid transparent}
.ftck-legal a:hover{color:var(--r);border-bottom-color:var(--r)}

@media (max-width:760px){
  .hdck-in{flex-wrap:wrap;gap:12px 16px;padding:14px 20px}
  .hdck-seg{order:3;flex:1 1 100%;margin:0}
  .hdck-wa{margin-left:auto}
  .ftck .wrap{padding-left:20px;padding-right:20px}
  .ftck-sellos{grid-template-columns:minmax(0,1fr)}
}

/* El check de +18, ya dentro del resumen y pegado al botón (Castro, 19-ago).
   Se marca en rojo suave para que se lea como requisito, no como letra chica. */
.ck-tot .ck-check{margin:18px 0 0 !important;padding:13px 15px;font-size:.84rem;
                  background:rgba(206,56,56,.05);border:1px solid rgba(206,56,56,.18)}
.ck-tot .ck-check span{line-height:1.45;color:var(--tx-2)}
.ck-tot .ck-check b{color:var(--tx)}
.ck-tot .ck-check + .ck-seguir{margin-top:12px}

/* Si el CRM decide pintar SU botón flotante de WhatsApp (.w2024_button_float,
   fixed abajo a la derecha), se esconde el nuestro: caen en el mismo lugar y
   dos botones encimados se ven peor que ninguno. Ver include/codigos.php. */
body:has(.w2024_button_float) .wa-f{display:none}

/* ===========================================================
   Logo REAL de WhatsApp en todos los botones (Castro, 19-ago:
   "los botones de whatsapp en la nueva no tienen icono de whatsapp").
   Antes había un globito genérico dibujado a trazo; ahora es el logo de la
   marca, que es un path RELLENO — por eso no puede usar la clase `.ic` del
   sitio (esa es `fill:none; stroke:currentColor`).
   Toma el tamaño del contexto con `em`, así sirve igual en la barra de arriba
   que en un botón grande, sin una regla por cada lugar.
   =========================================================== */
.ic-wa{width:1.25em;height:1.25em;fill:currentColor;stroke:none;flex:0 0 auto}
.tb-wa .ic-wa{width:1.05em;height:1.05em}
.wa-f .ic-wa{width:28px;height:28px}
.btn-wa2 .ic-wa,.btn-wa .ic-wa,.z-btn2 .ic-wa{width:20px;height:20px}

/* ===========================================================
   /categorias-sex-shop — las 29 categorías en cards uniformes.
   "Uniforme" es lo importante: las fotos del catálogo vienen de todos tamaños
   y proporciones, así que la caja fija la proporción y `object-fit:cover`
   recorta. Si se dejara al natural, la rejilla quedaría como escalera.
   =========================================================== */
.cat-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:22px}
.cg{display:flex;flex-direction:column;text-decoration:none;border:1.5px solid var(--line);
    border-radius:var(--rad);overflow:hidden;background:#fff;transition:.2s}
.cg:hover{border-color:var(--r);transform:translateY(-3px);box-shadow:0 10px 26px rgba(0,0,0,.07)}
.cg-img{display:block;aspect-ratio:4/3;background:var(--bg-2);overflow:hidden;position:relative}
.cg-img img{width:100%;height:100%;object-fit:cover;transition:transform .45s}
.cg:hover .cg-img img{transform:scale(1.06)}
/* sin foto: la inicial en grande, mejor que un hueco blanco */
.cg-ini{position:absolute;inset:0;display:grid;place-items:center;
        font-family:'Playfair Display',Georgia,serif;font-size:3.2rem;font-weight:700;
        color:var(--line)}
.cg-b{padding:15px 17px 17px;display:flex;flex-direction:column;gap:3px}
.cg-n{font-weight:800;font-size:1rem;color:var(--ink);line-height:1.3}
.cg:hover .cg-n{color:var(--r)}
.cg-c{font-size:.82rem;color:var(--tx-2)}

@media (max-width:1100px){ .cat-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:18px} }
@media (max-width:760px){  .cat-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}
                           .cg-n{font-size:.92rem} }
@media (max-width:400px){  .cat-grid{gap:11px} .cg-b{padding:12px 13px 14px} }

/* encabezado de /categorias-sex-shop: una sola columna (ver el porqué en el
   propio categorias.php) y los datos de la compra en franja horizontal, que
   usa el ancho completo en vez de dejarlo muerto. */
.cat-head{padding-bottom:38px}
/* dos columnas: el texto a la izquierda con su ancho legible, los CTA a la
   derecha llenando lo que sobra. Ver el porqué en categorias.php. */
.cat-head-in{display:grid;grid-template-columns:minmax(0,1.25fr) minmax(0,.55fr);
             gap:48px;align-items:center;margin-bottom:26px}
.cat-head-tx{min-width:0}
.cat-head h1{max-width:22ch;margin-bottom:16px}
.cat-head .z-intro{max-width:58ch;margin:0}
.cat-head-cta .z-cta{margin-top:0;flex-direction:column;gap:11px}
.cat-head-cta .z-btn{width:100%;justify-content:center}
@media (max-width:900px){
  .cat-head-in{grid-template-columns:minmax(0,1fr);gap:24px;align-items:start}
  .cat-head-cta .z-cta{flex-direction:row;flex-wrap:wrap}
  .cat-head-cta .z-btn{width:auto;flex:1 1 220px}
}
@media (max-width:520px){ .cat-head-cta .z-btn{width:100%;flex:1 1 100%} }
.cat-sellos{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:10px 26px}
.cat-sellos li{position:relative;padding-left:26px;font-size:.92rem;color:var(--tx-2)}
.cat-sellos li::before{content:"";position:absolute;left:0;top:.42em;width:13px;height:8px;
                       border-left:2.5px solid var(--r);border-bottom:2.5px solid var(--r);
                       transform:rotate(-45deg)}
.cat-sellos b{color:var(--tx);font-weight:800}

/* ===========================================================
   .z-texto-2c — bloque de texto LARGO repartido en dos columnas de contenido.
   (Castro, 20-ago: "queda mucho espacio en blanco… abusado")

   🔴 El error que corrige: la regla genérica de `.z-texto` mete el texto en la
   columna 1 y los CTA en la 2. Eso funciona con un texto CORTO (catálogo), pero
   en zona y en las 744 fichas el texto mide 350-380 px de alto contra 134 px de
   botones — o directamente NO había botones y la mitad derecha quedaba vacía.

   👉 La regla: cuando el bloque es largo, no se rellena el hueco con un botón;
      se REPARTE el contenido que ya existe entre las dos columnas.
   =========================================================== */
.z-texto-2c{display:grid !important;grid-template-columns:repeat(2,minmax(0,1fr));
            column-gap:56px;row-gap:0;align-items:start}
.z-texto-2c > .tx-a,
.z-texto-2c > .tx-b{grid-column:auto;min-width:0}
.z-texto-2c .z-cta{margin-top:28px}
/* los topes de línea salen sobrando: ahora la columna ES el límite */
.z-texto-2c p{max-width:none}
@media (max-width:900px){
  .z-texto-2c{grid-template-columns:minmax(0,1fr);row-gap:8px}
}
