/* ═══════════════════════════════════════════════════════════════════════════
   AHNSA — navegador de catálogo
   El sistema de McMaster-Carr, con la paleta y el idioma de AHNSA.
   ───────────────────────────────────────────────────────────────────────────

   QUÉ SE COPIA Y POR QUÉ
   ----------------------
   McMaster vende 800,000 piezas y su navegación se siente instantánea. No es
   magia: **la UI de filtros es una función pura de un modelo JSON**. Mandan el
   árbol de decisión completo al navegador y dejan que él recalcule. Eso es lo
   que se replica aquí, y en un punto los superamos: ellos NO pueden recalcular
   los conteos del lado del cliente (su `partNumberBitset` va ofuscado en
   base64); nosotros somos dueños del dato y sí podemos.

   Las cuatro reglas medidas en su CSS que valen su peso en oro:

     1. Los valores son TEXTO, no controles. Ni checkbox, ni pastilla, ni
        select. Un checkbox cuesta ~20 px por renglón; a 26 atributos × 11
        valores eso es pantalla y media de nada.
     2. Seleccionado = palomita + sangría de 20 px. NO una pastilla rellena. El
        renglón no cambia de alto ni de color, así que **la lista nunca se
        reacomoda** al elegir. Es la diferencia entre un filtro que se siente
        sólido y uno que brinca.
     3. Exactamente 11 valores y luego "ver más". Tope duro.
     4. "Quitar" vive absoluto en la esquina del atributo y está en
        `display:none` hasta que ese atributo tiene selección. Cero cromo hasta
        que sirve.

   LOS DOS ACENTOS
   ---------------
   Lo más inteligente de su paleta es que tienen DOS acentos con trabajos
   distintos y ninguno invade al otro:

        verde  #336633  = navegar   (ligas, encabezados)
        ámbar  #fed700  = estás aquí (renglón actual)
        morado #8c00c8  = ya lo viste

   Traducirlo a AHNSA tiene una trampa: nuestro acento es azul y el marino es
   azul, así que si "navegar" y "estás aquí" fueran los dos azules, el sistema
   se colapsa a un solo acento y se pierde justo lo que lo hace funcionar.
   Por eso "estás aquí" es ÁMBAR. No es un capricho: el carburo recubierto es
   dorado, sale dorado en todas nuestras fotos de producto, y es el único color
   cálido que este sitio ya tenía. El ámbar no compite con el marino, lo señala.

   El morado de "visitado" es un guiño de 1995 a propósito. En un catálogo de
   21,564 piezas, "¿ya vi esta?" es una pregunta real, y la respuesta más barata
   que existe son 3 bytes de color.
   ═══════════════════════════════════════════════════════════════════════════ */

.ahnav {
  /* tinta */
  --nav-tinta:      #14213D;   /* texto principal          15.1:1 sobre blanco */
  --nav-tinta-2:    #4A5666;   /* secundario                8.2:1 */
  --nav-tinta-3:    #6B7684;   /* terciario                 5.0:1 */
  --nav-conteo:     #78838F;   /* conteos                   4.6:1 */

  /* estructura */
  --nav-linea:      #D5DCE5;
  --nav-linea-2:    #EDF1F6;
  --nav-fondo:      #FFFFFF;
  --nav-lavado:     #F4F7FB;   /* hover / zebra */

  /* acento 1 — NAVEGAR */
  --nav-marino:     #0A1E5E;   /* encabezados de atributo  14.0:1 */
  --nav-liga:       #0F4C7A;   /* ligas                     8.3:1 */
  --nav-liga-alta:  #1878B9;   /* hover de liga */

  /* acento 2 — ESTÁS AQUÍ */
  --nav-aqui:       #B26A00;   /* texto sobre claro: ámbar oscuro, 4.8:1 */
  --nav-aqui-vivo:  #F2A93B;   /* el ámbar como relleno / barra */
  --nav-aqui-suave: #FFF4E0;   /* banda de fondo */

  /* acento 3 — YA LO VISTE */
  --nav-visto:      #6B3FA0;   /* 6.5:1 */

  color: var(--nav-tinta);
  background: var(--nav-fondo);
  /* 13 px, no 16. Un comprador compara 40 piezas casi idénticas en 12
     dimensiones: el trabajo es que quepan en una pantalla, no que se lean
     cómodas. McMaster usa 12 px en TODO; 13 es nuestra concesión, y el piso
     duro de 12 px del sitio se respeta en los conteos. */
  font-size: 13px;
  line-height: 1.4;
}

/* Los números SIEMPRE tabulares: es lo que hace que los puntos decimales se
   apilen en columna y que 8.5 y 12.7 se puedan comparar de un vistazo. */
.ahnav [data-num], .ahnav .nav-conteo, .ahnav td.num, .ahnav th.num {
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
}

/* ───────────────────────────────────────────────────────────────────────────
   ENCABEZADO DE LA FAMILIA
   ─────────────────────────────────────────────────────────────────────────── */
.ahnav-cab { padding: 0 0 14px; }
.ahnav-migas {
  font-size: 12px; color: var(--nav-tinta-3); margin: 0 0 8px;
  display: flex; flex-wrap: wrap; align-items: center; gap: 6px;
}
.ahnav-migas a { color: var(--nav-liga); text-decoration: none; }
.ahnav-migas a:hover { color: var(--nav-liga-alta); text-decoration: underline; }
.ahnav-migas span[aria-hidden] { color: var(--nav-conteo); }

.ahnav-titulo {
  font-size: clamp(24px, 3vw, 32px); line-height: 1.1; margin: 0 0 4px;
  color: var(--nav-marino); font-weight: 800; letter-spacing: -.01em;
}
.ahnav-sub { margin: 0 0 2px; color: var(--nav-tinta-2); max-width: 62ch; }
.ahnav-cuenta { margin: 6px 0 0; color: var(--nav-tinta-2); font-size: 13px; }
.ahnav-cuenta b { color: var(--nav-marino); font-weight: 700; }

