@mehdashti/forms 0.2.1 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +634 -0
- package/dist/index.js +788 -1
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/use-smart-form.ts","../src/form-field.tsx","../src/form-select.tsx","../src/form-checkbox.tsx","../src/form-layout.tsx","../src/form-section.tsx","../src/form-grid.tsx","../src/use-field-array.ts"],"names":["errors","jsx","Controller","jsxs","spacingClasses","columnClasses","rhfUseFieldArray"],"mappings":"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","file":"index.js","sourcesContent":["import { useForm } from 'react-hook-form'\nimport { zodResolver } from '@hookform/resolvers/zod'\nimport type { FieldValues, Path, UseFormReturn } from 'react-hook-form'\nimport type { z } from 'zod'\n\nexport interface SmartFormOptions<TFieldValues extends FieldValues = FieldValues> {\n schema: z.ZodSchema<TFieldValues>\n onSubmit: (data: TFieldValues) => void | Promise<void>\n onError?: (errors: Record<string, unknown>) => void\n realtimeValidation?: boolean\n defaultValues?: Partial<TFieldValues>\n mode?: 'onSubmit' | 'onBlur' | 'onChange' | 'onTouched' | 'all'\n}\n\n/**\n * Enhanced React Hook Form with Zod validation and smart defaults\n */\nexport function useSmartForm<TFieldValues extends FieldValues = FieldValues>(\n options: SmartFormOptions<TFieldValues>\n) {\n const { schema, onSubmit, onError, realtimeValidation = true, ...formOptions } = options\n\n const form = useForm<TFieldValues>({\n resolver: zodResolver(schema),\n mode: realtimeValidation ? 'onChange' : (formOptions.mode || 'onSubmit'),\n ...formOptions,\n })\n\n const {\n handleSubmit: rhfHandleSubmit,\n formState: { isSubmitting, errors },\n } = form\n\n const hasErrors = Object.keys(errors).length > 0\n\n const getError = (name: Path<TFieldValues>): string | undefined => {\n const error = errors[name]\n return error?.message as string | undefined\n }\n\n const handleSubmit = rhfHandleSubmit(\n async (data) => {\n try {\n await onSubmit(data)\n } catch (error) {\n if (onError) {\n onError(error as Record<string, unknown>)\n } else {\n console.error('Form submission error:', error)\n }\n }\n },\n (errors) => {\n if (onError) {\n onError(errors)\n }\n }\n )\n\n return {\n ...form,\n handleSubmit,\n isSubmitting,\n hasErrors,\n getError,\n }\n}\n\nexport type SmartFormReturn<TFieldValues extends FieldValues = FieldValues> = ReturnType<typeof useSmartForm<TFieldValues>>\n","import { Controller } from 'react-hook-form'\nimport type { FieldValues } from 'react-hook-form'\nimport type { FormFieldProps } from './form-types'\n\n/**\n * Smart Form Field component with automatic error handling\n *\n * @example\n * ```tsx\n * <FormField\n * name=\"email\"\n * label=\"Email\"\n * type=\"email\"\n * required\n * control={form.control}\n * placeholder=\"Enter your email\"\n * />\n * ```\n */\nexport function FormField<TFieldValues extends FieldValues = FieldValues>({\n name,\n label,\n type = 'text',\n placeholder,\n required = false,\n helpText,\n disabled = false,\n className,\n control,\n render,\n}: FormFieldProps<TFieldValues>) {\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState: { error } }) => (\n <div className={`space-y-2 ${className || ''}`}>\n <label htmlFor={String(name)} className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\">\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </label>\n\n {render ? (\n render(field)\n ) : (\n <input\n id={String(name)}\n type={type}\n placeholder={placeholder}\n disabled={disabled}\n className={`flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 ${\n error ? 'border-destructive' : ''\n }`}\n aria-invalid={!!error}\n {...field}\n value={field.value || ''}\n />\n )}\n\n {error && (\n <p className=\"text-sm text-destructive\">{error.message}</p>\n )}\n\n {helpText && !error && (\n <p className=\"text-xs text-muted-foreground\">{helpText}</p>\n )}\n </div>\n )}\n />\n )\n}\n","import { Controller } from 'react-hook-form'\nimport type { FieldValues } from 'react-hook-form'\nimport type { FormSelectProps } from './form-types'\n\n/**\n * Smart Form Select component\n *\n * @example\n * ```tsx\n * <FormSelect\n * name=\"country\"\n * label=\"Country\"\n * required\n * control={form.control}\n * options={[\n * { value: 'us', label: 'United States' },\n * { value: 'uk', label: 'United Kingdom' },\n * ]}\n * />\n * ```\n */\nexport function FormSelect<TFieldValues extends FieldValues = FieldValues>({\n name,\n label,\n options,\n placeholder,\n required = false,\n helpText,\n disabled = false,\n className,\n control,\n}: FormSelectProps<TFieldValues>) {\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState: { error } }) => (\n <div className={`space-y-2 ${className || ''}`}>\n <label htmlFor={String(name)} className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\">\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </label>\n\n <select\n id={String(name)}\n disabled={disabled}\n className={`flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 ${\n error ? 'border-destructive' : ''\n }`}\n aria-invalid={!!error}\n {...field}\n value={field.value || ''}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {options.map((option) => (\n <option\n key={String(option.value)}\n value={option.value}\n disabled={option.disabled}\n >\n {option.label}\n </option>\n ))}\n </select>\n\n {error && (\n <p className=\"text-sm text-destructive\">{error.message}</p>\n )}\n\n {helpText && !error && (\n <p className=\"text-xs text-muted-foreground\">{helpText}</p>\n )}\n </div>\n )}\n />\n )\n}\n","import { Controller } from 'react-hook-form'\nimport type { FieldValues } from 'react-hook-form'\nimport type { FormCheckboxProps } from './form-types'\n\n/**\n * Smart Form Checkbox component\n *\n * @example\n * ```tsx\n * <FormCheckbox\n * name=\"acceptTerms\"\n * label=\"I accept the terms and conditions\"\n * required\n * control={form.control}\n * description=\"You must accept the terms to continue\"\n * />\n * ```\n */\nexport function FormCheckbox<TFieldValues extends FieldValues = FieldValues>({\n name,\n label,\n description,\n required = false,\n helpText,\n disabled = false,\n className,\n control,\n}: FormCheckboxProps<TFieldValues>) {\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState: { error } }) => (\n <div className={`space-y-2 ${className || ''}`}>\n <div className=\"flex items-start space-x-3\">\n <input\n id={String(name)}\n type=\"checkbox\"\n disabled={disabled}\n className={`h-4 w-4 rounded border-input ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 ${\n error ? 'border-destructive' : ''\n }`}\n aria-invalid={!!error}\n checked={field.value || false}\n onChange={(e) => field.onChange(e.target.checked)}\n onBlur={field.onBlur}\n />\n <div className=\"flex-1 space-y-1 leading-none\">\n <label\n htmlFor={String(name)}\n className=\"text-sm font-medium cursor-pointer peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </label>\n {description && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n </div>\n\n {error && (\n <p className=\"text-sm text-destructive\">{error.message}</p>\n )}\n\n {helpText && !error && (\n <p className=\"text-xs text-muted-foreground\">{helpText}</p>\n )}\n </div>\n )}\n />\n )\n}\n","import * as React from 'react'\n\nexport interface FormLayoutProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Number of columns for the form layout\n * @default 1\n */\n columns?: 1 | 2 | 3 | 4\n\n /**\n * Spacing between form fields\n * @default \"md\"\n */\n spacing?: 'sm' | 'md' | 'lg'\n\n /**\n * Make the layout responsive (mobile: 1 col, tablet: 2 cols, desktop: specified cols)\n * @default true\n */\n responsive?: boolean\n}\n\nconst spacingClasses = {\n sm: 'gap-3',\n md: 'gap-4',\n lg: 'gap-6',\n}\n\nconst columnClasses = {\n responsive: {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 sm:grid-cols-2',\n 3: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3',\n 4: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-4',\n },\n fixed: {\n 1: 'grid-cols-1',\n 2: 'grid-cols-2',\n 3: 'grid-cols-3',\n 4: 'grid-cols-4',\n },\n}\n\n/**\n * FormLayout - Ready-to-use form grid layout\n *\n * @example\n * ```tsx\n * <FormLayout columns={2}>\n * <FormField name=\"firstName\" label=\"First Name\" control={form.control} />\n * <FormField name=\"lastName\" label=\"Last Name\" control={form.control} />\n * </FormLayout>\n * ```\n */\nexport function FormLayout({\n columns = 1,\n spacing = 'md',\n responsive = true,\n className = '',\n children,\n ...props\n}: FormLayoutProps) {\n const gridClasses = responsive ? columnClasses.responsive[columns] : columnClasses.fixed[columns]\n\n return (\n <div\n className={`grid ${gridClasses} ${spacingClasses[spacing]} ${className}`}\n {...props}\n >\n {children}\n </div>\n )\n}\n\nFormLayout.displayName = 'FormLayout'\n","import * as React from 'react'\n\nexport interface FormSectionProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Section title\n */\n title?: string\n\n /**\n * Section description\n */\n description?: string\n\n /**\n * Number of columns for this section\n * @default 1\n */\n columns?: 1 | 2 | 3 | 4\n\n /**\n * Spacing between fields\n * @default \"md\"\n */\n spacing?: 'sm' | 'md' | 'lg'\n}\n\nconst spacingClasses = {\n sm: 'gap-3',\n md: 'gap-4',\n lg: 'gap-6',\n}\n\nconst columnClasses = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 sm:grid-cols-2',\n 3: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3',\n 4: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-4',\n}\n\n/**\n * FormSection - Section with title and grid layout\n *\n * @example\n * ```tsx\n * <FormSection title=\"Personal Info\" description=\"Enter your details\" columns={2}>\n * <FormField name=\"name\" label=\"Name\" control={form.control} />\n * <FormField name=\"email\" label=\"Email\" control={form.control} />\n * </FormSection>\n * ```\n */\nexport function FormSection({\n title,\n description,\n columns = 1,\n spacing = 'md',\n className = '',\n children,\n ...props\n}: FormSectionProps) {\n return (\n <div className={`space-y-4 ${className}`} {...props}>\n {(title || description) && (\n <div className=\"space-y-1\">\n {title && (\n <h3 className=\"text-lg font-semibold leading-none tracking-tight\">\n {title}\n </h3>\n )}\n {description && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n )}\n <div className={`grid ${columnClasses[columns]} ${spacingClasses[spacing]}`}>\n {children}\n </div>\n </div>\n )\n}\n\nFormSection.displayName = 'FormSection'\n","import * as React from 'react'\n\nexport interface FormGridProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Spacing between items\n * @default \"md\"\n */\n spacing?: 'sm' | 'md' | 'lg'\n}\n\nexport interface FormGridItemProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Column span for the item\n * @default 1\n */\n colSpan?: 1 | 2 | 3 | 4 | 'full'\n}\n\nconst spacingClasses = {\n sm: 'gap-3',\n md: 'gap-4',\n lg: 'gap-6',\n}\n\nconst colSpanClasses = {\n 1: 'col-span-1',\n 2: 'col-span-1 sm:col-span-2',\n 3: 'col-span-1 sm:col-span-2 lg:col-span-3',\n 4: 'col-span-1 sm:col-span-2 lg:col-span-4',\n full: 'col-span-full',\n}\n\n/**\n * FormGrid - Advanced grid layout with col-span support\n *\n * @example\n * ```tsx\n * <FormGrid>\n * <FormGridItem>\n * <FormField name=\"firstName\" label=\"First Name\" control={form.control} />\n * </FormGridItem>\n * <FormGridItem>\n * <FormField name=\"lastName\" label=\"Last Name\" control={form.control} />\n * </FormGridItem>\n * <FormGridItem colSpan=\"full\">\n * <FormField name=\"bio\" label=\"Bio\" control={form.control} />\n * </FormGridItem>\n * </FormGrid>\n * ```\n */\nexport function FormGrid({\n spacing = 'md',\n className = '',\n children,\n ...props\n}: FormGridProps) {\n return (\n <div\n className={`grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 ${spacingClasses[spacing]} ${className}`}\n {...props}\n >\n {children}\n </div>\n )\n}\n\nFormGrid.displayName = 'FormGrid'\n\n/**\n * FormGridItem - Item within FormGrid with custom column span\n */\nexport function FormGridItem({\n colSpan = 1,\n className = '',\n children,\n ...props\n}: FormGridItemProps) {\n return (\n <div className={`${colSpanClasses[colSpan]} ${className}`} {...props}>\n {children}\n </div>\n )\n}\n\nFormGridItem.displayName = 'FormGridItem'\n","import { useFieldArray as rhfUseFieldArray } from 'react-hook-form'\nimport type { FieldValues, ArrayPath } from 'react-hook-form'\nimport type { UseFormReturn } from 'react-hook-form'\n\n/**\n * Field array options\n */\nexport interface FieldArrayOptions<TFieldValues extends FieldValues = FieldValues> {\n /**\n * Field array name\n */\n name: ArrayPath<TFieldValues>\n\n /**\n * Form control instance\n */\n control: UseFormReturn<TFieldValues>['control']\n\n /**\n * Default value for new items\n */\n defaultValue?: unknown\n}\n\n/**\n * Wrapper around React Hook Form's useFieldArray with smart defaults\n *\n * @example\n * ```tsx\n * const { fields, append, remove } = useSmartFieldArray({\n * name: 'items',\n * control: form.control,\n * defaultValue: { name: '', quantity: 0 }\n * })\n * ```\n */\nexport function useSmartFieldArray<TFieldValues extends FieldValues = FieldValues>({\n name,\n control,\n defaultValue,\n}: FieldArrayOptions<TFieldValues>) {\n const fieldArray = rhfUseFieldArray({\n name,\n control,\n })\n\n const { append: rhfAppend, ...rest } = fieldArray\n\n // Enhanced append with default value\n const append = (value?: unknown) => {\n rhfAppend((value || defaultValue) as never)\n }\n\n return {\n ...rest,\n append,\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/use-smart-form.ts","../src/form-field.tsx","../src/form-select.tsx","../src/form-checkbox.tsx","../src/form-textarea.tsx","../src/form-file-upload.tsx","../src/form-date-picker.tsx","../src/form-multi-select.tsx","../src/form-layout.tsx","../src/form-section.tsx","../src/form-grid.tsx","../src/form-wizard.tsx","../src/use-field-array.ts","../src/validation-schemas.ts","../src/validation-helpers.ts"],"names":["errors","jsx","Controller","jsxs","React","formatFileSize","spacingClasses","columnClasses","rhfUseFieldArray","z"],"mappings":"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","file":"index.js","sourcesContent":["import { useForm } from 'react-hook-form'\nimport { zodResolver } from '@hookform/resolvers/zod'\nimport type { FieldValues, Path, DefaultValues } from 'react-hook-form'\nimport type { z } from 'zod'\n\nexport interface SmartFormOptions<TFieldValues extends FieldValues = FieldValues> {\n schema: z.ZodSchema<TFieldValues>\n onSubmit: (data: TFieldValues) => void | Promise<void>\n onError?: (errors: Record<string, unknown>) => void\n realtimeValidation?: boolean\n defaultValues?: DefaultValues<TFieldValues>\n mode?: 'onSubmit' | 'onBlur' | 'onChange' | 'onTouched' | 'all'\n}\n\n/**\n * Enhanced React Hook Form with Zod validation and smart defaults\n */\nexport function useSmartForm<TFieldValues extends FieldValues = FieldValues>(\n options: SmartFormOptions<TFieldValues>\n) {\n const { schema, onSubmit, onError, realtimeValidation = true, ...formOptions } = options\n\n const form = useForm<TFieldValues>({\n resolver: zodResolver(schema),\n mode: realtimeValidation ? 'onChange' : (formOptions.mode || 'onSubmit'),\n ...formOptions,\n })\n\n const {\n handleSubmit: rhfHandleSubmit,\n formState: { isSubmitting, errors },\n } = form\n\n const hasErrors = Object.keys(errors).length > 0\n\n const getError = (name: Path<TFieldValues>): string | undefined => {\n const error = errors[name]\n return error?.message as string | undefined\n }\n\n const handleSubmit = rhfHandleSubmit(\n async (data) => {\n try {\n await onSubmit(data)\n } catch (error) {\n if (onError) {\n onError(error as Record<string, unknown>)\n } else {\n console.error('Form submission error:', error)\n }\n }\n },\n (errors) => {\n if (onError) {\n onError(errors)\n }\n }\n )\n\n return {\n ...form,\n handleSubmit,\n isSubmitting,\n hasErrors,\n getError,\n }\n}\n\nexport type SmartFormReturn<TFieldValues extends FieldValues = FieldValues> = ReturnType<typeof useSmartForm<TFieldValues>>\n","import { Controller } from 'react-hook-form'\nimport type { FieldValues } from 'react-hook-form'\nimport type { FormFieldProps } from './form-types'\n\n/**\n * Smart Form Field component with automatic error handling\n *\n * @example\n * ```tsx\n * <FormField\n * name=\"email\"\n * label=\"Email\"\n * type=\"email\"\n * required\n * control={form.control}\n * placeholder=\"Enter your email\"\n * />\n * ```\n */\nexport function FormField<TFieldValues extends FieldValues = FieldValues>({\n name,\n label,\n type = 'text',\n placeholder,\n required = false,\n helpText,\n disabled = false,\n className,\n control,\n render,\n}: FormFieldProps<TFieldValues>) {\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState: { error } }) => (\n <div className={`space-y-2 ${className || ''}`}>\n <label htmlFor={String(name)} className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\">\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </label>\n\n {render ? (\n render(field)\n ) : (\n <input\n id={String(name)}\n type={type}\n placeholder={placeholder}\n disabled={disabled}\n className={`flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 ${\n error ? 'border-destructive' : ''\n }`}\n aria-invalid={!!error}\n {...field}\n value={field.value || ''}\n />\n )}\n\n {error && (\n <p className=\"text-sm text-destructive\">{error.message}</p>\n )}\n\n {helpText && !error && (\n <p className=\"text-xs text-muted-foreground\">{helpText}</p>\n )}\n </div>\n )}\n />\n )\n}\n","import { Controller } from 'react-hook-form'\nimport type { FieldValues } from 'react-hook-form'\nimport type { FormSelectProps } from './form-types'\n\n/**\n * Smart Form Select component\n *\n * @example\n * ```tsx\n * <FormSelect\n * name=\"country\"\n * label=\"Country\"\n * required\n * control={form.control}\n * options={[\n * { value: 'us', label: 'United States' },\n * { value: 'uk', label: 'United Kingdom' },\n * ]}\n * />\n * ```\n */\nexport function FormSelect<TFieldValues extends FieldValues = FieldValues>({\n name,\n label,\n options,\n placeholder,\n required = false,\n helpText,\n disabled = false,\n className,\n control,\n}: FormSelectProps<TFieldValues>) {\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState: { error } }) => (\n <div className={`space-y-2 ${className || ''}`}>\n <label htmlFor={String(name)} className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\">\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </label>\n\n <select\n id={String(name)}\n disabled={disabled}\n className={`flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 ${\n error ? 'border-destructive' : ''\n }`}\n aria-invalid={!!error}\n {...field}\n value={field.value || ''}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {options.map((option) => (\n <option\n key={String(option.value)}\n value={option.value}\n disabled={option.disabled}\n >\n {option.label}\n </option>\n ))}\n </select>\n\n {error && (\n <p className=\"text-sm text-destructive\">{error.message}</p>\n )}\n\n {helpText && !error && (\n <p className=\"text-xs text-muted-foreground\">{helpText}</p>\n )}\n </div>\n )}\n />\n )\n}\n","import { Controller } from 'react-hook-form'\nimport type { FieldValues } from 'react-hook-form'\nimport type { FormCheckboxProps } from './form-types'\n\n/**\n * Smart Form Checkbox component\n *\n * @example\n * ```tsx\n * <FormCheckbox\n * name=\"acceptTerms\"\n * label=\"I accept the terms and conditions\"\n * required\n * control={form.control}\n * description=\"You must accept the terms to continue\"\n * />\n * ```\n */\nexport function FormCheckbox<TFieldValues extends FieldValues = FieldValues>({\n name,\n label,\n description,\n required = false,\n helpText,\n disabled = false,\n className,\n control,\n}: FormCheckboxProps<TFieldValues>) {\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState: { error } }) => (\n <div className={`space-y-2 ${className || ''}`}>\n <div className=\"flex items-start space-x-3\">\n <input\n id={String(name)}\n type=\"checkbox\"\n disabled={disabled}\n className={`h-4 w-4 rounded border-input ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 ${\n error ? 'border-destructive' : ''\n }`}\n aria-invalid={!!error}\n checked={field.value || false}\n onChange={(e) => field.onChange(e.target.checked)}\n onBlur={field.onBlur}\n />\n <div className=\"flex-1 space-y-1 leading-none\">\n <label\n htmlFor={String(name)}\n className=\"text-sm font-medium cursor-pointer peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </label>\n {description && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n </div>\n\n {error && (\n <p className=\"text-sm text-destructive\">{error.message}</p>\n )}\n\n {helpText && !error && (\n <p className=\"text-xs text-muted-foreground\">{helpText}</p>\n )}\n </div>\n )}\n />\n )\n}\n","import { Controller } from 'react-hook-form'\nimport type { FieldValues, Control, Path } from 'react-hook-form'\n\nexport interface FormTextareaProps<TFieldValues extends FieldValues = FieldValues> {\n name: Path<TFieldValues>\n label: string\n placeholder?: string\n required?: boolean\n helpText?: string\n disabled?: boolean\n className?: string\n control: Control<TFieldValues>\n rows?: number\n maxLength?: number\n showCharacterCount?: boolean\n resize?: 'none' | 'vertical' | 'horizontal' | 'both'\n}\n\n/**\n * Smart Form Textarea component with character counter\n *\n * @example\n * ```tsx\n * <FormTextarea\n * name=\"description\"\n * label=\"Description\"\n * control={form.control}\n * rows={4}\n * maxLength={500}\n * showCharacterCount\n * />\n * ```\n */\nexport function FormTextarea<TFieldValues extends FieldValues = FieldValues>({\n name,\n label,\n placeholder,\n required = false,\n helpText,\n disabled = false,\n className,\n control,\n rows = 4,\n maxLength,\n showCharacterCount = false,\n resize = 'vertical',\n}: FormTextareaProps<TFieldValues>) {\n const resizeClass = {\n none: 'resize-none',\n vertical: 'resize-y',\n horizontal: 'resize-x',\n both: 'resize',\n }[resize]\n\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState: { error } }) => {\n const currentLength = (field.value as string)?.length || 0\n const showCount = showCharacterCount || maxLength\n\n return (\n <div className={`space-y-2 ${className || ''}`}>\n <label\n htmlFor={String(name)}\n className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </label>\n\n <textarea\n id={String(name)}\n placeholder={placeholder}\n disabled={disabled}\n rows={rows}\n maxLength={maxLength}\n className={`flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 ${resizeClass} ${\n error ? 'border-destructive' : ''\n }`}\n aria-invalid={!!error}\n {...field}\n value={field.value || ''}\n />\n\n <div className=\"flex items-center justify-between\">\n <div className=\"flex-1\">\n {error && (\n <p className=\"text-sm text-destructive\">{error.message}</p>\n )}\n {helpText && !error && (\n <p className=\"text-xs text-muted-foreground\">{helpText}</p>\n )}\n </div>\n\n {showCount && (\n <p className=\"text-xs text-muted-foreground\">\n {currentLength}\n {maxLength && ` / ${maxLength}`}\n </p>\n )}\n </div>\n </div>\n )\n }}\n />\n )\n}\n","import * as React from 'react'\nimport { Controller } from 'react-hook-form'\nimport type { FieldValues, Control, Path } from 'react-hook-form'\n\nexport interface FormFileUploadProps<TFieldValues extends FieldValues = FieldValues> {\n name: Path<TFieldValues>\n label: string\n required?: boolean\n helpText?: string\n disabled?: boolean\n className?: string\n control: Control<TFieldValues>\n accept?: string\n multiple?: boolean\n maxSize?: number // in bytes\n showPreview?: boolean\n onFileChange?: (files: FileList | null) => void\n}\n\n/**\n * Smart Form File Upload component with preview\n *\n * @example\n * ```tsx\n * <FormFileUpload\n * name=\"avatar\"\n * label=\"Profile Picture\"\n * control={form.control}\n * accept=\"image/*\"\n * maxSize={5 * 1024 * 1024} // 5MB\n * showPreview\n * />\n * ```\n */\nexport function FormFileUpload<TFieldValues extends FieldValues = FieldValues>({\n name,\n label,\n required = false,\n helpText,\n disabled = false,\n className,\n control,\n accept,\n multiple = false,\n maxSize,\n showPreview = true,\n onFileChange,\n}: FormFileUploadProps<TFieldValues>) {\n const [previews, setPreviews] = React.useState<string[]>([])\n\n const handleFileChange = (\n files: FileList | null,\n onChange: (value: any) => void\n ) => {\n if (!files || files.length === 0) {\n setPreviews([])\n onChange(null)\n onFileChange?.(null)\n return\n }\n\n // Validate file size\n if (maxSize) {\n const invalidFiles = Array.from(files).filter((file) => file.size > maxSize)\n if (invalidFiles.length > 0) {\n alert(`Some files exceed the maximum size of ${formatFileSize(maxSize)}`)\n return\n }\n }\n\n // Generate previews for images\n if (showPreview && accept?.includes('image')) {\n const fileArray = Array.from(files)\n const newPreviews: string[] = []\n\n fileArray.forEach((file) => {\n const reader = new FileReader()\n reader.onloadend = () => {\n newPreviews.push(reader.result as string)\n if (newPreviews.length === fileArray.length) {\n setPreviews(newPreviews)\n }\n }\n reader.readAsDataURL(file)\n })\n }\n\n onChange(multiple ? files : files[0])\n onFileChange?.(files)\n }\n\n const formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 Bytes'\n const k = 1024\n const sizes = ['Bytes', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i]\n }\n\n return (\n <Controller\n name={name}\n control={control}\n render={({ field: { onChange, value, ...field }, fieldState: { error } }) => (\n <div className={`space-y-2 ${className || ''}`}>\n <label\n htmlFor={String(name)}\n className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </label>\n\n <div\n className={`flex items-center justify-center w-full ${\n error ? 'border-destructive' : ''\n }`}\n >\n <label\n htmlFor={String(name)}\n className=\"flex flex-col items-center justify-center w-full h-32 border-2 border-dashed rounded-lg cursor-pointer bg-background hover:bg-muted/50 transition-colors\"\n >\n <div className=\"flex flex-col items-center justify-center pt-5 pb-6\">\n <svg\n className=\"w-8 h-8 mb-4 text-muted-foreground\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 20 16\"\n >\n <path\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M13 13h3a3 3 0 0 0 0-6h-.025A5.56 5.56 0 0 0 16 6.5 5.5 5.5 0 0 0 5.207 5.021C5.137 5.017 5.071 5 5 5a4 4 0 0 0 0 8h2.167M10 15V6m0 0L8 8m2-2 2 2\"\n />\n </svg>\n <p className=\"mb-2 text-sm text-muted-foreground\">\n <span className=\"font-semibold\">Click to upload</span> or drag and drop\n </p>\n {accept && (\n <p className=\"text-xs text-muted-foreground\">\n {accept.split(',').join(', ')}\n </p>\n )}\n {maxSize && (\n <p className=\"text-xs text-muted-foreground\">\n Max size: {formatFileSize(maxSize)}\n </p>\n )}\n </div>\n <input\n id={String(name)}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n className=\"hidden\"\n onChange={(e) => handleFileChange(e.target.files, onChange)}\n {...field}\n />\n </label>\n </div>\n\n {/* File Preview */}\n {showPreview && previews.length > 0 && (\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-4 mt-4\">\n {previews.map((preview, index) => (\n <div key={index} className=\"relative group\">\n <img\n src={preview}\n alt={`Preview ${index + 1}`}\n className=\"w-full h-24 object-cover rounded-md border\"\n />\n <button\n type=\"button\"\n onClick={() => {\n const newPreviews = previews.filter((_, i) => i !== index)\n setPreviews(newPreviews)\n if (newPreviews.length === 0) {\n onChange(null)\n }\n }}\n className=\"absolute top-1 right-1 bg-destructive text-destructive-foreground rounded-full p-1 opacity-0 group-hover:opacity-100 transition-opacity\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* File Info */}\n {value && !showPreview && (\n <div className=\"text-sm text-muted-foreground\">\n {multiple && (value as FileList).length > 0\n ? `${(value as FileList).length} file(s) selected`\n : (value as File)?.name}\n </div>\n )}\n\n {error && (\n <p className=\"text-sm text-destructive\">{error.message}</p>\n )}\n\n {helpText && !error && (\n <p className=\"text-xs text-muted-foreground\">{helpText}</p>\n )}\n </div>\n )}\n />\n )\n}\n","import { Controller } from 'react-hook-form'\nimport type { FieldValues, Control, Path } from 'react-hook-form'\n\nexport interface FormDatePickerProps<TFieldValues extends FieldValues = FieldValues> {\n name: Path<TFieldValues>\n label: string\n placeholder?: string\n required?: boolean\n helpText?: string\n disabled?: boolean\n className?: string\n control: Control<TFieldValues>\n min?: string\n max?: string\n mode?: 'single' | 'range'\n}\n\n/**\n * Smart Form Date Picker component\n *\n * @example\n * ```tsx\n * <FormDatePicker\n * name=\"birthDate\"\n * label=\"Birth Date\"\n * control={form.control}\n * max={new Date().toISOString().split('T')[0]}\n * />\n * ```\n */\nexport function FormDatePicker<TFieldValues extends FieldValues = FieldValues>({\n name,\n label,\n placeholder,\n required = false,\n helpText,\n disabled = false,\n className,\n control,\n min,\n max,\n mode = 'single',\n}: FormDatePickerProps<TFieldValues>) {\n if (mode === 'range') {\n return (\n <FormDateRangePicker\n name={name}\n label={label}\n required={required}\n helpText={helpText}\n disabled={disabled}\n className={className}\n control={control}\n min={min}\n max={max}\n />\n )\n }\n\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState: { error } }) => (\n <div className={`space-y-2 ${className || ''}`}>\n <label\n htmlFor={String(name)}\n className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </label>\n\n <input\n id={String(name)}\n type=\"date\"\n placeholder={placeholder}\n disabled={disabled}\n min={min}\n max={max}\n className={`flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 ${\n error ? 'border-destructive' : ''\n }`}\n aria-invalid={!!error}\n {...field}\n value={field.value || ''}\n />\n\n {error && (\n <p className=\"text-sm text-destructive\">{error.message}</p>\n )}\n\n {helpText && !error && (\n <p className=\"text-xs text-muted-foreground\">{helpText}</p>\n )}\n </div>\n )}\n />\n )\n}\n\n/**\n * Form Date Range Picker component\n */\nfunction FormDateRangePicker<TFieldValues extends FieldValues = FieldValues>({\n name,\n label,\n required = false,\n helpText,\n disabled = false,\n className,\n control,\n min,\n max,\n}: Omit<FormDatePickerProps<TFieldValues>, 'mode' | 'placeholder'>) {\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState: { error } }) => {\n const range = (field.value as { from?: string; to?: string }) || {}\n\n const handleFromChange = (value: string) => {\n field.onChange({ ...range, from: value })\n }\n\n const handleToChange = (value: string) => {\n field.onChange({ ...range, to: value })\n }\n\n return (\n <div className={`space-y-2 ${className || ''}`}>\n <label className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\">\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </label>\n\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label htmlFor={`${String(name)}-from`} className=\"text-xs text-muted-foreground\">\n From\n </label>\n <input\n id={`${String(name)}-from`}\n type=\"date\"\n disabled={disabled}\n min={min}\n max={range.to || max}\n value={range.from || ''}\n onChange={(e) => handleFromChange(e.target.value)}\n className={`flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 ${\n error ? 'border-destructive' : ''\n }`}\n />\n </div>\n\n <div>\n <label htmlFor={`${String(name)}-to`} className=\"text-xs text-muted-foreground\">\n To\n </label>\n <input\n id={`${String(name)}-to`}\n type=\"date\"\n disabled={disabled}\n min={range.from || min}\n max={max}\n value={range.to || ''}\n onChange={(e) => handleToChange(e.target.value)}\n className={`flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 ${\n error ? 'border-destructive' : ''\n }`}\n />\n </div>\n </div>\n\n {error && (\n <p className=\"text-sm text-destructive\">{error.message}</p>\n )}\n\n {helpText && !error && (\n <p className=\"text-xs text-muted-foreground\">{helpText}</p>\n )}\n </div>\n )\n }}\n />\n )\n}\n","import { Controller } from 'react-hook-form'\nimport type { FieldValues, Control, Path } from 'react-hook-form'\n\nexport interface MultiSelectOption {\n value: string | number\n label: string\n disabled?: boolean\n}\n\nexport interface FormMultiSelectProps<TFieldValues extends FieldValues = FieldValues> {\n name: Path<TFieldValues>\n label: string\n options: MultiSelectOption[]\n required?: boolean\n helpText?: string\n disabled?: boolean\n className?: string\n control: Control<TFieldValues>\n layout?: 'vertical' | 'horizontal' | 'grid'\n maxSelection?: number\n}\n\n/**\n * Smart Form Multi-Select component\n *\n * @example\n * ```tsx\n * <FormMultiSelect\n * name=\"interests\"\n * label=\"Interests\"\n * control={form.control}\n * options={[\n * { value: 'sports', label: 'Sports' },\n * { value: 'music', label: 'Music' },\n * { value: 'tech', label: 'Technology' },\n * ]}\n * layout=\"grid\"\n * />\n * ```\n */\nexport function FormMultiSelect<TFieldValues extends FieldValues = FieldValues>({\n name,\n label,\n options,\n required = false,\n helpText,\n disabled = false,\n className,\n control,\n layout = 'vertical',\n maxSelection,\n}: FormMultiSelectProps<TFieldValues>) {\n const layoutClasses = {\n vertical: 'flex flex-col space-y-2',\n horizontal: 'flex flex-wrap gap-4',\n grid: 'grid grid-cols-2 sm:grid-cols-3 gap-2',\n }\n\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState: { error } }) => {\n const selectedValues = (field.value as Array<string | number>) || []\n\n const handleToggle = (optionValue: string | number) => {\n const newValues = selectedValues.includes(optionValue)\n ? selectedValues.filter((v) => v !== optionValue)\n : maxSelection && selectedValues.length >= maxSelection\n ? selectedValues\n : [...selectedValues, optionValue]\n\n field.onChange(newValues)\n }\n\n const isSelected = (optionValue: string | number) =>\n selectedValues.includes(optionValue)\n\n const isMaxReached = maxSelection !== undefined && selectedValues.length >= maxSelection\n\n return (\n <div className={`space-y-3 ${className || ''}`}>\n <label className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\">\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n {maxSelection && (\n <span className=\"ml-2 text-xs text-muted-foreground\">\n ({selectedValues.length}/{maxSelection})\n </span>\n )}\n </label>\n\n <div className={layoutClasses[layout]}>\n {options.map((option) => {\n const id = `${String(name)}-${option.value}`\n const isOptionDisabled =\n disabled ||\n option.disabled ||\n (isMaxReached && !isSelected(option.value))\n\n return (\n <label\n key={String(option.value)}\n htmlFor={id}\n className={`flex items-center space-x-2 cursor-pointer ${\n isOptionDisabled ? 'opacity-50 cursor-not-allowed' : ''\n }`}\n >\n <input\n id={id}\n type=\"checkbox\"\n checked={isSelected(option.value)}\n disabled={isOptionDisabled}\n onChange={() => handleToggle(option.value)}\n className=\"h-4 w-4 rounded border-gray-300 text-primary focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\"\n />\n <span className=\"text-sm\">{option.label}</span>\n </label>\n )\n })}\n </div>\n\n {maxSelection && isMaxReached && (\n <p className=\"text-xs text-muted-foreground\">\n Maximum {maxSelection} {maxSelection === 1 ? 'item' : 'items'} can be selected\n </p>\n )}\n\n {error && (\n <p className=\"text-sm text-destructive\">{error.message}</p>\n )}\n\n {helpText && !error && (\n <p className=\"text-xs text-muted-foreground\">{helpText}</p>\n )}\n </div>\n )\n }}\n />\n )\n}\n","import * as React from 'react'\n\nexport interface FormLayoutProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Number of columns for the form layout\n * @default 1\n */\n columns?: 1 | 2 | 3 | 4\n\n /**\n * Spacing between form fields\n * @default \"md\"\n */\n spacing?: 'sm' | 'md' | 'lg'\n\n /**\n * Make the layout responsive (mobile: 1 col, tablet: 2 cols, desktop: specified cols)\n * @default true\n */\n responsive?: boolean\n}\n\nconst spacingClasses = {\n sm: 'gap-3',\n md: 'gap-4',\n lg: 'gap-6',\n}\n\nconst columnClasses = {\n responsive: {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 sm:grid-cols-2',\n 3: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3',\n 4: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-4',\n },\n fixed: {\n 1: 'grid-cols-1',\n 2: 'grid-cols-2',\n 3: 'grid-cols-3',\n 4: 'grid-cols-4',\n },\n}\n\n/**\n * FormLayout - Ready-to-use form grid layout\n *\n * @example\n * ```tsx\n * <FormLayout columns={2}>\n * <FormField name=\"firstName\" label=\"First Name\" control={form.control} />\n * <FormField name=\"lastName\" label=\"Last Name\" control={form.control} />\n * </FormLayout>\n * ```\n */\nexport function FormLayout({\n columns = 1,\n spacing = 'md',\n responsive = true,\n className = '',\n children,\n ...props\n}: FormLayoutProps) {\n const gridClasses = responsive ? columnClasses.responsive[columns] : columnClasses.fixed[columns]\n\n return (\n <div\n className={`grid ${gridClasses} ${spacingClasses[spacing]} ${className}`}\n {...props}\n >\n {children}\n </div>\n )\n}\n\nFormLayout.displayName = 'FormLayout'\n","import * as React from 'react'\n\nexport interface FormSectionProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Section title\n */\n title?: string\n\n /**\n * Section description\n */\n description?: string\n\n /**\n * Number of columns for this section\n * @default 1\n */\n columns?: 1 | 2 | 3 | 4\n\n /**\n * Spacing between fields\n * @default \"md\"\n */\n spacing?: 'sm' | 'md' | 'lg'\n}\n\nconst spacingClasses = {\n sm: 'gap-3',\n md: 'gap-4',\n lg: 'gap-6',\n}\n\nconst columnClasses = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 sm:grid-cols-2',\n 3: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3',\n 4: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-4',\n}\n\n/**\n * FormSection - Section with title and grid layout\n *\n * @example\n * ```tsx\n * <FormSection title=\"Personal Info\" description=\"Enter your details\" columns={2}>\n * <FormField name=\"name\" label=\"Name\" control={form.control} />\n * <FormField name=\"email\" label=\"Email\" control={form.control} />\n * </FormSection>\n * ```\n */\nexport function FormSection({\n title,\n description,\n columns = 1,\n spacing = 'md',\n className = '',\n children,\n ...props\n}: FormSectionProps) {\n return (\n <div className={`space-y-4 ${className}`} {...props}>\n {(title || description) && (\n <div className=\"space-y-1\">\n {title && (\n <h3 className=\"text-lg font-semibold leading-none tracking-tight\">\n {title}\n </h3>\n )}\n {description && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n )}\n <div className={`grid ${columnClasses[columns]} ${spacingClasses[spacing]}`}>\n {children}\n </div>\n </div>\n )\n}\n\nFormSection.displayName = 'FormSection'\n","import * as React from 'react'\n\nexport interface FormGridProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Spacing between items\n * @default \"md\"\n */\n spacing?: 'sm' | 'md' | 'lg'\n}\n\nexport interface FormGridItemProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Column span for the item\n * @default 1\n */\n colSpan?: 1 | 2 | 3 | 4 | 'full'\n}\n\nconst spacingClasses = {\n sm: 'gap-3',\n md: 'gap-4',\n lg: 'gap-6',\n}\n\nconst colSpanClasses = {\n 1: 'col-span-1',\n 2: 'col-span-1 sm:col-span-2',\n 3: 'col-span-1 sm:col-span-2 lg:col-span-3',\n 4: 'col-span-1 sm:col-span-2 lg:col-span-4',\n full: 'col-span-full',\n}\n\n/**\n * FormGrid - Advanced grid layout with col-span support\n *\n * @example\n * ```tsx\n * <FormGrid>\n * <FormGridItem>\n * <FormField name=\"firstName\" label=\"First Name\" control={form.control} />\n * </FormGridItem>\n * <FormGridItem>\n * <FormField name=\"lastName\" label=\"Last Name\" control={form.control} />\n * </FormGridItem>\n * <FormGridItem colSpan=\"full\">\n * <FormField name=\"bio\" label=\"Bio\" control={form.control} />\n * </FormGridItem>\n * </FormGrid>\n * ```\n */\nexport function FormGrid({\n spacing = 'md',\n className = '',\n children,\n ...props\n}: FormGridProps) {\n return (\n <div\n className={`grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 ${spacingClasses[spacing]} ${className}`}\n {...props}\n >\n {children}\n </div>\n )\n}\n\nFormGrid.displayName = 'FormGrid'\n\n/**\n * FormGridItem - Item within FormGrid with custom column span\n */\nexport function FormGridItem({\n colSpan = 1,\n className = '',\n children,\n ...props\n}: FormGridItemProps) {\n return (\n <div className={`${colSpanClasses[colSpan]} ${className}`} {...props}>\n {children}\n </div>\n )\n}\n\nFormGridItem.displayName = 'FormGridItem'\n","/**\n * Form Wizard Component\n *\n * Multi-step form with navigation and validation.\n */\n\nimport * as React from 'react'\n\nexport interface FormWizardStep {\n title: string\n description?: string\n content: React.ReactNode\n onValidate?: () => boolean | Promise<boolean>\n}\n\nexport interface FormWizardProps {\n steps: FormWizardStep[]\n onComplete: () => void | Promise<void>\n onCancel?: () => void\n className?: string\n showStepNumbers?: boolean\n}\n\n/**\n * Form Wizard component for multi-step forms\n *\n * @example\n * ```tsx\n * <FormWizard\n * steps={[\n * {\n * title: 'Personal Info',\n * content: <PersonalInfoForm />,\n * onValidate: () => form.trigger(['name', 'email']),\n * },\n * {\n * title: 'Address',\n * content: <AddressForm />,\n * },\n * ]}\n * onComplete={() => form.handleSubmit(onSubmit)()}\n * />\n * ```\n */\nexport function FormWizard({\n steps,\n onComplete,\n onCancel,\n className,\n showStepNumbers = true,\n}: FormWizardProps) {\n const [currentStep, setCurrentStep] = React.useState(0)\n const [isValidating, setIsValidating] = React.useState(false)\n const [isCompleting, setIsCompleting] = React.useState(false)\n\n const isFirstStep = currentStep === 0\n const isLastStep = currentStep === steps.length - 1\n\n const handleNext = async () => {\n const step = steps[currentStep]\n\n if (step.onValidate) {\n setIsValidating(true)\n try {\n const isValid = await step.onValidate()\n if (!isValid) {\n setIsValidating(false)\n return\n }\n } catch (error) {\n console.error('Validation error:', error)\n setIsValidating(false)\n return\n }\n setIsValidating(false)\n }\n\n if (isLastStep) {\n setIsCompleting(true)\n try {\n await onComplete()\n } finally {\n setIsCompleting(false)\n }\n } else {\n setCurrentStep((prev) => prev + 1)\n }\n }\n\n const handleBack = () => {\n if (!isFirstStep) {\n setCurrentStep((prev) => prev - 1)\n }\n }\n\n const handleStepClick = (stepIndex: number) => {\n // Only allow going back to previous steps\n if (stepIndex < currentStep) {\n setCurrentStep(stepIndex)\n }\n }\n\n return (\n <div className={`space-y-8 ${className || ''}`}>\n {/* Stepper */}\n <nav aria-label=\"Progress\">\n <ol className=\"flex items-center justify-between\">\n {steps.map((step, index) => {\n const isActive = index === currentStep\n const isCompleted = index < currentStep\n const isClickable = index < currentStep\n\n return (\n <li\n key={index}\n className={`flex items-center ${\n index !== steps.length - 1 ? 'flex-1' : ''\n }`}\n >\n <button\n type=\"button\"\n onClick={() => isClickable && handleStepClick(index)}\n disabled={!isClickable}\n className={`flex items-center space-x-3 ${\n isClickable ? 'cursor-pointer' : 'cursor-default'\n }`}\n >\n <div\n className={`flex h-10 w-10 items-center justify-center rounded-full border-2 transition-colors ${\n isActive\n ? 'border-primary bg-primary text-primary-foreground'\n : isCompleted\n ? 'border-primary bg-primary text-primary-foreground'\n : 'border-muted-foreground text-muted-foreground'\n }`}\n >\n {isCompleted ? (\n <svg\n className=\"h-5 w-5\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n ) : showStepNumbers ? (\n <span>{index + 1}</span>\n ) : null}\n </div>\n <div className=\"hidden sm:block text-left\">\n <p\n className={`text-sm font-medium ${\n isActive ? 'text-foreground' : 'text-muted-foreground'\n }`}\n >\n {step.title}\n </p>\n {step.description && (\n <p className=\"text-xs text-muted-foreground\">\n {step.description}\n </p>\n )}\n </div>\n </button>\n\n {index !== steps.length - 1 && (\n <div\n className={`mx-2 h-0.5 flex-1 transition-colors ${\n isCompleted ? 'bg-primary' : 'bg-muted'\n }`}\n />\n )}\n </li>\n )\n })}\n </ol>\n </nav>\n\n {/* Step Content */}\n <div className=\"mt-8\">{steps[currentStep].content}</div>\n\n {/* Navigation */}\n <div className=\"flex justify-between pt-6 border-t\">\n <div>\n {onCancel && (\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-10 px-4 py-2\"\n >\n Cancel\n </button>\n )}\n </div>\n\n <div className=\"flex space-x-2\">\n {!isFirstStep && (\n <button\n type=\"button\"\n onClick={handleBack}\n disabled={isValidating || isCompleting}\n className=\"inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-10 px-4 py-2\"\n >\n Back\n </button>\n )}\n\n <button\n type=\"button\"\n onClick={handleNext}\n disabled={isValidating || isCompleting}\n className=\"inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary/90 h-10 px-4 py-2\"\n >\n {isValidating || isCompleting\n ? 'Loading...'\n : isLastStep\n ? 'Complete'\n : 'Next'}\n </button>\n </div>\n </div>\n </div>\n )\n}\n","import { useFieldArray as rhfUseFieldArray } from 'react-hook-form'\nimport type { FieldValues, ArrayPath } from 'react-hook-form'\nimport type { UseFormReturn } from 'react-hook-form'\n\n/**\n * Field array options\n */\nexport interface FieldArrayOptions<TFieldValues extends FieldValues = FieldValues> {\n /**\n * Field array name\n */\n name: ArrayPath<TFieldValues>\n\n /**\n * Form control instance\n */\n control: UseFormReturn<TFieldValues>['control']\n\n /**\n * Default value for new items\n */\n defaultValue?: unknown\n}\n\n/**\n * Wrapper around React Hook Form's useFieldArray with smart defaults\n *\n * @example\n * ```tsx\n * const { fields, append, remove } = useSmartFieldArray({\n * name: 'items',\n * control: form.control,\n * defaultValue: { name: '', quantity: 0 }\n * })\n * ```\n */\nexport function useSmartFieldArray<TFieldValues extends FieldValues = FieldValues>({\n name,\n control,\n defaultValue,\n}: FieldArrayOptions<TFieldValues>) {\n const fieldArray = rhfUseFieldArray({\n name,\n control,\n })\n\n const { append: rhfAppend, ...rest } = fieldArray\n\n // Enhanced append with default value\n const append = (value?: unknown) => {\n rhfAppend((value || defaultValue) as never)\n }\n\n return {\n ...rest,\n append,\n }\n}\n","/**\n * Common Validation Schemas\n *\n * Reusable Zod schemas for common validation patterns.\n */\n\nimport { z } from 'zod'\n\n/**\n * Email validation schema\n */\nexport const emailSchema = z\n .string()\n .min(1, 'Email is required')\n .email('Invalid email address')\n\n/**\n * Password validation schema\n * At least 8 characters, 1 uppercase, 1 lowercase, 1 number\n */\nexport const passwordSchema = z\n .string()\n .min(8, 'Password must be at least 8 characters')\n .regex(/[A-Z]/, 'Password must contain at least one uppercase letter')\n .regex(/[a-z]/, 'Password must contain at least one lowercase letter')\n .regex(/[0-9]/, 'Password must contain at least one number')\n\n/**\n * Strong password validation schema\n * At least 12 characters, 1 uppercase, 1 lowercase, 1 number, 1 special character\n */\nexport const strongPasswordSchema = z\n .string()\n .min(12, 'Password must be at least 12 characters')\n .regex(/[A-Z]/, 'Password must contain at least one uppercase letter')\n .regex(/[a-z]/, 'Password must contain at least one lowercase letter')\n .regex(/[0-9]/, 'Password must contain at least one number')\n .regex(/[^A-Za-z0-9]/, 'Password must contain at least one special character')\n\n/**\n * Phone number validation schema (international format)\n */\nexport const phoneSchema = z\n .string()\n .min(1, 'Phone number is required')\n .regex(/^\\+?[1-9]\\d{1,14}$/, 'Invalid phone number format')\n\n/**\n * URL validation schema\n */\nexport const urlSchema = z\n .string()\n .min(1, 'URL is required')\n .url('Invalid URL format')\n\n/**\n * Username validation schema\n * 3-20 characters, alphanumeric and underscores only\n */\nexport const usernameSchema = z\n .string()\n .min(3, 'Username must be at least 3 characters')\n .max(20, 'Username must be at most 20 characters')\n .regex(/^[a-zA-Z0-9_]+$/, 'Username can only contain letters, numbers, and underscores')\n\n/**\n * Slug validation schema\n * Lowercase letters, numbers, and hyphens only\n */\nexport const slugSchema = z\n .string()\n .min(1, 'Slug is required')\n .regex(/^[a-z0-9-]+$/, 'Slug can only contain lowercase letters, numbers, and hyphens')\n\n/**\n * Positive number schema\n */\nexport const positiveNumberSchema = z\n .number()\n .positive('Must be a positive number')\n\n/**\n * Positive integer schema\n */\nexport const positiveIntegerSchema = z\n .number()\n .int('Must be an integer')\n .positive('Must be a positive number')\n\n/**\n * Price schema (two decimal places)\n */\nexport const priceSchema = z\n .number()\n .nonnegative('Price cannot be negative')\n .multipleOf(0.01, 'Price can have at most 2 decimal places')\n\n/**\n * Percentage schema (0-100)\n */\nexport const percentageSchema = z\n .number()\n .min(0, 'Percentage must be at least 0')\n .max(100, 'Percentage cannot exceed 100')\n\n/**\n * Date string schema (ISO format)\n */\nexport const dateStringSchema = z\n .string()\n .min(1, 'Date is required')\n .regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Date must be in YYYY-MM-DD format')\n\n/**\n * Future date schema\n */\nexport const futureDateSchema = z\n .string()\n .refine((date) => new Date(date) > new Date(), {\n message: 'Date must be in the future',\n })\n\n/**\n * Past date schema\n */\nexport const pastDateSchema = z\n .string()\n .refine((date) => new Date(date) < new Date(), {\n message: 'Date must be in the past',\n })\n\n/**\n * File size validation helper\n */\nexport const createFileSizeSchema = (maxSizeInBytes: number, message?: string) =>\n z.instanceof(File).refine((file) => file.size <= maxSizeInBytes, {\n message: message || `File size must be less than ${formatFileSize(maxSizeInBytes)}`,\n })\n\n/**\n * File type validation helper\n */\nexport const createFileTypeSchema = (allowedTypes: string[], message?: string) =>\n z.instanceof(File).refine((file) => allowedTypes.includes(file.type), {\n message: message || `File type must be one of: ${allowedTypes.join(', ')}`,\n })\n\n/**\n * Image file schema (common image types, max 5MB)\n */\nexport const imageFileSchema = z\n .instanceof(File)\n .refine((file) => file.size <= 5 * 1024 * 1024, {\n message: 'Image must be less than 5MB',\n })\n .refine(\n (file) => ['image/jpeg', 'image/jpg', 'image/png', 'image/webp', 'image/gif'].includes(file.type),\n {\n message: 'File must be an image (JPEG, PNG, WebP, or GIF)',\n }\n )\n\n/**\n * Confirm password schema helper\n */\nexport const createConfirmPasswordSchema = (passwordField: string) =>\n z.object({\n [passwordField]: z.string(),\n confirmPassword: z.string(),\n }).refine((data) => data[passwordField] === data.confirmPassword, {\n message: 'Passwords do not match',\n path: ['confirmPassword'],\n })\n\n/**\n * Optional email schema (can be empty or valid email)\n */\nexport const optionalEmailSchema = z.union([\n z.string().length(0),\n emailSchema,\n])\n\n/**\n * Optional URL schema\n */\nexport const optionalUrlSchema = z.union([\n z.string().length(0),\n urlSchema,\n])\n\n// Helper function\nfunction formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes'\n const k = 1024\n const sizes = ['Bytes', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i]\n}\n","/**\n * Validation Helper Utilities\n *\n * Helper functions for common validation patterns.\n */\n\nimport { z, type ZodTypeAny } from 'zod'\nimport type { FieldErrors } from 'react-hook-form'\n\n/**\n * Get error message from field errors\n */\nexport function getErrorMessage(\n errors: FieldErrors,\n fieldName: string\n): string | undefined {\n const fieldError = errors[fieldName]\n if (!fieldError) return undefined\n if (typeof fieldError.message === 'string') return fieldError.message\n return 'Invalid value'\n}\n\n/**\n * Check if field has error\n */\nexport function hasError(errors: FieldErrors, fieldName: string): boolean {\n return !!errors[fieldName]\n}\n\n/**\n * Get all error messages as array\n */\nexport function getAllErrors(errors: FieldErrors): string[] {\n const messages: string[] = []\n\n Object.keys(errors).forEach((key) => {\n const error = errors[key]\n if (error && typeof error.message === 'string') {\n messages.push(error.message)\n }\n })\n\n return messages\n}\n\n/**\n * Create a conditional schema based on another field\n *\n * @example\n * ```ts\n * const schema = z.object({\n * type: z.enum(['individual', 'company']),\n * companyName: conditionalSchema(\n * 'type',\n * (type) => type === 'company',\n * z.string().min(1, 'Company name is required')\n * ),\n * })\n * ```\n */\nexport function conditionalSchema<T extends ZodTypeAny>(\n _dependentField: string,\n _condition: (value: any) => boolean,\n schema: T\n): ZodTypeAny {\n return z.any().superRefine((value, ctx) => {\n const parent = ctx.path[ctx.path.length - 2]\n if (!parent) return\n\n // This is a simplified version - in real use, you'd access the form data\n // through the validation context\n return schema.parse(value)\n })\n}\n\n/**\n * Create min/max length message\n */\nexport function lengthMessage(\n field: string,\n min?: number,\n max?: number\n): string {\n if (min && max) {\n return `${field} must be between ${min} and ${max} characters`\n }\n if (min) {\n return `${field} must be at least ${min} characters`\n }\n if (max) {\n return `${field} must be at most ${max} characters`\n }\n return `Invalid ${field.toLowerCase()}`\n}\n\n/**\n * Create required field message\n */\nexport function requiredMessage(field: string): string {\n return `${field} is required`\n}\n\n/**\n * Create invalid format message\n */\nexport function invalidFormatMessage(field: string): string {\n return `Invalid ${field.toLowerCase()} format`\n}\n\n/**\n * Validate credit card using Luhn algorithm\n */\nexport function validateCreditCard(cardNumber: string): boolean {\n const sanitized = cardNumber.replace(/\\s/g, '')\n if (!/^\\d+$/.test(sanitized)) return false\n\n let sum = 0\n let isEven = false\n\n for (let i = sanitized.length - 1; i >= 0; i--) {\n let digit = parseInt(sanitized[i], 10)\n\n if (isEven) {\n digit *= 2\n if (digit > 9) {\n digit -= 9\n }\n }\n\n sum += digit\n isEven = !isEven\n }\n\n return sum % 10 === 0\n}\n\n/**\n * Validate IBAN (International Bank Account Number)\n */\nexport function validateIBAN(iban: string): boolean {\n const sanitized = iban.replace(/\\s/g, '').toUpperCase()\n if (!/^[A-Z]{2}\\d{2}[A-Z0-9]+$/.test(sanitized)) return false\n if (sanitized.length < 15 || sanitized.length > 34) return false\n\n const rearranged = sanitized.slice(4) + sanitized.slice(0, 4)\n const numeric = rearranged.replace(/[A-Z]/g, (char) =>\n String(char.charCodeAt(0) - 55)\n )\n\n let remainder = numeric\n while (remainder.length > 2) {\n const block = remainder.slice(0, 9)\n remainder = (parseInt(block, 10) % 97) + remainder.slice(block.length)\n }\n\n return parseInt(remainder, 10) % 97 === 1\n}\n\n/**\n * Validate strong password requirements\n */\nexport function validatePasswordStrength(password: string): {\n isStrong: boolean\n missingRequirements: string[]\n} {\n const requirements = []\n\n if (password.length < 12) {\n requirements.push('At least 12 characters')\n }\n if (!/[A-Z]/.test(password)) {\n requirements.push('One uppercase letter')\n }\n if (!/[a-z]/.test(password)) {\n requirements.push('One lowercase letter')\n }\n if (!/[0-9]/.test(password)) {\n requirements.push('One number')\n }\n if (!/[^A-Za-z0-9]/.test(password)) {\n requirements.push('One special character')\n }\n\n return {\n isStrong: requirements.length === 0,\n missingRequirements: requirements,\n }\n}\n\n/**\n * Sanitize string input (remove HTML, trim, normalize whitespace)\n */\nexport function sanitizeString(input: string): string {\n return input\n .replace(/<[^>]*>/g, '') // Remove HTML tags\n .replace(/\\s+/g, ' ') // Normalize whitespace\n .trim()\n}\n\n/**\n * Validate file extension\n */\nexport function validateFileExtension(\n filename: string,\n allowedExtensions: string[]\n): boolean {\n const extension = filename.split('.').pop()?.toLowerCase()\n return extension ? allowedExtensions.includes(extension) : false\n}\n\n/**\n * Format validation error for display\n */\nexport function formatValidationError(error: z.ZodError): Record<string, string> {\n const formatted: Record<string, string> = {}\n\n error.errors.forEach((err) => {\n const path = err.path.join('.')\n formatted[path] = err.message\n })\n\n return formatted\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mehdashti/forms",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Form validation and management for Smart Platform",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
"peerDependencies": {
|
|
24
24
|
"react": "^18.0.0 || ^19.0.0",
|
|
25
25
|
"react-dom": "^18.0.0 || ^19.0.0",
|
|
26
|
-
"@mehdashti/ui": "
|
|
27
|
-
"@mehdashti/contracts": "
|
|
26
|
+
"@mehdashti/ui": "workspace:^",
|
|
27
|
+
"@mehdashti/contracts": "workspace:^"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@types/react": "^18.3.18",
|