@page-speed/forms 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/inputs/TextInput.tsx","../src/inputs/TextArea.tsx","../src/inputs/Checkbox.tsx","../src/inputs/Radio.tsx","../src/inputs/Select.tsx"],"names":["React","React2","React3","React4","React5"],"mappings":"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","file":"inputs.cjs","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\n\n/**\n * TextInput - High-performance text input component\n *\n * A lightweight, accessible text input with error state support.\n * Designed to work seamlessly with useForm and Field components.\n *\n * Features:\n * - Full accessibility support\n * - Error state styling\n * - Controlled input behavior\n * - All native input attributes supported\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { email: '' } });\n *\n * <TextInput\n * {...form.getFieldProps('email')}\n * type=\"email\"\n * placeholder=\"Enter your email\"\n * error={!!form.errors.email}\n * aria-invalid={!!form.errors.email}\n * aria-describedby={form.errors.email ? 'email-error' : undefined}\n * />\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/text-input\n */\nexport function TextInput({\n name,\n value,\n onChange,\n onBlur,\n placeholder,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n type = \"text\",\n ...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 * 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"]}
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"],"names":["React","React2","React3","React4","React5","React6"],"mappings":"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","file":"inputs.cjs","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\n\n/**\n * TextInput - High-performance text input component\n *\n * A lightweight, accessible text input with error state support.\n * Designed to work seamlessly with useForm and Field components.\n *\n * Features:\n * - Full accessibility support\n * - Error state styling\n * - Controlled input behavior\n * - All native input attributes supported\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { email: '' } });\n *\n * <TextInput\n * {...form.getFieldProps('email')}\n * type=\"email\"\n * placeholder=\"Enter your email\"\n * error={!!form.errors.email}\n * aria-invalid={!!form.errors.email}\n * aria-describedby={form.errors.email ? 'email-error' : undefined}\n * />\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/text-input\n */\nexport function TextInput({\n name,\n value,\n onChange,\n onBlur,\n placeholder,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n type = \"text\",\n ...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"]}
package/dist/inputs.d.cts CHANGED
@@ -178,6 +178,148 @@ declare namespace Checkbox {
178
178
  var displayName: string;
179
179
  }
180
180
 
