@page-speed/forms 0.1.5 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/inputs.cjs CHANGED
@@ -669,9 +669,261 @@ function Select({
669
669
  );
670
670
  }
671
671
  Select.displayName = "Select";
672
+ function FileInput({
673
+ name,
674
+ value = [],
675
+ onChange,
676
+ onBlur,
677
+ placeholder = "Choose file(s)...",
678
+ disabled = false,
679
+ required = false,
680
+ error = false,
681
+ className = "",
682
+ accept,
683
+ maxSize = 5 * 1024 * 1024,
684
+ // 5MB default
685
+ maxFiles = 1,
686
+ multiple = false,
687
+ showPreview = true,
688
+ onValidationError,
689
+ onFileRemove,
690
+ ...props
691
+ }) {
692
+ const inputRef = React6__namespace.useRef(null);
693
+ const [dragActive, setDragActive] = React6__namespace.useState(false);
694
+ const validateFile = React6__namespace.useCallback(
695
+ (file) => {
696
+ if (accept) {
697
+ const acceptedTypes = accept.split(",").map((t) => t.trim());
698
+ const isValidType = acceptedTypes.some((type) => {
699
+ if (type.startsWith(".")) {
700
+ return file.name.toLowerCase().endsWith(type.toLowerCase());
701
+ } else if (type.endsWith("/*")) {
702
+ const baseType = type.split("/")[0];
703
+ return file.type.startsWith(baseType + "/");
704
+ } else {
705
+ return file.type === type;
706
+ }
707
+ });
708
+ if (!isValidType) {
709
+ return {
710
+ file,
711
+ error: "type",
712
+ message: `File type "${file.type}" is not accepted. Accepted types: ${accept}`
713
+ };
714
+ }
715
+ }
716
+ if (file.size > maxSize) {
717
+ const maxSizeMB = (maxSize / (1024 * 1024)).toFixed(2);
718
+ const fileSizeMB = (file.size / (1024 * 1024)).toFixed(2);
719
+ return {
720
+ file,
721
+ error: "size",
722
+ message: `File size ${fileSizeMB}MB exceeds maximum ${maxSizeMB}MB`
723
+ };
724
+ }
725
+ return null;
726
+ },
727
+ [accept, maxSize]
728
+ );
729
+ const handleFiles = React6__namespace.useCallback(
730
+ (fileList) => {
731
+ if (!fileList || fileList.length === 0) return;
732
+ const newFiles = Array.from(fileList);
733
+ const validationErrors = [];
734
+ const validFiles = [];
735
+ for (const file of newFiles) {
736
+ const validationError = validateFile(file);
737
+ if (validationError) {
738
+ validationErrors.push(validationError);
739
+ } else {
740
+ validFiles.push(file);
741
+ }
742
+ }
743
+ const totalFiles = value.length + validFiles.length;
744
+ if (totalFiles > maxFiles) {
745
+ validationErrors.push({
746
+ file: validFiles[0],
747
+ // Use first file as reference
748
+ error: "count",
749
+ message: `Maximum ${maxFiles} file(s) allowed. Attempting to add ${validFiles.length} to existing ${value.length}.`
750
+ });
751
+ }
752
+ if (validationErrors.length > 0 && onValidationError) {
753
+ onValidationError(validationErrors);
754
+ }
755
+ if (validFiles.length > 0 && totalFiles <= maxFiles) {
756
+ const updatedFiles = multiple ? [...value, ...validFiles] : validFiles;
757
+ onChange(updatedFiles.slice(0, maxFiles));
758
+ }
759
+ if (inputRef.current) {
760
+ inputRef.current.value = "";
761
+ }
762
+ },
763
+ [value, onChange, validateFile, maxFiles, multiple, onValidationError]
764
+ );
765
+ const handleChange = (e) => {
766
+ handleFiles(e.target.files);
767
+ };
768
+ const handleRemove = (index) => {
769
+ const fileToRemove = value[index];
770
+ const updatedFiles = value.filter((_, i) => i !== index);
771
+ onChange(updatedFiles);
772
+ if (onFileRemove && fileToRemove) {
773
+ onFileRemove(fileToRemove, index);
774
+ }
775
+ };
776
+ const handleDrag = (e) => {
777
+ e.preventDefault();
778
+ e.stopPropagation();
779
+ if (e.type === "dragenter" || e.type === "dragover") {
780
+ setDragActive(true);
781
+ } else if (e.type === "dragleave") {
782
+ setDragActive(false);
783
+ }
784
+ };
785
+ const handleDrop = (e) => {
786
+ e.preventDefault();
787
+ e.stopPropagation();
788
+ setDragActive(false);
789
+ if (disabled) return;
790
+ handleFiles(e.dataTransfer.files);
791
+ };
792
+ const handleClick = () => {
793
+ inputRef.current?.click();
794
+ };
795
+ const handleKeyDown = (e) => {
796
+ if (e.key === "Enter" || e.key === " ") {
797
+ e.preventDefault();
798
+ handleClick();
799
+ }
800
+ };
801
+ const formatFileSize = (bytes) => {
802
+ if (bytes === 0) return "0 Bytes";
803
+ const k = 1024;
804
+ const sizes = ["Bytes", "KB", "MB", "GB"];
805
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
806
+ return Math.round(bytes / Math.pow(k, i) * 100) / 100 + " " + sizes[i];
807
+ };
808
+ const getPreviewUrl = (file) => {
809
+ if (file.type.startsWith("image/")) {
810
+ return URL.createObjectURL(file);
811
+ }
812
+ return null;
813
+ };
814
+ React6__namespace.useEffect(() => {
815
+ return () => {
816
+ value.forEach((file) => {
817
+ const previewUrl = getPreviewUrl(file);
818
+ if (previewUrl) {
819
+ URL.revokeObjectURL(previewUrl);
820
+ }
821
+ });
822
+ };
823
+ }, [value]);
824
+ const baseClassName = "file-input";
825
+ const errorClassName = error ? "file-input--error" : "";
826
+ const dragClassName = dragActive ? "file-input--drag-active" : "";
827
+ const disabledClassName = disabled ? "file-input--disabled" : "";
828
+ const combinedClassName = `${baseClassName} ${errorClassName} ${dragClassName} ${disabledClassName} ${className}`.trim();
829
+ return /* @__PURE__ */ React6__namespace.createElement("div", { className: combinedClassName }, /* @__PURE__ */ React6__namespace.createElement(
830
+ "input",
831
+ {
832
+ ref: inputRef,
833
+ type: "file",
834
+ name,
835
+ onChange: handleChange,
836
+ onBlur,
837
+ accept,
838
+ multiple,
839
+ disabled,
840
+ required: required && value.length === 0,
841
+ className: "file-input__native",
842
+ "aria-invalid": error || props["aria-invalid"],
843
+ "aria-describedby": props["aria-describedby"],
844
+ "aria-required": required || props["aria-required"],
845
+ style: { display: "none" }
846
+ }
847
+ ), /* @__PURE__ */ React6__namespace.createElement(
848
+ "div",
849
+ {
850
+ className: "file-input__dropzone",
851
+ onDragEnter: handleDrag,
852
+ onDragLeave: handleDrag,
853
+ onDragOver: handleDrag,
854
+ onDrop: handleDrop,
855
+ onClick: handleClick,
856
+ onKeyDown: handleKeyDown,
857
+ role: "button",
858
+ tabIndex: disabled ? -1 : 0,
859
+ "aria-label": placeholder,
860
+ "aria-disabled": disabled
861
+ },
862
+ /* @__PURE__ */ React6__namespace.createElement("div", { className: "file-input__dropzone-content" }, /* @__PURE__ */ React6__namespace.createElement(
863
+ "svg",
864
+ {
865
+ className: "file-input__icon",
866
+ width: "48",
867
+ height: "48",
868
+ viewBox: "0 0 24 24",
869
+ fill: "none",
870
+ stroke: "currentColor",
871
+ strokeWidth: "2",
872
+ strokeLinecap: "round",
873
+ strokeLinejoin: "round",
874
+ "aria-hidden": "true"
875
+ },
876
+ /* @__PURE__ */ React6__namespace.createElement("path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" }),
877
+ /* @__PURE__ */ React6__namespace.createElement("polyline", { points: "17 8 12 3 7 8" }),
878
+ /* @__PURE__ */ React6__namespace.createElement("line", { x1: "12", y1: "3", x2: "12", y2: "15" })
879
+ ), /* @__PURE__ */ React6__namespace.createElement("p", { className: "file-input__placeholder" }, value.length > 0 ? `${value.length} file(s) selected` : placeholder), accept && /* @__PURE__ */ React6__namespace.createElement("p", { className: "file-input__hint" }, "Accepted: ", accept), maxSize && /* @__PURE__ */ React6__namespace.createElement("p", { className: "file-input__hint" }, "Max size: ", formatFileSize(maxSize)))
880
+ ), value.length > 0 && /* @__PURE__ */ React6__namespace.createElement("ul", { className: "file-input__list", role: "list" }, value.map((file, index) => {
881
+ const previewUrl = showPreview ? getPreviewUrl(file) : null;
882
+ return /* @__PURE__ */ React6__namespace.createElement("li", { key: `${file.name}-${index}`, className: "file-input__item" }, previewUrl && /* @__PURE__ */ React6__namespace.createElement(
883
+ "img",
884
+ {
885
+ src: previewUrl,
886
+ alt: file.name,
887
+ className: "file-input__preview",
888
+ width: "48",
889
+ height: "48"
890
+ }
891
+ ), /* @__PURE__ */ React6__namespace.createElement("div", { className: "file-input__details" }, /* @__PURE__ */ React6__namespace.createElement("span", { className: "file-input__filename" }, file.name), /* @__PURE__ */ React6__namespace.createElement("span", { className: "file-input__filesize" }, formatFileSize(file.size))), /* @__PURE__ */ React6__namespace.createElement(
892
+ "button",
893
+ {
894
+ type: "button",
895
+ onClick: (e) => {
896
+ e.stopPropagation();
897
+ handleRemove(index);
898
+ },
899
+ disabled,
900
+ className: "file-input__remove",
901
+ "aria-label": `Remove ${file.name}`
902
+ },
903
+ /* @__PURE__ */ React6__namespace.createElement(
904
+ "svg",
905
+ {
906
+ width: "20",
907
+ height: "20",
908
+ viewBox: "0 0 24 24",
909
+ fill: "none",
910
+ stroke: "currentColor",
911
+ strokeWidth: "2",
912
+ strokeLinecap: "round",
913
+ strokeLinejoin: "round",
914
+ "aria-hidden": "true"
915
+ },
916
+ /* @__PURE__ */ React6__namespace.createElement("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
917
+ /* @__PURE__ */ React6__namespace.createElement("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
918
+ )
919
+ ));
920
+ })));
921
+ }
922
+ FileInput.displayName = "FileInput";
672
923
 
673
924
  exports.Checkbox = Checkbox;
674
925
  exports.CheckboxGroup = CheckboxGroup;
926
+ exports.FileInput = FileInput;
675
927
  exports.Radio = Radio;
676
928
  exports.Select = Select;
677
929
  exports.TextArea = TextArea;
@@ -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"],"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"]}
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"],"names":["React","React2","React3","React4","React5","React6","React7"],"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","\"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 * 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 * 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\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 */\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 onValidationError,\n onFileRemove,\n ...props\n}: FileInputProps) {\n const inputRef = React.useRef<HTMLInputElement>(null);\n const [dragActive, setDragActive] = React.useState(false);\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 // Update files if valid\n if (validFiles.length > 0 && totalFiles <= maxFiles) {\n const updatedFiles = multiple ? [...value, ...validFiles] : validFiles;\n onChange(updatedFiles.slice(0, maxFiles));\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, onValidationError]\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 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\n React.useEffect(() => {\n return () => {\n value.forEach((file) => {\n const previewUrl = getPreviewUrl(file);\n if (previewUrl) {\n URL.revokeObjectURL(previewUrl);\n }\n });\n };\n }, [value]);\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 </div>\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 </div>\n );\n}\n\nFileInput.displayName = \"FileInput\";\n"]}