/* ============================================================
   HUF — Utilidades
   ------------------------------------------------------------
   Una sola propiedad (o un grupo mínimo indivisible) por clase, prefijo
   .hd-u-* para distinguirlas de clases de componente (.hd-*). Reemplaza
   el patrón style="" inline repetido (plan §6.1, §20.1). Bootstrap se
   mantiene solo para grid (row/col-*) y utilidades ya cubiertas por él
   (d-flex, gap-*, d-none, etc.) — estas utilidades cubren lo que
   Bootstrap no resuelve o que HUF necesita re-tematizado.
   ============================================================ */

.hd-u-cursor-pointer { cursor: pointer; }

.hd-u-tabular-nums { font-variant-numeric: tabular-nums; }

/* Empuja un elemento al extremo de su contenedor flex. Utilidad, no
   componente: por eso sí puede escribirse en una vista (HVL §6, excepción de
   utilidades y rejilla). Primer consumidor: el bloque "operando como tenant"
   de la línea de estado de Empresas. */
.hd-u-ml-auto { margin-left: auto; }

/* Para valores que vienen del modelo en minúscula y se muestran como etiqueta
   (ej. el origen de un lead). No cambia el dato, solo su presentación. */
.hd-u-capitalize { text-transform: capitalize; }

.hd-u-truncate {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.hd-u-thumb-44 {
    width: 2.75rem;
    height: 2.75rem;
}

/* Botón que ocupa el ancho de su columna — el caso de un formulario en
   panel estrecho, donde la acción es única y no compite con nada. */
.hd-u-w-full { width: 100%; }

/* Ancho fijo para una celda de texto largo que se trunca. Sin un ancho
   declarado, `text-overflow: ellipsis` no tiene contra qué recortar en
   una celda de tabla y la columna crece hasta desbordar la fila. */
.hd-u-w-200 { max-width: 12.5rem; }

/* Identificadores largos SIN espacios (hash SHA256, URL, token): el navegador
   no encuentra dónde cortar y estiran su columna hasta sacarle scroll
   horizontal a la página entera. Es lo contrario de truncar: acá el valor
   completo importa (se dicta o se compara), así que se parte, no se esconde.
   Primer consumidor: el hash del release en Configuración → Impresoras. */
.hd-u-break-all { word-break: break-all; }

/* Valor de texto libre que puede no tener espacios donde cortar (email, URL
   escrita por el usuario) dentro de una columna estrecha. A diferencia de
   .hd-u-break-all, respeta primero las oportunidades naturales de corte y solo
   parte la palabra si no hay ninguna — lo correcto para un dato legible, no
   para un hash. Primer consumidor: el email en la ficha de cliente, que se
   salía del card cuando era largo. */
.hd-u-break-word { overflow-wrap: anywhere; }

/* Oculta visualmente pero mantiene accesible a lectores de pantalla. */
.hd-u-sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

/* Skip-to-content — gap real detectado en la auditoría (plan §1.6: "no
   existe skip-to-content"). Requiere un <a href="#contenido-principal"
   class="hd-u-skip-link"> como primer hijo del body y un ancla con ese
   id en el contenedor de contenido — no se agrega a ningún layout
   todavía (no se migra ninguna pantalla). */
.hd-u-skip-link {
    position: absolute;
    left: -9999px;
    top: 0;
    z-index: var(--hd-z-toast);
    background: var(--hd-theme-surface);
    color: var(--hd-theme-text);
    padding: var(--hd-space-2) var(--hd-space-4);
    border-radius: var(--hd-radius-sm);
    text-decoration: none;
    font-weight: 600;
}

.hd-u-skip-link:focus {
    left: var(--hd-space-3);
    top: var(--hd-space-3);
}
