Button
5 variantes (primary / secondary / ghost / danger / link) · 4 tamaños · estados loading, disabled, iconOnly.
Los componentes del design system con instancias reales, estados y variantes. Agrupados por categoría, con ancla directa a cada uno.
Los bloques básicos de toda pantalla. Accesibles desde el primer PR — ARIA + teclado.
5 variantes (primary / secondary / ghost / danger / link) · 4 tamaños · estados loading, disabled, iconOnly.
Campo de texto con label, helper, error, prefix / suffix, icon slots y tipografía mono opt-in.
4 variantes (default / muted / elevated / outlined) con slots
CardHeader / CardBody /
CardFooter y modo interactive.
5 intents (success / warning / danger / info / neutral) · 3 variantes (soft / outline / solid) · modos dot y count.
Dialogs, toasts, dropdowns, popovers, tooltips. Portales, focus-trap, Esc y click-outside cierran cuando aplica.
Modal con focus trap, Esc / click-outside cierran, variante danger para cancelaciones de CFDI y similares.
Variante de Dialog con role="alertdialog" para forzar
respuesta. Cancel + Confirm auto-renderados, soporte
loading para acciones async, default
dismissOnOutside={false} (no se cierra con Esc /
backdrop sin elegir).
API imperativa vía useToast(). Duración adaptada
por variante; danger/warning usan aria-live="assertive".
Menu contextual con keyboard completo, typeahead, separadores, labels de grupo y items destructivos.
Panel flotante rico (no-menu) para filtros, previews y formularios cortos. Trap de foco opt-in cuando hay inputs dentro.
Hint textual en hover / focus. 4 lados con flip automático. No aparece en touch devices (regla dura del iter 2).
Label, Textarea, Select, Checkbox, Radio, Switch con keyboard navigation completo y labels accesibles por defecto.
Standalone para controles que no son el Input del DS.
Soporta required (asterisco visible + texto SR) y error para tinte danger.
Multi-línea con resize controlado (vertical / none) y contador visible opcional cuando hay maxLength, con tintes warning / danger al acercarse al límite.
Combobox accesible con listbox portaled, typeahead, y búsqueda opt-in para catálogos largos (régimen fiscal, uso CFDI, etc.).
Selector con búsqueda async (server-side). Debounce
300ms, cross-request guard descarta respuestas stale, estados explícitos
idle / loading / ready / error. Útil para clientes
por RFC, productos del SAT, contactos — catálogos que no caben
en memoria.
Controlled / uncontrolled, soporte indeterminate
como estado visual (no lógico), CheckboxGroup con label.
Exige RadioGroup padre. Roving tabindex WAI-ARIA APG.
Arrow keys navegan y seleccionan simultáneamente.
Toggle on/off — distinto de Checkbox (Checkbox marca elección,
Switch activa un comportamiento). role="switch" + anuncio
"encendido/apagado" al screen reader.
Código de verificación (2FA / magic link). Wrapper especializado
del Input con tipografía mono centrada, filtro por pattern,
inputMode="numeric" + autocomplete="one-time-code" para autofill SMS, y callback onComplete al alcanzar
el length.
Un solo campo — sin metáfora de celdas separadas
(content-first).
Tabla de datos densa Cat 2 — consume @tanstack/react-table
v8 (headless). Sticky header translúcido, sortable, selección multi
con bulk action bar inline, paginación, y card-stack en mobile (≤640px).
Decisiones de Claude Design preservadas:
checkbox custom <span role=checkbox> para que el
focus viva en la row vía roving tabindex; bulk bar inline cobre-alpha-12
(no toast); mobile = cards (no scroll horizontal).
Default interactivo · sortable + selección multi + bulk action bar + paginación. Mobile (≤640px) rota a card-stack.
| Folio | Cliente | Fecha | Monto | Estado | |
|---|---|---|---|---|---|
| FOL-00158 | Inteligable S.A. de C.V. | 15 abr | $12,450.00 | Timbrada | |
| FOL-00159 | Murona SAPI de C.V. | 16 abr | $8,320.50 | Pendiente | |
| FOL-00160 | La Querencia S.C. | 16 abr | $45,000.00 | Cancelada | |
| FOL-00161 | Tostadería Veracruzana S. de R.L. | 17 abr | $2,180.75 | Timbrada | |
| FOL-00162 | Ferretería Don Mario | 17 abr | $740.00 | Borrador | |
| FOL-00163 | Servicios Logísticos del Bajío | 18 abr | $28,900.00 | Timbrada | |
| FOL-00164 | Murona SAPI de C.V. | 18 abr | $5,500.00 | Pendiente | |
| FOL-00165 | Panadería La Trenza | 19 abr | $1,200.00 | Timbrada |
Estado loading:
| Folio | Cliente | Fecha | Monto | Estado |
|---|---|---|---|---|
Estado empty (con search activo):
| Folio | Cliente | Fecha | Monto | Estado |
|---|---|---|---|---|
No hay facturas que coincidan Tu búsqueda "facturoide" no arrojó resultados. | ||||
Estado error con retry:
| Folio | Cliente | Fecha | Monto | Estado |
|---|---|---|---|---|
No se pudieron cargar los datos El servicio respondió con 503. Probablemente el SAT está saturado — suele durar 3–5 min. | ||||
Selector de fecha Cat 2 — consume react-day-picker
v9 + date-fns con locale es-MX (Lunes como primer día,
meses largos en español). Single + range modes, popover con outside-click
+ Escape para cerrar.
Decisiones de Claude Design preservadas: today marker
es anillo neutral (no cobre — el cobre se reserva para selected);
range "in-between" con cobre-alpha-12 (no fill pleno); quick ranges
sidebar en desktop, chip-row en mobile.
Single mode — popover con weekStartsOn lunes (es-MX), today marker neutral (no cobre), botón "Hoy" + "Limpiar" en footer.
Range mode — 2 calendarios side-by-side + sidebar de quick ranges. Range "in-between" con cobre-alpha-12 (no fill pleno).
Single con weekends disabled:
Gráfica Cat 2 — consume recharts v3 con
accessibilityLayer nativo (renderea
<table> oculto con datos crudos para screen readers).
3 tipos: line, bar, donut. Card wrapper con título + subtítulo + KPI
+ delta. Multi-tenant ready:
la paleta de 5 series se lee via tokens
--chart-series-1..5 que derivan del cobre. Cualquier
override del scope (root, [data-tenant],
card-level) re-tematiza el chart automáticamente sin código por
tenant.
Line chart con curva monotone, área gradient en serie primaria, comparativa dashed en secundaria. KPI + delta opcional.
VENTAS · 2026
Comparativo año actual vs anterior
Bar chart con rounded-top 4px + stagger animation (40ms entre barras, max 800ms total).
INGRESOS · MARZO 2026
Distribución de facturación del mes
Donut chart con total en el hueco. Multi-tenant ready — cada slice usa var(--chart-series-N).
ESTATUS · MARZO 2026
300 totales emitidas
Estado loading:
Estado empty:
Sin información para este período
Aún no hay facturas timbradas en marzo de 2026.
Estado error con retry:
No se pudo cargar la gráfica
El backend respondió con 500. Reintenta en un momento.
Wrapper Cat 2 sobre react-hook-form v7 +
@hookform/resolvers/zod. Usa
useGoyoForm(schema) con Zod resolver default, modo
onTouched, y criteriaMode: "all".
<FormField> es un wrapper sobre
Controller de RHF que pasa field +
fieldState al render prop, conectando los primitivos
Cat 1 (Input, Textarea, Select, etc.) sin que el consumer importe
Controller directamente. Sin
<FormLabel> / <FormControl> /
<FormMessage> wrappers — los primitivos Cat 1 ya
aceptan label + helper +
error directo (decisión #75 del design.md).
Form wrapper sobre react-hook-form v7 + @hookform/resolvers/zod. Usa useGoyoForm(schema) + <FormField> con render prop. Validación al blur del primer touch (mode onTouched).
Señales al usuario sobre el estado del sistema — persistentes (Alert), determinadas (Progress) o placeholders de carga (Skeleton).
Banner inline persistente — vive en la superficie
hasta resolverse. Contraste con Toast (transitorio). 4 variantes +
onDismiss opcional.
CFDI40105 — el RFC del receptor no está vigente ante el SAT.
Barra determinada con role="progressbar" + ARIA values.
4 variantes semánticas (primary / success / warning / danger) y 2
tamaños.
Placeholder con animación shimmer para estados de carga —
evita layout shift. 3 variantes (text / rectangle / circle) y count para listas.
Primitivos reusables del chrome — separadores, avatars, tabs, collapsibles, íconos y barras de navegación que se usan dentro de cualquier pantalla.
Línea divisoria horizontal o vertical. Por default decorativa (role="none") — opcionalmente semántica con
decorative= para exponer
role="separator".
Datos del emisor
Datos del receptor
Identidad visual compacta. Si falla la imagen cae a iniciales
del fallback, y sin ni src ni
fallback muestra icono genérico. 3 tamaños.
Segmented horizontal con paneles asociados — patrón WAI-ARIA APG
(tablist/tab/tabpanel).
Arrow keys navegan y seleccionan; Home/End
saltan al primero/último enabled.
Disclosure widget (CollapsibleTrigger +
CollapsibleContent) — botón con
aria-expanded/aria-controls hacia el content.
Controlled o uncontrolled.
Toolbar translúcido con 3 botones agrupados (bell, help, search) en el orden oficial del header.
Segmented control con overflow-scroll horizontal y fades en los bordes. Counts opcionales en mono tabular.
Navegación jerárquica minimal. El último item es la ruta activa y no es interactivo.
4 intents para distintos escenarios: estructural, filtrado, onboarding pendiente, y error de sistema.
Cuando emitas la primera la verás aquí.
Prueba con otro término o quita los filtros activos.
Para timbrar facturas necesitamos tu Certificado de Sello Digital.
Reintenta en unos segundos. Si persiste, avísanos.
Encabezado de cada ruta — título, meta pill y scroll tabs. Vive en el contenido, no en el shell. Acepta slots opcionales para breadcrumbs y actions cuando la ruta los requiere.
Panel productivo de notificaciones (R1 Fase 1.1 sub-PR E). Filtros Todas / Alertas / Eventos, agrupación temporal automática (Hoy / Ayer / Esta semana / Anteriores), severidades de 5 niveles y estados read/unread con dot cobre. Showcase con 9 fixtures variadas — click en cualquier fila marca leído y dispara el callback de navegación.