/* ───────────────────────────────────────────────────────────────────────────
   GRUPOS DE INTENCIÓN — el piso de arriba que faltaba
   ---------------------------------------------------------------------------
   Esto es lo que McMaster tiene y nosotros no teníamos: en vez de mandar al
   visitante a 3,976 insertos con filtros, lo mandan a ~7 grupos con nombre
   humano y una línea de CUÁNDO usarlo. No es un filtro: es alguien decidiendo
   por ti. El conteo en cada tarjeta es el punto — siempre sabes qué tan grande
   es el cuarto antes de entrar.
   ─────────────────────────────────────────────────────────────────────────── */
.ahnav-grupos { margin: 0 0 26px; }
.ahnav-grupos-h {
  font-size: 12px; text-transform: uppercase; letter-spacing: .08em;
  color: var(--nav-marino); font-weight: 700; margin: 0 0 10px;
  padding-bottom: 6px; border-bottom: 2px solid var(--nav-marino);
}
.ahnav-tiles {
  list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: repeat(auto-fill, minmax(232px, 1fr));
  gap: 1px; background: var(--nav-linea-2);
  border: 1px solid var(--nav-linea-2);
}
.ahnav-tile > a {
  display: flex; flex-direction: column; gap: 3px; height: 100%;
  background: var(--nav-fondo); padding: 11px 13px; text-decoration: none;
  color: var(--nav-tinta); transition: background .12s ease;
}
.ahnav-tile > a:hover { background: var(--nav-lavado); }
.ahnav-tile > a:focus-visible { outline: 2px solid var(--nav-liga-alta); outline-offset: -2px; }
.ahnav-tile-t { color: var(--nav-liga); font-weight: 700; font-size: 14px; }
.ahnav-tile > a:hover .ahnav-tile-t { color: var(--nav-liga-alta); }
.ahnav-tile > a:visited .ahnav-tile-t { color: var(--nav-visto); }
.ahnav-tile-c { color: var(--nav-tinta-3); font-size: 12px; line-height: 1.35; }
.ahnav-tile-n { margin-top: auto; padding-top: 5px; color: var(--nav-conteo); font-size: 12px; }

/* ───────────────────────────────────────────────────────────────────────────
   BARRA DE SELECCIÓN
   Aparece sólo cuando hay algo elegido. Es la banda ámbar: "estás aquí".
   ─────────────────────────────────────────────────────────────────────────── */
.ahnav-sel {
  display: flex; align-items: center; flex-wrap: wrap; gap: 8px;
  background: var(--nav-aqui-suave); border: 1px solid #EFD9B0;
  border-left: 3px solid var(--nav-aqui-vivo);
  padding: 8px 12px; margin: 0 0 14px; font-size: 12px;
}
.ahnav-sel[hidden] { display: none; }
.ahnav-sel-r { font-weight: 700; color: var(--nav-aqui); }
.ahnav-ficha {
  display: inline-flex; align-items: center; gap: 7px;
  background: var(--nav-fondo); border: 1px solid var(--nav-linea);
  padding: 3px 5px 3px 8px; border-radius: 3px;
}
.ahnav-ficha i { font-style: normal; color: var(--nav-tinta-3); }
.ahnav-ficha b { font-weight: 600; color: var(--nav-tinta); }
.ahnav-ficha button {
  border: 0; background: none; cursor: pointer; color: var(--nav-tinta-3);
  font-size: 15px; line-height: 1; padding: 2px 4px; border-radius: 3px;
}
.ahnav-ficha button:hover { color: #B3261E; background: #FDECEA; }
.ahnav-limpiar {
  margin-left: auto; background: none; border: 0; cursor: pointer;
  color: var(--nav-liga); text-decoration: underline; font: inherit; padding: 4px;
}
.ahnav-limpiar:hover { color: var(--nav-liga-alta); }

/* ───────────────────────────────────────────────────────────────────────────
   LA REJILLA DE FILTROS ("spec search")
   ─────────────────────────────────────────────────────────────────────────── */
.ahnav-filtros {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(206px, 1fr));
  border-top: 1px solid var(--nav-linea); border-left: 1px solid var(--nav-linea);
  margin: 0 0 22px;
}
.ahnav-at {
  border-right: 1px solid var(--nav-linea); border-bottom: 1px solid var(--nav-linea);
  padding: 9px 11px 11px; position: relative; min-width: 0;
}
.ahnav-at-h {
  font-size: 12px; text-transform: uppercase; letter-spacing: .06em;
  color: var(--nav-marino); font-weight: 700; margin: 0 0 7px;
  padding-right: 42px; line-height: 1.25;
}
.ahnav-at-u { color: var(--nav-conteo); font-weight: 400; text-transform: none; letter-spacing: 0; }