181
+ /**
182
+ * CheckboxGroup option type
183
+ */
184
+ interface CheckboxGroupOption {
185
+ /**
186
+ * The value for this checkbox option
187
+ */
188
+ value: string;
189
+ /**
190
+ * Display label for the option
191
+ */
192
+ label: React.ReactNode;
193
+ /**
194
+ * Optional description text below the label
195
+ */
196
+ description?: React.ReactNode;
197
+ /**
198
+ * Whether this option is disabled
199
+ */
200
+ disabled?: boolean;
201
+ }
202
+ /**
203
+ * Additional props specific to CheckboxGroup
204
+ */
205
+ interface CheckboxGroupProps extends Omit<InputProps<string[]>, "onChange" | "placeholder"> {
206
+ /**
207
+ * Change handler - receives array of selected values
208
+ */
209
+ onChange: (values: string[]) => void;
210
+ /**
211
+ * Array of checkbox options
212
+ */
213
+ options: CheckboxGroupOption[];
214
+ /**
215
+ * Layout direction
216
+ * @default "stacked"
217
+ */
218
+ layout?: "inline" | "stacked" | "grid";
219
+ /**
220
+ * Group-level label
221
+ */
222
+ label?: React.ReactNode;
223
+ /**
224
+ * Group-level description
225
+ */
226
+ description?: React.ReactNode;
227
+ /**
228
+ * Show "select all" checkbox
229
+ * @default false
230
+ */
231
+ showSelectAll?: boolean;
232
+ /**
233
+ * Label for the select all checkbox
234
+ * @default "Select all"
235
+ */
236
+ selectAllLabel?: string;
237
+ /**
238
+ * Minimum number of selections required
239
+ */
240
+ minSelections?: number;
241
+ /**
242
+ * Maximum number of selections allowed
243
+ */
244
+ maxSelections?: number;
245
+ /**
246
+ * Custom render function for options
247
+ */
248
+ renderOption?: (option: CheckboxGroupOption) => React.ReactNode;
249
+ /**
250
+ * Grid columns (only applies when layout="grid")
251
+ * @default 2
252
+ */
253
+ gridColumns?: number;
254
+ /**
255
+ * Additional native input attributes
256
+ */
257
+ [key: string]: any;
258
+ }
259
+ /**
260
+ * CheckboxGroup - High-performance multiple selection component
261
+ *
262
+ * A lightweight, accessible checkbox group with error state support.
263
+ * Designed to work seamlessly with useForm and Field components.
264
+ *
265
+ * Features:
266
+ * - Full accessibility support (ARIA attributes, role="group")
267
+ * - Error state styling
268
+ * - Controlled input behavior
269
+ * - Multiple layout options (inline, stacked, grid)
270
+ * - Optional "select all" checkbox
271
+ * - Individual option disabled state
272
+ * - Minimum/maximum selection validation
273
+ * - Custom option rendering
274
+ * - Optional descriptions for each option
275
+ * - All native checkbox attributes supported
276
+ *
277
+ * @example
278
+ * ```tsx
279
+ * const form = useForm({ initialValues: { interests: [] } });
280
+ *
281
+ * <CheckboxGroup
282
+ * {...form.getFieldProps('interests')}
283
+ * label="Select your interests"
284
+ * options={[
285
+ * { value: 'sports', label: 'Sports', description: 'Football, Basketball, etc.' },
286
+ * { value: 'music', label: 'Music', description: 'All genres' },
287
+ * { value: 'reading', label: 'Reading', description: 'Books and articles' }
288
+ * ]}
289
+ * showSelectAll
290
+ * error={!!form.errors.interests}
291
+ * aria-describedby={form.errors.interests ? 'interests-error' : undefined}
292
+ * />
293
+ * ```
294
+ *
295
+ * @example
296
+ * ```tsx
297
+ * // Grid layout with min/max selections
298
+ * <CheckboxGroup
299
+ * name="features"
300
+ * value={features}
301
+ * onChange={handleFeaturesChange}
302
+ * layout="grid"
303
+ * gridColumns={3}
304
+ * minSelections={1}
305
+ * maxSelections={3}
306
+ * label="Select 1-3 features"
307
+ * options={[
308
+ * { value: 'ssl', label: 'SSL Certificate' },
309
+ * { value: 'cdn', label: 'CDN' },
310
+ * { value: 'backup', label: 'Daily Backups' },
311
+ * { value: 'support', label: '24/7 Support' }
312
+ * ]}
313
+ * />
314
+ * ```
315
+ *
316
+ * @see https://opensite.ai/developers/page-speed/forms/checkbox-group
317
+ */
318
+ declare function CheckboxGroup({ name, value, onChange, onBlur, disabled, required, error, className, layout, label, description, options, showSelectAll, selectAllLabel, minSelections, maxSelections, renderOption, gridColumns, ...props }: CheckboxGroupProps): React.JSX.Element;
319
+ declare namespace CheckboxGroup {
320
+ var displayName: string;
321
+ }
322
+
181
323
  /**
182
324
  * Radio option type
183
325
  */
@@ -430,4 +572,4 @@ declare namespace Select {
430
572
  var displayName: string;
431
573
  }
432
574
 
433
- export { Checkbox, type CheckboxProps, Radio, type RadioOption, type RadioProps, Select, type SelectOption, type SelectOptionGroup, type SelectProps, TextArea, type TextAreaProps, TextInput };
575
+ export { Checkbox, CheckboxGroup, type CheckboxGroupOption, type CheckboxGroupProps, type CheckboxProps, Radio, type RadioOption, type RadioProps, Select, type SelectOption, type SelectOptionGroup, type SelectProps, TextArea, type TextAreaProps, TextInput };
package/dist/inputs.d.ts CHANGED
@@ -178,6 +178,148 @@ declare namespace Checkbox {
178
178
  var displayName: string;
179
179
  }
180
180
 
