/** * CanonTabsBar — la barra de pestañas del canon de UI/UX, píxel a píxel. * * Reproduce la barra que `MasterCrud` dibuja a partir de `formTabs`, tal y como la fija el * **ADR-027 §C**. Existe para que `MasterDocument` deje de tener DOS diseños propios de * pestañas —el subrayado de `HeaderRenderer` (14px, `border-b-2`) y los chips redondeados de * `LineTabsBar`— y ninguno de los dos se pareciese al de MasterCrud. Al vivir el estilo en UN * solo sitio, los dos consumidores no pueden volver a divergir en el siguiente PR * (ADR-027 §Apéndice C, «un solo dueño del estilo»). * * Lo que el canon fija y aquí se copia literal (§C.2, Regla A.2 — copiar, nunca aproximar): * * - botón `px-3 py-1.5 text-xs font-semibold`, `rounded-t-lg`, fondo `#f8f9fc`; * - activa `text-[#0c6ade]`; inactiva en `content-tertiary` con hover a `content-primary`; * - indicador deslizante: UN solo `` de `2.5px` de grosor CONSTANTE * (Regla C.1 — no se deriva de la pestaña), `rounded-[3px]`, `bg-[#0e79fd]`; * - los dos ejes del movimiento llevan curvas DISTINTAS a propósito: el rebote de la barra * sale del `overshoot` de `left`. Va en estilo inline porque son dos transiciones con * curvas distintas por propiedad, no un valor de la escala de Tailwind. * * Los colores son hex literales y no clases de paleta: la paleta de Tailwind v4 es `oklch` * y no reproduce estos hex —`bg-blue-600` no es `#0e79fd`— (Regla C.2). * * El indicador se coloca MIDIENDO la pestaña activa, así que se recalcula al cambiar de * pestaña, al redimensionar y cuando las etiquetas se resuelven: un catálogo i18n que llega * tarde cambia el ancho de todas. * * Accesibilidad: emite `role="tablist"` / `role="tab"` con `aria-selected`, `aria-controls` * y el `tabIndex` rotatorio del patrón ARIA Tabs, más las flechas ←/→ e Inicio/Fin. Eso lo * traía `LineTabsBar` y se conserva aquí — el canon de MasterCrud no lo tiene, y perderlo * al homologar habría sido cambiar apariencia a costa de comportamiento. * * @see ADR-027 §C — el canon literal */ export interface CanonTab { /** Identificador estable de la pestaña. Viaja a `data-tabkey` y a los `id` de ARIA. */ key: string; /** Rótulo visible, ya traducido. */ label: React.ReactNode; /** Icono opcional a la izquierda del rótulo. */ icon?: React.ReactNode; /** `true` si la pestaña contiene algún campo obligatorio (§C.3: asterisco rojo). */ hasRequired?: boolean; /** Nº de campos que siguen bloqueando el guardado (§C.3: badge rojo). `0` no pinta nada. */ missingCount?: number; } export interface CanonTabsBarProps { tabs: CanonTab[]; activeKey: string; onChange: (key: string) => void; /** Rótulo accesible de la barra. */ ariaLabel?: string; /** Prefijo de los `id` de ARIA, para poder montar dos barras en una misma página. */ idPrefix?: string; /** * `data-testid` de la barra. Por defecto `tabs`, que es el gancho del canon (§C.6). * Se puede cambiar porque `MasterDocument` monta DOS barras a la vez —la del encabezado y * la de líneas— y dos elementos con el mismo testid hacen que `getByTestId` lance por * ambigüedad en vez de encontrar el que se busca. */ testId?: string; className?: string; } export declare function CanonTabsBar({ tabs, activeKey, onChange, ariaLabel, idPrefix, testId, className, }: CanonTabsBarProps): import("react/jsx-runtime").JSX.Element; //# sourceMappingURL=CanonTabsBar.d.ts.map