@page-speed/forms 0.4.2 → 0.4.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/inputs/TextInput.tsx","../src/inputs/TextArea.tsx","../src/utils.ts","../src/inputs/Checkbox.tsx","../src/inputs/CheckboxGroup.tsx","../src/inputs/Radio.tsx","../src/inputs/Select.tsx","../src/inputs/FileInput.tsx","../src/inputs/DatePicker.tsx","../src/inputs/TimePicker.tsx","../src/inputs/DateRangePicker.tsx","../src/inputs/RichTextEditor.tsx"],"names":["React","React2","twMerge","clsx","React3","React4","React5","React6","React7","error","crop","zoom","croppedAreaPixels","date","React8","disabled","React9","formatDate","isDateInArray","React10","React11","value"],"mappings":"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","file":"inputs.cjs","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\n\n/**\n * TextInput - High-performance text input component\n *\n * A lightweight, accessible text input with error state support.\n * Designed to work seamlessly with useForm and Field components.\n *\n * Features:\n * - Full accessibility support\n * - Error state styling\n * - Controlled input behavior\n * - All native input attributes supported\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { email: '' } });\n *\n * <TextInput\n * {...form.getFieldProps('email')}\n * type=\"email\"\n * placeholder=\"Enter your email\"\n * error={!!form.errors.email}\n * aria-invalid={!!form.errors.email}\n * aria-describedby={form.errors.email ? 'email-error' : undefined}\n * />\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/text-input\n */\nexport function TextInput({\n name,\n value,\n onChange,\n onBlur,\n placeholder,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n type = \"text\",\n id = \"text\",\n ...props\n}: InputProps<string> & {\n type?: \"text\" | \"email\" | \"password\" | \"url\" | \"tel\" | \"search\";\n}) {\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.value);\n };\n\n const handleBlur = () => {\n onBlur?.();\n };\n\n const baseClassName = \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\";\n const errorClassName = error ? \"border-red-500 ring-1 ring-red-500\" : \"\";\n const combinedClassName = `${baseClassName} ${errorClassName} ${className}`.trim();\n\n return (\n <input\n type={type}\n id={id}\n name={name}\n value={value ?? \"\"}\n onChange={handleChange}\n onBlur={handleBlur}\n placeholder={placeholder}\n disabled={disabled}\n required={required}\n className={combinedClassName}\n aria-invalid={error || props[\"aria-invalid\"]}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n {...props}\n />\n );\n}\n\nTextInput.displayName = \"TextInput\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\n\n/**\n * Additional props specific to TextArea\n */\nexport interface TextAreaProps extends Omit<InputProps<string>, \"onChange\"> {\n /**\n * Number of visible text rows\n * @default 3\n */\n rows?: number;\n\n /**\n * Number of visible text columns (characters)\n */\n cols?: number;\n\n /**\n * Maximum character length\n */\n maxLength?: number;\n\n /**\n * Minimum character length\n */\n minLength?: number;\n\n /**\n * Text wrapping behavior\n * - soft: text wraps but newlines not submitted (default)\n * - hard: text wraps and newlines submitted (requires cols)\n * - off: no wrapping\n */\n wrap?: \"soft\" | \"hard\" | \"off\";\n\n /**\n * Change handler\n */\n onChange: (value: string) => void;\n\n /**\n * Additional native textarea attributes\n */\n [key: string]: any;\n}\n\n/**\n * TextArea - High-performance multi-line text input component\n *\n * A lightweight, accessible textarea with error state support.\n * Designed to work seamlessly with useForm and Field components.\n *\n * Features:\n * - Full accessibility support\n * - Error state styling\n * - Controlled input behavior\n * - Configurable rows and columns\n * - Text wrapping options\n * - Character length validation\n * - All native textarea attributes supported\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { bio: '' } });\n *\n * <TextArea\n * {...form.getFieldProps('bio')}\n * rows={5}\n * placeholder=\"Tell us about yourself\"\n * error={!!form.errors.bio}\n * aria-invalid={!!form.errors.bio}\n * aria-describedby={form.errors.bio ? 'bio-error' : undefined}\n * />\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/textarea\n */\nexport function TextArea({\n name,\n value,\n onChange,\n onBlur,\n placeholder,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n rows = 3,\n cols,\n maxLength,\n minLength,\n wrap = \"soft\",\n ...props\n}: TextAreaProps) {\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n onChange(e.target.value);\n };\n\n const handleBlur = () => {\n onBlur?.();\n };\n\n const baseClassName = \"flex min-h-20 w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\";\n const errorClassName = error ? \"border-red-500 ring-1 ring-red-500\" : \"\";\n const combinedClassName = `${baseClassName} ${errorClassName} ${className}`.trim();\n\n return (\n <textarea\n name={name}\n value={value ?? \"\"}\n onChange={handleChange}\n onBlur={handleBlur}\n placeholder={placeholder}\n disabled={disabled}\n required={required}\n className={combinedClassName}\n rows={rows}\n cols={cols}\n maxLength={maxLength}\n minLength={minLength}\n wrap={wrap}\n aria-invalid={error || props[\"aria-invalid\"]}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n {...props}\n />\n );\n}\n\nTextArea.displayName = \"TextArea\";\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\nimport { cn } from \"../utils\";\n\n/**\n * Additional props specific to Checkbox\n */\nexport interface CheckboxProps extends Omit<\n InputProps<boolean>,\n \"onChange\" | \"placeholder\"\n> {\n /**\n * Change handler - receives boolean checked state\n */\n onChange: (checked: boolean) => void;\n\n /**\n * Indeterminate state for partial selections\n * Useful for \"select all\" checkboxes with some items selected\n * @default false\n */\n indeterminate?: boolean;\n\n /**\n * Label text for the checkbox (primary text)\n */\n label?: React.ReactNode;\n\n /**\n * Optional description text below the label (secondary text)\n */\n description?: React.ReactNode;\n\n /**\n * Layout variant\n */\n checkboxVariant?: \"boxed\" | \"inline\";\n\n /**\n * Additional native input attributes\n */\n [key: string]: any;\n}\n\n/**\n * Checkbox - High-performance boolean input component\n *\n * A lightweight, accessible checkbox with error state support.\n * Designed to work seamlessly with useForm and Field components.\n *\n * Features:\n * - Full accessibility support (ARIA attributes)\n * - Error state styling\n * - Controlled input behavior\n * - Indeterminate state support\n * - Optional label and description text (with nil guards)\n * - Proper field-based layout structure\n * - All native checkbox attributes supported\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { terms: false } });\n *\n * <Checkbox\n * {...form.getFieldProps('terms')}\n * label=\"I agree to the terms and conditions\"\n * description=\"By clicking this checkbox, you agree to the terms.\"\n * error={!!form.errors.terms}\n * aria-describedby={form.errors.terms ? 'terms-error' : undefined}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // With indeterminate state\n * <Checkbox\n * name=\"selectAll\"\n * value={allSelected}\n * onChange={handleSelectAll}\n * indeterminate={someSelected}\n * label=\"Select all items\"\n * />\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/checkbox\n */\nexport function Checkbox({\n name,\n value,\n onChange,\n onBlur,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n indeterminate = false,\n label,\n description,\n checkboxVariant = \"boxed\",\n ...props\n}: CheckboxProps) {\n const inputRef = React.useRef<HTMLInputElement>(null);\n const checkboxId = props.id || `checkbox-${name}`;\n\n // Set indeterminate state on the native input element\n React.useEffect(() => {\n if (inputRef.current) {\n inputRef.current.indeterminate = indeterminate;\n }\n }, [indeterminate]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.checked);\n };\n\n const handleBlur = () => {\n onBlur?.();\n };\n\n const isActive = value || (indeterminate && !value);\n\n const checkbox = (\n <div\n className={cn(\n \"relative inline-flex items-center justify-center\",\n !label && className,\n )}\n >\n <input\n ref={inputRef}\n type=\"checkbox\"\n id={checkboxId}\n name={name}\n checked={value}\n onChange={handleChange}\n onBlur={handleBlur}\n disabled={disabled}\n required={required}\n className=\"peer sr-only\"\n aria-invalid={error || props[\"aria-invalid\"]}\n aria-describedby={\n description ? `${checkboxId}-description` : props[\"aria-describedby\"]\n }\n aria-required={required || props[\"aria-required\"]}\n {...props}\n />\n <div\n className={cn(\n \"flex shrink-0 items-center justify-center rounded-full border-2 transition-colors size-6\",\n !error && isActive && \"border-primary bg-primary text-primary-foreground\",\n !error && !isActive && \"border-input bg-transparent\",\n error && isActive && \"border-destructive bg-destructive text-destructive-foreground\",\n error && !isActive && \"border-destructive bg-transparent\",\n disabled && \"opacity-50\",\n \"peer-focus-visible:ring-2 peer-focus-visible:ring-ring/50 peer-focus-visible:ring-offset-1\",\n )}\n >\n {value && (\n <svg\n className=\"size-3.5\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )}\n {indeterminate && !value && (\n <svg\n className=\"size-3.5\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n )}\n </div>\n </div>\n );\n\n if (label) {\n return (\n <label\n className={cn(\n \"w-full h-full flex gap-3 p-3 duration-200\",\n checkboxVariant === \"boxed\" && \"border rounded-lg hover:ring-2\",\n checkboxVariant === \"boxed\" && value && \"ring-2\",\n disabled\n ? \"opacity-50 cursor-not-allowed hover:ring-0\"\n : \"cursor-pointer\",\n className,\n )}\n htmlFor={checkboxId}\n >\n <div className=\"flex w-full flex-row gap-2\">\n {checkbox}\n <div className=\"flex flex-col gap-0.5\">\n <div className=\"text-sm font-medium\">{label}</div>\n {description && (\n <p\n className=\"text-xs opacity-75\"\n id={`${checkboxId}-description`}\n >\n {description}\n </p>\n )}\n </div>\n </div>\n </label>\n );\n }\n\n return checkbox;\n}\n\nCheckbox.displayName = \"Checkbox\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\nimport { cn } from \"../utils\";\nimport { Checkbox } from \"./Checkbox\";\n\n/**\n * CheckboxGroup option type\n */\nexport interface CheckboxGroupOption {\n /**\n * The value for this checkbox option\n */\n value: string;\n\n /**\n * Display label for the option\n */\n label: React.ReactNode;\n\n /**\n * Optional description text below the label\n */\n description?: React.ReactNode;\n\n /**\n * Whether this option is disabled\n */\n disabled?: boolean;\n}\n\n/**\n * Additional props specific to CheckboxGroup\n */\nexport interface CheckboxGroupProps extends Omit<\n InputProps<string[]>,\n \"onChange\" | \"placeholder\"\n> {\n /**\n * Change handler - receives array of selected values\n */\n onChange: (values: string[]) => void;\n\n /**\n * Array of checkbox options\n */\n options: CheckboxGroupOption[];\n\n /**\n * Layout direction\n * @default \"stacked\"\n */\n layout?: \"inline\" | \"stacked\" | \"grid\";\n\n /**\n * Group-level label\n */\n label?: React.ReactNode;\n\n /**\n * Group-level description\n */\n description?: React.ReactNode;\n\n /**\n * Show \"select all\" checkbox\n * @default false\n */\n showSelectAll?: boolean;\n\n /**\n * Label for the select all checkbox\n * @default \"Select all\"\n */\n selectAllLabel?: string;\n\n /**\n * Minimum number of selections required\n */\n minSelections?: number;\n\n /**\n * Maximum number of selections allowed\n */\n maxSelections?: number;\n\n /**\n * Custom render function for options\n */\n renderOption?: (option: CheckboxGroupOption) => React.ReactNode;\n\n /**\n * Grid columns (only applies when layout=\"grid\")\n * @default 2\n */\n gridColumns?: number;\n\n /**\n * Additional native input attributes\n */\n [key: string]: any;\n}\n\n/**\n * CheckboxGroup - High-performance multiple selection component\n *\n * A lightweight, accessible checkbox group with error state support.\n * Designed to work seamlessly with useForm and Field components.\n *\n * Features:\n * - Full accessibility support (ARIA attributes, role=\"group\")\n * - Error state styling\n * - Controlled input behavior\n * - Multiple layout options (inline, stacked, grid)\n * - Optional \"select all\" checkbox\n * - Individual option disabled state\n * - Minimum/maximum selection validation\n * - Custom option rendering\n * - Optional descriptions for each option\n * - All native checkbox attributes supported\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { interests: [] } });\n *\n * <CheckboxGroup\n * {...form.getFieldProps('interests')}\n * label=\"Select your interests\"\n * options={[\n * { value: 'sports', label: 'Sports', description: 'Football, Basketball, etc.' },\n * { value: 'music', label: 'Music', description: 'All genres' },\n * { value: 'reading', label: 'Reading', description: 'Books and articles' }\n * ]}\n * showSelectAll\n * error={!!form.errors.interests}\n * aria-describedby={form.errors.interests ? 'interests-error' : undefined}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Grid layout with min/max selections\n * <CheckboxGroup\n * name=\"features\"\n * value={features}\n * onChange={handleFeaturesChange}\n * layout=\"grid\"\n * gridColumns={3}\n * minSelections={1}\n * maxSelections={3}\n * label=\"Select 1-3 features\"\n * options={[\n * { value: 'ssl', label: 'SSL Certificate' },\n * { value: 'cdn', label: 'CDN' },\n * { value: 'backup', label: 'Daily Backups' },\n * { value: 'support', label: '24/7 Support' }\n * ]}\n * />\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/checkbox-group\n */\nexport function CheckboxGroup({\n name,\n value = [],\n onChange,\n onBlur,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n layout = \"stacked\",\n label,\n description,\n options,\n showSelectAll = false,\n selectAllLabel = \"Select all\",\n minSelections,\n maxSelections,\n renderOption,\n gridColumns = 2,\n ...props\n}: CheckboxGroupProps) {\n // Calculate select all state\n const enabledOptions = options.filter((opt) => !opt.disabled);\n const enabledValues = enabledOptions.map((opt) => opt.value);\n const selectedEnabledCount = value.filter((v) =>\n enabledValues.includes(v),\n ).length;\n const allSelected = selectedEnabledCount === enabledOptions.length;\n const someSelected = selectedEnabledCount > 0 && !allSelected;\n\n const checkboxVariant: \"boxed\" | \"inline\" = React.useMemo(() => {\n if (options.some((opt) => opt.description)) {\n return \"boxed\";\n }\n return \"inline\";\n }, [options]);\n\n const countableValue: number = React.useMemo(() => {\n if (value?.length > 0) {\n return value.length;\n }\n return 0;\n }, [value]);\n\n // Handle individual checkbox change\n const handleChange = (optionValue: string, checked: boolean) => {\n const newValues = checked\n ? [...value, optionValue]\n : value.filter((v) => v !== optionValue);\n\n // Enforce max selections\n if (maxSelections && checked && newValues.length > maxSelections) {\n return;\n }\n\n onChange(newValues);\n };\n\n // Handle select all change\n const handleSelectAll = (checked: boolean) => {\n if (checked) {\n // Select all enabled options\n const allValues = enabledOptions.map((opt) => opt.value);\n onChange(allValues);\n } else {\n // Deselect all\n onChange([]);\n }\n };\n\n const handleBlur = () => {\n onBlur?.();\n };\n\n // Determine if max selections reached\n const maxReached = Boolean(maxSelections && countableValue >= maxSelections);\n\n const containerClass = cn(\n \"w-full gap-3\",\n layout === \"stacked\" && \"flex flex-col\",\n layout === \"inline\" && \"flex flex-row flex-wrap\",\n layout === \"grid\" && \"grid\",\n className,\n );\n\n return (\n <div\n className={containerClass}\n role=\"group\"\n aria-invalid={error || props[\"aria-invalid\"]}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n aria-label={typeof label === \"string\" ? label : props[\"aria-label\"]}\n style={\n layout === \"grid\"\n ? {\n gridTemplateColumns: `repeat(${gridColumns}, 1fr)`,\n }\n : undefined\n }\n >\n {label && <div className=\"text-sm font-medium\">{label}</div>}\n {description && (\n <div className=\"text-muted-foreground text-sm\">{description}</div>\n )}\n\n {/* Select All Checkbox */}\n {showSelectAll && enabledOptions.length > 0 && (\n <Checkbox\n name={`${name}-select-all`}\n id={`${name}-select-all`}\n value={allSelected}\n onChange={handleSelectAll}\n onBlur={handleBlur}\n indeterminate={someSelected}\n label={selectAllLabel}\n checkboxVariant=\"inline\"\n disabled={disabled}\n aria-label={selectAllLabel}\n />\n )}\n\n {/* Individual Checkboxes */}\n {options.map((option) => {\n const isChecked = value.includes(option.value);\n const isDisabled =\n disabled || option.disabled || (maxReached && !isChecked);\n\n return (\n <Checkbox\n key={option.value}\n name={name}\n id={`${name}-${option.value}`}\n value={isChecked}\n onChange={(checked) => handleChange(option.value, checked)}\n onBlur={handleBlur}\n disabled={isDisabled}\n required={\n required && minSelections\n ? value.length < minSelections\n : false\n }\n error={error}\n label={renderOption ? renderOption(option) : option.label}\n description={renderOption ? undefined : option.description}\n checkboxVariant={checkboxVariant}\n />\n );\n })}\n\n {/* Selection count feedback */}\n {(minSelections || maxSelections) && (\n <div\n className={cn(\n \"text-sm p-2 rounded-lg border font-semibold mt-2\",\n minSelections && countableValue < minSelections\n ? \"border-destructive bg-destructive/80 text-destructive-foreground\"\n : \"border-border bg-card text-card-foreground\",\n )}\n aria-live=\"polite\"\n >\n {minSelections && countableValue < minSelections && (\n <span>\n Select at least {minSelections} option\n {minSelections !== 1 ? \"s\" : \"\"}\n </span>\n )}\n {maxSelections && (\n <span>\n {countableValue}/{maxSelections} selected\n </span>\n )}\n </div>\n )}\n </div>\n );\n}\n\nCheckboxGroup.displayName = \"CheckboxGroup\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\nimport { cn } from \"../utils\";\n\n/**\n * Radio option type\n */\nexport interface RadioOption {\n /**\n * The value for this radio option\n */\n value: string;\n\n /**\n * Display label for the option (primary text)\n */\n label: React.ReactNode;\n\n /**\n * Optional description text below the label (secondary text)\n */\n description?: React.ReactNode;\n\n /**\n * Whether this option is disabled\n */\n disabled?: boolean;\n}\n\n/**\n * Additional props specific to Radio\n */\nexport interface RadioProps extends Omit<\n InputProps<string>,\n \"onChange\" | \"placeholder\"\n> {\n /**\n * Change handler - receives selected value\n */\n onChange: (value: string) => void;\n\n /**\n * Array of radio options\n */\n options: RadioOption[];\n\n /**\n * Layout direction\n * @default \"stacked\"\n */\n layout?: \"inline\" | \"stacked\";\n\n /**\n * Visual variant for radio options\n * - \"boxed\": bordered card with ring on hover/selected, radio circle on right\n * - \"inline\": minimal style, radio circle on left\n * @default \"inline\"\n */\n radioVariant?: \"boxed\" | \"inline\";\n\n /**\n * Group-level label\n */\n label?: React.ReactNode;\n\n /**\n * Additional native input attributes\n */\n [key: string]: any;\n}\n\n/**\n * Radio - High-performance single selection component\n *\n * A lightweight, accessible radio group with error state support.\n * Designed to work seamlessly with useForm and Field components.\n *\n * Features:\n * - Full accessibility support (ARIA attributes, role=\"radiogroup\")\n * - Error state styling\n * - Controlled input behavior\n * - Keyboard navigation (arrow keys)\n * - Inline or stacked layout\n * - Optional descriptions for each option (with nil guard)\n * - Individual option disabled state\n * - Card-based styling with proper visual hierarchy\n * - All native radio attributes supported\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { plan: 'basic' } });\n *\n * <Radio\n * {...form.getFieldProps('plan')}\n * label=\"Select your plan\"\n * options={[\n * { value: 'basic', label: 'Basic', description: '$9/month' },\n * { value: 'pro', label: 'Pro', description: '$29/month' },\n * { value: 'enterprise', label: 'Enterprise', description: '$99/month' }\n * ]}\n * error={!!form.errors.plan}\n * aria-describedby={form.errors.plan ? 'plan-error' : undefined}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Inline layout\n * <Radio\n * name=\"size\"\n * value={size}\n * onChange={handleSizeChange}\n * layout=\"inline\"\n * options={[\n * { value: 'sm', label: 'Small' },\n * { value: 'md', label: 'Medium' },\n * { value: 'lg', label: 'Large' }\n * ]}\n * />\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/radio\n */\nexport function Radio({\n name,\n value,\n onChange,\n onBlur,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n layout = \"stacked\",\n radioVariant = \"inline\",\n label,\n options,\n ...props\n}: RadioProps) {\n const handleChange = (optionValue: string) => {\n onChange(optionValue);\n };\n\n const handleKeyDown = (\n e: React.KeyboardEvent<HTMLLabelElement>,\n currentIndex: number,\n ) => {\n if (e.key === \"ArrowDown\" || e.key === \"ArrowRight\") {\n e.preventDefault();\n // Find next non-disabled option\n let nextIndex = (currentIndex + 1) % options.length;\n let attempts = 0;\n while (\n options[nextIndex].disabled &&\n attempts < options.length &&\n !disabled\n ) {\n nextIndex = (nextIndex + 1) % options.length;\n attempts++;\n }\n if (!options[nextIndex].disabled) {\n handleChange(options[nextIndex].value);\n }\n } else if (e.key === \"ArrowUp\" || e.key === \"ArrowLeft\") {\n e.preventDefault();\n // Find previous non-disabled option\n let prevIndex = (currentIndex - 1 + options.length) % options.length;\n let attempts = 0;\n while (\n options[prevIndex].disabled &&\n attempts < options.length &&\n !disabled\n ) {\n prevIndex = (prevIndex - 1 + options.length) % options.length;\n attempts++;\n }\n if (!options[prevIndex].disabled) {\n handleChange(options[prevIndex].value);\n }\n }\n };\n\n const handleBlur = () => {\n onBlur?.();\n };\n\n const containerClass = cn(\n \"w-full gap-3\",\n layout === \"stacked\" && \"flex flex-col\",\n layout === \"inline\" && \"flex flex-row flex-wrap\",\n className,\n );\n\n return (\n <div\n className={containerClass}\n role=\"radiogroup\"\n aria-invalid={error || props[\"aria-invalid\"]}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n aria-label={typeof label === \"string\" ? label : props[\"aria-label\"]}\n >\n {label && <div className=\"text-sm font-medium mb-2\">{label}</div>}\n {options.map((option, index) => {\n const isChecked = value === option.value;\n const isDisabled = disabled || option.disabled;\n const radioId = `${name}-${option.value}`;\n\n const hasDescription = option.description != null && option.description !== \"\";\n\n const radioIndicator = (\n <div className=\"relative inline-flex items-center justify-center\">\n <input\n type=\"radio\"\n id={radioId}\n name={name}\n value={option.value}\n checked={isChecked}\n onChange={(e) => handleChange(e.target.value)}\n onBlur={handleBlur}\n disabled={isDisabled}\n required={required}\n className=\"peer sr-only\"\n aria-describedby={\n hasDescription\n ? `${radioId}-description`\n : props[\"aria-describedby\"]\n }\n />\n <div\n className={cn(\n \"flex shrink-0 items-center justify-center rounded-full border-2 transition-colors size-6\",\n !error && isChecked && \"border-primary bg-transparent\",\n !error && !isChecked && \"border-input bg-transparent\",\n error && isChecked && \"border-destructive bg-transparent\",\n error && !isChecked && \"border-destructive bg-transparent\",\n isDisabled && \"opacity-50\",\n \"peer-focus-visible:ring-2 peer-focus-visible:ring-ring/50 peer-focus-visible:ring-offset-1\",\n )}\n >\n {isChecked && (\n <div className=\"size-3 rounded-full bg-primary\" />\n )}\n </div>\n </div>\n );\n\n const labelContent = (\n <div className=\"flex flex-col gap-0.5\">\n <div className=\"text-sm font-medium\">{option.label}</div>\n {hasDescription && (\n <p\n className=\"text-xs opacity-75\"\n id={`${radioId}-description`}\n >\n {option.description}\n </p>\n )}\n </div>\n );\n\n return (\n <label\n key={option.value}\n className={cn(\n \"w-full h-full flex gap-3 p-3 duration-200\",\n radioVariant === \"boxed\" && \"border rounded-lg hover:ring-2\",\n radioVariant === \"boxed\" && isChecked && \"ring-2\",\n isDisabled\n ? \"opacity-50 cursor-not-allowed hover:ring-0\"\n : \"cursor-pointer\",\n )}\n htmlFor={radioId}\n onKeyDown={(e) => handleKeyDown(e, index)}\n tabIndex={isDisabled ? -1 : 0}\n >\n <div className=\"flex w-full flex-row items-center gap-2\">\n {radioVariant === \"inline\" && radioIndicator}\n <div className=\"flex flex-1 flex-col gap-0.5\">\n {labelContent}\n </div>\n {radioVariant === \"boxed\" && radioIndicator}\n </div>\n </label>\n );\n })}\n </div>\n );\n}\n\nRadio.displayName = \"Radio\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\n\n/**\n * Select option type\n */\nexport interface SelectOption {\n /**\n * The value for this option\n */\n value: string;\n\n /**\n * Display label for the option\n */\n label: React.ReactNode;\n\n /**\n * Whether this option is disabled\n */\n disabled?: boolean;\n}\n\n/**\n * Select option group type for organizing options\n */\nexport interface SelectOptionGroup {\n /**\n * Group label\n */\n label: string;\n\n /**\n * Options in this group\n */\n options: SelectOption[];\n}\n\n/**\n * Additional props specific to Select\n */\nexport interface SelectProps\n extends Omit<InputProps<string>, \"onChange\" | \"onFocus\"> {\n /**\n * Change handler - receives selected value\n */\n onChange: (value: string) => void;\n\n /**\n * Focus handler\n */\n onFocus?: () => void;\n\n /**\n * Array of select options (flat structure)\n */\n options?: SelectOption[];\n\n /**\n * Array of option groups (grouped structure)\n */\n optionGroups?: SelectOptionGroup[];\n\n /**\n * Placeholder text when no option is selected\n * @default \"Select...\"\n */\n placeholder?: string;\n\n /**\n * Enable search/filter functionality\n * @default true\n */\n searchable?: boolean;\n\n /**\n * Enable clearable button to reset selection\n * @default true\n */\n clearable?: boolean;\n\n /**\n * Loading state for async options\n * @default false\n */\n loading?: boolean;\n\n /**\n * Custom render function for options\n */\n renderOption?: (option: SelectOption) => React.ReactNode;\n\n /**\n * Additional native input attributes\n */\n [key: string]: any;\n}\n\n/**\n * Select - High-performance dropdown selection component\n *\n * A lightweight, accessible select/dropdown with search, keyboard navigation,\n * and error state support. Designed to work seamlessly with useForm and Field components.\n *\n * Features:\n * - Full accessibility support (ARIA attributes, role=\"combobox\")\n * - Error state styling\n * - Controlled input behavior\n * - Keyboard navigation (arrow keys, Enter, Escape, type-ahead)\n * - Searchable options with filtering\n * - Clearable selection\n * - Option groups support\n * - Loading state for async options\n * - Disabled options support\n * - Click outside to close\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { country: '' } });\n *\n * <Select\n * {...form.getFieldProps('country')}\n * placeholder=\"Select a country\"\n * options={[\n * { value: 'us', label: 'United States' },\n * { value: 'ca', label: 'Canada' },\n * { value: 'mx', label: 'Mexico' }\n * ]}\n * searchable\n * clearable\n * error={!!form.errors.country}\n * aria-describedby={form.errors.country ? 'country-error' : undefined}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // With option groups\n * <Select\n * name=\"timezone\"\n * value={timezone}\n * onChange={handleTimezoneChange}\n * optionGroups={[\n * {\n * label: 'North America',\n * options: [\n * { value: 'est', label: 'Eastern Time' },\n * { value: 'cst', label: 'Central Time' }\n * ]\n * },\n * {\n * label: 'Europe',\n * options: [\n * { value: 'gmt', label: 'GMT' },\n * { value: 'cet', label: 'Central European Time' }\n * ]\n * }\n * ]}\n * />\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/select\n */\nexport function Select({\n name,\n value,\n onChange,\n onBlur,\n onFocus,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n placeholder = \"Select...\",\n searchable = true,\n clearable = true,\n loading = false,\n options = [],\n optionGroups = [],\n renderOption,\n ...props\n}: SelectProps) {\n const [isOpen, setIsOpen] = React.useState(false);\n const [searchQuery, setSearchQuery] = React.useState(\"\");\n const [focusedIndex, setFocusedIndex] = React.useState(-1);\n const selectRef = React.useRef<HTMLDivElement>(null);\n const searchInputRef = React.useRef<HTMLInputElement>(null);\n const dropdownId = `${name}-dropdown`;\n\n // Flatten options from groups or use flat options\n const allOptions = React.useMemo(() => {\n if (optionGroups.length > 0) {\n return optionGroups.flatMap((group) => group.options);\n }\n return options;\n }, [options, optionGroups]);\n\n // Filter options based on search query\n const filteredOptions = React.useMemo(() => {\n if (!searchQuery.trim()) {\n return allOptions;\n }\n const query = searchQuery.toLowerCase();\n return allOptions.filter((option) => {\n const label =\n typeof option.label === \"string\" ? option.label : String(option.label);\n return label.toLowerCase().includes(query);\n });\n }, [allOptions, searchQuery]);\n\n // Get selected option\n const selectedOption = React.useMemo(() => {\n return allOptions.find((opt) => opt.value === value);\n }, [allOptions, value]);\n\n // Handle option selection\n const handleSelect = (optionValue: string) => {\n onChange(optionValue);\n setIsOpen(false);\n setSearchQuery(\"\");\n setFocusedIndex(-1);\n };\n\n // Handle clear selection\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange(\"\");\n setSearchQuery(\"\");\n setFocusedIndex(-1);\n };\n\n // Toggle dropdown\n const handleToggle = () => {\n if (disabled) return;\n const newIsOpen = !isOpen;\n setIsOpen(newIsOpen);\n if (newIsOpen && searchable && searchInputRef.current) {\n // Focus search input when opening\n setTimeout(() => searchInputRef.current?.focus(), 0);\n }\n if (newIsOpen) {\n onFocus?.();\n }\n };\n\n // Handle search input change\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchQuery(e.target.value);\n setFocusedIndex(0); // Reset focus to first filtered option\n };\n\n // Keyboard navigation\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) return;\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n setFocusedIndex(0);\n } else {\n const enabledOptions = filteredOptions.filter((opt) => !opt.disabled);\n if (enabledOptions.length > 0) {\n const currentIndexInFiltered = focusedIndex;\n const nextIndex = (currentIndexInFiltered + 1) % enabledOptions.length;\n setFocusedIndex(\n filteredOptions.indexOf(enabledOptions[nextIndex])\n );\n }\n }\n break;\n\n case \"ArrowUp\":\n e.preventDefault();\n if (isOpen) {\n const enabledOptions = filteredOptions.filter((opt) => !opt.disabled);\n if (enabledOptions.length > 0) {\n const currentIndexInFiltered = focusedIndex;\n const prevIndex =\n (currentIndexInFiltered - 1 + enabledOptions.length) %\n enabledOptions.length;\n setFocusedIndex(\n filteredOptions.indexOf(enabledOptions[prevIndex])\n );\n }\n }\n break;\n\n case \"Enter\":\n e.preventDefault();\n if (isOpen && focusedIndex >= 0 && focusedIndex < filteredOptions.length) {\n const focusedOption = filteredOptions[focusedIndex];\n if (!focusedOption.disabled) {\n handleSelect(focusedOption.value);\n }\n } else if (!isOpen) {\n setIsOpen(true);\n }\n break;\n\n case \"Escape\":\n e.preventDefault();\n if (isOpen) {\n setIsOpen(false);\n setSearchQuery(\"\");\n setFocusedIndex(-1);\n }\n break;\n\n case \" \":\n // Space key to open dropdown if not searching\n if (!isOpen && !searchable) {\n e.preventDefault();\n setIsOpen(true);\n }\n break;\n\n default:\n // Type-ahead search (only if not already searching)\n if (!searchable && e.key.length === 1 && !e.ctrlKey && !e.metaKey) {\n const char = e.key.toLowerCase();\n const matchingOption = filteredOptions.find((opt) => {\n const label =\n typeof opt.label === \"string\"\n ? opt.label\n : String(opt.label);\n return label.toLowerCase().startsWith(char) && !opt.disabled;\n });\n if (matchingOption) {\n handleSelect(matchingOption.value);\n }\n }\n break;\n }\n };\n\n // Handle blur\n const handleBlur = () => {\n onBlur?.();\n };\n\n // Close dropdown when clicking outside\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n selectRef.current &&\n !selectRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n setSearchQuery(\"\");\n setFocusedIndex(-1);\n handleBlur();\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }\n }, [isOpen]);\n\n const combinedClassName = `relative w-full ${className}`.trim();\n\n return (\n <div\n ref={selectRef}\n className={combinedClassName}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n >\n {/* Hidden native select for form submission */}\n <select\n name={name}\n value={value}\n onChange={() => {}}\n disabled={disabled}\n required={required}\n aria-hidden=\"true\"\n tabIndex={-1}\n style={{ display: \"none\" }}\n >\n <option value=\"\">Select...</option>\n {allOptions.map((option) => (\n <option key={option.value} value={option.value}>\n {typeof option.label === \"string\" ? option.label : option.value}\n </option>\n ))}\n </select>\n\n {/* Custom select trigger */}\n <div\n className={`flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm cursor-pointer transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring ${disabled ? \"cursor-not-allowed opacity-50 pointer-events-none\" : \"\"} ${error ? \"border-red-500 ring-1 ring-red-500\" : \"\"}`}\n onClick={handleToggle}\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-controls={dropdownId}\n aria-invalid={error || props[\"aria-invalid\"]}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n aria-disabled={disabled}\n tabIndex={disabled ? -1 : 0}\n >\n <span className=\"flex items-center flex-1 overflow-hidden text-ellipsis\">\n {selectedOption ? (\n renderOption ? (\n renderOption(selectedOption)\n ) : (\n selectedOption.label\n )\n ) : (\n <span className=\"text-muted-foreground\">{placeholder}</span>\n )}\n </span>\n <div className=\"flex items-center gap-1 ml-2\">\n {loading && <span className=\"text-xs\">⏳</span>}\n {clearable && value && !disabled && !loading && (\n <button\n type=\"button\"\n className=\"flex items-center justify-center h-4 w-4 rounded-sm border-none bg-transparent text-muted-foreground cursor-pointer text-xs p-0 transition-opacity hover:opacity-70\"\n onClick={handleClear}\n aria-label=\"Clear selection\"\n tabIndex={-1}\n >\n ✕\n </button>\n )}\n <span className=\"text-muted-foreground text-xs leading-none\" aria-hidden=\"true\">\n {isOpen ? \"▲\" : \"▼\"}\n </span>\n </div>\n </div>\n\n {/* Dropdown */}\n {isOpen && (\n <div id={dropdownId} className=\"absolute z-50 top-full mt-1 min-w-full overflow-hidden rounded-md border border-border bg-popover text-popover-foreground shadow-md\" role=\"listbox\">\n {searchable && (\n <div className=\"p-2 border-b border-border\">\n <input\n ref={searchInputRef}\n type=\"text\"\n className=\"w-full border border-input rounded px-2 py-1 text-sm bg-transparent outline-none focus:ring-1 focus:ring-ring\"\n placeholder=\"Search...\"\n value={searchQuery}\n onChange={handleSearchChange}\n onClick={(e) => e.stopPropagation()}\n aria-label=\"Search options\"\n />\n </div>\n )}\n\n <div className=\"max-h-64 overflow-y-auto p-1\">\n {filteredOptions.length === 0 ? (\n <div className=\"py-2 px-3 text-center text-sm text-muted-foreground\">No options found</div>\n ) : optionGroups.length > 0 ? (\n // Render grouped options\n optionGroups.map((group, groupIndex) => {\n const groupOptions = group.options.filter((opt) =>\n filteredOptions.includes(opt)\n );\n if (groupOptions.length === 0) return null;\n\n return (\n <div key={groupIndex} className=\"py-1\">\n <div className=\"py-1.5 px-2 text-xs font-semibold text-muted-foreground\">{group.label}</div>\n {groupOptions.map((option) => {\n const globalIndex = filteredOptions.indexOf(option);\n const isSelected = value === option.value;\n const isFocused = globalIndex === focusedIndex;\n const isDisabled = option.disabled;\n\n return (\n <div\n key={option.value}\n className={`relative flex w-full cursor-pointer items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground ${isFocused ? \"bg-accent text-accent-foreground\" : \"\"} ${isSelected ? \"font-medium bg-accent\" : \"\"} ${isDisabled ? \"pointer-events-none opacity-50\" : \"\"}`}\n onClick={() =>\n !isDisabled && handleSelect(option.value)\n }\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={isDisabled}\n >\n {renderOption ? renderOption(option) : option.label}\n </div>\n );\n })}\n </div>\n );\n })\n ) : (\n // Render flat options\n filteredOptions.map((option, index) => {\n const isSelected = value === option.value;\n const isFocused = index === focusedIndex;\n const isDisabled = option.disabled;\n\n return (\n <div\n key={option.value}\n className={`relative flex w-full cursor-pointer items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground ${isFocused ? \"bg-accent text-accent-foreground\" : \"\"} ${isSelected ? \"font-medium bg-accent\" : \"\"} ${isDisabled ? \"pointer-events-none opacity-50\" : \"\"}`}\n onClick={() => !isDisabled && handleSelect(option.value)}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={isDisabled}\n >\n {renderOption ? renderOption(option) : option.label}\n </div>\n );\n })\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nSelect.displayName = \"Select\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\n\n/**\n * File validation error details\n */\nexport interface FileValidationError {\n file: File;\n error: \"type\" | \"size\" | \"count\";\n message: string;\n}\n\n/**\n * Upload progress tracking per file\n */\nexport interface FileUploadProgress {\n [fileName: string]: number; // 0-100\n}\n\n/**\n * Crop area coordinates\n */\nexport interface CropArea {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/**\n * FileInput component props\n */\nexport interface FileInputProps extends Omit<InputProps<File[]>, \"value\" | \"onChange\"> {\n /**\n * Current file value(s)\n */\n value?: File[];\n\n /**\n * Change handler receives array of files\n */\n onChange: (files: File[]) => void;\n\n /**\n * Accepted file types (MIME types or extensions)\n * @example \".pdf,.doc,.docx\"\n * @example \"image/*,application/pdf\"\n */\n accept?: string;\n\n /**\n * Maximum file size in bytes\n * @default 5MB (5 * 1024 * 1024)\n */\n maxSize?: number;\n\n /**\n * Maximum number of files\n * @default 1\n */\n maxFiles?: number;\n\n /**\n * Allow multiple file selection\n * @default false\n */\n multiple?: boolean;\n\n /**\n * Show file preview thumbnails\n * @default true\n */\n showPreview?: boolean;\n\n /**\n * Show upload progress indicators\n * @default true\n */\n showProgress?: boolean;\n\n /**\n * Upload progress per file (0-100)\n * Consumer should update this during upload\n */\n uploadProgress?: FileUploadProgress;\n\n /**\n * Enable image cropping for image files\n * @default false\n */\n enableCropping?: boolean;\n\n /**\n * Crop aspect ratio (width / height)\n * @default Free form (no constraint)\n * @example 16/9, 1, 4/3\n */\n cropAspectRatio?: number;\n\n /**\n * Crop complete handler - receives cropped blob and original file\n */\n onCropComplete?: (croppedBlob: Blob, originalFile: File) => void;\n\n /**\n * Validation error handler\n */\n onValidationError?: (errors: FileValidationError[]) => void;\n\n /**\n * File removed handler\n */\n onFileRemove?: (file: File, index: number) => void;\n}\n\n/**\n * FileInput component for file selection with validation, progress tracking, and image cropping\n *\n * Features:\n * - Drag-and-drop file upload\n * - File type and size validation\n * - Image preview thumbnails\n * - Upload progress indicators\n * - Image cropping with aspect ratio control\n * - Multiple file support\n *\n * @example\n * ```tsx\n * <FileInput\n * name=\"resume\"\n * accept=\".pdf,.doc,.docx\"\n * maxSize={5 * 1024 * 1024}\n * value={files}\n * onChange={(files) => setFiles(files)}\n * error={hasError}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // With upload progress\n * <FileInput\n * name=\"photos\"\n * accept=\"image/*\"\n * multiple\n * value={files}\n * onChange={setFiles}\n * showProgress\n * uploadProgress={progress}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // With image cropping\n * <FileInput\n * name=\"avatar\"\n * accept=\"image/*\"\n * value={files}\n * onChange={setFiles}\n * enableCropping\n * cropAspectRatio={1}\n * onCropComplete={(blob, file) => {\n * // Handle cropped image\n * }}\n * />\n * ```\n */\nexport function FileInput({\n name,\n value = [],\n onChange,\n onBlur,\n placeholder = \"Choose file(s)...\",\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n accept,\n maxSize = 5 * 1024 * 1024, // 5MB default\n maxFiles = 1,\n multiple = false,\n showPreview = true,\n showProgress = true,\n uploadProgress = {},\n enableCropping = false,\n cropAspectRatio,\n onCropComplete,\n onValidationError,\n onFileRemove,\n ...props\n}: FileInputProps) {\n const inputRef = React.useRef<HTMLInputElement>(null);\n const [dragActive, setDragActive] = React.useState(false);\n const [cropperOpen, setCropperOpen] = React.useState(false);\n const [imageToCrop, setImageToCrop] = React.useState<{\n file: File;\n url: string;\n } | null>(null);\n const [crop, setCrop] = React.useState({ x: 0, y: 0 });\n const [zoom, setZoom] = React.useState(1);\n const [croppedAreaPixels, setCroppedAreaPixels] = React.useState<CropArea | null>(null);\n\n /**\n * Validate file against constraints\n */\n const validateFile = React.useCallback(\n (file: File): FileValidationError | null => {\n // Validate file type\n if (accept) {\n const acceptedTypes = accept.split(\",\").map((t) => t.trim());\n const isValidType = acceptedTypes.some((type) => {\n if (type.startsWith(\".\")) {\n // Extension match\n return file.name.toLowerCase().endsWith(type.toLowerCase());\n } else if (type.endsWith(\"/*\")) {\n // MIME type wildcard match (e.g., \"image/*\")\n const baseType = type.split(\"/\")[0];\n return file.type.startsWith(baseType + \"/\");\n } else {\n // Exact MIME type match\n return file.type === type;\n }\n });\n\n if (!isValidType) {\n return {\n file,\n error: \"type\",\n message: `File type \"${file.type}\" is not accepted. Accepted types: ${accept}`,\n };\n }\n }\n\n // Validate file size\n if (file.size > maxSize) {\n const maxSizeMB = (maxSize / (1024 * 1024)).toFixed(2);\n const fileSizeMB = (file.size / (1024 * 1024)).toFixed(2);\n return {\n file,\n error: \"size\",\n message: `File size ${fileSizeMB}MB exceeds maximum ${maxSizeMB}MB`,\n };\n }\n\n return null;\n },\n [accept, maxSize]\n );\n\n /**\n * Handle file selection from input or drop\n */\n const handleFiles = React.useCallback(\n (fileList: FileList | null) => {\n if (!fileList || fileList.length === 0) return;\n\n const newFiles = Array.from(fileList);\n const validationErrors: FileValidationError[] = [];\n const validFiles: File[] = [];\n\n // Validate each file\n for (const file of newFiles) {\n const validationError = validateFile(file);\n if (validationError) {\n validationErrors.push(validationError);\n } else {\n validFiles.push(file);\n }\n }\n\n // Check max files constraint\n const totalFiles = value.length + validFiles.length;\n if (totalFiles > maxFiles) {\n validationErrors.push({\n file: validFiles[0], // Use first file as reference\n error: \"count\",\n message: `Maximum ${maxFiles} file(s) allowed. Attempting to add ${validFiles.length} to existing ${value.length}.`,\n });\n }\n\n // Notify validation errors\n if (validationErrors.length > 0 && onValidationError) {\n onValidationError(validationErrors);\n }\n\n // Handle valid files\n if (validFiles.length > 0 && totalFiles <= maxFiles) {\n // If cropping is enabled and file is an image, open cropper for first image\n const firstImage = validFiles.find((f) => f.type.startsWith(\"image/\"));\n if (enableCropping && firstImage && !multiple) {\n // Open cropper for single image\n const previewUrl = URL.createObjectURL(firstImage);\n setImageToCrop({ file: firstImage, url: previewUrl });\n setCropperOpen(true);\n } else {\n // Add files directly\n const updatedFiles = multiple ? [...value, ...validFiles] : validFiles;\n onChange(updatedFiles.slice(0, maxFiles));\n }\n }\n\n // Reset input value to allow same file selection again\n if (inputRef.current) {\n inputRef.current.value = \"\";\n }\n },\n [value, onChange, validateFile, maxFiles, multiple, enableCropping, onValidationError]\n );\n\n /**\n * Create cropped image from canvas\n */\n const createCroppedImage = React.useCallback(\n async (imageUrl: string, cropArea: CropArea): Promise<Blob> => {\n return new Promise((resolve, reject) => {\n const image = new Image();\n image.onload = () => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n reject(new Error(\"Failed to get canvas context\"));\n return;\n }\n\n // Set canvas size to crop area\n canvas.width = cropArea.width;\n canvas.height = cropArea.height;\n\n // Draw cropped image\n ctx.drawImage(\n image,\n cropArea.x,\n cropArea.y,\n cropArea.width,\n cropArea.height,\n 0,\n 0,\n cropArea.width,\n cropArea.height\n );\n\n // Convert canvas to blob\n canvas.toBlob((blob) => {\n if (blob) {\n resolve(blob);\n } else {\n reject(new Error(\"Failed to create blob from canvas\"));\n }\n }, \"image/jpeg\", 0.95);\n };\n image.onerror = () => {\n reject(new Error(\"Failed to load image\"));\n };\n image.src = imageUrl;\n });\n },\n []\n );\n\n /**\n * Handle crop completion\n */\n const handleCropSave = React.useCallback(async () => {\n if (!imageToCrop || !croppedAreaPixels) return;\n\n try {\n const croppedBlob = await createCroppedImage(\n imageToCrop.url,\n croppedAreaPixels\n );\n\n // Notify parent of cropped image\n if (onCropComplete) {\n onCropComplete(croppedBlob, imageToCrop.file);\n }\n\n // Create new file from blob\n const croppedFile = new File(\n [croppedBlob],\n imageToCrop.file.name,\n { type: \"image/jpeg\" }\n );\n\n // Update files\n const updatedFiles = multiple ? [...value, croppedFile] : [croppedFile];\n onChange(updatedFiles);\n\n // Close cropper\n setCropperOpen(false);\n URL.revokeObjectURL(imageToCrop.url);\n setImageToCrop(null);\n setCrop({ x: 0, y: 0 });\n setZoom(1);\n setCroppedAreaPixels(null);\n } catch (error) {\n console.error(\"Failed to crop image:\", error);\n }\n }, [imageToCrop, croppedAreaPixels, createCroppedImage, onCropComplete, value, onChange, multiple]);\n\n /**\n * Handle crop cancel\n */\n const handleCropCancel = React.useCallback(() => {\n if (imageToCrop) {\n URL.revokeObjectURL(imageToCrop.url);\n }\n setCropperOpen(false);\n setImageToCrop(null);\n setCrop({ x: 0, y: 0 });\n setZoom(1);\n setCroppedAreaPixels(null);\n }, [imageToCrop]);\n\n /**\n * Handle crop change\n */\n const onCropChange = React.useCallback((crop: { x: number; y: number }) => {\n setCrop(crop);\n }, []);\n\n /**\n * Handle zoom change\n */\n const onZoomChange = React.useCallback((zoom: number) => {\n setZoom(zoom);\n }, []);\n\n /**\n * Handle crop complete (receives pixel coordinates)\n */\n const onCropCompleteInternal = React.useCallback(\n (_: any, croppedAreaPixels: CropArea) => {\n setCroppedAreaPixels(croppedAreaPixels);\n },\n []\n );\n\n /**\n * Handle input change event\n */\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n handleFiles(e.target.files);\n };\n\n /**\n * Handle file removal\n */\n const handleRemove = (index: number) => {\n const fileToRemove = value[index];\n const updatedFiles = value.filter((_, i) => i !== index);\n onChange(updatedFiles);\n\n if (onFileRemove && fileToRemove) {\n onFileRemove(fileToRemove, index);\n }\n };\n\n /**\n * Handle crop button click for existing file\n */\n const handleCrop = (file: File) => {\n if (!file.type.startsWith(\"image/\")) return;\n const previewUrl = URL.createObjectURL(file);\n setImageToCrop({ file, url: previewUrl });\n setCropperOpen(true);\n };\n\n /**\n * Handle drag events\n */\n const handleDrag = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (e.type === \"dragenter\" || e.type === \"dragover\") {\n setDragActive(true);\n } else if (e.type === \"dragleave\") {\n setDragActive(false);\n }\n };\n\n /**\n * Handle drop event\n */\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(false);\n\n if (disabled) return;\n\n handleFiles(e.dataTransfer.files);\n };\n\n /**\n * Trigger file input click\n */\n const handleClick = () => {\n inputRef.current?.click();\n };\n\n /**\n * Handle keyboard interaction\n */\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleClick();\n }\n };\n\n /**\n * Format file size for display\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 /**\n * Generate file preview URL for images\n */\n const getPreviewUrl = (file: File): string | null => {\n if (file.type.startsWith(\"image/\")) {\n return URL.createObjectURL(file);\n }\n return null;\n };\n\n // Cleanup preview URLs on unmount and when files change\n React.useEffect(() => {\n return () => {\n value.forEach((file) => {\n const previewUrl = getPreviewUrl(file);\n if (previewUrl) {\n URL.revokeObjectURL(previewUrl);\n }\n });\n // Cleanup crop image URL if present\n if (imageToCrop) {\n URL.revokeObjectURL(imageToCrop.url);\n }\n };\n }, [value, imageToCrop]);\n\n const combinedClassName = `${className}`.trim();\n\n return (\n <div className={combinedClassName}>\n {/* Hidden file input */}\n <input\n ref={inputRef}\n type=\"file\"\n name={name}\n onChange={handleChange}\n onBlur={onBlur}\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n required={required && value.length === 0}\n aria-invalid={error || props[\"aria-invalid\"]}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n style={{ display: \"none\" }}\n />\n\n {/* Drop zone */}\n <div\n className={`flex min-h-32 w-full cursor-pointer items-center justify-center rounded-md border-2 border-dashed border-input bg-transparent p-6 transition-colors hover:bg-accent/50 hover:border-ring ${dragActive ? \"bg-accent border-ring\" : \"\"} ${disabled ? \"cursor-not-allowed opacity-50\" : \"\"} ${error ? \"border-red-500\" : \"\"}`}\n onDragEnter={handleDrag}\n onDragLeave={handleDrag}\n onDragOver={handleDrag}\n onDrop={handleDrop}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-label={placeholder}\n aria-disabled={disabled}\n >\n <div className=\"flex flex-col items-center gap-2 text-center\">\n <svg\n className=\"text-muted-foreground\"\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n <p className=\"text-sm font-medium\">\n {value.length > 0\n ? `${value.length} file(s) selected`\n : placeholder}\n </p>\n {accept && (\n <p className=\"text-xs text-muted-foreground\">Accepted: {accept}</p>\n )}\n {maxSize && (\n <p className=\"text-xs text-muted-foreground\">\n Max size: {formatFileSize(maxSize)}\n </p>\n )}\n </div>\n </div>\n\n {/* File list */}\n {value.length > 0 && (\n <ul className=\"flex flex-col gap-2 mt-4\" role=\"list\">\n {value.map((file, index) => {\n const previewUrl = showPreview ? getPreviewUrl(file) : null;\n\n return (\n <li key={`${file.name}-${index}`} className=\"flex items-center gap-3 p-3 rounded-md border border-border bg-card hover:bg-accent/50 transition-colors\">\n {previewUrl && (\n <img\n src={previewUrl}\n alt={file.name}\n className=\"w-12 h-12 rounded object-cover\"\n width=\"48\"\n height=\"48\"\n />\n )}\n <div className=\"flex flex-col flex-1 min-w-0\">\n <span className=\"text-sm font-medium truncate\">{file.name}</span>\n <span className=\"text-xs text-muted-foreground\">\n {formatFileSize(file.size)}\n </span>\n {/* Upload progress indicator */}\n {showProgress && uploadProgress[file.name] !== undefined && (\n <div className=\"flex items-center gap-2 mt-1\">\n <div\n className=\"h-1.5 bg-muted rounded-full overflow-hidden flex-1\"\n role=\"progressbar\"\n aria-valuenow={uploadProgress[file.name]}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`Upload progress: ${uploadProgress[file.name]}%`}\n >\n <div\n className=\"h-full bg-primary transition-all\"\n style={{ width: `${uploadProgress[file.name]}%` }}\n />\n </div>\n <span className=\"text-xs text-muted-foreground\">\n {uploadProgress[file.name]}%\n </span>\n </div>\n )}\n </div>\n {/* Crop button for images when cropping is enabled */}\n {enableCropping && file.type.startsWith(\"image/\") && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n handleCrop(file);\n }}\n disabled={disabled}\n className=\"flex items-center justify-center h-8 w-8 rounded border-none bg-transparent hover:bg-accent text-muted-foreground hover:text-foreground transition-colors\"\n aria-label={`Crop ${file.name}`}\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M6.13 1L6 16a2 2 0 0 0 2 2h15\" />\n <path d=\"M1 6.13L16 6a2 2 0 0 1 2 2v15\" />\n </svg>\n </button>\n )}\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n handleRemove(index);\n }}\n disabled={disabled}\n className=\"flex items-center justify-center h-8 w-8 rounded border-none bg-transparent hover:bg-accent text-muted-foreground hover:text-foreground transition-colors\"\n aria-label={`Remove ${file.name}`}\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </li>\n );\n })}\n </ul>\n )}\n\n {/* Image cropper modal */}\n {cropperOpen && imageToCrop && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n <div\n className=\"absolute inset-0 bg-black/50\"\n onClick={handleCropCancel}\n aria-label=\"Close cropper\"\n />\n <div className=\"relative bg-popover border border-border rounded-lg shadow-lg max-w-3xl w-full mx-4\">\n <div className=\"flex items-center justify-between p-4 border-b border-border\">\n <h3 className=\"text-lg font-semibold\">Crop Image</h3>\n <button\n type=\"button\"\n className=\"flex items-center justify-center h-8 w-8 rounded hover:bg-accent text-muted-foreground hover:text-foreground transition-colors\"\n onClick={handleCropCancel}\n aria-label=\"Close\"\n >\n ✕\n </button>\n </div>\n\n <div className=\"p-4\">\n <div\n className=\"relative w-full h-96 bg-muted rounded-md overflow-hidden\"\n onMouseDown={(e) => {\n e.preventDefault();\n const startX = e.clientX - crop.x;\n const startY = e.clientY - crop.y;\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n onCropChange({\n x: moveEvent.clientX - startX,\n y: moveEvent.clientY - startY,\n });\n };\n\n const handleMouseUp = () => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n }}\n >\n <img\n src={imageToCrop.url}\n alt=\"Crop preview\"\n className=\"absolute inset-0 w-full h-full object-contain\"\n style={{\n transform: `translate(${crop.x}px, ${crop.y}px) scale(${zoom})`,\n }}\n draggable={false}\n onLoad={(e) => {\n const img = e.currentTarget;\n const containerWidth = 600;\n const containerHeight = 400;\n const cropWidth = cropAspectRatio\n ? Math.min(containerWidth * 0.8, containerHeight * 0.8 * cropAspectRatio)\n : containerWidth * 0.8;\n const cropHeight = cropAspectRatio\n ? cropWidth / cropAspectRatio\n : containerHeight * 0.8;\n\n // Calculate crop area in pixels\n const scale = zoom;\n const imgWidth = img.naturalWidth;\n const imgHeight = img.naturalHeight;\n\n // Calculate center point\n const centerX = containerWidth / 2;\n const centerY = containerHeight / 2;\n\n // Calculate crop area relative to image\n const cropX = (centerX - crop.x - cropWidth / 2) / scale;\n const cropY = (centerY - crop.y - cropHeight / 2) / scale;\n\n // Store crop area for saving\n onCropCompleteInternal(null, {\n x: Math.max(0, cropX),\n y: Math.max(0, cropY),\n width: Math.min(cropWidth / scale, imgWidth),\n height: Math.min(cropHeight / scale, imgHeight),\n });\n }}\n />\n\n {/* Crop overlay */}\n <div\n className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 border-2 border-primary rounded pointer-events-none\"\n style={{\n width: cropAspectRatio\n ? `${Math.min(80, 80 * cropAspectRatio)}%`\n : \"80%\",\n aspectRatio: cropAspectRatio ? String(cropAspectRatio) : undefined,\n }}\n >\n <div className=\"absolute inset-0 grid grid-cols-3 grid-rows-3\">\n <div className=\"border-r border-b border-primary/30\" />\n <div className=\"border-r border-b border-primary/30\" />\n <div className=\"border-b border-primary/30\" />\n <div className=\"border-r border-b border-primary/30\" />\n <div className=\"border-r border-b border-primary/30\" />\n <div className=\"border-b border-primary/30\" />\n <div className=\"border-r border-primary/30\" />\n <div className=\"border-r border-primary/30\" />\n <div />\n </div>\n </div>\n </div>\n\n {/* Zoom controls */}\n <div className=\"flex items-center gap-3 mt-4\">\n <label htmlFor=\"zoom-slider\" className=\"text-sm font-medium whitespace-nowrap\">\n Zoom: {zoom.toFixed(1)}x\n </label>\n <input\n id=\"zoom-slider\"\n type=\"range\"\n min=\"1\"\n max=\"3\"\n step=\"0.1\"\n value={zoom}\n onChange={(e) => onZoomChange(parseFloat(e.target.value))}\n className=\"flex-1 h-2 bg-muted rounded-lg appearance-none cursor-pointer\"\n aria-label=\"Zoom level\"\n />\n </div>\n </div>\n\n <div className=\"flex items-center justify-end gap-2 p-4 border-t border-border\">\n <button\n type=\"button\"\n className=\"inline-flex items-center justify-center h-9 rounded-md px-4 text-sm font-medium border border-input bg-transparent hover:bg-accent hover:text-accent-foreground transition-colors\"\n onClick={handleCropCancel}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"inline-flex items-center justify-center h-9 rounded-md px-4 text-sm font-medium bg-primary text-primary-foreground hover:bg-primary/90 transition-colors\"\n onClick={handleCropSave}\n >\n Save\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nFileInput.displayName = \"FileInput\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\n\n/**\n * DatePicker props interface\n */\nexport interface DatePickerProps extends Omit<\n InputProps<Date | null>,\n \"onChange\"\n> {\n /**\n * Change handler - receives selected date or null\n */\n onChange: (date: Date | null) => void;\n\n /**\n * Placeholder text when no date is selected\n * @default \"Select date...\"\n */\n placeholder?: string;\n\n /**\n * Date format for display\n * @default \"MM/dd/yyyy\"\n */\n format?: string;\n\n /**\n * Minimum selectable date\n */\n minDate?: Date;\n\n /**\n * Maximum selectable date\n */\n maxDate?: Date;\n\n /**\n * Dates that should be disabled\n */\n disabledDates?: Date[];\n\n /**\n * Function to determine if a date should be disabled\n */\n isDateDisabled?: (date: Date) => boolean;\n\n /**\n * Show clear button\n * @default true\n */\n clearable?: boolean;\n\n /**\n * Show calendar icon\n * @default true\n */\n showIcon?: boolean;\n\n /**\n * Additional native input attributes\n */\n [key: string]: any;\n}\n\n/**\n * Format date to string\n */\nfunction formatDate(date: Date | null, format: string): string {\n if (!date) return \"\";\n\n const d = new Date(date);\n const month = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n const year = d.getFullYear();\n\n // Simple format parsing\n return format\n .replace(\"MM\", month)\n .replace(\"dd\", day)\n .replace(\"yyyy\", String(year))\n .replace(\"yy\", String(year).slice(2));\n}\n\n/**\n * Parse date string to Date\n */\nfunction parseDate(dateString: string, format: string): Date | null {\n if (!dateString) return null;\n\n try {\n // Simple date parsing for MM/dd/yyyy format\n if (format === \"MM/dd/yyyy\" || format === \"MM-dd-yyyy\") {\n const parts = dateString.split(/[/-]/);\n if (parts.length === 3) {\n const month = parseInt(parts[0], 10) - 1;\n const day = parseInt(parts[1], 10);\n const year = parseInt(parts[2], 10);\n const date = new Date(year, month, day);\n if (!isNaN(date.getTime())) {\n return date;\n }\n }\n }\n // Fallback to native Date parsing\n const date = new Date(dateString);\n return isNaN(date.getTime()) ? null : date;\n } catch {\n return null;\n }\n}\n\n/**\n * Check if date is in disabled dates array\n */\nfunction isDateInArray(date: Date, dates: Date[]): boolean {\n const dateStr = date.toDateString();\n return dates.some((d) => d.toDateString() === dateStr);\n}\n\n/**\n * DatePicker - Accessible date selection component with calendar UI\n *\n * A lightweight date picker with calendar popup, keyboard navigation,\n * and error state support. Designed to work seamlessly with useForm and Field components.\n *\n * Features:\n * - Calendar popup with month/year navigation\n * - Full accessibility support (ARIA attributes, keyboard navigation)\n * - Error state styling\n * - Controlled input behavior\n * - Date range constraints (min/max dates)\n * - Disabled dates support\n * - Clearable selection\n * - Custom date format display\n * - Icon display toggle\n * - Click outside to close\n * - Native date input fallback for mobile\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { birthdate: null } });\n *\n * <DatePicker\n * {...form.getFieldProps('birthdate')}\n * placeholder=\"Select your birthdate\"\n * format=\"MM/dd/yyyy\"\n * maxDate={new Date()}\n * clearable\n * showIcon\n * error={!!form.errors.birthdate}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // With date range constraints\n * <DatePicker\n * name=\"appointment\"\n * value={appointmentDate}\n * onChange={setAppointmentDate}\n * minDate={new Date()}\n * maxDate={addDays(new Date(), 90)}\n * isDateDisabled={(date) => date.getDay() === 0 || date.getDay() === 6}\n * />\n * ```\n *\n * Note: This component requires react-day-picker as a peer dependency.\n * Install with: npm install react-day-picker date-fns\n *\n * @see https://opensite.ai/developers/page-speed/forms/date-picker\n */\nexport function DatePicker({\n name,\n value,\n onChange,\n onBlur,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n placeholder = \"Select date...\",\n format = \"MM/dd/yyyy\",\n minDate,\n maxDate,\n disabledDates = [],\n isDateDisabled,\n clearable = true,\n showIcon = true,\n ...props\n}: DatePickerProps) {\n const [isOpen, setIsOpen] = React.useState(false);\n const [inputValue, setInputValue] = React.useState(\"\");\n const [selectedMonth, setSelectedMonth] = React.useState<Date>(\n value || new Date(),\n );\n const containerRef = React.useRef<HTMLDivElement>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n // Sync input value with controlled value prop\n React.useEffect(() => {\n setInputValue(formatDate(value, format));\n if (value) {\n setSelectedMonth(value);\n }\n }, [value, format]);\n\n // Handle date selection from calendar\n const handleDateSelect = (date: Date) => {\n onChange(date);\n setIsOpen(false);\n onBlur?.();\n };\n\n // Handle input change (manual typing)\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setInputValue(newValue);\n\n // Try to parse and update date\n const parsedDate = parseDate(newValue, format);\n if (parsedDate && !isNaN(parsedDate.getTime())) {\n onChange(parsedDate);\n } else if (newValue === \"\") {\n onChange(null);\n }\n };\n\n // Handle clear button\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange(null);\n setInputValue(\"\");\n inputRef.current?.focus();\n };\n\n // Toggle calendar popup\n const handleToggle = () => {\n if (disabled) return;\n setIsOpen(!isOpen);\n };\n\n // Check if a date should be disabled\n const isDisabled = (date: Date): boolean => {\n if (minDate && date < minDate) return true;\n if (maxDate && date > maxDate) return true;\n if (isDateInArray(date, disabledDates)) return true;\n if (isDateDisabled && isDateDisabled(date)) return true;\n return false;\n };\n\n // Close calendar when clicking outside\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n onBlur?.();\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }\n }, [isOpen, onBlur]);\n\n // Simple calendar component (basic implementation)\n const renderCalendar = () => {\n const year = selectedMonth.getFullYear();\n const month = selectedMonth.getMonth();\n\n // Get days in month\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n const firstDayOfMonth = new Date(year, month, 1).getDay();\n\n // Build calendar grid\n const days: (Date | null)[] = [];\n\n // Add empty cells for days before month starts\n for (let i = 0; i < firstDayOfMonth; i++) {\n days.push(null);\n }\n\n // Add days of month\n for (let day = 1; day <= daysInMonth; day++) {\n days.push(new Date(year, month, day));\n }\n\n const monthNames = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ];\n\n const handlePrevMonth = () => {\n setSelectedMonth(new Date(year, month - 1, 1));\n };\n\n const handleNextMonth = () => {\n setSelectedMonth(new Date(year, month + 1, 1));\n };\n\n return (\n <div role=\"grid\" aria-label=\"Calendar\">\n <div className=\"flex items-center justify-between pb-2 border-b border-border\">\n <button\n type=\"button\"\n className=\"flex items-center justify-center h-8 w-8 rounded border-none bg-transparent hover:bg-primary hover:text-primary-foreground cursor-pointer\"\n onClick={handlePrevMonth}\n aria-label=\"Previous month\"\n >\n ←\n </button>\n <div className=\"font-medium text-sm\">\n {`${monthNames[month]} ${year}`}\n </div>\n <button\n type=\"button\"\n className=\"flex items-center justify-center h-8 w-8 rounded border-none bg-transparent hover:bg-primary hover:text-primary-foreground cursor-pointer\"\n onClick={handleNextMonth}\n aria-label=\"Next month\"\n >\n →\n </button>\n </div>\n <div className=\"grid grid-cols-7 gap-1 mt-2\">\n {[\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"].map((day) => (\n <div\n key={day}\n className=\"flex items-center justify-center h-8 w-full text-xs font-medium\"\n >\n {day}\n </div>\n ))}\n </div>\n <div className=\"grid grid-cols-7 gap-1\">\n {days.map((date, index) => {\n if (!date) {\n return <div key={`empty-${index}`} />;\n }\n\n const isSelected =\n value && date.toDateString() === value.toDateString();\n const isToday = date.toDateString() === new Date().toDateString();\n const disabled = isDisabled(date);\n\n return (\n <button\n key={date.toISOString()}\n type=\"button\"\n className={`flex items-center justify-center h-8 w-full rounded border-none bg-transparent cursor-pointer text-sm transition-colors hover:bg-primary hover:text-primary-foreground ${isSelected ? \"bg-primary text-primary-foreground font-semibold\" : \"\"} ${isToday ? \"border border-primary\" : \"\"} ${disabled ? \"cursor-not-allowed opacity-50 pointer-events-none\" : \"\"}`}\n onClick={() => !disabled && handleDateSelect(date)}\n disabled={disabled}\n aria-label={formatDate(date, format)}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n </div>\n );\n };\n\n const combinedClassName = `relative ${className}`.trim();\n\n return (\n <div ref={containerRef} className={combinedClassName}>\n {/* Hidden native date input for form submission */}\n <input\n type=\"hidden\"\n name={name}\n value={value ? value.toISOString() : \"\"}\n />\n\n {/* Custom date input */}\n <div className=\"relative\">\n {showIcon && (\n <span\n className=\"absolute left-3 top-1/2 -translate-y-1/2 pointer-events-none\"\n aria-hidden=\"true\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n >\n <path d=\"M8 2v4m8-4v4m5 8V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h8M3 10h18m-5 10l2 2l4-4\" />\n </svg>\n </span>\n )}\n <input\n ref={inputRef}\n type=\"text\"\n className={`flex h-9 w-full rounded-md border border-input bg-transparent ${showIcon ? \"pl-10\" : \"pl-3\"} ${clearable && value ? \"pr-10\" : \"pr-3\"} py-1 text-base shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm ${error ? \"border-red-500 ring-1 ring-red-500\" : \"\"}`}\n value={inputValue}\n onChange={handleInputChange}\n onClick={handleToggle}\n onBlur={onBlur}\n disabled={disabled}\n required={required}\n placeholder={placeholder}\n aria-invalid={error || props[\"aria-invalid\"] ? \"true\" : \"false\"}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n readOnly\n />\n {clearable && value && !disabled && (\n <button\n type=\"button\"\n className=\"absolute right-3 top-1/2 -translate-y-1/2 transition-colors\"\n onClick={handleClear}\n aria-label=\"Clear date\"\n tabIndex={-1}\n >\n ✕\n </button>\n )}\n </div>\n\n {/* Calendar popup */}\n {isOpen && !disabled && (\n <div className=\"absolute z-50 top-full mt-1 min-w-full rounded-md border border-border bg-popover text-popover-foreground shadow-md p-3\">\n {renderCalendar()}\n </div>\n )}\n </div>\n );\n}\n\nDatePicker.displayName = \"DatePicker\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\n\n/**\n * Time value format\n */\nexport interface TimeValue {\n hour: number; // 1-12\n minute: number; // 0-59\n period: \"AM\" | \"PM\";\n}\n\n/**\n * TimePicker props interface\n */\nexport interface TimePickerProps extends Omit<InputProps<string>, \"onChange\"> {\n /**\n * Change handler - receives time string in format \"HH:mm AM/PM\"\n */\n onChange: (time: string) => void;\n\n /**\n * Placeholder text when no time is selected\n * @default \"Select time...\"\n */\n placeholder?: string;\n\n /**\n * Use 24-hour format instead of 12-hour with AM/PM\n * @default false\n */\n use24Hour?: boolean;\n\n /**\n * Minute step interval (e.g., 15 for 15-minute increments)\n * @default 1\n */\n minuteStep?: number;\n\n /**\n * Show clear button\n * @default true\n */\n clearable?: boolean;\n\n /**\n * Show clock icon\n * @default true\n */\n showIcon?: boolean;\n\n /**\n * Additional native input attributes\n */\n [key: string]: any;\n}\n\n/**\n * Parse time string to TimeValue\n */\nfunction parseTimeString(timeStr: string, use24Hour: boolean): TimeValue | null {\n if (!timeStr) return null;\n\n try {\n if (use24Hour) {\n // Parse 24-hour format (HH:mm)\n const [hourStr, minuteStr] = timeStr.split(\":\");\n const hour24 = parseInt(hourStr, 10);\n const minute = parseInt(minuteStr, 10);\n\n if (isNaN(hour24) || isNaN(minute)) return null;\n if (hour24 < 0 || hour24 > 23) return null;\n if (minute < 0 || minute > 59) return null;\n\n // Convert to 12-hour format with period\n const period = hour24 >= 12 ? \"PM\" : \"AM\";\n const hour = hour24 === 0 ? 12 : hour24 > 12 ? hour24 - 12 : hour24;\n\n return { hour, minute, period };\n } else {\n // Parse 12-hour format (HH:mm AM/PM)\n const match = timeStr.match(/^(\\d{1,2}):(\\d{2})\\s*(AM|PM)$/i);\n if (!match) return null;\n\n const hour = parseInt(match[1], 10);\n const minute = parseInt(match[2], 10);\n const period = match[3].toUpperCase() as \"AM\" | \"PM\";\n\n if (hour < 1 || hour > 12) return null;\n if (minute < 0 || minute > 59) return null;\n\n return { hour, minute, period };\n }\n } catch {\n return null;\n }\n}\n\n/**\n * Format TimeValue to string\n */\nfunction formatTimeValue(time: TimeValue | null, use24Hour: boolean): string {\n if (!time) return \"\";\n\n if (use24Hour) {\n // Convert to 24-hour format\n let hour24 = time.hour;\n if (time.period === \"PM\" && time.hour !== 12) {\n hour24 = time.hour + 12;\n } else if (time.period === \"AM\" && time.hour === 12) {\n hour24 = 0;\n }\n return `${String(hour24).padStart(2, \"0\")}:${String(time.minute).padStart(2, \"0\")}`;\n } else {\n // 12-hour format with AM/PM\n return `${time.hour}:${String(time.minute).padStart(2, \"0\")} ${time.period}`;\n }\n}\n\n/**\n * TimePicker - Accessible time selection component with AM/PM support\n *\n * A lightweight time picker with dropdown selection for hours, minutes, and AM/PM period.\n * Designed to work seamlessly with useForm and Field components.\n *\n * Features:\n * - Dropdown selection with hour/minute spinners\n * - 12-hour or 24-hour format support\n * - AM/PM period selector\n * - Configurable minute step intervals\n * - Full accessibility support (ARIA attributes, keyboard navigation)\n * - Error state styling\n * - Controlled input behavior\n * - Clearable selection\n * - Icon display toggle\n * - Click outside to close\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { appointment: '' } });\n *\n * <TimePicker\n * {...form.getFieldProps('appointment')}\n * placeholder=\"Select time\"\n * minuteStep={15}\n * clearable\n * showIcon\n * error={!!form.errors.appointment}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // With 24-hour format\n * <TimePicker\n * name=\"startTime\"\n * value={startTime}\n * onChange={setStartTime}\n * use24Hour\n * minuteStep={30}\n * />\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/time-picker\n */\nexport function TimePicker({\n name,\n value,\n onChange,\n onBlur,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n placeholder = \"Select time...\",\n use24Hour = false,\n minuteStep = 1,\n clearable = true,\n showIcon = true,\n ...props\n}: TimePickerProps) {\n const [isOpen, setIsOpen] = React.useState(false);\n const [timeValue, setTimeValue] = React.useState<TimeValue | null>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n // Sync time value with controlled value prop\n React.useEffect(() => {\n const parsed = parseTimeString(value, use24Hour);\n setTimeValue(parsed);\n }, [value, use24Hour]);\n\n // Handle hour change\n const handleHourChange = (hour: number) => {\n const newTime: TimeValue = {\n hour,\n minute: timeValue?.minute || 0,\n period: timeValue?.period || \"AM\",\n };\n setTimeValue(newTime);\n onChange(formatTimeValue(newTime, use24Hour));\n };\n\n // Handle minute change\n const handleMinuteChange = (minute: number) => {\n const newTime: TimeValue = {\n hour: timeValue?.hour || 12,\n minute,\n period: timeValue?.period || \"AM\",\n };\n setTimeValue(newTime);\n onChange(formatTimeValue(newTime, use24Hour));\n };\n\n // Handle period change\n const handlePeriodChange = (period: \"AM\" | \"PM\") => {\n const newTime: TimeValue = {\n hour: timeValue?.hour || 12,\n minute: timeValue?.minute || 0,\n period,\n };\n setTimeValue(newTime);\n onChange(formatTimeValue(newTime, use24Hour));\n };\n\n // Handle clear button\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange(\"\");\n setTimeValue(null);\n inputRef.current?.focus();\n };\n\n // Toggle time picker popup\n const handleToggle = () => {\n if (disabled) return;\n setIsOpen(!isOpen);\n };\n\n // Close picker when clicking outside\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n onBlur?.();\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }\n }, [isOpen, onBlur]);\n\n // Generate hour options (1-12 for 12-hour, 0-23 for 24-hour)\n const hours = React.useMemo(() => {\n if (use24Hour) {\n return Array.from({ length: 24 }, (_, i) => i);\n } else {\n return Array.from({ length: 12 }, (_, i) => i + 1);\n }\n }, [use24Hour]);\n\n // Generate minute options based on step\n const minutes = React.useMemo(() => {\n const mins: number[] = [];\n for (let i = 0; i < 60; i += minuteStep) {\n mins.push(i);\n }\n return mins;\n }, [minuteStep]);\n\n const combinedClassName = `relative ${className}`.trim();\n\n const displayValue = formatTimeValue(timeValue, use24Hour);\n\n return (\n <div ref={containerRef} className={combinedClassName}>\n {/* Hidden native input for form submission */}\n <input\n type=\"hidden\"\n name={name}\n value={value}\n />\n\n {/* Custom time input */}\n <div className=\"relative\">\n {showIcon && (\n <span className=\"absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground pointer-events-none\" aria-hidden=\"true\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 6v6l4 2\" />\n </svg>\n </span>\n )}\n <input\n ref={inputRef}\n type=\"text\"\n className={`flex h-9 w-full rounded-md border border-input bg-transparent ${showIcon ? \"pl-10\" : \"pl-3\"} ${clearable && value ? \"pr-10\" : \"pr-3\"} py-1 text-base shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm ${error ? \"border-red-500 ring-1 ring-red-500\" : \"\"}`}\n value={displayValue}\n onClick={handleToggle}\n onBlur={onBlur}\n disabled={disabled}\n required={required}\n placeholder={placeholder}\n aria-invalid={error || props[\"aria-invalid\"] ? \"true\" : \"false\"}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n readOnly\n />\n {clearable && value && !disabled && (\n <button\n type=\"button\"\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground transition-colors\"\n onClick={handleClear}\n aria-label=\"Clear time\"\n tabIndex={-1}\n >\n ✕\n </button>\n )}\n </div>\n\n {/* Time picker popup */}\n {isOpen && !disabled && (\n <div className=\"absolute z-50 top-full mt-1 min-w-full rounded-md border border-border bg-popover text-popover-foreground shadow-md p-3\">\n <div className=\"flex gap-2\">\n {/* Hour selector */}\n <div className=\"flex flex-col flex-1\">\n <div className=\"text-xs font-medium text-muted-foreground mb-2 text-center\">\n {use24Hour ? \"Hour\" : \"Hour\"}\n </div>\n <div className=\"flex flex-col gap-1 max-h-48 overflow-y-auto\">\n {hours.map((hour) => {\n const displayHour = use24Hour ? hour : hour;\n const isSelected = use24Hour\n ? timeValue?.hour === (hour === 0 ? 12 : hour > 12 ? hour - 12 : hour) &&\n timeValue?.period === (hour >= 12 ? \"PM\" : \"AM\")\n : timeValue?.hour === hour;\n\n return (\n <button\n key={hour}\n type=\"button\"\n className={`flex items-center justify-center h-8 w-full rounded border-none bg-transparent cursor-pointer text-sm transition-colors hover:bg-accent hover:text-accent-foreground ${isSelected ? \"bg-primary text-primary-foreground font-semibold\" : \"\"}`}\n onClick={() => {\n if (use24Hour) {\n const hour12 = hour === 0 ? 12 : hour > 12 ? hour - 12 : hour;\n const period = hour >= 12 ? \"PM\" : \"AM\";\n const newTime: TimeValue = {\n hour: hour12,\n minute: timeValue?.minute || 0,\n period,\n };\n setTimeValue(newTime);\n onChange(formatTimeValue(newTime, use24Hour));\n } else {\n handleHourChange(hour);\n }\n }}\n aria-label={`${String(displayHour).padStart(2, \"0\")} hours`}\n >\n {String(displayHour).padStart(2, \"0\")}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Minute selector */}\n <div className=\"flex flex-col flex-1\">\n <div className=\"text-xs font-medium text-muted-foreground mb-2 text-center\">Minute</div>\n <div className=\"flex flex-col gap-1 max-h-48 overflow-y-auto\">\n {minutes.map((minute) => {\n const isSelected = timeValue?.minute === minute;\n\n return (\n <button\n key={minute}\n type=\"button\"\n className={`flex items-center justify-center h-8 w-full rounded border-none bg-transparent cursor-pointer text-sm transition-colors hover:bg-accent hover:text-accent-foreground ${isSelected ? \"bg-primary text-primary-foreground font-semibold\" : \"\"}`}\n onClick={() => handleMinuteChange(minute)}\n aria-label={`${String(minute).padStart(2, \"0\")} minutes`}\n >\n {String(minute).padStart(2, \"0\")}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Period selector (AM/PM) - only for 12-hour format */}\n {!use24Hour && (\n <div className=\"flex flex-col w-20\">\n <div className=\"text-xs font-medium text-muted-foreground mb-2 text-center\">Period</div>\n <div className=\"flex flex-col gap-1\">\n <button\n type=\"button\"\n className={`flex items-center justify-center h-8 w-full rounded border-none bg-transparent cursor-pointer text-sm transition-colors hover:bg-accent hover:text-accent-foreground ${timeValue?.period === \"AM\" ? \"bg-primary text-primary-foreground font-semibold\" : \"\"}`}\n onClick={() => handlePeriodChange(\"AM\")}\n >\n AM\n </button>\n <button\n type=\"button\"\n className={`flex items-center justify-center h-8 w-full rounded border-none bg-transparent cursor-pointer text-sm transition-colors hover:bg-accent hover:text-accent-foreground ${timeValue?.period === \"PM\" ? \"bg-primary text-primary-foreground font-semibold\" : \"\"}`}\n onClick={() => handlePeriodChange(\"PM\")}\n >\n PM\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nTimePicker.displayName = \"TimePicker\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\n\n/**\n * Date range value\n */\nexport interface DateRange {\n start: Date | null;\n end: Date | null;\n}\n\n/**\n * DateRangePicker props interface\n */\nexport interface DateRangePickerProps extends Omit<InputProps<DateRange>, \"onChange\"> {\n /**\n * Change handler - receives date range object\n */\n onChange: (range: DateRange) => void;\n\n /**\n * Placeholder text when no dates are selected\n * @default \"Select date range...\"\n */\n placeholder?: string;\n\n /**\n * Date format for display\n * @default \"MM/dd/yyyy\"\n */\n format?: string;\n\n /**\n * Minimum selectable date\n */\n minDate?: Date;\n\n /**\n * Maximum selectable date\n */\n maxDate?: Date;\n\n /**\n * Dates that should be disabled\n */\n disabledDates?: Date[];\n\n /**\n * Function to determine if a date should be disabled\n */\n isDateDisabled?: (date: Date) => boolean;\n\n /**\n * Show clear button\n * @default true\n */\n clearable?: boolean;\n\n /**\n * Show calendar icon\n * @default true\n */\n showIcon?: boolean;\n\n /**\n * Separator between start and end dates\n * @default \" - \"\n */\n separator?: string;\n\n /**\n * Additional native input attributes\n */\n [key: string]: any;\n}\n\n/**\n * Format date to string\n */\nfunction formatDate(date: Date | null, format: string): string {\n if (!date) return \"\";\n\n const d = new Date(date);\n const month = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n const year = d.getFullYear();\n\n return format\n .replace(\"MM\", month)\n .replace(\"dd\", day)\n .replace(\"yyyy\", String(year))\n .replace(\"yy\", String(year).slice(2));\n}\n\n/**\n * Check if date is in disabled dates array\n */\nfunction isDateInArray(date: Date, dates: Date[]): boolean {\n const dateStr = date.toDateString();\n return dates.some((d) => d.toDateString() === dateStr);\n}\n\n/**\n * Check if date is in range\n */\nfunction isDateInRange(date: Date, start: Date | null, end: Date | null): boolean {\n if (!start || !end) return false;\n const time = date.getTime();\n return time >= start.getTime() && time <= end.getTime();\n}\n\n/**\n * DateRangePicker - Accessible date range selection component\n *\n * A lightweight date range picker with calendar popup for selecting start and end dates.\n * Designed to work seamlessly with useForm and Field components.\n *\n * Features:\n * - Dual calendar view for range selection\n * - Full accessibility support (ARIA attributes, keyboard navigation)\n * - Error state styling\n * - Controlled input behavior\n * - Date range constraints (min/max dates)\n * - Disabled dates support\n * - Clearable selection\n * - Custom date format display\n * - Visual range highlighting\n * - Icon display toggle\n * - Click outside to close\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { dateRange: { start: null, end: null } } });\n *\n * <DateRangePicker\n * {...form.getFieldProps('dateRange')}\n * placeholder=\"Select date range\"\n * format=\"MM/dd/yyyy\"\n * clearable\n * showIcon\n * error={!!form.errors.dateRange}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // With date constraints\n * <DateRangePicker\n * name=\"vacation\"\n * value={vacationRange}\n * onChange={setVacationRange}\n * minDate={new Date()}\n * maxDate={addDays(new Date(), 365)}\n * separator=\" to \"\n * />\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/date-range-picker\n */\nexport function DateRangePicker({\n name,\n value = { start: null, end: null },\n onChange,\n onBlur,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n placeholder = \"Select date range...\",\n format = \"MM/dd/yyyy\",\n minDate,\n maxDate,\n disabledDates = [],\n isDateDisabled,\n clearable = true,\n showIcon = true,\n separator = \" - \",\n ...props\n}: DateRangePickerProps) {\n const [isOpen, setIsOpen] = React.useState(false);\n const [selectedMonth, setSelectedMonth] = React.useState<Date>(value.start || new Date());\n const [rangeStart, setRangeStart] = React.useState<Date | null>(value.start);\n const [rangeEnd, setRangeEnd] = React.useState<Date | null>(value.end);\n const [hoverDate, setHoverDate] = React.useState<Date | null>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n // Sync range with controlled value prop\n React.useEffect(() => {\n setRangeStart(value.start);\n setRangeEnd(value.end);\n if (value.start) {\n setSelectedMonth(value.start);\n }\n }, [value]);\n\n // Handle date selection\n const handleDateSelect = (date: Date) => {\n if (!rangeStart || (rangeStart && rangeEnd)) {\n // Start new range\n setRangeStart(date);\n setRangeEnd(null);\n onChange({ start: date, end: null });\n } else {\n // Complete range\n if (date < rangeStart) {\n // Selected date is before start, swap them\n setRangeStart(date);\n setRangeEnd(rangeStart);\n onChange({ start: date, end: rangeStart });\n setIsOpen(false);\n } else {\n // Selected date is after start\n setRangeEnd(date);\n onChange({ start: rangeStart, end: date });\n setIsOpen(false);\n }\n }\n onBlur?.();\n };\n\n // Handle clear button\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange({ start: null, end: null });\n setRangeStart(null);\n setRangeEnd(null);\n };\n\n // Toggle calendar popup\n const handleToggle = () => {\n if (disabled) return;\n setIsOpen(!isOpen);\n };\n\n // Check if a date should be disabled\n const isDisabled = (date: Date): boolean => {\n if (minDate && date < minDate) return true;\n if (maxDate && date > maxDate) return true;\n if (isDateInArray(date, disabledDates)) return true;\n if (isDateDisabled && isDateDisabled(date)) return true;\n return false;\n };\n\n // Close calendar when clicking outside\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n onBlur?.();\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }\n }, [isOpen, onBlur]);\n\n // Render calendar\n const renderCalendar = () => {\n const year = selectedMonth.getFullYear();\n const month = selectedMonth.getMonth();\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n const firstDayOfMonth = new Date(year, month, 1).getDay();\n\n const days: (Date | null)[] = [];\n for (let i = 0; i < firstDayOfMonth; i++) {\n days.push(null);\n }\n for (let day = 1; day <= daysInMonth; day++) {\n days.push(new Date(year, month, day));\n }\n\n const monthNames = [\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"\n ];\n\n const handlePrevMonth = () => {\n setSelectedMonth(new Date(year, month - 1, 1));\n };\n\n const handleNextMonth = () => {\n setSelectedMonth(new Date(year, month + 1, 1));\n };\n\n return (\n <div role=\"grid\" aria-label=\"Calendar\">\n <div className=\"flex items-center justify-between pb-2 border-b border-border\">\n <button\n type=\"button\"\n className=\"flex items-center justify-center h-8 w-8 rounded border-none bg-transparent hover:bg-accent cursor-pointer\"\n onClick={handlePrevMonth}\n aria-label=\"Previous month\"\n >\n ←\n </button>\n <div className=\"font-medium text-sm\">\n {`${monthNames[month]} ${year}`}\n </div>\n <button\n type=\"button\"\n className=\"flex items-center justify-center h-8 w-8 rounded border-none bg-transparent hover:bg-accent cursor-pointer\"\n onClick={handleNextMonth}\n aria-label=\"Next month\"\n >\n →\n </button>\n </div>\n <div className=\"grid grid-cols-7 gap-1 mt-2\">\n {[\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"].map((day) => (\n <div key={day} className=\"flex items-center justify-center h-8 w-full text-xs text-muted-foreground font-medium\">\n {day}\n </div>\n ))}\n </div>\n <div className=\"grid grid-cols-7 gap-1\">\n {days.map((date, index) => {\n if (!date) {\n return <div key={`empty-${index}`} />;\n }\n\n const isStart = rangeStart && date.toDateString() === rangeStart.toDateString();\n const isEnd = rangeEnd && date.toDateString() === rangeEnd.toDateString();\n const isInRange = rangeStart && rangeEnd && isDateInRange(date, rangeStart, rangeEnd);\n const isInHoverRange = rangeStart && !rangeEnd && hoverDate &&\n (date >= rangeStart && date <= hoverDate || date <= rangeStart && date >= hoverDate);\n const isToday = date.toDateString() === new Date().toDateString();\n const disabled = isDisabled(date);\n\n return (\n <button\n key={date.toISOString()}\n type=\"button\"\n className={`flex items-center justify-center h-8 w-full rounded border-none bg-transparent cursor-pointer text-sm transition-colors hover:bg-accent hover:text-accent-foreground ${isStart || isEnd ? \"bg-primary text-primary-foreground font-semibold\" : \"\"} ${isInRange || isInHoverRange ? \"bg-accent/50\" : \"\"} ${isToday ? \"border border-primary\" : \"\"} ${disabled ? \"cursor-not-allowed opacity-50 pointer-events-none\" : \"\"}`}\n onClick={() => !disabled && handleDateSelect(date)}\n onMouseEnter={() => setHoverDate(date)}\n onMouseLeave={() => setHoverDate(null)}\n disabled={disabled}\n aria-label={formatDate(date, format)}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n </div>\n );\n };\n\n const combinedClassName = `relative ${className}`.trim();\n\n const displayValue = rangeStart && rangeEnd\n ? `${formatDate(rangeStart, format)}${separator}${formatDate(rangeEnd, format)}`\n : rangeStart\n ? formatDate(rangeStart, format)\n : \"\";\n\n return (\n <div ref={containerRef} className={combinedClassName}>\n {/* Hidden inputs for form submission */}\n <input\n type=\"hidden\"\n name={`${name}[start]`}\n value={rangeStart ? rangeStart.toISOString() : \"\"}\n />\n <input\n type=\"hidden\"\n name={`${name}[end]`}\n value={rangeEnd ? rangeEnd.toISOString() : \"\"}\n />\n\n {/* Custom date range input */}\n <div className=\"relative\">\n {showIcon && (\n <span className=\"absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground pointer-events-none\" aria-hidden=\"true\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n >\n <path d=\"M8 2v4m8-4v4m5 8V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h8M3 10h18m-5 10l2 2l4-4\" />\n </svg>\n </span>\n )}\n <input\n type=\"text\"\n className={`flex h-9 w-full rounded-md border border-input bg-transparent ${showIcon ? \"pl-10\" : \"pl-3\"} ${clearable && (rangeStart || rangeEnd) ? \"pr-10\" : \"pr-3\"} py-1 text-base shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm ${error ? \"border-red-500 ring-1 ring-red-500\" : \"\"}`}\n value={displayValue}\n onClick={handleToggle}\n onBlur={onBlur}\n disabled={disabled}\n required={required}\n placeholder={placeholder}\n aria-invalid={error || props[\"aria-invalid\"] ? \"true\" : \"false\"}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n readOnly\n />\n {clearable && (rangeStart || rangeEnd) && !disabled && (\n <button\n type=\"button\"\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground transition-colors\"\n onClick={handleClear}\n aria-label=\"Clear date range\"\n tabIndex={-1}\n >\n ✕\n </button>\n )}\n </div>\n\n {/* Calendar popup */}\n {isOpen && !disabled && (\n <div className=\"absolute z-50 top-full mt-1 min-w-full rounded-md border border-border bg-popover text-popover-foreground shadow-md p-3\">\n {renderCalendar()}\n {rangeStart && !rangeEnd && (\n <div className=\"text-xs text-muted-foreground text-center pt-2 border-t border-border mt-2\">\n Select end date\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\nDateRangePicker.displayName = \"DateRangePicker\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\n\n/**\n * Editor mode type\n */\nexport type EditorMode = \"wysiwyg\" | \"markdown\";\n\n/**\n * Toolbar button configuration\n */\nexport interface ToolbarButton {\n command: string;\n icon: string;\n title: string;\n action: (editor: HTMLElement) => void;\n}\n\n/**\n * RichTextEditor props interface\n */\nexport interface RichTextEditorProps extends Omit<InputProps<string>, \"onChange\"> {\n /**\n * Change handler - receives HTML or Markdown content\n */\n onChange: (content: string) => void;\n\n /**\n * Editor mode - WYSIWYG or Markdown\n * @default \"wysiwyg\"\n */\n mode?: EditorMode;\n\n /**\n * Allow mode switching\n * @default false\n */\n allowModeSwitch?: boolean;\n\n /**\n * Placeholder text when editor is empty\n * @default \"Start typing...\"\n */\n placeholder?: string;\n\n /**\n * Minimum height of editor\n * @default \"200px\"\n */\n minHeight?: string;\n\n /**\n * Maximum height of editor (enables scrolling)\n */\n maxHeight?: string;\n\n /**\n * Show toolbar\n * @default true\n */\n showToolbar?: boolean;\n\n /**\n * Toolbar buttons to display\n * @default [\"bold\", \"italic\", \"underline\", \"heading\", \"bulletList\", \"orderedList\", \"link\"]\n */\n toolbarButtons?: string[];\n\n /**\n * Additional native input attributes\n */\n [key: string]: any;\n}\n\n/**\n * Convert HTML to Markdown (basic conversion)\n */\nfunction htmlToMarkdown(html: string): string {\n let markdown = html;\n\n // Bold\n markdown = markdown.replace(/<strong>(.*?)<\\/strong>/g, \"**$1**\");\n markdown = markdown.replace(/<b>(.*?)<\\/b>/g, \"**$1**\");\n\n // Italic\n markdown = markdown.replace(/<em>(.*?)<\\/em>/g, \"*$1*\");\n markdown = markdown.replace(/<i>(.*?)<\\/i>/g, \"*$1*\");\n\n // Underline (no direct markdown equivalent, use HTML)\n markdown = markdown.replace(/<u>(.*?)<\\/u>/g, \"<u>$1</u>\");\n\n // Headings\n markdown = markdown.replace(/<h1>(.*?)<\\/h1>/g, \"# $1\\n\");\n markdown = markdown.replace(/<h2>(.*?)<\\/h2>/g, \"## $1\\n\");\n markdown = markdown.replace(/<h3>(.*?)<\\/h3>/g, \"### $1\\n\");\n\n // Links\n markdown = markdown.replace(/<a href=\"(.*?)\">(.*?)<\\/a>/g, \"[$2]($1)\");\n\n // Lists\n markdown = markdown.replace(/<ul>(.*?)<\\/ul>/gs, (_match, content) => {\n return content.replace(/<li>(.*?)<\\/li>/g, \"- $1\\n\");\n });\n markdown = markdown.replace(/<ol>(.*?)<\\/ol>/gs, (_match, content) => {\n let counter = 1;\n return content.replace(/<li>(.*?)<\\/li>/g, () => {\n return `${counter++}. $1\\n`;\n });\n });\n\n // Paragraphs\n markdown = markdown.replace(/<p>(.*?)<\\/p>/g, \"$1\\n\\n\");\n\n // Line breaks\n markdown = markdown.replace(/<br\\s*\\/?>/g, \"\\n\");\n\n // Clean up extra whitespace\n markdown = markdown.replace(/\\n{3,}/g, \"\\n\\n\").trim();\n\n return markdown;\n}\n\n/**\n * Convert Markdown to HTML (basic conversion)\n */\nfunction markdownToHtml(markdown: string): string {\n let html = markdown;\n\n // Escape HTML\n html = html.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n\n // Headings\n html = html.replace(/^### (.*?)$/gm, \"<h3>$1</h3>\");\n html = html.replace(/^## (.*?)$/gm, \"<h2>$1</h2>\");\n html = html.replace(/^# (.*?)$/gm, \"<h1>$1</h1>\");\n\n // Bold\n html = html.replace(/\\*\\*(.*?)\\*\\*/g, \"<strong>$1</strong>\");\n\n // Italic\n html = html.replace(/\\*(.*?)\\*/g, \"<em>$1</em>\");\n\n // Links\n html = html.replace(/\\[(.*?)\\]\\((.*?)\\)/g, '<a href=\"$2\">$1</a>');\n\n // Unordered lists\n html = html.replace(/^- (.*?)$/gm, \"<li>$1</li>\");\n html = html.replace(/(<li>.*?<\\/li>\\n?)+/gs, \"<ul>$&</ul>\");\n\n // Ordered lists\n html = html.replace(/^\\d+\\. (.*?)$/gm, \"<li>$1</li>\");\n\n // Paragraphs\n html = html.replace(/^(?!<[h|ul|ol|li])(.+)$/gm, \"<p>$1</p>\");\n\n // Line breaks\n html = html.replace(/\\n/g, \"<br>\");\n\n return html;\n}\n\n/**\n * RichTextEditor - Basic rich text editing component with WYSIWYG and Markdown support\n *\n * A lightweight rich text editor with basic formatting capabilities and optional Markdown mode.\n * Designed to work seamlessly with useForm and Field components.\n *\n * Features:\n * - WYSIWYG editor with contentEditable\n * - Markdown editor mode\n * - Configurable toolbar with common formatting options\n * - Full accessibility support\n * - Error state styling\n * - Controlled input behavior\n * - Custom toolbar configuration\n * - Mode switching support\n * - Placeholder text support\n * - Adjustable height constraints\n *\n * Toolbar buttons:\n * - bold: Bold text (**text**)\n * - italic: Italic text (*text*)\n * - underline: Underlined text\n * - heading: Heading levels (H1-H3)\n * - bulletList: Unordered list\n * - orderedList: Ordered list\n * - link: Insert hyperlink\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { content: '' } });\n *\n * <RichTextEditor\n * {...form.getFieldProps('content')}\n * placeholder=\"Write your content...\"\n * mode=\"wysiwyg\"\n * allowModeSwitch\n * showToolbar\n * minHeight=\"200px\"\n * maxHeight=\"500px\"\n * error={!!form.errors.content}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Markdown mode\n * <RichTextEditor\n * name=\"description\"\n * value={description}\n * onChange={setDescription}\n * mode=\"markdown\"\n * toolbarButtons={[\"bold\", \"italic\", \"heading\", \"link\"]}\n * />\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/rich-text-editor\n */\nexport function RichTextEditor({\n name,\n value = \"\",\n onChange,\n onBlur,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n mode = \"wysiwyg\",\n allowModeSwitch = false,\n placeholder = \"Start typing...\",\n minHeight = \"200px\",\n maxHeight,\n showToolbar = true,\n toolbarButtons = [\"bold\", \"italic\", \"underline\", \"heading\", \"bulletList\", \"orderedList\", \"link\"],\n ...props\n}: RichTextEditorProps) {\n const [currentMode, setCurrentMode] = React.useState<EditorMode>(mode);\n const [content, setContent] = React.useState(value);\n const editorRef = React.useRef<HTMLDivElement>(null);\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n\n // Sync content with controlled value prop\n React.useEffect(() => {\n setContent(value);\n if (currentMode === \"wysiwyg\" && editorRef.current) {\n editorRef.current.innerHTML = value;\n }\n }, [value, currentMode]);\n\n // Handle content change in WYSIWYG mode\n const handleWysiwygChange = () => {\n if (editorRef.current) {\n const newContent = editorRef.current.innerHTML;\n setContent(newContent);\n onChange(newContent);\n }\n };\n\n // Handle content change in Markdown mode\n const handleMarkdownChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newContent = e.target.value;\n setContent(newContent);\n onChange(newContent);\n };\n\n // Execute formatting command\n const execCommand = (command: string, value?: string) => {\n document.execCommand(command, false, value);\n editorRef.current?.focus();\n handleWysiwygChange();\n };\n\n // Toggle mode\n const handleModeToggle = () => {\n const newMode = currentMode === \"wysiwyg\" ? \"markdown\" : \"wysiwyg\";\n\n if (newMode === \"markdown\") {\n // Convert HTML to Markdown\n const markdown = htmlToMarkdown(content);\n setContent(markdown);\n onChange(markdown);\n } else {\n // Convert Markdown to HTML\n const html = markdownToHtml(content);\n setContent(html);\n onChange(html);\n if (editorRef.current) {\n editorRef.current.innerHTML = html;\n }\n }\n\n setCurrentMode(newMode);\n };\n\n // Toolbar button configurations\n const toolbarConfig: Record<string, ToolbarButton> = {\n bold: {\n command: \"bold\",\n icon: \"B\",\n title: \"Bold\",\n action: () => execCommand(\"bold\"),\n },\n italic: {\n command: \"italic\",\n icon: \"I\",\n title: \"Italic\",\n action: () => execCommand(\"italic\"),\n },\n underline: {\n command: \"underline\",\n icon: \"U\",\n title: \"Underline\",\n action: () => execCommand(\"underline\"),\n },\n heading: {\n command: \"heading\",\n icon: \"H\",\n title: \"Heading\",\n action: () => execCommand(\"formatBlock\", \"<h2>\"),\n },\n bulletList: {\n command: \"bulletList\",\n icon: \"•\",\n title: \"Bullet List\",\n action: () => execCommand(\"insertUnorderedList\"),\n },\n orderedList: {\n command: \"orderedList\",\n icon: \"1.\",\n title: \"Numbered List\",\n action: () => execCommand(\"insertOrderedList\"),\n },\n link: {\n command: \"link\",\n icon: \"🔗\",\n title: \"Insert Link\",\n action: () => {\n const url = window.prompt(\"Enter URL:\");\n if (url) {\n execCommand(\"createLink\", url);\n }\n },\n },\n };\n\n const combinedClassName = `rounded-md border border-input ${error ? \"border-red-500 ring-1 ring-red-500\" : \"\"} ${disabled ? \"opacity-50 cursor-not-allowed\" : \"\"} ${className}`.trim();\n\n const editorStyle: React.CSSProperties = {\n minHeight,\n maxHeight,\n overflowY: maxHeight ? \"auto\" : undefined,\n };\n\n return (\n <div className={combinedClassName}>\n {/* Hidden input for form submission */}\n <input type=\"hidden\" name={name} value={content} />\n\n {/* Toolbar */}\n {showToolbar && (\n <div className=\"flex items-center justify-between p-2 border-b border-border bg-muted/50\">\n <div className=\"flex items-center gap-1\">\n {toolbarButtons.map((buttonName) => {\n const button = toolbarConfig[buttonName];\n if (!button) return null;\n\n return (\n <button\n key={buttonName}\n type=\"button\"\n className=\"flex items-center justify-center h-8 w-8 rounded border-none bg-transparent hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n onClick={() => editorRef.current && button.action(editorRef.current)}\n title={button.title}\n disabled={disabled || currentMode === \"markdown\"}\n aria-label={button.title}\n >\n {button.icon}\n </button>\n );\n })}\n </div>\n {allowModeSwitch && (\n <button\n type=\"button\"\n className=\"flex items-center justify-center h-8 px-3 rounded border-none bg-transparent hover:bg-accent text-xs font-medium text-muted-foreground hover:text-foreground cursor-pointer transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n onClick={handleModeToggle}\n disabled={disabled}\n title={`Switch to ${currentMode === \"wysiwyg\" ? \"Markdown\" : \"WYSIWYG\"}`}\n aria-label={`Switch to ${currentMode === \"wysiwyg\" ? \"Markdown\" : \"WYSIWYG\"}`}\n >\n {currentMode === \"wysiwyg\" ? \"MD\" : \"WYSIWYG\"}\n </button>\n )}\n </div>\n )}\n\n {/* Editor */}\n <div style={editorStyle}>\n {currentMode === \"wysiwyg\" ? (\n <div\n ref={editorRef}\n className=\"w-full p-3 text-base md:text-sm outline-none bg-transparent focus-visible:outline-none [&:empty:before]:content-[attr(data-placeholder)] [&:empty:before]:text-muted-foreground\"\n role=\"textbox\"\n contentEditable={!disabled}\n onInput={handleWysiwygChange}\n onBlur={onBlur}\n data-placeholder={placeholder}\n aria-invalid={error || props[\"aria-invalid\"] ? \"true\" : \"false\"}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n suppressContentEditableWarning\n />\n ) : (\n <textarea\n ref={textareaRef}\n className=\"w-full p-3 text-base md:text-sm outline-none bg-transparent resize-none focus-visible:outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\"\n value={content}\n onChange={handleMarkdownChange}\n onBlur={onBlur}\n disabled={disabled}\n required={required}\n placeholder={placeholder}\n aria-invalid={error || props[\"aria-invalid\"] ? \"true\" : \"false\"}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n style={editorStyle}\n />\n )}\n </div>\n </div>\n );\n}\n\nRichTextEditor.displayName = \"RichTextEditor\";\n"]}
1
+ {"version":3,"sources":["../src/inputs/TextInput.tsx","../src/inputs/TextArea.tsx","../src/utils.ts","../src/inputs/Checkbox.tsx","../src/inputs/CheckboxGroup.tsx","../src/inputs/Radio.tsx","../src/inputs/Select.tsx","../src/inputs/FileInput.tsx","../src/inputs/DatePicker.tsx","../src/inputs/TimePicker.tsx","../src/inputs/DateRangePicker.tsx","../src/inputs/RichTextEditor.tsx"],"names":["React","React2","twMerge","clsx","React3","React4","React5","React6","React7","error","crop","zoom","croppedAreaPixels","date","React8","disabled","React9","formatDate","isDateInArray","React10","React11","value"],"mappings":"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","file":"inputs.cjs","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\n\n/**\n * TextInput - High-performance text input component\n *\n * A lightweight, accessible text input with error state support.\n * Designed to work seamlessly with useForm and Field components.\n *\n * Features:\n * - Full accessibility support\n * - Error state styling\n * - Controlled input behavior\n * - All native input attributes supported\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { email: '' } });\n *\n * <TextInput\n * {...form.getFieldProps('email')}\n * type=\"email\"\n * placeholder=\"Enter your email\"\n * error={!!form.errors.email}\n * aria-invalid={!!form.errors.email}\n * aria-describedby={form.errors.email ? 'email-error' : undefined}\n * />\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/text-input\n */\nexport function TextInput({\n name,\n value,\n onChange,\n onBlur,\n placeholder,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n type = \"text\",\n id = \"text\",\n ...props\n}: InputProps<string> & {\n type?: \"text\" | \"email\" | \"password\" | \"url\" | \"tel\" | \"search\";\n}) {\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.value);\n };\n\n const handleBlur = () => {\n onBlur?.();\n };\n\n const baseClassName =\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\";\n const errorClassName = error ? \"border-red-500 ring-1 ring-red-500\" : \"\";\n const combinedClassName =\n `${baseClassName} ${errorClassName} ${className}`.trim();\n\n return (\n <input\n type={type}\n id={id}\n name={name}\n value={value ?? \"\"}\n onChange={handleChange}\n onBlur={handleBlur}\n placeholder={placeholder}\n disabled={disabled}\n required={required}\n className={combinedClassName}\n aria-invalid={error || props[\"aria-invalid\"]}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n {...props}\n />\n );\n}\n\nTextInput.displayName = \"TextInput\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\n\n/**\n * Additional props specific to TextArea\n */\nexport interface TextAreaProps extends Omit<InputProps<string>, \"onChange\"> {\n /**\n * Number of visible text rows\n * @default 3\n */\n rows?: number;\n\n /**\n * Number of visible text columns (characters)\n */\n cols?: number;\n\n /**\n * Maximum character length\n */\n maxLength?: number;\n\n /**\n * Minimum character length\n */\n minLength?: number;\n\n /**\n * Text wrapping behavior\n * - soft: text wraps but newlines not submitted (default)\n * - hard: text wraps and newlines submitted (requires cols)\n * - off: no wrapping\n */\n wrap?: \"soft\" | \"hard\" | \"off\";\n\n /**\n * Change handler\n */\n onChange: (value: string) => void;\n\n /**\n * Additional native textarea attributes\n */\n [key: string]: any;\n}\n\n/**\n * TextArea - High-performance multi-line text input component\n *\n * A lightweight, accessible textarea with error state support.\n * Designed to work seamlessly with useForm and Field components.\n *\n * Features:\n * - Full accessibility support\n * - Error state styling\n * - Controlled input behavior\n * - Configurable rows and columns\n * - Text wrapping options\n * - Character length validation\n * - All native textarea attributes supported\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { bio: '' } });\n *\n * <TextArea\n * {...form.getFieldProps('bio')}\n * rows={5}\n * placeholder=\"Tell us about yourself\"\n * error={!!form.errors.bio}\n * aria-invalid={!!form.errors.bio}\n * aria-describedby={form.errors.bio ? 'bio-error' : undefined}\n * />\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/textarea\n */\nexport function TextArea({\n name,\n value,\n onChange,\n onBlur,\n placeholder,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n rows = 3,\n cols,\n maxLength,\n minLength,\n wrap = \"soft\",\n ...props\n}: TextAreaProps) {\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n onChange(e.target.value);\n };\n\n const handleBlur = () => {\n onBlur?.();\n };\n\n const baseClassName =\n \"flex min-h-20 w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\";\n const errorClassName = error ? \"border-red-500 ring-1 ring-red-500\" : \"\";\n const combinedClassName =\n `${baseClassName} ${errorClassName} ${className}`.trim();\n\n return (\n <textarea\n name={name}\n value={value ?? \"\"}\n onChange={handleChange}\n onBlur={handleBlur}\n placeholder={placeholder}\n disabled={disabled}\n required={required}\n className={combinedClassName}\n rows={rows}\n cols={cols}\n maxLength={maxLength}\n minLength={minLength}\n wrap={wrap}\n aria-invalid={error || props[\"aria-invalid\"]}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n {...props}\n />\n );\n}\n\nTextArea.displayName = \"TextArea\";\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\nimport { cn } from \"../utils\";\n\n/**\n * Additional props specific to Checkbox\n */\nexport interface CheckboxProps extends Omit<\n InputProps<boolean>,\n \"onChange\" | \"placeholder\"\n> {\n /**\n * Change handler - receives boolean checked state\n */\n onChange: (checked: boolean) => void;\n\n /**\n * Indeterminate state for partial selections\n * Useful for \"select all\" checkboxes with some items selected\n * @default false\n */\n indeterminate?: boolean;\n\n /**\n * Label text for the checkbox (primary text)\n */\n label?: React.ReactNode;\n\n /**\n * Optional description text below the label (secondary text)\n */\n description?: React.ReactNode;\n\n /**\n * Layout variant\n */\n checkboxVariant?: \"boxed\" | \"inline\";\n\n /**\n * Additional native input attributes\n */\n [key: string]: any;\n}\n\n/**\n * Checkbox - High-performance boolean input component\n *\n * A lightweight, accessible checkbox with error state support.\n * Designed to work seamlessly with useForm and Field components.\n *\n * Features:\n * - Full accessibility support (ARIA attributes)\n * - Error state styling\n * - Controlled input behavior\n * - Indeterminate state support\n * - Optional label and description text (with nil guards)\n * - Proper field-based layout structure\n * - All native checkbox attributes supported\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { terms: false } });\n *\n * <Checkbox\n * {...form.getFieldProps('terms')}\n * label=\"I agree to the terms and conditions\"\n * description=\"By clicking this checkbox, you agree to the terms.\"\n * error={!!form.errors.terms}\n * aria-describedby={form.errors.terms ? 'terms-error' : undefined}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // With indeterminate state\n * <Checkbox\n * name=\"selectAll\"\n * value={allSelected}\n * onChange={handleSelectAll}\n * indeterminate={someSelected}\n * label=\"Select all items\"\n * />\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/checkbox\n */\nexport function Checkbox({\n name,\n value,\n onChange,\n onBlur,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n indeterminate = false,\n label,\n description,\n checkboxVariant = \"boxed\",\n ...props\n}: CheckboxProps) {\n const inputRef = React.useRef<HTMLInputElement>(null);\n const checkboxId = props.id || `checkbox-${name}`;\n\n // Set indeterminate state on the native input element\n React.useEffect(() => {\n if (inputRef.current) {\n inputRef.current.indeterminate = indeterminate;\n }\n }, [indeterminate]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.checked);\n };\n\n const handleBlur = () => {\n onBlur?.();\n };\n\n const isActive = value || (indeterminate && !value);\n\n const checkbox = (\n <div\n className={cn(\n \"relative inline-flex items-center justify-center\",\n !label && className,\n )}\n >\n <input\n ref={inputRef}\n type=\"checkbox\"\n id={checkboxId}\n name={name}\n checked={value}\n onChange={handleChange}\n onBlur={handleBlur}\n disabled={disabled}\n required={required}\n className=\"peer sr-only\"\n aria-invalid={error || props[\"aria-invalid\"]}\n aria-describedby={\n description ? `${checkboxId}-description` : props[\"aria-describedby\"]\n }\n aria-required={required || props[\"aria-required\"]}\n {...props}\n />\n <div\n className={cn(\n \"flex shrink-0 items-center justify-center rounded-full border-2 transition-colors size-6\",\n !error && isActive && \"border-primary bg-primary text-primary-foreground\",\n !error && !isActive && \"border-input bg-transparent\",\n error && isActive && \"border-destructive bg-destructive text-destructive-foreground\",\n error && !isActive && \"border-destructive bg-transparent\",\n disabled && \"opacity-50\",\n \"peer-focus-visible:ring-2 peer-focus-visible:ring-ring/50 peer-focus-visible:ring-offset-1\",\n )}\n >\n {value && (\n <svg\n className=\"size-3.5\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )}\n {indeterminate && !value && (\n <svg\n className=\"size-3.5\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n )}\n </div>\n </div>\n );\n\n if (label) {\n return (\n <label\n className={cn(\n \"w-full h-full flex gap-3 p-3 duration-200\",\n checkboxVariant === \"boxed\" && \"border rounded-lg hover:ring-2\",\n checkboxVariant === \"boxed\" && value && \"ring-2\",\n disabled\n ? \"opacity-50 cursor-not-allowed hover:ring-0\"\n : \"cursor-pointer\",\n className,\n )}\n htmlFor={checkboxId}\n >\n <div className=\"flex w-full flex-row gap-2\">\n {checkbox}\n <div className=\"flex flex-col gap-0.5\">\n <div className=\"text-sm font-medium\">{label}</div>\n {description && (\n <p\n className=\"text-xs opacity-75\"\n id={`${checkboxId}-description`}\n >\n {description}\n </p>\n )}\n </div>\n </div>\n </label>\n );\n }\n\n return checkbox;\n}\n\nCheckbox.displayName = \"Checkbox\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\nimport { cn } from \"../utils\";\nimport { Checkbox } from \"./Checkbox\";\n\n/**\n * CheckboxGroup option type\n */\nexport interface CheckboxGroupOption {\n /**\n * The value for this checkbox option\n */\n value: string;\n\n /**\n * Display label for the option\n */\n label: React.ReactNode;\n\n /**\n * Optional description text below the label\n */\n description?: React.ReactNode;\n\n /**\n * Whether this option is disabled\n */\n disabled?: boolean;\n}\n\n/**\n * Additional props specific to CheckboxGroup\n */\nexport interface CheckboxGroupProps extends Omit<\n InputProps<string[]>,\n \"onChange\" | \"placeholder\"\n> {\n /**\n * Change handler - receives array of selected values\n */\n onChange: (values: string[]) => void;\n\n /**\n * Array of checkbox options\n */\n options: CheckboxGroupOption[];\n\n /**\n * Layout direction\n * @default \"stacked\"\n */\n layout?: \"inline\" | \"stacked\" | \"grid\";\n\n /**\n * Group-level label\n */\n label?: React.ReactNode;\n\n /**\n * Group-level description\n */\n description?: React.ReactNode;\n\n /**\n * Show \"select all\" checkbox\n * @default false\n */\n showSelectAll?: boolean;\n\n /**\n * Label for the select all checkbox\n * @default \"Select all\"\n */\n selectAllLabel?: string;\n\n /**\n * Minimum number of selections required\n */\n minSelections?: number;\n\n /**\n * Maximum number of selections allowed\n */\n maxSelections?: number;\n\n /**\n * Custom render function for options\n */\n renderOption?: (option: CheckboxGroupOption) => React.ReactNode;\n\n /**\n * Grid columns (only applies when layout=\"grid\")\n * @default 2\n */\n gridColumns?: number;\n\n /**\n * Additional native input attributes\n */\n [key: string]: any;\n}\n\n/**\n * CheckboxGroup - High-performance multiple selection component\n *\n * A lightweight, accessible checkbox group with error state support.\n * Designed to work seamlessly with useForm and Field components.\n *\n * Features:\n * - Full accessibility support (ARIA attributes, role=\"group\")\n * - Error state styling\n * - Controlled input behavior\n * - Multiple layout options (inline, stacked, grid)\n * - Optional \"select all\" checkbox\n * - Individual option disabled state\n * - Minimum/maximum selection validation\n * - Custom option rendering\n * - Optional descriptions for each option\n * - All native checkbox attributes supported\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { interests: [] } });\n *\n * <CheckboxGroup\n * {...form.getFieldProps('interests')}\n * label=\"Select your interests\"\n * options={[\n * { value: 'sports', label: 'Sports', description: 'Football, Basketball, etc.' },\n * { value: 'music', label: 'Music', description: 'All genres' },\n * { value: 'reading', label: 'Reading', description: 'Books and articles' }\n * ]}\n * showSelectAll\n * error={!!form.errors.interests}\n * aria-describedby={form.errors.interests ? 'interests-error' : undefined}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Grid layout with min/max selections\n * <CheckboxGroup\n * name=\"features\"\n * value={features}\n * onChange={handleFeaturesChange}\n * layout=\"grid\"\n * gridColumns={3}\n * minSelections={1}\n * maxSelections={3}\n * label=\"Select 1-3 features\"\n * options={[\n * { value: 'ssl', label: 'SSL Certificate' },\n * { value: 'cdn', label: 'CDN' },\n * { value: 'backup', label: 'Daily Backups' },\n * { value: 'support', label: '24/7 Support' }\n * ]}\n * />\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/checkbox-group\n */\nexport function CheckboxGroup({\n name,\n value = [],\n onChange,\n onBlur,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n layout = \"stacked\",\n label,\n description,\n options,\n showSelectAll = false,\n selectAllLabel = \"Select all\",\n minSelections,\n maxSelections,\n renderOption,\n gridColumns = 2,\n ...props\n}: CheckboxGroupProps) {\n // Calculate select all state\n const enabledOptions = options.filter((opt) => !opt.disabled);\n const enabledValues = enabledOptions.map((opt) => opt.value);\n const selectedEnabledCount = value.filter((v) =>\n enabledValues.includes(v),\n ).length;\n const allSelected = selectedEnabledCount === enabledOptions.length;\n const someSelected = selectedEnabledCount > 0 && !allSelected;\n\n const checkboxVariant: \"boxed\" | \"inline\" = React.useMemo(() => {\n if (options.some((opt) => opt.description)) {\n return \"boxed\";\n }\n return \"inline\";\n }, [options]);\n\n const countableValue: number = React.useMemo(() => {\n if (value?.length > 0) {\n return value.length;\n }\n return 0;\n }, [value]);\n\n // Handle individual checkbox change\n const handleChange = (optionValue: string, checked: boolean) => {\n const newValues = checked\n ? [...value, optionValue]\n : value.filter((v) => v !== optionValue);\n\n // Enforce max selections\n if (maxSelections && checked && newValues.length > maxSelections) {\n return;\n }\n\n onChange(newValues);\n };\n\n // Handle select all change\n const handleSelectAll = (checked: boolean) => {\n if (checked) {\n // Select all enabled options\n const allValues = enabledOptions.map((opt) => opt.value);\n onChange(allValues);\n } else {\n // Deselect all\n onChange([]);\n }\n };\n\n const handleBlur = () => {\n onBlur?.();\n };\n\n // Determine if max selections reached\n const maxReached = Boolean(maxSelections && countableValue >= maxSelections);\n\n const containerClass = cn(\n \"w-full gap-3\",\n layout === \"stacked\" && \"flex flex-col\",\n layout === \"inline\" && \"flex flex-row flex-wrap\",\n layout === \"grid\" && \"grid\",\n className,\n );\n\n return (\n <div\n className={containerClass}\n role=\"group\"\n aria-invalid={error || props[\"aria-invalid\"]}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n aria-label={typeof label === \"string\" ? label : props[\"aria-label\"]}\n style={\n layout === \"grid\"\n ? {\n gridTemplateColumns: `repeat(${gridColumns}, 1fr)`,\n }\n : undefined\n }\n >\n {label ? <div className=\"text-sm font-medium\">{label}</div> : null}\n {description ? (\n <div className=\"text-xs opacity-70\">{description}</div>\n ) : null}\n\n {/* Select All Checkbox */}\n {showSelectAll && enabledOptions.length > 0 && (\n <Checkbox\n name={`${name}-select-all`}\n id={`${name}-select-all`}\n value={allSelected}\n onChange={handleSelectAll}\n onBlur={handleBlur}\n indeterminate={someSelected}\n label={selectAllLabel}\n checkboxVariant=\"inline\"\n disabled={disabled}\n aria-label={selectAllLabel}\n />\n )}\n\n {/* Individual Checkboxes */}\n {options.map((option) => {\n const isChecked = value.includes(option.value);\n const isDisabled =\n disabled || option.disabled || (maxReached && !isChecked);\n\n return (\n <Checkbox\n key={option.value}\n name={name}\n id={`${name}-${option.value}`}\n value={isChecked}\n onChange={(checked) => handleChange(option.value, checked)}\n onBlur={handleBlur}\n disabled={isDisabled}\n required={\n required && minSelections ? value.length < minSelections : false\n }\n error={error}\n label={renderOption ? renderOption(option) : option.label}\n description={renderOption ? undefined : option.description}\n checkboxVariant={checkboxVariant}\n />\n );\n })}\n\n {/* Selection count feedback */}\n {(minSelections || maxSelections) && (\n <div\n className={cn(\n \"text-sm p-2 rounded-lg border font-semibold mt-2\",\n minSelections && countableValue < minSelections\n ? \"border-destructive bg-destructive/80 text-destructive-foreground\"\n : \"border-border bg-card text-card-foreground\",\n )}\n aria-live=\"polite\"\n >\n {minSelections && countableValue < minSelections && (\n <span>\n Select at least {minSelections} option\n {minSelections !== 1 ? \"s\" : \"\"}\n </span>\n )}\n {maxSelections && (\n <span>\n {countableValue}/{maxSelections} selected\n </span>\n )}\n </div>\n )}\n </div>\n );\n}\n\nCheckboxGroup.displayName = \"CheckboxGroup\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\nimport { cn } from \"../utils\";\n\n/**\n * Radio option type\n */\nexport interface RadioOption {\n /**\n * The value for this radio option\n */\n value: string;\n\n /**\n * Display label for the option (primary text)\n */\n label: React.ReactNode;\n\n /**\n * Optional description text below the label (secondary text)\n */\n description?: React.ReactNode;\n\n /**\n * Whether this option is disabled\n */\n disabled?: boolean;\n}\n\n/**\n * Additional props specific to Radio\n */\nexport interface RadioProps extends Omit<\n InputProps<string>,\n \"onChange\" | \"placeholder\"\n> {\n /**\n * Change handler - receives selected value\n */\n onChange: (value: string) => void;\n\n /**\n * Array of radio options\n */\n options: RadioOption[];\n\n /**\n * Layout direction\n * @default \"stacked\"\n */\n layout?: \"inline\" | \"stacked\";\n\n /**\n * Group-level label\n */\n label?: React.ReactNode;\n\n /**\n * Additional native input attributes\n */\n [key: string]: any;\n}\n\n/**\n * Radio - High-performance single selection component\n *\n * A lightweight, accessible radio group with error state support.\n * Designed to work seamlessly with useForm and Field components.\n *\n * Features:\n * - Full accessibility support (ARIA attributes, role=\"radiogroup\")\n * - Error state styling\n * - Controlled input behavior\n * - Keyboard navigation (arrow keys)\n * - Inline or stacked layout\n * - Optional descriptions for each option (with nil guard)\n * - Individual option disabled state\n * - Card-based styling with proper visual hierarchy\n * - All native radio attributes supported\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { plan: 'basic' } });\n *\n * <Radio\n * {...form.getFieldProps('plan')}\n * label=\"Select your plan\"\n * options={[\n * { value: 'basic', label: 'Basic', description: '$9/month' },\n * { value: 'pro', label: 'Pro', description: '$29/month' },\n * { value: 'enterprise', label: 'Enterprise', description: '$99/month' }\n * ]}\n * error={!!form.errors.plan}\n * aria-describedby={form.errors.plan ? 'plan-error' : undefined}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Inline layout\n * <Radio\n * name=\"size\"\n * value={size}\n * onChange={handleSizeChange}\n * layout=\"inline\"\n * options={[\n * { value: 'sm', label: 'Small' },\n * { value: 'md', label: 'Medium' },\n * { value: 'lg', label: 'Large' }\n * ]}\n * />\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/radio\n */\nexport function Radio({\n name,\n value,\n onChange,\n onBlur,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n layout = \"stacked\",\n label,\n options,\n ...props\n}: RadioProps) {\n const handleChange = (optionValue: string) => {\n onChange(optionValue);\n };\n\n const handleKeyDown = (\n e: React.KeyboardEvent<HTMLLabelElement>,\n currentIndex: number,\n ) => {\n if (e.key === \"ArrowDown\" || e.key === \"ArrowRight\") {\n e.preventDefault();\n // Find next non-disabled option\n let nextIndex = (currentIndex + 1) % options.length;\n let attempts = 0;\n while (\n options[nextIndex].disabled &&\n attempts < options.length &&\n !disabled\n ) {\n nextIndex = (nextIndex + 1) % options.length;\n attempts++;\n }\n if (!options[nextIndex].disabled) {\n handleChange(options[nextIndex].value);\n }\n } else if (e.key === \"ArrowUp\" || e.key === \"ArrowLeft\") {\n e.preventDefault();\n // Find previous non-disabled option\n let prevIndex = (currentIndex - 1 + options.length) % options.length;\n let attempts = 0;\n while (\n options[prevIndex].disabled &&\n attempts < options.length &&\n !disabled\n ) {\n prevIndex = (prevIndex - 1 + options.length) % options.length;\n attempts++;\n }\n if (!options[prevIndex].disabled) {\n handleChange(options[prevIndex].value);\n }\n }\n };\n\n const handleBlur = () => {\n onBlur?.();\n };\n\n const useChoiceCard: boolean = React.useMemo(() => {\n return options.some((option) => option.description);\n }, [options]);\n\n const containerClass = React.useMemo(() => {\n return cn(\n \"w-full gap-3 grid grid-cols-1\",\n layout === \"inline\" && \"md:grid-cols-2\",\n className,\n );\n }, [layout, className]);\n\n return (\n <div\n className={containerClass}\n role=\"radiogroup\"\n aria-invalid={error || props[\"aria-invalid\"]}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n aria-label={typeof label === \"string\" ? label : props[\"aria-label\"]}\n >\n {label && <div className=\"text-sm font-medium mb-2\">{label}</div>}\n {options.map((option, index) => {\n const isChecked = value === option.value;\n const isDisabled = disabled || option.disabled;\n const radioId = `${name}-${option.value}`;\n\n const hasDescription =\n option.description != null && option.description !== \"\";\n\n const radioIndicator = (\n <div className=\"relative inline-flex items-center justify-center\">\n <input\n type=\"radio\"\n id={radioId}\n name={name}\n value={option.value}\n checked={isChecked}\n onChange={(e) => handleChange(e.target.value)}\n onBlur={handleBlur}\n disabled={isDisabled}\n required={required}\n className=\"peer sr-only\"\n aria-describedby={\n hasDescription\n ? `${radioId}-description`\n : props[\"aria-describedby\"]\n }\n />\n <div\n className={cn(\n \"flex shrink-0 items-center justify-center rounded-full border-2 transition-colors size-6\",\n !error && isChecked && \"border-primary bg-transparent\",\n !error && !isChecked && \"border-input bg-transparent\",\n error && isChecked && \"border-destructive bg-transparent\",\n error && !isChecked && \"border-destructive bg-transparent\",\n isDisabled && \"opacity-50\",\n \"peer-focus-visible:ring-2 peer-focus-visible:ring-ring/50 peer-focus-visible:ring-offset-1\",\n )}\n >\n {isChecked && <div className=\"size-3 rounded-full bg-primary\" />}\n </div>\n </div>\n );\n\n const labelContent = (\n <div className=\"flex flex-col gap-0.5\">\n <div className=\"text-sm font-medium\">{option.label}</div>\n {hasDescription && (\n <p className=\"text-xs opacity-75\" id={`${radioId}-description`}>\n {option.description}\n </p>\n )}\n </div>\n );\n\n return (\n <label\n key={option.value}\n className={cn(\n \"w-full h-full flex gap-3 p-3 duration-200\",\n useChoiceCard && \"border rounded-lg hover:ring-2\",\n useChoiceCard && isChecked && \"ring-2\",\n isDisabled\n ? \"opacity-50 cursor-not-allowed hover:ring-0\"\n : \"cursor-pointer\",\n )}\n htmlFor={radioId}\n onKeyDown={(e) => handleKeyDown(e, index)}\n tabIndex={isDisabled ? -1 : 0}\n >\n <div className=\"flex w-full flex-row items-center gap-2\">\n {!useChoiceCard && radioIndicator}\n <div className=\"flex flex-1 flex-col gap-0.5\">{labelContent}</div>\n {useChoiceCard && radioIndicator}\n </div>\n </label>\n );\n })}\n </div>\n );\n}\n\nRadio.displayName = \"Radio\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\n\n/**\n * Select option type\n */\nexport interface SelectOption {\n /**\n * The value for this option\n */\n value: string;\n\n /**\n * Display label for the option\n */\n label: React.ReactNode;\n\n /**\n * Whether this option is disabled\n */\n disabled?: boolean;\n}\n\n/**\n * Select option group type for organizing options\n */\nexport interface SelectOptionGroup {\n /**\n * Group label\n */\n label: string;\n\n /**\n * Options in this group\n */\n options: SelectOption[];\n}\n\n/**\n * Additional props specific to Select\n */\nexport interface SelectProps extends Omit<\n InputProps<string>,\n \"onChange\" | \"onFocus\"\n> {\n /**\n * Change handler - receives selected value\n */\n onChange: (value: string) => void;\n\n /**\n * Focus handler\n */\n onFocus?: () => void;\n\n /**\n * Array of select options (flat structure)\n */\n options?: SelectOption[];\n\n /**\n * Array of option groups (grouped structure)\n */\n optionGroups?: SelectOptionGroup[];\n\n /**\n * Placeholder text when no option is selected\n * @default \"Select...\"\n */\n placeholder?: string;\n\n /**\n * Enable search/filter functionality\n * @default true\n */\n searchable?: boolean;\n\n /**\n * Enable clearable button to reset selection\n * @default true\n */\n clearable?: boolean;\n\n /**\n * Loading state for async options\n * @default false\n */\n loading?: boolean;\n\n /**\n * Custom render function for options\n */\n renderOption?: (option: SelectOption) => React.ReactNode;\n\n /**\n * Additional native input attributes\n */\n [key: string]: any;\n}\n\n/**\n * Select - High-performance dropdown selection component\n *\n * A lightweight, accessible select/dropdown with search, keyboard navigation,\n * and error state support. Designed to work seamlessly with useForm and Field components.\n *\n * Features:\n * - Full accessibility support (ARIA attributes, role=\"combobox\")\n * - Error state styling\n * - Controlled input behavior\n * - Keyboard navigation (arrow keys, Enter, Escape, type-ahead)\n * - Searchable options with filtering\n * - Clearable selection\n * - Option groups support\n * - Loading state for async options\n * - Disabled options support\n * - Click outside to close\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { country: '' } });\n *\n * <Select\n * {...form.getFieldProps('country')}\n * placeholder=\"Select a country\"\n * options={[\n * { value: 'us', label: 'United States' },\n * { value: 'ca', label: 'Canada' },\n * { value: 'mx', label: 'Mexico' }\n * ]}\n * searchable\n * clearable\n * error={!!form.errors.country}\n * aria-describedby={form.errors.country ? 'country-error' : undefined}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // With option groups\n * <Select\n * name=\"timezone\"\n * value={timezone}\n * onChange={handleTimezoneChange}\n * optionGroups={[\n * {\n * label: 'North America',\n * options: [\n * { value: 'est', label: 'Eastern Time' },\n * { value: 'cst', label: 'Central Time' }\n * ]\n * },\n * {\n * label: 'Europe',\n * options: [\n * { value: 'gmt', label: 'GMT' },\n * { value: 'cet', label: 'Central European Time' }\n * ]\n * }\n * ]}\n * />\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/select\n */\nexport function Select({\n name,\n value,\n onChange,\n onBlur,\n onFocus,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n placeholder = \"Select...\",\n searchable = true,\n clearable = true,\n loading = false,\n options = [],\n optionGroups = [],\n renderOption,\n ...props\n}: SelectProps) {\n const [isOpen, setIsOpen] = React.useState(false);\n const [searchQuery, setSearchQuery] = React.useState(\"\");\n const [focusedIndex, setFocusedIndex] = React.useState(-1);\n const selectRef = React.useRef<HTMLDivElement>(null);\n const searchInputRef = React.useRef<HTMLInputElement>(null);\n const dropdownId = `${name}-dropdown`;\n\n // Flatten options from groups or use flat options\n const allOptions = React.useMemo(() => {\n if (optionGroups.length > 0) {\n return optionGroups.flatMap((group) => group.options);\n }\n return options;\n }, [options, optionGroups]);\n\n // Filter options based on search query\n const filteredOptions = React.useMemo(() => {\n if (!searchQuery.trim()) {\n return allOptions;\n }\n const query = searchQuery.toLowerCase();\n return allOptions.filter((option) => {\n const label =\n typeof option.label === \"string\" ? option.label : String(option.label);\n return label.toLowerCase().includes(query);\n });\n }, [allOptions, searchQuery]);\n\n // Get selected option\n const selectedOption = React.useMemo(() => {\n return allOptions.find((opt) => opt.value === value);\n }, [allOptions, value]);\n\n // Handle option selection\n const handleSelect = (optionValue: string) => {\n onChange(optionValue);\n setIsOpen(false);\n setSearchQuery(\"\");\n setFocusedIndex(-1);\n };\n\n // Handle clear selection\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange(\"\");\n setSearchQuery(\"\");\n setFocusedIndex(-1);\n };\n\n // Toggle dropdown\n const handleToggle = () => {\n if (disabled) return;\n const newIsOpen = !isOpen;\n setIsOpen(newIsOpen);\n if (newIsOpen && searchable && searchInputRef.current) {\n // Focus search input when opening\n setTimeout(() => searchInputRef.current?.focus(), 0);\n }\n if (newIsOpen) {\n onFocus?.();\n }\n };\n\n // Handle search input change\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchQuery(e.target.value);\n setFocusedIndex(0); // Reset focus to first filtered option\n };\n\n // Keyboard navigation\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) return;\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n setFocusedIndex(0);\n } else {\n const enabledOptions = filteredOptions.filter((opt) => !opt.disabled);\n if (enabledOptions.length > 0) {\n const currentIndexInFiltered = focusedIndex;\n const nextIndex =\n (currentIndexInFiltered + 1) % enabledOptions.length;\n setFocusedIndex(filteredOptions.indexOf(enabledOptions[nextIndex]));\n }\n }\n break;\n\n case \"ArrowUp\":\n e.preventDefault();\n if (isOpen) {\n const enabledOptions = filteredOptions.filter((opt) => !opt.disabled);\n if (enabledOptions.length > 0) {\n const currentIndexInFiltered = focusedIndex;\n const prevIndex =\n (currentIndexInFiltered - 1 + enabledOptions.length) %\n enabledOptions.length;\n setFocusedIndex(filteredOptions.indexOf(enabledOptions[prevIndex]));\n }\n }\n break;\n\n case \"Enter\":\n e.preventDefault();\n if (\n isOpen &&\n focusedIndex >= 0 &&\n focusedIndex < filteredOptions.length\n ) {\n const focusedOption = filteredOptions[focusedIndex];\n if (!focusedOption.disabled) {\n handleSelect(focusedOption.value);\n }\n } else if (!isOpen) {\n setIsOpen(true);\n }\n break;\n\n case \"Escape\":\n e.preventDefault();\n if (isOpen) {\n setIsOpen(false);\n setSearchQuery(\"\");\n setFocusedIndex(-1);\n }\n break;\n\n case \" \":\n // Space key to open dropdown if not searching\n if (!isOpen && !searchable) {\n e.preventDefault();\n setIsOpen(true);\n }\n break;\n\n default:\n // Type-ahead search (only if not already searching)\n if (!searchable && e.key.length === 1 && !e.ctrlKey && !e.metaKey) {\n const char = e.key.toLowerCase();\n const matchingOption = filteredOptions.find((opt) => {\n const label =\n typeof opt.label === \"string\" ? opt.label : String(opt.label);\n return label.toLowerCase().startsWith(char) && !opt.disabled;\n });\n if (matchingOption) {\n handleSelect(matchingOption.value);\n }\n }\n break;\n }\n };\n\n // Handle blur\n const handleBlur = () => {\n onBlur?.();\n };\n\n // Close dropdown when clicking outside\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n selectRef.current &&\n !selectRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n setSearchQuery(\"\");\n setFocusedIndex(-1);\n handleBlur();\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }\n }, [isOpen]);\n\n const combinedClassName = `relative w-full ${className}`.trim();\n\n return (\n <div\n ref={selectRef}\n className={combinedClassName}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n >\n {/* Hidden native select for form submission */}\n <select\n name={name}\n value={value}\n onChange={() => {}}\n disabled={disabled}\n required={required}\n aria-hidden=\"true\"\n tabIndex={-1}\n style={{ display: \"none\" }}\n >\n <option value=\"\">Select...</option>\n {allOptions.map((option) => (\n <option key={option.value} value={option.value}>\n {typeof option.label === \"string\" ? option.label : option.value}\n </option>\n ))}\n </select>\n\n {/* Custom select trigger */}\n <div\n className={`flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm cursor-pointer transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring ${disabled ? \"cursor-not-allowed opacity-50 pointer-events-none\" : \"\"} ${error ? \"border-red-500 ring-1 ring-red-500\" : \"\"}`}\n onClick={handleToggle}\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-controls={dropdownId}\n aria-invalid={error || props[\"aria-invalid\"]}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n aria-disabled={disabled}\n tabIndex={disabled ? -1 : 0}\n >\n <span className=\"flex items-center flex-1 overflow-hidden text-ellipsis\">\n {selectedOption ? (\n renderOption ? (\n renderOption(selectedOption)\n ) : (\n selectedOption.label\n )\n ) : (\n <span className=\"relative\">{placeholder}</span>\n )}\n </span>\n <div className=\"flex items-center gap-1 ml-2\">\n {loading && <span className=\"text-xs\">⏳</span>}\n {clearable && value && !disabled && !loading && (\n <button\n type=\"button\"\n className=\"flex items-center justify-center h-4 w-4 rounded-sm border-none bg-transparent cursor-pointer text-xs p-0 transition-opacity hover:opacity-70\"\n onClick={handleClear}\n aria-label=\"Clear selection\"\n tabIndex={-1}\n >\n ✕\n </button>\n )}\n <span className=\"text-xs leading-none\" aria-hidden=\"true\">\n {isOpen ? \"▲\" : \"▼\"}\n </span>\n </div>\n </div>\n\n {/* Dropdown */}\n {isOpen && (\n <div\n id={dropdownId}\n className=\"absolute z-50 top-full mt-1 min-w-full overflow-hidden rounded-md border border-border bg-popover text-popover-foreground shadow-md\"\n role=\"listbox\"\n >\n {searchable && (\n <div className=\"p-2 border-b border-border\">\n <input\n ref={searchInputRef}\n type=\"text\"\n className=\"w-full border border-input rounded px-2 py-1 text-sm bg-transparent outline-none focus:ring-1 focus:ring-ring\"\n placeholder=\"Search...\"\n value={searchQuery}\n onChange={handleSearchChange}\n onClick={(e) => e.stopPropagation()}\n aria-label=\"Search options\"\n />\n </div>\n )}\n\n <div className=\"max-h-64 overflow-y-auto p-1\">\n {filteredOptions.length === 0 ? (\n <div className=\"py-2 px-3 text-center text-sm \">\n No options found\n </div>\n ) : optionGroups.length > 0 ? (\n // Render grouped options\n optionGroups.map((group, groupIndex) => {\n const groupOptions = group.options.filter((opt) =>\n filteredOptions.includes(opt),\n );\n if (groupOptions.length === 0) return null;\n\n return (\n <div key={groupIndex} className=\"py-1\">\n <div className=\"py-1.5 px-2 text-xs font-semibold \">\n {group.label}\n </div>\n {groupOptions.map((option) => {\n const globalIndex = filteredOptions.indexOf(option);\n const isSelected = value === option.value;\n const isFocused = globalIndex === focusedIndex;\n const isDisabled = option.disabled;\n\n return (\n <div\n key={option.value}\n className={`relative flex w-full cursor-pointer items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors hover:bg-muted ${isFocused ? \"bg-muted\" : \"\"} ${isSelected ? \"font-medium bg-muted\" : \"\"} ${isDisabled ? \"pointer-events-none opacity-50\" : \"\"}`}\n onClick={() =>\n !isDisabled && handleSelect(option.value)\n }\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={isDisabled}\n >\n {renderOption ? renderOption(option) : option.label}\n </div>\n );\n })}\n </div>\n );\n })\n ) : (\n // Render flat options\n filteredOptions.map((option, index) => {\n const isSelected = value === option.value;\n const isFocused = index === focusedIndex;\n const isDisabled = option.disabled;\n\n return (\n <div\n key={option.value}\n className={`relative flex w-full cursor-pointer items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors hover:bg-muted ${isFocused ? \"bg-muted\" : \"\"} ${isSelected ? \"font-medium bg-muted\" : \"\"} ${isDisabled ? \"pointer-events-none opacity-50\" : \"\"}`}\n onClick={() => !isDisabled && handleSelect(option.value)}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={isDisabled}\n >\n {renderOption ? renderOption(option) : option.label}\n </div>\n );\n })\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nSelect.displayName = \"Select\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\n\n/**\n * File validation error details\n */\nexport interface FileValidationError {\n file: File;\n error: \"type\" | \"size\" | \"count\";\n message: string;\n}\n\n/**\n * Upload progress tracking per file\n */\nexport interface FileUploadProgress {\n [fileName: string]: number; // 0-100\n}\n\n/**\n * Crop area coordinates\n */\nexport interface CropArea {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/**\n * FileInput component props\n */\nexport interface FileInputProps extends Omit<\n InputProps<File[]>,\n \"value\" | \"onChange\"\n> {\n /**\n * Current file value(s)\n */\n value?: File[];\n\n /**\n * Change handler receives array of files\n */\n onChange: (files: File[]) => void;\n\n /**\n * Accepted file types (MIME types or extensions)\n * @example \".pdf,.doc,.docx\"\n * @example \"image/*,application/pdf\"\n */\n accept?: string;\n\n /**\n * Maximum file size in bytes\n * @default 5MB (5 * 1024 * 1024)\n */\n maxSize?: number;\n\n /**\n * Maximum number of files\n * @default 1\n */\n maxFiles?: number;\n\n /**\n * Allow multiple file selection\n * @default false\n */\n multiple?: boolean;\n\n /**\n * Show file preview thumbnails\n * @default true\n */\n showPreview?: boolean;\n\n /**\n * Show upload progress indicators\n * @default true\n */\n showProgress?: boolean;\n\n /**\n * Upload progress per file (0-100)\n * Consumer should update this during upload\n */\n uploadProgress?: FileUploadProgress;\n\n /**\n * Enable image cropping for image files\n * @default false\n */\n enableCropping?: boolean;\n\n /**\n * Crop aspect ratio (width / height)\n * @default Free form (no constraint)\n * @example 16/9, 1, 4/3\n */\n cropAspectRatio?: number;\n\n /**\n * Crop complete handler - receives cropped blob and original file\n */\n onCropComplete?: (croppedBlob: Blob, originalFile: File) => void;\n\n /**\n * Validation error handler\n */\n onValidationError?: (errors: FileValidationError[]) => void;\n\n /**\n * File removed handler\n */\n onFileRemove?: (file: File, index: number) => void;\n}\n\n/**\n * FileInput component for file selection with validation, progress tracking, and image cropping\n *\n * Features:\n * - Drag-and-drop file upload\n * - File type and size validation\n * - Image preview thumbnails\n * - Upload progress indicators\n * - Image cropping with aspect ratio control\n * - Multiple file support\n *\n * @example\n * ```tsx\n * <FileInput\n * name=\"resume\"\n * accept=\".pdf,.doc,.docx\"\n * maxSize={5 * 1024 * 1024}\n * value={files}\n * onChange={(files) => setFiles(files)}\n * error={hasError}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // With upload progress\n * <FileInput\n * name=\"photos\"\n * accept=\"image/*\"\n * multiple\n * value={files}\n * onChange={setFiles}\n * showProgress\n * uploadProgress={progress}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // With image cropping\n * <FileInput\n * name=\"avatar\"\n * accept=\"image/*\"\n * value={files}\n * onChange={setFiles}\n * enableCropping\n * cropAspectRatio={1}\n * onCropComplete={(blob, file) => {\n * // Handle cropped image\n * }}\n * />\n * ```\n */\nexport function FileInput({\n name,\n value = [],\n onChange,\n onBlur,\n placeholder = \"Choose file...\",\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n accept,\n maxSize = 5 * 1024 * 1024, // 5MB default\n maxFiles = 1,\n multiple = false,\n showPreview = true,\n showProgress = true,\n uploadProgress = {},\n enableCropping = false,\n cropAspectRatio,\n onCropComplete,\n onValidationError,\n onFileRemove,\n ...props\n}: FileInputProps) {\n const inputRef = React.useRef<HTMLInputElement>(null);\n const [dragActive, setDragActive] = React.useState(false);\n const [cropperOpen, setCropperOpen] = React.useState(false);\n const [imageToCrop, setImageToCrop] = React.useState<{\n file: File;\n url: string;\n } | null>(null);\n const [crop, setCrop] = React.useState({ x: 0, y: 0 });\n const [zoom, setZoom] = React.useState(1);\n const [croppedAreaPixels, setCroppedAreaPixels] =\n React.useState<CropArea | null>(null);\n\n /**\n * Validate file against constraints\n */\n const validateFile = React.useCallback(\n (file: File): FileValidationError | null => {\n // Validate file type\n if (accept) {\n const acceptedTypes = accept.split(\",\").map((t) => t.trim());\n const isValidType = acceptedTypes.some((type) => {\n if (type.startsWith(\".\")) {\n // Extension match\n return file.name.toLowerCase().endsWith(type.toLowerCase());\n } else if (type.endsWith(\"/*\")) {\n // MIME type wildcard match (e.g., \"image/*\")\n const baseType = type.split(\"/\")[0];\n return file.type.startsWith(baseType + \"/\");\n } else {\n // Exact MIME type match\n return file.type === type;\n }\n });\n\n if (!isValidType) {\n return {\n file,\n error: \"type\",\n message: `File type \"${file.type}\" is not accepted. Accepted types: ${accept}`,\n };\n }\n }\n\n // Validate file size\n if (file.size > maxSize) {\n const maxSizeMB = (maxSize / (1024 * 1024)).toFixed(2);\n const fileSizeMB = (file.size / (1024 * 1024)).toFixed(2);\n return {\n file,\n error: \"size\",\n message: `File size ${fileSizeMB}MB exceeds maximum ${maxSizeMB}MB`,\n };\n }\n\n return null;\n },\n [accept, maxSize],\n );\n\n /**\n * Handle file selection from input or drop\n */\n const handleFiles = React.useCallback(\n (fileList: FileList | null) => {\n if (!fileList || fileList.length === 0) return;\n\n const newFiles = Array.from(fileList);\n const validationErrors: FileValidationError[] = [];\n const validFiles: File[] = [];\n\n // Validate each file\n for (const file of newFiles) {\n const validationError = validateFile(file);\n if (validationError) {\n validationErrors.push(validationError);\n } else {\n validFiles.push(file);\n }\n }\n\n // Check max files constraint\n const totalFiles = value.length + validFiles.length;\n if (totalFiles > maxFiles) {\n validationErrors.push({\n file: validFiles[0], // Use first file as reference\n error: \"count\",\n message: `Maximum ${maxFiles} file(s) allowed. Attempting to add ${validFiles.length} to existing ${value.length}.`,\n });\n }\n\n // Notify validation errors\n if (validationErrors.length > 0 && onValidationError) {\n onValidationError(validationErrors);\n }\n\n // Handle valid files\n if (validFiles.length > 0 && totalFiles <= maxFiles) {\n // If cropping is enabled and file is an image, open cropper for first image\n const firstImage = validFiles.find((f) => f.type.startsWith(\"image/\"));\n if (enableCropping && firstImage && !multiple) {\n // Open cropper for single image\n const previewUrl = URL.createObjectURL(firstImage);\n setImageToCrop({ file: firstImage, url: previewUrl });\n setCropperOpen(true);\n } else {\n // Add files directly\n const updatedFiles = multiple\n ? [...value, ...validFiles]\n : validFiles;\n onChange(updatedFiles.slice(0, maxFiles));\n }\n }\n\n // Reset input value to allow same file selection again\n if (inputRef.current) {\n inputRef.current.value = \"\";\n }\n },\n [\n value,\n onChange,\n validateFile,\n maxFiles,\n multiple,\n enableCropping,\n onValidationError,\n ],\n );\n\n /**\n * Create cropped image from canvas\n */\n const createCroppedImage = React.useCallback(\n async (imageUrl: string, cropArea: CropArea): Promise<Blob> => {\n return new Promise((resolve, reject) => {\n const image = new Image();\n image.onload = () => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n reject(new Error(\"Failed to get canvas context\"));\n return;\n }\n\n // Set canvas size to crop area\n canvas.width = cropArea.width;\n canvas.height = cropArea.height;\n\n // Draw cropped image\n ctx.drawImage(\n image,\n cropArea.x,\n cropArea.y,\n cropArea.width,\n cropArea.height,\n 0,\n 0,\n cropArea.width,\n cropArea.height,\n );\n\n // Convert canvas to blob\n canvas.toBlob(\n (blob) => {\n if (blob) {\n resolve(blob);\n } else {\n reject(new Error(\"Failed to create blob from canvas\"));\n }\n },\n \"image/jpeg\",\n 0.95,\n );\n };\n image.onerror = () => {\n reject(new Error(\"Failed to load image\"));\n };\n image.src = imageUrl;\n });\n },\n [],\n );\n\n /**\n * Handle crop completion\n */\n const handleCropSave = React.useCallback(async () => {\n if (!imageToCrop || !croppedAreaPixels) return;\n\n try {\n const croppedBlob = await createCroppedImage(\n imageToCrop.url,\n croppedAreaPixels,\n );\n\n // Notify parent of cropped image\n if (onCropComplete) {\n onCropComplete(croppedBlob, imageToCrop.file);\n }\n\n // Create new file from blob\n const croppedFile = new File([croppedBlob], imageToCrop.file.name, {\n type: \"image/jpeg\",\n });\n\n // Update files\n const updatedFiles = multiple ? [...value, croppedFile] : [croppedFile];\n onChange(updatedFiles);\n\n // Close cropper\n setCropperOpen(false);\n URL.revokeObjectURL(imageToCrop.url);\n setImageToCrop(null);\n setCrop({ x: 0, y: 0 });\n setZoom(1);\n setCroppedAreaPixels(null);\n } catch (error) {\n console.error(\"Failed to crop image:\", error);\n }\n }, [\n imageToCrop,\n croppedAreaPixels,\n createCroppedImage,\n onCropComplete,\n value,\n onChange,\n multiple,\n ]);\n\n /**\n * Handle crop cancel\n */\n const handleCropCancel = React.useCallback(() => {\n if (imageToCrop) {\n URL.revokeObjectURL(imageToCrop.url);\n }\n setCropperOpen(false);\n setImageToCrop(null);\n setCrop({ x: 0, y: 0 });\n setZoom(1);\n setCroppedAreaPixels(null);\n }, [imageToCrop]);\n\n /**\n * Handle crop change\n */\n const onCropChange = React.useCallback((crop: { x: number; y: number }) => {\n setCrop(crop);\n }, []);\n\n /**\n * Handle zoom change\n */\n const onZoomChange = React.useCallback((zoom: number) => {\n setZoom(zoom);\n }, []);\n\n /**\n * Handle crop complete (receives pixel coordinates)\n */\n const onCropCompleteInternal = React.useCallback(\n (_: any, croppedAreaPixels: CropArea) => {\n setCroppedAreaPixels(croppedAreaPixels);\n },\n [],\n );\n\n /**\n * Handle input change event\n */\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n handleFiles(e.target.files);\n };\n\n /**\n * Handle file removal\n */\n const handleRemove = (index: number) => {\n const fileToRemove = value[index];\n const updatedFiles = value.filter((_, i) => i !== index);\n onChange(updatedFiles);\n\n if (onFileRemove && fileToRemove) {\n onFileRemove(fileToRemove, index);\n }\n };\n\n /**\n * Handle crop button click for existing file\n */\n const handleCrop = (file: File) => {\n if (!file.type.startsWith(\"image/\")) return;\n const previewUrl = URL.createObjectURL(file);\n setImageToCrop({ file, url: previewUrl });\n setCropperOpen(true);\n };\n\n /**\n * Handle drag events\n */\n const handleDrag = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (e.type === \"dragenter\" || e.type === \"dragover\") {\n setDragActive(true);\n } else if (e.type === \"dragleave\") {\n setDragActive(false);\n }\n };\n\n /**\n * Handle drop event\n */\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(false);\n\n if (disabled) return;\n\n handleFiles(e.dataTransfer.files);\n };\n\n /**\n * Trigger file input click\n */\n const handleClick = () => {\n inputRef.current?.click();\n };\n\n /**\n * Handle keyboard interaction\n */\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleClick();\n }\n };\n\n /**\n * Format file size for display\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 /**\n * Generate file preview URL for images\n */\n const getPreviewUrl = (file: File): string | null => {\n if (file.type.startsWith(\"image/\")) {\n return URL.createObjectURL(file);\n }\n return null;\n };\n\n // Cleanup preview URLs on unmount and when files change\n React.useEffect(() => {\n return () => {\n value.forEach((file) => {\n const previewUrl = getPreviewUrl(file);\n if (previewUrl) {\n URL.revokeObjectURL(previewUrl);\n }\n });\n // Cleanup crop image URL if present\n if (imageToCrop) {\n URL.revokeObjectURL(imageToCrop.url);\n }\n };\n }, [value, imageToCrop]);\n\n const combinedClassName = `${className}`.trim();\n\n return (\n <div className={combinedClassName}>\n {/* Hidden file input */}\n <input\n ref={inputRef}\n type=\"file\"\n name={name}\n onChange={handleChange}\n onBlur={onBlur}\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n required={required && value.length === 0}\n aria-invalid={error || props[\"aria-invalid\"]}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n style={{ display: \"none\" }}\n />\n\n {/* Drop zone */}\n <div\n className={`flex min-h-32 w-full cursor-pointer items-center justify-center rounded-md border-2 border-dashed border-input bg-transparent p-6 transition-colors hover:bg-primary/50 hover:border-ring ${dragActive ? \"bg-primary text-primary-foreground border-ring\" : \"\"} ${disabled ? \"cursor-not-allowed opacity-50\" : \"\"} ${error ? \"border-red-500\" : \"\"}`}\n onDragEnter={handleDrag}\n onDragLeave={handleDrag}\n onDragOver={handleDrag}\n onDrop={handleDrop}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-label={placeholder}\n aria-disabled={disabled}\n >\n <div className=\"flex flex-col items-center gap-2 text-center\">\n <svg\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n <p className=\"text-sm font-medium\">\n {value.length > 0\n ? `${value.length} file(s) selected`\n : placeholder}\n </p>\n {accept && <p className=\"text-xs\">Accepted: {accept}</p>}\n {maxSize && (\n <p className=\"text-xs \">Max size: {formatFileSize(maxSize)}</p>\n )}\n </div>\n </div>\n\n {/* File list */}\n {value.length > 0 && (\n <ul className=\"flex flex-col gap-2 mt-4\" role=\"list\">\n {value.map((file, index) => {\n const previewUrl = showPreview ? getPreviewUrl(file) : null;\n\n return (\n <li\n key={`${file.name}-${index}`}\n className=\"flex items-center gap-3 p-3 rounded-md border border-border bg-card text-card-foreground hover:bg-primary/50 transition-colors\"\n >\n {previewUrl && (\n <img\n src={previewUrl}\n alt={file.name}\n className=\"w-12 h-12 rounded object-cover\"\n width=\"48\"\n height=\"48\"\n />\n )}\n <div className=\"flex flex-col flex-1 min-w-0\">\n <span className=\"text-sm font-medium truncate\">\n {file.name}\n </span>\n <span className=\"text-xs\">{formatFileSize(file.size)}</span>\n {/* Upload progress indicator */}\n {showProgress && uploadProgress[file.name] !== undefined && (\n <div className=\"flex items-center gap-2 mt-1\">\n <div\n className=\"h-1.5 bg-muted rounded-full overflow-hidden flex-1\"\n role=\"progressbar\"\n aria-valuenow={uploadProgress[file.name]}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`Upload progress: ${uploadProgress[file.name]}%`}\n >\n <div\n className=\"h-full bg-primary transition-all\"\n style={{ width: `${uploadProgress[file.name]}%` }}\n />\n </div>\n <span className=\"text-xs \">\n {uploadProgress[file.name]}%\n </span>\n </div>\n )}\n </div>\n {/* Crop button for images when cropping is enabled */}\n {enableCropping && file.type.startsWith(\"image/\") && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n handleCrop(file);\n }}\n disabled={disabled}\n className=\"flex items-center justify-center h-8 w-8 rounded border-none bg-transparent hover:bg-primary hover:text-primary-foreground transition-colors\"\n aria-label={`Crop ${file.name}`}\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M6.13 1L6 16a2 2 0 0 0 2 2h15\" />\n <path d=\"M1 6.13L16 6a2 2 0 0 1 2 2v15\" />\n </svg>\n </button>\n )}\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n handleRemove(index);\n }}\n disabled={disabled}\n className=\"flex items-center justify-center h-8 w-8 rounded border-none bg-transparent hover:bg-primary hover:text-primary-foreground transition-colors\"\n aria-label={`Remove ${file.name}`}\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </li>\n );\n })}\n </ul>\n )}\n\n {/* Image cropper modal */}\n {cropperOpen && imageToCrop && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n <div\n className=\"absolute inset-0 bg-black/50\"\n onClick={handleCropCancel}\n aria-label=\"Close cropper\"\n />\n <div className=\"relative bg-popover border border-border rounded-lg shadow-lg max-w-3xl w-full mx-4\">\n <div className=\"flex items-center justify-between p-4 border-b border-border\">\n <h3 className=\"text-lg font-semibold\">Crop Image</h3>\n <button\n type=\"button\"\n className=\"flex items-center justify-center h-8 w-8 rounded hover:bg-primary hover:text-primary-foreground transition-colors\"\n onClick={handleCropCancel}\n aria-label=\"Close\"\n >\n ✕\n </button>\n </div>\n\n <div className=\"p-4\">\n <div\n className=\"relative w-full h-96 bg-muted rounded-md overflow-hidden\"\n onMouseDown={(e) => {\n e.preventDefault();\n const startX = e.clientX - crop.x;\n const startY = e.clientY - crop.y;\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n onCropChange({\n x: moveEvent.clientX - startX,\n y: moveEvent.clientY - startY,\n });\n };\n\n const handleMouseUp = () => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n }}\n >\n <img\n src={imageToCrop.url}\n alt=\"Crop preview\"\n className=\"absolute inset-0 w-full h-full object-contain\"\n style={{\n transform: `translate(${crop.x}px, ${crop.y}px) scale(${zoom})`,\n }}\n draggable={false}\n onLoad={(e) => {\n const img = e.currentTarget;\n const containerWidth = 600;\n const containerHeight = 400;\n const cropWidth = cropAspectRatio\n ? Math.min(\n containerWidth * 0.8,\n containerHeight * 0.8 * cropAspectRatio,\n )\n : containerWidth * 0.8;\n const cropHeight = cropAspectRatio\n ? cropWidth / cropAspectRatio\n : containerHeight * 0.8;\n\n // Calculate crop area in pixels\n const scale = zoom;\n const imgWidth = img.naturalWidth;\n const imgHeight = img.naturalHeight;\n\n // Calculate center point\n const centerX = containerWidth / 2;\n const centerY = containerHeight / 2;\n\n // Calculate crop area relative to image\n const cropX = (centerX - crop.x - cropWidth / 2) / scale;\n const cropY = (centerY - crop.y - cropHeight / 2) / scale;\n\n // Store crop area for saving\n onCropCompleteInternal(null, {\n x: Math.max(0, cropX),\n y: Math.max(0, cropY),\n width: Math.min(cropWidth / scale, imgWidth),\n height: Math.min(cropHeight / scale, imgHeight),\n });\n }}\n />\n\n {/* Crop overlay */}\n <div\n className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 border-2 border-primary rounded pointer-events-none\"\n style={{\n width: cropAspectRatio\n ? `${Math.min(80, 80 * cropAspectRatio)}%`\n : \"80%\",\n aspectRatio: cropAspectRatio\n ? String(cropAspectRatio)\n : undefined,\n }}\n >\n <div className=\"absolute inset-0 grid grid-cols-3 grid-rows-3\">\n <div className=\"border-r border-b border-primary/30\" />\n <div className=\"border-r border-b border-primary/30\" />\n <div className=\"border-b border-primary/30\" />\n <div className=\"border-r border-b border-primary/30\" />\n <div className=\"border-r border-b border-primary/30\" />\n <div className=\"border-b border-primary/30\" />\n <div className=\"border-r border-primary/30\" />\n <div className=\"border-r border-primary/30\" />\n <div />\n </div>\n </div>\n </div>\n\n {/* Zoom controls */}\n <div className=\"flex items-center gap-3 mt-4\">\n <label\n htmlFor=\"zoom-slider\"\n className=\"text-sm font-medium whitespace-nowrap\"\n >\n Zoom: {zoom.toFixed(1)}x\n </label>\n <input\n id=\"zoom-slider\"\n type=\"range\"\n min=\"1\"\n max=\"3\"\n step=\"0.1\"\n value={zoom}\n onChange={(e) => onZoomChange(parseFloat(e.target.value))}\n className=\"flex-1 h-2 bg-muted rounded-lg appearance-none cursor-pointer\"\n aria-label=\"Zoom level\"\n />\n </div>\n </div>\n\n <div className=\"flex items-center justify-end gap-2 p-4 border-t border-border\">\n <button\n type=\"button\"\n className=\"inline-flex items-center justify-center h-9 rounded-md px-4 text-sm font-medium border border-input bg-transparent hover:bg-primary hover:text-primary-foreground transition-colors\"\n onClick={handleCropCancel}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"inline-flex items-center justify-center h-9 rounded-md px-4 text-sm font-medium bg-primary text-primary-foreground hover:bg-primary/90 transition-colors\"\n onClick={handleCropSave}\n >\n Save\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nFileInput.displayName = \"FileInput\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\n\n/**\n * DatePicker props interface\n */\nexport interface DatePickerProps extends Omit<\n InputProps<Date | null>,\n \"onChange\"\n> {\n /**\n * Change handler - receives selected date or null\n */\n onChange: (date: Date | null) => void;\n\n /**\n * Placeholder text when no date is selected\n * @default \"Select date...\"\n */\n placeholder?: string;\n\n /**\n * Date format for display\n * @default \"MM/dd/yyyy\"\n */\n format?: string;\n\n /**\n * Minimum selectable date\n */\n minDate?: Date;\n\n /**\n * Maximum selectable date\n */\n maxDate?: Date;\n\n /**\n * Dates that should be disabled\n */\n disabledDates?: Date[];\n\n /**\n * Function to determine if a date should be disabled\n */\n isDateDisabled?: (date: Date) => boolean;\n\n /**\n * Show clear button\n * @default true\n */\n clearable?: boolean;\n\n /**\n * Show calendar icon\n * @default true\n */\n showIcon?: boolean;\n\n /**\n * Additional native input attributes\n */\n [key: string]: any;\n}\n\n/**\n * Format date to string\n */\nfunction formatDate(date: Date | null, format: string): string {\n if (!date) return \"\";\n\n const d = new Date(date);\n const month = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n const year = d.getFullYear();\n\n // Simple format parsing\n return format\n .replace(\"MM\", month)\n .replace(\"dd\", day)\n .replace(\"yyyy\", String(year))\n .replace(\"yy\", String(year).slice(2));\n}\n\n/**\n * Parse date string to Date\n */\nfunction parseDate(dateString: string, format: string): Date | null {\n if (!dateString) return null;\n\n try {\n // Simple date parsing for MM/dd/yyyy format\n if (format === \"MM/dd/yyyy\" || format === \"MM-dd-yyyy\") {\n const parts = dateString.split(/[/-]/);\n if (parts.length === 3) {\n const month = parseInt(parts[0], 10) - 1;\n const day = parseInt(parts[1], 10);\n const year = parseInt(parts[2], 10);\n const date = new Date(year, month, day);\n if (!isNaN(date.getTime())) {\n return date;\n }\n }\n }\n // Fallback to native Date parsing\n const date = new Date(dateString);\n return isNaN(date.getTime()) ? null : date;\n } catch {\n return null;\n }\n}\n\n/**\n * Check if date is in disabled dates array\n */\nfunction isDateInArray(date: Date, dates: Date[]): boolean {\n const dateStr = date.toDateString();\n return dates.some((d) => d.toDateString() === dateStr);\n}\n\n/**\n * DatePicker - Accessible date selection component with calendar UI\n *\n * A lightweight date picker with calendar popup, keyboard navigation,\n * and error state support. Designed to work seamlessly with useForm and Field components.\n *\n * Features:\n * - Calendar popup with month/year navigation\n * - Full accessibility support (ARIA attributes, keyboard navigation)\n * - Error state styling\n * - Controlled input behavior\n * - Date range constraints (min/max dates)\n * - Disabled dates support\n * - Clearable selection\n * - Custom date format display\n * - Icon display toggle\n * - Click outside to close\n * - Native date input fallback for mobile\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { birthdate: null } });\n *\n * <DatePicker\n * {...form.getFieldProps('birthdate')}\n * placeholder=\"Select your birthdate\"\n * format=\"MM/dd/yyyy\"\n * maxDate={new Date()}\n * clearable\n * showIcon\n * error={!!form.errors.birthdate}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // With date range constraints\n * <DatePicker\n * name=\"appointment\"\n * value={appointmentDate}\n * onChange={setAppointmentDate}\n * minDate={new Date()}\n * maxDate={addDays(new Date(), 90)}\n * isDateDisabled={(date) => date.getDay() === 0 || date.getDay() === 6}\n * />\n * ```\n *\n * Note: This component requires react-day-picker as a peer dependency.\n * Install with: npm install react-day-picker date-fns\n *\n * @see https://opensite.ai/developers/page-speed/forms/date-picker\n */\nexport function DatePicker({\n name,\n value,\n onChange,\n onBlur,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n placeholder = \"Select date...\",\n format = \"MM/dd/yyyy\",\n minDate,\n maxDate,\n disabledDates = [],\n isDateDisabled,\n clearable = true,\n showIcon = true,\n ...props\n}: DatePickerProps) {\n const [isOpen, setIsOpen] = React.useState(false);\n const [inputValue, setInputValue] = React.useState(\"\");\n const [selectedMonth, setSelectedMonth] = React.useState<Date>(\n value || new Date(),\n );\n const containerRef = React.useRef<HTMLDivElement>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n // Sync input value with controlled value prop\n React.useEffect(() => {\n setInputValue(formatDate(value, format));\n if (value) {\n setSelectedMonth(value);\n }\n }, [value, format]);\n\n // Handle date selection from calendar\n const handleDateSelect = (date: Date) => {\n onChange(date);\n setIsOpen(false);\n onBlur?.();\n };\n\n // Handle input change (manual typing)\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setInputValue(newValue);\n\n // Try to parse and update date\n const parsedDate = parseDate(newValue, format);\n if (parsedDate && !isNaN(parsedDate.getTime())) {\n onChange(parsedDate);\n } else if (newValue === \"\") {\n onChange(null);\n }\n };\n\n // Handle clear button\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange(null);\n setInputValue(\"\");\n inputRef.current?.focus();\n };\n\n // Toggle calendar popup\n const handleToggle = () => {\n if (disabled) return;\n setIsOpen(!isOpen);\n };\n\n // Check if a date should be disabled\n const isDisabled = (date: Date): boolean => {\n if (minDate && date < minDate) return true;\n if (maxDate && date > maxDate) return true;\n if (isDateInArray(date, disabledDates)) return true;\n if (isDateDisabled && isDateDisabled(date)) return true;\n return false;\n };\n\n // Close calendar when clicking outside\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n onBlur?.();\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }\n }, [isOpen, onBlur]);\n\n // Simple calendar component (basic implementation)\n const renderCalendar = () => {\n const year = selectedMonth.getFullYear();\n const month = selectedMonth.getMonth();\n\n // Get days in month\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n const firstDayOfMonth = new Date(year, month, 1).getDay();\n\n // Build calendar grid\n const days: (Date | null)[] = [];\n\n // Add empty cells for days before month starts\n for (let i = 0; i < firstDayOfMonth; i++) {\n days.push(null);\n }\n\n // Add days of month\n for (let day = 1; day <= daysInMonth; day++) {\n days.push(new Date(year, month, day));\n }\n\n const monthNames = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ];\n\n const handlePrevMonth = () => {\n setSelectedMonth(new Date(year, month - 1, 1));\n };\n\n const handleNextMonth = () => {\n setSelectedMonth(new Date(year, month + 1, 1));\n };\n\n return (\n <div role=\"grid\" aria-label=\"Calendar\">\n <div className=\"flex items-center justify-between pb-2 border-b border-border\">\n <button\n type=\"button\"\n className=\"flex items-center justify-center h-8 w-8 rounded border-none bg-transparent hover:bg-primary hover:text-primary-foreground cursor-pointer\"\n onClick={handlePrevMonth}\n aria-label=\"Previous month\"\n >\n ←\n </button>\n <div className=\"font-medium text-sm\">\n {`${monthNames[month]} ${year}`}\n </div>\n <button\n type=\"button\"\n className=\"flex items-center justify-center h-8 w-8 rounded border-none bg-transparent hover:bg-primary hover:text-primary-foreground cursor-pointer\"\n onClick={handleNextMonth}\n aria-label=\"Next month\"\n >\n →\n </button>\n </div>\n <div className=\"grid grid-cols-7 gap-1 mt-2\">\n {[\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"].map((day) => (\n <div\n key={day}\n className=\"flex items-center justify-center h-8 w-full text-xs font-medium\"\n >\n {day}\n </div>\n ))}\n </div>\n <div className=\"grid grid-cols-7 gap-1\">\n {days.map((date, index) => {\n if (!date) {\n return <div key={`empty-${index}`} />;\n }\n\n const isSelected =\n value && date.toDateString() === value.toDateString();\n const isToday = date.toDateString() === new Date().toDateString();\n const disabled = isDisabled(date);\n\n return (\n <button\n key={date.toISOString()}\n type=\"button\"\n className={`flex items-center justify-center h-8 w-full rounded border-none bg-transparent cursor-pointer text-sm transition-colors hover:bg-primary hover:text-primary-foreground ${isSelected ? \"bg-primary text-primary-foreground font-semibold\" : \"\"} ${isToday ? \"border border-primary\" : \"\"} ${disabled ? \"cursor-not-allowed opacity-50 pointer-events-none\" : \"\"}`}\n onClick={() => !disabled && handleDateSelect(date)}\n disabled={disabled}\n aria-label={formatDate(date, format)}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n </div>\n );\n };\n\n const combinedClassName = `relative ${className}`.trim();\n\n return (\n <div ref={containerRef} className={combinedClassName}>\n {/* Hidden native date input for form submission */}\n <input\n type=\"hidden\"\n name={name}\n value={value ? value.toISOString() : \"\"}\n />\n\n {/* Custom date input */}\n <div className=\"relative\">\n {showIcon && (\n <span\n className=\"absolute left-3 top-1/2 -translate-y-1/2 pointer-events-none\"\n aria-hidden=\"true\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n >\n <path d=\"M8 2v4m8-4v4m5 8V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h8M3 10h18m-5 10l2 2l4-4\" />\n </svg>\n </span>\n )}\n <input\n ref={inputRef}\n type=\"text\"\n className={`flex h-9 w-full rounded-md border border-input bg-transparent ${showIcon ? \"pl-10\" : \"pl-3\"} ${clearable && value ? \"pr-10\" : \"pr-3\"} py-1 text-base shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm ${error ? \"border-red-500 ring-1 ring-red-500\" : \"\"}`}\n value={inputValue}\n onChange={handleInputChange}\n onClick={handleToggle}\n onBlur={onBlur}\n disabled={disabled}\n required={required}\n placeholder={placeholder}\n aria-invalid={error || props[\"aria-invalid\"] ? \"true\" : \"false\"}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n readOnly\n />\n {clearable && value && !disabled && (\n <button\n type=\"button\"\n className=\"absolute right-3 top-1/2 -translate-y-1/2 transition-colors\"\n onClick={handleClear}\n aria-label=\"Clear date\"\n tabIndex={-1}\n >\n ✕\n </button>\n )}\n </div>\n\n {/* Calendar popup */}\n {isOpen && !disabled && (\n <div className=\"absolute z-50 top-full mt-1 min-w-full rounded-md border border-border bg-popover text-popover-foreground shadow-md p-3\">\n {renderCalendar()}\n </div>\n )}\n </div>\n );\n}\n\nDatePicker.displayName = \"DatePicker\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\nimport { cn } from \"../utils\";\n\n/**\n * Time value format\n */\nexport interface TimeValue {\n hour: number; // 1-12\n minute: number; // 0-59\n period: \"AM\" | \"PM\";\n}\n\n/**\n * TimePicker props interface\n */\nexport interface TimePickerProps extends Omit<InputProps<string>, \"onChange\"> {\n /**\n * Change handler - receives time string in format \"HH:mm AM/PM\"\n */\n onChange: (time: string) => void;\n\n /**\n * Placeholder text when no time is selected\n * @default \"Select time...\"\n */\n placeholder?: string;\n\n /**\n * Use 24-hour format instead of 12-hour with AM/PM\n * @default false\n */\n use24Hour?: boolean;\n\n /**\n * Minute step interval (e.g., 15 for 15-minute increments)\n * @default 1\n */\n minuteStep?: number;\n\n /**\n * Show clear button\n * @default true\n */\n clearable?: boolean;\n\n /**\n * Show clock icon\n * @default true\n */\n showIcon?: boolean;\n\n /**\n * Additional native input attributes\n */\n [key: string]: any;\n}\n\n/**\n * Parse time string to TimeValue\n */\nfunction parseTimeString(\n timeStr: string,\n use24Hour: boolean,\n): TimeValue | null {\n if (!timeStr) return null;\n\n try {\n if (use24Hour) {\n // Parse 24-hour format (HH:mm)\n const [hourStr, minuteStr] = timeStr.split(\":\");\n const hour24 = parseInt(hourStr, 10);\n const minute = parseInt(minuteStr, 10);\n\n if (isNaN(hour24) || isNaN(minute)) return null;\n if (hour24 < 0 || hour24 > 23) return null;\n if (minute < 0 || minute > 59) return null;\n\n // Convert to 12-hour format with period\n const period = hour24 >= 12 ? \"PM\" : \"AM\";\n const hour = hour24 === 0 ? 12 : hour24 > 12 ? hour24 - 12 : hour24;\n\n return { hour, minute, period };\n } else {\n // Parse 12-hour format (HH:mm AM/PM)\n const match = timeStr.match(/^(\\d{1,2}):(\\d{2})\\s*(AM|PM)$/i);\n if (!match) return null;\n\n const hour = parseInt(match[1], 10);\n const minute = parseInt(match[2], 10);\n const period = match[3].toUpperCase() as \"AM\" | \"PM\";\n\n if (hour < 1 || hour > 12) return null;\n if (minute < 0 || minute > 59) return null;\n\n return { hour, minute, period };\n }\n } catch {\n return null;\n }\n}\n\n/**\n * Format TimeValue to string\n */\nfunction formatTimeValue(time: TimeValue | null, use24Hour: boolean): string {\n if (!time) return \"\";\n\n if (use24Hour) {\n // Convert to 24-hour format\n let hour24 = time.hour;\n if (time.period === \"PM\" && time.hour !== 12) {\n hour24 = time.hour + 12;\n } else if (time.period === \"AM\" && time.hour === 12) {\n hour24 = 0;\n }\n return `${String(hour24).padStart(2, \"0\")}:${String(time.minute).padStart(2, \"0\")}`;\n } else {\n // 12-hour format with AM/PM\n return `${time.hour}:${String(time.minute).padStart(2, \"0\")} ${time.period}`;\n }\n}\n\n/**\n * TimePicker - Accessible time selection component with AM/PM support\n *\n * A lightweight time picker with dropdown selection for hours, minutes, and AM/PM period.\n * Designed to work seamlessly with useForm and Field components.\n *\n * Features:\n * - Dropdown selection with hour/minute spinners\n * - 12-hour or 24-hour format support\n * - AM/PM period selector\n * - Configurable minute step intervals\n * - Full accessibility support (ARIA attributes, keyboard navigation)\n * - Error state styling\n * - Controlled input behavior\n * - Clearable selection\n * - Icon display toggle\n * - Click outside to close\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { appointment: '' } });\n *\n * <TimePicker\n * {...form.getFieldProps('appointment')}\n * placeholder=\"Select time\"\n * minuteStep={15}\n * clearable\n * showIcon\n * error={!!form.errors.appointment}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // With 24-hour format\n * <TimePicker\n * name=\"startTime\"\n * value={startTime}\n * onChange={setStartTime}\n * use24Hour\n * minuteStep={30}\n * />\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/time-picker\n */\nexport function TimePicker({\n name,\n value,\n onChange,\n onBlur,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n placeholder = \"Select time...\",\n use24Hour = false,\n minuteStep = 1,\n clearable = true,\n showIcon = true,\n ...props\n}: TimePickerProps) {\n const [isOpen, setIsOpen] = React.useState(false);\n const [timeValue, setTimeValue] = React.useState<TimeValue | null>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n // Sync time value with controlled value prop\n React.useEffect(() => {\n const parsed = parseTimeString(value, use24Hour);\n setTimeValue(parsed);\n }, [value, use24Hour]);\n\n // Handle hour change\n const handleHourChange = (hour: number) => {\n const newTime: TimeValue = {\n hour,\n minute: timeValue?.minute || 0,\n period: timeValue?.period || \"AM\",\n };\n setTimeValue(newTime);\n onChange(formatTimeValue(newTime, use24Hour));\n };\n\n // Handle minute change\n const handleMinuteChange = (minute: number) => {\n const newTime: TimeValue = {\n hour: timeValue?.hour || 12,\n minute,\n period: timeValue?.period || \"AM\",\n };\n setTimeValue(newTime);\n onChange(formatTimeValue(newTime, use24Hour));\n };\n\n // Handle period change\n const handlePeriodChange = (period: \"AM\" | \"PM\") => {\n const newTime: TimeValue = {\n hour: timeValue?.hour || 12,\n minute: timeValue?.minute || 0,\n period,\n };\n setTimeValue(newTime);\n onChange(formatTimeValue(newTime, use24Hour));\n };\n\n // Handle clear button\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange(\"\");\n setTimeValue(null);\n inputRef.current?.focus();\n };\n\n // Toggle time picker popup\n const handleToggle = () => {\n if (disabled) return;\n setIsOpen(!isOpen);\n };\n\n // Close picker when clicking outside\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n onBlur?.();\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }\n }, [isOpen, onBlur]);\n\n // Generate hour options (1-12 for 12-hour, 0-23 for 24-hour)\n const hours = React.useMemo(() => {\n if (use24Hour) {\n return Array.from({ length: 24 }, (_, i) => i);\n } else {\n return Array.from({ length: 12 }, (_, i) => i + 1);\n }\n }, [use24Hour]);\n\n // Generate minute options based on step\n const minutes = React.useMemo(() => {\n const mins: number[] = [];\n for (let i = 0; i < 60; i += minuteStep) {\n mins.push(i);\n }\n return mins;\n }, [minuteStep]);\n\n const combinedClassName = cn(\"relative\", className);\n\n const displayValue = formatTimeValue(timeValue, use24Hour);\n\n return (\n <div ref={containerRef} className={combinedClassName}>\n {/* Hidden native input for form submission */}\n <input type=\"hidden\" name={name} value={value} />\n\n {/* Custom time input */}\n <div className=\"relative\">\n {showIcon && (\n <span\n className=\"absolute left-3 top-1/2 -translate-y-1/2 pointer-events-none\"\n aria-hidden=\"true\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 6v6l4 2\" />\n </svg>\n </span>\n )}\n <input\n ref={inputRef}\n type=\"text\"\n className={cn(\n \"flex h-9 w-full rounded-md border border-input bg-transparent py-1 text-base shadow-sm transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\",\n \"disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n showIcon ? \"pl-10\" : \"pl-3\",\n clearable && value ? \"pr-10\" : \"pr-3\",\n error && \"border-red-500 ring-1 ring-red-500\",\n )}\n value={displayValue}\n onClick={handleToggle}\n onBlur={onBlur}\n disabled={disabled}\n required={required}\n placeholder={placeholder}\n aria-invalid={error || props[\"aria-invalid\"] ? \"true\" : \"false\"}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n readOnly\n />\n {clearable && value && !disabled && (\n <button\n type=\"button\"\n className=\"absolute right-3 top-1/2 -translate-y-1/2 transition-colors\"\n onClick={handleClear}\n aria-label=\"Clear time\"\n tabIndex={-1}\n >\n ✕\n </button>\n )}\n </div>\n\n {/* Time picker popup */}\n {isOpen && !disabled && (\n <div className=\"absolute z-50 top-full mt-1 min-w-full rounded-md border border-border bg-popover text-popover-foreground shadow-md p-3\">\n <div className=\"flex gap-2\">\n {/* Hour selector */}\n <div className=\"flex flex-col flex-1\">\n <div className=\"text-xs font-medium mb-2 text-center\">\n {use24Hour ? \"Hour\" : \"Hour\"}\n </div>\n <div className=\"flex flex-col gap-1 max-h-48 overflow-y-auto\">\n {hours.map((hour) => {\n const displayHour = use24Hour ? hour : hour;\n const isSelected = use24Hour\n ? timeValue?.hour ===\n (hour === 0 ? 12 : hour > 12 ? hour - 12 : hour) &&\n timeValue?.period === (hour >= 12 ? \"PM\" : \"AM\")\n : timeValue?.hour === hour;\n\n return (\n <button\n key={hour}\n type=\"button\"\n className={cn(\n \"flex items-center justify-center h-8 w-full rounded\",\n \"border-none bg-transparent cursor-pointer text-sm transition-colors\",\n \"hover:bg-primary hover:text-primary-foreground\",\n isSelected\n ? \"bg-primary text-primary-foreground font-semibold\"\n : \"\",\n )}\n onClick={() => {\n if (use24Hour) {\n const hour12 =\n hour === 0 ? 12 : hour > 12 ? hour - 12 : hour;\n const period = hour >= 12 ? \"PM\" : \"AM\";\n const newTime: TimeValue = {\n hour: hour12,\n minute: timeValue?.minute || 0,\n period,\n };\n setTimeValue(newTime);\n onChange(formatTimeValue(newTime, use24Hour));\n } else {\n handleHourChange(hour);\n }\n }}\n aria-label={`${String(displayHour).padStart(2, \"0\")} hours`}\n >\n {String(displayHour).padStart(2, \"0\")}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Minute selector */}\n <div className=\"flex flex-col flex-1\">\n <div className=\"text-xs font-medium mb-2 text-center\">Minute</div>\n <div className=\"flex flex-col gap-1 max-h-48 overflow-y-auto\">\n {minutes.map((minute) => {\n const isSelected = timeValue?.minute === minute;\n\n return (\n <button\n key={minute}\n type=\"button\"\n className={cn(\n \"flex items-center justify-center h-8 w-full\",\n \"rounded border-none bg-transparent cursor-pointer text-sm transition-colors\",\n \"hover:bg-primary hover:text-primary-foreground\",\n isSelected\n ? \"bg-primary text-primary-foreground font-semibold\"\n : \"\",\n )}\n onClick={() => handleMinuteChange(minute)}\n aria-label={`${String(minute).padStart(2, \"0\")} minutes`}\n >\n {String(minute).padStart(2, \"0\")}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Period selector (AM/PM) - only for 12-hour format */}\n {!use24Hour && (\n <div className=\"flex flex-col w-20\">\n <div className=\"text-xs font-medium mb-2 text-center\">\n Period\n </div>\n <div className=\"flex flex-col gap-1\">\n <button\n type=\"button\"\n className={cn(\n \"flex items-center justify-center h-8 w-full\",\n \"rounded border-none bg-transparent cursor-pointer text-sm\",\n \"transition-colors hover:bg-primary hover:text-primary-foreground\",\n timeValue?.period === \"AM\"\n ? \"bg-muted font-semibold\"\n : \"\",\n )}\n onClick={() => handlePeriodChange(\"AM\")}\n >\n AM\n </button>\n <button\n type=\"button\"\n className={cn(\n \"flex items-center justify-center h-8 w-full\",\n \"rounded border-none bg-transparent cursor-pointer text-sm\",\n \"transition-colors hover:bg-primary hover:text-primary-foreground\",\n timeValue?.period === \"PM\"\n ? \"bg-muted font-semibold\"\n : \"\",\n )}\n onClick={() => handlePeriodChange(\"PM\")}\n >\n PM\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nTimePicker.displayName = \"TimePicker\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\nimport { cn } from \"../utils\";\n\n/**\n * Date range value\n */\nexport interface DateRange {\n start: Date | null;\n end: Date | null;\n}\n\n/**\n * DateRangePicker props interface\n */\nexport interface DateRangePickerProps extends Omit<\n InputProps<DateRange>,\n \"onChange\"\n> {\n /**\n * Change handler - receives date range object\n */\n onChange: (range: DateRange) => void;\n\n /**\n * Placeholder text when no dates are selected\n * @default \"Select date range...\"\n */\n placeholder?: string;\n\n /**\n * Date format for display\n * @default \"MM/dd/yyyy\"\n */\n format?: string;\n\n /**\n * Minimum selectable date\n */\n minDate?: Date;\n\n /**\n * Maximum selectable date\n */\n maxDate?: Date;\n\n /**\n * Dates that should be disabled\n */\n disabledDates?: Date[];\n\n /**\n * Function to determine if a date should be disabled\n */\n isDateDisabled?: (date: Date) => boolean;\n\n /**\n * Show clear button\n * @default true\n */\n clearable?: boolean;\n\n /**\n * Show calendar icon\n * @default true\n */\n showIcon?: boolean;\n\n /**\n * Separator between start and end dates\n * @default \" - \"\n */\n separator?: string;\n\n /**\n * Additional native input attributes\n */\n [key: string]: any;\n}\n\n/**\n * Format date to string\n */\nfunction formatDate(date: Date | null, format: string): string {\n if (!date) return \"\";\n\n const d = new Date(date);\n const month = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n const year = d.getFullYear();\n\n return format\n .replace(\"MM\", month)\n .replace(\"dd\", day)\n .replace(\"yyyy\", String(year))\n .replace(\"yy\", String(year).slice(2));\n}\n\n/**\n * Check if date is in disabled dates array\n */\nfunction isDateInArray(date: Date, dates: Date[]): boolean {\n const dateStr = date.toDateString();\n return dates.some((d) => d.toDateString() === dateStr);\n}\n\n/**\n * Check if date is in range\n */\nfunction isDateInRange(\n date: Date,\n start: Date | null,\n end: Date | null,\n): boolean {\n if (!start || !end) return false;\n const time = date.getTime();\n return time >= start.getTime() && time <= end.getTime();\n}\n\n/**\n * DateRangePicker - Accessible date range selection component\n *\n * A lightweight date range picker with calendar popup for selecting start and end dates.\n * Designed to work seamlessly with useForm and Field components.\n *\n * Features:\n * - Dual calendar view for range selection\n * - Full accessibility support (ARIA attributes, keyboard navigation)\n * - Error state styling\n * - Controlled input behavior\n * - Date range constraints (min/max dates)\n * - Disabled dates support\n * - Clearable selection\n * - Custom date format display\n * - Visual range highlighting\n * - Icon display toggle\n * - Click outside to close\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { dateRange: { start: null, end: null } } });\n *\n * <DateRangePicker\n * {...form.getFieldProps('dateRange')}\n * placeholder=\"Select date range\"\n * format=\"MM/dd/yyyy\"\n * clearable\n * showIcon\n * error={!!form.errors.dateRange}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // With date constraints\n * <DateRangePicker\n * name=\"vacation\"\n * value={vacationRange}\n * onChange={setVacationRange}\n * minDate={new Date()}\n * maxDate={addDays(new Date(), 365)}\n * separator=\" to \"\n * />\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/date-range-picker\n */\nexport function DateRangePicker({\n name,\n value = { start: null, end: null },\n onChange,\n onBlur,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n placeholder = \"Select date range...\",\n format = \"MM/dd/yyyy\",\n minDate,\n maxDate,\n disabledDates = [],\n isDateDisabled,\n clearable = true,\n showIcon = true,\n separator = \" - \",\n ...props\n}: DateRangePickerProps) {\n const [isOpen, setIsOpen] = React.useState(false);\n const [selectedMonth, setSelectedMonth] = React.useState<Date>(\n value.start || new Date(),\n );\n const [rangeStart, setRangeStart] = React.useState<Date | null>(value.start);\n const [rangeEnd, setRangeEnd] = React.useState<Date | null>(value.end);\n const [hoverDate, setHoverDate] = React.useState<Date | null>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n // Sync range with controlled value prop\n React.useEffect(() => {\n setRangeStart(value.start);\n setRangeEnd(value.end);\n if (value.start) {\n setSelectedMonth(value.start);\n }\n }, [value]);\n\n // Handle date selection\n const handleDateSelect = (date: Date) => {\n if (!rangeStart || (rangeStart && rangeEnd)) {\n // Start new range\n setRangeStart(date);\n setRangeEnd(null);\n onChange({ start: date, end: null });\n } else {\n // Complete range\n if (date < rangeStart) {\n // Selected date is before start, swap them\n setRangeStart(date);\n setRangeEnd(rangeStart);\n onChange({ start: date, end: rangeStart });\n setIsOpen(false);\n } else {\n // Selected date is after start\n setRangeEnd(date);\n onChange({ start: rangeStart, end: date });\n setIsOpen(false);\n }\n }\n onBlur?.();\n };\n\n // Handle clear button\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange({ start: null, end: null });\n setRangeStart(null);\n setRangeEnd(null);\n };\n\n // Toggle calendar popup\n const handleToggle = () => {\n if (disabled) return;\n setIsOpen(!isOpen);\n };\n\n // Check if a date should be disabled\n const isDisabled = (date: Date): boolean => {\n if (minDate && date < minDate) return true;\n if (maxDate && date > maxDate) return true;\n if (isDateInArray(date, disabledDates)) return true;\n if (isDateDisabled && isDateDisabled(date)) return true;\n return false;\n };\n\n // Close calendar when clicking outside\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n onBlur?.();\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }\n }, [isOpen, onBlur]);\n\n // Render calendar\n const renderCalendar = () => {\n const year = selectedMonth.getFullYear();\n const month = selectedMonth.getMonth();\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n const firstDayOfMonth = new Date(year, month, 1).getDay();\n\n const days: (Date | null)[] = [];\n for (let i = 0; i < firstDayOfMonth; i++) {\n days.push(null);\n }\n for (let day = 1; day <= daysInMonth; day++) {\n days.push(new Date(year, month, day));\n }\n\n const monthNames = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ];\n\n const handlePrevMonth = () => {\n setSelectedMonth(new Date(year, month - 1, 1));\n };\n\n const handleNextMonth = () => {\n setSelectedMonth(new Date(year, month + 1, 1));\n };\n\n return (\n <div role=\"grid\" aria-label=\"Calendar\">\n <div className=\"flex items-center justify-between pb-2 border-b border-border\">\n <button\n type=\"button\"\n className=\"flex items-center justify-center h-8 w-8 rounded border-none bg-transparent hover:bg-primary hover:text-primary-foreground cursor-pointer\"\n onClick={handlePrevMonth}\n aria-label=\"Previous month\"\n >\n ←\n </button>\n <div className=\"font-medium text-sm\">\n {`${monthNames[month]} ${year}`}\n </div>\n <button\n type=\"button\"\n className=\"flex items-center justify-center h-8 w-8 rounded border-none bg-transparent hover:bg-primary hover:text-primary-foreground cursor-pointer\"\n onClick={handleNextMonth}\n aria-label=\"Next month\"\n >\n →\n </button>\n </div>\n <div className=\"grid grid-cols-7 gap-1 mt-2\">\n {[\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"].map((day) => (\n <div\n key={day}\n className=\"flex items-center justify-center h-8 w-full text-xs font-medium\"\n >\n {day}\n </div>\n ))}\n </div>\n <div className=\"grid grid-cols-7 gap-1\">\n {days.map((date, index) => {\n if (!date) {\n return <div key={`empty-${index}`} />;\n }\n\n const isStart =\n rangeStart && date.toDateString() === rangeStart.toDateString();\n const isEnd =\n rangeEnd && date.toDateString() === rangeEnd.toDateString();\n const isRangeEndpoint = Boolean(isStart || isEnd);\n const isInRange =\n rangeStart &&\n rangeEnd &&\n isDateInRange(date, rangeStart, rangeEnd);\n const isInHoverRange =\n rangeStart &&\n !rangeEnd &&\n hoverDate &&\n ((date >= rangeStart && date <= hoverDate) ||\n (date <= rangeStart && date >= hoverDate));\n const isRangeHighlight = Boolean(\n (isInRange || isInHoverRange) && !isRangeEndpoint,\n );\n const isToday = date.toDateString() === new Date().toDateString();\n const disabled = isDisabled(date);\n\n return (\n <button\n key={date.toISOString()}\n type=\"button\"\n className={cn(\n \"flex items-center justify-center h-8 w-full rounded border-none bg-transparent\",\n \"cursor-pointer text-sm transition-colors hover:bg-muted\",\n isRangeEndpoint && \"bg-muted font-semibold\",\n isRangeHighlight && \"bg-muted/70\",\n isToday && \"border border-primary\",\n disabled && \"cursor-not-allowed opacity-50 pointer-events-none\",\n )}\n onClick={() => !disabled && handleDateSelect(date)}\n onMouseEnter={() => setHoverDate(date)}\n onMouseLeave={() => setHoverDate(null)}\n disabled={disabled}\n aria-label={formatDate(date, format)}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n </div>\n );\n };\n\n const combinedClassName = cn(\"relative\", className);\n\n const displayValue =\n rangeStart && rangeEnd\n ? `${formatDate(rangeStart, format)}${separator}${formatDate(rangeEnd, format)}`\n : rangeStart\n ? formatDate(rangeStart, format)\n : \"\";\n\n return (\n <div ref={containerRef} className={combinedClassName}>\n {/* Hidden inputs for form submission */}\n <input\n type=\"hidden\"\n name={`${name}[start]`}\n value={rangeStart ? rangeStart.toISOString() : \"\"}\n />\n <input\n type=\"hidden\"\n name={`${name}[end]`}\n value={rangeEnd ? rangeEnd.toISOString() : \"\"}\n />\n\n {/* Custom date range input */}\n <div className=\"relative\">\n {showIcon && (\n <span\n className=\"absolute left-3 top-1/2 -translate-y-1/2 pointer-events-none\"\n aria-hidden=\"true\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n >\n <path d=\"M8 2v4m8-4v4m5 8V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h8M3 10h18m-5 10l2 2l4-4\" />\n </svg>\n </span>\n )}\n <input\n type=\"text\"\n className={cn(\n \"flex h-9 w-full rounded-md border border-input bg-transparent py-1 text-base shadow-sm transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\",\n \"disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n showIcon ? \"pl-10\" : \"pl-3\",\n clearable && (rangeStart || rangeEnd) ? \"pr-10\" : \"pr-3\",\n error && \"border-red-500 ring-1 ring-red-500\",\n )}\n value={displayValue}\n onClick={handleToggle}\n onBlur={onBlur}\n disabled={disabled}\n required={required}\n placeholder={placeholder}\n aria-invalid={error || props[\"aria-invalid\"] ? \"true\" : \"false\"}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n readOnly\n />\n {clearable && (rangeStart || rangeEnd) && !disabled && (\n <button\n type=\"button\"\n className=\"absolute right-3 top-1/2 -translate-y-1/2 transition-colors\"\n onClick={handleClear}\n aria-label=\"Clear date range\"\n tabIndex={-1}\n >\n ✕\n </button>\n )}\n </div>\n\n {/* Calendar popup */}\n {isOpen && !disabled && (\n <div className=\"absolute z-50 top-full mt-1 min-w-full rounded-md border border-border bg-popover text-popover-foreground shadow-md p-3\">\n {renderCalendar()}\n {rangeStart && !rangeEnd && (\n <div className=\"text-xs text-center pt-2 border-t border-border mt-2\">\n Select end date\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\nDateRangePicker.displayName = \"DateRangePicker\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\n\n/**\n * Editor mode type\n */\nexport type EditorMode = \"wysiwyg\" | \"markdown\";\n\n/**\n * Toolbar button configuration\n */\nexport interface ToolbarButton {\n command: string;\n icon: string;\n title: string;\n action: (editor: HTMLElement) => void;\n}\n\n/**\n * RichTextEditor props interface\n */\nexport interface RichTextEditorProps extends Omit<\n InputProps<string>,\n \"onChange\"\n> {\n /**\n * Change handler - receives HTML or Markdown content\n */\n onChange: (content: string) => void;\n\n /**\n * Editor mode - WYSIWYG or Markdown\n * @default \"wysiwyg\"\n */\n mode?: EditorMode;\n\n /**\n * Allow mode switching\n * @default false\n */\n allowModeSwitch?: boolean;\n\n /**\n * Placeholder text when editor is empty\n * @default \"Start typing...\"\n */\n placeholder?: string;\n\n /**\n * Minimum height of editor\n * @default \"200px\"\n */\n minHeight?: string;\n\n /**\n * Maximum height of editor (enables scrolling)\n */\n maxHeight?: string;\n\n /**\n * Show toolbar\n * @default true\n */\n showToolbar?: boolean;\n\n /**\n * Toolbar buttons to display\n * @default [\"bold\", \"italic\", \"underline\", \"heading\", \"bulletList\", \"orderedList\", \"link\"]\n */\n toolbarButtons?: string[];\n\n /**\n * Additional native input attributes\n */\n [key: string]: any;\n}\n\n/**\n * Convert HTML to Markdown (basic conversion)\n */\nfunction htmlToMarkdown(html: string): string {\n let markdown = html;\n\n // Bold\n markdown = markdown.replace(/<strong>(.*?)<\\/strong>/g, \"**$1**\");\n markdown = markdown.replace(/<b>(.*?)<\\/b>/g, \"**$1**\");\n\n // Italic\n markdown = markdown.replace(/<em>(.*?)<\\/em>/g, \"*$1*\");\n markdown = markdown.replace(/<i>(.*?)<\\/i>/g, \"*$1*\");\n\n // Underline (no direct markdown equivalent, use HTML)\n markdown = markdown.replace(/<u>(.*?)<\\/u>/g, \"<u>$1</u>\");\n\n // Headings\n markdown = markdown.replace(/<h1>(.*?)<\\/h1>/g, \"# $1\\n\");\n markdown = markdown.replace(/<h2>(.*?)<\\/h2>/g, \"## $1\\n\");\n markdown = markdown.replace(/<h3>(.*?)<\\/h3>/g, \"### $1\\n\");\n\n // Links\n markdown = markdown.replace(/<a href=\"(.*?)\">(.*?)<\\/a>/g, \"[$2]($1)\");\n\n // Lists\n markdown = markdown.replace(/<ul>(.*?)<\\/ul>/gs, (_match, content) => {\n return content.replace(/<li>(.*?)<\\/li>/g, \"- $1\\n\");\n });\n markdown = markdown.replace(/<ol>(.*?)<\\/ol>/gs, (_match, content) => {\n let counter = 1;\n return content.replace(/<li>(.*?)<\\/li>/g, () => {\n return `${counter++}. $1\\n`;\n });\n });\n\n // Paragraphs\n markdown = markdown.replace(/<p>(.*?)<\\/p>/g, \"$1\\n\\n\");\n\n // Line breaks\n markdown = markdown.replace(/<br\\s*\\/?>/g, \"\\n\");\n\n // Clean up extra whitespace\n markdown = markdown.replace(/\\n{3,}/g, \"\\n\\n\").trim();\n\n return markdown;\n}\n\n/**\n * Convert Markdown to HTML (basic conversion)\n */\nfunction markdownToHtml(markdown: string): string {\n let html = markdown;\n\n // Escape HTML\n html = html\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n\n // Headings\n html = html.replace(/^### (.*?)$/gm, \"<h3>$1</h3>\");\n html = html.replace(/^## (.*?)$/gm, \"<h2>$1</h2>\");\n html = html.replace(/^# (.*?)$/gm, \"<h1>$1</h1>\");\n\n // Bold\n html = html.replace(/\\*\\*(.*?)\\*\\*/g, \"<strong>$1</strong>\");\n\n // Italic\n html = html.replace(/\\*(.*?)\\*/g, \"<em>$1</em>\");\n\n // Links\n html = html.replace(/\\[(.*?)\\]\\((.*?)\\)/g, '<a href=\"$2\">$1</a>');\n\n // Unordered lists\n html = html.replace(/^- (.*?)$/gm, \"<li>$1</li>\");\n html = html.replace(/(<li>.*?<\\/li>\\n?)+/gs, \"<ul>$&</ul>\");\n\n // Ordered lists\n html = html.replace(/^\\d+\\. (.*?)$/gm, \"<li>$1</li>\");\n\n // Paragraphs\n html = html.replace(/^(?!<[h|ul|ol|li])(.+)$/gm, \"<p>$1</p>\");\n\n // Line breaks\n html = html.replace(/\\n/g, \"<br>\");\n\n return html;\n}\n\n/**\n * RichTextEditor - Basic rich text editing component with WYSIWYG and Markdown support\n *\n * A lightweight rich text editor with basic formatting capabilities and optional Markdown mode.\n * Designed to work seamlessly with useForm and Field components.\n *\n * Features:\n * - WYSIWYG editor with contentEditable\n * - Markdown editor mode\n * - Configurable toolbar with common formatting options\n * - Full accessibility support\n * - Error state styling\n * - Controlled input behavior\n * - Custom toolbar configuration\n * - Mode switching support\n * - Placeholder text support\n * - Adjustable height constraints\n *\n * Toolbar buttons:\n * - bold: Bold text (**text**)\n * - italic: Italic text (*text*)\n * - underline: Underlined text\n * - heading: Heading levels (H1-H3)\n * - bulletList: Unordered list\n * - orderedList: Ordered list\n * - link: Insert hyperlink\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { content: '' } });\n *\n * <RichTextEditor\n * {...form.getFieldProps('content')}\n * placeholder=\"Write your content...\"\n * mode=\"wysiwyg\"\n * allowModeSwitch\n * showToolbar\n * minHeight=\"200px\"\n * maxHeight=\"500px\"\n * error={!!form.errors.content}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Markdown mode\n * <RichTextEditor\n * name=\"description\"\n * value={description}\n * onChange={setDescription}\n * mode=\"markdown\"\n * toolbarButtons={[\"bold\", \"italic\", \"heading\", \"link\"]}\n * />\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/rich-text-editor\n */\nexport function RichTextEditor({\n name,\n value = \"\",\n onChange,\n onBlur,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n mode = \"wysiwyg\",\n allowModeSwitch = false,\n placeholder = \"Your message...\",\n minHeight = \"200px\",\n maxHeight,\n showToolbar = true,\n toolbarButtons = [\n \"bold\",\n \"italic\",\n \"underline\",\n \"heading\",\n \"bulletList\",\n \"orderedList\",\n \"link\",\n ],\n ...props\n}: RichTextEditorProps) {\n const [currentMode, setCurrentMode] = React.useState<EditorMode>(mode);\n const [content, setContent] = React.useState(value);\n const editorRef = React.useRef<HTMLDivElement>(null);\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n\n // Sync content with controlled value prop\n React.useEffect(() => {\n setContent(value);\n if (currentMode === \"wysiwyg\" && editorRef.current) {\n editorRef.current.innerHTML = value;\n }\n }, [value, currentMode]);\n\n // Handle content change in WYSIWYG mode\n const handleWysiwygChange = () => {\n if (editorRef.current) {\n const newContent = editorRef.current.innerHTML;\n setContent(newContent);\n onChange(newContent);\n }\n };\n\n // Handle content change in Markdown mode\n const handleMarkdownChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newContent = e.target.value;\n setContent(newContent);\n onChange(newContent);\n };\n\n // Execute formatting command\n const execCommand = (command: string, value?: string) => {\n document.execCommand(command, false, value);\n editorRef.current?.focus();\n handleWysiwygChange();\n };\n\n // Toggle mode\n const handleModeToggle = () => {\n const newMode = currentMode === \"wysiwyg\" ? \"markdown\" : \"wysiwyg\";\n\n if (newMode === \"markdown\") {\n // Convert HTML to Markdown\n const markdown = htmlToMarkdown(content);\n setContent(markdown);\n onChange(markdown);\n } else {\n // Convert Markdown to HTML\n const html = markdownToHtml(content);\n setContent(html);\n onChange(html);\n if (editorRef.current) {\n editorRef.current.innerHTML = html;\n }\n }\n\n setCurrentMode(newMode);\n };\n\n // Toolbar button configurations\n const toolbarConfig: Record<string, ToolbarButton> = {\n bold: {\n command: \"bold\",\n icon: \"B\",\n title: \"Bold\",\n action: () => execCommand(\"bold\"),\n },\n italic: {\n command: \"italic\",\n icon: \"I\",\n title: \"Italic\",\n action: () => execCommand(\"italic\"),\n },\n underline: {\n command: \"underline\",\n icon: \"U\",\n title: \"Underline\",\n action: () => execCommand(\"underline\"),\n },\n heading: {\n command: \"heading\",\n icon: \"H\",\n title: \"Heading\",\n action: () => execCommand(\"formatBlock\", \"<h2>\"),\n },\n bulletList: {\n command: \"bulletList\",\n icon: \"•\",\n title: \"Bullet List\",\n action: () => execCommand(\"insertUnorderedList\"),\n },\n orderedList: {\n command: \"orderedList\",\n icon: \"1.\",\n title: \"Numbered List\",\n action: () => execCommand(\"insertOrderedList\"),\n },\n link: {\n command: \"link\",\n icon: \"🔗\",\n title: \"Insert Link\",\n action: () => {\n const url = window.prompt(\"Enter URL:\");\n if (url) {\n execCommand(\"createLink\", url);\n }\n },\n },\n };\n\n const combinedClassName =\n `rounded-md border border-input ${error ? \"border-red-500 ring-1 ring-red-500\" : \"\"} ${disabled ? \"opacity-50 cursor-not-allowed\" : \"\"} ${className}`.trim();\n\n const editorStyle: React.CSSProperties = {\n minHeight,\n maxHeight,\n overflowY: maxHeight ? \"auto\" : undefined,\n };\n\n return (\n <div className={combinedClassName}>\n {/* Hidden input for form submission */}\n <input type=\"hidden\" name={name} value={content} />\n\n {/* Toolbar */}\n {showToolbar && (\n <div className=\"flex items-center justify-between p-2 border-b border-border bg-muted/50\">\n <div className=\"flex items-center gap-1\">\n {toolbarButtons.map((buttonName) => {\n const button = toolbarConfig[buttonName];\n if (!button) return null;\n\n return (\n <button\n key={buttonName}\n type=\"button\"\n className=\"flex items-center justify-center h-8 w-8 rounded border-none bg-transparent hover:bg-muted cursor-pointer transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n onClick={() =>\n editorRef.current && button.action(editorRef.current)\n }\n title={button.title}\n disabled={disabled || currentMode === \"markdown\"}\n aria-label={button.title}\n >\n {button.icon}\n </button>\n );\n })}\n </div>\n {allowModeSwitch && (\n <button\n type=\"button\"\n className=\"flex items-center justify-center h-8 px-3 rounded border-none bg-transparent hover:bg-muted text-xs font-medium cursor-pointer transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n onClick={handleModeToggle}\n disabled={disabled}\n title={`Switch to ${currentMode === \"wysiwyg\" ? \"Markdown\" : \"WYSIWYG\"}`}\n aria-label={`Switch to ${currentMode === \"wysiwyg\" ? \"Markdown\" : \"WYSIWYG\"}`}\n >\n {currentMode === \"wysiwyg\" ? \"MD\" : \"WYSIWYG\"}\n </button>\n )}\n </div>\n )}\n\n {/* Editor */}\n <div style={editorStyle}>\n {currentMode === \"wysiwyg\" ? (\n <div\n ref={editorRef}\n className=\"w-full p-3 text-base md:text-sm outline-none bg-transparent focus-visible:outline-none [&:empty:before]:content-[attr(data-placeholder)]\"\n role=\"textbox\"\n contentEditable={!disabled}\n onInput={handleWysiwygChange}\n onBlur={onBlur}\n data-placeholder={placeholder}\n aria-invalid={error || props[\"aria-invalid\"] ? \"true\" : \"false\"}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n suppressContentEditableWarning\n />\n ) : (\n <textarea\n ref={textareaRef}\n className=\"w-full p-3 text-base md:text-sm outline-none bg-transparent resize-none focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50\"\n value={content}\n onChange={handleMarkdownChange}\n onBlur={onBlur}\n disabled={disabled}\n required={required}\n placeholder={placeholder}\n aria-invalid={error || props[\"aria-invalid\"] ? \"true\" : \"false\"}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n style={editorStyle}\n />\n )}\n </div>\n </div>\n );\n}\n\nRichTextEditor.displayName = \"RichTextEditor\";\n"]}