/* ==========================================================================
   BestByte · SISTEMA — Componentes (portal del cliente + panel admin)
   Requiere: app-tokens.css (antes) · Inter (Google Fonts)
   --------------------------------------------------------------------------
   ÍNDICE (clase → uso). Regla: lo que usan dos pantallas vive aquí; los CSS de
   screens/ solo guardan lo propio de su pantalla (con prefijo: .cc- .pj- .as- .adm-).
    0. Base ............ reset, tipografía, .sr-only, .skip-link, .num (cifras
                         tabulares), .mono, .muted, .text-2/.text-3, .truncate,
                         .nowrap (códigos PRY-, BB-, F001-, SKU: .mono.nowrap)
    1. Utilidades ...... .stack(-sm/-lg) .row .row--between .spacer .grid
                         .grid--2/3/4 .grid--kpi (4 KPIs: 4 columnas o 2 × 2)
                         .grid--main (2/3 + 1/3) .grid--aside .span-all
                         .hide-sm .show-sm .mt-0… .w-full .divider
    2. Shell ........... .app-shell .sidebar .sidebar__head .sidebar__brand
                         .sidebar__product .sidebar__context (.context-switch)
                         .sidebar__nav .nav-group(__title) .nav-item(__icon
                         __label __badge) .sidebar__foot .sidebar-backdrop
                         .app-main .topbar(__start __end) .cmd-trigger
                         .page .page__inner(--narrow --wide)
    3. Logo ............ .logo .logo__word .logo__mark .logo--sm/--lg .svg-defs
    4. Encabezados ..... .breadcrumb .page-header(__main __title __desc
                         __meta __actions) .section-head(__title __desc)
    5. Botones ......... .btn --primary --secondary --ghost --danger
                         --danger-ghost --link --sm --lg --block --icon
                         .is-loading · .btn-group · .icon-btn(__dot) · .kbd
    6. Formularios ..... .field(__label __hint __error) .input .select
                         .textarea .input-group(__addon __btn) .search-input
                         .check .switch .file-drop .form-grid .fieldset
                         .copy-field · .choice-grid/.choice-list .choice(--tile)
                         (__icon __body __title __hint __aside) · .otp
                         · .pw-meter .pw-rules
    7. Tarjetas ........ .card(__head __title __desc __actions __body __foot)
                         --flush --muted --interactive --highlight ·
                         .dl · .meta (separadores que no quedan al inicio del
                         renglón) · .list .list-item(__icon __main __title
                         __meta __aside) · .note(--box --foot) · .disclosure
                         (y .card.disclosure) · .next-step(--indigo --warning
                         --info --success) · .settings .settings-row(--wide)
                         · .state-tile
    8. KPI ............. .stat(__label __value __delta __meta __spark) ·
                         .stat-strip(--3) · compactación < 440 px
    9. Tablas .......... .table-card .table-toolbar .table-wrap .table
                         --compact --stack (td[data-label]) .th-sort
                         .cell-main/.cell-sub .cell-stack .cell-actions
                         .bulk-bar .pagination · .filter-bar .seg-count
                         .result-count
   10. Badges .......... .badge --success/--warning/--danger/--info/--neutral
                         /--primary/--indigo · .badge--outline .badge--sm
                         .count · .status-dot · .sla(--ok --warn --late --done)
   11. Tabs ............ .tabs .tabs__list .tab .tab__count .tab-panel
                         .tabs--pages (pestañas que son páginas)
                         .segmented .segmented__btn · .chips .chip
                         .chip--radio · .vtabs (pestañas verticales de ajustes)
   12. Menús ........... .dropdown .menu(--end --wide) .menu__item(--danger)
                         .menu__sep .menu__label .menu__head · .notif-list
   13. Superposiciones . .modal(--sm --lg --xl)(__head __title __body __foot
                         __close) .drawer · .cmdk · .tooltip
   14. Feedback ........ .toast-region .toast · .alert(--info --success
                         --warning --danger --neutral --indigo)(__icon __body
                         __title __actions) .alert-list · .empty(--compact
                         --error) · .skeleton · .progress(__bar) · .spinner
   15. Actividad ....... .timeline · .stepper · .steps-bar · .mini-steps
                         · .thread(--scroll) .thread__day .thread__event
                         .msg(--me --staff --internal)(__card __head __name
                         __role __time __body __files) · .attach-list
                         .attachment · .composer(--foot --boxed --sep
                         .is-internal)(__bar __hint __attach __picked)
   16. Archivos ........ .file-list .file(__icon __main __name __meta
                         __actions __hash) .file--locked .file-list--compact
                         .version-tag .hash .hash-cell · .dlv(__head __main
                         __title __badges __actions __files __foot--toolbar
                         __note) .ver .old-ver · .locked .pay-status
                         .preview(--locked --tall) .preview__badge
                         .preview-strip
   17. Personas ........ .avatar(--xs --sm --lg --xl --square --brand)
                         .avatar-group .person(__name __sub)
   18. Gráficos ........ .chart(__svg __tooltip) .spark .stackbar .legend
                         (.is-ok .is-slow .is-down) .uptime · .day-bars
   19. Dominio ......... .site-card .site-thumb .health-list .health-tiles
                         .health-tile(--ok --warn --bad) .promo .kv · .qr ·
                         .kanban .kanban-card · .due · .queue .queue-item
                         · .amount-compare · .verify-box
   20. Responsive / impresión / movimiento reducido
   21. Ajustes finos compartidos
   ========================================================================== */

/* ==========================================================================
   0. BASE
   ========================================================================== */
*, *::before, *::after { box-sizing: border-box; }
html {
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
  scroll-padding-top: calc(var(--topbar-h) + 16px);
}
body {
  margin: 0;
  min-height: 100vh;
  min-height: 100dvh;
  font-family: var(--font-sans);
  font-size: var(--fs-base);
  line-height: var(--lh-base);
  font-weight: var(--fw-regular);
  color: var(--c-text);
  background: var(--c-bg);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  font-feature-settings: "cv11", "ss03";
  overflow-x: hidden;
}
html:has(dialog[open]) { overflow: hidden; }
img, svg, video { display: block; max-width: 100%; }
svg { flex-shrink: 0; }
button, input, select, textarea { font: inherit; color: inherit; letter-spacing: inherit; }
button { cursor: pointer; background: none; border: 0; padding: 0; }
button:disabled { cursor: not-allowed; }
a { color: var(--c-link); text-decoration: none; text-underline-offset: 2px; }
a:hover { color: var(--c-link-hover); text-decoration: underline; }
h1, h2, h3, h4, h5, h6, p, ul, ol, dl, dd, figure { margin: 0; }
h1, h2, h3, h4 { font-weight: var(--fw-semi); letter-spacing: var(--tracking-tight); line-height: var(--lh-tight); color: var(--c-text); }
ul[class], ol[class] { list-style: none; padding: 0; }
table { border-collapse: collapse; border-spacing: 0; }
hr { border: 0; border-top: 1px solid var(--c-divider); margin: var(--sp-4) 0; }
strong, b { font-weight: var(--fw-semi); }
small { font-size: var(--fs-xs); }
code, kbd, samp, pre { font-family: var(--font-mono); font-size: .92em; }
::selection { background: var(--c-primary-soft-2); }
[hidden] { display: none !important; }

:focus { outline: none; }
:focus-visible {
  outline: 2px solid var(--c-focus);
  outline-offset: 2px;
  border-radius: var(--r-sm);
}

.sr-only {
  position: absolute !important;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}
.skip-link {
  position: fixed;
  top: 8px; left: 8px;
  z-index: calc(var(--z-tooltip) + 1);
  padding: 8px 14px;
  border-radius: var(--r-md);
  background: var(--c-primary);
  color: var(--c-primary-ink);
  font-weight: var(--fw-semi);
  transform: translateY(-160%);
  transition: transform var(--dur) var(--ease);
}
.skip-link:focus { transform: none; color: var(--c-primary-ink); text-decoration: none; }

.num { font-variant-numeric: tabular-nums; }
.mono { font-family: var(--font-mono); font-size: .92em; letter-spacing: 0; }
.muted, .text-3 { color: var(--c-text-3); }
.text-2 { color: var(--c-text-2); }
.text-sm { font-size: var(--fs-sm); }
.text-xs { font-size: var(--fs-xs); }
.text-strong { font-weight: var(--fw-semi); color: var(--c-text); }
.text-success { color: var(--c-success-text); }
.text-warning { color: var(--c-warning-text); }
.text-danger { color: var(--c-danger-text); }
.nowrap { white-space: nowrap; }
.truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
.link-quiet { color: inherit; }
.link-quiet:hover { color: var(--c-link); }

/* Iconos del sprite: <svg class="i"><use href="…/app-sprite.svg#i-home"></use></svg> */
.i {
  display: inline-block;
  width: 16px; height: 16px;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.75;
  stroke-linecap: round;
  stroke-linejoin: round;
  vertical-align: middle;
}
.i--xs { width: 12px; height: 12px; }
.i--sm { width: 14px; height: 14px; }
.i--md { width: 18px; height: 18px; }
.i--lg { width: 20px; height: 20px; stroke-width: 1.6; }
.i--xl { width: 24px; height: 24px; stroke-width: 1.5; }

/* ==========================================================================
   1. UTILIDADES DE LAYOUT
   ========================================================================== */
.stack { display: flex; flex-direction: column; gap: var(--sp-4); }
.stack-sm { display: flex; flex-direction: column; gap: var(--sp-2); }
.stack-lg { display: flex; flex-direction: column; gap: var(--sp-6); }
.row { display: flex; align-items: center; flex-wrap: wrap; gap: var(--sp-2); min-width: 0; }
.row--between { justify-content: space-between; }
.row--top { align-items: flex-start; }
.row--nowrap { flex-wrap: nowrap; }
.row--gap-lg { gap: var(--sp-4); }
.spacer { flex: 1 1 auto; }
.w-full { width: 100%; }
.mt-0 { margin-top: 0 !important; }
.mt-2 { margin-top: var(--sp-2); }
.mt-4 { margin-top: var(--sp-4); }
.mt-6 { margin-top: var(--sp-6); }
.divider { height: 1px; background: var(--c-divider); border: 0; margin: var(--sp-4) 0; }

.grid { display: grid; gap: var(--sp-5); min-width: 0; }
.grid > * { min-width: 0; }
.grid--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.grid--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.grid--4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.grid--kpi { grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: var(--sp-4); }
.grid--main { grid-template-columns: minmax(0, 2fr) minmax(300px, 1fr); align-items: start; }
.grid--aside { grid-template-columns: minmax(260px, 1fr) minmax(0, 2.4fr); align-items: start; }
.span-all { grid-column: 1 / -1; }
@media (max-width: 1199.98px) {
  .grid--main, .grid--aside { grid-template-columns: minmax(0, 1fr); }
  .grid--4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 767.98px) {
  .grid--2, .grid--3, .grid--4 { grid-template-columns: minmax(0, 1fr); }
  .grid { gap: var(--sp-4); }
}
@media (max-width: 639.98px) {
  .grid--kpi { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sp-3); }
}
/* Fila de 4 KPIs: 4 columnas si caben (contenedor ≥ 808 px) y si no 2 × 2; nunca 3 + 1 huérfana */
@media (min-width: 640px) {
  .grid--kpi:has(> :nth-child(4):last-child) { grid-template-columns: repeat(auto-fit, minmax(clamp(25% - var(--sp-4), (808px - 100%) * 999, 50% - var(--sp-4)), 1fr)); }
}
@media (max-width: 639.98px) { .hide-sm { display: none !important; } }
@media (min-width: 640px) { .show-sm { display: none !important; } }

/* ==========================================================================
   2. SHELL · sidebar + topbar + página
   ========================================================================== */
.app-shell {
  display: grid;
  grid-template-columns: var(--sidebar-w) minmax(0, 1fr);
  min-height: 100vh;
  min-height: 100dvh;
  transition: grid-template-columns var(--dur-slow) var(--ease);
}
:root[data-sidebar="collapsed"] .app-shell { grid-template-columns: var(--sidebar-w-collapsed) minmax(0, 1fr); }

/* ---- Sidebar ---- */
.sidebar {
  position: sticky;
  top: 0;
  z-index: var(--z-sidebar);
  height: 100vh;
  height: 100dvh;
  display: flex;
  flex-direction: column;
  min-width: 0;
  background: var(--c-sidebar);
  border-right: 1px solid var(--c-border);
}
.sidebar__head {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  height: var(--topbar-h);
  padding: 0 var(--sp-4) 0 var(--sp-5);
  flex: none;
}
/* .sidebar__brand es también .logo: sin gap, así "Best" + bolsa + "yte" quedan juntos como en la tienda */
.sidebar__brand { display: inline-flex; align-items: center; gap: 0; min-width: 0; text-decoration: none; }
.sidebar__brand:hover { text-decoration: none; }
.sidebar__product {
  font-size: var(--fs-2xs);
  font-weight: var(--fw-semi);
  letter-spacing: var(--tracking-caps);
  text-transform: uppercase;
  color: var(--c-text-3);
  padding: 2px 6px;
  border: 1px solid var(--c-border);
  border-radius: var(--r-xs);
  line-height: 1.3;
  white-space: nowrap;
  margin-left: 2px;
}
.sidebar .sidebar__close { margin-left: auto; display: none; }

