/* MICHEMICALDATALAB — CARRITO V2 (preview) — checkout de cotización sobre app.js REAL
   ------------------------------------------------------------------------
   Se carga JUNTO a /home-v2.css (tokens/header/#pf-grid/#pf-glow/#pf-fluid/.pf-techbar/
   .pf-wa-float — reutilizados sin cambios, igual que en apis.html/catalogo.html/gratis.html)
   + /site-scroll-indicator.css. Este archivo SOLO re-skinea las clases REALES que genera
   app.js (sin tocarlo): #cartList/.cart-line/.qty-row/.empty-state, #cartSummary/
   .summary-row, #checkoutCard/#checkoutForm/.form-label/.form-control/.notice,
   .btn(.whatsapp/.secondary/.block). Ningún selector fue inventado — todos verificados
   leyendo app.js completo (renderCartPage() líneas 275-320, setupCheckout() líneas
   347-393, updateCartCount() línea 134-137) y carrito.html real. NO se carga /styles.css.

   BUG LEGACY 1024px (ver REPORTE FINAL "LEGACY 1024 OVERFLOW ROOT CAUSE"): styles.css:341
   define .cart-layout{grid-template-columns:1.15fr .85fr} y styles.css:397 lo colapsa a
   grid-template-columns:1fr en @media(max-width:1080px) — AMBOS son pistas fr BARE, sin
   minmax(0,...), el mismo patrón de bug ya diagnosticado y corregido en Academia (permite
   que el min-content de los hijos infle la pista más allá del contenedor). Aquí NINGUNA
   pista nueva se declara sin minmax(0,...), sin excepción (PASO 32). */

/* ============ INTRO — mismo patrón real ya usado en apis-v2.css/gratis-v2.css. Texto
   EXACTO de carrito.html:38-40, sin inventar. ============ */
.cv2-intro {
  position: relative;
  padding: 140px 56px 40px;
}
.cv2-intro::before {
  content: "";
  position: absolute; inset: 0; z-index: 0;
  background: #fbfaf4;
  pointer-events: none;
}
.cv2-intro-inner {
  position: relative; z-index: 4;
  max-width: 760px;
}
.cv2-eyebrow {
  display: inline-flex; align-items: center; gap: 8px;
  font-family: var(--font-label); font-size: 11px; letter-spacing: .1em; text-transform: uppercase;
  color: var(--ink); opacity: .78; margin: 0 0 14px;
}
.cv2-eyebrow .dot { width: 6px; height: 6px; border-radius: 50%; background: rgb(192, 254, 4); }
.cv2-intro h1 {
  font-family: var(--font-display); font-weight: 700; letter-spacing: -.025em;
  font-size: clamp(1.9rem, 3.8vw, 2.8rem); line-height: 1.05; color: var(--ink); margin: 0 0 16px;
}
.cv2-intro-lead {
  font-family: var(--font-mono); font-weight: 500; font-size: 15px; line-height: 1.6;
  color: var(--ink); max-width: 62ch; margin: 0;
}

/* ============ LAYOUT — ETAPA "COMPACTO + CENTRADO": la etapa anterior quitó el max-width
   de .cv2-section-inner (quedaba pegado a la izquierda sin él) y eso SÍ centró el bloque,
   pero lo dejó ocupando el 100% del padding disponible (1328px a 1440px) — visualmente
   "casi full width", no lo pedido. Auditoría de anchos REALES ya aprobados en V2 (home-v2.css/
   catalogo-v2.css/apis-v2.css/facturacion-v2.css/gratis-v2.css): ningún archivo V2 define un
   wrapper de contenido compacto Y centrado por debajo de 1320px (.gv2-detail-inner usa
   1320px+margin-inline:auto, el mismo valor ya descartado por casi no diferir del ancho
   disponible; .apiv2-inner no define max-width, ocupa todo el padding). La referencia
   compacta+centrada REAL más cercana está en el propio shell de Facturación V2 (que sí
   contiene formularios/cards aprobados visualmente): styles.css:93, `.container { width:
   min(1180px, calc(100% - 34px)); margin: 0 auto; }` — usada tal cual, en vivo, dentro del
   HTML real de facturacion.html (`<div class="container fe-title-tools">`, ver
   public/facturacion.html). Se porta aquí el mismo VALOR (1180px) y el mismo MECANISMO de
   centrado (margen automático simétrico), con la sintaxis moderna equivalente
   (margin-inline:auto) ya usada en el resto de este archivo, en vez de repetir el propio
   calc(100% - 34px) de .container (redundante: .cv2-section ya reduce su padding en
   responsive por su cuenta). ============ */
