@page-speed/forms 0.3.3 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/core.cjs +1 -1
- package/dist/core.cjs.map +1 -1
- package/dist/core.js +1 -1
- package/dist/core.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/inputs.cjs +2 -2
- package/dist/inputs.cjs.map +1 -1
- package/dist/inputs.js +2 -2
- package/dist/inputs.js.map +1 -1
- package/package.json +2 -2
package/dist/inputs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/inputs/TextInput.tsx","../src/inputs/TextArea.tsx","../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","React3","React4","React5","React6","error","crop","zoom","croppedAreaPixels","date","React8","disabled","React9","formatDate","isDateInArray","React10","React11","value"],"mappings":"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","file":"inputs.js","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 ...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 = \"text-input\";\n const errorClassName = error ? \"text-input--error\" : \"\";\n const combinedClassName = `${baseClassName} ${errorClassName} ${className}`.trim();\n\n return (\n <input\n type={type}\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 = \"textarea\";\n const errorClassName = error ? \"textarea--error\" : \"\";\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","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\n\n/**\n * Additional props specific to Checkbox\n */\nexport interface CheckboxProps\n extends Omit<InputProps<boolean>, \"onChange\" | \"placeholder\"> {\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\n * Can also wrap checkbox in a label element\n */\n label?: React.ReactNode;\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 text\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 * 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 ...props\n}: CheckboxProps) {\n const inputRef = React.useRef<HTMLInputElement>(null);\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 baseClassName = \"checkbox\";\n const errorClassName = error ? \"checkbox--error\" : \"\";\n const combinedClassName = `${baseClassName} ${errorClassName} ${className}`.trim();\n\n const checkbox = (\n <input\n ref={inputRef}\n type=\"checkbox\"\n name={name}\n checked={value}\n onChange={handleChange}\n onBlur={handleBlur}\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 // If label is provided, wrap checkbox in label element\n if (label) {\n return (\n <label className=\"checkbox-label\">\n {checkbox}\n <span className=\"checkbox-label-text\">{label}</span>\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\";\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\n extends Omit<InputProps<string[]>, \"onChange\" | \"placeholder\"> {\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 // 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 const baseClassName = \"checkbox-group\";\n const errorClassName = error ? \"checkbox-group--error\" : \"\";\n const layoutClassName = `checkbox-group--${layout}`;\n const combinedClassName =\n `${baseClassName} ${errorClassName} ${layoutClassName} ${className}`.trim();\n\n // Determine if max selections reached\n const maxReached = Boolean(maxSelections && value.length >= maxSelections);\n\n return (\n <div\n className={combinedClassName}\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=\"checkbox-group-label\">{label}</div>}\n {description && (\n <div className=\"checkbox-group-description\">{description}</div>\n )}\n\n <div className=\"checkbox-options\">\n {/* Select All Checkbox */}\n {showSelectAll && enabledOptions.length > 0 && (\n <label className=\"checkbox-option checkbox-option--select-all\">\n <input\n type=\"checkbox\"\n checked={allSelected}\n ref={(input) => {\n if (input) {\n input.indeterminate = someSelected;\n }\n }}\n onChange={(e) => handleSelectAll(e.target.checked)}\n onBlur={handleBlur}\n disabled={disabled}\n className=\"checkbox-input\"\n aria-label={selectAllLabel}\n />\n <div className=\"checkbox-content\">\n <span className=\"checkbox-label\">{selectAllLabel}</span>\n </div>\n </label>\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 const checkboxId = `${name}-${option.value}`;\n\n return (\n <label\n key={option.value}\n className={`checkbox-option ${isDisabled ? \"checkbox-option--disabled\" : \"\"}`}\n htmlFor={checkboxId}\n >\n <input\n type=\"checkbox\"\n id={checkboxId}\n name={name}\n value={option.value}\n checked={isChecked}\n onChange={(e) => handleChange(option.value, e.target.checked)}\n onBlur={handleBlur}\n disabled={isDisabled}\n required={required && minSelections ? value.length < minSelections : false}\n className=\"checkbox-input\"\n aria-describedby={\n option.description\n ? `${checkboxId}-description`\n : props[\"aria-describedby\"]\n }\n />\n <div className=\"checkbox-content\">\n {renderOption ? (\n renderOption(option)\n ) : (\n <>\n <span className=\"checkbox-label\">{option.label}</span>\n {option.description && (\n <span\n className=\"checkbox-description\"\n id={`${checkboxId}-description`}\n >\n {option.description}\n </span>\n )}\n </>\n )}\n </div>\n </label>\n );\n })}\n </div>\n\n {/* Selection count feedback */}\n {(minSelections || maxSelections) && (\n <div className=\"checkbox-group-feedback\" aria-live=\"polite\">\n {minSelections && value.length < minSelections && (\n <span className=\"checkbox-group-feedback-min\">\n Select at least {minSelections} option{minSelections !== 1 ? \"s\" : \"\"}\n </span>\n )}\n {maxSelections && (\n <span className=\"checkbox-group-feedback-max\">\n {value.length}/{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\";\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\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 Radio\n */\nexport interface RadioProps\n extends Omit<InputProps<string>, \"onChange\" | \"placeholder\"> {\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\n * - Individual option disabled state\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<HTMLDivElement>,\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 baseClassName = \"radio-group\";\n const errorClassName = error ? \"radio-group--error\" : \"\";\n const layoutClassName = `radio-group--${layout}`;\n const combinedClassName =\n `${baseClassName} ${errorClassName} ${layoutClassName} ${className}`.trim();\n\n return (\n <div\n className={combinedClassName}\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=\"radio-group-label\">{label}</div>}\n <div className=\"radio-options\">\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 return (\n <label\n key={option.value}\n className={`radio-option ${isDisabled ? \"radio-option--disabled\" : \"\"}`}\n htmlFor={radioId}\n >\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 onKeyDown={(e) => handleKeyDown(e, index)}\n disabled={isDisabled}\n required={required}\n className=\"radio-input\"\n aria-describedby={\n option.description\n ? `${radioId}-description`\n : props[\"aria-describedby\"]\n }\n />\n <div className=\"radio-content\">\n <span className=\"radio-label\">{option.label}</span>\n {option.description && (\n <span\n className=\"radio-description\"\n id={`${radioId}-description`}\n >\n {option.description}\n </span>\n )}\n </div>\n </label>\n );\n })}\n </div>\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 baseClassName = \"select\";\n const errorClassName = error ? \"select--error\" : \"\";\n const disabledClassName = disabled ? \"select--disabled\" : \"\";\n const openClassName = isOpen ? \"select--open\" : \"\";\n const combinedClassName =\n `${baseClassName} ${errorClassName} ${disabledClassName} ${openClassName} ${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=\"select-trigger\"\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=\"select-value\">\n {selectedOption ? (\n renderOption ? (\n renderOption(selectedOption)\n ) : (\n selectedOption.label\n )\n ) : (\n <span className=\"select-placeholder\">{placeholder}</span>\n )}\n </span>\n <div className=\"select-icons\">\n {loading && <span className=\"select-loading\">⏳</span>}\n {clearable && value && !disabled && !loading && (\n <button\n type=\"button\"\n className=\"select-clear\"\n onClick={handleClear}\n aria-label=\"Clear selection\"\n tabIndex={-1}\n >\n ✕\n </button>\n )}\n <span className=\"select-arrow\" aria-hidden=\"true\">\n {isOpen ? \"▲\" : \"▼\"}\n </span>\n </div>\n </div>\n\n {/* Dropdown */}\n {isOpen && (\n <div id={dropdownId} className=\"select-dropdown\" role=\"listbox\">\n {searchable && (\n <div className=\"select-search\">\n <input\n ref={searchInputRef}\n type=\"text\"\n className=\"select-search-input\"\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=\"select-options\">\n {filteredOptions.length === 0 ? (\n <div className=\"select-no-options\">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=\"select-optgroup\">\n <div className=\"select-optgroup-label\">{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={`select-option ${isSelected ? \"select-option--selected\" : \"\"} ${isFocused ? \"select-option--focused\" : \"\"} ${isDisabled ? \"select-option--disabled\" : \"\"}`}\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={`select-option ${isSelected ? \"select-option--selected\" : \"\"} ${isFocused ? \"select-option--focused\" : \"\"} ${isDisabled ? \"select-option--disabled\" : \"\"}`}\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 baseClassName = \"file-input\";\n const errorClassName = error ? \"file-input--error\" : \"\";\n const dragClassName = dragActive ? \"file-input--drag-active\" : \"\";\n const disabledClassName = disabled ? \"file-input--disabled\" : \"\";\n const combinedClassName = `${baseClassName} ${errorClassName} ${dragClassName} ${disabledClassName} ${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 className=\"file-input__native\"\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=\"file-input__dropzone\"\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=\"file-input__dropzone-content\">\n <svg\n className=\"file-input__icon\"\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=\"file-input__placeholder\">\n {value.length > 0\n ? `${value.length} file(s) selected`\n : placeholder}\n </p>\n {accept && (\n <p className=\"file-input__hint\">Accepted: {accept}</p>\n )}\n {maxSize && (\n <p className=\"file-input__hint\">\n Max size: {formatFileSize(maxSize)}\n </p>\n )}\n </div>\n </div>\n\n {/* File list */}\n {value.length > 0 && (\n <ul className=\"file-input__list\" role=\"list\">\n {value.map((file, index) => {\n const previewUrl = showPreview ? getPreviewUrl(file) : null;\n\n return (\n <li key={`${file.name}-${index}`} className=\"file-input__item\">\n {previewUrl && (\n <img\n src={previewUrl}\n alt={file.name}\n className=\"file-input__preview\"\n width=\"48\"\n height=\"48\"\n />\n )}\n <div className=\"file-input__details\">\n <span className=\"file-input__filename\">{file.name}</span>\n <span className=\"file-input__filesize\">\n {formatFileSize(file.size)}\n </span>\n {/* Upload progress indicator */}\n {showProgress && uploadProgress[file.name] !== undefined && (\n <div className=\"file-input__progress\">\n <div\n className=\"file-input__progress-bar\"\n style={{ width: `${uploadProgress[file.name]}%` }}\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 <span className=\"file-input__progress-text\">\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=\"file-input__crop\"\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=\"file-input__remove\"\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=\"file-input-cropper-modal\">\n <div\n className=\"file-input-cropper-overlay\"\n onClick={handleCropCancel}\n aria-label=\"Close cropper\"\n />\n <div className=\"file-input-cropper-container\">\n <div className=\"file-input-cropper-header\">\n <h3 className=\"file-input-cropper-title\">Crop Image</h3>\n <button\n type=\"button\"\n className=\"file-input-cropper-close\"\n onClick={handleCropCancel}\n aria-label=\"Close\"\n >\n ✕\n </button>\n </div>\n\n <div className=\"file-input-cropper-content\">\n <div\n className=\"file-input-cropper-image-container\"\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=\"file-input-cropper-image\"\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=\"file-input-cropper-overlay-box\"\n style={{\n width: cropAspectRatio\n ? `${Math.min(80, 80 * cropAspectRatio)}%`\n : \"80%\",\n aspectRatio: cropAspectRatio ? String(cropAspectRatio) : undefined,\n }}\n >\n <div className=\"file-input-cropper-grid\">\n <div className=\"file-input-cropper-grid-line\" />\n <div className=\"file-input-cropper-grid-line\" />\n </div>\n </div>\n </div>\n\n {/* Zoom controls */}\n <div className=\"file-input-cropper-controls\">\n <label htmlFor=\"zoom-slider\" className=\"file-input-cropper-label\">\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=\"file-input-cropper-slider\"\n aria-label=\"Zoom level\"\n />\n </div>\n </div>\n\n <div className=\"file-input-cropper-footer\">\n <button\n type=\"button\"\n className=\"file-input-cropper-button file-input-cropper-button--cancel\"\n onClick={handleCropCancel}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"file-input-cropper-button file-input-cropper-button--save\"\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<InputProps<Date | null>, \"onChange\"> {\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>(value || new Date());\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\", \"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 className=\"datepicker-calendar\" role=\"grid\" aria-label=\"Calendar\">\n <div className=\"datepicker-calendar-header\">\n <button\n type=\"button\"\n className=\"datepicker-calendar-nav\"\n onClick={handlePrevMonth}\n aria-label=\"Previous month\"\n >\n ←\n </button>\n <div className=\"datepicker-calendar-month\">\n {monthNames[month]} {year}\n </div>\n <button\n type=\"button\"\n className=\"datepicker-calendar-nav\"\n onClick={handleNextMonth}\n aria-label=\"Next month\"\n >\n →\n </button>\n </div>\n <div className=\"datepicker-calendar-weekdays\">\n {[\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"].map((day) => (\n <div key={day} className=\"datepicker-calendar-weekday\">\n {day}\n </div>\n ))}\n </div>\n <div className=\"datepicker-calendar-days\">\n {days.map((date, index) => {\n if (!date) {\n return <div key={`empty-${index}`} className=\"datepicker-calendar-day datepicker-calendar-day--empty\" />;\n }\n\n const isSelected = 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={`datepicker-calendar-day ${isSelected ? \"datepicker-calendar-day--selected\" : \"\"} ${isToday ? \"datepicker-calendar-day--today\" : \"\"} ${disabled ? \"datepicker-calendar-day--disabled\" : \"\"}`}\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 baseClassName = \"datepicker\";\n const errorClassName = error ? \"datepicker--error\" : \"\";\n const disabledClassName = disabled ? \"datepicker--disabled\" : \"\";\n const openClassName = isOpen ? \"datepicker--open\" : \"\";\n const combinedClassName =\n `${baseClassName} ${errorClassName} ${disabledClassName} ${openClassName} ${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=\"datepicker-input-wrapper\">\n {showIcon && (\n <span className=\"datepicker-icon\" 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 ref={inputRef}\n type=\"text\"\n className=\"datepicker-input\"\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=\"datepicker-clear\"\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=\"datepicker-dropdown\">\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 baseClassName = \"timepicker\";\n const errorClassName = error ? \"timepicker--error\" : \"\";\n const disabledClassName = disabled ? \"timepicker--disabled\" : \"\";\n const openClassName = isOpen ? \"timepicker--open\" : \"\";\n const combinedClassName =\n `${baseClassName} ${errorClassName} ${disabledClassName} ${openClassName} ${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=\"timepicker-input-wrapper\">\n {showIcon && (\n <span className=\"timepicker-icon\" 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=\"timepicker-input\"\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=\"timepicker-clear\"\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=\"timepicker-dropdown\">\n <div className=\"timepicker-selectors\">\n {/* Hour selector */}\n <div className=\"timepicker-column\">\n <div className=\"timepicker-column-label\">\n {use24Hour ? \"Hour\" : \"Hour\"}\n </div>\n <div className=\"timepicker-column-options\">\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={`timepicker-option ${isSelected ? \"timepicker-option--selected\" : \"\"}`}\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=\"timepicker-column\">\n <div className=\"timepicker-column-label\">Minute</div>\n <div className=\"timepicker-column-options\">\n {minutes.map((minute) => {\n const isSelected = timeValue?.minute === minute;\n\n return (\n <button\n key={minute}\n type=\"button\"\n className={`timepicker-option ${isSelected ? \"timepicker-option--selected\" : \"\"}`}\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=\"timepicker-column timepicker-column--period\">\n <div className=\"timepicker-column-label\">Period</div>\n <div className=\"timepicker-column-options\">\n <button\n type=\"button\"\n className={`timepicker-option ${timeValue?.period === \"AM\" ? \"timepicker-option--selected\" : \"\"}`}\n onClick={() => handlePeriodChange(\"AM\")}\n >\n AM\n </button>\n <button\n type=\"button\"\n className={`timepicker-option ${timeValue?.period === \"PM\" ? \"timepicker-option--selected\" : \"\"}`}\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 className=\"daterangepicker-calendar\" role=\"grid\" aria-label=\"Calendar\">\n <div className=\"daterangepicker-calendar-header\">\n <button\n type=\"button\"\n className=\"daterangepicker-calendar-nav\"\n onClick={handlePrevMonth}\n aria-label=\"Previous month\"\n >\n ←\n </button>\n <div className=\"daterangepicker-calendar-month\">\n {monthNames[month]} {year}\n </div>\n <button\n type=\"button\"\n className=\"daterangepicker-calendar-nav\"\n onClick={handleNextMonth}\n aria-label=\"Next month\"\n >\n →\n </button>\n </div>\n <div className=\"daterangepicker-calendar-weekdays\">\n {[\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"].map((day) => (\n <div key={day} className=\"daterangepicker-calendar-weekday\">\n {day}\n </div>\n ))}\n </div>\n <div className=\"daterangepicker-calendar-days\">\n {days.map((date, index) => {\n if (!date) {\n return <div key={`empty-${index}`} className=\"daterangepicker-calendar-day daterangepicker-calendar-day--empty\" />;\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={`daterangepicker-calendar-day ${isStart || isEnd ? \"daterangepicker-calendar-day--selected\" : \"\"} ${isInRange || isInHoverRange ? \"daterangepicker-calendar-day--in-range\" : \"\"} ${isToday ? \"daterangepicker-calendar-day--today\" : \"\"} ${disabled ? \"daterangepicker-calendar-day--disabled\" : \"\"}`}\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 baseClassName = \"daterangepicker\";\n const errorClassName = error ? \"daterangepicker--error\" : \"\";\n const disabledClassName = disabled ? \"daterangepicker--disabled\" : \"\";\n const openClassName = isOpen ? \"daterangepicker--open\" : \"\";\n const combinedClassName =\n `${baseClassName} ${errorClassName} ${disabledClassName} ${openClassName} ${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=\"daterangepicker-input-wrapper\">\n {showIcon && (\n <span className=\"daterangepicker-icon\" 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=\"daterangepicker-input\"\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=\"daterangepicker-clear\"\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=\"daterangepicker-dropdown\">\n {renderCalendar()}\n {rangeStart && !rangeEnd && (\n <div className=\"daterangepicker-hint\">\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, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\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 baseClassName = \"richtexteditor\";\n const errorClassName = error ? \"richtexteditor--error\" : \"\";\n const disabledClassName = disabled ? \"richtexteditor--disabled\" : \"\";\n const modeClassName = `richtexteditor--${currentMode}`;\n const combinedClassName =\n `${baseClassName} ${errorClassName} ${disabledClassName} ${modeClassName} ${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=\"richtexteditor-toolbar\">\n <div className=\"richtexteditor-toolbar-buttons\">\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=\"richtexteditor-toolbar-button\"\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=\"richtexteditor-mode-toggle\"\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 className=\"richtexteditor-editor\" style={editorStyle}>\n {currentMode === \"wysiwyg\" ? (\n <div\n ref={editorRef}\n className=\"richtexteditor-content\"\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=\"richtexteditor-markdown\"\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 />\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/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","React3","React4","React5","React6","error","crop","zoom","croppedAreaPixels","date","React8","disabled","React9","formatDate","isDateInArray","React10","React11","value"],"mappings":"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","file":"inputs.js","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 ...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 = \"text-input\";\n const errorClassName = error ? \"text-input--error\" : \"\";\n const combinedClassName = `${baseClassName} ${errorClassName} ${className}`.trim();\n\n return (\n <input\n type={type}\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 = \"textarea\";\n const errorClassName = error ? \"textarea--error\" : \"\";\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","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\n\n/**\n * Additional props specific to Checkbox\n */\nexport interface CheckboxProps\n extends Omit<InputProps<boolean>, \"onChange\" | \"placeholder\"> {\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\n * Can also wrap checkbox in a label element\n */\n label?: React.ReactNode;\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 text\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 * 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 ...props\n}: CheckboxProps) {\n const inputRef = React.useRef<HTMLInputElement>(null);\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 baseClassName = \"checkbox\";\n const errorClassName = error ? \"checkbox--error\" : \"\";\n const combinedClassName = `${baseClassName} ${errorClassName} ${className}`.trim();\n\n const checkbox = (\n <input\n ref={inputRef}\n type=\"checkbox\"\n name={name}\n checked={value}\n onChange={handleChange}\n onBlur={handleBlur}\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 // If label is provided, wrap checkbox in label element\n if (label) {\n return (\n <label className=\"checkbox-label\">\n {checkbox}\n <span className=\"checkbox-label-text\">{label}</span>\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\";\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\n extends Omit<InputProps<string[]>, \"onChange\" | \"placeholder\"> {\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 // 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 const baseClassName = \"checkbox-group\";\n const errorClassName = error ? \"checkbox-group--error\" : \"\";\n const layoutClassName = `checkbox-group--${layout}`;\n const combinedClassName =\n `${baseClassName} ${errorClassName} ${layoutClassName} ${className}`.trim();\n\n // Determine if max selections reached\n const maxReached = Boolean(maxSelections && value.length >= maxSelections);\n\n return (\n <div\n className={combinedClassName}\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=\"checkbox-group-label\">{label}</div>}\n {description && (\n <div className=\"checkbox-group-description\">{description}</div>\n )}\n\n <div className=\"checkbox-options\">\n {/* Select All Checkbox */}\n {showSelectAll && enabledOptions.length > 0 && (\n <label className=\"checkbox-option checkbox-option--select-all\">\n <input\n type=\"checkbox\"\n checked={allSelected}\n ref={(input) => {\n if (input) {\n input.indeterminate = someSelected;\n }\n }}\n onChange={(e) => handleSelectAll(e.target.checked)}\n onBlur={handleBlur}\n disabled={disabled}\n className=\"checkbox-input\"\n aria-label={selectAllLabel}\n />\n <div className=\"checkbox-content\">\n <span className=\"checkbox-label\">{selectAllLabel}</span>\n </div>\n </label>\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 const checkboxId = `${name}-${option.value}`;\n\n return (\n <label\n key={option.value}\n className={`checkbox-option ${isDisabled ? \"checkbox-option--disabled\" : \"\"}`}\n htmlFor={checkboxId}\n >\n <input\n type=\"checkbox\"\n id={checkboxId}\n name={name}\n value={option.value}\n checked={isChecked}\n onChange={(e) => handleChange(option.value, e.target.checked)}\n onBlur={handleBlur}\n disabled={isDisabled}\n required={required && minSelections ? value.length < minSelections : false}\n className=\"checkbox-input\"\n aria-describedby={\n option.description\n ? `${checkboxId}-description`\n : props[\"aria-describedby\"]\n }\n />\n <div className=\"checkbox-content\">\n {renderOption ? (\n renderOption(option)\n ) : (\n <>\n <span className=\"checkbox-label\">{option.label}</span>\n {option.description && (\n <span\n className=\"checkbox-description\"\n id={`${checkboxId}-description`}\n >\n {option.description}\n </span>\n )}\n </>\n )}\n </div>\n </label>\n );\n })}\n </div>\n\n {/* Selection count feedback */}\n {(minSelections || maxSelections) && (\n <div className=\"checkbox-group-feedback\" aria-live=\"polite\">\n {minSelections && value.length < minSelections && (\n <span className=\"checkbox-group-feedback-min\">\n Select at least {minSelections} option{minSelections !== 1 ? \"s\" : \"\"}\n </span>\n )}\n {maxSelections && (\n <span className=\"checkbox-group-feedback-max\">\n {value.length}/{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\";\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\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 Radio\n */\nexport interface RadioProps\n extends Omit<InputProps<string>, \"onChange\" | \"placeholder\"> {\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\n * - Individual option disabled state\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<HTMLDivElement>,\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 baseClassName = \"radio-group\";\n const errorClassName = error ? \"radio-group--error\" : \"\";\n const layoutClassName = `radio-group--${layout}`;\n const combinedClassName =\n `${baseClassName} ${errorClassName} ${layoutClassName} ${className}`.trim();\n\n return (\n <div\n className={combinedClassName}\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=\"radio-group-label\">{label}</div>}\n <div className=\"radio-options\">\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 return (\n <label\n key={option.value}\n className={`radio-option ${isDisabled ? \"radio-option--disabled\" : \"\"}`}\n htmlFor={radioId}\n >\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 onKeyDown={(e) => handleKeyDown(e, index)}\n disabled={isDisabled}\n required={required}\n className=\"radio-input\"\n aria-describedby={\n option.description\n ? `${radioId}-description`\n : props[\"aria-describedby\"]\n }\n />\n <div className=\"radio-content\">\n <span className=\"radio-label\">{option.label}</span>\n {option.description && (\n <span\n className=\"radio-description\"\n id={`${radioId}-description`}\n >\n {option.description}\n </span>\n )}\n </div>\n </label>\n );\n })}\n </div>\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 baseClassName = \"select\";\n const errorClassName = error ? \"select--error\" : \"\";\n const disabledClassName = disabled ? \"select--disabled\" : \"\";\n const openClassName = isOpen ? \"select--open\" : \"\";\n const combinedClassName =\n `${baseClassName} ${errorClassName} ${disabledClassName} ${openClassName} ${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=\"select-trigger\"\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=\"select-value\">\n {selectedOption ? (\n renderOption ? (\n renderOption(selectedOption)\n ) : (\n selectedOption.label\n )\n ) : (\n <span className=\"select-placeholder\">{placeholder}</span>\n )}\n </span>\n <div className=\"select-icons\">\n {loading && <span className=\"select-loading\">⏳</span>}\n {clearable && value && !disabled && !loading && (\n <button\n type=\"button\"\n className=\"select-clear\"\n onClick={handleClear}\n aria-label=\"Clear selection\"\n tabIndex={-1}\n >\n ✕\n </button>\n )}\n <span className=\"select-arrow\" aria-hidden=\"true\">\n {isOpen ? \"▲\" : \"▼\"}\n </span>\n </div>\n </div>\n\n {/* Dropdown */}\n {isOpen && (\n <div id={dropdownId} className=\"select-dropdown\" role=\"listbox\">\n {searchable && (\n <div className=\"select-search\">\n <input\n ref={searchInputRef}\n type=\"text\"\n className=\"select-search-input\"\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=\"select-options\">\n {filteredOptions.length === 0 ? (\n <div className=\"select-no-options\">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=\"select-optgroup\">\n <div className=\"select-optgroup-label\">{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={`select-option ${isSelected ? \"select-option--selected\" : \"\"} ${isFocused ? \"select-option--focused\" : \"\"} ${isDisabled ? \"select-option--disabled\" : \"\"}`}\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={`select-option ${isSelected ? \"select-option--selected\" : \"\"} ${isFocused ? \"select-option--focused\" : \"\"} ${isDisabled ? \"select-option--disabled\" : \"\"}`}\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 baseClassName = \"file-input\";\n const errorClassName = error ? \"file-input--error\" : \"\";\n const dragClassName = dragActive ? \"file-input--drag-active\" : \"\";\n const disabledClassName = disabled ? \"file-input--disabled\" : \"\";\n const combinedClassName = `${baseClassName} ${errorClassName} ${dragClassName} ${disabledClassName} ${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 className=\"file-input__native\"\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=\"file-input__dropzone\"\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=\"file-input__dropzone-content\">\n <svg\n className=\"file-input__icon\"\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=\"file-input__placeholder\">\n {value.length > 0\n ? `${value.length} file(s) selected`\n : placeholder}\n </p>\n {accept && (\n <p className=\"file-input__hint\">Accepted: {accept}</p>\n )}\n {maxSize && (\n <p className=\"file-input__hint\">\n Max size: {formatFileSize(maxSize)}\n </p>\n )}\n </div>\n </div>\n\n {/* File list */}\n {value.length > 0 && (\n <ul className=\"file-input__list\" role=\"list\">\n {value.map((file, index) => {\n const previewUrl = showPreview ? getPreviewUrl(file) : null;\n\n return (\n <li key={`${file.name}-${index}`} className=\"file-input__item\">\n {previewUrl && (\n <img\n src={previewUrl}\n alt={file.name}\n className=\"file-input__preview\"\n width=\"48\"\n height=\"48\"\n />\n )}\n <div className=\"file-input__details\">\n <span className=\"file-input__filename\">{file.name}</span>\n <span className=\"file-input__filesize\">\n {formatFileSize(file.size)}\n </span>\n {/* Upload progress indicator */}\n {showProgress && uploadProgress[file.name] !== undefined && (\n <div className=\"file-input__progress\">\n <div\n className=\"file-input__progress-bar\"\n style={{ width: `${uploadProgress[file.name]}%` }}\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 <span className=\"file-input__progress-text\">\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=\"file-input__crop\"\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=\"file-input__remove\"\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=\"file-input-cropper-modal\">\n <div\n className=\"file-input-cropper-overlay\"\n onClick={handleCropCancel}\n aria-label=\"Close cropper\"\n />\n <div className=\"file-input-cropper-container\">\n <div className=\"file-input-cropper-header\">\n <h3 className=\"file-input-cropper-title\">Crop Image</h3>\n <button\n type=\"button\"\n className=\"file-input-cropper-close\"\n onClick={handleCropCancel}\n aria-label=\"Close\"\n >\n ✕\n </button>\n </div>\n\n <div className=\"file-input-cropper-content\">\n <div\n className=\"file-input-cropper-image-container\"\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=\"file-input-cropper-image\"\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=\"file-input-cropper-overlay-box\"\n style={{\n width: cropAspectRatio\n ? `${Math.min(80, 80 * cropAspectRatio)}%`\n : \"80%\",\n aspectRatio: cropAspectRatio ? String(cropAspectRatio) : undefined,\n }}\n >\n <div className=\"file-input-cropper-grid\">\n <div className=\"file-input-cropper-grid-line\" />\n <div className=\"file-input-cropper-grid-line\" />\n </div>\n </div>\n </div>\n\n {/* Zoom controls */}\n <div className=\"file-input-cropper-controls\">\n <label htmlFor=\"zoom-slider\" className=\"file-input-cropper-label\">\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=\"file-input-cropper-slider\"\n aria-label=\"Zoom level\"\n />\n </div>\n </div>\n\n <div className=\"file-input-cropper-footer\">\n <button\n type=\"button\"\n className=\"file-input-cropper-button file-input-cropper-button--cancel\"\n onClick={handleCropCancel}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"file-input-cropper-button file-input-cropper-button--save\"\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<InputProps<Date | null>, \"onChange\"> {\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>(value || new Date());\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\", \"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 className=\"datepicker-calendar\" role=\"grid\" aria-label=\"Calendar\">\n <div className=\"datepicker-calendar-header\">\n <button\n type=\"button\"\n className=\"datepicker-calendar-nav\"\n onClick={handlePrevMonth}\n aria-label=\"Previous month\"\n >\n ←\n </button>\n <div className=\"datepicker-calendar-month\">\n {`${monthNames[month]} ${year}`}\n </div>\n <button\n type=\"button\"\n className=\"datepicker-calendar-nav\"\n onClick={handleNextMonth}\n aria-label=\"Next month\"\n >\n →\n </button>\n </div>\n <div className=\"datepicker-calendar-weekdays\">\n {[\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"].map((day) => (\n <div key={day} className=\"datepicker-calendar-weekday\">\n {day}\n </div>\n ))}\n </div>\n <div className=\"datepicker-calendar-days\">\n {days.map((date, index) => {\n if (!date) {\n return <div key={`empty-${index}`} className=\"datepicker-calendar-day datepicker-calendar-day--empty\" />;\n }\n\n const isSelected = 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={`datepicker-calendar-day ${isSelected ? \"datepicker-calendar-day--selected\" : \"\"} ${isToday ? \"datepicker-calendar-day--today\" : \"\"} ${disabled ? \"datepicker-calendar-day--disabled\" : \"\"}`}\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 baseClassName = \"datepicker\";\n const errorClassName = error ? \"datepicker--error\" : \"\";\n const disabledClassName = disabled ? \"datepicker--disabled\" : \"\";\n const openClassName = isOpen ? \"datepicker--open\" : \"\";\n const combinedClassName =\n `${baseClassName} ${errorClassName} ${disabledClassName} ${openClassName} ${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=\"datepicker-input-wrapper\">\n {showIcon && (\n <span className=\"datepicker-icon\" 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 ref={inputRef}\n type=\"text\"\n className=\"datepicker-input\"\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=\"datepicker-clear\"\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=\"datepicker-dropdown\">\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 baseClassName = \"timepicker\";\n const errorClassName = error ? \"timepicker--error\" : \"\";\n const disabledClassName = disabled ? \"timepicker--disabled\" : \"\";\n const openClassName = isOpen ? \"timepicker--open\" : \"\";\n const combinedClassName =\n `${baseClassName} ${errorClassName} ${disabledClassName} ${openClassName} ${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=\"timepicker-input-wrapper\">\n {showIcon && (\n <span className=\"timepicker-icon\" 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=\"timepicker-input\"\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=\"timepicker-clear\"\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=\"timepicker-dropdown\">\n <div className=\"timepicker-selectors\">\n {/* Hour selector */}\n <div className=\"timepicker-column\">\n <div className=\"timepicker-column-label\">\n {use24Hour ? \"Hour\" : \"Hour\"}\n </div>\n <div className=\"timepicker-column-options\">\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={`timepicker-option ${isSelected ? \"timepicker-option--selected\" : \"\"}`}\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=\"timepicker-column\">\n <div className=\"timepicker-column-label\">Minute</div>\n <div className=\"timepicker-column-options\">\n {minutes.map((minute) => {\n const isSelected = timeValue?.minute === minute;\n\n return (\n <button\n key={minute}\n type=\"button\"\n className={`timepicker-option ${isSelected ? \"timepicker-option--selected\" : \"\"}`}\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=\"timepicker-column timepicker-column--period\">\n <div className=\"timepicker-column-label\">Period</div>\n <div className=\"timepicker-column-options\">\n <button\n type=\"button\"\n className={`timepicker-option ${timeValue?.period === \"AM\" ? \"timepicker-option--selected\" : \"\"}`}\n onClick={() => handlePeriodChange(\"AM\")}\n >\n AM\n </button>\n <button\n type=\"button\"\n className={`timepicker-option ${timeValue?.period === \"PM\" ? \"timepicker-option--selected\" : \"\"}`}\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 className=\"daterangepicker-calendar\" role=\"grid\" aria-label=\"Calendar\">\n <div className=\"daterangepicker-calendar-header\">\n <button\n type=\"button\"\n className=\"daterangepicker-calendar-nav\"\n onClick={handlePrevMonth}\n aria-label=\"Previous month\"\n >\n ←\n </button>\n <div className=\"daterangepicker-calendar-month\">\n {`${monthNames[month]} ${year}`}\n </div>\n <button\n type=\"button\"\n className=\"daterangepicker-calendar-nav\"\n onClick={handleNextMonth}\n aria-label=\"Next month\"\n >\n →\n </button>\n </div>\n <div className=\"daterangepicker-calendar-weekdays\">\n {[\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"].map((day) => (\n <div key={day} className=\"daterangepicker-calendar-weekday\">\n {day}\n </div>\n ))}\n </div>\n <div className=\"daterangepicker-calendar-days\">\n {days.map((date, index) => {\n if (!date) {\n return <div key={`empty-${index}`} className=\"daterangepicker-calendar-day daterangepicker-calendar-day--empty\" />;\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={`daterangepicker-calendar-day ${isStart || isEnd ? \"daterangepicker-calendar-day--selected\" : \"\"} ${isInRange || isInHoverRange ? \"daterangepicker-calendar-day--in-range\" : \"\"} ${isToday ? \"daterangepicker-calendar-day--today\" : \"\"} ${disabled ? \"daterangepicker-calendar-day--disabled\" : \"\"}`}\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 baseClassName = \"daterangepicker\";\n const errorClassName = error ? \"daterangepicker--error\" : \"\";\n const disabledClassName = disabled ? \"daterangepicker--disabled\" : \"\";\n const openClassName = isOpen ? \"daterangepicker--open\" : \"\";\n const combinedClassName =\n `${baseClassName} ${errorClassName} ${disabledClassName} ${openClassName} ${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=\"daterangepicker-input-wrapper\">\n {showIcon && (\n <span className=\"daterangepicker-icon\" 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=\"daterangepicker-input\"\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=\"daterangepicker-clear\"\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=\"daterangepicker-dropdown\">\n {renderCalendar()}\n {rangeStart && !rangeEnd && (\n <div className=\"daterangepicker-hint\">\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, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\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 baseClassName = \"richtexteditor\";\n const errorClassName = error ? \"richtexteditor--error\" : \"\";\n const disabledClassName = disabled ? \"richtexteditor--disabled\" : \"\";\n const modeClassName = `richtexteditor--${currentMode}`;\n const combinedClassName =\n `${baseClassName} ${errorClassName} ${disabledClassName} ${modeClassName} ${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=\"richtexteditor-toolbar\">\n <div className=\"richtexteditor-toolbar-buttons\">\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=\"richtexteditor-toolbar-button\"\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=\"richtexteditor-mode-toggle\"\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 className=\"richtexteditor-editor\" style={editorStyle}>\n {currentMode === \"wysiwyg\" ? (\n <div\n ref={editorRef}\n className=\"richtexteditor-content\"\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=\"richtexteditor-markdown\"\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 />\n )}\n </div>\n </div>\n );\n}\n\nRichTextEditor.displayName = \"RichTextEditor\";\n"]}
|