.sidebar__context { padding: 4px var(--sp-3) var(--sp-2); flex: none; }
.context-switch {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  width: 100%;
  padding: 8px 10px;
  border: 1px solid var(--c-border);
  border-radius: var(--r-md);
  background: var(--c-surface);
  text-align: left;
  transition: background var(--dur-fast), border-color var(--dur-fast);
}
.context-switch:hover { background: var(--c-bg-subtle); }
.context-switch__text { display: flex; flex-direction: column; min-width: 0; flex: 1; line-height: 1.3; }
.context-switch__name { font-weight: var(--fw-semi); font-size: var(--fs-sm); color: var(--c-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.context-switch__sub { font-size: var(--fs-xs); color: var(--c-text-3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.context-switch > .i { color: var(--c-text-3); }

.sidebar__nav {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  overflow-x: hidden;
  padding: var(--sp-2) var(--sp-3) var(--sp-4);
  scrollbar-width: thin;
  scrollbar-color: var(--c-border-strong) transparent;
}
.nav-group + .nav-group { margin-top: var(--sp-4); }
.nav-group__title {
  display: block;
  padding: 0 10px 6px;
  font-size: var(--fs-2xs);
  font-weight: var(--fw-semi);
  letter-spacing: var(--tracking-caps);
  text-transform: uppercase;
  color: var(--c-text-3);
  white-space: nowrap;
}
.nav-list { display: flex; flex-direction: column; gap: 2px; }
.nav-item {
  position: relative;
  display: flex;
  align-items: center;
  gap: 10px;
  min-height: 34px;
  padding: 6px 10px;
  border-radius: var(--r-md);
  color: var(--c-text-2);
  font-weight: var(--fw-medium);
  font-size: var(--fs-base);
  text-decoration: none;
  white-space: nowrap;
  transition: background var(--dur-fast), color var(--dur-fast);
}
.nav-item:hover { background: var(--c-bg-subtle); color: var(--c-text); text-decoration: none; }
.nav-item__icon { width: 18px; height: 18px; color: var(--c-text-3); transition: color var(--dur-fast); }
.nav-item:hover .nav-item__icon { color: var(--c-text-2); }
.nav-item__label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.nav-item__badge {
  min-width: 20px;
  height: 20px;
  padding: 0 6px;
  border-radius: var(--r-full);
  background: var(--c-bg-subtle);
  border: 1px solid var(--c-border);
  color: var(--c-text-2);
  font-size: var(--fs-2xs);
  font-weight: var(--fw-semi);
  line-height: 18px;
  text-align: center;
  font-variant-numeric: tabular-nums;
}
.nav-item__badge--alert { background: var(--c-warning-bg); border-color: var(--c-warning-line); color: var(--c-warning-text); }
.nav-item__badge--danger { background: var(--c-danger-bg); border-color: var(--c-danger-line); color: var(--c-danger-text); }
.nav-item[aria-current="page"], .nav-item.is-active {
  background: var(--c-primary-soft);
  color: var(--c-primary-text);
}
.nav-item[aria-current="page"] .nav-item__icon, .nav-item.is-active .nav-item__icon { color: var(--c-primary-text); }
.nav-item__ext { width: 14px; height: 14px; color: var(--c-text-3); }

.sidebar__foot {
  flex: none;
  padding: var(--sp-3);
  border-top: 1px solid var(--c-border);
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.sidebar__foot .nav-item { font-size: var(--fs-sm); min-height: 32px; }

/* ---- Sidebar colapsada (escritorio) ---- */
:root[data-sidebar="collapsed"] .sidebar__head { padding: 0; justify-content: center; }
:root[data-sidebar="collapsed"] .logo__word,
:root[data-sidebar="collapsed"] .sidebar__product,
:root[data-sidebar="collapsed"] .nav-group__title,
:root[data-sidebar="collapsed"] .context-switch__text,
:root[data-sidebar="collapsed"] .context-switch > .i,
:root[data-sidebar="collapsed"] .nav-item__ext {
  position: absolute !important; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap;
}
:root[data-sidebar="collapsed"] .nav-item__label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); }
:root[data-sidebar="collapsed"] .sidebar__nav,
:root[data-sidebar="collapsed"] .sidebar__foot,
:root[data-sidebar="collapsed"] .sidebar__context { padding-left: 10px; padding-right: 10px; }
:root[data-sidebar="collapsed"] .nav-item { justify-content: center; padding: 8px; }
:root[data-sidebar="collapsed"] .nav-group + .nav-group { margin-top: var(--sp-2); padding-top: var(--sp-2); border-top: 1px solid var(--c-divider); }
:root[data-sidebar="collapsed"] .nav-item__badge {
  position: absolute; top: 3px; right: 5px;
  min-width: 8px; width: 8px; height: 8px; padding: 0;
  font-size: 0; border: 2px solid var(--c-sidebar);
  background: var(--c-primary);
  box-sizing: content-box;
}
:root[data-sidebar="collapsed"] .nav-item__badge--alert { background: var(--c-warning); }
:root[data-sidebar="collapsed"] .nav-item__badge--danger { background: var(--c-danger); }
:root[data-sidebar="collapsed"] .context-switch { justify-content: center; padding: 6px; }

.sidebar-backdrop { display: none; }

/* ---- Columna principal ---- */
.app-main { min-width: 0; display: flex; flex-direction: column; }

/* ---- Topbar ---- */
.topbar {
  position: sticky;
  top: 0;
  z-index: var(--z-topbar);
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  height: var(--topbar-h);
  padding: 0 var(--gutter);
  background: var(--c-topbar);
  -webkit-backdrop-filter: saturate(1.4) blur(10px);
  backdrop-filter: saturate(1.4) blur(10px);
  border-bottom: 1px solid var(--c-border);
}
.topbar__start { display: flex; align-items: center; gap: var(--sp-2); min-width: 0; flex: 1 1 auto; }
.topbar__end { display: flex; align-items: center; gap: 4px; flex: none; }
.topbar__sep { width: 1px; height: 20px; background: var(--c-border); margin: 0 6px; }
/* Isotipo en la topbar: solo cuando la sidebar es cajón (móvil/tablet) */
.topbar__brand { display: none; align-items: center; flex: none; }
.topbar__brand .logo__mark { margin: -2px 0 0; }
@media (max-width: 1023.98px) { .topbar__brand { display: inline-flex; } }

/* Botón que abre la paleta de comandos (se ve como un buscador) */
.cmd-trigger {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
  width: min(420px, 100%);
  height: 34px;
  padding: 0 8px 0 10px;
  border: 1px solid var(--c-border);
  border-radius: var(--r-md);
  background: var(--c-surface);
  color: var(--c-text-3);
  font-size: var(--fs-sm);
  text-align: left;
  box-shadow: var(--sh-xs);
  transition: border-color var(--dur-fast), background var(--dur-fast);
}
.cmd-trigger:hover { border-color: var(--c-border-strong); color: var(--c-text-2); }
.cmd-trigger__text { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* Usuario en la topbar */
.user-btn {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
  height: 36px;
  padding: 0 6px 0 3px;
  border-radius: var(--r-full);
  transition: background var(--dur-fast);
}
.user-btn:hover { background: var(--c-bg-subtle); }
.user-btn__name { font-weight: var(--fw-medium); font-size: var(--fs-sm); color: var(--c-text); max-width: 140px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.user-btn > .i { color: var(--c-text-3); }

/* ---- Página ---- */
.page { flex: 1 1 auto; padding: var(--sp-6) var(--gutter) var(--sp-10); min-width: 0; }
.page:focus { outline: none; }
.page__inner { max-width: var(--content-max); margin: 0 auto; min-width: 0; }
.page__inner--narrow { max-width: var(--content-narrow); }
.page__inner--wide { max-width: none; }
.page-foot {
  max-width: var(--content-max);
  margin: var(--sp-9) auto 0;
  padding-top: var(--sp-4);
  border-top: 1px solid var(--c-divider);
  display: flex; flex-wrap: wrap; gap: var(--sp-2) var(--sp-5);
  color: var(--c-text-3);
  font-size: var(--fs-xs);
}
.page-foot a { color: var(--c-text-3); }
.page-foot a:hover { color: var(--c-link); }

/* ==========================================================================
   3. LOGO — "Best" + bolsa con la "b" azul + "yte"
   Claro: letras grafito/azul marino + bolsa con contorno sutil.
   Oscuro: versión plateada oficial. El símbolo #bb-mark vive en .svg-defs
   (una vez por página) y toma los colores de las variables --logo-*.
   ========================================================================== */
.svg-defs { position: absolute; width: 0; height: 0; overflow: hidden; }
.logo { display: inline-flex; align-items: center; color: var(--c-text); text-decoration: none; line-height: 1; }
.logo:hover { text-decoration: none; }
.logo__mark { width: 26px; height: 30px; margin: -4px 1px 0; flex: none; }
.logo__word {
  font-family: var(--font-logo);
  font-size: 1.3rem;
  font-weight: 900;
  font-style: italic;
  letter-spacing: -.03em;
  line-height: 1;
  padding-right: .06em;
  background: var(--logo-word);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  filter: var(--logo-word-shadow);
}
.logo--sm .logo__mark { width: 22px; height: 25px; }
.logo--sm .logo__word { font-size: 1.1rem; }
.logo--lg .logo__mark { width: 36px; height: 41px; }
.logo--lg .logo__word { font-size: 1.8rem; }
:root[data-sidebar="collapsed"] .sidebar .logo__mark { width: 30px; height: 34px; margin: 0; }

/* ==========================================================================
   4. ENCABEZADOS DE PÁGINA
   ========================================================================== */
.breadcrumb { margin-bottom: var(--sp-3); font-size: var(--fs-sm); }
.breadcrumb ol { display: flex; flex-wrap: wrap; align-items: center; gap: 4px; list-style: none; margin: 0; padding: 0; }
.breadcrumb li { display: inline-flex; align-items: center; gap: 4px; color: var(--c-text-3); min-width: 0; }
.breadcrumb li + li::before {
  content: "";
  width: 14px; height: 14px;
  background: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m9 6 6 6-6 6'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m9 6 6 6-6 6'/%3E%3C/svg%3E") center / contain no-repeat;
  opacity: .7;
}
.breadcrumb a { color: var(--c-text-2); }
.breadcrumb a:hover { color: var(--c-text); }
.breadcrumb [aria-current] { color: var(--c-text); font-weight: var(--fw-medium); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.page-header {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: var(--sp-4) var(--sp-6);
  flex-wrap: wrap;
  margin-bottom: var(--sp-6);
}
.page-header__main { min-width: 0; flex: 1 1 360px; }
.page-header__eyebrow { display: inline-flex; align-items: center; gap: 6px; margin-bottom: 6px; font-size: var(--fs-sm); color: var(--c-text-3); font-weight: var(--fw-medium); }
.page-header__title { font-size: var(--fs-2xl); font-weight: var(--fw-semi); letter-spacing: var(--tracking-title); line-height: 1.2; display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap; }
.page-header__desc { margin-top: 6px; color: var(--c-text-2); max-width: 72ch; }
.page-header__meta { margin-top: var(--sp-2); }
.page-header__actions { display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; }

.section-head { display: flex; align-items: flex-end; justify-content: space-between; gap: var(--sp-3); flex-wrap: wrap; margin-bottom: var(--sp-3); }
.section-head__title { font-size: var(--fs-md); font-weight: var(--fw-semi); }
.section-head__desc { color: var(--c-text-3); font-size: var(--fs-sm); margin-top: 2px; }

/* ==========================================================================
   5. BOTONES
   ========================================================================== */
.btn {
  --btn-h: var(--control-h);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  height: var(--btn-h);
  padding: 0 14px;
  border: 1px solid transparent;
  border-radius: var(--r-md);
  font-size: var(--fs-base);
  font-weight: var(--fw-medium);
  line-height: 1;
  white-space: nowrap;
  text-decoration: none;
  user-select: none;
  transition: background var(--dur-fast), border-color var(--dur-fast), color var(--dur-fast), box-shadow var(--dur-fast);
}
.btn:hover { text-decoration: none; }
.btn .i { width: 16px; height: 16px; }
.btn--primary { background: var(--c-primary); color: var(--c-primary-ink); box-shadow: var(--sh-xs), var(--sh-inset); }
.btn--primary:hover { background: var(--c-primary-hover); color: var(--c-primary-ink); }
.btn--primary:active { background: var(--c-primary-active); }
.btn--secondary { background: var(--c-surface); color: var(--c-text); border-color: var(--c-border-strong); box-shadow: var(--sh-xs); }
.btn--secondary:hover { background: var(--c-bg-subtle); color: var(--c-text); }
.btn--ghost { background: transparent; color: var(--c-text-2); }
.btn--ghost:hover { background: var(--c-bg-subtle); color: var(--c-text); }
.btn--danger { background: var(--c-danger-fill); color: #fff; box-shadow: var(--sh-xs); }
.btn--danger:hover { background: var(--c-danger-fill-hover); color: #fff; }
.btn--danger-ghost { background: transparent; color: var(--c-danger-text); border-color: var(--c-danger-line); }
.btn--danger-ghost:hover { background: var(--c-danger-bg); color: var(--c-danger-text); }
.btn--link { height: auto; padding: 0; border: 0; background: none; color: var(--c-link); font-weight: var(--fw-medium); }
.btn--link:hover { color: var(--c-link-hover); text-decoration: underline; }
.btn--link.mono { font-weight: var(--fw-medium); } /* números de comprobante como enlace: la mono en negrita pesa demasiado */
.btn--sm { --btn-h: var(--control-h-sm); padding: 0 10px; font-size: var(--fs-sm); gap: 5px; }
.btn--sm .i { width: 14px; height: 14px; }
.btn--lg { --btn-h: var(--control-h-lg); padding: 0 18px; }
.btn--block { width: 100%; }
.btn--icon { width: var(--btn-h); padding: 0; }
.btn[disabled], .btn[aria-disabled="true"] { opacity: .5; pointer-events: none; box-shadow: none; }
.btn.is-loading { position: relative; color: transparent !important; pointer-events: none; }
.btn.is-loading::after {
  content: ""; position: absolute; width: 16px; height: 16px; border-radius: 50%;
  border: 2px solid var(--c-text-3); border-right-color: transparent; border-left-color: transparent;
  animation: bb-spin .7s linear infinite;
}
.btn--primary.is-loading::after, .btn--danger.is-loading::after { border-color: #fff transparent #fff transparent; }

.btn-group { display: inline-flex; }
.btn-group > .btn { border-radius: 0; margin-left: -1px; }
.btn-group > .btn:first-child { border-radius: var(--r-md) 0 0 var(--r-md); margin-left: 0; }
.btn-group > .btn:last-child { border-radius: 0 var(--r-md) var(--r-md) 0; }
.btn-group > .btn:focus-visible { z-index: 1; }

.icon-btn {
  position: relative;
  display: inline-grid;
  place-items: center;
  width: 36px; height: 36px;
  border-radius: var(--r-md);
  color: var(--c-text-2);
  transition: background var(--dur-fast), color var(--dur-fast);
}
.icon-btn:hover { background: var(--c-bg-subtle); color: var(--c-text); }
.icon-btn .i { width: 18px; height: 18px; }
.icon-btn--sm { width: 30px; height: 30px; }
.icon-btn--sm .i { width: 16px; height: 16px; }
.icon-btn[aria-expanded="true"] { background: var(--c-bg-subtle); color: var(--c-text); }
.icon-btn__dot {
  position: absolute; top: 4px; right: 3px;
  min-width: 16px; height: 16px; padding: 0 4px;
  border-radius: var(--r-full);
  background: var(--c-primary); color: #fff;
  font-size: 10px; font-weight: var(--fw-semi); line-height: 16px; text-align: center;
  box-shadow: 0 0 0 2px var(--c-bg);
  font-variant-numeric: tabular-nums;
}
.icon-btn__dot:empty { min-width: 8px; width: 8px; height: 8px; padding: 0; top: 8px; right: 8px; }

.kbd {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 20px; height: 20px; padding: 0 5px;
  border: 1px solid var(--c-border);
  border-bottom-width: 2px;
  border-radius: var(--r-xs);
  background: var(--c-surface-2);
  color: var(--c-text-3);
  font-family: var(--font-sans);
  font-size: var(--fs-2xs);
  font-weight: var(--fw-medium);
  line-height: 1;
  white-space: nowrap;
}

/* ==========================================================================
   6. FORMULARIOS
   ========================================================================== */
.field { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.field__label { font-size: var(--fs-sm); font-weight: var(--fw-medium); color: var(--c-text); }
.field__label .req { color: var(--c-danger-text); margin-left: 2px; }
.field__label .opt { color: var(--c-text-3); font-weight: var(--fw-regular); }
.field__hint { font-size: var(--fs-xs); color: var(--c-text-3); }
.field__error { display: flex; align-items: center; gap: 4px; font-size: var(--fs-xs); color: var(--c-danger-text); font-weight: var(--fw-medium); }
.form-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sp-4) var(--sp-5); }
.form-grid > .span-all { grid-column: 1 / -1; }
@media (max-width: 639.98px) { .form-grid { grid-template-columns: minmax(0, 1fr); } }
.fieldset { border: 0; margin: 0; padding: 0; min-width: 0; }
.fieldset > legend { padding: 0; margin-bottom: var(--sp-2); font-size: var(--fs-sm); font-weight: var(--fw-medium); }

.input, .select, .textarea {
  width: 100%;
  min-width: 0;
  height: var(--control-h);
  padding: 0 12px;
  border: 1px solid var(--c-border-strong);
  border-radius: var(--r-md);
  background: var(--c-input);
  color: var(--c-text);
  font-size: var(--fs-base);
  box-shadow: var(--sh-xs);
  transition: border-color var(--dur-fast), box-shadow var(--dur-fast);
}
.input::placeholder, .textarea::placeholder { color: var(--c-text-3); opacity: 1; }
.input:hover, .select:hover, .textarea:hover { border-color: var(--c-text-disabled); }
.input:focus, .select:focus, .textarea:focus,
.input:focus-visible, .select:focus-visible, .textarea:focus-visible {
  outline: none;
  border-color: var(--c-focus);
  box-shadow: 0 0 0 3px var(--c-focus-ring);
}
.input[aria-invalid="true"], .select[aria-invalid="true"], .textarea[aria-invalid="true"] { border-color: var(--c-danger); }
.input[aria-invalid="true"]:focus, .textarea[aria-invalid="true"]:focus { box-shadow: 0 0 0 3px var(--c-danger-bg); }
.input:disabled, .select:disabled, .textarea:disabled, .input[readonly] { background: var(--c-input-disabled); color: var(--c-text-2); box-shadow: none; }
.input--sm, .select--sm { height: var(--control-h-sm); font-size: var(--fs-sm); padding: 0 10px; }
.select--sm { padding-right: 30px; }
.textarea { height: auto; min-height: 96px; padding: 9px 12px; line-height: var(--lh-base); resize: vertical; }
.select {
  appearance: none;
  -webkit-appearance: none;
  padding-right: 34px;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 10px center;
  background-size: 16px;
  cursor: pointer;
}
.select option { background: var(--c-surface); color: var(--c-text); }
@media (max-width: 639.98px) {
  /* 16 px en móvil: iOS no hace zoom al enfocar */
  .input, .select, .textarea { font-size: 16px; }
}

.input-group {
  display: flex;
  align-items: stretch;
  width: 100%;
  border: 1px solid var(--c-border-strong);
  border-radius: var(--r-md);
  background: var(--c-input);
  box-shadow: var(--sh-xs);
  overflow: hidden;
  transition: border-color var(--dur-fast), box-shadow var(--dur-fast);
}
.input-group:focus-within { border-color: var(--c-focus); box-shadow: 0 0 0 3px var(--c-focus-ring); }
.input-group .input { border: 0; box-shadow: none; border-radius: 0; background: transparent; height: calc(var(--control-h) - 2px); }
.input-group .input:focus { box-shadow: none; }
.input-group__addon {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 0 10px;
  color: var(--c-text-3);
  background: var(--c-bg-subtle);
  font-size: var(--fs-sm);
  white-space: nowrap;
}
.input-group__addon:first-child { border-right: 1px solid var(--c-border); }
.input-group__addon:last-child { border-left: 1px solid var(--c-border); }
.input-group > .btn, .input-group > .icon-btn { border-radius: 0; height: auto; border-left: 1px solid var(--c-border); }

.search-input { position: relative; display: flex; align-items: center; min-width: 0; }
.search-input > .i { position: absolute; left: 10px; color: var(--c-text-3); pointer-events: none; }
.search-input .input { padding-left: 34px; }

/* Checkbox / radio nativos con color de marca */
.check { display: inline-flex; align-items: flex-start; gap: 10px; cursor: pointer; font-size: var(--fs-base); color: var(--c-text); line-height: 1.4; }
.check input { flex: none; width: 16px; height: 16px; margin: 2px 0 0; accent-color: var(--c-primary); cursor: pointer; }
.check__text { display: flex; flex-direction: column; gap: 2px; }
.check__hint { font-size: var(--fs-xs); color: var(--c-text-3); }
input[type="checkbox"], input[type="radio"] { accent-color: var(--c-primary); }

/* Switch: <label class="switch"><input type="checkbox" role="switch"><span class="switch__track" aria-hidden="true"></span><span>Texto</span></label> */
.switch { display: inline-flex; align-items: center; gap: 10px; cursor: pointer; position: relative; font-size: var(--fs-base); }
.switch input { position: absolute; left: 0; opacity: 0; width: 36px; height: 20px; margin: 0; cursor: pointer; }
.switch__track {
  position: relative; flex: none;
  width: 36px; height: 20px;
  border-radius: var(--r-full);
  background: var(--c-border-strong);
  transition: background var(--dur) var(--ease);
}
.switch__track::after {
  content: ""; position: absolute; top: 2px; left: 2px;
  width: 16px; height: 16px; border-radius: 50%;
  background: #fff; box-shadow: 0 1px 2px rgba(16, 24, 40, .2);
  transition: transform var(--dur) var(--ease);
}
.switch input:checked + .switch__track { background: var(--c-primary); }
.switch input:checked + .switch__track::after { transform: translateX(16px); }
.switch input:focus-visible + .switch__track { outline: 2px solid var(--c-focus); outline-offset: 2px; }
.switch input:disabled + .switch__track { opacity: .5; }

/* Zona para soltar archivos: <label class="file-drop" data-file-drop><input type="file" class="sr-only">… */
.file-drop {
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px;
  padding: var(--sp-6) var(--sp-4);
  border: 1.5px dashed var(--c-border-strong);
  border-radius: var(--r-lg);
  background: var(--c-surface-2);
  color: var(--c-text-2);
  text-align: center;
  cursor: pointer;
  transition: border-color var(--dur-fast), background var(--dur-fast);
}
.file-drop:hover, .file-drop.is-dragover { border-color: var(--c-focus); background: var(--c-primary-soft); }
.file-drop:focus-within { outline: 2px solid var(--c-focus); outline-offset: 2px; }
.file-drop__icon { width: 40px; height: 40px; display: grid; place-items: center; border-radius: var(--r-md); background: var(--c-surface); border: 1px solid var(--c-border); color: var(--c-text-2); box-shadow: var(--sh-xs); margin-bottom: 4px; }
.file-drop__title { color: var(--c-text); font-weight: var(--fw-medium); }
.file-drop__title b { color: var(--c-link); font-weight: var(--fw-semi); }
.file-drop__hint { font-size: var(--fs-xs); color: var(--c-text-3); }
.file-drop__picked { margin-top: 6px; font-size: var(--fs-sm); color: var(--c-text); font-weight: var(--fw-medium); }

/* Campo de solo lectura con botón copiar (claves, hashes) */
.copy-field { display: flex; align-items: center; gap: 4px; min-width: 0; padding: 3px 3px 3px 12px; border: 1px solid var(--c-border); border-radius: var(--r-md); background: var(--c-surface-2); }
.copy-field__value { flex: 1; min-width: 0; font-family: var(--font-mono); font-size: var(--fs-sm); color: var(--c-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; letter-spacing: .02em; }

/* Botón dentro de .input-group (mostrar/ocultar contraseña, copiar) */
.input-group > .input-group__btn { margin: 2px; border-left: 0; border-radius: var(--r-sm); height: auto; }

/* Radios con aspecto de tarjeta (tipo de cliente, rol, prioridad, qué renovar…)
   <div class="choice-grid"> <label class="choice"><input type="radio" name="x">
     [<span class="choice__icon">svg</span>]
     <span class="choice__body"><span class="choice__title">…</span><span class="choice__hint">…</span></span>
     [<span class="choice__aside">S/ 49.00<s>S/ 59.00</s></span>] </label> </div>
   .choice-grid (2 columnas; --1 una) · .choice-list (fieldset en una columna)
   .choice--tile: sin radio visible (la tarjeta entera es la opción) y con icono */
.choice-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sp-2) var(--sp-3); }
.choice-grid--1 { grid-template-columns: minmax(0, 1fr); }
@media (max-width: 639.98px) { .choice-grid { grid-template-columns: minmax(0, 1fr); } }
.choice-list { display: grid; gap: var(--sp-2); border: 0; margin: 0; padding: 0; min-width: 0; }
.choice-list > legend { padding: 0; margin-bottom: var(--sp-2); font-size: var(--fs-sm); font-weight: var(--fw-medium); }
.choice {
  position: relative;
  display: flex; align-items: flex-start; gap: var(--sp-3);
  min-width: 0;
  padding: 12px 14px;
  border: 1px solid var(--c-border-strong);
  border-radius: var(--r-md);
  background: var(--c-surface);
  cursor: pointer;
  transition: border-color var(--dur-fast), background var(--dur-fast), box-shadow var(--dur-fast);
}
.choice:hover { border-color: var(--c-text-disabled); }
.choice input { flex: none; width: 16px; height: 16px; margin: 2px 0 0; accent-color: var(--c-primary); cursor: pointer; }
.choice input:focus-visible { outline: none; }
.choice:has(input:checked) { border-color: var(--c-primary); background: var(--c-primary-soft); box-shadow: inset 0 0 0 1px var(--c-primary); }
.choice:has(input:focus-visible) { outline: 2px solid var(--c-focus); outline-offset: 2px; }
.choice:has(input:disabled) { opacity: .6; cursor: not-allowed; }
.choice:has(input:disabled) input { cursor: not-allowed; }
.choice__icon { flex: none; width: 32px; height: 32px; display: grid; place-items: center; border-radius: var(--r-md); background: var(--c-bg-subtle); color: var(--c-text-2); }
.choice:has(input:checked) .choice__icon { background: var(--c-surface); color: var(--c-primary-text); }
.choice__body { flex: 1 1 auto; display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.choice__title { font-size: var(--fs-sm); font-weight: var(--fw-medium); color: var(--c-text); }
.choice__hint { font-size: var(--fs-xs); color: var(--c-text-3); }
.choice__aside { flex: none; text-align: right; font-weight: var(--fw-semi); color: var(--c-text); font-variant-numeric: tabular-nums; white-space: nowrap; }
.choice__aside s { display: block; font-weight: var(--fw-regular); font-size: var(--fs-xs); color: var(--c-text-3); }
.choice--tile input { position: absolute; opacity: 0; width: 1px; height: 1px; margin: 0; pointer-events: none; }
.choice--tile .choice__title { font-size: var(--fs-base); font-weight: var(--fw-semi); }

/* Código de 6 dígitos (un input por dígito; pegar/autocompletar reparte el código)
   <div class="otp"><input class="input otp__input" inputmode="numeric" maxlength="1">…<span class="otp__sep"></span>… */
.otp { display: flex; align-items: center; gap: var(--sp-2); }
.otp .otp__input {
  width: 46px; height: 52px;
  padding: 0;
  text-align: center;
  font-size: var(--fs-xl);
  font-weight: var(--fw-semi);
  font-variant-numeric: tabular-nums;
  caret-color: var(--c-primary);
}
.otp__sep { flex: none; width: 10px; height: 2px; border-radius: 1px; background: var(--c-border-strong); }
.otp[data-invalid] .otp__input { border-color: var(--c-danger); }
@media (max-width: 419.98px) {
  .otp { gap: 6px; }
  .otp .otp__input { width: auto; flex: 1 1 0; min-width: 0; height: 48px; }
  .otp__sep { display: none; }
}

/* Fuerza de contraseña: <div class="pw-meter" data-score="0-4"><div class="pw-meter__bar"><span></span>×4</div><p class="pw-meter__label">…
   + reglas: <ul class="pw-rules"><li class="is-ok">svg Al menos 10 caracteres</li>… */
.pw-meter { display: flex; flex-direction: column; gap: 6px; }
.pw-meter__bar { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 4px; }
.pw-meter__bar > span { height: 4px; border-radius: 2px; background: var(--c-border); transition: background var(--dur) var(--ease); }
.pw-meter[data-score="1"] .pw-meter__bar > span:nth-child(-n+1) { background: var(--c-danger); }
.pw-meter[data-score="2"] .pw-meter__bar > span:nth-child(-n+2) { background: var(--c-warning); }
.pw-meter[data-score="3"] .pw-meter__bar > span:nth-child(-n+3) { background: var(--c-success); }
.pw-meter[data-score="4"] .pw-meter__bar > span { background: var(--c-success); }
.pw-meter__label { font-size: var(--fs-xs); color: var(--c-text-3); }
.pw-meter__label strong { font-weight: var(--fw-semi); color: var(--c-text-2); }
.pw-meter[data-score="1"] .pw-meter__label strong { color: var(--c-danger-text); }
.pw-meter[data-score="2"] .pw-meter__label strong { color: var(--c-warning-text); }
.pw-meter[data-score="3"] .pw-meter__label strong,
.pw-meter[data-score="4"] .pw-meter__label strong { color: var(--c-success-text); }
.pw-rules {
  list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 4px var(--sp-3);
  font-size: var(--fs-xs); color: var(--c-text-3);
}
.pw-rules li { display: flex; align-items: flex-start; gap: 6px; min-width: 0; }
.pw-rules li .i { margin-top: 1px; }
.pw-rules li.is-ok { color: var(--c-success-text); }
@media (max-width: 479.98px) { .pw-rules { grid-template-columns: minmax(0, 1fr); } }

/* ==========================================================================
   7. TARJETAS, LISTAS, CLAVE/VALOR
   ========================================================================== */
.card {
  position: relative;
  min-width: 0;
  background: var(--c-surface);
  border: 1px solid var(--c-border);
  border-radius: var(--r-lg);
  box-shadow: var(--sh-xs);
}
.card__head {
  display: flex; align-items: flex-start; justify-content: space-between; gap: var(--sp-3);
  padding: var(--sp-4) var(--sp-5) 0;
}
.card__head-main { min-width: 0; }
.card__title { display: flex; align-items: center; gap: var(--sp-2); font-size: var(--fs-md); font-weight: var(--fw-semi); color: var(--c-text); line-height: 1.35; }
.card__title .i { color: var(--c-text-3); }
.card__desc { margin-top: 2px; font-size: var(--fs-sm); color: var(--c-text-3); }
.card__actions { display: flex; align-items: center; gap: 4px; flex: none; }
.card__body { padding: var(--sp-4) var(--sp-5) var(--sp-5); }
.card__foot {
  display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); flex-wrap: wrap;
  padding: var(--sp-3) var(--sp-5);
  border-top: 1px solid var(--c-divider);
  font-size: var(--fs-sm);
  color: var(--c-text-3);
}
.card--flush > .card__head { padding-bottom: var(--sp-4); border-bottom: 1px solid var(--c-divider); }
.card--flush > .card__body { padding: 0; }
.card--muted { background: var(--c-surface-2); box-shadow: none; }
.card--interactive { transition: border-color var(--dur-fast), box-shadow var(--dur-fast); }
.card--interactive:hover { border-color: var(--c-border-strong); box-shadow: var(--sh-md); }
.card--highlight { border-color: var(--c-primary-line); box-shadow: 0 0 0 3px var(--c-primary-soft); }
.card-link { position: absolute; inset: 0; border-radius: inherit; z-index: 1; }
.card-link:focus-visible { outline-offset: -2px; }
@media (max-width: 639.98px) {
  .card__head { padding: var(--sp-4) var(--sp-4) 0; }
  .card__body { padding: var(--sp-4); }
  .card__foot { padding: var(--sp-3) var(--sp-4); }
  .card--flush > .card__body { padding: 0; }
}

/* Lista clave/valor: <dl class="dl"><div><dt>RUC</dt><dd>…</dd></div></dl> */
.dl { display: grid; gap: 0; }
.dl > div { display: grid; grid-template-columns: minmax(110px, 38%) minmax(0, 1fr); gap: var(--sp-3); padding: 9px 0; border-top: 1px solid var(--c-divider); }
.dl > div:first-child { border-top: 0; padding-top: 0; }
.dl dt { color: var(--c-text-3); font-size: var(--fs-sm); }
.dl dd { color: var(--c-text); font-size: var(--fs-sm); min-width: 0; overflow-wrap: anywhere; }
.dl--stacked > div { grid-template-columns: minmax(0, 1fr); gap: 2px; }

/* Metadatos en línea separados por puntos: <p class="meta"><span>…</span><span>…</span></p>
   Cuando la línea se parte, el "·" no queda colgando al inicio del renglón: cada dato lleva
   su separador delante (--meta-sep de ancho) y la lista se corre a la izquierda ese mismo
   ancho; el recorte (clip-path) oculta el separador del primer dato de cada renglón y deja
   4 px libres para el anillo de foco. .sla trae su propio punto de color: no lleva separador. */
.meta {
  --meta-sep: 16px;
  display: flex; flex-wrap: wrap; align-items: center; gap: 2px 0;
  margin-left: calc(-1 * var(--meta-sep));
  clip-path: inset(-4px -4px -4px calc(var(--meta-sep) - 4px));
  color: var(--c-text-3); font-size: var(--fs-sm); min-width: 0;
}
.meta > * { display: inline-flex; align-items: center; gap: 4px; min-width: 0; }
.meta > :not(.sla)::before { content: "·"; display: inline-block; flex: none; width: var(--meta-sep); margin-right: -4px; text-align: center; color: var(--c-text-disabled); }
.meta--xs { font-size: var(--fs-xs); }

/* Lista de filas dentro de una tarjeta */
.list { display: flex; flex-direction: column; }
.list-item {
  position: relative;
  display: flex; align-items: center; gap: var(--sp-3);
  padding: 12px var(--sp-5);
  border-top: 1px solid var(--c-divider);
  min-width: 0;
}
.list-item:first-child { border-top: 0; }
.list--hover .list-item:hover { background: var(--c-surface-2); }
.list-item__icon {
  flex: none; display: grid; place-items: center;
  width: 36px; height: 36px; border-radius: var(--r-md);
  background: var(--c-bg-subtle); color: var(--c-text-2);
  border: 1px solid var(--c-border);
}
.list-item__icon--indigo { background: var(--c-indigo-soft); color: var(--c-indigo-text); border-color: transparent; }
.list-item__icon--primary { background: var(--c-primary-soft); color: var(--c-primary-text); border-color: transparent; }
.list-item__icon--success { background: var(--c-success-bg); color: var(--c-success-text); border-color: transparent; }
.list-item__icon--warning { background: var(--c-warning-bg); color: var(--c-warning-text); border-color: transparent; }
.list-item__icon--danger { background: var(--c-danger-bg); color: var(--c-danger-text); border-color: transparent; }
.list-item__main { flex: 1 1 0%; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.list-item__title { font-weight: var(--fw-medium); color: var(--c-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.list-item__title a { color: inherit; }
.list-item__title a:hover { color: var(--c-link); }
.list-item__title--wrap { white-space: normal; }
.list-item__meta { font-size: var(--fs-sm); color: var(--c-text-3); min-width: 0; }
.list-item__aside { flex: none; display: flex; align-items: center; gap: var(--sp-2); position: relative; z-index: 2; }
@media (max-width: 639.98px) {
  .list-item { padding: 12px var(--sp-4); flex-wrap: wrap; }
  .list-item__aside { width: 100%; padding-left: calc(36px + var(--sp-3)); justify-content: flex-start; flex-wrap: wrap; }
  .list-item--compact .list-item__aside { width: auto; padding-left: 0; }
}

/* Nota con icono: <p class="note"><svg class="i i--sm">…</svg><span>Texto</span></p>
   .note (en línea, gris) · .note--box (recuadro neutro: aclaraciones como cliente ≠ usuario)
   .note--foot (pie de una tabla o tarjeta, con línea arriba) */
.note { display: flex; align-items: flex-start; gap: var(--sp-2); font-size: var(--fs-sm); color: var(--c-text-3); min-width: 0; }
.note > .i { flex: none; margin-top: 2px; }
.note strong { color: var(--c-text); }
.note--box { gap: 10px; padding: 12px 14px; border: 1px solid var(--c-divider); border-radius: var(--r-md); background: var(--c-surface-2); color: var(--c-text-2); }
.note--box > .i { color: var(--c-text-3); }
.note--foot { padding: 10px var(--sp-4); border-top: 1px solid var(--c-divider); font-size: var(--fs-xs); }
.note--foot > .i { margin-top: 1px; }

/* Bloque plegable nativo:
   - Dentro de una tarjeta: <details class="disclosure"><summary>svg.disclosure__chev (chevron-right) Título</summary><div class="disclosure__body">…
   - Como tarjeta propia: <details class="card disclosure"><summary>svg Título svg.disclosure__chev (chevron-down)</summary>… */
.disclosure { border-top: 1px solid var(--c-divider); }
.disclosure > summary {
  display: flex; align-items: center; gap: var(--sp-2);
  padding: 11px var(--sp-5);
  list-style: none;
  cursor: pointer;
  font-size: var(--fs-sm); font-weight: var(--fw-medium);
  color: var(--c-text-2);
  user-select: none;
}
.disclosure > summary::-webkit-details-marker { display: none; }
.disclosure > summary:hover { color: var(--c-text); background: var(--c-surface-2); }
.disclosure > summary:focus-visible { outline-offset: -2px; border-radius: 0; }
.disclosure__chev { transition: transform var(--dur) var(--ease); color: var(--c-text-3); }
.disclosure[open] > summary .disclosure__chev { transform: rotate(90deg); }
.disclosure__body { padding: 0 var(--sp-5) var(--sp-4); }
.card.disclosure { border-top: 1px solid var(--c-border); }
.card.disclosure > summary { padding: var(--sp-4) var(--sp-5); font-size: var(--fs-base); color: var(--c-text); border-radius: var(--r-lg); }
.card.disclosure > summary:focus-visible { border-radius: var(--r-lg); }
.card.disclosure > summary .i { color: var(--c-text-3); }
.card.disclosure .disclosure__chev { margin-left: auto; }
.card.disclosure[open] > summary { border-radius: var(--r-lg) var(--r-lg) 0 0; }
.card.disclosure[open] > summary .disclosure__chev { transform: rotate(180deg); }
.card.disclosure > .disclosure__body { padding: 0; border-top: 1px solid var(--c-divider); }
@media (max-width: 639.98px) {
  .disclosure > summary { padding-left: var(--sp-4); padding-right: var(--sp-4); }
  .disclosure__body { padding: 0 var(--sp-4) var(--sp-4); }
  .card.disclosure > summary { padding: var(--sp-4); }
}

/* "Próximo paso" de un proyecto o pedido: qué toca hacer y quién
   <div class="next-step next-step--indigo"><span class="next-step__icon">svg</span><div class="next-step__body">
     <span class="next-step__label">Próximo paso</span><span class="next-step__title">…</span><span class="next-step__text">…</span></div>
     <a class="btn btn--sm next-step__action">…</a></div>
   --indigo (espera al cliente) · --warning (pago) · --info · --success (estado sin acción: neutro, color solo en el icono) */
.next-step {
  position: relative;
  z-index: 2; /* por encima del enlace estirado de una tarjeta */
  display: flex; align-items: flex-start; flex-wrap: wrap;
  gap: var(--sp-2) var(--sp-3);
  padding: 10px 12px;
  border-radius: var(--r-md);
  border: 1px solid var(--c-border);
  background: var(--c-surface-2);
}
.next-step__icon { flex: none; width: 28px; height: 28px; display: grid; place-items: center; border-radius: var(--r-sm); background: var(--c-bg-subtle); color: var(--c-text-2); }
.next-step__body { flex: 1 1 170px; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.next-step__label { font-size: var(--fs-2xs); font-weight: var(--fw-semi); letter-spacing: var(--tracking-caps); text-transform: uppercase; color: var(--c-text-2); }
.next-step__title { font-size: var(--fs-sm); font-weight: var(--fw-medium); color: var(--c-text); line-height: 1.35; }
.next-step__text { font-size: var(--fs-xs); color: var(--c-text-2); }
.next-step__action { flex: none; align-self: center; margin-left: auto; }
.next-step--indigo { background: var(--c-indigo-soft); border-color: var(--c-indigo-line); }
.next-step--indigo .next-step__icon { background: var(--c-surface); color: var(--c-indigo-text); }
.next-step--warning { background: var(--c-warning-bg); border-color: var(--c-warning-line); }
.next-step--warning .next-step__icon { background: var(--c-surface); color: var(--c-warning-text); }
.next-step--success { background: var(--c-bg-subtle); border-color: var(--c-border); }
.next-step--success .next-step__icon { background: var(--c-surface); color: var(--c-success-text); }
.next-step--info { background: var(--c-info-bg); border-color: var(--c-info-line); }
.next-step--info .next-step__icon { background: var(--c-surface); color: var(--c-info-text); }

/* Filas de ajustes (Stripe/Vercel): intro a la izquierda, tarjeta a la derecha
   <div class="settings"><section class="settings-row"><div class="settings-row__intro"><h2 class="settings-row__title">…
   <p class="settings-row__desc">…</div><div class="settings-row__main">tarjetas…</div></section>…
   --wide: la intro va arriba y el contenido usa todo el ancho (tablas con varias columnas) */
.settings { display: flex; flex-direction: column; padding-top: var(--sp-6); }
.settings-row { display: grid; grid-template-columns: minmax(0, 16.5rem) minmax(0, 1fr); gap: var(--sp-4) var(--sp-8); align-items: start; }
.settings-row + .settings-row { margin-top: var(--sp-7); padding-top: var(--sp-7); border-top: 1px solid var(--c-divider); }
.settings-row__intro { min-width: 0; }
.settings-row__title { font-size: var(--fs-md); font-weight: var(--fw-semi); line-height: 1.35; }
.settings-row__desc { margin-top: 4px; font-size: var(--fs-sm); color: var(--c-text-3); }
.settings-row__desc + .settings-row__desc { margin-top: var(--sp-2); }
.settings-row__main { min-width: 0; display: flex; flex-direction: column; gap: var(--sp-4); }
.settings-row--wide { grid-template-columns: minmax(0, 1fr); gap: var(--sp-4); }
.settings-row--wide > .settings-row__intro { max-width: 72ch; }
@media (max-width: 1199.98px) { .settings-row { grid-template-columns: minmax(0, 1fr); gap: var(--sp-3); } }

/* Icono de estado en bloque (2FA activo, exportación lista, eliminación) */
.state-tile { flex: none; width: 44px; height: 44px; display: grid; place-items: center; border-radius: var(--r-lg); background: var(--c-bg-subtle); border: 1px solid var(--c-border); color: var(--c-text-2); }
.state-tile .i { width: 20px; height: 20px; }
.state-tile--success { background: var(--c-success-bg); border-color: var(--c-success-line); color: var(--c-success-text); }
.state-tile--warning { background: var(--c-warning-bg); border-color: var(--c-warning-line); color: var(--c-warning-text); }
.state-tile--danger { background: var(--c-danger-bg); border-color: var(--c-danger-line); color: var(--c-danger-text); }
.state-tile--primary { background: var(--c-primary-soft); border-color: var(--c-primary-line); color: var(--c-primary-text); }

/* ==========================================================================
   8. KPI / ESTADÍSTICAS
   ========================================================================== */
.stat {
  position: relative;
  display: flex; flex-direction: column; gap: 6px;
  min-width: 0;
  padding: var(--sp-4) var(--sp-5);
  background: var(--c-surface);
  border: 1px solid var(--c-border);
  border-radius: var(--r-lg);
  box-shadow: var(--sh-xs);
}
a.stat { color: inherit; text-decoration: none; transition: border-color var(--dur-fast), box-shadow var(--dur-fast); }
a.stat:hover { border-color: var(--c-border-strong); box-shadow: var(--sh-md); }
.stat__label { display: flex; align-items: center; gap: 6px; font-size: var(--fs-sm); color: var(--c-text-2); font-weight: var(--fw-medium); }
.stat__label .i { color: var(--c-text-3); }
.stat__value { font-size: var(--fs-kpi); font-weight: var(--fw-semi); letter-spacing: var(--tracking-title); line-height: 1.15; color: var(--c-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.stat__value small { font-size: var(--fs-base); font-weight: var(--fw-medium); color: var(--c-text-3); letter-spacing: 0; margin-left: 2px; }
.stat__foot { display: flex; align-items: center; gap: 6px var(--sp-2); flex-wrap: wrap; min-height: 20px; }
.stat__delta { display: inline-flex; align-items: center; gap: 2px; font-size: var(--fs-xs); font-weight: var(--fw-semi); padding: 1px 6px; border-radius: var(--r-full); white-space: nowrap; }
.stat__delta .i { width: 12px; height: 12px; }
.stat__delta--up { color: var(--c-success-text); background: var(--c-success-bg); }
.stat__delta--down { color: var(--c-danger-text); background: var(--c-danger-bg); }
.stat__delta--flat { color: var(--c-neutral-text); background: var(--c-neutral-bg); }
.stat__meta { font-size: var(--fs-xs); color: var(--c-text-3); }
.stat__spark { margin-top: 2px; height: 32px; }
.stat--alert { border-color: var(--c-warning-line); }
/* Franja de cifras en una sola tarjeta. Cada celda dibuja su borde superior e izquierdo y se
   corre 1 px: los bordes del canto quedan ocultos por el overflow, así al pasar a 2 filas no
   sobra una línea suelta a la izquierda ni falta la línea entre filas. */
.stat-strip { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); background: var(--c-surface); border: 1px solid var(--c-border); border-radius: var(--r-lg); box-shadow: var(--sh-xs); overflow: hidden; }
.stat-strip .stat { border: 0; border-radius: 0; box-shadow: none; border-left: 1px solid var(--c-divider); border-top: 1px solid var(--c-divider); margin: -1px 0 0 -1px; }
/* 4 celdas: una fila si el contenedor tiene ≥ 800 px, si no 2 × 2 (nunca 3 + 1 ni cifras cortadas) */
.stat-strip:has(> :nth-child(4):last-child) { grid-template-columns: repeat(auto-fit, minmax(clamp(24.9%, (800px - 100%) * 999, 49.9%), 1fr)); }
/* Montos largos (S/ 75,654.50) en teléfonos angostos: la cifra se achica en vez de cortarse */
@media (max-width: 439.98px) {
  .grid--kpi .stat, .stat-strip .stat { padding: var(--sp-3) var(--sp-4); }
  .grid--kpi .stat__value, .stat-strip .stat__value { font-size: 1.125rem; }
  .grid--kpi .stat__value small, .stat-strip .stat__value small { font-size: var(--fs-sm); }
}
/* --3: tres cifras que no se parten en móvil (se compactan) */
.stat-strip--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
@media (max-width: 639.98px) {
  .stat-strip--3 .stat { padding: var(--sp-3); gap: 4px; }
  .stat-strip--3 .stat__label { font-size: var(--fs-xs); align-items: flex-start; line-height: 1.3; }
  .stat-strip--3 .stat__label .i { display: none; }
  .stat-strip--3 .stat__foot { display: none; }
}

/* ==========================================================================
   9. TABLAS
   ========================================================================== */
.table-card { position: relative; background: var(--c-surface); border: 1px solid var(--c-border); border-radius: var(--r-lg); box-shadow: var(--sh-xs); min-width: 0; overflow: hidden; }
.table-toolbar {
  display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap;
  padding: var(--sp-3) var(--sp-4);
  border-bottom: 1px solid var(--c-divider);
}
.table-toolbar .search-input { flex: 1 1 220px; max-width: 340px; }
.table-toolbar__end { margin-left: auto; display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; }
.table-wrap { position: relative; width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; scrollbar-width: thin; }
.table-wrap:focus-visible { outline-offset: -2px; }
/* Cifras tabulares solo donde alinean (.is-num y .num): en Inter, tabular-nums también ensancha
   guiones y puntos ("BB - 10491", "PRY - 0157", nombres de archivo). */
.table { width: 100%; font-size: var(--fs-base); color: var(--c-text); }
.table .is-num, .table .num { font-variant-numeric: tabular-nums; }
.table caption { text-align: left; padding: 0; }
.table th, .table td { padding: 11px var(--sp-3); text-align: left; vertical-align: middle; border-bottom: 1px solid var(--c-divider); }
.table th:first-child, .table td:first-child { padding-left: var(--sp-4); }
.table th:last-child, .table td:last-child { padding-right: var(--sp-4); }
.table thead th {
  padding-top: 9px; padding-bottom: 9px;
  background: var(--c-bg-subtle);
  color: var(--c-text-3);
  font-size: var(--fs-xs);
  font-weight: var(--fw-medium);
  letter-spacing: .01em;
  white-space: nowrap;
}
.table tbody tr:last-child td { border-bottom: 0; }
.table tbody tr { transition: background var(--dur-fast); }
.table--hover tbody tr:hover { background: var(--c-surface-2); }
.table tbody tr.is-selected { background: var(--c-primary-soft); }
.table .is-num, .table th.is-num { text-align: right; white-space: nowrap; }
.table .is-center { text-align: center; }
.table .col-check { width: 44px; padding-right: 0; }
.table .col-actions { width: 1%; white-space: nowrap; text-align: right; }
.table--compact th, .table--compact td { padding: 8px var(--sp-3); font-size: var(--fs-sm); }
.table td.is-muted { color: var(--c-text-3); }
.th-sort {
  display: inline-flex; align-items: center; gap: 4px;
  margin: -2px -4px; padding: 2px 4px;
  border-radius: var(--r-xs);
  color: inherit; font: inherit; letter-spacing: inherit;
}
.th-sort:hover { color: var(--c-text); }
.th-sort .i { width: 12px; height: 12px; opacity: .45; }
th[aria-sort="ascending"] .th-sort, th[aria-sort="descending"] .th-sort { color: var(--c-text); }
th[aria-sort="ascending"] .th-sort .i, th[aria-sort="descending"] .th-sort .i { opacity: 1; }
th[aria-sort="descending"] .th-sort .i { transform: rotate(180deg); }
.cell-main { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.cell-main__title { font-weight: var(--fw-medium); color: var(--c-text); }
.cell-main__title a { color: inherit; }
.cell-main__title a:hover { color: var(--c-link); }
.cell-sub { font-size: var(--fs-xs); color: var(--c-text-3); }
.cell-actions { display: inline-flex; gap: 2px; justify-content: flex-end; }
.table-empty td { padding: var(--sp-8) var(--sp-4); text-align: center; color: var(--c-text-3); }
/* Celda apilada (badge + texto debajo) sin estirar el badge: <div class="cell-stack">badge<span class="cell-sub">…</span></div> */
.cell-stack { display: flex; flex-direction: column; align-items: flex-start; gap: 2px; min-width: 0; }
.cell-stack > .badge { max-width: 100%; }
.cell-stack .cell-sub { display: block; }
td.is-num .cell-stack { align-items: flex-end; }
td.is-num .cell-sub { text-align: right; }
.table-toolbar .select { width: auto; max-width: 100%; }
.table-toolbar__summary { font-size: var(--fs-sm); color: var(--c-text-3); white-space: nowrap; }
.table tbody tr.is-highlight { background: var(--c-primary-soft); box-shadow: inset 3px 0 0 var(--c-primary); }

/* Barra de filtros sobre un listado (fuera de una tabla)
   <div class="filter-bar"><div class="search-input">…</div><div class="segmented">…<span class="seg-count">3</span>…</div><div class="filter-bar__end">select…</div></div>
   <p class="result-count">3 proyectos</p> */
.filter-bar { display: flex; align-items: center; flex-wrap: wrap; gap: var(--sp-2) var(--sp-3); margin-bottom: var(--sp-3); }
.filter-bar .search-input { flex: 1 1 180px; max-width: 260px; }
.filter-bar__end { margin-left: auto; display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; min-width: 0; }
.filter-bar .select { width: auto; max-width: 100%; }
.seg-count { min-width: 18px; height: 18px; padding: 0 5px; border-radius: var(--r-full); background: var(--c-bg-subtle); color: var(--c-text-2); font-size: var(--fs-2xs); font-weight: var(--fw-semi); line-height: 18px; text-align: center; font-variant-numeric: tabular-nums; }
.segmented__btn[aria-pressed="true"] .seg-count { background: var(--c-primary-soft); color: var(--c-primary-text); }
.result-count { margin-bottom: var(--sp-3); font-size: var(--fs-sm); color: var(--c-text-3); }
@media (max-width: 639.98px) {
  .filter-bar .search-input { max-width: none; flex-basis: 100%; }
  .filter-bar > .segmented { width: 100%; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .filter-bar > .segmented .segmented__btn { justify-content: center; }
  .filter-bar__end { margin-left: 0; width: 100%; }
  .filter-bar__end .select { flex: 1 1 0; min-width: 0; }
  .table-toolbar .search-input { max-width: none; flex-basis: 100%; }
}
/* Filtros de tabla en móvil: los select ocupan la fila en pares */
@media (max-width: 559.98px) { .table-toolbar > .select { flex: 1 1 140px; width: 100% !important; } }

.bulk-bar {
  display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap;
  padding: 8px var(--sp-4);
  background: var(--c-primary-soft);
  border-bottom: 1px solid var(--c-primary-line);
  color: var(--c-primary-text);
  font-size: var(--fs-sm); font-weight: var(--fw-medium);
}
.pagination {
  display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); flex-wrap: wrap;
  padding: 10px var(--sp-4);
  border-top: 1px solid var(--c-divider);
  font-size: var(--fs-sm); color: var(--c-text-3);
}
.pagination__pages { display: flex; align-items: center; gap: 4px; }
.pagination__page { min-width: 30px; height: 30px; padding: 0 6px; border-radius: var(--r-sm); color: var(--c-text-2); font-weight: var(--fw-medium); font-variant-numeric: tabular-nums; }
.pagination__page:hover { background: var(--c-bg-subtle); color: var(--c-text); }
.pagination__page[aria-current="page"] { background: var(--c-primary-soft); color: var(--c-primary-text); }

/* Tabla → tarjetas en móvil: <table class="table table--stack"> + <td data-label="Total"> */
@media (max-width: 719.98px) {
  .table--stack thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); }
  .table--stack, .table--stack tbody, .table--stack tr, .table--stack td { display: block; width: 100%; }
  .table--stack tr { padding: 12px var(--sp-4); border-bottom: 1px solid var(--c-divider); }
  .table--stack tbody tr:last-child { border-bottom: 0; }
  .table--stack td { display: flex; justify-content: space-between; align-items: center; gap: var(--sp-3); padding: 4px 0; border: 0; text-align: right; min-width: 0; }
  .table--stack td::before { content: attr(data-label); flex: none; color: var(--c-text-3); font-size: var(--fs-xs); font-weight: var(--fw-medium); text-align: left; }
  .table--stack td:not([data-label])::before, .table--stack td[data-label=""]::before { content: none; }
  .table--stack td.is-primary { display: block; text-align: left; padding-bottom: 6px; }
  .table--stack td.is-primary::before { content: none; }
  .table--stack td.col-actions { justify-content: flex-end; width: 100%; padding-top: 8px; }
  .table--stack td.col-check { display: none; }
  .table--stack td > * { min-width: 0; }
  .table--stack td:first-child, .table--stack td:last-child { padding-left: 0; padding-right: 0; }
  .table--stack .is-num { text-align: right; }
  .table--stack td .cell-stack { align-items: flex-end; text-align: right; }
  .table--stack td.is-primary .cell-stack { align-items: flex-start; text-align: left; }
}

/* ==========================================================================
   10. BADGES Y ESTADOS
   ========================================================================== */
.badge {
  display: inline-flex; align-items: center; gap: 5px;
  height: 22px; padding: 0 8px;
  border-radius: var(--r-full);
  border: 1px solid var(--c-neutral-line);
  background: var(--c-neutral-bg);
  color: var(--c-neutral-text);
  font-size: var(--fs-xs);
  font-weight: var(--fw-medium);
  line-height: 1;
  white-space: nowrap;
  vertical-align: middle;
}
.badge .i { width: 12px; height: 12px; }
.badge--success { background: var(--c-success-bg); color: var(--c-success-text); border-color: var(--c-success-line); }
.badge--warning { background: var(--c-warning-bg); color: var(--c-warning-text); border-color: var(--c-warning-line); }
.badge--danger  { background: var(--c-danger-bg);  color: var(--c-danger-text);  border-color: var(--c-danger-line); }
.badge--info    { background: var(--c-info-bg);    color: var(--c-info-text);    border-color: var(--c-info-line); }
.badge--primary { background: var(--c-primary-soft); color: var(--c-primary-text); border-color: var(--c-primary-line); }
.badge--indigo  { background: var(--c-indigo-soft); color: var(--c-indigo-text); border-color: var(--c-indigo-line); }
.badge--outline { background: transparent; }
.badge--sm { height: 18px; padding: 0 6px; font-size: var(--fs-2xs); }
.badge--square { border-radius: var(--r-xs); }
.badge__dot { width: 6px; height: 6px; border-radius: 50%; background: currentColor; flex: none; }
.badge--success .badge__dot { background: var(--c-success); }
.badge--warning .badge__dot { background: var(--c-warning); }
.badge--danger .badge__dot { background: var(--c-danger); }
.badge--info .badge__dot { background: var(--c-info); }
.badge--neutral .badge__dot { background: var(--c-neutral); }

.count {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 20px; height: 20px; padding: 0 6px;
  border-radius: var(--r-full);
  background: var(--c-bg-subtle);
  color: var(--c-text-2);
  font-size: var(--fs-2xs); font-weight: var(--fw-semi);
  font-variant-numeric: tabular-nums;
}
.status-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: var(--c-neutral); flex: none; box-shadow: 0 0 0 3px var(--c-neutral-bg); }
.status-dot--up, .status-dot--success { background: var(--c-success); box-shadow: 0 0 0 3px var(--c-success-bg); }
.status-dot--degraded, .status-dot--warning { background: var(--c-warning); box-shadow: 0 0 0 3px var(--c-warning-bg); }
.status-dot--down, .status-dot--danger { background: var(--c-danger); box-shadow: 0 0 0 3px var(--c-danger-bg); }
.status-dot--info { background: var(--c-info); box-shadow: 0 0 0 3px var(--c-info-bg); }

/* Semáforo de plazos (Libro de Reclamaciones, vencimientos) */
.sla { display: inline-flex; align-items: center; gap: 6px; font-size: var(--fs-sm); font-weight: var(--fw-medium); white-space: nowrap; }
.sla::before { content: ""; width: 8px; height: 8px; border-radius: 50%; flex: none; }
.sla--ok { color: var(--c-success-text); }   .sla--ok::before { background: var(--c-success); }
.sla--warn { color: var(--c-warning-text); } .sla--warn::before { background: var(--c-warning); }
.sla--late { color: var(--c-danger-text); }  .sla--late::before { background: var(--c-danger); }
.sla--done { color: var(--c-text-3); }       .sla--done::before { background: var(--c-neutral); }

/* ==========================================================================
   11. TABS, SEGMENTED, CHIPS
   ========================================================================== */
.tabs__list {
  display: flex; align-items: flex-end; gap: var(--sp-5);
  border-bottom: 1px solid var(--c-border);
  overflow-x: auto; overflow-y: hidden;
  scrollbar-width: none;
}
.tabs__list::-webkit-scrollbar { display: none; }
.tab {
  position: relative;
  display: inline-flex; align-items: center; gap: 6px;
  padding: 10px 2px 11px;
  color: var(--c-text-3);
  font-weight: var(--fw-medium);
  font-size: var(--fs-base);
  white-space: nowrap;
  text-decoration: none;
  border-radius: var(--r-xs) var(--r-xs) 0 0;
  transition: color var(--dur-fast);
}
.tab:hover { color: var(--c-text); text-decoration: none; }
.tab::after { content: ""; position: absolute; left: 0; right: 0; bottom: -1px; height: 2px; border-radius: 2px 2px 0 0; background: transparent; }
.tab[aria-selected="true"], .tab[aria-current="page"] { color: var(--c-text); }
.tab[aria-selected="true"]::after, .tab[aria-current="page"]::after { background: var(--c-primary); }
.tab:focus-visible { outline-offset: -2px; }
.tab__count { min-width: 18px; height: 18px; padding: 0 5px; border-radius: var(--r-full); background: var(--c-bg-subtle); color: var(--c-text-2); font-size: var(--fs-2xs); font-weight: var(--fw-semi); line-height: 18px; text-align: center; font-variant-numeric: tabular-nums; }
.tab[aria-selected="true"] .tab__count { background: var(--c-primary-soft); color: var(--c-primary-text); }
.tab-panel:focus-visible { outline-offset: 4px; }
.card > .tabs > .tabs__list { padding: 0 var(--sp-5); }
@media (max-width: 639.98px) { .card > .tabs > .tabs__list { padding: 0 var(--sp-4); gap: var(--sp-4); } }
/* Pestañas que son páginas (Productos · Categorías · Marcas · Envíos y compra, plano erp-01 T6.1):
   <nav class="tabs tabs--pages"><div class="tabs__list"><a class="tab" aria-current="page">…
   44 px de alto y, en el celular, en 2 columnas con 8 px entre filas: en una fila no caben y
   .tabs__list esconde su barra de desplazamiento. */
.tabs--pages { margin: calc(var(--sp-2) * -1) 0 var(--sp-6); }
.tabs--pages .tab { min-height: 44px; }
@media (max-width: 767.98px) {
  .tabs--pages .tabs__list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sp-2) var(--sp-4); overflow: visible; }
}

.segmented {
  display: inline-flex; align-items: center; gap: 2px;
  padding: 2px;
  border-radius: var(--r-md);
  background: var(--c-bg-subtle);
  border: 1px solid var(--c-border);
  max-width: 100%;
  overflow-x: auto;
  scrollbar-width: none;
}
.segmented__btn {
  display: inline-flex; align-items: center; gap: 6px;
  height: 28px; padding: 0 10px;
  border-radius: var(--r-sm);
  color: var(--c-text-2);
  font-size: var(--fs-sm); font-weight: var(--fw-medium);
  white-space: nowrap;
  transition: background var(--dur-fast), color var(--dur-fast);
}
.segmented__btn:hover { color: var(--c-text); }
.segmented__btn[aria-pressed="true"], .segmented__btn[aria-checked="true"] { background: var(--c-surface); color: var(--c-text); box-shadow: var(--sh-sm); }
:root[data-theme="dark"] .segmented__btn[aria-pressed="true"] { background: var(--c-surface-raised); }

.chips { display: flex; flex-wrap: wrap; gap: 6px; }
.chip {
  display: inline-flex; align-items: center; gap: 6px;
  height: 30px; padding: 0 12px;
  border: 1px solid var(--c-border-strong);
  border-radius: var(--r-full);
  background: var(--c-surface);
  color: var(--c-text-2);
  font-size: var(--fs-sm); font-weight: var(--fw-medium);
  white-space: nowrap;
}
.chip:hover { color: var(--c-text); background: var(--c-bg-subtle); }
.chip[aria-pressed="true"] { background: var(--c-primary-soft); border-color: var(--c-primary-line); color: var(--c-primary-text); }
/* Chip con radio nativo (elegir una opción corta): <label class="chip chip--radio"><input type="radio">Opción A</label> */
.chip--radio { position: relative; cursor: pointer; }
.chip--radio input { position: absolute; opacity: 0; width: 1px; height: 1px; margin: 0; pointer-events: none; }
.chip--radio:has(input:checked) { background: var(--c-primary-soft); border-color: var(--c-primary-line); color: var(--c-primary-text); }
.chip--radio:has(input:focus-visible) { outline: 2px solid var(--c-focus); outline-offset: 2px; }

/* Al entrar por #panel (#historial, #sesiones…) la fila de pestañas no queda tapada por la topbar */
[role="tabpanel"] { scroll-margin-top: 64px; }

/* Pestañas verticales de ajustes (admin › Ajustes): nav fija a la izquierda, paneles a la derecha;
   en tablet y móvil pasan a una fila horizontal desplazable.
   <div class="vtabs tabs" data-tabs data-tabs-hash><nav class="vtabs__nav"><div class="tabs__list" role="tablist" aria-orientation="vertical">
     <span class="vtabs__group" role="presentation">Organización</span><button class="tab" role="tab">…</button>…</div></nav>
     <div class="vtabs__panels"><section class="tab-panel" role="tabpanel">…</section>…</div></div> */
.vtabs { display: grid; grid-template-columns: 216px minmax(0, 1fr); gap: var(--sp-7); align-items: start; }
.vtabs__nav { position: sticky; top: calc(var(--topbar-h) + var(--sp-5)); }
.vtabs .tabs__list { flex-direction: column; align-items: stretch; gap: 2px; border-bottom: 0; overflow: visible; }
.vtabs .tab { justify-content: flex-start; padding: 7px 10px; border-radius: var(--r-md); color: var(--c-text-2); }
.vtabs .tab .i { color: var(--c-text-3); }
.vtabs .tab::after { display: none; }
.vtabs .tab:hover { background: var(--c-bg-subtle); color: var(--c-text); }
.vtabs .tab[aria-selected="true"] { background: var(--c-primary-soft); color: var(--c-primary-text); }
.vtabs .tab[aria-selected="true"] .i { color: var(--c-primary-text); }
.vtabs .tab:focus-visible { outline-offset: -2px; }
.vtabs__group { display: block; padding: var(--sp-4) 10px 6px; font-size: var(--fs-2xs); font-weight: var(--fw-semi); letter-spacing: var(--tracking-caps); text-transform: uppercase; color: var(--c-text-3); }
.vtabs__group:first-child { padding-top: 0; }
.vtabs__panels, .vtabs .tab-panel { min-width: 0; }
.vtabs .tab-panel:focus-visible { outline-offset: 6px; }
@media (max-width: 1023.98px) {
  .vtabs { grid-template-columns: minmax(0, 1fr); gap: var(--sp-5); }
  .vtabs__nav { position: static; min-width: 0; }
  .vtabs .tabs__list { flex-direction: row; gap: var(--sp-1); overflow-x: auto; border-bottom: 1px solid var(--c-border); padding-bottom: var(--sp-2); }
  .vtabs .tab { flex: none; }
  .vtabs__group { display: none; }
}

/* ==========================================================================
   12. MENÚS DESPLEGABLES
   <div class="dropdown" data-dropdown>
     <button data-dropdown-trigger aria-haspopup="menu" aria-expanded="false" aria-controls="m">…</button>
     <div class="menu" id="m" role="menu" hidden> <a class="menu__item" role="menuitem">… </div>
   </div>
   ========================================================================== */
.dropdown { position: relative; display: inline-flex; }
.menu {
  position: absolute;
  top: calc(100% + 6px);
  left: 0;
  z-index: var(--z-dropdown);
  min-width: 220px;
  max-width: min(320px, calc(100vw - 16px));
  max-height: min(70vh, 520px);
  overflow-y: auto;
  padding: 4px;
  background: var(--c-surface-raised);
  border: 1px solid var(--c-border);
  border-radius: var(--r-lg);
  box-shadow: var(--sh-lg);
  animation: bb-pop var(--dur) var(--ease);
}
.menu--end { left: auto; right: 0; }
.menu--up { top: auto; bottom: calc(100% + 6px); }
.menu--wide { min-width: 340px; max-width: min(380px, calc(100vw - 16px)); padding: 0; }
.menu__item {
  display: flex; align-items: center; gap: 10px;
  width: 100%;
  min-height: 34px;
  padding: 6px 10px;
  border-radius: var(--r-sm);
  color: var(--c-text);
  font-size: var(--fs-base);
  text-align: left;
  text-decoration: none;
  white-space: nowrap;
}
.menu__item .i { color: var(--c-text-3); }
.menu__item:hover, .menu__item:focus-visible { background: var(--c-bg-subtle); color: var(--c-text); text-decoration: none; outline: none; }
.menu__item:focus-visible { box-shadow: inset 0 0 0 2px var(--c-focus); }
.menu__item--danger, .menu__item--danger .i { color: var(--c-danger-text); }
.menu__item--danger:hover { background: var(--c-danger-bg); color: var(--c-danger-text); }
.menu__item[aria-checked="true"]::after { content: "✓"; margin-left: auto; color: var(--c-primary-text); font-weight: var(--fw-semi); }
.menu__item-hint { margin-left: auto; color: var(--c-text-3); font-size: var(--fs-xs); }
.menu__sep { height: 1px; margin: 4px -4px; background: var(--c-divider); }
.menu__label { padding: 8px 10px 4px; font-size: var(--fs-2xs); font-weight: var(--fw-semi); letter-spacing: var(--tracking-caps); text-transform: uppercase; color: var(--c-text-3); }
.menu__head { display: flex; align-items: center; gap: var(--sp-3); padding: 10px 10px 12px; margin: -4px -4px 4px; border-bottom: 1px solid var(--c-divider); }
.menu--wide .menu__head { margin: 0; padding: 12px 16px; justify-content: space-between; }
.menu__title { font-weight: var(--fw-semi); font-size: var(--fs-base); }

/* Notificaciones dentro de un menú ancho */
.notif-list { max-height: 360px; overflow-y: auto; }
.notif {
  position: relative;
  display: flex; gap: var(--sp-3);
  padding: 12px 16px;
  border-top: 1px solid var(--c-divider);
  color: var(--c-text);
  text-decoration: none;
}
.notif:first-child { border-top: 0; }
.notif:hover { background: var(--c-surface-2); text-decoration: none; color: var(--c-text); }
.notif:focus-visible { outline-offset: -2px; }
.notif__icon { flex: none; width: 32px; height: 32px; display: grid; place-items: center; border-radius: 50%; background: var(--c-bg-subtle); color: var(--c-text-2); }
.notif__icon .i { width: 16px; height: 16px; }
.notif { padding-right: 32px; }
.notif__body { min-width: 0; flex: 1; }
.notif__title, .notif__text, .notif__time { display: block; }
.notif__title { font-size: var(--fs-sm); font-weight: var(--fw-medium); line-height: 1.35; }
.notif__text { font-size: var(--fs-xs); color: var(--c-text-3); margin-top: 1px; }
.notif__time { font-size: var(--fs-2xs); color: var(--c-text-3); margin-top: 4px; }
.notif.is-unread .notif__title { font-weight: var(--fw-semi); }
.notif.is-unread::after { content: ""; position: absolute; right: 14px; top: 16px; width: 8px; height: 8px; border-radius: 50%; background: var(--c-primary); }
.notif-foot { display: flex; justify-content: center; padding: 8px; border-top: 1px solid var(--c-divider); }

/* ==========================================================================
   13. SUPERPOSICIONES: modal, drawer, paleta de comandos, tooltip
   Modales y cajones usan <dialog> nativo (foco atrapado, Esc, ::backdrop).
   <dialog class="modal" id="m" aria-labelledby="m-title">
     <div class="modal__panel"> header.modal__head · div.modal__body · footer.modal__foot </div>
   </dialog>
   ========================================================================== */
.modal, .drawer, .cmdk {
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--c-text);
  max-width: none;
  max-height: none;
  overflow: visible;
}
.modal::backdrop, .drawer::backdrop, .cmdk::backdrop { background: var(--c-overlay); animation: bb-fade var(--dur) var(--ease); }
.modal { width: min(520px, calc(100vw - 32px)); margin: auto; }
.modal--sm { width: min(420px, calc(100vw - 32px)); }
.modal--lg { width: min(720px, calc(100vw - 32px)); }
.modal--xl { width: min(960px, calc(100vw - 32px)); }
.modal[open] { animation: bb-modal-in var(--dur-slow) var(--ease); }
.modal__panel {
  display: flex; flex-direction: column;
  max-height: calc(100dvh - 48px);
  background: var(--c-surface-raised);
  border: 1px solid var(--c-border);
  border-radius: var(--r-xl);
  box-shadow: var(--sh-xl);
  overflow: hidden;
}
.modal__head { display: flex; align-items: flex-start; gap: var(--sp-3); padding: var(--sp-5) var(--sp-5) 0; }
.modal__head-main { flex: 1; min-width: 0; }
.modal__icon { flex: none; width: 40px; height: 40px; display: grid; place-items: center; border-radius: 50%; background: var(--c-primary-soft); color: var(--c-primary-text); }
.modal__icon--danger { background: var(--c-danger-bg); color: var(--c-danger-text); }
.modal__icon--warning { background: var(--c-warning-bg); color: var(--c-warning-text); }
.modal__icon--success { background: var(--c-success-bg); color: var(--c-success-text); }
.modal__title { font-size: var(--fs-lg); font-weight: var(--fw-semi); line-height: 1.3; }
.modal__desc { margin-top: 4px; color: var(--c-text-2); font-size: var(--fs-base); }
.modal__close { margin: -6px -8px 0 0; }
.modal__body { padding: var(--sp-5); overflow-y: auto; min-height: 0; }
.modal__foot {
  display: flex; align-items: center; justify-content: flex-end; gap: var(--sp-2); flex-wrap: wrap;
  padding: var(--sp-4) var(--sp-5);
  border-top: 1px solid var(--c-divider);
  background: var(--c-surface-2);
}
.modal__foot-start { margin-right: auto; font-size: var(--fs-sm); color: var(--c-text-3); }
@media (max-width: 639.98px) {
  .modal, .modal--sm, .modal--lg, .modal--xl { width: 100vw; margin: auto 0 0; }
  .modal__panel { border-radius: var(--r-xl) var(--r-xl) 0 0; max-height: 92dvh; }
  .modal[open] { animation: bb-sheet-in var(--dur-slow) var(--ease); }
  .modal__foot > .btn { flex: 1 1 auto; }
}

/* Drawer lateral derecho (detalle rápido) */
.drawer { margin: 0 0 0 auto; width: min(480px, 100vw); height: 100dvh; max-height: 100dvh; }
.drawer--wide { width: min(640px, 100vw); }
.drawer[open] { animation: bb-drawer-in var(--dur-slow) var(--ease); }
.drawer .modal__panel { height: 100%; max-height: none; border-radius: 0; border-width: 0 0 0 1px; }
.drawer .modal__body { flex: 1; }

/* Paleta de comandos (Ctrl K) */
.cmdk { width: min(620px, calc(100vw - 24px)); margin: 12vh auto auto; }
.cmdk[open] { animation: bb-modal-in var(--dur) var(--ease); }
.cmdk__panel { background: var(--c-surface-raised); border: 1px solid var(--c-border); border-radius: var(--r-xl); box-shadow: var(--sh-xl); overflow: hidden; }
.cmdk__search { display: flex; align-items: center; gap: var(--sp-3); padding: 0 var(--sp-4); border-bottom: 1px solid var(--c-divider); }
.cmdk__search > .i { color: var(--c-text-3); }
.cmdk__input { flex: 1; min-width: 0; height: 52px; border: 0; background: transparent; font-size: var(--fs-md); color: var(--c-text); }
.cmdk__input:focus { outline: none; }
.cmdk__input::placeholder { color: var(--c-text-3); }
.cmdk__list { max-height: min(56vh, 420px); overflow-y: auto; padding: 6px; }
.cmdk__group { padding: 8px 10px 4px; font-size: var(--fs-2xs); font-weight: var(--fw-semi); letter-spacing: var(--tracking-caps); text-transform: uppercase; color: var(--c-text-3); }
.cmdk__item { display: flex; align-items: center; gap: 10px; padding: 8px 10px; border-radius: var(--r-sm); color: var(--c-text); text-decoration: none; cursor: pointer; }
.cmdk__item .i { color: var(--c-text-3); }
.cmdk__item-sub { margin-left: auto; font-size: var(--fs-xs); color: var(--c-text-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 45%; }
.cmdk__item[aria-selected="true"] { background: var(--c-primary-soft); color: var(--c-primary-text); text-decoration: none; }
.cmdk__item[aria-selected="true"] .i { color: var(--c-primary-text); }
.cmdk__empty { padding: var(--sp-6); text-align: center; color: var(--c-text-3); }
.cmdk__foot { display: flex; gap: var(--sp-4); padding: 8px var(--sp-4); border-top: 1px solid var(--c-divider); font-size: var(--fs-xs); color: var(--c-text-3); background: var(--c-surface-2); }
.cmdk__foot span { display: inline-flex; align-items: center; gap: 4px; }
@media (max-width: 639.98px) { .cmdk { margin-top: 8px; } .cmdk__foot { display: none; } }

/* Tooltip simple (lo posiciona app.js con [data-tooltip]) */
.tooltip {
  position: fixed;
  z-index: var(--z-tooltip);
  max-width: 260px;
  padding: 5px 8px;
  border-radius: var(--r-sm);
  background: #101828;
  color: #fff;
  font-size: var(--fs-xs);
  font-weight: var(--fw-medium);
  line-height: 1.35;
  box-shadow: var(--sh-md);
  pointer-events: none;
  animation: bb-fade var(--dur-fast) var(--ease);
}
:root[data-theme="dark"] .tooltip { background: #2a3345; color: #eef1f6; border: 1px solid #38435a; }

/* ==========================================================================
   14. FEEDBACK: toasts, alertas, vacíos, esqueletos, progreso
   ========================================================================== */
.toast-region {
  position: fixed;
  right: 20px; bottom: 20px;
  z-index: var(--z-toast);
  display: flex; flex-direction: column; gap: var(--sp-2);
  width: min(380px, calc(100vw - 32px));
  pointer-events: none;
}
.toast {
  display: flex; align-items: flex-start; gap: var(--sp-3);
  padding: 12px 12px 12px 14px;
  background: var(--c-surface-raised);
  border: 1px solid var(--c-border);
  border-radius: var(--r-lg);
  box-shadow: var(--sh-lg);
  pointer-events: auto;
  animation: bb-toast-in var(--dur-slow) var(--ease);
}
.toast.is-leaving { animation: bb-toast-out var(--dur) var(--ease) forwards; }
.toast__icon { flex: none; margin-top: 1px; color: var(--c-info); }
.toast--success .toast__icon { color: var(--c-success); }
.toast--warning .toast__icon { color: var(--c-warning); }
.toast--danger .toast__icon { color: var(--c-danger); }
.toast__body { flex: 1; min-width: 0; }
.toast__title { font-weight: var(--fw-semi); font-size: var(--fs-base); }
.toast__text { color: var(--c-text-2); font-size: var(--fs-sm); margin-top: 1px; overflow-wrap: anywhere; }
.toast__title + .toast__text { margin-top: 2px; }
.toast__actions { display: flex; gap: var(--sp-3); margin-top: 6px; }
@media (max-width: 639.98px) { .toast-region { left: 16px; right: 16px; bottom: 16px; width: auto; } }

.alert {
  display: flex; align-items: flex-start; gap: var(--sp-3);
  padding: 12px var(--sp-4);
  border: 1px solid var(--c-info-line);
  border-radius: var(--r-lg);
  background: var(--c-info-bg);
  color: var(--c-text);
}
.alert__icon { flex: none; margin-top: 1px; color: var(--c-info-text); }
.alert__body { flex: 1; min-width: 0; font-size: var(--fs-base); }
.alert__title { font-weight: var(--fw-semi); color: var(--c-text); }
.alert__text { color: var(--c-text-2); margin-top: 1px; }
.alert__actions { display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; flex: none; margin-left: auto; }
.alert__close { margin: -6px -6px -6px 0; }
.alert--success { background: var(--c-success-bg); border-color: var(--c-success-line); }
.alert--success .alert__icon { color: var(--c-success-text); }
.alert--warning { background: var(--c-warning-bg); border-color: var(--c-warning-line); }
.alert--warning .alert__icon { color: var(--c-warning-text); }
.alert--danger { background: var(--c-danger-bg); border-color: var(--c-danger-line); }
.alert--danger .alert__icon { color: var(--c-danger-text); }
.alert--neutral { background: var(--c-surface); border-color: var(--c-border); }
.alert--neutral .alert__icon { color: var(--c-text-2); }
/* Lista de pendientes dentro de una alerta: <ul class="alert-list"><li><a>Cliente</a><span class="alert-list__what">qué falta</span></li>
   En móvil el detalle baja a su propia línea (sin "·" colgando al inicio) */
.alert-list { margin: 6px 0 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 4px; color: var(--c-text-2); font-size: var(--fs-sm); }
.alert-list li { display: flex; flex-wrap: wrap; align-items: center; gap: 2px 8px; }
.alert-list a { font-weight: var(--fw-medium); }
.alert-list__what::before { content: "· "; color: var(--c-text-3); }
@media (max-width: 639.98px) {
  .alert-list li { gap: 0 8px; }
  .alert-list__what { flex-basis: 100%; }
  .alert-list__what::before { content: none; }
}
@media (max-width: 719.98px) {
  .alert { flex-wrap: wrap; }
  .alert__actions { margin-left: calc(16px + var(--sp-3)); width: 100%; }
}

.empty {
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px;
  padding: var(--sp-8) var(--sp-5);
  text-align: center;
}
.empty__icon { width: 44px; height: 44px; display: grid; place-items: center; border-radius: var(--r-lg); background: var(--c-bg-subtle); border: 1px solid var(--c-border); color: var(--c-text-2); margin-bottom: 6px; }
.empty__icon .i { width: 20px; height: 20px; }
.empty__title { font-size: var(--fs-md); font-weight: var(--fw-semi); color: var(--c-text); }
.empty__text { color: var(--c-text-3); max-width: 44ch; font-size: var(--fs-sm); }
.empty__actions { display: flex; gap: var(--sp-2); flex-wrap: wrap; justify-content: center; margin-top: var(--sp-3); }
.empty--compact { padding: var(--sp-6) var(--sp-4); }
.empty--error .empty__icon { background: var(--c-danger-bg); border-color: var(--c-danger-line); color: var(--c-danger-text); }

.skeleton {
  display: block;
  border-radius: var(--r-sm);
  background: linear-gradient(90deg, var(--c-skeleton) 0%, var(--c-skeleton-2) 50%, var(--c-skeleton) 100%);
  background-size: 200% 100%;
  animation: bb-shimmer 1.4s ease-in-out infinite;
}
.skeleton--text { height: 12px; width: 100%; }
.skeleton--title { height: 16px; width: 55%; }
.skeleton--circle { border-radius: 50%; }
.skeleton--block { height: 120px; width: 100%; border-radius: var(--r-md); }
.skeleton-row { display: flex; align-items: center; gap: var(--sp-3); padding: 14px var(--sp-5); border-top: 1px solid var(--c-divider); }
.skeleton-row:first-child { border-top: 0; }
.skeleton-row__main { flex: 1; display: flex; flex-direction: column; gap: 8px; }

.progress { position: relative; height: 6px; border-radius: var(--r-full); background: var(--c-bg-subtle); overflow: hidden; box-shadow: inset 0 0 0 1px var(--c-divider); }
.progress__bar { height: 100%; width: var(--value, 0%); border-radius: inherit; background: var(--c-primary); transition: width var(--dur-slow) var(--ease); }
.progress--success .progress__bar { background: var(--c-success); }
.progress--warning .progress__bar { background: var(--c-warning); }
.progress--danger .progress__bar { background: var(--c-danger); }
.progress--indigo .progress__bar { background: var(--c-indigo); }
.progress--sm { height: 4px; }

.spinner { display: inline-block; width: 16px; height: 16px; border-radius: 50%; border: 2px solid var(--c-border-strong); border-top-color: var(--c-primary); animation: bb-spin .7s linear infinite; }

/* ==========================================================================
   15. ACTIVIDAD: timeline, stepper de proyecto
   ========================================================================== */
.timeline { position: relative; display: flex; flex-direction: column; list-style: none; margin: 0; padding: 0; }
.timeline__item { position: relative; display: grid; grid-template-columns: 28px minmax(0, 1fr); gap: var(--sp-3); padding-bottom: var(--sp-4); }
.timeline__item:last-child { padding-bottom: 0; }
.timeline__item:not(:last-child)::before { content: ""; position: absolute; left: 13.5px; top: 30px; bottom: 2px; width: 1px; background: var(--c-border); }
.timeline__dot {
  position: relative; z-index: 1;
  width: 28px; height: 28px; display: grid; place-items: center;
  border-radius: 50%;
  background: var(--c-surface);
  border: 1px solid var(--c-border);
  color: var(--c-text-3);
}
.timeline__dot .i { width: 14px; height: 14px; }
.timeline__dot--success { background: var(--c-success-bg); border-color: var(--c-success-line); color: var(--c-success-text); }
.timeline__dot--warning { background: var(--c-warning-bg); border-color: var(--c-warning-line); color: var(--c-warning-text); }
.timeline__dot--danger { background: var(--c-danger-bg); border-color: var(--c-danger-line); color: var(--c-danger-text); }
.timeline__dot--primary { background: var(--c-primary-soft); border-color: var(--c-primary-line); color: var(--c-primary-text); }
.timeline__dot--indigo { background: var(--c-indigo-soft); border-color: var(--c-indigo-line); color: var(--c-indigo-text); }
.timeline__body { min-width: 0; padding-top: 4px; font-size: var(--fs-sm); color: var(--c-text-2); }
.timeline__body strong { color: var(--c-text); font-weight: var(--fw-medium); }
.timeline__time { display: block; margin-top: 2px; font-size: var(--fs-xs); color: var(--c-text-3); }
.timeline__quote { margin-top: 6px; padding: 8px 12px; border-radius: var(--r-md); background: var(--c-surface-2); border: 1px solid var(--c-divider); color: var(--c-text); font-size: var(--fs-sm); }

/* Stepper de estado: <ol class="stepper"><li class="stepper__step is-complete">…</li><li class="stepper__step is-current" aria-current="step">… */
.stepper { display: flex; list-style: none; margin: 0; padding: 0; counter-reset: step; }
.stepper__step { position: relative; flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; align-items: center; gap: 8px; text-align: center; counter-increment: step; }
.stepper__step::before {
  content: counter(step);
  position: relative; z-index: 1;
  width: 26px; height: 26px; display: grid; place-items: center;
  border-radius: 50%;
  border: 1.5px solid var(--c-border-strong);
  background: var(--c-surface);
  color: var(--c-text-3);
  font-size: var(--fs-xs); font-weight: var(--fw-semi);
}
.stepper__step:not(:first-child)::after { content: ""; position: absolute; top: 13px; right: calc(50% + 17px); left: calc(-50% + 17px); height: 1.5px; background: var(--c-border-strong); }
.stepper__label { font-size: var(--fs-xs); font-weight: var(--fw-medium); color: var(--c-text-3); line-height: 1.3; padding: 0 4px; }
.stepper__date { font-size: var(--fs-2xs); color: var(--c-text-3); margin-top: -4px; }
.stepper__step.is-complete::before {
  content: "";
  background: var(--c-primary) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m5 12.5 4.5 4.5L19 7.5'/%3E%3C/svg%3E") center / 14px no-repeat;
  border-color: var(--c-primary);
}
.stepper__step.is-complete::after, .stepper__step.is-current::after { background: var(--c-primary); }
.stepper__step.is-complete .stepper__label { color: var(--c-text-2); }
.stepper__step.is-current::before { border-color: var(--c-primary); color: var(--c-primary-text); background: var(--c-primary-soft); box-shadow: 0 0 0 4px var(--c-primary-soft); }
.stepper__step.is-current .stepper__label { color: var(--c-text); font-weight: var(--fw-semi); }
.stepper__step.is-blocked::before { border-color: var(--c-warning); color: var(--c-warning-text); background: var(--c-warning-bg); box-shadow: 0 0 0 4px var(--c-warning-bg); }
@media (max-width: 639.98px) {
  .stepper--responsive { flex-direction: column; gap: 0; }
  .stepper--responsive .stepper__step { flex-direction: row; align-items: center; text-align: left; gap: var(--sp-3); padding-bottom: var(--sp-4); }
  .stepper--responsive .stepper__step:last-child { padding-bottom: 0; }
  .stepper--responsive .stepper__step:not(:first-child)::after { top: auto; bottom: calc(100% - 0px); left: 12.5px; right: auto; width: 1.5px; height: var(--sp-4); }
  .stepper--responsive .stepper__date { margin: 0 0 0 auto; }
}

/* Barra de etapas compacta para listas: <div class="steps-bar" style="--steps:5" aria-label="Etapa 3 de 5"><span class="is-done"></span>… */
.steps-bar { display: grid; grid-template-columns: repeat(var(--steps, 5), 1fr); gap: 3px; width: 100%; max-width: 180px; }
.steps-bar > span { height: 4px; border-radius: 2px; background: var(--c-border); }
.steps-bar > .is-done { background: var(--c-primary); }
.steps-bar > .is-current { background: var(--c-primary-line); }
.steps-bar--indigo > .is-done { background: var(--c-indigo); }
.steps-bar--indigo > .is-current { background: var(--c-indigo-line); }
.steps-bar--warning > .is-current { background: var(--c-warning); }

/* Pasos compactos en línea (avance de un pago: voucher → revisión → confirmado → comprobante)
   <ol class="mini-steps" aria-label="Avance del pago"><li class="is-done"><span class="mini-steps__dot">svg check</span>Voucher<span class="sr-only"> (listo)</span></li>
   <li class="is-current" aria-current="step">…</li><li>…</li></ol> */
.mini-steps { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 4px; margin: 0; padding: 0; list-style: none; font-size: var(--fs-xs); color: var(--c-text-3); }
.mini-steps > li { display: inline-flex; align-items: center; gap: 6px; }
.mini-steps > li + li::before { content: ""; width: 16px; height: 1px; background: var(--c-border-strong); margin-right: 2px; }
.mini-steps__dot { width: 16px; height: 16px; border-radius: 50%; display: grid; place-items: center; border: 1.5px solid var(--c-border-strong); background: var(--c-surface); flex: none; }
.mini-steps__dot .i { width: 10px; height: 10px; stroke-width: 3; }
.mini-steps .is-done { color: var(--c-text-2); }
.mini-steps .is-done .mini-steps__dot { background: var(--c-primary); border-color: var(--c-primary); color: var(--c-primary-ink); }
.mini-steps .is-current { color: var(--c-text); font-weight: var(--fw-semi); }
.mini-steps .is-current .mini-steps__dot { border-color: var(--c-warning); background: var(--c-warning-bg); box-shadow: 0 0 0 3px var(--c-warning-bg); }
@media (max-width: 479.98px) { .mini-steps { gap: 6px 12px; } .mini-steps > li + li::before { display: none; } }

/* Conversación (mensajes de proyecto, tickets, notas internas). Una sola versión para las dos caras.
   <ol class="thread [thread--scroll]" role="log">
     <li class="thread__day">Hoy</li> · <li class="thread__event">svg Texto del sistema</li>
     <li class="msg [msg--me | msg--staff | msg--internal] [is-new]">avatar
       <article class="msg__card"><header class="msg__head"><span class="msg__name">Carla</span><span class="msg__role">Titular</span>
         [badge] <time class="msg__time">hace 2 h</time></header>
         <div class="msg__body">Texto…</div> [<ul class="attach-list msg__files">…</ul>] </article></li></ol>
   --me: mensajes propios (tinte azul) · --staff: equipo de BestByte · --internal: nota interna (ámbar, borde punteado) */
.thread { display: flex; flex-direction: column; gap: var(--sp-4); margin: 0; padding: 0; list-style: none; }
.thread--scroll { padding: var(--sp-4) var(--sp-5); max-height: 540px; overflow-y: auto; scrollbar-width: thin; }
.thread--scroll:focus-visible { outline-offset: -2px; }
.thread__day, .thread__event { display: flex; align-items: center; gap: var(--sp-3); font-size: var(--fs-xs); color: var(--c-text-3); }
.thread__day { font-size: var(--fs-2xs); font-weight: var(--fw-semi); letter-spacing: var(--tracking-caps); text-transform: uppercase; }
.thread__day::before, .thread__day::after, .thread__event::before, .thread__event::after { content: ""; flex: 1 1 auto; height: 1px; background: var(--c-divider); }
.thread__event .i { color: var(--c-text-3); }
.msg { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: var(--sp-3); align-items: start; }
.msg__card { min-width: 0; border: 1px solid var(--c-border); border-radius: var(--r-lg); background: var(--c-surface); }
.msg--staff .msg__card { background: var(--c-surface-2); }
.msg--me .msg__card { background: var(--c-primary-soft); border-color: var(--c-primary-line); }
.msg--internal .msg__card { background: var(--c-warning-bg); border-color: var(--c-warning-line); border-style: dashed; }
.msg__head { display: flex; align-items: center; flex-wrap: wrap; gap: 4px 8px; padding: 9px 12px 0; font-size: var(--fs-sm); }
.msg__name { font-weight: var(--fw-semi); color: var(--c-text); }
.msg__role { color: var(--c-text-3); font-size: var(--fs-xs); }
.msg__time { margin-left: auto; font-size: var(--fs-xs); color: var(--c-text-3); white-space: nowrap; }
.msg--me .msg__role, .msg--me .msg__time, .msg--internal .msg__role, .msg--internal .msg__time { color: var(--c-text-2); } /* AA sobre el tinte */
.msg__body { padding: 4px 12px 11px; color: var(--c-text); white-space: pre-line; overflow-wrap: anywhere; }
.msg__files { padding: 0 12px 11px; }
.msg.is-new .msg__card { animation: bb-toast-in var(--dur-slow) var(--ease); }

/* Adjuntos (chips de archivo): <ul class="attach-list"><li><button class="attachment">svg<span class="attachment__name">…</span><span class="attachment__size">…</span></button></li></ul> */
.attach-list { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 6px; }
.attach-list:empty { display: none; }
.attachment {
  display: inline-flex; align-items: center; gap: 6px;
  max-width: 100%;
  min-height: 28px;
  padding: 2px 4px 2px 8px;
  border: 1px solid var(--c-border);
  border-radius: var(--r-sm);
  background: var(--c-surface);
  font-size: var(--fs-xs);
  color: var(--c-text-2);
  text-align: left;
}
button.attachment { padding-right: 8px; cursor: pointer; }
button.attachment:hover { border-color: var(--c-border-strong); background: var(--c-bg-subtle); }
.attachment > .i { color: var(--c-text-3); }
.attachment__name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--c-text); font-weight: var(--fw-medium); }
.attachment__size { color: var(--c-text-3); white-space: nowrap; font-variant-numeric: tabular-nums; }
.attachment .icon-btn { width: 22px; height: 22px; }
.attachment .icon-btn .i { width: 14px; height: 14px; }

/* Caja para escribir: <form class="composer [composer--foot | composer--boxed | composer--sep] [is-internal]">
     textarea.textarea · <div class="composer__bar"><label class="btn btn--ghost btn--sm composer__attach">svg Adjuntar<input class="sr-only" type="file"></label>
     <span class="composer__hint">Ctrl + Enter para enviar</span> … botón Enviar</div></form>
   --foot: pie de una tarjeta · --boxed: recuadro propio (cajones) · --sep: debajo de la conversación, con línea
   .is-internal: nota interna (solo el equipo la ve) */
.composer { display: flex; flex-direction: column; gap: var(--sp-2); min-width: 0; }
.composer .textarea { min-height: 76px; }
.composer > .segmented { align-self: flex-start; }
.composer__bar { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: var(--sp-2); }
.composer__hint { font-size: var(--fs-xs); color: var(--c-text-3); }
.composer__picked { font-size: var(--fs-xs); color: var(--c-text-2); min-width: 0; overflow-wrap: anywhere; }
.composer__attach { position: relative; cursor: pointer; }
.composer__attach:focus-within { outline: 2px solid var(--c-focus); outline-offset: 2px; }
.composer.is-internal .textarea { border-color: var(--c-warning-line); background: var(--c-warning-bg); }
.composer--foot { padding: var(--sp-3) var(--sp-5) var(--sp-4); border-top: 1px solid var(--c-divider); background: var(--c-surface-2); border-radius: 0 0 var(--r-lg) var(--r-lg); }
.composer--foot .textarea { background: var(--c-input); }
.composer--boxed { gap: var(--sp-3); padding: var(--sp-3); border: 1px solid var(--c-border); border-radius: var(--r-lg); background: var(--c-surface-2); }
.composer--boxed.is-internal { border-color: var(--c-warning-line); background: var(--c-warning-bg); }
.composer--boxed.is-internal .textarea { background: var(--c-input); }
.composer--sep { margin-top: var(--sp-5); padding-top: var(--sp-4); border-top: 1px solid var(--c-divider); }
.modal__foot > .composer { flex: 1 1 100%; }
@media (max-width: 639.98px) {
  .thread--scroll { padding: var(--sp-4); }
  .composer--foot { padding: var(--sp-3) var(--sp-4) var(--sp-4); }
  .composer--foot .composer__bar > .btn { flex: 1 1 auto; }
}

/* ==========================================================================
   16. ARCHIVOS Y ENTREGABLES
   ========================================================================== */
.file-list { display: flex; flex-direction: column; }
.file {
  display: flex; align-items: center; gap: var(--sp-3);
  padding: 12px var(--sp-5);
  border-top: 1px solid var(--c-divider);
  min-width: 0;
}
.file:first-child { border-top: 0; }
.file__icon {
  position: relative; flex: none;
  width: 36px; height: 42px;
  display: grid; place-items: end center;
  padding-bottom: 5px;
  border-radius: 4px 10px 4px 4px;
  background: var(--c-surface-2);
  border: 1px solid var(--c-border-strong);
  color: var(--c-text-2);
  font-size: 9px; font-weight: var(--fw-bold); letter-spacing: .04em;
}
.file__icon::before { content: ""; position: absolute; top: -1px; right: -1px; width: 11px; height: 11px; border-bottom-left-radius: 3px; background: var(--c-bg-subtle); border-left: 1px solid var(--c-border-strong); border-bottom: 1px solid var(--c-border-strong); border-top-right-radius: 9px; }
.file__icon--pdf { color: var(--c-danger-text); }
.file__icon--zip { color: var(--c-warning-text); }
.file__icon--img { color: var(--c-success-text); }
.file__icon--doc { color: var(--c-info-text); }
.file__icon--lock { color: var(--c-text-3); }
.file__main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.file__name { font-weight: var(--fw-medium); color: var(--c-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.file__name a { color: inherit; }
.file__meta { font-size: var(--fs-xs); color: var(--c-text-3); }
.file__actions { flex: none; display: flex; align-items: center; gap: var(--sp-2); }
.file--locked .file__name { color: var(--c-text-2); }
.file__lock-note { display: inline-flex; align-items: center; gap: 4px; color: var(--c-warning-text); font-weight: var(--fw-medium); }
@media (max-width: 639.98px) {
  .file { padding: 12px var(--sp-4); flex-wrap: wrap; }
  .file__actions { width: 100%; padding-left: calc(36px + var(--sp-3)); }
}
.version-tag {
  display: inline-flex; align-items: center;
  height: 20px; padding: 0 6px;
  border-radius: var(--r-xs);
  background: var(--c-indigo-soft);
  color: var(--c-indigo-text);
  font-size: var(--fs-2xs); font-weight: var(--fw-semi);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
.version-tag--muted { background: var(--c-bg-subtle); color: var(--c-text-3); }
.hash { font-family: var(--font-mono); font-size: var(--fs-xs); color: var(--c-text-3); letter-spacing: .02em; overflow-wrap: anywhere; }
/* Huella SHA-256 bajo el nombre del archivo, con botón copiar:
   <span class="file__hash">SHA-256&nbsp;<span class="hash-cell"><span class="hash">1a2b3c4d…9f8e7d</span><button class="icon-btn icon-btn--sm" data-copy>…</button></span></span> */
.file__hash { display: inline-flex; align-items: center; gap: 2px; font-size: var(--fs-xs); color: var(--c-text-3); min-width: 0; }
.file__hash .icon-btn { width: 24px; height: 24px; }
.file__hash .icon-btn .i { width: 13px; height: 13px; }
.hash-cell { display: inline-flex; align-items: center; gap: 2px; white-space: nowrap; }
.hash-cell .icon-btn { width: 26px; height: 26px; }
.hash-cell .icon-btn .i { width: 14px; height: 14px; }
.file-list--compact .file { padding-top: 8px; padding-bottom: 8px; }
.file-list--compact .file__icon { width: 30px; height: 36px; font-size: 8px; }
@media (max-width: 639.98px) { .file__hash { flex-wrap: wrap; } }

/* Entregable con versiones (v1, v2… nunca se sobrescriben)
   <article class="dlv"><header class="dlv__head">icono <div class="dlv__main"><h3 class="dlv__title">…</h3><p class="meta">…</p>
     [<div class="dlv__badges">…</div>]</div> [<div class="dlv__badges">…</div> | <div class="dlv__actions">…</div>]</header>
     <div class="ver"><div class="ver__head">version-tag…</div><p class="ver__notes">…</p></div> <ul class="file-list">…</ul>
     <details class="disclosure">Versiones anteriores…<div class="old-ver">…</div></details>
     <div class="dlv__foot">nota de seguridad</div> | <div class="dlv__foot dlv__foot--toolbar">botones… <span class="dlv__note">…</span></div></article> */
.dlv + .dlv { border-top: 1px solid var(--c-border); }
.dlv__head { display: flex; align-items: flex-start; gap: var(--sp-3); padding: var(--sp-4) var(--sp-5) var(--sp-3); transition: background var(--dur-slow); }
.dlv.is-new .dlv__head { background: var(--c-primary-soft); }
.dlv__main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.dlv__title { font-size: var(--fs-md); font-weight: var(--fw-semi); line-height: 1.35; overflow-wrap: anywhere; }
.dlv__badges { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; }
.dlv__head > .dlv__badges { flex: none; justify-content: flex-end; }
.dlv__main > .dlv__badges { margin-top: 4px; }
.dlv__actions { display: flex; align-items: center; gap: 4px; flex: none; }
.dlv__files { border-top: 1px solid var(--c-divider); }
.dlv__files .hash { overflow-wrap: normal; white-space: nowrap; }
.dlv .file-list { border-top: 1px solid var(--c-divider); margin-top: var(--sp-3); }
.dlv .file-list.dlv__files { margin-top: 0; }
.dlv__foot { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: var(--sp-2) var(--sp-3); padding: var(--sp-3) var(--sp-5); border-top: 1px solid var(--c-divider); font-size: var(--fs-xs); color: var(--c-text-3); }
.dlv__foot > span { display: inline-flex; align-items: center; gap: 6px; }
.dlv__foot--toolbar { justify-content: flex-start; gap: 4px var(--sp-2); padding: var(--sp-2) var(--sp-4); background: var(--c-surface-2); }
.dlv:last-child .dlv__foot--toolbar { border-radius: 0 0 var(--r-lg) var(--r-lg); }
.dlv__note { margin-left: auto; font-size: var(--fs-xs); color: var(--c-text-3); }
.ver { padding: 0 var(--sp-5) var(--sp-2); }
.ver__head { display: flex; align-items: center; flex-wrap: wrap; gap: 6px var(--sp-2); }
.ver__notes { margin-top: 6px; font-size: var(--fs-sm); color: var(--c-text-2); max-width: 72ch; }
.old-ver + .old-ver { margin-top: var(--sp-3); padding-top: var(--sp-3); border-top: 1px dashed var(--c-divider); }
.old-ver .file-list { margin: 6px calc(-1 * var(--sp-5)) 0; }
@media (max-width: 639.98px) {
  .dlv__head { padding: var(--sp-4) var(--sp-4) var(--sp-3); flex-wrap: wrap; }
  .dlv__head > .dlv__badges { width: 100%; justify-content: flex-start; padding-left: calc(36px + var(--sp-3)); }
  .dlv__actions { width: 100%; padding-left: calc(36px + var(--sp-3)); }
  .dlv__foot { padding-left: var(--sp-4); padding-right: var(--sp-4); }
  .dlv__foot--toolbar { padding: var(--sp-2) var(--sp-3); }
  .dlv__note { margin-left: 0; width: 100%; padding: 0 var(--sp-2) var(--sp-1); }
  .ver { padding: 0 var(--sp-4) var(--sp-2); }
  .old-ver .file-list { margin-left: calc(-1 * var(--sp-4)); margin-right: calc(-1 * var(--sp-4)); }
}

/* Bloqueado hasta el pago (locked_until_paid): vista previa con marca de agua + estado del pago
   <div class="locked"><button class="preview preview--locked locked__preview">…</button><div>
     <p class="locked__title"><span class="locked__lock">svg</span>Se libera al confirmar tu pago</p>
     <div class="pay-status">concepto · monto · badge <ol class="mini-steps">…</ol></div></div></div> */
.locked {
  display: grid; grid-template-columns: minmax(0, 200px) minmax(0, 1fr); gap: var(--sp-5); align-items: start;
  margin: var(--sp-3) var(--sp-5) var(--sp-4);
  padding: var(--sp-4);
  border: 1px solid var(--c-warning-line);
  border-radius: var(--r-lg);
  background: var(--c-surface-2);
}
.locked__preview { width: 100%; padding: 0; cursor: zoom-in; }
.locked__preview:hover { border-color: var(--c-border-strong); }
.locked__title { display: flex; align-items: center; gap: var(--sp-2); font-weight: var(--fw-semi); color: var(--c-text); font-size: var(--fs-md); }
.locked__title:focus { outline: none; }
.locked__lock { flex: none; width: 28px; height: 28px; display: grid; place-items: center; border-radius: 50%; background: var(--c-warning-bg); color: var(--c-warning-text); border: 1px solid var(--c-warning-line); }
.pay-status { display: flex; flex-direction: column; gap: 6px; padding: 10px 12px; border-radius: var(--r-md); background: var(--c-surface); border: 1px solid var(--c-border); }
.preview-strip { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--sp-3); }
.preview-strip figure { display: flex; flex-direction: column; gap: 6px; }
.preview-strip figcaption { font-size: var(--fs-xs); color: var(--c-text-3); text-align: center; }
@media (max-width: 1199.98px) { .locked { grid-template-columns: minmax(0, 180px) minmax(0, 1fr); } }
@media (max-width: 639.98px) {
  .locked { grid-template-columns: minmax(0, 1fr); margin: var(--sp-3) var(--sp-4) var(--sp-4); padding: var(--sp-3); gap: var(--sp-4); }
  .locked__preview { max-width: 220px; }
  .preview-strip { gap: var(--sp-2); }
}

/* Vista previa (con marca de agua si está bloqueada hasta el pago) */
.preview {
  position: relative;
  aspect-ratio: 4 / 3;
  border-radius: var(--r-md);
  border: 1px solid var(--c-border);
  background: var(--c-surface-2);
  overflow: hidden;
  display: grid; place-items: center;
}
.preview__page {
  width: 62%; height: 84%;
  background: #fff;
  border-radius: 3px;
  box-shadow: 0 2px 10px rgba(16, 24, 40, .12);
  display: grid; grid-template-rows: 44% auto auto 1fr; gap: 6%;
  padding: 6%;
}
.preview__page > i { display: block; border-radius: 2px; background: var(--preview-accent, #e8b4c8); }
.preview__page > i:nth-child(2) { height: 8px; width: 70%; background: #d0d5dd; }
.preview__page > i:nth-child(3) { height: 6px; width: 90%; background: #eaecf0; }
.preview__page > i:nth-child(4) { background: repeating-linear-gradient(180deg, #eaecf0 0 5px, transparent 5px 11px); }
.preview--locked::after {
  content: "";
  position: absolute; inset: 0;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='280' height='130'%3E%3Ctext x='24' y='76' transform='rotate(-24 140 65)' font-family='Inter,Arial,sans-serif' font-size='15' font-weight='700' fill='%23667085' fill-opacity='.38' letter-spacing='2'%3EVISTA PREVIA · BESTBYTE%3C/text%3E%3C/svg%3E");
  background-repeat: repeat;
  pointer-events: none;
}
.preview__badge { position: absolute; left: 10px; bottom: 10px; z-index: 1; }
/* La etiqueta va sobre la hoja blanca: fondo opaco (tinte sobre la superficie) para que se lea en tema oscuro */
.preview__badge.badge--warning { background: linear-gradient(var(--c-warning-bg), var(--c-warning-bg)), var(--c-surface); }
.preview--tall { aspect-ratio: 3 / 4; }

/* ==========================================================================
   17. PERSONAS: avatares
   ========================================================================== */
.avatar {
  --av-bg: var(--c-av-1-bg); --av-fg: var(--c-av-1-fg);
  flex: none;
  display: inline-grid; place-items: center;
  width: 32px; height: 32px;
  border-radius: 50%;
  background: var(--av-bg);
  color: var(--av-fg);
  font-size: var(--fs-xs);
  font-weight: var(--fw-semi);
  letter-spacing: .02em;
  line-height: 1;
  user-select: none;
}
.avatar--xs { width: 20px; height: 20px; font-size: 9px; }
.avatar--sm { width: 26px; height: 26px; font-size: 10px; }
.avatar--lg { width: 44px; height: 44px; font-size: var(--fs-base); }
.avatar--xl { width: 64px; height: 64px; font-size: var(--fs-lg); }
.avatar--square { border-radius: var(--r-md); }
.avatar--xs.avatar--square, .avatar--sm.avatar--square { border-radius: var(--r-sm); }
.avatar[data-color="2"] { --av-bg: var(--c-av-2-bg); --av-fg: var(--c-av-2-fg); }
.avatar[data-color="3"] { --av-bg: var(--c-av-3-bg); --av-fg: var(--c-av-3-fg); }
.avatar[data-color="4"] { --av-bg: var(--c-av-4-bg); --av-fg: var(--c-av-4-fg); }
.avatar[data-color="5"] { --av-bg: var(--c-av-5-bg); --av-fg: var(--c-av-5-fg); }
.avatar[data-color="6"] { --av-bg: var(--c-av-6-bg); --av-fg: var(--c-av-6-fg); }
.avatar--brand { --av-bg: var(--c-primary); --av-fg: #fff; }
.avatar-group { display: inline-flex; align-items: center; }
.avatar-group > .avatar { box-shadow: 0 0 0 2px var(--c-surface); }
.avatar-group > .avatar + .avatar { margin-left: -6px; }
.person { display: flex; align-items: center; gap: 10px; min-width: 0; }
.person__text { display: flex; flex-direction: column; min-width: 0; line-height: 1.3; }
.person__name { font-weight: var(--fw-medium); color: var(--c-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.person__sub { font-size: var(--fs-xs); color: var(--c-text-3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* ==========================================================================
   18. GRÁFICOS (SVG generado por BBAPP.chart)
   ========================================================================== */
.chart { position: relative; width: 100%; min-width: 0; }
.chart__svg { width: 100%; height: auto; overflow: visible; }
.chart__svg text { fill: var(--c-text-3); font-size: 11px; font-family: var(--font-sans); font-variant-numeric: tabular-nums; }
.chart__grid { stroke: var(--c-chart-grid); stroke-width: 1; shape-rendering: crispEdges; }
.chart__baseline { stroke: var(--c-border-strong); stroke-width: 1; shape-rendering: crispEdges; }
.chart__bar { fill: var(--c-chart-1); transition: fill var(--dur-fast), opacity var(--dur-fast); }
.chart__bar--muted { fill: var(--c-chart-muted); }
.chart__bar.is-active { fill: var(--c-chart-hover); }
.chart__hit { fill: transparent; cursor: default; }
.chart__hit:focus { outline: none; }
.chart__hit:focus-visible { stroke: var(--c-focus); stroke-width: 2; }
.chart__tooltip {
  position: absolute;
  z-index: 2;
  min-width: 132px;
  padding: 8px 10px;
  border-radius: var(--r-md);
  background: var(--c-surface-raised);
  border: 1px solid var(--c-border);
  box-shadow: var(--sh-lg);
  font-size: var(--fs-xs);
  color: var(--c-text-2);
  pointer-events: none;
  transform: translate(-50%, calc(-100% - 10px));
  white-space: nowrap;
}
.chart__tooltip strong { display: block; margin-top: 2px; font-size: var(--fs-base); color: var(--c-text); font-variant-numeric: tabular-nums; }
.chart__summary { display: flex; align-items: baseline; gap: var(--sp-3); flex-wrap: wrap; margin-bottom: var(--sp-3); }
.chart__total { font-size: var(--fs-2xl); font-weight: var(--fw-semi); letter-spacing: var(--tracking-title); }
.chart-table { width: 100%; font-size: var(--fs-sm); font-variant-numeric: tabular-nums; }
.chart-table th, .chart-table td { padding: 6px 8px; border-bottom: 1px solid var(--c-divider); text-align: left; }
.chart-table td:last-child, .chart-table th:last-child { text-align: right; }
.spark { display: block; width: 100%; height: 100%; overflow: visible; }
.spark__line { fill: none; stroke: var(--c-chart-1); stroke-width: 1.75; stroke-linejoin: round; stroke-linecap: round; }
.spark__area { fill: var(--c-chart-1-soft); stroke: none; }
.spark__dot { fill: var(--c-chart-1); stroke: var(--c-surface); stroke-width: 2; }
.spark--muted .spark__line { stroke: var(--c-chart-muted); }
.spark--muted .spark__area { fill: none; }

/* Barra apilada de estados (monitoreo) con leyenda */
.stackbar { display: flex; gap: 2px; height: 8px; border-radius: var(--r-full); overflow: hidden; background: var(--c-bg-subtle); }
.stackbar > span { display: block; height: 100%; min-width: 4px; }
.stackbar .is-success { background: var(--c-success); }
.stackbar .is-warning { background: var(--c-warning); }
.stackbar .is-danger { background: var(--c-danger); }
.stackbar .is-neutral { background: var(--c-neutral); }
.legend { display: flex; flex-wrap: wrap; gap: 6px var(--sp-4); font-size: var(--fs-xs); color: var(--c-text-2); }
.legend > span { display: inline-flex; align-items: center; gap: 6px; }
.legend i { width: 8px; height: 8px; border-radius: 2px; display: inline-block; }
.legend .is-ok { background: var(--c-success); }
.legend .is-slow { background: var(--c-warning); }
.legend .is-down { background: var(--c-danger); }

/* Historial de 30 días en barras (tiempo de respuesta + estado), con eje y leyenda
   <div class="day-bars-head"><h3>…</h3><div class="day-bars-head__stats">…</div></div>
   <div class="day-bars" role="img" aria-label="…"><span style="--h:40%"></span><span class="is-slow">…</span><span class="is-down"></span>…</div>
   <div class="day-bars-axis"><span>24 ago</span><span>hoy</span></div> */
.day-bars-head { display: flex; align-items: baseline; justify-content: space-between; gap: var(--sp-2) var(--sp-4); flex-wrap: wrap; margin-bottom: var(--sp-3); }
.day-bars-head__stats { display: flex; gap: var(--sp-2) var(--sp-5); flex-wrap: wrap; font-size: var(--fs-sm); color: var(--c-text-2); }
.day-bars-head__stats strong { color: var(--c-text); font-weight: var(--fw-semi); font-variant-numeric: tabular-nums; }
.day-bars { display: flex; align-items: flex-end; gap: 3px; height: 64px; padding-bottom: 1px; border-bottom: 1px solid var(--c-border-strong); }
.day-bars > span { flex: 1 1 0; min-width: 0; height: var(--h, 40%); min-height: 6px; border-radius: 2px 2px 0 0; background: var(--c-success); opacity: .8; transition: opacity var(--dur-fast); }
.day-bars > span:hover { opacity: 1; }
.day-bars > .is-slow, .day-bars > .is-incident { background: var(--c-warning); opacity: 1; }
.day-bars > .is-down { background: var(--c-danger); opacity: 1; height: 100%; }
.day-bars > .is-today { box-shadow: inset 0 0 0 1px var(--c-surface); }
.day-bars-axis { display: flex; justify-content: space-between; gap: var(--sp-2); margin-top: 6px; font-size: var(--fs-2xs); color: var(--c-text-3); font-variant-numeric: tabular-nums; }
@media (max-width: 479.98px) { .day-bars { gap: 2px; height: 56px; } }

/* Uptime por día (14 cuadritos) */
.uptime { display: grid; grid-template-columns: repeat(var(--days, 14), 1fr); gap: 3px; }
.uptime > span { height: 20px; border-radius: 2px; background: var(--c-success); opacity: .85; }
.uptime > .is-slow { background: var(--c-warning); }
.uptime > .is-down { background: var(--c-danger); }

/* ==========================================================================
   19. COMPONENTES DE DOMINIO
   ========================================================================== */
/* Miniatura de un sitio web (maqueta CSS con color del cliente) */
.site-thumb {
  --thumb-accent: #0068e0;
  position: relative;
  aspect-ratio: 16 / 10;
  border-radius: var(--r-md);
  border: 1px solid var(--c-border);
  background: #fff;
  overflow: hidden;
  display: flex; flex-direction: column;
}
.site-thumb__bar { display: flex; align-items: center; gap: 4px; height: 16px; padding: 0 6px; background: #f2f4f7; border-bottom: 1px solid #e4e7ec; flex: none; }
.site-thumb__bar > i { width: 5px; height: 5px; border-radius: 50%; background: #d0d5dd; }
.site-thumb__bar > b { flex: 1; height: 7px; margin-left: 6px; border-radius: 4px; background: #fff; border: 1px solid #e4e7ec; }
.site-thumb__hero { flex: 1; padding: 9% 8%; background: linear-gradient(135deg, var(--thumb-accent), color-mix(in srgb, var(--thumb-accent) 70%, #000)); color: #fff; display: flex; flex-direction: column; justify-content: center; gap: 4px; }
.site-thumb__title { font-size: 11px; font-weight: var(--fw-bold); line-height: 1.1; letter-spacing: -.01em; }
.site-thumb__tag { font-size: 8px; opacity: .85; line-height: 1.2; }
.site-thumb__cta { width: 34%; height: 8px; margin-top: 3px; border-radius: 4px; background: rgba(255, 255, 255, .9); }
.site-thumb__rows { height: 22%; display: grid; grid-template-columns: repeat(3, 1fr); gap: 5%; padding: 4% 8%; background: #fff; }
.site-thumb__rows > i { border-radius: 3px; background: #eaecf0; }
.site-thumb--down .site-thumb__hero { filter: grayscale(1); opacity: .5; }
.site-thumb--down::after { content: ""; position: absolute; inset: 16px 0 0; background: rgba(255, 255, 255, .35); }

.site-card { display: grid; grid-template-columns: 120px minmax(0, 1fr); gap: var(--sp-3) var(--sp-4); align-items: center; }
.site-card__main { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.site-card__domain { display: inline-flex; align-items: center; gap: 4px; font-weight: var(--fw-semi); color: var(--c-text); min-width: 0; }
.site-card__domain > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.site-card > .span-all { grid-column: 1 / -1; }
@media (max-width: 359.98px) { .site-card { grid-template-columns: minmax(0, 1fr); } .site-card .site-thumb { max-width: 200px; } }

/* Lista de chequeos (HTTP, SSL, dominio, hosting) */
.health-list { display: flex; flex-direction: column; gap: 8px; margin: 0; padding: 0; list-style: none; }
.health-list li { display: flex; align-items: flex-start; gap: 8px; font-size: var(--fs-sm); color: var(--c-text-2); min-width: 0; }
.health-list .i { margin-top: 2px; }
.health-list .is-ok .i { color: var(--c-success-text); }
.health-list .is-warn .i { color: var(--c-warning-text); }
.health-list .is-bad .i { color: var(--c-danger-text); }
.health-list strong { color: var(--c-text); font-weight: var(--fw-medium); }

/* Promo destacada (sobria: tinte azul suave, sin brillos) */
.promo {
  position: relative;
  overflow: hidden;
  padding: var(--sp-5);
  border-radius: var(--r-lg);
  border: 1px solid var(--c-primary-line);
  background: linear-gradient(160deg, var(--c-primary-soft) 0%, var(--c-surface) 70%);
}
.promo__eyebrow { display: inline-flex; align-items: center; gap: 6px; font-size: var(--fs-xs); font-weight: var(--fw-semi); color: var(--c-primary-text); text-transform: uppercase; letter-spacing: var(--tracking-caps); }
.promo__title { margin-top: 8px; font-size: var(--fs-lg); font-weight: var(--fw-semi); line-height: 1.3; letter-spacing: var(--tracking-tight); }
.promo__text { margin-top: 6px; color: var(--c-text-2); font-size: var(--fs-sm); }
.promo__value { margin-top: 10px; font-weight: var(--fw-semi); color: var(--c-text); }
.promo__actions { display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; margin-top: var(--sp-4); }
.promo__art { position: absolute; right: 16px; top: 16px; width: 40px; height: 40px; color: var(--c-primary-line); pointer-events: none; }
.promo > :not(.promo__art) { position: relative; }

/* Clave/valor compacto en línea (p. ej. dentro de tarjetas de licencia) */
.kv { display: flex; flex-wrap: wrap; gap: var(--sp-2) var(--sp-5); font-size: var(--fs-sm); }
.kv > div { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.kv dt, .kv__k { color: var(--c-text-3); font-size: var(--fs-xs); }
.kv dd, .kv__v { color: var(--c-text); font-weight: var(--fw-medium); }

/* Mosaico de chequeos de un sitio (HTTP, SSL, dominio, hosting)
   <div class="health-tiles"><div class="health-tile health-tile--ok|--warn|--bad"><span class="health-tile__label">svg SSL</span>
     <span class="health-tile__value">Válido</span><span class="health-tile__sub">hasta 12 ene 2027</span></div>…</div> */
.health-tiles { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sp-3); }
@media (min-width: 1400px) { .health-tiles { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
@media (max-width: 479.98px) { .health-tiles { grid-template-columns: minmax(0, 1fr); } }
.health-tile { display: flex; flex-direction: column; gap: 3px; min-width: 0; padding: 12px 14px; border: 1px solid var(--c-border); border-radius: var(--r-md); background: var(--c-surface-2); }
.health-tile__label { display: flex; align-items: center; gap: 6px; font-size: var(--fs-xs); font-weight: var(--fw-medium); color: var(--c-text-3); }
.health-tile__label .i { width: 14px; height: 14px; }
.health-tile__value { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; font-weight: var(--fw-semi); color: var(--c-text); font-variant-numeric: tabular-nums; }
.health-tile__sub { font-size: var(--fs-xs); color: var(--c-text-3); overflow-wrap: anywhere; }
.health-tile--ok .health-tile__label .i { color: var(--c-success-text); }
.health-tile--warn { border-color: var(--c-warning-line); background: var(--c-warning-bg); }
.health-tile--warn .health-tile__label, .health-tile--warn .health-tile__label .i { color: var(--c-warning-text); }
.health-tile--bad { border-color: var(--c-danger-line); background: var(--c-danger-bg); }
.health-tile--bad .health-tile__label, .health-tile--bad .health-tile__label .i { color: var(--c-danger-text); }
.health-tile--warn .health-tile__sub, .health-tile--bad .health-tile__sub { color: var(--c-text-2); }

/* Código QR (pago Yape/Plin, configuración de 2FA). Excepción de color documentada: un QR
   necesita módulos oscuros sobre fondo blanco en AMBOS temas para que lo lea la cámara
   (mismo criterio que .preview__page y .site-thumb). El SVG pinta con <rect> o fill="currentColor";
   .qr__bg marca los huecos de los "ojos". */
.qr { --qr-bg: #ffffff; --qr-fg: #101828; flex: none; width: 176px; aspect-ratio: 1; padding: 12px; border: 1px solid var(--c-border); border-radius: var(--r-md); background: var(--qr-bg); color: var(--qr-fg); }
.qr svg { width: 100%; height: 100%; shape-rendering: crispEdges; }
.qr rect { fill: var(--qr-fg); }
.qr .qr__bg { fill: var(--qr-bg); }

/* Tablero kanban (admin › Proyectos): columnas por etapa con tarjetas arrastrables
   <div class="kanban"><section class="kanban__col"><header class="kanban__head"><h3 class="kanban__title"><span class="kanban__dot kanban__dot--info"></span>…
   <ul class="kanban__list"><li class="kanban-card" draggable="true">…</li></ul></section>…</div> */
.kanban {
  display: grid; grid-template-columns: repeat(5, minmax(184px, 1fr)); gap: var(--sp-3); align-items: start;
  padding: var(--sp-4);
  overflow-x: auto; scroll-snap-type: x proximity;
  scrollbar-width: thin; scrollbar-color: var(--c-border-strong) transparent;
  min-height: 280px;
}
.kanban:focus-visible { outline-offset: -3px; border-radius: 0; }
.kanban__full { grid-column: 1 / -1; }
.kanban__col { display: flex; flex-direction: column; min-width: 0; background: var(--c-bg); border: 1px solid var(--c-divider); border-radius: var(--r-lg); scroll-snap-align: start; transition: background var(--dur-fast), border-color var(--dur-fast); }
.kanban__col.is-over { background: var(--c-primary-soft); border-color: var(--c-primary-line); }
.kanban__head { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 2px var(--sp-2); padding: 10px 10px 8px 12px; min-width: 0; }
.kanban__title { flex: 1 1 100%; display: flex; align-items: center; gap: 7px; min-width: 0; font-size: var(--fs-sm); font-weight: var(--fw-semi); line-height: 1.3; color: var(--c-text); }
.kanban__label { min-width: 0; overflow-wrap: anywhere; }
.kanban__title .count { flex: none; }
.kanban__dot { width: 8px; height: 8px; border-radius: 50%; flex: none; background: var(--c-neutral); }
.kanban__dot--warning { background: var(--c-warning); }
.kanban__dot--info { background: var(--c-info); }
.kanban__dot--indigo { background: var(--c-indigo); }
.kanban__dot--success { background: var(--c-success); }
.kanban__sum { padding-left: 15px; font-size: var(--fs-2xs); color: var(--c-text-3); white-space: nowrap; }
.kanban__list { display: flex; flex-direction: column; gap: var(--sp-2); min-height: 72px; margin: 0; padding: 0 8px 8px; list-style: none; }
.kanban__empty { padding: var(--sp-4) var(--sp-2); border: 1.5px dashed var(--c-border); border-radius: var(--r-md); text-align: center; font-size: var(--fs-xs); color: var(--c-text-3); }
.kanban__more { margin: -2px 8px 8px; }
.kanban-card { position: relative; display: flex; flex-direction: column; gap: 8px; min-width: 0; padding: 10px 12px; background: var(--c-surface); border: 1px solid var(--c-border); border-radius: var(--r-md); box-shadow: var(--sh-xs); cursor: grab; transition: border-color var(--dur-fast), box-shadow var(--dur-fast), opacity var(--dur-fast); }
.kanban-card:hover { border-color: var(--c-border-strong); box-shadow: var(--sh-sm); }
.kanban-card:focus-within { border-color: var(--c-primary-line); }
.kanban-card.is-dragging { opacity: .45; cursor: grabbing; }
.kanban-card.is-new { border-color: var(--c-primary-line); box-shadow: 0 0 0 3px var(--c-primary-soft); }
.kanban-card__top { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: var(--fs-2xs); color: var(--c-text-3); min-width: 0; }
.kanban-card__type { display: inline-flex; align-items: center; gap: 4px; min-width: 0; color: var(--c-indigo-text); font-weight: var(--fw-medium); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.kanban-card__title { font-size: var(--fs-sm); font-weight: var(--fw-semi); line-height: 1.35; color: var(--c-text); overflow-wrap: anywhere; }
.kanban-card__title:hover { color: var(--c-link); }
.kanban-card__client, .kanban-card__stage { display: flex; align-items: center; gap: 6px; min-width: 0; font-size: var(--fs-xs); color: var(--c-text-2); }
.kanban-card__stage { color: var(--c-text-3); }
.kanban-card__stage .steps-bar { flex: none; }
.kanban-card__flags { display: flex; flex-wrap: wrap; gap: 4px; }
.kanban-card__flags .badge { height: auto; min-height: 18px; padding: 2px 6px; white-space: normal; line-height: 1.3; }
.kanban-card__foot { display: flex; align-items: center; justify-content: space-between; gap: 6px; padding-top: 8px; border-top: 1px solid var(--c-divider); min-width: 0; }
.kanban-card__end { display: inline-flex; align-items: center; gap: 2px; flex: none; }
.kanban-card__end .icon-btn { width: 26px; height: 26px; }
.kanban-card__foot .due { white-space: normal; line-height: 1.3; }
@media (min-width: 720px) and (max-width: 1023.98px) { .kanban { grid-template-columns: repeat(5, minmax(232px, 1fr)); } }
@media (max-width: 719.98px) {
  .kanban { grid-template-columns: minmax(0, 1fr); padding: var(--sp-3); overflow: visible; min-height: 0; }
  .kanban-card { cursor: default; }
}

/* Fecha de entrega con semáforo: <span class="due due--late|--warn|--ok|--done">svg Vence en 3 días</span> */
.due { display: inline-flex; align-items: center; gap: 4px; min-width: 0; font-size: var(--fs-xs); font-weight: var(--fw-medium); color: var(--c-text-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.due .i { width: 12px; height: 12px; flex: none; }
.due--late { color: var(--c-danger-text); }
.due--warn { color: var(--c-warning-text); }
.due--ok { color: var(--c-text-2); }
.due--done { color: var(--c-success-text); }

/* Cola de revisión (admin › Pagos por confirmar): <ul class="queue"><li><a class="queue-item" aria-current="true">…</a></li></ul> */
.queue { display: flex; flex-direction: column; gap: 8px; margin: 0; padding: 0; list-style: none; }
.queue-item { display: flex; align-items: flex-start; gap: var(--sp-3); padding: 12px 14px; border: 1px solid var(--c-border); border-radius: var(--r-lg); background: var(--c-surface); color: var(--c-text); box-shadow: var(--sh-xs); text-decoration: none; transition: border-color var(--dur-fast), box-shadow var(--dur-fast), background var(--dur-fast); }
.queue-item:hover { border-color: var(--c-border-strong); color: var(--c-text); text-decoration: none; }
.queue-item[aria-current="true"] { border-color: var(--c-primary-line); background: var(--c-primary-soft); box-shadow: none; }
.queue-item:focus-visible { outline-offset: 2px; border-radius: var(--r-lg); }
.queue-item__icon { flex: none; width: 34px; height: 34px; display: grid; place-items: center; border-radius: 50%; background: var(--c-bg-subtle); color: var(--c-text-2); border: 1px solid var(--c-border); }
.queue-item[aria-current="true"] .queue-item__icon { background: var(--c-surface); color: var(--c-primary-text); border-color: var(--c-primary-line); }
.queue-item__main { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.queue-item__top { display: flex; align-items: baseline; justify-content: space-between; gap: var(--sp-2); }
.queue-item__amount { font-weight: var(--fw-semi); font-variant-numeric: tabular-nums; white-space: nowrap; }
.queue-item__wait { font-size: var(--fs-xs); color: var(--c-text-3); white-space: nowrap; }
.queue-item__wait.is-late { color: var(--c-warning-text); font-weight: var(--fw-medium); }
.queue-item__client { font-size: var(--fs-sm); color: var(--c-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.queue-item__meta { font-size: var(--fs-xs); color: var(--c-text-3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Sobre el azul suave del elemento activo, --c-text-3 no llega a 4.5:1: texto secundario más oscuro */
.queue-item[aria-current="true"] .queue-item__meta,
.queue-item[aria-current="true"] .queue-item__wait:not(.is-late) { color: var(--c-text-2); }

/* Monto esperado vs. monto del voucher (confirmación manual de Yape/Plin/transferencia) */
.amount-compare { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); border: 1px solid var(--c-border); border-radius: var(--r-md); overflow: hidden; background: var(--c-surface); }
.amount-compare__cell { padding: 10px 12px; min-width: 0; }
.amount-compare__cell + .amount-compare__cell { border-left: 1px solid var(--c-divider); }
.amount-compare__label { display: block; font-size: var(--fs-xs); color: var(--c-text-3); }
.amount-compare__value { display: block; margin-top: 2px; font-size: var(--fs-lg); font-weight: var(--fw-semi); font-variant-numeric: tabular-nums; letter-spacing: var(--tracking-tight); white-space: nowrap; }
.amount-compare__src { display: block; font-size: var(--fs-xs); color: var(--c-text-3); overflow-wrap: anywhere; }
.amount-compare__result { grid-column: 1 / -1; display: flex; align-items: center; gap: 6px; padding: 7px 12px; border-top: 1px solid var(--c-success-line); background: var(--c-success-bg); color: var(--c-success-text); font-size: var(--fs-sm); font-weight: var(--fw-medium); }
.amount-compare__result--bad { border-top-color: var(--c-danger-line); background: var(--c-danger-bg); color: var(--c-danger-text); }

/* Verificación manual obligatoria (casilla "comparé con el movimiento real") */
.verify-box { padding: 12px 14px; border: 1px solid var(--c-warning-line); border-radius: var(--r-md); background: var(--c-warning-bg); }
.verify-box .check { font-weight: var(--fw-medium); }
.verify-box .check__hint { color: var(--c-text-2); font-weight: var(--fw-regular); } /* AA sobre el fondo ámbar en ambos temas */
.verify-box.is-invalid { border-color: var(--c-danger); box-shadow: 0 0 0 3px var(--c-danger-bg); }
.verify-box .field__error { margin-top: 6px; }

/* ==========================================================================
   20. RESPONSIVE (shell), IMPRESIÓN, ANIMACIONES
   ========================================================================== */
@media (max-width: 1023.98px) {
  .app-shell, :root[data-sidebar="collapsed"] .app-shell { grid-template-columns: minmax(0, 1fr); }
  .sidebar {
    position: fixed;
    top: 0; left: 0; bottom: 0;
    z-index: var(--z-drawer);
    width: min(300px, 86vw);
    height: 100dvh;
    transform: translateX(-100%);
    visibility: hidden;
    box-shadow: none;
    transition: transform var(--dur-slow) var(--ease), visibility 0s linear var(--dur-slow), box-shadow var(--dur-slow);
  }
  :root.is-sidebar-open .sidebar { transform: none; visibility: visible; box-shadow: var(--sh-xl); transition: transform var(--dur-slow) var(--ease), visibility 0s, box-shadow var(--dur-slow); }
  .sidebar-backdrop {
    display: block;
    position: fixed; inset: 0;
    z-index: calc(var(--z-drawer) - 1);
    background: var(--c-overlay);
    opacity: 0; visibility: hidden;
    transition: opacity var(--dur-slow) var(--ease), visibility 0s linear var(--dur-slow);
  }
  :root.is-sidebar-open .sidebar-backdrop { opacity: 1; visibility: visible; transition: opacity var(--dur-slow) var(--ease), visibility 0s; }
  :root.is-sidebar-open { overflow: hidden; }
  .sidebar .sidebar__close { display: inline-grid; }
  /* En el cajón móvil nunca se muestra la versión colapsada */
  :root[data-sidebar="collapsed"] .sidebar .logo__word,
  :root[data-sidebar="collapsed"] .sidebar__product,
  :root[data-sidebar="collapsed"] .nav-group__title,
  :root[data-sidebar="collapsed"] .context-switch__text,
  :root[data-sidebar="collapsed"] .nav-item__label { position: static !important; width: auto; height: auto; overflow: visible; clip: auto; }
  :root[data-sidebar="collapsed"] .nav-item { justify-content: flex-start; padding: 6px 10px; }
  :root[data-sidebar="collapsed"] .sidebar__head { padding: 0 var(--sp-4) 0 var(--sp-5); justify-content: flex-start; }
  :root[data-sidebar="collapsed"] .nav-item__badge { position: static; width: auto; min-width: 20px; height: 20px; padding: 0 6px; font-size: var(--fs-2xs); border-width: 1px; box-sizing: border-box; }
  :root[data-sidebar="collapsed"] .sidebar .logo__mark { width: 26px; height: 30px; margin: -4px 1px 0; }
  :root[data-sidebar="collapsed"] .context-switch { justify-content: flex-start; padding: 8px 10px; }
  :root[data-sidebar="collapsed"] .nav-group + .nav-group { border-top: 0; padding-top: 0; margin-top: var(--sp-4); }
  :root[data-sidebar="collapsed"] .sidebar__nav, :root[data-sidebar="collapsed"] .sidebar__foot, :root[data-sidebar="collapsed"] .sidebar__context { padding-left: var(--sp-3); padding-right: var(--sp-3); }
  :root[data-sidebar="collapsed"] .context-switch > .i { position: static !important; width: 16px; height: 16px; clip: auto; }
}
@media (max-width: 639.98px) {
  .topbar { gap: var(--sp-2); }
  .cmd-trigger { width: 36px; padding: 0; justify-content: center; border-color: transparent; background: transparent; box-shadow: none; }
  .cmd-trigger__text, .cmd-trigger .kbd { display: none; }
  .user-btn__name, .user-btn > .i { display: none; }
  .topbar__sep { display: none; }
  .page { padding-top: var(--sp-5); }
  .page-header { margin-bottom: var(--sp-5); }
  .page-header__title { font-size: var(--fs-xl); }
  .page-header__actions { width: 100%; }
  .page-header__actions > .btn { flex: 1 1 auto; }
  .stat { padding: var(--sp-4); }
  .stat__value { font-size: 1.375rem; }
}

@media print {
  .sidebar, .topbar, .toast-region, .page-header__actions, .skip-link, .sidebar-backdrop { display: none !important; }
  .app-shell { display: block; }
  .page { padding: 0; }
  .card, .table-card, .stat { box-shadow: none; break-inside: avoid; }
}

@keyframes bb-spin { to { transform: rotate(360deg); } }
@keyframes bb-fade { from { opacity: 0; } to { opacity: 1; } }
@keyframes bb-pop { from { opacity: 0; transform: translateY(-4px) scale(.98); } to { opacity: 1; transform: none; } }
@keyframes bb-modal-in { from { opacity: 0; transform: translateY(8px) scale(.985); } to { opacity: 1; transform: none; } }
@keyframes bb-sheet-in { from { transform: translateY(24px); opacity: .6; } to { transform: none; opacity: 1; } }
@keyframes bb-drawer-in { from { transform: translateX(24px); opacity: .6; } to { transform: none; opacity: 1; } }
@keyframes bb-toast-in { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
@keyframes bb-toast-out { to { opacity: 0; transform: translateX(16px); } }
@keyframes bb-shimmer { from { background-position: 150% 0; } to { background-position: -50% 0; } }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; scroll-behavior: auto !important; }
  .skeleton { animation: none; }
}

/* ==========================================================================
   21. AJUSTES FINOS COMPARTIDOS
   ========================================================================== */
/* Mostrar/ocultar según tema (p. ej. icono sol/luna del conmutador) */
:root[data-theme="dark"] .only-light,
:root:not([data-theme="dark"]) .only-dark { display: none !important; }

/* Títulos de fila que son enlaces */
a.list-item__title, a.file__name { display: block; color: var(--c-text); }
a.list-item__title:hover, a.file__name:hover { color: var(--c-link); }

/* Tonos del icono de notificación */
.notif__icon--success { background: var(--c-success-bg); color: var(--c-success-text); }
.notif__icon--warning { background: var(--c-warning-bg); color: var(--c-warning-text); }
.notif__icon--danger  { background: var(--c-danger-bg);  color: var(--c-danger-text); }
.notif__icon--info    { background: var(--c-info-bg);    color: var(--c-info-text); }
.notif__icon--indigo  { background: var(--c-indigo-soft); color: var(--c-indigo-text); }
.notif__icon--primary { background: var(--c-primary-soft); color: var(--c-primary-text); }

/* Alerta índigo (proyectos/diseño que esperan al cliente) */
.alert--indigo { background: var(--c-indigo-soft); border-color: var(--c-indigo-line); }
.alert--indigo .alert__icon { color: var(--c-indigo-text); }

/* Separación estándar entre bloques de una página */
.page-section + .page-section { margin-top: var(--sp-6); }
.block-gap { margin-bottom: var(--sp-6); }
