/* ═══════════════════════════════════════════════════════════════
   belk-shell.css — MARCO DE LA APP · pieza 3 de 4 del modelo Belk
   ───────────────────────────────────────────────────────────────
   REQUIERE:  css/foundation.css y assets/icons.svg.
   ORDEN:     va SIEMPRE al final, después del CSS de la pagina.
   SE COPIA:  sí, adaptando los 5 modulos de .belk-nav.

   QUE APORTA
     .belk-nav   los modulos, abajo al centro, con glider (lo unico flotante)
     .belk-acts  las acciones del modulo, en flujo al final del contenido
     tokens --belk-float-* que los flotantes de la pagina consumen

   NO OPCIONAL
     · body lleva class="has-shell"
     · el activo va en data-active="1..5" + aria-current="page"
     · .belk-nav lleva gap:0 o el glider se desalinea
     · .belk-acts NO flota: va en el flujo, al final del contenido
     · en <=768px sus botones pierden la etiqueta (cuadrados de 44)
   ═══════════════════════════════════════════════════════════ */

/* Marco de la app Belk — reemplaza al dock inferior (css/dock.css).
   Dos píldoras FLOTANTES de vidrio oscuro:
     .belk-nav   → los 5 módulos, abajo al centro, glider de borde a borde
     .belk-acts  → las acciones del módulo, flotando al costado derecho
   Sin JS: el activo se marca con data-active en el contenedor y el tooltip
   sale de data-label vía ::after. Compatible con la CSP estricta. */