.cv2-section {
  position: relative;
  padding: 8px 56px 64px;
}
.cv2-section-inner { position: relative; z-index: 4; max-width: 1180px; margin-inline: auto; }
.cart-layout {
  display: grid;
  grid-template-columns: minmax(0, 1.15fr) minmax(0, .85fr);
  gap: 18px;
  align-items: start;
}

/* ============ CARD REAL — mismo panel plano ya usado en apis-v2.css/gratis-v2.css
   (fondo blanco, borde var(--line), radius 18px, sin sombra ni gradiente). ============ */
.cart-card, .panel-card {
  background: #fff; border: 1px solid var(--line); border-radius: 18px; padding: 22px; min-width: 0;
}
.cart-card + .cart-card { margin-top: 16px; }
.cart-card .section-head { display: flex; justify-content: space-between; gap: 16px; align-items: flex-end; margin-bottom: 18px; flex-wrap: wrap; }
.cart-card .section-head h2, .cart-card h2, .panel-card h2 {
  margin: 0; color: var(--ink); font-family: var(--font-display); font-weight: 700; font-size: 20px;
}
.cart-card .section-head p {
  margin: 4px 0 0; color: var(--muted); font-family: var(--font-mono); font-size: 13px;
}

/* ============ #cartList → .cart-line REAL (app.js:297-310). Pista minmax(0,1fr) en vez de
   1fr (styles.css:344, mismo bug class). ============ */
.cart-line {
  display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 14px;
  padding: 16px 0; border-bottom: 1px solid var(--line);
}
.cart-line:last-child { border-bottom: 0; }
.cart-line h3 { margin: 0 0 6px; color: var(--ink); font-family: var(--font-display); font-weight: 700; font-size: 16px; min-width: 0; }
.cart-line p { margin: 0; color: var(--muted); font-family: var(--font-mono); font-size: 12.5px; min-width: 0; }
.qty-row { display: flex; align-items: center; gap: 8px; justify-content: end; }
.qty-row button {
  width: 34px; height: 34px; border-radius: 8px; border: 1px solid var(--line); background: #fff;
  color: var(--ink); font-family: var(--font-label); font-weight: 700; cursor: pointer;
  transition: border-color .15s ease, background .15s ease;
}
.qty-row button:hover { border-color: rgb(192,254,4); background: rgba(192,254,4,.12); }
.qty-row strong { min-width: 24px; text-align: center; color: var(--ink); font-family: var(--font-mono); font-weight: 700; }

/* ============ empty-state — texto REAL de app.js:284-290, sin inventar copy nuevo. Sin
   grid-column:1/-1 (styles.css:355): #cartList no es un grid en este re-skin, esa
   propiedad no aplicaría a nada aquí. ============ */
.empty-state {
  text-align: center; padding: 44px 18px; color: var(--muted);
  font-family: var(--font-mono); font-size: 14px; line-height: 1.6; min-width: 0;
}
.empty-state strong {
  display: block; margin-bottom: 8px; color: var(--ink);
  font-family: var(--font-display); font-weight: 700; font-size: 20px;
}

/* ============ #cartSummary → .summary-row REAL (app.js:313-318). ============ */
.summary-row {
  display: flex; justify-content: space-between; align-items: center; gap: 12px;
  padding: 12px 0; border-bottom: 1px solid var(--line);
  font-family: var(--font-mono); font-size: 13px; color: var(--ink);
}
.summary-row:last-of-type { border-bottom: 0; }
.summary-row strong { font-family: var(--font-mono); font-weight: 700; font-size: 15px; }
.summary-row.total strong { font-family: var(--font-display); font-size: 24px; color: rgb(192,254,4); -webkit-text-stroke: .5px var(--ink); }

/* ============ #checkoutCard/#checkoutForm — hooks REALES (app.js:347-393), sin tocar
   payload/validación/POST/WhatsApp. .hidden es la clase real que renderCartPage() alterna
   (app.js:292). ============ */
