@yomologic/react-ui 0.6.0 → 0.6.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/dist/index.js +13 -13
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +13 -13
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +31 -0
- package/dist/styles.css.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/ui/button.tsx","../src/lib/utils.ts","../src/ui/input.tsx","../src/ui/hooks/useFormField.ts","../src/ui/form.tsx","../src/ui/form-control.tsx","../src/ui/textarea.tsx","../src/ui/card.tsx","../src/ui/badge.tsx","../src/ui/checkbox.tsx","../src/ui/radio.tsx","../src/ui/select.tsx","../src/ui/native-select.tsx","../src/ui/spinner.tsx","../src/ui/code-snippet.tsx","../src/ui/rating.tsx","../src/ui/divider.tsx","../src/ui/slider.tsx","../src/ui/switch.tsx","../src/ui/dialog.tsx","../src/feedback/alert.tsx","../src/layout/container.tsx","../src/layout/section-layout.tsx","../src/layout/nav.tsx","../src/layout/drawer.tsx","../src/layout/sidebar-nav.tsx","../src/shared/empty-state.tsx","../src/contexts/ThemeProvider.tsx","../src/themes/dark.json","../src/themes/light.json","../src/themes/index.ts"],"sourcesContent":["// UI Components\nexport { Button } from \"./ui/button\";\nexport { Input } from \"./ui/input\";\nexport { Textarea } from \"./ui/textarea\";\nexport type { TextareaProps } from \"./ui/textarea\";\nexport {\n Card,\n CardHeader,\n CardTitle,\n CardDescription,\n CardContent,\n CardFooter,\n CardMedia,\n CardActions,\n CardActionArea,\n} from \"./ui/card\";\nexport { Badge } from \"./ui/badge\";\nexport { Checkbox, CheckboxGroup } from \"./ui/checkbox\";\nexport { RadioGroup } from \"./ui/radio\";\nexport { Select } from \"./ui/select\";\nexport type { SelectOption, SelectProps } from \"./ui/select\";\nexport { NativeSelect } from \"./ui/native-select\";\nexport type { NativeSelectProps } from \"./ui/native-select\";\nexport { Form, useForm, useFormContext } from \"./ui/form\";\nexport type {\n FormState,\n FormContextValue,\n ValidationFunction,\n} from \"./ui/form\";\nexport {\n FormControl,\n FormControlLabel,\n FormHelperText,\n useFormControl,\n useFormControlContext,\n useFormField,\n} from \"./ui/form-control\";\nexport type {\n FormControlProps,\n FormControlState,\n FormControlContextValue,\n FormFieldProps,\n ValidationRule,\n} from \"./ui/form-control\";\nexport { Spinner } from \"./ui/spinner\";\nexport { CodeSnippet } from \"./ui/code-snippet\";\nexport { Rating } from \"./ui/rating\";\nexport { Divider } from \"./ui/divider\";\nexport { Slider } from \"./ui/slider\";\nexport type { SliderProps, SliderMark } from \"./ui/slider\";\nexport { Switch } from \"./ui/switch\";\nexport type { SwitchProps } from \"./ui/switch\";\nexport {\n Dialog,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogContent,\n DialogFooter,\n} from \"./ui/dialog\";\n\n// Feedback Components\nexport { Alert } from \"./feedback/alert\";\n\n// Layout Components\nexport { Container } from \"./layout/container\";\nexport { SectionLayout } from \"./layout/section-layout\";\nexport { Nav } from \"./layout/nav\";\nexport type { NavItem, NavProps } from \"./layout/nav\";\nexport { Drawer } from \"./layout/drawer\";\nexport type {\n DrawerProps,\n NavItem as DrawerNavItem,\n NavSection as DrawerNavSection,\n} from \"./layout/drawer\";\n\n/** @deprecated Use Drawer component instead. SidebarNav will be removed in v1.0.0 */\nexport { SidebarNav } from \"./layout/sidebar-nav\";\nexport type {\n NavItem as SidebarNavItem,\n NavSection,\n} from \"./layout/sidebar-nav\";\n\n// Shared Components\nexport { EmptyState } from \"./shared/empty-state\";\n\n// Theme System\nexport { ThemeProvider, useTheme } from \"./contexts/ThemeProvider\";\nexport { default as themes } from \"./themes\";\nexport type { ThemeId } from \"./themes\";\n\n// Utility functions\nexport { cn } from \"./lib/utils\";\n","import React from \"react\";\nimport { cn } from \"../lib/utils\";\n\ntype ButtonBaseProps = {\n variant?:\n | \"primary\"\n | \"secondary\"\n | \"outline\"\n | \"ghost\"\n | \"info\"\n | \"success\"\n | \"warning\"\n | \"error\";\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n isLoading?: boolean;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n children?: React.ReactNode;\n className?: string;\n};\n\ntype ButtonAsButton = ButtonBaseProps &\n Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n keyof ButtonBaseProps\n > & {\n href?: never;\n };\n\ntype ButtonAsLink = ButtonBaseProps &\n Omit<\n React.AnchorHTMLAttributes<HTMLAnchorElement>,\n keyof ButtonBaseProps\n > & {\n href: string;\n };\n\nexport type ButtonProps = ButtonAsButton | ButtonAsLink;\n\nconst Button = React.forwardRef<\n HTMLButtonElement | HTMLAnchorElement,\n ButtonProps\n>(\n (\n {\n className,\n variant = \"primary\",\n size = \"md\",\n isLoading = false,\n leftIcon,\n rightIcon,\n children,\n ...props\n },\n ref\n ) => {\n const baseStyles =\n \"inline-flex items-center justify-center cursor-pointer transition-all duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:brightness-100 no-underline\";\n\n const variants = {\n primary:\n \"bg-[var(--color-primary)] text-[var(--button-primary-text)] hover:brightness-90 active:brightness-75\",\n secondary:\n \"bg-[var(--color-secondary)] text-[var(--button-secondary-text)] hover:brightness-90 active:brightness-75\",\n outline:\n \"border-2 border-[var(--color-primary)] text-[var(--color-primary)] bg-transparent\",\n ghost: \"bg-transparent text-[var(--color-foreground)]\",\n info: \"bg-[var(--color-info-muted)] border-2 border-[var(--color-info-border)] text-[var(--color-info-muted-foreground)] hover:brightness-95 active:brightness-90\",\n success:\n \"bg-[var(--color-success-muted)] border-2 border-[var(--color-success-border)] text-[var(--color-success-muted-foreground)] hover:brightness-95 active:brightness-90\",\n warning:\n \"bg-[var(--color-warning-muted)] border-2 border-[var(--color-warning-border)] text-[var(--color-warning-muted-foreground)] hover:brightness-95 active:brightness-90\",\n error: \"bg-[var(--color-error-muted)] border-2 border-[var(--color-error-border)] text-[var(--color-error-muted-foreground)] hover:brightness-95 active:brightness-90\",\n };\n const sizes = {\n xs: \"[font-size:var(--button-font-size-xs)] [padding-left:var(--button-padding-xs-x)] [padding-right:var(--button-padding-xs-x)] [padding-top:var(--button-padding-xs-y)] [padding-bottom:var(--button-padding-xs-y)] gap-1\",\n sm: \"[font-size:var(--button-font-size-sm)] [padding-left:var(--button-padding-sm-x)] [padding-right:var(--button-padding-sm-x)] [padding-top:var(--button-padding-sm-y)] [padding-bottom:var(--button-padding-sm-y)] gap-1.5\",\n md: \"[font-size:var(--button-font-size-md)] [padding-left:var(--button-padding-md-x)] [padding-right:var(--button-padding-md-x)] [padding-top:var(--button-padding-md-y)] [padding-bottom:var(--button-padding-md-y)] gap-2\",\n lg: \"[font-size:var(--button-font-size-lg)] [padding-left:var(--button-padding-lg-x)] [padding-right:var(--button-padding-lg-x)] [padding-top:var(--button-padding-lg-y)] [padding-bottom:var(--button-padding-lg-y)] gap-2.5\",\n xl: \"[font-size:var(--button-font-size-xl)] [padding-left:var(--button-padding-xl-x)] [padding-right:var(--button-padding-xl-x)] [padding-top:var(--button-padding-xl-y)] [padding-bottom:var(--button-padding-xl-y)] gap-3\",\n };\n\n const radiusStyle = \"[border-radius:var(--button-radius)]\";\n const fontWeightStyle = \"[font-weight:var(--button-font-weight)]\";\n\n const classNames = cn(\n baseStyles,\n variants[variant],\n sizes[size],\n radiusStyle,\n fontWeightStyle,\n className\n );\n\n const handleMouseEnter = (e: React.MouseEvent<HTMLElement>) => {\n if (variant === \"ghost\") {\n e.currentTarget.style.backgroundColor =\n \"rgba(99, 102, 241, 0.08)\";\n } else if (variant === \"outline\") {\n e.currentTarget.style.backgroundColor =\n \"rgba(59, 130, 246, 0.12)\";\n }\n };\n\n const handleMouseLeave = (e: React.MouseEvent<HTMLElement>) => {\n if (variant === \"ghost\" || variant === \"outline\") {\n e.currentTarget.style.backgroundColor = \"\";\n }\n };\n\n const handleMouseDown = (e: React.MouseEvent<HTMLElement>) => {\n if (variant === \"ghost\") {\n e.currentTarget.style.backgroundColor =\n \"rgba(99, 102, 241, 0.16)\";\n } else if (variant === \"outline\") {\n e.currentTarget.style.backgroundColor =\n \"rgba(59, 130, 246, 0.24)\";\n }\n };\n\n const handleMouseUp = (e: React.MouseEvent<HTMLElement>) => {\n if (variant === \"ghost\") {\n e.currentTarget.style.backgroundColor =\n \"rgba(99, 102, 241, 0.08)\";\n } else if (variant === \"outline\") {\n e.currentTarget.style.backgroundColor =\n \"rgba(59, 130, 246, 0.12)\";\n }\n };\n\n const content = (\n <>\n {isLoading && (\n <svg\n className=\"animate-spin h-4 w-4\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n ></circle>\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n )}\n {!isLoading && leftIcon && leftIcon}\n {children}\n {!isLoading && rightIcon && rightIcon}\n </>\n );\n\n if (\"href\" in props && props.href) {\n const { href, ...rest } = props as ButtonAsLink;\n return (\n <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={href}\n className={classNames}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onMouseDown={handleMouseDown}\n onMouseUp={handleMouseUp}\n {...rest}\n >\n {content}\n </a>\n );\n }\n\n const { disabled, ...rest } = props as ButtonAsButton;\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n className={classNames}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onMouseDown={handleMouseDown}\n onMouseUp={handleMouseUp}\n disabled={disabled || isLoading}\n {...rest}\n >\n {content}\n </button>\n );\n }\n);\n\nButton.displayName = \"Button\";\n\nexport { Button };\n","import { clsx, type ClassValue } from \"clsx\";\n\nexport function cn(...inputs: ClassValue[]) {\n return clsx(inputs);\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { ValidationFunction } from \"./form\";\nimport { useFormField } from \"./hooks/useFormField\";\n\nexport interface InputProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"pattern\"\n> {\n /** Field name - required when used inside Form */\n name?: string;\n label?: string;\n error?: string;\n helperText?: string;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n fullWidth?: boolean;\n /** Custom validation function that returns error message or undefined if valid */\n validate?: ValidationFunction;\n /** Callback when validation error changes */\n onValidationError?: (error: string | undefined) => void;\n /** Regex pattern for validation (string or RegExp) */\n pattern?: RegExp | string;\n /** Custom error messages for built-in validations */\n errorMessages?: {\n required?: string;\n minLength?: string;\n maxLength?: string;\n min?: string;\n max?: string;\n pattern?: string;\n email?: string;\n url?: string;\n };\n}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n (\n {\n className,\n type = \"text\",\n name,\n label,\n error,\n helperText,\n leftIcon,\n rightIcon,\n fullWidth = false,\n id,\n onChange,\n onBlur,\n value: externalValue,\n validate,\n onValidationError,\n pattern,\n errorMessages,\n ...props\n },\n ref\n ) => {\n // Use the custom hook to handle all form field logic\n const {\n fieldId,\n value: inputValue,\n error: inputError,\n isDisabled,\n isRequired,\n shouldRenderLabel,\n shouldRenderError,\n handleChange: hookHandleChange,\n handleBlur: hookHandleBlur,\n internalRef,\n } = useFormField({\n name,\n type,\n value: externalValue,\n error,\n id,\n required: props.required,\n disabled: props.disabled,\n minLength: props.minLength,\n maxLength: props.maxLength,\n min: props.min,\n max: props.max,\n pattern,\n validate,\n onValidationError,\n errorMessages,\n idPrefix: \"input\",\n });\n\n // Wrap hook handlers to call external handlers\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n hookHandleChange(e.target.value);\n onChange?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n hookHandleBlur(e.target.value);\n onBlur?.(e);\n };\n\n return (\n <div\n className={cn(\"flex flex-col\", fullWidth && \"w-full\")}\n style={{ marginBottom: \"var(--form-control-spacing)\" }}\n >\n {shouldRenderLabel && label && (\n <label\n htmlFor={fieldId}\n className=\"block text-small font-semibold text-(--color-muted-foreground) mb-1\"\n >\n {label}\n {isRequired && <span className=\"ml-1\">*</span>}\n </label>\n )}\n\n <div className=\"relative\">\n {leftIcon && (\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none text-(--color-placeholder)\">\n {leftIcon}\n </div>\n )}\n\n <input\n ref={(node) => {\n // Handle both refs\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n (internalRef as any).current = node;\n }}\n type={type}\n id={fieldId}\n value={inputValue}\n onChange={handleChange}\n onBlur={handleBlur}\n disabled={isDisabled}\n required={isRequired}\n pattern={\n pattern instanceof RegExp ? pattern.source : pattern\n }\n aria-invalid={!!inputError}\n aria-describedby={\n inputError\n ? `${fieldId}-error`\n : helperText\n ? `${fieldId}-helper`\n : undefined\n }\n className={cn(\n \"w-full px-3 py-2 border rounded-md transition-colors\",\n \"text-(--color-foreground) placeholder-gray-400\",\n \"focus:outline-none\",\n \"disabled:bg-(--color-muted) disabled:cursor-not-allowed disabled:text-(--color-muted-foreground)\",\n inputError\n ? \"border-error focus:ring-2 focus:ring-error focus:border-error active:border-error\"\n : \"border-(--color-border) focus:ring-2 focus:ring-(--color-primary)/30 focus:border-(--color-primary) active:border-(--color-primary)\",\n leftIcon && \"pl-10\",\n rightIcon && \"pr-10\",\n className\n )}\n {...props}\n />\n\n {rightIcon && (\n <div className=\"absolute inset-y-0 right-0 pr-3 flex items-center pointer-events-none text-(--color-placeholder)\">\n {rightIcon}\n </div>\n )}\n </div>\n\n <div className=\"h-5 mt-1.5\">\n {shouldRenderError && inputError && (\n <p\n className=\"text-small text-error\"\n id={`${fieldId}-error`}\n role=\"alert\"\n >\n {inputError}\n </p>\n )}\n\n {helperText && !inputError && shouldRenderLabel && (\n <p\n className=\"text-small text-(--color-muted-foreground)\"\n id={`${fieldId}-helper`}\n >\n {helperText}\n </p>\n )}\n </div>\n </div>\n );\n }\n);\n\nInput.displayName = \"Input\";\n\nexport { Input };\n","import { useEffect, useId, useRef, useState } from \"react\";\nimport { useForm, ValidationFunction } from \"../form\";\nimport { useFormControl } from \"../form-control\";\n\n/**\n * Configuration options for useFormField hook\n */\nexport interface UseFormFieldOptions {\n /** Field name - required when used inside Form */\n name?: string;\n /** Field type (for input-specific validations like email, url, number) */\n type?: string;\n /** External controlled value */\n value?: any;\n /** External error message */\n error?: string;\n /** Custom ID for the field */\n id?: string;\n /** Whether field is required */\n required?: boolean;\n /** Whether field is disabled */\n disabled?: boolean;\n /** Minimum length validation */\n minLength?: number;\n /** Maximum length validation */\n maxLength?: number;\n /** Minimum value (for numbers) */\n min?: number | string;\n /** Maximum value (for numbers) */\n max?: number | string;\n /** Pattern validation (RegExp or string) */\n pattern?: RegExp | string;\n /** Custom validation function */\n validate?: ValidationFunction;\n /** Callback when validation error changes */\n onValidationError?: (error: string | undefined) => void;\n /** Custom error messages for built-in validations */\n errorMessages?: {\n required?: string;\n minLength?: string;\n maxLength?: string;\n min?: string;\n max?: string;\n pattern?: string;\n email?: string;\n url?: string;\n };\n /** Prefix for auto-generated IDs (e.g., 'input', 'textarea') */\n idPrefix?: string;\n}\n\n/**\n * Return type from useFormField hook\n */\nexport interface UseFormFieldResult {\n /** Stable field ID for htmlFor/aria attributes */\n fieldId: string;\n /** Current field value (respects priority: Form > FormControl > props) */\n value: any;\n /** Current error message (if any) */\n error: string | undefined;\n /** Whether the field is disabled */\n isDisabled: boolean;\n /** Whether the field is required */\n isRequired: boolean;\n /** Whether to show the label (not in FormControl) */\n shouldRenderLabel: boolean;\n /** Whether to show the error (not in FormControl) */\n shouldRenderError: boolean;\n /** onChange handler that integrates with all contexts */\n handleChange: (value: string) => void;\n /** onBlur handler that marks field as touched and validates */\n handleBlur: (value: string) => void;\n /** Internal ref for the field element */\n internalRef: React.RefObject<any>;\n}\n\n/**\n * Custom hook that encapsulates all form field logic:\n * - Context integration (Form and FormControl)\n * - Validation (built-in and custom)\n * - State management\n * - Event handling\n * - Registration lifecycle\n *\n * This eliminates code duplication across Input, Textarea, Select, etc.\n */\nexport function useFormField(options: UseFormFieldOptions): UseFormFieldResult {\n const {\n name,\n type = \"text\",\n value: externalValue,\n error: externalError,\n id,\n required = false,\n disabled = false,\n minLength,\n maxLength,\n min,\n max,\n pattern,\n validate,\n onValidationError,\n errorMessages,\n idPrefix = \"field\",\n } = options;\n\n const autoId = useId();\n const form = useForm();\n const formControl = useFormControl();\n const internalRef = useRef<any>(null);\n const [validationError, setValidationError] = useState<\n string | undefined\n >();\n\n // Generate stable ID only once\n const stableId = useRef<string | undefined>(undefined);\n if (!stableId.current) {\n stableId.current =\n id || formControl?.fieldId || `${idPrefix}-${autoId}`;\n }\n const fieldId = stableId.current;\n\n // Priority: Form context > FormControl context > props\n const isDisabled = disabled || formControl?.isDisabled || false;\n const isRequired = required || formControl?.isRequired || false;\n\n // Determine value and error based on context priority\n let fieldValue: any;\n let fieldError: string | undefined;\n\n if (form && name) {\n // Using Form context\n fieldError = form.shouldShowError(name)\n ? form.getFieldError(name)\n : undefined;\n fieldValue =\n form.values[name] !== undefined\n ? form.values[name]\n : (externalValue ?? \"\");\n } else if (formControl) {\n // Using FormControl context (backwards compat)\n fieldError = formControl.error || externalError || validationError;\n fieldValue = formControl.value ?? externalValue;\n } else {\n // Standalone usage\n fieldError = externalError || validationError;\n fieldValue = externalValue;\n }\n\n /**\n * Built-in validation logic supporting:\n * - required\n * - minLength/maxLength\n * - min/max (for numbers)\n * - pattern (regex)\n * - email format\n * - URL format\n */\n const runBuiltInValidation = (value: string): string | undefined => {\n // Required validation\n if (isRequired && !value) {\n return errorMessages?.required || \"This field is required\";\n }\n\n if (value) {\n // Email validation (for type=\"email\")\n if (type === \"email\" && !value.includes(\"@\")) {\n return (\n errorMessages?.email || \"Please enter a valid email address\"\n );\n }\n\n // URL validation (for type=\"url\")\n if (type === \"url\") {\n try {\n new URL(value);\n } catch {\n return errorMessages?.url || \"Please enter a valid URL\";\n }\n }\n\n // Number range validation (for type=\"number\")\n if (type === \"number\") {\n const numValue = parseFloat(value);\n if (min !== undefined && numValue < Number(min)) {\n return errorMessages?.min || `Minimum value is ${min}`;\n }\n if (max !== undefined && numValue > Number(max)) {\n return errorMessages?.max || `Maximum value is ${max}`;\n }\n }\n\n // String length validations\n if (minLength !== undefined && value.length < minLength) {\n return (\n errorMessages?.minLength ||\n `Minimum length is ${minLength} characters`\n );\n }\n\n if (maxLength !== undefined && value.length > maxLength) {\n return (\n errorMessages?.maxLength ||\n `Maximum length is ${maxLength} characters`\n );\n }\n\n // Pattern validation\n if (pattern) {\n const regex =\n typeof pattern === \"string\" ? new RegExp(pattern) : pattern;\n if (!regex.test(value)) {\n return errorMessages?.pattern || \"Invalid format\";\n }\n }\n }\n\n return undefined;\n };\n\n /**\n * Run validation (built-in + custom)\n */\n const runValidation = async (value: string) => {\n // Run built-in validation first\n const builtInError = runBuiltInValidation(value);\n if (builtInError) {\n setValidationError(builtInError);\n onValidationError?.(builtInError);\n return;\n }\n\n // Run custom validation if provided\n if (validate) {\n const customError = await validate(value);\n setValidationError(customError);\n onValidationError?.(customError);\n return;\n }\n\n // No errors\n setValidationError(undefined);\n onValidationError?.(undefined);\n };\n\n /**\n * Register field with Form or FormControl on mount\n */\n useEffect(() => {\n if (form && name) {\n // Create validator function for Form registration\n const validator: ValidationFunction = async (value: string) => {\n // Built-in validation\n if (isRequired && !value) {\n return errorMessages?.required || \"This field is required\";\n }\n\n if (value) {\n // Type-specific validation\n if (type === \"email\" && !value.includes(\"@\")) {\n return (\n errorMessages?.email ||\n \"Please enter a valid email address\"\n );\n }\n\n if (type === \"url\") {\n try {\n new URL(value);\n } catch {\n return (\n errorMessages?.url || \"Please enter a valid URL\"\n );\n }\n }\n\n if (type === \"number\") {\n const numValue = parseFloat(value);\n if (min !== undefined && numValue < Number(min)) {\n return (\n errorMessages?.min || `Minimum value is ${min}`\n );\n }\n if (max !== undefined && numValue > Number(max)) {\n return (\n errorMessages?.max || `Maximum value is ${max}`\n );\n }\n }\n\n if (minLength !== undefined && value.length < minLength) {\n return (\n errorMessages?.minLength ||\n `Minimum length is ${minLength} characters`\n );\n }\n\n if (maxLength !== undefined && value.length > maxLength) {\n return (\n errorMessages?.maxLength ||\n `Maximum length is ${maxLength} characters`\n );\n }\n\n if (pattern) {\n const regex =\n typeof pattern === \"string\"\n ? new RegExp(pattern)\n : pattern;\n if (!regex.test(value)) {\n return errorMessages?.pattern || \"Invalid format\";\n }\n }\n }\n\n // Custom validation\n if (validate) {\n return await validate(value);\n }\n\n return undefined;\n };\n\n // Register with Form\n form.registerField(name, validator);\n return () => form.unregisterField(name);\n } else if (formControl) {\n // Register with FormControl (backwards compat)\n const element = internalRef.current;\n if (element) {\n formControl.registerControl(element);\n return () => formControl.unregisterControl(element);\n }\n }\n }, [\n form,\n formControl,\n name,\n isRequired,\n type,\n min,\n max,\n minLength,\n maxLength,\n pattern,\n validate,\n errorMessages,\n ]);\n\n /**\n * Handle change event\n * Updates Form/FormControl/standalone state\n */\n const handleChange = (value: string) => {\n if (form && name) {\n // Update Form context\n form.setFieldValue(name, value);\n } else if (formControl) {\n // Update FormControl (backwards compat)\n formControl.setValue(value);\n } else {\n // Standalone - run validation\n runValidation(value);\n }\n };\n\n /**\n * Handle blur event\n * Marks field as touched and triggers validation\n */\n const handleBlur = (value: string) => {\n if (form && name) {\n // Mark as touched in Form\n form.setFieldTouched(name, true);\n // Validate on blur\n form.validateField(name, value);\n } else if (formControl) {\n // Mark as touched in FormControl (backwards compat)\n formControl.setTouched(true);\n } else {\n // Standalone - run validation if value exists\n if (value) {\n runValidation(value);\n }\n }\n };\n\n // Determine if we should render label/error\n // If used within FormControl, don't render (FormControl handles it)\n // If used within Form, render everything (Form doesn't wrap controls)\n const shouldRenderLabel = !formControl;\n const shouldRenderError = !!fieldError && !formControl;\n\n return {\n fieldId,\n value: fieldValue,\n error: fieldError,\n isDisabled,\n isRequired,\n shouldRenderLabel,\n shouldRenderError,\n handleChange,\n handleBlur,\n internalRef,\n };\n}\n","\"use client\";\n\nimport {\n createContext,\n useContext,\n useState,\n useCallback,\n FormEvent,\n ReactNode,\n} from \"react\";\n\n// ============================================================================\n// TYPES & INTERFACES\n// ============================================================================\n\nexport interface FormState {\n values: Record<string, any>;\n errors: Record<string, string>;\n touched: Record<string, boolean>;\n isSubmitting: boolean;\n isSubmitted: boolean;\n}\n\nexport interface FormContextValue extends FormState {\n registerField: (name: string, validate?: ValidationFunction) => void;\n unregisterField: (name: string) => void;\n setFieldValue: (name: string, value: any) => void;\n setFieldTouched: (name: string, touched: boolean) => void;\n validateField: (name: string, value?: any) => Promise<void>;\n getFieldError: (name: string) => string | undefined;\n shouldShowError: (name: string) => boolean;\n}\n\nexport type ValidationFunction = (\n value: any\n) => string | undefined | Promise<string | undefined>;\n\ninterface FormProps {\n children: ReactNode;\n onSubmit: (values: Record<string, any>) => void | Promise<void>;\n className?: string;\n spacing?: \"none\" | \"dense\" | \"normal\";\n}\n\n// ============================================================================\n// CONTEXT\n// ============================================================================\n\nconst FormContext = createContext<FormContextValue | null>(null);\n\nexport function useFormContext() {\n const context = useContext(FormContext);\n if (!context) {\n throw new Error(\"Form components must be used within a Form component\");\n }\n return context;\n}\n\n// Hook for form controls to use (optional - only if within Form)\nexport function useForm() {\n return useContext(FormContext);\n}\n\n// ============================================================================\n// FORM COMPONENT\n// ============================================================================\n\nexport function Form({\n children,\n onSubmit,\n className,\n spacing = \"normal\",\n}: FormProps) {\n const spacingValues = {\n none: \"0\",\n dense: \"0.5rem\",\n normal: \"1rem\",\n };\n const [state, setState] = useState<FormState>({\n values: {},\n errors: {},\n touched: {},\n isSubmitting: false,\n isSubmitted: false,\n });\n\n // Store validation functions for each field\n const [validators] = useState<Map<string, ValidationFunction>>(new Map());\n\n const registerField = useCallback(\n (name: string, validate?: ValidationFunction) => {\n if (validate) {\n validators.set(name, validate);\n }\n // Don't initialize values here - let them be undefined until user interacts\n // This way we don't submit empty strings for untouched fields\n },\n [validators]\n );\n\n const unregisterField = useCallback(\n (name: string) => {\n validators.delete(name);\n // Don't update state here - it causes infinite loops\n // The field values will be cleaned up naturally on form reset/submit\n },\n [validators]\n );\n\n const setFieldValue = useCallback((name: string, value: any) => {\n setState((prev) => {\n // Clear error for this field when value changes\n const newErrors = { ...prev.errors };\n delete newErrors[name];\n\n return {\n ...prev,\n values: { ...prev.values, [name]: value },\n errors: newErrors,\n };\n });\n }, []);\n\n const setFieldTouched = useCallback((name: string, touched: boolean) => {\n setState((prev) => ({\n ...prev,\n touched: { ...prev.touched, [name]: touched },\n }));\n }, []);\n\n const getFieldError = useCallback(\n (name: string) => {\n return state.errors[name];\n },\n [state.errors]\n );\n\n const shouldShowError = useCallback(\n (name: string) => {\n // Show error if form is submitted OR if field is touched\n return (\n (state.isSubmitted || state.touched[name]) &&\n !!state.errors[name]\n );\n },\n [state.isSubmitted, state.touched, state.errors]\n );\n\n const validateFieldInternal = async (\n name: string,\n value: any\n ): Promise<string | undefined> => {\n const validator = validators.get(name);\n if (!validator) return undefined;\n\n try {\n const error = await validator(value);\n return error;\n } catch {\n return \"Validation error\";\n }\n };\n\n const validateField = useCallback(\n async (name: string, providedValue?: any) => {\n // Use provided value if explicitly passed (including undefined), otherwise get from state\n const value =\n arguments.length > 1 ? providedValue : state.values[name];\n const error = await validateFieldInternal(name, value);\n\n setState((prev) => {\n const newErrors = { ...prev.errors };\n if (error) {\n newErrors[name] = error;\n } else {\n delete newErrors[name];\n }\n return { ...prev, errors: newErrors };\n });\n },\n [state.values, validators]\n );\n\n const validateAllFields = async (): Promise<boolean> => {\n const errors: Record<string, string> = {};\n const validationPromises: Promise<void>[] = [];\n\n validators.forEach((_validator, name) => {\n const value = state.values[name];\n validationPromises.push(\n validateFieldInternal(name, value).then((error) => {\n if (error) {\n errors[name] = error;\n }\n })\n );\n });\n\n await Promise.all(validationPromises);\n\n setState((prev) => ({\n ...prev,\n errors,\n }));\n\n return Object.keys(errors).length === 0;\n };\n\n const handleSubmit = async (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n setState((prev) => ({\n ...prev,\n isSubmitting: true,\n isSubmitted: true,\n }));\n\n const isValid = await validateAllFields();\n\n if (isValid) {\n try {\n await onSubmit(state.values);\n } catch (error) {\n console.error(\"Form submission error:\", error);\n }\n }\n\n setState((prev) => ({\n ...prev,\n isSubmitting: false,\n }));\n };\n\n const contextValue: FormContextValue = {\n ...state,\n registerField,\n unregisterField,\n setFieldValue,\n setFieldTouched,\n validateField,\n getFieldError,\n shouldShowError,\n };\n\n return (\n <FormContext.Provider value={contextValue}>\n <form\n onSubmit={handleSubmit}\n className={className}\n noValidate\n style={{\n [\"--form-control-spacing\" as any]: spacingValues[spacing],\n }}\n >\n {children}\n </form>\n </FormContext.Provider>\n );\n}\n","\"use client\";\n\nimport {\n createContext,\n useContext,\n useState,\n useCallback,\n useId,\n useRef,\n ReactNode,\n cloneElement,\n isValidElement,\n Children,\n} from \"react\";\nimport { cn } from \"../lib/utils\";\n\n// ============================================================================\n// TYPES & INTERFACES\n// ============================================================================\n\nexport interface FormControlState {\n /** Whether the field has been modified from its initial value */\n isDirty: boolean;\n /** Whether the field has been interacted with (focused) */\n isTouched: boolean;\n /** Whether the field value passes validation */\n isValid: boolean;\n /** Whether the field is required */\n isRequired: boolean;\n /** Whether the field is disabled */\n isDisabled: boolean;\n /** Whether the field is currently being validated */\n isValidating: boolean;\n /** Error message if validation fails */\n error?: string;\n /** Current field value */\n value: any;\n}\n\nexport interface FormControlContextValue extends FormControlState {\n /** Unique ID for the field */\n fieldId: string;\n /** Name attribute for the field */\n name?: string;\n /** Register a control (input, select, etc.) with the form control */\n registerControl: (control: HTMLElement) => void;\n /** Unregister a control */\n unregisterControl: (control: HTMLElement) => void;\n /** Update the field value */\n setValue: (value: any) => void;\n /** Mark the field as touched */\n setTouched: (touched: boolean) => void;\n /** Set validation error */\n setError: (error?: string) => void;\n /** Trigger validation */\n validate: () => Promise<boolean>;\n}\n\n/** Props to inject into child component when using asChild or render props */\nexport interface FormFieldProps {\n id: string;\n name?: string;\n value: any;\n onChange: (e: any) => void;\n onBlur: () => void;\n disabled?: boolean;\n required?: boolean;\n \"aria-invalid\"?: boolean;\n \"aria-describedby\"?: string;\n}\n\nexport interface ValidationRule {\n /** Validation function that returns true if valid, false or error message if invalid */\n validate: (\n value: any,\n formData?: any\n ) => boolean | string | Promise<boolean | string>;\n /** Error message to display when validation fails */\n message?: string;\n}\n\nexport interface FormControlProps {\n /** The name attribute for the form field */\n name?: string;\n /** The default value for the field */\n defaultValue?: any;\n /** Controlled value */\n value?: any;\n /** Callback when value changes */\n onChange?: (value: any) => void;\n /** Callback when field is blurred */\n onBlur?: () => void;\n /** Whether the field is required (shows asterisk in label) */\n required?: boolean;\n /** Whether the field is disabled */\n disabled?: boolean;\n /** Error message to display */\n error?: string;\n /** Helper text to display below the field */\n helperText?: string;\n /** Validation rules */\n validate?:\n | ValidationRule\n | ValidationRule[]\n | ((value: any) => boolean | string | Promise<boolean | string>);\n /** Whether to validate on change */\n validateOnChange?: boolean;\n /** Whether to validate on blur */\n validateOnBlur?: boolean;\n /** Label for the field */\n label?: string;\n /** Additional CSS classes */\n className?: string;\n /**\n * Child components - can be:\n * 1. Component that uses useFormControl() hook\n * 2. Render function: (fieldProps) => ReactNode\n * 3. Single child element when using asChild\n */\n children:\n | ReactNode\n | ((props: FormFieldProps & FormControlState) => ReactNode);\n /**\n * When true, merges props into the child element instead of wrapping\n * Similar to Radix UI's asChild pattern\n */\n asChild?: boolean;\n}\n\n// ============================================================================\n// CONTEXT\n// ============================================================================\n\nconst FormControlContext = createContext<FormControlContextValue | null>(null);\n\nexport function useFormControlContext() {\n const context = useContext(FormControlContext);\n if (!context) {\n throw new Error(\n \"useFormControlContext must be used within a FormControl\"\n );\n }\n return context;\n}\n\n// Optional hook that returns null if not within FormControl (for flexible usage)\nexport function useFormControl() {\n return useContext(FormControlContext);\n}\n\n/**\n * Hook for creating custom form fields with full FormControl integration\n * Returns field props and state for easy integration\n *\n * @example\n * function CustomInput() {\n * const { fieldProps, state } = useFormField();\n * return (\n * <input\n * {...fieldProps}\n * className={state.error ? 'border-red-500' : 'border-(--color-border)'}\n * />\n * );\n * }\n */\nexport function useFormField() {\n const formControl = useFormControl();\n\n if (!formControl) {\n throw new Error(\"useFormField must be used within a FormControl\");\n }\n\n const fieldProps: FormFieldProps = {\n id: formControl.fieldId,\n name: formControl.name,\n value: formControl.value,\n onChange: (e: any) => {\n const newValue = e?.target?.value ?? e;\n formControl.setValue(newValue);\n },\n onBlur: () => {\n formControl.setTouched(true);\n },\n disabled: formControl.isDisabled,\n required: formControl.isRequired,\n \"aria-invalid\": !!formControl.error,\n \"aria-describedby\": formControl.error\n ? `${formControl.fieldId}-message`\n : undefined,\n };\n\n const state: FormControlState = {\n isDirty: formControl.isDirty,\n isTouched: formControl.isTouched,\n isValid: formControl.isValid,\n isRequired: formControl.isRequired,\n isDisabled: formControl.isDisabled,\n isValidating: formControl.isValidating,\n error: formControl.error,\n value: formControl.value,\n };\n\n return {\n fieldProps,\n state,\n /**\n * Helper to spread all field props at once\n * @example <input {...register()} />\n */\n register: () => fieldProps,\n /**\n * Direct access to form control methods\n */\n setValue: formControl.setValue,\n setTouched: formControl.setTouched,\n setError: formControl.setError,\n validate: formControl.validate,\n };\n}\n\n// ============================================================================\n// FORM CONTROL COMPONENT\n// ============================================================================\n\nexport function FormControl({\n name,\n defaultValue,\n value: controlledValue,\n onChange,\n onBlur,\n required = false,\n disabled = false,\n error: externalError,\n helperText,\n validate: validationRules,\n validateOnChange = true,\n validateOnBlur = true,\n label,\n className,\n children,\n asChild = false,\n}: FormControlProps) {\n const autoId = useId();\n // Use name as stable ID if provided, otherwise fallback to useId\n const stableFieldId = useRef<string | undefined>(undefined);\n if (!stableFieldId.current) {\n stableFieldId.current = name ? `field-${name}` : `field-${autoId}`;\n }\n const fieldId = stableFieldId.current;\n\n // State management\n const isControlled = controlledValue !== undefined;\n const [internalValue, setInternalValue] = useState(defaultValue ?? \"\");\n const [initialValue] = useState(defaultValue ?? \"\");\n const [isTouched, setIsTouched] = useState(false);\n const [internalError, setInternalError] = useState<string | undefined>();\n const [isValidating, setIsValidating] = useState(false);\n const [registeredControls] = useState<Set<HTMLElement>>(new Set());\n\n const currentValue = isControlled ? controlledValue : internalValue;\n const currentError = externalError || internalError;\n const isDirty = currentValue !== initialValue;\n const isValid = !currentError;\n\n // ========================================================================\n // VALIDATION\n // ========================================================================\n\n const runValidation = useCallback(\n async (valueToValidate: any): Promise<string | undefined> => {\n if (!validationRules) return undefined;\n\n // Required validation\n if (required) {\n if (\n valueToValidate === undefined ||\n valueToValidate === null ||\n valueToValidate === \"\"\n ) {\n return \"This field is required\";\n }\n // For arrays (checkboxes), ensure at least one selected\n if (\n Array.isArray(valueToValidate) &&\n valueToValidate.length === 0\n ) {\n return \"This field is required\";\n }\n }\n\n // Custom validation\n if (typeof validationRules === \"function\") {\n const result = await validationRules(valueToValidate);\n if (result === false) return \"Validation failed\";\n if (typeof result === \"string\") return result;\n return undefined;\n }\n\n // Validation rules array\n const rules = Array.isArray(validationRules)\n ? validationRules\n : [validationRules];\n for (const rule of rules) {\n const result = await rule.validate(valueToValidate);\n if (result === false) {\n return rule.message || \"Validation failed\";\n }\n if (typeof result === \"string\") {\n return result;\n }\n }\n\n return undefined;\n },\n [validationRules, required]\n );\n\n const validate = useCallback(async (): Promise<boolean> => {\n setIsValidating(true);\n const error = await runValidation(currentValue);\n setInternalError(error);\n setIsValidating(false);\n return !error;\n }, [currentValue, runValidation]);\n\n // ========================================================================\n // VALUE MANAGEMENT\n // ========================================================================\n\n const setValue = useCallback(\n (newValue: any) => {\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue);\n\n // Validate on change if enabled\n if (validateOnChange && isTouched) {\n runValidation(newValue).then(setInternalError);\n }\n },\n [isControlled, onChange, validateOnChange, isTouched, runValidation]\n );\n\n const setTouchedState = useCallback(\n (touched: boolean) => {\n setIsTouched(touched);\n if (touched) {\n onBlur?.();\n // Validate on blur if enabled\n if (validateOnBlur) {\n runValidation(currentValue).then(setInternalError);\n }\n }\n },\n [onBlur, validateOnBlur, currentValue, runValidation]\n );\n\n const setErrorState = useCallback((error?: string) => {\n setInternalError(error);\n }, []);\n\n // ========================================================================\n // CONTROL REGISTRATION\n // ========================================================================\n\n const registerControl = useCallback(\n (control: HTMLElement) => {\n registeredControls.add(control);\n },\n [registeredControls]\n );\n\n const unregisterControl = useCallback(\n (control: HTMLElement) => {\n registeredControls.delete(control);\n },\n [registeredControls]\n );\n\n // ========================================================================\n // CONTEXT VALUE\n // ========================================================================\n\n const contextValue: FormControlContextValue = {\n fieldId,\n name,\n value: currentValue,\n isDirty,\n isTouched,\n isValid,\n isRequired: required,\n isDisabled: disabled,\n isValidating,\n error: currentError,\n setValue,\n setTouched: setTouchedState,\n setError: setErrorState,\n validate,\n registerControl,\n unregisterControl,\n };\n\n // ========================================================================\n // RENDER HELPERS\n // ========================================================================\n\n // Props to inject into child when using asChild or render props\n const fieldProps: FormFieldProps = {\n id: fieldId,\n name,\n value: currentValue,\n onChange: (e: any) => {\n const newValue = e?.target?.value ?? e;\n setValue(newValue);\n },\n onBlur: () => {\n setTouchedState(true);\n },\n disabled: disabled,\n required: required,\n \"aria-invalid\": !!currentError,\n \"aria-describedby\": currentError\n ? `${fieldId}-message`\n : helperText\n ? `${fieldId}-helper`\n : undefined,\n };\n\n const stateProps: FormControlState = {\n isDirty,\n isTouched,\n isValid,\n isRequired: required,\n isDisabled: disabled,\n isValidating,\n error: currentError,\n value: currentValue,\n };\n\n // Render children based on type\n const renderChildren = () => {\n // Render function pattern\n if (typeof children === \"function\") {\n return children({ ...fieldProps, ...stateProps });\n }\n\n // asChild pattern - clone and merge props into single child\n if (asChild) {\n const child = Children.only(children);\n if (isValidElement(child)) {\n const childProps = child.props as any;\n return cloneElement(child, {\n ...fieldProps,\n ...childProps,\n // Merge onChange handlers\n onChange: (e: any) => {\n fieldProps.onChange(e);\n childProps.onChange?.(e);\n },\n onBlur: () => {\n fieldProps.onBlur();\n childProps.onBlur?.();\n },\n } as any);\n }\n }\n\n // Default: render children with context\n return children;\n };\n\n // ========================================================================\n // RENDER\n // ========================================================================\n\n return (\n <FormControlContext.Provider value={contextValue}>\n <div\n className={cn(\"flex flex-col w-full\", className)}\n data-disabled={disabled || undefined}\n data-error={!!currentError || undefined}\n data-dirty={isDirty || undefined}\n data-touched={isTouched || undefined}\n data-valid={isValid || undefined}\n >\n {/* Label */}\n {label && (\n <label\n htmlFor={fieldId}\n className=\"block text-small font-semibold mb-1\"\n style={{ color: \"var(--color-muted-foreground)\" }}\n >\n {label}\n {required && <span className=\"ml-1\">*</span>}\n </label>\n )}\n\n {/* Children (form controls) */}\n {renderChildren()}\n\n {/* Helper text or error message */}\n <div className=\"h-5 mt-1.5\">\n {(helperText || currentError) && (\n <p\n className={cn(\n \"text-small\",\n currentError\n ? \"text-error\"\n : \"text-(--color-muted-foreground)\"\n )}\n id={`${fieldId}-message`}\n role={currentError ? \"alert\" : undefined}\n aria-live={currentError ? \"polite\" : undefined}\n >\n {currentError || helperText}\n </p>\n )}\n </div>\n </div>\n </FormControlContext.Provider>\n );\n}\n\n// ============================================================================\n// FORM CONTROL LABEL (for wrapping radio/checkbox)\n// ============================================================================\n\nexport interface FormControlLabelProps {\n /** The control element (checkbox, radio, switch) */\n control: ReactNode;\n /** Label text */\n label: ReactNode;\n /** Whether the control is disabled */\n disabled?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Label placement */\n labelPlacement?: \"start\" | \"end\" | \"top\" | \"bottom\";\n}\n\nexport function FormControlLabel({\n control,\n label,\n disabled = false,\n className,\n labelPlacement = \"end\",\n}: FormControlLabelProps) {\n const formControl = useFormControl();\n\n const placementStyles = {\n start: \"flex-row-reverse justify-end\",\n end: \"flex-row\",\n top: \"flex-col-reverse items-start\",\n bottom: \"flex-col items-start\",\n };\n\n const gapStyles = {\n start: \"gap-2\",\n end: \"gap-2\",\n top: \"gap-1\",\n bottom: \"gap-1\",\n };\n\n return (\n <div\n className={cn(\n \"inline-flex items-center\",\n placementStyles[labelPlacement],\n gapStyles[labelPlacement],\n disabled && \"opacity-50 cursor-not-allowed\",\n className\n )}\n data-disabled={disabled || formControl?.isDisabled || undefined}\n >\n {control}\n {label && (\n <span\n className={cn(\n \"text-small font-medium select-none\",\n disabled || formControl?.isDisabled\n ? \"cursor-not-allowed\"\n : \"cursor-pointer\"\n )}\n style={{ color: \"var(--checkbox-label-color)\" }}\n >\n {label}\n </span>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// FORM HELPER TEXT\n// ============================================================================\n\nexport interface FormHelperTextProps {\n children: ReactNode;\n error?: boolean;\n className?: string;\n}\n\nexport function FormHelperText({\n children,\n error = false,\n className,\n}: FormHelperTextProps) {\n const formControl = useFormControl();\n const isError = error || (formControl?.error && !formControl.isValid);\n\n return (\n <div className=\"h-5 mt-1.5\">\n <p\n className={cn(\n \"text-small\",\n isError ? \"text-error\" : \"text-(--color-muted-foreground)\",\n className\n )}\n role={isError ? \"alert\" : undefined}\n aria-live={isError ? \"polite\" : undefined}\n >\n {children}\n </p>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useId, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { useForm, ValidationFunction } from \"./form\";\nimport { useFormControl } from \"./form-control\";\n\nexport interface TextareaProps extends Omit<\n React.TextareaHTMLAttributes<HTMLTextAreaElement>,\n \"rows\"\n> {\n /** Field name - required when used inside Form */\n name?: string;\n label?: string;\n error?: string;\n helperText?: string;\n fullWidth?: boolean;\n /** Custom validation function that returns error message or undefined if valid */\n validate?: ValidationFunction;\n /** Callback when validation error changes */\n onValidationError?: (error: string | undefined) => void;\n /** Custom error messages for built-in validations */\n errorMessages?: {\n required?: string;\n minLength?: string;\n maxLength?: string;\n };\n /** Number of visible text rows */\n rows?: number;\n /** Allow vertical resizing */\n resize?: \"none\" | \"vertical\" | \"horizontal\" | \"both\";\n /** Auto-resize to fit content */\n autoResize?: boolean;\n /** Show character count */\n showCharacterCount?: boolean;\n /** Maximum height when auto-resizing (in pixels) */\n maxHeight?: number;\n}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n className,\n name,\n label,\n error,\n helperText,\n fullWidth = false,\n id,\n onChange,\n onBlur,\n value: externalValue,\n validate,\n onValidationError,\n errorMessages,\n rows = 3,\n resize = \"vertical\",\n autoResize = false,\n showCharacterCount = false,\n maxHeight = 500,\n ...props\n },\n ref\n ) => {\n const autoId = useId();\n const form = useForm(); // New Form context\n const formControl = useFormControl(); // Old FormControl context (backwards compat)\n const internalRef = useRef<HTMLTextAreaElement>(null);\n const [validationError, setValidationError] = useState<\n string | undefined\n >();\n\n // Generate stable ID only once\n const stableId = useRef<string | undefined>(undefined);\n if (!stableId.current) {\n stableId.current =\n id || formControl?.fieldId || `textarea-${autoId}`;\n }\n\n // Priority: Form context > FormControl context > props\n const textareaId = stableId.current;\n const isDisabled = props.disabled || formControl?.isDisabled;\n const isRequired = props.required || formControl?.isRequired;\n\n // For error: check Form context first, then FormControl, then prop, then internal validation\n let textareaError: string | undefined;\n let textareaValue: React.TextareaHTMLAttributes<HTMLTextAreaElement>[\"value\"];\n\n if (form && name) {\n // Using new Form context\n textareaError = form.shouldShowError(name)\n ? form.getFieldError(name)\n : undefined;\n // Use empty string as default to keep textarea controlled, but form will only have value when user types\n textareaValue =\n form.values[name] !== undefined\n ? form.values[name]\n : (externalValue ?? \"\");\n } else if (formControl) {\n // Using old FormControl context (backwards compat)\n textareaError = formControl.error || error || validationError;\n textareaValue = formControl.value ?? externalValue;\n } else {\n // Standalone usage\n textareaError = error || validationError;\n textareaValue = externalValue;\n }\n\n // Character count\n const currentLength =\n typeof textareaValue === \"string\" ? textareaValue.length : 0;\n const maxLengthValue = props.maxLength;\n\n // Built-in validation\n const runBuiltInValidation = (value: string): string | undefined => {\n // Required validation\n if (isRequired && !value) {\n return errorMessages?.required || \"This field is required\";\n }\n\n if (value) {\n // MinLength validation\n if (\n props.minLength !== undefined &&\n value.length < props.minLength\n ) {\n return (\n errorMessages?.minLength ||\n `Minimum length is ${props.minLength} characters`\n );\n }\n\n // MaxLength validation\n if (\n props.maxLength !== undefined &&\n value.length > props.maxLength\n ) {\n return (\n errorMessages?.maxLength ||\n `Maximum length is ${props.maxLength} characters`\n );\n }\n }\n\n return undefined;\n };\n\n // Run validation (built-in + custom)\n const runValidation = async (value: string) => {\n // Run built-in validation first\n const builtInError = runBuiltInValidation(value);\n if (builtInError) {\n setValidationError(builtInError);\n onValidationError?.(builtInError);\n return;\n }\n\n // Run custom validation if provided\n if (validate) {\n const customError = await validate(value);\n setValidationError(customError);\n onValidationError?.(customError);\n return;\n }\n\n // No errors\n setValidationError(undefined);\n onValidationError?.(undefined);\n };\n\n // Auto-resize functionality\n const adjustHeight = () => {\n const textarea = internalRef.current;\n if (textarea && autoResize) {\n // Reset height to auto to get the correct scrollHeight\n textarea.style.height = \"auto\";\n // Set new height based on scrollHeight\n const newHeight = Math.min(textarea.scrollHeight, maxHeight);\n textarea.style.height = `${newHeight}px`;\n }\n };\n\n // Register with Form or FormControl on mount\n useEffect(() => {\n if (form && name) {\n // Register with new Form\n const validator: ValidationFunction = async (value: string) => {\n // Built-in validation\n if (isRequired && !value) {\n return (\n errorMessages?.required || \"This field is required\"\n );\n }\n\n if (value) {\n if (\n props.minLength !== undefined &&\n value.length < props.minLength\n ) {\n return (\n errorMessages?.minLength ||\n `Minimum length is ${props.minLength} characters`\n );\n }\n\n if (\n props.maxLength !== undefined &&\n value.length > props.maxLength\n ) {\n return (\n errorMessages?.maxLength ||\n `Maximum length is ${props.maxLength} characters`\n );\n }\n }\n\n // Custom validation\n if (validate) {\n return await validate(value);\n }\n\n return undefined;\n };\n\n form.registerField(name, validator);\n return () => form.unregisterField(name);\n } else if (formControl) {\n // Register with old FormControl (backwards compat)\n const textareaElement = internalRef.current;\n if (textareaElement) {\n formControl.registerControl(textareaElement as any);\n return () =>\n formControl.unregisterControl(textareaElement as any);\n }\n }\n }, [form, formControl, name]);\n\n // Adjust height on value change (for auto-resize)\n useEffect(() => {\n if (autoResize) {\n adjustHeight();\n }\n }, [textareaValue, autoResize]);\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value;\n\n if (form && name) {\n // Update Form context\n form.setFieldValue(name, newValue);\n } else if (formControl) {\n // Update FormControl (backwards compat)\n formControl.setValue(newValue);\n } else {\n // Standalone - run validation\n runValidation(newValue);\n }\n\n // Auto-resize if enabled\n if (autoResize) {\n adjustHeight();\n }\n\n // Call external onChange\n onChange?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n if (form && name) {\n // Mark as touched in Form\n form.setFieldTouched(name, true);\n // Validate on blur with current textarea value\n form.validateField(name, e.target.value);\n } else if (formControl) {\n // Mark as touched in FormControl (backwards compat)\n formControl.setTouched(true);\n } else {\n // Standalone - run validation\n if (e.target.value) {\n runValidation(e.target.value);\n }\n }\n\n // Call external onBlur\n onBlur?.(e);\n };\n\n // If used within FormControl, don't render label/error (FormControl handles it)\n // If used within Form, render everything (Form doesn't wrap controls)\n const shouldRenderLabel = label && !formControl;\n const shouldRenderError = textareaError && !formControl;\n\n // Resize classes\n const resizeClasses = {\n none: \"resize-none\",\n vertical: \"resize-y\",\n horizontal: \"resize-x\",\n both: \"resize\",\n };\n\n return (\n <div\n className={cn(\"flex flex-col\", fullWidth && \"w-full\")}\n style={{ marginBottom: \"var(--form-control-spacing)\" }}\n >\n <div className=\"flex items-center justify-between mb-1\">\n {shouldRenderLabel && (\n <label\n htmlFor={textareaId}\n className=\"block text-small font-semibold text-(--color-muted-foreground)\"\n >\n {label}\n {isRequired && <span className=\"ml-1\">*</span>}\n </label>\n )}\n {showCharacterCount && maxLengthValue && (\n <span className=\"text-small text-(--color-muted-foreground)\">\n {currentLength}/{maxLengthValue}\n </span>\n )}\n </div>\n\n <div className=\"relative\">\n <textarea\n ref={(node) => {\n // Handle both refs\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n (internalRef as any).current = node;\n }}\n id={textareaId}\n name={name}\n value={textareaValue}\n onChange={handleChange}\n onBlur={handleBlur}\n disabled={isDisabled}\n required={isRequired}\n rows={autoResize ? undefined : rows}\n aria-invalid={!!textareaError}\n aria-describedby={\n textareaError\n ? `${textareaId}-error`\n : helperText\n ? `${textareaId}-helper`\n : undefined\n }\n className={cn(\n \"w-full px-3 py-2 border rounded-md transition-colors\",\n \"text-(--color-foreground) placeholder-gray-400\",\n \"focus:outline-none\",\n \"disabled:bg-(--color-muted) disabled:cursor-not-allowed disabled:text-(--color-muted-foreground)\",\n textareaError\n ? \"border-error focus:ring-2 focus:ring-error focus:border-error active:border-error\"\n : \"border-(--color-border) focus:ring-2 focus:ring-(--color-primary)/30 focus:border-(--color-primary) active:border-(--color-primary)\",\n resizeClasses[resize],\n autoResize && \"overflow-hidden\",\n !autoResize && \"overflow-auto\",\n className\n )}\n style={\n autoResize\n ? {\n minHeight: `${rows * 1.5}em`,\n maxHeight: `${maxHeight}px`,\n }\n : undefined\n }\n {...props}\n />\n </div>\n\n <div className=\"h-5 mt-1.5\">\n {shouldRenderError && textareaError && (\n <p\n className=\"text-small text-error\"\n id={`${textareaId}-error`}\n role=\"alert\"\n >\n {textareaError}\n </p>\n )}\n\n {helperText && !textareaError && !formControl && (\n <p\n className=\"text-small text-(--color-muted-foreground)\"\n id={`${textareaId}-helper`}\n >\n {helperText}\n </p>\n )}\n </div>\n </div>\n );\n }\n);\n\nTextarea.displayName = \"Textarea\";\n\nexport { Textarea };\n","import React from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport interface CardProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"variant\" | \"accentColor\"\n> {\n variant?: \"default\" | \"bordered\" | \"elevated\" | \"accent\";\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\";\n hoverable?: boolean;\n accentColor?: string;\n}\n\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n (\n {\n className,\n variant = \"default\",\n padding = \"md\",\n hoverable = false,\n accentColor,\n children,\n ...props\n },\n ref\n ) => {\n const baseStyles = \"bg-(--color-background) rounded-lg\";\n\n const variants = {\n default: \"border border-(--color-border)\",\n bordered: \"border-2 border-(--color-border)\",\n elevated: \"shadow-md\",\n accent: \"border border-(--color-border) hover:border-(--color-primary) active:border-(--color-primary) transition-all duration-300 relative overflow-hidden group\",\n };\n\n const paddings = {\n none: \"\",\n sm: \"p-3\",\n md: \"p-4\",\n lg: \"p-6\",\n };\n\n const hoverStyles = hoverable\n ? \"hover:shadow-lg transition-shadow cursor-pointer\"\n : \"\";\n\n return (\n <div\n ref={ref}\n className={cn(\n baseStyles,\n variants[variant],\n paddings[padding],\n hoverStyles,\n className\n )}\n style={\n variant === \"accent\" && accentColor\n ? ({\n \"--card-accent-color\": accentColor,\n } as React.CSSProperties)\n : undefined\n }\n {...props}\n >\n {variant === \"accent\" && (\n <div\n className=\"absolute top-0 left-0 w-full h-1 bg-linear-to-r from-transparent via-current to-transparent opacity-0 group-hover:opacity-100 group-active:opacity-100 transition-opacity\"\n style={\n accentColor\n ? { color: accentColor }\n : { color: \"var(--color-primary)\" }\n }\n />\n )}\n {children}\n </div>\n );\n }\n);\n\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5\", className)}\n {...props}\n />\n));\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\n \"text-h4 font-semibold text-(--color-foreground)\",\n className\n )}\n {...props}\n />\n));\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-small text-(--color-muted-foreground)\", className)}\n {...props}\n />\n));\nCardDescription.displayName = \"CardDescription\";\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"pt-0\", className)} {...props} />\n));\nCardContent.displayName = \"CardContent\";\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center pt-4\", className)}\n {...props}\n />\n));\nCardFooter.displayName = \"CardFooter\";\n\nexport interface CardMediaProps extends React.HTMLAttributes<HTMLDivElement> {\n image?: string;\n video?: string;\n component?: \"img\" | \"video\" | \"div\";\n aspectRatio?: \"16/9\" | \"4/3\" | \"1/1\" | \"21/9\" | string;\n alt?: string;\n objectFit?: \"cover\" | \"contain\" | \"fill\" | \"none\" | \"scale-down\";\n}\n\nconst CardMedia = React.forwardRef<HTMLDivElement, CardMediaProps>(\n (\n {\n className,\n image,\n video,\n component = \"div\",\n aspectRatio = \"16/9\",\n alt = \"\",\n objectFit = \"cover\",\n style,\n ...props\n },\n ref\n ) => {\n const aspectRatioStyle = {\n aspectRatio,\n ...style,\n };\n\n const objectFitClass =\n objectFit === \"cover\"\n ? \"object-cover\"\n : objectFit === \"contain\"\n ? \"object-contain\"\n : objectFit === \"fill\"\n ? \"object-fill\"\n : objectFit === \"none\"\n ? \"object-none\"\n : \"object-scale-down\";\n\n if (component === \"img\" && image) {\n return (\n <img\n ref={ref as React.Ref<HTMLImageElement>}\n src={image}\n alt={alt}\n className={cn(\"w-full h-full\", objectFitClass, className)}\n style={aspectRatioStyle}\n {...(props as React.ImgHTMLAttributes<HTMLImageElement>)}\n />\n );\n }\n\n if (component === \"video\" && video) {\n return (\n <video\n ref={ref as React.Ref<HTMLVideoElement>}\n src={video}\n className={cn(\"w-full\", objectFitClass, className)}\n style={aspectRatioStyle}\n {...(props as React.VideoHTMLAttributes<HTMLVideoElement>)}\n />\n );\n }\n\n // Default: background image div\n return (\n <div\n ref={ref}\n className={cn(\"w-full bg-cover bg-center\", className)}\n style={{\n ...aspectRatioStyle,\n backgroundImage: image ? `url(${image})` : undefined,\n }}\n role={image ? \"img\" : undefined}\n aria-label={image ? alt : undefined}\n {...props}\n />\n );\n }\n);\nCardMedia.displayName = \"CardMedia\";\n\nexport interface CardActionsProps extends React.HTMLAttributes<HTMLDivElement> {\n disableSpacing?: boolean;\n position?: \"left\" | \"center\" | \"right\";\n}\n\nconst CardActions = React.forwardRef<HTMLDivElement, CardActionsProps>(\n (\n { className, disableSpacing = false, position = \"left\", ...props },\n ref\n ) => {\n const justifyContent = {\n left: \"justify-start\",\n center: \"justify-center\",\n right: \"justify-end\",\n }[position];\n\n const padding = {\n left: \"pl-4 pr-4 py-4\",\n center: \"px-4 py-4\",\n right: \"pl-4 pr-4 py-4\",\n }[position];\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex items-center\",\n justifyContent,\n !disableSpacing && `gap-2 ${padding}`,\n className\n )}\n {...props}\n />\n );\n }\n);\nCardActions.displayName = \"CardActions\";\n\nexport interface CardActionAreaProps extends React.HTMLAttributes<HTMLDivElement> {\n disabled?: boolean;\n}\n\nconst CardActionArea = React.forwardRef<HTMLDivElement, CardActionAreaProps>(\n ({ className, disabled = false, children, ...props }, ref) => (\n <div\n ref={ref}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n className={cn(\n \"cursor-pointer transition-colors\",\n \"hover:bg-(--color-muted) active:bg-(--color-muted)\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-blue-500\",\n disabled &&\n \"cursor-not-allowed opacity-50 hover:bg-transparent\",\n className\n )}\n aria-disabled={disabled}\n {...props}\n >\n {children}\n </div>\n )\n);\nCardActionArea.displayName = \"CardActionArea\";\n\nexport {\n Card,\n CardHeader,\n CardTitle,\n CardDescription,\n CardContent,\n CardFooter,\n CardMedia,\n CardActions,\n CardActionArea,\n};\n","import React from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n variant?: \"default\" | \"info\" | \"success\" | \"warning\" | \"error\";\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n}\n\nconst Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(\n (\n {\n className,\n variant = \"default\",\n size = \"md\",\n leftIcon,\n rightIcon,\n children,\n ...props\n },\n ref\n ) => {\n const baseStyles = \"inline-flex items-center font-medium rounded-full\";\n\n const variantStyles = {\n default: {\n backgroundColor: \"#e5e7eb\",\n color: \"#374151\",\n },\n info: {\n backgroundColor: \"var(--color-info-muted)\",\n color: \"var(--color-info-muted-foreground)\",\n },\n success: {\n backgroundColor: \"var(--color-success-muted)\",\n color: \"var(--color-success-muted-foreground)\",\n },\n warning: {\n backgroundColor: \"var(--color-warning-muted)\",\n color: \"var(--color-warning-muted-foreground)\",\n },\n error: {\n backgroundColor: \"var(--color-error-muted)\",\n color: \"var(--color-error-muted-foreground)\",\n },\n };\n\n const sizes = {\n xs: \"text-[0.625rem] px-1.5 py-0.5 gap-1\",\n sm: \"text-caption px-2 py-0.5 gap-1\",\n md: \"text-small px-2.5 py-1 gap-1.5\",\n lg: \"text-base px-3 py-1.5 gap-2\",\n xl: \"text-h4 px-3.5 py-2 gap-2\",\n };\n\n const iconSizes = {\n xs: \"w-2.5 h-2.5\",\n sm: \"w-3 h-3\",\n md: \"w-3.5 h-3.5\",\n lg: \"w-4 h-4\",\n xl: \"w-5 h-5\",\n };\n\n return (\n <span\n ref={ref}\n style={variantStyles[variant]}\n className={cn(baseStyles, sizes[size], className)}\n {...props}\n >\n {leftIcon && (\n <span\n className={cn(\n \"inline-flex items-center justify-center\",\n iconSizes[size]\n )}\n >\n {leftIcon}\n </span>\n )}\n {children}\n {rightIcon && (\n <span\n className={cn(\n \"inline-flex items-center justify-center\",\n iconSizes[size]\n )}\n >\n {rightIcon}\n </span>\n )}\n </span>\n );\n }\n);\n\nBadge.displayName = \"Badge\";\n\nexport { Badge };\n","\"use client\";\n\nimport React, { useId, useState, useRef, useEffect } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { useForm, ValidationFunction } from \"./form\";\n\ninterface CheckboxProps {\n label?: string;\n name?: string;\n checked?: boolean;\n onChange?: (checked: boolean) => void;\n disabled?: boolean;\n className?: string;\n id?: string;\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n required?: boolean;\n /** Custom validation function that returns error message or undefined if valid */\n validate?: ValidationFunction;\n /** Callback when validation error changes */\n onValidationError?: (error: string | undefined) => void;\n /** Custom error message for required validation */\n errorMessage?: string;\n}\n\nexport function Checkbox({\n label,\n name,\n checked: externalChecked = false,\n onChange,\n disabled = false,\n className,\n id,\n size = \"sm\",\n required = false,\n validate,\n onValidationError,\n errorMessage,\n}: CheckboxProps) {\n const form = useForm();\n const autoId = useId();\n const stableId = useRef<string | undefined>(undefined);\n if (!stableId.current) {\n stableId.current = id || `checkbox-${autoId}`;\n }\n const checkboxId = stableId.current;\n const [validationError, setValidationError] = useState<\n string | undefined\n >();\n\n // Determine checked state and error\n let checked: boolean;\n let displayError: string | undefined;\n\n if (form && name) {\n // Using Form context\n checked = form.values[name] ?? externalChecked;\n displayError = form.shouldShowError(name)\n ? form.getFieldError(name)\n : undefined;\n } else {\n // Standalone usage\n checked = externalChecked;\n displayError = validationError;\n }\n\n // Built-in validation\n const runBuiltInValidation = (isChecked: boolean): string | undefined => {\n if (required && !isChecked) {\n return errorMessage || \"This field is required\";\n }\n return undefined;\n };\n\n // Register with Form\n useEffect(() => {\n if (form && name) {\n const validator: ValidationFunction = async (val: boolean) => {\n if (required && !val) {\n return errorMessage || \"This field is required\";\n }\n\n if (validate) {\n return await validate(val);\n }\n\n return undefined;\n };\n\n form.registerField(name, validator);\n return () => form.unregisterField(name);\n }\n }, [form, name]);\n\n // Run validation (standalone mode only)\n const runValidation = async (isChecked: boolean) => {\n // Run built-in validation first\n const builtInError = runBuiltInValidation(isChecked);\n if (builtInError) {\n setValidationError(builtInError);\n onValidationError?.(builtInError);\n return;\n }\n\n // Run custom validation if provided\n if (validate) {\n const customError = await validate(isChecked);\n setValidationError(customError);\n onValidationError?.(customError);\n return;\n }\n\n // No errors\n setValidationError(undefined);\n onValidationError?.(undefined);\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const isChecked = e.target.checked;\n\n if (form && name) {\n // Update Form context\n form.setFieldValue(name, isChecked);\n form.setFieldTouched(name, true);\n // Validate on change for checkbox (immediate feedback with new value)\n form.validateField(name, isChecked);\n } else {\n // Standalone mode\n runValidation(isChecked);\n onChange?.(isChecked);\n }\n };\n\n const containerGapStyles = {\n xs: \"gap-2\",\n sm: \"gap-2\",\n md: \"gap-2\",\n lg: \"gap-2\",\n xl: \"gap-2\",\n };\n\n return (\n <div className={cn(\"flex flex-col\", className)}>\n <div className={cn(\"flex items-center\", containerGapStyles[size])}>\n <div className=\"relative group/checkbox flex items-center shrink-0\">\n <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 pointer-events-none\">\n <div\n className=\"rounded-full scale-0 group-hover/checkbox:scale-100 group-active/checkbox:scale-100 transition-transform duration-200 ease-out\"\n style={{\n width:\n size === \"xs\"\n ? \"1.75rem\"\n : size === \"sm\"\n ? \"2rem\"\n : size === \"lg\"\n ? \"2.5rem\"\n : size === \"xl\"\n ? \"3rem\"\n : \"2.25rem\",\n height:\n size === \"xs\"\n ? \"1.75rem\"\n : size === \"sm\"\n ? \"2rem\"\n : size === \"lg\"\n ? \"2.5rem\"\n : size === \"xl\"\n ? \"3rem\"\n : \"2.25rem\",\n backgroundColor: \"var(--checkbox-hover-bg)\",\n }}\n />\n </div>\n <input\n type=\"checkbox\"\n id={checkboxId}\n checked={checked}\n onChange={handleChange}\n disabled={disabled}\n className={cn(\n \"rounded focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 transition-all relative z-10\",\n disabled && \"cursor-not-allowed\"\n )}\n style={{\n width:\n size === \"xs\"\n ? \"var(--checkbox-size-xs)\"\n : size === \"sm\"\n ? \"var(--checkbox-size-sm)\"\n : size === \"lg\"\n ? \"var(--checkbox-size-lg)\"\n : size === \"xl\"\n ? \"var(--checkbox-size-xl)\"\n : \"var(--checkbox-size-md)\",\n height:\n size === \"xs\"\n ? \"var(--checkbox-size-xs)\"\n : size === \"sm\"\n ? \"var(--checkbox-size-sm)\"\n : size === \"lg\"\n ? \"var(--checkbox-size-lg)\"\n : size === \"xl\"\n ? \"var(--checkbox-size-xl)\"\n : \"var(--checkbox-size-md)\",\n borderColor: \"var(--color-border)\",\n backgroundColor: \"var(--color-muted)\",\n accentColor: \"var(--color-primary)\",\n opacity: disabled\n ? \"var(--checkbox-disabled-opacity)\"\n : undefined,\n }}\n />\n </div>\n {label && (\n <label\n htmlFor={checkboxId}\n className={cn(\n \"font-medium\",\n disabled && \"cursor-not-allowed\",\n !disabled && \"cursor-pointer\"\n )}\n style={{\n fontSize:\n size === \"xs\"\n ? \"var(--checkbox-label-font-size-xs)\"\n : size === \"sm\"\n ? \"var(--checkbox-label-font-size-sm)\"\n : size === \"lg\"\n ? \"var(--checkbox-label-font-size-lg)\"\n : size === \"xl\"\n ? \"var(--checkbox-label-font-size-xl)\"\n : \"var(--checkbox-label-font-size-md)\",\n color: \"var(--color-muted-foreground)\",\n opacity: disabled\n ? \"var(--checkbox-disabled-opacity)\"\n : undefined,\n }}\n >\n {label}\n {required && <span className=\"ml-1\">*</span>}\n </label>\n )}\n </div>\n <div className=\"h-5 mt-1.5\">\n {displayError && (\n <p className=\"text-small text-error\" role=\"alert\">\n {displayError}\n </p>\n )}\n </div>\n </div>\n );\n}\n\ninterface CheckboxOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\ninterface CheckboxGroupProps {\n label?: string;\n name: string;\n options: CheckboxOption[];\n value?: string[];\n onChange?: (value: string[]) => void;\n className?: string;\n orientation?: \"vertical\" | \"horizontal\";\n required?: boolean;\n disabled?: boolean;\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n error?: string;\n helperText?: string;\n validate?: ValidationFunction;\n}\n\nexport function CheckboxGroup({\n label,\n name,\n options,\n value: externalValue,\n onChange: externalOnChange,\n className,\n orientation = \"vertical\",\n required = false,\n disabled = false,\n size = \"sm\",\n error: externalError,\n helperText,\n validate,\n}: CheckboxGroupProps) {\n const form = useForm();\n\n // Integrate with Form if available\n React.useEffect(() => {\n if (form && name) {\n const validator =\n validate ||\n (required\n ? (value: string[]) => {\n if (!value || value.length === 0) {\n return `${label || name} is required`;\n }\n return undefined;\n }\n : undefined);\n\n form.registerField(name, validator);\n return () => form.unregisterField(name);\n }\n }, [form, name, validate, required, label]);\n\n const value = form\n ? (form.values[name] as string[]) || []\n : externalValue || [];\n const error = form ? form.errors[name] : externalError;\n\n const handleChange = (optionValue: string, checked: boolean) => {\n const newValue = checked\n ? [...value, optionValue]\n : value.filter((v) => v !== optionValue);\n\n if (form) {\n form.setFieldValue(name, newValue);\n form.validateField(name, newValue);\n }\n\n if (externalOnChange) {\n externalOnChange(newValue);\n }\n };\n\n const containerGapStyles = {\n xs: \"gap-2\",\n sm: \"gap-2\",\n md: \"gap-2\",\n lg: \"gap-2\",\n xl: \"gap-2\",\n };\n\n return (\n <div\n className={className}\n style={{ marginBottom: \"var(--form-control-spacing)\" }}\n >\n {label && (\n <label\n className=\"block text-small font-semibold mb-1\"\n style={{ color: \"var(--color-muted-foreground)\" }}\n >\n {label}\n {required && <span className=\"ml-1\">*</span>}\n </label>\n )}\n <div\n className={cn(\n orientation === \"horizontal\"\n ? \"flex flex-wrap items-center gap-4\"\n : \"space-y-2\"\n )}\n >\n {options.map((option) => {\n const isDisabled = disabled || option.disabled;\n return (\n <div\n key={option.value}\n className={cn(\n \"flex items-center\",\n containerGapStyles[size]\n )}\n >\n <div className=\"relative group/checkbox flex items-center shrink-0\">\n <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 pointer-events-none\">\n <div\n className=\"rounded-full scale-0 group-hover/checkbox:scale-100 group-active/checkbox:scale-100 transition-transform duration-200 ease-out\"\n style={{\n width:\n size === \"xs\"\n ? \"1.75rem\"\n : size === \"sm\"\n ? \"2rem\"\n : size === \"lg\"\n ? \"2.5rem\"\n : size === \"xl\"\n ? \"3rem\"\n : \"2.25rem\",\n height:\n size === \"xs\"\n ? \"1.75rem\"\n : size === \"sm\"\n ? \"2rem\"\n : size === \"lg\"\n ? \"2.5rem\"\n : size === \"xl\"\n ? \"3rem\"\n : \"2.25rem\",\n backgroundColor:\n \"var(--checkbox-hover-bg)\",\n }}\n />\n </div>\n <input\n type=\"checkbox\"\n id={`${name}-${option.value}`}\n name={name}\n value={option.value}\n checked={value.includes(option.value)}\n onChange={(e) =>\n handleChange(\n option.value,\n e.target.checked\n )\n }\n disabled={isDisabled}\n className={cn(\n \"rounded focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 transition-all relative z-10\",\n isDisabled && \"cursor-not-allowed\"\n )}\n style={{\n width:\n size === \"xs\"\n ? \"var(--checkbox-size-xs)\"\n : size === \"sm\"\n ? \"var(--checkbox-size-sm)\"\n : size === \"lg\"\n ? \"var(--checkbox-size-lg)\"\n : size === \"xl\"\n ? \"var(--checkbox-size-xl)\"\n : \"var(--checkbox-size-md)\",\n height:\n size === \"xs\"\n ? \"var(--checkbox-size-xs)\"\n : size === \"sm\"\n ? \"var(--checkbox-size-sm)\"\n : size === \"lg\"\n ? \"var(--checkbox-size-lg)\"\n : size === \"xl\"\n ? \"var(--checkbox-size-xl)\"\n : \"var(--checkbox-size-md)\",\n borderColor: \"var(--color-border)\",\n backgroundColor: \"var(--color-muted)\",\n accentColor: \"var(--color-primary)\",\n opacity: isDisabled\n ? \"var(--checkbox-disabled-opacity)\"\n : undefined,\n }}\n />\n </div>\n <label\n htmlFor={`${name}-${option.value}`}\n className={cn(\n \"font-medium\",\n isDisabled && \"cursor-not-allowed\",\n !isDisabled && \"cursor-pointer\"\n )}\n style={{\n fontSize:\n size === \"xs\"\n ? \"var(--checkbox-label-font-size-xs)\"\n : size === \"sm\"\n ? \"var(--checkbox-label-font-size-sm)\"\n : size === \"lg\"\n ? \"var(--checkbox-label-font-size-lg)\"\n : size === \"xl\"\n ? \"var(--checkbox-label-font-size-xl)\"\n : \"var(--checkbox-label-font-size-md)\",\n color: \"var(--color-muted-foreground)\",\n opacity: isDisabled\n ? \"var(--checkbox-disabled-opacity)\"\n : undefined,\n }}\n >\n {option.label}\n </label>\n </div>\n );\n })}\n </div>\n <div className=\"h-5 mt-1.5\">\n {(error || helperText) && (\n <p\n className={`text-small ${error ? \"text-error\" : \"text-(--color-muted-foreground)\"}`}\n role={error ? \"alert\" : undefined}\n >\n {error || helperText}\n </p>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { useForm, ValidationFunction } from \"./form\";\n\ninterface RadioOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\ninterface RadioGroupProps {\n label?: string;\n name: string;\n options: RadioOption[];\n value?: string;\n onChange?: (value: string) => void;\n className?: string;\n orientation?: \"vertical\" | \"horizontal\";\n required?: boolean;\n disabled?: boolean;\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n error?: string;\n helperText?: string;\n errorMessage?: string;\n validate?: ValidationFunction;\n}\n\nexport function RadioGroup({\n label,\n name,\n options,\n value: externalValue,\n onChange,\n className,\n orientation = \"vertical\",\n required = false,\n disabled = false,\n size = \"sm\",\n error,\n helperText,\n errorMessage,\n validate,\n}: RadioGroupProps) {\n const form = useForm();\n const [validationError, setValidationError] = useState<\n string | undefined\n >();\n const [touched, setTouched] = useState(false);\n\n // Determine value source\n let value: string | undefined;\n let displayError: string | undefined;\n\n if (form && name) {\n // Using Form context\n value = form.values[name] ?? externalValue;\n displayError = form.shouldShowError(name)\n ? form.getFieldError(name)\n : undefined;\n } else {\n // Standalone usage\n value = externalValue;\n displayError = error || validationError;\n }\n\n // Register with Form\n useEffect(() => {\n if (form && name) {\n const validator: ValidationFunction = async (val: string) => {\n if (required && !val) {\n return errorMessage || \"Please select an option\";\n }\n if (validate) {\n return await validate(val);\n }\n return undefined;\n };\n\n form.registerField(name, validator);\n return () => form.unregisterField(name);\n }\n }, [form, name]);\n\n // Validate on value change if touched (standalone mode only)\n useEffect(() => {\n if (!form && touched && required && !value) {\n setValidationError(errorMessage || \"Please select an option\");\n } else if (!form) {\n setValidationError(undefined);\n }\n }, [value, touched, required, errorMessage, form]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n\n if (form && name) {\n // Update Form context\n form.setFieldValue(name, newValue);\n form.setFieldTouched(name, true);\n // Validate on change for radio (immediate feedback with new value)\n form.validateField(name, newValue);\n } else {\n // Standalone mode\n setTouched(true);\n onChange?.(newValue);\n }\n };\n\n const containerGapStyles = {\n xs: \"gap-2\",\n sm: \"gap-2\",\n md: \"gap-2\",\n lg: \"gap-2\",\n xl: \"gap-2\",\n };\n\n return (\n <div\n className={className}\n style={{ marginBottom: \"var(--form-control-spacing)\" }}\n >\n {label && (\n <label\n className=\"block text-small font-semibold mb-1\"\n style={{ color: \"var(--color-muted-foreground)\" }}\n >\n {label}\n {required && <span className=\"ml-1\">*</span>}\n </label>\n )}\n <div\n className={cn(\n orientation === \"vertical\" && \"space-y-2\",\n orientation === \"horizontal\" && \"flex flex-wrap gap-4\"\n )}\n >\n {options.map((option) => {\n const isDisabled = disabled || option.disabled;\n return (\n <div\n key={option.value}\n className={cn(\n \"flex items-center\",\n containerGapStyles[size]\n )}\n >\n <div className=\"relative group/radio flex items-center shrink-0\">\n <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 pointer-events-none\">\n <div\n className=\"rounded-full scale-0 group-hover/radio:scale-100 group-active/radio:scale-100 transition-transform duration-200 ease-out\"\n style={{\n width:\n size === \"xs\"\n ? \"1.75rem\"\n : size === \"sm\"\n ? \"2rem\"\n : size === \"lg\"\n ? \"2.5rem\"\n : size === \"xl\"\n ? \"3rem\"\n : \"2.25rem\",\n height:\n size === \"xs\"\n ? \"1.75rem\"\n : size === \"sm\"\n ? \"2rem\"\n : size === \"lg\"\n ? \"2.5rem\"\n : size === \"xl\"\n ? \"3rem\"\n : \"2.25rem\",\n backgroundColor:\n \"var(--radio-hover-bg)\",\n }}\n />\n </div>\n <input\n type=\"radio\"\n id={`${name}-${option.value}`}\n name={name}\n value={option.value}\n checked={value === option.value}\n onChange={handleChange}\n disabled={isDisabled}\n className={cn(\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 transition-all relative z-10 rounded-full\",\n isDisabled && \"cursor-not-allowed\"\n )}\n style={{\n width:\n size === \"xs\"\n ? \"var(--radio-size-xs)\"\n : size === \"sm\"\n ? \"var(--radio-size-sm)\"\n : size === \"lg\"\n ? \"var(--radio-size-lg)\"\n : size === \"xl\"\n ? \"var(--radio-size-xl)\"\n : \"var(--radio-size-md)\",\n height:\n size === \"xs\"\n ? \"var(--radio-size-xs)\"\n : size === \"sm\"\n ? \"var(--radio-size-sm)\"\n : size === \"lg\"\n ? \"var(--radio-size-lg)\"\n : size === \"xl\"\n ? \"var(--radio-size-xl)\"\n : \"var(--radio-size-md)\",\n borderColor: \"var(--color-border)\",\n backgroundColor: \"var(--color-muted)\",\n accentColor: \"var(--color-primary)\",\n opacity: isDisabled\n ? \"var(--radio-disabled-opacity)\"\n : undefined,\n }}\n />\n </div>\n <label\n htmlFor={`${name}-${option.value}`}\n className={cn(\n \"font-medium\",\n isDisabled && \"cursor-not-allowed\",\n !isDisabled && \"cursor-pointer\"\n )}\n style={{\n fontSize:\n size === \"xs\"\n ? \"var(--radio-label-font-size-xs)\"\n : size === \"sm\"\n ? \"var(--radio-label-font-size-sm)\"\n : size === \"lg\"\n ? \"var(--radio-label-font-size-lg)\"\n : size === \"xl\"\n ? \"var(--radio-label-font-size-xl)\"\n : \"var(--radio-label-font-size-md)\",\n color: \"var(--color-muted-foreground)\",\n opacity: isDisabled\n ? \"var(--radio-disabled-opacity)\"\n : undefined,\n }}\n >\n {option.label}\n </label>\n </div>\n );\n })}\n </div>\n <div className=\"h-5 mt-1.5\">\n {(displayError || helperText) && (\n <p\n className={`text-small ${displayError ? \"text-error\" : \"text-(--color-muted-foreground)\"}`}\n role={displayError ? \"alert\" : undefined}\n >\n {displayError || helperText}\n </p>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { ChevronDown, X } from \"lucide-react\";\nimport { useState, useRef, useEffect, ReactNode } from \"react\";\nimport { useForm, ValidationFunction } from \"./form\";\n\nexport interface SelectOption {\n value: string | number;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps {\n /**\n * Field name - required when used inside Form\n */\n name?: string;\n /**\n * Label text displayed above the select\n */\n label?: string;\n /**\n * Placeholder text when no option is selected\n */\n placeholder?: string;\n /**\n * Array of options for the select\n */\n options?: SelectOption[];\n /**\n * Current selected value\n */\n value?: string | number;\n /**\n * Callback when selection changes\n */\n onChange?: (value: string | number) => void;\n /**\n * Custom content to render in the select menu (overrides options)\n */\n children?: ReactNode;\n /**\n * Disable the select\n */\n disabled?: boolean;\n /**\n * Error message to display\n */\n error?: string;\n /**\n * Helper text to display below the select\n */\n helperText?: string;\n /**\n * Mark the field as required\n */\n required?: boolean;\n /**\n * Size of the select\n */\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n /**\n * Additional CSS classes\n */\n className?: string;\n /**\n * Custom validation function that returns error message or undefined if valid\n */\n validate?: ValidationFunction;\n /**\n * Callback when validation error changes\n */\n onValidationError?: (error: string | undefined) => void;\n /**\n * Custom error message for required validation\n */\n errorMessage?: string;\n}\n\nexport function Select({\n name,\n label,\n placeholder = \"Select an option\",\n options = [],\n value: externalValue,\n onChange,\n children,\n disabled = false,\n error,\n helperText,\n required = false,\n size = \"md\",\n className = \"\",\n validate,\n onValidationError: _onValidationError,\n errorMessage,\n}: SelectProps) {\n const form = useForm();\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const [validationError, _setValidationError] = useState<\n string | undefined\n >();\n const [focusedIndex, setFocusedIndex] = useState<number>(-1);\n const [searchString, setSearchString] = useState<string>(\"\");\n const searchTimeoutRef = useRef<NodeJS.Timeout>();\n\n // Determine value and error from Form context or props\n let value: string | number | undefined;\n let displayError: string | undefined;\n\n if (form && name) {\n // Using Form context\n value = form.values[name] ?? externalValue;\n displayError = form.shouldShowError(name)\n ? form.getFieldError(name)\n : undefined;\n } else {\n // Standalone usage\n value = externalValue;\n displayError = error || validationError;\n }\n\n // Register with Form\n useEffect(() => {\n if (form && name) {\n const validator: ValidationFunction = async (val: any) => {\n if (\n required &&\n (val === undefined || val === null || val === \"\")\n ) {\n return errorMessage || \"Please select an option\";\n }\n if (validate) {\n return await validate(val);\n }\n return undefined;\n };\n\n form.registerField(name, validator);\n return () => form.unregisterField(name);\n }\n }, [form, name, required, validate, errorMessage]);\n\n // Get the display text for the selected value\n const getSelectedLabel = () => {\n if (!value) return placeholder;\n const selected = options.find((opt) => opt.value === value);\n return selected ? selected.label : placeholder;\n };\n\n const sizeStyles = {\n xs: `[padding-left:var(--dropdown-padding-xs-x)] [padding-right:var(--dropdown-padding-xs-x)] [padding-top:var(--dropdown-padding-xs-y)] [padding-bottom:var(--dropdown-padding-xs-y)] [font-size:var(--dropdown-font-size-xs)]`,\n sm: `[padding-left:var(--dropdown-padding-sm-x)] [padding-right:var(--dropdown-padding-sm-x)] [padding-top:var(--dropdown-padding-sm-y)] [padding-bottom:var(--dropdown-padding-sm-y)] [font-size:var(--dropdown-font-size-sm)]`,\n md: `[padding-left:var(--dropdown-padding-md-x)] [padding-right:var(--dropdown-padding-md-x)] [padding-top:var(--dropdown-padding-md-y)] [padding-bottom:var(--dropdown-padding-md-y)] [font-size:var(--dropdown-font-size-md)]`,\n lg: `[padding-left:var(--dropdown-padding-lg-x)] [padding-right:var(--dropdown-padding-lg-x)] [padding-top:var(--dropdown-padding-lg-y)] [padding-bottom:var(--dropdown-padding-lg-y)] [font-size:var(--dropdown-font-size-lg)]`,\n xl: `[padding-left:var(--dropdown-padding-xl-x)] [padding-right:var(--dropdown-padding-xl-x)] [padding-top:var(--dropdown-padding-xl-y)] [padding-bottom:var(--dropdown-padding-xl-y)] [font-size:var(--dropdown-font-size-xl)]`,\n };\n\n const iconSizeStyles = {\n xs: `[width:var(--dropdown-icon-size-xs)] [height:var(--dropdown-icon-size-xs)]`,\n sm: `[width:var(--dropdown-icon-size-sm)] [height:var(--dropdown-icon-size-sm)]`,\n md: `[width:var(--dropdown-icon-size-md)] [height:var(--dropdown-icon-size-md)]`,\n lg: `[width:var(--dropdown-icon-size-lg)] [height:var(--dropdown-icon-size-lg)]`,\n xl: `[width:var(--dropdown-icon-size-xl)] [height:var(--dropdown-icon-size-xl)]`,\n };\n\n const optionSizeStyles = {\n xs: `[padding-left:var(--dropdown-option-padding-xs-x)] [padding-right:var(--dropdown-option-padding-xs-x)] [padding-top:var(--dropdown-option-padding-xs-y)] [padding-bottom:var(--dropdown-option-padding-xs-y)] [font-size:var(--dropdown-option-font-size-xs)]`,\n sm: `[padding-left:var(--dropdown-option-padding-sm-x)] [padding-right:var(--dropdown-option-padding-sm-x)] [padding-top:var(--dropdown-option-padding-sm-y)] [padding-bottom:var(--dropdown-option-padding-sm-y)] [font-size:var(--dropdown-option-font-size-sm)]`,\n md: `[padding-left:var(--dropdown-option-padding-md-x)] [padding-right:var(--dropdown-option-padding-md-x)] [padding-top:var(--dropdown-option-padding-md-y)] [padding-bottom:var(--dropdown-option-padding-md-y)] [font-size:var(--dropdown-option-font-size-md)]`,\n lg: `[padding-left:var(--dropdown-option-padding-lg-x)] [padding-right:var(--dropdown-option-padding-lg-x)] [padding-top:var(--dropdown-option-padding-lg-y)] [padding-bottom:var(--dropdown-option-padding-lg-y)] [font-size:var(--dropdown-option-font-size-lg)]`,\n xl: `[padding-left:var(--dropdown-option-padding-xl-x)] [padding-right:var(--dropdown-option-padding-xl-x)] [padding-top:var(--dropdown-option-padding-xl-y)] [padding-bottom:var(--dropdown-option-padding-xl-y)] [font-size:var(--dropdown-option-font-size-xl)]`,\n };\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () =>\n document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n const handleSelect = (optionValue: string | number) => {\n if (form && name) {\n // Update Form context\n form.setFieldValue(name, optionValue);\n form.setFieldTouched(name, true);\n // Validate on change for select (immediate feedback with new value)\n form.validateField(name, optionValue);\n } else {\n // Standalone mode\n onChange?.(optionValue);\n }\n setIsOpen(false);\n // Refocus the trigger button to maintain focus\n setTimeout(() => triggerRef.current?.focus(), 0);\n };\n\n const handleClear = async (e: React.MouseEvent) => {\n e.stopPropagation();\n if (form && name) {\n // Update Form context\n form.setFieldValue(name, undefined);\n form.setFieldTouched(name, true);\n // Validate with empty value (await to ensure it runs after state update)\n await form.validateField(name, undefined);\n } else {\n // Standalone mode\n onChange?.(undefined as any);\n }\n setIsOpen(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) return;\n\n // Open/close dropdown\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n const currentIndex = options.findIndex(\n (opt) => opt.value === value\n );\n setFocusedIndex(currentIndex);\n } else if (focusedIndex >= 0 && focusedIndex < options.length) {\n handleSelect(options[focusedIndex].value);\n }\n } else if (e.key === \"Escape\") {\n setIsOpen(false);\n setFocusedIndex(-1);\n }\n // Arrow navigation\n else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n if (!isOpen) {\n // When closed, navigate to next option and change value (like native select)\n const currentIndex = options.findIndex(\n (opt) => opt.value === value\n );\n const nextIndex =\n currentIndex < options.length - 1\n ? currentIndex + 1\n : currentIndex;\n if (nextIndex !== currentIndex && options[nextIndex]) {\n handleSelect(options[nextIndex].value);\n } else if (currentIndex === -1 && options.length > 0) {\n // No value selected, select first option\n handleSelect(options[0].value);\n }\n } else {\n // When open, just navigate focus\n setFocusedIndex((prev) =>\n prev < options.length - 1 ? prev + 1 : prev\n );\n }\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n if (!isOpen) {\n // When closed, navigate to previous option and change value (like native select)\n const currentIndex = options.findIndex(\n (opt) => opt.value === value\n );\n const prevIndex =\n currentIndex > 0 ? currentIndex - 1 : currentIndex;\n if (prevIndex !== currentIndex && options[prevIndex]) {\n handleSelect(options[prevIndex].value);\n }\n } else {\n // When open, just navigate focus\n setFocusedIndex((prev) => (prev > 0 ? prev - 1 : 0));\n }\n }\n // Type-to-search\n else if (e.key.length === 1 && /[a-z0-9]/i.test(e.key)) {\n e.preventDefault();\n\n // Clear previous search timeout\n if (searchTimeoutRef.current) {\n clearTimeout(searchTimeoutRef.current);\n }\n\n // Append to search string\n const newSearchString = searchString + e.key.toLowerCase();\n setSearchString(newSearchString);\n\n // Find matching option\n const matchIndex = options.findIndex((opt) =>\n opt.label.toLowerCase().startsWith(newSearchString)\n );\n\n if (matchIndex >= 0) {\n if (!isOpen) {\n // When closed, select the matching option (like native select)\n handleSelect(options[matchIndex].value);\n } else {\n // When open, just focus it\n setFocusedIndex(matchIndex);\n }\n }\n\n // Clear search string after 1 second\n searchTimeoutRef.current = setTimeout(() => {\n setSearchString(\"\");\n }, 1000);\n }\n };\n\n return (\n <div\n className={`w-full ${className}`}\n style={{ marginBottom: \"var(--form-control-spacing)\" }}\n >\n {/* Label */}\n {label && (\n <label\n className=\"block text-small font-semibold mb-1\"\n style={{ color: \"var(--color-muted-foreground)\" }}\n >\n {label}\n {required && <span className=\"ml-1\">*</span>}\n </label>\n )}\n\n {/* Hidden input for form submission */}\n {name && (\n <input\n type=\"hidden\"\n name={name}\n value={value ?? \"\"}\n required={required}\n />\n )}\n\n {/* Dropdown Container */}\n <div ref={dropdownRef} className=\"relative\">\n {/* Trigger Button */}\n <button\n ref={triggerRef}\n type=\"button\"\n onClick={() => !disabled && setIsOpen(!isOpen)}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n className={`\n w-full ${\n sizeStyles[size]\n } text-left bg-(--color-background) border rounded-(--dropdown-radius)\n flex items-center justify-between\n transition-all duration-200\n outline-none\n ${\n displayError\n ? \"border-error focus:ring-2 focus:ring-error focus:border-error focus-visible:ring-2 focus-visible:ring-error focus-visible:border-error\"\n : \"border-(--color-border) focus:ring-2 focus:ring-(--color-primary)/30 focus:border-(--color-primary) focus-visible:ring-2 focus-visible:ring-(--color-primary)/30 focus-visible:border-(--color-primary)\"\n }\n ${\n disabled\n ? \"bg-(--color-muted) cursor-not-allowed opacity-60\"\n : \"hover:border-(--color-primary)\"\n }\n ${!value ? \"text-(--color-placeholder)\" : \"text-(--color-foreground)\"}\n `}\n >\n <span className=\"truncate\">{getSelectedLabel()}</span>\n <div className=\"flex items-center gap-1 ml-2\">\n {value && (\n <div\n onClick={handleClear}\n className=\"p-0.5 hover:bg-(--color-muted) rounded transition-colors cursor-pointer\"\n role=\"button\"\n aria-label=\"Clear selection\"\n tabIndex={-1}\n >\n <X\n className={`${iconSizeStyles[size]} text-(--color-muted-foreground)`}\n />\n </div>\n )}\n <ChevronDown\n className={`${\n iconSizeStyles[size]\n } text-(--color-placeholder) transition-transform duration-200 shrink-0 ${\n isOpen ? \"transform rotate-180\" : \"\"\n }`}\n />\n </div>\n </button>\n\n {/* Dropdown Menu */}\n {isOpen && !disabled && (\n <div\n className=\"absolute z-(--z-index-dropdown) w-full mt-1 bg-(--color-background) border border-(--color-border) rounded-lg shadow-lg max-h-60 overflow-auto\"\n role=\"listbox\"\n >\n {children ? (\n // Custom content\n <div onClick={() => setIsOpen(false)}>\n {children}\n </div>\n ) : (\n // Standard options\n <ul>\n {/* Placeholder option - allows users to clear selection */}\n <li key=\"__placeholder__\">\n <button\n type=\"button\"\n onClick={handleClear}\n className={`\n w-full ${optionSizeStyles[size]} text-left\n transition-colors duration-150\n outline-none\n focus-visible:bg-(--color-muted) focus-visible:text-(--color-foreground)\n ${\n !value || value === \"\"\n ? \"bg-[color-mix(in_srgb,var(--color-primary)_10%,transparent)] text-(--color-primary) font-medium\"\n : \"text-(--color-muted-foreground) hover:bg-(--color-muted)\"\n }\n `}\n role=\"option\"\n aria-selected={!value || value === \"\"}\n >\n {placeholder}\n </button>\n </li>\n {options.map((option, index) => (\n <li key={option.value}>\n <button\n type=\"button\"\n onClick={() =>\n !option.disabled &&\n handleSelect(option.value)\n }\n disabled={option.disabled}\n onMouseEnter={() =>\n setFocusedIndex(index)\n }\n className={`\n w-full ${optionSizeStyles[size]} text-left\n transition-colors duration-150\n outline-none\n focus-visible:bg-(--color-muted) focus-visible:text-(--color-foreground)\n ${\n option.value === value\n ? \"bg-[color-mix(in_srgb,var(--color-primary)_10%,transparent)] text-(--color-primary) font-medium\"\n : index === focusedIndex\n ? \"bg-(--color-muted) text-(--color-foreground)\"\n : \"text-(--color-foreground) hover:bg-(--color-muted)\"\n }\n ${\n option.disabled\n ? \"opacity-50 cursor-not-allowed\"\n : \"\"\n }\n `}\n role=\"option\"\n aria-selected={\n option.value === value\n }\n >\n {option.label}\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n </div>\n\n {/* Helper Text or Error */}\n <div className=\"h-5 mt-1.5\">\n {(helperText || displayError) && (\n <p\n className={`text-small ${displayError ? \"text-error\" : \"text-(--color-muted-foreground)\"}`}\n >\n {displayError || helperText}\n </p>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { ReactNode, SelectHTMLAttributes } from \"react\";\nimport { useForm, ValidationFunction } from \"./form\";\n\nexport interface NativeSelectProps extends Omit<\n SelectHTMLAttributes<HTMLSelectElement>,\n \"size\" | \"onChange\"\n> {\n /**\n * Field name - required when used inside Form\n */\n name?: string;\n /**\n * Label text displayed above the select\n */\n label?: string;\n /**\n * Current selected value\n */\n value?: string | number;\n /**\n * Callback when selection changes\n */\n onChange?: (value: string) => void;\n /**\n * Select options as children (<option> elements)\n */\n children?: ReactNode;\n /**\n * Error message to display\n */\n error?: string;\n /**\n * Helper text to display below the select\n */\n helperText?: string;\n /**\n * Mark the field as required\n */\n required?: boolean;\n /**\n * Size of the select\n */\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n /**\n * Additional CSS classes\n */\n className?: string;\n /**\n * Custom validation function\n */\n validate?: ValidationFunction;\n /**\n * Custom error message for required validation\n */\n errorMessage?: string;\n}\n\nexport function NativeSelect({\n name,\n label,\n value: externalValue,\n onChange,\n children,\n error,\n helperText,\n required = false,\n size = \"md\",\n className = \"\",\n validate,\n errorMessage,\n disabled = false,\n ...htmlProps\n}: NativeSelectProps) {\n const form = useForm();\n\n // Determine value and error from Form context or props\n let value: string | number | undefined;\n let displayError: string | undefined;\n\n if (form && name) {\n // Using Form context\n value = form.values[name] ?? externalValue;\n displayError = form.shouldShowError(name)\n ? form.getFieldError(name)\n : undefined;\n } else {\n // Standalone usage\n value = externalValue;\n displayError = error;\n }\n\n // Register with Form\n if (form && name) {\n const validator: ValidationFunction = async (val: any) => {\n if (required && (val === undefined || val === null || val === \"\")) {\n return errorMessage || \"Please select an option\";\n }\n if (validate) {\n return await validate(val);\n }\n return undefined;\n };\n\n form.registerField(name, validator);\n }\n\n const handleChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const newValue = e.target.value;\n\n if (form && name) {\n form.setFieldValue(name, newValue);\n form.setFieldTouched(name, true);\n form.validateField(name, newValue);\n } else {\n onChange?.(newValue);\n }\n };\n\n const sizeStyles = {\n xs: \"px-2 py-1.5 text-xs\",\n sm: \"px-2.5 py-2 text-sm\",\n md: \"px-3 py-2.5 text-base\",\n lg: \"px-4 py-3 text-lg\",\n xl: \"px-5 py-3.5 text-xl\",\n };\n\n return (\n <div\n className={`w-full ${className}`}\n style={{ marginBottom: \"var(--form-control-spacing)\" }}\n >\n {/* Label */}\n {label && (\n <label\n className=\"block text-small font-semibold mb-1\"\n style={{ color: \"var(--color-muted-foreground)\" }}\n >\n {label}\n {required && <span className=\"ml-1 text-error\">*</span>}\n </label>\n )}\n\n {/* Native Select */}\n <select\n name={name}\n value={value ?? \"\"}\n onChange={handleChange}\n disabled={disabled}\n required={required}\n className={`\n w-full ${sizeStyles[size]}\n bg-(--color-background) \n border rounded-(--dropdown-radius)\n transition-all duration-200\n appearance-none\n cursor-pointer\n outline-none\n ${\n displayError\n ? \"border-error focus:border-error active:border-error\"\n : \"border-(--color-border) focus:border-(--color-primary) active:border-(--color-primary)\"\n }\n ${\n disabled\n ? \"bg-(--color-muted) cursor-not-allowed opacity-60\"\n : \"hover:border-(--color-primary)\"\n }\n ${!value ? \"text-(--color-placeholder)\" : \"text-(--color-foreground)\"}\n pr-10\n bg-[url('data:image/svg+xml;charset=UTF-8,%3csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3cpolyline%20points%3D%226%209%2012%2015%2018%209%22%3E%3c%2fpolyline%3E%3c%2fsvg%3E')]\n bg-[length:1.25rem_1.25rem]\n bg-[position:right_0.5rem_center]\n bg-no-repeat\n `}\n {...htmlProps}\n >\n {children}\n </select>\n\n {/* Helper Text or Error */}\n <div className=\"h-5 mt-1.5\">\n {(helperText || displayError) && (\n <p\n className={`text-small ${displayError ? \"text-error\" : \"text-(--color-muted-foreground)\"}`}\n >\n {displayError || helperText}\n </p>\n )}\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport interface SpinnerProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n color?: \"primary\" | \"secondary\" | \"white\";\n label?: string;\n}\n\nconst Spinner = React.forwardRef<HTMLDivElement, SpinnerProps>(\n ({ className, size = \"md\", color = \"primary\", label, ...props }, ref) => {\n const sizes = {\n sm: \"h-4 w-4\",\n md: \"h-8 w-8\",\n lg: \"h-12 w-12\",\n xl: \"h-16 w-16\",\n };\n\n const colors = {\n primary: \"text-(--color-primary)\",\n secondary: \"text-(--color-muted-foreground)\",\n white: \"text-white\",\n };\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col items-center justify-center gap-2\",\n className\n )}\n {...props}\n >\n <svg\n className={cn(\"animate-spin\", sizes[size], colors[color])}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n ></circle>\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n {label && (\n <p className=\"text-small text-(--color-muted-foreground)\">\n {label}\n </p>\n )}\n </div>\n );\n }\n);\n\nSpinner.displayName = \"Spinner\";\n\nexport { Spinner };\n","\"use client\";\n\nimport { Highlight, themes } from \"prism-react-renderer\";\nimport { useState } from \"react\";\n\ninterface CodeSnippetProps {\n code: string;\n language?: string;\n fontSize?: \"small\" | \"body\" | \"h6\";\n wrap?: boolean;\n}\n\nexport function CodeSnippet({\n code,\n language = \"tsx\",\n fontSize = \"small\",\n wrap = false,\n}: CodeSnippetProps) {\n const fontSizeClassMap = {\n small: \"text-small\",\n body: \"text-body\",\n h6: \"text-h6\",\n };\n const [copied, setCopied] = useState(false);\n const [showTooltip, setShowTooltip] = useState(false);\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(code);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error(\"Failed to copy:\", err);\n }\n };\n\n return (\n <div className=\"relative group w-full\">\n {/* Copy Button */}\n <div className=\"absolute right-3 top-3 [z-index:var(--z-index-code-button)]\">\n <button\n onClick={handleCopy}\n onMouseEnter={() => setShowTooltip(true)}\n onMouseLeave={() => setShowTooltip(false)}\n className=\"relative p-2 rounded-md bg-[#1f2937] hover:bg-[#374151] text-(--color-placeholder) hover:text-[#e5e7eb] transition-all duration-200 border border-[#374151] hover:border-[#4b5563] shadow-lg\"\n aria-label=\"Copy code\"\n >\n {copied ? (\n // Check icon\n <svg\n className=\"w-4 h-4 text-green-400\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n ) : (\n // Copy icon\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n )}\n </button>\n\n {/* Tooltip */}\n {showTooltip && !copied && (\n <div className=\"absolute right-0 top-full mt-2 px-2 py-1 bg-[#1f2937] text-white text-caption rounded shadow-lg whitespace-nowrap border border-[#374151]\">\n Copy code\n <div className=\"absolute -top-1 right-3 w-2 h-2 bg-[#1f2937] border-l border-t border-[#374151] transform rotate-45\"></div>\n </div>\n )}\n\n {copied && (\n <div className=\"absolute right-0 top-full mt-2 px-2 py-1 bg-green-600 text-white text-caption rounded shadow-lg whitespace-nowrap\">\n Copied!\n <div className=\"absolute -top-1 right-3 w-2 h-2 bg-green-600 transform rotate-45\"></div>\n </div>\n )}\n </div>\n\n {/* Code Block with Syntax Highlighting */}\n <div\n className={`rounded-lg overflow-x-auto border border-[#1f2937] ${fontSizeClassMap[fontSize]} code-snippet-${fontSize}`}\n >\n <Highlight\n theme={themes.vsDark}\n code={code}\n language={language}\n >\n {({ style, tokens, getLineProps, getTokenProps }) => (\n <pre\n style={{\n ...style,\n margin: 0,\n padding: \"1rem 3.5rem 1rem 1rem\",\n lineHeight: \"1.5\",\n background: \"#1a1b26\",\n whiteSpace: wrap ? \"pre-wrap\" : \"pre\",\n wordBreak: wrap ? \"break-word\" : \"normal\",\n }}\n >\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line })}>\n {line.map((token, key) => (\n <span\n key={key}\n {...getTokenProps({ token })}\n />\n ))}\n </div>\n ))}\n </pre>\n )}\n </Highlight>\n </div>\n </div>\n );\n}\n","// Moved from src/components/ui/Rating.tsx for consistency\nimport { Star } from \"lucide-react\";\nimport React, { useId } from \"react\";\n\ninterface RatingProps {\n value: number; // e.g. 3.5\n max?: number; // default 5\n size?: number; // px (desktop size when responsive is true)\n color?: string; // default yellow\n className?: string;\n responsive?: boolean; // Auto-scale on small screens\n mobileSize?: number; // px (size for mobile when responsive is true)\n interactive?: boolean; // Allow clicking to set rating\n onChange?: (value: number) => void; // Callback when rating is clicked\n showValue?: boolean; // Display numeric value\n valuePosition?: \"inline\" | \"bottom\"; // Position of numeric value\n valueFormat?: \"decimal\" | \"fraction\"; // Format: \"3.5\" or \"3.5/5\"\n}\n\nexport const Rating: React.FC<RatingProps> = ({\n value,\n max = 5,\n size = 24,\n color = \"var(--color-warning, #FFD600)\",\n className = \"\",\n responsive = false,\n mobileSize,\n interactive = false,\n onChange,\n showValue = false,\n valuePosition = \"inline\",\n valueFormat = \"decimal\",\n}) => {\n // Generate unique ID for SVG gradients (stable across server/client)\n const uniqueId = useId();\n const [hoverValue, setHoverValue] = React.useState<number | null>(null);\n\n const handleStarClick = (starIndex: number) => {\n if (interactive && onChange) {\n onChange(starIndex);\n }\n };\n\n const handleMouseEnter = (starIndex: number) => {\n if (interactive) {\n setHoverValue(starIndex);\n }\n };\n\n const handleMouseLeave = () => {\n if (interactive) {\n setHoverValue(null);\n }\n };\n\n const displayValue = hoverValue !== null ? hoverValue : value;\n\n // Determine sizes\n const actualMobileSize = mobileSize || Math.max(16, Math.floor(size * 0.7));\n const displaySize = size;\n const gap = Math.max(2, size * 0.15);\n\n const stars = [];\n for (let i = 1; i <= max; i++) {\n const isFull = displayValue >= i;\n const isHalf = displayValue >= i - 0.5 && displayValue < i;\n const isEmpty = displayValue < i - 0.5;\n\n stars.push(\n <span\n key={i}\n onClick={() => handleStarClick(i)}\n onMouseEnter={(e) => {\n handleMouseEnter(i);\n if (interactive) {\n e.currentTarget.style.transform = \"scale(1.1)\";\n }\n }}\n onMouseLeave={(e) => {\n handleMouseLeave();\n if (interactive) {\n e.currentTarget.style.transform = \"scale(1)\";\n }\n }}\n style={{\n position: \"relative\",\n display: \"inline-block\",\n width: responsive ? undefined : displaySize,\n height: responsive ? undefined : displaySize,\n flexShrink: 0,\n cursor: interactive ? \"pointer\" : \"default\",\n transition: interactive ? \"transform 0.15s ease\" : \"none\",\n ...(responsive &&\n ({\n \"--star-size\": `${displaySize}px`,\n \"--star-mobile-size\": `${actualMobileSize}px`,\n width: \"var(--star-size)\",\n height: \"var(--star-size)\",\n } as React.CSSProperties)),\n }}\n className={\n responsive\n ? \"sm:w-(--star-size) sm:h-(--star-size) w-(--star-mobile-size) h-(--star-mobile-size)\"\n : \"\"\n }\n >\n {/* Base star outline */}\n <Star\n size={displaySize}\n color={isEmpty ? \"var(--color-gray-300, #E0E0E0)\" : color}\n fill=\"none\"\n style={{ position: \"absolute\", left: 0, top: 0 }}\n />\n {/* Full star fill */}\n {isFull && (\n <Star\n size={displaySize}\n color={color}\n fill={color}\n style={{ position: \"absolute\", left: 0, top: 0 }}\n />\n )}\n {/* Half star overlay */}\n {isHalf && (\n <svg\n width={displaySize}\n height={displaySize}\n viewBox={`0 0 ${displaySize} ${displaySize}`}\n style={{ position: \"absolute\", left: 0, top: 0 }}\n >\n <defs>\n <linearGradient\n id={`half-${uniqueId}-${i}`}\n x1=\"0\"\n x2=\"1\"\n y1=\"0\"\n y2=\"0\"\n >\n <stop offset=\"50%\" stopColor={color} />\n <stop offset=\"50%\" stopColor=\"transparent\" />\n </linearGradient>\n </defs>\n <Star\n size={displaySize}\n color={color}\n fill={`url(#half-${uniqueId}-${i})`}\n />\n </svg>\n )}\n </span>\n );\n }\n\n const valueText =\n valueFormat === \"fraction\"\n ? `${value.toFixed(1)}/${max}`\n : value.toFixed(1);\n\n if (showValue && valuePosition === \"bottom\") {\n return (\n <div\n className={className}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: gap * 2,\n }}\n >\n <div\n style={{\n display: \"flex\",\n gap,\n alignItems: \"center\",\n }}\n >\n {stars}\n </div>\n <span\n style={{\n fontSize: size * 0.75,\n fontWeight: 600,\n color: \"var(--color-gray-600, #4B5563)\",\n }}\n >\n {valueText}\n </span>\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap,\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {stars}\n {showValue && (\n <span\n style={{\n marginLeft: gap * 2,\n fontSize: size * 0.75,\n fontWeight: 600,\n color: \"var(--color-gray-600, #4B5563)\",\n }}\n >\n {valueText}\n </span>\n )}\n </div>\n );\n};\n","import React from \"react\";\n\nexport interface DividerProps {\n /**\n * The variant to use\n * @default \"fullWidth\"\n */\n variant?: \"fullWidth\" | \"inset\" | \"middle\";\n /**\n * The orientation of the divider\n * @default \"horizontal\"\n */\n orientation?: \"horizontal\" | \"vertical\";\n /**\n * The alignment of the content when children are provided\n * @default \"center\"\n */\n textAlign?: \"left\" | \"center\" | \"right\";\n /**\n * If true, the divider will have flex item properties when in a flex container\n * @default false\n */\n flexItem?: boolean;\n /**\n * Thickness of the divider line in pixels\n * @default 1\n */\n thickness?: number;\n /**\n * Content to be rendered inside the divider\n */\n children?: React.ReactNode;\n /**\n * Additional CSS classes\n */\n className?: string;\n}\n\nexport const Divider: React.FC<DividerProps> = ({\n variant = \"fullWidth\",\n orientation = \"horizontal\",\n textAlign = \"center\",\n flexItem = false,\n thickness = 1,\n children,\n className = \"\",\n}) => {\n const isVertical = orientation === \"vertical\";\n\n // Base classes\n const baseClasses = \"border-0\";\n\n // Base styles with CSS variables\n const baseStyles: React.CSSProperties = {\n backgroundColor: \"var(--color-border, #9ca3af)\",\n };\n\n // Variant classes\n const variantClasses = {\n fullWidth: \"\",\n inset: isVertical ? \"\" : \"ml-16\",\n middle: isVertical ? \"my-2\" : \"mx-4\",\n };\n\n // Orientation classes with thickness\n const thicknessStyle = isVertical\n ? { width: `${thickness}px` }\n : { height: `${thickness}px` };\n\n const orientationClasses = isVertical\n ? \"inline-block min-h-[1rem]\"\n : \"block w-full\";\n\n // Flex item classes\n const flexClasses = flexItem && isVertical ? \"self-stretch !h-auto\" : \"\";\n\n // Text styles with CSS variables\n const textStyles: React.CSSProperties = {\n fontSize: \"var(--typography-small, 0.75rem)\",\n color: \"var(--color-muted-foreground, #6b7280)\",\n };\n\n // If there are children, render as a div with content\n if (children) {\n const leftLineClasses =\n textAlign === \"left\"\n ? `${baseClasses} ${orientationClasses}`\n : `flex-1 ${baseClasses} ${orientationClasses}`;\n const rightLineClasses =\n textAlign === \"right\"\n ? `${baseClasses} ${orientationClasses}`\n : `flex-1 ${baseClasses} ${orientationClasses}`;\n\n return (\n <div\n role=\"presentation\"\n className={`flex items-center gap-3 ${variantClasses[variant]} ${className}`}\n >\n {textAlign !== \"left\" && (\n <div\n style={{ ...baseStyles, ...thicknessStyle }}\n className={leftLineClasses}\n />\n )}\n <div style={textStyles} className=\"whitespace-nowrap\">\n {children}\n </div>\n {textAlign !== \"right\" && (\n <div\n style={{ ...baseStyles, ...thicknessStyle }}\n className={rightLineClasses}\n />\n )}\n </div>\n );\n }\n\n // Render as hr for horizontal or div for vertical\n if (isVertical) {\n return (\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n style={{ ...baseStyles, ...thicknessStyle }}\n className={`${baseClasses} ${orientationClasses} ${variantClasses[variant]} ${flexClasses} ${className}`}\n />\n );\n }\n\n return (\n <hr\n style={{ ...baseStyles, ...thicknessStyle }}\n className={`${baseClasses} ${orientationClasses} ${variantClasses[variant]} ${className}`}\n />\n );\n};\n","\"use client\";\n\nimport React, { useState, useRef, useEffect } from \"react\";\n\nexport interface SliderMark {\n value: number;\n label?: string;\n}\n\nexport interface SliderProps {\n /**\n * The value of the slider. For range sliders, provide an array.\n */\n value?: number | number[];\n /**\n * The default value. Use when the component is not controlled.\n */\n defaultValue?: number | number[];\n /**\n * Callback function that is fired when the slider's value changed.\n */\n onChange?: (value: number | number[]) => void;\n /**\n * The minimum allowed value of the slider.\n * @default 0\n */\n min?: number;\n /**\n * The maximum allowed value of the slider.\n * @default 100\n */\n max?: number;\n /**\n * The granularity with which the slider can step through values.\n * Set to null to restrict values to marks only.\n * @default 1\n */\n step?: number | null;\n /**\n * Marks indicate predetermined values to which the user can move the slider.\n * If `true`, marks are generated automatically. If `false`, no marks are shown.\n * You can also provide an array of marks with custom labels.\n * @default false\n */\n marks?: boolean | SliderMark[];\n /**\n * If `true`, the slider will be disabled.\n * @default false\n */\n disabled?: boolean;\n /**\n * The orientation of the slider.\n * @default \"horizontal\"\n */\n orientation?: \"horizontal\" | \"vertical\";\n /**\n * The size of the slider.\n * @default \"medium\"\n */\n size?: \"small\" | \"medium\";\n /**\n * Controls when the value label is displayed.\n * @default \"auto\"\n */\n valueLabelDisplay?: \"on\" | \"auto\" | \"off\";\n /**\n * Show value labels on hover over marks.\n * @default false\n */\n showMarkLabelsOnHover?: boolean;\n /**\n * The color of the slider.\n * @default \"primary\"\n */\n color?: \"primary\" | \"secondary\";\n /**\n * The track display mode.\n * @default \"normal\"\n */\n track?: \"normal\" | \"inverted\" | false;\n /**\n * A function to format the value label.\n */\n valueLabelFormat?: (value: number) => string;\n /**\n * Additional CSS classes\n */\n className?: string;\n /**\n * The id of the input element.\n */\n id?: string;\n /**\n * The name of the input element.\n */\n name?: string;\n /**\n * Accessible label for the slider.\n */\n \"aria-label\"?: string;\n /**\n * The id of the element containing a label for the slider.\n */\n \"aria-labelledby\"?: string;\n}\n\nexport const Slider: React.FC<SliderProps> = ({\n value: controlledValue,\n defaultValue = 0,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n marks = false,\n disabled = false,\n orientation = \"horizontal\",\n size = \"medium\",\n valueLabelDisplay = \"auto\",\n showMarkLabelsOnHover = false,\n color = \"primary\",\n track = \"normal\",\n valueLabelFormat = (v) => String(v),\n className = \"\",\n id,\n name,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n}) => {\n const isControlled = controlledValue !== undefined;\n const [internalValue, setInternalValue] = useState(\n controlledValue ?? defaultValue\n );\n const [isDragging, setIsDragging] = useState(false);\n const [activeThumb, setActiveThumb] = useState<number | null>(null);\n const sliderRef = useRef<HTMLDivElement>(null);\n\n const currentValue = isControlled ? controlledValue : internalValue;\n const isRange = Array.isArray(currentValue);\n const isVertical = orientation === \"vertical\";\n\n // Update internal value when controlled value changes\n useEffect(() => {\n if (isControlled) {\n setInternalValue(controlledValue);\n }\n }, [isControlled, controlledValue]);\n\n // Clamp values when min/max changes\n useEffect(() => {\n if (isRange && Array.isArray(currentValue)) {\n const clampedValues = currentValue.map((v) =>\n Math.max(min, Math.min(max, v))\n );\n if (\n clampedValues[0] !== currentValue[0] ||\n clampedValues[1] !== currentValue[1]\n ) {\n updateValue(clampedValues);\n }\n } else if (typeof currentValue === \"number\") {\n const clampedValue = Math.max(min, Math.min(max, currentValue));\n if (clampedValue !== currentValue) {\n updateValue(clampedValue);\n }\n }\n }, [min, max]);\n\n // Calculate percentage for a value\n const valueToPercent = (val: number) => {\n const clampedVal = Math.max(min, Math.min(max, val));\n return ((clampedVal - min) / (max - min)) * 100;\n };\n\n // Calculate value from mouse position\n const getValueFromPosition = (clientX: number, clientY: number) => {\n if (!sliderRef.current) return min;\n\n const rect = sliderRef.current.getBoundingClientRect();\n const percent = isVertical\n ? ((rect.bottom - clientY) / rect.height) * 100\n : ((clientX - rect.left) / rect.width) * 100;\n\n const clampedPercent = Math.max(0, Math.min(100, percent));\n let newValue = min + (clampedPercent / 100) * (max - min);\n\n // Snap to step or marks\n if (step === null || (Array.isArray(marks) && marks.length > 0)) {\n // Snap to nearest mark (when step is null or when custom marks are provided)\n if (marksList.length > 0) {\n const closest = marksList.reduce((prev, curr) =>\n Math.abs(curr.value - newValue) <\n Math.abs(prev.value - newValue)\n ? curr\n : prev\n );\n newValue = closest.value;\n }\n } else if (step) {\n newValue = Math.round(newValue / step) * step;\n }\n\n return Math.max(min, Math.min(max, newValue));\n };\n\n // Handle mouse/touch move\n const handleMove = (clientX: number, clientY: number) => {\n if (!isDragging || disabled) return;\n\n const newValue = getValueFromPosition(clientX, clientY);\n\n if (isRange && Array.isArray(currentValue)) {\n const values = [...currentValue];\n if (activeThumb !== null) {\n values[activeThumb] = newValue;\n // Ensure values stay in order\n if (activeThumb === 0 && values[0] > values[1]) {\n values[0] = values[1];\n } else if (activeThumb === 1 && values[1] < values[0]) {\n values[1] = values[0];\n }\n updateValue(values);\n }\n } else {\n updateValue(newValue);\n }\n };\n\n // Update value\n const updateValue = (newValue: number | number[]) => {\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue);\n };\n\n // Mouse down handler\n const handleMouseDown =\n (thumbIndex?: number) => (e: React.MouseEvent | React.TouchEvent) => {\n if (disabled) return;\n\n e.preventDefault();\n setIsDragging(true);\n setActiveThumb(thumbIndex ?? 0);\n\n const clientX = \"touches\" in e ? e.touches[0].clientX : e.clientX;\n const clientY = \"touches\" in e ? e.touches[0].clientY : e.clientY;\n\n if (thumbIndex === undefined) {\n const newValue = getValueFromPosition(clientX, clientY);\n updateValue(newValue);\n }\n };\n\n // Global mouse move and up handlers\n useEffect(() => {\n if (!isDragging) return;\n\n const handleGlobalMove = (e: MouseEvent | TouchEvent) => {\n // Prevent default behavior (especially scrolling on vertical sliders)\n if (isVertical && \"touches\" in e) {\n e.preventDefault();\n }\n const clientX = \"touches\" in e ? e.touches[0].clientX : e.clientX;\n const clientY = \"touches\" in e ? e.touches[0].clientY : e.clientY;\n handleMove(clientX, clientY);\n };\n\n const handleGlobalUp = () => {\n setIsDragging(false);\n setActiveThumb(null);\n };\n\n document.addEventListener(\"mousemove\", handleGlobalMove);\n document.addEventListener(\"mouseup\", handleGlobalUp);\n document.addEventListener(\"touchmove\", handleGlobalMove, {\n passive: false,\n });\n document.addEventListener(\"touchend\", handleGlobalUp);\n\n return () => {\n document.removeEventListener(\"mousemove\", handleGlobalMove);\n document.removeEventListener(\"mouseup\", handleGlobalUp);\n document.removeEventListener(\"touchmove\", handleGlobalMove);\n document.removeEventListener(\"touchend\", handleGlobalUp);\n };\n }, [isDragging, activeThumb, isVertical]);\n\n // Generate marks\n const getMarks = (): SliderMark[] => {\n if (marks === false) return [];\n if (marks === true) {\n const marksList: SliderMark[] = [];\n const stepValue = step || 1;\n for (let i = min; i <= max; i += stepValue) {\n marksList.push({ value: i });\n }\n return marksList;\n }\n return marks;\n };\n\n const marksList = getMarks();\n\n // Color styles\n const colorStyles = {\n primary: {\n track: \"bg-(--color-primary)\",\n thumb: \"bg-(--color-primary)\",\n thumbHover: \"hover:bg-(--color-primary-hover)\",\n thumbRing:\n \"ring-[color-mix(in_srgb,var(--color-primary)_30%,transparent)]\",\n thumbRingHover:\n \"group-hover/thumb:ring-[color-mix(in_srgb,var(--color-primary)_30%,transparent)]\",\n labelSelected: \"text-(--color-muted-foreground)\",\n labelUnselected: \"text-(--color-muted-foreground)\",\n },\n secondary: {\n track: \"bg-purple-500\",\n thumb: \"bg-purple-500\",\n thumbHover: \"hover:bg-purple-600\",\n thumbRing: \"ring-purple-500/30\",\n thumbRingHover: \"group-hover/thumb:ring-purple-500/30\",\n labelSelected: \"text-(--color-muted-foreground)\",\n labelUnselected: \"text-(--color-muted-foreground)\",\n },\n };\n\n const currentColorStyles = colorStyles[color];\n\n // Size styles\n const sizeStyles = {\n small: {\n rail: isVertical ? \"w-1\" : \"h-1\",\n thumb: \"w-3 h-3\",\n thumbActive: \"w-4 h-4\",\n ringHover: \"group-hover/thumb:ring-4\",\n ringActive: \"ring-6\",\n },\n medium: {\n rail: isVertical ? \"w-1\" : \"h-1\",\n thumb: \"w-4 h-4\",\n thumbActive: \"w-5 h-5\",\n ringHover: \"group-hover/thumb:ring-4\",\n ringActive: \"ring-8\",\n },\n };\n\n const currentSizeStyles = sizeStyles[size];\n\n // Calculate track position and width\n const getTrackStyle = () => {\n if (track === false) return { display: \"none\" };\n\n if (isRange && Array.isArray(currentValue)) {\n const [start, end] = currentValue;\n const startPercent = valueToPercent(start);\n const endPercent = valueToPercent(end);\n\n if (isVertical) {\n return {\n bottom: `${startPercent}%`,\n height: `${endPercent - startPercent}%`,\n };\n }\n return {\n left: `${startPercent}%`,\n width: `${endPercent - startPercent}%`,\n };\n }\n\n const percent = valueToPercent(currentValue as number);\n\n if (track === \"inverted\") {\n if (isVertical) {\n return {\n bottom: `${percent}%`,\n height: `${100 - percent}%`,\n };\n }\n return {\n left: `${percent}%`,\n width: `${100 - percent}%`,\n };\n }\n\n // Normal track\n if (isVertical) {\n return {\n bottom: \"0%\",\n height: `${percent}%`,\n };\n }\n return {\n left: \"0%\",\n width: `${percent}%`,\n };\n };\n\n // Render thumbs\n const renderThumbs = () => {\n const values = isRange\n ? (currentValue as number[])\n : [currentValue as number];\n\n return values.map((val, index) => {\n const percent = valueToPercent(val);\n const isActive = isDragging && activeThumb === index;\n const showLabelAlways = valueLabelDisplay === \"on\";\n const showLabelOnActiveOrHover = valueLabelDisplay === \"auto\";\n\n const thumbStyle = isVertical\n ? { bottom: `${percent}%` }\n : { left: `${percent}%` };\n\n return (\n <div\n key={index}\n className={`absolute ${isVertical ? \"left-1/2 -translate-x-1/2\" : \"top-1/2 -translate-y-1/2\"} cursor-pointer ${disabled ? \"cursor-not-allowed opacity-50\" : \"\"} group/thumb z-20`}\n style={thumbStyle}\n onMouseDown={handleMouseDown(index)}\n onTouchStart={handleMouseDown(index)}\n >\n <div\n className={`absolute left-0 top-0 -translate-x-1/2 -translate-y-1/2 ${isActive ? currentSizeStyles.thumbActive : currentSizeStyles.thumb} ${currentColorStyles.thumb} ${!isActive && currentColorStyles.thumbHover} rounded-full shadow-md transition-all ${isActive ? `${currentSizeStyles.ringActive} ${currentColorStyles.thumbRing}` : `group-hover/thumb:shadow-lg ${currentSizeStyles.ringHover} ${currentColorStyles.thumbRingHover}`} ${disabled ? \"pointer-events-none\" : \"\"}`}\n />\n {showLabelAlways && (\n <div\n className={`absolute ${isVertical ? \"left-6\" : \"-top-10\"} ${isVertical ? \"top-1/2 -translate-y-1/2\" : \"left-1/2 -translate-x-1/2\"} px-2 py-1 text-caption font-semibold text-white ${color === \"primary\" ? \"bg-(--color-primary)\" : \"bg-purple-500\"} rounded shadow-lg whitespace-nowrap z-(--z-index-tooltip)`}\n >\n {valueLabelFormat(val)}\n <div\n className={`absolute ${isVertical ? \"left-0 top-1/2 -translate-y-1/2 -translate-x-full\" : \"left-1/2 -translate-x-1/2 top-full\"} w-0 h-0 ${isVertical ? \"border-t-4 border-t-transparent border-b-4 border-b-transparent\" : \"border-l-4 border-l-transparent border-r-4 border-r-transparent\"} ${isVertical ? (color === \"primary\" ? \"border-r-4 border-r-[var(--color-primary)]\" : \"border-r-4 border-r-purple-500\") : color === \"primary\" ? \"border-t-4 border-t-[var(--color-primary)]\" : \"border-t-4 border-t-purple-500\"}`}\n />\n </div>\n )}\n {showLabelOnActiveOrHover && (\n <div\n className={`absolute ${isVertical ? \"left-6\" : \"-top-10\"} ${isVertical ? \"top-1/2 -translate-y-1/2\" : \"left-1/2 -translate-x-1/2\"} px-2 py-1 text-caption font-semibold text-white ${color === \"primary\" ? \"bg-(--color-primary)\" : \"bg-purple-500\"} rounded shadow-lg whitespace-nowrap opacity-0 scale-90 ${isActive ? \"opacity-100 scale-100\" : \"group-hover/thumb:opacity-100 group-hover/thumb:scale-100\"} transition-all duration-300 ease-out pointer-events-none z-(--z-index-tooltip)`}\n >\n {valueLabelFormat(val)}\n <div\n className={`absolute ${isVertical ? \"left-0 top-1/2 -translate-y-1/2 -translate-x-full\" : \"left-1/2 -translate-x-1/2 top-full\"} w-0 h-0 ${isVertical ? \"border-t-4 border-t-transparent border-b-4 border-b-transparent\" : \"border-l-4 border-l-transparent border-r-4 border-r-transparent\"} ${isVertical ? (color === \"primary\" ? \"border-r-4 border-r-[var(--color-primary)]\" : \"border-r-4 border-r-purple-500\") : color === \"primary\" ? \"border-t-4 border-t-[var(--color-primary)]\" : \"border-t-4 border-t-purple-500\"}`}\n />\n </div>\n )}\n </div>\n );\n });\n };\n\n // Check if we have marks with labels for bottom spacing\n const hasMarkLabels = marksList.some((mark) => mark.label);\n\n const containerClasses = isVertical\n ? \"flex flex-col items-center py-4\"\n : `flex items-center w-full px-2 ${hasMarkLabels ? \"pb-6\" : \"\"}`;\n\n const railClasses = isVertical\n ? `${currentSizeStyles.rail} relative overflow-visible`\n : `w-full ${currentSizeStyles.rail} relative overflow-visible`;\n\n return (\n <div\n className={`${containerClasses} ${className}`}\n style={\n isVertical ? { minHeight: \"200px\", height: \"200px\" } : undefined\n }\n >\n <div\n ref={sliderRef}\n className={railClasses}\n style={isVertical ? { height: \"100%\" } : undefined}\n onMouseDown={handleMouseDown()}\n onTouchStart={handleMouseDown()}\n role=\"slider\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={isRange ? undefined : (currentValue as number)}\n aria-disabled={disabled}\n aria-orientation={orientation}\n tabIndex={disabled ? -1 : 0}\n >\n {/* Rail */}\n <div\n className={`absolute ${isVertical ? \"inset-x-0 h-full\" : \"inset-y-0 w-full\"} bg-[#d1d5db] rounded-full ${disabled ? \"opacity-50\" : \"\"} z-0`}\n />\n\n {/* Track */}\n {track !== false && (\n <div\n className={`absolute ${isVertical ? \"inset-x-0\" : \"inset-y-0\"} ${currentColorStyles.track} rounded-full ${disabled ? \"opacity-50\" : \"\"} z-0`}\n style={getTrackStyle()}\n />\n )}\n\n {/* Marks */}\n {marksList.map((mark) => {\n const markPercent = valueToPercent(mark.value);\n const markStyle = isVertical\n ? { bottom: `${markPercent}%` }\n : { left: `${markPercent}%` };\n\n // Check if mark is in selected range\n let isInSelectedRange = false;\n if (isRange && Array.isArray(currentValue)) {\n const [start, end] = currentValue;\n isInSelectedRange =\n mark.value >= start && mark.value <= end;\n } else if (typeof currentValue === \"number\") {\n if (track === \"inverted\") {\n isInSelectedRange = mark.value >= currentValue;\n } else {\n isInSelectedRange = mark.value <= currentValue;\n }\n }\n\n const markColor = isInSelectedRange\n ? \"bg-(--color-background) shadow-sm group-hover/mark:bg-(--color-background) group-hover/mark:shadow-md\"\n : \"bg-[#4b5563] group-hover/mark:bg-[#1f2937]\";\n const labelColor = isInSelectedRange\n ? currentColorStyles.labelSelected\n : currentColorStyles.labelUnselected;\n\n return (\n <div\n key={mark.value}\n className={`group/mark absolute ${isVertical ? \"left-1/2 -translate-x-1/2\" : \"top-1/2 -translate-y-1/2\"} z-30`}\n style={markStyle}\n >\n <div\n className={`absolute left-0 top-0 -translate-x-1/2 -translate-y-1/2 w-1.5 h-1.5 ${markColor} rounded-full transition-all duration-200 cursor-pointer group-hover/mark:w-2 group-hover/mark:h-2 ${!disabled ? \"\" : \"cursor-not-allowed\"}`}\n />\n {/* Always visible mark label at the bottom */}\n {mark.label && (\n <div\n className={`absolute ${isVertical ? \"left-4 top-1/2 -translate-y-1/2\" : \"top-3 left-1/2 -translate-x-1/2\"} text-caption font-medium ${labelColor} transition-colors duration-200 whitespace-nowrap pointer-events-none z-(--z-index-base)`}\n >\n {mark.label}\n </div>\n )}\n {/* Hover tooltip showing value (only if no permanent label) */}\n {showMarkLabelsOnHover && !mark.label && (\n <div\n className={`absolute ${isVertical ? \"left-6 top-1/2 -translate-y-1/2\" : \"-top-8 left-1/2 -translate-x-1/2\"} px-2 py-1 text-caption font-semibold text-white ${color === \"primary\" ? \"bg-(--color-primary)\" : \"bg-purple-500\"} rounded shadow-lg whitespace-nowrap opacity-0 scale-90 group-hover/mark:opacity-100 group-hover/mark:scale-100 transition-all duration-300 ease-out pointer-events-none z-(--z-index-tooltip)`}\n >\n {valueLabelFormat(mark.value)}\n {/* Arrow triangle */}\n <div\n className={`absolute ${isVertical ? \"right-full top-1/2 -translate-y-1/2 border-y-4 border-y-transparent border-r-4\" : \"top-full left-1/2 -translate-x-1/2 border-x-4 border-x-transparent border-t-4\"} ${color === \"primary\" ? (isVertical ? \"border-r-[var(--color-primary)]\" : \"border-t-[var(--color-primary)]\") : isVertical ? \"border-r-purple-500\" : \"border-t-purple-500\"}`}\n />\n </div>\n )}\n </div>\n );\n })}\n\n {/* Thumbs */}\n {renderThumbs()}\n </div>\n\n {/* Hidden input for form submission */}\n {name && (\n <input\n type=\"hidden\"\n id={id}\n name={name}\n value={\n isRange\n ? (currentValue as number[]).join(\",\")\n : (currentValue as number)\n }\n />\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { useForm, ValidationFunction } from \"./form\";\n\nexport interface SwitchProps {\n /**\n * Whether the switch is checked\n */\n checked?: boolean;\n /**\n * Callback when the switch state changes\n */\n onChange?: (checked: boolean) => void;\n /**\n * Whether the switch is disabled\n */\n disabled?: boolean;\n /**\n * Label text for the switch\n */\n label?: string;\n /**\n * Position of the label relative to the switch\n */\n labelPlacement?: \"start\" | \"end\" | \"top\" | \"bottom\";\n /**\n * Size of the switch\n */\n size?: \"sm\" | \"md\" | \"lg\";\n /**\n * Color variant of the switch when checked\n */\n color?: \"primary\" | \"success\" | \"info\" | \"warning\" | \"error\";\n /**\n * Additional CSS classes\n */\n className?: string;\n /**\n * Name attribute for the input\n */\n name?: string;\n /**\n * Required field indicator\n */\n required?: boolean;\n /**\n * Custom validation function\n */\n validate?: ValidationFunction;\n /**\n * Custom error message for required validation\n */\n errorMessage?: string;\n}\n\nexport function Switch({\n checked: controlledChecked,\n onChange,\n disabled = false,\n label,\n labelPlacement = \"end\",\n size = \"md\",\n color = \"primary\",\n className = \"\",\n name,\n required = false,\n validate,\n errorMessage,\n}: SwitchProps) {\n const form = useForm();\n const [internalChecked, setInternalChecked] = useState(false);\n\n // Determine checked state from Form context or props\n let checked: boolean;\n if (form && name) {\n checked = form.values[name] ?? controlledChecked ?? false;\n } else {\n const isControlled = controlledChecked !== undefined;\n checked = isControlled ? controlledChecked : internalChecked;\n }\n\n // Register with Form\n useEffect(() => {\n if (form && name) {\n const validator: ValidationFunction = async (val: boolean) => {\n if (required && !val) {\n return errorMessage || \"This field is required\";\n }\n if (validate) {\n return await validate(val);\n }\n return undefined;\n };\n\n form.registerField(name, validator);\n return () => form.unregisterField(name);\n }\n }, [form, name, required, validate, errorMessage]);\n\n const handleChange = () => {\n if (disabled) return;\n\n const newChecked = !checked;\n\n if (form && name) {\n // Update Form context\n form.setFieldValue(name, newChecked);\n form.setFieldTouched(name, true);\n // Validate on change for switch (immediate feedback with new value)\n form.validateField(name, newChecked);\n } else {\n // Standalone mode\n const isControlled = controlledChecked !== undefined;\n if (!isControlled) {\n setInternalChecked(newChecked);\n }\n onChange?.(newChecked);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) return;\n if (e.key === \" \" || e.key === \"Enter\") {\n e.preventDefault();\n handleChange();\n }\n };\n\n // Size styles\n const sizeStyles = {\n sm: {\n track: \"w-8 h-5\",\n thumb: \"w-3 h-3\",\n translate: checked ? \"translate-x-3.5\" : \"translate-x-0.5\",\n },\n md: {\n track: \"w-11 h-6\",\n thumb: \"w-4 h-4\",\n translate: checked ? \"translate-x-5\" : \"translate-x-1\",\n },\n lg: {\n track: \"w-14 h-7\",\n thumb: \"w-5 h-5\",\n translate: checked ? \"translate-x-7\" : \"translate-x-1\",\n },\n };\n\n // Color styles when checked\n const colorStyles = {\n primary: \"bg-(--color-primary)\",\n success: \"bg-[var(--color-success)]\",\n info: \"bg-[var(--color-info)]\",\n warning: \"bg-[var(--color-warning)]\",\n error: \"bg-[var(--color-error)]\",\n };\n\n // Container flex direction based on label placement\n const containerStyles = {\n start: \"flex-row-reverse justify-end\",\n end: \"flex-row\",\n top: \"flex-col-reverse items-center\",\n bottom: \"flex-col items-center\",\n };\n\n const gapStyles = {\n start: \"gap-2\",\n end: \"gap-2\",\n top: \"gap-2\",\n bottom: \"gap-2\",\n };\n\n const switchElement = (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={label || \"Toggle switch\"}\n disabled={disabled}\n onClick={handleChange}\n onKeyDown={handleKeyDown}\n className={cn(\n \"relative inline-flex shrink-0 rounded-full transition-colors duration-200 ease-in-out focus:outline-none focus:ring-2 focus:ring-offset-2\",\n sizeStyles[size].track,\n checked ? colorStyles[color] : \"bg-[#d1d5db] dark:bg-[#4b5563]\",\n disabled\n ? \"opacity-50 cursor-not-allowed\"\n : \"cursor-pointer hover:opacity-90\",\n checked && !disabled && \"focus:ring-blue-500\"\n )}\n >\n <span\n className={cn(\n \"inline-block rounded-full bg-(--color-background) shadow-lg transform transition-transform duration-200 ease-in-out\",\n sizeStyles[size].thumb,\n sizeStyles[size].translate,\n \"my-auto\"\n )}\n />\n </button>\n );\n\n const content = !label ? (\n <>\n {switchElement}\n {name && (\n <input\n type=\"checkbox\"\n name={name}\n checked={checked}\n onChange={() => {}}\n className=\"sr-only\"\n required={required}\n />\n )}\n </>\n ) : (\n <label\n className={cn(\n \"flex items-center cursor-pointer\",\n containerStyles[labelPlacement],\n gapStyles[labelPlacement],\n disabled && \"cursor-not-allowed opacity-50\"\n )}\n >\n {switchElement}\n <span\n className={cn(\n \"text-small font-semibold select-none\",\n disabled && \"text-(--color-placeholder)\"\n )}\n style={\n !disabled\n ? { color: \"var(--color-muted-foreground)\" }\n : undefined\n }\n >\n {label}\n {required && <span className=\"ml-1\">*</span>}\n </span>\n {name && (\n <input\n type=\"checkbox\"\n name={name}\n checked={checked}\n onChange={() => {}}\n className=\"sr-only\"\n required={required}\n />\n )}\n </label>\n );\n\n return (\n <div\n className={className}\n style={{\n marginBottom: \"var(--form-control-spacing)\",\n }}\n >\n {content}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport interface DialogProps {\n open: boolean;\n onClose: () => void;\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n variant?: \"default\" | \"info\" | \"success\" | \"warning\" | \"error\";\n showCloseButton?: boolean;\n closeOnBackdropClick?: boolean;\n closeOnEscape?: boolean;\n children: React.ReactNode;\n}\n\nconst Dialog = ({\n open,\n onClose,\n size = \"md\",\n variant = \"default\",\n showCloseButton = true,\n closeOnBackdropClick = true,\n closeOnEscape = true,\n children,\n}: DialogProps) => {\n // Handle escape key\n useEffect(() => {\n if (!open || !closeOnEscape) return;\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n onClose();\n }\n };\n\n document.addEventListener(\"keydown\", handleEscape);\n return () => document.removeEventListener(\"keydown\", handleEscape);\n }, [open, closeOnEscape, onClose]);\n\n // Prevent body scroll when dialog is open\n useEffect(() => {\n if (open) {\n document.body.style.overflow = \"hidden\";\n } else {\n document.body.style.overflow = \"unset\";\n }\n\n return () => {\n document.body.style.overflow = \"unset\";\n };\n }, [open]);\n\n if (!open) return null;\n\n const sizes = {\n sm: \"max-w-sm\",\n md: \"max-w-md\",\n lg: \"max-w-lg\",\n xl: \"max-w-xl\",\n full: \"max-w-full mx-4\",\n };\n\n const closeButtonStyles = {\n default: { color: \"var(--color-muted-foreground)\" },\n info: { color: \"var(--color-info-border)\" },\n success: { color: \"var(--color-success-border)\" },\n warning: { color: \"var(--color-warning-border)\" },\n error: { color: \"var(--color-error-border)\" },\n };\n\n const handleBackdropClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (e.target === e.currentTarget && closeOnBackdropClick) {\n onClose();\n }\n };\n\n return (\n <div\n className=\"fixed inset-0 [z-index:var(--z-index-modal)] flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm animate-in fade-in duration-200\"\n onClick={handleBackdropClick}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <div\n className={cn(\n \"relative rounded-xl shadow-2xl w-full animate-in zoom-in-95 duration-200 bg-(--color-background) border border-(--color-border)\",\n sizes[size]\n )}\n >\n {showCloseButton && (\n <button\n onClick={onClose}\n style={{\n color: closeButtonStyles[variant].color,\n transition: \"background-color 0.2s ease\",\n backgroundColor: \"transparent\",\n }}\n onMouseEnter={(e) => {\n const root = document.documentElement;\n if (variant === \"default\") {\n e.currentTarget.style.backgroundColor =\n \"rgba(0, 0, 0, 0.1)\";\n } else {\n const color = getComputedStyle(root)\n .getPropertyValue(\n `--color-${variant}-border`\n )\n .trim();\n // Convert hex to rgba with 15% opacity\n const rgb = color.match(\n /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i\n );\n if (rgb) {\n const r = parseInt(rgb[1], 16);\n const g = parseInt(rgb[2], 16);\n const b = parseInt(rgb[3], 16);\n e.currentTarget.style.backgroundColor = `rgba(${r}, ${g}, ${b}, 0.15)`;\n }\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor =\n \"transparent\";\n }}\n onFocus={(e) => {\n if (variant === \"default\") {\n e.currentTarget.style.boxShadow = `0 0 0 2px var(--color-border)`;\n } else {\n e.currentTarget.style.boxShadow = `0 0 0 2px var(--color-${variant}-border)`;\n }\n }}\n onBlur={(e) => {\n e.currentTarget.style.boxShadow = \"none\";\n }}\n className=\"absolute right-2 top-2 p-1.5 rounded-full [z-index:var(--z-index-base)] focus:outline-none\"\n aria-label=\"Close dialog\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n <DialogContext.Provider value={{ variant }}>\n {children}\n </DialogContext.Provider>\n </div>\n </div>\n );\n};\n\nDialog.displayName = \"Dialog\";\n\n// Context to pass variant to subcomponents\nconst DialogContext = React.createContext<{\n variant: \"default\" | \"info\" | \"success\" | \"warning\" | \"error\";\n}>({ variant: \"default\" });\n\nconst DialogHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, children, ...props }, ref) => {\n const { variant } = React.useContext(DialogContext);\n\n const variantStyles = {\n default: {\n backgroundColor: \"var(--color-background)\",\n borderColor: \"var(--color-border)\",\n },\n info: {\n backgroundColor: \"var(--color-info-muted)\",\n borderColor: \"var(--color-info-border)\",\n },\n success: {\n backgroundColor: \"var(--color-success-muted)\",\n borderColor: \"var(--color-success-border)\",\n },\n warning: {\n backgroundColor: \"var(--color-warning-muted)\",\n borderColor: \"var(--color-warning-border)\",\n },\n error: {\n backgroundColor: \"var(--color-error-muted)\",\n borderColor: \"var(--color-error-border)\",\n },\n };\n\n return (\n <div\n ref={ref}\n style={variantStyles[variant]}\n className={cn(\n \"flex flex-col space-y-1.5 px-6 py-4 border-b rounded-t-xl\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n});\nDialogHeader.displayName = \"DialogHeader\";\n\nconst DialogTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, children, ...props }, ref) => (\n <h2\n ref={ref}\n className={cn(\n \"text-h3 font-semibold text-(--color-foreground) leading-none tracking-tight\",\n className\n )}\n {...props}\n >\n {children}\n </h2>\n));\nDialogTitle.displayName = \"DialogTitle\";\n\nconst DialogDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, children, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-small text-(--color-muted-foreground)\", className)}\n {...props}\n >\n {children}\n </p>\n));\nDialogDescription.displayName = \"DialogDescription\";\n\nconst DialogContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, children, ...props }, ref) => (\n <div ref={ref} className={cn(\"px-6 py-4\", className)} {...props}>\n {children}\n </div>\n));\nDialogContent.displayName = \"DialogContent\";\n\nconst DialogFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"flex gap-2 justify-end bg-(--color-muted) px-6 py-4 border-t border-(--color-border) rounded-b-xl\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n));\nDialogFooter.displayName = \"DialogFooter\";\n\nexport {\n Dialog,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogContent,\n DialogFooter,\n};\n","import React from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"info\" | \"success\" | \"warning\" | \"error\";\n title?: string;\n dismissible?: boolean;\n onDismiss?: () => void;\n icon?: React.ReactNode;\n}\n\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n (\n {\n className,\n variant = \"info\",\n title,\n dismissible = false,\n onDismiss,\n icon,\n children,\n ...props\n },\n ref\n ) => {\n const variantStyles = {\n info: {\n backgroundColor: \"var(--color-info-muted)\",\n borderColor: \"var(--color-info-border)\",\n color: \"var(--color-info-muted-foreground)\",\n },\n success: {\n backgroundColor: \"var(--color-success-muted)\",\n borderColor: \"var(--color-success-border)\",\n color: \"var(--color-success-muted-foreground)\",\n },\n warning: {\n backgroundColor: \"var(--color-warning-muted)\",\n borderColor: \"var(--color-warning-border)\",\n color: \"var(--color-warning-muted-foreground)\",\n },\n error: {\n backgroundColor: \"var(--color-error-muted)\",\n borderColor: \"var(--color-error-border)\",\n color: \"var(--color-error-muted-foreground)\",\n },\n };\n\n const iconStyles = {\n info: { color: \"var(--color-info-border)\" },\n success: { color: \"var(--color-success-border)\" },\n warning: { color: \"var(--color-warning-border)\" },\n error: { color: \"var(--color-error-border)\" },\n };\n\n const defaultIcons = {\n info: (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\"\n clipRule=\"evenodd\"\n />\n </svg>\n ),\n success: (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\n clipRule=\"evenodd\"\n />\n </svg>\n ),\n warning: (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\"\n clipRule=\"evenodd\"\n />\n </svg>\n ),\n error: (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\"\n clipRule=\"evenodd\"\n />\n </svg>\n ),\n };\n\n return (\n <div\n ref={ref}\n style={variantStyles[variant]}\n className={cn(\"relative border rounded-lg p-4\", className)}\n role=\"alert\"\n {...props}\n >\n <div className=\"flex items-start gap-3\">\n <div className=\"shrink-0\" style={iconStyles[variant]}>\n {icon || defaultIcons[variant]}\n </div>\n\n <div className=\"flex-1\">\n {title && <h5 className=\"font-semibold mb-1\">{title}</h5>}\n <div className=\"text-sm\">{children}</div>\n </div>\n\n {dismissible && onDismiss && (\n <button\n type=\"button\"\n onClick={onDismiss}\n style={{\n color: iconStyles[variant].color,\n transition: \"background-color 0.2s ease\",\n backgroundColor: \"transparent\",\n }}\n onMouseEnter={(e) => {\n const root = document.documentElement;\n const color = getComputedStyle(root)\n .getPropertyValue(`--color-${variant}-border`)\n .trim();\n // Convert hex to rgba with 15% opacity\n const rgb = color.match(\n /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i\n );\n if (rgb) {\n const r = parseInt(rgb[1], 16);\n const g = parseInt(rgb[2], 16);\n const b = parseInt(rgb[3], 16);\n e.currentTarget.style.backgroundColor = `rgba(${r}, ${g}, ${b}, 0.15)`;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n onFocus={(e) => {\n e.currentTarget.style.boxShadow = `0 0 0 2px var(--color-${variant}-border)`;\n }}\n onBlur={(e) => {\n e.currentTarget.style.boxShadow = \"none\";\n }}\n className=\"shrink-0 rounded-lg p-1.5 inline-flex focus:outline-none\"\n aria-label=\"Close\"\n >\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n )}\n </div>\n </div>\n );\n }\n);\n\nAlert.displayName = \"Alert\";\n\nexport { Alert };\n","import React from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport interface ContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n maxWidth?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"full\";\n centered?: boolean;\n padding?: boolean;\n}\n\nconst Container = React.forwardRef<HTMLDivElement, ContainerProps>(\n (\n {\n className,\n maxWidth = \"xl\",\n centered = true,\n padding = true,\n children,\n ...props\n },\n ref\n ) => {\n const maxWidths = {\n sm: \"max-w-screen-sm\",\n md: \"max-w-screen-md\",\n lg: \"max-w-screen-lg\",\n xl: \"max-w-screen-xl\",\n \"2xl\": \"max-w-screen-2xl\",\n full: \"max-w-full\",\n };\n\n return (\n <div\n ref={ref}\n className={cn(\n \"w-full\",\n maxWidths[maxWidth],\n centered && \"mx-auto\",\n padding && \"px-4 sm:px-6 lg:px-8\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nContainer.displayName = \"Container\";\n\nexport { Container };\n","import React from \"react\";\n\ninterface SectionLayoutProps {\n children: React.ReactNode;\n hasStickyPreview?: boolean;\n}\n\n/**\n * SectionLayout - Wrapper component for showcase sections\n *\n * @param hasStickyPreview - When true, expects the first child to be a sticky preview section\n * that stays at the top while the rest of the content scrolls\n */\nexport function SectionLayout({\n children,\n hasStickyPreview = false,\n}: SectionLayoutProps) {\n if (!hasStickyPreview) {\n // Normal layout - just render children with spacing\n return <>{children}</>;\n }\n\n // Convert children to array to separate sticky preview from scrollable content\n const childArray = React.Children.toArray(children);\n\n if (childArray.length === 0) {\n return null;\n }\n\n // First child is the sticky preview\n const stickyPreview = childArray[0];\n\n // Rest are scrollable content\n const scrollableContent = childArray.slice(1);\n\n return (\n <>\n {/* Sticky Preview at Top */}\n {stickyPreview}\n\n {/* Scrollable Content Below */}\n {scrollableContent.length > 0 && (\n <div className=\"space-y-8\">{scrollableContent}</div>\n )}\n </>\n );\n}\n","\"use client\";\n\nimport { Menu, X, ChevronDown } from \"lucide-react\";\nimport React, { useState, useEffect, useRef } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport interface NavItem {\n id: string;\n label?: string;\n type?: \"link\" | \"button\" | \"dropdown\" | \"divider\" | \"custom\";\n href?: string;\n onClick?: () => void;\n icon?: React.ReactNode;\n badge?: string | number;\n disabled?: boolean;\n target?: \"_blank\" | \"_self\";\n children?: NavItem[];\n render?: () => React.ReactNode;\n}\n\nexport interface NavProps extends React.HTMLAttributes<HTMLElement> {\n items: NavItem[];\n variant?: \"primary\" | \"secondary\" | \"ghost\";\n orientation?: \"horizontal\" | \"vertical\";\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n mobileBreakpoint?: \"sm\" | \"md\" | \"lg\";\n mobileMenuDirection?: \"top\" | \"left\" | \"right\";\n logo?: React.ReactNode;\n actions?: React.ReactNode;\n sticky?: boolean;\n activeId?: string;\n onItemClick?: (item: NavItem) => void;\n /** Remove bottom border for seamless hero integration */\n borderless?: boolean;\n /** Make background transparent */\n transparent?: boolean;\n /** Add backdrop blur effect (glassmorphism) */\n blur?: boolean;\n /** Position of the nav (fixed, sticky, or static) */\n position?: \"fixed\" | \"sticky\" | \"static\";\n /** Auto-hide nav on scroll down, show on scroll up */\n autoHideOnScroll?: boolean;\n}\n\nconst Nav = React.forwardRef<HTMLElement, NavProps>(\n (\n {\n className,\n items,\n variant = \"primary\",\n orientation = \"horizontal\",\n size = \"md\",\n mobileBreakpoint = \"md\",\n mobileMenuDirection = \"top\",\n logo,\n actions,\n sticky = false,\n activeId,\n onItemClick,\n borderless = false,\n transparent = false,\n blur = false,\n position = \"static\",\n autoHideOnScroll = false,\n ...htmlProps\n },\n ref\n ) => {\n const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);\n const [openDropdownId, setOpenDropdownId] = useState<string | null>(\n null\n );\n const dropdownRef = useRef<HTMLDivElement>(null);\n const mobileMenuRef = useRef<HTMLDivElement>(null);\n const [navElement, setNavElement] = useState<HTMLElement | null>(null);\n const [isNavVisible, setIsNavVisible] = useState(true);\n const lastScrollYRef = useRef(0);\n\n // Auto-hide nav on scroll\n useEffect(() => {\n if (!autoHideOnScroll || position === \"static\") {\n setIsNavVisible(true);\n return;\n }\n\n const handleScroll = () => {\n const currentScrollY = window.scrollY;\n\n // Show nav when at top\n if (currentScrollY < 10) {\n setIsNavVisible(true);\n lastScrollYRef.current = currentScrollY;\n return;\n }\n\n // Hide on scroll down, show on scroll up\n if (currentScrollY > lastScrollYRef.current) {\n setIsNavVisible(false);\n } else if (currentScrollY < lastScrollYRef.current) {\n setIsNavVisible(true);\n }\n\n lastScrollYRef.current = currentScrollY;\n };\n\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n return () => window.removeEventListener(\"scroll\", handleScroll);\n }, [autoHideOnScroll, position]);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setOpenDropdownId(null);\n }\n\n // Close mobile menu when clicking outside (only for top direction dropdown style)\n if (\n mobileMenuDirection === \"top\" &&\n isMobileMenuOpen &&\n mobileMenuRef.current &&\n navElement &&\n !mobileMenuRef.current.contains(event.target as Node) &&\n !navElement.contains(event.target as Node)\n ) {\n setIsMobileMenuOpen(false);\n }\n }\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isMobileMenuOpen, mobileMenuDirection]);\n\n // Close mobile menu on escape\n useEffect(() => {\n function handleEscape(event: KeyboardEvent) {\n if (event.key === \"Escape\") {\n setIsMobileMenuOpen(false);\n setOpenDropdownId(null);\n }\n }\n\n document.addEventListener(\"keydown\", handleEscape);\n return () => {\n document.removeEventListener(\"keydown\", handleEscape);\n };\n }, []);\n\n // Close mobile menu when direction changes\n useEffect(() => {\n setIsMobileMenuOpen(false);\n }, [mobileMenuDirection]);\n\n // Base styles using CSS variables\n const positionClass =\n position === \"static\"\n ? \"\"\n : position === \"fixed\"\n ? \"fixed\"\n : \"sticky\";\n const transformClass =\n autoHideOnScroll && position !== \"static\"\n ? `transition-transform duration-500 ease-in-out ${isNavVisible ? \"translate-y-0\" : \"-translate-y-full\"}`\n : \"\";\n\n // Only add default positioning if not already specified in className\n const hasCustomPositioning = className?.match(/(left-|right-|inset-)/);\n\n const baseStyles = cn(\n // Position\n positionClass && `${positionClass} [z-index:var(--z-index-nav)]`,\n // Default positioning only if not custom\n positionClass && !hasCustomPositioning && \"top-0 left-0 right-0\",\n // Transform for auto-hide\n transformClass,\n // Background\n !transparent && !blur && \"bg-(--color-background)\",\n transparent && \"bg-transparent\",\n // Blur effect (glassmorphism)\n blur && \"backdrop-blur-md bg-transparent\"\n );\n\n // Container styles\n const containerStyles = cn(\n \"min-h-14 md:min-h-16\",\n \"flex items-center justify-between\",\n \"px-4 md:px-6\"\n );\n\n // Size-based padding styles - Tailwind UI inspired\n const itemPaddingStyles = {\n xs: \"px-2 py-1\",\n sm: \"px-2.5 py-1.5\",\n md: \"px-3 py-2\",\n lg: \"px-4 py-2.5\",\n xl: \"px-5 py-3\",\n };\n\n const fontSizeStyles = {\n xs: \"[font-size:var(--nav-font-size-xs)]\",\n sm: \"[font-size:var(--nav-font-size-sm)]\",\n md: \"[font-size:var(--nav-font-size-md)]\",\n lg: \"[font-size:var(--nav-font-size-lg)]\",\n xl: \"[font-size:var(--nav-font-size-xl)]\",\n };\n\n // Variant styles for items\n const variantItemStyles = {\n primary:\n \"rounded-md hover:bg-(--color-primary)/10 hover:text-(--color-primary) transition-colors duration-150\",\n secondary:\n \"rounded-md hover:bg-(--color-muted) transition-colors duration-150\",\n ghost: \"rounded-md hover:bg-(--color-primary)/5 transition-colors duration-150\",\n };\n\n const activeItemStyles = {\n primary:\n \"bg-(--color-primary) text-white hover:bg-(--color-primary) hover:text-white\",\n secondary:\n \"bg-(--color-muted) text-(--color-foreground) font-semibold\",\n ghost: \"text-(--color-primary) font-medium\",\n };\n\n // Breakpoint classes\n const breakpointClasses = {\n sm: \"sm:hidden\",\n md: \"md:hidden\",\n lg: \"lg:hidden\",\n };\n\n const breakpointShowClasses = {\n sm: \"hidden sm:flex\",\n md: \"hidden md:flex\",\n lg: \"hidden lg:flex\",\n };\n\n // Handle item click\n const handleItemClick = (item: NavItem) => {\n if (item.disabled) return;\n\n if (item.type === \"dropdown\") {\n setOpenDropdownId(openDropdownId === item.id ? null : item.id);\n return;\n }\n\n if (item.onClick) {\n item.onClick();\n }\n\n if (onItemClick) {\n onItemClick(item);\n }\n\n // Close mobile menu after navigation\n setIsMobileMenuOpen(false);\n setOpenDropdownId(null);\n };\n\n // Render a single nav item\n const renderNavItem = (item: NavItem, isMobile: boolean = false) => {\n if (item.type === \"divider\") {\n return (\n <div\n key={item.id}\n className={cn(\n orientation === \"horizontal\" &&\n !isMobile &&\n \"h-6 border-l border-(--color-border) mx-2\",\n (orientation === \"vertical\" || isMobile) &&\n \"w-full h-0 border-t border-(--color-border) my-2\"\n )}\n />\n );\n }\n\n if (item.type === \"custom\" && item.render) {\n return <div key={item.id}>{item.render()}</div>;\n }\n\n const isActive = activeId === item.id;\n const isDropdownOpen = openDropdownId === item.id;\n const hasChildren = item.children && item.children.length > 0;\n\n const itemBaseStyles = cn(\n \"flex items-center [gap:var(--nav-gap)] font-medium text-(--color-foreground) cursor-pointer select-none\",\n itemPaddingStyles[size],\n fontSizeStyles[size],\n variantItemStyles[variant],\n isActive && activeItemStyles[variant],\n orientation === \"vertical\" && \"w-full\",\n item.disabled && \"opacity-50 cursor-not-allowed\"\n );\n\n const content = (\n <>\n {item.icon && (\n <span className=\"flex-shrink-0\">{item.icon}</span>\n )}\n <span>{item.label}</span>\n {item.badge && (\n <span className=\"ml-auto inline-flex items-center rounded-full bg-(--color-primary) px-2 py-0.5 text-caption font-medium text-white\">\n {item.badge}\n </span>\n )}\n {hasChildren && (\n <ChevronDown\n className={cn(\n \"w-4 h-4 transition-transform\",\n isDropdownOpen && \"rotate-180\"\n )}\n />\n )}\n </>\n );\n\n // Dropdown item\n if (hasChildren) {\n return (\n <div key={item.id} className=\"relative\" ref={dropdownRef}>\n <button\n onClick={() => handleItemClick(item)}\n className={itemBaseStyles}\n disabled={item.disabled}\n >\n {content}\n </button>\n\n {/* Dropdown Menu */}\n {isDropdownOpen && (\n <div\n className={cn(\n \"absolute left-0 mt-[var(--nav-gap)] min-w-[200px] bg-(--color-background) border border-(--color-border) rounded-[var(--nav-border-radius)] shadow-xl [z-index:var(--z-index-dropdown)] animate-in fade-in-0 zoom-in-95 duration-200\",\n orientation === \"vertical\" &&\n \"left-full top-0 ml-2 mt-0\"\n )}\n >\n <div className=\"py-1\">\n {item.children!.map((child) => (\n <button\n key={child.id}\n onClick={() =>\n handleItemClick(child)\n }\n disabled={child.disabled}\n className={cn(\n \"w-full flex items-center gap-2 px-4 py-2 [font-size:var(--text-sm)] text-(--color-foreground) hover:bg-(--color-primary)/10 hover:text-(--color-primary) transition-all duration-200 rounded-sm mx-1\",\n child.disabled &&\n \"opacity-50 cursor-not-allowed\",\n activeId === child.id &&\n \"bg-(--color-primary)/10 text-(--color-primary) [font-weight:var(--font-semibold)]\"\n )}\n >\n {child.icon && (\n <span className=\"flex-shrink-0\">\n {child.icon}\n </span>\n )}\n <span>{child.label}</span>\n {child.badge && (\n <span className=\"ml-auto px-2 py-0.5 [font-size:var(--text-xs)] font-semibold bg-(--color-primary) text-white rounded-[var(--radius-full)]\">\n {child.badge}\n </span>\n )}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n }\n\n // Link item\n if (item.href) {\n return (\n <a\n key={item.id}\n href={item.href}\n target={item.target}\n onClick={() => handleItemClick(item)}\n className={itemBaseStyles}\n >\n {content}\n </a>\n );\n }\n\n // Button item\n return (\n <button\n key={item.id}\n onClick={() => handleItemClick(item)}\n disabled={item.disabled}\n className={itemBaseStyles}\n >\n {content}\n </button>\n );\n };\n\n // Desktop navigation\n const desktopNav = (\n <div\n className={cn(\n \"items-center [gap:var(--nav-gap)]\",\n breakpointShowClasses[mobileBreakpoint],\n orientation === \"horizontal\"\n ? \"flex flex-row\"\n : \"flex flex-col\"\n )}\n >\n {items.map((item) => renderNavItem(item))}\n </div>\n );\n\n // Combine external and internal refs\n const setRefs = React.useCallback(\n (node: HTMLElement | null) => {\n setNavElement(node);\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n (\n ref as React.MutableRefObject<HTMLElement | null>\n ).current = node;\n }\n },\n [ref]\n );\n\n return (\n <nav\n ref={setRefs}\n className={cn(\n baseStyles,\n // Border styles\n !borderless && \"border border-(--color-border)\",\n borderless && \"border-0\",\n className\n )}\n {...htmlProps}\n >\n <div className={containerStyles}>\n {/* Logo */}\n {logo && <div className=\"shrink-0\">{logo}</div>}\n\n {/* Desktop Navigation */}\n {desktopNav}\n\n {/* Actions (right side) */}\n {actions && (\n <div className=\"shrink-0 flex items-center gap-2 ml-auto\">\n {actions}\n </div>\n )}\n\n {/* Mobile Menu Button */}\n <button\n onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)}\n className={cn(\n \"p-2 text-(--color-foreground) hover:bg-(--color-muted) rounded-[var(--nav-border-radius)] transition-colors\",\n breakpointClasses[mobileBreakpoint]\n )}\n aria-label=\"Toggle menu\"\n >\n {isMobileMenuOpen ? (\n <X className=\"w-6 h-6\" />\n ) : (\n <Menu className=\"w-6 h-6\" />\n )}\n </button>\n </div>\n\n {/* Mobile Menu Content - expands inside container */}\n {mobileMenuDirection === \"top\" && (\n <div\n ref={mobileMenuRef}\n className={cn(\n \"overflow-hidden transition-all duration-200 ease-in-out border-t\",\n breakpointClasses[mobileBreakpoint],\n isMobileMenuOpen\n ? \"max-h-96 opacity-100 border-(--color-border)\"\n : \"max-h-0 opacity-0 border-transparent\"\n )}\n >\n <div className=\"space-y-1 px-2 py-2\">\n {items.map((item) => renderNavItem(item, true))}\n </div>\n </div>\n )}\n\n {/* Side Drawer Menus - outside container */}\n {mobileMenuDirection !== \"top\" && (\n <>\n {/* Overlay */}\n {isMobileMenuOpen && (\n <div\n className={cn(\n \"fixed inset-0 [z-index:var(--z-index-nav-mobile-overlay)]\",\n breakpointClasses[mobileBreakpoint]\n )}\n style={{\n backgroundColor:\n \"var(--overlay-background, rgba(0, 0, 0, 0.4))\",\n }}\n onClick={() => setIsMobileMenuOpen(false)}\n />\n )}\n\n {/* Drawer Panel */}\n <div\n ref={mobileMenuRef}\n className={cn(\n \"fixed top-0 bottom-0 w-64 bg-(--color-background) [z-index:var(--z-index-nav-mobile-menu)] overflow-y-auto transition-transform ease-in-out shadow-lg\",\n breakpointClasses[mobileBreakpoint],\n mobileMenuDirection === \"left\" && [\n \"left-0 border-r border-(--color-border)\",\n isMobileMenuOpen\n ? \"translate-x-0\"\n : \"-translate-x-full\",\n ],\n mobileMenuDirection === \"right\" && [\n \"right-0 border-l border-(--color-border)\",\n isMobileMenuOpen\n ? \"translate-x-0\"\n : \"translate-x-full\",\n ],\n !isMobileMenuOpen && \"invisible\"\n )}\n style={{\n transitionDuration:\n \"var(--transition-drawer-duration, 500ms)\",\n }}\n >\n <div className=\"flex flex-col space-y-1 px-2 pt-2\">\n {items.map((item) => renderNavItem(item, true))}\n </div>\n </div>\n </>\n )}\n </nav>\n );\n }\n);\n\nNav.displayName = \"Nav\";\n\nexport { Nav };\n","\"use client\";\n\nimport { Menu, X } from \"lucide-react\";\nimport React, { useState, useEffect } from \"react\";\n\nexport interface NavItem {\n id: string;\n label: string;\n icon?: React.ReactNode;\n}\n\nexport interface NavSection {\n title: string;\n items: NavItem[];\n}\n\nexport interface DrawerProps {\n title: string;\n subtitle?: string;\n items?: NavItem[];\n sections?: NavSection[];\n activeItem: string;\n onItemClick: (itemId: string) => void;\n footer?: React.ReactNode;\n position?: \"left\" | \"right\";\n homeUrl?: string;\n autoHideOnScroll?: boolean;\n headerActions?: React.ReactNode;\n /** Remove bottom border from mobile header */\n borderless?: boolean;\n /** Make mobile header background transparent */\n transparent?: boolean;\n /** Add backdrop blur effect to mobile header (glassmorphism) */\n blur?: boolean;\n}\n\nexport function Drawer({\n title,\n subtitle,\n items,\n sections,\n activeItem,\n onItemClick,\n footer,\n position = \"right\",\n homeUrl,\n autoHideOnScroll = true,\n headerActions,\n borderless = false,\n transparent = false,\n blur = false,\n}: DrawerProps) {\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false);\n const [isHeaderVisible, setIsHeaderVisible] = useState(true);\n const [lastScrollY, setLastScrollY] = useState(0);\n\n const isLeft = position === \"left\";\n\n const handleItemClick = (itemId: string) => {\n onItemClick(itemId);\n setMobileMenuOpen(false);\n };\n\n // Use sections if provided, otherwise fall back to items\n const useSections = sections || (items ? [{ title: \"\", items }] : []);\n\n // Auto-hide mobile header on scroll\n useEffect(() => {\n if (!autoHideOnScroll) {\n setIsHeaderVisible(true);\n return;\n }\n\n const handleScroll = () => {\n const currentScrollY = window.scrollY;\n\n // Show header when at top\n if (currentScrollY < 10) {\n setIsHeaderVisible(true);\n }\n // Hide on scroll down, show on scroll up\n else if (currentScrollY > lastScrollY) {\n // Scrolling down\n setIsHeaderVisible(false);\n } else {\n // Scrolling up\n setIsHeaderVisible(true);\n }\n\n setLastScrollY(currentScrollY);\n };\n\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n return () => window.removeEventListener(\"scroll\", handleScroll);\n }, [lastScrollY, autoHideOnScroll]);\n\n return (\n <>\n {/* Mobile Header with auto-hide on scroll */}\n <div\n className={`lg:hidden fixed top-0 left-0 right-0 px-4 py-3 z-(--z-index-drawer-header) transition-transform duration-500 ease-in-out ${\n blur ? \"backdrop-blur-md backdrop-saturate-150\" : \"\"\n } ${borderless ? \"border-b-0\" : \"\"} ${isHeaderVisible ? \"translate-y-0\" : \"-translate-y-full\"}`}\n style={{\n backgroundColor: blur\n ? \"var(--color-muted)\"\n : transparent\n ? \"transparent\"\n : \"var(--color-background)\",\n opacity: blur ? 0.85 : 1,\n borderBottom:\n !borderless && !blur\n ? \"1px solid var(--color-border)\"\n : \"none\",\n }}\n >\n <div\n className={`flex items-center ${\n isLeft\n ? \"justify-between\"\n : \"justify-between flex-row-reverse\"\n }`}\n >\n <div className=\"flex items-center gap-2\">\n {homeUrl && (\n <a\n href={homeUrl}\n className=\"p-2 rounded-lg transition-colors\"\n style={{ color: \"var(--color-foreground)\" }}\n onMouseOver={(e) =>\n (e.currentTarget.style.background =\n \"var(--color-muted)\")\n }\n onMouseOut={(e) =>\n (e.currentTarget.style.background =\n \"transparent\")\n }\n aria-label=\"Go to home\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6\"\n />\n </svg>\n </a>\n )}\n <button\n onClick={() => setMobileMenuOpen(!mobileMenuOpen)}\n className=\"p-2 rounded-lg transition-colors relative z-(--z-index-drawer-button)\"\n style={{ color: \"var(--color-foreground)\" }}\n onMouseOver={(e) =>\n (e.currentTarget.style.background =\n \"var(--color-muted)\")\n }\n onMouseOut={(e) =>\n (e.currentTarget.style.background =\n \"transparent\")\n }\n aria-label=\"Toggle menu\"\n >\n {mobileMenuOpen ? (\n <X className=\"w-6 h-6\" />\n ) : (\n <Menu className=\"w-6 h-6\" />\n )}\n </button>\n </div>\n {headerActions && (\n <div className=\"flex items-center\">{headerActions}</div>\n )}\n <div>\n <h1\n className=\"font-bold text-h5\"\n style={{\n color: \"var(--color-foreground)\",\n }}\n >\n {title}\n </h1>\n {subtitle && (\n <p\n className=\"text-caption\"\n style={{\n color: \"var(--color-muted-foreground)\",\n }}\n >\n {subtitle}\n </p>\n )}\n </div>\n </div>\n </div>\n\n {/* Mobile Menu Overlay - Overlays main content without shifting */}\n {mobileMenuOpen && (\n <div\n className=\"fixed inset-0 lg:hidden transition-opacity ease-in-out\"\n style={{\n zIndex: 9998,\n transitionDuration:\n \"var(--transition-drawer-duration, 500ms)\",\n backgroundColor:\n \"var(--overlay-background, rgba(0, 0, 0, 0.4))\",\n }}\n onClick={() => setMobileMenuOpen(false)}\n />\n )}\n\n {/* Sidebar Navigation */}\n <aside\n className={`\n fixed top-0 bottom-0 w-64\n transition-all ease-out overflow-y-auto\n ${isLeft ? \"left-0\" : \"right-0\"}\n lg:translate-x-0 lg:top-0\n ${\n mobileMenuOpen\n ? \"translate-x-0 top-0\"\n : `${isLeft ? \"-translate-x-full\" : \"translate-x-full\"} top-0`\n }\n `}\n style={{\n transitionDuration:\n \"var(--transition-drawer-duration, 500ms)\",\n background: \"var(--color-background)\",\n borderLeft: isLeft\n ? \"none\"\n : \"1px solid var(--color-border)\",\n borderRight: isLeft\n ? \"1px solid var(--color-border)\"\n : \"none\",\n ...(mobileMenuOpen &&\n typeof window !== \"undefined\" &&\n window.innerWidth < 1024\n ? { zIndex: 9999 }\n : {}),\n }}\n >\n {/* Desktop Header */}\n <div\n className=\"hidden lg:block px-6 py-5\"\n style={{\n borderBottom: \"none\",\n background: \"var(--color-muted)\",\n }}\n >\n <h1\n className=\"font-bold text-h5\"\n style={{\n color: \"var(--color-foreground)\",\n }}\n >\n {title}\n </h1>\n {subtitle && (\n <p\n className=\"mt-0.5 text-caption\"\n style={{\n color: \"var(--color-muted-foreground)\",\n }}\n >\n {subtitle}\n </p>\n )}\n </div>\n\n {/* Mobile Header with Close Button Inside Drawer */}\n <div\n className=\"lg:hidden p-4 flex items-center justify-between\"\n style={{ borderBottom: \"1px solid var(--color-border)\" }}\n >\n <div>\n <h1\n className=\"font-bold text-h5\"\n style={{\n color: \"var(--color-foreground)\",\n }}\n >\n {title}\n </h1>\n {subtitle && (\n <p\n className=\"mt-1 text-caption\"\n style={{\n color: \"var(--color-muted-foreground)\",\n }}\n >\n {subtitle}\n </p>\n )}\n </div>\n <button\n onClick={() => setMobileMenuOpen(false)}\n className=\"p-2 rounded-lg transition-colors\"\n style={{ color: \"var(--color-foreground)\" }}\n onMouseOver={(e) =>\n (e.currentTarget.style.background =\n \"var(--color-muted)\")\n }\n onMouseOut={(e) =>\n (e.currentTarget.style.background = \"transparent\")\n }\n aria-label=\"Close menu\"\n >\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n\n {/* Navigation Items */}\n <nav className=\"px-3 py-4\">\n {useSections.map((section, sectionIndex) => (\n <div\n key={sectionIndex}\n style={{\n paddingTop:\n sectionIndex > 0\n ? \"var(--drawer-section-padding-y)\"\n : \"0\",\n }}\n >\n {section.title && (\n <h3\n className=\"font-semibold uppercase tracking-wide text-caption\"\n style={{\n marginBottom:\n \"var(--drawer-title-margin-bottom)\",\n color: \"var(--color-muted-foreground)\",\n padding: \"0 0.75rem\",\n }}\n >\n {section.title}\n </h3>\n )}\n <ul\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"var(--drawer-item-spacing)\",\n }}\n >\n {section.items.map((item) => (\n <li key={item.id}>\n <button\n onClick={() =>\n handleItemClick(item.id)\n }\n className=\"w-full flex items-center gap-3 rounded-lg font-medium transition-all duration-200 text-small\"\n onMouseOver={(e) => {\n if (activeItem !== item.id) {\n e.currentTarget.style.background =\n \"var(--color-muted)\";\n e.currentTarget.style.color =\n \"var(--color-foreground)\";\n }\n }}\n onMouseOut={(e) => {\n if (activeItem !== item.id) {\n e.currentTarget.style.background =\n \"transparent\";\n e.currentTarget.style.color =\n \"var(--color-muted-foreground)\";\n }\n }}\n style={{\n paddingLeft:\n \"var(--drawer-item-padding-x)\",\n paddingRight:\n \"var(--drawer-item-padding-x)\",\n paddingTop:\n \"var(--drawer-item-padding-y)\",\n paddingBottom:\n \"var(--drawer-item-padding-y)\",\n borderRadius:\n \"var(--drawer-border-radius)\",\n background:\n activeItem === item.id\n ? \"var(--color-primary)\"\n : \"transparent\",\n color:\n activeItem === item.id\n ? \"var(--color-background)\"\n : \"var(--color-muted-foreground)\",\n boxShadow:\n activeItem === item.id\n ? \"0 1px 3px rgba(0,0,0,0.1)\"\n : \"none\",\n }}\n >\n {item.icon && (\n <span className=\"shrink-0 opacity-75\">\n {item.icon}\n </span>\n )}\n <span>{item.label}</span>\n </button>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </nav>\n\n {/* Footer */}\n {footer && (\n <div\n className=\"p-4 mt-auto\"\n style={{ borderTop: \"1px solid var(--color-border)\" }}\n >\n {footer}\n </div>\n )}\n </aside>\n </>\n );\n}\n","\"use client\";\n\nimport { Menu, X } from \"lucide-react\";\nimport React, { useState } from \"react\";\n\nexport interface NavItem {\n id: string;\n label: string;\n icon?: React.ReactNode;\n}\n\nexport interface NavSection {\n title: string;\n items: NavItem[];\n}\n\nexport interface SidebarNavProps {\n title: string;\n subtitle?: string;\n items?: NavItem[];\n sections?: NavSection[];\n activeItem: string;\n onItemClick: (itemId: string) => void;\n footer?: React.ReactNode;\n position?: \"left\" | \"right\";\n}\n\nexport function SidebarNav({\n title,\n subtitle,\n items,\n sections,\n activeItem,\n onItemClick,\n footer,\n position = \"right\",\n}: SidebarNavProps) {\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false);\n\n const isLeft = position === \"left\";\n\n const handleItemClick = (itemId: string) => {\n onItemClick(itemId);\n setMobileMenuOpen(false);\n };\n\n // Use sections if provided, otherwise fall back to items\n const useSections = sections || (items ? [{ title: \"\", items }] : []);\n\n return (\n <>\n {/* Mobile Header */}\n <div className=\"lg:hidden fixed top-0 left-0 right-0 [z-index:var(--z-index-nav)] bg-(--color-background) border-b border-(--color-border) px-4 py-3\">\n <div\n className={`flex items-center ${\n isLeft\n ? \"justify-between\"\n : \"justify-between flex-row-reverse\"\n }`}\n >\n <button\n onClick={() => setMobileMenuOpen(!mobileMenuOpen)}\n className=\"p-2 rounded-lg hover:bg-(--color-muted) transition-colors\"\n aria-label=\"Toggle menu\"\n >\n {mobileMenuOpen ? (\n <X className=\"w-6 h-6 text-(--color-muted-foreground)\" />\n ) : (\n <Menu className=\"w-6 h-6 text-(--color-muted-foreground)\" />\n )}\n </button>\n <div>\n <h1 className=\"text-h4 font-bold text-(--color-foreground)\">\n {title}\n </h1>\n {subtitle && (\n <p className=\"text-caption text-(--color-muted-foreground)\">\n {subtitle}\n </p>\n )}\n </div>\n </div>\n </div>\n\n {/* Mobile Menu Overlay - Overlays main content without shifting */}\n {mobileMenuOpen && (\n <div\n className=\"fixed inset-0 bg-black/50 lg:hidden\"\n style={{ zIndex: 35 }}\n onClick={() => setMobileMenuOpen(false)}\n />\n )}\n\n {/* Sidebar Navigation */}\n <aside\n className={`\n fixed top-0 h-screen w-64 bg-(--color-background) [z-index:var(--z-index-drawer)]\n transition-transform duration-300 ease-in-out overflow-y-auto\n ${isLeft ? \"left-0 border-r\" : \"right-0 border-l\"} border-(--color-border)\n lg:translate-x-0\n ${\n mobileMenuOpen\n ? \"translate-x-0\"\n : `${\n isLeft ? \"-translate-x-full\" : \"translate-x-full\"\n } lg:translate-x-0`\n }\n `}\n >\n {/* Desktop Header */}\n <div className=\"hidden lg:block p-6 border-b border-(--color-border)\">\n <h1 className=\"text-h3 font-bold text-(--color-foreground)\">\n {title}\n </h1>\n {subtitle && (\n <p className=\"text-caption text-(--color-muted-foreground) mt-1\">\n {subtitle}\n </p>\n )}\n </div>\n\n {/* Mobile Header Spacer */}\n <div className=\"lg:hidden h-[57px]\" aria-hidden=\"true\" />\n\n {/* Navigation Items */}\n <nav className=\"p-4\">\n {useSections.map((section, sectionIndex) => (\n <div\n key={sectionIndex}\n className={sectionIndex > 0 ? \"mt-6\" : \"\"}\n >\n {section.title && (\n <h3 className=\"px-4 mb-2 text-caption font-semibold text-(--color-muted-foreground) uppercase tracking-wider\">\n {section.title}\n </h3>\n )}\n <ul className=\"space-y-1\">\n {section.items.map((item) => (\n <li key={item.id}>\n <button\n onClick={() =>\n handleItemClick(item.id)\n }\n className={`\n w-full flex items-center gap-3 px-4 py-3 rounded-lg text-small font-medium transition-colors\n ${\n activeItem === item.id\n ? \"bg-[color-mix(in_srgb,var(--color-primary)_10%,transparent)] text-(--color-primary)\"\n : \"text-(--color-muted-foreground) hover:bg-(--color-muted)\"\n }\n `}\n >\n {item.icon && (\n <span className=\"shrink-0\">\n {item.icon}\n </span>\n )}\n <span>{item.label}</span>\n </button>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </nav>\n\n {/* Footer */}\n {footer && (\n <div className=\"p-4 border-t border-(--color-border) mt-auto\">\n {footer}\n </div>\n )}\n </aside>\n </>\n );\n}\n","import React from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport interface EmptyStateProps extends React.HTMLAttributes<HTMLDivElement> {\n icon?: React.ReactNode;\n title: string;\n description?: string;\n action?: React.ReactNode;\n}\n\nconst EmptyState = React.forwardRef<HTMLDivElement, EmptyStateProps>(\n ({ className, icon, title, description, action, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col items-center justify-center text-center py-12 px-4\",\n className\n )}\n {...props}\n >\n {icon && (\n <div className=\"mb-4 text-(--color-placeholder)\">\n {icon}\n </div>\n )}\n\n <h3 className=\"text-h4 font-semibold text-(--color-foreground) mb-2\">\n {title}\n </h3>\n\n {description && (\n <p className=\"text-small text-(--color-muted-foreground) mb-6 max-w-sm\">\n {description}\n </p>\n )}\n\n {action && <div>{action}</div>}\n </div>\n );\n }\n);\n\nEmptyState.displayName = \"EmptyState\";\n\nexport { EmptyState };\n","\"use client\";\n\nimport {\n createContext,\n useContext,\n ReactNode,\n useState,\n useEffect,\n} from \"react\";\nimport themes from \"../themes\";\n\ninterface Theme {\n name: string;\n id: string;\n colors: Record<string, string>;\n components: Record<string, Record<string, string>>;\n typography?: Record<string, string>;\n showcase?: Record<string, string>;\n semanticColors?: Record<string, string>;\n transitions?: Record<string, string>;\n overlay?: Record<string, string>;\n}\n\ninterface ThemeContextType {\n currentTheme: string;\n availableThemes: { id: string; name: string }[];\n setTheme: (themeId: string) => void;\n setCSSVariable: (name: string, value: string) => void;\n getCSSVariable: (name: string) => string;\n exportThemeCSS: () => string;\n}\n\nconst ThemeContext = createContext<ThemeContextType | undefined>(undefined);\n\n// Convert imported themes to Theme type\nconst themeRegistry: Record<string, Theme> = themes as Record<string, Theme>;\n\n// Get initial theme from localStorage\nconst getInitialTheme = (defaultTheme: string = \"dark\"): string => {\n if (typeof window === \"undefined\") return defaultTheme;\n try {\n const saved = localStorage.getItem(\"yomologic-theme\");\n return saved && themeRegistry[saved] ? saved : defaultTheme;\n } catch {\n return defaultTheme;\n }\n};\n\ninterface ThemeProviderProps {\n children: ReactNode;\n defaultTheme?: string;\n customTheme?: Theme;\n storageKey?: string;\n}\n\nexport function ThemeProvider({\n children,\n defaultTheme = \"dark\",\n customTheme,\n storageKey = \"yomologic-theme\",\n}: ThemeProviderProps) {\n const [currentTheme, setCurrentTheme] = useState<string>(() =>\n getInitialTheme(defaultTheme)\n );\n const [availableThemes] = useState(\n Object.values(themeRegistry).map((t) => ({ id: t.id, name: t.name }))\n );\n\n const setCSSVariable = (name: string, value: string) => {\n if (typeof window === \"undefined\") return;\n document.documentElement.style.setProperty(name, value);\n };\n\n const getCSSVariable = (name: string): string => {\n if (typeof window === \"undefined\") return \"\";\n return getComputedStyle(document.documentElement)\n .getPropertyValue(name)\n .trim();\n };\n\n const applyTheme = (theme: Theme) => {\n // Apply color variables\n Object.entries(theme.colors).forEach(([key, value]) => {\n setCSSVariable(`--color-${key}`, value);\n });\n\n // Apply showcase-specific colors (if present)\n if (theme.showcase) {\n Object.entries(theme.showcase).forEach(([key, value]) => {\n setCSSVariable(`--showcase-${key}`, value);\n // Also map surface colors to --color-* for component usage\n if (key === \"surface\" || key === \"surface-elevated\") {\n setCSSVariable(`--color-${key}`, value);\n }\n });\n }\n\n // Apply semantic colors (if present)\n if (theme.semanticColors) {\n Object.entries(theme.semanticColors).forEach(([key, value]) => {\n setCSSVariable(`--color-${key}`, value);\n });\n }\n\n // Apply typography variables (if present)\n if (theme.typography) {\n Object.entries(theme.typography).forEach(([key, value]) => {\n setCSSVariable(`--typography-${key}`, value);\n });\n }\n\n // Apply component-specific variables\n Object.entries(theme.components).forEach(([component, vars]) => {\n Object.entries(vars).forEach(([key, value]) => {\n // Convert card-icons.blue-bg to --card-icon-blue-bg\n const varName =\n component === \"card-icons\"\n ? `--card-icon-${key}`\n : `--${component}-${key}`;\n setCSSVariable(varName, value);\n });\n });\n\n // Apply transition variables (if present)\n if (theme.transitions) {\n Object.entries(theme.transitions).forEach(([key, value]) => {\n setCSSVariable(`--transition-${key}`, value);\n });\n }\n\n // Apply overlay variables (if present)\n if (theme.overlay) {\n Object.entries(theme.overlay).forEach(([key, value]) => {\n setCSSVariable(`--overlay-${key}`, value);\n });\n }\n\n // Update body background and text color\n setCSSVariable(\"--background\", theme.colors.background);\n setCSSVariable(\"--foreground\", theme.colors.foreground);\n };\n\n const setTheme = (themeId: string) => {\n const theme = customTheme || themeRegistry[themeId];\n if (!theme) {\n console.error(`Theme not found: ${themeId}`);\n return;\n }\n\n applyTheme(theme);\n setCurrentTheme(themeId);\n\n // Save to localStorage\n if (typeof window !== \"undefined\") {\n localStorage.setItem(storageKey, themeId);\n }\n };\n\n const exportThemeCSS = (): string => {\n if (typeof window === \"undefined\") return \"\";\n\n const root = document.documentElement;\n const cssVariables: Record<string, string> = {};\n\n // Get all CSS custom properties from :root\n for (let i = 0; i < root.style.length; i++) {\n const propertyName = root.style[i];\n if (propertyName.startsWith(\"--\")) {\n cssVariables[propertyName] =\n root.style.getPropertyValue(propertyName);\n }\n }\n\n // Generate CSS file content\n const timestamp = new Date().toISOString().split(\"T\")[0];\n let css = `/* Generated by @yomologic/react-ui Theme Builder */\\n`;\n css += `/* Created: ${timestamp} */\\n\\n`;\n css += `:root {\\n`;\n\n // Group variables by prefix for better organization\n const groups: Record<string, string[]> = {};\n Object.keys(cssVariables)\n .sort()\n .forEach((varName) => {\n const prefix = varName.split(\"-\")[1] || \"other\";\n if (!groups[prefix]) groups[prefix] = [];\n groups[prefix].push(varName);\n });\n\n // Write grouped variables\n Object.entries(groups).forEach(([prefix, vars]) => {\n css += ` /* ${prefix.charAt(0).toUpperCase() + prefix.slice(1)} */\\n`;\n vars.forEach((varName) => {\n css += ` ${varName}: ${cssVariables[varName]};\\n`;\n });\n css += `\\n`;\n });\n\n css += `}\\n`;\n return css;\n };\n\n // Apply theme on mount\n useEffect(() => {\n const theme = customTheme || themeRegistry[currentTheme];\n if (theme) {\n applyTheme(theme);\n }\n }, [currentTheme, customTheme, applyTheme]);\n\n return (\n <ThemeContext.Provider\n value={{\n currentTheme,\n availableThemes,\n setTheme,\n setCSSVariable,\n getCSSVariable,\n exportThemeCSS,\n }}\n >\n {children}\n </ThemeContext.Provider>\n );\n}\n\nexport function useTheme() {\n const context = useContext(ThemeContext);\n if (context === undefined) {\n throw new Error(\"useTheme must be used within a ThemeProvider\");\n }\n return context;\n}\n","{\n \"name\": \"Dark\",\n \"id\": \"dark\",\n \"colors\": {\n \"primary\": \"#19bfb7\",\n \"primary-hover\": \"#16a39d\",\n \"primary-active\": \"#138883\",\n \"secondary\": \"#8b9ba8\",\n \"secondary-hover\": \"#a3b4c2\",\n \"background\": \"#0f1419\",\n \"foreground\": \"#e3e8ed\",\n \"muted\": \"#1a2028\",\n \"muted-foreground\": \"#8b9ba8\",\n \"placeholder\": \"#5a6b7a\",\n \"border\": \"#2d3843\"\n },\n \"showcase\": {\n \"bg\": \"#0f1419\",\n \"surface\": \"#1a2028\",\n \"surface-elevated\": \"#242c36\",\n \"text-primary\": \"#e3e8ed\",\n \"text-secondary\": \"#8b9ba8\",\n \"border\": \"#2d3843\"\n },\n \"typography\": {\n \"h1\": \"1.875rem\",\n \"h1-desktop\": \"2.25rem\",\n \"h2\": \"1.5rem\",\n \"h2-desktop\": \"1.875rem\",\n \"h3\": \"1.25rem\",\n \"h3-desktop\": \"1.5rem\",\n \"h4\": \"1.125rem\",\n \"h4-desktop\": \"1.25rem\",\n \"h5\": \"1rem\",\n \"h5-desktop\": \"1.125rem\",\n \"h6\": \"0.875rem\",\n \"h6-desktop\": \"1rem\",\n \"body\": \"0.875rem\",\n \"body-desktop\": \"1rem\",\n \"small\": \"0.75rem\",\n \"small-desktop\": \"0.875rem\",\n \"caption\": \"0.6875rem\"\n },\n \"semanticColors\": {\n \"info\": \"#4d9de0\",\n \"info-foreground\": \"#0f1419\",\n \"info-muted\": \"#1a3a52\",\n \"info-muted-foreground\": \"#7bb5e8\",\n \"info-border\": \"#4d9de0\",\n \"success\": \"#4ec9b0\",\n \"success-foreground\": \"#0f1419\",\n \"success-muted\": \"#1a3d35\",\n \"success-muted-foreground\": \"#7dd8c1\",\n \"success-border\": \"#4ec9b0\",\n \"warning\": \"#d4a574\",\n \"warning-foreground\": \"#0f1419\",\n \"warning-muted\": \"#3d2f1f\",\n \"warning-muted-foreground\": \"#e0ba92\",\n \"warning-border\": \"#d4a574\",\n \"error\": \"#e07088\",\n \"error-foreground\": \"#0f1419\",\n \"error-muted\": \"#3d1f27\",\n \"error-muted-foreground\": \"#ed98ab\",\n \"error-border\": \"#e07088\"\n },\n \"components\": {\n \"checkbox\": {\n \"border-color\": \"#3d4855\",\n \"checked-color\": \"#19bfb7\",\n \"label-color\": \"#c5ced8\",\n \"hover-bg\": \"rgba(25, 191, 183, 0.12)\"\n },\n \"radio\": {\n \"border-color\": \"#3d4855\",\n \"checked-color\": \"#19bfb7\",\n \"label-color\": \"#c5ced8\",\n \"hover-bg\": \"rgba(25, 191, 183, 0.12)\"\n },\n \"button\": {\n \"primary-text\": \"#0f1419\",\n \"secondary-text\": \"#e3e8ed\"\n },\n \"card-icons\": {\n \"blue-bg\": \"#1a3452\",\n \"blue-bg-hover\": \"#234a6f\",\n \"blue-text\": \"#7bb5e8\",\n \"purple-bg\": \"#3a2854\",\n \"purple-bg-hover\": \"#4d3570\",\n \"purple-text\": \"#c9a5e8\",\n \"green-bg\": \"#1a3d35\",\n \"green-bg-hover\": \"#235447\",\n \"green-text\": \"#7dd8c1\",\n \"orange-bg\": \"#3d2f1f\",\n \"orange-bg-hover\": \"#543f2a\",\n \"orange-text\": \"#e0ba92\",\n \"pink-bg\": \"#3d1f2e\",\n \"pink-bg-hover\": \"#542a3e\",\n \"pink-text\": \"#ed98ba\",\n \"indigo-bg\": \"#2a2854\",\n \"indigo-bg-hover\": \"#383570\",\n \"indigo-text\": \"#a8a5e8\"\n }\n },\n \"transitions\": {\n \"drawer-duration\": \"500ms\"\n },\n \"overlay\": {\n \"background\": \"rgba(0, 0, 0, 0.5)\"\n }\n}\n","{\n \"name\": \"Light\",\n \"id\": \"light\",\n \"colors\": {\n \"primary\": \"#3b82f6\",\n \"primary-hover\": \"#2563eb\",\n \"primary-active\": \"#1d4ed8\",\n \"secondary\": \"#6b7280\",\n \"secondary-hover\": \"#4b5563\",\n \"background\": \"#ffffff\",\n \"foreground\": \"#111827\",\n \"muted\": \"#f3f4f6\",\n \"muted-foreground\": \"#6b7280\",\n \"placeholder\": \"#9ca3af\",\n \"border\": \"#9ca3af\"\n },\n \"showcase\": {\n \"bg\": \"#ffffff\",\n \"surface\": \"#f9fafb\",\n \"surface-elevated\": \"#f3f4f6\",\n \"text-primary\": \"#111827\",\n \"text-secondary\": \"#6b7280\",\n \"border\": \"#e5e7eb\"\n },\n \"typography\": {\n \"h1\": \"1.875rem\",\n \"h1-desktop\": \"2.25rem\",\n \"h2\": \"1.5rem\",\n \"h2-desktop\": \"1.875rem\",\n \"h3\": \"1.25rem\",\n \"h3-desktop\": \"1.5rem\",\n \"h4\": \"1.125rem\",\n \"h4-desktop\": \"1.25rem\",\n \"h5\": \"1rem\",\n \"h5-desktop\": \"1.125rem\",\n \"h6\": \"0.875rem\",\n \"h6-desktop\": \"1rem\",\n \"body\": \"0.875rem\",\n \"body-desktop\": \"1rem\",\n \"small\": \"0.75rem\",\n \"small-desktop\": \"0.875rem\",\n \"caption\": \"0.6875rem\"\n },\n \"semanticColors\": {\n \"info\": \"#3b82f6\",\n \"info-foreground\": \"#ffffff\",\n \"info-muted\": \"#eff6ff\",\n \"info-muted-foreground\": \"#1d4ed8\",\n \"info-border\": \"#3b82f6\",\n \"success\": \"#22c55e\",\n \"success-foreground\": \"#ffffff\",\n \"success-muted\": \"#f0fdf4\",\n \"success-muted-foreground\": \"#15803d\",\n \"success-border\": \"#22c55e\",\n \"warning\": \"#eab308\",\n \"warning-foreground\": \"#ffffff\",\n \"warning-muted\": \"#fefce8\",\n \"warning-muted-foreground\": \"#a16207\",\n \"warning-border\": \"#eab308\",\n \"error\": \"#ef4444\",\n \"error-foreground\": \"#ffffff\",\n \"error-muted\": \"#fef2f2\",\n \"error-muted-foreground\": \"#b91c1c\",\n \"error-border\": \"#ef4444\"\n },\n \"components\": {\n \"checkbox\": {\n \"border-color\": \"#9ca3af\",\n \"checked-color\": \"#3b82f6\",\n \"label-color\": \"#4b5563\",\n \"hover-bg\": \"rgba(37, 99, 235, 0.1)\"\n },\n \"radio\": {\n \"border-color\": \"#9ca3af\",\n \"checked-color\": \"#3b82f6\",\n \"label-color\": \"#4b5563\",\n \"hover-bg\": \"rgba(37, 99, 235, 0.1)\"\n },\n \"button\": {\n \"primary-text\": \"#ffffff\",\n \"secondary-text\": \"#ffffff\"\n },\n \"card-icons\": {\n \"blue-bg\": \"#dbeafe\",\n \"blue-bg-hover\": \"#bfdbfe\",\n \"blue-text\": \"#2563eb\",\n \"purple-bg\": \"#e9d5ff\",\n \"purple-bg-hover\": \"#d8b4fe\",\n \"purple-text\": \"#9333ea\",\n \"green-bg\": \"#d1fae5\",\n \"green-bg-hover\": \"#a7f3d0\",\n \"green-text\": \"#059669\",\n \"orange-bg\": \"#fed7aa\",\n \"orange-bg-hover\": \"#fdba74\",\n \"orange-text\": \"#ea580c\",\n \"pink-bg\": \"#fce7f3\",\n \"pink-bg-hover\": \"#fbcfe8\",\n \"pink-text\": \"#db2777\",\n \"indigo-bg\": \"#e0e7ff\",\n \"indigo-bg-hover\": \"#c7d2fe\",\n \"indigo-text\": \"#4f46e5\"\n }\n },\n \"transitions\": {\n \"drawer-duration\": \"500ms\"\n },\n \"overlay\": {\n \"background\": \"rgba(0, 0, 0, 0.4)\"\n }\n}\n","import dark from \"./dark.json\";\nimport light from \"./light.json\";\n\nexport const themes = {\n light,\n dark,\n};\n\nexport type ThemeId = keyof typeof themes;\n\nexport default themes;\n"],"mappings":"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","names":["React","rest","import_react","import_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","useFormField","import_jsx_runtime","React","useFormField","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","React","value","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","import_lucide_react","import_react","import_jsx_runtime","React","import_jsx_runtime","import_react","import_jsx_runtime","marksList","import_react","import_jsx_runtime","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","React","import_lucide_react","import_react","import_jsx_runtime","React","import_lucide_react","import_react","import_jsx_runtime","import_lucide_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","React","import_react","themes","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/ui/button.tsx","../src/lib/utils.ts","../src/ui/input.tsx","../src/ui/hooks/useFormField.ts","../src/ui/form.tsx","../src/ui/form-control.tsx","../src/ui/textarea.tsx","../src/ui/card.tsx","../src/ui/badge.tsx","../src/ui/checkbox.tsx","../src/ui/radio.tsx","../src/ui/select.tsx","../src/ui/native-select.tsx","../src/ui/spinner.tsx","../src/ui/code-snippet.tsx","../src/ui/rating.tsx","../src/ui/divider.tsx","../src/ui/slider.tsx","../src/ui/switch.tsx","../src/ui/dialog.tsx","../src/feedback/alert.tsx","../src/layout/container.tsx","../src/layout/section-layout.tsx","../src/layout/nav.tsx","../src/layout/drawer.tsx","../src/layout/sidebar-nav.tsx","../src/shared/empty-state.tsx","../src/contexts/ThemeProvider.tsx","../src/themes/dark.json","../src/themes/light.json","../src/themes/index.ts"],"sourcesContent":["// UI Components\nexport { Button } from \"./ui/button\";\nexport { Input } from \"./ui/input\";\nexport { Textarea } from \"./ui/textarea\";\nexport type { TextareaProps } from \"./ui/textarea\";\nexport {\n Card,\n CardHeader,\n CardTitle,\n CardDescription,\n CardContent,\n CardFooter,\n CardMedia,\n CardActions,\n CardActionArea,\n} from \"./ui/card\";\nexport { Badge } from \"./ui/badge\";\nexport { Checkbox, CheckboxGroup } from \"./ui/checkbox\";\nexport { RadioGroup } from \"./ui/radio\";\nexport { Select } from \"./ui/select\";\nexport type { SelectOption, SelectProps } from \"./ui/select\";\nexport { NativeSelect } from \"./ui/native-select\";\nexport type { NativeSelectProps } from \"./ui/native-select\";\nexport { Form, useForm, useFormContext } from \"./ui/form\";\nexport type {\n FormState,\n FormContextValue,\n ValidationFunction,\n} from \"./ui/form\";\nexport {\n FormControl,\n FormControlLabel,\n FormHelperText,\n useFormControl,\n useFormControlContext,\n useFormField,\n} from \"./ui/form-control\";\nexport type {\n FormControlProps,\n FormControlState,\n FormControlContextValue,\n FormFieldProps,\n ValidationRule,\n} from \"./ui/form-control\";\nexport { Spinner } from \"./ui/spinner\";\nexport { CodeSnippet } from \"./ui/code-snippet\";\nexport { Rating } from \"./ui/rating\";\nexport { Divider } from \"./ui/divider\";\nexport { Slider } from \"./ui/slider\";\nexport type { SliderProps, SliderMark } from \"./ui/slider\";\nexport { Switch } from \"./ui/switch\";\nexport type { SwitchProps } from \"./ui/switch\";\nexport {\n Dialog,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogContent,\n DialogFooter,\n} from \"./ui/dialog\";\n\n// Feedback Components\nexport { Alert } from \"./feedback/alert\";\n\n// Layout Components\nexport { Container } from \"./layout/container\";\nexport { SectionLayout } from \"./layout/section-layout\";\nexport { Nav } from \"./layout/nav\";\nexport type { NavItem, NavProps } from \"./layout/nav\";\nexport { Drawer } from \"./layout/drawer\";\nexport type {\n DrawerProps,\n NavItem as DrawerNavItem,\n NavSection as DrawerNavSection,\n} from \"./layout/drawer\";\n\n/** @deprecated Use Drawer component instead. SidebarNav will be removed in v1.0.0 */\nexport { SidebarNav } from \"./layout/sidebar-nav\";\nexport type {\n NavItem as SidebarNavItem,\n NavSection,\n} from \"./layout/sidebar-nav\";\n\n// Shared Components\nexport { EmptyState } from \"./shared/empty-state\";\n\n// Theme System\nexport { ThemeProvider, useTheme } from \"./contexts/ThemeProvider\";\nexport { default as themes } from \"./themes\";\nexport type { ThemeId } from \"./themes\";\n\n// Utility functions\nexport { cn } from \"./lib/utils\";\n","import React from \"react\";\nimport { cn } from \"../lib/utils\";\n\ntype ButtonBaseProps = {\n variant?:\n | \"primary\"\n | \"secondary\"\n | \"outline\"\n | \"ghost\"\n | \"info\"\n | \"success\"\n | \"warning\"\n | \"error\";\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n isLoading?: boolean;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n children?: React.ReactNode;\n className?: string;\n};\n\ntype ButtonAsButton = ButtonBaseProps &\n Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n keyof ButtonBaseProps\n > & {\n href?: never;\n };\n\ntype ButtonAsLink = ButtonBaseProps &\n Omit<\n React.AnchorHTMLAttributes<HTMLAnchorElement>,\n keyof ButtonBaseProps\n > & {\n href: string;\n };\n\nexport type ButtonProps = ButtonAsButton | ButtonAsLink;\n\nconst Button = React.forwardRef<\n HTMLButtonElement | HTMLAnchorElement,\n ButtonProps\n>(\n (\n {\n className,\n variant = \"primary\",\n size = \"md\",\n isLoading = false,\n leftIcon,\n rightIcon,\n children,\n ...props\n },\n ref\n ) => {\n const baseStyles =\n \"inline-flex items-center justify-center cursor-pointer transition-all duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:brightness-100 no-underline\";\n\n const variants = {\n primary:\n \"bg-[var(--color-primary)] text-[var(--button-primary-text)] hover:brightness-90 active:brightness-75\",\n secondary:\n \"bg-[var(--color-secondary)] text-[var(--button-secondary-text)] hover:brightness-90 active:brightness-75\",\n outline:\n \"border-2 border-[var(--color-primary)] text-[var(--color-primary)] bg-transparent\",\n ghost: \"bg-transparent text-[var(--color-foreground)]\",\n info: \"bg-[var(--color-info-muted)] border-2 border-[var(--color-info-border)] text-[var(--color-info-muted-foreground)] hover:brightness-95 active:brightness-90\",\n success:\n \"bg-[var(--color-success-muted)] border-2 border-[var(--color-success-border)] text-[var(--color-success-muted-foreground)] hover:brightness-95 active:brightness-90\",\n warning:\n \"bg-[var(--color-warning-muted)] border-2 border-[var(--color-warning-border)] text-[var(--color-warning-muted-foreground)] hover:brightness-95 active:brightness-90\",\n error: \"bg-[var(--color-error-muted)] border-2 border-[var(--color-error-border)] text-[var(--color-error-muted-foreground)] hover:brightness-95 active:brightness-90\",\n };\n const sizes = {\n xs: \"[font-size:var(--button-font-size-xs)] [padding-left:var(--button-padding-xs-x)] [padding-right:var(--button-padding-xs-x)] [padding-top:var(--button-padding-xs-y)] [padding-bottom:var(--button-padding-xs-y)] gap-1\",\n sm: \"[font-size:var(--button-font-size-sm)] [padding-left:var(--button-padding-sm-x)] [padding-right:var(--button-padding-sm-x)] [padding-top:var(--button-padding-sm-y)] [padding-bottom:var(--button-padding-sm-y)] gap-1.5\",\n md: \"[font-size:var(--button-font-size-md)] [padding-left:var(--button-padding-md-x)] [padding-right:var(--button-padding-md-x)] [padding-top:var(--button-padding-md-y)] [padding-bottom:var(--button-padding-md-y)] gap-2\",\n lg: \"[font-size:var(--button-font-size-lg)] [padding-left:var(--button-padding-lg-x)] [padding-right:var(--button-padding-lg-x)] [padding-top:var(--button-padding-lg-y)] [padding-bottom:var(--button-padding-lg-y)] gap-2.5\",\n xl: \"[font-size:var(--button-font-size-xl)] [padding-left:var(--button-padding-xl-x)] [padding-right:var(--button-padding-xl-x)] [padding-top:var(--button-padding-xl-y)] [padding-bottom:var(--button-padding-xl-y)] gap-3\",\n };\n\n const radiusStyle = \"[border-radius:var(--button-radius)]\";\n const fontWeightStyle = \"[font-weight:var(--button-font-weight)]\";\n\n const classNames = cn(\n baseStyles,\n variants[variant],\n sizes[size],\n radiusStyle,\n fontWeightStyle,\n className\n );\n\n const handleMouseEnter = (e: React.MouseEvent<HTMLElement>) => {\n if (variant === \"ghost\") {\n e.currentTarget.style.backgroundColor =\n \"rgba(99, 102, 241, 0.08)\";\n } else if (variant === \"outline\") {\n e.currentTarget.style.backgroundColor =\n \"rgba(59, 130, 246, 0.12)\";\n }\n };\n\n const handleMouseLeave = (e: React.MouseEvent<HTMLElement>) => {\n if (variant === \"ghost\" || variant === \"outline\") {\n e.currentTarget.style.backgroundColor = \"\";\n }\n };\n\n const handleMouseDown = (e: React.MouseEvent<HTMLElement>) => {\n if (variant === \"ghost\") {\n e.currentTarget.style.backgroundColor =\n \"rgba(99, 102, 241, 0.16)\";\n } else if (variant === \"outline\") {\n e.currentTarget.style.backgroundColor =\n \"rgba(59, 130, 246, 0.24)\";\n }\n };\n\n const handleMouseUp = (e: React.MouseEvent<HTMLElement>) => {\n if (variant === \"ghost\") {\n e.currentTarget.style.backgroundColor =\n \"rgba(99, 102, 241, 0.08)\";\n } else if (variant === \"outline\") {\n e.currentTarget.style.backgroundColor =\n \"rgba(59, 130, 246, 0.12)\";\n }\n };\n\n const content = (\n <>\n {isLoading && (\n <svg\n className=\"animate-spin h-4 w-4\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n ></circle>\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n )}\n {!isLoading && leftIcon && leftIcon}\n {children}\n {!isLoading && rightIcon && rightIcon}\n </>\n );\n\n if (\"href\" in props && props.href) {\n const { href, ...rest } = props as ButtonAsLink;\n return (\n <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={href}\n className={classNames}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onMouseDown={handleMouseDown}\n onMouseUp={handleMouseUp}\n {...rest}\n >\n {content}\n </a>\n );\n }\n\n const { disabled, ...rest } = props as ButtonAsButton;\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n className={classNames}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onMouseDown={handleMouseDown}\n onMouseUp={handleMouseUp}\n disabled={disabled || isLoading}\n {...rest}\n >\n {content}\n </button>\n );\n }\n);\n\nButton.displayName = \"Button\";\n\nexport { Button };\n","import { clsx, type ClassValue } from \"clsx\";\n\nexport function cn(...inputs: ClassValue[]) {\n return clsx(inputs);\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { ValidationFunction } from \"./form\";\nimport { useFormField } from \"./hooks/useFormField\";\n\nexport interface InputProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"pattern\"\n> {\n /** Field name - required when used inside Form */\n name?: string;\n label?: string;\n error?: string;\n helperText?: string;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n fullWidth?: boolean;\n /** Custom validation function that returns error message or undefined if valid */\n validate?: ValidationFunction;\n /** Callback when validation error changes */\n onValidationError?: (error: string | undefined) => void;\n /** Regex pattern for validation (string or RegExp) */\n pattern?: RegExp | string;\n /** Custom error messages for built-in validations */\n errorMessages?: {\n required?: string;\n minLength?: string;\n maxLength?: string;\n min?: string;\n max?: string;\n pattern?: string;\n email?: string;\n url?: string;\n };\n}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n (\n {\n className,\n type = \"text\",\n name,\n label,\n error,\n helperText,\n leftIcon,\n rightIcon,\n fullWidth = false,\n id,\n onChange,\n onBlur,\n value: externalValue,\n validate,\n onValidationError,\n pattern,\n errorMessages,\n ...props\n },\n ref\n ) => {\n // Use the custom hook to handle all form field logic\n const {\n fieldId,\n value: inputValue,\n error: inputError,\n isDisabled,\n isRequired,\n shouldRenderLabel,\n shouldRenderError,\n handleChange: hookHandleChange,\n handleBlur: hookHandleBlur,\n internalRef,\n } = useFormField({\n name,\n type,\n value: externalValue,\n error,\n id,\n required: props.required,\n disabled: props.disabled,\n minLength: props.minLength,\n maxLength: props.maxLength,\n min: props.min,\n max: props.max,\n pattern,\n validate,\n onValidationError,\n errorMessages,\n idPrefix: \"input\",\n });\n\n // Wrap hook handlers to call external handlers\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n hookHandleChange(e.target.value);\n onChange?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n hookHandleBlur(e.target.value);\n onBlur?.(e);\n };\n\n return (\n <div\n className={cn(\"flex flex-col\", fullWidth && \"w-full\")}\n style={{ marginBottom: \"var(--form-control-spacing)\" }}\n >\n {shouldRenderLabel && label && (\n <label\n htmlFor={fieldId}\n className=\"block text-small font-semibold text-(--color-muted-foreground) mb-1\"\n >\n {label}\n {isRequired && <span className=\"ml-1\">*</span>}\n </label>\n )}\n\n <div className=\"relative\">\n {leftIcon && (\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none text-(--color-placeholder)\">\n {leftIcon}\n </div>\n )}\n\n <input\n ref={(node) => {\n // Handle both refs\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n (internalRef as any).current = node;\n }}\n type={type}\n id={fieldId}\n value={inputValue}\n onChange={handleChange}\n onBlur={handleBlur}\n disabled={isDisabled}\n required={isRequired}\n pattern={\n pattern instanceof RegExp ? pattern.source : pattern\n }\n aria-invalid={!!inputError}\n aria-describedby={\n inputError\n ? `${fieldId}-error`\n : helperText\n ? `${fieldId}-helper`\n : undefined\n }\n className={cn(\n \"w-full px-3 py-2 border rounded-md transition-colors\",\n \"text-(--color-foreground) placeholder-gray-400\",\n \"focus:outline-none\",\n \"disabled:bg-(--color-muted) disabled:cursor-not-allowed disabled:text-(--color-muted-foreground)\",\n inputError\n ? \"border-(--color-error) focus:ring-2 focus:ring-(--color-error) focus:border-(--color-error) active:border-(--color-error)\"\n : \"border-(--color-border) focus:ring-2 focus:ring-(--color-primary)/30 focus:border-(--color-primary) active:border-(--color-primary)\",\n leftIcon && \"pl-10\",\n rightIcon && \"pr-10\",\n className\n )}\n {...props}\n />\n\n {rightIcon && (\n <div className=\"absolute inset-y-0 right-0 pr-3 flex items-center pointer-events-none text-(--color-placeholder)\">\n {rightIcon}\n </div>\n )}\n </div>\n\n <div className=\"h-5 mt-1.5\">\n {shouldRenderError && inputError && (\n <p\n className=\"text-small text-(--color-error)\"\n id={`${fieldId}-error`}\n role=\"alert\"\n >\n {inputError}\n </p>\n )}\n\n {helperText && !inputError && shouldRenderLabel && (\n <p\n className=\"text-small text-(--color-muted-foreground)\"\n id={`${fieldId}-helper`}\n >\n {helperText}\n </p>\n )}\n </div>\n </div>\n );\n }\n);\n\nInput.displayName = \"Input\";\n\nexport { Input };\n","import { useEffect, useId, useRef, useState } from \"react\";\nimport { useForm, ValidationFunction } from \"../form\";\nimport { useFormControl } from \"../form-control\";\n\n/**\n * Configuration options for useFormField hook\n */\nexport interface UseFormFieldOptions {\n /** Field name - required when used inside Form */\n name?: string;\n /** Field type (for input-specific validations like email, url, number) */\n type?: string;\n /** External controlled value */\n value?: any;\n /** External error message */\n error?: string;\n /** Custom ID for the field */\n id?: string;\n /** Whether field is required */\n required?: boolean;\n /** Whether field is disabled */\n disabled?: boolean;\n /** Minimum length validation */\n minLength?: number;\n /** Maximum length validation */\n maxLength?: number;\n /** Minimum value (for numbers) */\n min?: number | string;\n /** Maximum value (for numbers) */\n max?: number | string;\n /** Pattern validation (RegExp or string) */\n pattern?: RegExp | string;\n /** Custom validation function */\n validate?: ValidationFunction;\n /** Callback when validation error changes */\n onValidationError?: (error: string | undefined) => void;\n /** Custom error messages for built-in validations */\n errorMessages?: {\n required?: string;\n minLength?: string;\n maxLength?: string;\n min?: string;\n max?: string;\n pattern?: string;\n email?: string;\n url?: string;\n };\n /** Prefix for auto-generated IDs (e.g., 'input', 'textarea') */\n idPrefix?: string;\n}\n\n/**\n * Return type from useFormField hook\n */\nexport interface UseFormFieldResult {\n /** Stable field ID for htmlFor/aria attributes */\n fieldId: string;\n /** Current field value (respects priority: Form > FormControl > props) */\n value: any;\n /** Current error message (if any) */\n error: string | undefined;\n /** Whether the field is disabled */\n isDisabled: boolean;\n /** Whether the field is required */\n isRequired: boolean;\n /** Whether to show the label (not in FormControl) */\n shouldRenderLabel: boolean;\n /** Whether to show the error (not in FormControl) */\n shouldRenderError: boolean;\n /** onChange handler that integrates with all contexts */\n handleChange: (value: string) => void;\n /** onBlur handler that marks field as touched and validates */\n handleBlur: (value: string) => void;\n /** Internal ref for the field element */\n internalRef: React.RefObject<any>;\n}\n\n/**\n * Custom hook that encapsulates all form field logic:\n * - Context integration (Form and FormControl)\n * - Validation (built-in and custom)\n * - State management\n * - Event handling\n * - Registration lifecycle\n *\n * This eliminates code duplication across Input, Textarea, Select, etc.\n */\nexport function useFormField(options: UseFormFieldOptions): UseFormFieldResult {\n const {\n name,\n type = \"text\",\n value: externalValue,\n error: externalError,\n id,\n required = false,\n disabled = false,\n minLength,\n maxLength,\n min,\n max,\n pattern,\n validate,\n onValidationError,\n errorMessages,\n idPrefix = \"field\",\n } = options;\n\n const autoId = useId();\n const form = useForm();\n const formControl = useFormControl();\n const internalRef = useRef<any>(null);\n const [validationError, setValidationError] = useState<\n string | undefined\n >();\n\n // Generate stable ID only once\n const stableId = useRef<string | undefined>(undefined);\n if (!stableId.current) {\n stableId.current =\n id || formControl?.fieldId || `${idPrefix}-${autoId}`;\n }\n const fieldId = stableId.current;\n\n // Priority: Form context > FormControl context > props\n const isDisabled = disabled || formControl?.isDisabled || false;\n const isRequired = required || formControl?.isRequired || false;\n\n // Determine value and error based on context priority\n let fieldValue: any;\n let fieldError: string | undefined;\n\n if (form && name) {\n // Using Form context\n fieldError = form.shouldShowError(name)\n ? form.getFieldError(name)\n : undefined;\n fieldValue =\n form.values[name] !== undefined\n ? form.values[name]\n : (externalValue ?? \"\");\n } else if (formControl) {\n // Using FormControl context (backwards compat)\n fieldError = formControl.error || externalError || validationError;\n fieldValue = formControl.value ?? externalValue;\n } else {\n // Standalone usage\n fieldError = externalError || validationError;\n fieldValue = externalValue;\n }\n\n /**\n * Built-in validation logic supporting:\n * - required\n * - minLength/maxLength\n * - min/max (for numbers)\n * - pattern (regex)\n * - email format\n * - URL format\n */\n const runBuiltInValidation = (value: string): string | undefined => {\n // Required validation\n if (isRequired && !value) {\n return errorMessages?.required || \"This field is required\";\n }\n\n if (value) {\n // Email validation (for type=\"email\")\n if (type === \"email\" && !value.includes(\"@\")) {\n return (\n errorMessages?.email || \"Please enter a valid email address\"\n );\n }\n\n // URL validation (for type=\"url\")\n if (type === \"url\") {\n try {\n new URL(value);\n } catch {\n return errorMessages?.url || \"Please enter a valid URL\";\n }\n }\n\n // Number range validation (for type=\"number\")\n if (type === \"number\") {\n const numValue = parseFloat(value);\n if (min !== undefined && numValue < Number(min)) {\n return errorMessages?.min || `Minimum value is ${min}`;\n }\n if (max !== undefined && numValue > Number(max)) {\n return errorMessages?.max || `Maximum value is ${max}`;\n }\n }\n\n // String length validations\n if (minLength !== undefined && value.length < minLength) {\n return (\n errorMessages?.minLength ||\n `Minimum length is ${minLength} characters`\n );\n }\n\n if (maxLength !== undefined && value.length > maxLength) {\n return (\n errorMessages?.maxLength ||\n `Maximum length is ${maxLength} characters`\n );\n }\n\n // Pattern validation\n if (pattern) {\n const regex =\n typeof pattern === \"string\" ? new RegExp(pattern) : pattern;\n if (!regex.test(value)) {\n return errorMessages?.pattern || \"Invalid format\";\n }\n }\n }\n\n return undefined;\n };\n\n /**\n * Run validation (built-in + custom)\n */\n const runValidation = async (value: string) => {\n // Run built-in validation first\n const builtInError = runBuiltInValidation(value);\n if (builtInError) {\n setValidationError(builtInError);\n onValidationError?.(builtInError);\n return;\n }\n\n // Run custom validation if provided\n if (validate) {\n const customError = await validate(value);\n setValidationError(customError);\n onValidationError?.(customError);\n return;\n }\n\n // No errors\n setValidationError(undefined);\n onValidationError?.(undefined);\n };\n\n /**\n * Register field with Form or FormControl on mount\n */\n useEffect(() => {\n if (form && name) {\n // Create validator function for Form registration\n const validator: ValidationFunction = async (value: string) => {\n // Built-in validation\n if (isRequired && !value) {\n return errorMessages?.required || \"This field is required\";\n }\n\n if (value) {\n // Type-specific validation\n if (type === \"email\" && !value.includes(\"@\")) {\n return (\n errorMessages?.email ||\n \"Please enter a valid email address\"\n );\n }\n\n if (type === \"url\") {\n try {\n new URL(value);\n } catch {\n return (\n errorMessages?.url || \"Please enter a valid URL\"\n );\n }\n }\n\n if (type === \"number\") {\n const numValue = parseFloat(value);\n if (min !== undefined && numValue < Number(min)) {\n return (\n errorMessages?.min || `Minimum value is ${min}`\n );\n }\n if (max !== undefined && numValue > Number(max)) {\n return (\n errorMessages?.max || `Maximum value is ${max}`\n );\n }\n }\n\n if (minLength !== undefined && value.length < minLength) {\n return (\n errorMessages?.minLength ||\n `Minimum length is ${minLength} characters`\n );\n }\n\n if (maxLength !== undefined && value.length > maxLength) {\n return (\n errorMessages?.maxLength ||\n `Maximum length is ${maxLength} characters`\n );\n }\n\n if (pattern) {\n const regex =\n typeof pattern === \"string\"\n ? new RegExp(pattern)\n : pattern;\n if (!regex.test(value)) {\n return errorMessages?.pattern || \"Invalid format\";\n }\n }\n }\n\n // Custom validation\n if (validate) {\n return await validate(value);\n }\n\n return undefined;\n };\n\n // Register with Form\n form.registerField(name, validator);\n return () => form.unregisterField(name);\n } else if (formControl) {\n // Register with FormControl (backwards compat)\n const element = internalRef.current;\n if (element) {\n formControl.registerControl(element);\n return () => formControl.unregisterControl(element);\n }\n }\n }, [\n form,\n formControl,\n name,\n isRequired,\n type,\n min,\n max,\n minLength,\n maxLength,\n pattern,\n validate,\n errorMessages,\n ]);\n\n /**\n * Handle change event\n * Updates Form/FormControl/standalone state\n */\n const handleChange = (value: string) => {\n if (form && name) {\n // Update Form context\n form.setFieldValue(name, value);\n } else if (formControl) {\n // Update FormControl (backwards compat)\n formControl.setValue(value);\n } else {\n // Standalone - run validation\n runValidation(value);\n }\n };\n\n /**\n * Handle blur event\n * Marks field as touched and triggers validation\n */\n const handleBlur = (value: string) => {\n if (form && name) {\n // Mark as touched in Form\n form.setFieldTouched(name, true);\n // Validate on blur\n form.validateField(name, value);\n } else if (formControl) {\n // Mark as touched in FormControl (backwards compat)\n formControl.setTouched(true);\n } else {\n // Standalone - run validation if value exists\n if (value) {\n runValidation(value);\n }\n }\n };\n\n // Determine if we should render label/error\n // If used within FormControl, don't render (FormControl handles it)\n // If used within Form, render everything (Form doesn't wrap controls)\n const shouldRenderLabel = !formControl;\n const shouldRenderError = !!fieldError && !formControl;\n\n return {\n fieldId,\n value: fieldValue,\n error: fieldError,\n isDisabled,\n isRequired,\n shouldRenderLabel,\n shouldRenderError,\n handleChange,\n handleBlur,\n internalRef,\n };\n}\n","\"use client\";\n\nimport {\n createContext,\n useContext,\n useState,\n useCallback,\n FormEvent,\n ReactNode,\n} from \"react\";\n\n// ============================================================================\n// TYPES & INTERFACES\n// ============================================================================\n\nexport interface FormState {\n values: Record<string, any>;\n errors: Record<string, string>;\n touched: Record<string, boolean>;\n isSubmitting: boolean;\n isSubmitted: boolean;\n}\n\nexport interface FormContextValue extends FormState {\n registerField: (name: string, validate?: ValidationFunction) => void;\n unregisterField: (name: string) => void;\n setFieldValue: (name: string, value: any) => void;\n setFieldTouched: (name: string, touched: boolean) => void;\n validateField: (name: string, value?: any) => Promise<void>;\n getFieldError: (name: string) => string | undefined;\n shouldShowError: (name: string) => boolean;\n}\n\nexport type ValidationFunction = (\n value: any\n) => string | undefined | Promise<string | undefined>;\n\ninterface FormProps {\n children: ReactNode;\n onSubmit: (values: Record<string, any>) => void | Promise<void>;\n className?: string;\n spacing?: \"none\" | \"dense\" | \"normal\";\n}\n\n// ============================================================================\n// CONTEXT\n// ============================================================================\n\nconst FormContext = createContext<FormContextValue | null>(null);\n\nexport function useFormContext() {\n const context = useContext(FormContext);\n if (!context) {\n throw new Error(\"Form components must be used within a Form component\");\n }\n return context;\n}\n\n// Hook for form controls to use (optional - only if within Form)\nexport function useForm() {\n return useContext(FormContext);\n}\n\n// ============================================================================\n// FORM COMPONENT\n// ============================================================================\n\nexport function Form({\n children,\n onSubmit,\n className,\n spacing = \"normal\",\n}: FormProps) {\n const spacingValues = {\n none: \"0\",\n dense: \"0.5rem\",\n normal: \"1rem\",\n };\n const [state, setState] = useState<FormState>({\n values: {},\n errors: {},\n touched: {},\n isSubmitting: false,\n isSubmitted: false,\n });\n\n // Store validation functions for each field\n const [validators] = useState<Map<string, ValidationFunction>>(new Map());\n\n const registerField = useCallback(\n (name: string, validate?: ValidationFunction) => {\n if (validate) {\n validators.set(name, validate);\n }\n // Don't initialize values here - let them be undefined until user interacts\n // This way we don't submit empty strings for untouched fields\n },\n [validators]\n );\n\n const unregisterField = useCallback(\n (name: string) => {\n validators.delete(name);\n // Don't update state here - it causes infinite loops\n // The field values will be cleaned up naturally on form reset/submit\n },\n [validators]\n );\n\n const setFieldValue = useCallback((name: string, value: any) => {\n setState((prev) => {\n // Clear error for this field when value changes\n const newErrors = { ...prev.errors };\n delete newErrors[name];\n\n return {\n ...prev,\n values: { ...prev.values, [name]: value },\n errors: newErrors,\n };\n });\n }, []);\n\n const setFieldTouched = useCallback((name: string, touched: boolean) => {\n setState((prev) => ({\n ...prev,\n touched: { ...prev.touched, [name]: touched },\n }));\n }, []);\n\n const getFieldError = useCallback(\n (name: string) => {\n return state.errors[name];\n },\n [state.errors]\n );\n\n const shouldShowError = useCallback(\n (name: string) => {\n // Show error if form is submitted OR if field is touched\n return (\n (state.isSubmitted || state.touched[name]) &&\n !!state.errors[name]\n );\n },\n [state.isSubmitted, state.touched, state.errors]\n );\n\n const validateFieldInternal = async (\n name: string,\n value: any\n ): Promise<string | undefined> => {\n const validator = validators.get(name);\n if (!validator) return undefined;\n\n try {\n const error = await validator(value);\n return error;\n } catch {\n return \"Validation error\";\n }\n };\n\n const validateField = useCallback(\n async (name: string, providedValue?: any) => {\n // Use provided value if explicitly passed (including undefined), otherwise get from state\n const value =\n arguments.length > 1 ? providedValue : state.values[name];\n const error = await validateFieldInternal(name, value);\n\n setState((prev) => {\n const newErrors = { ...prev.errors };\n if (error) {\n newErrors[name] = error;\n } else {\n delete newErrors[name];\n }\n return { ...prev, errors: newErrors };\n });\n },\n [state.values, validators]\n );\n\n const validateAllFields = async (): Promise<boolean> => {\n const errors: Record<string, string> = {};\n const validationPromises: Promise<void>[] = [];\n\n validators.forEach((_validator, name) => {\n const value = state.values[name];\n validationPromises.push(\n validateFieldInternal(name, value).then((error) => {\n if (error) {\n errors[name] = error;\n }\n })\n );\n });\n\n await Promise.all(validationPromises);\n\n setState((prev) => ({\n ...prev,\n errors,\n }));\n\n return Object.keys(errors).length === 0;\n };\n\n const handleSubmit = async (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n setState((prev) => ({\n ...prev,\n isSubmitting: true,\n isSubmitted: true,\n }));\n\n const isValid = await validateAllFields();\n\n if (isValid) {\n try {\n await onSubmit(state.values);\n } catch (error) {\n console.error(\"Form submission error:\", error);\n }\n }\n\n setState((prev) => ({\n ...prev,\n isSubmitting: false,\n }));\n };\n\n const contextValue: FormContextValue = {\n ...state,\n registerField,\n unregisterField,\n setFieldValue,\n setFieldTouched,\n validateField,\n getFieldError,\n shouldShowError,\n };\n\n return (\n <FormContext.Provider value={contextValue}>\n <form\n onSubmit={handleSubmit}\n className={className}\n noValidate\n style={{\n [\"--form-control-spacing\" as any]: spacingValues[spacing],\n }}\n >\n {children}\n </form>\n </FormContext.Provider>\n );\n}\n","\"use client\";\n\nimport {\n createContext,\n useContext,\n useState,\n useCallback,\n useId,\n useRef,\n ReactNode,\n cloneElement,\n isValidElement,\n Children,\n} from \"react\";\nimport { cn } from \"../lib/utils\";\n\n// ============================================================================\n// TYPES & INTERFACES\n// ============================================================================\n\nexport interface FormControlState {\n /** Whether the field has been modified from its initial value */\n isDirty: boolean;\n /** Whether the field has been interacted with (focused) */\n isTouched: boolean;\n /** Whether the field value passes validation */\n isValid: boolean;\n /** Whether the field is required */\n isRequired: boolean;\n /** Whether the field is disabled */\n isDisabled: boolean;\n /** Whether the field is currently being validated */\n isValidating: boolean;\n /** Error message if validation fails */\n error?: string;\n /** Current field value */\n value: any;\n}\n\nexport interface FormControlContextValue extends FormControlState {\n /** Unique ID for the field */\n fieldId: string;\n /** Name attribute for the field */\n name?: string;\n /** Register a control (input, select, etc.) with the form control */\n registerControl: (control: HTMLElement) => void;\n /** Unregister a control */\n unregisterControl: (control: HTMLElement) => void;\n /** Update the field value */\n setValue: (value: any) => void;\n /** Mark the field as touched */\n setTouched: (touched: boolean) => void;\n /** Set validation error */\n setError: (error?: string) => void;\n /** Trigger validation */\n validate: () => Promise<boolean>;\n}\n\n/** Props to inject into child component when using asChild or render props */\nexport interface FormFieldProps {\n id: string;\n name?: string;\n value: any;\n onChange: (e: any) => void;\n onBlur: () => void;\n disabled?: boolean;\n required?: boolean;\n \"aria-invalid\"?: boolean;\n \"aria-describedby\"?: string;\n}\n\nexport interface ValidationRule {\n /** Validation function that returns true if valid, false or error message if invalid */\n validate: (\n value: any,\n formData?: any\n ) => boolean | string | Promise<boolean | string>;\n /** Error message to display when validation fails */\n message?: string;\n}\n\nexport interface FormControlProps {\n /** The name attribute for the form field */\n name?: string;\n /** The default value for the field */\n defaultValue?: any;\n /** Controlled value */\n value?: any;\n /** Callback when value changes */\n onChange?: (value: any) => void;\n /** Callback when field is blurred */\n onBlur?: () => void;\n /** Whether the field is required (shows asterisk in label) */\n required?: boolean;\n /** Whether the field is disabled */\n disabled?: boolean;\n /** Error message to display */\n error?: string;\n /** Helper text to display below the field */\n helperText?: string;\n /** Validation rules */\n validate?:\n | ValidationRule\n | ValidationRule[]\n | ((value: any) => boolean | string | Promise<boolean | string>);\n /** Whether to validate on change */\n validateOnChange?: boolean;\n /** Whether to validate on blur */\n validateOnBlur?: boolean;\n /** Label for the field */\n label?: string;\n /** Additional CSS classes */\n className?: string;\n /**\n * Child components - can be:\n * 1. Component that uses useFormControl() hook\n * 2. Render function: (fieldProps) => ReactNode\n * 3. Single child element when using asChild\n */\n children:\n | ReactNode\n | ((props: FormFieldProps & FormControlState) => ReactNode);\n /**\n * When true, merges props into the child element instead of wrapping\n * Similar to Radix UI's asChild pattern\n */\n asChild?: boolean;\n}\n\n// ============================================================================\n// CONTEXT\n// ============================================================================\n\nconst FormControlContext = createContext<FormControlContextValue | null>(null);\n\nexport function useFormControlContext() {\n const context = useContext(FormControlContext);\n if (!context) {\n throw new Error(\n \"useFormControlContext must be used within a FormControl\"\n );\n }\n return context;\n}\n\n// Optional hook that returns null if not within FormControl (for flexible usage)\nexport function useFormControl() {\n return useContext(FormControlContext);\n}\n\n/**\n * Hook for creating custom form fields with full FormControl integration\n * Returns field props and state for easy integration\n *\n * @example\n * function CustomInput() {\n * const { fieldProps, state } = useFormField();\n * return (\n * <input\n * {...fieldProps}\n * className={state.error ? 'border-red-500' : 'border-(--color-border)'}\n * />\n * );\n * }\n */\nexport function useFormField() {\n const formControl = useFormControl();\n\n if (!formControl) {\n throw new Error(\"useFormField must be used within a FormControl\");\n }\n\n const fieldProps: FormFieldProps = {\n id: formControl.fieldId,\n name: formControl.name,\n value: formControl.value,\n onChange: (e: any) => {\n const newValue = e?.target?.value ?? e;\n formControl.setValue(newValue);\n },\n onBlur: () => {\n formControl.setTouched(true);\n },\n disabled: formControl.isDisabled,\n required: formControl.isRequired,\n \"aria-invalid\": !!formControl.error,\n \"aria-describedby\": formControl.error\n ? `${formControl.fieldId}-message`\n : undefined,\n };\n\n const state: FormControlState = {\n isDirty: formControl.isDirty,\n isTouched: formControl.isTouched,\n isValid: formControl.isValid,\n isRequired: formControl.isRequired,\n isDisabled: formControl.isDisabled,\n isValidating: formControl.isValidating,\n error: formControl.error,\n value: formControl.value,\n };\n\n return {\n fieldProps,\n state,\n /**\n * Helper to spread all field props at once\n * @example <input {...register()} />\n */\n register: () => fieldProps,\n /**\n * Direct access to form control methods\n */\n setValue: formControl.setValue,\n setTouched: formControl.setTouched,\n setError: formControl.setError,\n validate: formControl.validate,\n };\n}\n\n// ============================================================================\n// FORM CONTROL COMPONENT\n// ============================================================================\n\nexport function FormControl({\n name,\n defaultValue,\n value: controlledValue,\n onChange,\n onBlur,\n required = false,\n disabled = false,\n error: externalError,\n helperText,\n validate: validationRules,\n validateOnChange = true,\n validateOnBlur = true,\n label,\n className,\n children,\n asChild = false,\n}: FormControlProps) {\n const autoId = useId();\n // Use name as stable ID if provided, otherwise fallback to useId\n const stableFieldId = useRef<string | undefined>(undefined);\n if (!stableFieldId.current) {\n stableFieldId.current = name ? `field-${name}` : `field-${autoId}`;\n }\n const fieldId = stableFieldId.current;\n\n // State management\n const isControlled = controlledValue !== undefined;\n const [internalValue, setInternalValue] = useState(defaultValue ?? \"\");\n const [initialValue] = useState(defaultValue ?? \"\");\n const [isTouched, setIsTouched] = useState(false);\n const [internalError, setInternalError] = useState<string | undefined>();\n const [isValidating, setIsValidating] = useState(false);\n const [registeredControls] = useState<Set<HTMLElement>>(new Set());\n\n const currentValue = isControlled ? controlledValue : internalValue;\n const currentError = externalError || internalError;\n const isDirty = currentValue !== initialValue;\n const isValid = !currentError;\n\n // ========================================================================\n // VALIDATION\n // ========================================================================\n\n const runValidation = useCallback(\n async (valueToValidate: any): Promise<string | undefined> => {\n if (!validationRules) return undefined;\n\n // Required validation\n if (required) {\n if (\n valueToValidate === undefined ||\n valueToValidate === null ||\n valueToValidate === \"\"\n ) {\n return \"This field is required\";\n }\n // For arrays (checkboxes), ensure at least one selected\n if (\n Array.isArray(valueToValidate) &&\n valueToValidate.length === 0\n ) {\n return \"This field is required\";\n }\n }\n\n // Custom validation\n if (typeof validationRules === \"function\") {\n const result = await validationRules(valueToValidate);\n if (result === false) return \"Validation failed\";\n if (typeof result === \"string\") return result;\n return undefined;\n }\n\n // Validation rules array\n const rules = Array.isArray(validationRules)\n ? validationRules\n : [validationRules];\n for (const rule of rules) {\n const result = await rule.validate(valueToValidate);\n if (result === false) {\n return rule.message || \"Validation failed\";\n }\n if (typeof result === \"string\") {\n return result;\n }\n }\n\n return undefined;\n },\n [validationRules, required]\n );\n\n const validate = useCallback(async (): Promise<boolean> => {\n setIsValidating(true);\n const error = await runValidation(currentValue);\n setInternalError(error);\n setIsValidating(false);\n return !error;\n }, [currentValue, runValidation]);\n\n // ========================================================================\n // VALUE MANAGEMENT\n // ========================================================================\n\n const setValue = useCallback(\n (newValue: any) => {\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue);\n\n // Validate on change if enabled\n if (validateOnChange && isTouched) {\n runValidation(newValue).then(setInternalError);\n }\n },\n [isControlled, onChange, validateOnChange, isTouched, runValidation]\n );\n\n const setTouchedState = useCallback(\n (touched: boolean) => {\n setIsTouched(touched);\n if (touched) {\n onBlur?.();\n // Validate on blur if enabled\n if (validateOnBlur) {\n runValidation(currentValue).then(setInternalError);\n }\n }\n },\n [onBlur, validateOnBlur, currentValue, runValidation]\n );\n\n const setErrorState = useCallback((error?: string) => {\n setInternalError(error);\n }, []);\n\n // ========================================================================\n // CONTROL REGISTRATION\n // ========================================================================\n\n const registerControl = useCallback(\n (control: HTMLElement) => {\n registeredControls.add(control);\n },\n [registeredControls]\n );\n\n const unregisterControl = useCallback(\n (control: HTMLElement) => {\n registeredControls.delete(control);\n },\n [registeredControls]\n );\n\n // ========================================================================\n // CONTEXT VALUE\n // ========================================================================\n\n const contextValue: FormControlContextValue = {\n fieldId,\n name,\n value: currentValue,\n isDirty,\n isTouched,\n isValid,\n isRequired: required,\n isDisabled: disabled,\n isValidating,\n error: currentError,\n setValue,\n setTouched: setTouchedState,\n setError: setErrorState,\n validate,\n registerControl,\n unregisterControl,\n };\n\n // ========================================================================\n // RENDER HELPERS\n // ========================================================================\n\n // Props to inject into child when using asChild or render props\n const fieldProps: FormFieldProps = {\n id: fieldId,\n name,\n value: currentValue,\n onChange: (e: any) => {\n const newValue = e?.target?.value ?? e;\n setValue(newValue);\n },\n onBlur: () => {\n setTouchedState(true);\n },\n disabled: disabled,\n required: required,\n \"aria-invalid\": !!currentError,\n \"aria-describedby\": currentError\n ? `${fieldId}-message`\n : helperText\n ? `${fieldId}-helper`\n : undefined,\n };\n\n const stateProps: FormControlState = {\n isDirty,\n isTouched,\n isValid,\n isRequired: required,\n isDisabled: disabled,\n isValidating,\n error: currentError,\n value: currentValue,\n };\n\n // Render children based on type\n const renderChildren = () => {\n // Render function pattern\n if (typeof children === \"function\") {\n return children({ ...fieldProps, ...stateProps });\n }\n\n // asChild pattern - clone and merge props into single child\n if (asChild) {\n const child = Children.only(children);\n if (isValidElement(child)) {\n const childProps = child.props as any;\n return cloneElement(child, {\n ...fieldProps,\n ...childProps,\n // Merge onChange handlers\n onChange: (e: any) => {\n fieldProps.onChange(e);\n childProps.onChange?.(e);\n },\n onBlur: () => {\n fieldProps.onBlur();\n childProps.onBlur?.();\n },\n } as any);\n }\n }\n\n // Default: render children with context\n return children;\n };\n\n // ========================================================================\n // RENDER\n // ========================================================================\n\n return (\n <FormControlContext.Provider value={contextValue}>\n <div\n className={cn(\"flex flex-col w-full\", className)}\n data-disabled={disabled || undefined}\n data-error={!!currentError || undefined}\n data-dirty={isDirty || undefined}\n data-touched={isTouched || undefined}\n data-valid={isValid || undefined}\n >\n {/* Label */}\n {label && (\n <label\n htmlFor={fieldId}\n className=\"block text-small font-semibold mb-1\"\n style={{ color: \"var(--color-muted-foreground)\" }}\n >\n {label}\n {required && <span className=\"ml-1\">*</span>}\n </label>\n )}\n\n {/* Children (form controls) */}\n {renderChildren()}\n\n {/* Helper text or error message */}\n <div className=\"h-5 mt-1.5\">\n {(helperText || currentError) && (\n <p\n className={cn(\n \"text-small\",\n currentError\n ? \"text-(--color-error)\"\n : \"text-(--color-muted-foreground)\"\n )}\n id={`${fieldId}-message`}\n role={currentError ? \"alert\" : undefined}\n aria-live={currentError ? \"polite\" : undefined}\n >\n {currentError || helperText}\n </p>\n )}\n </div>\n </div>\n </FormControlContext.Provider>\n );\n}\n\n// ============================================================================\n// FORM CONTROL LABEL (for wrapping radio/checkbox)\n// ============================================================================\n\nexport interface FormControlLabelProps {\n /** The control element (checkbox, radio, switch) */\n control: ReactNode;\n /** Label text */\n label: ReactNode;\n /** Whether the control is disabled */\n disabled?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Label placement */\n labelPlacement?: \"start\" | \"end\" | \"top\" | \"bottom\";\n}\n\nexport function FormControlLabel({\n control,\n label,\n disabled = false,\n className,\n labelPlacement = \"end\",\n}: FormControlLabelProps) {\n const formControl = useFormControl();\n\n const placementStyles = {\n start: \"flex-row-reverse justify-end\",\n end: \"flex-row\",\n top: \"flex-col-reverse items-start\",\n bottom: \"flex-col items-start\",\n };\n\n const gapStyles = {\n start: \"gap-2\",\n end: \"gap-2\",\n top: \"gap-1\",\n bottom: \"gap-1\",\n };\n\n return (\n <div\n className={cn(\n \"inline-flex items-center\",\n placementStyles[labelPlacement],\n gapStyles[labelPlacement],\n disabled && \"opacity-50 cursor-not-allowed\",\n className\n )}\n data-disabled={disabled || formControl?.isDisabled || undefined}\n >\n {control}\n {label && (\n <span\n className={cn(\n \"text-small font-medium select-none\",\n disabled || formControl?.isDisabled\n ? \"cursor-not-allowed\"\n : \"cursor-pointer\"\n )}\n style={{ color: \"var(--checkbox-label-color)\" }}\n >\n {label}\n </span>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// FORM HELPER TEXT\n// ============================================================================\n\nexport interface FormHelperTextProps {\n children: ReactNode;\n error?: boolean;\n className?: string;\n}\n\nexport function FormHelperText({\n children,\n error = false,\n className,\n}: FormHelperTextProps) {\n const formControl = useFormControl();\n const isError = error || (formControl?.error && !formControl.isValid);\n\n return (\n <div className=\"h-5 mt-1.5\">\n <p\n className={cn(\n \"text-small\",\n isError\n ? \"text-(--color-error)\"\n : \"text-(--color-muted-foreground)\",\n className\n )}\n role={isError ? \"alert\" : undefined}\n aria-live={isError ? \"polite\" : undefined}\n >\n {children}\n </p>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useId, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { useForm, ValidationFunction } from \"./form\";\nimport { useFormControl } from \"./form-control\";\n\nexport interface TextareaProps extends Omit<\n React.TextareaHTMLAttributes<HTMLTextAreaElement>,\n \"rows\"\n> {\n /** Field name - required when used inside Form */\n name?: string;\n label?: string;\n error?: string;\n helperText?: string;\n fullWidth?: boolean;\n /** Custom validation function that returns error message or undefined if valid */\n validate?: ValidationFunction;\n /** Callback when validation error changes */\n onValidationError?: (error: string | undefined) => void;\n /** Custom error messages for built-in validations */\n errorMessages?: {\n required?: string;\n minLength?: string;\n maxLength?: string;\n };\n /** Number of visible text rows */\n rows?: number;\n /** Allow vertical resizing */\n resize?: \"none\" | \"vertical\" | \"horizontal\" | \"both\";\n /** Auto-resize to fit content */\n autoResize?: boolean;\n /** Show character count */\n showCharacterCount?: boolean;\n /** Maximum height when auto-resizing (in pixels) */\n maxHeight?: number;\n}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n className,\n name,\n label,\n error,\n helperText,\n fullWidth = false,\n id,\n onChange,\n onBlur,\n value: externalValue,\n validate,\n onValidationError,\n errorMessages,\n rows = 3,\n resize = \"vertical\",\n autoResize = false,\n showCharacterCount = false,\n maxHeight = 500,\n ...props\n },\n ref\n ) => {\n const autoId = useId();\n const form = useForm(); // New Form context\n const formControl = useFormControl(); // Old FormControl context (backwards compat)\n const internalRef = useRef<HTMLTextAreaElement>(null);\n const [validationError, setValidationError] = useState<\n string | undefined\n >();\n\n // Generate stable ID only once\n const stableId = useRef<string | undefined>(undefined);\n if (!stableId.current) {\n stableId.current =\n id || formControl?.fieldId || `textarea-${autoId}`;\n }\n\n // Priority: Form context > FormControl context > props\n const textareaId = stableId.current;\n const isDisabled = props.disabled || formControl?.isDisabled;\n const isRequired = props.required || formControl?.isRequired;\n\n // For error: check Form context first, then FormControl, then prop, then internal validation\n let textareaError: string | undefined;\n let textareaValue: React.TextareaHTMLAttributes<HTMLTextAreaElement>[\"value\"];\n\n if (form && name) {\n // Using new Form context\n textareaError = form.shouldShowError(name)\n ? form.getFieldError(name)\n : undefined;\n // Use empty string as default to keep textarea controlled, but form will only have value when user types\n textareaValue =\n form.values[name] !== undefined\n ? form.values[name]\n : (externalValue ?? \"\");\n } else if (formControl) {\n // Using old FormControl context (backwards compat)\n textareaError = formControl.error || error || validationError;\n textareaValue = formControl.value ?? externalValue;\n } else {\n // Standalone usage\n textareaError = error || validationError;\n textareaValue = externalValue;\n }\n\n // Character count\n const currentLength =\n typeof textareaValue === \"string\" ? textareaValue.length : 0;\n const maxLengthValue = props.maxLength;\n\n // Built-in validation\n const runBuiltInValidation = (value: string): string | undefined => {\n // Required validation\n if (isRequired && !value) {\n return errorMessages?.required || \"This field is required\";\n }\n\n if (value) {\n // MinLength validation\n if (\n props.minLength !== undefined &&\n value.length < props.minLength\n ) {\n return (\n errorMessages?.minLength ||\n `Minimum length is ${props.minLength} characters`\n );\n }\n\n // MaxLength validation\n if (\n props.maxLength !== undefined &&\n value.length > props.maxLength\n ) {\n return (\n errorMessages?.maxLength ||\n `Maximum length is ${props.maxLength} characters`\n );\n }\n }\n\n return undefined;\n };\n\n // Run validation (built-in + custom)\n const runValidation = async (value: string) => {\n // Run built-in validation first\n const builtInError = runBuiltInValidation(value);\n if (builtInError) {\n setValidationError(builtInError);\n onValidationError?.(builtInError);\n return;\n }\n\n // Run custom validation if provided\n if (validate) {\n const customError = await validate(value);\n setValidationError(customError);\n onValidationError?.(customError);\n return;\n }\n\n // No errors\n setValidationError(undefined);\n onValidationError?.(undefined);\n };\n\n // Auto-resize functionality\n const adjustHeight = () => {\n const textarea = internalRef.current;\n if (textarea && autoResize) {\n // Reset height to auto to get the correct scrollHeight\n textarea.style.height = \"auto\";\n // Set new height based on scrollHeight\n const newHeight = Math.min(textarea.scrollHeight, maxHeight);\n textarea.style.height = `${newHeight}px`;\n }\n };\n\n // Register with Form or FormControl on mount\n useEffect(() => {\n if (form && name) {\n // Register with new Form\n const validator: ValidationFunction = async (value: string) => {\n // Built-in validation\n if (isRequired && !value) {\n return (\n errorMessages?.required || \"This field is required\"\n );\n }\n\n if (value) {\n if (\n props.minLength !== undefined &&\n value.length < props.minLength\n ) {\n return (\n errorMessages?.minLength ||\n `Minimum length is ${props.minLength} characters`\n );\n }\n\n if (\n props.maxLength !== undefined &&\n value.length > props.maxLength\n ) {\n return (\n errorMessages?.maxLength ||\n `Maximum length is ${props.maxLength} characters`\n );\n }\n }\n\n // Custom validation\n if (validate) {\n return await validate(value);\n }\n\n return undefined;\n };\n\n form.registerField(name, validator);\n return () => form.unregisterField(name);\n } else if (formControl) {\n // Register with old FormControl (backwards compat)\n const textareaElement = internalRef.current;\n if (textareaElement) {\n formControl.registerControl(textareaElement as any);\n return () =>\n formControl.unregisterControl(textareaElement as any);\n }\n }\n }, [form, formControl, name]);\n\n // Adjust height on value change (for auto-resize)\n useEffect(() => {\n if (autoResize) {\n adjustHeight();\n }\n }, [textareaValue, autoResize]);\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value;\n\n if (form && name) {\n // Update Form context\n form.setFieldValue(name, newValue);\n } else if (formControl) {\n // Update FormControl (backwards compat)\n formControl.setValue(newValue);\n } else {\n // Standalone - run validation\n runValidation(newValue);\n }\n\n // Auto-resize if enabled\n if (autoResize) {\n adjustHeight();\n }\n\n // Call external onChange\n onChange?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n if (form && name) {\n // Mark as touched in Form\n form.setFieldTouched(name, true);\n // Validate on blur with current textarea value\n form.validateField(name, e.target.value);\n } else if (formControl) {\n // Mark as touched in FormControl (backwards compat)\n formControl.setTouched(true);\n } else {\n // Standalone - run validation\n if (e.target.value) {\n runValidation(e.target.value);\n }\n }\n\n // Call external onBlur\n onBlur?.(e);\n };\n\n // If used within FormControl, don't render label/error (FormControl handles it)\n // If used within Form, render everything (Form doesn't wrap controls)\n const shouldRenderLabel = label && !formControl;\n const shouldRenderError = textareaError && !formControl;\n\n // Resize classes\n const resizeClasses = {\n none: \"resize-none\",\n vertical: \"resize-y\",\n horizontal: \"resize-x\",\n both: \"resize\",\n };\n\n return (\n <div\n className={cn(\"flex flex-col\", fullWidth && \"w-full\")}\n style={{ marginBottom: \"var(--form-control-spacing)\" }}\n >\n <div className=\"flex items-center justify-between mb-1\">\n {shouldRenderLabel && (\n <label\n htmlFor={textareaId}\n className=\"block text-small font-semibold text-(--color-muted-foreground)\"\n >\n {label}\n {isRequired && <span className=\"ml-1\">*</span>}\n </label>\n )}\n {showCharacterCount && maxLengthValue && (\n <span className=\"text-small text-(--color-muted-foreground)\">\n {currentLength}/{maxLengthValue}\n </span>\n )}\n </div>\n\n <div className=\"relative\">\n <textarea\n ref={(node) => {\n // Handle both refs\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n (internalRef as any).current = node;\n }}\n id={textareaId}\n name={name}\n value={textareaValue}\n onChange={handleChange}\n onBlur={handleBlur}\n disabled={isDisabled}\n required={isRequired}\n rows={autoResize ? undefined : rows}\n aria-invalid={!!textareaError}\n aria-describedby={\n textareaError\n ? `${textareaId}-error`\n : helperText\n ? `${textareaId}-helper`\n : undefined\n }\n className={cn(\n \"w-full px-3 py-2 border rounded-md transition-colors\",\n \"text-(--color-foreground) placeholder-gray-400\",\n \"focus:outline-none\",\n \"disabled:bg-(--color-muted) disabled:cursor-not-allowed disabled:text-(--color-muted-foreground)\",\n textareaError\n ? \"border-(--color-error) focus:ring-2 focus:ring-(--color-error) focus:border-(--color-error) active:border-(--color-error)\"\n : \"border-(--color-border) focus:ring-2 focus:ring-(--color-primary)/30 focus:border-(--color-primary) active:border-(--color-primary)\",\n resizeClasses[resize],\n autoResize && \"overflow-hidden\",\n !autoResize && \"overflow-auto\",\n className\n )}\n style={\n autoResize\n ? {\n minHeight: `${rows * 1.5}em`,\n maxHeight: `${maxHeight}px`,\n }\n : undefined\n }\n {...props}\n />\n </div>\n\n <div className=\"h-5 mt-1.5\">\n {shouldRenderError && textareaError && (\n <p\n className=\"text-small text-error\"\n id={`${textareaId}-error`}\n role=\"alert\"\n >\n {textareaError}\n </p>\n )}\n\n {helperText && !textareaError && !formControl && (\n <p\n className=\"text-small text-(--color-muted-foreground)\"\n id={`${textareaId}-helper`}\n >\n {helperText}\n </p>\n )}\n </div>\n </div>\n );\n }\n);\n\nTextarea.displayName = \"Textarea\";\n\nexport { Textarea };\n","import React from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport interface CardProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"variant\" | \"accentColor\"\n> {\n variant?: \"default\" | \"bordered\" | \"elevated\" | \"accent\";\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\";\n hoverable?: boolean;\n accentColor?: string;\n}\n\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n (\n {\n className,\n variant = \"default\",\n padding = \"md\",\n hoverable = false,\n accentColor,\n children,\n ...props\n },\n ref\n ) => {\n const baseStyles = \"bg-(--color-background) rounded-lg\";\n\n const variants = {\n default: \"border border-(--color-border)\",\n bordered: \"border-2 border-(--color-border)\",\n elevated: \"shadow-md\",\n accent: \"border border-(--color-border) hover:border-(--color-primary) active:border-(--color-primary) transition-all duration-300 relative overflow-hidden group\",\n };\n\n const paddings = {\n none: \"\",\n sm: \"p-3\",\n md: \"p-4\",\n lg: \"p-6\",\n };\n\n const hoverStyles = hoverable\n ? \"hover:shadow-lg transition-shadow cursor-pointer\"\n : \"\";\n\n return (\n <div\n ref={ref}\n className={cn(\n baseStyles,\n variants[variant],\n paddings[padding],\n hoverStyles,\n className\n )}\n style={\n variant === \"accent\" && accentColor\n ? ({\n \"--card-accent-color\": accentColor,\n } as React.CSSProperties)\n : undefined\n }\n {...props}\n >\n {variant === \"accent\" && (\n <div\n className=\"absolute top-0 left-0 w-full h-1 bg-linear-to-r from-transparent via-current to-transparent opacity-0 group-hover:opacity-100 group-active:opacity-100 transition-opacity\"\n style={\n accentColor\n ? { color: accentColor }\n : { color: \"var(--color-primary)\" }\n }\n />\n )}\n {children}\n </div>\n );\n }\n);\n\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5\", className)}\n {...props}\n />\n));\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\n \"text-h4 font-semibold text-(--color-foreground)\",\n className\n )}\n {...props}\n />\n));\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-small text-(--color-muted-foreground)\", className)}\n {...props}\n />\n));\nCardDescription.displayName = \"CardDescription\";\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"pt-0\", className)} {...props} />\n));\nCardContent.displayName = \"CardContent\";\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center pt-4\", className)}\n {...props}\n />\n));\nCardFooter.displayName = \"CardFooter\";\n\nexport interface CardMediaProps extends React.HTMLAttributes<HTMLDivElement> {\n image?: string;\n video?: string;\n component?: \"img\" | \"video\" | \"div\";\n aspectRatio?: \"16/9\" | \"4/3\" | \"1/1\" | \"21/9\" | string;\n alt?: string;\n objectFit?: \"cover\" | \"contain\" | \"fill\" | \"none\" | \"scale-down\";\n}\n\nconst CardMedia = React.forwardRef<HTMLDivElement, CardMediaProps>(\n (\n {\n className,\n image,\n video,\n component = \"div\",\n aspectRatio = \"16/9\",\n alt = \"\",\n objectFit = \"cover\",\n style,\n ...props\n },\n ref\n ) => {\n const aspectRatioStyle = {\n aspectRatio,\n ...style,\n };\n\n const objectFitClass =\n objectFit === \"cover\"\n ? \"object-cover\"\n : objectFit === \"contain\"\n ? \"object-contain\"\n : objectFit === \"fill\"\n ? \"object-fill\"\n : objectFit === \"none\"\n ? \"object-none\"\n : \"object-scale-down\";\n\n if (component === \"img\" && image) {\n return (\n <img\n ref={ref as React.Ref<HTMLImageElement>}\n src={image}\n alt={alt}\n className={cn(\"w-full h-full\", objectFitClass, className)}\n style={aspectRatioStyle}\n {...(props as React.ImgHTMLAttributes<HTMLImageElement>)}\n />\n );\n }\n\n if (component === \"video\" && video) {\n return (\n <video\n ref={ref as React.Ref<HTMLVideoElement>}\n src={video}\n className={cn(\"w-full\", objectFitClass, className)}\n style={aspectRatioStyle}\n {...(props as React.VideoHTMLAttributes<HTMLVideoElement>)}\n />\n );\n }\n\n // Default: background image div\n return (\n <div\n ref={ref}\n className={cn(\"w-full bg-cover bg-center\", className)}\n style={{\n ...aspectRatioStyle,\n backgroundImage: image ? `url(${image})` : undefined,\n }}\n role={image ? \"img\" : undefined}\n aria-label={image ? alt : undefined}\n {...props}\n />\n );\n }\n);\nCardMedia.displayName = \"CardMedia\";\n\nexport interface CardActionsProps extends React.HTMLAttributes<HTMLDivElement> {\n disableSpacing?: boolean;\n position?: \"left\" | \"center\" | \"right\";\n}\n\nconst CardActions = React.forwardRef<HTMLDivElement, CardActionsProps>(\n (\n { className, disableSpacing = false, position = \"left\", ...props },\n ref\n ) => {\n const justifyContent = {\n left: \"justify-start\",\n center: \"justify-center\",\n right: \"justify-end\",\n }[position];\n\n const padding = {\n left: \"pl-4 pr-4 py-4\",\n center: \"px-4 py-4\",\n right: \"pl-4 pr-4 py-4\",\n }[position];\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex items-center\",\n justifyContent,\n !disableSpacing && `gap-2 ${padding}`,\n className\n )}\n {...props}\n />\n );\n }\n);\nCardActions.displayName = \"CardActions\";\n\nexport interface CardActionAreaProps extends React.HTMLAttributes<HTMLDivElement> {\n disabled?: boolean;\n}\n\nconst CardActionArea = React.forwardRef<HTMLDivElement, CardActionAreaProps>(\n ({ className, disabled = false, children, ...props }, ref) => (\n <div\n ref={ref}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n className={cn(\n \"cursor-pointer transition-colors\",\n \"hover:bg-(--color-muted) active:bg-(--color-muted)\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-blue-500\",\n disabled &&\n \"cursor-not-allowed opacity-50 hover:bg-transparent\",\n className\n )}\n aria-disabled={disabled}\n {...props}\n >\n {children}\n </div>\n )\n);\nCardActionArea.displayName = \"CardActionArea\";\n\nexport {\n Card,\n CardHeader,\n CardTitle,\n CardDescription,\n CardContent,\n CardFooter,\n CardMedia,\n CardActions,\n CardActionArea,\n};\n","import React from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n variant?: \"default\" | \"info\" | \"success\" | \"warning\" | \"error\";\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n}\n\nconst Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(\n (\n {\n className,\n variant = \"default\",\n size = \"md\",\n leftIcon,\n rightIcon,\n children,\n ...props\n },\n ref\n ) => {\n const baseStyles = \"inline-flex items-center font-medium rounded-full\";\n\n const variantStyles = {\n default: {\n backgroundColor: \"#e5e7eb\",\n color: \"#374151\",\n },\n info: {\n backgroundColor: \"var(--color-info-muted)\",\n color: \"var(--color-info-muted-foreground)\",\n },\n success: {\n backgroundColor: \"var(--color-success-muted)\",\n color: \"var(--color-success-muted-foreground)\",\n },\n warning: {\n backgroundColor: \"var(--color-warning-muted)\",\n color: \"var(--color-warning-muted-foreground)\",\n },\n error: {\n backgroundColor: \"var(--color-error-muted)\",\n color: \"var(--color-error-muted-foreground)\",\n },\n };\n\n const sizes = {\n xs: \"text-[0.625rem] px-1.5 py-0.5 gap-1\",\n sm: \"text-caption px-2 py-0.5 gap-1\",\n md: \"text-small px-2.5 py-1 gap-1.5\",\n lg: \"text-base px-3 py-1.5 gap-2\",\n xl: \"text-h4 px-3.5 py-2 gap-2\",\n };\n\n const iconSizes = {\n xs: \"w-2.5 h-2.5\",\n sm: \"w-3 h-3\",\n md: \"w-3.5 h-3.5\",\n lg: \"w-4 h-4\",\n xl: \"w-5 h-5\",\n };\n\n return (\n <span\n ref={ref}\n style={variantStyles[variant]}\n className={cn(baseStyles, sizes[size], className)}\n {...props}\n >\n {leftIcon && (\n <span\n className={cn(\n \"inline-flex items-center justify-center\",\n iconSizes[size]\n )}\n >\n {leftIcon}\n </span>\n )}\n {children}\n {rightIcon && (\n <span\n className={cn(\n \"inline-flex items-center justify-center\",\n iconSizes[size]\n )}\n >\n {rightIcon}\n </span>\n )}\n </span>\n );\n }\n);\n\nBadge.displayName = \"Badge\";\n\nexport { Badge };\n","\"use client\";\n\nimport React, { useId, useState, useRef, useEffect } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { useForm, ValidationFunction } from \"./form\";\n\ninterface CheckboxProps {\n label?: string;\n name?: string;\n checked?: boolean;\n onChange?: (checked: boolean) => void;\n disabled?: boolean;\n className?: string;\n id?: string;\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n required?: boolean;\n /** Custom validation function that returns error message or undefined if valid */\n validate?: ValidationFunction;\n /** Callback when validation error changes */\n onValidationError?: (error: string | undefined) => void;\n /** Custom error message for required validation */\n errorMessage?: string;\n}\n\nexport function Checkbox({\n label,\n name,\n checked: externalChecked = false,\n onChange,\n disabled = false,\n className,\n id,\n size = \"sm\",\n required = false,\n validate,\n onValidationError,\n errorMessage,\n}: CheckboxProps) {\n const form = useForm();\n const autoId = useId();\n const stableId = useRef<string | undefined>(undefined);\n if (!stableId.current) {\n stableId.current = id || `checkbox-${autoId}`;\n }\n const checkboxId = stableId.current;\n const [validationError, setValidationError] = useState<\n string | undefined\n >();\n\n // Determine checked state and error\n let checked: boolean;\n let displayError: string | undefined;\n\n if (form && name) {\n // Using Form context\n checked = form.values[name] ?? externalChecked;\n displayError = form.shouldShowError(name)\n ? form.getFieldError(name)\n : undefined;\n } else {\n // Standalone usage\n checked = externalChecked;\n displayError = validationError;\n }\n\n // Built-in validation\n const runBuiltInValidation = (isChecked: boolean): string | undefined => {\n if (required && !isChecked) {\n return errorMessage || \"This field is required\";\n }\n return undefined;\n };\n\n // Register with Form\n useEffect(() => {\n if (form && name) {\n const validator: ValidationFunction = async (val: boolean) => {\n if (required && !val) {\n return errorMessage || \"This field is required\";\n }\n\n if (validate) {\n return await validate(val);\n }\n\n return undefined;\n };\n\n form.registerField(name, validator);\n return () => form.unregisterField(name);\n }\n }, [form, name]);\n\n // Run validation (standalone mode only)\n const runValidation = async (isChecked: boolean) => {\n // Run built-in validation first\n const builtInError = runBuiltInValidation(isChecked);\n if (builtInError) {\n setValidationError(builtInError);\n onValidationError?.(builtInError);\n return;\n }\n\n // Run custom validation if provided\n if (validate) {\n const customError = await validate(isChecked);\n setValidationError(customError);\n onValidationError?.(customError);\n return;\n }\n\n // No errors\n setValidationError(undefined);\n onValidationError?.(undefined);\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const isChecked = e.target.checked;\n\n if (form && name) {\n // Update Form context\n form.setFieldValue(name, isChecked);\n form.setFieldTouched(name, true);\n // Validate on change for checkbox (immediate feedback with new value)\n form.validateField(name, isChecked);\n } else {\n // Standalone mode\n runValidation(isChecked);\n onChange?.(isChecked);\n }\n };\n\n const containerGapStyles = {\n xs: \"gap-2\",\n sm: \"gap-2\",\n md: \"gap-2\",\n lg: \"gap-2\",\n xl: \"gap-2\",\n };\n\n return (\n <div className={cn(\"flex flex-col\", className)}>\n <div className={cn(\"flex items-center\", containerGapStyles[size])}>\n <div className=\"relative group/checkbox flex items-center shrink-0\">\n <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 pointer-events-none\">\n <div\n className=\"rounded-full scale-0 group-hover/checkbox:scale-100 group-active/checkbox:scale-100 transition-transform duration-200 ease-out\"\n style={{\n width:\n size === \"xs\"\n ? \"1.75rem\"\n : size === \"sm\"\n ? \"2rem\"\n : size === \"lg\"\n ? \"2.5rem\"\n : size === \"xl\"\n ? \"3rem\"\n : \"2.25rem\",\n height:\n size === \"xs\"\n ? \"1.75rem\"\n : size === \"sm\"\n ? \"2rem\"\n : size === \"lg\"\n ? \"2.5rem\"\n : size === \"xl\"\n ? \"3rem\"\n : \"2.25rem\",\n backgroundColor: \"var(--checkbox-hover-bg)\",\n }}\n />\n </div>\n <input\n type=\"checkbox\"\n id={checkboxId}\n checked={checked}\n onChange={handleChange}\n disabled={disabled}\n className={cn(\n \"rounded focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 transition-all relative z-10\",\n disabled && \"cursor-not-allowed\"\n )}\n style={{\n width:\n size === \"xs\"\n ? \"var(--checkbox-size-xs)\"\n : size === \"sm\"\n ? \"var(--checkbox-size-sm)\"\n : size === \"lg\"\n ? \"var(--checkbox-size-lg)\"\n : size === \"xl\"\n ? \"var(--checkbox-size-xl)\"\n : \"var(--checkbox-size-md)\",\n height:\n size === \"xs\"\n ? \"var(--checkbox-size-xs)\"\n : size === \"sm\"\n ? \"var(--checkbox-size-sm)\"\n : size === \"lg\"\n ? \"var(--checkbox-size-lg)\"\n : size === \"xl\"\n ? \"var(--checkbox-size-xl)\"\n : \"var(--checkbox-size-md)\",\n borderColor: \"var(--color-border)\",\n backgroundColor: \"var(--color-muted)\",\n accentColor: \"var(--color-primary)\",\n opacity: disabled\n ? \"var(--checkbox-disabled-opacity)\"\n : undefined,\n }}\n />\n </div>\n {label && (\n <label\n htmlFor={checkboxId}\n className={cn(\n \"font-medium\",\n disabled && \"cursor-not-allowed\",\n !disabled && \"cursor-pointer\"\n )}\n style={{\n fontSize:\n size === \"xs\"\n ? \"var(--checkbox-label-font-size-xs)\"\n : size === \"sm\"\n ? \"var(--checkbox-label-font-size-sm)\"\n : size === \"lg\"\n ? \"var(--checkbox-label-font-size-lg)\"\n : size === \"xl\"\n ? \"var(--checkbox-label-font-size-xl)\"\n : \"var(--checkbox-label-font-size-md)\",\n color: \"var(--color-muted-foreground)\",\n opacity: disabled\n ? \"var(--checkbox-disabled-opacity)\"\n : undefined,\n }}\n >\n {label}\n {required && <span className=\"ml-1\">*</span>}\n </label>\n )}\n </div>\n <div className=\"h-5 mt-1.5\">\n {displayError && (\n <p className=\"text-small text-(--color-error)\" role=\"alert\">\n {displayError}\n </p>\n )}\n </div>\n </div>\n );\n}\n\ninterface CheckboxOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\ninterface CheckboxGroupProps {\n label?: string;\n name: string;\n options: CheckboxOption[];\n value?: string[];\n onChange?: (value: string[]) => void;\n className?: string;\n orientation?: \"vertical\" | \"horizontal\";\n required?: boolean;\n disabled?: boolean;\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n error?: string;\n helperText?: string;\n validate?: ValidationFunction;\n}\n\nexport function CheckboxGroup({\n label,\n name,\n options,\n value: externalValue,\n onChange: externalOnChange,\n className,\n orientation = \"vertical\",\n required = false,\n disabled = false,\n size = \"sm\",\n error: externalError,\n helperText,\n validate,\n}: CheckboxGroupProps) {\n const form = useForm();\n\n // Integrate with Form if available\n React.useEffect(() => {\n if (form && name) {\n const validator =\n validate ||\n (required\n ? (value: string[]) => {\n if (!value || value.length === 0) {\n return `${label || name} is required`;\n }\n return undefined;\n }\n : undefined);\n\n form.registerField(name, validator);\n return () => form.unregisterField(name);\n }\n }, [form, name, validate, required, label]);\n\n const value = form\n ? (form.values[name] as string[]) || []\n : externalValue || [];\n const error = form ? form.errors[name] : externalError;\n\n const handleChange = (optionValue: string, checked: boolean) => {\n const newValue = checked\n ? [...value, optionValue]\n : value.filter((v) => v !== optionValue);\n\n if (form) {\n form.setFieldValue(name, newValue);\n form.validateField(name, newValue);\n }\n\n if (externalOnChange) {\n externalOnChange(newValue);\n }\n };\n\n const containerGapStyles = {\n xs: \"gap-2\",\n sm: \"gap-2\",\n md: \"gap-2\",\n lg: \"gap-2\",\n xl: \"gap-2\",\n };\n\n return (\n <div\n className={className}\n style={{ marginBottom: \"var(--form-control-spacing)\" }}\n >\n {label && (\n <label\n className=\"block text-small font-semibold mb-1\"\n style={{ color: \"var(--color-muted-foreground)\" }}\n >\n {label}\n {required && <span className=\"ml-1\">*</span>}\n </label>\n )}\n <div\n className={cn(\n orientation === \"horizontal\"\n ? \"flex flex-wrap items-center gap-4\"\n : \"space-y-2\"\n )}\n >\n {options.map((option) => {\n const isDisabled = disabled || option.disabled;\n return (\n <div\n key={option.value}\n className={cn(\n \"flex items-center\",\n containerGapStyles[size]\n )}\n >\n <div className=\"relative group/checkbox flex items-center shrink-0\">\n <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 pointer-events-none\">\n <div\n className=\"rounded-full scale-0 group-hover/checkbox:scale-100 group-active/checkbox:scale-100 transition-transform duration-200 ease-out\"\n style={{\n width:\n size === \"xs\"\n ? \"1.75rem\"\n : size === \"sm\"\n ? \"2rem\"\n : size === \"lg\"\n ? \"2.5rem\"\n : size === \"xl\"\n ? \"3rem\"\n : \"2.25rem\",\n height:\n size === \"xs\"\n ? \"1.75rem\"\n : size === \"sm\"\n ? \"2rem\"\n : size === \"lg\"\n ? \"2.5rem\"\n : size === \"xl\"\n ? \"3rem\"\n : \"2.25rem\",\n backgroundColor:\n \"var(--checkbox-hover-bg)\",\n }}\n />\n </div>\n <input\n type=\"checkbox\"\n id={`${name}-${option.value}`}\n name={name}\n value={option.value}\n checked={value.includes(option.value)}\n onChange={(e) =>\n handleChange(\n option.value,\n e.target.checked\n )\n }\n disabled={isDisabled}\n className={cn(\n \"rounded focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 transition-all relative z-10\",\n isDisabled && \"cursor-not-allowed\"\n )}\n style={{\n width:\n size === \"xs\"\n ? \"var(--checkbox-size-xs)\"\n : size === \"sm\"\n ? \"var(--checkbox-size-sm)\"\n : size === \"lg\"\n ? \"var(--checkbox-size-lg)\"\n : size === \"xl\"\n ? \"var(--checkbox-size-xl)\"\n : \"var(--checkbox-size-md)\",\n height:\n size === \"xs\"\n ? \"var(--checkbox-size-xs)\"\n : size === \"sm\"\n ? \"var(--checkbox-size-sm)\"\n : size === \"lg\"\n ? \"var(--checkbox-size-lg)\"\n : size === \"xl\"\n ? \"var(--checkbox-size-xl)\"\n : \"var(--checkbox-size-md)\",\n borderColor: \"var(--color-border)\",\n backgroundColor: \"var(--color-muted)\",\n accentColor: \"var(--color-primary)\",\n opacity: isDisabled\n ? \"var(--checkbox-disabled-opacity)\"\n : undefined,\n }}\n />\n </div>\n <label\n htmlFor={`${name}-${option.value}`}\n className={cn(\n \"font-medium\",\n isDisabled && \"cursor-not-allowed\",\n !isDisabled && \"cursor-pointer\"\n )}\n style={{\n fontSize:\n size === \"xs\"\n ? \"var(--checkbox-label-font-size-xs)\"\n : size === \"sm\"\n ? \"var(--checkbox-label-font-size-sm)\"\n : size === \"lg\"\n ? \"var(--checkbox-label-font-size-lg)\"\n : size === \"xl\"\n ? \"var(--checkbox-label-font-size-xl)\"\n : \"var(--checkbox-label-font-size-md)\",\n color: \"var(--color-muted-foreground)\",\n opacity: isDisabled\n ? \"var(--checkbox-disabled-opacity)\"\n : undefined,\n }}\n >\n {option.label}\n </label>\n </div>\n );\n })}\n </div>\n <div className=\"h-5 mt-1.5\">\n {(error || helperText) && (\n <p\n className={`text-small ${error ? \"text-(--color-error)\" : \"text-(--color-muted-foreground)\"}`}\n role={error ? \"alert\" : undefined}\n >\n {error || helperText}\n </p>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { useForm, ValidationFunction } from \"./form\";\n\ninterface RadioOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\ninterface RadioGroupProps {\n label?: string;\n name: string;\n options: RadioOption[];\n value?: string;\n onChange?: (value: string) => void;\n className?: string;\n orientation?: \"vertical\" | \"horizontal\";\n required?: boolean;\n disabled?: boolean;\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n error?: string;\n helperText?: string;\n errorMessage?: string;\n validate?: ValidationFunction;\n}\n\nexport function RadioGroup({\n label,\n name,\n options,\n value: externalValue,\n onChange,\n className,\n orientation = \"vertical\",\n required = false,\n disabled = false,\n size = \"sm\",\n error,\n helperText,\n errorMessage,\n validate,\n}: RadioGroupProps) {\n const form = useForm();\n const [validationError, setValidationError] = useState<\n string | undefined\n >();\n const [touched, setTouched] = useState(false);\n\n // Determine value source\n let value: string | undefined;\n let displayError: string | undefined;\n\n if (form && name) {\n // Using Form context\n value = form.values[name] ?? externalValue;\n displayError = form.shouldShowError(name)\n ? form.getFieldError(name)\n : undefined;\n } else {\n // Standalone usage\n value = externalValue;\n displayError = error || validationError;\n }\n\n // Register with Form\n useEffect(() => {\n if (form && name) {\n const validator: ValidationFunction = async (val: string) => {\n if (required && !val) {\n return errorMessage || \"Please select an option\";\n }\n if (validate) {\n return await validate(val);\n }\n return undefined;\n };\n\n form.registerField(name, validator);\n return () => form.unregisterField(name);\n }\n }, [form, name]);\n\n // Validate on value change if touched (standalone mode only)\n useEffect(() => {\n if (!form && touched && required && !value) {\n setValidationError(errorMessage || \"Please select an option\");\n } else if (!form) {\n setValidationError(undefined);\n }\n }, [value, touched, required, errorMessage, form]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n\n if (form && name) {\n // Update Form context\n form.setFieldValue(name, newValue);\n form.setFieldTouched(name, true);\n // Validate on change for radio (immediate feedback with new value)\n form.validateField(name, newValue);\n } else {\n // Standalone mode\n setTouched(true);\n onChange?.(newValue);\n }\n };\n\n const containerGapStyles = {\n xs: \"gap-2\",\n sm: \"gap-2\",\n md: \"gap-2\",\n lg: \"gap-2\",\n xl: \"gap-2\",\n };\n\n return (\n <div\n className={className}\n style={{ marginBottom: \"var(--form-control-spacing)\" }}\n >\n {label && (\n <label\n className=\"block text-small font-semibold mb-1\"\n style={{ color: \"var(--color-muted-foreground)\" }}\n >\n {label}\n {required && <span className=\"ml-1\">*</span>}\n </label>\n )}\n <div\n className={cn(\n orientation === \"vertical\" && \"space-y-2\",\n orientation === \"horizontal\" && \"flex flex-wrap gap-4\"\n )}\n >\n {options.map((option) => {\n const isDisabled = disabled || option.disabled;\n return (\n <div\n key={option.value}\n className={cn(\n \"flex items-center\",\n containerGapStyles[size]\n )}\n >\n <div className=\"relative group/radio flex items-center shrink-0\">\n <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 pointer-events-none\">\n <div\n className=\"rounded-full scale-0 group-hover/radio:scale-100 group-active/radio:scale-100 transition-transform duration-200 ease-out\"\n style={{\n width:\n size === \"xs\"\n ? \"1.75rem\"\n : size === \"sm\"\n ? \"2rem\"\n : size === \"lg\"\n ? \"2.5rem\"\n : size === \"xl\"\n ? \"3rem\"\n : \"2.25rem\",\n height:\n size === \"xs\"\n ? \"1.75rem\"\n : size === \"sm\"\n ? \"2rem\"\n : size === \"lg\"\n ? \"2.5rem\"\n : size === \"xl\"\n ? \"3rem\"\n : \"2.25rem\",\n backgroundColor:\n \"var(--radio-hover-bg)\",\n }}\n />\n </div>\n <input\n type=\"radio\"\n id={`${name}-${option.value}`}\n name={name}\n value={option.value}\n checked={value === option.value}\n onChange={handleChange}\n disabled={isDisabled}\n className={cn(\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 transition-all relative z-10 rounded-full\",\n isDisabled && \"cursor-not-allowed\"\n )}\n style={{\n width:\n size === \"xs\"\n ? \"var(--radio-size-xs)\"\n : size === \"sm\"\n ? \"var(--radio-size-sm)\"\n : size === \"lg\"\n ? \"var(--radio-size-lg)\"\n : size === \"xl\"\n ? \"var(--radio-size-xl)\"\n : \"var(--radio-size-md)\",\n height:\n size === \"xs\"\n ? \"var(--radio-size-xs)\"\n : size === \"sm\"\n ? \"var(--radio-size-sm)\"\n : size === \"lg\"\n ? \"var(--radio-size-lg)\"\n : size === \"xl\"\n ? \"var(--radio-size-xl)\"\n : \"var(--radio-size-md)\",\n borderColor: \"var(--color-border)\",\n backgroundColor: \"var(--color-muted)\",\n accentColor: \"var(--color-primary)\",\n opacity: isDisabled\n ? \"var(--radio-disabled-opacity)\"\n : undefined,\n }}\n />\n </div>\n <label\n htmlFor={`${name}-${option.value}`}\n className={cn(\n \"font-medium\",\n isDisabled && \"cursor-not-allowed\",\n !isDisabled && \"cursor-pointer\"\n )}\n style={{\n fontSize:\n size === \"xs\"\n ? \"var(--radio-label-font-size-xs)\"\n : size === \"sm\"\n ? \"var(--radio-label-font-size-sm)\"\n : size === \"lg\"\n ? \"var(--radio-label-font-size-lg)\"\n : size === \"xl\"\n ? \"var(--radio-label-font-size-xl)\"\n : \"var(--radio-label-font-size-md)\",\n color: \"var(--color-muted-foreground)\",\n opacity: isDisabled\n ? \"var(--radio-disabled-opacity)\"\n : undefined,\n }}\n >\n {option.label}\n </label>\n </div>\n );\n })}\n </div>\n <div className=\"h-5 mt-1.5\">\n {(displayError || helperText) && (\n <p\n className={`text-small ${displayError ? \"text-(--color-error)\" : \"text-(--color-muted-foreground)\"}`}\n role={displayError ? \"alert\" : undefined}\n >\n {displayError || helperText}\n </p>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { ChevronDown, X } from \"lucide-react\";\nimport { useState, useRef, useEffect, ReactNode } from \"react\";\nimport { useForm, ValidationFunction } from \"./form\";\n\nexport interface SelectOption {\n value: string | number;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps {\n /**\n * Field name - required when used inside Form\n */\n name?: string;\n /**\n * Label text displayed above the select\n */\n label?: string;\n /**\n * Placeholder text when no option is selected\n */\n placeholder?: string;\n /**\n * Array of options for the select\n */\n options?: SelectOption[];\n /**\n * Current selected value\n */\n value?: string | number;\n /**\n * Callback when selection changes\n */\n onChange?: (value: string | number) => void;\n /**\n * Custom content to render in the select menu (overrides options)\n */\n children?: ReactNode;\n /**\n * Disable the select\n */\n disabled?: boolean;\n /**\n * Error message to display\n */\n error?: string;\n /**\n * Helper text to display below the select\n */\n helperText?: string;\n /**\n * Mark the field as required\n */\n required?: boolean;\n /**\n * Size of the select\n */\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n /**\n * Additional CSS classes\n */\n className?: string;\n /**\n * Custom validation function that returns error message or undefined if valid\n */\n validate?: ValidationFunction;\n /**\n * Callback when validation error changes\n */\n onValidationError?: (error: string | undefined) => void;\n /**\n * Custom error message for required validation\n */\n errorMessage?: string;\n}\n\nexport function Select({\n name,\n label,\n placeholder = \"Select an option\",\n options = [],\n value: externalValue,\n onChange,\n children,\n disabled = false,\n error,\n helperText,\n required = false,\n size = \"md\",\n className = \"\",\n validate,\n onValidationError: _onValidationError,\n errorMessage,\n}: SelectProps) {\n const form = useForm();\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const [validationError, _setValidationError] = useState<\n string | undefined\n >();\n const [focusedIndex, setFocusedIndex] = useState<number>(-1);\n const [searchString, setSearchString] = useState<string>(\"\");\n const searchTimeoutRef = useRef<NodeJS.Timeout>();\n\n // Determine value and error from Form context or props\n let value: string | number | undefined;\n let displayError: string | undefined;\n\n if (form && name) {\n // Using Form context\n value = form.values[name] ?? externalValue;\n displayError = form.shouldShowError(name)\n ? form.getFieldError(name)\n : undefined;\n } else {\n // Standalone usage\n value = externalValue;\n displayError = error || validationError;\n }\n\n // Register with Form\n useEffect(() => {\n if (form && name) {\n const validator: ValidationFunction = async (val: any) => {\n if (\n required &&\n (val === undefined || val === null || val === \"\")\n ) {\n return errorMessage || \"Please select an option\";\n }\n if (validate) {\n return await validate(val);\n }\n return undefined;\n };\n\n form.registerField(name, validator);\n return () => form.unregisterField(name);\n }\n }, [form, name, required, validate, errorMessage]);\n\n // Get the display text for the selected value\n const getSelectedLabel = () => {\n if (!value) return placeholder;\n const selected = options.find((opt) => opt.value === value);\n return selected ? selected.label : placeholder;\n };\n\n const sizeStyles = {\n xs: `[padding-left:var(--dropdown-padding-xs-x)] [padding-right:var(--dropdown-padding-xs-x)] [padding-top:var(--dropdown-padding-xs-y)] [padding-bottom:var(--dropdown-padding-xs-y)] [font-size:var(--dropdown-font-size-xs)]`,\n sm: `[padding-left:var(--dropdown-padding-sm-x)] [padding-right:var(--dropdown-padding-sm-x)] [padding-top:var(--dropdown-padding-sm-y)] [padding-bottom:var(--dropdown-padding-sm-y)] [font-size:var(--dropdown-font-size-sm)]`,\n md: `[padding-left:var(--dropdown-padding-md-x)] [padding-right:var(--dropdown-padding-md-x)] [padding-top:var(--dropdown-padding-md-y)] [padding-bottom:var(--dropdown-padding-md-y)] [font-size:var(--dropdown-font-size-md)]`,\n lg: `[padding-left:var(--dropdown-padding-lg-x)] [padding-right:var(--dropdown-padding-lg-x)] [padding-top:var(--dropdown-padding-lg-y)] [padding-bottom:var(--dropdown-padding-lg-y)] [font-size:var(--dropdown-font-size-lg)]`,\n xl: `[padding-left:var(--dropdown-padding-xl-x)] [padding-right:var(--dropdown-padding-xl-x)] [padding-top:var(--dropdown-padding-xl-y)] [padding-bottom:var(--dropdown-padding-xl-y)] [font-size:var(--dropdown-font-size-xl)]`,\n };\n\n const iconSizeStyles = {\n xs: `[width:var(--dropdown-icon-size-xs)] [height:var(--dropdown-icon-size-xs)]`,\n sm: `[width:var(--dropdown-icon-size-sm)] [height:var(--dropdown-icon-size-sm)]`,\n md: `[width:var(--dropdown-icon-size-md)] [height:var(--dropdown-icon-size-md)]`,\n lg: `[width:var(--dropdown-icon-size-lg)] [height:var(--dropdown-icon-size-lg)]`,\n xl: `[width:var(--dropdown-icon-size-xl)] [height:var(--dropdown-icon-size-xl)]`,\n };\n\n const optionSizeStyles = {\n xs: `[padding-left:var(--dropdown-option-padding-xs-x)] [padding-right:var(--dropdown-option-padding-xs-x)] [padding-top:var(--dropdown-option-padding-xs-y)] [padding-bottom:var(--dropdown-option-padding-xs-y)] [font-size:var(--dropdown-option-font-size-xs)]`,\n sm: `[padding-left:var(--dropdown-option-padding-sm-x)] [padding-right:var(--dropdown-option-padding-sm-x)] [padding-top:var(--dropdown-option-padding-sm-y)] [padding-bottom:var(--dropdown-option-padding-sm-y)] [font-size:var(--dropdown-option-font-size-sm)]`,\n md: `[padding-left:var(--dropdown-option-padding-md-x)] [padding-right:var(--dropdown-option-padding-md-x)] [padding-top:var(--dropdown-option-padding-md-y)] [padding-bottom:var(--dropdown-option-padding-md-y)] [font-size:var(--dropdown-option-font-size-md)]`,\n lg: `[padding-left:var(--dropdown-option-padding-lg-x)] [padding-right:var(--dropdown-option-padding-lg-x)] [padding-top:var(--dropdown-option-padding-lg-y)] [padding-bottom:var(--dropdown-option-padding-lg-y)] [font-size:var(--dropdown-option-font-size-lg)]`,\n xl: `[padding-left:var(--dropdown-option-padding-xl-x)] [padding-right:var(--dropdown-option-padding-xl-x)] [padding-top:var(--dropdown-option-padding-xl-y)] [padding-bottom:var(--dropdown-option-padding-xl-y)] [font-size:var(--dropdown-option-font-size-xl)]`,\n };\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () =>\n document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n const handleSelect = (optionValue: string | number) => {\n if (form && name) {\n // Update Form context\n form.setFieldValue(name, optionValue);\n form.setFieldTouched(name, true);\n // Validate on change for select (immediate feedback with new value)\n form.validateField(name, optionValue);\n } else {\n // Standalone mode\n onChange?.(optionValue);\n }\n setIsOpen(false);\n // Refocus the trigger button to maintain focus\n setTimeout(() => triggerRef.current?.focus(), 0);\n };\n\n const handleClear = async (e: React.MouseEvent) => {\n e.stopPropagation();\n if (form && name) {\n // Update Form context\n form.setFieldValue(name, undefined);\n form.setFieldTouched(name, true);\n // Validate with empty value (await to ensure it runs after state update)\n await form.validateField(name, undefined);\n } else {\n // Standalone mode\n onChange?.(undefined as any);\n }\n setIsOpen(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) return;\n\n // Open/close dropdown\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n const currentIndex = options.findIndex(\n (opt) => opt.value === value\n );\n setFocusedIndex(currentIndex);\n } else if (focusedIndex >= 0 && focusedIndex < options.length) {\n handleSelect(options[focusedIndex].value);\n }\n } else if (e.key === \"Escape\") {\n setIsOpen(false);\n setFocusedIndex(-1);\n }\n // Arrow navigation\n else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n if (!isOpen) {\n // When closed, navigate to next option and change value (like native select)\n const currentIndex = options.findIndex(\n (opt) => opt.value === value\n );\n const nextIndex =\n currentIndex < options.length - 1\n ? currentIndex + 1\n : currentIndex;\n if (nextIndex !== currentIndex && options[nextIndex]) {\n handleSelect(options[nextIndex].value);\n } else if (currentIndex === -1 && options.length > 0) {\n // No value selected, select first option\n handleSelect(options[0].value);\n }\n } else {\n // When open, just navigate focus\n setFocusedIndex((prev) =>\n prev < options.length - 1 ? prev + 1 : prev\n );\n }\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n if (!isOpen) {\n // When closed, navigate to previous option and change value (like native select)\n const currentIndex = options.findIndex(\n (opt) => opt.value === value\n );\n const prevIndex =\n currentIndex > 0 ? currentIndex - 1 : currentIndex;\n if (prevIndex !== currentIndex && options[prevIndex]) {\n handleSelect(options[prevIndex].value);\n }\n } else {\n // When open, just navigate focus\n setFocusedIndex((prev) => (prev > 0 ? prev - 1 : 0));\n }\n }\n // Type-to-search\n else if (e.key.length === 1 && /[a-z0-9]/i.test(e.key)) {\n e.preventDefault();\n\n // Clear previous search timeout\n if (searchTimeoutRef.current) {\n clearTimeout(searchTimeoutRef.current);\n }\n\n // Append to search string\n const newSearchString = searchString + e.key.toLowerCase();\n setSearchString(newSearchString);\n\n // Find matching option\n const matchIndex = options.findIndex((opt) =>\n opt.label.toLowerCase().startsWith(newSearchString)\n );\n\n if (matchIndex >= 0) {\n if (!isOpen) {\n // When closed, select the matching option (like native select)\n handleSelect(options[matchIndex].value);\n } else {\n // When open, just focus it\n setFocusedIndex(matchIndex);\n }\n }\n\n // Clear search string after 1 second\n searchTimeoutRef.current = setTimeout(() => {\n setSearchString(\"\");\n }, 1000);\n }\n };\n\n return (\n <div\n className={`w-full ${className}`}\n style={{ marginBottom: \"var(--form-control-spacing)\" }}\n >\n {/* Label */}\n {label && (\n <label\n className=\"block text-small font-semibold mb-1\"\n style={{ color: \"var(--color-muted-foreground)\" }}\n >\n {label}\n {required && <span className=\"ml-1\">*</span>}\n </label>\n )}\n\n {/* Hidden input for form submission */}\n {name && (\n <input\n type=\"hidden\"\n name={name}\n value={value ?? \"\"}\n required={required}\n />\n )}\n\n {/* Dropdown Container */}\n <div ref={dropdownRef} className=\"relative\">\n {/* Trigger Button */}\n <button\n ref={triggerRef}\n type=\"button\"\n onClick={() => !disabled && setIsOpen(!isOpen)}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n className={`\n w-full ${\n sizeStyles[size]\n } text-left bg-(--color-background) border rounded-(--dropdown-radius)\n flex items-center justify-between\n transition-all duration-200\n outline-none\n ${\n displayError\n ? \"border-(--color-error) focus:ring-2 focus:ring-(--color-error) focus:border-(--color-error) focus-visible:ring-2 focus-visible:ring-(--color-error) focus-visible:border-(--color-error)\"\n : \"border-(--color-border) focus:ring-2 focus:ring-(--color-primary)/30 focus:border-(--color-primary) focus-visible:ring-2 focus-visible:ring-(--color-primary)/30 focus-visible:border-(--color-primary)\"\n }\n ${\n disabled\n ? \"bg-(--color-muted) cursor-not-allowed opacity-60\"\n : \"hover:border-(--color-primary)\"\n }\n ${!value ? \"text-(--color-placeholder)\" : \"text-(--color-foreground)\"}\n `}\n >\n <span className=\"truncate\">{getSelectedLabel()}</span>\n <div className=\"flex items-center gap-1 ml-2\">\n {value && (\n <div\n onClick={handleClear}\n className=\"p-0.5 hover:bg-(--color-muted) rounded transition-colors cursor-pointer\"\n role=\"button\"\n aria-label=\"Clear selection\"\n tabIndex={-1}\n >\n <X\n className={`${iconSizeStyles[size]} text-(--color-muted-foreground)`}\n />\n </div>\n )}\n <ChevronDown\n className={`${\n iconSizeStyles[size]\n } text-(--color-placeholder) transition-transform duration-200 shrink-0 ${\n isOpen ? \"transform rotate-180\" : \"\"\n }`}\n />\n </div>\n </button>\n\n {/* Dropdown Menu */}\n {isOpen && !disabled && (\n <div\n className=\"absolute z-(--z-index-dropdown) w-full mt-1 bg-(--color-background) border border-(--color-border) rounded-lg shadow-lg max-h-60 overflow-auto\"\n role=\"listbox\"\n >\n {children ? (\n // Custom content\n <div onClick={() => setIsOpen(false)}>\n {children}\n </div>\n ) : (\n // Standard options\n <ul>\n {/* Placeholder option - allows users to clear selection */}\n <li key=\"__placeholder__\">\n <button\n type=\"button\"\n onClick={handleClear}\n className={`\n w-full ${optionSizeStyles[size]} text-left\n transition-colors duration-150\n outline-none\n focus-visible:bg-(--color-muted) focus-visible:text-(--color-foreground)\n ${\n !value || value === \"\"\n ? \"bg-[color-mix(in_srgb,var(--color-primary)_10%,transparent)] text-(--color-primary) font-medium\"\n : \"text-(--color-muted-foreground) hover:bg-(--color-muted)\"\n }\n `}\n role=\"option\"\n aria-selected={!value || value === \"\"}\n >\n {placeholder}\n </button>\n </li>\n {options.map((option, index) => (\n <li key={option.value}>\n <button\n type=\"button\"\n onClick={() =>\n !option.disabled &&\n handleSelect(option.value)\n }\n disabled={option.disabled}\n onMouseEnter={() =>\n setFocusedIndex(index)\n }\n className={`\n w-full ${optionSizeStyles[size]} text-left\n transition-colors duration-150\n outline-none\n focus-visible:bg-(--color-muted) focus-visible:text-(--color-foreground)\n ${\n option.value === value\n ? \"bg-[color-mix(in_srgb,var(--color-primary)_10%,transparent)] text-(--color-primary) font-medium\"\n : index === focusedIndex\n ? \"bg-(--color-muted) text-(--color-foreground)\"\n : \"text-(--color-foreground) hover:bg-(--color-muted)\"\n }\n ${\n option.disabled\n ? \"opacity-50 cursor-not-allowed\"\n : \"\"\n }\n `}\n role=\"option\"\n aria-selected={\n option.value === value\n }\n >\n {option.label}\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n </div>\n\n {/* Helper Text or Error */}\n <div className=\"h-5 mt-1.5\">\n {(helperText || displayError) && (\n <p\n className={`text-small ${displayError ? \"text-(--color-error)\" : \"text-(--color-muted-foreground)\"}`}\n >\n {displayError || helperText}\n </p>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { ReactNode, SelectHTMLAttributes } from \"react\";\nimport { useForm, ValidationFunction } from \"./form\";\n\nexport interface NativeSelectProps extends Omit<\n SelectHTMLAttributes<HTMLSelectElement>,\n \"size\" | \"onChange\"\n> {\n /**\n * Field name - required when used inside Form\n */\n name?: string;\n /**\n * Label text displayed above the select\n */\n label?: string;\n /**\n * Current selected value\n */\n value?: string | number;\n /**\n * Callback when selection changes\n */\n onChange?: (value: string) => void;\n /**\n * Select options as children (<option> elements)\n */\n children?: ReactNode;\n /**\n * Error message to display\n */\n error?: string;\n /**\n * Helper text to display below the select\n */\n helperText?: string;\n /**\n * Mark the field as required\n */\n required?: boolean;\n /**\n * Size of the select\n */\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n /**\n * Additional CSS classes\n */\n className?: string;\n /**\n * Custom validation function\n */\n validate?: ValidationFunction;\n /**\n * Custom error message for required validation\n */\n errorMessage?: string;\n}\n\nexport function NativeSelect({\n name,\n label,\n value: externalValue,\n onChange,\n children,\n error,\n helperText,\n required = false,\n size = \"md\",\n className = \"\",\n validate,\n errorMessage,\n disabled = false,\n ...htmlProps\n}: NativeSelectProps) {\n const form = useForm();\n\n // Determine value and error from Form context or props\n let value: string | number | undefined;\n let displayError: string | undefined;\n\n if (form && name) {\n // Using Form context\n value = form.values[name] ?? externalValue;\n displayError = form.shouldShowError(name)\n ? form.getFieldError(name)\n : undefined;\n } else {\n // Standalone usage\n value = externalValue;\n displayError = error;\n }\n\n // Register with Form\n if (form && name) {\n const validator: ValidationFunction = async (val: any) => {\n if (required && (val === undefined || val === null || val === \"\")) {\n return errorMessage || \"Please select an option\";\n }\n if (validate) {\n return await validate(val);\n }\n return undefined;\n };\n\n form.registerField(name, validator);\n }\n\n const handleChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const newValue = e.target.value;\n\n if (form && name) {\n form.setFieldValue(name, newValue);\n form.setFieldTouched(name, true);\n form.validateField(name, newValue);\n } else {\n onChange?.(newValue);\n }\n };\n\n const sizeStyles = {\n xs: \"px-2 py-1.5 text-xs\",\n sm: \"px-2.5 py-2 text-sm\",\n md: \"px-3 py-2.5 text-base\",\n lg: \"px-4 py-3 text-lg\",\n xl: \"px-5 py-3.5 text-xl\",\n };\n\n return (\n <div\n className={`w-full ${className}`}\n style={{ marginBottom: \"var(--form-control-spacing)\" }}\n >\n {/* Label */}\n {label && (\n <label\n className=\"block text-small font-semibold mb-1\"\n style={{ color: \"var(--color-muted-foreground)\" }}\n >\n {label}\n {required && (\n <span className=\"ml-1 text-(--color-error)\">*</span>\n )}\n </label>\n )}\n\n {/* Native Select */}\n <select\n name={name}\n value={value ?? \"\"}\n onChange={handleChange}\n disabled={disabled}\n required={required}\n className={`\n w-full ${sizeStyles[size]}\n bg-(--color-background) \n border rounded-(--dropdown-radius)\n transition-all duration-200\n appearance-none\n cursor-pointer\n outline-none\n ${\n displayError\n ? \"border-(--color-error) focus:border-(--color-error) active:border-(--color-error)\"\n : \"border-(--color-border) focus:border-(--color-primary) active:border-(--color-primary)\"\n }\n ${\n disabled\n ? \"bg-(--color-muted) cursor-not-allowed opacity-60\"\n : \"hover:border-(--color-primary)\"\n }\n ${!value ? \"text-(--color-placeholder)\" : \"text-(--color-foreground)\"}\n pr-10\n bg-[url('data:image/svg+xml;charset=UTF-8,%3csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3cpolyline%20points%3D%226%209%2012%2015%2018%209%22%3E%3c%2fpolyline%3E%3c%2fsvg%3E')]\n bg-[length:1.25rem_1.25rem]\n bg-[position:right_0.5rem_center]\n bg-no-repeat\n `}\n {...htmlProps}\n >\n {children}\n </select>\n\n {/* Helper Text or Error */}\n <div className=\"h-5 mt-1.5\">\n {(helperText || displayError) && (\n <p\n className={`text-small ${displayError ? \"text-(--color-error)\" : \"text-(--color-muted-foreground)\"}`}\n >\n {displayError || helperText}\n </p>\n )}\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport interface SpinnerProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n color?: \"primary\" | \"secondary\" | \"white\";\n label?: string;\n}\n\nconst Spinner = React.forwardRef<HTMLDivElement, SpinnerProps>(\n ({ className, size = \"md\", color = \"primary\", label, ...props }, ref) => {\n const sizes = {\n sm: \"h-4 w-4\",\n md: \"h-8 w-8\",\n lg: \"h-12 w-12\",\n xl: \"h-16 w-16\",\n };\n\n const colors = {\n primary: \"text-(--color-primary)\",\n secondary: \"text-(--color-muted-foreground)\",\n white: \"text-white\",\n };\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col items-center justify-center gap-2\",\n className\n )}\n {...props}\n >\n <svg\n className={cn(\"animate-spin\", sizes[size], colors[color])}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n ></circle>\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n {label && (\n <p className=\"text-small text-(--color-muted-foreground)\">\n {label}\n </p>\n )}\n </div>\n );\n }\n);\n\nSpinner.displayName = \"Spinner\";\n\nexport { Spinner };\n","\"use client\";\n\nimport { Highlight, themes } from \"prism-react-renderer\";\nimport { useState } from \"react\";\n\ninterface CodeSnippetProps {\n code: string;\n language?: string;\n fontSize?: \"small\" | \"body\" | \"h6\";\n wrap?: boolean;\n}\n\nexport function CodeSnippet({\n code,\n language = \"tsx\",\n fontSize = \"small\",\n wrap = false,\n}: CodeSnippetProps) {\n const fontSizeClassMap = {\n small: \"text-small\",\n body: \"text-body\",\n h6: \"text-h6\",\n };\n const [copied, setCopied] = useState(false);\n const [showTooltip, setShowTooltip] = useState(false);\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(code);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error(\"Failed to copy:\", err);\n }\n };\n\n return (\n <div className=\"relative group w-full\">\n {/* Copy Button */}\n <div className=\"absolute right-3 top-3 [z-index:var(--z-index-code-button)]\">\n <button\n onClick={handleCopy}\n onMouseEnter={() => setShowTooltip(true)}\n onMouseLeave={() => setShowTooltip(false)}\n className=\"relative p-2 rounded-md bg-[#1f2937] hover:bg-[#374151] text-(--color-placeholder) hover:text-[#e5e7eb] transition-all duration-200 border border-[#374151] hover:border-[#4b5563] shadow-lg\"\n aria-label=\"Copy code\"\n >\n {copied ? (\n // Check icon\n <svg\n className=\"w-4 h-4 text-green-400\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n ) : (\n // Copy icon\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n )}\n </button>\n\n {/* Tooltip */}\n {showTooltip && !copied && (\n <div className=\"absolute right-0 top-full mt-2 px-2 py-1 bg-[#1f2937] text-white text-caption rounded shadow-lg whitespace-nowrap border border-[#374151]\">\n Copy code\n <div className=\"absolute -top-1 right-3 w-2 h-2 bg-[#1f2937] border-l border-t border-[#374151] transform rotate-45\"></div>\n </div>\n )}\n\n {copied && (\n <div className=\"absolute right-0 top-full mt-2 px-2 py-1 bg-green-600 text-white text-caption rounded shadow-lg whitespace-nowrap\">\n Copied!\n <div className=\"absolute -top-1 right-3 w-2 h-2 bg-green-600 transform rotate-45\"></div>\n </div>\n )}\n </div>\n\n {/* Code Block with Syntax Highlighting */}\n <div\n className={`rounded-lg overflow-x-auto border border-[#1f2937] ${fontSizeClassMap[fontSize]} code-snippet-${fontSize}`}\n >\n <Highlight\n theme={themes.vsDark}\n code={code}\n language={language}\n >\n {({ style, tokens, getLineProps, getTokenProps }) => (\n <pre\n style={{\n ...style,\n margin: 0,\n padding: \"1rem 3.5rem 1rem 1rem\",\n lineHeight: \"1.5\",\n background: \"#1a1b26\",\n whiteSpace: wrap ? \"pre-wrap\" : \"pre\",\n wordBreak: wrap ? \"break-word\" : \"normal\",\n }}\n >\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line })}>\n {line.map((token, key) => (\n <span\n key={key}\n {...getTokenProps({ token })}\n />\n ))}\n </div>\n ))}\n </pre>\n )}\n </Highlight>\n </div>\n </div>\n );\n}\n","// Moved from src/components/ui/Rating.tsx for consistency\nimport { Star } from \"lucide-react\";\nimport React, { useId } from \"react\";\n\ninterface RatingProps {\n value: number; // e.g. 3.5\n max?: number; // default 5\n size?: number; // px (desktop size when responsive is true)\n color?: string; // default yellow\n className?: string;\n responsive?: boolean; // Auto-scale on small screens\n mobileSize?: number; // px (size for mobile when responsive is true)\n interactive?: boolean; // Allow clicking to set rating\n onChange?: (value: number) => void; // Callback when rating is clicked\n showValue?: boolean; // Display numeric value\n valuePosition?: \"inline\" | \"bottom\"; // Position of numeric value\n valueFormat?: \"decimal\" | \"fraction\"; // Format: \"3.5\" or \"3.5/5\"\n}\n\nexport const Rating: React.FC<RatingProps> = ({\n value,\n max = 5,\n size = 24,\n color = \"var(--color-warning, #FFD600)\",\n className = \"\",\n responsive = false,\n mobileSize,\n interactive = false,\n onChange,\n showValue = false,\n valuePosition = \"inline\",\n valueFormat = \"decimal\",\n}) => {\n // Generate unique ID for SVG gradients (stable across server/client)\n const uniqueId = useId();\n const [hoverValue, setHoverValue] = React.useState<number | null>(null);\n\n const handleStarClick = (starIndex: number) => {\n if (interactive && onChange) {\n onChange(starIndex);\n }\n };\n\n const handleMouseEnter = (starIndex: number) => {\n if (interactive) {\n setHoverValue(starIndex);\n }\n };\n\n const handleMouseLeave = () => {\n if (interactive) {\n setHoverValue(null);\n }\n };\n\n const displayValue = hoverValue !== null ? hoverValue : value;\n\n // Determine sizes\n const actualMobileSize = mobileSize || Math.max(16, Math.floor(size * 0.7));\n const displaySize = size;\n const gap = Math.max(2, size * 0.15);\n\n const stars = [];\n for (let i = 1; i <= max; i++) {\n const isFull = displayValue >= i;\n const isHalf = displayValue >= i - 0.5 && displayValue < i;\n const isEmpty = displayValue < i - 0.5;\n\n stars.push(\n <span\n key={i}\n onClick={() => handleStarClick(i)}\n onMouseEnter={(e) => {\n handleMouseEnter(i);\n if (interactive) {\n e.currentTarget.style.transform = \"scale(1.1)\";\n }\n }}\n onMouseLeave={(e) => {\n handleMouseLeave();\n if (interactive) {\n e.currentTarget.style.transform = \"scale(1)\";\n }\n }}\n style={{\n position: \"relative\",\n display: \"inline-block\",\n width: responsive ? undefined : displaySize,\n height: responsive ? undefined : displaySize,\n flexShrink: 0,\n cursor: interactive ? \"pointer\" : \"default\",\n transition: interactive ? \"transform 0.15s ease\" : \"none\",\n ...(responsive &&\n ({\n \"--star-size\": `${displaySize}px`,\n \"--star-mobile-size\": `${actualMobileSize}px`,\n width: \"var(--star-size)\",\n height: \"var(--star-size)\",\n } as React.CSSProperties)),\n }}\n className={\n responsive\n ? \"sm:w-(--star-size) sm:h-(--star-size) w-(--star-mobile-size) h-(--star-mobile-size)\"\n : \"\"\n }\n >\n {/* Base star outline */}\n <Star\n size={displaySize}\n color={isEmpty ? \"var(--color-gray-300, #E0E0E0)\" : color}\n fill=\"none\"\n style={{ position: \"absolute\", left: 0, top: 0 }}\n />\n {/* Full star fill */}\n {isFull && (\n <Star\n size={displaySize}\n color={color}\n fill={color}\n style={{ position: \"absolute\", left: 0, top: 0 }}\n />\n )}\n {/* Half star overlay */}\n {isHalf && (\n <svg\n width={displaySize}\n height={displaySize}\n viewBox={`0 0 ${displaySize} ${displaySize}`}\n style={{ position: \"absolute\", left: 0, top: 0 }}\n >\n <defs>\n <linearGradient\n id={`half-${uniqueId}-${i}`}\n x1=\"0\"\n x2=\"1\"\n y1=\"0\"\n y2=\"0\"\n >\n <stop offset=\"50%\" stopColor={color} />\n <stop offset=\"50%\" stopColor=\"transparent\" />\n </linearGradient>\n </defs>\n <Star\n size={displaySize}\n color={color}\n fill={`url(#half-${uniqueId}-${i})`}\n />\n </svg>\n )}\n </span>\n );\n }\n\n const valueText =\n valueFormat === \"fraction\"\n ? `${value.toFixed(1)}/${max}`\n : value.toFixed(1);\n\n if (showValue && valuePosition === \"bottom\") {\n return (\n <div\n className={className}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: gap * 2,\n }}\n >\n <div\n style={{\n display: \"flex\",\n gap,\n alignItems: \"center\",\n }}\n >\n {stars}\n </div>\n <span\n style={{\n fontSize: size * 0.75,\n fontWeight: 600,\n color: \"var(--color-gray-600, #4B5563)\",\n }}\n >\n {valueText}\n </span>\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap,\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {stars}\n {showValue && (\n <span\n style={{\n marginLeft: gap * 2,\n fontSize: size * 0.75,\n fontWeight: 600,\n color: \"var(--color-gray-600, #4B5563)\",\n }}\n >\n {valueText}\n </span>\n )}\n </div>\n );\n};\n","import React from \"react\";\n\nexport interface DividerProps {\n /**\n * The variant to use\n * @default \"fullWidth\"\n */\n variant?: \"fullWidth\" | \"inset\" | \"middle\";\n /**\n * The orientation of the divider\n * @default \"horizontal\"\n */\n orientation?: \"horizontal\" | \"vertical\";\n /**\n * The alignment of the content when children are provided\n * @default \"center\"\n */\n textAlign?: \"left\" | \"center\" | \"right\";\n /**\n * If true, the divider will have flex item properties when in a flex container\n * @default false\n */\n flexItem?: boolean;\n /**\n * Thickness of the divider line in pixels\n * @default 1\n */\n thickness?: number;\n /**\n * Content to be rendered inside the divider\n */\n children?: React.ReactNode;\n /**\n * Additional CSS classes\n */\n className?: string;\n}\n\nexport const Divider: React.FC<DividerProps> = ({\n variant = \"fullWidth\",\n orientation = \"horizontal\",\n textAlign = \"center\",\n flexItem = false,\n thickness = 1,\n children,\n className = \"\",\n}) => {\n const isVertical = orientation === \"vertical\";\n\n // Base classes\n const baseClasses = \"border-0\";\n\n // Base styles with CSS variables\n const baseStyles: React.CSSProperties = {\n backgroundColor: \"var(--color-border, #9ca3af)\",\n };\n\n // Variant classes\n const variantClasses = {\n fullWidth: \"\",\n inset: isVertical ? \"\" : \"ml-16\",\n middle: isVertical ? \"my-2\" : \"mx-4\",\n };\n\n // Orientation classes with thickness\n const thicknessStyle = isVertical\n ? { width: `${thickness}px` }\n : { height: `${thickness}px` };\n\n const orientationClasses = isVertical\n ? \"inline-block min-h-[1rem]\"\n : \"block w-full\";\n\n // Flex item classes\n const flexClasses = flexItem && isVertical ? \"self-stretch !h-auto\" : \"\";\n\n // Text styles with CSS variables\n const textStyles: React.CSSProperties = {\n fontSize: \"var(--typography-small, 0.75rem)\",\n color: \"var(--color-muted-foreground, #6b7280)\",\n };\n\n // If there are children, render as a div with content\n if (children) {\n const leftLineClasses =\n textAlign === \"left\"\n ? `${baseClasses} ${orientationClasses}`\n : `flex-1 ${baseClasses} ${orientationClasses}`;\n const rightLineClasses =\n textAlign === \"right\"\n ? `${baseClasses} ${orientationClasses}`\n : `flex-1 ${baseClasses} ${orientationClasses}`;\n\n return (\n <div\n role=\"presentation\"\n className={`flex items-center gap-3 ${variantClasses[variant]} ${className}`}\n >\n {textAlign !== \"left\" && (\n <div\n style={{ ...baseStyles, ...thicknessStyle }}\n className={leftLineClasses}\n />\n )}\n <div style={textStyles} className=\"whitespace-nowrap\">\n {children}\n </div>\n {textAlign !== \"right\" && (\n <div\n style={{ ...baseStyles, ...thicknessStyle }}\n className={rightLineClasses}\n />\n )}\n </div>\n );\n }\n\n // Render as hr for horizontal or div for vertical\n if (isVertical) {\n return (\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n style={{ ...baseStyles, ...thicknessStyle }}\n className={`${baseClasses} ${orientationClasses} ${variantClasses[variant]} ${flexClasses} ${className}`}\n />\n );\n }\n\n return (\n <hr\n style={{ ...baseStyles, ...thicknessStyle }}\n className={`${baseClasses} ${orientationClasses} ${variantClasses[variant]} ${className}`}\n />\n );\n};\n","\"use client\";\n\nimport React, { useState, useRef, useEffect } from \"react\";\n\nexport interface SliderMark {\n value: number;\n label?: string;\n}\n\nexport interface SliderProps {\n /**\n * The value of the slider. For range sliders, provide an array.\n */\n value?: number | number[];\n /**\n * The default value. Use when the component is not controlled.\n */\n defaultValue?: number | number[];\n /**\n * Callback function that is fired when the slider's value changed.\n */\n onChange?: (value: number | number[]) => void;\n /**\n * The minimum allowed value of the slider.\n * @default 0\n */\n min?: number;\n /**\n * The maximum allowed value of the slider.\n * @default 100\n */\n max?: number;\n /**\n * The granularity with which the slider can step through values.\n * Set to null to restrict values to marks only.\n * @default 1\n */\n step?: number | null;\n /**\n * Marks indicate predetermined values to which the user can move the slider.\n * If `true`, marks are generated automatically. If `false`, no marks are shown.\n * You can also provide an array of marks with custom labels.\n * @default false\n */\n marks?: boolean | SliderMark[];\n /**\n * If `true`, the slider will be disabled.\n * @default false\n */\n disabled?: boolean;\n /**\n * The orientation of the slider.\n * @default \"horizontal\"\n */\n orientation?: \"horizontal\" | \"vertical\";\n /**\n * The size of the slider.\n * @default \"medium\"\n */\n size?: \"small\" | \"medium\";\n /**\n * Controls when the value label is displayed.\n * @default \"auto\"\n */\n valueLabelDisplay?: \"on\" | \"auto\" | \"off\";\n /**\n * Show value labels on hover over marks.\n * @default false\n */\n showMarkLabelsOnHover?: boolean;\n /**\n * The color of the slider.\n * @default \"primary\"\n */\n color?: \"primary\" | \"secondary\";\n /**\n * The track display mode.\n * @default \"normal\"\n */\n track?: \"normal\" | \"inverted\" | false;\n /**\n * A function to format the value label.\n */\n valueLabelFormat?: (value: number) => string;\n /**\n * Additional CSS classes\n */\n className?: string;\n /**\n * The id of the input element.\n */\n id?: string;\n /**\n * The name of the input element.\n */\n name?: string;\n /**\n * Accessible label for the slider.\n */\n \"aria-label\"?: string;\n /**\n * The id of the element containing a label for the slider.\n */\n \"aria-labelledby\"?: string;\n}\n\nexport const Slider: React.FC<SliderProps> = ({\n value: controlledValue,\n defaultValue = 0,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n marks = false,\n disabled = false,\n orientation = \"horizontal\",\n size = \"medium\",\n valueLabelDisplay = \"auto\",\n showMarkLabelsOnHover = false,\n color = \"primary\",\n track = \"normal\",\n valueLabelFormat = (v) => String(v),\n className = \"\",\n id,\n name,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n}) => {\n const isControlled = controlledValue !== undefined;\n const [internalValue, setInternalValue] = useState(\n controlledValue ?? defaultValue\n );\n const [isDragging, setIsDragging] = useState(false);\n const [activeThumb, setActiveThumb] = useState<number | null>(null);\n const sliderRef = useRef<HTMLDivElement>(null);\n\n const currentValue = isControlled ? controlledValue : internalValue;\n const isRange = Array.isArray(currentValue);\n const isVertical = orientation === \"vertical\";\n\n // Update internal value when controlled value changes\n useEffect(() => {\n if (isControlled) {\n setInternalValue(controlledValue);\n }\n }, [isControlled, controlledValue]);\n\n // Clamp values when min/max changes\n useEffect(() => {\n if (isRange && Array.isArray(currentValue)) {\n const clampedValues = currentValue.map((v) =>\n Math.max(min, Math.min(max, v))\n );\n if (\n clampedValues[0] !== currentValue[0] ||\n clampedValues[1] !== currentValue[1]\n ) {\n updateValue(clampedValues);\n }\n } else if (typeof currentValue === \"number\") {\n const clampedValue = Math.max(min, Math.min(max, currentValue));\n if (clampedValue !== currentValue) {\n updateValue(clampedValue);\n }\n }\n }, [min, max]);\n\n // Calculate percentage for a value\n const valueToPercent = (val: number) => {\n const clampedVal = Math.max(min, Math.min(max, val));\n return ((clampedVal - min) / (max - min)) * 100;\n };\n\n // Calculate value from mouse position\n const getValueFromPosition = (clientX: number, clientY: number) => {\n if (!sliderRef.current) return min;\n\n const rect = sliderRef.current.getBoundingClientRect();\n const percent = isVertical\n ? ((rect.bottom - clientY) / rect.height) * 100\n : ((clientX - rect.left) / rect.width) * 100;\n\n const clampedPercent = Math.max(0, Math.min(100, percent));\n let newValue = min + (clampedPercent / 100) * (max - min);\n\n // Snap to step or marks\n if (step === null || (Array.isArray(marks) && marks.length > 0)) {\n // Snap to nearest mark (when step is null or when custom marks are provided)\n if (marksList.length > 0) {\n const closest = marksList.reduce((prev, curr) =>\n Math.abs(curr.value - newValue) <\n Math.abs(prev.value - newValue)\n ? curr\n : prev\n );\n newValue = closest.value;\n }\n } else if (step) {\n newValue = Math.round(newValue / step) * step;\n }\n\n return Math.max(min, Math.min(max, newValue));\n };\n\n // Handle mouse/touch move\n const handleMove = (clientX: number, clientY: number) => {\n if (!isDragging || disabled) return;\n\n const newValue = getValueFromPosition(clientX, clientY);\n\n if (isRange && Array.isArray(currentValue)) {\n const values = [...currentValue];\n if (activeThumb !== null) {\n values[activeThumb] = newValue;\n // Ensure values stay in order\n if (activeThumb === 0 && values[0] > values[1]) {\n values[0] = values[1];\n } else if (activeThumb === 1 && values[1] < values[0]) {\n values[1] = values[0];\n }\n updateValue(values);\n }\n } else {\n updateValue(newValue);\n }\n };\n\n // Update value\n const updateValue = (newValue: number | number[]) => {\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue);\n };\n\n // Mouse down handler\n const handleMouseDown =\n (thumbIndex?: number) => (e: React.MouseEvent | React.TouchEvent) => {\n if (disabled) return;\n\n e.preventDefault();\n setIsDragging(true);\n setActiveThumb(thumbIndex ?? 0);\n\n const clientX = \"touches\" in e ? e.touches[0].clientX : e.clientX;\n const clientY = \"touches\" in e ? e.touches[0].clientY : e.clientY;\n\n if (thumbIndex === undefined) {\n const newValue = getValueFromPosition(clientX, clientY);\n updateValue(newValue);\n }\n };\n\n // Global mouse move and up handlers\n useEffect(() => {\n if (!isDragging) return;\n\n const handleGlobalMove = (e: MouseEvent | TouchEvent) => {\n // Prevent default behavior (especially scrolling on vertical sliders)\n if (isVertical && \"touches\" in e) {\n e.preventDefault();\n }\n const clientX = \"touches\" in e ? e.touches[0].clientX : e.clientX;\n const clientY = \"touches\" in e ? e.touches[0].clientY : e.clientY;\n handleMove(clientX, clientY);\n };\n\n const handleGlobalUp = () => {\n setIsDragging(false);\n setActiveThumb(null);\n };\n\n document.addEventListener(\"mousemove\", handleGlobalMove);\n document.addEventListener(\"mouseup\", handleGlobalUp);\n document.addEventListener(\"touchmove\", handleGlobalMove, {\n passive: false,\n });\n document.addEventListener(\"touchend\", handleGlobalUp);\n\n return () => {\n document.removeEventListener(\"mousemove\", handleGlobalMove);\n document.removeEventListener(\"mouseup\", handleGlobalUp);\n document.removeEventListener(\"touchmove\", handleGlobalMove);\n document.removeEventListener(\"touchend\", handleGlobalUp);\n };\n }, [isDragging, activeThumb, isVertical]);\n\n // Generate marks\n const getMarks = (): SliderMark[] => {\n if (marks === false) return [];\n if (marks === true) {\n const marksList: SliderMark[] = [];\n const stepValue = step || 1;\n for (let i = min; i <= max; i += stepValue) {\n marksList.push({ value: i });\n }\n return marksList;\n }\n return marks;\n };\n\n const marksList = getMarks();\n\n // Color styles\n const colorStyles = {\n primary: {\n track: \"bg-(--color-primary)\",\n thumb: \"bg-(--color-primary)\",\n thumbHover: \"hover:bg-(--color-primary-hover)\",\n thumbRing:\n \"ring-[color-mix(in_srgb,var(--color-primary)_30%,transparent)]\",\n thumbRingHover:\n \"group-hover/thumb:ring-[color-mix(in_srgb,var(--color-primary)_30%,transparent)]\",\n labelSelected: \"text-(--color-muted-foreground)\",\n labelUnselected: \"text-(--color-muted-foreground)\",\n },\n secondary: {\n track: \"bg-purple-500\",\n thumb: \"bg-purple-500\",\n thumbHover: \"hover:bg-purple-600\",\n thumbRing: \"ring-purple-500/30\",\n thumbRingHover: \"group-hover/thumb:ring-purple-500/30\",\n labelSelected: \"text-(--color-muted-foreground)\",\n labelUnselected: \"text-(--color-muted-foreground)\",\n },\n };\n\n const currentColorStyles = colorStyles[color];\n\n // Size styles\n const sizeStyles = {\n small: {\n rail: isVertical ? \"w-1\" : \"h-1\",\n thumb: \"w-3 h-3\",\n thumbActive: \"w-4 h-4\",\n ringHover: \"group-hover/thumb:ring-4\",\n ringActive: \"ring-6\",\n },\n medium: {\n rail: isVertical ? \"w-1\" : \"h-1\",\n thumb: \"w-4 h-4\",\n thumbActive: \"w-5 h-5\",\n ringHover: \"group-hover/thumb:ring-4\",\n ringActive: \"ring-8\",\n },\n };\n\n const currentSizeStyles = sizeStyles[size];\n\n // Calculate track position and width\n const getTrackStyle = () => {\n if (track === false) return { display: \"none\" };\n\n if (isRange && Array.isArray(currentValue)) {\n const [start, end] = currentValue;\n const startPercent = valueToPercent(start);\n const endPercent = valueToPercent(end);\n\n if (isVertical) {\n return {\n bottom: `${startPercent}%`,\n height: `${endPercent - startPercent}%`,\n };\n }\n return {\n left: `${startPercent}%`,\n width: `${endPercent - startPercent}%`,\n };\n }\n\n const percent = valueToPercent(currentValue as number);\n\n if (track === \"inverted\") {\n if (isVertical) {\n return {\n bottom: `${percent}%`,\n height: `${100 - percent}%`,\n };\n }\n return {\n left: `${percent}%`,\n width: `${100 - percent}%`,\n };\n }\n\n // Normal track\n if (isVertical) {\n return {\n bottom: \"0%\",\n height: `${percent}%`,\n };\n }\n return {\n left: \"0%\",\n width: `${percent}%`,\n };\n };\n\n // Render thumbs\n const renderThumbs = () => {\n const values = isRange\n ? (currentValue as number[])\n : [currentValue as number];\n\n return values.map((val, index) => {\n const percent = valueToPercent(val);\n const isActive = isDragging && activeThumb === index;\n const showLabelAlways = valueLabelDisplay === \"on\";\n const showLabelOnActiveOrHover = valueLabelDisplay === \"auto\";\n\n const thumbStyle = isVertical\n ? { bottom: `${percent}%` }\n : { left: `${percent}%` };\n\n return (\n <div\n key={index}\n className={`absolute ${isVertical ? \"left-1/2 -translate-x-1/2\" : \"top-1/2 -translate-y-1/2\"} cursor-pointer ${disabled ? \"cursor-not-allowed opacity-50\" : \"\"} group/thumb z-20`}\n style={thumbStyle}\n onMouseDown={handleMouseDown(index)}\n onTouchStart={handleMouseDown(index)}\n >\n <div\n className={`absolute left-0 top-0 -translate-x-1/2 -translate-y-1/2 ${isActive ? currentSizeStyles.thumbActive : currentSizeStyles.thumb} ${currentColorStyles.thumb} ${!isActive && currentColorStyles.thumbHover} rounded-full shadow-md transition-all ${isActive ? `${currentSizeStyles.ringActive} ${currentColorStyles.thumbRing}` : `group-hover/thumb:shadow-lg ${currentSizeStyles.ringHover} ${currentColorStyles.thumbRingHover}`} ${disabled ? \"pointer-events-none\" : \"\"}`}\n />\n {showLabelAlways && (\n <div\n className={`absolute ${isVertical ? \"left-6\" : \"-top-10\"} ${isVertical ? \"top-1/2 -translate-y-1/2\" : \"left-1/2 -translate-x-1/2\"} px-2 py-1 text-caption font-semibold text-white ${color === \"primary\" ? \"bg-(--color-primary)\" : \"bg-purple-500\"} rounded shadow-lg whitespace-nowrap z-(--z-index-tooltip)`}\n >\n {valueLabelFormat(val)}\n <div\n className={`absolute ${isVertical ? \"left-0 top-1/2 -translate-y-1/2 -translate-x-full\" : \"left-1/2 -translate-x-1/2 top-full\"} w-0 h-0 ${isVertical ? \"border-t-4 border-t-transparent border-b-4 border-b-transparent\" : \"border-l-4 border-l-transparent border-r-4 border-r-transparent\"} ${isVertical ? (color === \"primary\" ? \"border-r-4 border-r-[var(--color-primary)]\" : \"border-r-4 border-r-purple-500\") : color === \"primary\" ? \"border-t-4 border-t-[var(--color-primary)]\" : \"border-t-4 border-t-purple-500\"}`}\n />\n </div>\n )}\n {showLabelOnActiveOrHover && (\n <div\n className={`absolute ${isVertical ? \"left-6\" : \"-top-10\"} ${isVertical ? \"top-1/2 -translate-y-1/2\" : \"left-1/2 -translate-x-1/2\"} px-2 py-1 text-caption font-semibold text-white ${color === \"primary\" ? \"bg-(--color-primary)\" : \"bg-purple-500\"} rounded shadow-lg whitespace-nowrap opacity-0 scale-90 ${isActive ? \"opacity-100 scale-100\" : \"group-hover/thumb:opacity-100 group-hover/thumb:scale-100\"} transition-all duration-300 ease-out pointer-events-none z-(--z-index-tooltip)`}\n >\n {valueLabelFormat(val)}\n <div\n className={`absolute ${isVertical ? \"left-0 top-1/2 -translate-y-1/2 -translate-x-full\" : \"left-1/2 -translate-x-1/2 top-full\"} w-0 h-0 ${isVertical ? \"border-t-4 border-t-transparent border-b-4 border-b-transparent\" : \"border-l-4 border-l-transparent border-r-4 border-r-transparent\"} ${isVertical ? (color === \"primary\" ? \"border-r-4 border-r-[var(--color-primary)]\" : \"border-r-4 border-r-purple-500\") : color === \"primary\" ? \"border-t-4 border-t-[var(--color-primary)]\" : \"border-t-4 border-t-purple-500\"}`}\n />\n </div>\n )}\n </div>\n );\n });\n };\n\n // Check if we have marks with labels for bottom spacing\n const hasMarkLabels = marksList.some((mark) => mark.label);\n\n const containerClasses = isVertical\n ? \"flex flex-col items-center py-4\"\n : `flex items-center w-full px-2 ${hasMarkLabels ? \"pb-6\" : \"\"}`;\n\n const railClasses = isVertical\n ? `${currentSizeStyles.rail} relative overflow-visible`\n : `w-full ${currentSizeStyles.rail} relative overflow-visible`;\n\n return (\n <div\n className={`${containerClasses} ${className}`}\n style={\n isVertical ? { minHeight: \"200px\", height: \"200px\" } : undefined\n }\n >\n <div\n ref={sliderRef}\n className={railClasses}\n style={isVertical ? { height: \"100%\" } : undefined}\n onMouseDown={handleMouseDown()}\n onTouchStart={handleMouseDown()}\n role=\"slider\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={isRange ? undefined : (currentValue as number)}\n aria-disabled={disabled}\n aria-orientation={orientation}\n tabIndex={disabled ? -1 : 0}\n >\n {/* Rail */}\n <div\n className={`absolute ${isVertical ? \"inset-x-0 h-full\" : \"inset-y-0 w-full\"} bg-[#d1d5db] rounded-full ${disabled ? \"opacity-50\" : \"\"} z-0`}\n />\n\n {/* Track */}\n {track !== false && (\n <div\n className={`absolute ${isVertical ? \"inset-x-0\" : \"inset-y-0\"} ${currentColorStyles.track} rounded-full ${disabled ? \"opacity-50\" : \"\"} z-0`}\n style={getTrackStyle()}\n />\n )}\n\n {/* Marks */}\n {marksList.map((mark) => {\n const markPercent = valueToPercent(mark.value);\n const markStyle = isVertical\n ? { bottom: `${markPercent}%` }\n : { left: `${markPercent}%` };\n\n // Check if mark is in selected range\n let isInSelectedRange = false;\n if (isRange && Array.isArray(currentValue)) {\n const [start, end] = currentValue;\n isInSelectedRange =\n mark.value >= start && mark.value <= end;\n } else if (typeof currentValue === \"number\") {\n if (track === \"inverted\") {\n isInSelectedRange = mark.value >= currentValue;\n } else {\n isInSelectedRange = mark.value <= currentValue;\n }\n }\n\n const markColor = isInSelectedRange\n ? \"bg-(--color-background) shadow-sm group-hover/mark:bg-(--color-background) group-hover/mark:shadow-md\"\n : \"bg-[#4b5563] group-hover/mark:bg-[#1f2937]\";\n const labelColor = isInSelectedRange\n ? currentColorStyles.labelSelected\n : currentColorStyles.labelUnselected;\n\n return (\n <div\n key={mark.value}\n className={`group/mark absolute ${isVertical ? \"left-1/2 -translate-x-1/2\" : \"top-1/2 -translate-y-1/2\"} z-30`}\n style={markStyle}\n >\n <div\n className={`absolute left-0 top-0 -translate-x-1/2 -translate-y-1/2 w-1.5 h-1.5 ${markColor} rounded-full transition-all duration-200 cursor-pointer group-hover/mark:w-2 group-hover/mark:h-2 ${!disabled ? \"\" : \"cursor-not-allowed\"}`}\n />\n {/* Always visible mark label at the bottom */}\n {mark.label && (\n <div\n className={`absolute ${isVertical ? \"left-4 top-1/2 -translate-y-1/2\" : \"top-3 left-1/2 -translate-x-1/2\"} text-caption font-medium ${labelColor} transition-colors duration-200 whitespace-nowrap pointer-events-none z-(--z-index-base)`}\n >\n {mark.label}\n </div>\n )}\n {/* Hover tooltip showing value (only if no permanent label) */}\n {showMarkLabelsOnHover && !mark.label && (\n <div\n className={`absolute ${isVertical ? \"left-6 top-1/2 -translate-y-1/2\" : \"-top-8 left-1/2 -translate-x-1/2\"} px-2 py-1 text-caption font-semibold text-white ${color === \"primary\" ? \"bg-(--color-primary)\" : \"bg-purple-500\"} rounded shadow-lg whitespace-nowrap opacity-0 scale-90 group-hover/mark:opacity-100 group-hover/mark:scale-100 transition-all duration-300 ease-out pointer-events-none z-(--z-index-tooltip)`}\n >\n {valueLabelFormat(mark.value)}\n {/* Arrow triangle */}\n <div\n className={`absolute ${isVertical ? \"right-full top-1/2 -translate-y-1/2 border-y-4 border-y-transparent border-r-4\" : \"top-full left-1/2 -translate-x-1/2 border-x-4 border-x-transparent border-t-4\"} ${color === \"primary\" ? (isVertical ? \"border-r-[var(--color-primary)]\" : \"border-t-[var(--color-primary)]\") : isVertical ? \"border-r-purple-500\" : \"border-t-purple-500\"}`}\n />\n </div>\n )}\n </div>\n );\n })}\n\n {/* Thumbs */}\n {renderThumbs()}\n </div>\n\n {/* Hidden input for form submission */}\n {name && (\n <input\n type=\"hidden\"\n id={id}\n name={name}\n value={\n isRange\n ? (currentValue as number[]).join(\",\")\n : (currentValue as number)\n }\n />\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { useForm, ValidationFunction } from \"./form\";\n\nexport interface SwitchProps {\n /**\n * Whether the switch is checked\n */\n checked?: boolean;\n /**\n * Callback when the switch state changes\n */\n onChange?: (checked: boolean) => void;\n /**\n * Whether the switch is disabled\n */\n disabled?: boolean;\n /**\n * Label text for the switch\n */\n label?: string;\n /**\n * Position of the label relative to the switch\n */\n labelPlacement?: \"start\" | \"end\" | \"top\" | \"bottom\";\n /**\n * Size of the switch\n */\n size?: \"sm\" | \"md\" | \"lg\";\n /**\n * Color variant of the switch when checked\n */\n color?: \"primary\" | \"success\" | \"info\" | \"warning\" | \"error\";\n /**\n * Additional CSS classes\n */\n className?: string;\n /**\n * Name attribute for the input\n */\n name?: string;\n /**\n * Required field indicator\n */\n required?: boolean;\n /**\n * Custom validation function\n */\n validate?: ValidationFunction;\n /**\n * Custom error message for required validation\n */\n errorMessage?: string;\n}\n\nexport function Switch({\n checked: controlledChecked,\n onChange,\n disabled = false,\n label,\n labelPlacement = \"end\",\n size = \"md\",\n color = \"primary\",\n className = \"\",\n name,\n required = false,\n validate,\n errorMessage,\n}: SwitchProps) {\n const form = useForm();\n const [internalChecked, setInternalChecked] = useState(false);\n\n // Determine checked state from Form context or props\n let checked: boolean;\n if (form && name) {\n checked = form.values[name] ?? controlledChecked ?? false;\n } else {\n const isControlled = controlledChecked !== undefined;\n checked = isControlled ? controlledChecked : internalChecked;\n }\n\n // Register with Form\n useEffect(() => {\n if (form && name) {\n const validator: ValidationFunction = async (val: boolean) => {\n if (required && !val) {\n return errorMessage || \"This field is required\";\n }\n if (validate) {\n return await validate(val);\n }\n return undefined;\n };\n\n form.registerField(name, validator);\n return () => form.unregisterField(name);\n }\n }, [form, name, required, validate, errorMessage]);\n\n const handleChange = () => {\n if (disabled) return;\n\n const newChecked = !checked;\n\n if (form && name) {\n // Update Form context\n form.setFieldValue(name, newChecked);\n form.setFieldTouched(name, true);\n // Validate on change for switch (immediate feedback with new value)\n form.validateField(name, newChecked);\n } else {\n // Standalone mode\n const isControlled = controlledChecked !== undefined;\n if (!isControlled) {\n setInternalChecked(newChecked);\n }\n onChange?.(newChecked);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) return;\n if (e.key === \" \" || e.key === \"Enter\") {\n e.preventDefault();\n handleChange();\n }\n };\n\n // Size styles\n const sizeStyles = {\n sm: {\n track: \"w-8 h-5\",\n thumb: \"w-3 h-3\",\n translate: checked ? \"translate-x-3.5\" : \"translate-x-0.5\",\n },\n md: {\n track: \"w-11 h-6\",\n thumb: \"w-4 h-4\",\n translate: checked ? \"translate-x-5\" : \"translate-x-1\",\n },\n lg: {\n track: \"w-14 h-7\",\n thumb: \"w-5 h-5\",\n translate: checked ? \"translate-x-7\" : \"translate-x-1\",\n },\n };\n\n // Color styles when checked\n const colorStyles = {\n primary: \"bg-(--color-primary)\",\n success: \"bg-[var(--color-success)]\",\n info: \"bg-[var(--color-info)]\",\n warning: \"bg-[var(--color-warning)]\",\n error: \"bg-[var(--color-error)]\",\n };\n\n // Container flex direction based on label placement\n const containerStyles = {\n start: \"flex-row-reverse justify-end\",\n end: \"flex-row\",\n top: \"flex-col-reverse items-center\",\n bottom: \"flex-col items-center\",\n };\n\n const gapStyles = {\n start: \"gap-2\",\n end: \"gap-2\",\n top: \"gap-2\",\n bottom: \"gap-2\",\n };\n\n const switchElement = (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={label || \"Toggle switch\"}\n disabled={disabled}\n onClick={handleChange}\n onKeyDown={handleKeyDown}\n className={cn(\n \"relative inline-flex shrink-0 rounded-full transition-colors duration-200 ease-in-out focus:outline-none focus:ring-2 focus:ring-offset-2\",\n sizeStyles[size].track,\n checked ? colorStyles[color] : \"bg-[#d1d5db] dark:bg-[#4b5563]\",\n disabled\n ? \"opacity-50 cursor-not-allowed\"\n : \"cursor-pointer hover:opacity-90\",\n checked && !disabled && \"focus:ring-blue-500\"\n )}\n >\n <span\n className={cn(\n \"inline-block rounded-full bg-(--color-background) shadow-lg transform transition-transform duration-200 ease-in-out\",\n sizeStyles[size].thumb,\n sizeStyles[size].translate,\n \"my-auto\"\n )}\n />\n </button>\n );\n\n const content = !label ? (\n <>\n {switchElement}\n {name && (\n <input\n type=\"checkbox\"\n name={name}\n checked={checked}\n onChange={() => {}}\n className=\"sr-only\"\n required={required}\n />\n )}\n </>\n ) : (\n <label\n className={cn(\n \"flex items-center cursor-pointer\",\n containerStyles[labelPlacement],\n gapStyles[labelPlacement],\n disabled && \"cursor-not-allowed opacity-50\"\n )}\n >\n {switchElement}\n <span\n className={cn(\n \"text-small font-semibold select-none\",\n disabled && \"text-(--color-placeholder)\"\n )}\n style={\n !disabled\n ? { color: \"var(--color-muted-foreground)\" }\n : undefined\n }\n >\n {label}\n {required && <span className=\"ml-1\">*</span>}\n </span>\n {name && (\n <input\n type=\"checkbox\"\n name={name}\n checked={checked}\n onChange={() => {}}\n className=\"sr-only\"\n required={required}\n />\n )}\n </label>\n );\n\n return (\n <div\n className={className}\n style={{\n marginBottom: \"var(--form-control-spacing)\",\n }}\n >\n {content}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport interface DialogProps {\n open: boolean;\n onClose: () => void;\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n variant?: \"default\" | \"info\" | \"success\" | \"warning\" | \"error\";\n showCloseButton?: boolean;\n closeOnBackdropClick?: boolean;\n closeOnEscape?: boolean;\n children: React.ReactNode;\n}\n\nconst Dialog = ({\n open,\n onClose,\n size = \"md\",\n variant = \"default\",\n showCloseButton = true,\n closeOnBackdropClick = true,\n closeOnEscape = true,\n children,\n}: DialogProps) => {\n // Handle escape key\n useEffect(() => {\n if (!open || !closeOnEscape) return;\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n onClose();\n }\n };\n\n document.addEventListener(\"keydown\", handleEscape);\n return () => document.removeEventListener(\"keydown\", handleEscape);\n }, [open, closeOnEscape, onClose]);\n\n // Prevent body scroll when dialog is open\n useEffect(() => {\n if (open) {\n document.body.style.overflow = \"hidden\";\n } else {\n document.body.style.overflow = \"unset\";\n }\n\n return () => {\n document.body.style.overflow = \"unset\";\n };\n }, [open]);\n\n if (!open) return null;\n\n const sizes = {\n sm: \"max-w-sm\",\n md: \"max-w-md\",\n lg: \"max-w-lg\",\n xl: \"max-w-xl\",\n full: \"max-w-full mx-4\",\n };\n\n const closeButtonStyles = {\n default: { color: \"var(--color-muted-foreground)\" },\n info: { color: \"var(--color-info-border)\" },\n success: { color: \"var(--color-success-border)\" },\n warning: { color: \"var(--color-warning-border)\" },\n error: { color: \"var(--color-error-border)\" },\n };\n\n const handleBackdropClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (e.target === e.currentTarget && closeOnBackdropClick) {\n onClose();\n }\n };\n\n return (\n <div\n className=\"fixed inset-0 [z-index:var(--z-index-modal)] flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm animate-in fade-in duration-200\"\n onClick={handleBackdropClick}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <div\n className={cn(\n \"relative rounded-xl shadow-2xl w-full animate-in zoom-in-95 duration-200 bg-(--color-background) border border-(--color-border)\",\n sizes[size]\n )}\n >\n {showCloseButton && (\n <button\n onClick={onClose}\n style={{\n color: closeButtonStyles[variant].color,\n transition: \"background-color 0.2s ease\",\n backgroundColor: \"transparent\",\n }}\n onMouseEnter={(e) => {\n const root = document.documentElement;\n if (variant === \"default\") {\n e.currentTarget.style.backgroundColor =\n \"rgba(0, 0, 0, 0.1)\";\n } else {\n const color = getComputedStyle(root)\n .getPropertyValue(\n `--color-${variant}-border`\n )\n .trim();\n // Convert hex to rgba with 15% opacity\n const rgb = color.match(\n /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i\n );\n if (rgb) {\n const r = parseInt(rgb[1], 16);\n const g = parseInt(rgb[2], 16);\n const b = parseInt(rgb[3], 16);\n e.currentTarget.style.backgroundColor = `rgba(${r}, ${g}, ${b}, 0.15)`;\n }\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor =\n \"transparent\";\n }}\n onFocus={(e) => {\n if (variant === \"default\") {\n e.currentTarget.style.boxShadow = `0 0 0 2px var(--color-border)`;\n } else {\n e.currentTarget.style.boxShadow = `0 0 0 2px var(--color-${variant}-border)`;\n }\n }}\n onBlur={(e) => {\n e.currentTarget.style.boxShadow = \"none\";\n }}\n className=\"absolute right-2 top-2 p-1.5 rounded-full [z-index:var(--z-index-base)] focus:outline-none\"\n aria-label=\"Close dialog\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n <DialogContext.Provider value={{ variant }}>\n {children}\n </DialogContext.Provider>\n </div>\n </div>\n );\n};\n\nDialog.displayName = \"Dialog\";\n\n// Context to pass variant to subcomponents\nconst DialogContext = React.createContext<{\n variant: \"default\" | \"info\" | \"success\" | \"warning\" | \"error\";\n}>({ variant: \"default\" });\n\nconst DialogHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, children, ...props }, ref) => {\n const { variant } = React.useContext(DialogContext);\n\n const variantStyles = {\n default: {\n backgroundColor: \"var(--color-background)\",\n borderColor: \"var(--color-border)\",\n },\n info: {\n backgroundColor: \"var(--color-info-muted)\",\n borderColor: \"var(--color-info-border)\",\n },\n success: {\n backgroundColor: \"var(--color-success-muted)\",\n borderColor: \"var(--color-success-border)\",\n },\n warning: {\n backgroundColor: \"var(--color-warning-muted)\",\n borderColor: \"var(--color-warning-border)\",\n },\n error: {\n backgroundColor: \"var(--color-error-muted)\",\n borderColor: \"var(--color-error-border)\",\n },\n };\n\n return (\n <div\n ref={ref}\n style={variantStyles[variant]}\n className={cn(\n \"flex flex-col space-y-1.5 px-6 py-4 border-b rounded-t-xl\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n});\nDialogHeader.displayName = \"DialogHeader\";\n\nconst DialogTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, children, ...props }, ref) => (\n <h2\n ref={ref}\n className={cn(\n \"text-h3 font-semibold text-(--color-foreground) leading-none tracking-tight\",\n className\n )}\n {...props}\n >\n {children}\n </h2>\n));\nDialogTitle.displayName = \"DialogTitle\";\n\nconst DialogDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, children, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-small text-(--color-muted-foreground)\", className)}\n {...props}\n >\n {children}\n </p>\n));\nDialogDescription.displayName = \"DialogDescription\";\n\nconst DialogContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, children, ...props }, ref) => (\n <div ref={ref} className={cn(\"px-6 py-4\", className)} {...props}>\n {children}\n </div>\n));\nDialogContent.displayName = \"DialogContent\";\n\nconst DialogFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"flex gap-2 justify-end bg-(--color-muted) px-6 py-4 border-t border-(--color-border) rounded-b-xl\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n));\nDialogFooter.displayName = \"DialogFooter\";\n\nexport {\n Dialog,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogContent,\n DialogFooter,\n};\n","import React from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"info\" | \"success\" | \"warning\" | \"error\";\n title?: string;\n dismissible?: boolean;\n onDismiss?: () => void;\n icon?: React.ReactNode;\n}\n\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n (\n {\n className,\n variant = \"info\",\n title,\n dismissible = false,\n onDismiss,\n icon,\n children,\n ...props\n },\n ref\n ) => {\n const variantStyles = {\n info: {\n backgroundColor: \"var(--color-info-muted)\",\n borderColor: \"var(--color-info-border)\",\n color: \"var(--color-info-muted-foreground)\",\n },\n success: {\n backgroundColor: \"var(--color-success-muted)\",\n borderColor: \"var(--color-success-border)\",\n color: \"var(--color-success-muted-foreground)\",\n },\n warning: {\n backgroundColor: \"var(--color-warning-muted)\",\n borderColor: \"var(--color-warning-border)\",\n color: \"var(--color-warning-muted-foreground)\",\n },\n error: {\n backgroundColor: \"var(--color-error-muted)\",\n borderColor: \"var(--color-error-border)\",\n color: \"var(--color-error-muted-foreground)\",\n },\n };\n\n const iconStyles = {\n info: { color: \"var(--color-info-border)\" },\n success: { color: \"var(--color-success-border)\" },\n warning: { color: \"var(--color-warning-border)\" },\n error: { color: \"var(--color-error-border)\" },\n };\n\n const defaultIcons = {\n info: (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\"\n clipRule=\"evenodd\"\n />\n </svg>\n ),\n success: (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\n clipRule=\"evenodd\"\n />\n </svg>\n ),\n warning: (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\"\n clipRule=\"evenodd\"\n />\n </svg>\n ),\n error: (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\"\n clipRule=\"evenodd\"\n />\n </svg>\n ),\n };\n\n return (\n <div\n ref={ref}\n style={variantStyles[variant]}\n className={cn(\"relative border rounded-lg p-4\", className)}\n role=\"alert\"\n {...props}\n >\n <div className=\"flex items-start gap-3\">\n <div className=\"shrink-0\" style={iconStyles[variant]}>\n {icon || defaultIcons[variant]}\n </div>\n\n <div className=\"flex-1\">\n {title && <h5 className=\"font-semibold mb-1\">{title}</h5>}\n <div className=\"text-sm\">{children}</div>\n </div>\n\n {dismissible && onDismiss && (\n <button\n type=\"button\"\n onClick={onDismiss}\n style={{\n color: iconStyles[variant].color,\n transition: \"background-color 0.2s ease\",\n backgroundColor: \"transparent\",\n }}\n onMouseEnter={(e) => {\n const root = document.documentElement;\n const color = getComputedStyle(root)\n .getPropertyValue(`--color-${variant}-border`)\n .trim();\n // Convert hex to rgba with 15% opacity\n const rgb = color.match(\n /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i\n );\n if (rgb) {\n const r = parseInt(rgb[1], 16);\n const g = parseInt(rgb[2], 16);\n const b = parseInt(rgb[3], 16);\n e.currentTarget.style.backgroundColor = `rgba(${r}, ${g}, ${b}, 0.15)`;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n onFocus={(e) => {\n e.currentTarget.style.boxShadow = `0 0 0 2px var(--color-${variant}-border)`;\n }}\n onBlur={(e) => {\n e.currentTarget.style.boxShadow = \"none\";\n }}\n className=\"shrink-0 rounded-lg p-1.5 inline-flex focus:outline-none\"\n aria-label=\"Close\"\n >\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n )}\n </div>\n </div>\n );\n }\n);\n\nAlert.displayName = \"Alert\";\n\nexport { Alert };\n","import React from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport interface ContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n maxWidth?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"full\";\n centered?: boolean;\n padding?: boolean;\n}\n\nconst Container = React.forwardRef<HTMLDivElement, ContainerProps>(\n (\n {\n className,\n maxWidth = \"xl\",\n centered = true,\n padding = true,\n children,\n ...props\n },\n ref\n ) => {\n const maxWidths = {\n sm: \"max-w-screen-sm\",\n md: \"max-w-screen-md\",\n lg: \"max-w-screen-lg\",\n xl: \"max-w-screen-xl\",\n \"2xl\": \"max-w-screen-2xl\",\n full: \"max-w-full\",\n };\n\n return (\n <div\n ref={ref}\n className={cn(\n \"w-full\",\n maxWidths[maxWidth],\n centered && \"mx-auto\",\n padding && \"px-4 sm:px-6 lg:px-8\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nContainer.displayName = \"Container\";\n\nexport { Container };\n","import React from \"react\";\n\ninterface SectionLayoutProps {\n children: React.ReactNode;\n hasStickyPreview?: boolean;\n}\n\n/**\n * SectionLayout - Wrapper component for showcase sections\n *\n * @param hasStickyPreview - When true, expects the first child to be a sticky preview section\n * that stays at the top while the rest of the content scrolls\n */\nexport function SectionLayout({\n children,\n hasStickyPreview = false,\n}: SectionLayoutProps) {\n if (!hasStickyPreview) {\n // Normal layout - just render children with spacing\n return <>{children}</>;\n }\n\n // Convert children to array to separate sticky preview from scrollable content\n const childArray = React.Children.toArray(children);\n\n if (childArray.length === 0) {\n return null;\n }\n\n // First child is the sticky preview\n const stickyPreview = childArray[0];\n\n // Rest are scrollable content\n const scrollableContent = childArray.slice(1);\n\n return (\n <>\n {/* Sticky Preview at Top */}\n {stickyPreview}\n\n {/* Scrollable Content Below */}\n {scrollableContent.length > 0 && (\n <div className=\"space-y-8\">{scrollableContent}</div>\n )}\n </>\n );\n}\n","\"use client\";\n\nimport { Menu, X, ChevronDown } from \"lucide-react\";\nimport React, { useState, useEffect, useRef } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport interface NavItem {\n id: string;\n label?: string;\n type?: \"link\" | \"button\" | \"dropdown\" | \"divider\" | \"custom\";\n href?: string;\n onClick?: () => void;\n icon?: React.ReactNode;\n badge?: string | number;\n disabled?: boolean;\n target?: \"_blank\" | \"_self\";\n children?: NavItem[];\n render?: () => React.ReactNode;\n}\n\nexport interface NavProps extends React.HTMLAttributes<HTMLElement> {\n items: NavItem[];\n variant?: \"primary\" | \"secondary\" | \"ghost\";\n orientation?: \"horizontal\" | \"vertical\";\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n mobileBreakpoint?: \"sm\" | \"md\" | \"lg\";\n mobileMenuDirection?: \"top\" | \"left\" | \"right\";\n logo?: React.ReactNode;\n actions?: React.ReactNode;\n sticky?: boolean;\n activeId?: string;\n onItemClick?: (item: NavItem) => void;\n /** Remove bottom border for seamless hero integration */\n borderless?: boolean;\n /** Make background transparent */\n transparent?: boolean;\n /** Add backdrop blur effect (glassmorphism) */\n blur?: boolean;\n /** Position of the nav (fixed, sticky, or static) */\n position?: \"fixed\" | \"sticky\" | \"static\";\n /** Auto-hide nav on scroll down, show on scroll up */\n autoHideOnScroll?: boolean;\n}\n\nconst Nav = React.forwardRef<HTMLElement, NavProps>(\n (\n {\n className,\n items,\n variant = \"primary\",\n orientation = \"horizontal\",\n size = \"md\",\n mobileBreakpoint = \"md\",\n mobileMenuDirection = \"top\",\n logo,\n actions,\n sticky = false,\n activeId,\n onItemClick,\n borderless = false,\n transparent = false,\n blur = false,\n position = \"static\",\n autoHideOnScroll = false,\n ...htmlProps\n },\n ref\n ) => {\n const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);\n const [openDropdownId, setOpenDropdownId] = useState<string | null>(\n null\n );\n const dropdownRef = useRef<HTMLDivElement>(null);\n const mobileMenuRef = useRef<HTMLDivElement>(null);\n const [navElement, setNavElement] = useState<HTMLElement | null>(null);\n const [isNavVisible, setIsNavVisible] = useState(true);\n const lastScrollYRef = useRef(0);\n\n // Auto-hide nav on scroll\n useEffect(() => {\n if (!autoHideOnScroll || position === \"static\") {\n setIsNavVisible(true);\n return;\n }\n\n const handleScroll = () => {\n const currentScrollY = window.scrollY;\n\n // Show nav when at top\n if (currentScrollY < 10) {\n setIsNavVisible(true);\n lastScrollYRef.current = currentScrollY;\n return;\n }\n\n // Hide on scroll down, show on scroll up\n if (currentScrollY > lastScrollYRef.current) {\n setIsNavVisible(false);\n } else if (currentScrollY < lastScrollYRef.current) {\n setIsNavVisible(true);\n }\n\n lastScrollYRef.current = currentScrollY;\n };\n\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n return () => window.removeEventListener(\"scroll\", handleScroll);\n }, [autoHideOnScroll, position]);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setOpenDropdownId(null);\n }\n\n // Close mobile menu when clicking outside (only for top direction dropdown style)\n if (\n mobileMenuDirection === \"top\" &&\n isMobileMenuOpen &&\n mobileMenuRef.current &&\n navElement &&\n !mobileMenuRef.current.contains(event.target as Node) &&\n !navElement.contains(event.target as Node)\n ) {\n setIsMobileMenuOpen(false);\n }\n }\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isMobileMenuOpen, mobileMenuDirection]);\n\n // Close mobile menu on escape\n useEffect(() => {\n function handleEscape(event: KeyboardEvent) {\n if (event.key === \"Escape\") {\n setIsMobileMenuOpen(false);\n setOpenDropdownId(null);\n }\n }\n\n document.addEventListener(\"keydown\", handleEscape);\n return () => {\n document.removeEventListener(\"keydown\", handleEscape);\n };\n }, []);\n\n // Close mobile menu when direction changes\n useEffect(() => {\n setIsMobileMenuOpen(false);\n }, [mobileMenuDirection]);\n\n // Base styles using CSS variables\n const positionClass =\n position === \"static\"\n ? \"\"\n : position === \"fixed\"\n ? \"fixed\"\n : \"sticky\";\n const transformClass =\n autoHideOnScroll && position !== \"static\"\n ? `transition-transform duration-500 ease-in-out ${isNavVisible ? \"translate-y-0\" : \"-translate-y-full\"}`\n : \"\";\n\n // Only add default positioning if not already specified in className\n const hasCustomPositioning = className?.match(/(left-|right-|inset-)/);\n\n const baseStyles = cn(\n // Position\n positionClass && `${positionClass} [z-index:var(--z-index-nav)]`,\n // Default positioning only if not custom\n positionClass && !hasCustomPositioning && \"top-0 left-0 right-0\",\n // Transform for auto-hide\n transformClass,\n // Background\n !transparent && !blur && \"bg-(--color-background)\",\n transparent && \"bg-transparent\",\n // Blur effect (glassmorphism)\n blur && \"backdrop-blur-md bg-transparent\"\n );\n\n // Container styles\n const containerStyles = cn(\n \"min-h-14 md:min-h-16\",\n \"flex items-center justify-between\",\n \"px-4 md:px-6\"\n );\n\n // Size-based padding styles - Tailwind UI inspired\n const itemPaddingStyles = {\n xs: \"px-2 py-1\",\n sm: \"px-2.5 py-1.5\",\n md: \"px-3 py-2\",\n lg: \"px-4 py-2.5\",\n xl: \"px-5 py-3\",\n };\n\n const fontSizeStyles = {\n xs: \"[font-size:var(--nav-font-size-xs)]\",\n sm: \"[font-size:var(--nav-font-size-sm)]\",\n md: \"[font-size:var(--nav-font-size-md)]\",\n lg: \"[font-size:var(--nav-font-size-lg)]\",\n xl: \"[font-size:var(--nav-font-size-xl)]\",\n };\n\n // Variant styles for items\n const variantItemStyles = {\n primary:\n \"rounded-md hover:bg-(--color-primary)/10 hover:text-(--color-primary) transition-colors duration-150\",\n secondary:\n \"rounded-md hover:bg-(--color-muted) transition-colors duration-150\",\n ghost: \"rounded-md hover:bg-(--color-primary)/5 transition-colors duration-150\",\n };\n\n const activeItemStyles = {\n primary:\n \"bg-(--color-primary) text-white hover:bg-(--color-primary) hover:text-white\",\n secondary:\n \"bg-(--color-muted) text-(--color-foreground) font-semibold\",\n ghost: \"text-(--color-primary) font-medium\",\n };\n\n // Breakpoint classes\n const breakpointClasses = {\n sm: \"sm:hidden\",\n md: \"md:hidden\",\n lg: \"lg:hidden\",\n };\n\n const breakpointShowClasses = {\n sm: \"hidden sm:flex\",\n md: \"hidden md:flex\",\n lg: \"hidden lg:flex\",\n };\n\n // Handle item click\n const handleItemClick = (item: NavItem) => {\n if (item.disabled) return;\n\n if (item.type === \"dropdown\") {\n setOpenDropdownId(openDropdownId === item.id ? null : item.id);\n return;\n }\n\n if (item.onClick) {\n item.onClick();\n }\n\n if (onItemClick) {\n onItemClick(item);\n }\n\n // Close mobile menu after navigation\n setIsMobileMenuOpen(false);\n setOpenDropdownId(null);\n };\n\n // Render a single nav item\n const renderNavItem = (item: NavItem, isMobile: boolean = false) => {\n if (item.type === \"divider\") {\n return (\n <div\n key={item.id}\n className={cn(\n orientation === \"horizontal\" &&\n !isMobile &&\n \"h-6 border-l border-(--color-border) mx-2\",\n (orientation === \"vertical\" || isMobile) &&\n \"w-full h-0 border-t border-(--color-border) my-2\"\n )}\n />\n );\n }\n\n if (item.type === \"custom\" && item.render) {\n return <div key={item.id}>{item.render()}</div>;\n }\n\n const isActive = activeId === item.id;\n const isDropdownOpen = openDropdownId === item.id;\n const hasChildren = item.children && item.children.length > 0;\n\n const itemBaseStyles = cn(\n \"flex items-center [gap:var(--nav-gap)] font-medium text-(--color-foreground) cursor-pointer select-none\",\n itemPaddingStyles[size],\n fontSizeStyles[size],\n variantItemStyles[variant],\n isActive && activeItemStyles[variant],\n orientation === \"vertical\" && \"w-full\",\n item.disabled && \"opacity-50 cursor-not-allowed\"\n );\n\n const content = (\n <>\n {item.icon && (\n <span className=\"flex-shrink-0\">{item.icon}</span>\n )}\n <span>{item.label}</span>\n {item.badge && (\n <span className=\"ml-auto inline-flex items-center rounded-full bg-(--color-primary) px-2 py-0.5 text-caption font-medium text-white\">\n {item.badge}\n </span>\n )}\n {hasChildren && (\n <ChevronDown\n className={cn(\n \"w-4 h-4 transition-transform\",\n isDropdownOpen && \"rotate-180\"\n )}\n />\n )}\n </>\n );\n\n // Dropdown item\n if (hasChildren) {\n return (\n <div key={item.id} className=\"relative\" ref={dropdownRef}>\n <button\n onClick={() => handleItemClick(item)}\n className={itemBaseStyles}\n disabled={item.disabled}\n >\n {content}\n </button>\n\n {/* Dropdown Menu */}\n {isDropdownOpen && (\n <div\n className={cn(\n \"absolute left-0 mt-[var(--nav-gap)] min-w-[200px] bg-(--color-background) border border-(--color-border) rounded-[var(--nav-border-radius)] shadow-xl [z-index:var(--z-index-dropdown)] animate-in fade-in-0 zoom-in-95 duration-200\",\n orientation === \"vertical\" &&\n \"left-full top-0 ml-2 mt-0\"\n )}\n >\n <div className=\"py-1\">\n {item.children!.map((child) => (\n <button\n key={child.id}\n onClick={() =>\n handleItemClick(child)\n }\n disabled={child.disabled}\n className={cn(\n \"w-full flex items-center gap-2 px-4 py-2 [font-size:var(--text-sm)] text-(--color-foreground) hover:bg-(--color-primary)/10 hover:text-(--color-primary) transition-all duration-200 rounded-sm mx-1\",\n child.disabled &&\n \"opacity-50 cursor-not-allowed\",\n activeId === child.id &&\n \"bg-(--color-primary)/10 text-(--color-primary) [font-weight:var(--font-semibold)]\"\n )}\n >\n {child.icon && (\n <span className=\"flex-shrink-0\">\n {child.icon}\n </span>\n )}\n <span>{child.label}</span>\n {child.badge && (\n <span className=\"ml-auto px-2 py-0.5 [font-size:var(--text-xs)] font-semibold bg-(--color-primary) text-white rounded-[var(--radius-full)]\">\n {child.badge}\n </span>\n )}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n }\n\n // Link item\n if (item.href) {\n return (\n <a\n key={item.id}\n href={item.href}\n target={item.target}\n onClick={() => handleItemClick(item)}\n className={itemBaseStyles}\n >\n {content}\n </a>\n );\n }\n\n // Button item\n return (\n <button\n key={item.id}\n onClick={() => handleItemClick(item)}\n disabled={item.disabled}\n className={itemBaseStyles}\n >\n {content}\n </button>\n );\n };\n\n // Desktop navigation\n const desktopNav = (\n <div\n className={cn(\n \"items-center [gap:var(--nav-gap)]\",\n breakpointShowClasses[mobileBreakpoint],\n orientation === \"horizontal\"\n ? \"flex flex-row\"\n : \"flex flex-col\"\n )}\n >\n {items.map((item) => renderNavItem(item))}\n </div>\n );\n\n // Combine external and internal refs\n const setRefs = React.useCallback(\n (node: HTMLElement | null) => {\n setNavElement(node);\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n (\n ref as React.MutableRefObject<HTMLElement | null>\n ).current = node;\n }\n },\n [ref]\n );\n\n return (\n <nav\n ref={setRefs}\n className={cn(\n baseStyles,\n // Border styles\n !borderless && \"border border-(--color-border)\",\n borderless && \"border-0\",\n className\n )}\n {...htmlProps}\n >\n <div className={containerStyles}>\n {/* Logo */}\n {logo && <div className=\"shrink-0\">{logo}</div>}\n\n {/* Desktop Navigation */}\n {desktopNav}\n\n {/* Actions (right side) */}\n {actions && (\n <div className=\"shrink-0 flex items-center gap-2 ml-auto\">\n {actions}\n </div>\n )}\n\n {/* Mobile Menu Button */}\n <button\n onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)}\n className={cn(\n \"p-2 text-(--color-foreground) hover:bg-(--color-muted) rounded-[var(--nav-border-radius)] transition-colors\",\n breakpointClasses[mobileBreakpoint]\n )}\n aria-label=\"Toggle menu\"\n >\n {isMobileMenuOpen ? (\n <X className=\"w-6 h-6\" />\n ) : (\n <Menu className=\"w-6 h-6\" />\n )}\n </button>\n </div>\n\n {/* Mobile Menu Content - expands inside container */}\n {mobileMenuDirection === \"top\" && (\n <div\n ref={mobileMenuRef}\n className={cn(\n \"overflow-hidden transition-all duration-200 ease-in-out border-t\",\n breakpointClasses[mobileBreakpoint],\n isMobileMenuOpen\n ? \"max-h-96 opacity-100 border-(--color-border)\"\n : \"max-h-0 opacity-0 border-transparent\"\n )}\n >\n <div className=\"space-y-1 px-2 py-2\">\n {items.map((item) => renderNavItem(item, true))}\n </div>\n </div>\n )}\n\n {/* Side Drawer Menus - outside container */}\n {mobileMenuDirection !== \"top\" && (\n <>\n {/* Overlay */}\n {isMobileMenuOpen && (\n <div\n className={cn(\n \"fixed inset-0 [z-index:var(--z-index-nav-mobile-overlay)]\",\n breakpointClasses[mobileBreakpoint]\n )}\n style={{\n backgroundColor:\n \"var(--overlay-background, rgba(0, 0, 0, 0.4))\",\n }}\n onClick={() => setIsMobileMenuOpen(false)}\n />\n )}\n\n {/* Drawer Panel */}\n <div\n ref={mobileMenuRef}\n className={cn(\n \"fixed top-0 bottom-0 w-64 bg-(--color-background) [z-index:var(--z-index-nav-mobile-menu)] overflow-y-auto transition-transform ease-in-out shadow-lg\",\n breakpointClasses[mobileBreakpoint],\n mobileMenuDirection === \"left\" && [\n \"left-0 border-r border-(--color-border)\",\n isMobileMenuOpen\n ? \"translate-x-0\"\n : \"-translate-x-full\",\n ],\n mobileMenuDirection === \"right\" && [\n \"right-0 border-l border-(--color-border)\",\n isMobileMenuOpen\n ? \"translate-x-0\"\n : \"translate-x-full\",\n ],\n !isMobileMenuOpen && \"invisible\"\n )}\n style={{\n transitionDuration:\n \"var(--transition-drawer-duration, 500ms)\",\n }}\n >\n <div className=\"flex flex-col space-y-1 px-2 pt-2\">\n {items.map((item) => renderNavItem(item, true))}\n </div>\n </div>\n </>\n )}\n </nav>\n );\n }\n);\n\nNav.displayName = \"Nav\";\n\nexport { Nav };\n","\"use client\";\n\nimport { Menu, X } from \"lucide-react\";\nimport React, { useState, useEffect } from \"react\";\n\nexport interface NavItem {\n id: string;\n label: string;\n icon?: React.ReactNode;\n}\n\nexport interface NavSection {\n title: string;\n items: NavItem[];\n}\n\nexport interface DrawerProps {\n title: string;\n subtitle?: string;\n items?: NavItem[];\n sections?: NavSection[];\n activeItem: string;\n onItemClick: (itemId: string) => void;\n footer?: React.ReactNode;\n position?: \"left\" | \"right\";\n homeUrl?: string;\n autoHideOnScroll?: boolean;\n headerActions?: React.ReactNode;\n /** Remove bottom border from mobile header */\n borderless?: boolean;\n /** Make mobile header background transparent */\n transparent?: boolean;\n /** Add backdrop blur effect to mobile header (glassmorphism) */\n blur?: boolean;\n}\n\nexport function Drawer({\n title,\n subtitle,\n items,\n sections,\n activeItem,\n onItemClick,\n footer,\n position = \"right\",\n homeUrl,\n autoHideOnScroll = true,\n headerActions,\n borderless = false,\n transparent = false,\n blur = false,\n}: DrawerProps) {\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false);\n const [isHeaderVisible, setIsHeaderVisible] = useState(true);\n const [lastScrollY, setLastScrollY] = useState(0);\n\n const isLeft = position === \"left\";\n\n const handleItemClick = (itemId: string) => {\n onItemClick(itemId);\n setMobileMenuOpen(false);\n };\n\n // Use sections if provided, otherwise fall back to items\n const useSections = sections || (items ? [{ title: \"\", items }] : []);\n\n // Auto-hide mobile header on scroll\n useEffect(() => {\n if (!autoHideOnScroll) {\n setIsHeaderVisible(true);\n return;\n }\n\n const handleScroll = () => {\n const currentScrollY = window.scrollY;\n\n // Show header when at top\n if (currentScrollY < 10) {\n setIsHeaderVisible(true);\n }\n // Hide on scroll down, show on scroll up\n else if (currentScrollY > lastScrollY) {\n // Scrolling down\n setIsHeaderVisible(false);\n } else {\n // Scrolling up\n setIsHeaderVisible(true);\n }\n\n setLastScrollY(currentScrollY);\n };\n\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n return () => window.removeEventListener(\"scroll\", handleScroll);\n }, [lastScrollY, autoHideOnScroll]);\n\n return (\n <>\n {/* Mobile Header with auto-hide on scroll */}\n <div\n className={`lg:hidden fixed top-0 left-0 right-0 px-4 py-3 z-(--z-index-drawer-header) transition-transform duration-500 ease-in-out ${\n blur ? \"backdrop-blur-md backdrop-saturate-150\" : \"\"\n } ${borderless ? \"border-b-0\" : \"\"} ${isHeaderVisible ? \"translate-y-0\" : \"-translate-y-full\"}`}\n style={{\n backgroundColor: blur\n ? \"var(--color-muted)\"\n : transparent\n ? \"transparent\"\n : \"var(--color-background)\",\n opacity: blur ? 0.85 : 1,\n borderBottom:\n !borderless && !blur\n ? \"1px solid var(--color-border)\"\n : \"none\",\n }}\n >\n <div\n className={`flex items-center ${\n isLeft\n ? \"justify-between\"\n : \"justify-between flex-row-reverse\"\n }`}\n >\n <div className=\"flex items-center gap-2\">\n {homeUrl && (\n <a\n href={homeUrl}\n className=\"p-2 rounded-lg transition-colors\"\n style={{ color: \"var(--color-foreground)\" }}\n onMouseOver={(e) =>\n (e.currentTarget.style.background =\n \"var(--color-muted)\")\n }\n onMouseOut={(e) =>\n (e.currentTarget.style.background =\n \"transparent\")\n }\n aria-label=\"Go to home\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6\"\n />\n </svg>\n </a>\n )}\n <button\n onClick={() => setMobileMenuOpen(!mobileMenuOpen)}\n className=\"p-2 rounded-lg transition-colors relative z-(--z-index-drawer-button)\"\n style={{ color: \"var(--color-foreground)\" }}\n onMouseOver={(e) =>\n (e.currentTarget.style.background =\n \"var(--color-muted)\")\n }\n onMouseOut={(e) =>\n (e.currentTarget.style.background =\n \"transparent\")\n }\n aria-label=\"Toggle menu\"\n >\n {mobileMenuOpen ? (\n <X className=\"w-6 h-6\" />\n ) : (\n <Menu className=\"w-6 h-6\" />\n )}\n </button>\n </div>\n {headerActions && (\n <div className=\"flex items-center\">{headerActions}</div>\n )}\n <div>\n <h1\n className=\"font-bold text-h5\"\n style={{\n color: \"var(--color-foreground)\",\n }}\n >\n {title}\n </h1>\n {subtitle && (\n <p\n className=\"text-caption\"\n style={{\n color: \"var(--color-muted-foreground)\",\n }}\n >\n {subtitle}\n </p>\n )}\n </div>\n </div>\n </div>\n\n {/* Mobile Menu Overlay - Overlays main content without shifting */}\n {mobileMenuOpen && (\n <div\n className=\"fixed inset-0 lg:hidden transition-opacity ease-in-out\"\n style={{\n zIndex: 9998,\n transitionDuration:\n \"var(--transition-drawer-duration, 500ms)\",\n backgroundColor:\n \"var(--overlay-background, rgba(0, 0, 0, 0.4))\",\n }}\n onClick={() => setMobileMenuOpen(false)}\n />\n )}\n\n {/* Sidebar Navigation */}\n <aside\n className={`\n fixed top-0 bottom-0 w-64\n transition-all ease-out overflow-y-auto\n ${isLeft ? \"left-0\" : \"right-0\"}\n lg:translate-x-0 lg:top-0\n ${\n mobileMenuOpen\n ? \"translate-x-0 top-0\"\n : `${isLeft ? \"-translate-x-full\" : \"translate-x-full\"} top-0`\n }\n `}\n style={{\n transitionDuration:\n \"var(--transition-drawer-duration, 500ms)\",\n background: \"var(--color-background)\",\n borderLeft: isLeft\n ? \"none\"\n : \"1px solid var(--color-border)\",\n borderRight: isLeft\n ? \"1px solid var(--color-border)\"\n : \"none\",\n ...(mobileMenuOpen &&\n typeof window !== \"undefined\" &&\n window.innerWidth < 1024\n ? { zIndex: 9999 }\n : {}),\n }}\n >\n {/* Desktop Header */}\n <div\n className=\"hidden lg:block px-6 py-5\"\n style={{\n borderBottom: \"none\",\n background: \"var(--color-muted)\",\n }}\n >\n <h1\n className=\"font-bold text-h5\"\n style={{\n color: \"var(--color-foreground)\",\n }}\n >\n {title}\n </h1>\n {subtitle && (\n <p\n className=\"mt-0.5 text-caption\"\n style={{\n color: \"var(--color-muted-foreground)\",\n }}\n >\n {subtitle}\n </p>\n )}\n </div>\n\n {/* Mobile Header with Close Button Inside Drawer */}\n <div\n className=\"lg:hidden p-4 flex items-center justify-between\"\n style={{ borderBottom: \"1px solid var(--color-border)\" }}\n >\n <div>\n <h1\n className=\"font-bold text-h5\"\n style={{\n color: \"var(--color-foreground)\",\n }}\n >\n {title}\n </h1>\n {subtitle && (\n <p\n className=\"mt-1 text-caption\"\n style={{\n color: \"var(--color-muted-foreground)\",\n }}\n >\n {subtitle}\n </p>\n )}\n </div>\n <button\n onClick={() => setMobileMenuOpen(false)}\n className=\"p-2 rounded-lg transition-colors\"\n style={{ color: \"var(--color-foreground)\" }}\n onMouseOver={(e) =>\n (e.currentTarget.style.background =\n \"var(--color-muted)\")\n }\n onMouseOut={(e) =>\n (e.currentTarget.style.background = \"transparent\")\n }\n aria-label=\"Close menu\"\n >\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n\n {/* Navigation Items */}\n <nav className=\"px-3 py-4\">\n {useSections.map((section, sectionIndex) => (\n <div\n key={sectionIndex}\n style={{\n paddingTop:\n sectionIndex > 0\n ? \"var(--drawer-section-padding-y)\"\n : \"0\",\n }}\n >\n {section.title && (\n <h3\n className=\"font-semibold uppercase tracking-wide text-caption\"\n style={{\n marginBottom:\n \"var(--drawer-title-margin-bottom)\",\n color: \"var(--color-muted-foreground)\",\n padding: \"0 0.75rem\",\n }}\n >\n {section.title}\n </h3>\n )}\n <ul\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"var(--drawer-item-spacing)\",\n }}\n >\n {section.items.map((item) => (\n <li key={item.id}>\n <button\n onClick={() =>\n handleItemClick(item.id)\n }\n className=\"w-full flex items-center gap-3 rounded-lg font-medium transition-all duration-200 text-small\"\n onMouseOver={(e) => {\n if (activeItem !== item.id) {\n e.currentTarget.style.background =\n \"var(--color-muted)\";\n e.currentTarget.style.color =\n \"var(--color-foreground)\";\n }\n }}\n onMouseOut={(e) => {\n if (activeItem !== item.id) {\n e.currentTarget.style.background =\n \"transparent\";\n e.currentTarget.style.color =\n \"var(--color-muted-foreground)\";\n }\n }}\n style={{\n paddingLeft:\n \"var(--drawer-item-padding-x)\",\n paddingRight:\n \"var(--drawer-item-padding-x)\",\n paddingTop:\n \"var(--drawer-item-padding-y)\",\n paddingBottom:\n \"var(--drawer-item-padding-y)\",\n borderRadius:\n \"var(--drawer-border-radius)\",\n background:\n activeItem === item.id\n ? \"var(--color-primary)\"\n : \"transparent\",\n color:\n activeItem === item.id\n ? \"var(--color-background)\"\n : \"var(--color-muted-foreground)\",\n boxShadow:\n activeItem === item.id\n ? \"0 1px 3px rgba(0,0,0,0.1)\"\n : \"none\",\n }}\n >\n {item.icon && (\n <span className=\"shrink-0 opacity-75\">\n {item.icon}\n </span>\n )}\n <span>{item.label}</span>\n </button>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </nav>\n\n {/* Footer */}\n {footer && (\n <div\n className=\"p-4 mt-auto\"\n style={{ borderTop: \"1px solid var(--color-border)\" }}\n >\n {footer}\n </div>\n )}\n </aside>\n </>\n );\n}\n","\"use client\";\n\nimport { Menu, X } from \"lucide-react\";\nimport React, { useState } from \"react\";\n\nexport interface NavItem {\n id: string;\n label: string;\n icon?: React.ReactNode;\n}\n\nexport interface NavSection {\n title: string;\n items: NavItem[];\n}\n\nexport interface SidebarNavProps {\n title: string;\n subtitle?: string;\n items?: NavItem[];\n sections?: NavSection[];\n activeItem: string;\n onItemClick: (itemId: string) => void;\n footer?: React.ReactNode;\n position?: \"left\" | \"right\";\n}\n\nexport function SidebarNav({\n title,\n subtitle,\n items,\n sections,\n activeItem,\n onItemClick,\n footer,\n position = \"right\",\n}: SidebarNavProps) {\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false);\n\n const isLeft = position === \"left\";\n\n const handleItemClick = (itemId: string) => {\n onItemClick(itemId);\n setMobileMenuOpen(false);\n };\n\n // Use sections if provided, otherwise fall back to items\n const useSections = sections || (items ? [{ title: \"\", items }] : []);\n\n return (\n <>\n {/* Mobile Header */}\n <div className=\"lg:hidden fixed top-0 left-0 right-0 [z-index:var(--z-index-nav)] bg-(--color-background) border-b border-(--color-border) px-4 py-3\">\n <div\n className={`flex items-center ${\n isLeft\n ? \"justify-between\"\n : \"justify-between flex-row-reverse\"\n }`}\n >\n <button\n onClick={() => setMobileMenuOpen(!mobileMenuOpen)}\n className=\"p-2 rounded-lg hover:bg-(--color-muted) transition-colors\"\n aria-label=\"Toggle menu\"\n >\n {mobileMenuOpen ? (\n <X className=\"w-6 h-6 text-(--color-muted-foreground)\" />\n ) : (\n <Menu className=\"w-6 h-6 text-(--color-muted-foreground)\" />\n )}\n </button>\n <div>\n <h1 className=\"text-h4 font-bold text-(--color-foreground)\">\n {title}\n </h1>\n {subtitle && (\n <p className=\"text-caption text-(--color-muted-foreground)\">\n {subtitle}\n </p>\n )}\n </div>\n </div>\n </div>\n\n {/* Mobile Menu Overlay - Overlays main content without shifting */}\n {mobileMenuOpen && (\n <div\n className=\"fixed inset-0 bg-black/50 lg:hidden\"\n style={{ zIndex: 35 }}\n onClick={() => setMobileMenuOpen(false)}\n />\n )}\n\n {/* Sidebar Navigation */}\n <aside\n className={`\n fixed top-0 h-screen w-64 bg-(--color-background) [z-index:var(--z-index-drawer)]\n transition-transform duration-300 ease-in-out overflow-y-auto\n ${isLeft ? \"left-0 border-r\" : \"right-0 border-l\"} border-(--color-border)\n lg:translate-x-0\n ${\n mobileMenuOpen\n ? \"translate-x-0\"\n : `${\n isLeft ? \"-translate-x-full\" : \"translate-x-full\"\n } lg:translate-x-0`\n }\n `}\n >\n {/* Desktop Header */}\n <div className=\"hidden lg:block p-6 border-b border-(--color-border)\">\n <h1 className=\"text-h3 font-bold text-(--color-foreground)\">\n {title}\n </h1>\n {subtitle && (\n <p className=\"text-caption text-(--color-muted-foreground) mt-1\">\n {subtitle}\n </p>\n )}\n </div>\n\n {/* Mobile Header Spacer */}\n <div className=\"lg:hidden h-[57px]\" aria-hidden=\"true\" />\n\n {/* Navigation Items */}\n <nav className=\"p-4\">\n {useSections.map((section, sectionIndex) => (\n <div\n key={sectionIndex}\n className={sectionIndex > 0 ? \"mt-6\" : \"\"}\n >\n {section.title && (\n <h3 className=\"px-4 mb-2 text-caption font-semibold text-(--color-muted-foreground) uppercase tracking-wider\">\n {section.title}\n </h3>\n )}\n <ul className=\"space-y-1\">\n {section.items.map((item) => (\n <li key={item.id}>\n <button\n onClick={() =>\n handleItemClick(item.id)\n }\n className={`\n w-full flex items-center gap-3 px-4 py-3 rounded-lg text-small font-medium transition-colors\n ${\n activeItem === item.id\n ? \"bg-[color-mix(in_srgb,var(--color-primary)_10%,transparent)] text-(--color-primary)\"\n : \"text-(--color-muted-foreground) hover:bg-(--color-muted)\"\n }\n `}\n >\n {item.icon && (\n <span className=\"shrink-0\">\n {item.icon}\n </span>\n )}\n <span>{item.label}</span>\n </button>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </nav>\n\n {/* Footer */}\n {footer && (\n <div className=\"p-4 border-t border-(--color-border) mt-auto\">\n {footer}\n </div>\n )}\n </aside>\n </>\n );\n}\n","import React from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport interface EmptyStateProps extends React.HTMLAttributes<HTMLDivElement> {\n icon?: React.ReactNode;\n title: string;\n description?: string;\n action?: React.ReactNode;\n}\n\nconst EmptyState = React.forwardRef<HTMLDivElement, EmptyStateProps>(\n ({ className, icon, title, description, action, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col items-center justify-center text-center py-12 px-4\",\n className\n )}\n {...props}\n >\n {icon && (\n <div className=\"mb-4 text-(--color-placeholder)\">\n {icon}\n </div>\n )}\n\n <h3 className=\"text-h4 font-semibold text-(--color-foreground) mb-2\">\n {title}\n </h3>\n\n {description && (\n <p className=\"text-small text-(--color-muted-foreground) mb-6 max-w-sm\">\n {description}\n </p>\n )}\n\n {action && <div>{action}</div>}\n </div>\n );\n }\n);\n\nEmptyState.displayName = \"EmptyState\";\n\nexport { EmptyState };\n","\"use client\";\n\nimport {\n createContext,\n useContext,\n ReactNode,\n useState,\n useEffect,\n} from \"react\";\nimport themes from \"../themes\";\n\ninterface Theme {\n name: string;\n id: string;\n colors: Record<string, string>;\n components: Record<string, Record<string, string>>;\n typography?: Record<string, string>;\n showcase?: Record<string, string>;\n semanticColors?: Record<string, string>;\n transitions?: Record<string, string>;\n overlay?: Record<string, string>;\n}\n\ninterface ThemeContextType {\n currentTheme: string;\n availableThemes: { id: string; name: string }[];\n setTheme: (themeId: string) => void;\n setCSSVariable: (name: string, value: string) => void;\n getCSSVariable: (name: string) => string;\n exportThemeCSS: () => string;\n}\n\nconst ThemeContext = createContext<ThemeContextType | undefined>(undefined);\n\n// Convert imported themes to Theme type\nconst themeRegistry: Record<string, Theme> = themes as Record<string, Theme>;\n\n// Get initial theme from localStorage\nconst getInitialTheme = (defaultTheme: string = \"dark\"): string => {\n if (typeof window === \"undefined\") return defaultTheme;\n try {\n const saved = localStorage.getItem(\"yomologic-theme\");\n return saved && themeRegistry[saved] ? saved : defaultTheme;\n } catch {\n return defaultTheme;\n }\n};\n\ninterface ThemeProviderProps {\n children: ReactNode;\n defaultTheme?: string;\n customTheme?: Theme;\n storageKey?: string;\n}\n\nexport function ThemeProvider({\n children,\n defaultTheme = \"dark\",\n customTheme,\n storageKey = \"yomologic-theme\",\n}: ThemeProviderProps) {\n const [currentTheme, setCurrentTheme] = useState<string>(() =>\n getInitialTheme(defaultTheme)\n );\n const [availableThemes] = useState(\n Object.values(themeRegistry).map((t) => ({ id: t.id, name: t.name }))\n );\n\n const setCSSVariable = (name: string, value: string) => {\n if (typeof window === \"undefined\") return;\n document.documentElement.style.setProperty(name, value);\n };\n\n const getCSSVariable = (name: string): string => {\n if (typeof window === \"undefined\") return \"\";\n return getComputedStyle(document.documentElement)\n .getPropertyValue(name)\n .trim();\n };\n\n const applyTheme = (theme: Theme) => {\n // Apply color variables\n Object.entries(theme.colors).forEach(([key, value]) => {\n setCSSVariable(`--color-${key}`, value);\n });\n\n // Apply showcase-specific colors (if present)\n if (theme.showcase) {\n Object.entries(theme.showcase).forEach(([key, value]) => {\n setCSSVariable(`--showcase-${key}`, value);\n // Also map surface colors to --color-* for component usage\n if (key === \"surface\" || key === \"surface-elevated\") {\n setCSSVariable(`--color-${key}`, value);\n }\n });\n }\n\n // Apply semantic colors (if present)\n if (theme.semanticColors) {\n Object.entries(theme.semanticColors).forEach(([key, value]) => {\n setCSSVariable(`--color-${key}`, value);\n });\n }\n\n // Apply typography variables (if present)\n if (theme.typography) {\n Object.entries(theme.typography).forEach(([key, value]) => {\n setCSSVariable(`--typography-${key}`, value);\n });\n }\n\n // Apply component-specific variables\n Object.entries(theme.components).forEach(([component, vars]) => {\n Object.entries(vars).forEach(([key, value]) => {\n // Convert card-icons.blue-bg to --card-icon-blue-bg\n const varName =\n component === \"card-icons\"\n ? `--card-icon-${key}`\n : `--${component}-${key}`;\n setCSSVariable(varName, value);\n });\n });\n\n // Apply transition variables (if present)\n if (theme.transitions) {\n Object.entries(theme.transitions).forEach(([key, value]) => {\n setCSSVariable(`--transition-${key}`, value);\n });\n }\n\n // Apply overlay variables (if present)\n if (theme.overlay) {\n Object.entries(theme.overlay).forEach(([key, value]) => {\n setCSSVariable(`--overlay-${key}`, value);\n });\n }\n\n // Update body background and text color\n setCSSVariable(\"--background\", theme.colors.background);\n setCSSVariable(\"--foreground\", theme.colors.foreground);\n };\n\n const setTheme = (themeId: string) => {\n const theme = customTheme || themeRegistry[themeId];\n if (!theme) {\n console.error(`Theme not found: ${themeId}`);\n return;\n }\n\n applyTheme(theme);\n setCurrentTheme(themeId);\n\n // Save to localStorage\n if (typeof window !== \"undefined\") {\n localStorage.setItem(storageKey, themeId);\n }\n };\n\n const exportThemeCSS = (): string => {\n if (typeof window === \"undefined\") return \"\";\n\n const root = document.documentElement;\n const cssVariables: Record<string, string> = {};\n\n // Get all CSS custom properties from :root\n for (let i = 0; i < root.style.length; i++) {\n const propertyName = root.style[i];\n if (propertyName.startsWith(\"--\")) {\n cssVariables[propertyName] =\n root.style.getPropertyValue(propertyName);\n }\n }\n\n // Generate CSS file content\n const timestamp = new Date().toISOString().split(\"T\")[0];\n let css = `/* Generated by @yomologic/react-ui Theme Builder */\\n`;\n css += `/* Created: ${timestamp} */\\n\\n`;\n css += `:root {\\n`;\n\n // Group variables by prefix for better organization\n const groups: Record<string, string[]> = {};\n Object.keys(cssVariables)\n .sort()\n .forEach((varName) => {\n const prefix = varName.split(\"-\")[1] || \"other\";\n if (!groups[prefix]) groups[prefix] = [];\n groups[prefix].push(varName);\n });\n\n // Write grouped variables\n Object.entries(groups).forEach(([prefix, vars]) => {\n css += ` /* ${prefix.charAt(0).toUpperCase() + prefix.slice(1)} */\\n`;\n vars.forEach((varName) => {\n css += ` ${varName}: ${cssVariables[varName]};\\n`;\n });\n css += `\\n`;\n });\n\n css += `}\\n`;\n return css;\n };\n\n // Apply theme on mount\n useEffect(() => {\n const theme = customTheme || themeRegistry[currentTheme];\n if (theme) {\n applyTheme(theme);\n }\n }, [currentTheme, customTheme, applyTheme]);\n\n return (\n <ThemeContext.Provider\n value={{\n currentTheme,\n availableThemes,\n setTheme,\n setCSSVariable,\n getCSSVariable,\n exportThemeCSS,\n }}\n >\n {children}\n </ThemeContext.Provider>\n );\n}\n\nexport function useTheme() {\n const context = useContext(ThemeContext);\n if (context === undefined) {\n throw new Error(\"useTheme must be used within a ThemeProvider\");\n }\n return context;\n}\n","{\n \"name\": \"Dark\",\n \"id\": \"dark\",\n \"colors\": {\n \"primary\": \"#19bfb7\",\n \"primary-hover\": \"#16a39d\",\n \"primary-active\": \"#138883\",\n \"secondary\": \"#8b9ba8\",\n \"secondary-hover\": \"#a3b4c2\",\n \"background\": \"#0f1419\",\n \"foreground\": \"#e3e8ed\",\n \"muted\": \"#1a2028\",\n \"muted-foreground\": \"#8b9ba8\",\n \"placeholder\": \"#5a6b7a\",\n \"border\": \"#2d3843\"\n },\n \"showcase\": {\n \"bg\": \"#0f1419\",\n \"surface\": \"#1a2028\",\n \"surface-elevated\": \"#242c36\",\n \"text-primary\": \"#e3e8ed\",\n \"text-secondary\": \"#8b9ba8\",\n \"border\": \"#2d3843\"\n },\n \"typography\": {\n \"h1\": \"1.875rem\",\n \"h1-desktop\": \"2.25rem\",\n \"h2\": \"1.5rem\",\n \"h2-desktop\": \"1.875rem\",\n \"h3\": \"1.25rem\",\n \"h3-desktop\": \"1.5rem\",\n \"h4\": \"1.125rem\",\n \"h4-desktop\": \"1.25rem\",\n \"h5\": \"1rem\",\n \"h5-desktop\": \"1.125rem\",\n \"h6\": \"0.875rem\",\n \"h6-desktop\": \"1rem\",\n \"body\": \"0.875rem\",\n \"body-desktop\": \"1rem\",\n \"small\": \"0.75rem\",\n \"small-desktop\": \"0.875rem\",\n \"caption\": \"0.6875rem\"\n },\n \"semanticColors\": {\n \"info\": \"#4d9de0\",\n \"info-foreground\": \"#0f1419\",\n \"info-muted\": \"#1a3a52\",\n \"info-muted-foreground\": \"#7bb5e8\",\n \"info-border\": \"#4d9de0\",\n \"success\": \"#4ec9b0\",\n \"success-foreground\": \"#0f1419\",\n \"success-muted\": \"#1a3d35\",\n \"success-muted-foreground\": \"#7dd8c1\",\n \"success-border\": \"#4ec9b0\",\n \"warning\": \"#d4a574\",\n \"warning-foreground\": \"#0f1419\",\n \"warning-muted\": \"#3d2f1f\",\n \"warning-muted-foreground\": \"#e0ba92\",\n \"warning-border\": \"#d4a574\",\n \"error\": \"#e07088\",\n \"error-foreground\": \"#0f1419\",\n \"error-muted\": \"#3d1f27\",\n \"error-muted-foreground\": \"#ed98ab\",\n \"error-border\": \"#e07088\"\n },\n \"components\": {\n \"checkbox\": {\n \"border-color\": \"#3d4855\",\n \"checked-color\": \"#19bfb7\",\n \"label-color\": \"#c5ced8\",\n \"hover-bg\": \"rgba(25, 191, 183, 0.12)\"\n },\n \"radio\": {\n \"border-color\": \"#3d4855\",\n \"checked-color\": \"#19bfb7\",\n \"label-color\": \"#c5ced8\",\n \"hover-bg\": \"rgba(25, 191, 183, 0.12)\"\n },\n \"button\": {\n \"primary-text\": \"#0f1419\",\n \"secondary-text\": \"#e3e8ed\"\n },\n \"card-icons\": {\n \"blue-bg\": \"#1a3452\",\n \"blue-bg-hover\": \"#234a6f\",\n \"blue-text\": \"#7bb5e8\",\n \"purple-bg\": \"#3a2854\",\n \"purple-bg-hover\": \"#4d3570\",\n \"purple-text\": \"#c9a5e8\",\n \"green-bg\": \"#1a3d35\",\n \"green-bg-hover\": \"#235447\",\n \"green-text\": \"#7dd8c1\",\n \"orange-bg\": \"#3d2f1f\",\n \"orange-bg-hover\": \"#543f2a\",\n \"orange-text\": \"#e0ba92\",\n \"pink-bg\": \"#3d1f2e\",\n \"pink-bg-hover\": \"#542a3e\",\n \"pink-text\": \"#ed98ba\",\n \"indigo-bg\": \"#2a2854\",\n \"indigo-bg-hover\": \"#383570\",\n \"indigo-text\": \"#a8a5e8\"\n }\n },\n \"transitions\": {\n \"drawer-duration\": \"500ms\"\n },\n \"overlay\": {\n \"background\": \"rgba(0, 0, 0, 0.5)\"\n }\n}\n","{\n \"name\": \"Light\",\n \"id\": \"light\",\n \"colors\": {\n \"primary\": \"#3b82f6\",\n \"primary-hover\": \"#2563eb\",\n \"primary-active\": \"#1d4ed8\",\n \"secondary\": \"#6b7280\",\n \"secondary-hover\": \"#4b5563\",\n \"background\": \"#ffffff\",\n \"foreground\": \"#111827\",\n \"muted\": \"#f3f4f6\",\n \"muted-foreground\": \"#6b7280\",\n \"placeholder\": \"#9ca3af\",\n \"border\": \"#9ca3af\"\n },\n \"showcase\": {\n \"bg\": \"#ffffff\",\n \"surface\": \"#f9fafb\",\n \"surface-elevated\": \"#f3f4f6\",\n \"text-primary\": \"#111827\",\n \"text-secondary\": \"#6b7280\",\n \"border\": \"#e5e7eb\"\n },\n \"typography\": {\n \"h1\": \"1.875rem\",\n \"h1-desktop\": \"2.25rem\",\n \"h2\": \"1.5rem\",\n \"h2-desktop\": \"1.875rem\",\n \"h3\": \"1.25rem\",\n \"h3-desktop\": \"1.5rem\",\n \"h4\": \"1.125rem\",\n \"h4-desktop\": \"1.25rem\",\n \"h5\": \"1rem\",\n \"h5-desktop\": \"1.125rem\",\n \"h6\": \"0.875rem\",\n \"h6-desktop\": \"1rem\",\n \"body\": \"0.875rem\",\n \"body-desktop\": \"1rem\",\n \"small\": \"0.75rem\",\n \"small-desktop\": \"0.875rem\",\n \"caption\": \"0.6875rem\"\n },\n \"semanticColors\": {\n \"info\": \"#3b82f6\",\n \"info-foreground\": \"#ffffff\",\n \"info-muted\": \"#eff6ff\",\n \"info-muted-foreground\": \"#1d4ed8\",\n \"info-border\": \"#3b82f6\",\n \"success\": \"#22c55e\",\n \"success-foreground\": \"#ffffff\",\n \"success-muted\": \"#f0fdf4\",\n \"success-muted-foreground\": \"#15803d\",\n \"success-border\": \"#22c55e\",\n \"warning\": \"#eab308\",\n \"warning-foreground\": \"#ffffff\",\n \"warning-muted\": \"#fefce8\",\n \"warning-muted-foreground\": \"#a16207\",\n \"warning-border\": \"#eab308\",\n \"error\": \"#ef4444\",\n \"error-foreground\": \"#ffffff\",\n \"error-muted\": \"#fef2f2\",\n \"error-muted-foreground\": \"#b91c1c\",\n \"error-border\": \"#ef4444\"\n },\n \"components\": {\n \"checkbox\": {\n \"border-color\": \"#9ca3af\",\n \"checked-color\": \"#3b82f6\",\n \"label-color\": \"#4b5563\",\n \"hover-bg\": \"rgba(37, 99, 235, 0.1)\"\n },\n \"radio\": {\n \"border-color\": \"#9ca3af\",\n \"checked-color\": \"#3b82f6\",\n \"label-color\": \"#4b5563\",\n \"hover-bg\": \"rgba(37, 99, 235, 0.1)\"\n },\n \"button\": {\n \"primary-text\": \"#ffffff\",\n \"secondary-text\": \"#ffffff\"\n },\n \"card-icons\": {\n \"blue-bg\": \"#dbeafe\",\n \"blue-bg-hover\": \"#bfdbfe\",\n \"blue-text\": \"#2563eb\",\n \"purple-bg\": \"#e9d5ff\",\n \"purple-bg-hover\": \"#d8b4fe\",\n \"purple-text\": \"#9333ea\",\n \"green-bg\": \"#d1fae5\",\n \"green-bg-hover\": \"#a7f3d0\",\n \"green-text\": \"#059669\",\n \"orange-bg\": \"#fed7aa\",\n \"orange-bg-hover\": \"#fdba74\",\n \"orange-text\": \"#ea580c\",\n \"pink-bg\": \"#fce7f3\",\n \"pink-bg-hover\": \"#fbcfe8\",\n \"pink-text\": \"#db2777\",\n \"indigo-bg\": \"#e0e7ff\",\n \"indigo-bg-hover\": \"#c7d2fe\",\n \"indigo-text\": \"#4f46e5\"\n }\n },\n \"transitions\": {\n \"drawer-duration\": \"500ms\"\n },\n \"overlay\": {\n \"background\": \"rgba(0, 0, 0, 0.4)\"\n }\n}\n","import dark from \"./dark.json\";\nimport light from \"./light.json\";\n\nexport const themes = {\n light,\n dark,\n};\n\nexport type ThemeId = keyof typeof themes;\n\nexport default themes;\n"],"mappings":"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","names":["React","rest","import_react","import_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","useFormField","import_jsx_runtime","React","useFormField","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","React","value","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","import_lucide_react","import_react","import_jsx_runtime","React","import_jsx_runtime","import_react","import_jsx_runtime","marksList","import_react","import_jsx_runtime","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","React","import_lucide_react","import_react","import_jsx_runtime","React","import_lucide_react","import_react","import_jsx_runtime","import_lucide_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","React","import_react","themes","import_jsx_runtime"]}
|