@mehdashti/forms 0.3.0 → 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.
@@ -0,0 +1,634 @@
1
+ import * as react_hook_form from 'react-hook-form';
2
+ import { FieldValues, DefaultValues, Path, UseFormReturn, Control, ArrayPath, FieldErrors } from 'react-hook-form';
3
+ export { FieldErrors, FieldValues, Path, PathValue } from 'react-hook-form';
4
+ import { z, ZodTypeAny } from 'zod';
5
+ export { z } from 'zod';
6
+ import * as react_jsx_runtime from 'react/jsx-runtime';
7
+ import * as React$1 from 'react';
8
+
9
+ interface SmartFormOptions<TFieldValues extends FieldValues = FieldValues> {
10
+ schema: z.ZodSchema<TFieldValues>;
11
+ onSubmit: (data: TFieldValues) => void | Promise<void>;
12
+ onError?: (errors: Record<string, unknown>) => void;
13
+ realtimeValidation?: boolean;
14
+ defaultValues?: DefaultValues<TFieldValues>;
15
+ mode?: 'onSubmit' | 'onBlur' | 'onChange' | 'onTouched' | 'all';
16
+ }
17
+ /**
18
+ * Enhanced React Hook Form with Zod validation and smart defaults
19
+ */
20
+ declare function useSmartForm<TFieldValues extends FieldValues = FieldValues>(options: SmartFormOptions<TFieldValues>): {
21
+ handleSubmit: (e?: React.BaseSyntheticEvent) => Promise<void>;
22
+ isSubmitting: boolean;
23
+ hasErrors: boolean;
24
+ getError: (name: Path<TFieldValues>) => string | undefined;
25
+ watch: react_hook_form.UseFormWatch<TFieldValues>;
26
+ getValues: react_hook_form.UseFormGetValues<TFieldValues>;
27
+ getFieldState: react_hook_form.UseFormGetFieldState<TFieldValues>;
28
+ setError: react_hook_form.UseFormSetError<TFieldValues>;
29
+ clearErrors: react_hook_form.UseFormClearErrors<TFieldValues>;
30
+ setValue: react_hook_form.UseFormSetValue<TFieldValues>;
31
+ trigger: react_hook_form.UseFormTrigger<TFieldValues>;
32
+ formState: react_hook_form.FormState<TFieldValues>;
33
+ resetField: react_hook_form.UseFormResetField<TFieldValues>;
34
+ reset: react_hook_form.UseFormReset<TFieldValues>;
35
+ unregister: react_hook_form.UseFormUnregister<TFieldValues>;
36
+ control: react_hook_form.Control<TFieldValues, any, TFieldValues>;
37
+ register: react_hook_form.UseFormRegister<TFieldValues>;
38
+ setFocus: react_hook_form.UseFormSetFocus<TFieldValues>;
39
+ subscribe: react_hook_form.UseFormSubscribe<TFieldValues>;
40
+ };
41
+ type SmartFormReturn<TFieldValues extends FieldValues = FieldValues> = ReturnType<typeof useSmartForm<TFieldValues>>;
42
+
43
+ /**
44
+ * Form field component props
45
+ */
46
+ interface FormFieldProps<TFieldValues extends FieldValues = FieldValues> {
47
+ name: Path<TFieldValues>;
48
+ label: string;
49
+ type?: 'text' | 'email' | 'password' | 'number' | 'tel' | 'url';
50
+ placeholder?: string;
51
+ required?: boolean;
52
+ helpText?: string;
53
+ disabled?: boolean;
54
+ className?: string;
55
+ control: UseFormReturn<TFieldValues>['control'];
56
+ render?: (field: {
57
+ value: unknown;
58
+ onChange: (...event: unknown[]) => void;
59
+ onBlur: () => void;
60
+ name: string;
61
+ }) => React.ReactElement;
62
+ }
63
+ /**
64
+ * Select field option
65
+ */
66
+ interface SelectOption {
67
+ label: string;
68
+ value: string | number;
69
+ disabled?: boolean;
70
+ }
71
+ /**
72
+ * Select field component props
73
+ */
74
+ interface FormSelectProps<TFieldValues extends FieldValues = FieldValues> extends Omit<FormFieldProps<TFieldValues>, 'type' | 'placeholder'> {
75
+ options: SelectOption[];
76
+ placeholder?: string;
77
+ }
78
+ /**
79
+ * Checkbox field component props
80
+ */
81
+ interface FormCheckboxProps<TFieldValues extends FieldValues = FieldValues> extends Omit<FormFieldProps<TFieldValues>, 'type' | 'placeholder'> {
82
+ description?: string;
83
+ }
84
+
85
+ /**
86
+ * Smart Form Field component with automatic error handling
87
+ *
88
+ * @example
89
+ * ```tsx
90
+ * <FormField
91
+ * name="email"
92
+ * label="Email"
93
+ * type="email"
94
+ * required
95
+ * control={form.control}
96
+ * placeholder="Enter your email"
97
+ * />
98
+ * ```
99
+ */
100
+ declare function FormField<TFieldValues extends FieldValues = FieldValues>({ name, label, type, placeholder, required, helpText, disabled, className, control, render, }: FormFieldProps<TFieldValues>): react_jsx_runtime.JSX.Element;
101
+
102
+ /**
103
+ * Smart Form Select component
104
+ *
105
+ * @example
106
+ * ```tsx
107
+ * <FormSelect
108
+ * name="country"
109
+ * label="Country"
110
+ * required
111
+ * control={form.control}
112
+ * options={[
113
+ * { value: 'us', label: 'United States' },
114
+ * { value: 'uk', label: 'United Kingdom' },
115
+ * ]}
116
+ * />
117
+ * ```
118
+ */
119
+ declare function FormSelect<TFieldValues extends FieldValues = FieldValues>({ name, label, options, placeholder, required, helpText, disabled, className, control, }: FormSelectProps<TFieldValues>): react_jsx_runtime.JSX.Element;
120
+
121
+ /**
122
+ * Smart Form Checkbox component
123
+ *
124
+ * @example
125
+ * ```tsx
126
+ * <FormCheckbox
127
+ * name="acceptTerms"
128
+ * label="I accept the terms and conditions"
129
+ * required
130
+ * control={form.control}
131
+ * description="You must accept the terms to continue"
132
+ * />
133
+ * ```
134
+ */
135
+ declare function FormCheckbox<TFieldValues extends FieldValues = FieldValues>({ name, label, description, required, helpText, disabled, className, control, }: FormCheckboxProps<TFieldValues>): react_jsx_runtime.JSX.Element;
136
+
137
+ interface FormTextareaProps<TFieldValues extends FieldValues = FieldValues> {
138
+ name: Path<TFieldValues>;
139
+ label: string;
140
+ placeholder?: string;
141
+ required?: boolean;
142
+ helpText?: string;
143
+ disabled?: boolean;
144
+ className?: string;
145
+ control: Control<TFieldValues>;
146
+ rows?: number;
147
+ maxLength?: number;
148
+ showCharacterCount?: boolean;
149
+ resize?: 'none' | 'vertical' | 'horizontal' | 'both';
150
+ }
151
+ /**
152
+ * Smart Form Textarea component with character counter
153
+ *
154
+ * @example
155
+ * ```tsx
156
+ * <FormTextarea
157
+ * name="description"
158
+ * label="Description"
159
+ * control={form.control}
160
+ * rows={4}
161
+ * maxLength={500}
162
+ * showCharacterCount
163
+ * />
164
+ * ```
165
+ */
166
+ declare function FormTextarea<TFieldValues extends FieldValues = FieldValues>({ name, label, placeholder, required, helpText, disabled, className, control, rows, maxLength, showCharacterCount, resize, }: FormTextareaProps<TFieldValues>): react_jsx_runtime.JSX.Element;
167
+
168
+ interface FormFileUploadProps<TFieldValues extends FieldValues = FieldValues> {
169
+ name: Path<TFieldValues>;
170
+ label: string;
171
+ required?: boolean;
172
+ helpText?: string;
173
+ disabled?: boolean;
174
+ className?: string;
175
+ control: Control<TFieldValues>;
176
+ accept?: string;
177
+ multiple?: boolean;
178
+ maxSize?: number;
179
+ showPreview?: boolean;
180
+ onFileChange?: (files: FileList | null) => void;
181
+ }
182
+ /**
183
+ * Smart Form File Upload component with preview
184
+ *
185
+ * @example
186
+ * ```tsx
187
+ * <FormFileUpload
188
+ * name="avatar"
189
+ * label="Profile Picture"
190
+ * control={form.control}
191
+ * accept="image/*"
192
+ * maxSize={5 * 1024 * 1024} // 5MB
193
+ * showPreview
194
+ * />
195
+ * ```
196
+ */
197
+ declare function FormFileUpload<TFieldValues extends FieldValues = FieldValues>({ name, label, required, helpText, disabled, className, control, accept, multiple, maxSize, showPreview, onFileChange, }: FormFileUploadProps<TFieldValues>): react_jsx_runtime.JSX.Element;
198
+
199
+ interface FormDatePickerProps<TFieldValues extends FieldValues = FieldValues> {
200
+ name: Path<TFieldValues>;
201
+ label: string;
202
+ placeholder?: string;
203
+ required?: boolean;
204
+ helpText?: string;
205
+ disabled?: boolean;
206
+ className?: string;
207
+ control: Control<TFieldValues>;
208
+ min?: string;
209
+ max?: string;
210
+ mode?: 'single' | 'range';
211
+ }
212
+ /**
213
+ * Smart Form Date Picker component
214
+ *
215
+ * @example
216
+ * ```tsx
217
+ * <FormDatePicker
218
+ * name="birthDate"
219
+ * label="Birth Date"
220
+ * control={form.control}
221
+ * max={new Date().toISOString().split('T')[0]}
222
+ * />
223
+ * ```
224
+ */
225
+ declare function FormDatePicker<TFieldValues extends FieldValues = FieldValues>({ name, label, placeholder, required, helpText, disabled, className, control, min, max, mode, }: FormDatePickerProps<TFieldValues>): react_jsx_runtime.JSX.Element;
226
+
227
+ interface MultiSelectOption {
228
+ value: string | number;
229
+ label: string;
230
+ disabled?: boolean;
231
+ }
232
+ interface FormMultiSelectProps<TFieldValues extends FieldValues = FieldValues> {
233
+ name: Path<TFieldValues>;
234
+ label: string;
235
+ options: MultiSelectOption[];
236
+ required?: boolean;
237
+ helpText?: string;
238
+ disabled?: boolean;
239
+ className?: string;
240
+ control: Control<TFieldValues>;
241
+ layout?: 'vertical' | 'horizontal' | 'grid';
242
+ maxSelection?: number;
243
+ }
244
+ /**
245
+ * Smart Form Multi-Select component
246
+ *
247
+ * @example
248
+ * ```tsx
249
+ * <FormMultiSelect
250
+ * name="interests"
251
+ * label="Interests"
252
+ * control={form.control}
253
+ * options={[
254
+ * { value: 'sports', label: 'Sports' },
255
+ * { value: 'music', label: 'Music' },
256
+ * { value: 'tech', label: 'Technology' },
257
+ * ]}
258
+ * layout="grid"
259
+ * />
260
+ * ```
261
+ */
262
+ declare function FormMultiSelect<TFieldValues extends FieldValues = FieldValues>({ name, label, options, required, helpText, disabled, className, control, layout, maxSelection, }: FormMultiSelectProps<TFieldValues>): react_jsx_runtime.JSX.Element;
263
+
264
+ interface FormLayoutProps extends React$1.HTMLAttributes<HTMLDivElement> {
265
+ /**
266
+ * Number of columns for the form layout
267
+ * @default 1
268
+ */
269
+ columns?: 1 | 2 | 3 | 4;
270
+ /**
271
+ * Spacing between form fields
272
+ * @default "md"
273
+ */
274
+ spacing?: 'sm' | 'md' | 'lg';
275
+ /**
276
+ * Make the layout responsive (mobile: 1 col, tablet: 2 cols, desktop: specified cols)
277
+ * @default true
278
+ */
279
+ responsive?: boolean;
280
+ }
281
+ /**
282
+ * FormLayout - Ready-to-use form grid layout
283
+ *
284
+ * @example
285
+ * ```tsx
286
+ * <FormLayout columns={2}>
287
+ * <FormField name="firstName" label="First Name" control={form.control} />
288
+ * <FormField name="lastName" label="Last Name" control={form.control} />
289
+ * </FormLayout>
290
+ * ```
291
+ */
292
+ declare function FormLayout({ columns, spacing, responsive, className, children, ...props }: FormLayoutProps): react_jsx_runtime.JSX.Element;
293
+ declare namespace FormLayout {
294
+ var displayName: string;
295
+ }
296
+
297
+ interface FormSectionProps extends React$1.HTMLAttributes<HTMLDivElement> {
298
+ /**
299
+ * Section title
300
+ */
301
+ title?: string;
302
+ /**
303
+ * Section description
304
+ */
305
+ description?: string;
306
+ /**
307
+ * Number of columns for this section
308
+ * @default 1
309
+ */
310
+ columns?: 1 | 2 | 3 | 4;
311
+ /**
312
+ * Spacing between fields
313
+ * @default "md"
314
+ */
315
+ spacing?: 'sm' | 'md' | 'lg';
316
+ }
317
+ /**
318
+ * FormSection - Section with title and grid layout
319
+ *
320
+ * @example
321
+ * ```tsx
322
+ * <FormSection title="Personal Info" description="Enter your details" columns={2}>
323
+ * <FormField name="name" label="Name" control={form.control} />
324
+ * <FormField name="email" label="Email" control={form.control} />
325
+ * </FormSection>
326
+ * ```
327
+ */
328
+ declare function FormSection({ title, description, columns, spacing, className, children, ...props }: FormSectionProps): react_jsx_runtime.JSX.Element;
329
+ declare namespace FormSection {
330
+ var displayName: string;
331
+ }
332
+
333
+ interface FormGridProps extends React$1.HTMLAttributes<HTMLDivElement> {
334
+ /**
335
+ * Spacing between items
336
+ * @default "md"
337
+ */
338
+ spacing?: 'sm' | 'md' | 'lg';
339
+ }
340
+ interface FormGridItemProps extends React$1.HTMLAttributes<HTMLDivElement> {
341
+ /**
342
+ * Column span for the item
343
+ * @default 1
344
+ */
345
+ colSpan?: 1 | 2 | 3 | 4 | 'full';
346
+ }
347
+ /**
348
+ * FormGrid - Advanced grid layout with col-span support
349
+ *
350
+ * @example
351
+ * ```tsx
352
+ * <FormGrid>
353
+ * <FormGridItem>
354
+ * <FormField name="firstName" label="First Name" control={form.control} />
355
+ * </FormGridItem>
356
+ * <FormGridItem>
357
+ * <FormField name="lastName" label="Last Name" control={form.control} />
358
+ * </FormGridItem>
359
+ * <FormGridItem colSpan="full">
360
+ * <FormField name="bio" label="Bio" control={form.control} />
361
+ * </FormGridItem>
362
+ * </FormGrid>
363
+ * ```
364
+ */
365
+ declare function FormGrid({ spacing, className, children, ...props }: FormGridProps): react_jsx_runtime.JSX.Element;
366
+ declare namespace FormGrid {
367
+ var displayName: string;
368
+ }
369
+ /**
370
+ * FormGridItem - Item within FormGrid with custom column span
371
+ */
372
+ declare function FormGridItem({ colSpan, className, children, ...props }: FormGridItemProps): react_jsx_runtime.JSX.Element;
373
+ declare namespace FormGridItem {
374
+ var displayName: string;
375
+ }
376
+
377
+ interface FormWizardStep {
378
+ title: string;
379
+ description?: string;
380
+ content: React$1.ReactNode;
381
+ onValidate?: () => boolean | Promise<boolean>;
382
+ }
383
+ interface FormWizardProps {
384
+ steps: FormWizardStep[];
385
+ onComplete: () => void | Promise<void>;
386
+ onCancel?: () => void;
387
+ className?: string;
388
+ showStepNumbers?: boolean;
389
+ }
390
+ /**
391
+ * Form Wizard component for multi-step forms
392
+ *
393
+ * @example
394
+ * ```tsx
395
+ * <FormWizard
396
+ * steps={[
397
+ * {
398
+ * title: 'Personal Info',
399
+ * content: <PersonalInfoForm />,
400
+ * onValidate: () => form.trigger(['name', 'email']),
401
+ * },
402
+ * {
403
+ * title: 'Address',
404
+ * content: <AddressForm />,
405
+ * },
406
+ * ]}
407
+ * onComplete={() => form.handleSubmit(onSubmit)()}
408
+ * />
409
+ * ```
410
+ */
411
+ declare function FormWizard({ steps, onComplete, onCancel, className, showStepNumbers, }: FormWizardProps): react_jsx_runtime.JSX.Element;
412
+
413
+ /**
414
+ * Field array options
415
+ */
416
+ interface FieldArrayOptions<TFieldValues extends FieldValues = FieldValues> {
417
+ /**
418
+ * Field array name
419
+ */
420
+ name: ArrayPath<TFieldValues>;
421
+ /**
422
+ * Form control instance
423
+ */
424
+ control: UseFormReturn<TFieldValues>['control'];
425
+ /**
426
+ * Default value for new items
427
+ */
428
+ defaultValue?: unknown;
429
+ }
430
+ /**
431
+ * Wrapper around React Hook Form's useFieldArray with smart defaults
432
+ *
433
+ * @example
434
+ * ```tsx
435
+ * const { fields, append, remove } = useSmartFieldArray({
436
+ * name: 'items',
437
+ * control: form.control,
438
+ * defaultValue: { name: '', quantity: 0 }
439
+ * })
440
+ * ```
441
+ */
442
+ declare function useSmartFieldArray<TFieldValues extends FieldValues = FieldValues>({ name, control, defaultValue, }: FieldArrayOptions<TFieldValues>): {
443
+ append: (value?: unknown) => void;
444
+ swap: react_hook_form.UseFieldArraySwap;
445
+ move: react_hook_form.UseFieldArrayMove;
446
+ prepend: react_hook_form.UseFieldArrayPrepend<TFieldValues, ArrayPath<TFieldValues>>;
447
+ remove: react_hook_form.UseFieldArrayRemove;
448
+ insert: react_hook_form.UseFieldArrayInsert<TFieldValues, ArrayPath<TFieldValues>>;
449
+ update: react_hook_form.UseFieldArrayUpdate<TFieldValues, ArrayPath<TFieldValues>>;
450
+ replace: react_hook_form.UseFieldArrayReplace<TFieldValues, ArrayPath<TFieldValues>>;
451
+ fields: react_hook_form.FieldArrayWithId<TFieldValues, ArrayPath<TFieldValues>, "id">[];
452
+ };
453
+
454
+ /**
455
+ * Common Validation Schemas
456
+ *
457
+ * Reusable Zod schemas for common validation patterns.
458
+ */
459
+
460
+ /**
461
+ * Email validation schema
462
+ */
463
+ declare const emailSchema: z.ZodString;
464
+ /**
465
+ * Password validation schema
466
+ * At least 8 characters, 1 uppercase, 1 lowercase, 1 number
467
+ */
468
+ declare const passwordSchema: z.ZodString;
469
+ /**
470
+ * Strong password validation schema
471
+ * At least 12 characters, 1 uppercase, 1 lowercase, 1 number, 1 special character
472
+ */
473
+ declare const strongPasswordSchema: z.ZodString;
474
+ /**
475
+ * Phone number validation schema (international format)
476
+ */
477
+ declare const phoneSchema: z.ZodString;
478
+ /**
479
+ * URL validation schema
480
+ */
481
+ declare const urlSchema: z.ZodString;
482
+ /**
483
+ * Username validation schema
484
+ * 3-20 characters, alphanumeric and underscores only
485
+ */
486
+ declare const usernameSchema: z.ZodString;
487
+ /**
488
+ * Slug validation schema
489
+ * Lowercase letters, numbers, and hyphens only
490
+ */
491
+ declare const slugSchema: z.ZodString;
492
+ /**
493
+ * Positive number schema
494
+ */
495
+ declare const positiveNumberSchema: z.ZodNumber;
496
+ /**
497
+ * Positive integer schema
498
+ */
499
+ declare const positiveIntegerSchema: z.ZodNumber;
500
+ /**
501
+ * Price schema (two decimal places)
502
+ */
503
+ declare const priceSchema: z.ZodNumber;
504
+ /**
505
+ * Percentage schema (0-100)
506
+ */
507
+ declare const percentageSchema: z.ZodNumber;
508
+ /**
509
+ * Date string schema (ISO format)
510
+ */
511
+ declare const dateStringSchema: z.ZodString;
512
+ /**
513
+ * Future date schema
514
+ */
515
+ declare const futureDateSchema: z.ZodEffects<z.ZodString, string, string>;
516
+ /**
517
+ * Past date schema
518
+ */
519
+ declare const pastDateSchema: z.ZodEffects<z.ZodString, string, string>;
520
+ /**
521
+ * File size validation helper
522
+ */
523
+ declare const createFileSizeSchema: (maxSizeInBytes: number, message?: string) => z.ZodEffects<z.ZodType<File, z.ZodTypeDef, File>, File, File>;
524
+ /**
525
+ * File type validation helper
526
+ */
527
+ declare const createFileTypeSchema: (allowedTypes: string[], message?: string) => z.ZodEffects<z.ZodType<File, z.ZodTypeDef, File>, File, File>;
528
+ /**
529
+ * Image file schema (common image types, max 5MB)
530
+ */
531
+ declare const imageFileSchema: z.ZodEffects<z.ZodEffects<z.ZodType<File, z.ZodTypeDef, File>, File, File>, File, File>;
532
+ /**
533
+ * Confirm password schema helper
534
+ */
535
+ declare const createConfirmPasswordSchema: (passwordField: string) => z.ZodEffects<z.ZodObject<{
536
+ [x: string]: z.ZodString;
537
+ confirmPassword: z.ZodString;
538
+ }, "strip", z.ZodTypeAny, {
539
+ [x: string]: string;
540
+ confirmPassword?: unknown;
541
+ }, {
542
+ [x: string]: string;
543
+ confirmPassword?: unknown;
544
+ }>, {
545
+ [x: string]: string;
546
+ confirmPassword?: unknown;
547
+ }, {
548
+ [x: string]: string;
549
+ confirmPassword?: unknown;
550
+ }>;
551
+ /**
552
+ * Optional email schema (can be empty or valid email)
553
+ */
554
+ declare const optionalEmailSchema: z.ZodUnion<[z.ZodString, z.ZodString]>;
555
+ /**
556
+ * Optional URL schema
557
+ */
558
+ declare const optionalUrlSchema: z.ZodUnion<[z.ZodString, z.ZodString]>;
559
+
560
+ /**
561
+ * Validation Helper Utilities
562
+ *
563
+ * Helper functions for common validation patterns.
564
+ */
565
+
566
+ /**
567
+ * Get error message from field errors
568
+ */
569
+ declare function getErrorMessage(errors: FieldErrors, fieldName: string): string | undefined;
570
+ /**
571
+ * Check if field has error
572
+ */
573
+ declare function hasError(errors: FieldErrors, fieldName: string): boolean;
574
+ /**
575
+ * Get all error messages as array
576
+ */
577
+ declare function getAllErrors(errors: FieldErrors): string[];
578
+ /**
579
+ * Create a conditional schema based on another field
580
+ *
581
+ * @example
582
+ * ```ts
583
+ * const schema = z.object({
584
+ * type: z.enum(['individual', 'company']),
585
+ * companyName: conditionalSchema(
586
+ * 'type',
587
+ * (type) => type === 'company',
588
+ * z.string().min(1, 'Company name is required')
589
+ * ),
590
+ * })
591
+ * ```
592
+ */
593
+ declare function conditionalSchema<T extends ZodTypeAny>(_dependentField: string, _condition: (value: any) => boolean, schema: T): ZodTypeAny;
594
+ /**
595
+ * Create min/max length message
596
+ */
597
+ declare function lengthMessage(field: string, min?: number, max?: number): string;
598
+ /**
599
+ * Create required field message
600
+ */
601
+ declare function requiredMessage(field: string): string;
602
+ /**
603
+ * Create invalid format message
604
+ */
605
+ declare function invalidFormatMessage(field: string): string;
606
+ /**
607
+ * Validate credit card using Luhn algorithm
608
+ */
609
+ declare function validateCreditCard(cardNumber: string): boolean;
610
+ /**
611
+ * Validate IBAN (International Bank Account Number)
612
+ */
613
+ declare function validateIBAN(iban: string): boolean;
614
+ /**
615
+ * Validate strong password requirements
616
+ */
617
+ declare function validatePasswordStrength(password: string): {
618
+ isStrong: boolean;
619
+ missingRequirements: string[];
620
+ };
621
+ /**
622
+ * Sanitize string input (remove HTML, trim, normalize whitespace)
623
+ */
624
+ declare function sanitizeString(input: string): string;
625
+ /**
626
+ * Validate file extension
627
+ */
628
+ declare function validateFileExtension(filename: string, allowedExtensions: string[]): boolean;
629
+ /**
630
+ * Format validation error for display
631
+ */
632
+ declare function formatValidationError(error: z.ZodError): Record<string, string>;
633
+
634
+ export { type FieldArrayOptions, FormCheckbox, type FormCheckboxProps, FormDatePicker, type FormDatePickerProps, FormField, type FormFieldProps, FormFileUpload, type FormFileUploadProps, FormGrid, FormGridItem, type FormGridItemProps, type FormGridProps, FormLayout, type FormLayoutProps, FormMultiSelect, type FormMultiSelectProps, FormSection, type FormSectionProps, FormSelect, type FormSelectProps, FormTextarea, type FormTextareaProps, FormWizard, type FormWizardProps, type FormWizardStep, type MultiSelectOption, type SelectOption, type SmartFormOptions, type SmartFormReturn, conditionalSchema, createConfirmPasswordSchema, createFileSizeSchema, createFileTypeSchema, dateStringSchema, emailSchema, formatValidationError, futureDateSchema, getAllErrors, getErrorMessage, hasError, imageFileSchema, invalidFormatMessage, lengthMessage, optionalEmailSchema, optionalUrlSchema, passwordSchema, pastDateSchema, percentageSchema, phoneSchema, positiveIntegerSchema, positiveNumberSchema, priceSchema, requiredMessage, sanitizeString, slugSchema, strongPasswordSchema, urlSchema, useSmartFieldArray, useSmartForm, usernameSchema, validateCreditCard, validateFileExtension, validateIBAN, validatePasswordStrength };
package/dist/index.js CHANGED
@@ -455,7 +455,6 @@ function FormDatePicker({
455
455
  {
456
456
  name,
457
457
  label,
458
- placeholder,
459
458
  required,
460
459
  helpText,
461
460
  disabled,
@@ -603,7 +602,7 @@ function FormMultiSelect({
603
602
  field.onChange(newValues);
604
603
  };
605
604
  const isSelected = (optionValue) => selectedValues.includes(optionValue);
606
- const isMaxReached = maxSelection && selectedValues.length >= maxSelection;
605
+ const isMaxReached = maxSelection !== void 0 && selectedValues.length >= maxSelection;
607
606
  return /* @__PURE__ */ jsxs("div", { className: `space-y-3 ${className || ""}`, children: [
608
607
  /* @__PURE__ */ jsxs("label", { className: "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70", children: [
609
608
  label,
@@ -1002,7 +1001,7 @@ function getAllErrors(errors) {
1002
1001
  });
1003
1002
  return messages;
1004
1003
  }
1005
- function conditionalSchema(dependentField, condition, schema) {
1004
+ function conditionalSchema(_dependentField, _condition, schema) {
1006
1005
  return z.any().superRefine((value, ctx) => {
1007
1006
  const parent = ctx.path[ctx.path.length - 2];
1008
1007
  if (!parent) return;
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-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, 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'\nimport { 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 * as React from 'react'\nimport { 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 placeholder={placeholder}\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 * as React from 'react'\nimport { 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 max Selection?: 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 && 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"]}
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.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",