181
+ /**
182
+ * CheckboxGroup option type
183
+ */
184
+ interface CheckboxGroupOption {
185
+ /**
186
+ * The value for this checkbox option
187
+ */
188
+ value: string;
189
+ /**
190
+ * Display label for the option
191
+ */
192
+ label: React.ReactNode;
193
+ /**
194
+ * Optional description text below the label
195
+ */
196
+ description?: React.ReactNode;
197
+ /**
198
+ * Whether this option is disabled
199
+ */
200
+ disabled?: boolean;
201
+ }
202
+ /**
203
+ * Additional props specific to CheckboxGroup
204
+ */
205
+ interface CheckboxGroupProps extends Omit<InputProps<string[]>, "onChange" | "placeholder"> {
206
+ /**
207
+ * Change handler - receives array of selected values
208
+ */
209
+ onChange: (values: string[]) => void;
210
+ /**
211
+ * Array of checkbox options
212
+ */
213
+ options: CheckboxGroupOption[];
214
+ /**
215
+ * Layout direction
216
+ * @default "stacked"
217
+ */
218
+ layout?: "inline" | "stacked" | "grid";
219
+ /**
220
+ * Group-level label
221
+ */
222
+ label?: React.ReactNode;
223
+ /**
224
+ * Group-level description
225
+ */
226
+ description?: React.ReactNode;
227
+ /**
228
+ * Show "select all" checkbox
229
+ * @default false
230
+ */
231
+ showSelectAll?: boolean;
232
+ /**
233
+ * Label for the select all checkbox
234
+ * @default "Select all"
235
+ */
236
+ selectAllLabel?: string;
237
+ /**
238
+ * Minimum number of selections required
239
+ */
240
+ minSelections?: number;
241
+ /**
242
+ * Maximum number of selections allowed
243
+ */
244
+ maxSelections?: number;
245
+ /**
246
+ * Custom render function for options
247
+ */
248
+ renderOption?: (option: CheckboxGroupOption) => React.ReactNode;
249
+ /**
250
+ * Grid columns (only applies when layout="grid")
251
+ * @default 2
252
+ */
253
+ gridColumns?: number;
254
+ /**
255
+ * Additional native input attributes
256
+ */
257
+ [key: string]: any;
258
+ }
259
+ /**
260
+ * CheckboxGroup - High-performance multiple selection component
261
+ *
262
+ * A lightweight, accessible checkbox group with error state support.
263
+ * Designed to work seamlessly with useForm and Field components.
264
+ *
265
+ * Features:
266
+ * - Full accessibility support (ARIA attributes, role="group")
267
+ * - Error state styling
268
+ * - Controlled input behavior
269
+ * - Multiple layout options (inline, stacked, grid)
270
+ * - Optional "select all" checkbox
271
+ * - Individual option disabled state
272
+ * - Minimum/maximum selection validation
273
+ * - Custom option rendering
274
+ * - Optional descriptions for each option
275
+ * - All native checkbox attributes supported
276
+ *
277
+ * @example
278
+ * ```tsx
279
+ * const form = useForm({ initialValues: { interests: [] } });
280
+ *
281
+ * <CheckboxGroup
282
+ * {...form.getFieldProps('interests')}
283
+ * label="Select your interests"
284
+ * options={[
285
+ * { value: 'sports', label: 'Sports', description: 'Football, Basketball, etc.' },
286
+ * { value: 'music', label: 'Music', description: 'All genres' },
287
+ * { value: 'reading', label: 'Reading', description: 'Books and articles' }
288
+ * ]}
289
+ * showSelectAll
290
+ * error={!!form.errors.interests}
291
+ * aria-describedby={form.errors.interests ? 'interests-error' : undefined}
292
+ * />
293
+ * ```
294
+ *
295
+ * @example
296
+ * ```tsx
297
+ * // Grid layout with min/max selections
298
+ * <CheckboxGroup
299
+ * name="features"
300
+ * value={features}
301
+ * onChange={handleFeaturesChange}
302
+ * layout="grid"
303
+ * gridColumns={3}
304
+ * minSelections={1}
305
+ * maxSelections={3}
306
+ * label="Select 1-3 features"
307
+ * options={[
308
+ * { value: 'ssl', label: 'SSL Certificate' },
309
+ * { value: 'cdn', label: 'CDN' },
310
+ * { value: 'backup', label: 'Daily Backups' },
311
+ * { value: 'support', label: '24/7 Support' }
312
+ * ]}
313
+ * />
314
+ * ```
315
+ *
316
+ * @see https://opensite.ai/developers/page-speed/forms/checkbox-group
317
+ */
318
+ declare function CheckboxGroup({ name, value, onChange, onBlur, disabled, required, error, className, layout, label, description, options, showSelectAll, selectAllLabel, minSelections, maxSelections, renderOption, gridColumns, ...props }: CheckboxGroupProps): React.JSX.Element;
319
+ declare namespace CheckboxGroup {
320
+ var displayName: string;
321
+ }
322
+
181
323
  /**
182
324
  * Radio option type
183
325
  */
@@ -430,4 +572,4 @@ declare namespace Select {
430
572
  var displayName: string;
431
573
  }
432
574
 
433
- export { Checkbox, type CheckboxProps, Radio, type RadioOption, type RadioProps, Select, type SelectOption, type SelectOptionGroup, type SelectProps, TextArea, type TextAreaProps, TextInput };
575
+ export { Checkbox, CheckboxGroup, type CheckboxGroupOption, type CheckboxGroupProps, type CheckboxProps, Radio, type RadioOption, type RadioProps, Select, type SelectOption, type SelectOptionGroup, type SelectProps, TextArea, type TextAreaProps, TextInput };