@page-speed/forms 0.5.0 → 0.5.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.
- package/README.md +30 -2
- package/dist/core.cjs +189 -97
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.cts +3 -3
- package/dist/core.d.ts +3 -3
- package/dist/core.js +175 -83
- package/dist/core.js.map +1 -1
- package/dist/index.cjs +189 -97
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -2
- package/dist/index.d.ts +7 -2
- package/dist/index.js +175 -83
- package/dist/index.js.map +1 -1
- package/dist/inputs.cjs +2720 -1371
- package/dist/inputs.cjs.map +1 -1
- package/dist/inputs.d.cts +10 -259
- package/dist/inputs.d.ts +10 -259
- package/dist/inputs.js +2721 -1371
- package/dist/inputs.js.map +1 -1
- package/dist/integration.cjs +5168 -9
- package/dist/integration.cjs.map +1 -1
- package/dist/integration.d.cts +298 -1
- package/dist/integration.d.ts +298 -1
- package/dist/integration.js +5160 -9
- package/dist/integration.js.map +1 -1
- package/dist/{types-DuX3q6A4.d.cts → types-CnOCn7b3.d.cts} +51 -1
- package/dist/{types-DuX3q6A4.d.ts → types-CnOCn7b3.d.ts} +51 -1
- package/dist/validation-rules.d.cts +1 -1
- package/dist/validation-rules.d.ts +1 -1
- package/dist/validation-utils.d.cts +1 -1
- package/dist/validation-utils.d.ts +1 -1
- package/dist/validation-valibot.d.cts +1 -1
- package/dist/validation-valibot.d.ts +1 -1
- package/dist/validation.d.cts +1 -1
- package/dist/validation.d.ts +1 -1
- package/package.json +1 -1
package/dist/integration.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/integration/ContactFormSerializer.ts","../src/integration/BlockAdapter.tsx"],"names":["camelField","errorMessage","React","Component"],"mappings":"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","file":"integration.cjs","sourcesContent":["/**\n * @page-speed/forms - Rails API Serializer\n *\n * Serializes form data for the DashTrack ContactsController API.\n * Handles field name conversion (camelCase → snake_case), custom fields separation,\n * and upload token arrays.\n *\n * @see https://github.com/opensite-ai/page-speed-forms\n */\n\n/**\n * Standard fields recognized by the Rails ContactsController API.\n * These are serialized to snake_case and sent in the contact object.\n */\nconst STANDARD_FIELDS = [\n \"content\",\n \"email\",\n \"firstName\",\n \"lastName\",\n \"locationId\",\n \"phone\",\n \"subject\",\n \"redemptionStatus\",\n \"birthday\",\n \"city\",\n \"state\",\n \"websiteFormAssignmentId\",\n \"websiteId\",\n \"acceptsSmsMarketing\",\n \"acceptsEmailMarketing\",\n \"visitorIpAddress\",\n] as const;\n\n/**\n * Configuration parameters for Rails API submission.\n */\nexport interface RailsApiConfig {\n /**\n * API key for authentication.\n * Sent as top-level parameter: api_key\n */\n apiKey: string;\n\n /**\n * Contact category token for categorization.\n * Sent as top-level parameter: contact_category_token\n */\n contactCategoryToken?: string;\n\n /**\n * Location ID for multi-location organizations.\n * Sent as top-level parameter: location_id\n */\n locationId?: string;\n\n /**\n * Website ID for tracking form submissions.\n * Sent within contact object: website_id\n */\n websiteId?: string;\n\n /**\n * Website form assignment ID for form tracking.\n * Sent within contact object: website_form_assignment_id\n */\n websiteFormAssignmentId?: string;\n\n /**\n * Visitor IP address. If not provided, will be auto-detected on server.\n * Sent within contact object: visitor_ip_address\n */\n visitorIpAddress?: string;\n}\n\n/**\n * Serialized form data ready for Rails API submission.\n */\nexport interface SerializedFormData {\n /**\n * Top-level API key parameter.\n */\n api_key: string;\n\n /**\n * Top-level contact category token (optional).\n */\n contact_category_token?: string;\n\n /**\n * Top-level location ID (optional).\n */\n location_id?: string;\n\n /**\n * Contact object with standard fields and metadata.\n */\n contact: {\n /**\n * Standard contact fields in snake_case.\n */\n [key: string]: unknown;\n\n /**\n * Custom fields that don't match standard schema.\n * Stored as separate hash in Rails.\n */\n custom_fields?: Record<string, unknown>;\n\n /**\n * Array of upload tokens from file uploads.\n * These reference ContactFormUpload records in Rails.\n */\n contact_form_upload_tokens?: string[];\n };\n}\n\n/**\n * Form values from the form library (camelCase keys).\n */\nexport type FormValues = Record<string, unknown>;\n\n/**\n * Convert camelCase to snake_case.\n *\n * @example\n * ```ts\n * camelToSnake(\"firstName\") // \"first_name\"\n * camelToSnake(\"acceptsSmsMarketing\") // \"accepts_sms_marketing\"\n * ```\n */\nfunction camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\n/**\n * Check if a field name is a standard Rails contact field.\n */\nfunction isStandardField(fieldName: string): boolean {\n return STANDARD_FIELDS.includes(\n fieldName as (typeof STANDARD_FIELDS)[number],\n );\n}\n\n/**\n * Extract upload tokens from form values.\n * Handles both string tokens and arrays of tokens.\n */\nfunction extractUploadTokens(values: FormValues): string[] {\n const tokens: string[] = [];\n\n for (const value of Object.values(values)) {\n if (typeof value === \"string\" && value.startsWith(\"upload_\")) {\n tokens.push(value);\n } else if (Array.isArray(value)) {\n for (const item of value) {\n if (typeof item === \"string\" && item.startsWith(\"upload_\")) {\n tokens.push(item);\n }\n }\n }\n }\n\n return tokens;\n}\n\n/**\n * Format date/time values for Rails API.\n * Rails expects ISO 8601 format.\n */\nfunction formatDateForRails(value: unknown): string | undefined {\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (typeof value === \"string\") {\n // Attempt to parse and reformat to ensure valid ISO 8601\n const date = new Date(value);\n if (!isNaN(date.getTime())) {\n return date.toISOString();\n }\n }\n return undefined;\n}\n\n/**\n * Serialize form values for Rails ContactsController API.\n *\n * This function:\n * 1. Converts camelCase field names to snake_case\n * 2. Separates standard fields from custom fields\n * 3. Extracts upload tokens into contact_form_upload_tokens array\n * 4. Formats dates to ISO 8601\n * 5. Includes API configuration parameters\n *\n * @param values - Form values from useForm hook (camelCase keys)\n * @param config - Rails API configuration (apiKey, locationId, etc.)\n * @returns Serialized data ready for POST to /contacts\n *\n * @example\n * ```ts\n * const serialized = serializeForRails(\n * {\n * firstName: \"John\",\n * lastName: \"Doe\",\n * email: \"john@example.com\",\n * phone: \"555-1234\",\n * companySize: \"50-100\", // Custom field\n * resumeToken: \"upload_abc123\",\n * },\n * {\n * apiKey: \"key_123\",\n * contactCategoryToken: \"cat_xyz\",\n * locationId: \"loc_456\",\n * }\n * );\n *\n * // Result:\n * // {\n * // api_key: \"key_123\",\n * // contact_category_token: \"cat_xyz\",\n * // location_id: \"loc_456\",\n * // contact: {\n * // first_name: \"John\",\n * // last_name: \"Doe\",\n * // email: \"john@example.com\",\n * // phone: \"555-1234\",\n * // custom_fields: {\n * // company_size: \"50-100\"\n * // },\n * // contact_form_upload_tokens: [\"upload_abc123\"]\n * // }\n * // }\n * ```\n */\nexport function serializeForRails(\n values: FormValues,\n config: RailsApiConfig,\n): SerializedFormData {\n const standardFields: Record<string, unknown> = {};\n const customFields: Record<string, unknown> = {};\n\n // Extract upload tokens\n const uploadTokens = extractUploadTokens(values);\n\n // Separate standard and custom fields\n for (const [key, value] of Object.entries(values)) {\n // Skip upload token fields - they're handled separately\n if (typeof value === \"string\" && value.startsWith(\"upload_\")) {\n continue;\n }\n if (\n Array.isArray(value) &&\n value.every(\n (item) => typeof item === \"string\" && item.startsWith(\"upload_\"),\n )\n ) {\n continue;\n }\n\n const snakeKey = camelToSnake(key);\n\n if (isStandardField(key)) {\n // Format dates for birthday field\n if (key === \"birthday\") {\n const formatted = formatDateForRails(value);\n if (formatted) {\n standardFields[snakeKey] = formatted;\n }\n } else {\n // Handle array values for standard fields\n // Standard fields expect scalar values (strings), but some field types\n // like checkbox-group produce arrays. Convert arrays to comma-separated strings.\n if (Array.isArray(value)) {\n standardFields[snakeKey] = value.join(\", \");\n } else {\n standardFields[snakeKey] = value;\n }\n }\n } else {\n // Custom fields\n customFields[snakeKey] = value;\n }\n }\n\n // Add config fields to standard fields if provided\n if (config.websiteId !== undefined) {\n standardFields.website_id = config.websiteId;\n }\n if (config.websiteFormAssignmentId !== undefined) {\n standardFields.website_form_assignment_id = config.websiteFormAssignmentId;\n }\n if (config.visitorIpAddress !== undefined) {\n standardFields.visitor_ip_address = config.visitorIpAddress;\n }\n\n // Build contact object\n const contact: SerializedFormData[\"contact\"] = {\n ...standardFields,\n };\n\n // Add custom fields if any\n if (Object.keys(customFields).length > 0) {\n contact.custom_fields = customFields;\n }\n\n // Add upload tokens if any\n if (uploadTokens.length > 0) {\n contact.contact_form_upload_tokens = uploadTokens;\n }\n\n // Build final serialized data\n const serialized: SerializedFormData = {\n api_key: config.apiKey,\n contact,\n };\n\n // Add optional top-level parameters\n if (config.contactCategoryToken !== undefined) {\n serialized.contact_category_token = config.contactCategoryToken;\n }\n if (config.locationId !== undefined) {\n serialized.location_id = config.locationId;\n }\n\n return serialized;\n}\n\n/**\n * Rails API error response format.\n */\nexport interface RailsErrorResponse {\n errors: {\n [field: string]: string[];\n };\n status: number;\n}\n\n/**\n * Form error format used by @page-speed/forms.\n */\nexport type FormErrors = Record<string, string | undefined>;\n\n/**\n * Convert snake_case to camelCase.\n *\n * @example\n * ```ts\n * snakeToCamel(\"first_name\") // \"firstName\"\n * snakeToCamel(\"accepts_sms_marketing\") // \"acceptsSmsMarketing\"\n * ```\n */\nfunction snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\n/**\n * Deserialize Rails API errors to form error format.\n *\n * Converts Rails error format to the format expected by @page-speed/forms:\n * - Maps snake_case field names to camelCase\n * - Flattens error arrays to single error string (first error)\n * - Handles custom_fields errors by mapping back to original field names\n * - Extracts base errors to form-level errors\n *\n * @param railsErrors - Error response from Rails API\n * @returns Form errors object (camelCase keys)\n *\n * @example\n * ```ts\n * const formErrors = deserializeErrors({\n * errors: {\n * first_name: [\"can't be blank\", \"is too short\"],\n * email: [\"is invalid\"],\n * custom_fields: {\n * company_size: [\"is required\"]\n * },\n * base: [\"Something went wrong\"]\n * },\n * status: 422\n * });\n *\n * // Result:\n * // {\n * // firstName: \"can't be blank\",\n * // email: \"is invalid\",\n * // companySize: \"is required\",\n * // _form: \"Something went wrong\"\n * // }\n * ```\n */\nexport function deserializeErrors(railsErrors: RailsErrorResponse): FormErrors {\n const formErrors: FormErrors = {};\n\n for (const [field, messages] of Object.entries(railsErrors.errors)) {\n // Handle base errors (form-level errors)\n if (field === \"base\") {\n formErrors._form = Array.isArray(messages) ? messages[0] : messages;\n continue;\n }\n\n // Handle custom_fields errors\n if (field === \"custom_fields\" && typeof messages === \"object\") {\n for (const [customField, customMessages] of Object.entries(messages)) {\n const camelField = snakeToCamel(customField);\n const errorMessage = Array.isArray(customMessages)\n ? customMessages[0]\n : customMessages;\n formErrors[camelField] = errorMessage;\n }\n continue;\n }\n\n // Handle standard field errors\n const camelField = snakeToCamel(field);\n const errorMessage = Array.isArray(messages) ? messages[0] : messages;\n formErrors[camelField] = errorMessage;\n }\n\n return formErrors;\n}\n","/**\n * @page-speed/forms - Block Adapter\n *\n * Adapts form components for use in block-based rendering systems.\n * Wraps form components to accept block prop structure and transforms them\n * to component-native props.\n *\n * @see https://github.com/opensite-ai/page-speed-forms\n */\n\n\"use client\";\n\nimport * as React from \"react\";\n\n/**\n * Block structure for design payloads.\n * Minimal type definition for adapter compatibility.\n */\nexport interface Block {\n _id: string;\n _type: string;\n _name?: string;\n _parent?: string | null;\n tag?: string;\n styles?: string;\n content?: string;\n blockProps?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n/**\n * Options for Block adapter.\n */\nexport interface BlockAdapterOptions {\n /**\n * Default props to merge with block props.\n */\n defaultProps?: Record<string, unknown>;\n\n /**\n * Transform function to convert Block props to component props.\n * Useful for custom prop mapping logic.\n */\n transformProps?: (\n blockProps: Record<string, unknown>,\n block: Block,\n ) => Record<string, unknown>;\n\n /**\n * Extract display name from block for debugging.\n * Defaults to using _name or _type from block.\n */\n getDisplayName?: (block: Block) => string;\n\n /**\n * Enable React error boundary wrapping.\n * Defaults to true.\n */\n withErrorBoundary?: boolean;\n\n /**\n * Custom error fallback component.\n * If not provided, renders basic error message.\n */\n errorFallback?: (error: Error, block: Block) => React.ReactNode;\n}\n\n/**\n * Props passed to adapted component.\n */\nexport interface AdaptedComponentProps {\n /**\n * Block data from design payload.\n */\n block: Block;\n\n /**\n * Child blocks for rendering nested content.\n * Used by container components like Form.\n */\n children?: React.ReactNode;\n\n /**\n * Callback to render child blocks.\n * Provided by block rendering systems.\n */\n renderChildren?: (blockId: string) => React.ReactNode;\n}\n\n/**\n * Error boundary component for catching render errors.\n */\nclass BlockErrorBoundary extends React.Component<\n {\n block: Block;\n fallback?: (error: Error, block: Block) => React.ReactNode;\n children: React.ReactNode;\n },\n { error: Error | null }\n> {\n constructor(props: BlockErrorBoundary[\"props\"]) {\n super(props);\n this.state = { error: null };\n }\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.error(\n `Block render error (${this.props.block._id}):`,\n error,\n errorInfo,\n );\n }\n\n render() {\n if (this.state.error) {\n if (this.props.fallback) {\n return this.props.fallback(this.state.error, this.props.block);\n }\n\n return (\n <div\n className=\"block-error border border-destructive bg-destructive p-4 rounded text-destructive-foreground\"\n data-block-id={this.props.block._id}\n data-block-type={this.props.block._type}\n >\n <p className=\"font-semibold\">Block Render Error</p>\n <p className=\"text-sm\">\n Block: {this.props.block._name || this.props.block._id} (\n {this.props.block._type})\n </p>\n <p className=\"text-sm mt-1\">{this.state.error.message}</p>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n\n/**\n * Create a Block-compatible wrapper for a form component.\n *\n * This adapter transforms Block props (from design payload) into\n * component-native props. It handles:\n * - Extracting props from `blockProps` field\n * - Merging with default props\n * - Custom prop transformation\n * - Error boundary wrapping\n * - Children rendering support\n *\n * @param Component - React component to adapt\n * @param options - Adapter configuration options\n * @returns Block-compatible component\n *\n * @example\n * ```tsx\n * import { TextInput } from \"@page-speed/forms/inputs\";\n * import { createBlockAdapter } from \"@page-speed/forms/integration\";\n *\n * // Create Block-compatible TextInput\n * const BlockTextInput = createBlockAdapter(TextInput, {\n * defaultProps: {\n * placeholder: \"Enter text...\",\n * },\n * transformProps: (blockProps, block) => ({\n * ...blockProps,\n * // Map Block content to component props\n * label: block.content || blockProps.label,\n * // Apply Block styles as className\n * className: block.styles,\n * }),\n * });\n *\n * // Register with rendering system\n * registerBlockType(\"TextInput\", BlockTextInput);\n * ```\n *\n * @example\n * ```tsx\n * // Block from design payload:\n * {\n * _id: \"field-email\",\n * _type: \"TextInput\",\n * _name: \"Email Field\",\n * content: \"Email Address\",\n * styles: \"w-full mb-4\",\n * blockProps: {\n * name: \"email\",\n * type: \"email\",\n * placeholder: \"you@example.com\",\n * required: true,\n * }\n * }\n *\n * // Transformed to TextInput props:\n * <TextInput\n * name=\"email\"\n * type=\"email\"\n * placeholder=\"you@example.com\"\n * required={true}\n * label=\"Email Address\"\n * className=\"w-full mb-4\"\n * />\n * ```\n */\nexport function createBlockAdapter<TProps extends Record<string, unknown>>(\n Component: React.ComponentType<TProps>,\n options: BlockAdapterOptions = {},\n): React.ComponentType<AdaptedComponentProps> {\n const {\n defaultProps = {},\n transformProps,\n withErrorBoundary = true,\n errorFallback,\n } = options;\n\n const AdaptedComponent: React.FC<AdaptedComponentProps> = ({\n block,\n children,\n renderChildren,\n }) => {\n // Extract component props from blockProps\n const blockProps = (block.blockProps || {}) as Record<string, unknown>;\n\n // Merge with default props\n const mergedProps = { ...defaultProps, ...blockProps };\n\n // Apply custom transformation if provided\n const finalProps = transformProps\n ? transformProps(mergedProps, block)\n : mergedProps;\n\n // Add data attributes for debugging\n const dataAttrs = {\n \"data-block-id\": block._id,\n \"data-block-type\": block._type,\n ...(block._name && { \"data-block-name\": block._name }),\n };\n\n // Merge data attributes with final props\n const componentProps = {\n ...finalProps,\n ...dataAttrs,\n } as unknown as TProps;\n\n // Render children if renderChildren callback provided\n const renderedChildren = renderChildren\n ? renderChildren(block._id)\n : children;\n\n const element = (\n <Component {...componentProps}>{renderedChildren}</Component>\n );\n\n // Wrap with error boundary if enabled\n if (withErrorBoundary) {\n return (\n <BlockErrorBoundary block={block} fallback={errorFallback}>\n {element}\n </BlockErrorBoundary>\n );\n }\n\n return element;\n };\n\n // Set display name for debugging\n const componentName = Component.displayName || Component.name || \"Component\";\n AdaptedComponent.displayName = `BlockAdapter(${componentName})`;\n\n return AdaptedComponent;\n}\n\n/**\n * Standard prop transformer for form input components.\n *\n * Applies common transformations:\n * - Maps Block `content` to `label`\n * - Maps Block `styles` to `className`\n * - Preserves all blockProps\n *\n * @param blockProps - Props from Block.blockProps\n * @param block - Full Block object\n * @returns Transformed props for component\n *\n * @example\n * ```tsx\n * const BlockTextInput = createBlockAdapter(TextInput, {\n * transformProps: standardInputTransformer,\n * });\n * ```\n */\nexport function standardInputTransformer(\n blockProps: Record<string, unknown>,\n block: Block,\n): Record<string, unknown> {\n return {\n ...blockProps,\n // Use content as label if not already provided\n ...(block.content && !blockProps.label && { label: block.content }),\n // Apply Block styles as className\n ...(block.styles && { className: block.styles }),\n };\n}\n\n/**\n * Create multiple Block adapters with shared options.\n *\n * Convenience function for adapting multiple components at once\n * with the same configuration.\n *\n * @param components - Record of component name to component\n * @param options - Shared adapter options\n * @returns Record of adapted components\n *\n * @example\n * ```tsx\n * import * as Inputs from \"@page-speed/forms/inputs\";\n * import { createBlockAdapters, standardInputTransformer } from \"@page-speed/forms/integration\";\n *\n * const BlockInputs = createBlockAdapters(\n * {\n * TextInput: Inputs.TextInput,\n * TextArea: Inputs.TextArea,\n * Select: Inputs.Select,\n * },\n * {\n * transformProps: standardInputTransformer,\n * withErrorBoundary: true,\n * }\n * );\n *\n * // BlockInputs.TextInput, BlockInputs.TextArea, BlockInputs.Select\n * // are now Block-compatible\n * ```\n */\nexport function createBlockAdapters<\n TComponents extends Record<string, React.ComponentType<any>>,\n>(\n components: TComponents,\n options: BlockAdapterOptions = {},\n): Record<keyof TComponents, React.ComponentType<AdaptedComponentProps>> {\n const adapted: Record<\n string,\n React.ComponentType<AdaptedComponentProps>\n > = {};\n\n for (const [name, component] of Object.entries(components)) {\n adapted[name] = createBlockAdapter(component, options);\n }\n\n return adapted as Record<\n keyof TComponents,\n React.ComponentType<AdaptedComponentProps>\n >;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/integration/ContactFormSerializer.ts","../src/integration/BlockAdapter.tsx","../src/integration/form-submit.ts","../src/integration/form-field-types.ts","../src/integration/use-file-upload.ts","../src/core/useForm.ts","../src/integration/use-contact-form.ts","../src/core/FormContext.tsx","../src/core/useField.ts","../src/lib/utils.ts","../src/components/ui/label.tsx","../src/components/ui/field.tsx","../src/core/field-feedback.tsx","../src/core/label-group.tsx","../src/core/Field.tsx","../src/components/ui/input.tsx","../src/inputs/TextInput.tsx","../src/components/ui/textarea.tsx","../src/inputs/TextArea.tsx","../src/components/ui/checkbox.tsx","../src/inputs/Checkbox.tsx","../src/inputs/CheckboxGroup.tsx","../src/components/ui/radio-group.tsx","../src/inputs/Radio.tsx","../src/components/ui/select.tsx","../src/inputs/Select.tsx","../src/components/ui/button.tsx","../src/components/ui/dialog.tsx","../src/components/ui/command.tsx","../src/components/ui/popover.tsx","../src/inputs/MultiSelect.tsx","../src/hooks/use-isomorphic-layout-effect.ts","../src/hooks/use-as-ref.ts","../src/hooks/use-lazy-ref.ts","../src/components/ui/file-upload.tsx","../src/inputs/FileInput.tsx","../src/components/ui/calendar.tsx","../src/inputs/DatePicker.tsx","../src/inputs/TimePicker.tsx","../src/inputs/DateRangePicker.tsx","../src/integration/DynamicFormField.tsx"],"names":["camelField","errorMessage","React","Component","response","data","useState","useCallback","useObservable","useRef","useMap","errors","touched","values","useSelector","initialValues","useMemo","React2","useContext","twMerge","clsx","React3","LabelPrimitive","React4","React6","Field","React7","React8","React9","React10","React11","React12","CheckboxPrimitive","Checkbox","React13","React14","React15","RadioGroupPrimitive","React16","SelectPrimitive","React17","Select","React18","cva","Slot","React19","DialogPrimitive","React20","React21","CommandPrimitive","PopoverPrimitive","React22","React23","React24","React25","React26","React27","useDirection","state","files","invalid","rejectedFiles","React28","getDefaultClassNames","React29","DayPicker","className","props","React30","React31","formatDate","React32","React33"],"mappings":"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","file":"integration.cjs","sourcesContent":["/**\n * @page-speed/forms - Rails API Serializer\n *\n * Serializes form data for the DashTrack ContactsController API.\n * Handles field name conversion (camelCase → snake_case), custom fields separation,\n * and upload token arrays.\n *\n * @see https://github.com/opensite-ai/page-speed-forms\n */\n\n/**\n * Standard fields recognized by the Rails ContactsController API.\n * These are serialized to snake_case and sent in the contact object.\n */\nconst STANDARD_FIELDS = [\n \"content\",\n \"email\",\n \"firstName\",\n \"lastName\",\n \"locationId\",\n \"phone\",\n \"subject\",\n \"redemptionStatus\",\n \"birthday\",\n \"city\",\n \"state\",\n \"websiteFormAssignmentId\",\n \"websiteId\",\n \"acceptsSmsMarketing\",\n \"acceptsEmailMarketing\",\n \"visitorIpAddress\",\n] as const;\n\n/**\n * Configuration parameters for Rails API submission.\n */\nexport interface RailsApiConfig {\n /**\n * API key for authentication.\n * Sent as top-level parameter: api_key\n */\n apiKey: string;\n\n /**\n * Contact category token for categorization.\n * Sent as top-level parameter: contact_category_token\n */\n contactCategoryToken?: string;\n\n /**\n * Location ID for multi-location organizations.\n * Sent as top-level parameter: location_id\n */\n locationId?: string;\n\n /**\n * Website ID for tracking form submissions.\n * Sent within contact object: website_id\n */\n websiteId?: string;\n\n /**\n * Website form assignment ID for form tracking.\n * Sent within contact object: website_form_assignment_id\n */\n websiteFormAssignmentId?: string;\n\n /**\n * Visitor IP address. If not provided, will be auto-detected on server.\n * Sent within contact object: visitor_ip_address\n */\n visitorIpAddress?: string;\n}\n\n/**\n * Serialized form data ready for Rails API submission.\n */\nexport interface SerializedFormData {\n /**\n * Top-level API key parameter.\n */\n api_key: string;\n\n /**\n * Top-level contact category token (optional).\n */\n contact_category_token?: string;\n\n /**\n * Top-level location ID (optional).\n */\n location_id?: string;\n\n /**\n * Contact object with standard fields and metadata.\n */\n contact: {\n /**\n * Standard contact fields in snake_case.\n */\n [key: string]: unknown;\n\n /**\n * Custom fields that don't match standard schema.\n * Stored as separate hash in Rails.\n */\n custom_fields?: Record<string, unknown>;\n\n /**\n * Array of upload tokens from file uploads.\n * These reference ContactFormUpload records in Rails.\n */\n contact_form_upload_tokens?: string[];\n };\n}\n\n/**\n * Form values from the form library (camelCase keys).\n */\nexport type FormValues = Record<string, unknown>;\n\n/**\n * Convert camelCase to snake_case.\n *\n * @example\n * ```ts\n * camelToSnake(\"firstName\") // \"first_name\"\n * camelToSnake(\"acceptsSmsMarketing\") // \"accepts_sms_marketing\"\n * ```\n */\nfunction camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\n/**\n * Check if a field name is a standard Rails contact field.\n */\nfunction isStandardField(fieldName: string): boolean {\n return STANDARD_FIELDS.includes(\n fieldName as (typeof STANDARD_FIELDS)[number],\n );\n}\n\n/**\n * Extract upload tokens from form values.\n * Handles both string tokens and arrays of tokens.\n */\nfunction extractUploadTokens(values: FormValues): string[] {\n const tokens: string[] = [];\n\n for (const value of Object.values(values)) {\n if (typeof value === \"string\" && value.startsWith(\"upload_\")) {\n tokens.push(value);\n } else if (Array.isArray(value)) {\n for (const item of value) {\n if (typeof item === \"string\" && item.startsWith(\"upload_\")) {\n tokens.push(item);\n }\n }\n }\n }\n\n return tokens;\n}\n\n/**\n * Format date/time values for Rails API.\n * Rails expects ISO 8601 format.\n */\nfunction formatDateForRails(value: unknown): string | undefined {\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (typeof value === \"string\") {\n // Attempt to parse and reformat to ensure valid ISO 8601\n const date = new Date(value);\n if (!isNaN(date.getTime())) {\n return date.toISOString();\n }\n }\n return undefined;\n}\n\n/**\n * Serialize form values for Rails ContactsController API.\n *\n * This function:\n * 1. Converts camelCase field names to snake_case\n * 2. Separates standard fields from custom fields\n * 3. Extracts upload tokens into contact_form_upload_tokens array\n * 4. Formats dates to ISO 8601\n * 5. Includes API configuration parameters\n *\n * @param values - Form values from useForm hook (camelCase keys)\n * @param config - Rails API configuration (apiKey, locationId, etc.)\n * @returns Serialized data ready for POST to /contacts\n *\n * @example\n * ```ts\n * const serialized = serializeForRails(\n * {\n * firstName: \"John\",\n * lastName: \"Doe\",\n * email: \"john@example.com\",\n * phone: \"555-1234\",\n * companySize: \"50-100\", // Custom field\n * resumeToken: \"upload_abc123\",\n * },\n * {\n * apiKey: \"key_123\",\n * contactCategoryToken: \"cat_xyz\",\n * locationId: \"loc_456\",\n * }\n * );\n *\n * // Result:\n * // {\n * // api_key: \"key_123\",\n * // contact_category_token: \"cat_xyz\",\n * // location_id: \"loc_456\",\n * // contact: {\n * // first_name: \"John\",\n * // last_name: \"Doe\",\n * // email: \"john@example.com\",\n * // phone: \"555-1234\",\n * // custom_fields: {\n * // company_size: \"50-100\"\n * // },\n * // contact_form_upload_tokens: [\"upload_abc123\"]\n * // }\n * // }\n * ```\n */\nexport function serializeForRails(\n values: FormValues,\n config: RailsApiConfig,\n): SerializedFormData {\n const standardFields: Record<string, unknown> = {};\n const customFields: Record<string, unknown> = {};\n\n // Extract upload tokens\n const uploadTokens = extractUploadTokens(values);\n\n // Separate standard and custom fields\n for (const [key, value] of Object.entries(values)) {\n // Skip upload token fields - they're handled separately\n if (typeof value === \"string\" && value.startsWith(\"upload_\")) {\n continue;\n }\n if (\n Array.isArray(value) &&\n value.every(\n (item) => typeof item === \"string\" && item.startsWith(\"upload_\"),\n )\n ) {\n continue;\n }\n\n const snakeKey = camelToSnake(key);\n\n if (isStandardField(key)) {\n // Format dates for birthday field\n if (key === \"birthday\") {\n const formatted = formatDateForRails(value);\n if (formatted) {\n standardFields[snakeKey] = formatted;\n }\n } else {\n // Handle array values for standard fields\n // Standard fields expect scalar values (strings), but some field types\n // like checkbox-group produce arrays. Convert arrays to comma-separated strings.\n if (Array.isArray(value)) {\n standardFields[snakeKey] = value.join(\", \");\n } else {\n standardFields[snakeKey] = value;\n }\n }\n } else {\n // Custom fields\n customFields[snakeKey] = value;\n }\n }\n\n // Add config fields to standard fields if provided\n if (config.websiteId !== undefined) {\n standardFields.website_id = config.websiteId;\n }\n if (config.websiteFormAssignmentId !== undefined) {\n standardFields.website_form_assignment_id = config.websiteFormAssignmentId;\n }\n if (config.visitorIpAddress !== undefined) {\n standardFields.visitor_ip_address = config.visitorIpAddress;\n }\n\n // Build contact object\n const contact: SerializedFormData[\"contact\"] = {\n ...standardFields,\n };\n\n // Add custom fields if any\n if (Object.keys(customFields).length > 0) {\n contact.custom_fields = customFields;\n }\n\n // Add upload tokens if any\n if (uploadTokens.length > 0) {\n contact.contact_form_upload_tokens = uploadTokens;\n }\n\n // Build final serialized data\n const serialized: SerializedFormData = {\n api_key: config.apiKey,\n contact,\n };\n\n // Add optional top-level parameters\n if (config.contactCategoryToken !== undefined) {\n serialized.contact_category_token = config.contactCategoryToken;\n }\n if (config.locationId !== undefined) {\n serialized.location_id = config.locationId;\n }\n\n return serialized;\n}\n\n/**\n * Rails API error response format.\n */\nexport interface RailsErrorResponse {\n errors: {\n [field: string]: string[];\n };\n status: number;\n}\n\n/**\n * Form error format used by @page-speed/forms.\n */\nexport type FormErrors = Record<string, string | undefined>;\n\n/**\n * Convert snake_case to camelCase.\n *\n * @example\n * ```ts\n * snakeToCamel(\"first_name\") // \"firstName\"\n * snakeToCamel(\"accepts_sms_marketing\") // \"acceptsSmsMarketing\"\n * ```\n */\nfunction snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\n/**\n * Deserialize Rails API errors to form error format.\n *\n * Converts Rails error format to the format expected by @page-speed/forms:\n * - Maps snake_case field names to camelCase\n * - Flattens error arrays to single error string (first error)\n * - Handles custom_fields errors by mapping back to original field names\n * - Extracts base errors to form-level errors\n *\n * @param railsErrors - Error response from Rails API\n * @returns Form errors object (camelCase keys)\n *\n * @example\n * ```ts\n * const formErrors = deserializeErrors({\n * errors: {\n * first_name: [\"can't be blank\", \"is too short\"],\n * email: [\"is invalid\"],\n * custom_fields: {\n * company_size: [\"is required\"]\n * },\n * base: [\"Something went wrong\"]\n * },\n * status: 422\n * });\n *\n * // Result:\n * // {\n * // firstName: \"can't be blank\",\n * // email: \"is invalid\",\n * // companySize: \"is required\",\n * // _form: \"Something went wrong\"\n * // }\n * ```\n */\nexport function deserializeErrors(railsErrors: RailsErrorResponse): FormErrors {\n const formErrors: FormErrors = {};\n\n for (const [field, messages] of Object.entries(railsErrors.errors)) {\n // Handle base errors (form-level errors)\n if (field === \"base\") {\n formErrors._form = Array.isArray(messages) ? messages[0] : messages;\n continue;\n }\n\n // Handle custom_fields errors\n if (field === \"custom_fields\" && typeof messages === \"object\") {\n for (const [customField, customMessages] of Object.entries(messages)) {\n const camelField = snakeToCamel(customField);\n const errorMessage = Array.isArray(customMessages)\n ? customMessages[0]\n : customMessages;\n formErrors[camelField] = errorMessage;\n }\n continue;\n }\n\n // Handle standard field errors\n const camelField = snakeToCamel(field);\n const errorMessage = Array.isArray(messages) ? messages[0] : messages;\n formErrors[camelField] = errorMessage;\n }\n\n return formErrors;\n}\n","/**\n * @page-speed/forms - Block Adapter\n *\n * Adapts form components for use in block-based rendering systems.\n * Wraps form components to accept block prop structure and transforms them\n * to component-native props.\n *\n * @see https://github.com/opensite-ai/page-speed-forms\n */\n\n\"use client\";\n\nimport * as React from \"react\";\n\n/**\n * Block structure for design payloads.\n * Minimal type definition for adapter compatibility.\n */\nexport interface Block {\n _id: string;\n _type: string;\n _name?: string;\n _parent?: string | null;\n tag?: string;\n styles?: string;\n content?: string;\n blockProps?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n/**\n * Options for Block adapter.\n */\nexport interface BlockAdapterOptions {\n /**\n * Default props to merge with block props.\n */\n defaultProps?: Record<string, unknown>;\n\n /**\n * Transform function to convert Block props to component props.\n * Useful for custom prop mapping logic.\n */\n transformProps?: (\n blockProps: Record<string, unknown>,\n block: Block,\n ) => Record<string, unknown>;\n\n /**\n * Extract display name from block for debugging.\n * Defaults to using _name or _type from block.\n */\n getDisplayName?: (block: Block) => string;\n\n /**\n * Enable React error boundary wrapping.\n * Defaults to true.\n */\n withErrorBoundary?: boolean;\n\n /**\n * Custom error fallback component.\n * If not provided, renders basic error message.\n */\n errorFallback?: (error: Error, block: Block) => React.ReactNode;\n}\n\n/**\n * Props passed to adapted component.\n */\nexport interface AdaptedComponentProps {\n /**\n * Block data from design payload.\n */\n block: Block;\n\n /**\n * Child blocks for rendering nested content.\n * Used by container components like Form.\n */\n children?: React.ReactNode;\n\n /**\n * Callback to render child blocks.\n * Provided by block rendering systems.\n */\n renderChildren?: (blockId: string) => React.ReactNode;\n}\n\n/**\n * Error boundary component for catching render errors.\n */\nclass BlockErrorBoundary extends React.Component<\n {\n block: Block;\n fallback?: (error: Error, block: Block) => React.ReactNode;\n children: React.ReactNode;\n },\n { error: Error | null }\n> {\n constructor(props: BlockErrorBoundary[\"props\"]) {\n super(props);\n this.state = { error: null };\n }\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.error(\n `Block render error (${this.props.block._id}):`,\n error,\n errorInfo,\n );\n }\n\n render() {\n if (this.state.error) {\n if (this.props.fallback) {\n return this.props.fallback(this.state.error, this.props.block);\n }\n\n return (\n <div\n className=\"block-error border border-destructive bg-destructive p-4 rounded text-destructive-foreground\"\n data-block-id={this.props.block._id}\n data-block-type={this.props.block._type}\n >\n <p className=\"font-semibold\">Block Render Error</p>\n <p className=\"text-sm\">\n Block: {this.props.block._name || this.props.block._id} (\n {this.props.block._type})\n </p>\n <p className=\"text-sm mt-1\">{this.state.error.message}</p>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n\n/**\n * Create a Block-compatible wrapper for a form component.\n *\n * This adapter transforms Block props (from design payload) into\n * component-native props. It handles:\n * - Extracting props from `blockProps` field\n * - Merging with default props\n * - Custom prop transformation\n * - Error boundary wrapping\n * - Children rendering support\n *\n * @param Component - React component to adapt\n * @param options - Adapter configuration options\n * @returns Block-compatible component\n *\n * @example\n * ```tsx\n * import { TextInput } from \"@page-speed/forms/inputs\";\n * import { createBlockAdapter } from \"@page-speed/forms/integration\";\n *\n * // Create Block-compatible TextInput\n * const BlockTextInput = createBlockAdapter(TextInput, {\n * defaultProps: {\n * placeholder: \"Enter text...\",\n * },\n * transformProps: (blockProps, block) => ({\n * ...blockProps,\n * // Map Block content to component props\n * label: block.content || blockProps.label,\n * // Apply Block styles as className\n * className: block.styles,\n * }),\n * });\n *\n * // Register with rendering system\n * registerBlockType(\"TextInput\", BlockTextInput);\n * ```\n *\n * @example\n * ```tsx\n * // Block from design payload:\n * {\n * _id: \"field-email\",\n * _type: \"TextInput\",\n * _name: \"Email Field\",\n * content: \"Email Address\",\n * styles: \"w-full mb-4\",\n * blockProps: {\n * name: \"email\",\n * type: \"email\",\n * placeholder: \"you@example.com\",\n * required: true,\n * }\n * }\n *\n * // Transformed to TextInput props:\n * <TextInput\n * name=\"email\"\n * type=\"email\"\n * placeholder=\"you@example.com\"\n * required={true}\n * label=\"Email Address\"\n * className=\"w-full mb-4\"\n * />\n * ```\n */\nexport function createBlockAdapter<TProps extends Record<string, unknown>>(\n Component: React.ComponentType<TProps>,\n options: BlockAdapterOptions = {},\n): React.ComponentType<AdaptedComponentProps> {\n const {\n defaultProps = {},\n transformProps,\n withErrorBoundary = true,\n errorFallback,\n } = options;\n\n const AdaptedComponent: React.FC<AdaptedComponentProps> = ({\n block,\n children,\n renderChildren,\n }) => {\n // Extract component props from blockProps\n const blockProps = (block.blockProps || {}) as Record<string, unknown>;\n\n // Merge with default props\n const mergedProps = { ...defaultProps, ...blockProps };\n\n // Apply custom transformation if provided\n const finalProps = transformProps\n ? transformProps(mergedProps, block)\n : mergedProps;\n\n // Add data attributes for debugging\n const dataAttrs = {\n \"data-block-id\": block._id,\n \"data-block-type\": block._type,\n ...(block._name && { \"data-block-name\": block._name }),\n };\n\n // Merge data attributes with final props\n const componentProps = {\n ...finalProps,\n ...dataAttrs,\n } as unknown as TProps;\n\n // Render children if renderChildren callback provided\n const renderedChildren = renderChildren\n ? renderChildren(block._id)\n : children;\n\n const element = (\n <Component {...componentProps}>{renderedChildren}</Component>\n );\n\n // Wrap with error boundary if enabled\n if (withErrorBoundary) {\n return (\n <BlockErrorBoundary block={block} fallback={errorFallback}>\n {element}\n </BlockErrorBoundary>\n );\n }\n\n return element;\n };\n\n // Set display name for debugging\n const componentName = Component.displayName || Component.name || \"Component\";\n AdaptedComponent.displayName = `BlockAdapter(${componentName})`;\n\n return AdaptedComponent;\n}\n\n/**\n * Standard prop transformer for form input components.\n *\n * Applies common transformations:\n * - Maps Block `content` to `label`\n * - Maps Block `styles` to `className`\n * - Preserves all blockProps\n *\n * @param blockProps - Props from Block.blockProps\n * @param block - Full Block object\n * @returns Transformed props for component\n *\n * @example\n * ```tsx\n * const BlockTextInput = createBlockAdapter(TextInput, {\n * transformProps: standardInputTransformer,\n * });\n * ```\n */\nexport function standardInputTransformer(\n blockProps: Record<string, unknown>,\n block: Block,\n): Record<string, unknown> {\n return {\n ...blockProps,\n // Use content as label if not already provided\n ...(block.content && !blockProps.label && { label: block.content }),\n // Apply Block styles as className\n ...(block.styles && { className: block.styles }),\n };\n}\n\n/**\n * Create multiple Block adapters with shared options.\n *\n * Convenience function for adapting multiple components at once\n * with the same configuration.\n *\n * @param components - Record of component name to component\n * @param options - Shared adapter options\n * @returns Record of adapted components\n *\n * @example\n * ```tsx\n * import * as Inputs from \"@page-speed/forms/inputs\";\n * import { createBlockAdapters, standardInputTransformer } from \"@page-speed/forms/integration\";\n *\n * const BlockInputs = createBlockAdapters(\n * {\n * TextInput: Inputs.TextInput,\n * TextArea: Inputs.TextArea,\n * Select: Inputs.Select,\n * },\n * {\n * transformProps: standardInputTransformer,\n * withErrorBoundary: true,\n * }\n * );\n *\n * // BlockInputs.TextInput, BlockInputs.TextArea, BlockInputs.Select\n * // are now Block-compatible\n * ```\n */\nexport function createBlockAdapters<\n TComponents extends Record<string, React.ComponentType<any>>,\n>(\n components: TComponents,\n options: BlockAdapterOptions = {},\n): Record<keyof TComponents, React.ComponentType<AdaptedComponentProps>> {\n const adapted: Record<\n string,\n React.ComponentType<AdaptedComponentProps>\n > = {};\n\n for (const [name, component] of Object.entries(components)) {\n adapted[name] = createBlockAdapter(component, options);\n }\n\n return adapted as Record<\n keyof TComponents,\n React.ComponentType<AdaptedComponentProps>\n >;\n}\n","import type { ReactNode } from \"react\";\nimport type {\n FormSubmissionBehavior,\n NewFormSubmissionActionConfig,\n} from \"../core/types\";\nimport {\n deserializeErrors,\n serializeForRails,\n type FormErrors,\n type RailsApiConfig,\n type RailsErrorResponse,\n} from \"./ContactFormSerializer\";\n\nexport type PageSpeedFormMethod = \"post\" | \"get\" | \"put\" | \"patch\";\nexport type PageSpeedFormSubmissionFormat = \"json\" | \"rails\";\n\nexport interface PageSpeedFormSubmissionResult {\n formData: Record<string, any>;\n responseData: unknown;\n}\n\nexport interface PageSpeedFormSubmissionConfig {\n /**\n * Post-submit behavior.\n * @default \"showConfirmation\"\n */\n behavior?: FormSubmissionBehavior;\n\n /**\n * Optional callback triggered on successful submission.\n */\n handleFormSubmission?: (\n result: PageSpeedFormSubmissionResult,\n ) => void | Promise<void>;\n\n /**\n * Redirect destination used when behavior is \"redirect\".\n */\n redirectUrl?: string;\n\n /**\n * Custom component rendered when behavior is \"renderCustomComponent\".\n */\n customComponent?: ReactNode;\n\n /**\n * Optional action to allow a fresh submission after success.\n */\n newFormSubmissionAction?: NewFormSubmissionActionConfig;\n}\n\nexport interface PageSpeedFormConfig {\n /**\n * API endpoint used for submission (also applied to form action).\n */\n endpoint?: string;\n /**\n * HTTP method for submission.\n * @default \"post\"\n */\n method?: PageSpeedFormMethod;\n /**\n * Submission format.\n * Defaults to \"rails\" when apiKey is present, otherwise \"json\".\n */\n format?: PageSpeedFormSubmissionFormat;\n /**\n * Additional headers for the submission request.\n */\n headers?: Record<string, string>;\n /**\n * Static values merged into the payload (e.g. subject, content).\n */\n values?: Record<string, unknown>;\n /**\n * Rails API key (required for rails format).\n */\n apiKey?: string;\n /**\n * Rails contact category token.\n */\n contactCategoryToken?: string;\n /**\n * Rails location ID.\n */\n locationId?: string;\n /**\n * Rails website ID.\n */\n websiteId?: string;\n /**\n * Rails website form assignment ID.\n */\n websiteFormAssignmentId?: string;\n /**\n * Rails visitor IP address override.\n */\n visitorIpAddress?: string;\n /**\n * Reset form values after a successful submission.\n * @default true\n */\n resetOnSuccess?: boolean;\n /**\n * Optional post-submission behavior configuration.\n */\n submissionConfig?: PageSpeedFormSubmissionConfig;\n}\n\nexport class PageSpeedFormSubmissionError extends Error {\n formErrors?: FormErrors;\n status?: number;\n\n constructor(\n message: string,\n options: { formErrors?: FormErrors; status?: number } = {},\n ) {\n super(message);\n this.name = \"PageSpeedFormSubmissionError\";\n this.formErrors = options.formErrors;\n this.status = options.status;\n }\n}\n\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\nexport function isValidEmail(value: string): boolean {\n return EMAIL_REGEX.test(value);\n}\n\nfunction buildUrlWithParams(\n endpoint: string,\n values: Record<string, any>,\n): string {\n const base =\n typeof window === \"undefined\" ? \"http://localhost\" : window.location.origin;\n const url = new URL(endpoint, base);\n\n Object.entries(values).forEach(([key, value]) => {\n if (value === undefined || value === null) return;\n\n if (Array.isArray(value)) {\n value.forEach((item) => {\n if (item !== undefined && item !== null) {\n url.searchParams.append(key, String(item));\n }\n });\n return;\n }\n\n url.searchParams.set(key, String(value));\n });\n\n return url.toString();\n}\n\nfunction normalizeMethod(method?: PageSpeedFormMethod): string {\n return (method || \"post\").toUpperCase();\n}\n\nfunction resolveFormat(\n config?: PageSpeedFormConfig,\n): PageSpeedFormSubmissionFormat {\n if (config?.format) return config.format;\n return config?.apiKey ? \"rails\" : \"json\";\n}\n\nfunction mergeValues(\n values: Record<string, any>,\n config?: PageSpeedFormConfig,\n): Record<string, any> {\n return {\n ...(config?.values ?? {}),\n ...values,\n };\n}\n\nexport async function submitPageSpeedForm(\n values: Record<string, any>,\n config?: PageSpeedFormConfig,\n): Promise<unknown> {\n if (!config?.endpoint) {\n return null;\n }\n\n const payload = mergeValues(values, config);\n const method = normalizeMethod(config.method);\n const format = resolveFormat(config);\n const headers: Record<string, string> = { ...(config.headers ?? {}) };\n\n if (format === \"rails\") {\n if (!config.apiKey) {\n throw new PageSpeedFormSubmissionError(\n \"Missing apiKey for Rails form submission.\",\n );\n }\n\n const railsConfig: RailsApiConfig = {\n apiKey: config.apiKey,\n contactCategoryToken: config.contactCategoryToken,\n locationId: config.locationId,\n websiteId: config.websiteId,\n websiteFormAssignmentId: config.websiteFormAssignmentId,\n visitorIpAddress: config.visitorIpAddress,\n };\n\n const serialized = serializeForRails(payload, railsConfig);\n\n if (serialized.contact.contact_form_upload_tokens) {\n serialized.contact.contact_form_upload_tokens = (\n serialized.contact.contact_form_upload_tokens as string[]\n ).map((token) => token.replace(/^upload_/, \"\"));\n }\n\n headers[\"Content-Type\"] ??= \"application/json\";\n\n const response = await fetch(config.endpoint, {\n method,\n headers,\n body: JSON.stringify(serialized),\n });\n\n const data = await response.json().catch(() => null);\n\n if (!response.ok || (data && data.errors)) {\n const errorResponse: RailsErrorResponse = {\n errors: data?.errors ?? { base: [\"Form submission failed\"] },\n status: data?.status ?? response.status,\n };\n const formErrors = deserializeErrors(errorResponse);\n throw new PageSpeedFormSubmissionError(\"Form submission failed.\", {\n formErrors,\n status: errorResponse.status,\n });\n }\n\n return data;\n }\n\n if (method === \"GET\") {\n const url = buildUrlWithParams(config.endpoint, payload);\n const response = await fetch(url, { method, headers });\n const data = await response.json().catch(() => null);\n\n if (!response.ok) {\n throw new PageSpeedFormSubmissionError(\n data?.message || \"Form submission failed.\",\n { status: response.status },\n );\n }\n\n return data;\n }\n\n headers[\"Content-Type\"] ??= \"application/json\";\n\n const response = await fetch(config.endpoint, {\n method,\n headers,\n body: JSON.stringify(payload),\n });\n\n const data = await response.json().catch(() => null);\n\n if (!response.ok) {\n throw new PageSpeedFormSubmissionError(\n data?.message || \"Form submission failed.\",\n { status: response.status },\n );\n }\n\n return data;\n}\n","/**\n * Dynamic form field schema types and helpers.\n *\n * These utilities are intentionally exposed from the integration layer so\n * block/rendering libraries can share one field schema contract.\n */\n\nexport type FormFieldType =\n | \"text\"\n | \"email\"\n | \"search\"\n | \"password\"\n | \"tel\"\n | \"textarea\"\n | \"select\"\n | \"radio\"\n | \"checkbox\"\n | \"checkbox-group\"\n | \"number\"\n | \"url\"\n | \"date\"\n | \"date-picker\"\n | \"date-range\"\n | \"time\"\n | \"file\"\n | \"multi-select\";\n\nexport interface SelectOption {\n value: string;\n label: string;\n disabled?: boolean;\n description?: string;\n}\n\nexport interface FormFieldConfig {\n /**\n * Unique field name (used as the key in form values)\n */\n name: string;\n /**\n * Field type\n */\n type: FormFieldType;\n /**\n * Display label for the field\n */\n label: string;\n /**\n * Placeholder text\n */\n placeholder?: string;\n /**\n * Whether the field is required\n * @default false\n */\n required?: boolean;\n /**\n * Column span in grid layout (1-12)\n * @default 12 (full width)\n */\n columnSpan?: number;\n /**\n * Options for select/radio/checkbox-group fields\n */\n options?: SelectOption[];\n /**\n * Number of rows for textarea\n * @default 4\n */\n rows?: number;\n /**\n * Custom validation function\n * Return undefined for valid, or an error message string for invalid\n */\n validator?: (\n value: any,\n allValues: Record<string, any>,\n ) => string | undefined;\n /**\n * Additional CSS classes for the field wrapper\n */\n className?: string;\n /**\n * Whether the field is disabled\n * @default false\n */\n disabled?: boolean;\n /**\n * Accepted file types for file inputs (MIME types or extensions)\n * @example \".pdf,.doc,.docx\"\n * @example \"image/*,application/pdf\"\n */\n accept?: string;\n /**\n * Maximum file size in bytes for file inputs\n * @default 5MB (5 * 1024 * 1024)\n */\n maxSize?: number;\n /**\n * Maximum number of files for file inputs\n * @default 1\n */\n maxFiles?: number;\n /**\n * Allow multiple file selection\n * @default false\n */\n multiple?: boolean;\n /**\n * Description/help text displayed with the field\n */\n description?: string;\n /**\n * Layout for radio/checkbox groups\n * @default \"stacked\"\n */\n layout?: \"grid\" | \"stacked\";\n}\n\n/**\n * Generate initial values object from form field configs.\n */\nexport function generateInitialValues(\n fields: FormFieldConfig[],\n): Record<string, any> {\n return fields.reduce(\n (acc, field) => {\n if (field.type === \"checkbox\") {\n acc[field.name] = false;\n } else if (\n field.type === \"checkbox-group\" ||\n field.type === \"multi-select\"\n ) {\n acc[field.name] = [];\n } else if (field.type === \"file\") {\n acc[field.name] = [];\n } else if (field.type === \"date-range\") {\n acc[field.name] = { start: null, end: null };\n } else {\n acc[field.name] = \"\";\n }\n return acc;\n },\n {} as Record<string, any>,\n );\n}\n\n/**\n * Generate validation schema from form field configs.\n */\nexport function generateValidationSchema(\n fields: FormFieldConfig[],\n): Record<\n string,\n (value: any, allValues: Record<string, any>) => string | undefined\n> {\n return fields.reduce(\n (acc, field) => {\n acc[field.name] = (value: any, allValues: Record<string, any>) => {\n if (field.required) {\n if (!value || (typeof value === \"string\" && !value.trim())) {\n return `${field.label} is required`;\n }\n }\n\n if (field.type === \"email\" && value) {\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\n return \"Please enter a valid email address\";\n }\n }\n\n if (field.type === \"url\" && value) {\n try {\n new URL(value);\n } catch {\n return \"Please enter a valid URL\";\n }\n }\n\n if (field.validator) {\n return field.validator(value, allValues);\n }\n\n return undefined;\n };\n return acc;\n },\n {} as Record<\n string,\n (value: any, allValues: Record<string, any>) => string | undefined\n >,\n );\n}\n\n/**\n * Static mapping of column span values to Tailwind classes.\n *\n * IMPORTANT: These must remain complete, literal class strings so Tailwind's\n * scanner can detect and generate them.\n */\nconst columnSpanClasses: Record<number, string> = {\n 1: \"col-span-12 md:col-span-1\",\n 2: \"col-span-12 md:col-span-2\",\n 3: \"col-span-12 md:col-span-3\",\n 4: \"col-span-12 md:col-span-4\",\n 5: \"col-span-12 md:col-span-5\",\n 6: \"col-span-12 md:col-span-6\",\n 7: \"col-span-12 md:col-span-7\",\n 8: \"col-span-12 md:col-span-8\",\n 9: \"col-span-12 md:col-span-9\",\n 10: \"col-span-12 md:col-span-10\",\n 11: \"col-span-12 md:col-span-11\",\n 12: \"col-span-12\",\n};\n\n/**\n * Get grid column span class for Tailwind.\n *\n * On small screens the field is always full-width, then from `md` and up the\n * configured span is applied.\n */\nexport function getColumnSpanClass(span?: number): string {\n if (!span || span === 12) return \"col-span-12\";\n const clamped = Math.max(1, Math.min(span, 12));\n return columnSpanClasses[clamped] || \"col-span-12\";\n}\n","\"use client\";\n\nimport { useCallback, useState } from \"react\";\n\nexport interface FileUploadProgress {\n [fileName: string]: number;\n}\n\nexport interface UseFileUploadReturn {\n uploadTokens: string[];\n uploadProgress: FileUploadProgress;\n isUploading: boolean;\n uploadFiles: (files: File[]) => Promise<void>;\n removeFile: (file: File, index: number) => void;\n resetUpload: () => void;\n}\n\ninterface ContactFormUploadResponse {\n contact_form_upload?: {\n token?: string;\n };\n}\n\nexport interface UseFileUploadOptions {\n onError?: (error: Error) => void;\n /**\n * Upload endpoint.\n *\n * Defaults to DashTrack contact form uploads endpoint.\n */\n endpoint?: string;\n}\n\nconst DEFAULT_UPLOAD_ENDPOINT =\n \"https://api.dashtrack.com/contacts/_/contact_form_uploads\";\n\n/**\n * Upload helper for two-phase contact form uploads.\n */\nexport function useFileUpload(\n options?: UseFileUploadOptions,\n): UseFileUploadReturn {\n const [uploadTokens, setUploadTokens] = useState<string[]>([]);\n const [uploadProgress, setUploadProgress] = useState<FileUploadProgress>({});\n const [isUploading, setIsUploading] = useState(false);\n\n const endpoint = options?.endpoint || DEFAULT_UPLOAD_ENDPOINT;\n\n const uploadFiles = useCallback(\n async (files: File[]) => {\n if (files.length === 0) return;\n\n setIsUploading(true);\n\n try {\n const tokens: string[] = [];\n\n for (const file of files) {\n const formData = new FormData();\n formData.append(\"contact_form_upload[file_upload]\", file);\n formData.append(\"contact_form_upload[title]\", file.name);\n formData.append(\"contact_form_upload[file_name]\", file.name);\n formData.append(\"contact_form_upload[file_size]\", String(file.size));\n\n const response = await fetch(endpoint, {\n method: \"POST\",\n body: formData,\n });\n\n if (!response.ok) {\n throw new Error(`Upload failed: ${response.statusText}`);\n }\n\n const data = (await response.json()) as ContactFormUploadResponse;\n if (data.contact_form_upload?.token) {\n tokens.push(`upload_${data.contact_form_upload.token}`);\n }\n\n setUploadProgress((prev) => ({\n ...prev,\n [file.name]: 100,\n }));\n }\n\n setUploadTokens(tokens);\n } catch (error) {\n options?.onError?.(error as Error);\n } finally {\n setIsUploading(false);\n }\n },\n [endpoint, options],\n );\n\n const removeFile = useCallback((file: File, index: number) => {\n setUploadTokens((prev) => prev.filter((_, i) => i !== index));\n setUploadProgress((prev) => {\n const next = { ...prev };\n delete next[file.name];\n return next;\n });\n }, []);\n\n const resetUpload = useCallback(() => {\n setUploadTokens([]);\n setUploadProgress({});\n }, []);\n\n return {\n uploadTokens,\n uploadProgress,\n isUploading,\n uploadFiles,\n removeFile,\n resetUpload,\n };\n}\n","\"use client\";\n\nimport { useCallback, useRef } from \"react\";\nimport { useObservable, useSelector } from \"@legendapp/state/react\";\n// Tree-shakable imports from @opensite/hooks following ECOSYSTEM_GUIDELINES\nimport { useMap } from \"@opensite/hooks/useMap\";\nimport type {\n FormValues,\n FormErrors,\n TouchedFields,\n UseFormOptions,\n UseFormReturn,\n SubmissionStatus,\n FieldInputProps,\n FieldMeta,\n FormHelpers,\n} from \"./types\";\n\n/**\n * useForm - High-performance form state management with field-level reactivity\n *\n * Built on @legendapp/state for optimal performance:\n * - Field-level reactivity: Only re-render the specific field that changed\n * - Observable-based state: ~1 re-render per change vs ~10 for traditional hooks\n * - Tree-shakable: Only bundle what you use\n *\n * @example\n * ```tsx\n * const form = useForm({\n * initialValues: { email: '', password: '' },\n * onSubmit: async (values) => {\n * await login(values);\n * },\n * validationSchema: {\n * email: (value) => !value ? 'Required' : undefined,\n * password: (value) => value.length < 8 ? 'Too short' : undefined,\n * },\n * });\n *\n * return (\n * <form onSubmit={form.handleSubmit}>\n * <input {...form.getFieldProps('email')} />\n * {form.errors.email && <span>{form.errors.email}</span>}\n * </form>\n * );\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/use-form\n */\nexport function useForm<T extends FormValues = FormValues>(\n options: UseFormOptions<T>\n): UseFormReturn<T> {\n const {\n initialValues,\n validationSchema,\n validateOn = \"onBlur\",\n revalidateOn = \"onChange\",\n onSubmit,\n onError,\n debug = false,\n } = options;\n\n // Create observable form state for field-level reactivity\n // Note: Type assertion needed for @legendapp/state beta compatibility\n // The beta version's TypeScript types don't properly expose nested Observable properties\n // This will be removed once stable v3.0.0 is released with proper type definitions\n const state$ = useObservable({\n values: initialValues,\n errors: {} as FormErrors<T>,\n touched: {} as TouchedFields<T>,\n isSubmitting: false,\n status: \"idle\" as SubmissionStatus,\n initialValues: { ...initialValues }, // Create a copy to prevent reference sharing\n hasValidated: {} as Record<string, boolean>,\n }) as any;\n\n // Track validation in progress to prevent race conditions\n const validationInProgress = useRef<Set<string>>(new Set());\n\n // Enhanced state management with @opensite/hooks\n // useMap: Manage complex nested field metadata immutably\n const [, fieldMetadataActions] = useMap<\n string,\n { lastValidated?: number; validationCount: number }\n >();\n\n /**\n * Validate a single field\n * Enhanced with @opensite/hooks useMap for metadata tracking\n */\n const validateField = useCallback(\n async <K extends keyof T>(field: K): Promise<string | undefined> => {\n const validators = validationSchema?.[field];\n if (!validators) return undefined;\n\n const fieldKey = String(field);\n validationInProgress.current.add(fieldKey);\n\n // Track validation metadata using useMap\n const currentMeta = fieldMetadataActions.get(fieldKey) || {\n validationCount: 0,\n };\n fieldMetadataActions.set(fieldKey, {\n lastValidated: Date.now(),\n validationCount: currentMeta.validationCount + 1,\n });\n\n try {\n const value = state$.values[field].get();\n const allValues = state$.values.get();\n\n const validatorArray = Array.isArray(validators)\n ? validators\n : [validators];\n\n for (const validator of validatorArray) {\n const error = await validator(value, allValues);\n if (error) {\n state$.errors[field].set(error);\n validationInProgress.current.delete(fieldKey);\n return error;\n }\n }\n\n // Clear error if validation passed\n state$.errors[field].set(undefined);\n validationInProgress.current.delete(fieldKey);\n return undefined;\n } catch (error) {\n validationInProgress.current.delete(fieldKey);\n const errorMessage =\n error instanceof Error ? error.message : \"Validation error\";\n state$.errors[field].set(errorMessage);\n return errorMessage;\n }\n },\n [validationSchema, state$, fieldMetadataActions]\n );\n\n /**\n * Validate entire form\n */\n const validateForm = useCallback(async (): Promise<FormErrors<T>> => {\n if (!validationSchema) return {};\n\n const fields = Object.keys(validationSchema) as Array<keyof T>;\n const errors: FormErrors<T> = {};\n\n await Promise.all(\n fields.map(async (field) => {\n const error = await validateField(field);\n if (error) {\n errors[field] = error;\n }\n })\n );\n\n state$.errors.set(errors);\n return errors;\n }, [validationSchema, validateField, state$]);\n\n /**\n * Set field value with optional validation\n */\n const setFieldValue = useCallback(\n <K extends keyof T>(field: K, value: T[K]) => {\n state$.values[field].set(value);\n\n // Revalidate if field has been validated before\n const shouldRevalidate =\n revalidateOn === \"onChange\" &&\n state$.hasValidated[String(field)].get();\n\n if (shouldRevalidate && validationSchema?.[field]) {\n validateField(field);\n }\n\n if (debug) {\n console.log(\"[useForm] setFieldValue:\", { field, value });\n }\n },\n [state$, revalidateOn, validationSchema, validateField, debug]\n );\n\n /**\n * Set field as touched with optional validation\n */\n const setFieldTouched = useCallback(\n <K extends keyof T>(field: K, touched: boolean) => {\n state$.touched[field].set(touched);\n\n // Validate on blur if configured\n if (touched && validateOn === \"onBlur\" && validationSchema?.[field]) {\n state$.hasValidated[String(field)].set(true);\n validateField(field);\n }\n\n if (debug) {\n console.log(\"[useForm] setFieldTouched:\", { field, touched });\n }\n },\n [state$, validateOn, validationSchema, validateField, debug]\n );\n\n /**\n * Reset form to initial values\n * Enhanced with @opensite/hooks useMap to clear field metadata\n */\n const resetForm = useCallback(() => {\n state$.values.set(state$.initialValues.get());\n state$.errors.set({});\n state$.touched.set({});\n state$.isSubmitting.set(false);\n state$.status.set(\"idle\");\n state$.hasValidated.set({});\n\n // Clear field metadata tracked by useMap\n fieldMetadataActions.clear();\n\n if (debug) {\n console.log(\"[useForm] Form reset\");\n }\n }, [state$, fieldMetadataActions, debug]);\n\n /**\n * Handle form submission\n */\n const handleSubmit = useCallback(\n async (e?: React.FormEvent) => {\n e?.preventDefault();\n\n if (debug) {\n console.log(\"[useForm] handleSubmit started\");\n }\n\n state$.isSubmitting.set(true);\n state$.status.set(\"submitting\");\n\n try {\n // Validate form\n const errors = await validateForm();\n const hasErrors = Object.keys(errors).length > 0;\n\n if (hasErrors) {\n state$.status.set(\"error\");\n onError?.(errors);\n\n if (debug) {\n console.log(\"[useForm] Validation errors:\", errors);\n }\n\n return;\n }\n\n // Create form helpers\n const helpers: FormHelpers<T> = {\n setValues: (values) => {\n if (typeof values === \"function\") {\n state$.values.set(values(state$.values.get()));\n } else {\n state$.values.set(values);\n }\n },\n setFieldValue,\n setErrors: (errors) => state$.errors.set(errors),\n setFieldError: (field, error) => state$.errors[field].set(error),\n setTouched: (touched) => state$.touched.set(touched),\n setFieldTouched,\n setSubmitting: (submitting) => state$.isSubmitting.set(submitting),\n resetForm,\n };\n\n // Call submission handler\n await onSubmit(state$.values.get(), helpers);\n\n state$.status.set(\"success\");\n\n if (debug) {\n console.log(\"[useForm] Submit successful\");\n }\n } catch (error) {\n state$.status.set(\"error\");\n\n if (debug) {\n console.error(\"[useForm] Submit error:\", error);\n }\n\n throw error;\n } finally {\n state$.isSubmitting.set(false);\n }\n },\n [\n state$,\n validateForm,\n onSubmit,\n onError,\n setFieldValue,\n setFieldTouched,\n resetForm,\n debug,\n ]\n );\n\n /**\n * Get field props for binding to inputs\n */\n const getFieldProps = useCallback(\n <K extends keyof T>(field: K): FieldInputProps<T[K]> => {\n return {\n name: String(field),\n value: state$.values[field].get(),\n onChange: (value: T[K]) => setFieldValue(field, value),\n onBlur: () => setFieldTouched(field, true),\n };\n },\n [state$, setFieldValue, setFieldTouched]\n );\n\n /**\n * Get field meta information\n * Enhanced with @opensite/hooks useMap for validation metadata\n * and usePrevious for change detection\n */\n const getFieldMeta = useCallback(\n <K extends keyof T>(field: K): FieldMeta => {\n const fieldKey = String(field);\n const metadata = fieldMetadataActions.get(fieldKey);\n\n return {\n error: state$.errors[field].get(),\n touched: state$.touched[field].get() ?? false,\n isDirty:\n state$.values[field].get() !== state$.initialValues[field].get(),\n isValidating: validationInProgress.current.has(fieldKey),\n // Additional metadata from @opensite/hooks\n validationCount: metadata?.validationCount,\n lastValidated: metadata?.lastValidated,\n };\n },\n [state$, fieldMetadataActions]\n );\n\n // Use selectors for reactive properties\n const values = useSelector(() => state$.values.get());\n const errors = useSelector(() => state$.errors.get());\n const touched = useSelector(() => state$.touched.get());\n const isSubmitting = useSelector(() => state$.isSubmitting.get());\n const status = useSelector(() => state$.status.get());\n\n // Use selectors for derived state to ensure reactivity\n const isValid = useSelector(() => Object.keys(state$.errors.get()).length === 0);\n const isDirty = useSelector(() => {\n const currentValues = state$.values.get();\n const initialValues = state$.initialValues.get();\n return Object.keys(currentValues).some(\n (key) => currentValues[key] !== initialValues[key]\n );\n });\n\n return {\n // State\n values,\n errors,\n touched,\n isSubmitting,\n isValid,\n isDirty,\n status,\n\n // Actions\n handleSubmit,\n setValues: (values) => {\n if (typeof values === \"function\") {\n state$.values.set(values(state$.values.get()));\n } else {\n state$.values.set(values);\n }\n },\n setFieldValue,\n setErrors: (errors) => state$.errors.set(errors),\n setFieldError: (field, error) => state$.errors[field].set(error),\n setTouched: (touched) => state$.touched.set(touched),\n setFieldTouched,\n validateForm,\n validateField,\n resetForm,\n getFieldProps,\n getFieldMeta,\n };\n}\n","\"use client\";\n\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useForm as usePageSpeedForm } from \"../core/useForm\";\nimport type { UseFormReturn } from \"../core/types\";\nimport type { FormFieldConfig } from \"./form-field-types\";\nimport {\n generateInitialValues,\n generateValidationSchema,\n} from \"./form-field-types\";\nimport {\n PageSpeedFormSubmissionError,\n submitPageSpeedForm,\n type PageSpeedFormConfig,\n} from \"./form-submit\";\n\nexport interface UseContactFormOptions {\n /**\n * Form field configurations.\n */\n formFields: FormFieldConfig[];\n /**\n * Form submission configuration.\n */\n formConfig?: PageSpeedFormConfig;\n /**\n * Optional custom submit handler.\n */\n onSubmit?: (values: Record<string, any>) => void | Promise<void>;\n /**\n * Optional success callback.\n */\n onSuccess?: (data: unknown) => void;\n /**\n * Optional error callback.\n */\n onError?: (error: Error) => void;\n /**\n * Reset form values after successful submission.\n * @default true\n */\n resetOnSuccess?: boolean;\n /**\n * File upload tokens merged into payload.\n */\n uploadTokens?: string[];\n /**\n * Optional app-level navigation handler for internal redirects.\n * Return `false` to force fallback browser navigation.\n */\n navigate?: (href: string) => boolean | void;\n}\n\nexport interface UseContactFormReturn {\n form: UseFormReturn<Record<string, any>>;\n isSubmitted: boolean;\n submissionError: string | null;\n formMethod: \"get\" | \"post\";\n resetSubmissionState: () => void;\n}\n\ninterface RedirectResolution {\n destination: string;\n internalHref?: string;\n}\n\nfunction resolveRedirect(redirectUrl: string): RedirectResolution {\n const trimmed = redirectUrl.trim();\n if (trimmed.startsWith(\"/\") && !trimmed.startsWith(\"//\")) {\n return { destination: trimmed, internalHref: trimmed };\n }\n\n if (typeof window === \"undefined\") {\n return { destination: trimmed };\n }\n\n try {\n const url = new URL(trimmed, window.location.href);\n if (url.origin === window.location.origin) {\n return {\n destination: url.toString(),\n internalHref: `${url.pathname}${url.search}${url.hash}`,\n };\n }\n\n return { destination: url.toString() };\n } catch {\n return { destination: trimmed };\n }\n}\n\n/**\n * Form orchestration helper for dynamic contact forms.\n */\nexport function useContactForm(\n options: UseContactFormOptions,\n): UseContactFormReturn {\n const {\n formFields,\n formConfig,\n onSubmit,\n onSuccess,\n onError,\n resetOnSuccess = true,\n uploadTokens = [],\n navigate,\n } = options;\n\n const [submissionError, setSubmissionError] = useState<string | null>(null);\n const submissionConfig = formConfig?.submissionConfig;\n const redirectUrl = submissionConfig?.redirectUrl;\n\n const resetSubmissionState = useCallback(() => {\n setSubmissionError(null);\n }, []);\n\n const performRedirect = useCallback(() => {\n if (!redirectUrl || typeof window === \"undefined\") {\n return;\n }\n\n const { destination, internalHref } = resolveRedirect(redirectUrl);\n\n const attemptInternalNavigation = () => {\n if (!internalHref) return false;\n\n if (navigate) {\n return navigate(internalHref) !== false;\n }\n\n const handler = (window as any).__opensiteNavigationHandler;\n if (typeof handler === \"function\") {\n try {\n return handler(internalHref, undefined) !== false;\n } catch {\n return false;\n }\n }\n\n return false;\n };\n\n window.setTimeout(() => {\n if (attemptInternalNavigation()) return;\n window.location.assign(destination);\n }, 150);\n }, [navigate, redirectUrl]);\n\n const form = usePageSpeedForm<Record<string, any>>({\n initialValues: useMemo(\n () => generateInitialValues(formFields),\n [formFields],\n ),\n validationSchema: useMemo(\n () => generateValidationSchema(formFields),\n [formFields],\n ),\n onSubmit: async (values, helpers) => {\n resetSubmissionState();\n const shouldAutoSubmit = Boolean(formConfig?.endpoint);\n\n if (!shouldAutoSubmit && !onSubmit) {\n return;\n }\n\n try {\n let result: unknown;\n\n const submissionValues = {\n ...values,\n ...(uploadTokens.length > 0 && {\n contact_form_upload_tokens: uploadTokens,\n }),\n };\n\n if (shouldAutoSubmit) {\n result = await submitPageSpeedForm(submissionValues, formConfig);\n }\n\n if (onSubmit) {\n await onSubmit(submissionValues);\n }\n\n if (shouldAutoSubmit || onSubmit) {\n try {\n await submissionConfig?.handleFormSubmission?.({\n formData: submissionValues,\n responseData: result,\n });\n } catch {\n // Callback errors should not fail the submission lifecycle.\n }\n\n if (resetOnSuccess) {\n helpers.resetForm();\n }\n\n onSuccess?.(result);\n\n if (\n submissionConfig?.behavior === \"redirect\" &&\n submissionConfig.redirectUrl\n ) {\n performRedirect();\n }\n }\n } catch (error) {\n if (error instanceof PageSpeedFormSubmissionError && error.formErrors) {\n helpers.setErrors(error.formErrors);\n }\n\n const errorMessage =\n error instanceof Error ? error.message : \"Form submission failed\";\n setSubmissionError(errorMessage);\n onError?.(error as Error);\n }\n },\n });\n\n const formMethod =\n formConfig?.method?.toLowerCase() === \"get\" ? \"get\" : \"post\";\n\n return {\n form,\n isSubmitted: form.status === \"success\",\n submissionError,\n formMethod,\n resetSubmissionState,\n };\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { UseFormReturn } from \"./types\";\n\n/**\n * FormContext - React context for providing form state to child components\n *\n * Allows useField hook to access form state without prop drilling.\n * Automatically provided by the <Form> component.\n *\n * @internal\n */\nexport const FormContext = React.createContext<UseFormReturn<any> | null>(null);\n\nFormContext.displayName = \"FormContext\";\n","\"use client\";\n\nimport { useCallback, useContext } from \"react\";\nimport { FormContext } from \"./FormContext\";\nimport type { UseFieldOptions, UseFieldReturn, FieldInputProps, FieldMeta } from \"./types\";\n\n/**\n * useField - Field-level reactive hook for form inputs\n *\n * Provides isolated reactivity for individual form fields.\n * Only re-renders when the specific field changes, not when other fields update.\n *\n * Must be used within a FormContext (inside <Form> component).\n *\n * @example\n * ```tsx\n * function EmailInput() {\n * const { field, meta, helpers } = useField({ name: 'email' });\n *\n * return (\n * <div>\n * <input {...field} type=\"email\" />\n * {meta.touched && meta.error && <span>{meta.error}</span>}\n * </div>\n * );\n * }\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/use-field\n */\nexport function useField<T = any>(\n options: UseFieldOptions<T>\n): UseFieldReturn<T> {\n const { name, validate, transform } = options;\n\n const form = useContext(FormContext);\n\n if (!form) {\n throw new Error(\n \"useField must be used within a FormContext. \" +\n \"Wrap your component with <Form> or use useForm's getFieldProps instead.\"\n );\n }\n\n // Get field props with automatic change/blur handling\n const baseFieldProps = form.getFieldProps(name);\n\n // Apply transform if provided\n const field: FieldInputProps<T> = {\n ...baseFieldProps,\n value: baseFieldProps.value as T,\n onChange: (value: T) => {\n const transformedValue = transform ? transform(value) : value;\n baseFieldProps.onChange(transformedValue);\n\n // Run field-level validation if provided\n if (validate) {\n const result = validate(transformedValue, form.values);\n if (result instanceof Promise) {\n result.then((error) => {\n if (error !== undefined) {\n form.setFieldError(name, error);\n }\n });\n } else if (result !== undefined) {\n form.setFieldError(name, result);\n }\n }\n },\n };\n\n // Get field meta information\n const meta: FieldMeta = form.getFieldMeta(name);\n\n // Field helpers\n const helpers = {\n setValue: useCallback(\n (value: T) => {\n const transformedValue = transform ? transform(value) : value;\n form.setFieldValue(name, transformedValue);\n },\n [name, transform, form]\n ),\n setTouched: useCallback(\n (touched: boolean) => {\n form.setFieldTouched(name, touched);\n },\n [name, form]\n ),\n setError: useCallback(\n (error: string | undefined) => {\n form.setFieldError(name, error);\n },\n [name, form]\n ),\n };\n\n return {\n field,\n meta,\n helpers,\n };\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n/**\n * Normalizes browser autofill colors so inputs keep theme colors.\n */\nexport const INPUT_AUTOFILL_RESET_CLASSES =\n \"autofill:bg-transparent autofill:text-foreground \" +\n \"[&:-webkit-autofill]:[-webkit-text-fill-color:hsl(var(--foreground))] \" +\n \"[&:-webkit-autofill]:[caret-color:hsl(var(--foreground))] \" +\n \"[&:-webkit-autofill]:[box-shadow:0_0_0px_1000px_hsl(var(--background))_inset] \" +\n \"[&:-webkit-autofill:hover]:[box-shadow:0_0_0px_1000px_hsl(var(--background))_inset] \" +\n \"[&:-webkit-autofill:focus]:[box-shadow:0_0_0px_1000px_hsl(var(--background))_inset] \" +\n \"[&:-webkit-autofill]:[transition:background-color_9999s_ease-out,color_9999s_ease-out]\";\n","import * as React from \"react\"\nimport { Label as LabelPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n","import * as React from \"react\";\nimport { Label } from \"./label\";\nimport { cn } from \"../../lib/utils\";\n\ntype FieldOrientation = \"vertical\" | \"horizontal\";\n\ninterface FieldProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: FieldOrientation;\n invalid?: boolean;\n}\n\n/**\n * Field - Container component for form inputs with validation display\n *\n * Provides consistent layout and spacing for form fields with labels,\n * inputs, descriptions, and error messages.\n */\nconst Field = React.forwardRef<HTMLDivElement, FieldProps>(\n({ className, orientation = \"vertical\", invalid = false, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-slot=\"field\"\n data-orientation={orientation}\n data-invalid={invalid || undefined}\n className={cn(\n \"flex\",\n orientation === \"horizontal\"\n ? \"items-center gap-2\"\n : \"flex-col gap-1.5\",\n className,\n )}\n {...props}\n />\n );\n});\nField.displayName = \"Field\";\n\n/**\n * FieldGroup - Container for multiple related fields\n *\n * Used to group fields together (e.g., first name + last name in a row)\n */\nconst FieldGroup = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-slot=\"field-group\"\n className={cn(\"flex flex-col gap-4\", className)}\n {...props}\n />\n );\n});\nFieldGroup.displayName = \"FieldGroup\";\n\n/**\n * FieldLabel - Label component for form fields\n *\n * Wrapper around ShadCN Label with consistent styling\n */\nconst FieldLabel = React.forwardRef<\n HTMLLabelElement,\n React.LabelHTMLAttributes<HTMLLabelElement> & {\n required?: boolean;\n }\n>(({ className, required, children, ...props }, ref) => {\n return (\n <Label\n ref={ref}\n data-slot=\"field-label\"\n className={cn(\n \"text-sm font-medium leading-none select-none\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className,\n )}\n {...props}\n >\n {children}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </Label>\n );\n});\nFieldLabel.displayName = \"FieldLabel\";\n\n/**\n * FieldDescription - Helper text for form fields\n *\n * Displays additional information or instructions for the field\n */\nconst FieldDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => {\n return (\n <p\n ref={ref}\n data-slot=\"field-description\"\n className={cn(\"text-sm opacity-70\", className)}\n {...props}\n />\n );\n});\nFieldDescription.displayName = \"FieldDescription\";\n\n/**\n * FieldError - Error message display for form fields\n *\n * Shows validation errors with proper styling and accessibility\n */\nconst FieldError = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => {\n return (\n <p\n ref={ref}\n data-slot=\"field-error\"\n role=\"alert\"\n aria-live=\"polite\"\n className={cn(\"text-sm text-destructive\", className)}\n {...props}\n />\n );\n});\nFieldError.displayName = \"FieldError\";\n\nexport { Field, FieldGroup, FieldLabel, FieldDescription, FieldError };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { FieldMeta } from \"./types\";\nimport { FieldError } from \"../components/ui/field\";\n\ntype Props = {\n errorId?: string;\n errorClassName?: string;\n shouldRenderError?: boolean;\n error?: FieldMeta[\"error\"];\n};\nconst FieldFeedback = ({\n errorId,\n errorClassName,\n error,\n shouldRenderError,\n}: Props) => {\n const errorText = Array.isArray(error) ? error.join(\", \") : error;\n if (!errorText || !shouldRenderError) return null;\n\n return (\n <FieldError id={errorId} className={errorClassName}>\n {errorText}\n </FieldError>\n );\n};\n\nexport { FieldFeedback };\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { ReactNode } from \"react\";\nimport {\n FieldDescription,\n FieldLabel,\n} from \"../components/ui/field\";\nimport { cn } from \"../lib/utils\";\n\nexport type LabelGroupProps = {\n variant?: \"legend\" | \"label\" | \"text\";\n secondary?: ReactNode;\n secondaryId?: string;\n primary?: ReactNode;\n labelHtmlFor?: string;\n required?: boolean;\n primaryClassName?: string;\n secondaryClassName?: string;\n};\n\nconst LabelGroup = ({\n labelHtmlFor,\n required = false,\n variant = \"label\",\n secondaryId,\n secondary,\n primary,\n primaryClassName,\n secondaryClassName,\n}: LabelGroupProps) => {\n const primaryClasses = cn(\n \"text-sm font-medium leading-snug\",\n variant === \"legend\" ? \"mb-1.5\" : \"mb-1 block\",\n primaryClassName,\n );\n\n const requiredIndicator =\n required && variant !== \"label\" ? (\n <span className=\"text-destructive pl-0.5\" aria-label=\"required\">\n *\n </span>\n ) : null;\n\n let primaryElement: ReactNode = null;\n if (primary) {\n if (variant === \"label\") {\n primaryElement = (\n <FieldLabel\n htmlFor={labelHtmlFor}\n required={required}\n className={primaryClasses}\n >\n {primary}\n </FieldLabel>\n );\n } else if (variant === \"legend\") {\n primaryElement = (\n <legend data-slot=\"field-legend\" className={primaryClasses}>\n {primary}\n {requiredIndicator}\n </legend>\n );\n } else {\n primaryElement = (\n <div data-slot=\"field-label\" className={primaryClasses}>\n {primary}\n {requiredIndicator}\n </div>\n );\n }\n }\n\n const secondaryElement = secondary ? (\n <FieldDescription\n id={secondaryId}\n className={cn(\"leading-normal font-normal\", secondaryClassName)}\n >\n {secondary}\n </FieldDescription>\n ) : null;\n\n if (!primaryElement && !secondaryElement) return null;\n\n // Legend should remain a direct child of fieldset for proper semantics.\n if (variant === \"legend\") {\n return (\n <>\n {primaryElement}\n {secondaryElement}\n </>\n );\n }\n\n return (\n <div className=\"flex flex-1 flex-col gap-0.5\">\n {primaryElement}\n {secondaryElement}\n </div>\n );\n};\n\nexport { LabelGroup };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useField } from \"./useField\";\nimport type { FieldProps } from \"./types\";\nimport { FieldFeedback } from \"./field-feedback\";\nimport { LabelGroup } from \"./label-group\";\nimport { Field as FieldWrapper } from \"../components/ui/field\";\n\n/**\n * Field - Field wrapper component with label, description, and error display\n *\n * Provides a complete field UI with automatic error handling and accessibility.\n * Uses useField hook internally for field-level reactivity.\n *\n * Features:\n * - Automatic label association\n * - Error display with accessibility\n * - Optional description text\n * - Render prop pattern for flexibility\n * - Full accessibility support\n *\n * @example\n * ```tsx\n * <Field name=\"email\" label=\"Email Address\" description=\"We'll never share your email\">\n * {({ field, meta }) => (\n * <input\n * {...field}\n * type=\"email\"\n * className={meta.error && meta.touched ? 'error' : ''}\n * />\n * )}\n * </Field>\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/field\n */\nexport function Field({\n name,\n label,\n description,\n children,\n showError = true,\n className,\n errorClassName,\n required = false,\n validate,\n}: FieldProps) {\n const fieldState = useField({ name, validate });\n const { meta } = fieldState;\n\n const hasError = React.useMemo(() => {\n return showError && meta.touched && meta.error ? true : false;\n }, [meta?.touched, meta?.error, showError]);\n\n const errorId = `${name}-error`;\n const descriptionId = `${name}-description`;\n\n return (\n <FieldWrapper\n className={className}\n data-field={name}\n invalid={hasError}\n >\n <LabelGroup\n labelHtmlFor={name}\n required={required}\n variant=\"label\"\n secondaryId={descriptionId}\n secondary={description}\n primary={label}\n />\n\n {/* Field control slot keeps legacy DOM shape for compatibility */}\n <div data-slot=\"field-control\">\n {typeof children === \"function\" ? children(fieldState) : children}\n </div>\n\n {/* Error message */}\n <FieldFeedback\n errorId={errorId}\n errorClassName={errorClassName}\n shouldRenderError={hasError}\n error={meta.error}\n />\n </FieldWrapper>\n );\n}\n\nField.displayName = \"Field\";\n","import * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { INPUT_AUTOFILL_RESET_CLASSES } from \"../../lib/utils\";\n\n/**\n * Input component - Optimized for dynamic theming across thousands of client brands\n *\n * CRITICAL: This component must work with dynamic Section backgrounds (light/dark/primary/etc)\n * Only uses CSS variables that adapt automatically - NO hardcoded semantic colors\n *\n * See: SHADCN_INTEGRATION_GUIDE.md for full documentation\n */\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n ref={ref}\n type={type}\n data-slot=\"input\"\n className={cn(\n // Core structure - no hardcoded colors, uses CSS variables\n \"flex h-9 w-full min-w-0 rounded-md border border-input\",\n \"bg-transparent px-3 py-1 text-base shadow-sm\",\n \"transition-colors outline-none md:text-sm\",\n\n // Focus state - uses ring-ring CSS variable (adapts to theme)\n \"focus-visible:ring-1 focus-visible:ring-ring\",\n\n // Error state - uses destructive CSS variables (adapts to theme)\n \"aria-invalid:border-destructive aria-invalid:ring-1 aria-invalid:ring-destructive\",\n\n // Disabled state - no color hardcoding\n \"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\",\n\n // File input specific - inherits text color from parent\n \"file:inline-flex file:h-7 file:border-0 file:bg-transparent\",\n \"file:text-sm file:font-medium\",\n\n // Autofill reset - prevents browser from overriding our dynamic colors\n INPUT_AUTOFILL_RESET_CLASSES,\n\n className,\n )}\n {...props}\n />\n );\n },\n);\nInput.displayName = \"Input\";\n\nexport { Input };\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\nimport { Input } from \"../components/ui/input\";\nimport { cn } from \"../lib/utils\";\n\n/**\n * TextInput - High-performance text input component (ShadCN-based)\n *\n * Built on ShadCN Input component with form-specific behavior:\n * - Error state handling\n * - Valid value indicator (ring-2)\n * - Form integration (onChange, onBlur)\n * - Full accessibility support\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { email: '' } });\n *\n * <TextInput\n * {...form.getFieldProps('email')}\n * type=\"email\"\n * placeholder=\"Enter your email\"\n * error={!!form.errors.email}\n * aria-invalid={!!form.errors.email}\n * aria-describedby={form.errors.email ? 'email-error' : undefined}\n * />\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/text-input\n */\nexport function TextInput({\n name,\n value,\n onChange,\n onBlur,\n placeholder,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n type = \"text\",\n id = \"text\",\n ...props\n}: InputProps<string> & {\n type?: \"text\" | \"email\" | \"password\" | \"url\" | \"tel\" | \"search\";\n}) {\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.value);\n };\n\n const handleBlur = () => {\n onBlur?.();\n };\n\n const hasValue = String(value ?? \"\").trim().length > 0;\n\n return (\n <Input\n type={type}\n id={id}\n name={name}\n value={value ?? \"\"}\n onChange={handleChange}\n onBlur={handleBlur}\n placeholder={placeholder}\n disabled={disabled}\n required={required}\n className={cn(\n // Valid value indicator - ring-2 when has value and no error\n !error && hasValue && \"ring-2 ring-ring\",\n // Error state - handled by Input component via aria-invalid\n className,\n )}\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","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\n/**\n * Textarea component - Optimized for dynamic theming across thousands of client brands\n *\n * CRITICAL: Only uses CSS variables that adapt automatically - NO hardcoded semantic colors\n * See: SHADCN_INTEGRATION_GUIDE.md for full documentation\n */\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n // Core structure - uses CSS variables only\n \"flex field-sizing-content min-h-16 w-full rounded-md border border-input\",\n \"bg-transparent px-3 py-2 text-base shadow-xs\",\n \"transition-[color,box-shadow] outline-none md:text-sm\",\n\n // Focus state - uses ring-ring CSS variable\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n\n // Error state - uses destructive CSS variables\n \"aria-invalid:border-destructive aria-invalid:ring-destructive/20\",\n\n // Disabled state\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\nimport { Textarea } from \"../components/ui/textarea\";\nimport { cn } from \"../lib/utils\";\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 (ShadCN-based)\n *\n * Built on ShadCN Textarea component with form-specific behavior:\n * - Error state handling\n * - Valid value indicator (ring-2)\n * - Form integration (onChange, onBlur)\n * - Full accessibility support\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 hasValue = String(value ?? \"\").trim().length > 0;\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={cn(\n // Valid value indicator - ring-2 when has value and no error\n !error && hasValue && \"ring-2 ring-ring\",\n // Error state - handled by Textarea component via aria-invalid\n className,\n )}\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 { Checkbox as CheckboxPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\n/**\n * Checkbox component - Optimized for dynamic theming across thousands of client brands\n *\n * CRITICAL: Only uses CSS variables that adapt automatically - NO hardcoded semantic colors\n * See: SHADCN_INTEGRATION_GUIDE.md for full documentation\n */\nfunction Checkbox({\n className,\n ...props\n}: React.ComponentProps<typeof CheckboxPrimitive.Root>) {\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n // Core structure - uses CSS variables\n \"peer size-4 shrink-0 rounded-[4px] border border-input bg-transparent shadow-xs\",\n \"transition-shadow outline-none\",\n\n // Checked state - uses primary CSS variables\n \"data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground\",\n \"data-[state=checked]:border-primary\",\n\n // Focus state - uses ring-ring CSS variable\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n\n // Error state - uses destructive CSS variables\n \"aria-invalid:border-destructive aria-invalid:ring-destructive/20\",\n\n // Disabled state\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"grid place-content-center text-current transition-none\"\n >\n {/* Simple check mark using CSS */}\n <svg\n className=\"size-3.5\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n )\n}\n\nexport { Checkbox }\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\nimport { Checkbox as CheckboxPrimitive } from \"../components/ui/checkbox\";\nimport {\n Field,\n FieldDescription,\n FieldLabel,\n} from \"../components/ui/field\";\nimport { cn } from \"../lib/utils\";\n\n/**\n * Additional props specific to Checkbox\n */\nexport interface CheckboxProps extends Omit<\n InputProps<boolean>,\n \"onChange\" | \"placeholder\"\n> {\n /**\n * Change handler - receives boolean checked state\n */\n onChange: (checked: boolean) => void;\n\n /**\n * Label text for the checkbox (primary text)\n */\n label?: React.ReactNode;\n\n /**\n * Optional description text below the label (secondary text)\n */\n description?: React.ReactNode;\n\n /**\n * Layout variant - automatically enabled if description exists\n * @default false\n */\n useChoiceCard?: boolean;\n\n /**\n * Additional native input attributes\n */\n [key: string]: any;\n}\n\n/**\n * Checkbox - High-performance boolean input component (ShadCN-based)\n *\n * Built on ShadCN Checkbox with form-specific behavior:\n * - Error state handling\n * - Choice Card variant (automatic when description exists)\n * - Label and description support\n * - Form integration (onChange, onBlur)\n * - Full accessibility support\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { terms: false } });\n *\n * <Checkbox\n * {...form.getFieldProps('terms')}\n * label=\"I agree to the terms and conditions\"\n * description=\"By clicking this checkbox, you agree to the terms.\"\n * error={!!form.errors.terms}\n * />\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 label,\n description,\n useChoiceCard = false,\n ...props\n}: CheckboxProps) {\n const checkboxId = props.id || `checkbox-${name}`;\n\n const handleCheckedChange = (checked: boolean) => {\n onChange(checked);\n };\n\n const handleBlur = () => {\n onBlur?.();\n };\n\n // Automatically use Choice Card if description exists\n const showChoiceCard = useChoiceCard || !!description;\n\n const checkbox = (\n <>\n {/* Hidden input for form submission */}\n <input\n type=\"checkbox\"\n name={name}\n checked={value}\n onChange={() => {}} // Controlled by CheckboxPrimitive\n disabled={disabled}\n required={required}\n tabIndex={-1}\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n padding: 0,\n margin: \"-1px\",\n overflow: \"hidden\",\n clip: \"rect(0, 0, 0, 0)\",\n whiteSpace: \"nowrap\",\n border: 0,\n }}\n />\n <CheckboxPrimitive\n id={checkboxId}\n checked={value}\n onCheckedChange={handleCheckedChange}\n onBlur={handleBlur}\n disabled={disabled}\n aria-invalid={error || props[\"aria-invalid\"]}\n aria-describedby={\n description ? `${checkboxId}-description` : props[\"aria-describedby\"]\n }\n aria-required={required || props[\"aria-required\"]}\n {...props}\n />\n </>\n );\n\n // Without label, return just the checkbox\n if (!label) {\n return <Field className={className}>{checkbox}</Field>;\n }\n\n // With label, wrap in FieldLabel for semantic association and click behavior\n return (\n <Field className=\"gap-0\" invalid={Boolean(error)}>\n <FieldLabel\n htmlFor={checkboxId}\n className={cn(\n \"flex gap-3 p-3 duration-200 select-auto font-normal leading-normal\",\n showChoiceCard && \"border rounded-lg hover:ring-2 hover:ring-ring/50\",\n showChoiceCard && value && \"ring-2 ring-ring\",\n showChoiceCard && error && \"border-destructive\",\n disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\",\n className,\n )}\n >\n <div\n className={cn(\n \"flex w-full gap-3\",\n showChoiceCard ? \"items-start\" : \"items-center\",\n )}\n >\n {checkbox}\n <Field className=\"flex-1 gap-1\">\n <span className=\"text-sm font-medium leading-none\">{label}</span>\n {description && (\n <FieldDescription\n id={`${checkboxId}-description`}\n className=\"leading-snug\"\n >\n {description}\n </FieldDescription>\n )}\n </Field>\n </div>\n </FieldLabel>\n </Field>\n );\n}\n\nCheckbox.displayName = \"Checkbox\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\nimport { Checkbox } from \"./Checkbox\";\nimport { FieldDescription } from \"../components/ui/field\";\nimport { LabelGroup } from \"../core/label-group\";\nimport { cn } from \"../lib/utils\";\n\n/**\n * CheckboxGroup option type\n */\nexport interface CheckboxGroupOption {\n /**\n * The value for this checkbox option\n */\n value: string;\n\n /**\n * Display label for the option\n */\n label: React.ReactNode;\n\n /**\n * Optional description text below the label\n */\n description?: React.ReactNode;\n\n /**\n * Whether this option is disabled\n */\n disabled?: boolean;\n}\n\n/**\n * Additional props specific to CheckboxGroup\n */\nexport interface CheckboxGroupProps extends Omit<\n InputProps<string[]>,\n \"onChange\" | \"placeholder\"\n> {\n /**\n * Change handler - receives array of selected values\n */\n onChange: (values: string[]) => void;\n\n /**\n * Array of checkbox options\n */\n options: CheckboxGroupOption[];\n\n /**\n * Layout direction\n * @default \"stacked\"\n */\n layout?: \"stacked\" | \"grid\" | \"inline\";\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 (stacked, grid)\n * - Optional \"select all\" checkbox\n * - Individual option disabled state\n * - Minimum/maximum selection validation\n * - Custom option rendering\n * - Optional descriptions for each option\n * - All native checkbox attributes supported\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { interests: [] } });\n *\n * <CheckboxGroup\n * {...form.getFieldProps('interests')}\n * label=\"Select your interests\"\n * options={[\n * { value: 'sports', label: 'Sports', description: 'Football, Basketball, etc.' },\n * { value: 'music', label: 'Music', description: 'All genres' },\n * { value: 'reading', label: 'Reading', description: 'Books and articles' }\n * ]}\n * showSelectAll\n * error={!!form.errors.interests}\n * aria-describedby={form.errors.interests ? 'interests-error' : undefined}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Grid layout with min/max selections\n * <CheckboxGroup\n * name=\"features\"\n * value={features}\n * onChange={handleFeaturesChange}\n * layout=\"grid\"\n * gridColumns={3}\n * minSelections={1}\n * maxSelections={3}\n * label=\"Select 1-3 features\"\n * options={[\n * { value: 'ssl', label: 'SSL Certificate' },\n * { value: 'cdn', label: 'CDN' },\n * { value: 'backup', label: 'Daily Backups' },\n * { value: 'support', label: '24/7 Support' }\n * ]}\n * />\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/checkbox-group\n */\nexport function CheckboxGroup({\n name,\n value = [],\n onChange,\n onBlur,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n layout = \"stacked\",\n label,\n description,\n options,\n showSelectAll = false,\n selectAllLabel = \"Select all\",\n minSelections,\n maxSelections,\n renderOption,\n gridColumns = 2,\n ...props\n}: CheckboxGroupProps) {\n // Calculate select all state\n const enabledOptions = options.filter((opt) => !opt.disabled);\n const enabledValues = enabledOptions.map((opt) => opt.value);\n const selectedEnabledCount = value.filter((v) =>\n enabledValues.includes(v),\n ).length;\n const allSelected = selectedEnabledCount === enabledOptions.length;\n const someSelected = selectedEnabledCount > 0 && !allSelected;\n\n const useChoiceCard: boolean = React.useMemo(() => {\n if (!options) return false;\n\n return options?.some((opt) => opt.description);\n }, [options]);\n\n const countableValue: number = React.useMemo(() => {\n if (value?.length > 0) {\n return value.length;\n }\n return 0;\n }, [value]);\n\n // Handle individual checkbox change\n const handleChange = (optionValue: string, checked: boolean) => {\n const newValues = checked\n ? [...value, optionValue]\n : value.filter((v) => v !== optionValue);\n\n // Enforce max selections\n if (maxSelections && checked && newValues.length > maxSelections) {\n return;\n }\n\n onChange(newValues);\n };\n\n // Handle select all change\n const handleSelectAll = (checked: boolean) => {\n if (checked) {\n // Select all enabled options\n const allValues = enabledOptions.map((opt) => opt.value);\n onChange(allValues);\n } else {\n // Deselect all\n onChange([]);\n }\n };\n\n const handleBlur = () => {\n onBlur?.();\n };\n\n // Determine if max selections reached\n const maxReached = Boolean(maxSelections && countableValue >= maxSelections);\n\n const containerClass = React.useMemo(() => {\n return cn(\n \"w-full gap-3 grid grid-cols-1 border-0 m-0 p-0 min-w-0\",\n (layout === \"grid\" || layout === \"inline\") && \"md:grid-cols-2\",\n className,\n );\n }, [layout, className]);\n\n const groupDescriptionId = description ? `${name}-description` : undefined;\n const groupAriaDescribedBy =\n [props[\"aria-describedby\"], groupDescriptionId].filter(Boolean).join(\" \") ||\n undefined;\n\n return (\n <fieldset\n className={containerClass}\n role=\"group\"\n aria-invalid={error || props[\"aria-invalid\"]}\n aria-describedby={groupAriaDescribedBy}\n aria-required={required || props[\"aria-required\"]}\n aria-label={typeof label === \"string\" ? label : props[\"aria-label\"]}\n >\n <LabelGroup\n labelHtmlFor={name}\n required={required}\n variant=\"legend\"\n secondaryId={groupDescriptionId}\n secondary={description}\n primary={label}\n />\n\n {/* Select All Checkbox */}\n {showSelectAll && enabledOptions.length > 0 && (\n <Checkbox\n name={`${name}-select-all`}\n id={`${name}-select-all`}\n value={allSelected}\n onChange={handleSelectAll}\n onBlur={handleBlur}\n indeterminate={someSelected}\n label={selectAllLabel}\n useChoiceCard={useChoiceCard}\n disabled={disabled}\n aria-label={selectAllLabel}\n />\n )}\n\n {/* Individual Checkboxes */}\n {options.map((option) => {\n const isChecked = value.includes(option.value);\n const isDisabled =\n disabled || option.disabled || (maxReached && !isChecked);\n\n return (\n <Checkbox\n key={option.value}\n name={name}\n id={`${name}-${option.value}`}\n value={isChecked}\n onChange={(checked) => handleChange(option.value, checked)}\n onBlur={handleBlur}\n disabled={isDisabled}\n required={\n required && minSelections ? value.length < minSelections : false\n }\n error={error}\n label={renderOption ? renderOption(option) : option.label}\n description={renderOption ? undefined : option.description}\n useChoiceCard={useChoiceCard}\n />\n );\n })}\n\n {/* Selection count feedback */}\n {(minSelections || maxSelections) && (\n <FieldDescription\n className={cn(\n \"p-2 rounded-lg border font-semibold mt-2 leading-snug\",\n minSelections && countableValue < minSelections\n ? \"border-destructive bg-destructive/80 text-destructive-foreground\"\n : \"border-border bg-card text-card-foreground\",\n )}\n aria-live=\"polite\"\n >\n {minSelections && countableValue < minSelections && (\n <span>\n Select at least {minSelections} option\n {minSelections !== 1 ? \"s\" : \"\"}\n </span>\n )}\n {maxSelections && (\n <span>\n {countableValue}/{maxSelections} selected\n </span>\n )}\n </FieldDescription>\n )}\n </fieldset>\n );\n}\n\nCheckboxGroup.displayName = \"CheckboxGroup\";\n","import * as React from \"react\"\nimport { RadioGroup as RadioGroupPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\n/**\n * RadioGroup components - Optimized for dynamic theming across thousands of client brands\n *\n * CRITICAL: Only uses CSS variables that adapt automatically - NO hardcoded semantic colors\n * See: SHADCN_INTEGRATION_GUIDE.md for full documentation\n */\nfunction RadioGroup({\n className,\n ...props\n}: React.ComponentProps<typeof RadioGroupPrimitive.Root>) {\n return (\n <RadioGroupPrimitive.Root\n data-slot=\"radio-group\"\n className={cn(\"grid gap-3\", className)}\n {...props}\n />\n )\n}\n\nfunction RadioGroupItem({\n className,\n ...props\n}: React.ComponentProps<typeof RadioGroupPrimitive.Item>) {\n return (\n <RadioGroupPrimitive.Item\n data-slot=\"radio-group-item\"\n className={cn(\n // Core structure - uses CSS variables\n \"aspect-square size-4 shrink-0 rounded-full border border-input bg-transparent shadow-xs\",\n \"text-primary transition-[color,box-shadow] outline-none\",\n\n // Focus state - uses ring-ring CSS variable\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n\n // Error state - uses destructive CSS variables\n \"aria-invalid:border-destructive aria-invalid:ring-destructive/20\",\n\n // Disabled state\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n\n className\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator\n data-slot=\"radio-group-indicator\"\n className=\"relative flex items-center justify-center\"\n >\n {/* Simple filled circle indicator */}\n <svg\n className=\"fill-primary absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2\"\n viewBox=\"0 0 24 24\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"12\" />\n </svg>\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n )\n}\n\nexport { RadioGroup, RadioGroupItem }\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\nimport { RadioGroup, RadioGroupItem } from \"../components/ui/radio-group\";\nimport {\n Field,\n FieldDescription,\n FieldLabel,\n} from \"../components/ui/field\";\nimport { cn } from \"../lib/utils\";\n\n/**\n * Radio option type\n */\nexport interface RadioOption {\n /**\n * The value for this radio option\n */\n value: string;\n\n /**\n * Display label for the option (primary text)\n */\n label: React.ReactNode;\n\n /**\n * Optional description text below the label (secondary text)\n */\n description?: React.ReactNode;\n\n /**\n * Whether this option is disabled\n */\n disabled?: boolean;\n}\n\n/**\n * Additional props specific to Radio\n */\nexport interface RadioProps extends Omit<\n InputProps<string>,\n \"onChange\" | \"placeholder\"\n> {\n /**\n * Change handler - receives selected value\n */\n onChange: (value: string) => void;\n\n /**\n * Array of radio options\n */\n options: RadioOption[];\n\n /**\n * Layout direction\n * @default \"stacked\"\n */\n layout?: \"stacked\" | \"grid\" | \"inline\";\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 * Additional native input attributes\n */\n [key: string]: any;\n}\n\n/**\n * Radio - High-performance single selection component (ShadCN-based)\n *\n * Built on ShadCN RadioGroup with form-specific behavior:\n * - Error state handling\n * - Choice Card variant (automatic when any option has description)\n * - Keyboard navigation (built into RadioGroup)\n * - Grid/stacked layouts\n * - Form integration (onChange, onBlur)\n * - Full accessibility support\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 * />\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 description,\n options,\n ...props\n}: RadioProps) {\n const handleValueChange = (selectedValue: string) => {\n onChange(selectedValue);\n };\n\n const handleBlur = () => {\n onBlur?.();\n };\n\n // Automatically use Choice Card if any option has description\n const useChoiceCard = React.useMemo(() => {\n return options.some((option) => option.description);\n }, [options]);\n\n const groupDescriptionId = description ? `${name}-description` : undefined;\n\n return (\n <Field className={cn(\"w-full\", className)} invalid={Boolean(error)}>\n {/* Group-level label and description */}\n {(label || description) && (\n <Field className=\"mb-3 gap-1\">\n {label && (\n <div className=\"text-base font-medium leading-none\">{label}</div>\n )}\n {description && (\n <FieldDescription\n id={groupDescriptionId}\n className=\"leading-snug\"\n >\n {description}\n </FieldDescription>\n )}\n </Field>\n )}\n\n <RadioGroup\n name={name}\n value={value}\n onValueChange={handleValueChange}\n onBlur={handleBlur}\n disabled={disabled}\n required={required}\n className={cn(\n \"gap-3\",\n layout === \"grid\" && \"grid grid-cols-1 md:grid-cols-2\",\n layout === \"inline\" && \"flex flex-wrap\",\n )}\n aria-invalid={error || props[\"aria-invalid\"]}\n aria-describedby={groupDescriptionId || props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n >\n {options.map((option) => {\n const isSelected = value === option.value;\n const isDisabled = disabled || option.disabled;\n const radioId = `${name}-${option.value}`;\n const hasDescription = !!option.description;\n\n return (\n <FieldLabel\n key={option.value}\n htmlFor={radioId}\n className={cn(\n \"flex gap-3 p-3 duration-200 select-auto font-normal leading-normal\",\n useChoiceCard &&\n \"border rounded-lg hover:ring-2 hover:ring-ring/50\",\n useChoiceCard && isSelected && \"ring-2 ring-ring\",\n useChoiceCard && error && \"border-destructive\",\n isDisabled\n ? \"opacity-50 cursor-not-allowed\"\n : \"cursor-pointer\",\n )}\n >\n <Field\n orientation=\"horizontal\"\n className={cn(\n \"flex w-full gap-3\",\n useChoiceCard ? \"items-start\" : \"items-center\",\n )}\n >\n <RadioGroupItem\n value={option.value}\n id={radioId}\n disabled={isDisabled}\n className=\"mt-0.5\"\n aria-describedby={\n hasDescription\n ? `${radioId}-description`\n : undefined\n }\n />\n <Field className=\"flex-1 gap-1\">\n <span className=\"text-sm font-medium leading-none\">\n {option.label}\n </span>\n {option.description && (\n <FieldDescription\n id={`${radioId}-description`}\n className=\"leading-snug\"\n >\n {option.description}\n </FieldDescription>\n )}\n </Field>\n </Field>\n </FieldLabel>\n );\n })}\n </RadioGroup>\n </Field>\n );\n}\n\nRadio.displayName = \"Radio\";\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Select as SelectPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\n/**\n * Select components - Optimized for dynamic theming across thousands of client brands\n *\n * CRITICAL: Only uses CSS variables that adapt automatically - NO hardcoded semantic colors\n * See: SHADCN_INTEGRATION_GUIDE.md for full documentation\n */\n\nfunction Select({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectGroup({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />\n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n // Core structure - uses CSS variables\n \"flex w-fit items-center justify-between gap-2 rounded-md border border-input\",\n \"bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs\",\n \"transition-[color,box-shadow] outline-none\",\n\n // Focus state\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n\n // Error state\n \"aria-invalid:border-destructive aria-invalid:ring-destructive/20\",\n\n // Disabled state\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n\n // Size variants\n \"data-[size=default]:h-9 data-[size=sm]:h-8\",\n\n // Value styling\n \"*:data-[slot=select-value]:line-clamp-1\",\n \"*:data-[slot=select-value]:flex\",\n \"*:data-[slot=select-value]:items-center\",\n \"*:data-[slot=select-value]:gap-2\",\n\n // SVG styling\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <svg\n className=\"size-4 opacity-50\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"item-aligned\",\n align = \"center\",\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n align={align}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"px-2 py-1.5 text-xs opacity-70\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n // Core structure - inherits text color\n \"relative flex w-full cursor-default items-center gap-2 rounded-sm\",\n \"py-1.5 pr-8 pl-2 text-sm outline-hidden select-none\",\n\n // Focus state - uses accent CSS variable\n \"focus:bg-accent focus:text-accent-foreground\",\n\n // Disabled state\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n\n // SVG styling\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\n // Span styling\n \"*:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n\n className\n )}\n {...props}\n >\n <span\n data-slot=\"select-item-indicator\"\n className=\"absolute right-2 flex size-3.5 items-center justify-center\"\n >\n <SelectPrimitive.ItemIndicator>\n <svg\n className=\"size-4\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"bg-border pointer-events-none -mx-1 my-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <svg\n className=\"size-4\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"18 15 12 9 6 15\" />\n </svg>\n </SelectPrimitive.ScrollUpButton>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <svg\n className=\"size-4\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </SelectPrimitive.ScrollDownButton>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\nimport {\n Select as SelectPrimitive,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectTrigger,\n SelectValue,\n} from \"../components/ui/select\";\nimport { cn } from \"../lib/utils\";\n\n/**\n * Select option type\n */\nexport interface SelectOption {\n value: string;\n label: React.ReactNode;\n disabled?: boolean;\n}\n\n/**\n * Select option group type\n */\nexport interface SelectOptionGroup {\n label: string;\n options: SelectOption[];\n}\n\n/**\n * Additional props specific to Select\n */\nexport interface SelectProps extends Omit<\n InputProps<string>,\n \"onChange\" | \"onFocus\"\n> {\n onChange: (value: string) => void;\n onFocus?: () => void;\n options?: SelectOption[];\n optionGroups?: SelectOptionGroup[];\n placeholder?: string;\n renderOption?: (option: SelectOption) => React.ReactNode;\n [key: string]: any;\n}\n\n/**\n * Select - High-performance dropdown selection component (ShadCN-based)\n *\n * Built on ShadCN Select with form-specific behavior:\n * - Error state handling\n * - Valid value indicator (ring-2)\n * - Form integration (onChange, onBlur)\n * - Option groups support\n * - Full accessibility support\n *\n * NOTE: This is a simplified refactored version. For advanced features like\n * search, clearable, and loading states, use the Command component or MultiSelect.\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 * error={!!form.errors.country}\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 options = [],\n optionGroups = [],\n renderOption,\n ...props\n}: SelectProps) {\n const [hasInteracted, setHasInteracted] = React.useState(false);\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 const hasValue = Boolean(value);\n\n // Ensure value is always a string or undefined for Radix\n const selectValue = value ? String(value) : undefined;\n\n const handleValueChange = (newValue: string) => {\n onChange(newValue);\n };\n\n const handleOpenChange = (open: boolean) => {\n if (open) {\n // Mark as interacted when dropdown opens\n if (!hasInteracted) {\n setHasInteracted(true);\n }\n onFocus?.();\n } else if (hasInteracted) {\n // Only trigger onBlur validation if user has interacted\n onBlur?.();\n }\n };\n\n return (\n <>\n {/* Hidden input for form submission */}\n <input\n type=\"hidden\"\n name={name}\n value={value ?? \"\"}\n disabled={disabled}\n required={required}\n tabIndex={-1}\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n padding: \"0\",\n margin: \"-1px\",\n overflow: \"hidden\",\n clip: \"rect(0, 0, 0, 0)\",\n whiteSpace: \"nowrap\",\n border: \"0\",\n }}\n />\n <SelectPrimitive\n value={selectValue}\n onValueChange={handleValueChange}\n onOpenChange={handleOpenChange}\n disabled={disabled}\n >\n <SelectTrigger\n className={cn(\n // Valid value indicator - ring-2 when has value and no error\n !error && hasValue && \"ring-2 ring-ring\",\n // Error state - handled by SelectTrigger via aria-invalid\n className,\n )}\n aria-invalid={error || props[\"aria-invalid\"]}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n >\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {optionGroups.length > 0 ? (\n // Render grouped options\n optionGroups.map((group, groupIndex) => (\n <SelectGroup key={groupIndex}>\n <SelectLabel>{group.label}</SelectLabel>\n {group.options.map((option) => (\n <SelectItem\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n >\n {renderOption ? renderOption(option) : option.label}\n </SelectItem>\n ))}\n </SelectGroup>\n ))\n ) : (\n // Render flat options\n allOptions.map((option) => (\n <SelectItem\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n >\n {renderOption ? renderOption(option) : option.label}\n </SelectItem>\n ))\n )}\n </SelectContent>\n </SelectPrimitive>\n </>\n );\n}\n\nSelect.displayName = \"Select\";\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20\",\n outline:\n \"border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n xs: \"h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n \"icon-xs\": \"size-6 rounded-md [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import * as React from \"react\"\nimport { Dialog as DialogPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\n\n/**\n * Dialog components - Optimized for dynamic theming across thousands of client brands\n *\n * CRITICAL: Uses bg-background which adapts to theme\n * See: SHADCN_INTEGRATION_GUIDE.md for full documentation\n */\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => {\n return (\n <DialogPrimitive.Overlay\n ref={ref}\n data-slot=\"dialog-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className\n )}\n {...props}\n />\n )\n})\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n }\n>(({ className, children, showCloseButton = true, ...props }, ref) => {\n return (\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n data-slot=\"dialog-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 outline-none sm:max-w-lg\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n >\n <svg\n className=\"size-4\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n})\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({\n className,\n showCloseButton = false,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showCloseButton?: boolean\n}) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close asChild>\n <Button variant=\"outline\">Close</Button>\n </DialogPrimitive.Close>\n )}\n </div>\n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\"text-lg leading-none font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\"text-sm opacity-70\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","import * as React from \"react\"\nimport { Command as CommandPrimitive } from \"cmdk\"\n\nimport { cn } from \"../../lib/utils\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"./dialog\"\n\n/**\n * Command components - Optimized for dynamic theming across thousands of client brands\n *\n * CRITICAL: Uses bg-popover/text-popover-foreground which adapt to theme\n * Only uses opacity for muted text, no hardcoded semantic colors\n * See: SHADCN_INTEGRATION_GUIDE.md for full documentation\n */\n\nfunction Command({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n data-slot=\"command\"\n className={cn(\n \"bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandDialog({\n title = \"Command Palette\",\n description = \"Search for a command to run...\",\n children,\n className,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof Dialog> & {\n title?: string\n description?: string\n className?: string\n showCloseButton?: boolean\n}) {\n return (\n <Dialog {...props}>\n <DialogHeader className=\"sr-only\">\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogContent\n className={cn(\"overflow-hidden p-0\", className)}\n showCloseButton={showCloseButton}\n >\n <Command className=\"[&_[cmdk-group-heading]]:opacity-70 **:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n )\n}\n\nfunction CommandInput({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div\n data-slot=\"command-input-wrapper\"\n className=\"flex h-9 items-center gap-2 border-b px-3\"\n >\n <svg\n className=\"size-4 shrink-0 opacity-50\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.3-4.3\" />\n </svg>\n <CommandPrimitive.Input\n data-slot=\"command-input\"\n className={cn(\n \"flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n />\n </div>\n )\n}\n\nfunction CommandList({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n data-slot=\"command-list\"\n className={cn(\n \"max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandEmpty({\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return (\n <CommandPrimitive.Empty\n data-slot=\"command-empty\"\n className=\"py-6 text-center text-sm\"\n {...props}\n />\n )\n}\n\nfunction CommandGroup({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n \"overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:opacity-70\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n data-slot=\"command-separator\"\n className={cn(\"bg-border -mx-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nfunction CommandItem({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"command-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest opacity-70\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n}\n","import * as React from \"react\"\nimport { Popover as PopoverPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\n/**\n * Popover components - Optimized for dynamic theming across thousands of client brands\n *\n * CRITICAL: Popover content uses bg-popover/text-popover-foreground which adapt to theme\n * See: SHADCN_INTEGRATION_GUIDE.md for full documentation\n */\n\nfunction Popover({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />\n}\n\nfunction PopoverTrigger({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />\n}\n\nfunction PopoverContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n )\n}\n\nfunction PopoverAnchor({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\n return <PopoverPrimitive.Anchor data-slot=\"popover-anchor\" {...props} />\n}\n\nfunction PopoverHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"popover-header\"\n className={cn(\"flex flex-col gap-1 text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction PopoverTitle({ className, ...props }: React.ComponentProps<\"h2\">) {\n return (\n <div\n data-slot=\"popover-title\"\n className={cn(\"font-medium\", className)}\n {...props}\n />\n )\n}\n\nfunction PopoverDescription({\n className,\n ...props\n}: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"popover-description\"\n className={cn(\"opacity-70\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n PopoverAnchor,\n PopoverHeader,\n PopoverTitle,\n PopoverDescription,\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandList,\n} from \"../components/ui/command\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover\";\nimport { cn, INPUT_AUTOFILL_RESET_CLASSES } from \"../lib/utils\";\n\n/**\n * Multi-select option type\n */\nexport interface MultiSelectOption {\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 * Multi-select option group type for organizing options\n */\nexport interface MultiSelectOptionGroup {\n /**\n * Group label\n */\n label: string;\n\n /**\n * Options in this group\n */\n options: MultiSelectOption[];\n}\n\n/**\n * Additional props specific to MultiSelect\n */\nexport interface MultiSelectProps extends Omit<\n InputProps<string[]>,\n \"onChange\" | \"onFocus\"\n> {\n /**\n * Change handler - receives array of selected values\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?: MultiSelectOption[];\n\n /**\n * Array of option groups (grouped structure)\n */\n optionGroups?: MultiSelectOptionGroup[];\n\n /**\n * Placeholder text when no options are 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 all selections\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 * Maximum number of selections allowed\n */\n maxSelections?: number;\n\n /**\n * Show \"Select All\" button\n * @default false\n */\n showSelectAll?: boolean;\n\n /**\n * Custom render function for options\n */\n renderOption?: (option: MultiSelectOption) => React.ReactNode;\n\n /**\n * Custom render function for selected value chips/tags\n */\n renderValue?: (option: MultiSelectOption) => React.ReactNode;\n\n /**\n * Additional native input attributes\n */\n [key: string]: any;\n}\n\nfunction ensureResizeObserver() {\n if (typeof window === \"undefined\") return;\n\n const windowWithResizeObserver = window as unknown as {\n ResizeObserver?: new (...args: any[]) => {\n observe: (...args: any[]) => void;\n unobserve: (...args: any[]) => void;\n disconnect: () => void;\n };\n };\n\n if (windowWithResizeObserver.ResizeObserver) return;\n\n windowWithResizeObserver.ResizeObserver = class ResizeObserverMock {\n observe() {}\n unobserve() {}\n disconnect() {}\n };\n\n if (\n typeof HTMLElement !== \"undefined\" &&\n typeof HTMLElement.prototype.scrollIntoView !== \"function\"\n ) {\n HTMLElement.prototype.scrollIntoView = () => {};\n }\n}\n\nfunction optionLabelText(option: MultiSelectOption): string {\n if (typeof option.label === \"string\") {\n return option.label;\n }\n return String(option.label);\n}\n\n/**\n * MultiSelect - ShadCN Command + Popover multi-select component\n */\nexport function MultiSelect({\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 maxSelections,\n showSelectAll = false,\n options = [],\n optionGroups = [],\n renderOption,\n renderValue,\n ...props\n}: MultiSelectProps) {\n const [isOpen, setIsOpen] = React.useState(false);\n const [searchQuery, setSearchQuery] = React.useState(\"\");\n const [focusedIndex, setFocusedIndex] = React.useState(-1);\n const [hasInteracted, setHasInteracted] = React.useState(false);\n const triggerRef = React.useRef<HTMLDivElement>(null);\n const dropdownId = `${name}-dropdown`;\n const searchInputId = `${name}-search`;\n\n ensureResizeObserver();\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\n const query = searchQuery.toLowerCase();\n return allOptions.filter((option) =>\n optionLabelText(option).toLowerCase().includes(query),\n );\n }, [allOptions, searchQuery]);\n\n // Get selected options\n const selectedOptions = React.useMemo(() => {\n return allOptions.filter((option) => value.includes(option.value));\n }, [allOptions, value]);\n\n const hasValue = value.length > 0;\n\n // Check if max selections reached\n const isMaxReached = React.useMemo(() => {\n return maxSelections !== undefined && value.length >= maxSelections;\n }, [maxSelections, value.length]);\n\n const getEnabledOptions = React.useCallback(() => {\n return filteredOptions.filter(\n (option) => !option.disabled && (!isMaxReached || value.includes(option.value)),\n );\n }, [filteredOptions, isMaxReached, value]);\n\n React.useEffect(() => {\n if (!isOpen) return;\n if (!searchable) return;\n\n const id = window.setTimeout(() => {\n const searchInput = document.getElementById(\n searchInputId,\n ) as HTMLInputElement | null;\n searchInput?.focus();\n }, 0);\n\n return () => {\n window.clearTimeout(id);\n };\n }, [isOpen, searchable, searchInputId]);\n\n // Handle option selection toggle\n const handleToggleOption = React.useCallback(\n (optionValue: string) => {\n const isSelected = value.includes(optionValue);\n\n if (isSelected) {\n onChange(value.filter((entry) => entry !== optionValue));\n } else if (!isMaxReached) {\n onChange([...value, optionValue]);\n }\n\n // Reset search after selection\n setSearchQuery(\"\");\n },\n [isMaxReached, onChange, value],\n );\n\n // Handle select all\n const handleSelectAll = React.useCallback(() => {\n const enabledOptions = filteredOptions.filter((option) => !option.disabled);\n onChange(enabledOptions.map((option) => option.value));\n setSearchQuery(\"\");\n }, [filteredOptions, onChange]);\n\n // Handle clear all\n const handleClearAll = React.useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange([]);\n setSearchQuery(\"\");\n setFocusedIndex(-1);\n },\n [onChange],\n );\n\n // Handle remove single value\n const handleRemoveValue = React.useCallback(\n (optionValue: string, e: React.MouseEvent) => {\n e.stopPropagation();\n onChange(value.filter((entry) => entry !== optionValue));\n },\n [onChange, value],\n );\n\n const handleOpenChange = React.useCallback(\n (nextOpen: boolean) => {\n if (disabled) {\n setIsOpen(false);\n return;\n }\n\n if (nextOpen) {\n if (!hasInteracted) {\n setHasInteracted(true);\n }\n setIsOpen(true);\n onFocus?.();\n return;\n }\n\n if (isOpen && hasInteracted) {\n onBlur?.();\n }\n\n setIsOpen(false);\n setSearchQuery(\"\");\n setFocusedIndex(-1);\n },\n [disabled, hasInteracted, isOpen, onBlur, onFocus],\n );\n\n const handleTriggerBlur = React.useCallback(() => {\n if (!isOpen) {\n onBlur?.();\n }\n }, [isOpen, onBlur]);\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n if (disabled) return;\n\n const enabledOptions = getEnabledOptions();\n\n switch (event.key) {\n case \"ArrowDown\": {\n event.preventDefault();\n\n if (!isOpen) {\n setHasInteracted(true);\n setIsOpen(true);\n onFocus?.();\n if (enabledOptions.length > 0) {\n setFocusedIndex(filteredOptions.indexOf(enabledOptions[0]));\n }\n return;\n }\n\n if (enabledOptions.length === 0) return;\n\n const currentOption = filteredOptions[focusedIndex];\n const currentEnabledIndex = enabledOptions.findIndex(\n (option) => option === currentOption,\n );\n const nextEnabledIndex =\n currentEnabledIndex === -1\n ? 0\n : (currentEnabledIndex + 1) % enabledOptions.length;\n setFocusedIndex(filteredOptions.indexOf(enabledOptions[nextEnabledIndex]));\n break;\n }\n\n case \"ArrowUp\": {\n event.preventDefault();\n\n if (!isOpen || enabledOptions.length === 0) return;\n\n const currentOption = filteredOptions[focusedIndex];\n const currentEnabledIndex = enabledOptions.findIndex(\n (option) => option === currentOption,\n );\n const previousEnabledIndex =\n currentEnabledIndex === -1\n ? enabledOptions.length - 1\n : (currentEnabledIndex - 1 + enabledOptions.length) %\n enabledOptions.length;\n setFocusedIndex(\n filteredOptions.indexOf(enabledOptions[previousEnabledIndex]),\n );\n break;\n }\n\n case \"Enter\": {\n event.preventDefault();\n\n if (\n isOpen &&\n focusedIndex >= 0 &&\n focusedIndex < filteredOptions.length\n ) {\n const focusedOption = filteredOptions[focusedIndex];\n const optionDisabled =\n focusedOption.disabled ||\n (isMaxReached && !value.includes(focusedOption.value));\n\n if (!optionDisabled) {\n handleToggleOption(focusedOption.value);\n }\n return;\n }\n\n if (!isOpen) {\n setHasInteracted(true);\n setIsOpen(true);\n onFocus?.();\n }\n break;\n }\n\n case \"Escape\": {\n if (!isOpen) return;\n event.preventDefault();\n setIsOpen(false);\n setSearchQuery(\"\");\n setFocusedIndex(-1);\n break;\n }\n\n case \" \": {\n if (\n isOpen &&\n focusedIndex >= 0 &&\n focusedIndex < filteredOptions.length\n ) {\n event.preventDefault();\n const focusedOption = filteredOptions[focusedIndex];\n const optionDisabled =\n focusedOption.disabled ||\n (isMaxReached && !value.includes(focusedOption.value));\n\n if (!optionDisabled) {\n handleToggleOption(focusedOption.value);\n }\n return;\n }\n\n if (!isOpen && !searchable) {\n event.preventDefault();\n setHasInteracted(true);\n setIsOpen(true);\n onFocus?.();\n }\n break;\n }\n }\n },\n [\n disabled,\n filteredOptions,\n focusedIndex,\n getEnabledOptions,\n handleToggleOption,\n isMaxReached,\n isOpen,\n onFocus,\n searchable,\n value,\n ],\n );\n\n const combinedClassName = cn(\"relative w-full\", className);\n\n return (\n <div className={combinedClassName}>\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 multiple\n >\n <option value=\"\">Select...</option>\n {allOptions.map((option) => (\n <option key={option.value} value={option.value}>\n {optionLabelText(option)}\n </option>\n ))}\n </select>\n\n <Popover open={isOpen} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <div\n ref={triggerRef}\n className={cn(\n \"flex min-h-9 w-full items-center justify-between rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm\",\n \"cursor-pointer transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\",\n !error && hasValue && \"ring-2 ring-ring\",\n disabled && \"cursor-not-allowed opacity-50 pointer-events-none\",\n error && \"border-destructive ring-1 ring-destructive\",\n )}\n onKeyDown={handleKeyDown}\n onBlur={handleTriggerBlur}\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 <div className=\"flex flex-1 items-center overflow-hidden\">\n {selectedOptions.length > 0 ? (\n <div className=\"flex flex-wrap gap-1\">\n {selectedOptions.map((option) => (\n <span\n key={option.value}\n className=\"inline-flex items-center gap-1 rounded px-2 py-0.5 text-xs font-medium\"\n >\n {renderValue ? (\n renderValue(option)\n ) : (\n <>\n <span className=\"max-w-40 overflow-hidden text-ellipsis whitespace-nowrap\">\n {option.label}\n </span>\n {!disabled && (\n <button\n type=\"button\"\n className=\"flex h-3.5 w-3.5 items-center justify-center rounded-sm border-none bg-transparent p-0 text-[0.625rem] transition-opacity hover:opacity-70\"\n onClick={(e) => handleRemoveValue(option.value, e)}\n aria-label={`Remove ${optionLabelText(option)}`}\n tabIndex={-1}\n >\n ✕\n </button>\n )}\n </>\n )}\n </span>\n ))}\n </div>\n ) : (\n <span className=\"relative\">{placeholder}</span>\n )}\n </div>\n\n <div className=\"ml-2 flex items-center gap-1\">\n {loading && <span className=\"text-xs\">⏳</span>}\n {clearable && value.length > 0 && !disabled && !loading && (\n <button\n type=\"button\"\n className=\"flex h-4 w-4 items-center justify-center rounded-sm border-none bg-transparent p-0 text-xs transition-opacity hover:opacity-70\"\n onClick={handleClearAll}\n aria-label=\"Clear all selections\"\n tabIndex={-1}\n >\n ✕\n </button>\n )}\n <span className=\"text-xs leading-none\" aria-hidden=\"true\">\n {isOpen ? \"▲\" : \"▼\"}\n </span>\n </div>\n </div>\n </PopoverTrigger>\n\n {isOpen && (\n <PopoverContent\n id={dropdownId}\n align=\"start\"\n sideOffset={4}\n className=\"w-full min-w-[var(--radix-popover-trigger-width)] p-0\"\n onOpenAutoFocus={(event) => {\n event.preventDefault();\n }}\n >\n <Command\n shouldFilter={false}\n className=\"max-h-80\"\n onKeyDown={handleKeyDown}\n >\n {searchable && (\n <CommandInput\n id={searchInputId}\n className={cn(INPUT_AUTOFILL_RESET_CLASSES)}\n placeholder=\"Search...\"\n value={searchQuery}\n onValueChange={(nextValue) => {\n setSearchQuery(nextValue);\n setFocusedIndex(0);\n }}\n aria-label=\"Search options\"\n />\n )}\n\n {showSelectAll && filteredOptions.length > 0 && (\n <div className=\"flex gap-2 border-b border-input p-2\">\n <button\n type=\"button\"\n className=\"flex-1 rounded border border-input bg-transparent px-3 py-1.5 text-xs font-medium transition-colors hover:bg-accent disabled:cursor-not-allowed disabled:opacity-50\"\n onClick={handleSelectAll}\n disabled={disabled}\n >\n Select All\n </button>\n {value.length > 0 && (\n <button\n type=\"button\"\n className=\"flex-1 rounded border border-input bg-transparent px-3 py-1.5 text-xs font-medium transition-colors hover:bg-accent disabled:cursor-not-allowed disabled:opacity-50\"\n onClick={handleClearAll}\n disabled={disabled}\n >\n Clear All\n </button>\n )}\n </div>\n )}\n\n {isMaxReached && (\n <div className=\"border-b border-destructive bg-destructive/80 px-2 py-1 text-xs font-medium text-destructive-foreground\">\n Maximum {maxSelections} selection{maxSelections !== 1 ? \"s\" : \"\"}{\" \"}\n reached\n </div>\n )}\n\n <CommandList role=\"listbox\" aria-multiselectable=\"true\">\n <CommandEmpty>No options found</CommandEmpty>\n\n {optionGroups.length > 0\n ? optionGroups.map((group, groupIndex) => {\n const groupOptions = group.options.filter((option) =>\n filteredOptions.includes(option),\n );\n if (groupOptions.length === 0) return null;\n\n return (\n <CommandGroup\n key={`${group.label}-${groupIndex}`}\n heading={group.label}\n >\n {groupOptions.map((option) => {\n const globalIndex = filteredOptions.indexOf(option);\n const isSelected = value.includes(option.value);\n const isFocused = globalIndex === focusedIndex;\n const optionDisabled =\n option.disabled || (isMaxReached && !isSelected);\n\n return (\n <div\n key={option.value}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={optionDisabled}\n onMouseEnter={() => {\n setFocusedIndex(globalIndex);\n }}\n onClick={() => {\n if (!optionDisabled) {\n handleToggleOption(option.value);\n }\n }}\n className={cn(\n \"relative flex w-full cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent\",\n isFocused && \"bg-accent\",\n isSelected && \"bg-accent font-medium\",\n optionDisabled &&\n \"pointer-events-none opacity-50\",\n )}\n >\n <span className=\"text-base leading-none\">\n {isSelected ? \"☑\" : \"☐\"}\n </span>\n <span className=\"flex-1\">\n {renderOption\n ? renderOption(option)\n : option.label}\n </span>\n </div>\n );\n })}\n </CommandGroup>\n );\n })\n : filteredOptions.map((option, index) => {\n const isSelected = value.includes(option.value);\n const isFocused = index === focusedIndex;\n const optionDisabled =\n option.disabled || (isMaxReached && !isSelected);\n\n return (\n <div\n key={option.value}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={optionDisabled}\n onMouseEnter={() => {\n setFocusedIndex(index);\n }}\n onClick={() => {\n if (!optionDisabled) {\n handleToggleOption(option.value);\n }\n }}\n className={cn(\n \"relative flex w-full cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent\",\n isFocused && \"bg-accent\",\n isSelected && \"bg-accent font-medium\",\n optionDisabled && \"pointer-events-none opacity-50\",\n )}\n >\n <span className=\"text-base leading-none\">\n {isSelected ? \"☑\" : \"☐\"}\n </span>\n <span className=\"flex-1\">\n {renderOption ? renderOption(option) : option.label}\n </span>\n </div>\n );\n })}\n </CommandList>\n </Command>\n </PopoverContent>\n )}\n </Popover>\n </div>\n );\n}\n\nMultiSelect.displayName = \"MultiSelect\";\n","import * as React from \"react\";\n\nconst useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? React.useLayoutEffect : React.useEffect;\n\nexport { useIsomorphicLayoutEffect };\n","import * as React from \"react\";\n\nimport { useIsomorphicLayoutEffect } from \"./use-isomorphic-layout-effect\";\n\nfunction useAsRef<T>(props: T) {\n const ref = React.useRef<T>(props);\n\n useIsomorphicLayoutEffect(() => {\n ref.current = props;\n });\n\n return ref;\n}\n\nexport { useAsRef };\n","import * as React from \"react\";\n\nfunction useLazyRef<T>(fn: () => T) {\n const ref = React.useRef<T | null>(null);\n\n if (ref.current === null) {\n ref.current = fn();\n }\n\n return ref as React.RefObject<T>;\n}\n\nexport { useLazyRef };\n","\"use client\";\n\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { useAsRef } from \"../../hooks/use-as-ref\";\nimport { useLazyRef } from \"../../hooks/use-lazy-ref\";\n\nconst ROOT_NAME = \"FileUpload\";\nconst DROPZONE_NAME = \"FileUploadDropzone\";\nconst TRIGGER_NAME = \"FileUploadTrigger\";\nconst LIST_NAME = \"FileUploadList\";\nconst ITEM_NAME = \"FileUploadItem\";\nconst ITEM_PREVIEW_NAME = \"FileUploadItemPreview\";\nconst ITEM_METADATA_NAME = \"FileUploadItemMetadata\";\nconst ITEM_PROGRESS_NAME = \"FileUploadItemProgress\";\nconst ITEM_DELETE_NAME = \"FileUploadItemDelete\";\nconst CLEAR_NAME = \"FileUploadClear\";\n\nfunction BaseFileIcon({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={cn(\"size-5\", className)}\n aria-hidden=\"true\"\n >\n {children}\n </svg>\n );\n}\n\nfunction FileVideoIcon() {\n return (\n <BaseFileIcon>\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <rect x=\"8\" y=\"12\" width=\"6\" height=\"4\" rx=\"1\" />\n <path d=\"m14 13 3-1.5v5L14 15\" />\n </BaseFileIcon>\n );\n}\n\nfunction FileAudioIcon() {\n return (\n <BaseFileIcon>\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <path d=\"M10 16a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3z\" />\n <path d=\"M13 17V11l3-1\" />\n </BaseFileIcon>\n );\n}\n\nfunction FileTextIcon() {\n return (\n <BaseFileIcon>\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"8\" y1=\"13\" x2=\"16\" y2=\"13\" />\n <line x1=\"8\" y1=\"17\" x2=\"14\" y2=\"17\" />\n </BaseFileIcon>\n );\n}\n\nfunction FileCodeIcon() {\n return (\n <BaseFileIcon>\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <polyline points=\"11 14 9 16 11 18\" />\n <polyline points=\"13 14 15 16 13 18\" />\n </BaseFileIcon>\n );\n}\n\nfunction FileArchiveIcon() {\n return (\n <BaseFileIcon>\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <rect x=\"9\" y=\"11\" width=\"6\" height=\"2\" />\n <path d=\"M12 13v5\" />\n </BaseFileIcon>\n );\n}\n\nfunction FileCogIcon() {\n return (\n <BaseFileIcon>\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <circle cx=\"12\" cy=\"16\" r=\"2\" />\n <path d=\"m12 12 .4.9m2.7 1.1 .9.4m-.9 2.7-.9.4m-2.7 1.1-.4.9m-2.3-.9-.4-.9m-2.7-1.1-.9-.4m.9-2.7.9-.4m2.7-1.1.4-.9\" />\n </BaseFileIcon>\n );\n}\n\nfunction FileIcon() {\n return (\n <BaseFileIcon>\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n </BaseFileIcon>\n );\n}\n\nfunction formatBytes(bytes: number) {\n if (bytes === 0) return \"0 B\";\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\n return `${(bytes / 1024 ** i).toFixed(i ? 1 : 0)} ${sizes[i]}`;\n}\n\nfunction getFileIcon(file: File) {\n const type = file.type;\n const extension = file.name.split(\".\").pop()?.toLowerCase() ?? \"\";\n\n if (type.startsWith(\"video/\")) {\n return <FileVideoIcon />;\n }\n\n if (type.startsWith(\"audio/\")) {\n return <FileAudioIcon />;\n }\n\n if (\n type.startsWith(\"text/\") ||\n [\"txt\", \"md\", \"rtf\", \"pdf\"].includes(extension)\n ) {\n return <FileTextIcon />;\n }\n\n if (\n [\n \"html\",\n \"css\",\n \"js\",\n \"jsx\",\n \"ts\",\n \"tsx\",\n \"json\",\n \"xml\",\n \"php\",\n \"py\",\n \"rb\",\n \"java\",\n \"c\",\n \"cpp\",\n \"cs\",\n ].includes(extension)\n ) {\n return <FileCodeIcon />;\n }\n\n if ([\"zip\", \"rar\", \"7z\", \"tar\", \"gz\", \"bz2\"].includes(extension)) {\n return <FileArchiveIcon />;\n }\n\n if (\n [\"exe\", \"msi\", \"app\", \"apk\", \"deb\", \"rpm\"].includes(extension) ||\n type.startsWith(\"application/\")\n ) {\n return <FileCogIcon />;\n }\n\n return <FileIcon />;\n}\n\ntype Direction = \"ltr\" | \"rtl\";\n\ninterface FileState {\n file: File;\n progress: number;\n error?: string;\n status: \"idle\" | \"uploading\" | \"error\" | \"success\";\n}\n\ninterface StoreState {\n files: Map<File, FileState>;\n dragOver: boolean;\n invalid: boolean;\n}\n\ntype StoreAction =\n | { type: \"ADD_FILES\"; files: File[] }\n | { type: \"SET_FILES\"; files: File[] }\n | { type: \"SET_PROGRESS\"; file: File; progress: number }\n | { type: \"SET_SUCCESS\"; file: File }\n | { type: \"SET_ERROR\"; file: File; error: string }\n | { type: \"REMOVE_FILE\"; file: File }\n | { type: \"SET_DRAG_OVER\"; dragOver: boolean }\n | { type: \"SET_INVALID\"; invalid: boolean }\n | { type: \"CLEAR\" };\n\ntype Store = {\n getState: () => StoreState;\n dispatch: (action: StoreAction) => void;\n subscribe: (listener: () => void) => () => void;\n};\n\nconst StoreContext = React.createContext<Store | null>(null);\n\nfunction useStoreContext(consumerName: string) {\n const context = React.useContext(StoreContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\nfunction useStore<T>(selector: (state: StoreState) => T): T {\n const store = useStoreContext(\"useStore\");\n\n const lastValueRef = useLazyRef<{ value: T; state: StoreState } | null>(\n () => null,\n );\n\n const getSnapshot = React.useCallback(() => {\n const state = store.getState();\n const prevValue = lastValueRef.current;\n\n if (prevValue && prevValue.state === state) {\n return prevValue.value;\n }\n\n const nextValue = selector(state);\n lastValueRef.current = { value: nextValue, state };\n return nextValue;\n }, [store, selector, lastValueRef]);\n\n return React.useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot);\n}\n\ninterface FileUploadContextValue {\n inputId: string;\n dropzoneId: string;\n listId: string;\n labelId: string;\n disabled: boolean;\n dir: Direction;\n inputRef: React.RefObject<HTMLInputElement | null>;\n urlCache: WeakMap<File, string>;\n}\n\nconst FileUploadContext = React.createContext<FileUploadContextValue | null>(\n null,\n);\n\nfunction useFileUploadContext(consumerName: string) {\n const context = React.useContext(FileUploadContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\ninterface FileUploadProps\n extends Omit<React.ComponentProps<\"div\">, \"defaultValue\" | \"onChange\"> {\n value?: File[];\n defaultValue?: File[];\n onValueChange?: (files: File[]) => void;\n onAccept?: (files: File[]) => void;\n onFileAccept?: (file: File) => void;\n onFileReject?: (file: File, message: string) => void;\n onFileValidate?: (file: File) => string | null | undefined;\n onUpload?: (\n files: File[],\n options: {\n onProgress: (file: File, progress: number) => void;\n onSuccess: (file: File) => void;\n onError: (file: File, error: Error) => void;\n },\n ) => Promise<void> | void;\n accept?: string;\n maxFiles?: number;\n maxSize?: number;\n dir?: Direction;\n label?: string;\n name?: string;\n asChild?: boolean;\n disabled?: boolean;\n invalid?: boolean;\n multiple?: boolean;\n required?: boolean;\n inputProps?: Omit<\n React.ComponentProps<\"input\">,\n | \"type\"\n | \"id\"\n | \"ref\"\n | \"tabIndex\"\n | \"accept\"\n | \"name\"\n | \"disabled\"\n | \"multiple\"\n | \"required\"\n | \"onChange\"\n >;\n}\n\nfunction FileUpload(props: FileUploadProps) {\n const {\n value,\n defaultValue,\n onValueChange,\n onAccept,\n onFileAccept,\n onFileReject,\n onFileValidate,\n onUpload,\n accept,\n maxFiles,\n maxSize,\n dir: dirProp,\n label,\n name,\n asChild,\n disabled = false,\n invalid = false,\n multiple = false,\n required = false,\n inputProps,\n children,\n className,\n ...rootProps\n } = props;\n\n const inputId = React.useId();\n const dropzoneId = React.useId();\n const listId = React.useId();\n const labelId = React.useId();\n\n const dir = useDirection(dirProp);\n const listeners = useLazyRef(() => new Set<() => void>()).current;\n const files = useLazyRef<Map<File, FileState>>(() => new Map()).current;\n const urlCache = useLazyRef(() => new WeakMap<File, string>()).current;\n const inputRef = React.useRef<HTMLInputElement>(null);\n const isControlled = value !== undefined;\n\n const propsRef = useAsRef({\n onValueChange,\n onAccept,\n onFileAccept,\n onFileReject,\n onFileValidate,\n onUpload,\n });\n\n const store = React.useMemo<Store>(() => {\n let state: StoreState = {\n files,\n dragOver: false,\n invalid: invalid,\n };\n\n function reducer(state: StoreState, action: StoreAction): StoreState {\n switch (action.type) {\n case \"ADD_FILES\": {\n for (const file of action.files) {\n files.set(file, {\n file,\n progress: 0,\n status: \"idle\",\n });\n }\n\n if (propsRef.current.onValueChange) {\n const fileList = Array.from(files.values()).map(\n (fileState) => fileState.file,\n );\n propsRef.current.onValueChange(fileList);\n }\n return { ...state, files };\n }\n\n case \"SET_FILES\": {\n const newFileSet = new Set(action.files);\n for (const existingFile of files.keys()) {\n if (!newFileSet.has(existingFile)) {\n files.delete(existingFile);\n }\n }\n\n for (const file of action.files) {\n const existingState = files.get(file);\n if (!existingState) {\n files.set(file, {\n file,\n progress: 0,\n status: \"idle\",\n });\n }\n }\n return { ...state, files };\n }\n\n case \"SET_PROGRESS\": {\n const fileState = files.get(action.file);\n if (fileState) {\n files.set(action.file, {\n ...fileState,\n progress: action.progress,\n status: \"uploading\",\n });\n }\n return { ...state, files };\n }\n\n case \"SET_SUCCESS\": {\n const fileState = files.get(action.file);\n if (fileState) {\n files.set(action.file, {\n ...fileState,\n progress: 100,\n status: \"success\",\n });\n }\n return { ...state, files };\n }\n\n case \"SET_ERROR\": {\n const fileState = files.get(action.file);\n if (fileState) {\n files.set(action.file, {\n ...fileState,\n error: action.error,\n status: \"error\",\n });\n }\n return { ...state, files };\n }\n\n case \"REMOVE_FILE\": {\n const cachedUrl = urlCache.get(action.file);\n if (cachedUrl) {\n URL.revokeObjectURL(cachedUrl);\n urlCache.delete(action.file);\n }\n\n files.delete(action.file);\n\n if (propsRef.current.onValueChange) {\n const fileList = Array.from(files.values()).map(\n (fileState) => fileState.file,\n );\n propsRef.current.onValueChange(fileList);\n }\n return { ...state, files };\n }\n\n case \"SET_DRAG_OVER\": {\n return { ...state, dragOver: action.dragOver };\n }\n\n case \"SET_INVALID\": {\n return { ...state, invalid: action.invalid };\n }\n\n case \"CLEAR\": {\n for (const file of files.keys()) {\n const cachedUrl = urlCache.get(file);\n if (cachedUrl) {\n URL.revokeObjectURL(cachedUrl);\n urlCache.delete(file);\n }\n }\n\n files.clear();\n if (propsRef.current.onValueChange) {\n propsRef.current.onValueChange([]);\n }\n return { ...state, files, invalid: false };\n }\n\n default:\n return state;\n }\n }\n\n return {\n getState: () => state,\n dispatch: (action) => {\n state = reducer(state, action);\n for (const listener of listeners) {\n listener();\n }\n },\n subscribe: (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n }, [listeners, files, invalid, propsRef, urlCache]);\n\n const acceptTypes = React.useMemo(\n () => accept?.split(\",\").map((t) => t.trim()) ?? null,\n [accept],\n );\n\n const onProgress = useLazyRef(() => {\n let frame = 0;\n return (file: File, progress: number) => {\n if (frame) return;\n frame = requestAnimationFrame(() => {\n frame = 0;\n store.dispatch({\n type: \"SET_PROGRESS\",\n file,\n progress: Math.min(Math.max(0, progress), 100),\n });\n });\n };\n }).current;\n\n React.useEffect(() => {\n if (isControlled) {\n store.dispatch({ type: \"SET_FILES\", files: value });\n } else if (\n defaultValue &&\n defaultValue.length > 0 &&\n !store.getState().files.size\n ) {\n store.dispatch({ type: \"SET_FILES\", files: defaultValue });\n }\n }, [value, defaultValue, isControlled, store]);\n\n React.useEffect(() => {\n return () => {\n for (const file of files.keys()) {\n const cachedUrl = urlCache.get(file);\n if (cachedUrl) {\n URL.revokeObjectURL(cachedUrl);\n }\n }\n };\n }, [files, urlCache]);\n\n const onFilesUpload = React.useCallback(\n async (files: File[]) => {\n try {\n for (const file of files) {\n store.dispatch({ type: \"SET_PROGRESS\", file, progress: 0 });\n }\n\n if (propsRef.current.onUpload) {\n await propsRef.current.onUpload(files, {\n onProgress,\n onSuccess: (file) => {\n store.dispatch({ type: \"SET_SUCCESS\", file });\n },\n onError: (file, error) => {\n store.dispatch({\n type: \"SET_ERROR\",\n file,\n error: error.message ?? \"Upload failed\",\n });\n },\n });\n } else {\n for (const file of files) {\n store.dispatch({ type: \"SET_SUCCESS\", file });\n }\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Upload failed\";\n for (const file of files) {\n store.dispatch({\n type: \"SET_ERROR\",\n file,\n error: errorMessage,\n });\n }\n }\n },\n [store, propsRef, onProgress],\n );\n\n const onFilesChange = React.useCallback(\n (originalFiles: File[]) => {\n if (disabled) return;\n\n let filesToProcess = [...originalFiles];\n let invalid = false;\n\n if (maxFiles) {\n const currentCount = store.getState().files.size;\n const remainingSlotCount = Math.max(0, maxFiles - currentCount);\n\n if (remainingSlotCount < filesToProcess.length) {\n const rejectedFiles = filesToProcess.slice(remainingSlotCount);\n invalid = true;\n\n filesToProcess = filesToProcess.slice(0, remainingSlotCount);\n\n for (const file of rejectedFiles) {\n let rejectionMessage = `Maximum ${maxFiles} files allowed`;\n\n if (propsRef.current.onFileValidate) {\n const validationMessage = propsRef.current.onFileValidate(file);\n if (validationMessage) {\n rejectionMessage = validationMessage;\n }\n }\n\n propsRef.current.onFileReject?.(file, rejectionMessage);\n }\n }\n }\n\n const acceptedFiles: File[] = [];\n const rejectedFiles: { file: File; message: string }[] = [];\n\n for (const file of filesToProcess) {\n let rejected = false;\n let rejectionMessage = \"\";\n\n if (propsRef.current.onFileValidate) {\n const validationMessage = propsRef.current.onFileValidate(file);\n if (validationMessage) {\n rejectionMessage = validationMessage;\n propsRef.current.onFileReject?.(file, rejectionMessage);\n rejected = true;\n invalid = true;\n continue;\n }\n }\n\n if (acceptTypes) {\n const fileType = file.type;\n const fileExtension = `.${file.name.split(\".\").pop()}`;\n\n if (\n !acceptTypes.some(\n (type) =>\n type === fileType ||\n type === fileExtension ||\n (type.includes(\"/*\") &&\n fileType.startsWith(type.replace(\"/*\", \"/\"))),\n )\n ) {\n rejectionMessage = \"File type not accepted\";\n propsRef.current.onFileReject?.(file, rejectionMessage);\n rejected = true;\n invalid = true;\n }\n }\n\n if (maxSize && file.size > maxSize) {\n rejectionMessage = \"File too large\";\n propsRef.current.onFileReject?.(file, rejectionMessage);\n rejected = true;\n invalid = true;\n }\n\n if (!rejected) {\n acceptedFiles.push(file);\n } else {\n rejectedFiles.push({ file, message: rejectionMessage });\n }\n }\n\n if (invalid) {\n store.dispatch({ type: \"SET_INVALID\", invalid });\n setTimeout(() => {\n store.dispatch({ type: \"SET_INVALID\", invalid: false });\n }, 2000);\n }\n\n if (acceptedFiles.length > 0) {\n store.dispatch({ type: \"ADD_FILES\", files: acceptedFiles });\n\n if (isControlled && propsRef.current.onValueChange) {\n const currentFiles = Array.from(store.getState().files.values()).map(\n (f) => f.file,\n );\n propsRef.current.onValueChange([...currentFiles]);\n }\n\n if (propsRef.current.onAccept) {\n propsRef.current.onAccept(acceptedFiles);\n }\n\n for (const file of acceptedFiles) {\n propsRef.current.onFileAccept?.(file);\n }\n\n if (propsRef.current.onUpload) {\n requestAnimationFrame(() => {\n onFilesUpload(acceptedFiles);\n });\n }\n }\n },\n [\n store,\n isControlled,\n propsRef,\n onFilesUpload,\n maxFiles,\n acceptTypes,\n maxSize,\n disabled,\n ],\n );\n\n const onInputChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(event.target.files ?? []);\n onFilesChange(files);\n event.target.value = \"\";\n },\n [onFilesChange],\n );\n\n const contextValue = React.useMemo<FileUploadContextValue>(\n () => ({\n dropzoneId,\n inputId,\n listId,\n labelId,\n dir,\n disabled,\n inputRef,\n urlCache,\n }),\n [dropzoneId, inputId, listId, labelId, dir, disabled, urlCache],\n );\n\n const RootPrimitive = asChild ? Slot : \"div\";\n const inputAriaDescribedBy = [\n contextValue.dropzoneId,\n inputProps?.[\"aria-describedby\"],\n ]\n .filter(Boolean)\n .join(\" \")\n .trim();\n\n return (\n <StoreContext.Provider value={store}>\n <FileUploadContext.Provider value={contextValue}>\n <RootPrimitive\n data-disabled={disabled ? \"\" : undefined}\n data-slot=\"file-upload\"\n dir={dir}\n {...rootProps}\n className={cn(\"relative flex flex-col gap-2\", className)}\n >\n {children}\n <input\n type=\"file\"\n id={inputId}\n aria-labelledby={\n inputProps?.[\"aria-labelledby\"]\n ? `${labelId} ${inputProps[\"aria-labelledby\"]}`\n : labelId\n }\n aria-describedby={inputAriaDescribedBy || undefined}\n ref={inputRef}\n tabIndex={-1}\n accept={accept}\n name={name}\n className=\"sr-only\"\n disabled={disabled}\n multiple={multiple}\n required={required}\n onChange={onInputChange}\n {...inputProps}\n />\n <div id={labelId} className=\"sr-only\">\n {label ?? \"File upload\"}\n </div>\n </RootPrimitive>\n </FileUploadContext.Provider>\n </StoreContext.Provider>\n );\n}\n\ninterface FileUploadDropzoneProps extends React.ComponentProps<\"div\"> {\n asChild?: boolean;\n}\n\nfunction FileUploadDropzone(props: FileUploadDropzoneProps) {\n const {\n asChild,\n className,\n onClick: onClickProp,\n onDragOver: onDragOverProp,\n onDragEnter: onDragEnterProp,\n onDragLeave: onDragLeaveProp,\n onDrop: onDropProp,\n onPaste: onPasteProp,\n onKeyDown: onKeyDownProp,\n ...dropzoneProps\n } = props;\n\n const context = useFileUploadContext(DROPZONE_NAME);\n const store = useStoreContext(DROPZONE_NAME);\n const dragOver = useStore((state) => state.dragOver);\n const invalid = useStore((state) => state.invalid);\n\n const propsRef = useAsRef({\n onClick: onClickProp,\n onDragOver: onDragOverProp,\n onDragEnter: onDragEnterProp,\n onDragLeave: onDragLeaveProp,\n onDrop: onDropProp,\n onPaste: onPasteProp,\n onKeyDown: onKeyDownProp,\n });\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n propsRef.current.onClick?.(event);\n\n if (event.defaultPrevented) return;\n\n const target = event.target;\n\n const isFromTrigger =\n target instanceof HTMLElement &&\n target.closest('[data-slot=\"file-upload-trigger\"]');\n\n if (!isFromTrigger) {\n context.inputRef.current?.click();\n }\n },\n [context.inputRef, propsRef],\n );\n\n const onDragOver = React.useCallback(\n (event: React.DragEvent<HTMLDivElement>) => {\n propsRef.current.onDragOver?.(event);\n\n if (event.defaultPrevented) return;\n\n event.preventDefault();\n store.dispatch({ type: \"SET_DRAG_OVER\", dragOver: true });\n },\n [store, propsRef],\n );\n\n const onDragEnter = React.useCallback(\n (event: React.DragEvent<HTMLDivElement>) => {\n propsRef.current.onDragEnter?.(event);\n\n if (event.defaultPrevented) return;\n\n event.preventDefault();\n store.dispatch({ type: \"SET_DRAG_OVER\", dragOver: true });\n },\n [store, propsRef],\n );\n\n const onDragLeave = React.useCallback(\n (event: React.DragEvent<HTMLDivElement>) => {\n propsRef.current.onDragLeave?.(event);\n\n if (event.defaultPrevented) return;\n\n const relatedTarget = event.relatedTarget;\n if (\n relatedTarget &&\n relatedTarget instanceof Node &&\n event.currentTarget.contains(relatedTarget)\n ) {\n return;\n }\n\n event.preventDefault();\n store.dispatch({ type: \"SET_DRAG_OVER\", dragOver: false });\n },\n [store, propsRef],\n );\n\n const onDrop = React.useCallback(\n (event: React.DragEvent<HTMLDivElement>) => {\n propsRef.current.onDrop?.(event);\n\n if (event.defaultPrevented) return;\n\n if (context.disabled) return;\n\n event.preventDefault();\n store.dispatch({ type: \"SET_DRAG_OVER\", dragOver: false });\n\n const files = Array.from(event.dataTransfer.files);\n const inputElement = context.inputRef.current;\n if (!inputElement) return;\n if (typeof DataTransfer === \"undefined\") return;\n\n const dataTransfer = new DataTransfer();\n for (const file of files) {\n dataTransfer.items.add(file);\n }\n\n inputElement.files = dataTransfer.files;\n inputElement.dispatchEvent(new Event(\"change\", { bubbles: true }));\n },\n [store, context.inputRef, propsRef],\n );\n\n const onPaste = React.useCallback(\n (event: React.ClipboardEvent<HTMLDivElement>) => {\n propsRef.current.onPaste?.(event);\n\n if (event.defaultPrevented) return;\n\n if (context.disabled) return;\n\n event.preventDefault();\n store.dispatch({ type: \"SET_DRAG_OVER\", dragOver: false });\n\n const items = event.clipboardData?.items;\n if (!items) return;\n\n const files: File[] = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item?.kind === \"file\") {\n const file = item.getAsFile();\n if (file) {\n files.push(file);\n }\n }\n }\n\n if (files.length === 0) return;\n\n const inputElement = context.inputRef.current;\n if (!inputElement) return;\n if (typeof DataTransfer === \"undefined\") return;\n\n const dataTransfer = new DataTransfer();\n for (const file of files) {\n dataTransfer.items.add(file);\n }\n\n inputElement.files = dataTransfer.files;\n inputElement.dispatchEvent(new Event(\"change\", { bubbles: true }));\n },\n [store, context.inputRef, propsRef],\n );\n\n const onKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n propsRef.current.onKeyDown?.(event);\n\n if (\n !event.defaultPrevented &&\n (event.key === \"Enter\" || event.key === \" \")\n ) {\n event.preventDefault();\n context.inputRef.current?.click();\n }\n },\n [context.inputRef, propsRef],\n );\n\n const DropzonePrimitive = asChild ? Slot : \"div\";\n\n return (\n <DropzonePrimitive\n role=\"region\"\n id={context.dropzoneId}\n aria-controls={`${context.inputId} ${context.listId}`}\n aria-disabled={context.disabled}\n aria-invalid={invalid}\n data-disabled={context.disabled ? \"\" : undefined}\n data-dragging={dragOver ? \"\" : undefined}\n data-invalid={invalid ? \"\" : undefined}\n data-slot=\"file-upload-dropzone\"\n dir={context.dir}\n tabIndex={context.disabled ? -1 : 0}\n {...dropzoneProps}\n className={cn(\n \"relative flex select-none flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed p-6 outline-none transition-colors hover:bg-accent/30 focus-visible:border-ring/50 data-disabled:pointer-events-none data-dragging:border-primary/30 data-dragging:bg-accent/30 data-invalid:ring-destructive/20\",\n className,\n )}\n onClick={onClick}\n onDragEnter={onDragEnter}\n onDragLeave={onDragLeave}\n onDragOver={onDragOver}\n onDrop={onDrop}\n onKeyDown={onKeyDown}\n onPaste={onPaste}\n />\n );\n}\n\ninterface FileUploadTriggerProps extends React.ComponentProps<\"button\"> {\n asChild?: boolean;\n}\n\nfunction FileUploadTrigger(props: FileUploadTriggerProps) {\n const { asChild, onClick: onClickProp, ...triggerProps } = props;\n\n const context = useFileUploadContext(TRIGGER_NAME);\n\n const propsRef = useAsRef({\n onClick: onClickProp,\n });\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n propsRef.current.onClick?.(event);\n\n if (event.defaultPrevented) return;\n\n context.inputRef.current?.click();\n },\n [context.inputRef, propsRef],\n );\n\n const TriggerPrimitive = asChild ? Slot : \"button\";\n\n return (\n <TriggerPrimitive\n type=\"button\"\n aria-controls={context.inputId}\n data-disabled={context.disabled ? \"\" : undefined}\n data-slot=\"file-upload-trigger\"\n {...triggerProps}\n disabled={context.disabled}\n onClick={onClick}\n />\n );\n}\n\ninterface FileUploadListProps extends React.ComponentProps<\"div\"> {\n orientation?: \"horizontal\" | \"vertical\";\n asChild?: boolean;\n forceMount?: boolean;\n}\n\nfunction FileUploadList(props: FileUploadListProps) {\n const {\n className,\n orientation = \"vertical\",\n asChild,\n forceMount,\n ...listProps\n } = props;\n\n const context = useFileUploadContext(LIST_NAME);\n const fileCount = useStore((state) => state.files.size);\n const shouldRender = forceMount || fileCount > 0;\n\n if (!shouldRender) return null;\n\n const ListPrimitive = asChild ? Slot : \"div\";\n\n return (\n <ListPrimitive\n role=\"list\"\n id={context.listId}\n aria-orientation={orientation}\n data-orientation={orientation}\n data-slot=\"file-upload-list\"\n data-state={shouldRender ? \"active\" : \"inactive\"}\n dir={context.dir}\n {...listProps}\n className={cn(\n \"data-[state=inactive]:fade-out-0 data-[state=active]:fade-in-0 data-[state=inactive]:slide-out-to-top-2 data-[state=active]:slide-in-from-top-2 flex flex-col gap-2 data-[state=active]:animate-in data-[state=inactive]:animate-out\",\n orientation === \"horizontal\" && \"flex-row overflow-x-auto p-1.5\",\n className,\n )}\n />\n );\n}\n\ninterface FileUploadItemContextValue {\n id: string;\n fileState: FileState | undefined;\n nameId: string;\n sizeId: string;\n statusId: string;\n messageId: string;\n}\n\nconst FileUploadItemContext =\n React.createContext<FileUploadItemContextValue | null>(null);\n\nfunction useFileUploadItemContext(consumerName: string) {\n const context = React.useContext(FileUploadItemContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ITEM_NAME}\\``);\n }\n return context;\n}\n\ninterface FileUploadItemProps extends React.ComponentProps<\"div\"> {\n value: File;\n asChild?: boolean;\n}\n\nfunction FileUploadItem(props: FileUploadItemProps) {\n const { value, asChild, className, ...itemProps } = props;\n\n const id = React.useId();\n const statusId = `${id}-status`;\n const nameId = `${id}-name`;\n const sizeId = `${id}-size`;\n const messageId = `${id}-message`;\n\n const context = useFileUploadContext(ITEM_NAME);\n const fileState = useStore((state) => state.files.get(value));\n const fileCount = useStore((state) => state.files.size);\n const fileIndex = useStore((state) => {\n const files = Array.from(state.files.keys());\n return files.indexOf(value) + 1;\n });\n\n const itemContext = React.useMemo(\n () => ({\n id,\n fileState,\n nameId,\n sizeId,\n statusId,\n messageId,\n }),\n [id, fileState, statusId, nameId, sizeId, messageId],\n );\n\n if (!fileState) return null;\n\n const statusText = fileState.error\n ? `Error: ${fileState.error}`\n : fileState.status === \"uploading\"\n ? `Uploading: ${fileState.progress}% complete`\n : fileState.status === \"success\"\n ? \"Upload complete\"\n : \"Ready to upload\";\n\n const ItemPrimitive = asChild ? Slot : \"div\";\n\n return (\n <FileUploadItemContext.Provider value={itemContext}>\n <ItemPrimitive\n role=\"listitem\"\n id={id}\n aria-setsize={fileCount}\n aria-posinset={fileIndex}\n aria-describedby={`${nameId} ${sizeId} ${statusId} ${\n fileState.error ? messageId : \"\"\n }`}\n aria-labelledby={nameId}\n data-slot=\"file-upload-item\"\n dir={context.dir}\n {...itemProps}\n className={cn(\n \"relative flex items-center gap-2.5 rounded-md border p-3\",\n className,\n )}\n >\n {props.children}\n <span id={statusId} className=\"sr-only\">\n {statusText}\n </span>\n </ItemPrimitive>\n </FileUploadItemContext.Provider>\n );\n}\n\ninterface FileUploadItemPreviewProps extends React.ComponentProps<\"div\"> {\n render?: (file: File, fallback: () => React.ReactNode) => React.ReactNode;\n asChild?: boolean;\n}\n\nfunction FileUploadItemPreview(props: FileUploadItemPreviewProps) {\n const { render, asChild, children, className, ...previewProps } = props;\n\n const itemContext = useFileUploadItemContext(ITEM_PREVIEW_NAME);\n const context = useFileUploadContext(ITEM_PREVIEW_NAME);\n\n const getDefaultRender = React.useCallback(\n (file: File) => {\n if (itemContext.fileState?.file.type.startsWith(\"image/\")) {\n let url = context.urlCache.get(file);\n if (!url) {\n url = URL.createObjectURL(file);\n context.urlCache.set(file, url);\n }\n\n return (\n // biome-ignore lint/performance/noImgElement: dynamic file URLs from user uploads don't work well with Next.js Image optimization\n <img src={url} alt={file.name} className=\"size-full object-cover\" />\n );\n }\n\n return getFileIcon(file);\n },\n [itemContext.fileState?.file.type, context.urlCache],\n );\n\n const onPreviewRender = React.useCallback(\n (file: File) => {\n if (render) {\n return render(file, () => getDefaultRender(file));\n }\n\n return getDefaultRender(file);\n },\n [render, getDefaultRender],\n );\n\n if (!itemContext.fileState) return null;\n\n const ItemPreviewPrimitive = asChild ? Slot : \"div\";\n\n return (\n <ItemPreviewPrimitive\n aria-labelledby={itemContext.nameId}\n data-slot=\"file-upload-preview\"\n {...previewProps}\n className={cn(\n \"relative flex size-10 shrink-0 items-center justify-center overflow-hidden rounded border bg-accent/50 [&>svg]:size-10\",\n className,\n )}\n >\n {onPreviewRender(itemContext.fileState.file)}\n {children}\n </ItemPreviewPrimitive>\n );\n}\n\ninterface FileUploadItemMetadataProps extends React.ComponentProps<\"div\"> {\n asChild?: boolean;\n size?: \"default\" | \"sm\";\n}\n\nfunction FileUploadItemMetadata(props: FileUploadItemMetadataProps) {\n const {\n asChild,\n size = \"default\",\n children,\n className,\n ...metadataProps\n } = props;\n\n const context = useFileUploadContext(ITEM_METADATA_NAME);\n const itemContext = useFileUploadItemContext(ITEM_METADATA_NAME);\n\n if (!itemContext.fileState) return null;\n\n const ItemMetadataPrimitive = asChild ? Slot : \"div\";\n\n return (\n <ItemMetadataPrimitive\n data-slot=\"file-upload-metadata\"\n dir={context.dir}\n {...metadataProps}\n className={cn(\"flex min-w-0 flex-1 flex-col\", className)}\n >\n {children ?? (\n <>\n <span\n id={itemContext.nameId}\n className={cn(\n \"truncate font-medium text-sm\",\n size === \"sm\" && \"font-normal text-[13px] leading-snug\",\n )}\n >\n {itemContext.fileState.file.name}\n </span>\n <span\n id={itemContext.sizeId}\n className={cn(\n \"truncate text-xs opacity-70\",\n size === \"sm\" && \"text-[11px] leading-snug\",\n )}\n >\n {formatBytes(itemContext.fileState.file.size)}\n </span>\n {itemContext.fileState.error && (\n <span\n id={itemContext.messageId}\n className=\"text-destructive text-xs\"\n >\n {itemContext.fileState.error}\n </span>\n )}\n </>\n )}\n </ItemMetadataPrimitive>\n );\n}\ninterface FileUploadItemProgressProps extends React.ComponentProps<\"div\"> {\n variant?: \"linear\" | \"circular\" | \"fill\";\n size?: number;\n asChild?: boolean;\n forceMount?: boolean;\n}\n\nfunction FileUploadItemProgress(props: FileUploadItemProgressProps) {\n const {\n variant = \"linear\",\n size = 40,\n asChild,\n forceMount,\n className,\n ...progressProps\n } = props;\n\n const itemContext = useFileUploadItemContext(ITEM_PROGRESS_NAME);\n\n if (!itemContext.fileState) return null;\n\n const shouldRender = forceMount || itemContext.fileState.progress !== 100;\n\n if (!shouldRender) return null;\n\n const ItemProgressPrimitive = asChild ? Slot : \"div\";\n\n switch (variant) {\n case \"circular\": {\n const circumference = 2 * Math.PI * ((size - 4) / 2);\n const strokeDashoffset =\n circumference - (itemContext.fileState.progress / 100) * circumference;\n\n return (\n <ItemProgressPrimitive\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={itemContext.fileState.progress}\n aria-valuetext={`${itemContext.fileState.progress}%`}\n aria-labelledby={itemContext.nameId}\n data-slot=\"file-upload-progress\"\n {...progressProps}\n className={cn(\n \"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2\",\n className,\n )}\n >\n <svg\n className=\"-rotate-90 transform\"\n width={size}\n height={size}\n viewBox={`0 0 ${size} ${size}`}\n fill=\"none\"\n stroke=\"currentColor\"\n >\n <circle\n className=\"text-primary/20\"\n strokeWidth=\"2\"\n cx={size / 2}\n cy={size / 2}\n r={(size - 4) / 2}\n />\n <circle\n className=\"text-primary transition-[stroke-dashoffset] duration-300 ease-linear\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={strokeDashoffset}\n cx={size / 2}\n cy={size / 2}\n r={(size - 4) / 2}\n />\n </svg>\n </ItemProgressPrimitive>\n );\n }\n\n case \"fill\": {\n const progressPercentage = itemContext.fileState.progress;\n const topInset = 100 - progressPercentage;\n\n return (\n <ItemProgressPrimitive\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={progressPercentage}\n aria-valuetext={`${progressPercentage}%`}\n aria-labelledby={itemContext.nameId}\n data-slot=\"file-upload-progress\"\n {...progressProps}\n className={cn(\n \"absolute inset-0 bg-primary/50 transition-[clip-path] duration-300 ease-linear\",\n className,\n )}\n style={{\n clipPath: `inset(${topInset}% 0% 0% 0%)`,\n }}\n />\n );\n }\n\n default:\n return (\n <ItemProgressPrimitive\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={itemContext.fileState.progress}\n aria-valuetext={`${itemContext.fileState.progress}%`}\n aria-labelledby={itemContext.nameId}\n data-slot=\"file-upload-progress\"\n {...progressProps}\n className={cn(\n \"relative h-1.5 w-full overflow-hidden rounded-full bg-primary/20\",\n className,\n )}\n >\n <div\n className=\"h-full w-full flex-1 bg-primary transition-transform duration-300 ease-linear\"\n style={{\n transform: `translateX(-${100 - itemContext.fileState.progress}%)`,\n }}\n />\n </ItemProgressPrimitive>\n );\n }\n}\n\ninterface FileUploadItemDeleteProps extends React.ComponentProps<\"button\"> {\n asChild?: boolean;\n}\n\nfunction FileUploadItemDelete(props: FileUploadItemDeleteProps) {\n const { asChild, onClick: onClickProp, ...deleteProps } = props;\n\n const store = useStoreContext(ITEM_DELETE_NAME);\n const itemContext = useFileUploadItemContext(ITEM_DELETE_NAME);\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClickProp?.(event);\n\n if (!itemContext.fileState || event.defaultPrevented) return;\n\n store.dispatch({\n type: \"REMOVE_FILE\",\n file: itemContext.fileState.file,\n });\n },\n [store, itemContext.fileState, onClickProp],\n );\n\n if (!itemContext.fileState) return null;\n\n const ItemDeletePrimitive = asChild ? Slot : \"button\";\n\n return (\n <ItemDeletePrimitive\n type=\"button\"\n aria-controls={itemContext.id}\n aria-describedby={itemContext.nameId}\n data-slot=\"file-upload-item-delete\"\n {...deleteProps}\n onClick={onClick}\n />\n );\n}\n\ninterface FileUploadClearProps extends React.ComponentProps<\"button\"> {\n forceMount?: boolean;\n asChild?: boolean;\n}\n\nfunction FileUploadClear(props: FileUploadClearProps) {\n const {\n asChild,\n forceMount,\n disabled,\n onClick: onClickProp,\n ...clearProps\n } = props;\n\n const context = useFileUploadContext(CLEAR_NAME);\n const store = useStoreContext(CLEAR_NAME);\n const fileCount = useStore((state) => state.files.size);\n\n const isDisabled = disabled || context.disabled;\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClickProp?.(event);\n\n if (event.defaultPrevented) return;\n\n store.dispatch({ type: \"CLEAR\" });\n },\n [store, onClickProp],\n );\n\n const shouldRender = forceMount || fileCount > 0;\n\n if (!shouldRender) return null;\n\n const ClearPrimitive = asChild ? Slot : \"button\";\n\n return (\n <ClearPrimitive\n type=\"button\"\n aria-controls={context.listId}\n data-slot=\"file-upload-clear\"\n data-disabled={isDisabled ? \"\" : undefined}\n {...clearProps}\n disabled={isDisabled}\n onClick={onClick}\n />\n );\n}\n\nexport {\n FileUpload,\n FileUploadDropzone,\n FileUploadTrigger,\n FileUploadList,\n FileUploadItem,\n FileUploadItemPreview,\n FileUploadItemMetadata,\n FileUploadItemProgress,\n FileUploadItemDelete,\n FileUploadClear,\n //\n useStore as useFileUpload,\n //\n type FileUploadProps,\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\nimport {\n FileUpload,\n FileUploadDropzone,\n FileUploadItem,\n FileUploadItemDelete,\n FileUploadItemMetadata,\n FileUploadItemPreview,\n FileUploadList,\n} from \"../components/ui/file-upload\";\nimport { Button } from \"../components/ui/button\";\nimport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"../components/ui/dialog\";\nimport { cn } from \"../lib/utils\";\n\n/**\n * File validation error details\n */\nexport interface FileValidationError {\n file: File;\n error: \"type\" | \"size\" | \"count\";\n message: string;\n}\n\n/**\n * Upload progress tracking per file\n */\nexport interface FileUploadProgress {\n [fileName: string]: number; // 0-100\n}\n\n/**\n * Crop area coordinates\n */\nexport interface CropArea {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/**\n * FileInput component props\n */\nexport interface FileInputProps extends Omit<\n InputProps<File[]>,\n \"value\" | \"onChange\"\n> {\n /**\n * Current file value(s)\n */\n value?: File[];\n\n /**\n * Change handler receives array of files\n */\n onChange: (files: File[]) => void;\n\n /**\n * Accepted file types (MIME types or extensions)\n * @example \".pdf,.doc,.docx\"\n * @example \"image/*,application/pdf\"\n */\n accept?: string;\n\n /**\n * Maximum file size in bytes\n * @default 5MB (5 * 1024 * 1024)\n */\n maxSize?: number;\n\n /**\n * Maximum number of files\n * @default 1\n */\n maxFiles?: number;\n\n /**\n * Allow multiple file selection\n * @default false\n */\n multiple?: boolean;\n\n /**\n * Show file preview thumbnails\n * @default true\n */\n showPreview?: boolean;\n\n /**\n * Show upload progress indicators\n * @default true\n */\n showProgress?: boolean;\n\n /**\n * Upload progress per file (0-100)\n * Consumer should update this during upload\n */\n uploadProgress?: FileUploadProgress;\n\n /**\n * Enable image cropping for image files\n * @default false\n */\n enableCropping?: boolean;\n\n /**\n * Crop aspect ratio (width / height)\n * @default Free form (no constraint)\n * @example 16/9, 1, 4/3\n */\n cropAspectRatio?: number;\n\n /**\n * Crop complete handler - receives cropped blob and original file\n */\n onCropComplete?: (croppedBlob: Blob, originalFile: File) => void;\n\n /**\n * Validation error handler\n */\n onValidationError?: (errors: FileValidationError[]) => void;\n\n /**\n * File removed handler\n */\n onFileRemove?: (file: File, index: number) => void;\n}\n\n/**\n * FileInput component for file selection with validation, progress tracking, and image cropping\n *\n * Built on the DiceUI-style FileUpload primitive with form-specific behavior:\n * - Rails/token upload workflow compatibility\n * - External upload progress support\n * - Validation + accessibility wiring\n * - Optional image cropping modal\n */\nexport function FileInput({\n name,\n value = [],\n onChange,\n onBlur,\n placeholder = \"Choose file...\",\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n accept,\n maxSize = 5 * 1024 * 1024, // 5MB default\n maxFiles = 1,\n multiple = false,\n showPreview = true,\n showProgress = true,\n uploadProgress = {},\n enableCropping = false,\n cropAspectRatio,\n onCropComplete,\n onValidationError,\n onFileRemove,\n ...props\n}: FileInputProps) {\n const normalizedValue = React.useMemo(() => {\n const safeValue = Array.isArray(value) ? value : [];\n return multiple ? safeValue : safeValue.slice(0, 1);\n }, [multiple, value]);\n\n const [cropperOpen, setCropperOpen] = React.useState(false);\n const [imageToCrop, setImageToCrop] = React.useState<{\n file: File;\n url: string;\n } | null>(null);\n const [crop, setCrop] = React.useState({ x: 0, y: 0 });\n const [zoom, setZoom] = React.useState(1);\n const [croppedAreaPixels, setCroppedAreaPixels] =\n React.useState<CropArea | null>(null);\n\n /**\n * Validate file against constraints\n */\n const validateFile = React.useCallback(\n (file: File): FileValidationError | null => {\n if (accept) {\n const acceptedTypes = accept.split(\",\").map((type) => type.trim());\n const isValidType = acceptedTypes.some((type) => {\n if (type.startsWith(\".\")) {\n return file.name.toLowerCase().endsWith(type.toLowerCase());\n }\n\n if (type.endsWith(\"/*\")) {\n const baseType = type.split(\"/\")[0];\n return file.type.startsWith(`${baseType}/`);\n }\n\n return file.type === type;\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 if (file.size > maxSize) {\n const maxSizeMB = (maxSize / (1024 * 1024)).toFixed(2);\n const fileSizeMB = (file.size / (1024 * 1024)).toFixed(2);\n\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 const mapRejectedFileError = React.useCallback(\n (file: File, message: string): FileValidationError => {\n const normalizedMessage = message.toLowerCase();\n\n if (\n normalizedMessage.includes(\"maximum\") &&\n normalizedMessage.includes(\"files\")\n ) {\n return { file, error: \"count\", message };\n }\n\n if (\n normalizedMessage.includes(\"size\") ||\n normalizedMessage.includes(\"large\")\n ) {\n return { file, error: \"size\", message };\n }\n\n if (\n normalizedMessage.includes(\"type\") ||\n normalizedMessage.includes(\"accept\")\n ) {\n return { file, error: \"type\", message };\n }\n\n if (file.size > maxSize) {\n return { file, error: \"size\", message };\n }\n\n return { file, error: \"type\", message };\n },\n [maxSize],\n );\n\n const handleFileValidate = React.useCallback(\n (file: File) => {\n const validationError = validateFile(file);\n return validationError?.message ?? null;\n },\n [validateFile],\n );\n\n const handleFileReject = React.useCallback(\n (file: File, message: string) => {\n const validationError = mapRejectedFileError(file, message);\n onValidationError?.([validationError]);\n },\n [mapRejectedFileError, onValidationError],\n );\n\n const handleBlur = React.useCallback(() => {\n onBlur?.();\n }, [onBlur]);\n\n const fileIdentity = React.useCallback((file: File) => {\n return `${file.name}-${file.size}-${file.lastModified}`;\n }, []);\n\n const handleValueChange = React.useCallback(\n (incomingFiles: File[]) => {\n const nextFiles = multiple ? incomingFiles : incomingFiles.slice(-1);\n\n if (onFileRemove && nextFiles.length < normalizedValue.length) {\n const nextFileIds = new Set(nextFiles.map((file) => fileIdentity(file)));\n normalizedValue.forEach((file, index) => {\n if (!nextFileIds.has(fileIdentity(file))) {\n onFileRemove(file, index);\n }\n });\n }\n\n if (enableCropping && !multiple) {\n const nextImageFile = nextFiles[0];\n const previousFile = normalizedValue[0];\n const isNewSingleImage = Boolean(\n nextImageFile &&\n nextImageFile.type.startsWith(\"image/\") &&\n nextImageFile !== previousFile,\n );\n\n if (isNewSingleImage) {\n const previewUrl = URL.createObjectURL(nextImageFile!);\n setImageToCrop({ file: nextImageFile!, url: previewUrl });\n setCropperOpen(true);\n return;\n }\n }\n\n onChange(nextFiles);\n },\n [\n enableCropping,\n maxFiles,\n multiple,\n normalizedValue,\n onChange,\n onFileRemove,\n fileIdentity,\n ],\n );\n\n /**\n * Create cropped image from canvas\n */\n const createCroppedImage = React.useCallback(\n async (imageUrl: string, cropArea: CropArea): Promise<Blob> => {\n return new Promise((resolve, reject) => {\n const image = new Image();\n image.onload = () => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n reject(new Error(\"Failed to get canvas context\"));\n return;\n }\n\n canvas.width = cropArea.width;\n canvas.height = cropArea.height;\n\n ctx.drawImage(\n image,\n cropArea.x,\n cropArea.y,\n cropArea.width,\n cropArea.height,\n 0,\n 0,\n cropArea.width,\n cropArea.height,\n );\n\n canvas.toBlob(\n (blob) => {\n if (blob) {\n resolve(blob);\n } else {\n reject(new Error(\"Failed to create blob from canvas\"));\n }\n },\n \"image/jpeg\",\n 0.95,\n );\n };\n\n image.onerror = () => {\n reject(new Error(\"Failed to load image\"));\n };\n\n image.src = imageUrl;\n });\n },\n [],\n );\n\n /**\n * Handle crop completion\n */\n const handleCropSave = React.useCallback(async () => {\n if (!imageToCrop || !croppedAreaPixels) return;\n\n try {\n const croppedBlob = await createCroppedImage(\n imageToCrop.url,\n croppedAreaPixels,\n );\n\n if (onCropComplete) {\n onCropComplete(croppedBlob, imageToCrop.file);\n }\n\n const croppedFile = new File([croppedBlob], imageToCrop.file.name, {\n type: \"image/jpeg\",\n });\n\n let updatedFiles: File[];\n if (!multiple) {\n updatedFiles = [croppedFile];\n } else {\n const existingIndex = normalizedValue.findIndex(\n (file) => file === imageToCrop.file,\n );\n\n if (existingIndex === -1) {\n updatedFiles = [...normalizedValue, croppedFile].slice(0, maxFiles);\n } else {\n updatedFiles = normalizedValue.map((file, index) =>\n index === existingIndex ? croppedFile : file,\n );\n }\n }\n\n onChange(updatedFiles);\n\n setCropperOpen(false);\n URL.revokeObjectURL(imageToCrop.url);\n setImageToCrop(null);\n setCrop({ x: 0, y: 0 });\n setZoom(1);\n setCroppedAreaPixels(null);\n } catch (cropError) {\n console.error(\"Failed to crop image:\", cropError);\n }\n }, [\n createCroppedImage,\n croppedAreaPixels,\n imageToCrop,\n maxFiles,\n multiple,\n normalizedValue,\n onChange,\n onCropComplete,\n ]);\n\n /**\n * Handle crop cancel\n */\n const handleCropCancel = React.useCallback(() => {\n if (imageToCrop) {\n URL.revokeObjectURL(imageToCrop.url);\n }\n setCropperOpen(false);\n setImageToCrop(null);\n setCrop({ x: 0, y: 0 });\n setZoom(1);\n setCroppedAreaPixels(null);\n }, [imageToCrop]);\n\n const handleCrop = React.useCallback((file: File) => {\n if (!file.type.startsWith(\"image/\")) return;\n\n const previewUrl = URL.createObjectURL(file);\n setImageToCrop({ file, url: previewUrl });\n setCropperOpen(true);\n }, []);\n\n const onCropChange = React.useCallback((nextCrop: { x: number; y: number }) => {\n setCrop(nextCrop);\n }, []);\n\n const onZoomChange = React.useCallback((nextZoom: number) => {\n setZoom(nextZoom);\n }, []);\n\n const onCropCompleteInternal = React.useCallback(\n (_: unknown, nextCroppedAreaPixels: CropArea) => {\n setCroppedAreaPixels(nextCroppedAreaPixels);\n },\n [],\n );\n\n const formatFileSize = React.useCallback((bytes: number): string => {\n if (bytes === 0) return \"0 Bytes\";\n const unit = 1024;\n const units = [\"Bytes\", \"KB\", \"MB\", \"GB\"];\n const index = Math.floor(Math.log(bytes) / Math.log(unit));\n return Math.round((bytes / Math.pow(unit, index)) * 100) / 100 + \" \" + units[index];\n }, []);\n\n React.useEffect(() => {\n return () => {\n if (imageToCrop) {\n URL.revokeObjectURL(imageToCrop.url);\n }\n };\n }, [imageToCrop]);\n\n const fileCountLabel =\n normalizedValue.length > 0\n ? `${normalizedValue.length} file(s) selected`\n : placeholder;\n\n return (\n <>\n <FileUpload\n name={name}\n value={normalizedValue}\n onValueChange={handleValueChange}\n onFileValidate={handleFileValidate}\n onFileReject={handleFileReject}\n accept={accept}\n maxSize={maxSize}\n maxFiles={multiple ? maxFiles : undefined}\n multiple={multiple}\n disabled={disabled}\n required={required && normalizedValue.length === 0}\n invalid={Boolean(error || props[\"aria-invalid\"])}\n label=\"File upload\"\n className={cn(className)}\n inputProps={{\n ...props,\n onBlur: handleBlur,\n style: { display: \"none\" },\n \"aria-invalid\": error || props[\"aria-invalid\"],\n \"aria-required\": required || props[\"aria-required\"],\n \"aria-describedby\": props[\"aria-describedby\"],\n }}\n >\n <FileUploadDropzone\n role=\"button\"\n aria-label={placeholder}\n className={cn(\n \"flex min-h-32 w-full cursor-pointer items-center justify-center border-input bg-transparent p-6 transition-colors\",\n \"hover:bg-accent/50 hover:border-ring\",\n \"data-[dragging]:bg-accent data-[dragging]:border-ring\",\n disabled && \"cursor-not-allowed opacity-50\",\n error && \"border-destructive\",\n )}\n >\n <div className=\"flex flex-col items-center gap-2 text-center\">\n <svg\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n\n <p className=\"text-sm font-medium\">{fileCountLabel}</p>\n {accept && <p className=\"text-xs\">Accepted: {accept}</p>}\n <p className=\"text-xs\">Max size: {formatFileSize(maxSize)}</p>\n </div>\n </FileUploadDropzone>\n\n <FileUploadList className=\"mt-4\">\n {normalizedValue.map((file, index) => {\n const progressValue = uploadProgress[file.name];\n const hasProgress =\n showProgress && typeof progressValue === \"number\";\n\n return (\n <FileUploadItem\n key={`${file.name}-${index}`}\n value={file}\n className=\"flex items-center gap-3 border-border bg-card text-card-foreground hover:bg-primary/50 transition-colors\"\n >\n {showPreview ? (\n <FileUploadItemPreview className=\"h-12 w-12 rounded [&>img]:h-full [&>img]:w-full [&>img]:object-cover [&>svg]:size-6\" />\n ) : null}\n\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <FileUploadItemMetadata className=\"min-w-0\" />\n <span className=\"text-xs\">{formatFileSize(file.size)}</span>\n\n {hasProgress ? (\n <div className=\"mt-1 flex items-center gap-2\">\n <div\n className=\"h-1.5 flex-1 overflow-hidden rounded-full bg-accent/40\"\n role=\"progressbar\"\n aria-valuenow={progressValue}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`Upload progress: ${progressValue}%`}\n >\n <div\n className=\"h-full bg-primary transition-all\"\n style={{ width: `${progressValue}%` }}\n />\n </div>\n <span className=\"text-xs\">{progressValue}%</span>\n </div>\n ) : null}\n </div>\n\n {enableCropping && file.type.startsWith(\"image/\") ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={(event) => {\n event.stopPropagation();\n handleCrop(file);\n }}\n disabled={disabled}\n className=\"h-8 w-8 p-0\"\n aria-label={`Crop ${file.name}`}\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M6.13 1L6 16a2 2 0 0 0 2 2h15\" />\n <path d=\"M1 6.13L16 6a2 2 0 0 1 2 2v15\" />\n </svg>\n </Button>\n ) : null}\n\n <FileUploadItemDelete asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n disabled={disabled}\n className=\"h-8 w-8 p-0\"\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 </FileUploadItemDelete>\n </FileUploadItem>\n );\n })}\n </FileUploadList>\n </FileUpload>\n\n <Dialog\n open={cropperOpen && Boolean(imageToCrop)}\n onOpenChange={(open) => {\n if (!open) {\n handleCropCancel();\n }\n }}\n >\n {imageToCrop ? (\n <DialogContent\n showCloseButton={false}\n className=\"max-w-3xl gap-0 p-0\"\n aria-describedby={undefined}\n >\n <DialogHeader className=\"flex-row items-center justify-between border-b border-border px-4 py-3\">\n <DialogTitle>Crop Image</DialogTitle>\n <DialogClose asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 p-0\"\n aria-label=\"Close\"\n >\n <svg\n width=\"16\"\n height=\"16\"\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 </DialogClose>\n </DialogHeader>\n\n <div className=\"p-4\">\n <div\n className=\"relative h-96 w-full overflow-hidden rounded-md bg-accent/40\"\n onMouseDown={(event) => {\n event.preventDefault();\n const startX = event.clientX - crop.x;\n const startY = event.clientY - crop.y;\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n onCropChange({\n x: moveEvent.clientX - startX,\n y: moveEvent.clientY - startY,\n });\n };\n\n const handleMouseUp = () => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n }}\n >\n <img\n src={imageToCrop.url}\n alt=\"Crop preview\"\n className=\"absolute inset-0 h-full w-full object-contain\"\n style={{\n transform: `translate(${crop.x}px, ${crop.y}px) scale(${zoom})`,\n }}\n draggable={false}\n onLoad={(event) => {\n const image = event.currentTarget;\n const containerWidth = 600;\n const containerHeight = 400;\n\n const cropWidth = cropAspectRatio\n ? Math.min(\n containerWidth * 0.8,\n containerHeight * 0.8 * cropAspectRatio,\n )\n : containerWidth * 0.8;\n const cropHeight = cropAspectRatio\n ? cropWidth / cropAspectRatio\n : containerHeight * 0.8;\n\n const imageWidth = image.naturalWidth;\n const imageHeight = image.naturalHeight;\n const scale = zoom;\n const centerX = containerWidth / 2;\n const centerY = containerHeight / 2;\n\n const cropX = (centerX - crop.x - cropWidth / 2) / scale;\n const cropY = (centerY - crop.y - cropHeight / 2) / scale;\n\n onCropCompleteInternal(null, {\n x: Math.max(0, cropX),\n y: Math.max(0, cropY),\n width: Math.min(cropWidth / scale, imageWidth),\n height: Math.min(cropHeight / scale, imageHeight),\n });\n }}\n />\n\n <div\n className=\"pointer-events-none absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 rounded border-2 border-primary\"\n style={{\n width: cropAspectRatio\n ? `${Math.min(80, 80 * cropAspectRatio)}%`\n : \"80%\",\n aspectRatio: cropAspectRatio\n ? String(cropAspectRatio)\n : undefined,\n }}\n >\n <div className=\"absolute inset-0 grid grid-cols-3 grid-rows-3\">\n <div className=\"border-r border-b border-primary/30\" />\n <div className=\"border-r border-b border-primary/30\" />\n <div className=\"border-b border-primary/30\" />\n <div className=\"border-r border-b border-primary/30\" />\n <div className=\"border-r border-b border-primary/30\" />\n <div className=\"border-b border-primary/30\" />\n <div className=\"border-r border-primary/30\" />\n <div className=\"border-r border-primary/30\" />\n <div />\n </div>\n </div>\n </div>\n\n <div className=\"mt-4 flex items-center gap-3\">\n <label\n htmlFor=\"zoom-slider\"\n className=\"whitespace-nowrap text-sm font-medium\"\n >\n Zoom: {zoom.toFixed(1)}x\n </label>\n <input\n id=\"zoom-slider\"\n type=\"range\"\n min=\"1\"\n max=\"3\"\n step=\"0.1\"\n value={zoom}\n onChange={(event) => onZoomChange(parseFloat(event.target.value))}\n className=\"h-2 flex-1 cursor-pointer appearance-none rounded-lg bg-accent/60\"\n aria-label=\"Zoom level\"\n />\n </div>\n </div>\n\n <div className=\"flex items-center justify-end gap-2 border-t border-border p-4\">\n <Button type=\"button\" variant=\"outline\" onClick={handleCropCancel}>\n Cancel\n </Button>\n <Button type=\"button\" onClick={handleCropSave}>\n Save\n </Button>\n </div>\n </DialogContent>\n ) : null}\n </Dialog>\n </>\n );\n}\n\nFileInput.displayName = \"FileInput\";\n","\"use client\"\n\nimport * as React from \"react\"\nimport {\n DayPicker,\n getDefaultClassNames,\n type DayButton,\n} from \"react-day-picker\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button, buttonVariants } from \"./button\"\n\n/**\n * Calendar component - Optimized for dynamic theming across thousands of client brands\n *\n * CRITICAL: Only uses CSS variables and opacity for muted text - NO hardcoded semantic colors\n * See: SHADCN_INTEGRATION_GUIDE.md for full documentation\n */\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n captionLayout = \"label\",\n buttonVariant = \"ghost\",\n formatters,\n components,\n ...props\n}: React.ComponentProps<typeof DayPicker> & {\n buttonVariant?: React.ComponentProps<typeof Button>[\"variant\"]\n}) {\n const defaultClassNames = getDefaultClassNames()\n\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n className={cn(\n \"bg-background group/calendar p-3 [--cell-size:--spacing(8)] [[data-slot=card-content]_&]:bg-transparent [[data-slot=popover-content]_&]:bg-transparent\",\n String.raw`rtl:**:[.rdp-button\\_next>svg]:rotate-180`,\n String.raw`rtl:**:[.rdp-button\\_previous>svg]:rotate-180`,\n className\n )}\n captionLayout={captionLayout}\n formatters={{\n formatMonthDropdown: (date) =>\n date.toLocaleString(\"default\", { month: \"short\" }),\n ...formatters,\n }}\n classNames={{\n root: cn(\"w-fit\", defaultClassNames.root),\n months: cn(\n \"flex gap-4 flex-col md:flex-row relative\",\n defaultClassNames.months\n ),\n month: cn(\"flex flex-col w-full gap-4\", defaultClassNames.month),\n nav: cn(\n \"flex items-center gap-1 w-full absolute top-0 inset-x-0 justify-between\",\n defaultClassNames.nav\n ),\n button_previous: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) aria-disabled:opacity-50 p-0 select-none\",\n defaultClassNames.button_previous\n ),\n button_next: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) aria-disabled:opacity-50 p-0 select-none\",\n defaultClassNames.button_next\n ),\n month_caption: cn(\n \"flex items-center justify-center h-(--cell-size) w-full px-(--cell-size)\",\n defaultClassNames.month_caption\n ),\n dropdowns: cn(\n \"w-full flex items-center text-sm font-medium justify-center h-(--cell-size) gap-1.5\",\n defaultClassNames.dropdowns\n ),\n dropdown_root: cn(\n \"relative has-focus:border-ring border border-input shadow-xs has-focus:ring-ring/50 has-focus:ring-[3px] rounded-md\",\n defaultClassNames.dropdown_root\n ),\n dropdown: cn(\n \"absolute bg-popover inset-0 opacity-0\",\n defaultClassNames.dropdown\n ),\n caption_label: cn(\n \"select-none font-medium\",\n captionLayout === \"label\"\n ? \"text-sm\"\n : \"rounded-md pl-2 pr-1 flex items-center gap-1 text-sm h-8 [&>svg]:opacity-70 [&>svg]:size-3.5\",\n defaultClassNames.caption_label\n ),\n table: \"w-full border-collapse\",\n weekdays: cn(\"flex\", defaultClassNames.weekdays),\n weekday: cn(\n \"opacity-70 rounded-md flex-1 font-normal text-[0.8rem] select-none\",\n defaultClassNames.weekday\n ),\n week: cn(\"flex w-full mt-2\", defaultClassNames.week),\n week_number_header: cn(\n \"select-none w-(--cell-size)\",\n defaultClassNames.week_number_header\n ),\n week_number: cn(\n \"text-[0.8rem] select-none opacity-70\",\n defaultClassNames.week_number\n ),\n day: cn(\n \"relative w-full h-full p-0 text-center [&:last-child[data-selected=true]_button]:rounded-r-md group/day aspect-square select-none\",\n props.showWeekNumber\n ? \"[&:nth-child(2)[data-selected=true]_button]:rounded-l-md\"\n : \"[&:first-child[data-selected=true]_button]:rounded-l-md\",\n defaultClassNames.day\n ),\n range_start: cn(\n \"rounded-l-md bg-accent\",\n defaultClassNames.range_start\n ),\n range_middle: cn(\"rounded-none\", defaultClassNames.range_middle),\n range_end: cn(\"rounded-r-md bg-accent\", defaultClassNames.range_end),\n today: cn(\n \"bg-accent text-accent-foreground rounded-md data-[selected=true]:rounded-none\",\n defaultClassNames.today\n ),\n outside: cn(\n \"opacity-50\",\n defaultClassNames.outside\n ),\n disabled: cn(\n \"opacity-50\",\n defaultClassNames.disabled\n ),\n hidden: cn(\"invisible\", defaultClassNames.hidden),\n ...classNames,\n }}\n components={{\n Root: ({ className, rootRef, ...props }) => {\n return (\n <div\n data-slot=\"calendar\"\n ref={rootRef}\n className={cn(className)}\n {...props}\n />\n )\n },\n Chevron: ({ className, orientation, ...props }) => {\n if (orientation === \"left\") {\n return (\n <svg\n className={cn(\"size-4\", className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n )\n }\n\n if (orientation === \"right\") {\n return (\n <svg\n className={cn(\"size-4\", className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n )\n }\n\n return (\n <svg\n className={cn(\"size-4\", className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n )\n },\n DayButton: CalendarDayButton,\n WeekNumber: ({ children, ...props }) => {\n return (\n <td {...props}>\n <div className=\"flex size-(--cell-size) items-center justify-center text-center\">\n {children}\n </div>\n </td>\n )\n },\n ...components,\n }}\n {...props}\n />\n )\n}\n\nfunction CalendarDayButton({\n className,\n day,\n modifiers,\n ...props\n}: React.ComponentProps<typeof DayButton>) {\n const defaultClassNames = getDefaultClassNames()\n\n const ref = React.useRef<HTMLButtonElement>(null)\n React.useEffect(() => {\n if (modifiers.focused) ref.current?.focus()\n }, [modifiers.focused])\n\n return (\n <Button\n ref={ref}\n variant=\"ghost\"\n size=\"icon\"\n data-day={day.date.toLocaleDateString()}\n data-selected-single={\n modifiers.selected &&\n !modifiers.range_start &&\n !modifiers.range_end &&\n !modifiers.range_middle\n }\n data-range-start={modifiers.range_start}\n data-range-end={modifiers.range_end}\n data-range-middle={modifiers.range_middle}\n className={cn(\n // Core structure\n \"flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 leading-none font-normal\",\n\n // Selected states - uses CSS variables\n \"data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground\",\n \"data-[range-middle=true]:bg-accent data-[range-middle=true]:text-accent-foreground\",\n \"data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground\",\n \"data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground\",\n\n // Focus state\n \"group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10\",\n \"group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-ring/50 group-data-[focused=true]/day:ring-[3px]\",\n\n // Rounding based on position\n \"data-[range-end=true]:rounded-md data-[range-end=true]:rounded-r-md\",\n \"data-[range-middle=true]:rounded-none\",\n \"data-[range-start=true]:rounded-md data-[range-start=true]:rounded-l-md\",\n\n // Nested span styling\n \"[&>span]:text-xs [&>span]:opacity-70\",\n\n defaultClassNames.day,\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Calendar, CalendarDayButton }\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { DayButtonProps, Matcher } from \"react-day-picker\";\nimport type { InputProps } from \"../core/types\";\nimport { Calendar } from \"../components/ui/calendar\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover\";\nimport { cn, INPUT_AUTOFILL_RESET_CLASSES } from \"../lib/utils\";\n\n/**\n * DatePicker props interface\n */\nexport interface DatePickerProps extends Omit<\n InputProps<Date | null>,\n \"onChange\"\n> {\n /**\n * Change handler - receives selected date or null\n */\n onChange: (date: Date | null) => void;\n\n /**\n * Placeholder text when no date is selected\n * @default \"Select date...\"\n */\n placeholder?: string;\n\n /**\n * Date format for display\n * @default \"MM/dd/yyyy\"\n */\n format?: string;\n\n /**\n * Minimum selectable date\n */\n minDate?: Date;\n\n /**\n * Maximum selectable date\n */\n maxDate?: Date;\n\n /**\n * Dates that should be disabled\n */\n disabledDates?: Date[];\n\n /**\n * Function to determine if a date should be disabled\n */\n isDateDisabled?: (date: Date) => boolean;\n\n /**\n * Show clear button\n * @default true\n */\n clearable?: boolean;\n\n /**\n * Show calendar icon\n * @default true\n */\n showIcon?: boolean;\n\n /**\n * Additional native input attributes\n */\n [key: string]: any;\n}\n\n/**\n * Format date to string\n */\nfunction formatDate(date: Date | null, format: string): string {\n if (!date) return \"\";\n\n const d = new Date(date);\n const month = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n const year = d.getFullYear();\n\n // Simple format parsing\n return format\n .replace(\"MM\", month)\n .replace(\"dd\", day)\n .replace(\"yyyy\", String(year))\n .replace(\"yy\", String(year).slice(2));\n}\n\nfunction DatePickerDayButton({\n day,\n modifiers,\n className,\n children,\n ...props\n}: DayButtonProps) {\n return (\n <button\n type=\"button\"\n className={cn(\n \"flex items-center justify-center h-8 w-8 rounded-md border-none bg-transparent cursor-pointer text-sm transition-colors\",\n \"hover:bg-accent\",\n modifiers.selected && \"bg-primary text-primary-foreground font-semibold\",\n !modifiers.selected && modifiers.today && \"border border-primary\",\n modifiers.disabled && \"cursor-not-allowed opacity-50 pointer-events-none\",\n className,\n )}\n {...props}\n >\n {children ?? day.date.getDate()}\n </button>\n );\n}\n\n/**\n * DatePicker - Accessible date selection component with calendar UI\n *\n * A lightweight date picker with calendar popup, keyboard navigation,\n * and error state support. Designed to work seamlessly with useForm and Field components.\n *\n * Features:\n * - Calendar popup with month/year navigation\n * - Full accessibility support (ARIA attributes, keyboard navigation)\n * - Error state styling\n * - Controlled input behavior\n * - Date range constraints (min/max dates)\n * - Disabled dates support\n * - Clearable selection\n * - Custom date format display\n * - Icon display toggle\n * - Click outside to close\n * - Native date input fallback for mobile\n *\n * @example\n * ```tsx\n * const form = useForm({ initialValues: { birthdate: null } });\n *\n * <DatePicker\n * {...form.getFieldProps('birthdate')}\n * placeholder=\"Select your birthdate\"\n * format=\"MM/dd/yyyy\"\n * maxDate={new Date()}\n * clearable\n * showIcon\n * error={!!form.errors.birthdate}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // With date range constraints\n * <DatePicker\n * name=\"appointment\"\n * value={appointmentDate}\n * onChange={setAppointmentDate}\n * minDate={new Date()}\n * maxDate={addDays(new Date(), 90)}\n * isDateDisabled={(date) => date.getDay() === 0 || date.getDay() === 6}\n * />\n * ```\n *\n * Note: This component requires react-day-picker as a peer dependency.\n * Install with: npm install react-day-picker date-fns\n *\n * @see https://opensite.ai/developers/page-speed/forms/date-picker\n */\nexport function DatePicker({\n name,\n value,\n onChange,\n onBlur,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n placeholder = \"Select date...\",\n format = \"MM/dd/yyyy\",\n minDate,\n maxDate,\n disabledDates = [],\n isDateDisabled,\n clearable = true,\n showIcon = true,\n ...props\n}: DatePickerProps) {\n const [isOpen, setIsOpen] = React.useState(false);\n const [hasInteracted, setHasInteracted] = React.useState(false);\n const [selectedMonth, setSelectedMonth] = React.useState<Date>(\n value || new Date(),\n );\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n // Sync selected month with controlled value prop\n React.useEffect(() => {\n if (value) {\n setSelectedMonth(value);\n }\n }, [value]);\n\n const disabledMatchers = React.useMemo<Matcher[]>(() => {\n const matchers: Matcher[] = [];\n\n if (minDate) {\n matchers.push({ before: minDate });\n }\n\n if (maxDate) {\n matchers.push({ after: maxDate });\n }\n\n if (disabledDates.length > 0) {\n matchers.push(disabledDates);\n }\n\n if (isDateDisabled) {\n matchers.push(isDateDisabled);\n }\n\n return matchers;\n }, [disabledDates, isDateDisabled, maxDate, minDate]);\n\n const handleDateSelect = React.useCallback(\n (date: Date | undefined) => {\n if (!date) return;\n\n onChange(date);\n setSelectedMonth(date);\n setIsOpen(false);\n onBlur?.();\n },\n [onBlur, onChange],\n );\n\n // Handle clear button\n const handleClear = React.useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange(null);\n setIsOpen(false);\n inputRef.current?.focus();\n },\n [onChange],\n );\n\n const handleOpenChange = React.useCallback(\n (nextOpen: boolean) => {\n if (disabled) {\n setIsOpen(false);\n return;\n }\n\n if (nextOpen) {\n if (!hasInteracted) {\n setHasInteracted(true);\n }\n setIsOpen(true);\n return;\n }\n\n if (isOpen && hasInteracted) {\n onBlur?.();\n }\n\n setIsOpen(false);\n },\n [disabled, hasInteracted, isOpen, onBlur],\n );\n\n const handleInputBlur = React.useCallback(() => {\n if (!isOpen) {\n onBlur?.();\n }\n }, [isOpen, onBlur]);\n\n const handleInputClick = React.useCallback(() => {\n if (!hasInteracted) {\n setHasInteracted(true);\n }\n }, [hasInteracted]);\n\n const hasValue = Boolean(value);\n const displayValue = formatDate(value, format);\n\n const combinedClassName = cn(\"relative\", className);\n\n return (\n <div className={combinedClassName}>\n {/* Hidden native date input for form submission */}\n <input\n type=\"hidden\"\n name={name}\n value={value ? value.toISOString() : \"\"}\n />\n\n <Popover open={isOpen} onOpenChange={handleOpenChange}>\n {/* Custom date input */}\n <div className=\"relative\">\n {showIcon && (\n <span\n className=\"absolute left-3 top-1/2 -translate-y-1/2 pointer-events-none\"\n aria-hidden=\"true\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n >\n <path d=\"M8 2v4m8-4v4m5 8V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h8M3 10h18m-5 10l2 2l4-4\" />\n </svg>\n </span>\n )}\n <PopoverTrigger asChild>\n <input\n ref={inputRef}\n id={props.id}\n type=\"text\"\n className={cn(\n \"flex h-9 w-full rounded-md border border-input bg-transparent py-1 text-base shadow-sm transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\",\n \"disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n INPUT_AUTOFILL_RESET_CLASSES,\n showIcon ? \"pl-10\" : \"pl-3\",\n clearable && value ? \"pr-10\" : \"pr-3\",\n !error && hasValue && \"ring-2 ring-ring\",\n error && \"border-destructive ring-1 ring-destructive\",\n )}\n value={displayValue}\n onClick={handleInputClick}\n onBlur={handleInputBlur}\n disabled={disabled}\n required={required}\n placeholder={placeholder}\n aria-invalid={error || props[\"aria-invalid\"] ? \"true\" : \"false\"}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n readOnly\n />\n </PopoverTrigger>\n {clearable && value && !disabled && (\n <button\n type=\"button\"\n className=\"absolute right-3 top-1/2 -translate-y-1/2 transition-colors\"\n onClick={handleClear}\n aria-label=\"Clear date\"\n tabIndex={-1}\n >\n ✕\n </button>\n )}\n </div>\n\n {!disabled && (\n <PopoverContent\n align=\"start\"\n sideOffset={4}\n className=\"w-auto p-0\"\n onOpenAutoFocus={(event) => {\n event.preventDefault();\n }}\n >\n <Calendar\n mode=\"single\"\n selected={value ?? undefined}\n onSelect={handleDateSelect}\n month={selectedMonth}\n onMonthChange={setSelectedMonth}\n disabled={disabledMatchers}\n showOutsideDays\n labels={{\n labelGrid: () => \"Calendar\",\n labelDayButton: (date) => formatDate(date, format),\n labelPrevious: () => \"Previous month\",\n labelNext: () => \"Next month\",\n }}\n components={{\n DayButton: DatePickerDayButton,\n }}\n classNames={{\n today: \"border border-primary rounded-md bg-transparent\",\n }}\n />\n </PopoverContent>\n )}\n </Popover>\n </div>\n );\n}\n\nDatePicker.displayName = \"DatePicker\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { InputProps } from \"../core/types\";\nimport { cn, INPUT_AUTOFILL_RESET_CLASSES } from \"../lib/utils\";\nimport { Input } from \"../components/ui/input\";\nimport { Button } from \"../components/ui/button\";\n\n/**\n * Legacy time value shape retained for backward-compatible type exports.\n */\nexport interface TimeValue {\n hour: number;\n minute: number;\n period: \"AM\" | \"PM\";\n}\n\n/**\n * TimePicker props interface\n */\nexport interface TimePickerProps extends Omit<InputProps<string>, \"onChange\"> {\n /**\n * Change handler - receives time string in format \"HH:mm\" (24-hour)\n * or \"h:mm AM/PM\" (12-hour)\n */\n onChange: (time: string) => void;\n\n /**\n * Placeholder text when no time is selected\n * @default \"Select time...\"\n */\n placeholder?: string;\n\n /**\n * Use 24-hour format instead of 12-hour with AM/PM\n * @default false\n */\n use24Hour?: boolean;\n\n /**\n * Minute step interval (e.g., 15 for 15-minute increments)\n * @default 1\n */\n minuteStep?: number;\n\n /**\n * Show clear button\n * @default true\n */\n clearable?: boolean;\n\n /**\n * Show clock icon\n * @default true\n */\n showIcon?: boolean;\n\n /**\n * Additional native input attributes\n */\n [key: string]: any;\n}\n\nfunction normalizeToNativeTime(value: string): string {\n if (!value) return \"\";\n\n // 12-hour format: h:mm AM/PM or hh:mm:ss AM/PM\n const twelveHourMatch = value.match(\n /^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?\\s*(AM|PM)$/i,\n );\n if (twelveHourMatch) {\n const rawHour = parseInt(twelveHourMatch[1], 10);\n const minute = parseInt(twelveHourMatch[2], 10);\n const period = twelveHourMatch[4].toUpperCase();\n\n if (\n Number.isNaN(rawHour) ||\n Number.isNaN(minute) ||\n rawHour < 1 ||\n rawHour > 12 ||\n minute < 0 ||\n minute > 59\n ) {\n return \"\";\n }\n\n const normalizedHour =\n period === \"PM\"\n ? rawHour === 12\n ? 12\n : rawHour + 12\n : rawHour === 12\n ? 0\n : rawHour;\n\n return `${String(normalizedHour).padStart(2, \"0\")}:${String(minute).padStart(2, \"0\")}`;\n }\n\n // 24-hour format: HH:mm or HH:mm:ss\n const twentyFourHourMatch = value.match(/^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?$/);\n if (twentyFourHourMatch) {\n const hour = parseInt(twentyFourHourMatch[1], 10);\n const minute = parseInt(twentyFourHourMatch[2], 10);\n\n if (\n Number.isNaN(hour) ||\n Number.isNaN(minute) ||\n hour < 0 ||\n hour > 23 ||\n minute < 0 ||\n minute > 59\n ) {\n return \"\";\n }\n\n return `${String(hour).padStart(2, \"0\")}:${String(minute).padStart(2, \"0\")}`;\n }\n\n return \"\";\n}\n\nfunction formatFromNativeTime(nativeValue: string, use24Hour: boolean): string {\n if (!nativeValue) return \"\";\n\n const [hourValue, minuteValue] = nativeValue.split(\":\");\n const hour = parseInt(hourValue, 10);\n const minute = parseInt(minuteValue, 10);\n\n if (Number.isNaN(hour) || Number.isNaN(minute)) {\n return \"\";\n }\n\n if (use24Hour) {\n return `${String(hour).padStart(2, \"0\")}:${String(minute).padStart(2, \"0\")}`;\n }\n\n const period = hour >= 12 ? \"PM\" : \"AM\";\n const hour12 = hour % 12 || 12;\n return `${hour12}:${String(minute).padStart(2, \"0\")} ${period}`;\n}\n\n/**\n * TimePicker - Accessible time input component using native time picker UX.\n *\n * Uses a native `type=\"time\"` input for a streamlined UX while preserving\n * formatting compatibility for 12-hour and 24-hour output formats.\n */\nexport function TimePicker({\n name,\n value,\n onChange,\n onBlur,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n placeholder = \"Select time...\",\n use24Hour = false,\n minuteStep = 1,\n clearable = true,\n showIcon = true,\n ...props\n}: TimePickerProps) {\n const inputRef = React.useRef<HTMLInputElement>(null);\n const [nativeValue, setNativeValue] = React.useState<string>(\n normalizeToNativeTime(value),\n );\n\n React.useEffect(() => {\n setNativeValue(normalizeToNativeTime(value));\n }, [value]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const nextNativeValue = e.target.value;\n setNativeValue(nextNativeValue);\n onChange(formatFromNativeTime(nextNativeValue, use24Hour));\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n setNativeValue(\"\");\n onChange(\"\");\n inputRef.current?.focus();\n };\n\n const hasValue = Boolean(value);\n const stepInSeconds = Math.max(1, minuteStep * 60);\n\n return (\n <div className={cn(\"relative\", className)}>\n {/* Hidden input preserves external value format for form submission */}\n <input type=\"hidden\" name={name} value={value} />\n\n <div className=\"relative\">\n {showIcon && (\n <span\n className=\"absolute left-3 top-1/2 -translate-y-1/2 pointer-events-none\"\n aria-hidden=\"true\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 6v6l4 2\" />\n </svg>\n </span>\n )}\n <Input\n ref={inputRef}\n type=\"time\"\n className={cn(\n \"appearance-none [&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-calendar-picker-indicator]:appearance-none\",\n INPUT_AUTOFILL_RESET_CLASSES,\n showIcon ? \"pl-10\" : \"pl-3\",\n clearable && value ? \"pr-10\" : \"pr-3\",\n !error && hasValue && \"ring-2 ring-ring\",\n error && \"border-destructive ring-1 ring-destructive\",\n )}\n value={nativeValue}\n onChange={handleChange}\n onBlur={onBlur}\n disabled={disabled}\n required={required}\n step={stepInSeconds}\n placeholder={placeholder}\n aria-invalid={error || props[\"aria-invalid\"] ? \"true\" : \"false\"}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n {...props}\n />\n {clearable && value && !disabled && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute right-1.5 top-1/2 h-7 w-7 -translate-y-1/2 p-0\"\n onClick={handleClear}\n aria-label=\"Clear time\"\n tabIndex={-1}\n >\n <svg\n width=\"14\"\n height=\"14\"\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 )}\n </div>\n </div>\n );\n}\n\nTimePicker.displayName = \"TimePicker\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { DayButtonProps, Matcher } from \"react-day-picker\";\nimport type { InputProps } from \"../core/types\";\nimport { Calendar } from \"../components/ui/calendar\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover\";\nimport { cn, INPUT_AUTOFILL_RESET_CLASSES } from \"../lib/utils\";\n\n/**\n * Date range value\n */\nexport interface DateRange {\n start: Date | null;\n end: Date | null;\n}\n\n/**\n * DateRangePicker props interface\n */\nexport interface DateRangePickerProps extends Omit<\n InputProps<DateRange>,\n \"onChange\"\n> {\n /**\n * Change handler - receives date range object\n */\n onChange: (range: DateRange) => void;\n\n /**\n * Placeholder text when no dates are selected\n * @default \"Select date range...\"\n */\n placeholder?: string;\n\n /**\n * Date format for display\n * @default \"MM/dd/yyyy\"\n */\n format?: string;\n\n /**\n * Minimum selectable date\n */\n minDate?: Date;\n\n /**\n * Maximum selectable date\n */\n maxDate?: Date;\n\n /**\n * Dates that should be disabled\n */\n disabledDates?: Date[];\n\n /**\n * Function to determine if a date should be disabled\n */\n isDateDisabled?: (date: Date) => boolean;\n\n /**\n * Show clear button\n * @default true\n */\n clearable?: boolean;\n\n /**\n * Show calendar icon\n * @default true\n */\n showIcon?: boolean;\n\n /**\n * Separator between start and end dates\n * @default \" - \"\n */\n separator?: string;\n\n /**\n * Additional native input attributes\n */\n [key: string]: any;\n}\n\n/**\n * Format date to string\n */\nfunction formatDate(date: Date | null, format: string): string {\n if (!date) return \"\";\n\n const d = new Date(date);\n const month = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n const year = d.getFullYear();\n\n return format\n .replace(\"MM\", month)\n .replace(\"dd\", day)\n .replace(\"yyyy\", String(year))\n .replace(\"yy\", String(year).slice(2));\n}\n\nfunction toDayTimestamp(date: Date): number {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime();\n}\n\nfunction isSameDay(date: Date, target: Date | null): boolean {\n if (!target) return false;\n return toDayTimestamp(date) === toDayTimestamp(target);\n}\n\nfunction isDateInRange(date: Date, start: Date | null, end: Date | null): boolean {\n if (!start || !end) return false;\n\n const value = toDayTimestamp(date);\n const startTs = toDayTimestamp(start);\n const endTs = toDayTimestamp(end);\n\n return value >= Math.min(startTs, endTs) && value <= Math.max(startTs, endTs);\n}\n\n/**\n * DateRangePicker - Accessible date range selection component\n *\n * Uses ShadCN Calendar + Popover primitives while preserving the existing\n * public API and interaction semantics.\n */\nexport function DateRangePicker({\n name,\n value = { start: null, end: null },\n onChange,\n onBlur,\n disabled = false,\n required = false,\n error = false,\n className = \"\",\n placeholder = \"Select date range...\",\n format = \"MM/dd/yyyy\",\n minDate,\n maxDate,\n disabledDates = [],\n isDateDisabled,\n clearable = true,\n showIcon = true,\n separator = \" - \",\n ...props\n}: DateRangePickerProps) {\n const [isOpen, setIsOpen] = React.useState(false);\n const [hasInteracted, setHasInteracted] = React.useState(false);\n const [selectedMonth, setSelectedMonth] = React.useState<Date>(\n value.start || new Date(),\n );\n const [rangeStart, setRangeStart] = React.useState<Date | null>(value.start);\n const [rangeEnd, setRangeEnd] = React.useState<Date | null>(value.end);\n const [hoverDate, setHoverDate] = React.useState<Date | null>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n // Sync range with controlled value prop\n React.useEffect(() => {\n setRangeStart(value.start);\n setRangeEnd(value.end);\n\n if (value.start) {\n setSelectedMonth(value.start);\n }\n }, [value]);\n\n const disabledMatchers = React.useMemo<Matcher[]>(() => {\n const matchers: Matcher[] = [];\n\n if (minDate) {\n matchers.push({ before: minDate });\n }\n\n if (maxDate) {\n matchers.push({ after: maxDate });\n }\n\n if (disabledDates.length > 0) {\n matchers.push(disabledDates);\n }\n\n if (isDateDisabled) {\n matchers.push(isDateDisabled);\n }\n\n return matchers;\n }, [disabledDates, isDateDisabled, maxDate, minDate]);\n\n const handleDateSelect = React.useCallback(\n (date: Date) => {\n if (!rangeStart || rangeEnd) {\n setRangeStart(date);\n setRangeEnd(null);\n setHoverDate(null);\n setSelectedMonth(date);\n onChange({ start: date, end: null });\n onBlur?.();\n return;\n }\n\n if (toDayTimestamp(date) < toDayTimestamp(rangeStart)) {\n setRangeStart(date);\n setRangeEnd(rangeStart);\n setHoverDate(null);\n setSelectedMonth(date);\n onChange({ start: date, end: rangeStart });\n setIsOpen(false);\n onBlur?.();\n return;\n }\n\n setRangeEnd(date);\n setHoverDate(null);\n setSelectedMonth(date);\n onChange({ start: rangeStart, end: date });\n setIsOpen(false);\n onBlur?.();\n },\n [onBlur, onChange, rangeEnd, rangeStart],\n );\n\n const handleClear = React.useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n setRangeStart(null);\n setRangeEnd(null);\n setHoverDate(null);\n setIsOpen(false);\n onChange({ start: null, end: null });\n inputRef.current?.focus();\n },\n [onChange],\n );\n\n const handleOpenChange = React.useCallback(\n (nextOpen: boolean) => {\n if (disabled) {\n setIsOpen(false);\n return;\n }\n\n if (nextOpen) {\n if (!hasInteracted) {\n setHasInteracted(true);\n }\n setIsOpen(true);\n return;\n }\n\n if (isOpen && hasInteracted) {\n onBlur?.();\n }\n\n setHoverDate(null);\n setIsOpen(false);\n },\n [disabled, hasInteracted, isOpen, onBlur],\n );\n\n const handleInputBlur = React.useCallback(() => {\n if (!isOpen) {\n onBlur?.();\n }\n }, [isOpen, onBlur]);\n\n const handleInputClick = React.useCallback(() => {\n if (!hasInteracted) {\n setHasInteracted(true);\n }\n }, [hasInteracted]);\n\n const RangeDayButton = React.useCallback(\n ({\n day,\n modifiers,\n className: dayClassName,\n children,\n onClick,\n onMouseEnter,\n onMouseLeave,\n ...rest\n }: DayButtonProps) => {\n const date = day.date;\n const isStart = isSameDay(date, rangeStart);\n const isEnd = isSameDay(date, rangeEnd);\n const isRangeEndpoint = isStart || isEnd;\n const isInCommittedRange = isDateInRange(date, rangeStart, rangeEnd);\n const isInHoverRange =\n !!rangeStart &&\n !rangeEnd &&\n !!hoverDate &&\n isDateInRange(date, rangeStart, hoverDate);\n const isRangeHighlight = (isInCommittedRange || isInHoverRange) && !isRangeEndpoint;\n const isToday = isSameDay(date, new Date());\n\n return (\n <button\n type=\"button\"\n {...rest}\n className={cn(\n \"flex items-center justify-center h-8 w-8 rounded-md border-none bg-transparent cursor-pointer text-sm transition-colors\",\n \"hover:bg-accent\",\n isRangeEndpoint && \"bg-primary text-primary-foreground font-semibold\",\n isRangeHighlight && \"bg-accent\",\n !isRangeEndpoint && !isRangeHighlight && isToday && \"border border-primary\",\n modifiers.disabled && \"cursor-not-allowed opacity-50 pointer-events-none\",\n dayClassName,\n )}\n onClick={(event) => {\n onClick?.(event);\n if (modifiers.disabled) return;\n handleDateSelect(date);\n }}\n onMouseEnter={(event) => {\n onMouseEnter?.(event);\n if (modifiers.disabled) {\n setHoverDate(null);\n return;\n }\n setHoverDate(date);\n }}\n onMouseLeave={(event) => {\n onMouseLeave?.(event);\n setHoverDate(null);\n }}\n >\n {children ?? date.getDate()}\n </button>\n );\n },\n [handleDateSelect, hoverDate, rangeEnd, rangeStart],\n );\n\n const hasValue = Boolean(rangeStart || rangeEnd);\n const selectedRange =\n rangeStart || rangeEnd\n ? {\n from: rangeStart ?? undefined,\n to: rangeEnd ?? undefined,\n }\n : undefined;\n\n const displayValue =\n rangeStart && rangeEnd\n ? `${formatDate(rangeStart, format)}${separator}${formatDate(rangeEnd, format)}`\n : rangeStart\n ? formatDate(rangeStart, format)\n : \"\";\n\n const combinedClassName = cn(\"relative\", className);\n\n return (\n <div className={combinedClassName}>\n {/* Hidden inputs for form submission */}\n <input\n type=\"hidden\"\n name={`${name}[start]`}\n value={rangeStart ? rangeStart.toISOString() : \"\"}\n />\n <input\n type=\"hidden\"\n name={`${name}[end]`}\n value={rangeEnd ? rangeEnd.toISOString() : \"\"}\n />\n\n <Popover open={isOpen} onOpenChange={handleOpenChange}>\n {/* Custom date range input */}\n <div className=\"relative\">\n {showIcon && (\n <span\n className=\"absolute left-3 top-1/2 -translate-y-1/2 pointer-events-none\"\n aria-hidden=\"true\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n >\n <path d=\"M8 2v4m8-4v4m5 8V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h8M3 10h18m-5 10l2 2l4-4\" />\n </svg>\n </span>\n )}\n <PopoverTrigger asChild>\n <input\n ref={inputRef}\n id={props.id}\n type=\"text\"\n className={cn(\n \"flex h-9 w-full rounded-md border border-input bg-transparent py-1 text-base shadow-sm transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\",\n \"disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n INPUT_AUTOFILL_RESET_CLASSES,\n showIcon ? \"pl-10\" : \"pl-3\",\n clearable && (rangeStart || rangeEnd) ? \"pr-10\" : \"pr-3\",\n !error && hasValue && \"ring-2 ring-ring\",\n error && \"border-destructive ring-1 ring-destructive\",\n )}\n value={displayValue}\n onClick={handleInputClick}\n onBlur={handleInputBlur}\n disabled={disabled}\n required={required}\n placeholder={placeholder}\n aria-invalid={error || props[\"aria-invalid\"] ? \"true\" : \"false\"}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={required || props[\"aria-required\"]}\n readOnly\n />\n </PopoverTrigger>\n {clearable && (rangeStart || rangeEnd) && !disabled && (\n <button\n type=\"button\"\n className=\"absolute right-3 top-1/2 -translate-y-1/2 transition-colors\"\n onClick={handleClear}\n aria-label=\"Clear date range\"\n tabIndex={-1}\n >\n ✕\n </button>\n )}\n </div>\n\n {!disabled && (\n <PopoverContent\n align=\"start\"\n sideOffset={4}\n className=\"w-auto p-0\"\n onOpenAutoFocus={(event) => {\n event.preventDefault();\n }}\n >\n <Calendar\n mode=\"range\"\n selected={selectedRange}\n month={selectedMonth}\n onMonthChange={setSelectedMonth}\n disabled={disabledMatchers}\n labels={{\n labelGrid: () => \"Calendar\",\n labelDayButton: (date) => formatDate(date, format),\n labelPrevious: () => \"Previous month\",\n labelNext: () => \"Next month\",\n }}\n components={{\n DayButton: RangeDayButton,\n }}\n classNames={{\n today: \"border border-primary rounded-md bg-transparent\",\n }}\n showOutsideDays\n />\n\n {rangeStart && !rangeEnd && (\n <div className=\"border-t border-input px-3 py-2 text-center text-xs opacity-70\">\n Select end date\n </div>\n )}\n </PopoverContent>\n )}\n </Popover>\n </div>\n );\n}\n\nDateRangePicker.displayName = \"DateRangePicker\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Field } from \"../core/Field\";\nimport {\n Checkbox,\n CheckboxGroup,\n DatePicker,\n DateRangePicker,\n FileInput,\n MultiSelect,\n Radio,\n Select,\n TextArea,\n TextInput,\n TimePicker,\n} from \"../inputs\";\nimport { cn } from \"../lib/utils\";\nimport type { FormFieldConfig } from \"./form-field-types\";\n\nexport interface DynamicFormFieldProps {\n field: FormFieldConfig;\n className?: string;\n uploadProgress?: { [fileName: string]: number };\n onFileUpload?: (files: File[]) => Promise<void>;\n onFileRemove?: (file: File, index: number) => void;\n isUploading?: boolean;\n}\n\n/**\n * Dynamic renderer for form field schema configuration.\n */\nexport function DynamicFormField({\n field,\n className,\n uploadProgress = {},\n onFileUpload,\n onFileRemove,\n isUploading = false,\n}: DynamicFormFieldProps): React.JSX.Element {\n const fieldId = field.name;\n const usesGroupLegend =\n field.type === \"radio\" || field.type === \"checkbox-group\";\n const usesInlineCheckboxLabel = field.type === \"checkbox\";\n const shouldRenderFieldLabel = !usesGroupLegend && !usesInlineCheckboxLabel;\n\n return (\n <Field\n name={field.name}\n label={shouldRenderFieldLabel ? field.label : undefined}\n description={shouldRenderFieldLabel ? field.description : undefined}\n required={field.required}\n className={cn(\"space-y-2\", className)}\n >\n {({ field: formField, meta }) => (\n <div>\n {(field.type === \"text\" ||\n field.type === \"email\" ||\n field.type === \"tel\" ||\n field.type === \"search\" ||\n field.type === \"password\" ||\n field.type === \"url\") && (\n <TextInput\n {...formField}\n id={fieldId}\n type={field.type}\n placeholder={field.placeholder}\n error={meta.touched && !!meta.error}\n disabled={field.disabled}\n aria-label={field.label}\n />\n )}\n\n {field.type === \"number\" && (\n <TextInput\n {...formField}\n id={fieldId}\n type=\"text\"\n placeholder={field.placeholder}\n error={meta.touched && !!meta.error}\n disabled={field.disabled}\n aria-label={field.label}\n />\n )}\n\n {field.type === \"textarea\" && (\n <TextArea\n {...formField}\n id={fieldId}\n placeholder={field.placeholder}\n rows={field.rows || 4}\n error={meta.touched && !!meta.error}\n disabled={field.disabled}\n aria-label={field.label}\n />\n )}\n\n {field.type === \"select\" && field.options && (\n <Select\n {...formField}\n id={fieldId}\n options={field.options}\n placeholder={\n field.placeholder || `Select ${field.label.toLowerCase()}`\n }\n error={meta.touched && !!meta.error}\n disabled={field.disabled}\n aria-label={field.label}\n />\n )}\n\n {field.type === \"multi-select\" && field.options && (\n <MultiSelect\n {...formField}\n id={fieldId}\n options={field.options}\n placeholder={\n field.placeholder || `Select ${field.label.toLowerCase()}`\n }\n error={meta.touched && !!meta.error}\n disabled={field.disabled}\n aria-label={field.label}\n />\n )}\n\n {field.type === \"radio\" && field.options && (\n <Radio\n {...formField}\n id={fieldId}\n options={field.options}\n label={field.label}\n description={field.description}\n required={field.required}\n disabled={field.disabled}\n layout={field.layout || \"stacked\"}\n error={meta.touched && !!meta.error}\n aria-label={field.label}\n />\n )}\n\n {field.type === \"checkbox\" && (\n <Checkbox\n {...formField}\n id={fieldId}\n value={formField.value === true || formField.value === \"true\"}\n onChange={(checked) => formField.onChange(checked)}\n label={field.label}\n description={field.description}\n disabled={field.disabled}\n required={field.required}\n error={meta.touched && !!meta.error}\n aria-label={field.label}\n />\n )}\n\n {field.type === \"checkbox-group\" && field.options && (\n <CheckboxGroup\n {...formField}\n id={fieldId}\n options={field.options}\n label={field.label}\n description={field.description}\n required={field.required}\n disabled={field.disabled}\n layout={field.layout || \"stacked\"}\n error={meta.touched && !!meta.error}\n aria-label={field.label}\n />\n )}\n\n {(field.type === \"date-picker\" || field.type === \"date\") && (\n <DatePicker\n {...formField}\n id={fieldId}\n placeholder={field.placeholder}\n error={meta.touched && !!meta.error}\n disabled={field.disabled}\n aria-label={field.label}\n />\n )}\n\n {field.type === \"date-range\" && (\n <DateRangePicker\n {...formField}\n id={fieldId}\n placeholder={field.placeholder}\n error={meta.touched && !!meta.error}\n disabled={field.disabled}\n aria-label={field.label}\n />\n )}\n\n {field.type === \"time\" && (\n <TimePicker\n {...formField}\n id={fieldId}\n placeholder={field.placeholder}\n error={meta.touched && !!meta.error}\n disabled={field.disabled}\n aria-label={field.label}\n />\n )}\n\n {field.type === \"file\" && (\n <FileInput\n {...formField}\n id={fieldId}\n accept={field.accept}\n maxSize={field.maxSize || 5 * 1024 * 1024}\n maxFiles={field.maxFiles || 1}\n multiple={field.multiple || false}\n placeholder={field.placeholder || \"Choose file(s)...\"}\n error={meta.touched && !!meta.error}\n disabled={field.disabled || isUploading}\n showProgress\n uploadProgress={uploadProgress}\n onChange={(files) => {\n formField.onChange(files);\n if (files.length > 0 && onFileUpload) {\n onFileUpload(files);\n }\n }}\n onFileRemove={onFileRemove}\n aria-label={field.label}\n />\n )}\n </div>\n )}\n </Field>\n );\n}\n"]}
|