.hidden { display: none !important; }
.form-grid { display: grid; gap: 12px; }
.form-label { display: grid; gap: 6px; font-family: var(--font-label); font-size: 11px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: var(--muted); }
.form-control {
  min-height: 46px; min-width: 0; width: 100%; border: 1px solid var(--line); border-radius: 10px;
  background: rgba(255,255,255,.7); color: var(--ink); padding: 0 14px;
  font-family: var(--font-mono); font-size: 14px; outline: none;
  transition: border-color .15s ease, box-shadow .15s ease, background .15s ease;
}
textarea.form-control { min-height: 96px; padding: 12px 14px; resize: vertical; }
.form-control:focus { background: rgba(255,255,255,.9); border-color: rgb(192,254,4); box-shadow: 0 0 0 3px rgba(192,254,4,.35); }
.notice {
  border: 1px solid var(--line); border-radius: 12px; padding: 12px 14px;
  background: rgba(192,254,4,.10); color: var(--ink); font-family: var(--font-mono); font-size: 12.5px; line-height: 1.55;
}

/* ============ BOTONES — lima V2 aprobado (idéntico a apis-v2.css/gratis-v2.css), +
   variante whatsapp real (styles.css:158, sin cambios de color/marca: es el botón real del
   flujo de checkout, no se toca). ============ */
.btn {
  font-family: var(--font-label); font-size: 12px; letter-spacing: .06em; text-transform: uppercase;
  min-height: 46px; padding: 0 18px; border-radius: 6px; border: 1px solid transparent;
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  cursor: pointer; text-decoration: none; background: none;
  transition: background .2s ease, transform .15s ease, border-color .15s ease, color .15s ease;
}
.btn:not(.secondary):not(.whatsapp) { background: rgb(192, 254, 4); color: rgb(0, 0, 0); }
.btn:not(.secondary):not(.whatsapp):hover { background: rgb(170, 238, 0); transform: translateY(-1px); }
.btn.secondary { background: transparent; color: var(--ink); border-color: var(--line); }
.btn.secondary:hover { border-color: rgba(10,14,20,.28); transform: translateY(-1px); }
.btn.whatsapp { background: linear-gradient(135deg, #20c76b, #36d399); color: #062915; box-shadow: 0 18px 34px rgba(32,199,107,.24); }
.btn.whatsapp:hover { transform: translateY(-1px); }
.btn:focus-visible { outline: 2px solid rgb(192, 254, 4); outline-offset: 2px; }
.btn.block { width: 100%; }

/* ============ cart icon/counter en el header — .pf-cart real (mismo patrón de
   apis.html/catalogo.html), conserva .cart-count (hook REAL de updateCartCount(),
   app.js:134-137, sin cambiar selector/semántica). ============ */
.pf-cart {
  font-family: var(--font-label); font-size: 13px; letter-spacing: .04em;
  border: 1px solid var(--line); border-radius: 999px; padding: 8px 14px;
  display: flex; align-items: center; gap: 6px; color: var(--ink); text-decoration: none; opacity: .9;
}
.pf-cart:hover { opacity: 1; border-color: rgba(192,254,4,.5); }

/* ============ CIERRE — mismo patrón real de catalogo.html/apis.html/gratis.html. ============ */
.cv2-close { position: relative; padding: 48px 56px 96px; text-align: center; }
.cv2-close-mark { font-family: var(--font-display); font-weight: 700; font-size: 15px; letter-spacing: -.01em; color: var(--ink); }
.cv2-close-line { font-family: var(--font-label); font-size: 11px; letter-spacing: .08em; text-transform: uppercase; color: var(--muted); margin-top: 8px; }

/* ============ SEGURIDAD 320px — mismo fix ya aprobado (apis-v2.css/gratis-v2.css). ============ */
@media (max-width: 400px) {
  .pf-brandname { display: none; }
}

/* ============ RESPONSIVE — breakpoint real de .cart-layout (styles.css:394, 1080px) y de
   .cart-line (styles.css:425/431, 520px), minmax(0,1fr) en TODAS las pistas nuevas
   (PASO 32/33: 0px overflow en 1440/1024/768/390/375/360/320). ============ */
@media (max-width: 1080px) {
  .cv2-intro { padding: 120px 24px 32px; }
  .cv2-section { padding: 8px 24px 56px; }
  .cart-layout { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 620px) {
  .cart-line { grid-template-columns: minmax(0, 1fr); }
  .qty-row { justify-content: flex-start; }
  .cv2-close { padding: 40px 24px 80px; }
}
