Skip to content

Props Comunes

Todos los componentes de formulario comparten un conjunto de propiedades comunes que se pueden utilizar para personalizar su apariencia y comportamiento. Estas propiedades están definidas en BaseFieldProps y están disponibles para todos los tipos de campos.

PropiedadTipoRequeridoPor defectoDescripción
labelstringNo-El texto de la etiqueta para el campo. Puede contener HTML.
hideLabelbooleanNofalseSi se debe ocultar visualmente la etiqueta (útil para accesibilidad cuando el label se muestra de otra forma)
label_classNamestringNo-Clases CSS adicionales para la etiqueta
{
type: "text",
label: "Acepto los <a href='/terms'>términos y condiciones</a>",
// ...
}
PropiedadTipoRequeridoPor defectoDescripción
layoutFieldLayoutConfigNo-Configuración de layout del campo (anchura, orden, visibilidad)
wrapper_classNamestringNo-Clases CSS adicionales para el wrapper del campo (FormItem)

El objeto layout permite controlar el layout del campo de forma semántica:

layout: {
width?: {
mobile?: "auto" | "full" | "half" | "third";
tablet?: "auto" | "full" | "half" | "third";
desktop?: "auto" | "full" | "half" | "third";
};
order?: number;
visibility?: {
mobile?: "visible" | "hidden";
tablet?: "visible" | "hidden";
desktop?: "visible" | "hidden";
};
}

En lugar de pensar en números de columnas, piensa en términos semánticos:

  • "auto": El sistema decide automáticamente (por defecto)
  • "full": El campo ocupa todo el ancho disponible (ideal para textareas, date ranges, etc.)
  • "half": El campo ocupa la mitad del ancho (ideal para pares como nombre/apellido)
  • "third": El campo ocupa un tercio del ancho (ideal para grupos de tres)
{
type: "text",
label: "Full Name",
layout: {
width: {
mobile: "full", // Ancho completo en móvil
desktop: "half", // Mitad del ancho en desktop
}
}
}
{
type: "textarea",
label: "Biography",
layout: {
width: {
mobile: "full",
desktop: "full", // Siempre ancho completo
}
}
}

Controla el orden de visualización de los campos:

{
type: "text",
label: "First Field",
layout: {
order: 1, // Se mostrará primero
}
}

Controla la visibilidad del campo en diferentes dispositivos:

{
type: "text",
label: "Mobile Only Field",
layout: {
visibility: {
desktop: "hidden", // Oculto en desktop
}
}
}
PropiedadTipoRequeridoPor defectoDescripción
input_classNamestringNo-Clases CSS adicionales para el input/control
size"xs" | "sm" | "md" | "lg" | "xl"No"md"Tamaño del campo. Aplica a inputs, textareas y controles similares
iconReactNodeNo-Elemento React para el icono (puede ser de lucide-react, iconify, o cualquier componente)
iconPropsobjectNo-Props adicionales para el icono. Incluye className y cualquier otra prop personalizada
valueunknownNo-Valor inicial del campo. El tipo depende del tipo de campo (string, number, boolean, Date, array, etc.)
import { Mail } from "lucide-react";
{
type: "email",
label: "Email",
icon: <Mail className="w-4 h-4" />,
iconProps: {
className: "text-gray-400"
}
}
PropiedadTipoRequeridoPor defectoDescripción
schemaz.ZodType-Esquema Zod para validación. Requerido para todos los campos
error_classNamestringNo-Clases CSS adicionales para el mensaje de error
helperTextstringNo-Texto de ayuda que se muestra debajo del campo
helper_classNamestringNo-Clases CSS adicionales para el texto de ayuda
tooltipstringNo-Texto de ayuda contextual que se muestra en un tooltip al hacer hover sobre el icono de ayuda
import { z } from "zod";
{
type: "email",
label: "Email",
schema: z.string().email("Email inválido"),
helperText: "Usaremos este email para contactarte",
tooltip: "El email debe ser válido y único",
error_className: "text-red-600 font-semibold"
}
PropiedadTipoRequeridoPor defectoDescripción
hiddenboolean | ((values: Record<string, unknown>) => boolean)NofalseSi se debe ocultar el campo. Puede ser un valor booleano o una función que se evalúa dinámicamente
disabledboolean | ((values: Record<string, unknown>) => boolean)NofalseSi el campo está deshabilitado. Puede ser un valor booleano o una función que se evalúa dinámicamente
readOnlyboolean | ((values: Record<string, unknown>) => boolean)NofalseSi el campo es de solo lectura. Puede ser un valor booleano o una función que se evalúa dinámicamente
{
type: "text",
label: "Nombre completo",
// Oculto si el usuario es anónimo
hidden: (values) => values.userType === "anonymous",
// Deshabilitado si ya está verificado
disabled: (values) => values.isVerified === true,
// Solo lectura si es un campo del sistema
readOnly: (values) => values.isSystemField === true
}

Cuando se usan funciones para hidden, disabled o readOnly, estas se evalúan en cada render y tienen acceso a todos los valores actuales del formulario a través del parámetro values.

  1. schema es requerido: Todos los campos deben tener un esquema Zod definido para la validación
  2. label puede ser HTML: El label acepta HTML, útil para enlaces o texto formateado
  3. Funciones reactivas: hidden, disabled y readOnly pueden ser funciones que se re-evalúan cuando cambian los valores del formulario
  4. Layout semántico: Usa layout.width con valores semánticos ("full", "half", "third") en lugar de números de columnas
  5. Breakpoints semánticos: El sistema usa breakpoints semánticos (mobile, tablet, desktop) en lugar de breakpoints técnicos de Tailwind
  6. Iconos flexibles: El icono puede ser cualquier ReactNode, permitiendo usar cualquier librería de iconos