/* Regla 4: cero cromo hasta que sirve. */
.ahnav-at-x {
  position: absolute; top: 8px; right: 10px; font-size: 11px;
  color: var(--nav-tinta-3); background: none; border: 0; cursor: pointer;
  display: none; padding: 2px 4px; text-decoration: underline;
}
.ahnav-at.con-sel .ahnav-at-x { display: block; }
.ahnav-at-x:hover { color: #B3261E; }

.ahnav-vals { list-style: none; margin: 0; padding: 0; }

/* Regla 3: tope duro de 11, en CSS, sin JS. */
.ahnav-val:nth-child(n+12) { display: none; }
.ahnav-at.abierto .ahnav-val:nth-child(n+12) { display: block; }

.ahnav-val { margin: 0; }
.ahnav-v {
  display: flex; align-items: center; gap: 7px; width: 100%;
  background: none; border: 0; padding: 2px 0; margin: 0;
  font: inherit; color: var(--nav-tinta); cursor: pointer; text-align: left;
  border-radius: 2px;
}
/* Regla 1: los valores son texto. Hover = subrayado, como una liga. */
.ahnav-v:hover .ahnav-v-t { color: #000; text-decoration: underline; }
.ahnav-v:focus-visible { outline: 2px solid var(--nav-liga-alta); outline-offset: 1px; }

/* Regla 2: palomita + sangría. Ni cambia de alto, ni de fondo, ni reacomoda. */
.ahnav-val.on .ahnav-v {
  padding-left: 17px; font-weight: 600; color: #000;
  background: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'><path d='M1 6.4l3.1 3.1L11 2.6' fill='none' stroke='%23B26A00' stroke-width='2.1' stroke-linecap='round' stroke-linejoin='round'/></svg>") left 1px center / 11px no-repeat;
}
.ahnav-v-t { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
.ahnav-v-n { margin-left: auto; color: var(--nav-conteo); font-size: 12px; flex: none; }

/* Valor que dejaría cero resultados. Decisión de Mario, y tenía razón: NO se
   apaga en gris, se QUITA. Cuarenta renglones apagados son ruido, no
   información. La clase queda por si alguna vista quiere lo contrario. */
.ahnav-val.vacio { display: none; }

.ahnav-mas {
  margin-top: 5px; background: none; border: 0; padding: 2px 0;
  color: var(--nav-liga); cursor: pointer; font: inherit; font-size: 12px;
  text-decoration: underline;
}
.ahnav-mas:hover { color: var(--nav-liga-alta); }

/* ───────────────────────────────────────────────────────────────────────────
   LAS SILUETAS — geometría, en azul, que cambia al pasar el dedo encima
   ---------------------------------------------------------------------------
   Mario, textual: "los sketches ... la forma de los insertos en la área de
   filtros hazlos azul y cuando haces hover que cambie de color".

   Para que un SVG cambie de color con CSS tiene que estar EN el documento. Un
   `<img src="forma.svg">` no hereda `color` — se pinta negro y ahí se queda.
   Por eso las siluetas van como sprite `<symbol>` incrustado una sola vez y
   cada valor las invoca con `<use>`: una sola copia, cero peticiones extra, y
   control total del trazo desde CSS.

   La regla del dibujo, de McMaster y vale para nosotros igual:
   **se dibuja lo que una palabra no puede desambiguar; nunca se dibuja un
   valor que se puede leer.** "Rombo 80°" contra "Rombo 55°" es un argumento de
   forma — dibújalo. `12.7 mm` es un número — no.
   ─────────────────────────────────────────────────────────────────────────── */
.ahnav-sk {
  flex: none; width: 40px; height: 40px; display: block;
  color: var(--nav-liga);              /* el trazo */
  --sk-relleno: var(--nav-fondo);      /* el relleno opaco: hace que la pieza
                                          de enfrente tape a la de atrás */
  transition: color .12s ease;
}
.ahnav-sk .tr { stroke: currentColor; fill: none; }
.ahnav-sk .rl { fill: var(--sk-relleno); stroke: currentColor; }
.ahnav-v:hover .ahnav-sk { color: var(--nav-liga-alta); }
.ahnav-val.on .ahnav-sk { color: var(--nav-aqui); }

/* A 34 px el trazo punteado del círculo inscrito medía 0.72 px y sencillamente
   no se veía. 40 px es el piso medido, no supuesto. */
@media (max-width: 700px) { .ahnav-sk { width: 34px; height: 34px; } }

.ahnav-sprite { position: absolute; width: 0; height: 0; overflow: hidden; }

/* ───────────────────────────────────────────────────────────────────────────
   LA TABLA DENSA
   ---------------------------------------------------------------------------
   McMaster no tiene una foto por producto — nadie la tiene a esa escala. Tiene
   UN dibujo por familia y debajo una tabla de variantes con sus medidas. Eso
   es lo que de verdad sirve para elegir.
   ─────────────────────────────────────────────────────────────────────────── */
.ahnav-tabla-caja { overflow-x: auto; border: 1px solid var(--nav-linea); }
.ahnav-tabla { width: 100%; border-collapse: collapse; font-size: 13px; }
.ahnav-tabla th {
  text-align: left; font-size: 11.5px; text-transform: uppercase;
  letter-spacing: .05em; color: var(--nav-marino); font-weight: 700;
  padding: 8px 10px; border-bottom: 2px solid var(--nav-linea);
  background: var(--nav-lavado); white-space: nowrap; position: sticky; top: 0; z-index: 1;
}
.ahnav-tabla td {
  padding: 7px 10px; border-bottom: 1px solid var(--nav-linea-2);
  vertical-align: top;
}
.ahnav-tabla tbody tr:hover { background: var(--nav-lavado); }

/* "Estás aquí" y "ya lo viste", los dos trucos que no cuestan un pixel de
   layout y cargan toda la experiencia de comparar 200 renglones. */
.ahnav-tabla tbody tr.aqui { background: var(--nav-aqui-suave); }
.ahnav-tabla tbody tr.aqui td:first-child { box-shadow: inset 3px 0 0 var(--nav-aqui-vivo); }
.ahnav-cod { font-weight: 700; color: var(--nav-liga); text-decoration: none; white-space: nowrap; }
.ahnav-cod:hover { color: var(--nav-liga-alta); text-decoration: underline; }
.ahnav-cod.visto { color: var(--nav-visto); }
.ahnav-marca { color: var(--nav-tinta-2); white-space: nowrap; }
.ahnav-desc { color: var(--nav-tinta); min-width: 22ch; }
.ahnav-med { color: var(--nav-tinta-2); white-space: nowrap; }

/* ───────────────────────────────────────────────────────────────────────────
   EXISTENCIA — el semáforo de tres estados
   ---------------------------------------------------------------------------
   Decisión de Mario: existencia sí, precio no, y **nunca la cantidad exacta**.
   La cantidad es dato interno y le dice a la competencia cuánto mueves. Tres
   estados bastan para decidir.
   Va como raya de color, no como pastilla rellena: la pastilla grita y hay una
   por renglón; la raya se lee en periférica y no compite con el código.
   ─────────────────────────────────────────────────────────────────────────── */
.ahnav-exi { font-size: 12px; white-space: nowrap; padding-left: 10px; position: relative; }
.ahnav-exi::before {
  content: ""; position: absolute; left: 0; top: 3px; bottom: 3px; width: 3px; border-radius: 2px;
}
.ahnav-exi.hay        { color: #1B5E20; }
.ahnav-exi.hay::before        { background: #2E7D32; }
.ahnav-exi.catalogo   { color: var(--nav-liga); }
.ahnav-exi.catalogo::before   { background: var(--nav-liga-alta); }
.ahnav-exi.pedido     { color: var(--nav-tinta-3); }
.ahnav-exi.pedido::before     { background: var(--nav-conteo); }

/* ───────────────────────────────────────────────────────────────────────────
   COTIZAR
   ---------------------------------------------------------------------------
   NO hay botón "Comprar (próximamente)". Se lo argumenté a Mario y quedó
   acordado: un botón deshabilitado es un callejón sin salida y, peor, anuncia
   una carencia que el visitante no había notado. En su lugar va la promesa que
   sí podemos cumplir.
   ─────────────────────────────────────────────────────────────────────────── */
.ahnav-cot {
  display: inline-flex; align-items: center; gap: 6px; white-space: nowrap;
  background: var(--nav-marino); color: #fff; border: 0; border-radius: 4px;
  padding: 6px 11px; font: inherit; font-size: 12px; font-weight: 600; cursor: pointer;
}
.ahnav-cot:hover { background: var(--nav-liga); }
.ahnav-cot:focus-visible { outline: 2px solid var(--nav-liga-alta); outline-offset: 2px; }
.ahnav-cot.puesto { background: #2E7D32; }
.ahnav-cot.puesto::before { content: "✓ "; }
.ahnav-promesa { display: block; margin-top: 4px; font-size: 12px; color: var(--nav-tinta-3); }

/* ───────────────────────────────────────────────────────────────────────────
   BARRA DE HERRAMIENTAS Y ESTADOS
   ─────────────────────────────────────────────────────────────────────────── */
.ahnav-barra { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; margin: 0 0 12px; }
.ahnav-q {
  flex: 1 1 260px; min-width: 0; height: 38px; padding: 0 11px;
  border: 1px solid var(--nav-linea); border-radius: 4px; font: inherit; font-size: 13px;
  color: var(--nav-tinta); background: var(--nav-fondo);
}
.ahnav-q:focus { outline: 2px solid var(--nav-liga-alta); outline-offset: -1px; border-color: var(--nav-liga-alta); }
.ahnav-orden { height: 38px; border: 1px solid var(--nav-linea); border-radius: 4px; font: inherit; font-size: 13px; padding: 0 8px; color: var(--nav-tinta); background: var(--nav-fondo); }

.ahnav-vacio { padding: 30px 16px; text-align: center; color: var(--nav-tinta-2); }
.ahnav-vacio b, .ahnav-vacio h1 { display: block; font-weight: 700; color: var(--nav-marino); font-size: 16px; line-height: 1.35; margin: 0 0 6px; }
.ahnav-mas-filas {
  display: block; width: 100%; margin: 12px 0 0; padding: 11px;
  background: var(--nav-fondo); border: 1px solid var(--nav-linea); border-radius: 4px;
  color: var(--nav-liga); font: inherit; font-weight: 600; cursor: pointer;
}
.ahnav-mas-filas:hover { background: var(--nav-lavado); }

/* ───────────────────────────────────────────────────────────────────────────
   TELÉFONO
   El panel de filtros no cabe al lado; se vuelve un cajón que se abre.
   ─────────────────────────────────────────────────────────────────────────── */
.ahnav-abrir-filtros { display: none; }
@media (max-width: 760px) {
  .ahnav { font-size: 13px; }
  .ahnav-filtros { grid-template-columns: 1fr 1fr; }
  .ahnav-abrir-filtros {
    display: inline-flex; align-items: center; gap: 7px; min-height: 44px;
    padding: 0 14px; border: 1px solid var(--nav-marino); border-radius: 4px;
    background: var(--nav-fondo); color: var(--nav-marino); font: inherit;
    font-weight: 600; cursor: pointer;
  }
  .ahnav-abrir-filtros b { font-weight: 700; }
  .ahnav-filtros[hidden] { display: none; }
  .ahnav-tabla th, .ahnav-tabla td { padding: 8px 8px; }
  /* Con el dedo, todo blanco de toque llega a 44 px de alto. */
  .ahnav-v { min-height: 30px; }
  .ahnav-cot { min-height: 44px; }
  .ahnav-mas { min-height: 44px; }
}
@media (max-width: 420px) {
  .ahnav-filtros { grid-template-columns: 1fr; }
}

/* ───────────────────────────────────────────────────────────────────────────
   IMPRESIÓN — un comprador imprime la tabla para llevarla al taller
   ─────────────────────────────────────────────────────────────────────────── */
@media print {
  .ahnav-filtros, .ahnav-barra, .ahnav-sel, .ahnav-cot, .ahnav-mas-filas { display: none !important; }
  .ahnav-tabla { font-size: 10px; }
  .ahnav-tabla-caja { overflow: visible; border: 0; }
}

/* ───────────────────────────────────────────────────────────────────────────
   MOVIMIENTO REDUCIDO
   ─────────────────────────────────────────────────────────────────────────── */
@media (prefers-reduced-motion: reduce) {
  .ahnav *, .ahnav *::before, .ahnav *::after {
    transition-duration: .01ms !important; animation-duration: .01ms !important;
  }
}

/* ═════════════════════════════════════════════════════════════════════════
   /productos — la rejilla de familias
   ─────────────────────────────────────────────────────────────────────────
   Mario: "en sitios web la pagina de productos es donde vas a comprar/cotizar
   no es para informarte como si no sabes que es el producto."

   Por eso aquí no hay héroe, ni "empieza por el material", ni cuestionario.
   Hay tres cosas y en este orden: pega tu código, elige tu familia, repite un
   pedido. Las tres son transacciones.

   La tarjeta lleva CONTEO. Es lo que McMaster hace en cada mosaico y es la
   mitad del valor: siempre sabes qué tan grande es el cuarto antes de entrar.
   ═════════════════════════════════════════════════════════════════════════ */
.ahnav-indice { padding: 22px 0 48px; }

.pi-h {
  font-size: clamp(18px, 2.2vw, 22px); color: var(--nav-marino); font-weight: 800;
  margin: 34px 0 6px; letter-spacing: -.01em;
}
.pi-p { margin: 0 0 14px; color: var(--nav-tinta-2); max-width: 64ch; }

.pi-sku { margin-top: 24px; }
.pi-re {
  margin-top: 40px; padding: 20px 22px; background: var(--nav-lavado);
  border-left: 3px solid var(--nav-marino); border-radius: 0 6px 6px 0;
}
.pi-re .pi-h { margin-top: 0; }

.fam-rej {
  list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: repeat(auto-fill, minmax(258px, 1fr)); gap: 18px;
}
.fam-c > a {
  display: flex; flex-direction: column; height: 100%; text-decoration: none;
  color: var(--nav-tinta); background: var(--nav-fondo);
  border: 1px solid var(--nav-linea); border-radius: 8px; overflow: hidden;
  transition: border-color .14s ease, transform .14s ease, box-shadow .14s ease;
}
.fam-c > a:hover {
  border-color: var(--nav-liga-alta); transform: translateY(-2px);
  box-shadow: 0 10px 26px rgba(10, 30, 94, .10);
}
.fam-c > a:focus-visible { outline: 2px solid var(--nav-liga-alta); outline-offset: 2px; }
/* `aspect-ratio` reserva el hueco ANTES de que baje la foto. Sin esto la
   rejilla salta al cargar y el CLS se dispara justo en la primera pantalla. */
.fam-c img {
  width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; display: block;
  background: #0B1220;
}
.fam-n {
  display: block; padding: 12px 14px 0; font-size: 17px; font-weight: 700;
  color: var(--nav-marino); line-height: 1.25;
}
.fam-c > a:hover .fam-n { color: var(--nav-liga); }
.fam-c > a:visited .fam-n { color: var(--nav-visto); }
.fam-d { display: block; padding: 4px 14px 0; color: var(--nav-tinta-3); font-size: 13px; line-height: 1.4; }
.fam-k {
  display: block; margin-top: auto; padding: 10px 14px 13px;
  color: var(--nav-conteo); font-size: 12px;
  font-variant-numeric: tabular-nums;
}

@media (max-width: 700px) {
  .fam-rej { grid-template-columns: 1fr 1fr; gap: 12px; }
  .fam-n { font-size: 15px; padding: 10px 11px 0; }
  .fam-d { display: none; }   /* en dos columnas de 170 px la línea sobra */
  .fam-k { padding: 8px 11px 11px; }
}
@media (max-width: 400px) {
  .fam-rej { grid-template-columns: 1fr; }
  .fam-d { display: block; }
}

/* ═════════════════════════════════════════════════════════════════════════
   ESPECIFICIDAD Y MÁRGENES — dos cosas que se ven de inmediato
   ─────────────────────────────────────────────────────────────────────────
   1. El encabezado de grupo salía a 33.6 px en vez de 12. La culpable, medida
      con las reglas que de verdad ganaban en el nodo:

          .fam-main h2      font-size: clamp(1.5rem, 3vw, 2.1rem)   (0-1-1)
          .ahnav-grupos-h   font-size: 12px                          (0-1-0)

      La plantilla envuelve el contenido en `.fam-main` y su regla de `h2` es
      más específica que una clase sola. Se resuelve nombrando el elemento
      —`h2.ahnav-grupos-h` (0-1-1 + clase = 0-2-1)— y no con `!important`:
      `!important` gana la pelea de hoy y deja una mina para la de mañana.

   2. `.ahnav` tenía 0 de padding lateral y el catálogo salía pegado al filo
      de la ventana. La plantilla usa 16 px en teléfono y 48 en escritorio;
      aquí se repite ese ritmo para que la página no se sienta cosida.
   ═════════════════════════════════════════════════════════════════════════ */
.ahnav h1.ahnav-titulo {
  font-size: clamp(26px, 3.4vw, 38px); line-height: 1.08; margin: 0 0 6px;
  color: var(--nav-marino); font-weight: 800; letter-spacing: -.015em;
}
.ahnav h2.ahnav-grupos-h {
  font-size: 12px; text-transform: uppercase; letter-spacing: .08em;
  font-weight: 700; color: var(--nav-marino); margin: 0 0 10px;
  padding-bottom: 6px; border-bottom: 2px solid var(--nav-marino);
}
.ahnav h2.pi-h {
  font-size: clamp(19px, 2.2vw, 24px); color: var(--nav-marino);
  font-weight: 800; margin: 34px 0 6px; letter-spacing: -.01em; line-height: 1.2;
}
.ahnav h3.ahnav-at-h {
  font-size: 12px; text-transform: uppercase; letter-spacing: .06em;
  color: var(--nav-marino); font-weight: 700; margin: 0 0 7px;
  padding-right: 42px; line-height: 1.25;
}

.ahnav { padding: 18px 16px 56px; max-width: 1560px; margin: 0 auto; }
@media (min-width: 1024px) { .ahnav { padding-left: 48px; padding-right: 48px; } }

/* El título de la familia manda sobre el encabezado de grupo. Antes salía al
   revés — "EMPIEZA POR LO QUE VAS A HACER" a 33 px encima de un "Insertos" de
   32 — y una jerarquía invertida hace que la página se lea al revés. */

/* El hueco que reserva el lugar de una silueta ausente. Mismo ancho, cero
   tinta: la columna de rótulos no se rompe. */
.ahnav-sk-hueco { flex: none; width: 40px; height: 40px; display: block; }
@media (max-width: 700px) { .ahnav-sk-hueco { width: 34px; height: 34px; } }

/* La rejilla de grupos dibujaba sus separadores con `gap` sobre un fondo gris.
   Truco bonito y con un costo que solo se ve en producción: cuando los grupos
   no llenan el último renglón —seis mosaicos en una rejilla de cinco— las
   celdas vacías quedan pintadas de gris y parecen tarjetas rotas. Se cambia a
   bordes reales por mosaico: sin fondo que se asome, sin celdas fantasma. */
.ahnav-tiles { gap: 0; background: none; border: 0; }
.ahnav-tile { border: 1px solid var(--nav-linea-2); margin: -1px 0 0 -1px; }
.ahnav-tile > a { border-radius: 0; }

/* El contenedor de la plantilla. Estas páginas ya no cargan
   `ahnsa-productos.css` —de sus 93 clases usaban una— así que la única regla
   que sí hacía falta se replica aquí, con el `box-sizing` que le faltaba. */
.fam-main { max-width: 90rem; margin: 0 auto; box-sizing: border-box; }

/* Guías técnicas al pie de la familia. Van DESPUÉS de la tabla a propósito:
   quien llegó a cotizar ya cotizó, y quien quiere entender tiene por dónde
   seguir sin que la explicación le estorbe a la compra. */
.ahnav-guias { margin: 40px 0 0; }
.ahnav-guias ul {
  list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 1px;
}
.ahnav-guias li { border: 1px solid var(--nav-linea-2); margin: -1px 0 0 -1px; }
.ahnav-guias a {
  display: flex; flex-direction: column; gap: 3px; height: 100%;
  padding: 11px 13px; text-decoration: none; background: var(--nav-fondo);
}
.ahnav-guias a:hover { background: var(--nav-lavado); }
.ahnav-guias b { color: var(--nav-liga); font-weight: 700; font-size: 14px; }
.ahnav-guias a:hover b { color: var(--nav-liga-alta); }
.ahnav-guias a:visited b { color: var(--nav-visto); }
.ahnav-guias span { color: var(--nav-tinta-3); font-size: 12px; line-height: 1.35; }

/* ═════════════════════════════════════════════════════════════════════════
   QUE LA INTERACCIÓN SE SIENTA INSTANTÁNEA
   ─────────────────────────────────────────────────────────────────────────
   Medido con CPU a 4×, aislando cada parte de un clic en un filtro:

       reconstruir la tabla     310 ms   ← aquí estaba todo
       cambiar los conteos      169 ms
       clases de la rejilla      11 ms

   La tabla salía en `table-layout: auto`, que obliga al navegador a MEDIR las
   240 celdas para decidir el ancho de cada columna. Con `fixed` y anchos
   declarados, el ancho se resuelve con la primera fila y el resto solo se
   pinta. Es la diferencia entre un filtro que responde y uno que se piensa.

   Y los conteos: viven a la derecha con `margin-left:auto`, así que cada vez
   que un número cambia de "1,187" a "556" cambia de ancho y re-acomoda su
   renglón. Un ancho mínimo fijo lo ancla y el cambio deja de costar layout.
   ═════════════════════════════════════════════════════════════════════════ */
.ahnav-tabla { table-layout: fixed; }
.ahnav-tabla th:nth-child(1), .ahnav-tabla td:nth-child(1) { width: 19%; }
.ahnav-tabla th:nth-child(2), .ahnav-tabla td:nth-child(2) { width: 11%; }
.ahnav-tabla th:nth-child(3), .ahnav-tabla td:nth-child(3) { width: auto; }
.ahnav-tabla th:nth-child(4), .ahnav-tabla td:nth-child(4) { width: 17%; }
.ahnav-tabla th:nth-child(5), .ahnav-tabla td:nth-child(5) { width: 13%; }
.ahnav-tabla th:last-child,   .ahnav-tabla td:last-child   { width: 96px; }
/* Con `fixed` el texto ya no ensancha la columna: tiene que poder cortarse. */
.ahnav-tabla td { overflow-wrap: anywhere; }
.ahnav-desc { min-width: 0; }

.ahnav-v-n { min-width: 4.2ch; text-align: right; }

/* La tabla es ancha por naturaleza; en teléfono se desplaza dentro de su caja,
   nunca arrastra la página. `min-width` evita que `fixed` la comprima tanto que
   deje de leerse. */
@media (max-width: 760px) { .ahnav-tabla { min-width: 560px; } }

/* Texto de categoría. Va después de la tabla porque quien vino a cotizar ya
   cotizó — la explicación no le estorba a la compra, pero está para quien la
   busca (y para Google, que necesita algo que leer además de una tabla). */
.ahnav-texto { margin: 44px 0 0; max-width: 68ch; }
.ahnav-texto h2 {
  font-size: clamp(19px, 2.2vw, 24px); color: var(--nav-marino);
  font-weight: 800; margin: 0 0 10px; line-height: 1.2; letter-spacing: -.01em;
}
.ahnav-texto p { margin: 0 0 12px; color: var(--nav-tinta-2); font-size: 14px; line-height: 1.6; }
.ahnav-texto p:last-child { margin-bottom: 0; }

/* ═════════════════════════════════════════════════════════════════════════
   FICHA DE PRODUCTO  ·  /productos/<familia>/p/<código>
   ─────────────────────────────────────────────────────────────────────────
   Mario: "que al picarle al producto te lleve a su propia pagina con su
   imagen cantidad de cuantos y agregar al carrito si se puede?"

   La foto es de FAMILIA, no del producto: no tenemos una foto por producto y
   nadie la tiene a esta escala — McMaster tampoco. Lo que sí es único de esta
   ficha es la tabla técnica: la norma resuelta pieza por pieza. Por eso la
   columna de la derecha manda y la foto acompaña.
   ═════════════════════════════════════════════════════════════════════════ */
.ahprod-caja {
  display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
  gap: 26px; align-items: start; margin: 6px 0 30px;
}
.ahprod-vis { position: relative; border: 1px solid var(--nav-linea); border-radius: 8px; overflow: hidden; }
.ahprod-foto { width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; display: block; background: #0B1220; }
/* Marco neutro: este producto todavía no tiene render. Se dice, no se finge:
   antes se dibujaba aquí un polígono dorado que mentía sobre el material. */
.ahprod-vis.neutro { background: var(--nav-lavado); }
.ahprod-neutro {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 6px; aspect-ratio: 16 / 9; padding: 18px; text-align: center;
}
.ahprod-neutro-cod {
  font-size: 17px; letter-spacing: .3px; color: var(--nav-tinta);
  word-break: break-all; font-variant-numeric: tabular-nums;
}
.ahprod-neutro-t { font-size: 12.5px; color: var(--nav-tinta-3); max-width: 42ch; }
/* La silueta técnica va ENCIMA de la foto, en una tarjeta clara: es el dato
   exacto sobre la imagen ambiental, y así se leen las dos cosas de un vistazo. */
.ahprod-sk {
  position: absolute; right: 12px; bottom: 12px; width: 76px; height: 76px;
  background: rgba(255, 255, 255, .94); border-radius: 8px; padding: 8px;
  color: var(--nav-marino); --sk-relleno: #fff;
  box-shadow: 0 6px 18px rgba(10, 30, 94, .18);
}

.ahprod-cod {
  font-size: clamp(22px, 3vw, 32px); color: var(--nav-marino); font-weight: 800;
  margin: 0 0 4px; line-height: 1.1; word-break: break-word;
  font-variant-numeric: tabular-nums;
}
.ahprod-marca { display: inline-block; color: var(--nav-liga); font-weight: 700; text-decoration: none; margin-bottom: 8px; }
.ahprod-marca:hover { color: var(--nav-liga-alta); text-decoration: underline; }
.ahprod-desc { margin: 0 0 10px; color: var(--nav-tinta-2); }
.ahprod .ahnav-exi { display: inline-block; margin: 0 0 14px; font-size: 13px; }

.ahprod-acc { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 6px 0 8px; }
.ahprod-q {
  width: 40px; height: 44px; border: 1px solid var(--nav-linea); background: var(--nav-fondo);
  color: var(--nav-marino); font-size: 20px; line-height: 1; cursor: pointer; border-radius: 4px;
}
.ahprod-q:hover { border-color: var(--nav-liga-alta); color: var(--nav-liga-alta); }
.ahprod-n {
  width: 68px; height: 44px; text-align: center; border: 1px solid var(--nav-linea);
  border-radius: 4px; font: inherit; font-size: 15px; color: var(--nav-tinta);
  font-variant-numeric: tabular-nums; background: var(--nav-fondo);
}
.ahprod-add { min-height: 44px; padding: 0 18px; font-size: 14px; }

.ahprod-ficha { margin: 8px 0 30px; }
.ahprod-tabla { width: 100%; border-collapse: collapse; font-size: 13px; }
.ahprod-tabla th {
  text-align: left; font-weight: 600; color: var(--nav-tinta-3); width: 42%;
  padding: 8px 12px 8px 0; border-bottom: 1px solid var(--nav-linea-2); vertical-align: top;
}
.ahprod-tabla td {
  padding: 8px 0; border-bottom: 1px solid var(--nav-linea-2);
  display: flex; align-items: center; gap: 8px;
  font-variant-numeric: tabular-nums;
}
.ahprod-tabla .ahnav-sk { width: 30px; height: 30px; }
/* Cada valor es una liga al catálogo filtrado por ese valor. Desde la ficha se
   salta a "todos los que tienen este radio de punta", que es exactamente lo que
   se necesita cuando el tuyo no está y hay que encontrar el equivalente. */
.ahprod-val { color: var(--nav-liga); text-decoration: none; }
.ahprod-val:hover { color: var(--nav-liga-alta); text-decoration: underline; }

.ahprod-otros { margin: 0 0 24px; }
.ahprod-volver { display: inline-block; margin-top: 14px; color: var(--nav-liga); text-decoration: none; font-weight: 600; }
.ahprod-volver:hover { color: var(--nav-liga-alta); text-decoration: underline; }

@media (max-width: 760px) {
  .ahprod-caja { grid-template-columns: 1fr; gap: 16px; }
  .ahprod-tabla th { width: 46%; font-size: 12.5px; }
}

/* ═════════════════════════════════════════════════════════════════════════
   EL ESQUELETO DE LA FICHA — y por qué no basta un `min-height`
   ─────────────────────────────────────────────────────────────────────────
   La primera versión de la ficha era un cascarón con "Cargando…" que el JS
   reemplazaba entero. Medido en producción: **CLS 0.756**. Es exactamente el
   mismo error que ya había corregido en las páginas de familia, cometido otra
   vez en la página nueva.

   Un `min-height` a ojo no lo arregla: deja un hueco cuando el producto trae
   pocos atributos y sigue saltando cuando trae muchos. Lo que sí funciona es
   reservar la FORMA — la caja de foto con su proporción exacta, el bloque de
   identidad y los renglones de la ficha — para que lo que llega ocupe casi el
   mismo lugar que lo que estaba.
   ═════════════════════════════════════════════════════════════════════════ */
.ahprod-esq { padding-top: 6px; }
.ahprod-esq-migas { height: 18px; width: 280px; margin-bottom: 10px; }
.ahprod-esq-foto { aspect-ratio: 16 / 9; }
.ahprod-esq-b { height: 16px; margin-bottom: 10px; }
.ahprod-esq-h1 { height: 34px; width: 78%; margin-bottom: 12px; }
.ahprod-esq-m { width: 34%; }
.ahprod-esq-d { width: 92%; }
.ahprod-esq-e { width: 46%; margin-bottom: 18px; }
.ahprod-esq-acc { height: 44px; width: 320px; max-width: 100%; margin-bottom: 6px; }
.ahprod-esq-th { height: 26px; width: 180px; margin: 30px 0 10px; }
.ahprod-esq-fila { height: 21px; margin-bottom: 16px; }

.ahprod-esq-migas, .ahprod-esq-b, .ahprod-esq-acc, .ahprod-esq-th,
.ahprod-esq-fila, .ahprod-esq-foto {
  background: linear-gradient(90deg, var(--nav-linea-2) 25%, #F7FAFD 37%, var(--nav-linea-2) 63%);
  background-size: 400% 100%;
  border-radius: 4px;
  animation: ahprod-brillo 1.4s ease-in-out infinite;
}
@keyframes ahprod-brillo { 0% { background-position: 100% 0 } 100% { background-position: 0 0 } }
@media (prefers-reduced-motion: reduce) { .ahprod-esq * , .ahprod-esq { animation: none !important; } }
@media (max-width: 760px) { .ahprod-esq-fila { margin-bottom: 14px; } }

/* El contenedor de la ficha guarda una altura mínima que NO desaparece al
   hidratar. Medido: el contenedor pasa de 477 px con esqueleto a 1,432 px ya
   con la ficha de un inserto, y el pie del sitio —que con el esqueleto queda
   dentro de la pantalla— se movía 585 px. CLS 0.307.

   Reservar el alto exacto es imposible: los atributos decodificados por
   producto van de 0 a 17, así que cualquier número fijo deja hueco en unos y
   salta en otros. Lo que sí funciona es que el pie arranque FUERA de la
   pantalla: a partir de ahí, crezca o encoja la ficha, no se ve moverse nada.
   Por eso el mínimo se queda puesto también después de pintar. */
.ahprod { min-height: 82vh; }

/* ═════════════════════════════════════════════════════════════════════════
   LAS DOS MEDIDAS, Y EL BOTÓN QUE DECIDE CUÁL MANDA
   ─────────────────────────────────────────────────────────────────────────
   Mario preguntó si convenía un botón de conversión. Un botón que CAMBIA de
   unidad esconde la mitad del dato, y esta tabla existe para comparar: con
   media familia en pulgada y media en milímetro habría que ir y venir para
   comparar dos renglones.

   Así que el botón no convierte: elige cuál va grande. Las dos medidas
   siempre están, la segunda en chico y en gris. Y ahí mismo va el código con
   el que de verdad se pide la pieza — «3/16" · ISO 04» debajo de 4.76 mm,
   porque nadie pide "un inserto de 4.76 de espesor": pide un 432.
   ═════════════════════════════════════════════════════════════════════════ */
.ahnav-v-t { display: flex; flex-direction: column; gap: 0; line-height: 1.25; }
.ahnav-v-p { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ahnav-v-s {
  font-size: 11px; color: var(--nav-conteo); letter-spacing: .01em;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.ahnav-val.on .ahnav-v-s { color: var(--nav-aqui); }
.ahnav-v { align-items: flex-start; padding: 3px 0; }
.ahnav-v-n { align-self: flex-start; padding-top: 1px; }

.ahnav-unidad {
  height: 38px; padding: 0 12px; border: 1px solid var(--nav-linea);
  border-radius: 4px; background: var(--nav-fondo); color: var(--nav-tinta-2);
  font: inherit; font-size: 12px; cursor: pointer; white-space: nowrap;
}
.ahnav-unidad b { color: var(--nav-marino); font-weight: 700; }
.ahnav-unidad:hover { border-color: var(--nav-liga-alta); }
.ahnav-unidad[aria-pressed="true"] { border-color: var(--nav-aqui-vivo); background: var(--nav-aqui-suave); }

/* La línea que explica el atributo. Va en el filtro y no en un tooltip porque
   un tooltip no existe con el dedo, y "Profundidad ×D" es justo el que hizo
   preguntar qué significaba. */
.ahnav-at-h2 {
  margin: -3px 0 7px; font-size: 11px; line-height: 1.35;
  color: var(--nav-tinta-3); max-width: 30ch;
}

/* Las dos normas del producto, una debajo de la otra. Vienen guardadas tal
   cual: ninguna se calcula. */
.ahnav-norma { line-height: 1.3; white-space: nowrap; }
.ahnav-iso, .ahnav-ansi { display: block; font-variant-numeric: tabular-nums; }
.ahnav-iso { color: var(--nav-tinta-2); font-size: 12.5px; }
.ahnav-ansi { color: var(--nav-conteo); font-size: 11.5px; }

/* Seis columnas ya no caben con los porcentajes de cinco. */
.ahnav-tabla th:nth-child(6), .ahnav-tabla td:nth-child(6) { width: 13%; }
.ahnav-tabla th:nth-child(1), .ahnav-tabla td:nth-child(1) { width: 17%; }
.ahnav-tabla th:nth-child(4), .ahnav-tabla td:nth-child(4) { width: 15%; }
@media (max-width: 760px) { .ahnav-tabla { min-width: 660px; } }

/* «Lo de aquí es lo que movemos, no lo que podemos conseguir.» Es de lo más
   valioso que esta página puede decir y casi ningún distribuidor lo dice: el
   catálogo publicado se lee como el límite de lo que hay, y no lo es. */
.ahnav-linea { margin: 34px 0 0; padding: 18px 20px; background: var(--nav-lavado);
  border-left: 3px solid var(--nav-marino); border-radius: 0 6px 6px 0; max-width: 72ch; }
.ahnav-linea h2 { margin-top: 0; }
.ahnav-linea p { margin: 0 0 14px; color: var(--nav-tinta-2); font-size: 14px; line-height: 1.55; }
.ahnav-linea b { color: var(--nav-marino); }