:root{
  /* Medidas propias del componente: no son deriva, se quedan aquí. */
  --bs-nav-h:64px;
  --bs-gap:16px;
  /* `--bs-act-w` (el ancho del riel al costado) se retiró el 2026-07-29: la
     barra de acciones entra en el flujo y mide lo que miden sus botones. */

  /* Color: sale de foundation.css. El respaldo del var() vale lo mismo que el
     token, así que el marco se ve igual aunque foundation no haya cargado
     (HTML viejo en caché del SW sin el <link> → misma trampa de la sesión 30). */
  --bs-radius:var(--belk-radius,1rem);
  --bs-text:var(--belk-text-muted,#414B5C);   /* módulo/acción en reposo */
  --bs-text-on:var(--belk-text,#0D2350);      /* hover y foco */
  --bs-on:var(--belk-accent,#E87722);         /* activo — acento de la zona */
  --bs-on-ink:var(--belk-on-accent,#0D2350);  /* texto sobre el activo */
}
[data-zona="taller"]{
  --bs-text:#C4D0DF;
  --bs-text-on:#F7F3E9;
  --bs-on:#51C7F5;
  --bs-on-ink:#0D1B2A;
}

.belk-nav,.belk-acts,
.bn-i,.ba-i,.bn-glider,.bn-step{box-sizing:border-box}   /* no depender del reset de cada página */

/* ═══════════════════════════════════════════════════════════════
   EL HEADER — un solo componente para los cinco módulos (A7)
   ───────────────────────────────────────────────────────────────
   Los cinco módulos tenían CUATRO headers distintos: dos clases
   (.hdr y .topbar) y tres copias de .hdr que habían divergido sin
   que nadie lo decidiera — a Escaneo IA se le había perdido la
   animación del menú a X y el cuadrito naranjo del logo; tapacanto
   escondía el nombre 40 px más tarde que los demás.

   Ahora vive UNA vez, acá, en el único CSS que cargan los cinco.
   No volver a declarar .hdr ni sus hijos en el CSS de una página:
   este archivo carga al final y los pisa igual, así que una copia
   local no cambia nada — solo confunde a quien la lea después.

   Orden de los slots:  ☰ · logo(→inicio) · / · título · acciones · cuenta

   admin.html queda fuera a propósito: no carga este archivo, no es
   uno de los cinco módulos y tiene su propio header claro.
   ═══════════════════════════════════════════════════════════ */

/* El fondo NO sale de --belk-brand: ese token lo remapea cada zona, y en
   data-zona="documento" (landings) vale #7FA0D4 — un azul claro que con el
   texto blanco del header da 2,1 de contraste. El header es el marco de la
   app: marino fijo, igual en los cinco módulos. Mismo criterio que el
   vidrio de .belk-nav. */
.hdr{background:#0D1B2A;color:#F7F3E9;height:52px;
  display:flex;align-items:center;padding:0 12px;
  position:sticky;top:0;z-index:300;
  box-shadow:0 2px 10px rgba(0,0,0,.28);gap:10px}

/* ── Botón menú (propuesta B): logo grande + sombra; badge ☰ en esquina ── */
.hbg-btn{width:44px;height:44px;border:0;border-radius:50%;background:transparent;
  cursor:pointer;display:flex;align-items:center;justify-content:center;
  flex-shrink:0;padding:0;position:relative;color:#fff;transition:transform .12s}
.hbg-btn:hover{transform:scale(1.04)}
.hbg-btn:active{transform:scale(0.98)}
.hbg-logo{width:32px;height:32px;border-radius:7px;display:block;object-fit:cover;
  box-shadow:0 3px 12px rgba(0,0,0,.5),0 0 0 1px rgba(255,255,255,.12)}
.hbg-btn::after{content:"☰";position:absolute;right:1px;bottom:1px;width:14px;height:14px;
  font-size:7px;line-height:14px;text-align:center;background:#51C7F5;color:#0D1B2A;
  border-radius:50%;font-weight:800;pointer-events:none;box-shadow:0 1px 4px rgba(0,0,0,.28)}
.hbg-ico{width:22px;height:22px;display:block;flex-shrink:0}
.hbg-ico--close{display:none}
.hbg-btn.open::after{display:none}
.hbg-btn.open .hbg-logo{display:none}
.hbg-btn.open .hbg-ico--close{display:block}

/* Marca en header: tipografía limpia → panel de productividad */
.hdr-brand{display:flex;flex-direction:column;justify-content:center;line-height:1.05;
  flex-shrink:0;text-decoration:none;color:inherit;padding:2px 0;
  border-bottom:1px solid transparent;transition:border-color .15s,opacity .15s}
.hdr-brand:hover{border-bottom-color:rgba(255,255,255,.45);opacity:.95}
.hdr-brand .logo-tx{font-size:15px;font-weight:700;color:#fff}
.hdr-brand .logo-sub{font-size:9px;font-weight:400;opacity:.78;display:block;color:#fff}
@media(max-width:520px){.hdr-brand .logo-sub{display:none}}

/* ── Logo (drawer y otros): enlace clásico si hace falta fuera del header ── */
/* Sin .logo-ic: era el cuadrito naranjo que precedió al SVG de la marca y
   los cinco módulos ya usan el <svg> inline. Se cayó al unificar (A7). */
.logo{display:flex;align-items:center;gap:8px;flex-shrink:0;cursor:pointer;
  text-decoration:none;color:inherit}
.logo-tx{font-size:15px;font-weight:700}
.logo-sub{font-size:9px;font-weight:400;opacity:.78;display:block}
@media(max-width:520px){.logo-tx,.logo-sub{display:none}}

/* ── Migas: en angosto se ocultan. El header ya lleva cuenta y contador,
      y el título se desbordaba (medido: 39 px de scroll horizontal). ── */
.hdr-sep{color:rgba(255,255,255,.55);font-size:1.05rem;flex-shrink:0}
/* El título es fijo en tres módulos ("Optimizador") y el nombre del documento
   en Costos y Cotización, que puede ser largo. Se recorta con puntos suspensivos
   en vez de empujar la cuenta fuera de la barra. */
.hdr-title{font-size:13px;font-weight:600;color:rgba(247,243,233,.82);
  min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* Drawer: marino fijo. --belk-brand en taller es acero (tinta de tarjeta)
   y pintaría el menú gris. Mismo criterio que el header. */
[data-zona="taller"] .nav-menu{
  background:#0D1B2A; color:#F7F3E9;
}
@media(max-width:640px){
  .hdr-sep,.hdr-title{display:none}
}

/* ── Zona derecha y chip de cuenta ── */
.hdr-right{display:flex;align-items:center;gap:6px;flex-shrink:0;
  margin-left:auto;min-width:0}
.hdr-user-chip{display:flex;align-items:center;gap:6px;cursor:pointer;
  padding:4px 8px;border-radius:8px;transition:background .15s}
.hdr-user-chip:hover{background:rgba(255,255,255,.12)}
.hdr-user-chip img,.hdr-user-chip .uc-avatar{width:26px;height:26px;
  border-radius:50%;border:1.5px solid rgba(255,255,255,.3);flex-shrink:0;
  background:var(--belk-accent,#51C7F5);display:flex;align-items:center;
  justify-content:center;font-size:12px;overflow:hidden}
.hdr-user-chip img{object-fit:cover}
.hdr-user-chip .uc-name{font-size:12px;font-weight:600;color:#fff;
  max-width:80px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
@media(max-width:600px){.hdr-user-chip .uc-name{display:none}}

/* ── Vidrio compartido ──────────────────────────────────── */

.belk-nav,.belk-acts{
  position:fixed; z-index:340;   /* sobre la topbar (300), bajo modales (400+) */
  display:flex;
  /* La píldora flota POR ENCIMA de todo, así que en la rampa de profundidad
     es la capa más cercana: vidrio CLARO sobre las páginas de herramientas.
     Antes era vidrio oscuro (rgba(18,22,32,.42)) porque el marco de la app
     era oscuro; al migrar las páginas a claro quedaba gris plano y el texto
     encima daba 2,89 de contraste. */
  background:rgba(255,255,255,.80);
  /* Filo obligatorio: sin él la píldora se funde con el nivel de atrás. */
  border:1px solid var(--belk-border,rgba(13,35,80,.10));
  border-radius:var(--bs-radius);
  -webkit-backdrop-filter:blur(18px) saturate(160%);
  backdrop-filter:blur(18px) saturate(160%);
  box-shadow:
    inset 1px 1px 0 rgba(255,255,255,.9),
    var(--belk-shadow-2,0 8px 24px rgba(13,35,80,.16));
}

/* Zona oscura (documento = landings; taller = módulos): la píldora sube
   desde el marino en vez de bajar. Sigue siendo "más clara que lo de atrás". */
/* Solo .belk-acts: la píldora se pinta sola más abajo, con el aspecto
   del traspaso. Mientras .belk-nav estuvo aquí, esta regla le pisaba el
   fondo, el filo y la sombra por especificidad. */
[data-zona="documento"] .belk-acts,
[data-zona="taller"] .belk-acts{
  background:rgba(13,27,42,.78);
  border-color:rgba(255,255,255,.14);
  box-shadow:
    inset 1px 1px 0 rgba(255,255,255,.16),
    0 8px 24px rgba(0,0,0,.35);
}

/* Sin backdrop-filter (Android viejo): fondo sólido o queda ilegible */
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
  .belk-nav,.belk-acts{background:var(--belk-level-3,#FFFFFF)}
  [data-zona="documento"] .belk-acts,
  [data-zona="taller"] .belk-acts{background:var(--belk-level-2,#16283B)}
  /* La píldora, sólida y oscura: con el vidrio apagado la tinta clara
     sobre un nivel-2 gris queda ilegible. */
  .belk-nav{background-color:#050D19}
  .bn-step{background:#050D19}
}

/* ── Píldora de módulos (abajo al centro) ─────────────────
   Diseño "estela tipográfica" (traspaso 2026-08-30). Cambia respecto
   del anterior: el módulo activo YA NO es un bloque celeste sólido,
   sino un recuadro de vidrio retroiluminado, y una estela translúcida
   de 4 px cruza por detrás de las etiquetas marcando el avance.

   La estela va SOLO por los cuatro pasos: nace en el centro de
   Optimizador (10 %) y muere en el de Cotización (70 %). Escaneo IA
   queda al otro lado del separador — es una vía de entrada, no un paso.

   El glider sigue moviéndose solo con CSS (data-active + translateX);
   lo único que cambió es cómo se ve. */

.belk-nav{
  left:50%; bottom:calc(var(--bs-gap) + env(safe-area-inset-bottom));
  transform:translateX(-50%);
  width:min(560px, calc(100vw - 2*var(--bs-gap)));
  height:var(--bs-nav-h,64px);
  overflow:hidden;        /* el glider se recorta contra el radio de la píldora */
  transition:transform .28s ease, opacity .28s ease;
  /* Vidrio propio: más opaco que el compartido para que la estela y el
     recuadro activo tengan sobre qué brillar. */
  /* Nivel 0 (#050D19), el más oscuro del proyecto: la cápsula oscura es
     lo que hace que la tinta y la estela se vean intensas. */
  /* Marino corrido hacia el cian, no gris: es lo que hace que la cápsula
     "tenga color" en vez de verse apagada. El filo también es celeste. */
  background-color:rgba(6,26,40,.95);
  border-color:rgba(129,214,247,.26);
  /* Dos capas: el separador de Escaneo IA (línea de 1 px al 80 %) y un
     velo celeste sobre todo el ancho. El separador vive acá y no en un
     pseudo-elemento porque los dos de la píldora los ocupa la estela. */
  background-image:
    linear-gradient(rgba(81,199,245,0), rgba(81,199,245,.42), rgba(81,199,245,0)),
    linear-gradient(180deg, rgba(81,199,245,.10), rgba(81,199,245,.03));
  background-repeat:no-repeat, no-repeat;
  background-size:1px 38px, auto;
  background-position:80% 13px, 0 0;
  border-radius:17px;
  box-shadow:
    inset 1px 1px 0 rgba(255,255,255,.11),
    0 12px 30px rgba(4,14,24,.30);
  -webkit-backdrop-filter:blur(18px) saturate(150%);
  backdrop-filter:blur(18px) saturate(150%);
}

/* Cuánto va encendido, medido sobre el TRAMO de la estela (no sobre la
   píldora): 3 saltos iguales entre los 4 pasos. Se mide así porque el
   avance ahora RECORTA una estela de ancho fijo — si en vez de eso la
   estela creciera, sus atenuaciones se moverían con ella. */
.belk-nav[data-active="1"]{--bn-avance:0%}
.belk-nav[data-active="2"]{--bn-avance:33.333%}
.belk-nav[data-active="3"]{--bn-avance:66.667%}
.belk-nav[data-active="4"]{--bn-avance:100%}

/* Estela apagada (::before) y encendida (::after). Van detrás de las
   etiquetas: por eso el texto lleva text-shadow, para no perderse. */
.belk-nav::before,.belk-nav::after{
  content:""; position:absolute; z-index:1; pointer-events:none;
  top:39px; height:4px; border-radius:999px;
}
.belk-nav::before{
  left:10%; right:30%;
  background:linear-gradient(90deg, transparent,
    rgba(140,196,222,.30) 5%, rgba(140,196,222,.30) 95%, transparent);
  filter:blur(.45px);
}
/* La estela encendida ocupa SIEMPRE el tramo entero; lo que cambia es
   cuánto se recorta. Baja de intensidad justo donde pasa por detrás de
   cada palabra y la recupera en los huecos.

   La banda cubre el 60 % del paso entre centros, porque medido sobre la
   barra real las etiquetas ocupan ~58 %. Con la banda anterior (31 %) la
   línea se apagaba solo en el centro exacto de la palabra y seguía
   brillante sobre casi todas las letras. Entre palabra y palabra queda
   un 22 % del paso a brillo pleno. */
.belk-nav::after{
  left:10%; right:30%;
  background:linear-gradient(90deg,
    rgba(90,203,246,.27) 10.0%,
    rgba(92,204,246,.81) 13.0%,
    rgba(99,207,247,.82) 20.3%,
    rgba(101,208,247,.28) 23.3%,
    rgba(119,216,249,.29) 43.3%,
    rgba(121,217,250,.87) 46.3%,
    rgba(128,220,250,.89) 53.7%,
    rgba(130,221,251,.30) 56.7%,
    rgba(148,229,253,.32) 76.7%,
    rgba(150,230,253,.94) 79.7%,
    rgba(157,233,254,.95) 87.0%,
    rgba(159,234,254,.33) 90.0%);
  box-shadow:0 0 16px rgba(81,199,245,.58);
  clip-path:inset(0 calc(100% - var(--bn-avance,0%)) 0 0);
  transition:clip-path .46s cubic-bezier(.2,.75,.25,1);
}
/* Fuera de la secuencia (Panel, Looks) y en Escaneo IA no hay avance:
   la estela se ve entera pero apagada. */
.belk-nav:not([data-active]),.belk-nav[data-active="5"]{--bn-avance:0%}

.bn-i{
  flex:1; min-width:0; position:relative; z-index:3;
  display:flex; flex-direction:column; align-items:center; justify-content:flex-start;
  gap:6px; padding:6px .4rem 5px; margin:0;
  /* Costos usa <button class="bn-i"> (flush de sesión antes de Cotización).
     Sin esto el UA pinta fondo claro y la tinta desaparece. */
  background:transparent; border:0; cursor:pointer;
  isolation:isolate;
  color:#a6c9dd; text-decoration:none;
  transition:color .3s ease;
}
.bn-i svg{width:22px; height:22px; display:block; flex-shrink:0;
  position:relative; z-index:2}
.bn-i span{
  position:relative; z-index:4;
  font-size:11px; line-height:14px; letter-spacing:.005em;
  max-width:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
  /* La estela pasa por detrás del texto; sin sombra el texto se pierde. */
  text-shadow:0 1px 2px rgba(6,17,29,.92), 0 0 4px rgba(6,17,29,.60);
  transition:color .3s ease, text-shadow .3s ease;
}
.bn-i:hover{color:var(--bs-text-on)}

/* Pasos ya recorridos: celeste suave. */
.belk-nav[data-active="2"] .bn-i:nth-child(2),
.belk-nav[data-active="3"] .bn-i:nth-child(2),
.belk-nav[data-active="3"] .bn-i:nth-child(3),
.belk-nav[data-active="4"] .bn-i:nth-child(2),
.belk-nav[data-active="4"] .bn-i:nth-child(3),
.belk-nav[data-active="4"] .bn-i:nth-child(4){color:#8fd3ea}
.belk-nav[data-active="2"] .bn-i:nth-child(2) span,
.belk-nav[data-active="3"] .bn-i:nth-child(2) span,
.belk-nav[data-active="3"] .bn-i:nth-child(3) span,
.belk-nav[data-active="4"] .bn-i:nth-child(2) span,
.belk-nav[data-active="4"] .bn-i:nth-child(3) span,
.belk-nav[data-active="4"] .bn-i:nth-child(4) span{
  color:#bdeafb; font-weight:600;
  text-shadow:0 1px 2px rgba(6,17,29,.95), 0 0 9px rgba(81,199,245,.42);
}
.belk-nav[data-active="2"] .bn-i:nth-child(2) svg,
.belk-nav[data-active="3"] .bn-i:nth-child(2) svg,
.belk-nav[data-active="3"] .bn-i:nth-child(3) svg,
.belk-nav[data-active="4"] .bn-i:nth-child(2) svg,
.belk-nav[data-active="4"] .bn-i:nth-child(3) svg,
.belk-nav[data-active="4"] .bn-i:nth-child(4) svg{
  filter:drop-shadow(0 0 7px rgba(81,199,245,.40));
}

/* Destino que el invitado todavía no puede usar (auditoría UX C4). */
.bn-i--locked{opacity:.5}
.bn-i--locked::after{
  content:"🔒"; position:absolute; top:4px; right:calc(50% - 20px);
  font-size:9px; line-height:1; pointer-events:none; z-index:4;
}
.nav-item--locked{opacity:.62}
.nav-item--locked::after{content:"🔒"; margin-left:auto; font-size:11px; opacity:.8}
.bn-i:focus-visible{outline:2px solid #51C7F5; outline-offset:-3px; border-radius:14px}

/* El módulo activo: texto casi blanco con brillo, no tinta sobre bloque. */
.bn-i[aria-current="page"]{color:#ddf7ff}
.bn-i[aria-current="page"] svg{
  color:#eafaff; transform:translateY(-1px);
  filter:drop-shadow(0 0 9px rgba(81,199,245,.88));
  transition:filter .3s ease, transform .3s ease;
}
.bn-i[aria-current="page"] span{
  color:#f7fcff; font-weight:500; letter-spacing:.015em;
  text-shadow:0 1px 2px rgba(6,17,29,.95),
              0 0 7px rgba(213,247,255,.72),
              0 0 18px rgba(81,199,245,.88);
}

/* Escaneo IA queda al otro lado. No es un paso, así que tampoco se
   alinea con ellos: va centrado en vertical, y su etiqueta cae por
   debajo de la línea de la estela. El separador lleva degradado. */
/* padding 0 (no solo arriba): con el de abajo puesto quedaba 1 px más
   baja que los pasos, y en el traspaso son 5. */
.belk-nav .bn-i:nth-child(6){justify-content:center; gap:5px; padding-block:0}
.belk-nav .bn-i:nth-child(6) span{font-weight:500}
.belk-nav .bn-i:nth-child(6)::before{
  content:""; position:absolute; left:0; top:13px;
  width:1px; height:38px; pointer-events:none;
  background:linear-gradient(transparent, rgba(81,199,245,.34), transparent);
}

/* ── El recuadro de vidrio del activo ──────────────────────
   Es el glider de siempre: mismo elemento, mismo data-active, misma
   regla de translateX. Lo único que cambió es que dejó de ser un
   bloque celeste sólido. */
.bn-glider{
  position:absolute; top:0; bottom:0; left:0; z-index:2;
  width:calc(100% / 5);
  pointer-events:none;
  transition:transform .46s cubic-bezier(.2,.75,.25,1);
}
.bn-glider::before{
  content:""; position:absolute; inset:3px -2px 2px;
  border:1px solid rgba(194,241,255,.62);
  /* Más cuadrado que la cápsula (17) a propósito: el contraste entre las
     dos formas es lo que hace que el botón se lea como pieza aparte. */
  border-radius:8px;
  background:
    radial-gradient(circle at 50% 112%, rgba(81,199,245,.38), transparent 56%),
    linear-gradient(145deg, rgba(224,248,255,.26), rgba(81,199,245,.12) 58%, rgba(8,25,39,.05));
  box-shadow:
    inset 1px 1px 0 rgba(255,255,255,.34),
    inset 0 -1px 0 rgba(81,199,245,.18),
    0 0 0 1px rgba(81,199,245,.14),
    0 0 22px rgba(81,199,245,.52),
    0 0 44px rgba(81,199,245,.26);
  -webkit-backdrop-filter:blur(11px) saturate(155%);
  backdrop-filter:blur(11px) saturate(155%);
}
/* El foco de luz sobre la estela, a la altura del paso actual. */
.bn-glider::after{
  content:""; position:absolute; left:50%; top:41px;
  width:108px; height:34px; pointer-events:none;
  transform:translate(-50%,-50%); border-radius:50%;
  background:radial-gradient(ellipse at center,
    rgba(235,252,255,.80) 0 6%, rgba(81,199,245,.52) 22%,
    rgba(81,199,245,.22) 45%, transparent 73%);
  filter:blur(1.8px);
  animation:bnRespira 2.8s ease-in-out infinite;
}
/* En los EXTREMOS el recuadro no puede sobresalir: se sale de la cápsula
   y overflow:hidden lo corta contra la esquina redondeada — se veía
   deformado en el primer módulo y en el último. Ahí se recoge y deja el
   mismo aire que arriba y abajo. */
.belk-nav[data-active="1"] .bn-glider::before{inset:3px -2px 2px 4px}
.belk-nav[data-active="5"] .bn-glider::before{inset:3px 4px 2px -2px}

@keyframes bnRespira{0%,100%{opacity:.68}50%{opacity:1}}

/* En Escaneo IA no hay paso, así que tampoco foco sobre la estela. */
.belk-nav[data-active="5"] .bn-glider::after{display:none}

.belk-nav[data-active="1"] .bn-glider{transform:translateX(0)}
.belk-nav[data-active="2"] .bn-glider{transform:translateX(100%)}
.belk-nav[data-active="3"] .bn-glider{transform:translateX(200%)}
.belk-nav[data-active="4"] .bn-glider{transform:translateX(300%)}
.belk-nav[data-active="5"] .bn-glider{transform:translateX(400%)}

.belk-nav.shell-away{
  transform:translateX(-50%) translateY(calc(100% + 30px + var(--bs-gap) + env(safe-area-inset-bottom)));
  opacity:0; pointer-events:none;
}

/* ── La pestaña «PASO n/4» ─────────────────────────────────
   Va DETRÁS de la píldora (z-index bajo) y asoma por abajo: por eso
   solo lleva radio en las esquinas inferiores y no tiene borde
   superior. Sin clip-path ni SVG — así venía en el traspaso y es
   mucho más simple que la silueta recortada que tenía antes. */
.bn-step{
  position:fixed; z-index:339;   /* justo DEBAJO de la píldora (340) */
  pointer-events:none;
  left:50%; transform:translateX(-50%);
  /* 22 px por debajo del borde inferior de la píldora: los otros 8 px
     de su alto quedan escondidos detrás. */
  bottom:calc(var(--bs-gap) + env(safe-area-inset-bottom) - 22px);
  display:flex; align-items:center; justify-content:center; gap:8px;
  width:112px; height:30px; padding-top:7px;
  border:1px solid rgba(255,255,255,.10); border-top:0;
  border-radius:0 0 15px 15px;
  background:rgba(5,13,25,.94);
  box-shadow:0 10px 20px rgba(2,8,16,.28), inset 1px 0 0 rgba(255,255,255,.07);
  color:#8fa1b4;
  -webkit-backdrop-filter:blur(18px) saturate(150%);
  backdrop-filter:blur(18px) saturate(150%);
  transition:transform .28s ease, opacity .28s ease;
}
.bn-step i{font-style:normal; font-size:11px; font-weight:500;
  letter-spacing:.20em; text-transform:uppercase}
.bn-step b{color:#c2cfdd; font-size:14px; font-weight:500; letter-spacing:-.02em;
  font-variant-numeric:tabular-nums}
/* Se esconde junto con la píldora al bajar por el contenido. */
.belk-nav.shell-away ~ .bn-step{
  transform:translateX(-50%) translateY(calc(100% + 30px + var(--bs-gap) + env(safe-area-inset-bottom)));
  opacity:0;
}
@media(max-width:560px){ .bn-step{width:104px} }


/* ── Barra de acciones — EN EL FLUJO, al final del contenido ──────
   Ya no flota al costado (decisión del usuario 2026-07-29, en las dos
   versiones). Como píldora fija robaba 218 px de ancho a TODAS las páginas
   y quedaba colgando a media altura de la pantalla, lejos del dato sobre el
   que actúa. Ahora es una barra horizontal donde termina el contenido: la
   misma en escritorio y en teléfono, y lo único que cambia con el ancho es
   que en ≤768px los botones pierden la etiqueta (ver el bloque de móvil). */

.belk-acts{
  position:static;
  margin:0 auto 12px; padding:8px;
  width:fit-content; max-width:calc(100% - 24px);
  flex-flow:row wrap; justify-content:center; align-items:center; gap:6px;
}

.ba-i{
  position:relative; flex-shrink:0;
  height:44px;                          /* mínimo táctil 44 de alto */
  display:flex; align-items:center; justify-content:center; gap:10px;
  padding:0 14px;
  border-radius:calc(var(--bs-radius) - 6px);
  color:var(--bs-text);
  background:none; border:0; cursor:pointer;
  font:inherit; font-size:12.5px; font-weight:600; letter-spacing:.2px;
  text-align:left; white-space:nowrap;
  transition:background .2s ease, color .2s ease;
}
/* El nombre de la acción, SIEMPRE a la vista en escritorio (A9). */
.ba-i::before{content:attr(data-label); overflow:hidden; text-overflow:ellipsis}
.ba-i svg{width:20px; height:20px; display:block; flex-shrink:0}
.ba-i:hover{background:rgba(13,35,80,.07); color:var(--bs-text-on)}
[data-zona="documento"] .ba-i:hover,
[data-zona="taller"] .ba-i:hover{background:rgba(255,255,255,.10)}
.ba-i:focus-visible{outline:2px solid var(--belk-brand,#143A7D); outline-offset:-2px}
.ba-i:disabled{opacity:.55; cursor:not-allowed}   /* .4 se leía como roto */
.ba-i--primary{
  color:var(--bs-on-ink);
  background:var(--bs-on);
  box-shadow:0 2px 10px color-mix(in srgb, var(--bs-on) 35%, transparent);
}

/* `.ba-sep` ELIMINADO (decisión del usuario 2026-07-29). Existía para separar
   las acciones del módulo de los "Enviar a…", y esos botones ya no existen ni
   vuelven: el dato viaja solo entre módulos (`publicarACostos` en tapacanto.js,
   `presupuesto.result` en presupuesto.js). Sin envíos manuales no hay dos
   grupos que separar. Si algún día vuelve un grupo distinto de acciones, se
   decide el separador de nuevo — no se resucita este. */

/* El tooltip al hover se retiró (A9): la etiqueta ya está escrita en el botón.
   Un tooltip que repite lo que se está leyendo es ruido, y era la única forma
   de descubrir la mitad de las acciones — imposible en un teléfono. */

/* ── Despeje del contenido ──────────────────────────────── */

/* La barra de acciones ya no ocupa el costado: no hay `padding-right` que
   reservar, y las páginas sin barra dejaron de ser un caso especial. */
body.has-shell{
  padding-bottom:calc(var(--bs-nav-h) + 2*var(--bs-gap) + env(safe-area-inset-bottom));
}

/* Páginas cuyo layout YA mide el alto de la ventana (index.html: .layout es
   height:calc(100vh - 52px) con scroll interno). Ahí el padding-bottom del body
   no despeja nada: solo agrega ~96px de scroll muerto que despega el header
   fijo al desplazarse. Auditoría UX B30. En móvil ese layout pasa a
   height:auto y el body sí scrollea, así que el despeje vuelve. */
@media (min-width:769px){
  body.has-shell.shell-fixed{padding-bottom:0}
}

/* ── El marco PUBLICA su despeje; los flotantes lo CONSUMEN ──────
   Antes esto eran 8 reglas con !important pisando componentes ajenos
   (`body.has-shell .bk-wa-fab{bottom:96px!important}`). Eso invierte la
   dependencia: el marco tenía que conocer a cada flotante por su clase, y
   cualquier flotante nuevo nacía tapado hasta que alguien lo agregara acá.

   Ahora el marco solo declara CUÁNTO espacio ocupa, y cada flotante lee el
   token con su propio valor de respaldo — así funciona igual en páginas que
   no cargan el marco. Sin !important y sin que el marco sepa de nadie.

   Un flotante nuevo se apoya escribiendo:
     bottom: var(--belk-float-bottom, 16px);
     right:  var(--belk-float-right, 16px); */
:root{
  --belk-float-bottom:16px;   /* páginas sin marco: pegado al borde */
  --belk-float-right:16px;
  --belk-float-bottom-2:68px; /* segundo nivel (el fab que va sobre otro) */
}
body.has-shell{
  --belk-float-bottom:118px;     /* píldora (64) + pestaña (22) + gap (16) + aire */
  --belk-float-bottom-2:170px;   /* encima del anterior */
  /* `--belk-float-right` se queda en el valor base: la barra de acciones ya no
     está al costado, así que no hay nada que despejar a la derecha. */
}

/* La leyenda del plano es lo último de la página y queda bajo la píldora */
body.has-shell .leg{padding-bottom:122px}

/* ── Móvil: la barra es la misma, pero sin etiquetas ─────────────
      A 390 px seis botones con nombre no caben en una fila y volvía el scroll
      horizontal que nadie descubre. Cuadrados de 44 (el mínimo táctil): las 6
      acciones de Costos/Cotización entran en una sola fila. El nombre sigue en
      `aria-label` para lectores de pantalla — el usuario eligió sin texto
      sabiendo que contradice el hallazgo A9. ──────────────────── */

@media (max-width:768px){
  .belk-acts{margin:0 12px 12px; max-width:none; width:auto}
  .ba-i{width:44px; padding:0; gap:0}
  .ba-i::before{content:none}     /* el nombre no se escribe en móvil */
}

@media (prefers-reduced-motion:reduce){
  .bn-i,.ba-i,.ba-i::after,.bn-glider{transition:none}
}

/* ═══════════════════════════════════════════════════════════════
   BOTÓN DE MARCA DEL HEADER — «Presentamos BELK»
   ───────────────────────────────────────────────────────────────
   Placa negra con filo de metal: el mismo tratamiento del ícono de
   la app — icon.svg es una placa negra con barras de gradiente
   metálico y una barra azul. Acá el botón ES esa pieza: placa,
   filo de metal y BELK en el azul del logo.

   Antes era un botón gris con el estilo escrito EN LÍNEA en las 5
   páginas del taller. El sello lo prohíbe (§2.7: el chrome nunca es
   hex en el markup); esto lo trae al componente.

   No compite con «Activar Plan»: esa es LA primaria del header y va
   celeste LLENO. Acá el color es solo la palabra BELK.

   ≤560px cae «Presentamos» y queda la píldora con BELK. No duplica
   nada: a ese ancho el wordmark BELK del header ya está oculto
   (verificado en dev, 2026-08-29).
   ═══════════════════════════════════════════════════════════════ */
.hdr-marca{
  display:inline-flex; align-items:center; gap:5px;
  height:32px; padding:0 13px; flex-shrink:0; cursor:pointer;
  font-family:inherit; font-size:10.5px; font-weight:800;
  letter-spacing:.05em; text-transform:uppercase; white-space:nowrap;
  border:2px solid transparent; border-radius:999px;
  /* DATOS de marca, no tema: la placa negra, los stops de metal y el
     azul son los mismos valores de icon.svg. Por eso van en hex. */
  color:#F7F3E9;
  background:
    linear-gradient(#000,#000) padding-box,
    linear-gradient(180deg,#E9E5E7 0%,#C8C4C6 42%,#B9B3B6 58%,#DDD8DA 100%) border-box;
  transition:filter .18s;
}
.hdr-marca .hm-mk{color:#26B1E5; font-weight:800}  /* DATOS: azul del logo */
.hdr-marca:hover{filter:brightness(1.14)}
.hdr-marca:focus-visible{outline:2px solid #26B1E5; outline-offset:2px}

@media(max-width:560px){
  .hdr-marca{padding:0 15px}
  .hdr-marca .hm-pre{display:none}
}
@media(prefers-reduced-motion:reduce){ .hdr-marca{transition:none} }
