FesaComponents

Formularios

48 campos react-hook-form con validación integrada, cero dependencias externas y textos en español por props.

import { FormTextField, FormCurrencyField, FormDateField } from "@fesa/components/forms";

La librería de campos unificada del ecosistema (~19.000 LOC que antes existían duplicadas en fesa.com.pa y el starter). Cero dependencias externas para los editores: rich text, firma, crop de imagen, markdown y emoji picker son implementaciones propias.

El contrato base

Todos los campos comparten estas props (BaseFormFieldProps):

PropTipoRequeridaDescripción
controlControl<TFieldValues>El control de react-hook-form
nameTNameNombre tipado contra el schema
labelReactNodeEtiqueta del campo
descriptionReactNodeTexto de ayuda bajo el campo
placeholderstringPlaceholder
disabledbooleanDeshabilita el campo
requiredbooleanMarca visual de requerido
tooltipTooltipConfig | stringAyuda contextual junto al label
classNamestringClases extra

Uso mínimo

const form = useForm<z.infer<typeof schema>>({ resolver: zodResolver(schema) });

<Form {...form}>
  <form onSubmit={form.handleSubmit(onSubmit)}>
    <FormTextField control={form.control} name="name" label="Nombre" required />
    <FormCurrencyField control={form.control} name="price" label="Precio" />
    <FormSubmitButton>Guardar</FormSubmitButton>
  </form>
</Form>

Los campos por categoría

Recetas

La página de recetas de formularios cubre: formulario completo con zod + server action, wizard multipaso, listas repetibles y campos condicionales.

Catálogo vivo

El módulo form-demo de fesa.com.pa (/dashboard/form-demo) ejercita los 48 campos en una sola página — úsalo como referencia visual al elegir campo.

En esta pagina