@classytic/fluid 0.2.1 → 0.2.4

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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/storage.ts","../src/lib/filter-utils.ts","../src/hooks/use-base-search.ts","../src/hooks/use-media-query.ts","../src/hooks/use-scroll-detection.ts","../src/hooks/use-debounce.ts","../src/hooks/use-copy-to-clipboard.ts","../src/hooks/use-local-storage.ts","../src/components/accordion-wrapper.tsx","../src/components/display-heading.tsx","../src/components/social-icons.tsx","../src/components/thumbnail.tsx","../src/components/custom-pagination.tsx","../src/components/api-pagination.tsx","../src/components/card-wrapper.tsx","../src/components/skeleton-wrappers.tsx","../src/components/collapsible-wrapper.tsx","../src/components/confirm-dialog.tsx","../src/components/error-state.tsx","../src/components/empty-state.tsx","../src/components/loading-state.tsx","../src/components/status-banner.tsx","../src/components/stepper.tsx","../src/components/copy-button.tsx","../src/components/data-table.tsx","../src/components/dialog-wrapper.tsx","../src/components/dropdown-wrapper.tsx","../src/components/info-row.tsx","../src/components/item-helpers.tsx","../src/components/mode-toggle.tsx","../src/components/phone-input.tsx","../src/components/pill.tsx","../src/components/tabs-wrapper.tsx","../src/components/responsive-split-layout.tsx","../src/components/table-wrapper.tsx","../src/components/tooltip-wrapper.tsx","../src/components/form/form-input.tsx","../src/components/form/form-textarea.tsx","../src/components/form/select-input.tsx","../src/components/form/checkbox-input.tsx","../src/components/form/radio-input.tsx","../src/components/form/switch-input.tsx","../src/components/form/date-input.tsx","../src/components/form/tag-input.tsx","../src/components/form/tag-choice-input.tsx","../src/components/form/combobox-input.tsx","../src/components/form/slug-field.tsx","../src/components/form/form-error-summary.tsx","../src/components/form/date-range-filter.tsx","../src/components/form/date-range-input.tsx","../src/components/event-calendar.tsx","../src/components/animated-wrapper.tsx"],"names":["useState","useCallback","useEffect","useRef","AccordionSection","FaqAccordion","jsxs","jsx","Fragment","_","React","Button","Loader2","AlertTriangle","AlertCircle","React2","StepCircle","StepConnector","Check","ScrollButton","TableRow","TableCell","Table","TableHeader","TableHead","TableBody","ChevronDown","React5","IconItemMedia","FeatureItem","React6","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuRadioGroup","DropdownMenuRadioItem","React7","country","ScrollArea","memo","TabsWrapper","useMemo","TabTrigger","TabContent","DynamicTabs","InputGroup","InputGroupAddon","InputGroupInput","Field","FieldLabel","FieldDescription","Controller","FieldError","dt","Popover","PopoverTrigger","X","PopoverContent","Badge","FieldContent","TagIcon","Input","BaseComboboxInput","React8","CalendarIcon","Calendar","toDate","format","ChevronLeft","ChevronRight"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * A utility module for handling localStorage operations with error handling and SSR safety\r\n */\r\n\r\n/**\r\n * Gets an item from localStorage with parsing and expiry check\r\n * @param {string} key - The key to retrieve from localStorage\r\n * @param {any} defaultValue - Default value to return if key doesn't exist or on error\r\n * @returns {any} The parsed value or defaultValue\r\n */\r\nexport const getStorageItem = <T>(\r\n key: string,\r\n defaultValue: T | null = null,\r\n): T | null => {\r\n if (typeof window === \"undefined\") return defaultValue;\r\n\r\n try {\r\n const item = window.localStorage.getItem(key);\r\n if (!item) return defaultValue;\r\n\r\n const parsed = JSON.parse(item);\r\n\r\n // Check if item has expiry\r\n if (parsed && typeof parsed === \"object\" && parsed.__expiresAt) {\r\n const now = Date.now();\r\n if (now > parsed.__expiresAt) {\r\n // Item has expired, remove it\r\n window.localStorage.removeItem(key);\r\n return defaultValue;\r\n }\r\n // Return the actual value without the expiry metadata\r\n return parsed.value;\r\n }\r\n\r\n return parsed;\r\n } catch (error) {\r\n console.error(`Error reading localStorage key \"${key}\":`, error);\r\n return defaultValue;\r\n }\r\n};\r\n\r\n/**\r\n * Sets an item in localStorage with serialization and optional expiry\r\n * @param {string} key - The key to set in localStorage\r\n * @param {any} value - The value to serialize and store\r\n * @param {number} [ttl] - Time to live in milliseconds (optional)\r\n * @returns {boolean} Success status\r\n */\r\nexport const setStorageItem = <T>(\r\n key: string,\r\n value: T,\r\n ttl: number | null = null,\r\n): boolean => {\r\n if (typeof window === \"undefined\") return false;\r\n\r\n try {\r\n let itemToStore: any = value;\r\n\r\n // If TTL is provided, wrap value with expiry metadata\r\n if (ttl && typeof ttl === \"number\" && ttl > 0) {\r\n itemToStore = {\r\n value,\r\n __expiresAt: Date.now() + ttl,\r\n };\r\n }\r\n\r\n window.localStorage.setItem(key, JSON.stringify(itemToStore));\r\n return true;\r\n } catch (error) {\r\n console.error(`Error setting localStorage key \"${key}\":`, error);\r\n return false;\r\n }\r\n};\r\n\r\n/**\r\n * Removes an item from localStorage\r\n * @param {string} key - The key to remove from localStorage\r\n * @returns {boolean} Success status\r\n */\r\nexport const removeStorageItem = (key: string): boolean => {\r\n if (typeof window === \"undefined\") return false;\r\n\r\n try {\r\n window.localStorage.removeItem(key);\r\n return true;\r\n } catch (error) {\r\n console.error(`Error removing localStorage key \"${key}\":`, error);\r\n return false;\r\n }\r\n};\r\n\r\n/**\r\n * Clears all items from localStorage\r\n * @returns {boolean} Success status\r\n */\r\nexport const clearStorage = (): boolean => {\r\n if (typeof window === \"undefined\") return false;\r\n\r\n try {\r\n window.localStorage.clear();\r\n return true;\r\n } catch (error) {\r\n console.error(\"Error clearing localStorage:\", error);\r\n return false;\r\n }\r\n};\r\n\r\n/**\r\n * Checks if localStorage is empty for a specific key\r\n * @param {string} key - The key to check in localStorage\r\n * @returns {boolean} True if empty or doesn't exist\r\n */\r\nexport const isStorageEmpty = (key: string): boolean => {\r\n const data = getStorageItem(key);\r\n return !data || (Array.isArray(data) && data.length === 0);\r\n};\r\n\r\n/**\r\n * Generates a UUID (v4)\r\n * Uses crypto.randomUUID() when available, with a fallback for older environments.\r\n * @returns {string} A random UUID\r\n */\r\nexport const generateUUID = (): string => {\r\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\r\n return crypto.randomUUID();\r\n }\r\n // Fallback for environments without crypto.randomUUID\r\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n};\r\n\r\n/**\r\n * Common expiry durations in milliseconds\r\n */\r\nexport const TTL = {\r\n MINUTE: 60 * 1000,\r\n HOUR: 60 * 60 * 1000,\r\n DAY: 24 * 60 * 60 * 1000,\r\n WEEK: 7 * 24 * 60 * 60 * 1000,\r\n MONTH: 30 * 24 * 60 * 60 * 1000,\r\n} as const;\r\n\r\n/**\r\n * Shorthand object for all localStorage operations\r\n */\r\nexport const storage = {\r\n get: getStorageItem,\r\n set: setStorageItem,\r\n remove: removeStorageItem,\r\n clear: clearStorage,\r\n isEmpty: isStorageEmpty,\r\n generateUUID,\r\n TTL,\r\n};\r\n\r\nexport default storage;\r\n","/**\r\n * Filter utilities for building URL parameters\r\n * Simplified approach since backend handles all operator parsing\r\n */\r\n\r\nexport interface FilterConfig {\r\n paramName: string;\r\n type?: \"array\" | \"string\" | \"number\" | \"boolean\";\r\n defaultValue?: unknown;\r\n}\r\n\r\nexport interface SearchConfig {\r\n basePath: string;\r\n searchFields?: Record<string, string>;\r\n filterFields?: Record<string, FilterConfig>;\r\n defaultSearchType?: string;\r\n}\r\n\r\n/**\r\n * Build URL parameters from filters object\r\n */\r\nexport function buildFilterParams(\r\n filters: Record<string, unknown>,\r\n filterConfig: Record<string, FilterConfig>\r\n): URLSearchParams {\r\n const params = new URLSearchParams();\r\n\r\n Object.entries(filters).forEach(([key, value]) => {\r\n const config = filterConfig[key];\r\n if (!config || !value) return;\r\n\r\n // Skip empty arrays and default values\r\n if (Array.isArray(value) && value.length === 0) return;\r\n if (value === config.defaultValue) return;\r\n\r\n // Handle array filters\r\n if (config.type === \"array\" && Array.isArray(value)) {\r\n if (value.length > 1) {\r\n // Multiple values: use [in] operator\r\n params.set(`${config.paramName}[in]`, value.join(\",\"));\r\n } else if (value.length === 1) {\r\n // Single value: direct assignment\r\n params.set(config.paramName, value[0] as string);\r\n }\r\n } else {\r\n // Non-array filters: direct assignment\r\n params.set(config.paramName, String(value));\r\n }\r\n });\r\n\r\n return params;\r\n}\r\n\r\n/**\r\n * Build search parameters from search state\r\n */\r\nexport function buildSearchParams(\r\n searchType: string,\r\n searchValue: string,\r\n searchFields: Record<string, string>\r\n): URLSearchParams {\r\n const params = new URLSearchParams();\r\n\r\n if (searchValue.trim() && searchFields[searchType]) {\r\n const paramName = searchFields[searchType];\r\n params.set(paramName, searchValue.trim());\r\n }\r\n\r\n return params;\r\n}\r\n\r\n/**\r\n * Build listing status parameters (inventory-specific)\r\n */\r\nexport function buildListingStatusParams(\r\n listingStatus: Record<string, boolean | undefined>\r\n): URLSearchParams {\r\n const params = new URLSearchParams();\r\n\r\n Object.entries(listingStatus).forEach(([platform, hasListings]) => {\r\n if (hasListings !== undefined) {\r\n const operator = hasListings ? \"gt\" : \"eq\";\r\n params.set(`total_list.${platform}[${operator}]`, \"0\");\r\n }\r\n });\r\n\r\n return params;\r\n}\r\n\r\n/**\r\n * Clear specific parameter types from URLSearchParams\r\n */\r\nexport function clearSearchAndFilterParams(\r\n params: URLSearchParams,\r\n config: SearchConfig\r\n): void {\r\n const { searchFields = {}, filterFields = {} } = config;\r\n\r\n // Clear search params\r\n Object.values(searchFields).forEach((paramName) => {\r\n params.delete(paramName);\r\n });\r\n\r\n // Clear filter params\r\n Object.values(filterFields).forEach((fieldConfig) => {\r\n params.delete(fieldConfig.paramName);\r\n // Also clear potential [in] variations\r\n const baseField = fieldConfig.paramName.replace(/\\[.*\\]$/, \"\");\r\n params.delete(`${baseField}[in]`);\r\n });\r\n\r\n // Clear listing status params\r\n const keysToDelete: string[] = [];\r\n for (const [key] of params.entries()) {\r\n if (key.startsWith(\"total_list.\")) {\r\n keysToDelete.push(key);\r\n }\r\n }\r\n keysToDelete.forEach((key) => params.delete(key));\r\n\r\n params.delete(\"page\"); // Reset pagination\r\n}\r\n\r\n/**\r\n * Get API-ready parameters from URL\r\n */\r\nexport function getApiParams(\r\n searchParams: URLSearchParams\r\n): Record<string, string> {\r\n const params: Record<string, string> = {};\r\n\r\n for (const [key, value] of searchParams.entries()) {\r\n params[key] = value;\r\n }\r\n\r\n return params;\r\n}\r\n","\"use client\";\r\n\r\nimport { useState, useCallback } from \"react\";\r\nimport { useRouter, useSearchParams } from \"next/navigation\";\r\nimport {\r\n buildFilterParams,\r\n buildSearchParams,\r\n clearSearchAndFilterParams,\r\n getApiParams,\r\n type FilterConfig,\r\n type SearchConfig,\r\n} from \"../lib/filter-utils\";\r\n\r\nexport interface UseBaseSearchConfig {\r\n basePath: string;\r\n searchFields?: Record<string, string>;\r\n filterFields?: Record<string, FilterConfig>;\r\n defaultSearchType?: string;\r\n}\r\n\r\nexport interface UseBaseSearchReturn {\r\n // Search state\r\n searchType: string;\r\n setSearchType: (type: string) => void;\r\n searchValue: string;\r\n setSearchValue: (value: string) => void;\r\n\r\n // Filter state\r\n filters: Record<string, unknown>;\r\n setFilters: React.Dispatch<React.SetStateAction<Record<string, unknown>>>;\r\n updateFilter: (key: string, value: unknown) => void;\r\n\r\n // Actions\r\n handleSearch: () => void;\r\n clearSearch: () => void;\r\n getSearchParams: () => Record<string, string>;\r\n\r\n // Status\r\n hasActiveSearch: boolean;\r\n hasActiveFilters: boolean;\r\n}\r\n\r\n/**\r\n * Base search hook that provides common search functionality\r\n * Can be extended by specific search hooks for different entities\r\n * Supports bracket syntax: field[operator]=value\r\n */\r\nexport function useBaseSearch(config: UseBaseSearchConfig): UseBaseSearchReturn {\r\n const {\r\n basePath,\r\n searchFields = {},\r\n filterFields = {},\r\n defaultSearchType = Object.keys(searchFields)[0] || \"\",\r\n } = config;\r\n\r\n const router = useRouter();\r\n const searchParams = useSearchParams();\r\n\r\n // Initialize search type from URL params\r\n const [searchType, setSearchType] = useState(() => {\r\n for (const [type, paramName] of Object.entries(searchFields)) {\r\n if (searchParams.has(paramName)) {\r\n return type;\r\n }\r\n }\r\n return defaultSearchType;\r\n });\r\n\r\n // Initialize search value from URL params\r\n const [searchValue, setSearchValue] = useState(() => {\r\n for (const paramName of Object.values(searchFields)) {\r\n const value = searchParams.get(paramName);\r\n if (value) return value;\r\n }\r\n return \"\";\r\n });\r\n\r\n // Initialize filter states\r\n const [filters, setFilters] = useState<Record<string, unknown>>(() => {\r\n const initialFilters: Record<string, unknown> = {};\r\n Object.entries(filterFields).forEach(([key, fieldConfig]) => {\r\n const paramValue = searchParams.get(fieldConfig.paramName);\r\n if (paramValue) {\r\n if (fieldConfig.type === \"array\") {\r\n initialFilters[key] = paramValue.split(\",\");\r\n } else {\r\n initialFilters[key] = paramValue;\r\n }\r\n } else {\r\n initialFilters[key] =\r\n fieldConfig.defaultValue || (fieldConfig.type === \"array\" ? [] : \"\");\r\n }\r\n });\r\n return initialFilters;\r\n });\r\n\r\n // Stable config reference for clearSearchAndFilterParams\r\n // Reconstructed from already-destructured values to avoid object identity issues\r\n const stableConfig: UseBaseSearchConfig = {\r\n basePath,\r\n searchFields,\r\n filterFields,\r\n defaultSearchType,\r\n };\r\n\r\n // Handle search submission\r\n const handleSearch = useCallback(() => {\r\n const params = new URLSearchParams(searchParams);\r\n\r\n // Clear existing search and filter params\r\n clearSearchAndFilterParams(params, stableConfig);\r\n\r\n // Add search params\r\n const searchParamsNew = buildSearchParams(searchType, searchValue, searchFields);\r\n for (const [key, value] of searchParamsNew) {\r\n params.set(key, value);\r\n }\r\n\r\n // Add filter params\r\n const filterParams = buildFilterParams(filters, filterFields);\r\n for (const [key, value] of filterParams) {\r\n params.set(key, value);\r\n }\r\n\r\n // Update URL\r\n router.push(`${basePath}?${params.toString()}`);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [searchType, searchValue, filters, searchFields, filterFields, searchParams, router, basePath, defaultSearchType]);\r\n\r\n // Clear search and filters\r\n const clearSearch = useCallback(() => {\r\n const params = new URLSearchParams(searchParams);\r\n\r\n // Clear all search and filter params\r\n clearSearchAndFilterParams(params, stableConfig);\r\n\r\n // Reset state\r\n setSearchValue(\"\");\r\n // Reset search type back to default for consistency\r\n setSearchType(defaultSearchType);\r\n const resetFilters: Record<string, unknown> = {};\r\n Object.entries(filterFields).forEach(([key, fieldConfig]) => {\r\n resetFilters[key] =\r\n fieldConfig.defaultValue || (fieldConfig.type === \"array\" ? [] : \"\");\r\n });\r\n setFilters(resetFilters);\r\n\r\n const next = params.toString();\r\n // If no params remain, navigate to clean basePath\r\n router.push(next ? `${basePath}?${next}` : `${basePath}`);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [searchParams, router, basePath, defaultSearchType, searchFields, filterFields]);\r\n\r\n // Get current search params for API\r\n const getSearchParamsForApi = useCallback(() => {\r\n return getApiParams(searchParams);\r\n }, [searchParams]);\r\n\r\n // Update individual filter\r\n const updateFilter = useCallback((key: string, value: unknown) => {\r\n setFilters((prev) => ({\r\n ...prev,\r\n [key]: value,\r\n }));\r\n }, []);\r\n\r\n // Check if there are active searches or filters\r\n const hasActiveSearch = Object.values(searchFields).some((paramName) => {\r\n return searchParams.has(paramName);\r\n });\r\n\r\n const hasActiveFilters = Object.values(filterFields).some((fieldConfig) => {\r\n const baseField = fieldConfig.paramName.replace(/\\[.*\\]$/, \"\");\r\n return (\r\n searchParams.has(fieldConfig.paramName) ||\r\n searchParams.has(`${baseField}[in]`) ||\r\n searchParams.has(baseField)\r\n );\r\n });\r\n\r\n return {\r\n // Search state\r\n searchType,\r\n setSearchType,\r\n searchValue,\r\n setSearchValue,\r\n\r\n // Filter state\r\n filters,\r\n setFilters,\r\n updateFilter,\r\n\r\n // Actions\r\n handleSearch,\r\n clearSearch,\r\n getSearchParams: getSearchParamsForApi,\r\n\r\n // Status\r\n hasActiveSearch,\r\n hasActiveFilters,\r\n };\r\n}\r\n","import { useSyncExternalStore } from \"react\";\r\n\r\nexport function useMediaQuery(query: string, defaultValue = false) {\r\n const getSnapshot = () => window.matchMedia(query).matches;\r\n const getServerSnapshot = () => defaultValue;\r\n\r\n const subscribe = (onStoreChange: () => void) => {\r\n const media = window.matchMedia(query);\r\n const handler = () => onStoreChange();\r\n media.addEventListener(\"change\", handler);\r\n return () => media.removeEventListener(\"change\", handler);\r\n };\r\n\r\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\r\n}\r\n","import { useState, useCallback, useRef, useEffect, RefObject } from \"react\";\r\n\r\ninterface ScrollState {\r\n canScrollLeft: boolean;\r\n canScrollRight: boolean;\r\n isScrollable: boolean;\r\n}\r\n\r\nexport const useScrollDetection = (\r\n ref: RefObject<HTMLDivElement | null>,\r\n delay = 100\r\n) => {\r\n const [scrollState, setScrollState] = useState<ScrollState>({\r\n canScrollLeft: false,\r\n canScrollRight: false,\r\n isScrollable: false,\r\n });\r\n\r\n const timeoutRef = useRef<ReturnType<typeof setTimeout>>(undefined);\r\n\r\n // Cleanup on unmount\r\n useEffect(() => {\r\n return () => {\r\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\r\n };\r\n }, []);\r\n\r\n const checkScroll = useCallback(() => {\r\n const scrollContainer = ref.current?.querySelector(\r\n '[data-slot=\"scroll-area-viewport\"]'\r\n ) as HTMLElement | null;\r\n if (!scrollContainer) return;\r\n\r\n const { scrollLeft, scrollWidth, clientWidth } = scrollContainer;\r\n const isScrollable = scrollWidth > clientWidth;\r\n const canScrollLeft = scrollLeft > 5;\r\n const canScrollRight = scrollLeft < scrollWidth - clientWidth - 5;\r\n\r\n setScrollState((prev) => {\r\n if (\r\n prev.canScrollLeft !== canScrollLeft ||\r\n prev.canScrollRight !== canScrollRight ||\r\n prev.isScrollable !== isScrollable\r\n ) {\r\n return { canScrollLeft, canScrollRight, isScrollable };\r\n }\r\n return prev;\r\n });\r\n }, [ref]);\r\n\r\n const debouncedCheckScroll = useCallback(() => {\r\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\r\n timeoutRef.current = setTimeout(checkScroll, delay);\r\n }, [checkScroll, delay]);\r\n\r\n return { ...scrollState, checkScroll: debouncedCheckScroll };\r\n};\r\n","\"use client\";\r\n\r\nimport { useState, useEffect, useRef } from \"react\";\r\n\r\n/**\r\n * useDebounce — Returns a debounced version of the input value.\r\n *\r\n * @example\r\n * ```tsx\r\n * const [search, setSearch] = useState(\"\");\r\n * const debouncedSearch = useDebounce(search, 300);\r\n *\r\n * useEffect(() => {\r\n * fetchResults(debouncedSearch);\r\n * }, [debouncedSearch]);\r\n * ```\r\n */\r\nexport function useDebounce<T>(value: T, delay: number = 300): T {\r\n const [debounced, setDebounced] = useState<T>(value);\r\n\r\n useEffect(() => {\r\n const timer = setTimeout(() => setDebounced(value), delay);\r\n return () => clearTimeout(timer);\r\n }, [value, delay]);\r\n\r\n return debounced;\r\n}\r\n\r\n/**\r\n * useDebouncedCallback — Returns a debounced version of a callback function.\r\n *\r\n * @example\r\n * ```tsx\r\n * const debouncedSave = useDebouncedCallback((value: string) => {\r\n * saveToApi(value);\r\n * }, 500);\r\n *\r\n * <Input onChange={(e) => debouncedSave(e.target.value)} />\r\n * ```\r\n */\r\nexport function useDebouncedCallback<T extends (...args: any[]) => any>(\r\n callback: T,\r\n delay: number = 300,\r\n): (...args: Parameters<T>) => void {\r\n const timerRef = useRef<ReturnType<typeof setTimeout>>(undefined);\r\n const callbackRef = useRef(callback);\r\n\r\n // Keep the callback ref fresh\r\n callbackRef.current = callback;\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (timerRef.current) clearTimeout(timerRef.current);\r\n };\r\n }, []);\r\n\r\n return (...args: Parameters<T>) => {\r\n if (timerRef.current) clearTimeout(timerRef.current);\r\n timerRef.current = setTimeout(() => callbackRef.current(...args), delay);\r\n };\r\n}\r\n","\"use client\";\r\n\r\nimport { useState, useCallback, useRef, useEffect } from \"react\";\r\n\r\nexport interface UseCopyToClipboardReturn {\r\n /** Copy text to clipboard */\r\n copy: (text: string) => Promise<boolean>;\r\n /** Whether text was recently copied (resets after timeout) */\r\n copied: boolean;\r\n /** Any error that occurred during copy */\r\n error: Error | null;\r\n /** Reset the copied state manually */\r\n reset: () => void;\r\n}\r\n\r\n/**\r\n * useCopyToClipboard — Copy text to clipboard with status tracking.\r\n *\r\n * @param resetDelay - How long (ms) the `copied` state stays true. Default: 2000\r\n *\r\n * @example\r\n * ```tsx\r\n * const { copy, copied } = useCopyToClipboard();\r\n *\r\n * <Button onClick={() => copy(apiKey)}>\r\n * {copied ? \"Copied!\" : \"Copy API Key\"}\r\n * </Button>\r\n * ```\r\n */\r\nexport function useCopyToClipboard(\r\n resetDelay: number = 2000,\r\n): UseCopyToClipboardReturn {\r\n const [copied, setCopied] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n const timerRef = useRef<ReturnType<typeof setTimeout>>(undefined);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (timerRef.current) clearTimeout(timerRef.current);\r\n };\r\n }, []);\r\n\r\n const reset = useCallback(() => {\r\n setCopied(false);\r\n setError(null);\r\n }, []);\r\n\r\n const copy = useCallback(\r\n async (text: string): Promise<boolean> => {\r\n if (!navigator?.clipboard) {\r\n const err = new Error(\"Clipboard API not available\");\r\n setError(err);\r\n return false;\r\n }\r\n\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n setCopied(true);\r\n setError(null);\r\n\r\n if (timerRef.current) clearTimeout(timerRef.current);\r\n timerRef.current = setTimeout(() => setCopied(false), resetDelay);\r\n\r\n return true;\r\n } catch (e) {\r\n const err = e instanceof Error ? e : new Error(\"Copy failed\");\r\n setError(err);\r\n setCopied(false);\r\n return false;\r\n }\r\n },\r\n [resetDelay],\r\n );\r\n\r\n return { copy, copied, error, reset };\r\n}\r\n","\"use client\";\r\n\r\nimport { useState, useCallback, useEffect, useRef } from \"react\";\r\nimport { storage } from \"../lib/storage\";\r\n\r\n/**\r\n * useLocalStorage — Persist state in localStorage with type safety and optional expiry.\r\n *\r\n * @param key - The localStorage key\r\n * @param initialValue - Default value if no stored value exists\r\n * @param ttl - Time to live in milliseconds (optional)\r\n *\r\n * @example\r\n * ```tsx\r\n * const [theme, setTheme] = useLocalStorage(\"theme\", \"light\");\r\n * const [cache, setCache] = useLocalStorage(\"api-cache\", {}, 60000); // 1 min TTL\r\n * ```\r\n */\r\nexport function useLocalStorage<T>(\r\n key: string,\r\n initialValue: T,\r\n ttl?: number,\r\n): [T, (value: T | ((prev: T) => T)) => void, () => void] {\r\n // Get initial value from storage or use default\r\n const [storedValue, setStoredValue] = useState<T>(() => {\r\n const item = storage.get<T>(key, initialValue);\r\n return item !== null ? item : initialValue;\r\n });\r\n\r\n const keyRef = useRef(key);\r\n const ttlRef = useRef(ttl);\r\n\r\n // Update refs if props change\r\n useEffect(() => {\r\n keyRef.current = key;\r\n ttlRef.current = ttl;\r\n }, [key, ttl]);\r\n\r\n const setValue = useCallback((value: T | ((prev: T) => T)) => {\r\n setStoredValue((prev) => {\r\n const nextValue = value instanceof Function ? value(prev) : value;\r\n storage.set(keyRef.current, nextValue, ttlRef.current);\r\n return nextValue;\r\n });\r\n }, []);\r\n\r\n const removeValue = useCallback(() => {\r\n storage.remove(keyRef.current);\r\n setStoredValue(initialValue);\r\n }, [initialValue]);\r\n\r\n // Sync across tabs\r\n useEffect(() => {\r\n const handleStorage = (e: StorageEvent) => {\r\n if (e.key === keyRef.current) {\r\n // We use storage.get here to leverage the parsing logic,\r\n // though we can't easily pass the newValue directly to it cleanly\r\n // so we just re-read from storage to be safe and get expiry check\r\n const item = storage.get<T>(keyRef.current, initialValue);\r\n setStoredValue(item !== null ? item : initialValue);\r\n }\r\n };\r\n\r\n window.addEventListener(\"storage\", handleStorage);\r\n return () => window.removeEventListener(\"storage\", handleStorage);\r\n }, [initialValue]);\r\n\r\n return [storedValue, setValue, removeValue];\r\n}\r\n","\"use client\";\r\n\r\nimport { ReactNode, memo } from \"react\";\r\nimport {\r\n Accordion,\r\n AccordionItem,\r\n AccordionTrigger,\r\n AccordionContent,\r\n} from \"@/components/ui/accordion\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================================================\r\n// SINGLE ACCORDION SECTION\r\n// ============================================================================\r\n\r\nexport interface AccordionSectionProps {\r\n title: string;\r\n icon?: ReactNode;\r\n children: ReactNode;\r\n defaultOpen?: boolean;\r\n className?: string;\r\n badge?: ReactNode;\r\n}\r\n\r\n/**\r\n * AccordionSection - Single collapsible section with smooth animation\r\n *\r\n * @example\r\n * ```tsx\r\n * <AccordionSection title=\"Settings\" icon={<Settings className=\"h-4 w-4\" />}>\r\n * <div>Content here</div>\r\n * </AccordionSection>\r\n * ```\r\n */\r\nexport const AccordionSection = memo(function AccordionSection({\r\n title,\r\n icon,\r\n children,\r\n defaultOpen = false,\r\n className,\r\n badge,\r\n}: AccordionSectionProps) {\r\n return (\r\n <Accordion\r\n defaultValue={defaultOpen ? [\"section\"] : []}\r\n className={className}\r\n >\r\n <AccordionItem value=\"section\" className=\"border-0\">\r\n <AccordionTrigger className=\"py-3 hover:no-underline\">\r\n <div className=\"flex items-center gap-2\">\r\n {icon && <span className=\"text-muted-foreground\">{icon}</span>}\r\n <span className=\"font-medium\">{title}</span>\r\n {badge}\r\n </div>\r\n </AccordionTrigger>\r\n <AccordionContent>\r\n <div className=\"pt-2\">{children}</div>\r\n </AccordionContent>\r\n </AccordionItem>\r\n </Accordion>\r\n );\r\n});\r\n\r\n// ============================================================================\r\n// FAQ / GROUPED ACCORDION\r\n// ============================================================================\r\n\r\nexport interface FaqItem {\r\n id: string;\r\n question: string;\r\n answer: ReactNode;\r\n}\r\n\r\nexport interface FaqAccordionProps {\r\n items: FaqItem[];\r\n defaultOpen?: string;\r\n className?: string;\r\n /** Allow multiple items to be open at once */\r\n multiple?: boolean;\r\n}\r\n\r\n/**\r\n * FaqAccordion - FAQ-style accordion where only one item can be open by default\r\n *\r\n * @example\r\n * ```tsx\r\n * <FaqAccordion\r\n * items={[\r\n * { id: \"1\", question: \"What is this?\", answer: \"A FAQ accordion\" },\r\n * { id: \"2\", question: \"How does it work?\", answer: \"Click to expand\" },\r\n * ]}\r\n * />\r\n * ```\r\n */\r\nexport const FaqAccordion = memo(function FaqAccordion({\r\n items,\r\n defaultOpen,\r\n className,\r\n multiple = false,\r\n}: FaqAccordionProps) {\r\n return (\r\n <Accordion\r\n defaultValue={defaultOpen ? [defaultOpen] : []}\r\n multiple={multiple}\r\n className={cn(\"w-full\", className)}\r\n >\r\n {items.map((item) => (\r\n <AccordionItem key={item.id} value={item.id}>\r\n <AccordionTrigger className=\"text-left\">\r\n {item.question}\r\n </AccordionTrigger>\r\n <AccordionContent>{item.answer}</AccordionContent>\r\n </AccordionItem>\r\n ))}\r\n </Accordion>\r\n );\r\n});\r\n","import { ReactNode, ElementType } from \"react\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface DisplayHeadingProps {\r\n children: ReactNode;\r\n size?: \"lg\" | \"xl\" | \"2xl\";\r\n align?: \"left\" | \"center\" | \"right\";\r\n className?: string;\r\n highlightText?: string;\r\n highlightColor?: \"primary\" | \"secondary\" | \"accent\" | \"gradient\";\r\n as?: ElementType;\r\n}\r\n\r\n/**\r\n * DisplayHeading - Reusable component for hero/display headings\r\n * Provides consistent typography across the platform\r\n */\r\nexport function DisplayHeading({\r\n children,\r\n size = \"xl\",\r\n align = \"center\",\r\n className,\r\n highlightText,\r\n highlightColor = \"primary\",\r\n as: Component = \"h1\",\r\n ...props\r\n}: DisplayHeadingProps) {\r\n const sizeClasses = {\r\n lg: \"text-3xl lg:text-5xl\",\r\n xl: \"text-4xl lg:text-6xl\",\r\n \"2xl\": \"text-5xl lg:text-7xl\",\r\n };\r\n\r\n const alignClasses = {\r\n left: \"text-left\",\r\n center: \"text-center\",\r\n right: \"text-right\",\r\n };\r\n\r\n const highlightClasses = {\r\n primary: \"text-primary\",\r\n secondary: \"text-secondary\",\r\n accent: \"text-accent\",\r\n gradient:\r\n \"bg-gradient-to-r from-primary to-accent bg-clip-text text-transparent\",\r\n };\r\n\r\n const renderContent = () => {\r\n if (typeof children !== \"string\" || !highlightText) {\r\n return children;\r\n }\r\n\r\n const parts = children.split(highlightText);\r\n return (\r\n <>\r\n {parts[0]}\r\n <span className={highlightClasses[highlightColor]}>{highlightText}</span>\r\n {parts[1]}\r\n </>\r\n );\r\n };\r\n\r\n return (\r\n <Component\r\n className={cn(\r\n \"font-bold tracking-tight text-balance leading-[1.1]\",\r\n sizeClasses[size],\r\n alignClasses[align],\r\n className\r\n )}\r\n {...props}\r\n >\r\n {renderContent()}\r\n </Component>\r\n );\r\n}\r\n","// Social media SVG icons\r\n\r\nexport const FacebookIcon = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z\"></path>\r\n </svg>\r\n);\r\n\r\nexport const GoogleIcon = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"currentColor\"\r\n >\r\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" />\r\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\r\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\r\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\r\n </svg>\r\n);\r\n\r\nexport const TwitterXIcon = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 1200 1227\"\r\n width=\"18\"\r\n height=\"18\"\r\n fill=\"currentColor\"\r\n >\r\n <path d=\"M714.163 519.284L1160.89 0H1055.03L667.137 450.887L357.328 0H0L468.492 681.821L0 1226.37H105.866L515.491 750.218L842.672 1226.37H1200L714.137 519.284H714.163ZM569.165 687.828L521.697 619.934L144.011 79.6944H306.615L611.412 515.685L658.88 583.579L1055.08 1150.3H892.476L569.165 687.854V687.828Z\" />\r\n </svg>\r\n);\r\n\r\nexport const InstagramIcon = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"5\" ry=\"5\"></rect>\r\n <path d=\"M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z\"></path>\r\n <line x1=\"17.5\" y1=\"6.5\" x2=\"17.51\" y2=\"6.5\"></line>\r\n </svg>\r\n);\r\n\r\nexport const WhatsAppIcon = () => (\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"18\" height=\"18\">\r\n <path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z\" />\r\n </svg>\r\n);\r\n","\"use client\";\r\n\r\nimport Image from \"next/image\";\r\nimport { cn } from \"../utils\";\r\n\r\nconst aspectRatios = {\r\n square: \"aspect-square\",\r\n video: \"aspect-video\",\r\n portrait: \"aspect-[3/4]\",\r\n};\r\n\r\nconst sizes = {\r\n small: \"w-16 h-16\",\r\n medium: \"w-32 h-32\",\r\n large: \"w-48 h-48\",\r\n full: \"w-full h-full\",\r\n};\r\n\r\nexport interface ThumbnailProps {\r\n src?: string;\r\n alt?: string;\r\n aspect?: \"square\" | \"video\" | \"portrait\";\r\n size?: \"small\" | \"medium\" | \"large\" | \"full\";\r\n className?: string;\r\n fallback?: string;\r\n onClick?: () => void;\r\n}\r\n\r\nexport function Thumbnail({\r\n src,\r\n alt,\r\n aspect = \"square\",\r\n size = \"medium\",\r\n className,\r\n fallback = \"/placeholder.svg\",\r\n onClick,\r\n}: ThumbnailProps) {\r\n // If a custom size is provided through className, use that instead of predefined sizes\r\n const sizeClass = className?.includes(\"w-\") ? \"\" : sizes[size];\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"relative rounded-md overflow-hidden\",\r\n aspectRatios[aspect],\r\n sizeClass,\r\n onClick && \"cursor-pointer\",\r\n className\r\n )}\r\n onClick={onClick}\r\n >\r\n <Image\r\n src={src || fallback}\r\n alt={alt || \"Thumbnail\"}\r\n fill\r\n className=\"object-cover\"\r\n sizes={getSizes(size)}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nconst getSizes = (size: \"small\" | \"medium\" | \"large\" | \"full\") => {\r\n switch (size) {\r\n case \"small\":\r\n return \"64px\";\r\n case \"medium\":\r\n return \"128px\";\r\n case \"large\":\r\n return \"192px\";\r\n case \"full\":\r\n return \"(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw\";\r\n default:\r\n return \"128px\";\r\n }\r\n};\r\n","\"use client\";\r\n\r\nimport { useEffect, useState } from \"react\";\r\nimport {\r\n Pagination,\r\n PaginationContent,\r\n PaginationItem,\r\n PaginationLink,\r\n PaginationNext,\r\n PaginationPrevious,\r\n} from \"@/components/ui/pagination\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface CustomPaginationProps {\r\n page: number;\r\n pages: number;\r\n hasNext: boolean;\r\n hasPrev: boolean;\r\n onPageChange: (page: number) => void;\r\n}\r\n\r\nexport function CustomPagination({\r\n page,\r\n onPageChange,\r\n pages,\r\n hasPrev,\r\n hasNext,\r\n}: CustomPaginationProps) {\r\n const [isMobile, setIsMobile] = useState(false);\r\n const currentPageNum = Number(page);\r\n\r\n useEffect(() => {\r\n const checkMobile = () => {\r\n setIsMobile(window.innerWidth < 640);\r\n };\r\n\r\n checkMobile();\r\n window.addEventListener(\"resize\", checkMobile);\r\n return () => window.removeEventListener(\"resize\", checkMobile);\r\n }, []);\r\n\r\n if (pages <= 1) return null;\r\n\r\n const getPageNumbers = (): (number | string)[] => {\r\n const delta = isMobile ? 1 : 2;\r\n const range: number[] = [];\r\n const rangeWithDots: (number | string)[] = [];\r\n\r\n for (\r\n let i = Math.max(2, currentPageNum - delta);\r\n i <= Math.min(pages - 1, currentPageNum + delta);\r\n i++\r\n ) {\r\n range.push(i);\r\n }\r\n\r\n if (currentPageNum - delta > 2) {\r\n rangeWithDots.push(1, \"...\");\r\n } else {\r\n rangeWithDots.push(1);\r\n }\r\n\r\n rangeWithDots.push(...range);\r\n\r\n if (currentPageNum + delta < pages - 1) {\r\n rangeWithDots.push(\"...\", pages);\r\n } else if (pages > 1) {\r\n if (!range.includes(pages)) {\r\n rangeWithDots.push(pages);\r\n }\r\n }\r\n\r\n return [...new Set(rangeWithDots)];\r\n };\r\n\r\n if (isMobile && pages > 5) {\r\n return (\r\n <Pagination className=\"mx-0 w-auto\">\r\n <PaginationContent className=\"gap-1\">\r\n <PaginationItem>\r\n <PaginationPrevious\r\n onClick={() => (hasPrev ? onPageChange(currentPageNum - 1) : undefined)}\r\n className={cn(\r\n \"cursor-pointer transition-colors h-8 px-2 text-xs\",\r\n !hasPrev && \"pointer-events-none opacity-50 cursor-not-allowed\",\r\n hasPrev && \"hover:bg-accent hover:text-accent-foreground\"\r\n )}\r\n aria-disabled={!hasPrev}\r\n />\r\n </PaginationItem>\r\n\r\n <PaginationItem>\r\n <div className=\"flex h-8 items-center justify-center px-3 text-xs font-medium bg-primary text-primary-foreground rounded-md\">\r\n {currentPageNum} / {pages}\r\n </div>\r\n </PaginationItem>\r\n\r\n <PaginationItem>\r\n <PaginationNext\r\n onClick={() => (hasNext ? onPageChange(currentPageNum + 1) : undefined)}\r\n className={cn(\r\n \"cursor-pointer transition-colors h-8 px-2 text-xs\",\r\n !hasNext && \"pointer-events-none opacity-50 cursor-not-allowed\",\r\n hasNext && \"hover:bg-accent hover:text-accent-foreground\"\r\n )}\r\n aria-disabled={!hasNext}\r\n />\r\n </PaginationItem>\r\n </PaginationContent>\r\n </Pagination>\r\n );\r\n }\r\n\r\n return (\r\n <Pagination className=\"mx-0 w-auto\">\r\n <PaginationContent className=\"gap-1 flex-wrap\">\r\n <PaginationItem>\r\n <PaginationPrevious\r\n onClick={() => (hasPrev ? onPageChange(currentPageNum - 1) : undefined)}\r\n className={cn(\r\n \"cursor-pointer transition-colors\",\r\n isMobile ? \"h-8 px-2 text-xs\" : \"h-9 px-3 text-sm\",\r\n !hasPrev && \"pointer-events-none opacity-50 cursor-not-allowed\",\r\n hasPrev && \"hover:bg-accent hover:text-accent-foreground\"\r\n )}\r\n aria-disabled={!hasPrev}\r\n />\r\n </PaginationItem>\r\n\r\n {getPageNumbers().map((pageNum, index) => (\r\n <PaginationItem key={`pagination-page-${pageNum}-${index}`}>\r\n {pageNum === \"...\" ? (\r\n <span\r\n className={cn(\r\n \"flex items-center justify-center text-muted-foreground\",\r\n isMobile ? \"h-8 w-8 text-xs\" : \"h-9 w-9 text-sm\"\r\n )}\r\n >\r\n ...\r\n </span>\r\n ) : (\r\n <PaginationLink\r\n className={cn(\r\n \"cursor-pointer transition-colors\",\r\n isMobile ? \"h-8 w-8 text-xs p-0\" : \"h-9 w-9 text-sm p-0\",\r\n \"hover:bg-accent hover:text-accent-foreground\",\r\n Number(currentPageNum) === Number(pageNum) &&\r\n \"bg-primary text-primary-foreground hover:bg-primary/90\"\r\n )}\r\n onClick={() =>\r\n typeof pageNum === \"number\" ? onPageChange(pageNum) : undefined\r\n }\r\n isActive={Number(currentPageNum) === Number(pageNum)}\r\n aria-label={`Go to page ${pageNum}`}\r\n aria-current={\r\n Number(currentPageNum) === Number(pageNum) ? \"page\" : undefined\r\n }\r\n >\r\n {pageNum}\r\n </PaginationLink>\r\n )}\r\n </PaginationItem>\r\n ))}\r\n\r\n <PaginationItem>\r\n <PaginationNext\r\n onClick={() => (hasNext ? onPageChange(currentPageNum + 1) : undefined)}\r\n className={cn(\r\n \"cursor-pointer transition-colors\",\r\n isMobile ? \"h-8 px-2 text-xs\" : \"h-9 px-3 text-sm\",\r\n !hasNext && \"pointer-events-none opacity-50 cursor-not-allowed\",\r\n hasNext && \"hover:bg-accent hover:text-accent-foreground\"\r\n )}\r\n aria-disabled={!hasNext}\r\n />\r\n </PaginationItem>\r\n </PaginationContent>\r\n </Pagination>\r\n );\r\n}\r\n\r\nexport interface PaginationInfoProps {\r\n page: number;\r\n total: number;\r\n limit?: number;\r\n}\r\n\r\nexport function PaginationInfo({ page, total, limit = 10 }: PaginationInfoProps) {\r\n const [isMobile, setIsMobile] = useState(false);\r\n\r\n useEffect(() => {\r\n const checkMobile = () => {\r\n setIsMobile(window.innerWidth < 640);\r\n };\r\n\r\n checkMobile();\r\n window.addEventListener(\"resize\", checkMobile);\r\n return () => window.removeEventListener(\"resize\", checkMobile);\r\n }, []);\r\n\r\n if (total === 0) {\r\n return (\r\n <div className=\"flex-1 text-sm text-muted-foreground\">\r\n <p>No entries found</p>\r\n </div>\r\n );\r\n }\r\n\r\n const startEntry = (page - 1) * limit + 1;\r\n const endEntry = Math.min(page * limit, total);\r\n\r\n return (\r\n <div className=\"flex-1 text-sm text-muted-foreground\">\r\n <p className={cn(\"whitespace-nowrap\", isMobile && \"text-xs\")}>\r\n {isMobile ? (\r\n <span>\r\n {startEntry.toLocaleString()}-{endEntry.toLocaleString()} of{\" \"}\r\n {total.toLocaleString()}\r\n </span>\r\n ) : (\r\n <span>\r\n Showing{\" \"}\r\n <span className=\"font-medium text-foreground\">\r\n {startEntry.toLocaleString()}\r\n </span>{\" \"}\r\n to{\" \"}\r\n <span className=\"font-medium text-foreground\">\r\n {endEntry.toLocaleString()}\r\n </span>{\" \"}\r\n of{\" \"}\r\n <span className=\"font-medium text-foreground\">\r\n {total.toLocaleString()}\r\n </span>{\" \"}\r\n {total === 1 ? \"result\" : \"results\"}\r\n </span>\r\n )}\r\n </p>\r\n </div>\r\n );\r\n}\r\n\r\nexport type { CustomPaginationProps as CustomPaginationPropsExport };\r\nexport type { PaginationInfoProps as PaginationInfoPropsExport };\r\n","\"use client\";\r\n\r\nimport { CustomPagination, PaginationInfo } from \"./custom-pagination\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface ApiPaginationData {\r\n total: number;\r\n pages: number;\r\n page: number;\r\n limit: number;\r\n hasNext: boolean;\r\n hasPrev: boolean;\r\n}\r\n\r\nexport interface ApiPaginationProps extends Partial<ApiPaginationData> {\r\n onPageChange?: (page: number) => void;\r\n className?: string;\r\n showInfo?: boolean;\r\n infoPosition?: \"left\" | \"right\";\r\n}\r\n\r\n/**\r\n * ApiPagination - A reusable pagination component for API-driven data\r\n */\r\nexport function ApiPagination({\r\n total = 0,\r\n limit = 10,\r\n pages = 1,\r\n page = 1,\r\n hasNext = false,\r\n hasPrev = false,\r\n onPageChange = () => {},\r\n className,\r\n showInfo = true,\r\n infoPosition = \"left\",\r\n}: ApiPaginationProps) {\r\n const infoComponent = showInfo && (\r\n <div className=\"shrink-0\">\r\n <PaginationInfo total={total} page={page} limit={limit} />\r\n </div>\r\n );\r\n\r\n const paginationComponent = (\r\n <div className=\"flex justify-center sm:justify-end\">\r\n <CustomPagination\r\n page={page}\r\n pages={pages}\r\n hasPrev={hasPrev}\r\n hasNext={hasNext}\r\n onPageChange={onPageChange}\r\n />\r\n </div>\r\n );\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"shrink-0 bg-muted/30 rounded-lg border border-border p-3 mb-2\",\r\n className\r\n )}\r\n >\r\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between sm:gap-4\">\r\n {infoPosition === \"left\" ? (\r\n <>\r\n <div className=\"order-2 sm:order-1\">{infoComponent}</div>\r\n <div className=\"order-1 sm:order-2\">{paginationComponent}</div>\r\n </>\r\n ) : (\r\n <>\r\n <div className=\"order-1 sm:order-1\">{paginationComponent}</div>\r\n <div className=\"order-2 sm:order-2\">{infoComponent}</div>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { ReactNode } from \"react\";\r\nimport {\r\n Card,\r\n CardContent,\r\n CardHeader,\r\n CardTitle,\r\n CardDescription,\r\n CardFooter,\r\n} from \"@/components/ui/card\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================================================\r\n// CONSTANTS (module-scope to avoid recreation on every render)\r\n// ============================================================================\r\n\r\nconst CARD_VARIANTS = {\r\n default: \"\",\r\n outline: \"border-2\",\r\n ghost: \"border-0 shadow-none bg-transparent\",\r\n elevated: \"shadow-lg border-0\",\r\n primary: \"border-primary/20 bg-primary/5\",\r\n secondary: \"border-secondary/20 bg-secondary/5\",\r\n destructive: \"border-destructive/20 bg-destructive/5\",\r\n success: \"border-green-500/20 bg-green-500/5\",\r\n warning: \"border-yellow-500/20 bg-yellow-500/5\",\r\n} as const;\r\n\r\nconst CARD_SIZES = {\r\n sm: \"p-3\",\r\n default: \"p-6\",\r\n lg: \"p-8\",\r\n xl: \"p-10\",\r\n} as const;\r\n\r\nconst CARD_CONTENT_SIZES = {\r\n sm: \"pt-3\",\r\n default: \"pt-6\",\r\n lg: \"pt-8\",\r\n xl: \"pt-10\",\r\n} as const;\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface CardWrapperProps {\r\n title?: ReactNode;\r\n description?: ReactNode;\r\n children?: ReactNode;\r\n footer?: ReactNode;\r\n className?: string;\r\n headerClassName?: string;\r\n contentClassName?: string;\r\n footerClassName?: string;\r\n variant?: keyof typeof CARD_VARIANTS;\r\n size?: keyof typeof CARD_SIZES;\r\n hideHeader?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENTS\r\n// ============================================================================\r\n\r\nexport function CardWrapper({\r\n title,\r\n description,\r\n children,\r\n footer,\r\n className,\r\n headerClassName,\r\n contentClassName,\r\n footerClassName,\r\n variant = \"default\",\r\n size = \"default\",\r\n hideHeader = false,\r\n ...props\r\n}: CardWrapperProps) {\r\n\r\n return (\r\n <Card className={cn(CARD_VARIANTS[variant], className)} {...props}>\r\n {!hideHeader && (title || description) && (\r\n <CardHeader className={cn(CARD_SIZES[size], \"pb-4\", headerClassName)}>\r\n {title && (\r\n <CardTitle className=\"text-lg font-semibold\">{title}</CardTitle>\r\n )}\r\n {description && <CardDescription>{description}</CardDescription>}\r\n </CardHeader>\r\n )}\r\n\r\n <CardContent\r\n className={cn(hideHeader ? CARD_SIZES[size] : CARD_CONTENT_SIZES[size], contentClassName)}\r\n >\r\n {children}\r\n </CardContent>\r\n\r\n {footer && (\r\n <CardFooter className={cn(CARD_SIZES[size], \"pt-4 border-t\", footerClassName)}>\r\n <div className=\"w-full\">{footer}</div>\r\n </CardFooter>\r\n )}\r\n </Card>\r\n );\r\n}\r\n\r\nexport interface DataCardProps extends Omit<CardWrapperProps, \"children\"> {\r\n /** Each item's `color` should be a complete Tailwind class (e.g. \"text-green-600\") */\r\n data: Array<{ label: string; value: ReactNode; color?: string }>;\r\n}\r\n\r\nexport function DataCard({ title, data, className, ...props }: DataCardProps) {\r\n return (\r\n <CardWrapper title={title} className={cn(\"space-y-4\", className)} {...props}>\r\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-4\">\r\n {data.map((item, index) => (\r\n <div key={index} className=\"space-y-1\">\r\n <p className=\"text-sm text-muted-foreground\">{item.label}</p>\r\n <p className={cn(\"text-lg font-semibold\", item.color)}>\r\n {item.value}\r\n </p>\r\n </div>\r\n ))}\r\n </div>\r\n </CardWrapper>\r\n );\r\n}\r\n\r\nexport interface LoadingCardProps extends Omit<CardWrapperProps, \"children\"> {}\r\n\r\nexport function LoadingCard({ title, description, className, ...props }: LoadingCardProps) {\r\n return (\r\n <CardWrapper title={title} description={description} className={className} {...props}>\r\n <div className=\"flex items-center justify-center py-8\">\r\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-primary\"></div>\r\n <span className=\"ml-2\">Loading...</span>\r\n </div>\r\n </CardWrapper>\r\n );\r\n}\r\n\r\nexport interface StatsCardProps extends Omit<CardWrapperProps, \"children\" | \"variant\"> {\r\n value: ReactNode;\r\n icon?: ReactNode;\r\n trend?: { type: \"up\" | \"down\" | \"neutral\"; value: string };\r\n /** Visual variant for the card and icon styling */\r\n statsVariant?: \"default\" | \"success\" | \"warning\" | \"danger\" | \"info\";\r\n /** Additional class for the icon wrapper */\r\n iconClassName?: string;\r\n}\r\n\r\nconst STATS_CARD_VARIANTS = {\r\n default: \"\",\r\n success: \"bg-green-50 border-green-200 dark:bg-green-950/30 dark:border-green-900\",\r\n warning: \"bg-yellow-50 border-yellow-200 dark:bg-yellow-950/30 dark:border-yellow-900\",\r\n danger: \"bg-red-50 border-red-200 dark:bg-red-950/30 dark:border-red-900\",\r\n info: \"bg-blue-50 border-blue-200 dark:bg-blue-950/30 dark:border-blue-900\",\r\n} as const;\r\n\r\nconst STATS_ICON_VARIANTS = {\r\n default: \"text-muted-foreground\",\r\n success: \"text-green-600 dark:text-green-400\",\r\n warning: \"text-yellow-600 dark:text-yellow-400\",\r\n danger: \"text-red-600 dark:text-red-400\",\r\n info: \"text-blue-600 dark:text-blue-400\",\r\n} as const;\r\n\r\nconst STATS_ICON_WRAPPER_VARIANTS = {\r\n default: \"bg-muted border border-border\",\r\n success: \"bg-green-100/50 dark:bg-green-900/30\",\r\n warning: \"bg-yellow-100/50 dark:bg-yellow-900/30\",\r\n danger: \"bg-red-100/50 dark:bg-red-900/30\",\r\n info: \"bg-blue-100/50 dark:bg-blue-900/30\",\r\n} as const;\r\n\r\nexport function StatsCard({\r\n title,\r\n value,\r\n description,\r\n icon,\r\n trend,\r\n className,\r\n statsVariant = \"default\",\r\n iconClassName,\r\n ...props\r\n}: StatsCardProps) {\r\n return (\r\n <CardWrapper\r\n className={cn(\"relative overflow-hidden\", STATS_CARD_VARIANTS[statsVariant], className)}\r\n size=\"sm\"\r\n hideHeader\r\n {...props}\r\n >\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"space-y-1\">\r\n <p className=\"text-sm font-medium text-muted-foreground\">{title}</p>\r\n <p className=\"text-2xl font-bold\">{value}</p>\r\n {description && (\r\n <p className=\"text-xs text-muted-foreground\">{description}</p>\r\n )}\r\n </div>\r\n {icon && (\r\n <div className={cn(\r\n \"p-2 rounded-md\",\r\n STATS_ICON_WRAPPER_VARIANTS[statsVariant],\r\n STATS_ICON_VARIANTS[statsVariant],\r\n iconClassName\r\n )}>\r\n {icon}\r\n </div>\r\n )}\r\n </div>\r\n {trend && (\r\n <div\r\n className={cn(\r\n \"absolute top-2 right-2 text-xs px-2 py-1 rounded-full\",\r\n trend.type === \"up\" && \"bg-green-100 text-green-700 dark:bg-green-900/50 dark:text-green-300\",\r\n trend.type === \"down\" && \"bg-red-100 text-red-700 dark:bg-red-900/50 dark:text-red-300\",\r\n trend.type === \"neutral\" && \"bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-300\"\r\n )}\r\n >\r\n {trend.value}\r\n </div>\r\n )}\r\n </CardWrapper>\r\n );\r\n}\r\n\r\nexport interface DraggableCardProps extends Omit<CardWrapperProps, \"children\"> {\r\n subtitle?: ReactNode;\r\n badges?: ReactNode;\r\n actions?: ReactNode;\r\n details?: ReactNode;\r\n dragHandleProps?: any;\r\n isDragging?: boolean;\r\n isHidden?: boolean;\r\n children?: ReactNode;\r\n}\r\n\r\nexport function DraggableCard({\r\n title,\r\n subtitle,\r\n badges,\r\n actions,\r\n details,\r\n dragHandleProps,\r\n className,\r\n isDragging,\r\n isHidden,\r\n children,\r\n ...props\r\n}: DraggableCardProps) {\r\n return (\r\n <CardWrapper\r\n hideHeader\r\n className={cn(\r\n \"transition-all\",\r\n isDragging && \"shadow-lg rotate-2\",\r\n isHidden && \"opacity-50\",\r\n className\r\n )}\r\n contentClassName=\"!pt-4\"\r\n {...props}\r\n >\r\n <div className=\"flex items-start gap-3\">\r\n {dragHandleProps && (\r\n <div {...dragHandleProps} className=\"mt-1 cursor-grab hover:text-foreground\">\r\n {dragHandleProps.icon || (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className=\"text-muted-foreground\"\r\n >\r\n <circle cx=\"9\" cy=\"12\" r=\"1\" />\r\n <circle cx=\"9\" cy=\"5\" r=\"1\" />\r\n <circle cx=\"9\" cy=\"19\" r=\"1\" />\r\n <circle cx=\"15\" cy=\"12\" r=\"1\" />\r\n <circle cx=\"15\" cy=\"5\" r=\"1\" />\r\n <circle cx=\"15\" cy=\"19\" r=\"1\" />\r\n </svg>\r\n )}\r\n </div>\r\n )}\r\n\r\n <div className=\"flex-1 min-w-0 space-y-3\">\r\n <div className=\"flex flex-wrap items-center gap-2\">\r\n {title && <h4 className=\"font-medium\">{title}</h4>}\r\n {badges && <div className=\"flex flex-wrap gap-1\">{badges}</div>}\r\n </div>\r\n\r\n {subtitle && (\r\n <p className=\"text-xs text-muted-foreground break-words\">{subtitle}</p>\r\n )}\r\n\r\n {details}\r\n {children}\r\n </div>\r\n\r\n {actions && (\r\n <div className=\"flex items-center gap-2 flex-shrink-0\">{actions}</div>\r\n )}\r\n </div>\r\n </CardWrapper>\r\n );\r\n}\r\n","import { Skeleton } from \"@/components/ui/skeleton\";\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TableHeader,\r\n TableRow,\r\n} from \"@/components/ui/table\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================================================\r\n// SKELETON TABLE\r\n// ============================================================================\r\n\r\nexport interface SkeletonTableProps {\r\n /** Number of skeleton rows */\r\n rows?: number;\r\n /** Number of skeleton columns */\r\n columns?: number;\r\n /** Optional column headers - if provided, shows text instead of skeleton */\r\n headers?: string[];\r\n /** Additional CSS classes */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * SkeletonTable - Loading skeleton for tables\r\n * Matches DataTable structure for consistent loading states\r\n *\r\n * @example\r\n * ```tsx\r\n * <SkeletonTable rows={5} columns={4} />\r\n * <SkeletonTable headers={[\"Name\", \"Email\", \"Status\"]} rows={10} />\r\n * ```\r\n */\r\nexport function SkeletonTable({\r\n rows = 5,\r\n columns = 6,\r\n headers,\r\n className,\r\n}: SkeletonTableProps) {\r\n const columnCount = headers?.length || columns;\r\n\r\n return (\r\n <div className={cn(\"rounded-md border\", className)}>\r\n <Table>\r\n <TableHeader>\r\n <TableRow>\r\n {headers\r\n ? headers.map((header, i) => (\r\n <TableHead key={i}>{header}</TableHead>\r\n ))\r\n : Array.from({ length: columnCount }).map((_, i) => (\r\n <TableHead key={i}>\r\n <Skeleton className=\"h-4 w-20\" />\r\n </TableHead>\r\n ))}\r\n </TableRow>\r\n </TableHeader>\r\n <TableBody>\r\n {Array.from({ length: rows }).map((_, rowIndex) => (\r\n <TableRow key={rowIndex}>\r\n {Array.from({ length: columnCount }).map((_, colIndex) => (\r\n <TableCell key={colIndex}>\r\n <Skeleton className=\"h-4 w-full\" />\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n ))}\r\n </TableBody>\r\n </Table>\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// SKELETON LIST\r\n// ============================================================================\r\n\r\nexport interface SkeletonListProps {\r\n /** Number of skeleton items */\r\n items?: number;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Show avatar placeholder */\r\n showAvatar?: boolean;\r\n /** Avatar shape */\r\n avatarShape?: \"circle\" | \"square\";\r\n}\r\n\r\n/**\r\n * SkeletonList - Compact skeleton for lists with avatars\r\n *\r\n * @example\r\n * ```tsx\r\n * <SkeletonList items={5} />\r\n * <SkeletonList items={3} showAvatar={false} />\r\n * ```\r\n */\r\nexport function SkeletonList({\r\n items = 3,\r\n className,\r\n showAvatar = true,\r\n avatarShape = \"circle\",\r\n}: SkeletonListProps) {\r\n return (\r\n <div className={cn(\"space-y-3\", className)}>\r\n {Array.from({ length: items }).map((_, i) => (\r\n <div key={i} className=\"flex items-center gap-3\">\r\n {showAvatar && (\r\n <Skeleton\r\n className={cn(\r\n \"h-10 w-10 flex-shrink-0\",\r\n avatarShape === \"circle\" ? \"rounded-full\" : \"rounded-md\"\r\n )}\r\n />\r\n )}\r\n <div className=\"flex-1 space-y-2\">\r\n <Skeleton className=\"h-4 w-full\" />\r\n <Skeleton className=\"h-3 w-3/4\" />\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// SKELETON CARD\r\n// ============================================================================\r\n\r\nexport interface SkeletonCardProps {\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Show action buttons placeholder */\r\n showActions?: boolean;\r\n /** Number of text lines */\r\n lines?: number;\r\n}\r\n\r\n/**\r\n * SkeletonCard - Card skeleton for grid layouts\r\n *\r\n * @example\r\n * ```tsx\r\n * <SkeletonCard />\r\n * <SkeletonCard showActions={false} lines={2} />\r\n * ```\r\n */\r\nexport function SkeletonCard({\r\n className,\r\n showActions = true,\r\n lines = 3,\r\n}: SkeletonCardProps) {\r\n return (\r\n <div className={cn(\"rounded-lg border p-4 space-y-3\", className)}>\r\n <Skeleton className=\"h-5 w-3/4\" />\r\n {Array.from({ length: lines - 1 }).map((_, i) => (\r\n <Skeleton\r\n key={i}\r\n className={cn(\"h-4\", i === lines - 2 ? \"w-5/6\" : \"w-full\")}\r\n />\r\n ))}\r\n {showActions && (\r\n <div className=\"flex gap-2 pt-2\">\r\n <Skeleton className=\"h-8 w-20\" />\r\n <Skeleton className=\"h-8 w-20\" />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// SKELETON GRID\r\n// ============================================================================\r\n\r\nexport interface SkeletonGridProps {\r\n /** Number of skeleton cards */\r\n cards?: number;\r\n /** Grid columns configuration */\r\n columns?: 1 | 2 | 3 | 4;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Props passed to each SkeletonCard */\r\n cardProps?: Omit<SkeletonCardProps, \"className\">;\r\n}\r\n\r\n/**\r\n * SkeletonGrid - Grid of skeleton cards\r\n *\r\n * @example\r\n * ```tsx\r\n * <SkeletonGrid cards={6} columns={3} />\r\n * ```\r\n */\r\nexport function SkeletonGrid({\r\n cards = 6,\r\n columns = 3,\r\n className,\r\n cardProps,\r\n}: SkeletonGridProps) {\r\n const gridCols = {\r\n 1: \"grid-cols-1\",\r\n 2: \"grid-cols-1 sm:grid-cols-2\",\r\n 3: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-3\",\r\n 4: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\",\r\n };\r\n\r\n return (\r\n <div className={cn(\"grid gap-4\", gridCols[columns], className)}>\r\n {Array.from({ length: cards }).map((_, i) => (\r\n <SkeletonCard key={i} {...cardProps} />\r\n ))}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport {\r\n useState,\r\n ReactNode,\r\n isValidElement,\r\n cloneElement,\r\n ReactElement,\r\n} from \"react\";\r\nimport { ChevronDown, ChevronUp } from \"lucide-react\";\r\nimport {\r\n Collapsible,\r\n CollapsibleContent,\r\n CollapsibleTrigger,\r\n} from \"@/components/ui/collapsible\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface CollapsibleWrapperProps {\r\n children: ReactNode;\r\n trigger: ReactNode;\r\n defaultOpen?: boolean;\r\n open?: boolean;\r\n onOpenChange?: (open: boolean) => void;\r\n /** @deprecated Use render prop pattern with trigger element instead */\r\n triggerAsChild?: boolean;\r\n triggerVariant?:\r\n | \"default\"\r\n | \"destructive\"\r\n | \"outline\"\r\n | \"secondary\"\r\n | \"ghost\"\r\n | \"link\";\r\n triggerSize?: \"default\" | \"sm\" | \"lg\" | \"icon\";\r\n triggerClassName?: string;\r\n contentClassName?: string;\r\n className?: string;\r\n showChevron?: boolean;\r\n chevronPosition?: \"left\" | \"right\";\r\n disabled?: boolean;\r\n}\r\n\r\nexport function CollapsibleWrapper({\r\n children,\r\n trigger,\r\n defaultOpen = false,\r\n open,\r\n onOpenChange,\r\n triggerAsChild = false,\r\n triggerVariant = \"outline\",\r\n triggerSize = \"sm\",\r\n triggerClassName,\r\n contentClassName,\r\n className,\r\n showChevron = true,\r\n chevronPosition = \"right\",\r\n disabled = false,\r\n ...props\r\n}: CollapsibleWrapperProps) {\r\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\r\n\r\n const isOpen = open !== undefined ? open : internalOpen;\r\n const handleOpenChange = onOpenChange || setInternalOpen;\r\n\r\n const chevronElement = showChevron && (\r\n <div\r\n className={cn(\r\n \"flex items-center\",\r\n chevronPosition === \"left\" && \"order-first mr-2\",\r\n chevronPosition === \"right\" && \"ml-2\",\r\n )}\r\n >\r\n {isOpen ? (\r\n <ChevronUp className=\"h-4 w-4\" />\r\n ) : (\r\n <ChevronDown className=\"h-4 w-4\" />\r\n )}\r\n </div>\r\n );\r\n\r\n return (\r\n <Collapsible\r\n open={isOpen}\r\n onOpenChange={handleOpenChange}\r\n disabled={disabled}\r\n className={cn(\"w-full\", className)}\r\n {...props}\r\n >\r\n {triggerAsChild && isValidElement(trigger) ? (\r\n <CollapsibleTrigger render={trigger as ReactElement} />\r\n ) : (\r\n <CollapsibleTrigger\r\n render={\r\n <Button\r\n variant={triggerVariant}\r\n size={triggerSize}\r\n disabled={disabled}\r\n className={cn(\"justify-between\", triggerClassName)}\r\n />\r\n }\r\n >\r\n {trigger}\r\n {chevronElement}\r\n </CollapsibleTrigger>\r\n )}\r\n\r\n <CollapsibleContent className={cn(\"mt-2\", contentClassName)}>\r\n {children}\r\n </CollapsibleContent>\r\n </Collapsible>\r\n );\r\n}\r\n\r\nexport interface CollapsibleCardProps {\r\n title: ReactNode;\r\n children: ReactNode;\r\n defaultOpen?: boolean;\r\n className?: string;\r\n headerClassName?: string;\r\n contentClassName?: string;\r\n}\r\n\r\nexport function CollapsibleCard({\r\n title,\r\n children,\r\n defaultOpen = false,\r\n className,\r\n headerClassName,\r\n contentClassName,\r\n ...props\r\n}: CollapsibleCardProps) {\r\n const [isOpen, setIsOpen] = useState(defaultOpen);\r\n\r\n return (\r\n <Collapsible\r\n open={isOpen}\r\n onOpenChange={setIsOpen}\r\n className={cn(\"border rounded-lg overflow-hidden\", className)}\r\n {...props}\r\n >\r\n <CollapsibleTrigger\r\n render={\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n \"flex items-center justify-between w-full px-4 py-3 cursor-pointer transition-colors hover:bg-secondary/5 bg-transparent border-0 text-left\",\r\n headerClassName,\r\n )}\r\n />\r\n }\r\n >\r\n <span className=\"font-medium\">{title}</span>\r\n <ChevronDown\r\n className={cn(\r\n \"h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200\",\r\n isOpen && \"rotate-180\",\r\n )}\r\n />\r\n </CollapsibleTrigger>\r\n <CollapsibleContent>\r\n <div className={cn(\"px-4 py-3 border-t\", contentClassName)}>\r\n {children}\r\n </div>\r\n </CollapsibleContent>\r\n </Collapsible>\r\n );\r\n}\r\n\r\nexport interface CollapsibleSectionProps {\r\n label: ReactNode;\r\n children: ReactNode;\r\n defaultOpen?: boolean;\r\n className?: string;\r\n labelClassName?: string;\r\n contentClassName?: string;\r\n}\r\n\r\nexport function CollapsibleSection({\r\n label,\r\n children,\r\n defaultOpen = false,\r\n className,\r\n labelClassName,\r\n contentClassName,\r\n ...props\r\n}: CollapsibleSectionProps) {\r\n return (\r\n <CollapsibleWrapper\r\n trigger={label}\r\n defaultOpen={defaultOpen}\r\n triggerVariant=\"ghost\"\r\n triggerSize=\"sm\"\r\n triggerClassName={cn(\r\n \"h-8 px-2 font-medium justify-between\",\r\n labelClassName,\r\n )}\r\n contentClassName={cn(\"pl-4 mt-1\", contentClassName)}\r\n className={cn(\"space-y-1\", className)}\r\n {...props}\r\n >\r\n {children}\r\n </CollapsibleWrapper>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { ReactNode } from \"react\";\r\nimport { AlertTriangle, Loader2 } from \"lucide-react\";\r\nimport {\r\n AlertDialog,\r\n AlertDialogAction,\r\n AlertDialogCancel,\r\n AlertDialogContent,\r\n AlertDialogDescription,\r\n AlertDialogFooter,\r\n AlertDialogHeader,\r\n AlertDialogTitle,\r\n AlertDialogTrigger,\r\n} from \"@/components/ui/alert-dialog\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface ConfirmDialogProps {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n /** Trigger element that opens the dialog */\r\n trigger?: React.ReactElement;\r\n title?: string;\r\n description?: string;\r\n confirmText?: string;\r\n cancelText?: string;\r\n variant?: \"default\" | \"destructive\" | \"outline\" | \"secondary\" | \"ghost\" | \"link\";\r\n isLoading?: boolean;\r\n onConfirm?: () => void;\r\n onCancel?: () => void;\r\n icon?: ReactNode;\r\n children?: ReactNode;\r\n className?: string;\r\n /** Header className */\r\n headerClassName?: string;\r\n /** Description className */\r\n descriptionClassName?: string;\r\n /** Footer className */\r\n footerClassName?: string;\r\n /** Whether to show the cancel button (default: true) */\r\n showCancel?: boolean;\r\n}\r\n\r\nexport function ConfirmDialog({\r\n open,\r\n onOpenChange,\r\n trigger,\r\n title = \"Are you sure?\",\r\n description = \"This action cannot be undone.\",\r\n confirmText = \"Confirm\",\r\n cancelText = \"Cancel\",\r\n variant = \"destructive\",\r\n isLoading = false,\r\n onConfirm,\r\n onCancel,\r\n icon,\r\n children,\r\n className,\r\n headerClassName,\r\n descriptionClassName,\r\n footerClassName,\r\n showCancel = true,\r\n ...props\r\n}: ConfirmDialogProps) {\r\n const handleConfirm = () => {\r\n if (onConfirm) {\r\n onConfirm();\r\n }\r\n };\r\n\r\n const handleCancel = () => {\r\n if (onCancel) {\r\n onCancel();\r\n } else {\r\n onOpenChange(false);\r\n }\r\n };\r\n\r\n // Extract children and element for Base UI render prop pattern\r\n const triggerChildren = (trigger?.props as { children?: ReactNode })?.children;\r\n const triggerElement = trigger\r\n ? React.cloneElement(trigger, { children: undefined } as Record<string, unknown>)\r\n : null;\r\n\r\n return (\r\n <AlertDialog open={open} onOpenChange={onOpenChange} {...props}>\r\n {triggerElement && (\r\n <AlertDialogTrigger render={triggerElement}>\r\n {triggerChildren}\r\n </AlertDialogTrigger>\r\n )}\r\n <AlertDialogContent className={cn(\"max-w-md\", className)}>\r\n <AlertDialogHeader className={cn(headerClassName)}>\r\n <AlertDialogTitle className=\"flex items-center gap-2\">\r\n {icon ||\r\n (variant === \"destructive\" && (\r\n <AlertTriangle className=\"h-5 w-5 text-destructive\" />\r\n ))}\r\n {title}\r\n </AlertDialogTitle>\r\n {description && (\r\n <AlertDialogDescription className={cn(descriptionClassName)}>\r\n {description}\r\n </AlertDialogDescription>\r\n )}\r\n </AlertDialogHeader>\r\n\r\n {children && <div className=\"py-4\">{children}</div>}\r\n\r\n <AlertDialogFooter className={cn(footerClassName)}>\r\n {showCancel && (\r\n <AlertDialogCancel onClick={handleCancel} disabled={isLoading}>\r\n {cancelText}\r\n </AlertDialogCancel>\r\n )}\r\n {onConfirm && (\r\n <AlertDialogAction\r\n onClick={handleConfirm}\r\n disabled={isLoading}\r\n variant={variant}\r\n >\r\n {isLoading ? (\r\n <div className=\"flex items-center gap-2\">\r\n <Loader2 className=\"h-4 w-4 animate-spin\" />\r\n Loading...\r\n </div>\r\n ) : (\r\n confirmText\r\n )}\r\n </AlertDialogAction>\r\n )}\r\n </AlertDialogFooter>\r\n </AlertDialogContent>\r\n </AlertDialog>\r\n );\r\n}\r\n\r\n// Specialized delete confirmation dialog\r\nexport interface DeleteConfirmDialogProps {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n onConfirm?: () => void;\r\n isLoading?: boolean;\r\n itemName?: string;\r\n itemDetails?: ReactNode;\r\n}\r\n\r\nexport function DeleteConfirmDialog({\r\n open,\r\n onOpenChange,\r\n onConfirm,\r\n isLoading = false,\r\n itemName = \"item\",\r\n itemDetails,\r\n ...props\r\n}: DeleteConfirmDialogProps) {\r\n return (\r\n <ConfirmDialog\r\n open={open}\r\n onOpenChange={onOpenChange}\r\n title=\"Delete Item\"\r\n description={`Are you sure you want to delete this ${itemName}? This action cannot be undone.`}\r\n confirmText=\"Yes, Delete\"\r\n cancelText=\"No\"\r\n variant=\"destructive\"\r\n isLoading={isLoading}\r\n onConfirm={onConfirm}\r\n {...props}\r\n >\r\n {itemDetails && (\r\n <div className=\"bg-muted/50 p-3 rounded-md\">\r\n <div className=\"text-sm space-y-1\">{itemDetails}</div>\r\n </div>\r\n )}\r\n </ConfirmDialog>\r\n );\r\n}\r\n\r\n// Info/Warning alert (no cancel button)\r\nexport interface InfoAlertProps extends Omit<ConfirmDialogProps, \"showCancel\" | \"variant\"> {\r\n confirmText?: string;\r\n}\r\n\r\n/**\r\n * InfoAlert - Information/warning alert with only confirm button (no cancel)\r\n *\r\n * @example\r\n * ```tsx\r\n * <InfoAlert\r\n * open={open}\r\n * onOpenChange={setOpen}\r\n * title=\"Session expired\"\r\n * description=\"Please log in again\"\r\n * confirmText=\"OK\"\r\n * onConfirm={() => setOpen(false)}\r\n * />\r\n * ```\r\n */\r\nexport function InfoAlert({\r\n title,\r\n description,\r\n confirmText = \"OK\",\r\n onConfirm,\r\n onOpenChange,\r\n ...props\r\n}: InfoAlertProps) {\r\n return (\r\n <ConfirmDialog\r\n title={title}\r\n description={description}\r\n confirmText={confirmText}\r\n variant=\"default\"\r\n showCancel={false}\r\n onConfirm={onConfirm || (() => onOpenChange(false))}\r\n onOpenChange={onOpenChange}\r\n {...props}\r\n />\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { ReactNode } from \"react\";\r\nimport { AlertCircle, RefreshCw } from \"lucide-react\";\r\nimport { Alert, AlertDescription, AlertTitle } from \"@/components/ui/alert\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface ErrorStateProps {\r\n /** Error title */\r\n title?: string;\r\n /** Error message or Error object */\r\n error: string | Error | { message?: string } | null | undefined;\r\n /** Optional retry callback */\r\n onRetry?: () => void;\r\n /** Alert variant */\r\n variant?: \"default\" | \"destructive\";\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Custom icon */\r\n icon?: ReactNode;\r\n}\r\n\r\n/**\r\n * ErrorState Component\r\n *\r\n * Reusable error display component with retry functionality\r\n * Used for consistent error handling across pages\r\n */\r\nexport function ErrorState({\r\n title = \"Error\",\r\n error,\r\n onRetry,\r\n variant = \"destructive\",\r\n className,\r\n icon,\r\n}: ErrorStateProps) {\r\n const errorMessage =\r\n typeof error === \"string\"\r\n ? error\r\n : (error as { message?: string })?.message || \"Something went wrong. Please try again.\";\r\n\r\n return (\r\n <Alert variant={variant} className={cn(className)}>\r\n {icon || <AlertCircle className=\"h-4 w-4\" />}\r\n <AlertTitle>{title}</AlertTitle>\r\n <AlertDescription className=\"mt-2 flex flex-col gap-3\">\r\n <p className=\"text-sm\">{errorMessage}</p>\r\n {onRetry && (\r\n <div>\r\n <Button\r\n onClick={onRetry}\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"gap-2\"\r\n >\r\n <RefreshCw className=\"h-3 w-3\" />\r\n Try Again\r\n </Button>\r\n </div>\r\n )}\r\n </AlertDescription>\r\n </Alert>\r\n );\r\n}\r\n\r\nexport interface ErrorStateInlineProps {\r\n /** Error message or Error object */\r\n error: string | Error | { message?: string } | null | undefined;\r\n /** Optional retry callback */\r\n onRetry?: () => void;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Custom icon */\r\n icon?: ReactNode;\r\n}\r\n\r\n/**\r\n * Inline ErrorState variant - more compact for table cells\r\n */\r\nexport function ErrorStateInline({\r\n error,\r\n onRetry,\r\n className,\r\n icon,\r\n}: ErrorStateInlineProps) {\r\n const errorMessage =\r\n typeof error === \"string\"\r\n ? error\r\n : (error as { message?: string })?.message || \"Error loading data\";\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"flex items-center gap-2 text-sm text-destructive\",\r\n className\r\n )}\r\n >\r\n {icon || <AlertCircle className=\"h-4 w-4\" />}\r\n <span>{errorMessage}</span>\r\n {onRetry && (\r\n <Button\r\n onClick={onRetry}\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-6 px-2 gap-1\"\r\n >\r\n <RefreshCw className=\"h-3 w-3\" />\r\n Retry\r\n </Button>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import * as React from \"react\";\r\nimport { InboxIcon, SearchX, FileX2, type LucideIcon } from \"lucide-react\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface EmptyStateProps {\r\n /** Title text */\r\n title?: string;\r\n /** Description / subtitle */\r\n description?: string;\r\n /** Icon to display — pass a LucideIcon or ReactNode */\r\n icon?: LucideIcon | React.ReactNode;\r\n /** Primary action button */\r\n action?: React.ReactNode;\r\n /** Secondary action button */\r\n secondaryAction?: React.ReactNode;\r\n /** Visual variant */\r\n variant?: \"default\" | \"compact\" | \"card\";\r\n /** Additional className */\r\n className?: string;\r\n /** Children rendered below the description */\r\n children?: React.ReactNode;\r\n}\r\n\r\n// ============================================================================\r\n// PRESETS\r\n// ============================================================================\r\n\r\nconst PRESETS = {\r\n noResults: {\r\n icon: SearchX,\r\n title: \"No results found\",\r\n description: \"Try adjusting your search or filter criteria.\",\r\n },\r\n noData: {\r\n icon: InboxIcon,\r\n title: \"No data yet\",\r\n description: \"Get started by creating your first item.\",\r\n },\r\n notFound: {\r\n icon: FileX2,\r\n title: \"Not found\",\r\n description:\r\n \"The item you're looking for doesn't exist or has been removed.\",\r\n },\r\n} as const;\r\n\r\n// ============================================================================\r\n// EMPTY STATE\r\n// ============================================================================\r\n\r\n/**\r\n * EmptyState — Shown when content is empty, search has no results, etc.\r\n *\r\n * @example Default\r\n * ```tsx\r\n * <EmptyState\r\n * title=\"No projects yet\"\r\n * description=\"Create your first project to get started.\"\r\n * icon={FolderPlus}\r\n * action={<Button>Create Project</Button>}\r\n * />\r\n * ```\r\n *\r\n * @example Compact (inline)\r\n * ```tsx\r\n * <EmptyState variant=\"compact\" title=\"No items\" />\r\n * ```\r\n *\r\n * @example With preset\r\n * ```tsx\r\n * <EmptyStateNoResults action={<Button onClick={clearFilters}>Clear filters</Button>} />\r\n * ```\r\n */\r\nexport function EmptyState({\r\n title = \"Nothing here\",\r\n description,\r\n icon: IconProp = InboxIcon,\r\n action,\r\n secondaryAction,\r\n variant = \"default\",\r\n className,\r\n children,\r\n}: EmptyStateProps) {\r\n const isLucideIcon = typeof IconProp === \"function\";\r\n const Icon = IconProp as LucideIcon;\r\n\r\n const iconElement = isLucideIcon ? (\r\n <Icon\r\n className={cn(\r\n \"text-muted-foreground/60\",\r\n variant === \"compact\" ? \"h-8 w-8\" : \"h-12 w-12\",\r\n )}\r\n strokeWidth={1.5}\r\n />\r\n ) : (\r\n IconProp\r\n );\r\n\r\n if (variant === \"compact\") {\r\n return (\r\n <div\r\n className={cn(\r\n \"flex items-center gap-3 py-6 px-4 text-muted-foreground\",\r\n className,\r\n )}\r\n >\r\n {iconElement}\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium\">{title}</p>\r\n {description && (\r\n <p className=\"text-xs text-muted-foreground/80 mt-0.5\">\r\n {description}\r\n </p>\r\n )}\r\n </div>\r\n {action}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"flex flex-col items-center justify-center text-center\",\r\n variant === \"card\" &&\r\n \"rounded-lg border border-dashed border-muted-foreground/25 bg-muted/30\",\r\n variant === \"default\" ? \"py-16 px-6\" : \"py-12 px-8\",\r\n className,\r\n )}\r\n >\r\n <div\r\n className={cn(\r\n \"flex items-center justify-center rounded-full bg-muted/60\",\r\n variant === \"default\" ? \"h-20 w-20 mb-6\" : \"h-16 w-16 mb-5\",\r\n )}\r\n >\r\n {iconElement}\r\n </div>\r\n\r\n <h3\r\n className={cn(\r\n \"font-semibold tracking-tight\",\r\n variant === \"default\" ? \"text-lg\" : \"text-base\",\r\n )}\r\n >\r\n {title}\r\n </h3>\r\n\r\n {description && (\r\n <p\r\n className={cn(\r\n \"text-muted-foreground max-w-sm mt-2\",\r\n variant === \"default\" ? \"text-sm\" : \"text-xs\",\r\n )}\r\n >\r\n {description}\r\n </p>\r\n )}\r\n\r\n {children && <div className=\"mt-4 w-full max-w-md\">{children}</div>}\r\n\r\n {(action || secondaryAction) && (\r\n <div className=\"flex items-center gap-3 mt-6\">\r\n {action}\r\n {secondaryAction}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// PRESET VARIANTS\r\n// ============================================================================\r\n\r\nexport type EmptyStatePresetProps = Omit<\r\n EmptyStateProps,\r\n \"icon\" | \"title\" | \"description\"\r\n> & {\r\n title?: string;\r\n description?: string;\r\n};\r\n\r\n/** No search results — with search icon */\r\nexport function EmptyStateNoResults(props: EmptyStatePresetProps) {\r\n return <EmptyState {...PRESETS.noResults} {...props} />;\r\n}\r\n\r\n/** No data — with inbox icon */\r\nexport function EmptyStateNoData(props: EmptyStatePresetProps) {\r\n return <EmptyState {...PRESETS.noData} {...props} />;\r\n}\r\n\r\n/** Not found — with file-x icon */\r\nexport function EmptyStateNotFound(props: EmptyStatePresetProps) {\r\n return <EmptyState {...PRESETS.notFound} {...props} />;\r\n}\r\n","import * as React from \"react\";\r\nimport { Loader2 } from \"lucide-react\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface LoadingStateProps {\r\n /** Loading message text */\r\n text?: string;\r\n /** Visual variant */\r\n variant?: \"default\" | \"inline\" | \"overlay\" | \"minimal\";\r\n /** Spinner size */\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n /** Additional className */\r\n className?: string;\r\n}\r\n\r\nexport interface LoadingOverlayProps {\r\n /** Loading message text */\r\n text?: string;\r\n /** Whether the overlay is visible */\r\n visible?: boolean;\r\n /** Additional className */\r\n className?: string;\r\n /** Children to render behind the overlay */\r\n children?: React.ReactNode;\r\n}\r\n\r\n// ============================================================================\r\n// SIZE MAP\r\n// ============================================================================\r\n\r\nconst SIZES = {\r\n sm: \"h-4 w-4\",\r\n md: \"h-6 w-6\",\r\n lg: \"h-10 w-10\",\r\n} as const;\r\n\r\nconst TEXT_SIZES = {\r\n sm: \"text-xs\",\r\n md: \"text-sm\",\r\n lg: \"text-base\",\r\n} as const;\r\n\r\n// ============================================================================\r\n// LOADING STATE\r\n// ============================================================================\r\n\r\n/**\r\n * LoadingState — Versatile loading indicator\r\n *\r\n * @example Default (centered, full area)\r\n * ```tsx\r\n * <LoadingState text=\"Loading projects...\" />\r\n * ```\r\n *\r\n * @example Inline (in a row)\r\n * ```tsx\r\n * <LoadingState variant=\"inline\" text=\"Saving...\" size=\"sm\" />\r\n * ```\r\n *\r\n * @example Minimal (just the spinner)\r\n * ```tsx\r\n * <LoadingState variant=\"minimal\" />\r\n * ```\r\n */\r\nexport function LoadingState({\r\n text,\r\n variant = \"default\",\r\n size = \"md\",\r\n className,\r\n}: LoadingStateProps) {\r\n const spinner = (\r\n <Loader2\r\n className={cn(SIZES[size], \"animate-spin text-muted-foreground\")}\r\n />\r\n );\r\n\r\n if (variant === \"minimal\") {\r\n return (\r\n <div className={cn(\"flex items-center justify-center\", className)}>\r\n {spinner}\r\n </div>\r\n );\r\n }\r\n\r\n if (variant === \"inline\") {\r\n return (\r\n <div\r\n className={cn(\r\n \"flex items-center gap-2 text-muted-foreground\",\r\n className,\r\n )}\r\n >\r\n {spinner}\r\n {text && <span className={TEXT_SIZES[size]}>{text}</span>}\r\n </div>\r\n );\r\n }\r\n\r\n // default — centered block\r\n return (\r\n <div\r\n className={cn(\r\n \"flex flex-col items-center justify-center gap-3 py-12 px-6\",\r\n className,\r\n )}\r\n >\r\n {spinner}\r\n {text && (\r\n <p className={cn(\"text-muted-foreground\", TEXT_SIZES[size])}>{text}</p>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// LOADING OVERLAY\r\n// ============================================================================\r\n\r\n/**\r\n * LoadingOverlay — Renders children with an overlay spinner on top\r\n *\r\n * @example\r\n * ```tsx\r\n * <LoadingOverlay visible={isSaving} text=\"Saving changes...\">\r\n * <MyFormContent />\r\n * </LoadingOverlay>\r\n * ```\r\n */\r\nexport function LoadingOverlay({\r\n text,\r\n visible = true,\r\n className,\r\n children,\r\n}: LoadingOverlayProps) {\r\n return (\r\n <div className={cn(\"relative\", className)}>\r\n {children}\r\n {visible && (\r\n <div className=\"absolute inset-0 z-10 flex flex-col items-center justify-center gap-3 rounded-[inherit] bg-background/90 backdrop-blur-sm\">\r\n <Loader2 className=\"h-6 w-6 animate-spin text-muted-foreground\" />\r\n {text && (\r\n <p className=\"text-sm text-muted-foreground font-medium\">{text}</p>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport {\r\n X,\r\n Info,\r\n AlertTriangle,\r\n CheckCircle2,\r\n AlertCircle,\r\n type LucideIcon,\r\n} from \"lucide-react\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport type StatusBannerVariant = \"info\" | \"warning\" | \"success\" | \"error\";\r\n\r\nexport interface StatusBannerProps {\r\n /** The banner variant/severity */\r\n variant?: StatusBannerVariant;\r\n /** Main message text or node */\r\n children: React.ReactNode;\r\n /** Optional custom icon */\r\n icon?: LucideIcon;\r\n /** Whether the banner can be dismissed */\r\n dismissible?: boolean;\r\n /** Callback when dismissed */\r\n onDismiss?: () => void;\r\n /** Optional action element (e.g. a link or button) */\r\n action?: React.ReactNode;\r\n /** Additional className */\r\n className?: string;\r\n}\r\n\r\n// ============================================================================\r\n// VARIANT CONFIG\r\n// ============================================================================\r\n\r\nconst VARIANT_MAP: Record<\r\n StatusBannerVariant,\r\n {\r\n icon: LucideIcon;\r\n bg: string;\r\n border: string;\r\n text: string;\r\n iconColor: string;\r\n }\r\n> = {\r\n info: {\r\n icon: Info,\r\n bg: \"bg-blue-50 dark:bg-blue-950/30\",\r\n border: \"border-blue-200 dark:border-blue-800\",\r\n text: \"text-blue-800 dark:text-blue-200\",\r\n iconColor: \"text-blue-500 dark:text-blue-400\",\r\n },\r\n warning: {\r\n icon: AlertTriangle,\r\n bg: \"bg-amber-50 dark:bg-amber-950/30\",\r\n border: \"border-amber-200 dark:border-amber-800\",\r\n text: \"text-amber-800 dark:text-amber-200\",\r\n iconColor: \"text-amber-500 dark:text-amber-400\",\r\n },\r\n success: {\r\n icon: CheckCircle2,\r\n bg: \"bg-emerald-50 dark:bg-emerald-950/30\",\r\n border: \"border-emerald-200 dark:border-emerald-800\",\r\n text: \"text-emerald-800 dark:text-emerald-200\",\r\n iconColor: \"text-emerald-500 dark:text-emerald-400\",\r\n },\r\n error: {\r\n icon: AlertCircle,\r\n bg: \"bg-red-50 dark:bg-red-950/30\",\r\n border: \"border-red-200 dark:border-red-800\",\r\n text: \"text-red-800 dark:text-red-200\",\r\n iconColor: \"text-red-500 dark:text-red-400\",\r\n },\r\n};\r\n\r\n// ============================================================================\r\n// STATUS BANNER\r\n// ============================================================================\r\n\r\n/**\r\n * StatusBanner — A persistent info/warning/success/error banner.\r\n *\r\n * @example\r\n * ```tsx\r\n * <StatusBanner variant=\"warning\" dismissible>\r\n * Your trial expires in 3 days. <a href=\"/pricing\">Upgrade now</a>\r\n * </StatusBanner>\r\n *\r\n * <StatusBanner variant=\"success\" action={<Button size=\"sm\">View</Button>}>\r\n * Your project was deployed successfully.\r\n * </StatusBanner>\r\n * ```\r\n */\r\nexport function StatusBanner({\r\n variant = \"info\",\r\n children,\r\n icon: CustomIcon,\r\n dismissible = false,\r\n onDismiss,\r\n action,\r\n className,\r\n}: StatusBannerProps) {\r\n const [dismissed, setDismissed] = React.useState(false);\r\n\r\n if (dismissed) return null;\r\n\r\n const config = VARIANT_MAP[variant];\r\n const Icon = CustomIcon || config.icon;\r\n\r\n const handleDismiss = () => {\r\n setDismissed(true);\r\n onDismiss?.();\r\n };\r\n\r\n return (\r\n <div\r\n role=\"alert\"\r\n className={cn(\r\n \"flex items-center gap-3 rounded-lg border px-4 py-3\",\r\n config.bg,\r\n config.border,\r\n config.text,\r\n className,\r\n )}\r\n >\r\n <Icon\r\n className={cn(\"h-4 w-4 shrink-0\", config.iconColor)}\r\n strokeWidth={2}\r\n />\r\n\r\n <div className=\"flex-1 min-w-0 text-sm\">{children}</div>\r\n\r\n {action && <div className=\"shrink-0\">{action}</div>}\r\n\r\n {dismissible && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className={cn(\r\n \"h-6 w-6 shrink-0 hover:bg-transparent opacity-60 hover:opacity-100\",\r\n config.text,\r\n )}\r\n onClick={handleDismiss}\r\n >\r\n <X className=\"h-3.5 w-3.5\" />\r\n <span className=\"sr-only\">Dismiss</span>\r\n </Button>\r\n )}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { Check } from \"lucide-react\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface StepperStep {\r\n /** Step label */\r\n label: string;\r\n /** Optional description shown below the label */\r\n description?: string;\r\n /** Optional icon for the step (replaces the number) */\r\n icon?: React.ReactNode;\r\n /** Whether this step is optional */\r\n optional?: boolean;\r\n}\r\n\r\nexport interface StepperProps {\r\n /** Array of step definitions */\r\n steps: (string | StepperStep)[];\r\n /** Active step index (0-based) */\r\n currentStep: number;\r\n /** Variant */\r\n variant?: \"default\" | \"compact\";\r\n /** Orientation */\r\n orientation?: \"horizontal\" | \"vertical\";\r\n /** Additional className */\r\n className?: string;\r\n /** Callback when a completed step is clicked */\r\n onStepClick?: (stepIndex: number) => void;\r\n /** Children (StepContent panels) */\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport interface StepContentProps {\r\n /** Step index this content belongs to (0-based) */\r\n step: number;\r\n /** Currently active step */\r\n currentStep: number;\r\n /** Children to render */\r\n children: React.ReactNode;\r\n /** Additional className */\r\n className?: string;\r\n /** Keep mounted when inactive (useful for forms) */\r\n keepMounted?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// HELPERS\r\n// ============================================================================\r\n\r\nfunction normalizeStep(step: string | StepperStep): StepperStep {\r\n return typeof step === \"string\" ? { label: step } : step;\r\n}\r\n\r\n// ============================================================================\r\n// STEP CIRCLE\r\n// ============================================================================\r\n\r\nconst StepCircle = React.memo(function StepCircle({\r\n index,\r\n isCompleted,\r\n isActive,\r\n icon,\r\n variant,\r\n}: {\r\n index: number;\r\n isCompleted: boolean;\r\n isActive: boolean;\r\n icon?: React.ReactNode;\r\n variant: \"default\" | \"compact\";\r\n}) {\r\n const size = variant === \"compact\" ? \"h-7 w-7\" : \"h-8 w-8\";\r\n const iconSize = variant === \"compact\" ? \"h-3.5 w-3.5\" : \"h-4 w-4\";\r\n\r\n return (\r\n <span\r\n className={cn(\r\n \"relative flex items-center justify-center rounded-full text-xs font-semibold shrink-0 transition-all duration-200\",\r\n size,\r\n isCompleted\r\n ? \"bg-primary text-primary-foreground\"\r\n : isActive\r\n ? \"bg-primary text-primary-foreground ring-2 ring-primary/20 ring-offset-2 ring-offset-background\"\r\n : \"border-2 border-muted-foreground/25 bg-background text-muted-foreground\",\r\n )}\r\n >\r\n {isCompleted ? (\r\n <Check className={iconSize} strokeWidth={3} />\r\n ) : (\r\n icon || index + 1\r\n )}\r\n </span>\r\n );\r\n});\r\n\r\n// ============================================================================\r\n// CONNECTOR\r\n// ============================================================================\r\n\r\nconst StepConnector = React.memo(function StepConnector({\r\n isCompleted,\r\n isVertical,\r\n}: {\r\n isCompleted: boolean;\r\n isVertical: boolean;\r\n}) {\r\n if (isVertical) {\r\n return (\r\n <div className=\"flex justify-center w-8 py-1\">\r\n <div\r\n className={cn(\r\n \"w-px h-6 transition-colors duration-200\",\r\n isCompleted ? \"bg-primary\" : \"bg-border\",\r\n )}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"flex-1 flex items-center min-w-4 mt-4\">\r\n <div\r\n className={cn(\r\n \"h-px w-full transition-colors duration-200\",\r\n isCompleted ? \"bg-primary\" : \"bg-border\",\r\n )}\r\n />\r\n </div>\r\n );\r\n});\r\n\r\n// ============================================================================\r\n// HORIZONTAL STEPPER\r\n// ============================================================================\r\n\r\nfunction HorizontalStepper({\r\n steps,\r\n currentStep,\r\n variant,\r\n onStepClick,\r\n}: {\r\n steps: StepperStep[];\r\n currentStep: number;\r\n variant: \"default\" | \"compact\";\r\n onStepClick?: (index: number) => void;\r\n}) {\r\n const activeRef = React.useRef<HTMLDivElement>(null);\r\n const navRef = React.useRef<HTMLElement>(null);\r\n\r\n // Auto-scroll active step into view\r\n React.useEffect(() => {\r\n if (activeRef.current && navRef.current) {\r\n activeRef.current.scrollIntoView({\r\n behavior: \"smooth\",\r\n block: \"nearest\",\r\n inline: \"center\",\r\n });\r\n }\r\n }, [currentStep]);\r\n\r\n return (\r\n <nav\r\n ref={navRef}\r\n aria-label=\"Progress\"\r\n role=\"list\"\r\n className=\"flex items-start w-full overflow-x-auto [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden pb-1\"\r\n >\r\n {steps.map((step, index) => {\r\n const isCompleted = index < currentStep;\r\n const isActive = index === currentStep;\r\n const isClickable = isCompleted && !!onStepClick;\r\n const isLast = index === steps.length - 1;\r\n\r\n return (\r\n <React.Fragment key={step.label}>\r\n {/* Step */}\r\n <div\r\n ref={isActive ? activeRef : undefined}\r\n role=\"listitem\"\r\n aria-current={isActive ? \"step\" : undefined}\r\n className={cn(\"flex flex-col items-center text-center shrink-0\")}\r\n style={{ minWidth: variant === \"compact\" ? 48 : 64 }}\r\n >\r\n <button\r\n type=\"button\"\r\n disabled={!isClickable}\r\n onClick={() => isClickable && onStepClick(index)}\r\n className={cn(\r\n \"flex flex-col items-center gap-1.5 group\",\r\n isClickable ? \"cursor-pointer\" : \"cursor-default\",\r\n )}\r\n >\r\n <StepCircle\r\n index={index}\r\n isCompleted={isCompleted}\r\n isActive={isActive}\r\n icon={step.icon}\r\n variant={variant}\r\n />\r\n\r\n {/* Label */}\r\n <div className=\"max-w-[5.5rem] sm:max-w-[7rem]\">\r\n <p\r\n className={cn(\r\n \"text-xs font-medium leading-tight truncate\",\r\n isActive || isCompleted\r\n ? \"text-foreground\"\r\n : \"text-muted-foreground\",\r\n )}\r\n >\r\n {step.label}\r\n </p>\r\n {step.optional && (\r\n <span className=\"text-[10px] text-muted-foreground font-normal\">\r\n optional\r\n </span>\r\n )}\r\n {step.description && variant !== \"compact\" && (\r\n <p className=\"text-[10px] text-muted-foreground mt-0.5 leading-tight truncate hidden sm:block\">\r\n {step.description}\r\n </p>\r\n )}\r\n </div>\r\n </button>\r\n </div>\r\n\r\n {/* Connector */}\r\n {!isLast && (\r\n <StepConnector isCompleted={isCompleted} isVertical={false} />\r\n )}\r\n </React.Fragment>\r\n );\r\n })}\r\n </nav>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// VERTICAL STEPPER\r\n// ============================================================================\r\n\r\nfunction VerticalStepper({\r\n steps,\r\n currentStep,\r\n variant,\r\n onStepClick,\r\n}: {\r\n steps: StepperStep[];\r\n currentStep: number;\r\n variant: \"default\" | \"compact\";\r\n onStepClick?: (index: number) => void;\r\n}) {\r\n return (\r\n <nav aria-label=\"Progress\" role=\"list\" className=\"flex flex-col\">\r\n {steps.map((step, index) => {\r\n const isCompleted = index < currentStep;\r\n const isActive = index === currentStep;\r\n const isClickable = isCompleted && !!onStepClick;\r\n const isLast = index === steps.length - 1;\r\n\r\n return (\r\n <React.Fragment key={step.label}>\r\n {/* Step */}\r\n <div\r\n role=\"listitem\"\r\n aria-current={isActive ? \"step\" : undefined}\r\n className=\"flex items-start gap-3\"\r\n >\r\n <button\r\n type=\"button\"\r\n disabled={!isClickable}\r\n onClick={() => isClickable && onStepClick(index)}\r\n className={cn(\r\n \"flex items-center gap-3\",\r\n isClickable ? \"cursor-pointer\" : \"cursor-default\",\r\n )}\r\n >\r\n <StepCircle\r\n index={index}\r\n isCompleted={isCompleted}\r\n isActive={isActive}\r\n icon={step.icon}\r\n variant={variant}\r\n />\r\n\r\n <div className=\"text-left\">\r\n <p\r\n className={cn(\r\n \"text-sm font-medium leading-tight\",\r\n isActive || isCompleted\r\n ? \"text-foreground\"\r\n : \"text-muted-foreground\",\r\n )}\r\n >\r\n {step.label}\r\n {step.optional && (\r\n <span className=\"ml-1 text-xs text-muted-foreground font-normal\">\r\n (optional)\r\n </span>\r\n )}\r\n </p>\r\n {step.description && variant !== \"compact\" && (\r\n <p className=\"text-xs text-muted-foreground mt-0.5\">\r\n {step.description}\r\n </p>\r\n )}\r\n </div>\r\n </button>\r\n </div>\r\n\r\n {/* Connector */}\r\n {!isLast && (\r\n <StepConnector isCompleted={isCompleted} isVertical={true} />\r\n )}\r\n </React.Fragment>\r\n );\r\n })}\r\n </nav>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// STEPPER\r\n// ============================================================================\r\n\r\n/**\r\n * Stepper — Multi-step progress indicator\r\n *\r\n * Features:\r\n * - Horizontal layout: circles in a row with labels below, proper connectors\r\n * - Vertical layout: circles on the left with labels to the right\r\n * - Compact variant for tight spaces\r\n * - Handles many steps gracefully without scrollbars\r\n * - Clickable completed steps for navigation\r\n * - Accessible: role=\"list\", aria-current=\"step\"\r\n *\r\n * @example Basic\r\n * ```tsx\r\n * const [step, setStep] = useState(0);\r\n *\r\n * <Stepper steps={[\"Details\", \"Config\", \"Review\"]} currentStep={step}>\r\n * <StepContent step={0} currentStep={step}>\r\n * <DetailsForm onNext={() => setStep(1)} />\r\n * </StepContent>\r\n * </Stepper>\r\n * ```\r\n *\r\n * @example With step objects\r\n * ```tsx\r\n * <Stepper\r\n * steps={[\r\n * { label: \"Account\", description: \"Set up your account\" },\r\n * { label: \"Profile\", description: \"Add your details\", optional: true },\r\n * { label: \"Complete\", description: \"Review and submit\" },\r\n * ]}\r\n * currentStep={1}\r\n * onStepClick={(i) => setStep(i)}\r\n * />\r\n * ```\r\n */\r\nexport function Stepper({\r\n steps,\r\n currentStep,\r\n variant = \"default\",\r\n orientation = \"horizontal\",\r\n className,\r\n onStepClick,\r\n children,\r\n ...props\r\n}: StepperProps) {\r\n const normalizedSteps = steps.map(normalizeStep);\r\n const isVertical = orientation === \"vertical\";\r\n\r\n return (\r\n <div className={cn(\"w-full\", className)} {...props}>\r\n {isVertical ? (\r\n <VerticalStepper\r\n steps={normalizedSteps}\r\n currentStep={currentStep}\r\n variant={variant}\r\n onStepClick={onStepClick}\r\n />\r\n ) : (\r\n <HorizontalStepper\r\n steps={normalizedSteps}\r\n currentStep={currentStep}\r\n variant={variant}\r\n onStepClick={onStepClick}\r\n />\r\n )}\r\n\r\n {/* Step content */}\r\n {children && (\r\n <div className={cn(\"mt-6\", isVertical && \"ml-11\")}>{children}</div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// STEP CONTENT\r\n// ============================================================================\r\n\r\n/**\r\n * StepContent — Renders content for a specific step.\r\n * Only visible when `step === currentStep`.\r\n *\r\n * @example\r\n * ```tsx\r\n * <StepContent step={0} currentStep={current}>\r\n * <MyForm />\r\n * </StepContent>\r\n * ```\r\n */\r\nexport function StepContent({\r\n step,\r\n currentStep,\r\n children,\r\n className,\r\n keepMounted = false,\r\n}: StepContentProps) {\r\n const isActive = step === currentStep;\r\n\r\n if (!isActive && !keepMounted) return null;\r\n\r\n return (\r\n <div\r\n className={cn(className)}\r\n hidden={!isActive}\r\n role=\"tabpanel\"\r\n aria-label={`Step ${step + 1}`}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { useState, ReactNode } from \"react\";\r\nimport { Copy, Check } from \"lucide-react\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { cn } from \"../utils\";\r\n\r\n// Simple clipboard utility\r\nasync function copyToClipboard(\r\n text: string,\r\n options?: { showToast?: boolean; successMessage?: string; errorMessage?: string }\r\n): Promise<boolean> {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport interface CopyButtonProps {\r\n value: string;\r\n className?: string;\r\n size?: \"default\" | \"sm\" | \"lg\" | \"icon\";\r\n variant?: \"default\" | \"destructive\" | \"outline\" | \"secondary\" | \"ghost\" | \"link\";\r\n showToast?: boolean;\r\n toastMessage?: string;\r\n errorMessage?: string;\r\n timeout?: number;\r\n children?: ReactNode;\r\n}\r\n\r\nexport function CopyButton({\r\n value,\r\n className,\r\n size = \"sm\",\r\n variant = \"ghost\",\r\n showToast = true,\r\n toastMessage = \"Copied to clipboard\",\r\n errorMessage = \"Failed to copy to clipboard\",\r\n timeout = 2000,\r\n children,\r\n ...props\r\n}: CopyButtonProps) {\r\n const [copied, setCopied] = useState(false);\r\n\r\n const handleCopy = async () => {\r\n if (!value) return;\r\n\r\n const success = await copyToClipboard(value, {\r\n showToast,\r\n successMessage: toastMessage,\r\n errorMessage,\r\n });\r\n\r\n if (success) {\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), timeout);\r\n }\r\n };\r\n\r\n return (\r\n <Button\r\n variant={variant}\r\n size={size}\r\n className={cn(\"h-6 w-6 p-0\", className)}\r\n onClick={handleCopy}\r\n disabled={!value}\r\n {...props}\r\n >\r\n {children ||\r\n (copied ? (\r\n <Check className=\"h-3 w-3 text-green-600\" />\r\n ) : (\r\n <Copy className=\"h-3 w-3\" />\r\n ))}\r\n </Button>\r\n );\r\n}\r\n\r\nexport interface CopyTextProps {\r\n value: string;\r\n displayValue?: string;\r\n className?: string;\r\n textClassName?: string;\r\n buttonClassName?: string;\r\n maxLength?: number;\r\n showButton?: boolean;\r\n}\r\n\r\nexport function CopyText({\r\n value,\r\n displayValue,\r\n className,\r\n textClassName,\r\n buttonClassName,\r\n maxLength = 30,\r\n showButton = true,\r\n ...buttonProps\r\n}: CopyTextProps) {\r\n const truncatedValue =\r\n displayValue ||\r\n (value && value.length > maxLength\r\n ? `${value.substring(0, maxLength)}...`\r\n : value || \"N/A\");\r\n\r\n return (\r\n <div className={cn(\"flex items-center gap-2\", className)}>\r\n <span className={cn(\"font-medium\", textClassName)} title={value || \"N/A\"}>\r\n {truncatedValue}\r\n </span>\r\n {showButton && value && (\r\n <CopyButton value={value} className={buttonClassName} {...buttonProps} />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport interface CopyCodeBlockProps {\r\n value: string;\r\n className?: string;\r\n language?: string;\r\n showLineNumbers?: boolean;\r\n}\r\n\r\nexport function CopyCodeBlock({\r\n value,\r\n className,\r\n language,\r\n showLineNumbers = false,\r\n ...buttonProps\r\n}: CopyCodeBlockProps) {\r\n return (\r\n <div className={cn(\"relative group\", className)}>\r\n <pre className=\"bg-muted p-4 rounded-md overflow-x-auto text-sm\">\r\n <code className={language ? `language-${language}` : \"\"}>{value}</code>\r\n </pre>\r\n <div className=\"absolute top-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity\">\r\n <CopyButton value={value} variant=\"secondary\" size=\"sm\" {...buttonProps} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport {\r\n ColumnDef,\r\n flexRender,\r\n getCoreRowModel,\r\n getSortedRowModel,\r\n SortingState,\r\n useReactTable,\r\n RowSelectionState,\r\n} from \"@tanstack/react-table\";\r\nimport React, { useState, useRef, useEffect, useCallback, useMemo, RefObject } from \"react\";\r\nimport { ArrowUpDown, ArrowUp, ArrowDown, ChevronLeft, ChevronRight, Search } from \"lucide-react\";\r\nimport { useScrollDetection } from \"../hooks/use-scroll-detection\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TableHeader,\r\n TableRow,\r\n} from \"@/components/ui/table\";\r\nimport { ScrollArea, ScrollBar } from \"@/components/ui/scroll-area\";\r\nimport { cn } from \"../utils\";\r\nimport { ApiPagination, ApiPaginationData } from \"./api-pagination\";\r\n\r\n// Scroll detection hook moved to hooks/use-scroll-detection.ts\r\n\r\ninterface ScrollButtonProps {\r\n direction: \"left\" | \"right\";\r\n onClick: () => void;\r\n visible: boolean;\r\n className?: string;\r\n}\r\n\r\nconst ScrollButton = React.memo(function ScrollButton({ direction, onClick, visible, className }: ScrollButtonProps) {\r\n if (!visible) return null;\r\n\r\n const handleClick = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n onClick();\r\n };\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n \"absolute top-1/2 -translate-y-1/2 z-50\",\r\n \"flex items-center justify-center\",\r\n \"size-10 rounded-md shadow-lg border-2 border-border\",\r\n \"bg-background hover:bg-muted\",\r\n \"transition-transform duration-200\",\r\n \"hover:scale-105 active:scale-95\",\r\n direction === \"left\" ? \"left-2\" : \"right-2\",\r\n className\r\n )}\r\n onClick={handleClick}\r\n onMouseDown={(e) => e.stopPropagation()}\r\n aria-label={`Scroll ${direction}`}\r\n >\r\n {direction === \"left\" ? (\r\n <ChevronLeft className=\"size-5\" />\r\n ) : (\r\n <ChevronRight className=\"size-5\" />\r\n )}\r\n </button>\r\n );\r\n});\r\n\r\nexport interface DataTablePaginationProps extends Partial<ApiPaginationData> {\r\n onPageChange?: (page: number) => void;\r\n}\r\n\r\nexport interface DataTableProps<TData, TValue> {\r\n columns: ColumnDef<TData, TValue>[];\r\n data: TData[];\r\n isLoading?: boolean;\r\n pagination?: DataTablePaginationProps;\r\n enableSorting?: boolean;\r\n enableRowSelection?: boolean;\r\n onRowSelectionChange?: (selectedRows: TData[]) => void;\r\n className?: string;\r\n /** Custom loading state renderer */\r\n loadingState?: React.ReactNode;\r\n /** Custom empty state renderer */\r\n emptyState?: React.ReactNode;\r\n}\r\n\r\nexport function DataTable<TData, TValue>({\r\n columns,\r\n data,\r\n isLoading = false,\r\n pagination,\r\n enableSorting = false,\r\n enableRowSelection = false,\r\n onRowSelectionChange,\r\n className,\r\n loadingState: customLoadingState,\r\n emptyState: customEmptyState,\r\n}: DataTableProps<TData, TValue>) {\r\n const [sorting, setSorting] = useState<SortingState>([]);\r\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({});\r\n const scrollAreaRef = useRef<HTMLDivElement>(null);\r\n const { canScrollLeft, canScrollRight, isScrollable, checkScroll } =\r\n useScrollDetection(scrollAreaRef);\r\n\r\n const {\r\n total = 0,\r\n limit = 10,\r\n pages = 1,\r\n page = 1,\r\n hasNext = false,\r\n hasPrev = false,\r\n onPageChange = () => {},\r\n } = pagination ?? {};\r\n\r\n const table = useReactTable({\r\n data,\r\n columns,\r\n getCoreRowModel: getCoreRowModel(),\r\n getSortedRowModel: enableSorting ? getSortedRowModel() : undefined,\r\n onSortingChange: setSorting,\r\n onRowSelectionChange: enableRowSelection\r\n ? (updater) => {\r\n setRowSelection(updater);\r\n if (onRowSelectionChange) {\r\n const newSelection =\r\n typeof updater === \"function\" ? updater(rowSelection) : updater;\r\n const selectedRows = data.filter((_, index) => newSelection[index]);\r\n onRowSelectionChange(selectedRows);\r\n }\r\n }\r\n : undefined,\r\n state: {\r\n sorting,\r\n rowSelection: enableRowSelection ? rowSelection : undefined,\r\n },\r\n enableRowSelection,\r\n });\r\n\r\n const scrollHorizontally = useCallback((direction: \"left\" | \"right\") => {\r\n const scrollContainer = scrollAreaRef.current?.querySelector(\r\n '[data-slot=\"scroll-area-viewport\"]'\r\n ) as HTMLElement | null;\r\n if (!scrollContainer) return;\r\n\r\n const scrollAmount = Math.min(300, scrollContainer.clientWidth * 0.8);\r\n scrollContainer.scrollBy({\r\n left: direction === \"left\" ? -scrollAmount : scrollAmount,\r\n behavior: \"smooth\",\r\n });\r\n }, []);\r\n\r\n const handleWheel = useCallback(\r\n (e: WheelEvent) => {\r\n if (!isScrollable) return;\r\n\r\n const scrollContainer = scrollAreaRef.current?.querySelector(\r\n '[data-slot=\"scroll-area-viewport\"]'\r\n ) as HTMLElement | null;\r\n if (!scrollContainer?.contains(e.target as Node)) return;\r\n\r\n if (e.shiftKey || Math.abs(e.deltaX) > Math.abs(e.deltaY)) {\r\n e.preventDefault();\r\n const delta = e.deltaY || e.deltaX;\r\n scrollContainer.scrollBy({\r\n left: delta,\r\n behavior: \"auto\",\r\n });\r\n }\r\n },\r\n [isScrollable]\r\n );\r\n\r\n useEffect(() => {\r\n const scrollContainer = scrollAreaRef.current?.querySelector(\r\n '[data-slot=\"scroll-area-viewport\"]'\r\n ) as HTMLElement | null;\r\n if (!scrollContainer) return;\r\n\r\n checkScroll();\r\n\r\n scrollContainer.addEventListener(\"scroll\", checkScroll, { passive: true });\r\n scrollContainer.addEventListener(\"wheel\", handleWheel, { passive: false });\r\n\r\n return () => {\r\n scrollContainer.removeEventListener(\"scroll\", checkScroll);\r\n scrollContainer.removeEventListener(\"wheel\", handleWheel);\r\n };\r\n }, [checkScroll, handleWheel]);\r\n\r\n useEffect(() => {\r\n const timer = setTimeout(checkScroll, 150);\r\n return () => clearTimeout(timer);\r\n }, [data, checkScroll]);\r\n\r\n const defaultLoadingState = useMemo(\r\n () => (\r\n <div className=\"w-full h-full min-h-[24rem] flex items-center justify-center bg-background/50 rounded-lg border border-border\">\r\n <div className=\"flex flex-col items-center gap-3\">\r\n <div className=\"animate-spin rounded-full h-8 w-8 border-2 border-primary border-t-transparent\" />\r\n <p className=\"text-sm text-muted-foreground\">Loading data...</p>\r\n </div>\r\n </div>\r\n ),\r\n []\r\n );\r\n\r\n const defaultEmptyState = useMemo(\r\n () => (\r\n <TableRow>\r\n <TableCell colSpan={columns.length} className=\"h-32 text-center\">\r\n <div className=\"flex flex-col items-center justify-center py-8\">\r\n <div className=\"rounded-full bg-muted p-3 mb-4\">\r\n <Search className=\"h-6 w-6 text-muted-foreground\" />\r\n </div>\r\n <p className=\"text-lg font-medium text-foreground mb-1\">No results found</p>\r\n <p className=\"text-sm text-muted-foreground\">\r\n Try adjusting your search or filters\r\n </p>\r\n </div>\r\n </TableCell>\r\n </TableRow>\r\n ),\r\n [columns.length]\r\n );\r\n\r\n if (isLoading) {\r\n return <>{customLoadingState || defaultLoadingState}</>;\r\n }\r\n\r\n return (\r\n <div className={cn(\"flex flex-col h-full gap-4\", className)}>\r\n <div className=\"flex-1 min-h-0 rounded-lg border overflow-hidden bg-background shadow-sm relative\">\r\n <ScrollArea ref={scrollAreaRef} className=\"h-full w-full\">\r\n <div className=\"min-w-full\">\r\n <Table>\r\n <TableHeader className=\"sticky top-0 z-10 bg-muted/50 backdrop-blur-sm\">\r\n {table.getHeaderGroups().map((headerGroup) => (\r\n <TableRow\r\n key={headerGroup.id}\r\n className=\"border-b border-border hover:bg-transparent\"\r\n >\r\n {headerGroup.headers.map((header) => (\r\n <TableHead\r\n key={header.id}\r\n className={cn(\r\n \"bg-muted/50 font-semibold text-foreground h-12 px-4 whitespace-nowrap\",\r\n \"first:rounded-tl-lg last:rounded-tr-lg\"\r\n )}\r\n >\r\n {header.isPlaceholder ? null : enableSorting &&\r\n header.column.getCanSort() ? (\r\n <Button\r\n variant=\"ghost\"\r\n onClick={() =>\r\n header.column.toggleSorting(\r\n header.column.getIsSorted() === \"asc\"\r\n )\r\n }\r\n className=\"h-auto p-0 font-semibold hover:bg-transparent whitespace-nowrap\"\r\n >\r\n {flexRender(\r\n header.column.columnDef.header,\r\n header.getContext()\r\n )}\r\n {header.column.getIsSorted() === \"asc\" ? (\r\n <ArrowUp className=\"ml-2 h-4 w-4\" />\r\n ) : header.column.getIsSorted() === \"desc\" ? (\r\n <ArrowDown className=\"ml-2 h-4 w-4\" />\r\n ) : (\r\n <ArrowUpDown className=\"ml-2 h-4 w-4 opacity-50\" />\r\n )}\r\n </Button>\r\n ) : (\r\n flexRender(\r\n header.column.columnDef.header,\r\n header.getContext()\r\n )\r\n )}\r\n </TableHead>\r\n ))}\r\n </TableRow>\r\n ))}\r\n </TableHeader>\r\n\r\n <TableBody>\r\n {table.getRowModel().rows?.length ? (\r\n table.getRowModel().rows.map((row, index) => (\r\n <TableRow\r\n key={row.id}\r\n className={cn(\r\n \"hover:bg-muted/50 transition-colors border-b border-border/50\",\r\n index % 2 === 0 ? \"bg-background\" : \"bg-muted/20\"\r\n )}\r\n >\r\n {row.getVisibleCells().map((cell) => (\r\n <TableCell\r\n key={cell.id}\r\n className=\"px-4 py-3 text-sm whitespace-nowrap\"\r\n >\r\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n ))\r\n ) : customEmptyState ? (\r\n <TableRow>\r\n <TableCell colSpan={columns.length} className=\"h-32 text-center\">\r\n {customEmptyState}\r\n </TableCell>\r\n </TableRow>\r\n ) : (\r\n defaultEmptyState\r\n )}\r\n </TableBody>\r\n </Table>\r\n </div>\r\n <ScrollBar orientation=\"horizontal\" />\r\n </ScrollArea>\r\n\r\n {/* Scroll navigation buttons */}\r\n {canScrollLeft && (\r\n <ScrollButton\r\n direction=\"left\"\r\n onClick={() => scrollHorizontally(\"left\")}\r\n visible={true}\r\n />\r\n )}\r\n {canScrollRight && (\r\n <ScrollButton\r\n direction=\"right\"\r\n onClick={() => scrollHorizontally(\"right\")}\r\n visible={true}\r\n />\r\n )}\r\n </div>\r\n\r\n {pagination && (\r\n <ApiPagination\r\n total={total}\r\n limit={limit}\r\n pages={pages}\r\n page={page}\r\n hasNext={hasNext}\r\n hasPrev={hasPrev}\r\n onPageChange={onPageChange}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { type ReactNode } from \"react\";\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogHeader,\r\n DialogTitle,\r\n DialogDescription,\r\n DialogFooter,\r\n DialogTrigger,\r\n} from \"@/components/ui/dialog\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { cn } from \"../utils\";\r\n\r\n// Size variants configuration\r\n// Uses max-w-none to reset any base max-width, then applies the desired constraint\r\nconst SIZE_VARIANTS = {\r\n sm: \"sm:max-w-sm\",\r\n default: \"sm:max-w-md\",\r\n lg: \"sm:max-w-lg md:max-w-2xl\",\r\n xl: \"sm:max-w-2xl md:max-w-4xl\",\r\n \"2xl\": \"sm:max-w-4xl md:max-w-6xl\",\r\n full: \"max-w-[95vw] h-[95vh]\",\r\n} as const;\r\n\r\ntype SizeVariant = keyof typeof SIZE_VARIANTS;\r\n\r\nexport interface DialogWrapperProps {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n title?: ReactNode;\r\n description?: ReactNode;\r\n children?: ReactNode;\r\n footer?: ReactNode;\r\n trigger?: ReactNode;\r\n size?: SizeVariant;\r\n className?: string;\r\n headerClassName?: string;\r\n contentClassName?: string;\r\n footerClassName?: string;\r\n hideHeader?: boolean;\r\n hideTitle?: boolean;\r\n hideDescription?: boolean;\r\n hideCloseButton?: boolean;\r\n}\r\n\r\nexport function DialogWrapper({\r\n open,\r\n onOpenChange,\r\n title,\r\n description,\r\n children,\r\n footer,\r\n trigger,\r\n size = \"default\",\r\n className,\r\n headerClassName,\r\n contentClassName,\r\n footerClassName,\r\n hideHeader = false,\r\n hideTitle = false,\r\n hideDescription = false,\r\n hideCloseButton = false,\r\n ...props\r\n}: DialogWrapperProps) {\r\n return (\r\n <Dialog open={open} onOpenChange={onOpenChange} {...props}>\r\n {trigger && <DialogTrigger render={trigger} />}\r\n <DialogContent\r\n showCloseButton={!hideCloseButton}\r\n className={cn(\"max-w-none\", SIZE_VARIANTS[size], contentClassName, className)}\r\n >\r\n {!hideHeader && (\r\n <DialogHeader className={cn(\"space-y-2\", headerClassName)}>\r\n {hideTitle ? (\r\n <DialogTitle className=\"sr-only\">{title || \"Dialog\"}</DialogTitle>\r\n ) : (\r\n <DialogTitle>{title || \"Dialog\"}</DialogTitle>\r\n )}\r\n {description &&\r\n (hideDescription ? (\r\n <DialogDescription className=\"sr-only\">\r\n {description}\r\n </DialogDescription>\r\n ) : (\r\n <DialogDescription>{description}</DialogDescription>\r\n ))}\r\n </DialogHeader>\r\n )}\r\n\r\n {children}\r\n\r\n {footer && (\r\n <DialogFooter className={cn(\"gap-2\", footerClassName)}>\r\n {footer}\r\n </DialogFooter>\r\n )}\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n\r\nexport interface FormDialogProps extends Omit<DialogWrapperProps, \"footer\"> {\r\n onSubmit?: (e: React.FormEvent<HTMLFormElement>) => void;\r\n onCancel?: () => void;\r\n submitText?: string;\r\n cancelText?: string;\r\n isLoading?: boolean;\r\n submitDisabled?: boolean;\r\n}\r\n\r\nexport function FormDialog({\r\n open,\r\n onOpenChange,\r\n title,\r\n description,\r\n children,\r\n onSubmit,\r\n onCancel,\r\n submitText = \"Save\",\r\n cancelText = \"Cancel\",\r\n isLoading = false,\r\n submitDisabled = false,\r\n ...props\r\n}: FormDialogProps) {\r\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\r\n e.preventDefault();\r\n onSubmit?.(e);\r\n };\r\n\r\n return (\r\n <DialogWrapper\r\n open={open}\r\n onOpenChange={onOpenChange}\r\n title={title}\r\n description={description}\r\n {...props}\r\n >\r\n <form onSubmit={handleSubmit}>\r\n {children}\r\n <DialogFooter className=\"gap-2 mt-4\">\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n onClick={onCancel || (() => onOpenChange(false))}\r\n disabled={isLoading}\r\n >\r\n {cancelText}\r\n </Button>\r\n <Button type=\"submit\" disabled={isLoading || submitDisabled}>\r\n {isLoading ? \"Loading...\" : submitText}\r\n </Button>\r\n </DialogFooter>\r\n </form>\r\n </DialogWrapper>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { MoreHorizontal, ChevronDown, LucideIcon } from \"lucide-react\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuTrigger,\r\n DropdownMenuSeparator,\r\n DropdownMenuLabel,\r\n DropdownMenuGroup,\r\n DropdownMenuCheckboxItem,\r\n DropdownMenuRadioGroup,\r\n DropdownMenuRadioItem,\r\n} from \"@/components/ui/dropdown-menu\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface DropdownWrapperProps {\r\n trigger: React.ReactNode;\r\n children: React.ReactNode;\r\n align?: \"start\" | \"center\" | \"end\";\r\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\r\n sideOffset?: number;\r\n className?: string;\r\n contentClassName?: string;\r\n}\r\n\r\nexport function DropdownWrapper({\r\n trigger,\r\n children,\r\n align = \"end\",\r\n side = \"bottom\",\r\n sideOffset = 4,\r\n className,\r\n contentClassName,\r\n ...props\r\n}: DropdownWrapperProps) {\r\n return (\r\n <DropdownMenu {...props}>\r\n <DropdownMenuTrigger render={trigger} />\r\n <DropdownMenuContent\r\n align={align}\r\n side={side}\r\n sideOffset={sideOffset}\r\n className={cn(\"min-w-[160px]\", contentClassName)}\r\n >\r\n {children}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n}\r\n\r\nexport interface ActionDropdownItem {\r\n type?: \"item\" | \"separator\" | \"label\" | \"group\";\r\n key?: string;\r\n label?: string | (() => string);\r\n icon?: LucideIcon;\r\n onClick?: (e: React.MouseEvent) => void;\r\n disabled?: boolean;\r\n hidden?: boolean;\r\n variant?: \"default\" | \"destructive\";\r\n shortcut?: string;\r\n className?: string;\r\n items?: ActionDropdownItem[];\r\n}\r\n\r\nexport interface ActionDropdownProps {\r\n items?: ActionDropdownItem[];\r\n triggerIcon?: LucideIcon;\r\n triggerVariant?: \"default\" | \"destructive\" | \"outline\" | \"secondary\" | \"ghost\" | \"link\";\r\n triggerSize?: \"default\" | \"sm\" | \"lg\" | \"icon\";\r\n triggerClassName?: string;\r\n triggerLabel?: string;\r\n showOnHover?: boolean;\r\n align?: \"start\" | \"center\" | \"end\";\r\n contentClassName?: string;\r\n onOpenChange?: (open: boolean) => void;\r\n stopPropagation?: boolean;\r\n}\r\n\r\nexport function ActionDropdown({\r\n items = [],\r\n triggerIcon: TriggerIcon = MoreHorizontal,\r\n triggerVariant = \"ghost\",\r\n triggerSize = \"sm\",\r\n triggerClassName,\r\n triggerLabel,\r\n showOnHover = false,\r\n align = \"end\",\r\n contentClassName,\r\n onOpenChange,\r\n stopPropagation = true,\r\n ...props\r\n}: ActionDropdownProps) {\r\n const handleTriggerClick = (e: React.MouseEvent) => {\r\n if (stopPropagation) {\r\n e.stopPropagation();\r\n }\r\n };\r\n\r\n const trigger = (\r\n <Button\r\n variant={triggerVariant}\r\n size={triggerSize}\r\n onClick={handleTriggerClick}\r\n className={cn(\r\n showOnHover && \"opacity-0 group-hover:opacity-100 transition-opacity\",\r\n triggerClassName\r\n )}\r\n >\r\n <TriggerIcon className=\"h-4 w-4\" />\r\n {triggerLabel && <span className=\"ml-2\">{triggerLabel}</span>}\r\n <span className=\"sr-only\">Open menu</span>\r\n </Button>\r\n );\r\n\r\n const handleItemClick = (item: ActionDropdownItem) => (e: React.MouseEvent) => {\r\n if (stopPropagation) {\r\n e.stopPropagation();\r\n }\r\n item.onClick?.(e);\r\n };\r\n\r\n return (\r\n <DropdownMenu onOpenChange={onOpenChange} {...props}>\r\n <DropdownMenuTrigger render={trigger} />\r\n <DropdownMenuContent\r\n align={align}\r\n className={cn(\"min-w-[180px]\", contentClassName)}\r\n >\r\n {items.map((item, index) => {\r\n if (item.hidden) return null;\r\n\r\n if (item.type === \"separator\") {\r\n return <DropdownMenuSeparator key={item.key || `separator-${index}`} />;\r\n }\r\n\r\n if (item.type === \"label\") {\r\n return (\r\n <DropdownMenuGroup key={item.key || `label-${index}`}>\r\n <DropdownMenuLabel className={item.className}>\r\n {item.label}\r\n </DropdownMenuLabel>\r\n </DropdownMenuGroup>\r\n );\r\n }\r\n\r\n if (item.type === \"group\") {\r\n return (\r\n <DropdownMenuGroup key={item.key || `group-${index}`}>\r\n {item.items?.map((groupItem, groupIndex) => {\r\n if (groupItem.hidden) return null;\r\n\r\n const GroupItemIcon = groupItem.icon;\r\n const groupItemLabel =\r\n typeof groupItem.label === \"function\" ? groupItem.label() : groupItem.label;\r\n return (\r\n <DropdownMenuItem\r\n key={groupItem.key || `group-item-${groupIndex}`}\r\n onClick={handleItemClick(groupItem)}\r\n disabled={groupItem.disabled}\r\n className={cn(\r\n groupItem.variant === \"destructive\" &&\r\n \"text-destructive focus:text-destructive\",\r\n groupItem.className\r\n )}\r\n >\r\n {GroupItemIcon && <GroupItemIcon className=\"h-4 w-4\" />}\r\n <span>{groupItemLabel}</span>\r\n {groupItem.shortcut && (\r\n <span className=\"ml-auto text-xs tracking-widest text-muted-foreground\">\r\n {groupItem.shortcut}\r\n </span>\r\n )}\r\n </DropdownMenuItem>\r\n );\r\n })}\r\n </DropdownMenuGroup>\r\n );\r\n }\r\n\r\n const ItemIcon = item.icon;\r\n const displayLabel =\r\n typeof item.label === \"function\" ? item.label() : item.label;\r\n\r\n return (\r\n <DropdownMenuItem\r\n key={item.key || `item-${index}`}\r\n onClick={handleItemClick(item)}\r\n disabled={item.disabled}\r\n className={cn(\r\n item.variant === \"destructive\" &&\r\n \"text-destructive focus:text-destructive\",\r\n item.className\r\n )}\r\n >\r\n {ItemIcon && <ItemIcon className=\"h-4 w-4\" />}\r\n <span>{displayLabel}</span>\r\n {item.shortcut && (\r\n <span className=\"ml-auto text-xs tracking-widest text-muted-foreground\">\r\n {item.shortcut}\r\n </span>\r\n )}\r\n </DropdownMenuItem>\r\n );\r\n })}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n}\r\n\r\nexport interface SelectDropdownOption {\r\n value: string;\r\n label: string;\r\n icon?: LucideIcon;\r\n}\r\n\r\nexport interface SelectDropdownProps {\r\n value?: string;\r\n onValueChange?: (value: string) => void;\r\n placeholder?: string;\r\n options?: SelectDropdownOption[];\r\n triggerClassName?: string;\r\n contentClassName?: string;\r\n disabled?: boolean;\r\n}\r\n\r\nexport function SelectDropdown({\r\n value,\r\n onValueChange,\r\n placeholder = \"Select option...\",\r\n options = [],\r\n triggerClassName,\r\n contentClassName,\r\n disabled = false,\r\n ...props\r\n}: SelectDropdownProps) {\r\n const selectedOption = options.find((option) => option.value === value);\r\n\r\n const trigger = (\r\n <Button\r\n variant=\"outline\"\r\n disabled={disabled}\r\n className={cn(\r\n \"w-full justify-between\",\r\n !selectedOption && \"text-muted-foreground\",\r\n triggerClassName\r\n )}\r\n >\r\n {selectedOption ? selectedOption.label : placeholder}\r\n <ChevronDown className=\"ml-2 h-4 w-4 shrink-0 opacity-50\" />\r\n </Button>\r\n );\r\n\r\n return (\r\n <DropdownMenu {...props}>\r\n <DropdownMenuTrigger render={trigger} />\r\n <DropdownMenuContent\r\n align=\"start\"\r\n className={cn(\r\n \"w-full min-w-(--anchor-width)\",\r\n contentClassName\r\n )}\r\n >\r\n {options.map((option) => (\r\n <DropdownMenuItem\r\n key={option.value}\r\n onClick={() => onValueChange?.(option.value)}\r\n className={cn(\"cursor-pointer\", value === option.value && \"bg-accent\")}\r\n >\r\n {option.icon && <option.icon className=\"mr-2 h-4 w-4\" />}\r\n {option.label}\r\n </DropdownMenuItem>\r\n ))}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n}\r\n\r\nexport interface CheckboxDropdownProps {\r\n values?: string[];\r\n onValuesChange?: (values: string[]) => void;\r\n placeholder?: string;\r\n options?: SelectDropdownOption[];\r\n triggerClassName?: string;\r\n contentClassName?: string;\r\n disabled?: boolean;\r\n showSelectedCount?: boolean;\r\n}\r\n\r\nexport function CheckboxDropdown({\r\n values = [],\r\n onValuesChange,\r\n placeholder = \"Select options...\",\r\n options = [],\r\n triggerClassName,\r\n contentClassName,\r\n disabled = false,\r\n showSelectedCount = true,\r\n ...props\r\n}: CheckboxDropdownProps) {\r\n const selectedOptions = options.filter((option) => values.includes(option.value));\r\n const displayText =\r\n selectedOptions.length > 0\r\n ? showSelectedCount\r\n ? `${selectedOptions.length} selected`\r\n : selectedOptions.map((opt) => opt.label).join(\", \")\r\n : placeholder;\r\n\r\n const trigger = (\r\n <Button\r\n variant=\"outline\"\r\n disabled={disabled}\r\n className={cn(\r\n \"w-full justify-between\",\r\n selectedOptions.length === 0 && \"text-muted-foreground\",\r\n triggerClassName\r\n )}\r\n >\r\n <span className=\"truncate\">{displayText}</span>\r\n <ChevronDown className=\"ml-2 h-4 w-4 shrink-0 opacity-50\" />\r\n </Button>\r\n );\r\n\r\n const handleCheckedChange = (optionValue: string, checked: boolean) => {\r\n if (checked) {\r\n onValuesChange?.([...values, optionValue]);\r\n } else {\r\n onValuesChange?.(values.filter((value) => value !== optionValue));\r\n }\r\n };\r\n\r\n return (\r\n <DropdownMenu {...props}>\r\n <DropdownMenuTrigger render={trigger} />\r\n <DropdownMenuContent\r\n align=\"start\"\r\n className={cn(\r\n \"w-full min-w-(--anchor-width)\",\r\n contentClassName\r\n )}\r\n >\r\n {options.map((option) => (\r\n <DropdownMenuCheckboxItem\r\n key={option.value}\r\n checked={values.includes(option.value)}\r\n onCheckedChange={(checked: boolean) => handleCheckedChange(option.value, checked)}\r\n >\r\n {option.icon && <option.icon className=\"mr-2 h-4 w-4\" />}\r\n {option.label}\r\n </DropdownMenuCheckboxItem>\r\n ))}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n}\r\n\r\nexport interface RadioDropdownProps {\r\n value?: string;\r\n onValueChange?: (value: string) => void;\r\n placeholder?: string;\r\n options?: SelectDropdownOption[];\r\n triggerClassName?: string;\r\n contentClassName?: string;\r\n disabled?: boolean;\r\n}\r\n\r\nexport function RadioDropdown({\r\n value,\r\n onValueChange,\r\n placeholder = \"Select option...\",\r\n options = [],\r\n triggerClassName,\r\n contentClassName,\r\n disabled = false,\r\n ...props\r\n}: RadioDropdownProps) {\r\n const selectedOption = options.find((option) => option.value === value);\r\n\r\n const trigger = (\r\n <Button\r\n variant=\"outline\"\r\n disabled={disabled}\r\n className={cn(\r\n \"w-full justify-between\",\r\n !selectedOption && \"text-muted-foreground\",\r\n triggerClassName\r\n )}\r\n >\r\n {selectedOption ? selectedOption.label : placeholder}\r\n <ChevronDown className=\"ml-2 h-4 w-4 shrink-0 opacity-50\" />\r\n </Button>\r\n );\r\n\r\n return (\r\n <DropdownMenu {...props}>\r\n <DropdownMenuTrigger render={trigger} />\r\n <DropdownMenuContent\r\n align=\"start\"\r\n className={cn(\r\n \"w-full min-w-(--anchor-width)\",\r\n contentClassName\r\n )}\r\n >\r\n <DropdownMenuRadioGroup value={value} onValueChange={onValueChange}>\r\n {options.map((option) => (\r\n <DropdownMenuRadioItem key={option.value} value={option.value}>\r\n {option.icon && <option.icon className=\"mr-2 h-4 w-4\" />}\r\n {option.label}\r\n </DropdownMenuRadioItem>\r\n ))}\r\n </DropdownMenuRadioGroup>\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { ComponentType, ReactNode } from \"react\";\r\nimport { LucideProps } from \"lucide-react\";\r\nimport { CopyText } from \"./copy-button\";\r\n\r\nexport interface InfoRowProps {\r\n label: string;\r\n value: ReactNode;\r\n copyable?: boolean;\r\n icon?: ComponentType<LucideProps>;\r\n}\r\n\r\nexport function InfoRow({ label, value, copyable = false, icon: Icon }: InfoRowProps) {\r\n if (!value && value !== 0) return null;\r\n\r\n return (\r\n <div className=\"flex flex-col sm:flex-row sm:justify-between sm:items-center py-3 gap-2 group hover:bg-muted rounded-md px-3 -mx-3 transition-colors\">\r\n <div className=\"flex items-center gap-2 min-w-0\">\r\n {Icon && <Icon className=\"h-4 w-4 text-muted-foreground flex-shrink-0\" />}\r\n <span className=\"text-sm font-medium text-muted-foreground truncate\">{label}</span>\r\n </div>\r\n <div className=\"sm:text-right min-w-0 flex-shrink-0\">\r\n {copyable ? (\r\n <CopyText\r\n value={String(value)}\r\n textClassName=\"text-foreground font-semibold\"\r\n maxLength={40}\r\n className=\"justify-start sm:justify-end\"\r\n />\r\n ) : (\r\n <span\r\n className=\"font-semibold text-foreground block truncate max-w-full sm:max-w-[250px]\"\r\n title={value?.toString() || \"N/A\"}\r\n >\r\n {value?.toString() || \"N/A\"}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { cva, VariantProps } from \"class-variance-authority\";\r\nimport { Item, ItemContent, ItemDescription } from \"@/components/ui/item\";\r\nimport { cn } from \"../utils\";\r\n\r\n/**\r\n * Item Component Helpers\r\n */\r\n\r\nconst iconItemMediaVariants = cva(\r\n \"rounded-xl flex items-center justify-center shrink-0\",\r\n {\r\n variants: {\r\n iconBg: {\r\n primary: \"bg-primary/10 text-primary\",\r\n gold: \"bg-primary/20 text-primary\",\r\n muted: \"bg-muted text-foreground\",\r\n gradient:\r\n \"bg-gradient-to-br from-primary/20 to-primary/10 text-primary\",\r\n none: \"bg-transparent\",\r\n },\r\n iconSize: {\r\n sm: \"size-8\",\r\n md: \"size-10 md:size-12\",\r\n lg: \"size-12 md:size-14\",\r\n xl: \"size-16 md:size-20\",\r\n },\r\n },\r\n defaultVariants: {\r\n iconBg: \"primary\",\r\n iconSize: \"md\",\r\n },\r\n },\r\n);\r\n\r\nconst iconSizeMap = {\r\n sm: 16,\r\n md: 20,\r\n lg: 24,\r\n xl: 32,\r\n};\r\n\r\nexport interface IconItemMediaProps\r\n extends\r\n React.HTMLAttributes<HTMLDivElement>,\r\n VariantProps<typeof iconItemMediaVariants> {\r\n icon?: React.ReactNode;\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport const IconItemMedia = React.memo(function IconItemMedia({\r\n icon,\r\n iconBg = \"primary\",\r\n iconSize = \"md\",\r\n className,\r\n children,\r\n ...props\r\n}: IconItemMediaProps) {\r\n return (\r\n <div\r\n data-slot=\"item-media\"\r\n role=\"presentation\"\r\n className={cn(iconItemMediaVariants({ iconBg, iconSize }), className)}\r\n {...props}\r\n >\r\n {children || icon}\r\n </div>\r\n );\r\n});\r\n\r\nIconItemMedia.displayName = \"IconItemMedia\";\r\n\r\nexport interface FeatureItemProps {\r\n icon?: React.ReactNode;\r\n iconBg?: \"primary\" | \"gold\" | \"muted\" | \"gradient\" | \"none\";\r\n iconSize?: \"sm\" | \"md\" | \"lg\" | \"xl\";\r\n title?: React.ReactNode;\r\n description?: React.ReactNode;\r\n variant?: \"default\" | \"outline\" | \"ghost\" | \"gradient-light\" | \"gradient\";\r\n size?: \"sm\" | \"default\" | \"lg\";\r\n layout?: \"vertical\" | \"horizontal\";\r\n titleAs?: React.ElementType;\r\n className?: string;\r\n titleClassName?: string;\r\n descriptionClassName?: string;\r\n iconClassName?: string;\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport const FeatureItem = React.memo(function FeatureItem({\r\n icon,\r\n iconBg = \"primary\",\r\n iconSize = \"md\",\r\n title,\r\n description,\r\n variant = \"outline\",\r\n size = \"default\",\r\n layout = \"vertical\",\r\n titleAs = \"h3\",\r\n className,\r\n titleClassName,\r\n descriptionClassName,\r\n iconClassName,\r\n children,\r\n ...props\r\n}: FeatureItemProps) {\r\n const hasGradientBorder =\r\n variant === \"gradient-light\" || variant === \"gradient\";\r\n const TitleComponent = titleAs;\r\n\r\n if (hasGradientBorder) {\r\n return (\r\n <div\r\n className={cn(\r\n variant === \"gradient-light\"\r\n ? \"gradient-border-light\"\r\n : \"gradient-border\",\r\n \"rounded-2xl hover:gradient-border-hover transition-all duration-300\",\r\n className,\r\n )}\r\n >\r\n <div\r\n className={cn(\r\n \"gradient-border-inner rounded-2xl p-6 flex\",\r\n layout === \"vertical\"\r\n ? \"flex-col items-start gap-4\"\r\n : \"flex-row items-center gap-4\",\r\n )}\r\n >\r\n {icon && (\r\n <IconItemMedia\r\n icon={icon}\r\n iconBg={iconBg}\r\n iconSize={iconSize}\r\n className={cn(\r\n layout === \"vertical\" ? \"\" : \"shrink-0\",\r\n iconClassName,\r\n )}\r\n />\r\n )}\r\n <div className=\"flex flex-col gap-2 flex-1\">\r\n {title && (\r\n <TitleComponent\r\n className={cn(\r\n \"text-base md:text-lg font-semibold text-foreground leading-tight\",\r\n titleClassName,\r\n )}\r\n >\r\n {title}\r\n </TitleComponent>\r\n )}\r\n {description && (\r\n <p\r\n className={cn(\r\n \"text-sm text-muted-foreground leading-relaxed\",\r\n descriptionClassName,\r\n )}\r\n >\r\n {description}\r\n </p>\r\n )}\r\n {children}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <Item\r\n variant={variant}\r\n size={size}\r\n className={cn(layout === \"vertical\" && \"flex-col items-start\", className)}\r\n {...props}\r\n >\r\n {icon && (\r\n <IconItemMedia\r\n icon={icon}\r\n iconBg={iconBg}\r\n iconSize={iconSize}\r\n className={iconClassName}\r\n />\r\n )}\r\n <ItemContent>\r\n {title && (\r\n <TitleComponent\r\n data-slot=\"item-title\"\r\n className={cn(\r\n \"text-base md:text-lg font-semibold text-foreground leading-tight mb-2\",\r\n titleClassName,\r\n )}\r\n >\r\n {title}\r\n </TitleComponent>\r\n )}\r\n {description && (\r\n <ItemDescription\r\n className={cn(\r\n \"text-sm text-muted-foreground leading-relaxed\",\r\n descriptionClassName,\r\n )}\r\n >\r\n {description}\r\n </ItemDescription>\r\n )}\r\n {children}\r\n </ItemContent>\r\n </Item>\r\n );\r\n});\r\n\r\nFeatureItem.displayName = \"FeatureItem\";\r\n\r\nexport interface FeatureListItem {\r\n id?: string;\r\n icon?: React.ReactNode;\r\n iconBg?: \"primary\" | \"gold\" | \"muted\" | \"gradient\" | \"none\";\r\n iconSize?: \"sm\" | \"md\" | \"lg\" | \"xl\";\r\n title: string;\r\n description?: string;\r\n}\r\n\r\nexport interface FeatureListProps {\r\n items?: FeatureListItem[];\r\n columns?: 2 | 3 | 4;\r\n variant?: \"default\" | \"outline\" | \"ghost\" | \"gradient-light\" | \"gradient\";\r\n iconBg?: \"primary\" | \"gold\" | \"muted\" | \"gradient\" | \"none\";\r\n iconSize?: \"sm\" | \"md\" | \"lg\" | \"xl\";\r\n layout?: \"vertical\" | \"horizontal\";\r\n className?: string;\r\n itemClassName?: string;\r\n}\r\n\r\nexport function FeatureList({\r\n items = [],\r\n columns = 3,\r\n variant = \"outline\",\r\n iconBg = \"primary\",\r\n iconSize = \"md\",\r\n layout = \"vertical\",\r\n className,\r\n itemClassName,\r\n ...props\r\n}: FeatureListProps) {\r\n const gridCols: Record<number, string> = {\r\n 2: \"md:grid-cols-2\",\r\n 3: \"md:grid-cols-2 lg:grid-cols-3\",\r\n 4: \"md:grid-cols-2 lg:grid-cols-4\",\r\n };\r\n\r\n return (\r\n <div\r\n role=\"list\"\r\n className={cn(\"grid gap-6\", gridCols[columns] || gridCols[3], className)}\r\n {...props}\r\n >\r\n {items.map((item, index) => (\r\n <FeatureItem\r\n key={item.id || item.title || index}\r\n icon={item.icon}\r\n iconBg={item.iconBg || iconBg}\r\n iconSize={item.iconSize || iconSize}\r\n title={item.title}\r\n description={item.description}\r\n variant={variant}\r\n layout={layout}\r\n className={itemClassName}\r\n />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nFeatureList.displayName = \"FeatureList\";\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { Moon, Sun } from \"lucide-react\";\r\nimport { useTheme } from \"next-themes\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuRadioGroup,\r\n DropdownMenuRadioItem,\r\n DropdownMenuTrigger,\r\n} from \"@/components/ui/dropdown-menu\";\r\n\r\nexport function ModeToggle() {\r\n const { theme, setTheme } = useTheme();\r\n const [mounted, setMounted] = React.useState(false);\r\n\r\n React.useEffect(() => {\r\n setMounted(true);\r\n }, []);\r\n\r\n if (!mounted) {\r\n return (\r\n <Button variant=\"ghost\" size=\"icon\">\r\n <Sun className=\"h-[1.2rem] w-[1.2rem]\" />\r\n <span className=\"sr-only\">Toggle theme</span>\r\n </Button>\r\n );\r\n }\r\n\r\n return (\r\n <DropdownMenu modal={false}>\r\n <DropdownMenuTrigger render={<Button variant=\"ghost\" size=\"icon\" />}>\r\n <Sun className=\"h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0\" />\r\n <Moon className=\"absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100\" />\r\n <span className=\"sr-only\">Toggle theme</span>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"end\">\r\n <DropdownMenuRadioGroup value={theme} onValueChange={setTheme}>\r\n <DropdownMenuRadioItem value=\"light\">Light</DropdownMenuRadioItem>\r\n <DropdownMenuRadioItem value=\"dark\">Dark</DropdownMenuRadioItem>\r\n <DropdownMenuRadioItem value=\"system\">System</DropdownMenuRadioItem>\r\n </DropdownMenuRadioGroup>\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { ChevronDown } from \"lucide-react\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport {\r\n Command,\r\n CommandEmpty,\r\n CommandGroup,\r\n CommandInput,\r\n CommandItem,\r\n CommandList,\r\n} from \"@/components/ui/command\";\r\nimport { InputGroup, InputGroupAddon, InputGroupInput } from \"@/components/ui/input-group\";\r\nimport {\r\n Popover,\r\n PopoverContent,\r\n PopoverTrigger,\r\n} from \"@/components/ui/popover\";\r\nimport { ScrollArea } from \"@/components/ui/scroll-area\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface PhoneCountry {\r\n code: string;\r\n name: string;\r\n dialCode: string;\r\n flag: string;\r\n}\r\n\r\n// Common countries with emoji flags - prioritize UK and common countries\r\nexport const DEFAULT_COUNTRIES: PhoneCountry[] = [\r\n { code: \"GB\", name: \"United Kingdom\", dialCode: \"+44\", flag: \"\\u{1F1EC}\\u{1F1E7}\" },\r\n { code: \"US\", name: \"United States\", dialCode: \"+1\", flag: \"\\u{1F1FA}\\u{1F1F8}\" },\r\n { code: \"IE\", name: \"Ireland\", dialCode: \"+353\", flag: \"\\u{1F1EE}\\u{1F1EA}\" },\r\n { code: \"FR\", name: \"France\", dialCode: \"+33\", flag: \"\\u{1F1EB}\\u{1F1F7}\" },\r\n { code: \"DE\", name: \"Germany\", dialCode: \"+49\", flag: \"\\u{1F1E9}\\u{1F1EA}\" },\r\n { code: \"IT\", name: \"Italy\", dialCode: \"+39\", flag: \"\\u{1F1EE}\\u{1F1F9}\" },\r\n { code: \"ES\", name: \"Spain\", dialCode: \"+34\", flag: \"\\u{1F1EA}\\u{1F1F8}\" },\r\n { code: \"NL\", name: \"Netherlands\", dialCode: \"+31\", flag: \"\\u{1F1F3}\\u{1F1F1}\" },\r\n { code: \"BE\", name: \"Belgium\", dialCode: \"+32\", flag: \"\\u{1F1E7}\\u{1F1EA}\" },\r\n { code: \"PT\", name: \"Portugal\", dialCode: \"+351\", flag: \"\\u{1F1F5}\\u{1F1F9}\" },\r\n { code: \"CH\", name: \"Switzerland\", dialCode: \"+41\", flag: \"\\u{1F1E8}\\u{1F1ED}\" },\r\n { code: \"AT\", name: \"Austria\", dialCode: \"+43\", flag: \"\\u{1F1E6}\\u{1F1F9}\" },\r\n { code: \"SE\", name: \"Sweden\", dialCode: \"+46\", flag: \"\\u{1F1F8}\\u{1F1EA}\" },\r\n { code: \"NO\", name: \"Norway\", dialCode: \"+47\", flag: \"\\u{1F1F3}\\u{1F1F4}\" },\r\n { code: \"DK\", name: \"Denmark\", dialCode: \"+45\", flag: \"\\u{1F1E9}\\u{1F1F0}\" },\r\n { code: \"PL\", name: \"Poland\", dialCode: \"+48\", flag: \"\\u{1F1F5}\\u{1F1F1}\" },\r\n { code: \"GR\", name: \"Greece\", dialCode: \"+30\", flag: \"\\u{1F1EC}\\u{1F1F7}\" },\r\n { code: \"CZ\", name: \"Czech Republic\", dialCode: \"+420\", flag: \"\\u{1F1E8}\\u{1F1FF}\" },\r\n { code: \"RO\", name: \"Romania\", dialCode: \"+40\", flag: \"\\u{1F1F7}\\u{1F1F4}\" },\r\n { code: \"HU\", name: \"Hungary\", dialCode: \"+36\", flag: \"\\u{1F1ED}\\u{1F1FA}\" },\r\n { code: \"AU\", name: \"Australia\", dialCode: \"+61\", flag: \"\\u{1F1E6}\\u{1F1FA}\" },\r\n { code: \"NZ\", name: \"New Zealand\", dialCode: \"+64\", flag: \"\\u{1F1F3}\\u{1F1FF}\" },\r\n { code: \"CA\", name: \"Canada\", dialCode: \"+1\", flag: \"\\u{1F1E8}\\u{1F1E6}\" },\r\n { code: \"IN\", name: \"India\", dialCode: \"+91\", flag: \"\\u{1F1EE}\\u{1F1F3}\" },\r\n { code: \"PK\", name: \"Pakistan\", dialCode: \"+92\", flag: \"\\u{1F1F5}\\u{1F1F0}\" },\r\n { code: \"BD\", name: \"Bangladesh\", dialCode: \"+880\", flag: \"\\u{1F1E7}\\u{1F1E9}\" },\r\n { code: \"AE\", name: \"UAE\", dialCode: \"+971\", flag: \"\\u{1F1E6}\\u{1F1EA}\" },\r\n { code: \"SA\", name: \"Saudi Arabia\", dialCode: \"+966\", flag: \"\\u{1F1F8}\\u{1F1E6}\" },\r\n { code: \"QA\", name: \"Qatar\", dialCode: \"+974\", flag: \"\\u{1F1F6}\\u{1F1E6}\" },\r\n { code: \"KW\", name: \"Kuwait\", dialCode: \"+965\", flag: \"\\u{1F1F0}\\u{1F1FC}\" },\r\n { code: \"SG\", name: \"Singapore\", dialCode: \"+65\", flag: \"\\u{1F1F8}\\u{1F1EC}\" },\r\n { code: \"MY\", name: \"Malaysia\", dialCode: \"+60\", flag: \"\\u{1F1F2}\\u{1F1FE}\" },\r\n { code: \"JP\", name: \"Japan\", dialCode: \"+81\", flag: \"\\u{1F1EF}\\u{1F1F5}\" },\r\n { code: \"KR\", name: \"South Korea\", dialCode: \"+82\", flag: \"\\u{1F1F0}\\u{1F1F7}\" },\r\n { code: \"CN\", name: \"China\", dialCode: \"+86\", flag: \"\\u{1F1E8}\\u{1F1F3}\" },\r\n { code: \"HK\", name: \"Hong Kong\", dialCode: \"+852\", flag: \"\\u{1F1ED}\\u{1F1F0}\" },\r\n { code: \"TW\", name: \"Taiwan\", dialCode: \"+886\", flag: \"\\u{1F1F9}\\u{1F1FC}\" },\r\n { code: \"TH\", name: \"Thailand\", dialCode: \"+66\", flag: \"\\u{1F1F9}\\u{1F1ED}\" },\r\n { code: \"PH\", name: \"Philippines\", dialCode: \"+63\", flag: \"\\u{1F1F5}\\u{1F1ED}\" },\r\n { code: \"VN\", name: \"Vietnam\", dialCode: \"+84\", flag: \"\\u{1F1FB}\\u{1F1F3}\" },\r\n { code: \"ID\", name: \"Indonesia\", dialCode: \"+62\", flag: \"\\u{1F1EE}\\u{1F1E9}\" },\r\n { code: \"ZA\", name: \"South Africa\", dialCode: \"+27\", flag: \"\\u{1F1FF}\\u{1F1E6}\" },\r\n { code: \"NG\", name: \"Nigeria\", dialCode: \"+234\", flag: \"\\u{1F1F3}\\u{1F1EC}\" },\r\n { code: \"EG\", name: \"Egypt\", dialCode: \"+20\", flag: \"\\u{1F1EA}\\u{1F1EC}\" },\r\n { code: \"BR\", name: \"Brazil\", dialCode: \"+55\", flag: \"\\u{1F1E7}\\u{1F1F7}\" },\r\n { code: \"MX\", name: \"Mexico\", dialCode: \"+52\", flag: \"\\u{1F1F2}\\u{1F1FD}\" },\r\n { code: \"AR\", name: \"Argentina\", dialCode: \"+54\", flag: \"\\u{1F1E6}\\u{1F1F7}\" },\r\n { code: \"TR\", name: \"Turkey\", dialCode: \"+90\", flag: \"\\u{1F1F9}\\u{1F1F7}\" },\r\n { code: \"RU\", name: \"Russia\", dialCode: \"+7\", flag: \"\\u{1F1F7}\\u{1F1FA}\" },\r\n { code: \"IL\", name: \"Israel\", dialCode: \"+972\", flag: \"\\u{1F1EE}\\u{1F1F1}\" },\r\n];\r\n\r\nexport interface PhoneInputProps\r\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"onChange\"> {\r\n onChange?: (value: string) => void;\r\n defaultCountry?: string;\r\n /** Custom list of countries to show. Defaults to a built-in list of ~50 countries. */\r\n countries?: PhoneCountry[];\r\n ref?: React.Ref<HTMLInputElement>;\r\n}\r\n\r\nfunction PhoneInput({\r\n className,\r\n onChange,\r\n value,\r\n defaultCountry = \"GB\",\r\n countries = DEFAULT_COUNTRIES,\r\n disabled,\r\n placeholder = \"Phone number\",\r\n ref,\r\n ...props\r\n}: PhoneInputProps) {\r\n const [isOpen, setIsOpen] = React.useState(false);\r\n const [searchValue, setSearchValue] = React.useState(\"\");\r\n\r\n const getCountryByCode = React.useCallback(\r\n (code: string) => countries.find((c) => c.code === code),\r\n [countries]\r\n );\r\n\r\n // Parse the value to extract country and number\r\n const parseValue = React.useCallback(\r\n (val: string | number | readonly string[] | undefined) => {\r\n const valString = val ? String(val) : \"\";\r\n if (!valString) {\r\n return {\r\n country: getCountryByCode(defaultCountry) || countries[0],\r\n number: \"\",\r\n };\r\n }\r\n\r\n // Try to match country by dial code\r\n const cleanVal = valString.replace(/\\s/g, \"\");\r\n for (const country of countries) {\r\n if (cleanVal.startsWith(country.dialCode)) {\r\n return {\r\n country,\r\n number: cleanVal.slice(country.dialCode.length),\r\n };\r\n }\r\n }\r\n\r\n // Default to selected country\r\n return {\r\n country: getCountryByCode(defaultCountry) || countries[0],\r\n number: cleanVal.replace(/^\\+/, \"\"),\r\n };\r\n },\r\n [defaultCountry, countries, getCountryByCode]\r\n );\r\n\r\n const { country, number } = parseValue(value);\r\n const [selectedCountry, setSelectedCountry] = React.useState<PhoneCountry>(country);\r\n\r\n // Update selected country when value changes\r\n React.useEffect(() => {\r\n const parsed = parseValue(value);\r\n setSelectedCountry(parsed.country);\r\n }, [value, parseValue]);\r\n\r\n const handleCountryChange = (newCountry: PhoneCountry) => {\r\n setSelectedCountry(newCountry);\r\n setIsOpen(false);\r\n // Update the full value with new country code\r\n if (number) {\r\n onChange?.(newCountry.dialCode + number);\r\n }\r\n };\r\n\r\n const handleNumberChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const newNumber = e.target.value.replace(/[^\\d]/g, \"\");\r\n if (newNumber) {\r\n onChange?.(selectedCountry.dialCode + newNumber);\r\n } else {\r\n onChange?.(\"\");\r\n }\r\n };\r\n\r\n return (\r\n <InputGroup className={className}>\r\n <InputGroupAddon align=\"inline-start\" className=\"p-0 overflow-hidden\">\r\n <Popover\r\n open={isOpen}\r\n modal\r\n onOpenChange={(open: boolean) => {\r\n setIsOpen(open);\r\n if (open) setSearchValue(\"\");\r\n }}\r\n >\r\n <PopoverTrigger\r\n render={\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n className=\"gap-1.5 rounded-none border-r px-3 focus:z-10 min-w-[90px] h-full\"\r\n disabled={disabled}\r\n >\r\n <span className=\"text-base leading-none\">\r\n {selectedCountry.flag}\r\n </span>\r\n <span className=\"text-xs text-muted-foreground\">\r\n {selectedCountry.dialCode}\r\n </span>\r\n <ChevronDown className=\"size-3.5 opacity-50\" />\r\n </Button>\r\n }\r\n />\r\n <PopoverContent className=\"w-[280px] p-0\" align=\"start\">\r\n <Command>\r\n <CommandInput\r\n value={searchValue}\r\n onValueChange={setSearchValue}\r\n placeholder=\"Search country...\"\r\n />\r\n <CommandList>\r\n <ScrollArea className=\"h-64\">\r\n <CommandEmpty>No country found.</CommandEmpty>\r\n <CommandGroup>\r\n {countries.filter(\r\n (c) =>\r\n c.name.toLowerCase().includes(searchValue.toLowerCase()) ||\r\n c.dialCode.includes(searchValue) ||\r\n c.code.toLowerCase().includes(searchValue.toLowerCase())\r\n ).map((c) => (\r\n <CommandItem\r\n key={c.code}\r\n className=\"gap-2 cursor-pointer\"\r\n onSelect={() => handleCountryChange(c)}\r\n value={`${c.name} ${c.code} ${c.dialCode}`}\r\n >\r\n <span className=\"text-base\">{c.flag}</span>\r\n <span className=\"flex-1 text-sm\">{c.name}</span>\r\n <span className=\"text-sm text-muted-foreground\">\r\n {c.dialCode}\r\n </span>\r\n </CommandItem>\r\n ))}\r\n </CommandGroup>\r\n </ScrollArea>\r\n </CommandList>\r\n </Command>\r\n </PopoverContent>\r\n </Popover>\r\n </InputGroupAddon>\r\n <InputGroupInput\r\n ref={ref}\r\n type=\"tel\"\r\n inputMode=\"numeric\"\r\n className=\"rounded-s-none\"\r\n placeholder={placeholder}\r\n value={number}\r\n onChange={handleNumberChange}\r\n disabled={disabled}\r\n {...props}\r\n />\r\n </InputGroup>\r\n );\r\n}\r\n\r\nexport { PhoneInput };\r\n","\"use client\";\r\n\r\nimport { ReactNode, ComponentType } from \"react\";\r\nimport { ChevronDownIcon, ChevronUpIcon, MinusIcon, LucideProps } from \"lucide-react\";\r\nimport { Badge } from \"@/components/ui/badge\";\r\nimport { Avatar, AvatarImage, AvatarFallback } from \"@/components/ui/avatar\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface PillProps {\r\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"outline\";\r\n themed?: boolean;\r\n className?: string;\r\n children?: ReactNode;\r\n}\r\n\r\nexport function Pill({\r\n variant = \"secondary\",\r\n themed = false,\r\n className,\r\n ...props\r\n}: PillProps) {\r\n return (\r\n <Badge\r\n className={cn(\"gap-2 rounded-full px-3 py-1.5 font-normal\", className)}\r\n variant={variant}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nexport interface PillAvatarProps {\r\n fallback?: string;\r\n className?: string;\r\n src?: string;\r\n alt?: string;\r\n}\r\n\r\nexport function PillAvatar({ fallback, className, src, alt, ...props }: PillAvatarProps) {\r\n return (\r\n <Avatar className={cn(\"-ml-1 h-4 w-4\", className)}>\r\n <AvatarImage src={src} alt={alt} {...props} />\r\n <AvatarFallback>{fallback}</AvatarFallback>\r\n </Avatar>\r\n );\r\n}\r\n\r\nexport interface PillButtonProps {\r\n className?: string;\r\n children?: ReactNode;\r\n onClick?: () => void;\r\n}\r\n\r\nexport function PillButton({ className, ...props }: PillButtonProps) {\r\n return (\r\n <Button\r\n className={cn(\"-my-2 -mr-2 size-6 rounded-full p-0.5 hover:bg-foreground/5\", className)}\r\n size=\"icon\"\r\n variant=\"ghost\"\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nexport interface PillStatusProps {\r\n children?: ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function PillStatus({ children, className, ...props }: PillStatusProps) {\r\n return (\r\n <div\r\n className={cn(\"flex items-center gap-2 border-r pr-2 font-medium\", className)}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\nexport interface PillIndicatorProps {\r\n variant?: \"success\" | \"error\" | \"warning\" | \"info\";\r\n pulse?: boolean;\r\n}\r\n\r\nexport function PillIndicator({ variant = \"success\", pulse = false }: PillIndicatorProps) {\r\n return (\r\n <span className=\"relative flex size-2\">\r\n {pulse && (\r\n <span\r\n className={cn(\r\n \"absolute inline-flex h-full w-full animate-ping rounded-full opacity-75\",\r\n variant === \"success\" && \"bg-emerald-400\",\r\n variant === \"error\" && \"bg-rose-400\",\r\n variant === \"warning\" && \"bg-amber-400\",\r\n variant === \"info\" && \"bg-sky-400\"\r\n )}\r\n />\r\n )}\r\n <span\r\n className={cn(\r\n \"relative inline-flex size-2 rounded-full\",\r\n variant === \"success\" && \"bg-emerald-500\",\r\n variant === \"error\" && \"bg-rose-500\",\r\n variant === \"warning\" && \"bg-amber-500\",\r\n variant === \"info\" && \"bg-sky-500\"\r\n )}\r\n />\r\n </span>\r\n );\r\n}\r\n\r\nexport interface PillDeltaProps {\r\n className?: string;\r\n delta?: number;\r\n}\r\n\r\nexport function PillDelta({ className, delta }: PillDeltaProps) {\r\n if (!delta) {\r\n return <MinusIcon className={cn(\"size-3 text-muted-foreground\", className)} />;\r\n }\r\n\r\n if (delta > 0) {\r\n return <ChevronUpIcon className={cn(\"size-3 text-emerald-500\", className)} />;\r\n }\r\n\r\n return <ChevronDownIcon className={cn(\"size-3 text-rose-500\", className)} />;\r\n}\r\n\r\nexport interface PillIconProps extends LucideProps {\r\n icon: ComponentType<LucideProps>;\r\n className?: string;\r\n}\r\n\r\nexport function PillIcon({ icon: Icon, className, ...props }: PillIconProps) {\r\n return (\r\n <Icon className={cn(\"size-3 text-muted-foreground\", className)} size={12} {...props} />\r\n );\r\n}\r\n\r\nexport interface PillAvatarGroupProps {\r\n children?: ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function PillAvatarGroup({ children, className, ...props }: PillAvatarGroupProps) {\r\n return (\r\n <div\r\n className={cn(\r\n \"-space-x-1 flex items-center\",\r\n \"[&>*:not(:first-of-type)]:mask-[radix-gradient(circle_9px_at_-4px_50%,transparent_99%,white_100%)]\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { memo, useMemo, ReactNode } from \"react\";\r\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from \"@/components/ui/tabs\";\r\nimport { ScrollArea } from \"@/components/ui/scroll-area\";\r\nimport { cn } from \"../utils\";\r\n\r\nconst LIST_BASE_CLASS =\r\n \"flex flex-wrap items-center justify-start gap-1 h-auto rounded-md p-1 shadow-sm transition-colors\";\r\n\r\nconst LIST_VARIANTS: Record<string, string> = {\r\n default: \"border border-border/50 bg-muted/60 backdrop-blur-sm\",\r\n primary: \"border border-primary/30 bg-primary/10\",\r\n secondary: \"border border-secondary/40 bg-secondary/10\",\r\n outline: \"border border-border bg-background\",\r\n ghost: \"border border-transparent bg-transparent shadow-none\",\r\n underline:\r\n \"w-full mb-4 rounded-none border-b border-border/60 bg-transparent p-0 shadow-none gap-6\",\r\n};\r\n\r\nconst TRIGGER_VARIANTS: Record<string, string> = {\r\n default:\r\n \"text-muted-foreground hover:bg-muted/40 hover:text-foreground data-active:bg-background data-active:text-foreground data-active:shadow-sm\",\r\n primary:\r\n \"text-primary hover:bg-primary/10 hover:text-primary data-active:bg-primary data-active:text-primary-foreground\",\r\n secondary:\r\n \"text-secondary-foreground hover:bg-secondary/10 hover:text-secondary-foreground data-active:bg-secondary data-active:text-secondary-foreground\",\r\n outline:\r\n \"text-foreground hover:bg-accent/40 hover:text-accent-foreground data-active:bg-accent data-active:text-accent-foreground\",\r\n ghost:\r\n \"text-muted-foreground hover:bg-muted/30 hover:text-foreground data-active:bg-muted data-active:text-foreground\",\r\n underline:\r\n \"text-muted-foreground rounded-none px-0 py-2 hover:bg-transparent hover:text-primary border-b-2 border-transparent data-active:border-primary data-active:text-primary data-active:shadow-none\",\r\n};\r\n\r\nexport interface TabsWrapperProps {\r\n defaultValue?: string;\r\n value?: string;\r\n onValueChange?: (value: string) => void;\r\n children: ReactNode;\r\n className?: string;\r\n listClassName?: string;\r\n contentClassName?: string;\r\n variant?:\r\n | \"default\"\r\n | \"primary\"\r\n | \"secondary\"\r\n | \"outline\"\r\n | \"ghost\"\r\n | \"underline\";\r\n orientation?: \"horizontal\" | \"vertical\";\r\n layout?: \"default\" | \"flex\" | \"sidebar\";\r\n withScrollArea?: boolean;\r\n scrollAreaClassName?: string;\r\n}\r\n\r\nexport const TabsWrapper = memo(function TabsWrapper({\r\n defaultValue,\r\n value,\r\n onValueChange,\r\n children,\r\n className,\r\n listClassName,\r\n contentClassName,\r\n variant = \"default\",\r\n orientation = \"horizontal\",\r\n layout = \"default\",\r\n withScrollArea = false,\r\n scrollAreaClassName,\r\n ...props\r\n}: TabsWrapperProps) {\r\n const isFlexLayout = useMemo(\r\n () => layout === \"flex\" || layout === \"sidebar\",\r\n [layout],\r\n );\r\n\r\n const computedClasses = useMemo(\r\n () => ({\r\n root: cn(\"w-full\", isFlexLayout && \"flex-1 flex flex-col\", className),\r\n list: cn(\r\n LIST_BASE_CLASS,\r\n isFlexLayout ? \"w-full\" : \"w-fit\",\r\n !isFlexLayout && variant !== \"underline\" && \"mb-6\",\r\n LIST_VARIANTS[variant] ?? LIST_VARIANTS.default,\r\n listClassName,\r\n ),\r\n }),\r\n [isFlexLayout, className, variant, listClassName],\r\n );\r\n\r\n return (\r\n <Tabs\r\n defaultValue={defaultValue}\r\n value={value}\r\n onValueChange={onValueChange}\r\n orientation={orientation}\r\n className={computedClasses.root}\r\n {...props}\r\n >\r\n <TabsList className={computedClasses.list}>{children}</TabsList>\r\n </Tabs>\r\n );\r\n});\r\n\r\nexport interface TabTriggerProps {\r\n value: string;\r\n children: ReactNode;\r\n className?: string;\r\n variant?:\r\n | \"default\"\r\n | \"primary\"\r\n | \"secondary\"\r\n | \"outline\"\r\n | \"ghost\"\r\n | \"underline\";\r\n icon?: ReactNode;\r\n hideTextOnMobile?: boolean;\r\n disabled?: boolean;\r\n}\r\n\r\nexport const TabTrigger = memo(function TabTrigger({\r\n value,\r\n children,\r\n className,\r\n variant = \"default\",\r\n icon,\r\n hideTextOnMobile = false,\r\n disabled = false,\r\n ...props\r\n}: TabTriggerProps) {\r\n const computedClassName = useMemo(\r\n () =>\r\n cn(\r\n \"flex items-center gap-2 transition-colors duration-200\",\r\n TRIGGER_VARIANTS[variant] ?? TRIGGER_VARIANTS.default,\r\n className,\r\n ),\r\n [variant, className],\r\n );\r\n\r\n return (\r\n <TabsTrigger\r\n value={value}\r\n disabled={disabled}\r\n className={computedClassName}\r\n {...props}\r\n >\r\n {icon}\r\n {hideTextOnMobile ? (\r\n <span className=\"hidden sm:inline\">{children}</span>\r\n ) : (\r\n children\r\n )}\r\n </TabsTrigger>\r\n );\r\n});\r\n\r\nexport interface TabContentProps {\r\n value: string;\r\n children: ReactNode;\r\n className?: string;\r\n withScrollArea?: boolean;\r\n scrollAreaClassName?: string;\r\n padding?: boolean;\r\n keepMounted?: boolean;\r\n}\r\n\r\nexport const TabContent = memo(function TabContent({\r\n value,\r\n children,\r\n className,\r\n withScrollArea = false,\r\n scrollAreaClassName,\r\n padding = true,\r\n keepMounted = false,\r\n ...props\r\n}: TabContentProps) {\r\n const contentClassName = useMemo(\r\n () =>\r\n cn(\r\n \"space-y-4\",\r\n padding && !withScrollArea && \"mt-6\",\r\n withScrollArea && \"mt-0 h-full\",\r\n className,\r\n ),\r\n [padding, withScrollArea, className],\r\n );\r\n\r\n const scrollAreaPaddingClassName = useMemo(\r\n () => cn(padding && \"px-6 py-4\"),\r\n [padding],\r\n );\r\n\r\n return (\r\n <TabsContent\r\n value={value}\r\n keepMounted={keepMounted}\r\n className={contentClassName}\r\n {...props}\r\n >\r\n {withScrollArea ? (\r\n <ScrollArea className={cn(\"h-full\", scrollAreaClassName)}>\r\n <div className={scrollAreaPaddingClassName}>{children}</div>\r\n </ScrollArea>\r\n ) : (\r\n children\r\n )}\r\n </TabsContent>\r\n );\r\n});\r\n\r\nexport interface DynamicTabItem {\r\n value: string;\r\n label: ReactNode;\r\n content: ReactNode;\r\n icon?: ReactNode;\r\n disabled?: boolean;\r\n hideTextOnMobile?: boolean;\r\n}\r\n\r\nexport interface DynamicTabsProps {\r\n tabs?: DynamicTabItem[];\r\n defaultValue?: string;\r\n value?: string;\r\n onValueChange?: (value: string) => void;\r\n variant?:\r\n | \"default\"\r\n | \"primary\"\r\n | \"secondary\"\r\n | \"outline\"\r\n | \"ghost\"\r\n | \"underline\";\r\n layout?: \"default\" | \"flex\" | \"sidebar\";\r\n className?: string;\r\n listClassName?: string;\r\n listWrapperClassName?: string;\r\n contentClassName?: string;\r\n scrollable?: boolean;\r\n}\r\n\r\nexport const DynamicTabs = memo(function DynamicTabs({\r\n tabs = [],\r\n defaultValue,\r\n value,\r\n onValueChange,\r\n variant = \"default\",\r\n layout = \"default\",\r\n className,\r\n listClassName,\r\n listWrapperClassName,\r\n contentClassName,\r\n scrollable = false,\r\n ...props\r\n}: DynamicTabsProps) {\r\n const isFlexLayout = useMemo(\r\n () => layout === \"flex\" || layout === \"sidebar\",\r\n [layout],\r\n );\r\n const useSheetDefaults = isFlexLayout && scrollable;\r\n\r\n const computedClasses = useMemo(\r\n () => ({\r\n root: cn(\r\n \"w-full\",\r\n isFlexLayout && \"flex-1 flex flex-col min-h-0\",\r\n className,\r\n ),\r\n listWrapper: cn(\r\n \"w-full\",\r\n useSheetDefaults ? \"px-0\" : \"px-6\",\r\n listWrapperClassName,\r\n ),\r\n flexList: cn(\r\n \"flex flex-wrap items-center justify-center gap-1 h-auto\",\r\n variant === \"underline\"\r\n ? \"rounded-none border-b border-border/60 bg-transparent p-0 shadow-none gap-6\"\r\n : \"rounded-md p-1 shadow-sm backdrop-blur-sm\",\r\n LIST_VARIANTS[variant] ?? LIST_VARIANTS.default,\r\n useSheetDefaults && \"mb-4 gap-0.5\",\r\n listClassName,\r\n ),\r\n standardList: cn(\r\n LIST_BASE_CLASS,\r\n variant !== \"underline\" && \"w-fit mb-6\",\r\n LIST_VARIANTS[variant] ?? LIST_VARIANTS.default,\r\n listClassName,\r\n ),\r\n contentWrapper: cn(isFlexLayout && \"flex-1 min-h-0 overflow-hidden\"),\r\n flexContent: cn(\r\n \"mt-0 h-full\",\r\n useSheetDefaults && \"px-1\",\r\n contentClassName,\r\n ),\r\n standardContent: cn(\r\n isFlexLayout ? \"h-full\" : \"space-y-4 mt-6\",\r\n contentClassName,\r\n ),\r\n }),\r\n [\r\n isFlexLayout,\r\n useSheetDefaults,\r\n className,\r\n listWrapperClassName,\r\n listClassName,\r\n variant,\r\n contentClassName,\r\n ],\r\n );\r\n\r\n return (\r\n <Tabs\r\n defaultValue={defaultValue}\r\n value={value}\r\n onValueChange={onValueChange}\r\n className={computedClasses.root}\r\n {...props}\r\n >\r\n {isFlexLayout ? (\r\n <div className={computedClasses.listWrapper}>\r\n <TabsList className={computedClasses.flexList}>\r\n {tabs.map((tab) => (\r\n <TabTrigger\r\n key={tab.value}\r\n value={tab.value}\r\n variant={variant}\r\n disabled={tab.disabled}\r\n className=\"justify-center px-3 py-2 text-xs sm:text-sm shrink-0\"\r\n >\r\n {tab.icon}\r\n {tab.hideTextOnMobile ? (\r\n <span className=\"hidden sm:inline\">{tab.label}</span>\r\n ) : (\r\n tab.label\r\n )}\r\n </TabTrigger>\r\n ))}\r\n </TabsList>\r\n </div>\r\n ) : (\r\n <TabsList className={computedClasses.standardList}>\r\n {tabs.map((tab) => (\r\n <TabTrigger\r\n key={tab.value}\r\n value={tab.value}\r\n variant={variant}\r\n disabled={tab.disabled}\r\n className=\"whitespace-nowrap\"\r\n >\r\n {tab.icon}\r\n {tab.hideTextOnMobile ? (\r\n <span className=\"hidden sm:inline text-sm\">{tab.label}</span>\r\n ) : (\r\n <span className=\"text-sm\">{tab.label}</span>\r\n )}\r\n </TabTrigger>\r\n ))}\r\n </TabsList>\r\n )}\r\n\r\n <div className={computedClasses.contentWrapper}>\r\n {isFlexLayout && scrollable ? (\r\n <ScrollArea className=\"h-full w-full\">\r\n {tabs.map((tab) => (\r\n <TabsContent\r\n key={tab.value}\r\n value={tab.value}\r\n className={computedClasses.flexContent}\r\n >\r\n {tab.content}\r\n </TabsContent>\r\n ))}\r\n </ScrollArea>\r\n ) : (\r\n tabs.map((tab) => (\r\n <TabsContent\r\n key={tab.value}\r\n value={tab.value}\r\n className={computedClasses.standardContent}\r\n >\r\n {tab.content}\r\n </TabsContent>\r\n ))\r\n )}\r\n </div>\r\n </Tabs>\r\n );\r\n});\r\n","\"use client\";\r\n\r\nimport { useState, ReactNode } from \"react\";\r\nimport { ArrowLeft, ArrowRight } from \"lucide-react\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport {\r\n ResizableHandle,\r\n ResizablePanel,\r\n ResizablePanelGroup,\r\n} from \"@/components/ui/resizable\";\r\nimport { useMediaQuery } from \"../hooks/use-media-query\";\r\nimport { DynamicTabs } from \"./tabs-wrapper\";\r\nimport { cn } from \"../utils\";\r\n\r\ninterface PanelConfig {\r\n title?: string;\r\n icon?: ReactNode;\r\n content: ReactNode;\r\n badge?: ReactNode;\r\n}\r\n\r\nexport interface ResponsiveSplitLayoutProps {\r\n leftPanel: PanelConfig;\r\n rightPanel: PanelConfig;\r\n className?: string;\r\n leftPanelClassName?: string;\r\n rightPanelClassName?: string;\r\n variant?: \"default\" | \"tabs\" | \"fixed\";\r\n desktopVariant?: \"default\" | \"tabs\" | \"fixed\";\r\n mobileVariant?: \"default\" | \"tabs\" | \"fixed\";\r\n defaultLayout?: [number, number];\r\n minSizes?: [number, number];\r\n rightPanelWidth?: number;\r\n persistLayoutKey?: string;\r\n mobileBreakpoint?: \"sm\" | \"md\" | \"lg\" | \"xl\";\r\n forceMobile?: boolean;\r\n forceDesktop?: boolean;\r\n}\r\n\r\nexport function ResponsiveSplitLayout({\r\n leftPanel,\r\n rightPanel,\r\n className,\r\n leftPanelClassName,\r\n rightPanelClassName,\r\n variant = \"default\",\r\n desktopVariant,\r\n mobileVariant,\r\n defaultLayout = [50, 50],\r\n minSizes = [20, 20],\r\n rightPanelWidth = 400,\r\n persistLayoutKey,\r\n mobileBreakpoint = \"md\",\r\n forceMobile = false,\r\n forceDesktop = false,\r\n}: ResponsiveSplitLayoutProps) {\r\n const [mobileView, setMobileView] = useState<\"left\" | \"right\">(\"left\");\r\n\r\n const breakpoints = {\r\n sm: 640,\r\n md: 768,\r\n lg: 1024,\r\n xl: 1280,\r\n };\r\n\r\n const mobileMaxWidth = breakpoints[mobileBreakpoint] - 1;\r\n const isMobileMedia = useMediaQuery(`(max-width: ${mobileMaxWidth}px)`, false);\r\n const isMobile = forceDesktop ? false : forceMobile ? true : isMobileMedia;\r\n\r\n const effectiveMobileVariant = mobileVariant ?? variant;\r\n const effectiveDesktopVariant = desktopVariant ?? variant;\r\n\r\n // Mobile view with tabs\r\n if (isMobile && effectiveMobileVariant === \"tabs\") {\r\n const tabs = [\r\n {\r\n value: \"left\",\r\n label: (\r\n <div className=\"flex items-center gap-2\">\r\n {leftPanel.icon}\r\n {leftPanel.title || \"Left\"}\r\n </div>\r\n ),\r\n content: (\r\n <div className={cn(\"h-full overflow-y-auto\", leftPanelClassName)}>\r\n {leftPanel.content}\r\n </div>\r\n ),\r\n },\r\n {\r\n value: \"right\",\r\n label: (\r\n <div className=\"flex items-center gap-2\">\r\n {rightPanel.icon}\r\n {rightPanel.title || \"Right\"}\r\n {rightPanel.badge && (\r\n <span className=\"ml-1 bg-primary text-primary-foreground text-xs rounded-full h-5 w-5 flex items-center justify-center\">\r\n {rightPanel.badge}\r\n </span>\r\n )}\r\n </div>\r\n ),\r\n content: (\r\n <div className={cn(\"h-full overflow-y-auto\", rightPanelClassName)}>\r\n {rightPanel.content}\r\n </div>\r\n ),\r\n },\r\n ];\r\n\r\n return (\r\n <div className={cn(\"h-full flex flex-col\", className)}>\r\n <DynamicTabs\r\n tabs={tabs}\r\n defaultValue=\"left\"\r\n value={mobileView}\r\n onValueChange={(val) => setMobileView(val as \"left\" | \"right\")}\r\n variant=\"default\"\r\n layout=\"flex\"\r\n className=\"h-full\"\r\n listWrapperClassName=\"px-4 py-2 flex-shrink-0\"\r\n contentClassName=\"mt-0 flex-1 min-h-0\"\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n // Mobile view with navigation buttons (default)\r\n if (isMobile) {\r\n const showLeft = mobileView === \"left\";\r\n const showRight = mobileView === \"right\";\r\n\r\n return (\r\n <div className={cn(\"flex flex-col h-full\", className)}>\r\n <div className=\"flex-1 overflow-hidden\">\r\n <div className={cn(\"h-full\", !showLeft && \"hidden\", leftPanelClassName)}>\r\n {leftPanel.content}\r\n </div>\r\n\r\n <div className={cn(\"h-full\", !showRight && \"hidden\", rightPanelClassName)}>\r\n {rightPanel.content}\r\n </div>\r\n </div>\r\n\r\n <div className=\"border-t p-4 bg-background\">\r\n <div className=\"flex items-center justify-between max-w-md mx-auto\">\r\n <Button\r\n variant={mobileView === \"left\" ? \"default\" : \"outline\"}\r\n onClick={() => setMobileView(\"left\")}\r\n className=\"flex-1 mr-2\"\r\n >\r\n {mobileView === \"right\" && <ArrowLeft className=\"h-4 w-4 mr-2\" />}\r\n {leftPanel.icon}\r\n <span className=\"ml-2\">{leftPanel.title || \"Left\"}</span>\r\n </Button>\r\n\r\n <Button\r\n variant={mobileView === \"right\" ? \"default\" : \"outline\"}\r\n onClick={() => setMobileView(\"right\")}\r\n className=\"flex-1 ml-2 relative\"\r\n >\r\n <span className=\"mr-2\">{rightPanel.title || \"Right\"}</span>\r\n {rightPanel.icon}\r\n {mobileView === \"left\" && <ArrowRight className=\"h-4 w-4 ml-2\" />}\r\n {rightPanel.badge && (\r\n <span className=\"absolute -top-2 -right-2 bg-primary text-primary-foreground text-xs rounded-full h-6 w-6 flex items-center justify-center\">\r\n {rightPanel.badge}\r\n </span>\r\n )}\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // Desktop view with fixed right panel width\r\n if (effectiveDesktopVariant === \"fixed\") {\r\n return (\r\n <div className={cn(\"flex h-full\", className)}>\r\n <div className={cn(\"flex-1 overflow-auto border-r\", leftPanelClassName)}>\r\n {leftPanel.content}\r\n </div>\r\n\r\n <div\r\n className={cn(\"overflow-auto\", rightPanelClassName)}\r\n style={{\r\n width: rightPanelWidth,\r\n minWidth: rightPanelWidth,\r\n flexShrink: 0,\r\n }}\r\n >\r\n {rightPanel.content}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // Desktop view with resizable panels (default)\r\n return (\r\n <ResizablePanelGroup\r\n direction=\"horizontal\"\r\n className={cn(\"h-full\", className)}\r\n autoSaveId={persistLayoutKey}\r\n >\r\n <ResizablePanel defaultSize={defaultLayout[0]} minSize={minSizes[0]}>\r\n <div className={cn(\"h-full overflow-auto\", leftPanelClassName)}>\r\n {leftPanel.content}\r\n </div>\r\n </ResizablePanel>\r\n\r\n <ResizableHandle withHandle />\r\n\r\n <ResizablePanel defaultSize={defaultLayout[1]} minSize={minSizes[1]}>\r\n <div className={cn(\"h-full overflow-auto\", rightPanelClassName)}>\r\n {rightPanel.content}\r\n </div>\r\n </ResizablePanel>\r\n </ResizablePanelGroup>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { ReactNode } from \"react\";\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TableHeader,\r\n TableRow,\r\n} from \"@/components/ui/table\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface TableWrapperColumn {\r\n key?: string;\r\n header: ReactNode;\r\n className?: string;\r\n cellClassName?: string;\r\n render?: (item: any, index: number) => ReactNode;\r\n}\r\n\r\nexport interface TableWrapperEmptyState {\r\n icon?: ReactNode;\r\n title?: string;\r\n description?: string;\r\n}\r\n\r\nexport interface TableWrapperProps {\r\n title?: ReactNode;\r\n description?: ReactNode;\r\n icon?: ReactNode;\r\n children?: ReactNode;\r\n columns?: TableWrapperColumn[];\r\n data?: any[];\r\n renderRow?: (item: any, index: number) => ReactNode;\r\n emptyState?: TableWrapperEmptyState;\r\n className?: string;\r\n tableClassName?: string;\r\n maxHeight?: string;\r\n}\r\n\r\nexport function TableWrapper({\r\n title,\r\n description,\r\n icon,\r\n children,\r\n columns,\r\n data,\r\n renderRow,\r\n emptyState,\r\n className,\r\n tableClassName,\r\n maxHeight = \"500px\",\r\n ...props\r\n}: TableWrapperProps) {\r\n const hasData = data && data.length > 0;\r\n\r\n const defaultEmptyState = emptyState || {\r\n icon: icon,\r\n title: \"No data available\",\r\n description: \"There are no items to display\",\r\n };\r\n\r\n return (\r\n <div className={cn(\"space-y-4\", className)} {...props}>\r\n {(title || description) && (\r\n <div className=\"space-y-1\">\r\n {title && <h3 className=\"text-lg font-semibold\">{title}</h3>}\r\n {description && (\r\n <p className=\"text-sm text-muted-foreground\">{description}</p>\r\n )}\r\n </div>\r\n )}\r\n\r\n {!hasData ? (\r\n <div className=\"flex flex-col items-center justify-center h-48 text-muted-foreground border rounded-lg\">\r\n {defaultEmptyState.icon && (\r\n <div className=\"h-12 w-12 mb-4 opacity-50\">{defaultEmptyState.icon}</div>\r\n )}\r\n <p className=\"text-lg\">{defaultEmptyState.title}</p>\r\n {defaultEmptyState.description && (\r\n <p className=\"text-sm\">{defaultEmptyState.description}</p>\r\n )}\r\n </div>\r\n ) : (\r\n <div\r\n className={cn(\r\n \"relative overflow-auto border rounded-lg\",\r\n maxHeight && `max-h-[${maxHeight}]`\r\n )}\r\n >\r\n <Table className={tableClassName}>\r\n {columns && (\r\n <TableHeader>\r\n <TableRow>\r\n {columns.map((column, index) => (\r\n <TableHead\r\n key={`table-column-head-${column.key ?? column.header ?? index}`}\r\n className={cn(column.className)}\r\n >\r\n {column.header}\r\n </TableHead>\r\n ))}\r\n </TableRow>\r\n </TableHeader>\r\n )}\r\n <TableBody>\r\n {data?.map((item, index) =>\r\n renderRow ? (\r\n renderRow(item, index)\r\n ) : (\r\n <TableRow key={`table-row-${index}`}>{children}</TableRow>\r\n )\r\n )}\r\n </TableBody>\r\n </Table>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport interface SimpleTableProps extends Omit<TableWrapperProps, \"renderRow\" | \"children\"> {\r\n columns: TableWrapperColumn[];\r\n data: any[];\r\n}\r\n\r\nexport function SimpleTable({\r\n title,\r\n data,\r\n columns,\r\n emptyState,\r\n className,\r\n ...props\r\n}: SimpleTableProps) {\r\n const renderRow = (item: any, index: number) => (\r\n <TableRow key={`simple-table-row-${index}`}>\r\n {columns.map((column, colIndex) => (\r\n <TableCell\r\n key={`simple-table-cell-${column.key ?? column.header ?? colIndex}`}\r\n className={column.cellClassName}\r\n >\r\n {column.render ? column.render(item, index) : item[column.key!]}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n );\r\n\r\n return (\r\n <TableWrapper\r\n title={title}\r\n data={data}\r\n columns={columns}\r\n renderRow={renderRow}\r\n emptyState={emptyState}\r\n className={className}\r\n {...props}\r\n />\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { type ReactNode } from \"react\";\r\nimport {\r\n Tooltip,\r\n TooltipContent,\r\n TooltipTrigger,\r\n} from \"@/components/ui/tooltip\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface TooltipWrapperProps {\r\n children: ReactNode;\r\n content: ReactNode;\r\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\r\n align?: \"start\" | \"center\" | \"end\";\r\n delay?: number;\r\n sideOffset?: number;\r\n className?: string;\r\n contentClassName?: string;\r\n disabled?: boolean;\r\n}\r\n\r\nexport function TooltipWrapper({\r\n children,\r\n content,\r\n side = \"top\",\r\n align = \"center\",\r\n delay = 700,\r\n sideOffset = 4,\r\n className,\r\n contentClassName,\r\n disabled = false,\r\n ...props\r\n}: TooltipWrapperProps) {\r\n if (disabled || !content) {\r\n return <>{children}</>;\r\n }\r\n\r\n return (\r\n <Tooltip delay={delay} {...props}>\r\n <TooltipTrigger className={className} render={children} />\r\n <TooltipContent side={side} align={align} sideOffset={sideOffset} className={cn(contentClassName)}>\r\n {content}\r\n </TooltipContent>\r\n </Tooltip>\r\n );\r\n}\r\n\r\nexport interface ButtonTooltipProps extends Omit<TooltipWrapperProps, \"content\"> {\r\n tooltip: ReactNode;\r\n variant?: \"default\" | \"outline\" | \"ghost\";\r\n size?: \"default\" | \"sm\" | \"lg\" | \"icon\";\r\n}\r\n\r\nexport function ButtonTooltip({\r\n children,\r\n tooltip,\r\n variant = \"outline\",\r\n size = \"icon\",\r\n className,\r\n ...props\r\n}: ButtonTooltipProps) {\r\n return (\r\n <TooltipWrapper content={tooltip} {...props}>\r\n {children}\r\n </TooltipWrapper>\r\n );\r\n}\r\n\r\nexport interface IconTooltipProps extends Omit<TooltipWrapperProps, \"content\" | \"children\"> {\r\n icon: ReactNode;\r\n tooltip: ReactNode;\r\n iconClassName?: string;\r\n size?: number;\r\n}\r\n\r\nexport function IconTooltip({\r\n icon,\r\n tooltip,\r\n className,\r\n iconClassName,\r\n size = 16,\r\n ...props\r\n}: IconTooltipProps) {\r\n return (\r\n <TooltipWrapper content={tooltip} className={className} {...props}>\r\n <div className={cn(\"cursor-pointer\", iconClassName)}>\r\n {typeof icon === \"string\" ? <span style={{ fontSize: size }}>{icon}</span> : icon}\r\n </div>\r\n </TooltipWrapper>\r\n );\r\n}\r\n\r\nexport interface InfoTooltipProps extends Omit<TooltipWrapperProps, \"content\" | \"children\"> {\r\n tooltip: ReactNode;\r\n size?: number;\r\n}\r\n\r\nexport function InfoTooltip({ tooltip, className, size = 16, ...props }: InfoTooltipProps) {\r\n return (\r\n <TooltipWrapper\r\n content={tooltip}\r\n className={cn(\"inline-flex items-center\", className)}\r\n {...props}\r\n >\r\n <div\r\n className=\"rounded-full bg-muted text-muted-foreground hover:bg-muted/80 transition-colors cursor-help inline-flex items-center justify-center\"\r\n style={{ width: size, height: size, fontSize: size * 0.6 }}\r\n >\r\n ?\r\n </div>\r\n </TooltipWrapper>\r\n );\r\n}\r\n\r\nexport interface ActionTooltipProps extends Omit<TooltipWrapperProps, \"content\"> {\r\n tooltip: ReactNode;\r\n action?: () => void;\r\n variant?: \"ghost\" | \"outline\";\r\n size?: \"sm\" | \"icon\";\r\n}\r\n\r\nexport function ActionTooltip({\r\n children,\r\n tooltip,\r\n action,\r\n variant = \"ghost\",\r\n size = \"sm\",\r\n className,\r\n ...props\r\n}: ActionTooltipProps) {\r\n return (\r\n <TooltipWrapper content={tooltip} {...props}>\r\n <button\r\n onClick={action}\r\n className={cn(\r\n \"inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors\",\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\r\n \"disabled:opacity-50 disabled:pointer-events-none\",\r\n variant === \"ghost\" && \"hover:bg-accent hover:text-accent-foreground\",\r\n variant === \"outline\" && \"border border-input hover:bg-accent hover:text-accent-foreground\",\r\n size === \"sm\" && \"h-8 px-2\",\r\n size === \"icon\" && \"h-8 w-8\",\r\n className\r\n )}\r\n >\r\n {children}\r\n </button>\r\n </TooltipWrapper>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport type { ChangeEvent, ReactNode, InputHTMLAttributes } from \"react\";\r\nimport * as React from \"react\";\r\nimport { Controller } from \"react-hook-form\";\r\nimport type { Control, FieldValues, FieldPath } from \"react-hook-form\";\r\nimport { Input } from \"@/components/ui/input\";\r\nimport {\r\n Field,\r\n FieldLabel,\r\n FieldDescription,\r\n FieldError,\r\n} from \"@/components/ui/field\";\r\nimport {\r\n InputGroup,\r\n InputGroupAddon,\r\n InputGroupInput,\r\n} from \"@/components/ui/input-group\";\r\nimport { cn } from \"../../utils\";\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\ninterface TransformFunctions {\r\n input?: (value: unknown) => string;\r\n output?: (value: string) => unknown;\r\n}\r\n\r\nexport interface FormInputProps<TFieldValues extends FieldValues = FieldValues> {\r\n // React Hook Form\r\n control?: Control<TFieldValues>;\r\n name: FieldPath<TFieldValues> | string;\r\n\r\n // Field configuration\r\n label?: string;\r\n placeholder?: string;\r\n description?: string;\r\n helperText?: string; // Alias for description\r\n required?: boolean;\r\n disabled?: boolean;\r\n readOnly?: boolean;\r\n type?: string;\r\n\r\n // Styling\r\n className?: string;\r\n labelClassName?: string;\r\n inputClassName?: string;\r\n inputGroupClassName?: string;\r\n\r\n // Input group addons\r\n iconLeft?: ReactNode;\r\n iconRight?: ReactNode;\r\n addonLeft?: ReactNode;\r\n addonRight?: ReactNode;\r\n\r\n // Value transformation\r\n transform?: TransformFunctions;\r\n onValueChange?: (value: unknown) => void;\r\n\r\n // Direct usage (without react-hook-form)\r\n value?: string | number;\r\n onChange?: (value: unknown) => void;\r\n\r\n // HTML input attributes\r\n min?: number | string;\r\n max?: number | string;\r\n step?: number | string;\r\n minLength?: number;\r\n maxLength?: number;\r\n pattern?: string;\r\n autoComplete?: string;\r\n autoFocus?: boolean;\r\n inputMode?: InputHTMLAttributes<HTMLInputElement>[\"inputMode\"];\r\n enterKeyHint?: InputHTMLAttributes<HTMLInputElement>[\"enterKeyHint\"];\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\n/**\r\n * FormInput - Text input with react-hook-form integration\r\n *\r\n * Features:\r\n * - Works with react-hook-form Controller\r\n * - Supports input groups with icons/addons\r\n * - Value transformation (input/output)\r\n * - Can be used standalone without form\r\n *\r\n * @example\r\n * ```tsx\r\n * // With react-hook-form\r\n * <FormInput\r\n * control={form.control}\r\n * name=\"email\"\r\n * type=\"email\"\r\n * label=\"Email\"\r\n * placeholder=\"user@example.com\"\r\n * required\r\n * />\r\n *\r\n * // With icon\r\n * <FormInput\r\n * control={form.control}\r\n * name=\"search\"\r\n * iconLeft={<SearchIcon />}\r\n * placeholder=\"Search...\"\r\n * />\r\n * ```\r\n */\r\nexport function FormInput<TFieldValues extends FieldValues = FieldValues>({\r\n control,\r\n name,\r\n label,\r\n placeholder,\r\n description,\r\n helperText,\r\n required,\r\n disabled,\r\n readOnly,\r\n type = \"text\",\r\n className,\r\n labelClassName,\r\n inputClassName,\r\n inputGroupClassName,\r\n iconLeft,\r\n iconRight,\r\n addonLeft,\r\n addonRight,\r\n onValueChange,\r\n transform,\r\n value,\r\n onChange,\r\n min,\r\n max,\r\n step,\r\n minLength,\r\n maxLength,\r\n pattern,\r\n autoComplete,\r\n autoFocus,\r\n inputMode,\r\n enterKeyHint,\r\n}: FormInputProps<TFieldValues>) {\r\n // Use helperText as alias for description\r\n const descriptionText = description || helperText;\r\n\r\n const handleChange = (\r\n e: ChangeEvent<HTMLInputElement>,\r\n field?: { onChange: (value: unknown) => void }\r\n ) => {\r\n const newValue = transform?.output\r\n ? transform.output(e.target.value)\r\n : e.target.value;\r\n\r\n if (field) {\r\n field.onChange(newValue);\r\n } else if (onChange) {\r\n onChange(newValue);\r\n }\r\n\r\n onValueChange?.(newValue);\r\n };\r\n\r\n // Determine if we need InputGroup (has icons or addons)\r\n const hasInputGroup =\r\n iconLeft || iconRight || addonLeft || addonRight;\r\n\r\n const renderInput = (\r\n field?: {\r\n value: unknown;\r\n onChange: (value: unknown) => void;\r\n onBlur: () => void;\r\n name: string;\r\n ref: React.Ref<HTMLInputElement>;\r\n },\r\n isDisabled?: boolean,\r\n fieldState?: { invalid?: boolean; error?: { message?: string } }\r\n ) => {\r\n const rawValue = field\r\n ? transform?.input\r\n ? transform.input(field.value)\r\n : field.value\r\n : transform?.input\r\n ? transform.input(value)\r\n : value;\r\n const safeValue = (rawValue as string) ?? \"\";\r\n\r\n // Build input props - only include valid HTML attributes\r\n const inputProps: React.InputHTMLAttributes<HTMLInputElement> & {\r\n ref?: React.Ref<HTMLInputElement>;\r\n } = {\r\n id: name,\r\n name: field?.name || name,\r\n type,\r\n disabled: isDisabled,\r\n readOnly,\r\n placeholder,\r\n value: safeValue,\r\n onChange: (e: ChangeEvent<HTMLInputElement>) => handleChange(e, field),\r\n onBlur: field?.onBlur,\r\n \"aria-invalid\": fieldState?.invalid || undefined,\r\n };\r\n\r\n // Add optional HTML input attributes only if defined\r\n if (min !== undefined) inputProps.min = min;\r\n if (max !== undefined) inputProps.max = max;\r\n if (step !== undefined) inputProps.step = step;\r\n if (minLength !== undefined) inputProps.minLength = minLength;\r\n if (maxLength !== undefined) inputProps.maxLength = maxLength;\r\n if (pattern !== undefined) inputProps.pattern = pattern;\r\n if (autoComplete !== undefined) inputProps.autoComplete = autoComplete;\r\n if (autoFocus !== undefined) inputProps.autoFocus = autoFocus;\r\n if (inputMode !== undefined) inputProps.inputMode = inputMode;\r\n if (enterKeyHint !== undefined) inputProps.enterKeyHint = enterKeyHint;\r\n\r\n // Add field ref if present\r\n if (field?.ref) {\r\n inputProps.ref = field.ref;\r\n }\r\n\r\n if (hasInputGroup) {\r\n return (\r\n <InputGroup\r\n className={cn(inputGroupClassName)}\r\n data-disabled={isDisabled}\r\n >\r\n {(addonLeft || iconLeft) && (\r\n <InputGroupAddon align=\"inline-start\">\r\n {addonLeft || iconLeft}\r\n </InputGroupAddon>\r\n )}\r\n <InputGroupInput {...inputProps} className={inputClassName} />\r\n {(addonRight || iconRight) && (\r\n <InputGroupAddon align=\"inline-end\">\r\n {addonRight || iconRight}\r\n </InputGroupAddon>\r\n )}\r\n </InputGroup>\r\n );\r\n }\r\n\r\n return <Input {...inputProps} className={inputClassName} />;\r\n };\r\n\r\n // Direct usage without React Hook Form\r\n if (!control) {\r\n return (\r\n <Field className={className} data-disabled={disabled}>\r\n {label && (\r\n <FieldLabel htmlFor={name} className={labelClassName}>\r\n {label}\r\n {required && <span className=\"text-destructive ml-1\">*</span>}\r\n </FieldLabel>\r\n )}\r\n {renderInput(undefined, disabled, undefined)}\r\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\r\n </Field>\r\n );\r\n }\r\n\r\n // Using with React Hook Form\r\n return (\r\n <Controller\r\n name={name as FieldPath<TFieldValues>}\r\n control={control}\r\n render={({ field, fieldState }) => (\r\n <Field\r\n className={className}\r\n data-disabled={disabled}\r\n data-invalid={fieldState.invalid}\r\n >\r\n {label && (\r\n <FieldLabel htmlFor={name} className={labelClassName}>\r\n {label}\r\n {required && <span className=\"text-destructive ml-1\">*</span>}\r\n </FieldLabel>\r\n )}\r\n {renderInput(field, disabled, fieldState)}\r\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\r\n {fieldState.invalid && fieldState.error && (\r\n <FieldError errors={[fieldState.error]} />\r\n )}\r\n </Field>\r\n )}\r\n />\r\n );\r\n}\r\n","\"use client\";\n\nimport type { ChangeEvent } from \"react\";\nimport * as React from \"react\";\nimport { useState, useEffect } from \"react\";\nimport { Controller } from \"react-hook-form\";\nimport type { Control, FieldValues, FieldPath } from \"react-hook-form\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupTextarea,\n} from \"@/components/ui/input-group\";\nimport { cn } from \"../../utils\";\nimport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n} from \"@/components/ui/field\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface FormTextareaProps<TFieldValues extends FieldValues = FieldValues> {\n // React Hook Form\n control?: Control<TFieldValues>;\n name: FieldPath<TFieldValues> | string;\n\n // Field configuration\n label?: string;\n placeholder?: string;\n description?: string;\n helperText?: string;\n required?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n rows?: number;\n\n // Value handling\n value?: string;\n onChange?: (value: string) => void;\n onValueChange?: (value: string) => void;\n\n // Styling\n className?: string;\n labelClassName?: string;\n textareaClassName?: string;\n inputGroupClassName?: string;\n\n // Input group addons\n iconLeft?: React.ReactNode;\n iconRight?: React.ReactNode;\n addonLeft?: React.ReactNode;\n addonRight?: React.ReactNode;\n\n // HTML textarea attributes\n minLength?: number;\n maxLength?: number;\n autoComplete?: string;\n autoFocus?: boolean;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\n/**\n * FormTextarea - Textarea with react-hook-form integration\n *\n * @example\n * ```tsx\n * <FormTextarea\n * control={form.control}\n * name=\"bio\"\n * label=\"Biography\"\n * placeholder=\"Tell us about yourself...\"\n * rows={5}\n * />\n * ```\n */\nexport function FormTextarea<TFieldValues extends FieldValues = FieldValues>({\n control,\n name,\n label,\n description,\n helperText,\n required,\n disabled,\n readOnly,\n placeholder,\n value: propValue,\n onChange: propOnChange,\n onValueChange,\n className,\n labelClassName,\n textareaClassName,\n inputGroupClassName,\n iconLeft,\n iconRight,\n addonLeft,\n addonRight,\n rows = 3,\n minLength,\n maxLength,\n autoComplete,\n autoFocus,\n}: FormTextareaProps<TFieldValues>) {\n const descriptionText = description || helperText;\n\n // Determine if we need InputGroup (has icons or addons)\n const hasInputGroup = iconLeft || iconRight || addonLeft || addonRight;\n\n // For direct usage without React Hook Form\n const [localValue, setLocalValue] = useState<string>(propValue || \"\");\n\n // Update local value when prop value changes\n useEffect(() => {\n if (propValue !== undefined) {\n setLocalValue(propValue);\n }\n }, [propValue]);\n\n // Handle direct value changes (without React Hook Form)\n const handleDirectValueChange = (value: string) => {\n setLocalValue(value);\n propOnChange?.(value);\n onValueChange?.(value);\n };\n\n const renderTextarea = (\n field?: {\n value: string;\n onChange: (e: ChangeEvent<HTMLTextAreaElement>) => void;\n onBlur: () => void;\n name: string;\n ref: React.Ref<HTMLTextAreaElement>;\n },\n isDisabled?: boolean,\n fieldState?: { invalid?: boolean; error?: { message?: string } }\n ) => {\n // Get value from either form field or direct props\n const value = field ? field.value : localValue;\n\n const handleChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value;\n\n if (field) {\n field.onChange(e);\n } else {\n handleDirectValueChange(newValue);\n }\n\n onValueChange?.(newValue);\n };\n\n // Build textarea props - only include valid HTML attributes\n const textareaProps: React.TextareaHTMLAttributes<HTMLTextAreaElement> & {\n ref?: React.Ref<HTMLTextAreaElement>;\n } = {\n id: name,\n name: field?.name || name,\n value: value ?? \"\",\n placeholder,\n disabled: isDisabled,\n readOnly,\n rows,\n onChange: handleChange,\n onBlur: field?.onBlur,\n \"aria-invalid\": fieldState?.invalid || undefined,\n };\n\n // Add optional HTML textarea attributes only if defined\n if (minLength !== undefined) textareaProps.minLength = minLength;\n if (maxLength !== undefined) textareaProps.maxLength = maxLength;\n if (autoComplete !== undefined) textareaProps.autoComplete = autoComplete;\n if (autoFocus !== undefined) textareaProps.autoFocus = autoFocus;\n\n // Add field ref if present\n if (field?.ref) {\n textareaProps.ref = field.ref;\n }\n\n if (hasInputGroup) {\n return (\n <InputGroup\n className={cn(inputGroupClassName)}\n data-disabled={isDisabled}\n >\n {(addonLeft || iconLeft) && (\n <InputGroupAddon align=\"inline-start\">\n {addonLeft || iconLeft}\n </InputGroupAddon>\n )}\n <InputGroupTextarea\n {...textareaProps}\n className={cn(\"overflow-auto resize-none\", textareaClassName)}\n />\n {(addonRight || iconRight) && (\n <InputGroupAddon align=\"inline-end\">\n {addonRight || iconRight}\n </InputGroupAddon>\n )}\n </InputGroup>\n );\n }\n\n return (\n <Textarea\n {...textareaProps}\n className={cn(\"overflow-auto resize-none\", textareaClassName)}\n />\n );\n };\n\n // Direct usage without React Hook Form\n if (!control) {\n return (\n <Field className={className} data-disabled={disabled}>\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n {renderTextarea(undefined, disabled, undefined)}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n </Field>\n );\n }\n\n // Using with React Hook Form\n return (\n <Controller\n name={name as FieldPath<TFieldValues>}\n control={control}\n render={({ field, fieldState }) => (\n <Field\n className={className}\n data-disabled={disabled}\n data-invalid={fieldState.invalid}\n >\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n {renderTextarea(field, disabled, fieldState)}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n {fieldState.invalid && fieldState.error && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useEffect, useState, useMemo } from \"react\";\nimport { Controller } from \"react-hook-form\";\nimport type { Control, FieldValues, FieldPath } from \"react-hook-form\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n SelectGroup,\n SelectLabel,\n} from \"@/components/ui/select\";\nimport { cn } from \"../../utils\";\nimport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n} from \"@/components/ui/field\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface SelectOption {\n value: string | number;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectOptionGroup {\n label: string;\n items: SelectOption[];\n}\n\nexport interface SelectInputProps<TFieldValues extends FieldValues = FieldValues> {\n // React Hook Form\n control?: Control<TFieldValues>;\n name: FieldPath<TFieldValues> | string;\n\n // Field configuration\n label?: string;\n placeholder?: string;\n description?: string;\n helperText?: string;\n required?: boolean;\n disabled?: boolean;\n\n // Options\n items?: SelectOption[];\n groups?: SelectOptionGroup[];\n allOption?: SelectOption;\n\n // Value handling\n valueKey?: string;\n displayKey?: string;\n value?: string | number;\n onValueChange?: (value: string) => void;\n\n // Styling\n className?: string;\n labelClassName?: string;\n triggerClassName?: string;\n contentClassName?: string;\n itemClassName?: string;\n Icon?: React.ComponentType<{ className?: string }>;\n\n // Select behavior\n defaultOpen?: boolean;\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n sideOffset?: number;\n align?: \"start\" | \"center\" | \"end\";\n alignOffset?: number;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\n/**\n * SelectInput - Select dropdown with react-hook-form integration\n *\n * Features:\n * - Flat and grouped options\n * - Custom placeholder\n * - Optional \"All\" option (use placeholder text to match)\n * - Custom styling\n *\n * Note: For \"All\" options with value=\"\", the placeholder will be shown when selected.\n * Make sure your placeholder text matches what you want to display for \"All\".\n *\n * @example\n * ```tsx\n * // Basic usage\n * <SelectInput\n * control={form.control}\n * name=\"role\"\n * label=\"Role\"\n * items={[\n * { value: \"admin\", label: \"Admin\" },\n * { value: \"user\", label: \"User\" },\n * ]}\n * />\n *\n * // With \"All\" option - placeholder shows when \"All\" is selected\n * <SelectInput\n * name=\"status\"\n * label=\"Status\"\n * items={[\n * { value: \"\", label: \"All\" }, // This will show placeholder when selected\n * { value: \"active\", label: \"Active\" },\n * ]}\n * placeholder=\"All\" // Make sure this matches the \"All\" label\n * />\n * ```\n */\nexport function SelectInput<TFieldValues extends FieldValues = FieldValues>({\n control,\n items = [],\n groups = [],\n name,\n label,\n placeholder = \"Select option\",\n allOption,\n description,\n helperText,\n required,\n disabled,\n className,\n labelClassName,\n triggerClassName,\n contentClassName,\n itemClassName,\n Icon,\n onValueChange,\n value: propValue,\n defaultOpen,\n side = \"bottom\",\n sideOffset = 4,\n align = \"start\",\n alignOffset = 0,\n}: SelectInputProps<TFieldValues>) {\n const descriptionText = description || helperText;\n\n // Special value for \"clear/all\" options - Base UI Select doesn't handle empty strings well\n const CLEAR_VALUE = \"__CLEAR__\";\n\n // Memoize filtered items and groups to avoid recomputation\n const displayItems = useMemo(() => {\n const filtered = items.filter((item) => item.value !== undefined && item.value !== null);\n return allOption ? [allOption, ...filtered] : filtered;\n }, [items, allOption]);\n\n const filteredGroups = useMemo(() => {\n return groups\n .map((group) => ({\n ...group,\n items: group.items.filter((item) => item.value !== undefined && item.value !== null),\n }))\n .filter((group) => group.items.length > 0);\n }, [groups]);\n\n // For direct usage without React Hook Form\n const [localValue, setLocalValue] = useState<string>(propValue?.toString() || \"\");\n\n // Update local value when prop value changes\n useEffect(() => {\n if (propValue !== undefined) {\n setLocalValue(propValue.toString());\n }\n }, [propValue]);\n\n // Pre-build a value→label lookup map for O(1) label resolution\n const labelMap = useMemo(() => {\n const map = new Map<string, string>();\n for (const item of displayItems) {\n map.set(item.value?.toString() ?? \"\", item.label);\n }\n for (const group of filteredGroups) {\n for (const item of group.items) {\n map.set(item.value?.toString() ?? \"\", item.label);\n }\n }\n return map;\n }, [displayItems, filteredGroups]);\n\n const renderSelect = (\n field?: { value: unknown; onChange: (value: string) => void },\n isDisabled?: boolean,\n fieldState?: { invalid?: boolean }\n ) => {\n // Use field value if React Hook Form is used, otherwise use local state\n const rawValue = field ? field.value?.toString() : localValue;\n\n const handleChange = (newValue: string) => {\n // Convert CLEAR_VALUE back to empty string for the actual value\n const actualValue = newValue === CLEAR_VALUE ? \"\" : newValue;\n if (field) {\n field.onChange(actualValue);\n } else {\n setLocalValue(actualValue);\n }\n onValueChange?.(actualValue);\n };\n\n // Helper to get value from item - convert empty strings to CLEAR_VALUE\n const getItemValue = (item: SelectOption, fallback: string): string => {\n const val =\n item.value !== undefined && item.value !== null\n ? item.value.toString()\n : fallback;\n // Convert empty string to CLEAR_VALUE for Select compatibility\n return val === \"\" ? CLEAR_VALUE : val;\n };\n\n // Helper to get label from item\n const getItemLabel = (item: SelectOption): string => {\n return item.label;\n };\n\n const getUniqueReactKey = (\n item: SelectOption,\n fallback: string,\n seen: Map<string, number>\n ): string => {\n const itemValue = getItemValue(item, fallback);\n const itemLabel = getItemLabel(item);\n const baseKey = `${itemValue}::${itemLabel}`;\n const nextCount = (seen.get(baseKey) ?? 0) + 1;\n seen.set(baseKey, nextCount);\n return nextCount === 1 ? baseKey : `${baseKey}::${nextCount}`;\n };\n\n // Render grouped options\n const renderGroupedContent = () => {\n if (filteredGroups.length === 0) return null;\n\n return filteredGroups.map((group, groupIdx) => {\n const seenKeys = new Map<string, number>();\n\n return (\n <SelectGroup key={`group-${groupIdx}`}>\n {group.label && <SelectLabel>{group.label}</SelectLabel>}\n {group.items.map((item, idx) => {\n const itemValue = getItemValue(item, `item-${groupIdx}-${idx}`);\n return (\n <SelectItem\n key={getUniqueReactKey(item, `item-${groupIdx}-${idx}`, seenKeys)}\n value={itemValue}\n className={cn(\"cursor-pointer\", itemClassName)}\n disabled={item.disabled}\n >\n {getItemLabel(item)}\n </SelectItem>\n );\n })}\n </SelectGroup>\n );\n });\n };\n\n // Render flat options\n const renderFlatContent = () => {\n if (displayItems.length === 0) {\n return (\n <div className=\"py-6 text-center text-sm text-muted-foreground\">\n No options available\n </div>\n );\n }\n\n const seenKeys = new Map<string, number>();\n return displayItems.map((item, idx) => {\n const itemValue = getItemValue(item, `item-${idx}`);\n return (\n <SelectItem\n key={getUniqueReactKey(item, `item-${idx}`, seenKeys)}\n value={itemValue}\n className={cn(\"cursor-pointer\", itemClassName)}\n disabled={item.disabled}\n >\n {getItemLabel(item)}\n </SelectItem>\n );\n });\n };\n\n // Pass value to Select:\n // - If rawValue is \"\" (empty string), pass CLEAR_VALUE to match the \"All\" SelectItem\n // - If rawValue has a real value, pass it to match the corresponding SelectItem\n // - If rawValue is undefined/null, pass undefined to show placeholder\n const selectValue = rawValue === \"\"\n ? CLEAR_VALUE\n : rawValue\n ? rawValue\n : undefined;\n\n // Find the label for the current value to display in the trigger\n const selectedLabel = (() => {\n if (!rawValue && rawValue !== \"\") return undefined;\n return labelMap.get(rawValue ?? \"\");\n })();\n\n return (\n <Select\n onValueChange={handleChange}\n value={selectValue}\n disabled={isDisabled}\n defaultOpen={defaultOpen}\n >\n <SelectTrigger\n className={cn(\"w-full\", triggerClassName)}\n aria-invalid={fieldState?.invalid || undefined}\n >\n {Icon && <Icon className=\"mr-2 h-4 w-4 text-primary\" />}\n <SelectValue placeholder={placeholder}>\n {selectedLabel || null}\n </SelectValue>\n </SelectTrigger>\n <SelectContent\n className={cn(contentClassName)}\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset}\n >\n {filteredGroups.length > 0 ? renderGroupedContent() : renderFlatContent()}\n </SelectContent>\n </Select>\n );\n };\n\n // Direct usage without React Hook Form\n if (!control) {\n return (\n <Field className={className} data-disabled={disabled}>\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n {renderSelect(undefined, disabled, undefined)}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n </Field>\n );\n }\n\n // Using with React Hook Form\n return (\n <Controller\n name={name as FieldPath<TFieldValues>}\n control={control}\n render={({ field, fieldState }) => (\n <Field\n className={className}\n data-disabled={disabled}\n data-invalid={fieldState.invalid}\n >\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n {renderSelect(field, disabled, fieldState)}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n {fieldState.invalid && fieldState.error && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useState, useEffect } from \"react\";\nimport { Controller } from \"react-hook-form\";\nimport type { Control, FieldValues, FieldPath } from \"react-hook-form\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport { cn } from \"../../utils\";\nimport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n} from \"@/components/ui/field\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface CheckboxItem {\n id: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface CheckboxInputProps<TFieldValues extends FieldValues = FieldValues> {\n // React Hook Form\n control?: Control<TFieldValues>;\n name: FieldPath<TFieldValues> | string;\n\n // Field configuration\n label?: string;\n description?: string;\n helperText?: string;\n required?: boolean;\n disabled?: boolean;\n\n // Checkbox items (for multi-checkbox)\n items?: CheckboxItem[];\n\n // Value handling (for direct usage)\n value?: string[];\n onChange?: (values: string[]) => void;\n onValueChange?: (values: string[]) => void;\n\n // Styling\n className?: string;\n labelClassName?: string;\n checkboxClassName?: string;\n itemClassName?: string;\n itemLabelClassName?: string;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\n/**\n * CheckboxInput - Checkbox group with react-hook-form integration\n *\n * Features:\n * - Multiple checkbox items\n * - Array value support\n * - Can be used standalone\n *\n * @example\n * ```tsx\n * <CheckboxInput\n * control={form.control}\n * name=\"features\"\n * label=\"Features\"\n * items={[\n * { id: \"wifi\", label: \"WiFi\" },\n * { id: \"parking\", label: \"Parking\" },\n * { id: \"pool\", label: \"Pool\" },\n * ]}\n * />\n * ```\n */\nexport function CheckboxInput<TFieldValues extends FieldValues = FieldValues>({\n control,\n name,\n label,\n description,\n helperText,\n required,\n disabled,\n items = [],\n value: propValue,\n onChange: propOnChange,\n onValueChange,\n className,\n labelClassName,\n checkboxClassName,\n itemClassName,\n itemLabelClassName,\n}: CheckboxInputProps<TFieldValues>) {\n const descriptionText = description || helperText;\n\n // For direct usage without React Hook Form\n const [localValues, setLocalValues] = useState<string[]>(propValue || []);\n\n // Update local value when prop value changes\n useEffect(() => {\n if (propValue !== undefined) {\n setLocalValues(propValue);\n }\n }, [propValue]);\n\n // Handle direct value changes (without React Hook Form)\n const handleDirectValueChange = (newValues: string[]) => {\n setLocalValues(newValues);\n propOnChange?.(newValues);\n onValueChange?.(newValues);\n };\n\n const renderCheckboxes = (\n field?: { value: string[]; onChange: (values: string[]) => void },\n isDisabled?: boolean,\n fieldState?: { invalid?: boolean }\n ) => {\n // Get values from either form field or direct props\n const values: string[] = field?.value || localValues || [];\n\n const handleCheckedChange = (itemId: string, checked: boolean) => {\n const newValues = checked\n ? [...values, itemId]\n : values.filter((value) => value !== itemId);\n\n if (field) {\n field.onChange(newValues);\n } else {\n handleDirectValueChange(newValues);\n }\n\n onValueChange?.(newValues);\n };\n\n return (\n <div data-slot=\"checkbox-group\" className=\"space-y-2\">\n {items.map((item) => (\n <div\n key={item.id}\n className={cn(\"flex items-center gap-2\", itemClassName)}\n >\n <Checkbox\n id={`${name}-${item.id}`}\n className={checkboxClassName}\n checked={values.includes(item.id)}\n disabled={isDisabled || item.disabled}\n onCheckedChange={(checked: boolean) =>\n handleCheckedChange(item.id, checked)\n }\n aria-invalid={fieldState?.invalid || undefined}\n />\n <label\n htmlFor={`${name}-${item.id}`}\n className={cn(\n \"text-sm font-normal cursor-pointer leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n itemLabelClassName\n )}\n >\n {item.label}\n </label>\n </div>\n ))}\n </div>\n );\n };\n\n // Direct usage without React Hook Form\n if (!control) {\n return (\n <Field className={className} data-disabled={disabled}>\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n {renderCheckboxes(undefined, disabled, undefined)}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n </Field>\n );\n }\n\n // Using with React Hook Form\n return (\n <Controller\n name={name as FieldPath<TFieldValues>}\n control={control}\n render={({ field, fieldState }) => (\n <Field\n className={className}\n data-disabled={disabled}\n data-invalid={fieldState.invalid}\n >\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n {renderCheckboxes(\n field as { value: string[]; onChange: (values: string[]) => void },\n disabled,\n fieldState\n )}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n {fieldState.invalid && fieldState.error && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useState, useEffect } from \"react\";\nimport { Controller } from \"react-hook-form\";\nimport type { Control, FieldValues, FieldPath } from \"react-hook-form\";\nimport { RadioGroup, RadioGroupItem } from \"@/components/ui/radio-group\";\nimport { cn } from \"../../utils\";\nimport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n} from \"@/components/ui/field\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface RadioChoice {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface RadioInputProps<TFieldValues extends FieldValues = FieldValues> {\n // React Hook Form\n control?: Control<TFieldValues>;\n name: FieldPath<TFieldValues> | string;\n\n // Field configuration\n label?: string;\n description?: string;\n helperText?: string;\n required?: boolean;\n disabled?: boolean;\n\n // Radio options\n choices?: RadioChoice[];\n items?: RadioChoice[]; // Alias for choices (for FormKit compatibility)\n\n // Layout\n orientation?: \"vertical\" | \"horizontal\";\n\n // Value handling\n value?: string;\n onChange?: (value: string) => void;\n onValueChange?: (value: string) => void;\n\n // Styling\n className?: string;\n labelClassName?: string;\n radioGroupClassName?: string;\n radioItemClassName?: string;\n radioLabelClassName?: string;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\n/**\n * RadioInput - Radio group with react-hook-form integration\n *\n * @example\n * ```tsx\n * <RadioInput\n * control={form.control}\n * name=\"plan\"\n * label=\"Select Plan\"\n * choices={[\n * { value: \"free\", label: \"Free\" },\n * { value: \"pro\", label: \"Pro\" },\n * { value: \"enterprise\", label: \"Enterprise\" },\n * ]}\n * orientation=\"horizontal\"\n * />\n * ```\n */\nexport function RadioInput<TFieldValues extends FieldValues = FieldValues>({\n control,\n name,\n label,\n description,\n helperText,\n required,\n disabled,\n choices = [],\n items,\n orientation = \"vertical\",\n value: propValue,\n onChange: propOnChange,\n onValueChange,\n className,\n labelClassName,\n radioGroupClassName,\n radioItemClassName,\n radioLabelClassName,\n}: RadioInputProps<TFieldValues>) {\n const descriptionText = description || helperText;\n\n // Support both 'choices' and 'items' prop names\n const radioOptions = items || choices;\n\n // For direct usage without React Hook Form\n const [localValue, setLocalValue] = useState<string>(propValue || \"\");\n\n // Update local value when prop value changes\n useEffect(() => {\n if (propValue !== undefined) {\n setLocalValue(propValue);\n }\n }, [propValue]);\n\n // Handle direct value changes (without React Hook Form)\n const handleDirectValueChange = (newValue: string) => {\n setLocalValue(newValue);\n propOnChange?.(newValue);\n onValueChange?.(newValue);\n };\n\n const renderRadioGroup = (\n field?: { value: string; onChange: (value: string) => void },\n isDisabled?: boolean,\n fieldState?: { invalid?: boolean }\n ) => {\n // Get value from either form field or direct props\n const value = field ? field.value : localValue;\n\n const handleValueChange = (newValue: string) => {\n if (field) {\n field.onChange(newValue);\n } else {\n handleDirectValueChange(newValue);\n }\n\n onValueChange?.(newValue);\n };\n\n return (\n <RadioGroup\n value={value}\n onValueChange={handleValueChange}\n disabled={isDisabled}\n aria-invalid={fieldState?.invalid || undefined}\n className={cn(\n orientation === \"horizontal\"\n ? \"flex flex-row flex-wrap gap-4\"\n : \"flex flex-col gap-3\",\n radioGroupClassName\n )}\n >\n {radioOptions.map((choice) => (\n <div\n key={choice.value}\n className={cn(\n \"flex items-center gap-2\",\n radioItemClassName\n )}\n >\n <RadioGroupItem\n id={`${name}-${choice.value}`}\n value={choice.value}\n disabled={isDisabled || choice.disabled}\n />\n <label\n htmlFor={`${name}-${choice.value}`}\n className={cn(\n \"text-sm font-normal cursor-pointer leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n radioLabelClassName\n )}\n >\n {choice.label}\n </label>\n </div>\n ))}\n </RadioGroup>\n );\n };\n\n // Direct usage without React Hook Form\n if (!control) {\n return (\n <Field className={className} data-disabled={disabled}>\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n {renderRadioGroup(undefined, disabled, undefined)}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n </Field>\n );\n }\n\n // Using with React Hook Form\n return (\n <Controller\n name={name as FieldPath<TFieldValues>}\n control={control}\n render={({ field, fieldState }) => (\n <Field\n className={className}\n data-disabled={disabled}\n data-invalid={fieldState.invalid}\n >\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n {renderRadioGroup(\n field as { value: string; onChange: (value: string) => void },\n disabled,\n fieldState\n )}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n {fieldState.invalid && fieldState.error && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useState, useEffect } from \"react\";\nimport { Controller } from \"react-hook-form\";\nimport type { Control, FieldValues, FieldPath } from \"react-hook-form\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { cn } from \"../../utils\";\nimport {\n Field,\n FieldContent,\n FieldLabel,\n FieldDescription,\n FieldError,\n} from \"@/components/ui/field\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface SwitchInputProps<TFieldValues extends FieldValues = FieldValues> {\n // React Hook Form\n control?: Control<TFieldValues>;\n name: FieldPath<TFieldValues> | string;\n\n // Field configuration\n label?: string;\n description?: string;\n helperText?: string;\n required?: boolean;\n disabled?: boolean;\n\n // Layout\n orientation?: \"horizontal\" | \"vertical\";\n\n // Value handling\n value?: boolean;\n onChange?: (value: boolean) => void;\n onValueChange?: (value: boolean) => void;\n\n // Styling\n className?: string;\n labelClassName?: string;\n switchClassName?: string;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\n/**\n * SwitchInput - Toggle switch with react-hook-form integration\n *\n * @example\n * ```tsx\n * <SwitchInput\n * control={form.control}\n * name=\"notifications\"\n * label=\"Enable notifications\"\n * description=\"Receive email updates\"\n * />\n * ```\n */\nexport function SwitchInput<TFieldValues extends FieldValues = FieldValues>({\n control,\n name,\n label,\n description,\n helperText,\n required,\n disabled,\n orientation = \"horizontal\",\n value: propValue,\n onChange: propOnChange,\n onValueChange,\n className,\n labelClassName,\n switchClassName,\n}: SwitchInputProps<TFieldValues>) {\n const descriptionText = description || helperText;\n\n // For direct usage without React Hook Form\n const [localValue, setLocalValue] = useState<boolean>(propValue || false);\n\n // Update local value when prop value changes\n useEffect(() => {\n if (propValue !== undefined) {\n setLocalValue(propValue);\n }\n }, [propValue]);\n\n // Handle direct value changes (without React Hook Form)\n const handleDirectValueChange = (newValue: boolean) => {\n setLocalValue(newValue);\n propOnChange?.(newValue);\n onValueChange?.(newValue);\n };\n\n const renderSwitch = (\n field?: { value: boolean; onChange: (value: boolean) => void },\n isDisabled?: boolean,\n fieldState?: { invalid?: boolean }\n ) => {\n // Get value from either form field or direct props\n const value = field ? (field.value ?? false) : (localValue ?? false);\n\n const handleCheckedChange = (checked: boolean) => {\n if (field) {\n field.onChange(checked);\n } else {\n handleDirectValueChange(checked);\n }\n\n onValueChange?.(checked);\n };\n\n return (\n <Switch\n id={name}\n checked={value}\n onCheckedChange={handleCheckedChange}\n disabled={isDisabled}\n className={switchClassName}\n aria-invalid={fieldState?.invalid || undefined}\n />\n );\n };\n\n // Direct usage without React Hook Form\n if (!control) {\n return (\n <Field\n className={className}\n data-disabled={disabled}\n orientation={orientation}\n >\n {renderSwitch(undefined, disabled, undefined)}\n <FieldContent>\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n </FieldContent>\n </Field>\n );\n }\n\n // Using with React Hook Form\n return (\n <Controller\n name={name as FieldPath<TFieldValues>}\n control={control}\n render={({ field, fieldState }) => (\n <Field\n className={className}\n data-disabled={disabled}\n data-invalid={fieldState.invalid}\n orientation={orientation}\n >\n {renderSwitch(\n field as { value: boolean; onChange: (value: boolean) => void },\n disabled,\n fieldState\n )}\n <FieldContent>\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n {fieldState.invalid && fieldState.error && (\n <FieldError errors={[fieldState.error]} />\n )}\n </FieldContent>\n </Field>\n )}\n />\n );\n}\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { useState } from \"react\";\r\nimport { Controller } from \"react-hook-form\";\r\nimport type { Control, FieldValues, FieldPath } from \"react-hook-form\";\r\nimport {\r\n Field,\r\n FieldLabel,\r\n FieldDescription,\r\n FieldError,\r\n} from \"@/components/ui/field\";\r\nimport { Calendar } from \"@/components/ui/calendar\";\r\nimport {\r\n Popover,\r\n PopoverContent,\r\n PopoverTrigger,\r\n} from \"@/components/ui/popover\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { CalendarIcon, X } from \"lucide-react\";\r\nimport { cn } from \"../../utils\";\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\ntype DateValue = Date | string | null | undefined;\r\n\r\nexport interface DateInputProps<TFieldValues extends FieldValues = FieldValues> {\r\n // React Hook Form\r\n control?: Control<TFieldValues>;\r\n name: FieldPath<TFieldValues> | string;\r\n\r\n // Field configuration\r\n label?: string;\r\n placeholder?: string;\r\n description?: string;\r\n helperText?: string;\r\n required?: boolean;\r\n disabled?: boolean;\r\n\r\n // Date constraints\r\n minDate?: DateValue;\r\n maxDate?: DateValue;\r\n\r\n // Value handling\r\n value?: DateValue;\r\n onChange?: (date: Date | undefined) => void;\r\n onValueChange?: (date: Date | undefined) => void;\r\n\r\n // Styling\r\n className?: string;\r\n labelClassName?: string;\r\n inputClassName?: string;\r\n\r\n // Options\r\n Icon?: React.ComponentType<{ className?: string }>;\r\n allowClear?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// HELPERS\r\n// ============================================================================\r\n\r\n/**\r\n * Convert various date formats to Date object\r\n */\r\nfunction toDate(val: DateValue): Date | undefined {\r\n if (!val) return undefined;\r\n if (val instanceof Date) return val;\r\n // Handle YYYY-MM-DD format\r\n if (typeof val === \"string\" && /^\\d{4}-\\d{2}-\\d{2}$/.test(val)) {\r\n const [y, m, d] = val.split(\"-\").map(Number);\r\n const dt = new Date(y!, (m || 1) - 1, d || 1);\r\n return isNaN(dt.getTime()) ? undefined : dt;\r\n }\r\n const dt = new Date(val);\r\n return isNaN(dt.getTime()) ? undefined : dt;\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\n/**\r\n * DateInput - Date picker with react-hook-form integration\r\n *\r\n * @example\r\n * ```tsx\r\n * <DateInput\r\n * control={form.control}\r\n * name=\"birthDate\"\r\n * label=\"Date of Birth\"\r\n * minDate=\"1900-01-01\"\r\n * maxDate={new Date()}\r\n * />\r\n * ```\r\n */\r\nexport function DateInput<TFieldValues extends FieldValues = FieldValues>({\r\n control,\r\n name,\r\n label,\r\n description,\r\n helperText,\r\n placeholder = \"Pick a date\",\r\n required,\r\n disabled,\r\n className,\r\n labelClassName,\r\n inputClassName,\r\n minDate,\r\n maxDate,\r\n onValueChange,\r\n value: propValue,\r\n onChange: propOnChange,\r\n Icon = CalendarIcon,\r\n allowClear = true,\r\n}: DateInputProps<TFieldValues>) {\r\n const descriptionText = description || helperText;\r\n\r\n // Check if date should be disabled\r\n const isDateDisabled = (date: Date): boolean => {\r\n if (!date) return false;\r\n const minDateObj = toDate(minDate);\r\n const maxDateObj = toDate(maxDate);\r\n if (minDateObj && date < minDateObj) return true;\r\n if (maxDateObj && date > maxDateObj) return true;\r\n return false;\r\n };\r\n\r\n // Render the date picker UI\r\n const renderDateInput = (\r\n field?: { value: DateValue; onChange: (date: Date | undefined) => void },\r\n isDisabled?: boolean\r\n ) => {\r\n const value = field ? field.value : propValue;\r\n const selected = toDate(value);\r\n const [open, setOpen] = useState(false);\r\n\r\n const handleSelect = (date: Date | undefined) => {\r\n if (field) field.onChange(date);\r\n else if (propOnChange) propOnChange(date);\r\n onValueChange?.(date);\r\n setOpen(false);\r\n };\r\n\r\n const handleClear = (e: React.MouseEvent) => {\r\n e?.stopPropagation?.();\r\n if (field) field.onChange(undefined);\r\n else if (propOnChange) propOnChange(undefined);\r\n onValueChange?.(undefined);\r\n };\r\n\r\n const displayText = selected\r\n ? selected.toLocaleDateString(\"en-US\", {\r\n month: \"short\",\r\n day: \"numeric\",\r\n year: \"numeric\",\r\n })\r\n : placeholder;\r\n\r\n return (\r\n <Popover open={open} onOpenChange={setOpen}>\r\n <PopoverTrigger\r\n render={\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n className={cn(\r\n \"w-full justify-start text-left font-normal\",\r\n !selected && \"text-muted-foreground\",\r\n inputClassName\r\n )}\r\n disabled={isDisabled}\r\n >\r\n <Icon className=\"mr-2 h-4 w-4\" />\r\n {displayText}\r\n {allowClear && selected && !isDisabled && (\r\n <X\r\n className=\"ml-auto h-4 w-4 opacity-50 hover:opacity-100\"\r\n onClick={handleClear}\r\n />\r\n )}\r\n </Button>\r\n }\r\n />\r\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\r\n <Calendar\r\n mode=\"single\"\r\n defaultMonth={selected}\r\n selected={selected}\r\n onSelect={handleSelect}\r\n disabled={isDateDisabled}\r\n initialFocus\r\n />\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n };\r\n\r\n // Direct usage without React Hook Form\r\n if (!control) {\r\n return (\r\n <Field className={className} data-disabled={disabled}>\r\n {label && (\r\n <FieldLabel htmlFor={name} className={labelClassName}>\r\n {label}\r\n {required && <span className=\"text-destructive ml-1\">*</span>}\r\n </FieldLabel>\r\n )}\r\n {renderDateInput(undefined, disabled)}\r\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\r\n </Field>\r\n );\r\n }\r\n\r\n // Using with React Hook Form via Controller\r\n return (\r\n <Controller\r\n name={name as FieldPath<TFieldValues>}\r\n control={control}\r\n render={({ field, fieldState }) => (\r\n <Field\r\n className={className}\r\n data-disabled={disabled}\r\n data-invalid={fieldState.invalid}\r\n >\r\n {label && (\r\n <FieldLabel htmlFor={name as string} className={labelClassName}>\r\n {label}\r\n {required && <span className=\"text-destructive ml-1\">*</span>}\r\n </FieldLabel>\r\n )}\r\n {renderDateInput(field as { value: DateValue; onChange: (date: Date | undefined) => void }, disabled)}\r\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\r\n {fieldState.invalid && fieldState.error && (\r\n <FieldError errors={[fieldState.error]} />\r\n )}\r\n </Field>\r\n )}\r\n />\r\n );\r\n}\r\n","\"use client\";\n\nimport { useState, useRef, useCallback, useMemo, type ClipboardEvent, type KeyboardEvent, type ChangeEvent } from \"react\";\nimport { Controller } from \"react-hook-form\";\nimport type { Control, FieldValues } from \"react-hook-form\";\nimport { X, Plus, Tag } from \"lucide-react\";\nimport { cn } from \"../../utils\";\nimport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n FieldContent,\n} from \"@/components/ui/field\";\nimport { Button } from \"@/components/ui/button\";\nimport { Badge } from \"@/components/ui/badge\";\nimport {\n InputGroup,\n InputGroupInput,\n InputGroupAddon,\n} from \"@/components/ui/input-group\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface TagInputProps {\n // React Hook Form\n control?: Control<FieldValues>;\n name: string;\n\n // Field configuration\n label?: string;\n placeholder?: string;\n description?: string;\n helperText?: string;\n required?: boolean;\n disabled?: boolean;\n\n // Tag behavior\n maxTags?: number;\n allowDuplicates?: boolean;\n delimiter?: string;\n\n // Suggestions\n suggestions?: string[];\n suggestionLimit?: number;\n\n // Value handling\n value?: string[];\n onChange?: (tags: string[]) => void;\n onValueChange?: (tags: string[]) => void;\n\n // Tag validation/transformation\n validateTag?: (tag: string) => boolean;\n transformTag?: (tag: string) => string;\n formatTag?: (tag: string) => string;\n\n // Styling\n className?: string;\n labelClassName?: string;\n inputClassName?: string;\n\n // Additional props\n [key: string]: unknown;\n}\n\ninterface RenderTagInputProps {\n field: { value: string[]; onChange: (tags: string[]) => void } | null;\n disabled?: boolean;\n error?: string | null;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\n/**\n * TagInput - Tag/chip input with react-hook-form integration\n *\n * @example\n * ```tsx\n * <TagInput\n * control={form.control}\n * name=\"tags\"\n * label=\"Tags\"\n * placeholder=\"Add tags...\"\n * maxTags={10}\n * suggestions={[\"react\", \"typescript\", \"nextjs\"]}\n * />\n * ```\n */\nexport function TagInput({\n control,\n name,\n label,\n description,\n helperText,\n placeholder = \"Add tag...\",\n required,\n disabled,\n className,\n labelClassName,\n inputClassName,\n maxTags,\n allowDuplicates = false,\n suggestions = [],\n suggestionLimit = 8,\n value: propValue = [],\n onChange: propOnChange,\n onValueChange,\n delimiter = \",\",\n validateTag,\n transformTag,\n formatTag,\n ...props\n}: TagInputProps) {\n const descriptionText = description || helperText;\n const [inputValue, setInputValue] = useState(\"\");\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Parse and validate multiple tags from a string\n const parseMultipleTags = useCallback(\n (input: string): string[] => {\n if (!input.trim()) return [];\n\n return input\n .split(delimiter)\n .map((tag) => tag.trim())\n .filter((tag) => tag.length > 0)\n .map((tag) => (transformTag ? transformTag(tag) : tag))\n .filter((tag) => !validateTag || validateTag(tag));\n },\n [delimiter, validateTag, transformTag]\n );\n\n // Add multiple tags at once\n const handleAddMultipleTags = useCallback(\n (\n tags: string[],\n newTags: string[],\n field: { onChange: (tags: string[]) => void } | null\n ): string[] => {\n if (!newTags || newTags.length === 0) return tags;\n\n const updatedTags = [...tags];\n let addedCount = 0;\n\n for (const newTag of newTags) {\n if (!newTag.trim()) continue;\n\n const trimmedTag = newTag.trim();\n\n if (!allowDuplicates && updatedTags.includes(trimmedTag)) {\n continue;\n }\n\n if (maxTags && updatedTags.length >= maxTags) {\n break;\n }\n\n updatedTags.push(trimmedTag);\n addedCount++;\n }\n\n if (addedCount > 0) {\n if (field) {\n field.onChange(updatedTags);\n } else if (propOnChange) {\n propOnChange(updatedTags);\n }\n onValueChange?.(updatedTags);\n }\n\n return updatedTags;\n },\n [allowDuplicates, maxTags, propOnChange, onValueChange]\n );\n\n // Handle single tag addition\n const handleAddTag = useCallback(\n (\n tags: string[],\n newTag: string,\n field: { onChange: (tags: string[]) => void } | null\n ): string[] => {\n const tagsToAdd = parseMultipleTags(newTag);\n const updatedTags = handleAddMultipleTags(tags, tagsToAdd, field);\n setInputValue(\"\");\n return updatedTags;\n },\n [parseMultipleTags, handleAddMultipleTags]\n );\n\n const handleRemoveTag = useCallback(\n (\n tags: string[],\n indexToRemove: number,\n field: { onChange: (tags: string[]) => void } | null\n ): string[] => {\n const updatedTags = tags.filter((_, index) => index !== indexToRemove);\n\n if (field) {\n field.onChange(updatedTags);\n } else if (propOnChange) {\n propOnChange(updatedTags);\n }\n\n onValueChange?.(updatedTags);\n return updatedTags;\n },\n [propOnChange, onValueChange]\n );\n\n // Handle input change\n const handleInputChange = useCallback(\n (\n e: ChangeEvent<HTMLInputElement>,\n tags: string[],\n field: { onChange: (tags: string[]) => void } | null\n ) => {\n const value = e.target.value;\n\n if (value.includes(delimiter)) {\n const parts = value.split(delimiter);\n const completeTags = parts.slice(0, -1);\n const remainingInput = parts[parts.length - 1] || \"\";\n\n if (completeTags.length > 0) {\n handleAddMultipleTags(\n tags,\n completeTags.map((t) => t.trim()).filter((t) => t),\n field\n );\n }\n\n setInputValue(remainingInput);\n } else {\n setInputValue(value);\n }\n },\n [delimiter, handleAddMultipleTags]\n );\n\n // Handle paste events\n const handlePaste = useCallback(\n (\n e: ClipboardEvent<HTMLInputElement>,\n tags: string[],\n field: { onChange: (tags: string[]) => void } | null\n ) => {\n e.preventDefault();\n const pastedText = e.clipboardData.getData(\"text\");\n const pastedTags = parseMultipleTags(pastedText);\n\n if (pastedTags.length > 0) {\n handleAddMultipleTags(tags, pastedTags, field);\n setInputValue(\"\");\n }\n },\n [parseMultipleTags, handleAddMultipleTags]\n );\n\n const handleKeyDown = useCallback(\n (\n e: KeyboardEvent<HTMLInputElement>,\n tags: string[],\n field: { onChange: (tags: string[]) => void } | null\n ) => {\n if (e.key === \"Enter\" || e.key === delimiter) {\n e.preventDefault();\n handleAddTag(tags, inputValue, field);\n } else if (e.key === \"Backspace\" && !inputValue && tags.length > 0) {\n e.preventDefault();\n handleRemoveTag(tags, tags.length - 1, field);\n }\n },\n [delimiter, inputValue, handleAddTag, handleRemoveTag]\n );\n\n const getPlaceholder = useCallback(\n (tagsCount: number): string => {\n if (tagsCount === 0) {\n return placeholder.includes(\"comma\")\n ? placeholder\n : `${placeholder} (separate with ${delimiter} for multiple)`;\n }\n return \"Add another...\";\n },\n [placeholder, delimiter]\n );\n\n const canAddMoreTags = useCallback(\n (tagsLength: number): boolean => {\n return !maxTags || tagsLength < maxTags;\n },\n [maxTags]\n );\n\n const renderTagInput = ({ field, disabled: isDisabled, error }: RenderTagInputProps) => {\n const tags: string[] = field ? field.value || [] : propValue || [];\n const showInput = !isDisabled && canAddMoreTags(tags.length);\n const normalizedInputRaw = (inputValue || \"\").trim();\n const normalizedInput = (transformTag ? transformTag(normalizedInputRaw) : normalizedInputRaw)\n .toLowerCase()\n .trim();\n\n const filteredSuggestions = useMemo(() => {\n if (!normalizedInput) return [];\n const existingSet = new Set(tags.map((t) => t.toLowerCase()));\n return suggestions\n .filter(Boolean)\n .map((s) => (transformTag ? transformTag(s) : s))\n .filter((s) => s.toLowerCase().includes(normalizedInput))\n .filter((s) => allowDuplicates || !existingSet.has(s.toLowerCase()))\n .slice(0, suggestionLimit);\n }, [normalizedInput, tags, suggestions, transformTag, allowDuplicates, suggestionLimit]);\n\n return (\n <>\n {/* Tags Display Area */}\n {tags.length > 0 && (\n <div\n className={cn(\n \"flex flex-wrap gap-1.5 mb-3\",\n \"p-2.5 rounded-md bg-muted/30 border border-border/50\"\n )}\n >\n {tags.map((tag, index) => {\n const displayTag = formatTag ? formatTag(tag) : tag;\n\n return (\n <Badge\n key={`${tag}-${index}`}\n variant=\"secondary\"\n className={cn(\n \"group flex items-center gap-1.5 px-2.5 py-1\",\n \"bg-background border border-border shadow-sm\",\n \"hover:border-primary/50 transition-all duration-200\",\n \"animate-in fade-in-0 zoom-in-95\",\n isDisabled && \"opacity-60\"\n )}\n >\n <Tag className=\"h-3 w-3 text-muted-foreground\" />\n <span\n className=\"max-w-[200px] truncate text-sm font-medium\"\n title={displayTag}\n >\n {displayTag}\n </span>\n {!isDisabled && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"h-4 w-4 p-0 ml-0.5\",\n \"text-muted-foreground/60 hover:text-destructive\",\n \"hover:bg-destructive/10 rounded-sm\",\n \"transition-colors\"\n )}\n onClick={(e) => {\n e.stopPropagation();\n handleRemoveTag(tags, index, field);\n }}\n aria-label={`Remove ${displayTag}`}\n >\n <X className=\"h-3 w-3\" />\n </Button>\n )}\n </Badge>\n );\n })}\n </div>\n )}\n\n {/* Input Field */}\n {showInput && (\n <div className=\"space-y-3\">\n <InputGroup className={cn(error && \"border-destructive\")}>\n <InputGroupAddon align=\"inline-start\">\n <Tag className=\"h-4 w-4\" />\n </InputGroupAddon>\n <InputGroupInput\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={(e: ChangeEvent<HTMLInputElement>) => handleInputChange(e, tags, field)}\n onKeyDown={(e: KeyboardEvent<HTMLInputElement>) => handleKeyDown(e, tags, field)}\n onPaste={(e: ClipboardEvent<HTMLInputElement>) => handlePaste(e, tags, field)}\n placeholder={getPlaceholder(tags.length)}\n disabled={isDisabled}\n aria-label=\"Add new tag\"\n aria-invalid={!!error}\n className={inputClassName}\n {...props}\n />\n {inputValue.trim() && (\n <InputGroupAddon align=\"inline-end\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6 text-primary hover:text-primary hover:bg-primary/10\"\n onClick={() => handleAddTag(tags, inputValue, field)}\n aria-label=\"Add tag\"\n >\n <Plus className=\"h-4 w-4\" />\n </Button>\n </InputGroupAddon>\n )}\n </InputGroup>\n\n {/* Suggestions list */}\n {filteredSuggestions.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5 p-2 rounded-md bg-muted/30 border border-dashed\">\n <span className=\"text-xs text-muted-foreground font-medium w-full mb-1\">\n Suggestions:\n </span>\n {filteredSuggestions.map((sug) => (\n <Button\n key={sug}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className={cn(\n \"h-7 px-2.5 text-xs\",\n \"hover:border-primary/50 hover:bg-primary/5\",\n \"transition-all duration-200\"\n )}\n onClick={(e) => {\n e.stopPropagation();\n handleAddMultipleTags(tags, [sug], field);\n setInputValue(\"\");\n }}\n aria-label={`Add ${formatTag ? formatTag(sug) : sug}`}\n >\n {formatTag ? formatTag(sug) : sug}\n <Plus className=\"h-3 w-3 ml-1.5 opacity-70\" />\n </Button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* Status indicators */}\n {maxTags && (\n <div\n className={cn(\n \"text-xs font-medium mt-2 flex items-center gap-1.5\",\n tags.length >= maxTags\n ? \"text-destructive\"\n : \"text-muted-foreground\"\n )}\n >\n <div\n className={cn(\n \"h-1.5 w-1.5 rounded-full\",\n tags.length >= maxTags\n ? \"bg-destructive\"\n : \"bg-muted-foreground/50\"\n )}\n />\n {tags.length}/{maxTags} tags\n </div>\n )}\n </>\n );\n };\n\n // Direct usage without React Hook Form\n if (!control) {\n return (\n <Field className={className} data-disabled={disabled}>\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n <FieldContent>\n {renderTagInput({ field: null, disabled, error: null })}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n </FieldContent>\n </Field>\n );\n }\n\n // Using with React Hook Form\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState }) => (\n <Field\n className={className}\n data-disabled={disabled}\n data-invalid={fieldState.invalid}\n >\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n <FieldContent>\n {renderTagInput({\n field: field as { value: string[]; onChange: (tags: string[]) => void },\n disabled,\n error: fieldState?.error?.message,\n })}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n {fieldState.invalid && fieldState.error && (\n <FieldError errors={[fieldState.error]} />\n )}\n </FieldContent>\n </Field>\n )}\n />\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { Controller } from \"react-hook-form\";\nimport type { Control, FieldValues, FieldPath } from \"react-hook-form\";\nimport { Check, ChevronDown, X, Tag as TagIcon } from \"lucide-react\";\nimport { cn } from \"../../utils\";\nimport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n FieldContent,\n} from \"@/components/ui/field\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/components/ui/popover\";\nimport { Input } from \"@/components/ui/input\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface TagChoiceItem {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface TagChoiceInputProps<TFieldValues extends FieldValues = FieldValues> {\n // React Hook Form\n control?: Control<TFieldValues>;\n name: FieldPath<TFieldValues> | string;\n\n // Field configuration\n label?: string;\n placeholder?: string;\n description?: string;\n helperText?: string;\n required?: boolean;\n disabled?: boolean;\n\n // Options\n items?: TagChoiceItem[];\n\n // Value handling\n value?: string[];\n onValueChange?: (values: string[]) => void;\n\n // Styling\n className?: string;\n}\n\ninterface TagChoiceInputInternalProps {\n label?: string;\n description?: string;\n placeholder?: string;\n required?: boolean;\n disabled?: boolean;\n className?: string;\n items: TagChoiceItem[];\n value: string[];\n onValueChange?: (values: string[]) => void;\n error?: string;\n}\n\n// ============================================================================\n// INTERNAL COMPONENT\n// ============================================================================\n\nfunction TagChoiceInputInternal({\n label,\n description,\n placeholder = \"Select...\",\n required,\n disabled,\n className,\n items = [],\n value = [],\n onValueChange,\n error,\n}: TagChoiceInputInternalProps) {\n const [open, setOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const selectedValues = value || [];\n\n const handleSelect = (itemValue: string) => {\n const isSelected = selectedValues.includes(itemValue);\n const newValue = isSelected\n ? selectedValues.filter((v) => v !== itemValue)\n : [...selectedValues, itemValue];\n onValueChange?.(newValue);\n };\n\n const handleRemove = (valueToRemove: string) => {\n const newValue = selectedValues.filter((v) => v !== valueToRemove);\n onValueChange?.(newValue);\n };\n\n const filteredItems = items.filter((item) =>\n item.label.toLowerCase().includes(searchQuery.toLowerCase())\n );\n\n return (\n <Field className={className} data-disabled={disabled} data-invalid={!!error}>\n {label && (\n <FieldLabel>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n\n <FieldContent>\n {/* Selected Tags Display */}\n {selectedValues.length > 0 && (\n <div\n className={cn(\n \"flex flex-wrap gap-1.5 mb-3\",\n \"p-2.5 rounded-md bg-muted/30 border border-border/50\"\n )}\n >\n {selectedValues.map((val) => {\n const item = items.find((i) => i.value === val);\n return (\n <Badge\n key={val}\n variant=\"secondary\"\n className={cn(\n \"group flex items-center gap-1.5 px-2.5 py-1\",\n \"bg-background border border-border shadow-sm\",\n \"hover:border-primary/50 transition-all duration-200\",\n disabled && \"opacity-60\"\n )}\n >\n <TagIcon className=\"h-3 w-3 text-muted-foreground\" />\n <span className=\"text-sm font-medium\">\n {item?.label || val}\n </span>\n {!disabled && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"h-4 w-4 p-0 ml-0.5\",\n \"text-muted-foreground/60 hover:text-destructive\",\n \"hover:bg-destructive/10 rounded-sm\",\n \"transition-colors\"\n )}\n onClick={(e) => {\n e.stopPropagation();\n handleRemove(val);\n }}\n aria-label={`Remove ${item?.label || val}`}\n >\n <X className=\"h-3 w-3\" />\n </Button>\n )}\n </Badge>\n );\n })}\n </div>\n )}\n\n {/* Selection Trigger */}\n <Popover open={open} onOpenChange={setOpen} modal={true}>\n <PopoverTrigger\n render={\n <Button\n type=\"button\"\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n disabled={disabled}\n className={cn(\n \"w-full justify-between h-auto min-h-[2.5rem] px-3 py-2\",\n \"hover:bg-accent/50 transition-colors\",\n error && \"border-destructive\",\n disabled && \"opacity-50 cursor-not-allowed\"\n )}\n >\n <div className=\"flex items-center gap-2\">\n <TagIcon className=\"h-4 w-4 text-muted-foreground\" />\n <span\n className={cn(\n \"text-sm\",\n selectedValues.length === 0 && \"text-muted-foreground\"\n )}\n >\n {selectedValues.length > 0\n ? `${selectedValues.length} selected`\n : placeholder}\n </span>\n </div>\n <ChevronDown\n className={cn(\n \"h-4 w-4 text-muted-foreground transition-transform duration-200\",\n open && \"rotate-180\"\n )}\n />\n </Button>\n }\n />\n <PopoverContent\n className=\"w-(--anchor-width) p-0\"\n align=\"start\"\n >\n <div className=\"p-2 border-b\">\n <Input\n placeholder=\"Search options...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"h-8\"\n />\n </div>\n <div className=\"max-h-[300px] overflow-y-auto p-1\">\n {filteredItems.length === 0 ? (\n <div className=\"py-6 text-center text-sm text-muted-foreground\">\n No options found\n </div>\n ) : (\n <div className=\"space-y-0.5\">\n {filteredItems.map((item) => {\n const isSelected = selectedValues.includes(item.value);\n return (\n <button\n key={item.value}\n type=\"button\"\n onClick={() => handleSelect(item.value)}\n disabled={item.disabled}\n className={cn(\n \"w-full flex items-center justify-between px-2 py-2\",\n \"text-sm rounded-sm\",\n \"hover:bg-accent hover:text-accent-foreground\",\n \"transition-colors cursor-pointer\",\n isSelected && \"bg-primary/10 text-primary font-medium\",\n item.disabled && \"opacity-50 cursor-not-allowed\"\n )}\n >\n <span>{item.label}</span>\n {isSelected && <Check className=\"h-4 w-4 text-primary\" />}\n </button>\n );\n })}\n </div>\n )}\n </div>\n <div className=\"border-t px-2 py-2 text-xs text-muted-foreground text-center\">\n {selectedValues.length > 0\n ? `${selectedValues.length} option${selectedValues.length > 1 ? \"s\" : \"\"} selected`\n : \"Select options from the list\"}\n </div>\n </PopoverContent>\n </Popover>\n\n {description && <FieldDescription>{description}</FieldDescription>}\n {error && <FieldError errors={[{ message: error }]} />}\n </FieldContent>\n </Field>\n );\n}\n\nTagChoiceInputInternal.displayName = \"TagChoiceInputInternal\";\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\n/**\n * TagChoiceInput - Multi-select with tags display\n *\n * @example\n * ```tsx\n * <TagChoiceInput\n * control={form.control}\n * name=\"categories\"\n * label=\"Categories\"\n * items={[\n * { value: \"tech\", label: \"Technology\" },\n * { value: \"design\", label: \"Design\" },\n * ]}\n * />\n * ```\n */\nexport function TagChoiceInput<TFieldValues extends FieldValues = FieldValues>({\n control,\n name,\n label,\n description,\n helperText,\n placeholder = \"Select...\",\n required,\n disabled,\n className,\n items = [],\n value: propValue = [],\n onValueChange,\n}: TagChoiceInputProps<TFieldValues>) {\n const descriptionText = description || helperText;\n\n if (control) {\n return (\n <Controller\n name={name as FieldPath<TFieldValues>}\n control={control}\n render={({ field, fieldState }) => (\n <TagChoiceInputInternal\n label={label}\n description={descriptionText}\n placeholder={placeholder}\n required={required}\n disabled={disabled}\n className={className}\n items={items}\n value={field.value || []}\n onValueChange={(val) => {\n field.onChange(val);\n onValueChange?.(val);\n }}\n error={fieldState?.error?.message}\n />\n )}\n />\n );\n }\n\n return (\n <TagChoiceInputInternal\n label={label}\n description={descriptionText}\n placeholder={placeholder}\n required={required}\n disabled={disabled}\n className={className}\n items={items}\n value={propValue}\n onValueChange={onValueChange}\n />\n );\n}\n\nTagChoiceInput.displayName = \"TagChoiceInput\";\n","\"use client\";\n\nimport { useMemo, useCallback } from \"react\";\nimport { Controller } from \"react-hook-form\";\nimport type { Control, FieldValues, FieldPath } from \"react-hook-form\";\nimport { cn } from \"../../utils\";\nimport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n} from \"@/components/ui/field\";\nimport {\n Combobox,\n ComboboxContent,\n ComboboxEmpty,\n ComboboxInput as BaseComboboxInput,\n ComboboxItem,\n ComboboxList,\n} from \"@/components/ui/combobox\";\nimport type { ReactNode } from \"react\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface ComboboxOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface ComboboxInputProps<TFieldValues extends FieldValues = FieldValues> {\n // React Hook Form\n control?: Control<TFieldValues>;\n name: FieldPath<TFieldValues> | string;\n\n // Field configuration\n label?: string;\n placeholder?: string;\n emptyText?: string;\n description?: string;\n helperText?: string;\n required?: boolean;\n disabled?: boolean;\n\n // Options\n items?: ComboboxOption[];\n\n // Value handling\n value?: string;\n onChange?: (value: string) => void;\n onValueChange?: (value: string) => void;\n\n // Styling\n className?: string;\n labelClassName?: string;\n inputClassName?: string;\n\n // Custom rendering\n renderOption?: (option: ComboboxOption) => ReactNode;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\n/**\n * ComboboxInput - Searchable select with react-hook-form integration using Base UI\n *\n * Features:\n * - Works with react-hook-form Controller\n * - Supports Base UI Combobox primitives\n * - Custom option rendering\n * - Can be used standalone without form\n *\n * @example\n * ```tsx\n * // With react-hook-form\n * <ComboboxInput\n * control={form.control}\n * name=\"country\"\n * label=\"Country\"\n * items={[\n * { value: \"us\", label: \"United States\" },\n * { value: \"uk\", label: \"United Kingdom\" },\n * ]}\n * placeholder=\"Select a country...\"\n * />\n *\n * // Standalone\n * <ComboboxInput\n * name=\"country\"\n * label=\"Country\"\n * items={items}\n * value={selectedCountry}\n * onValueChange={setSelectedCountry}\n * />\n * ```\n */\nexport function ComboboxInput<TFieldValues extends FieldValues = FieldValues>({\n control,\n name,\n label,\n placeholder = \"Select...\",\n emptyText = \"No items found.\",\n description,\n helperText,\n required,\n disabled,\n items = [],\n className,\n labelClassName,\n inputClassName,\n onValueChange,\n renderOption,\n value: propValue,\n onChange: propOnChange,\n}: ComboboxInputProps<TFieldValues>) {\n const descriptionText = description || helperText;\n\n // Memoize the item values array to prevent infinite re-renders\n const itemValues = useMemo(() => items.map((item) => item.value), [items]);\n\n const handleValueChange = useCallback(\n (\n newValue: string | null,\n field?: { onChange: (value: string) => void }\n ) => {\n const safeValue = newValue || \"\";\n if (field) {\n field.onChange(safeValue);\n } else if (propOnChange) {\n propOnChange(safeValue);\n }\n onValueChange?.(safeValue);\n },\n [propOnChange, onValueChange]\n );\n\n const renderCombobox = (\n currentValue: string | undefined,\n field?: { onChange: (value: string) => void },\n isDisabled?: boolean\n ) => {\n return (\n <Combobox\n items={itemValues}\n value={currentValue}\n onValueChange={(value: string | null) => handleValueChange(value, field)}\n disabled={isDisabled}\n >\n <BaseComboboxInput\n placeholder={placeholder}\n className={cn(inputClassName)}\n />\n <ComboboxContent>\n <ComboboxEmpty>{emptyText}</ComboboxEmpty>\n <ComboboxList>\n {(itemValue: string) => {\n const option = items.find((item) => item.value === itemValue);\n if (!option) return null;\n\n return (\n <ComboboxItem\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n >\n {renderOption ? renderOption(option) : option.label}\n </ComboboxItem>\n );\n }}\n </ComboboxList>\n </ComboboxContent>\n </Combobox>\n );\n };\n\n // Direct usage without React Hook Form\n if (!control) {\n return (\n <Field className={className} data-disabled={disabled}>\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n {renderCombobox(propValue, undefined, disabled)}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n </Field>\n );\n }\n\n // Using with React Hook Form\n return (\n <Controller\n name={name as FieldPath<TFieldValues>}\n control={control}\n render={({ field, fieldState }) => (\n <Field\n className={className}\n data-disabled={disabled}\n data-invalid={fieldState.invalid}\n >\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n {renderCombobox(field.value, field, disabled)}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n {fieldState.invalid && fieldState.error && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n );\n}\n","\"use client\";\n\nimport type { Ref, ChangeEvent } from \"react\";\nimport { Controller } from \"react-hook-form\";\nimport type { Control, FieldValues, FieldError as RHFFieldError } from \"react-hook-form\";\nimport { InputGroup, InputGroupInput, InputGroupAddon, InputGroupButton } from \"@/components/ui/input-group\";\nimport { Field, FieldLabel, FieldDescription, FieldError } from \"@/components/ui/field\";\nimport { Wand2 } from \"lucide-react\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface SlugFieldProps {\n // React Hook Form\n control?: Control<FieldValues>;\n name: string;\n\n // Field configuration\n label?: string;\n placeholder?: string;\n description?: string;\n helperText?: string;\n required?: boolean;\n disabled?: boolean;\n\n // Slug generation\n sourceValue?: string;\n onGenerate?: (sourceValue: string) => string;\n\n // Value handling\n value?: string;\n onChange?: (e: { target: { value: string } }) => void;\n onValueChange?: (value: string) => void;\n\n // Styling\n className?: string;\n labelClassName?: string;\n inputClassName?: string;\n\n // Error (for direct usage)\n error?: RHFFieldError;\n\n // Ref\n ref?: Ref<HTMLInputElement>;\n}\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\n/**\n * Generates a URL-friendly slug from a string\n */\nexport function generateSlug(text: string | undefined): string {\n if (!text) return \"\";\n return text\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, \"\") // Remove special characters\n .replace(/\\s+/g, \"-\") // Replace spaces with hyphens\n .replace(/-+/g, \"-\") // Replace multiple hyphens with single hyphen\n .replace(/^-+|-+$/g, \"\"); // Remove leading/trailing hyphens\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\n/**\n * SlugField - URL slug input with auto-generation\n *\n * @example\n * ```tsx\n * <SlugField\n * control={form.control}\n * name=\"slug\"\n * label=\"URL Slug\"\n * sourceValue={form.watch(\"title\")}\n * description=\"This will be used in the page URL\"\n * required\n * />\n * ```\n */\nfunction SlugField({\n control,\n name,\n description,\n helperText,\n required,\n label,\n placeholder = \"my-page-slug\",\n disabled,\n sourceValue,\n onGenerate,\n className,\n inputClassName,\n labelClassName,\n onValueChange,\n value,\n onChange,\n error,\n ref,\n}: SlugFieldProps) {\n const descriptionText = description || helperText;\n\n const handleGenerate = (\n _currentValue: string | undefined,\n fieldOnChange?: (value: string) => void\n ) => {\n const newSlug = onGenerate\n ? onGenerate(sourceValue || \"\")\n : generateSlug(sourceValue);\n fieldOnChange?.(newSlug);\n onValueChange?.(newSlug);\n };\n\n const renderInput = (\n fieldValue: string | undefined,\n fieldOnChange?: (value: string) => void,\n isDisabled?: boolean,\n fieldState?: { invalid?: boolean; error?: RHFFieldError }\n ) => {\n return (\n <InputGroup>\n <InputGroupInput\n ref={ref}\n id={name}\n type=\"text\"\n disabled={isDisabled}\n placeholder={placeholder}\n value={fieldValue || \"\"}\n onChange={(e: ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n fieldOnChange?.(newValue);\n onValueChange?.(newValue);\n }}\n aria-invalid={fieldState?.invalid}\n className={inputClassName}\n />\n <InputGroupAddon align=\"inline-end\">\n <InputGroupButton\n type=\"button\"\n size=\"sm\"\n onClick={() => handleGenerate(fieldValue, fieldOnChange)}\n disabled={isDisabled || !sourceValue}\n title=\"Generate slug from source\"\n >\n <Wand2 className=\"h-4 w-4\" />\n Generate\n </InputGroupButton>\n </InputGroupAddon>\n </InputGroup>\n );\n };\n\n // With react-hook-form\n if (control && name) {\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState }) => (\n <Field\n className={className}\n data-disabled={disabled}\n data-invalid={fieldState.invalid}\n >\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-red-500 ml-1\">*</span>}\n </FieldLabel>\n )}\n {renderInput(field.value, field.onChange, disabled, fieldState)}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n {fieldState.invalid && fieldState.error && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n );\n }\n\n // Direct usage (without react-hook-form)\n const handleDirectChange = (newValue: string) => {\n onChange?.({ target: { value: newValue } });\n onValueChange?.(newValue);\n };\n\n return (\n <Field className={className} data-disabled={disabled}>\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-red-500 ml-1\">*</span>}\n </FieldLabel>\n )}\n {renderInput(value, handleDirectChange, disabled, { error })}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n {error && <FieldError errors={[error]} />}\n </Field>\n );\n}\n\nexport { SlugField };\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { cn } from \"../../utils\";\r\n\r\nexport interface FormErrorSummaryProps {\r\n /** Form errors object from react-hook-form */\r\n errors?: Record<string, unknown>;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Custom title text */\r\n title?: string;\r\n}\r\n\r\n// Helper to flatten nested errors\r\nconst flattenErrors = (\r\n errors: Record<string, unknown>,\r\n prefix = \"\"\r\n): Array<{ field: string; message: string }> => {\r\n const flattened: Array<{ field: string; message: string }> = [];\r\n\r\n Object.entries(errors).forEach(([key, value]) => {\r\n const path = prefix ? `${prefix}.${key}` : key;\r\n\r\n if (value && typeof value === \"object\" && \"message\" in value) {\r\n // This is an error object\r\n flattened.push({ field: path, message: String(value.message) });\r\n } else if (value && typeof value === \"object\") {\r\n // This is a nested object, recurse\r\n flattened.push(...flattenErrors(value as Record<string, unknown>, path));\r\n }\r\n });\r\n\r\n return flattened;\r\n};\r\n\r\n/**\r\n * FormErrorSummary - Displays a summary of form validation errors\r\n *\r\n * Takes react-hook-form errors object and displays all errors in a list.\r\n * Automatically flattens nested errors for complex form structures.\r\n */\r\nexport function FormErrorSummary({\r\n errors,\r\n className,\r\n title = \"Please fix the following errors:\",\r\n}: FormErrorSummaryProps) {\r\n if (!errors || Object.keys(errors).length === 0) {\r\n return null;\r\n }\r\n\r\n const errorList = flattenErrors(errors);\r\n\r\n if (errorList.length === 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"bg-destructive/15 p-3 rounded-md border border-destructive/20\",\r\n className\r\n )}\r\n >\r\n <h4 className=\"text-sm font-medium text-destructive mb-2\">{title}</h4>\r\n <ul className=\"text-sm text-destructive space-y-1\">\r\n {errorList.map(({ field, message }, index) => (\r\n <li key={`${field}-${index}`} className=\"flex items-start gap-2\">\r\n <span className=\"text-destructive\">•</span>\r\n <span>\r\n <strong>{field}:</strong> {message}\r\n </span>\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { Calendar } from \"@/components/ui/calendar\";\r\nimport {\r\n Popover,\r\n PopoverContent,\r\n PopoverTrigger,\r\n} from \"@/components/ui/popover\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { cn } from \"../../utils\";\r\nimport { CalendarIcon, X } from \"lucide-react\";\r\n\r\nexport interface DateRange {\r\n from?: Date;\r\n to?: Date;\r\n}\r\n\r\nexport interface DateRangeFilterProps {\r\n /** Initial start date */\r\n initialStartDate?: Date;\r\n /** Initial end date */\r\n initialEndDate?: Date;\r\n /** Callback when filter is applied (receives startDate, endDate) */\r\n onFilter?: (startDate: Date | null, endDate: Date | null) => void;\r\n /** Callback when filter is cleared */\r\n onClear?: () => void;\r\n /** Additional classes for the container */\r\n className?: string;\r\n /** Additional classes for trigger button */\r\n buttonClassName?: string;\r\n /** Placeholder text when no date selected */\r\n placeholder?: string;\r\n /** Minimum selectable date */\r\n minDate?: Date;\r\n /** Maximum selectable date */\r\n maxDate?: Date;\r\n /** Align popover to the right */\r\n alignRight?: boolean;\r\n /** Number of months to display */\r\n numberOfMonths?: number;\r\n}\r\n\r\n/**\r\n * DateRangeFilter - A date range picker for filtering\r\n *\r\n * Features:\r\n * - Only applies filter when explicitly submitted\r\n * - Supports clearing filters\r\n * - Uses Popover to show calendar on click\r\n * - Configurable min/max dates\r\n */\r\nexport function DateRangeFilter({\r\n initialStartDate,\r\n initialEndDate,\r\n onFilter,\r\n onClear,\r\n className,\r\n buttonClassName,\r\n placeholder = \"Pick a date range\",\r\n minDate,\r\n maxDate,\r\n alignRight = true,\r\n numberOfMonths = 1,\r\n}: DateRangeFilterProps) {\r\n // Internal state for range selection (before applying)\r\n const [dateRange, setDateRange] = React.useState<DateRange | undefined>(\r\n initialStartDate || initialEndDate\r\n ? { from: initialStartDate, to: initialEndDate }\r\n : undefined\r\n );\r\n\r\n // Applied state (shown on button)\r\n const [appliedRange, setAppliedRange] = React.useState(dateRange);\r\n\r\n // Popover open state\r\n const [open, setOpen] = React.useState(false);\r\n\r\n // Update state when props change\r\n React.useEffect(() => {\r\n const newRange =\r\n initialStartDate || initialEndDate\r\n ? { from: initialStartDate, to: initialEndDate }\r\n : undefined;\r\n setDateRange(newRange);\r\n setAppliedRange(newRange);\r\n }, [initialStartDate, initialEndDate]);\r\n\r\n // Handle applying the filter\r\n const handleApplyFilter = () => {\r\n setAppliedRange(dateRange);\r\n onFilter?.(dateRange?.from || null, dateRange?.to || null);\r\n setOpen(false);\r\n };\r\n\r\n // Handle clearing the filter\r\n const handleClearFilter = (e?: React.MouseEvent) => {\r\n e?.stopPropagation?.();\r\n setDateRange(undefined);\r\n setAppliedRange(undefined);\r\n onClear?.();\r\n setOpen(false);\r\n };\r\n\r\n // Format the display text\r\n const getDisplayText = () => {\r\n if (!appliedRange?.from && !appliedRange?.to) return placeholder;\r\n\r\n const formatDate = (date: Date) => {\r\n return date.toLocaleDateString(\"en-US\", {\r\n month: \"short\",\r\n day: \"numeric\",\r\n year: \"numeric\",\r\n });\r\n };\r\n\r\n if (appliedRange.from && appliedRange.to) {\r\n return `${formatDate(appliedRange.from)} - ${formatDate(appliedRange.to)}`;\r\n }\r\n if (appliedRange.from) return `From ${formatDate(appliedRange.from)}`;\r\n if (appliedRange.to) return `Until ${formatDate(appliedRange.to)}`;\r\n };\r\n\r\n return (\r\n <div className={className}>\r\n <Popover open={open} onOpenChange={setOpen}>\r\n <PopoverTrigger\r\n render={\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n className={cn(\r\n \"w-full justify-start font-normal\",\r\n !(appliedRange?.from || appliedRange?.to) &&\r\n \"text-muted-foreground\",\r\n buttonClassName\r\n )}\r\n >\r\n <CalendarIcon className=\"mr-2 h-4 w-4\" />\r\n {getDisplayText()}\r\n {(appliedRange?.from || appliedRange?.to) && (\r\n <X\r\n className=\"ml-auto h-4 w-4 opacity-50 hover:opacity-100\"\r\n onClick={handleClearFilter}\r\n />\r\n )}\r\n </Button>\r\n }\r\n />\r\n <PopoverContent\r\n className=\"w-auto p-0\"\r\n align={alignRight ? \"end\" : \"start\"}\r\n side=\"bottom\"\r\n >\r\n <div className=\"p-3 space-y-4\">\r\n <Calendar\r\n mode=\"range\"\r\n defaultMonth={dateRange?.from}\r\n selected={dateRange}\r\n onSelect={setDateRange}\r\n disabled={(date: Date) => {\r\n if (minDate && date < minDate) return true;\r\n if (maxDate && date > maxDate) return true;\r\n return false;\r\n }}\r\n numberOfMonths={numberOfMonths}\r\n initialFocus\r\n />\r\n\r\n {/* Action buttons */}\r\n <div className=\"flex justify-between gap-2 pt-2 border-t\">\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => handleClearFilter()}\r\n >\r\n Clear\r\n </Button>\r\n <Button\r\n type=\"button\"\r\n size=\"sm\"\r\n onClick={handleApplyFilter}\r\n disabled={!dateRange?.from && !dateRange?.to}\r\n >\r\n Apply Filter\r\n </Button>\r\n </div>\r\n </div>\r\n </PopoverContent>\r\n </Popover>\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { useState, ReactNode } from \"react\";\r\nimport { format, isValid } from \"date-fns\";\r\nimport { Controller, Control, FieldValues, FieldPath } from \"react-hook-form\";\r\nimport { Calendar } from \"@/components/ui/calendar\";\r\nimport {\r\n Popover,\r\n PopoverContent,\r\n PopoverTrigger,\r\n} from \"@/components/ui/popover\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { cn } from \"../../utils\";\r\nimport { CalendarIcon, X, LucideIcon } from \"lucide-react\";\r\nimport {\r\n Field,\r\n FieldLabel,\r\n FieldDescription,\r\n FieldError,\r\n} from \"@/components/ui/field\";\r\n\r\n// ============================================\r\n// Types\r\n// ============================================\r\n\r\nexport interface DateRangeValue {\r\n from?: Date | string;\r\n to?: Date | string;\r\n}\r\n\r\nexport interface DateRangeInputProps<TFieldValues extends FieldValues = FieldValues> {\r\n /** React Hook Form control */\r\n control?: Control<TFieldValues>;\r\n /** Field name for form registration */\r\n name: FieldPath<TFieldValues> | string;\r\n /** Field label */\r\n label?: string;\r\n /** Description text below the input */\r\n description?: string;\r\n /** Placeholder text */\r\n placeholder?: string;\r\n /** Whether the field is required */\r\n required?: boolean;\r\n /** Whether the field is disabled */\r\n disabled?: boolean;\r\n /** Additional className for the wrapper */\r\n className?: string;\r\n /** Additional className for the label */\r\n labelClassName?: string;\r\n /** Additional className for the button */\r\n buttonClassName?: string;\r\n /** Additional className for the calendar popover */\r\n calendarClassName?: string;\r\n /** Minimum selectable date */\r\n minDate?: Date;\r\n /** Maximum selectable date */\r\n maxDate?: Date;\r\n /** Array of disabled dates */\r\n disabledDates?: Date[];\r\n /** Array of disabled days (0-6, where 0 is Sunday) */\r\n disabledDays?: number[];\r\n /** Callback when value changes */\r\n onValueChange?: (range: DateRangeValue) => void;\r\n /** Custom validation function for date range */\r\n validateDateRange?: (range: DateRangeValue) => boolean;\r\n /** Function to clear form errors */\r\n clearErrors?: (name: string) => void;\r\n /** Custom description component */\r\n descriptionComponent?: ReactNode;\r\n /** Whether to show clear button */\r\n allowClear?: boolean;\r\n /** Whether to show badge with date range */\r\n showBadge?: boolean;\r\n /** Custom icon component */\r\n Icon?: LucideIcon;\r\n /** Transform functions for input/output */\r\n transform?: {\r\n input: (value: any) => DateRangeValue;\r\n output: (range: DateRangeValue) => any;\r\n };\r\n}\r\n\r\n// ============================================\r\n// Helper Components\r\n// ============================================\r\n\r\ninterface DateRangePopoverProps {\r\n dateRange: DateRangeValue;\r\n placeholder: string;\r\n disabled?: boolean;\r\n buttonClassName?: string;\r\n calendarClassName?: string;\r\n allowClear: boolean;\r\n showBadge: boolean;\r\n Icon: LucideIcon;\r\n formatDateRange: (range: DateRangeValue) => string;\r\n isDateDisabled: (date: Date) => boolean;\r\n handleDateRangeSelect: (range: DateRangeValue | undefined) => void;\r\n handleClear: (e: React.MouseEvent) => void;\r\n minDate?: Date;\r\n maxDate?: Date;\r\n}\r\n\r\nfunction DateRangePopover({\r\n dateRange,\r\n placeholder,\r\n disabled,\r\n buttonClassName,\r\n calendarClassName,\r\n allowClear,\r\n showBadge,\r\n Icon,\r\n formatDateRange,\r\n isDateDisabled,\r\n handleDateRangeSelect,\r\n handleClear,\r\n minDate,\r\n maxDate,\r\n}: DateRangePopoverProps) {\r\n const hasValue = dateRange?.from || dateRange?.to;\r\n\r\n return (\r\n <div className=\"relative w-full\">\r\n <Popover>\r\n <PopoverTrigger\r\n render={\r\n <Button\r\n type=\"button\"\r\n disabled={disabled}\r\n variant=\"outline\"\r\n className={cn(\r\n \"w-full justify-start gap-2 font-normal\",\r\n !hasValue && \"text-muted-foreground\",\r\n hasValue && allowClear && \"pr-10\",\r\n buttonClassName\r\n )}\r\n >\r\n <Icon className=\"h-4 w-4 shrink-0\" />\r\n {hasValue ? (\r\n <span className=\"flex-1 truncate text-left\">\r\n {formatDateRange(dateRange)}\r\n {showBadge && dateRange?.from && dateRange?.to && (() => {\r\n const from = dateRange.from instanceof Date ? dateRange.from : new Date(dateRange.from);\r\n const to = dateRange.to instanceof Date ? dateRange.to : new Date(dateRange.to);\r\n const days = Math.ceil((to.getTime() - from.getTime()) / (1000 * 60 * 60 * 24)) + 1;\r\n return (\r\n <span className=\"ml-2 text-xs bg-secondary text-secondary-foreground py-0.5 px-2 rounded-full\">\r\n {days} {days === 1 ? 'day' : 'days'}\r\n </span>\r\n );\r\n })()}\r\n </span>\r\n ) : (\r\n <span className=\"text-left\">{placeholder}</span>\r\n )}\r\n </Button>\r\n }\r\n />\r\n <PopoverContent\r\n className={cn(\"w-auto p-0\", calendarClassName)}\r\n align=\"start\"\r\n >\r\n <Calendar\r\n mode=\"range\"\r\n selected={dateRange as any}\r\n onSelect={handleDateRangeSelect as any}\r\n disabled={isDateDisabled}\r\n initialFocus\r\n {...(minDate && { fromDate: minDate })}\r\n {...(maxDate && { toDate: maxDate })}\r\n />\r\n <div className=\"p-3 border-t border-border\">\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={handleClear}\r\n disabled={!hasValue}\r\n className=\"w-full\"\r\n type=\"button\"\r\n >\r\n Clear Date Range\r\n </Button>\r\n </div>\r\n </PopoverContent>\r\n </Popover>\r\n\r\n {hasValue && allowClear && !disabled && (\r\n <button\r\n type=\"button\"\r\n onClick={handleClear}\r\n className=\"absolute right-2 top-1/2 -translate-y-1/2 p-1 rounded-sm hover:bg-muted transition-colors\"\r\n aria-label=\"Clear date range\"\r\n >\r\n <X className=\"h-4 w-4 text-muted-foreground hover:text-foreground\" />\r\n </button>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================\r\n// Main Component\r\n// ============================================\r\n\r\nconst defaultTransform = {\r\n input: (value: any): DateRangeValue =>\r\n value\r\n ? {\r\n from: value.from ? new Date(value.from) : undefined,\r\n to: value.to ? new Date(value.to) : undefined,\r\n }\r\n : { from: undefined, to: undefined },\r\n output: (range: DateRangeValue) => ({\r\n from: range?.from\r\n ? range.from instanceof Date\r\n ? range.from.toISOString()\r\n : range.from\r\n : undefined,\r\n to: range?.to\r\n ? range.to instanceof Date\r\n ? range.to.toISOString()\r\n : range.to\r\n : undefined,\r\n }),\r\n};\r\n\r\n/**\r\n * DateRangeInput - Date range picker with react-hook-form integration\r\n *\r\n * @example\r\n * ```tsx\r\n * <DateRangeInput\r\n * control={control}\r\n * name=\"dateRange\"\r\n * label=\"Select Dates\"\r\n * placeholder=\"Pick a date range\"\r\n * />\r\n * ```\r\n */\r\nexport function DateRangeInput<TFieldValues extends FieldValues = FieldValues>({\r\n control,\r\n name,\r\n label,\r\n description,\r\n placeholder = \"Select date range\",\r\n required,\r\n disabled,\r\n className,\r\n labelClassName,\r\n buttonClassName,\r\n calendarClassName,\r\n minDate,\r\n maxDate,\r\n disabledDates,\r\n disabledDays,\r\n onValueChange,\r\n validateDateRange,\r\n clearErrors,\r\n descriptionComponent,\r\n allowClear = true,\r\n showBadge = false,\r\n Icon = CalendarIcon,\r\n transform = defaultTransform,\r\n}: DateRangeInputProps<TFieldValues>) {\r\n const [localDateRange, setLocalDateRange] = useState<DateRangeValue>({\r\n from: undefined,\r\n to: undefined,\r\n });\r\n\r\n const formatDateRange = (range: DateRangeValue): string => {\r\n if (!range || (!range.from && !range.to)) return \"\";\r\n\r\n const fromDate = range.from instanceof Date ? range.from : range.from ? new Date(range.from) : null;\r\n const toDate = range.to instanceof Date ? range.to : range.to ? new Date(range.to) : null;\r\n\r\n const fromFormatted = fromDate && isValid(fromDate) ? format(fromDate, \"MMM d\") : \"\";\r\n const toFormatted = toDate && isValid(toDate) ? format(toDate, \"MMM d\") : \"\";\r\n\r\n if (fromFormatted && toFormatted) {\r\n return `${fromFormatted} - ${toFormatted}`;\r\n } else if (fromFormatted) {\r\n return `From ${fromFormatted}`;\r\n } else if (toFormatted) {\r\n return `Until ${toFormatted}`;\r\n }\r\n\r\n return \"\";\r\n };\r\n\r\n const isDateDisabled = (date: Date): boolean => {\r\n if (!date || !isValid(date)) return true;\r\n if (disabled) return true;\r\n if (minDate && date < minDate) return true;\r\n if (maxDate && date > maxDate) return true;\r\n if (disabledDates?.some((d) => d.getTime() === date.getTime())) return true;\r\n if (disabledDays?.includes(date.getDay())) return true;\r\n return false;\r\n };\r\n\r\n const handleDateRangeSelect = (\r\n range: DateRangeValue | undefined,\r\n field?: any\r\n ) => {\r\n if (disabled) return;\r\n\r\n const safeRange = range || { from: undefined, to: undefined };\r\n\r\n if (validateDateRange && !validateDateRange(safeRange)) {\r\n return;\r\n }\r\n\r\n if (field) {\r\n const transformedValue = transform.output(safeRange);\r\n field.onChange(transformedValue);\r\n } else {\r\n setLocalDateRange(safeRange);\r\n }\r\n\r\n onValueChange?.(safeRange);\r\n\r\n if (clearErrors && name) {\r\n clearErrors(name);\r\n }\r\n };\r\n\r\n const handleClear = (field: any | null, e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n\r\n const emptyRange = { from: undefined, to: undefined };\r\n\r\n if (field) {\r\n field.onChange(emptyRange);\r\n } else {\r\n setLocalDateRange(emptyRange);\r\n }\r\n\r\n onValueChange?.(emptyRange);\r\n\r\n if (clearErrors && name) {\r\n clearErrors(name);\r\n }\r\n };\r\n\r\n // With react-hook-form\r\n if (control) {\r\n return (\r\n <Controller\r\n control={control}\r\n name={name as FieldPath<TFieldValues>}\r\n render={({ field, fieldState }) => {\r\n const dateRange = transform.input(field.value);\r\n\r\n return (\r\n <Field\r\n className={cn(\"w-full\", className)}\r\n data-invalid={!!fieldState.error}\r\n >\r\n {label && (\r\n <div className=\"flex items-center gap-2 mb-2\">\r\n <FieldLabel className={cn(\"grow\", labelClassName)}>\r\n {label}\r\n {required && <span className=\"text-destructive ml-1\">*</span>}\r\n </FieldLabel>\r\n <span className=\"text-muted-foreground shrink-0\">\r\n <Icon className=\"h-4 w-4\" />\r\n </span>\r\n </div>\r\n )}\r\n\r\n <DateRangePopover\r\n dateRange={dateRange}\r\n placeholder={placeholder}\r\n disabled={disabled}\r\n buttonClassName={buttonClassName}\r\n calendarClassName={calendarClassName}\r\n allowClear={allowClear}\r\n showBadge={showBadge}\r\n Icon={Icon}\r\n formatDateRange={formatDateRange}\r\n isDateDisabled={isDateDisabled}\r\n handleDateRangeSelect={(range) =>\r\n handleDateRangeSelect(range, field)\r\n }\r\n handleClear={(e) => handleClear(field, e)}\r\n minDate={minDate}\r\n maxDate={maxDate}\r\n />\r\n\r\n {description && !descriptionComponent && (\r\n <FieldDescription>{description}</FieldDescription>\r\n )}\r\n\r\n {descriptionComponent && (\r\n <div className=\"text-sm text-muted-foreground\">\r\n {descriptionComponent}\r\n </div>\r\n )}\r\n\r\n <FieldError\r\n errors={fieldState.error ? [fieldState.error] : undefined}\r\n />\r\n </Field>\r\n );\r\n }}\r\n />\r\n );\r\n }\r\n\r\n // Standalone without form\r\n return (\r\n <div className={cn(\"w-full\", className)}>\r\n {label && (\r\n <div className=\"flex items-center gap-2 mb-2\">\r\n <div className={cn(\"text-sm font-medium grow\", labelClassName)}>\r\n {label}\r\n {required && <span className=\"text-destructive ml-1\">*</span>}\r\n </div>\r\n <span className=\"text-muted-foreground shrink-0\">\r\n <Icon className=\"h-4 w-4\" />\r\n </span>\r\n </div>\r\n )}\r\n\r\n <DateRangePopover\r\n dateRange={localDateRange}\r\n placeholder={placeholder}\r\n disabled={disabled}\r\n buttonClassName={buttonClassName}\r\n calendarClassName={calendarClassName}\r\n allowClear={allowClear}\r\n showBadge={showBadge}\r\n Icon={Icon}\r\n formatDateRange={formatDateRange}\r\n isDateDisabled={isDateDisabled}\r\n handleDateRangeSelect={(range) => handleDateRangeSelect(range)}\r\n handleClear={(e) => handleClear(null, e)}\r\n minDate={minDate}\r\n maxDate={maxDate}\r\n />\r\n\r\n {description && (\r\n <div className=\"text-sm text-muted-foreground mt-1\">{description}</div>\r\n )}\r\n\r\n {descriptionComponent && (\r\n <div className=\"text-sm text-muted-foreground\">{descriptionComponent}</div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { useState, useMemo, useCallback, ReactNode } from \"react\";\r\nimport {\r\n format,\r\n startOfMonth,\r\n endOfMonth,\r\n eachDayOfInterval,\r\n isSameMonth,\r\n isSameDay,\r\n addMonths,\r\n subMonths,\r\n getDay,\r\n} from \"date-fns\";\r\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { cn } from \"../utils\";\r\n\r\nconst WEEKDAYS = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\r\n\r\nexport interface CalendarEvent {\r\n id: string;\r\n date: Date | string;\r\n [key: string]: any;\r\n}\r\n\r\nexport interface EventCalendarProps<T extends CalendarEvent> {\r\n /** Events to display on the calendar */\r\n events?: T[];\r\n /** Currently selected date */\r\n selectedDate?: Date | null;\r\n /** Callback when a date is selected */\r\n onDateSelect?: (date: Date, events: T[]) => void;\r\n /** Callback when month changes */\r\n onMonthChange?: (date: Date) => void;\r\n /** Initial month to display */\r\n initialMonth?: Date;\r\n /** Custom render for day cell content */\r\n renderDayContent?: (date: Date, events: T[], isSelected: boolean) => ReactNode;\r\n /** Custom render for event indicators */\r\n renderEventIndicators?: (events: T[]) => ReactNode;\r\n /** Get events for a specific date (custom filtering) */\r\n getEventsForDate?: (date: Date, events: T[]) => T[];\r\n /** Additional class names */\r\n className?: string;\r\n /** Header content (left side) */\r\n headerLeft?: ReactNode;\r\n /** Header content (right side, before navigation) */\r\n headerRight?: ReactNode;\r\n /** Minimum cell height */\r\n minCellHeight?: string;\r\n /** Show week numbers */\r\n showWeekNumbers?: boolean;\r\n /** Loading state */\r\n isLoading?: boolean;\r\n}\r\n\r\n/**\r\n * EventCalendar - A reusable calendar component for displaying events\r\n *\r\n * Can be used for attendance tracking, scheduling, etc.\r\n */\r\nexport function EventCalendar<T extends CalendarEvent>({\r\n events = [],\r\n selectedDate: controlledSelectedDate,\r\n onDateSelect,\r\n onMonthChange,\r\n initialMonth = new Date(),\r\n renderDayContent,\r\n renderEventIndicators,\r\n getEventsForDate,\r\n className,\r\n headerLeft,\r\n headerRight,\r\n minCellHeight = \"5rem\",\r\n showWeekNumbers = false,\r\n isLoading = false,\r\n}: EventCalendarProps<T>) {\r\n const [currentMonth, setCurrentMonth] = useState(initialMonth);\r\n const [internalSelectedDate, setInternalSelectedDate] = useState<Date | null>(null);\r\n\r\n const selectedDate = controlledSelectedDate ?? internalSelectedDate;\r\n\r\n // Generate days for the current month\r\n // Always render 6 rows (42 cells) for consistent layout\r\n const { days, paddingDaysBefore, paddingDaysAfter } = useMemo(() => {\r\n const monthStart = startOfMonth(currentMonth);\r\n const monthEnd = endOfMonth(currentMonth);\r\n const daysInMonth = eachDayOfInterval({ start: monthStart, end: monthEnd });\r\n const startDayOfWeek = getDay(monthStart);\r\n\r\n // Calculate total cells needed (always 6 rows = 42 cells)\r\n const totalCells = 42;\r\n const usedCells = startDayOfWeek + daysInMonth.length;\r\n const trailingPadding = totalCells - usedCells;\r\n\r\n return {\r\n days: daysInMonth,\r\n paddingDaysBefore: startDayOfWeek,\r\n paddingDaysAfter: trailingPadding,\r\n };\r\n }, [currentMonth]);\r\n\r\n // Default event filtering by date\r\n const defaultGetEventsForDate = useCallback(\r\n (date: Date, allEvents: T[]): T[] => {\r\n return allEvents.filter((event) => {\r\n const eventDate = typeof event.date === \"string\" ? new Date(event.date) : event.date;\r\n return isSameDay(eventDate, date);\r\n });\r\n },\r\n []\r\n );\r\n\r\n const getEvents = getEventsForDate || defaultGetEventsForDate;\r\n\r\n // Navigation handlers\r\n const handlePrevMonth = useCallback(() => {\r\n const newMonth = subMonths(currentMonth, 1);\r\n setCurrentMonth(newMonth);\r\n onMonthChange?.(newMonth);\r\n }, [currentMonth, onMonthChange]);\r\n\r\n const handleNextMonth = useCallback(() => {\r\n const newMonth = addMonths(currentMonth, 1);\r\n setCurrentMonth(newMonth);\r\n onMonthChange?.(newMonth);\r\n }, [currentMonth, onMonthChange]);\r\n\r\n // Date selection handler\r\n const handleDateClick = useCallback(\r\n (date: Date) => {\r\n const dayEvents = getEvents(date, events);\r\n setInternalSelectedDate(date);\r\n onDateSelect?.(date, dayEvents);\r\n },\r\n [events, getEvents, onDateSelect]\r\n );\r\n\r\n // Default event indicators\r\n const defaultRenderEventIndicators = useCallback((dayEvents: T[]) => {\r\n if (dayEvents.length === 0) return null;\r\n\r\n return (\r\n <div className=\"flex gap-0.5 mt-1\">\r\n {dayEvents.slice(0, 3).map((_, idx) => (\r\n <div\r\n key={idx}\r\n className=\"h-1.5 w-1.5 rounded-full bg-primary\"\r\n />\r\n ))}\r\n {dayEvents.length > 3 && (\r\n <span className=\"text-[10px] text-muted-foreground ml-0.5\">\r\n +{dayEvents.length - 3}\r\n </span>\r\n )}\r\n </div>\r\n );\r\n }, []);\r\n\r\n const renderIndicators = renderEventIndicators || defaultRenderEventIndicators;\r\n\r\n return (\r\n <div className={cn(\"space-y-4\", className)}>\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-4\">\r\n {headerLeft}\r\n <h2 className=\"text-lg font-semibold\">\r\n {format(currentMonth, \"MMMM yyyy\")}\r\n </h2>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n {headerRight}\r\n <div className=\"flex gap-1\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n onClick={handlePrevMonth}\r\n disabled={isLoading}\r\n >\r\n <ChevronLeft className=\"h-4 w-4\" />\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n onClick={handleNextMonth}\r\n disabled={isLoading}\r\n >\r\n <ChevronRight className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Calendar Grid */}\r\n <div className=\"rounded-lg border overflow-hidden\">\r\n {/* Weekday headers */}\r\n <div\r\n className={cn(\r\n \"grid bg-muted/50\",\r\n showWeekNumbers ? \"grid-cols-8\" : \"grid-cols-7\"\r\n )}\r\n >\r\n {showWeekNumbers && (\r\n <div className=\"px-2 py-3 text-center text-xs font-medium text-muted-foreground border-r\">\r\n Wk\r\n </div>\r\n )}\r\n {WEEKDAYS.map((day) => (\r\n <div\r\n key={day}\r\n className=\"px-2 py-3 text-center text-xs font-medium text-muted-foreground\"\r\n >\r\n {day}\r\n </div>\r\n ))}\r\n </div>\r\n\r\n {/* Days grid - always 6 rows for consistent layout */}\r\n <div\r\n className={cn(\r\n \"grid gap-px bg-border\",\r\n showWeekNumbers ? \"grid-cols-8\" : \"grid-cols-7\"\r\n )}\r\n >\r\n {/* Padding cells for start of month */}\r\n {Array.from({ length: paddingDaysBefore }).map((_, index) => (\r\n <div\r\n key={`padding-start-${index}`}\r\n className=\"bg-card\"\r\n style={{ minHeight: minCellHeight }}\r\n />\r\n ))}\r\n\r\n {/* Day cells */}\r\n {days.map((day) => {\r\n const dayEvents = getEvents(day, events);\r\n const isToday = isSameDay(day, new Date());\r\n const isSelected = selectedDate ? isSameDay(day, selectedDate) : false;\r\n const isCurrentMonth = isSameMonth(day, currentMonth);\r\n\r\n return (\r\n <div\r\n key={day.toISOString()}\r\n className={cn(\r\n \"bg-card p-2 cursor-pointer transition-colors hover:bg-muted/50\",\r\n isSelected && \"ring-2 ring-primary ring-inset bg-primary/5\",\r\n !isCurrentMonth && \"opacity-50\",\r\n isLoading && \"pointer-events-none opacity-50\"\r\n )}\r\n style={{ minHeight: minCellHeight }}\r\n onClick={() => handleDateClick(day)}\r\n >\r\n {renderDayContent ? (\r\n renderDayContent(day, dayEvents, isSelected)\r\n ) : (\r\n <>\r\n <div\r\n className={cn(\r\n \"flex h-7 w-7 items-center justify-center rounded-full text-sm\",\r\n isToday && \"bg-primary text-primary-foreground font-semibold\"\r\n )}\r\n >\r\n {format(day, \"d\")}\r\n </div>\r\n {renderIndicators(dayEvents)}\r\n </>\r\n )}\r\n </div>\r\n );\r\n })}\r\n\r\n {/* Padding cells for end of month (to fill 6 rows) */}\r\n {Array.from({ length: paddingDaysAfter }).map((_, index) => (\r\n <div\r\n key={`padding-end-${index}`}\r\n className=\"bg-card\"\r\n style={{ minHeight: minCellHeight }}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * CalendarDayDetail - Side panel component for showing selected day details\r\n */\r\nexport interface CalendarDayDetailProps {\r\n date: Date | null;\r\n title?: string;\r\n emptyMessage?: string;\r\n children?: ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function CalendarDayDetail({\r\n date,\r\n title,\r\n emptyMessage = \"Click on a day to see details\",\r\n children,\r\n className,\r\n}: CalendarDayDetailProps) {\r\n return (\r\n <div className={cn(\"rounded-lg border bg-card\", className)}>\r\n <div className=\"p-4 border-b\">\r\n <h3 className=\"font-semibold\">\r\n {date ? format(date, \"EEEE, MMMM d\") : title || \"Select a day\"}\r\n </h3>\r\n </div>\r\n <div className=\"p-4\">\r\n {!date ? (\r\n <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>\r\n ) : (\r\n children\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * CalendarWithDetail - Calendar with integrated detail panel\r\n */\r\nexport interface CalendarWithDetailProps<T extends CalendarEvent>\r\n extends Omit<EventCalendarProps<T>, \"onDateSelect\"> {\r\n /** Render detail panel content */\r\n renderDetail?: (date: Date, events: T[]) => ReactNode;\r\n /** Detail panel title when no date selected */\r\n detailTitle?: string;\r\n /** Detail panel empty message */\r\n detailEmptyMessage?: string;\r\n /** Layout direction */\r\n layout?: \"horizontal\" | \"vertical\";\r\n /** Detail panel position */\r\n detailPosition?: \"left\" | \"right\" | \"top\" | \"bottom\";\r\n /** Callback when date is selected */\r\n onDateSelect?: (date: Date, events: T[]) => void;\r\n}\r\n\r\nexport function CalendarWithDetail<T extends CalendarEvent>({\r\n renderDetail,\r\n detailTitle,\r\n detailEmptyMessage,\r\n layout = \"horizontal\",\r\n detailPosition = \"right\",\r\n onDateSelect,\r\n ...calendarProps\r\n}: CalendarWithDetailProps<T>) {\r\n const [selectedDate, setSelectedDate] = useState<Date | null>(null);\r\n const [selectedEvents, setSelectedEvents] = useState<T[]>([]);\r\n\r\n const handleDateSelect = useCallback(\r\n (date: Date, events: T[]) => {\r\n setSelectedDate(date);\r\n setSelectedEvents(events);\r\n onDateSelect?.(date, events);\r\n },\r\n [onDateSelect]\r\n );\r\n\r\n const isHorizontal = layout === \"horizontal\";\r\n const detailFirst = detailPosition === \"left\" || detailPosition === \"top\";\r\n\r\n const calendarElement = (\r\n <EventCalendar\r\n {...calendarProps}\r\n selectedDate={selectedDate}\r\n onDateSelect={handleDateSelect}\r\n />\r\n );\r\n\r\n const detailElement = (\r\n <CalendarDayDetail\r\n date={selectedDate}\r\n title={detailTitle}\r\n emptyMessage={detailEmptyMessage}\r\n className={isHorizontal ? \"min-w-[300px]\" : \"\"}\r\n >\r\n {selectedDate && renderDetail?.(selectedDate, selectedEvents)}\r\n </CalendarDayDetail>\r\n );\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"gap-4\",\r\n isHorizontal ? \"flex\" : \"flex flex-col\",\r\n isHorizontal && \"items-start\"\r\n )}\r\n >\r\n {detailFirst ? (\r\n <>\r\n {detailElement}\r\n <div className=\"flex-1\">{calendarElement}</div>\r\n </>\r\n ) : (\r\n <>\r\n <div className={isHorizontal ? \"flex-1\" : \"\"}>{calendarElement}</div>\r\n {detailElement}\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport {\r\n type ReactNode,\r\n type ElementType,\r\n type RefObject,\r\n useState,\r\n useEffect,\r\n useRef,\r\n createElement,\r\n Children,\r\n Fragment,\r\n} from \"react\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/** Available entrance animation types */\r\ntype Animation =\r\n | \"fadeIn\"\r\n | \"fadeInUp\"\r\n | \"scaleIn\"\r\n | \"slideInLeft\"\r\n | \"slideInRight\"\r\n | \"slideInUp\"\r\n | \"slideInDown\";\r\n\r\n/** Slide direction for SlideIn component */\r\ntype SlideDirection = \"left\" | \"right\" | \"up\" | \"down\";\r\n\r\n/** Options for the useInView hook */\r\ninterface UseInViewOptions {\r\n /** IntersectionObserver rootMargin (default: \"0px\") */\r\n margin?: string;\r\n /** Trigger only once (default: true) */\r\n once?: boolean;\r\n /** Enable/disable observation (default: true) */\r\n enabled?: boolean;\r\n}\r\n\r\n/** Shared base props for animation components */\r\ninterface AnimateBaseProps {\r\n children?: ReactNode;\r\n /** Delay in ms before animation starts */\r\n delay?: number;\r\n /** Animation duration in ms */\r\n duration?: number;\r\n /** Only animate when element scrolls into viewport */\r\n inView?: boolean;\r\n /** IntersectionObserver rootMargin for inView trigger */\r\n inViewMargin?: string;\r\n /** Fire animation only once (default: true) */\r\n once?: boolean;\r\n /** Disable animation entirely — renders children immediately */\r\n disabled?: boolean;\r\n className?: string;\r\n /** HTML element to render as (default: \"div\") */\r\n as?: ElementType;\r\n}\r\n\r\ninterface SlideInProps extends AnimateBaseProps {\r\n /** Direction to slide from */\r\n direction?: SlideDirection;\r\n}\r\n\r\ninterface StaggerChildrenProps {\r\n children?: ReactNode;\r\n /** Animation type for each child */\r\n animation?: Animation;\r\n /** Delay between each child in ms */\r\n staggerDelay?: number;\r\n /** Initial delay before first child animates */\r\n initialDelay?: number;\r\n /** Duration per child animation */\r\n duration?: number;\r\n inView?: boolean;\r\n inViewMargin?: string;\r\n once?: boolean;\r\n disabled?: boolean;\r\n className?: string;\r\n /** Extra classes applied to each child wrapper div */\r\n childClassName?: string;\r\n as?: ElementType;\r\n}\r\n\r\ninterface AnimatedTextProps {\r\n /** The text string to animate */\r\n text: string;\r\n as?: ElementType;\r\n animation?: Animation;\r\n /** Split text by word or character */\r\n splitBy?: \"word\" | \"character\";\r\n /** Delay between each segment in ms */\r\n staggerDelay?: number;\r\n delay?: number;\r\n duration?: number;\r\n inView?: boolean;\r\n inViewMargin?: string;\r\n once?: boolean;\r\n disabled?: boolean;\r\n className?: string;\r\n /** Extra classes on each animated text segment */\r\n segmentClassName?: string;\r\n}\r\n\r\ninterface AnimatedCounterProps {\r\n /** Start value (default: 0) */\r\n from?: number;\r\n /** Target value to count to */\r\n to: number;\r\n /** Count-up duration in ms (default: 2000) */\r\n duration?: number;\r\n /** Delay before counting starts in ms */\r\n delay?: number;\r\n /** Intl.NumberFormat locale for number formatting (e.g. \"en-US\") */\r\n locale?: string;\r\n /** Text rendered before the number */\r\n prefix?: string;\r\n /** Text rendered after the number */\r\n suffix?: string;\r\n /** Decimal places (default: 0) */\r\n decimals?: number;\r\n /** Custom number formatter — overrides locale/decimals */\r\n formatter?: (value: number) => string;\r\n inView?: boolean;\r\n inViewMargin?: string;\r\n once?: boolean;\r\n disabled?: boolean;\r\n className?: string;\r\n as?: ElementType;\r\n}\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\n/** Tailwind utility class for each animation — presence in dist ensures @keyframes emission via @source */\r\nconst ANIMATION_CLASSES: Record<Animation, string> = {\r\n fadeIn: \"animate-fade-in\",\r\n fadeInUp: \"animate-fade-in-up\",\r\n scaleIn: \"animate-scale-in\",\r\n slideInLeft: \"animate-slide-in-left\",\r\n slideInRight: \"animate-slide-in-right\",\r\n slideInUp: \"animate-slide-in-up\",\r\n slideInDown: \"animate-slide-in-down\",\r\n};\r\n\r\nconst SLIDE_MAP: Record<SlideDirection, Animation> = {\r\n left: \"slideInLeft\",\r\n right: \"slideInRight\",\r\n up: \"slideInUp\",\r\n down: \"slideInDown\",\r\n};\r\n\r\n// ============================================================================\r\n// Hooks\r\n// ============================================================================\r\n\r\n/**\r\n * useInView — observe when an element enters the viewport.\r\n *\r\n * @example\r\n * ```tsx\r\n * const ref = useRef<HTMLDivElement>(null);\r\n * const isInView = useInView(ref, { once: true, margin: \"-100px\" });\r\n * return <div ref={ref}>{isInView ? \"Visible!\" : \"Hidden\"}</div>;\r\n * ```\r\n */\r\nfunction useInView(\r\n ref: RefObject<Element | null>,\r\n options: UseInViewOptions = {},\r\n): boolean {\r\n const { margin = \"0px\", once = true, enabled = true } = options;\r\n const [inView, setInView] = useState(false);\r\n\r\n useEffect(() => {\r\n if (!enabled) return;\r\n const el = ref.current;\r\n if (!el) return;\r\n\r\n const observer = new IntersectionObserver(\r\n ([entry]) => {\r\n if (entry.isIntersecting) {\r\n setInView(true);\r\n if (once) observer.unobserve(el);\r\n } else if (!once) {\r\n setInView(false);\r\n }\r\n },\r\n { rootMargin: margin },\r\n );\r\n\r\n observer.observe(el);\r\n return () => observer.disconnect();\r\n }, [enabled, margin, once]);\r\n\r\n return inView;\r\n}\r\n\r\n// ============================================================================\r\n// Internal helpers\r\n// ============================================================================\r\n\r\nfunction useAnimationState(opts: {\r\n inView?: boolean;\r\n inViewMargin?: string;\r\n once?: boolean;\r\n disabled?: boolean;\r\n}) {\r\n const ref = useRef<HTMLElement>(null);\r\n const shouldAnimate = !opts.disabled;\r\n const isInView = useInView(ref, {\r\n margin: opts.inViewMargin,\r\n once: opts.once,\r\n enabled: !!opts.inView && shouldAnimate,\r\n });\r\n // active = should render animation classes right now\r\n const active = shouldAnimate && (!opts.inView || isInView);\r\n\r\n return { ref, shouldAnimate, active };\r\n}\r\n\r\n/** Per-instance timing overrides — only emitted when different from theme defaults */\r\nfunction animTimingStyle(delay: number, duration: number) {\r\n if (delay === 0 && duration === 600) return undefined;\r\n return {\r\n ...(duration !== 600 ? { animationDuration: `${duration}ms` } : {}),\r\n ...(delay > 0 ? { animationDelay: `${delay}ms` } : {}),\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Core: AnimateBase (internal — shared by all convenience components)\r\n// ============================================================================\r\n\r\nfunction AnimateBase({\r\n animation,\r\n children,\r\n delay = 0,\r\n duration = 600,\r\n inView = false,\r\n inViewMargin,\r\n once = true,\r\n disabled = false,\r\n className,\r\n as = \"div\",\r\n}: AnimateBaseProps & { animation: Animation }) {\r\n const { ref, shouldAnimate, active } = useAnimationState({\r\n inView,\r\n inViewMargin,\r\n once,\r\n disabled,\r\n });\r\n\r\n return createElement(\r\n as,\r\n {\r\n ref,\r\n \"data-fluid-animate\": shouldAnimate ? \"\" : undefined,\r\n className: cn(\r\n shouldAnimate && \"opacity-0\",\r\n active && ANIMATION_CLASSES[animation],\r\n className,\r\n ),\r\n style: active ? animTimingStyle(delay, duration) : undefined,\r\n },\r\n children,\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// Convenience Components\r\n// ============================================================================\r\n\r\n/** Fade in with opacity transition */\r\nfunction FadeIn(props: AnimateBaseProps) {\r\n return <AnimateBase animation=\"fadeIn\" {...props} />;\r\n}\r\n\r\n/** Fade in with upward motion */\r\nfunction FadeInUp(props: AnimateBaseProps) {\r\n return <AnimateBase animation=\"fadeInUp\" {...props} />;\r\n}\r\n\r\n/** Scale up into view */\r\nfunction ScaleIn(props: AnimateBaseProps) {\r\n return <AnimateBase animation=\"scaleIn\" {...props} />;\r\n}\r\n\r\n/** Slide in from a specified direction */\r\nfunction SlideIn({ direction = \"left\", ...props }: SlideInProps) {\r\n return <AnimateBase animation={SLIDE_MAP[direction]} {...props} />;\r\n}\r\n\r\n// ============================================================================\r\n// StaggerChildren — sequential reveal for lists / grids\r\n// ============================================================================\r\n\r\nfunction StaggerChildren({\r\n children,\r\n animation = \"fadeInUp\",\r\n staggerDelay = 100,\r\n initialDelay = 0,\r\n duration = 600,\r\n inView = false,\r\n inViewMargin,\r\n once = true,\r\n disabled = false,\r\n className,\r\n childClassName,\r\n as = \"div\",\r\n}: StaggerChildrenProps) {\r\n const { ref, shouldAnimate, active } = useAnimationState({\r\n inView,\r\n inViewMargin,\r\n once,\r\n disabled,\r\n });\r\n const items = Children.toArray(children);\r\n\r\n return createElement(\r\n as,\r\n { ref, className },\r\n items.map((child, i) => (\r\n <div\r\n key={i}\r\n data-fluid-animate={shouldAnimate ? \"\" : undefined}\r\n className={cn(\r\n shouldAnimate && \"opacity-0\",\r\n active && ANIMATION_CLASSES[animation],\r\n childClassName,\r\n )}\r\n style={\r\n active\r\n ? animTimingStyle(initialDelay + i * staggerDelay, duration)\r\n : undefined\r\n }\r\n >\r\n {child}\r\n </div>\r\n )),\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// AnimatedText — word-by-word or character-by-character reveal\r\n// ============================================================================\r\n\r\nfunction AnimatedText({\r\n text,\r\n as = \"div\",\r\n animation = \"fadeInUp\",\r\n splitBy = \"word\",\r\n staggerDelay = 80,\r\n delay = 0,\r\n duration = 600,\r\n inView = false,\r\n inViewMargin,\r\n once = true,\r\n disabled = false,\r\n className,\r\n segmentClassName,\r\n}: AnimatedTextProps) {\r\n const { ref, shouldAnimate, active } = useAnimationState({\r\n inView,\r\n inViewMargin,\r\n once,\r\n disabled,\r\n });\r\n\r\n const segments = splitBy === \"word\" ? text.split(\" \") : text.split(\"\");\r\n let animIndex = 0;\r\n\r\n return createElement(\r\n as,\r\n { ref, className },\r\n segments.map((segment, i) => {\r\n // Preserve spaces in character mode without animating them\r\n if (splitBy === \"character\" && segment === \" \") {\r\n return <Fragment key={i}>{\"\\u00A0\"}</Fragment>;\r\n }\r\n\r\n const idx = animIndex++;\r\n\r\n return (\r\n <Fragment key={i}>\r\n {splitBy === \"word\" && i > 0 && \" \"}\r\n <span\r\n data-fluid-animate={shouldAnimate ? \"\" : undefined}\r\n className={cn(\r\n \"inline-block\",\r\n shouldAnimate && \"opacity-0\",\r\n active && ANIMATION_CLASSES[animation],\r\n segmentClassName,\r\n )}\r\n style={\r\n active\r\n ? animTimingStyle(delay + idx * staggerDelay, duration)\r\n : undefined\r\n }\r\n >\r\n {segment}\r\n </span>\r\n </Fragment>\r\n );\r\n }),\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// AnimatedCounter — count up with easing\r\n// ============================================================================\r\n\r\nfunction easeOutCubic(t: number): number {\r\n return 1 - Math.pow(1 - t, 3);\r\n}\r\n\r\nfunction AnimatedCounter({\r\n from = 0,\r\n to,\r\n duration = 2000,\r\n delay = 0,\r\n locale,\r\n prefix,\r\n suffix,\r\n decimals = 0,\r\n formatter,\r\n inView = false,\r\n inViewMargin,\r\n once = true,\r\n disabled = false,\r\n className,\r\n as = \"span\",\r\n}: AnimatedCounterProps) {\r\n const ref = useRef<HTMLElement>(null);\r\n const isInView = useInView(ref, {\r\n margin: inViewMargin,\r\n once,\r\n enabled: inView && !disabled,\r\n });\r\n const active = !disabled && (!inView || isInView);\r\n const [count, setCount] = useState(from);\r\n const hasStarted = useRef(false);\r\n\r\n useEffect(() => {\r\n if (disabled) {\r\n setCount(to);\r\n return;\r\n }\r\n\r\n if (!active || hasStarted.current) return;\r\n hasStarted.current = true;\r\n\r\n // Respect reduced motion for JS-driven animation\r\n if (typeof window !== \"undefined\" && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches) {\r\n setCount(to);\r\n return;\r\n }\r\n\r\n const timeout = setTimeout(() => {\r\n const start = performance.now();\r\n const step = (now: number) => {\r\n const elapsed = now - start;\r\n const progress = Math.min(elapsed / duration, 1);\r\n const eased = easeOutCubic(progress);\r\n const current = from + (to - from) * eased;\r\n setCount(\r\n decimals > 0\r\n ? Number(current.toFixed(decimals))\r\n : Math.round(current),\r\n );\r\n if (progress < 1) requestAnimationFrame(step);\r\n };\r\n requestAnimationFrame(step);\r\n }, delay);\r\n\r\n return () => clearTimeout(timeout);\r\n }, [active, disabled, from, to, duration, delay, decimals]);\r\n\r\n const formatValue = (v: number): string => {\r\n if (formatter) return formatter(v);\r\n if (locale)\r\n return v.toLocaleString(locale, {\r\n minimumFractionDigits: decimals,\r\n maximumFractionDigits: decimals,\r\n });\r\n if (decimals > 0) return v.toFixed(decimals);\r\n return String(v);\r\n };\r\n\r\n return createElement(\r\n as,\r\n { ref, className },\r\n <>\r\n {prefix}\r\n {formatValue(count)}\r\n {suffix}\r\n </>,\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// Exports\r\n// ============================================================================\r\n\r\nexport {\r\n // Components\r\n FadeIn,\r\n FadeInUp,\r\n SlideIn,\r\n ScaleIn,\r\n StaggerChildren,\r\n AnimatedText,\r\n AnimatedCounter,\r\n // Hook\r\n useInView,\r\n};\r\n\r\nexport type {\r\n Animation,\r\n SlideDirection,\r\n UseInViewOptions,\r\n AnimateBaseProps,\r\n SlideInProps,\r\n StaggerChildrenProps,\r\n AnimatedTextProps,\r\n AnimatedCounterProps,\r\n};\r\n"]}
1
+ {"version":3,"sources":["../src/lib/storage.ts","../src/lib/filter-utils.ts","../src/hooks/use-base-search.ts","../src/hooks/use-media-query.ts","../src/hooks/use-scroll-detection.ts","../src/hooks/use-debounce.ts","../src/hooks/use-copy-to-clipboard.ts","../src/hooks/use-local-storage.ts","../src/components/accordion-wrapper.tsx","../src/components/display-heading.tsx","../src/components/social-icons.tsx","../src/components/thumbnail.tsx","../src/components/custom-pagination.tsx","../src/components/api-pagination.tsx","../src/components/card-wrapper.tsx","../src/components/skeleton-wrappers.tsx","../src/components/collapsible-wrapper.tsx","../src/components/confirm-dialog.tsx","../src/components/error-state.tsx","../src/components/empty-state.tsx","../src/components/loading-state.tsx","../src/components/status-banner.tsx","../src/components/stepper.tsx","../src/components/copy-button.tsx","../src/components/data-table.tsx","../src/components/dialog-wrapper.tsx","../src/components/dropdown-wrapper.tsx","../src/components/info-row.tsx","../src/components/item-helpers.tsx","../src/components/mode-toggle.tsx","../src/components/phone-input.tsx","../src/components/pill.tsx","../src/components/tabs-wrapper.tsx","../src/components/responsive-split-layout.tsx","../src/components/table-wrapper.tsx","../src/components/tooltip-wrapper.tsx","../src/components/form/form-input.tsx","../src/components/form/form-textarea.tsx","../src/components/form/select-input.tsx","../src/components/form/checkbox-input.tsx","../src/components/form/radio-input.tsx","../src/components/form/switch-input.tsx","../src/components/form/date-input.tsx","../src/components/form/tag-input.tsx","../src/components/form/tag-choice-input.tsx","../src/components/form/combobox-input.tsx","../src/components/form/slug-field.tsx","../src/components/form/form-error-summary.tsx","../src/components/form/date-range-filter.tsx","../src/components/form/date-range-input.tsx","../src/components/event-calendar.tsx","../src/components/animated-wrapper.tsx"],"names":["useState","useCallback","useEffect","useRef","AccordionSection","FaqAccordion","jsxs","jsx","Fragment","_","React","Button","Loader2","AlertTriangle","AlertCircle","React2","StepCircle","StepConnector","Check","ScrollButton","TableRow","TableCell","Table","TableHeader","TableHead","TableBody","ChevronDown","React5","IconItemMedia","FeatureItem","React6","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuRadioGroup","DropdownMenuRadioItem","React7","country","ScrollArea","memo","TabsWrapper","useMemo","TabTrigger","TabContent","DynamicTabs","InputGroup","InputGroupAddon","InputGroupInput","Field","FieldLabel","FieldDescription","Controller","FieldError","dt","Popover","PopoverTrigger","X","PopoverContent","Badge","FieldContent","TagIcon","Input","BaseComboboxInput","React8","CalendarIcon","Calendar","toDate","format","ChevronLeft","ChevronRight"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * A utility module for handling localStorage operations with error handling and SSR safety\r\n */\r\n\r\n/**\r\n * Gets an item from localStorage with parsing and expiry check\r\n * @param {string} key - The key to retrieve from localStorage\r\n * @param {any} defaultValue - Default value to return if key doesn't exist or on error\r\n * @returns {any} The parsed value or defaultValue\r\n */\r\nexport const getStorageItem = <T>(\r\n key: string,\r\n defaultValue: T | null = null,\r\n): T | null => {\r\n if (typeof window === \"undefined\") return defaultValue;\r\n\r\n try {\r\n const item = window.localStorage.getItem(key);\r\n if (!item) return defaultValue;\r\n\r\n const parsed = JSON.parse(item);\r\n\r\n // Check if item has expiry\r\n if (parsed && typeof parsed === \"object\" && parsed.__expiresAt) {\r\n const now = Date.now();\r\n if (now > parsed.__expiresAt) {\r\n // Item has expired, remove it\r\n window.localStorage.removeItem(key);\r\n return defaultValue;\r\n }\r\n // Return the actual value without the expiry metadata\r\n return parsed.value;\r\n }\r\n\r\n return parsed;\r\n } catch (error) {\r\n console.error(`Error reading localStorage key \"${key}\":`, error);\r\n return defaultValue;\r\n }\r\n};\r\n\r\n/**\r\n * Sets an item in localStorage with serialization and optional expiry\r\n * @param {string} key - The key to set in localStorage\r\n * @param {any} value - The value to serialize and store\r\n * @param {number} [ttl] - Time to live in milliseconds (optional)\r\n * @returns {boolean} Success status\r\n */\r\nexport const setStorageItem = <T>(\r\n key: string,\r\n value: T,\r\n ttl: number | null = null,\r\n): boolean => {\r\n if (typeof window === \"undefined\") return false;\r\n\r\n try {\r\n let itemToStore: any = value;\r\n\r\n // If TTL is provided, wrap value with expiry metadata\r\n if (ttl && typeof ttl === \"number\" && ttl > 0) {\r\n itemToStore = {\r\n value,\r\n __expiresAt: Date.now() + ttl,\r\n };\r\n }\r\n\r\n window.localStorage.setItem(key, JSON.stringify(itemToStore));\r\n return true;\r\n } catch (error) {\r\n console.error(`Error setting localStorage key \"${key}\":`, error);\r\n return false;\r\n }\r\n};\r\n\r\n/**\r\n * Removes an item from localStorage\r\n * @param {string} key - The key to remove from localStorage\r\n * @returns {boolean} Success status\r\n */\r\nexport const removeStorageItem = (key: string): boolean => {\r\n if (typeof window === \"undefined\") return false;\r\n\r\n try {\r\n window.localStorage.removeItem(key);\r\n return true;\r\n } catch (error) {\r\n console.error(`Error removing localStorage key \"${key}\":`, error);\r\n return false;\r\n }\r\n};\r\n\r\n/**\r\n * Clears all items from localStorage\r\n * @returns {boolean} Success status\r\n */\r\nexport const clearStorage = (): boolean => {\r\n if (typeof window === \"undefined\") return false;\r\n\r\n try {\r\n window.localStorage.clear();\r\n return true;\r\n } catch (error) {\r\n console.error(\"Error clearing localStorage:\", error);\r\n return false;\r\n }\r\n};\r\n\r\n/**\r\n * Checks if localStorage is empty for a specific key\r\n * @param {string} key - The key to check in localStorage\r\n * @returns {boolean} True if empty or doesn't exist\r\n */\r\nexport const isStorageEmpty = (key: string): boolean => {\r\n const data = getStorageItem(key);\r\n return !data || (Array.isArray(data) && data.length === 0);\r\n};\r\n\r\n/**\r\n * Generates a UUID (v4)\r\n * Uses crypto.randomUUID() when available, with a fallback for older environments.\r\n * @returns {string} A random UUID\r\n */\r\nexport const generateUUID = (): string => {\r\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\r\n return crypto.randomUUID();\r\n }\r\n // Fallback for environments without crypto.randomUUID\r\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n};\r\n\r\n/**\r\n * Common expiry durations in milliseconds\r\n */\r\nexport const TTL = {\r\n MINUTE: 60 * 1000,\r\n HOUR: 60 * 60 * 1000,\r\n DAY: 24 * 60 * 60 * 1000,\r\n WEEK: 7 * 24 * 60 * 60 * 1000,\r\n MONTH: 30 * 24 * 60 * 60 * 1000,\r\n} as const;\r\n\r\n/**\r\n * Shorthand object for all localStorage operations\r\n */\r\nexport const storage = {\r\n get: getStorageItem,\r\n set: setStorageItem,\r\n remove: removeStorageItem,\r\n clear: clearStorage,\r\n isEmpty: isStorageEmpty,\r\n generateUUID,\r\n TTL,\r\n};\r\n\r\nexport default storage;\r\n","/**\r\n * Filter utilities for building URL parameters\r\n * Simplified approach since backend handles all operator parsing\r\n */\r\n\r\nexport interface FilterConfig {\r\n paramName: string;\r\n type?: \"array\" | \"string\" | \"number\" | \"boolean\";\r\n defaultValue?: unknown;\r\n}\r\n\r\nexport interface SearchConfig {\r\n basePath: string;\r\n searchFields?: Record<string, string>;\r\n filterFields?: Record<string, FilterConfig>;\r\n defaultSearchType?: string;\r\n}\r\n\r\n/**\r\n * Build URL parameters from filters object\r\n */\r\nexport function buildFilterParams(\r\n filters: Record<string, unknown>,\r\n filterConfig: Record<string, FilterConfig>\r\n): URLSearchParams {\r\n const params = new URLSearchParams();\r\n\r\n Object.entries(filters).forEach(([key, value]) => {\r\n const config = filterConfig[key];\r\n if (!config || !value) return;\r\n\r\n // Skip empty arrays and default values\r\n if (Array.isArray(value) && value.length === 0) return;\r\n if (value === config.defaultValue) return;\r\n\r\n // Handle array filters\r\n if (config.type === \"array\" && Array.isArray(value)) {\r\n if (value.length > 1) {\r\n // Multiple values: use [in] operator\r\n params.set(`${config.paramName}[in]`, value.join(\",\"));\r\n } else if (value.length === 1) {\r\n // Single value: direct assignment\r\n params.set(config.paramName, value[0] as string);\r\n }\r\n } else {\r\n // Non-array filters: direct assignment\r\n params.set(config.paramName, String(value));\r\n }\r\n });\r\n\r\n return params;\r\n}\r\n\r\n/**\r\n * Build search parameters from search state\r\n */\r\nexport function buildSearchParams(\r\n searchType: string,\r\n searchValue: string,\r\n searchFields: Record<string, string>\r\n): URLSearchParams {\r\n const params = new URLSearchParams();\r\n\r\n if (searchValue.trim() && searchFields[searchType]) {\r\n const paramName = searchFields[searchType];\r\n params.set(paramName, searchValue.trim());\r\n }\r\n\r\n return params;\r\n}\r\n\r\n/**\r\n * Build listing status parameters (inventory-specific)\r\n */\r\nexport function buildListingStatusParams(\r\n listingStatus: Record<string, boolean | undefined>\r\n): URLSearchParams {\r\n const params = new URLSearchParams();\r\n\r\n Object.entries(listingStatus).forEach(([platform, hasListings]) => {\r\n if (hasListings !== undefined) {\r\n const operator = hasListings ? \"gt\" : \"eq\";\r\n params.set(`total_list.${platform}[${operator}]`, \"0\");\r\n }\r\n });\r\n\r\n return params;\r\n}\r\n\r\n/**\r\n * Clear specific parameter types from URLSearchParams\r\n */\r\nexport function clearSearchAndFilterParams(\r\n params: URLSearchParams,\r\n config: SearchConfig\r\n): void {\r\n const { searchFields = {}, filterFields = {} } = config;\r\n\r\n // Clear search params\r\n Object.values(searchFields).forEach((paramName) => {\r\n params.delete(paramName);\r\n });\r\n\r\n // Clear filter params\r\n Object.values(filterFields).forEach((fieldConfig) => {\r\n params.delete(fieldConfig.paramName);\r\n // Also clear potential [in] variations\r\n const baseField = fieldConfig.paramName.replace(/\\[.*\\]$/, \"\");\r\n params.delete(`${baseField}[in]`);\r\n });\r\n\r\n // Clear listing status params\r\n const keysToDelete: string[] = [];\r\n for (const [key] of params.entries()) {\r\n if (key.startsWith(\"total_list.\")) {\r\n keysToDelete.push(key);\r\n }\r\n }\r\n keysToDelete.forEach((key) => params.delete(key));\r\n\r\n params.delete(\"page\"); // Reset pagination\r\n}\r\n\r\n/**\r\n * Get API-ready parameters from URL\r\n */\r\nexport function getApiParams(\r\n searchParams: URLSearchParams\r\n): Record<string, string> {\r\n const params: Record<string, string> = {};\r\n\r\n for (const [key, value] of searchParams.entries()) {\r\n params[key] = value;\r\n }\r\n\r\n return params;\r\n}\r\n","\"use client\";\r\n\r\nimport { useState, useCallback } from \"react\";\r\nimport { useRouter, useSearchParams } from \"next/navigation\";\r\nimport {\r\n buildFilterParams,\r\n buildSearchParams,\r\n clearSearchAndFilterParams,\r\n getApiParams,\r\n type FilterConfig,\r\n type SearchConfig,\r\n} from \"../lib/filter-utils\";\r\n\r\nexport interface UseBaseSearchConfig {\r\n basePath: string;\r\n searchFields?: Record<string, string>;\r\n filterFields?: Record<string, FilterConfig>;\r\n defaultSearchType?: string;\r\n}\r\n\r\nexport interface UseBaseSearchReturn {\r\n // Search state\r\n searchType: string;\r\n setSearchType: (type: string) => void;\r\n searchValue: string;\r\n setSearchValue: (value: string) => void;\r\n\r\n // Filter state\r\n filters: Record<string, unknown>;\r\n setFilters: React.Dispatch<React.SetStateAction<Record<string, unknown>>>;\r\n updateFilter: (key: string, value: unknown) => void;\r\n\r\n // Actions\r\n handleSearch: () => void;\r\n clearSearch: () => void;\r\n getSearchParams: () => Record<string, string>;\r\n\r\n // Status\r\n hasActiveSearch: boolean;\r\n hasActiveFilters: boolean;\r\n}\r\n\r\n/**\r\n * Base search hook that provides common search functionality\r\n * Can be extended by specific search hooks for different entities\r\n * Supports bracket syntax: field[operator]=value\r\n */\r\nexport function useBaseSearch(config: UseBaseSearchConfig): UseBaseSearchReturn {\r\n const {\r\n basePath,\r\n searchFields = {},\r\n filterFields = {},\r\n defaultSearchType = Object.keys(searchFields)[0] || \"\",\r\n } = config;\r\n\r\n const router = useRouter();\r\n const searchParams = useSearchParams();\r\n\r\n // Initialize search type from URL params\r\n const [searchType, setSearchType] = useState(() => {\r\n for (const [type, paramName] of Object.entries(searchFields)) {\r\n if (searchParams.has(paramName)) {\r\n return type;\r\n }\r\n }\r\n return defaultSearchType;\r\n });\r\n\r\n // Initialize search value from URL params\r\n const [searchValue, setSearchValue] = useState(() => {\r\n for (const paramName of Object.values(searchFields)) {\r\n const value = searchParams.get(paramName);\r\n if (value) return value;\r\n }\r\n return \"\";\r\n });\r\n\r\n // Initialize filter states\r\n const [filters, setFilters] = useState<Record<string, unknown>>(() => {\r\n const initialFilters: Record<string, unknown> = {};\r\n Object.entries(filterFields).forEach(([key, fieldConfig]) => {\r\n const paramValue = searchParams.get(fieldConfig.paramName);\r\n if (paramValue) {\r\n if (fieldConfig.type === \"array\") {\r\n initialFilters[key] = paramValue.split(\",\");\r\n } else {\r\n initialFilters[key] = paramValue;\r\n }\r\n } else {\r\n initialFilters[key] =\r\n fieldConfig.defaultValue || (fieldConfig.type === \"array\" ? [] : \"\");\r\n }\r\n });\r\n return initialFilters;\r\n });\r\n\r\n // Stable config reference for clearSearchAndFilterParams\r\n // Reconstructed from already-destructured values to avoid object identity issues\r\n const stableConfig: UseBaseSearchConfig = {\r\n basePath,\r\n searchFields,\r\n filterFields,\r\n defaultSearchType,\r\n };\r\n\r\n // Handle search submission\r\n const handleSearch = useCallback(() => {\r\n const params = new URLSearchParams(searchParams);\r\n\r\n // Clear existing search and filter params\r\n clearSearchAndFilterParams(params, stableConfig);\r\n\r\n // Add search params\r\n const searchParamsNew = buildSearchParams(searchType, searchValue, searchFields);\r\n for (const [key, value] of searchParamsNew) {\r\n params.set(key, value);\r\n }\r\n\r\n // Add filter params\r\n const filterParams = buildFilterParams(filters, filterFields);\r\n for (const [key, value] of filterParams) {\r\n params.set(key, value);\r\n }\r\n\r\n // Update URL\r\n router.push(`${basePath}?${params.toString()}`);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [searchType, searchValue, filters, searchFields, filterFields, searchParams, router, basePath, defaultSearchType]);\r\n\r\n // Clear search and filters\r\n const clearSearch = useCallback(() => {\r\n const params = new URLSearchParams(searchParams);\r\n\r\n // Clear all search and filter params\r\n clearSearchAndFilterParams(params, stableConfig);\r\n\r\n // Reset state\r\n setSearchValue(\"\");\r\n // Reset search type back to default for consistency\r\n setSearchType(defaultSearchType);\r\n const resetFilters: Record<string, unknown> = {};\r\n Object.entries(filterFields).forEach(([key, fieldConfig]) => {\r\n resetFilters[key] =\r\n fieldConfig.defaultValue || (fieldConfig.type === \"array\" ? [] : \"\");\r\n });\r\n setFilters(resetFilters);\r\n\r\n const next = params.toString();\r\n // If no params remain, navigate to clean basePath\r\n router.push(next ? `${basePath}?${next}` : `${basePath}`);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [searchParams, router, basePath, defaultSearchType, searchFields, filterFields]);\r\n\r\n // Get current search params for API\r\n const getSearchParamsForApi = useCallback(() => {\r\n return getApiParams(searchParams);\r\n }, [searchParams]);\r\n\r\n // Update individual filter\r\n const updateFilter = useCallback((key: string, value: unknown) => {\r\n setFilters((prev) => ({\r\n ...prev,\r\n [key]: value,\r\n }));\r\n }, []);\r\n\r\n // Check if there are active searches or filters\r\n const hasActiveSearch = Object.values(searchFields).some((paramName) => {\r\n return searchParams.has(paramName);\r\n });\r\n\r\n const hasActiveFilters = Object.values(filterFields).some((fieldConfig) => {\r\n const baseField = fieldConfig.paramName.replace(/\\[.*\\]$/, \"\");\r\n return (\r\n searchParams.has(fieldConfig.paramName) ||\r\n searchParams.has(`${baseField}[in]`) ||\r\n searchParams.has(baseField)\r\n );\r\n });\r\n\r\n return {\r\n // Search state\r\n searchType,\r\n setSearchType,\r\n searchValue,\r\n setSearchValue,\r\n\r\n // Filter state\r\n filters,\r\n setFilters,\r\n updateFilter,\r\n\r\n // Actions\r\n handleSearch,\r\n clearSearch,\r\n getSearchParams: getSearchParamsForApi,\r\n\r\n // Status\r\n hasActiveSearch,\r\n hasActiveFilters,\r\n };\r\n}\r\n","import { useSyncExternalStore } from \"react\";\r\n\r\nexport function useMediaQuery(query: string, defaultValue = false) {\r\n const getSnapshot = () => window.matchMedia(query).matches;\r\n const getServerSnapshot = () => defaultValue;\r\n\r\n const subscribe = (onStoreChange: () => void) => {\r\n const media = window.matchMedia(query);\r\n const handler = () => onStoreChange();\r\n media.addEventListener(\"change\", handler);\r\n return () => media.removeEventListener(\"change\", handler);\r\n };\r\n\r\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\r\n}\r\n","import { useState, useCallback, useRef, useEffect, RefObject } from \"react\";\r\n\r\ninterface ScrollState {\r\n canScrollLeft: boolean;\r\n canScrollRight: boolean;\r\n isScrollable: boolean;\r\n}\r\n\r\nexport const useScrollDetection = (\r\n ref: RefObject<HTMLDivElement | null>,\r\n delay = 100\r\n) => {\r\n const [scrollState, setScrollState] = useState<ScrollState>({\r\n canScrollLeft: false,\r\n canScrollRight: false,\r\n isScrollable: false,\r\n });\r\n\r\n const timeoutRef = useRef<ReturnType<typeof setTimeout>>(undefined);\r\n\r\n // Cleanup on unmount\r\n useEffect(() => {\r\n return () => {\r\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\r\n };\r\n }, []);\r\n\r\n const checkScroll = useCallback(() => {\r\n const scrollContainer = ref.current?.querySelector(\r\n '[data-slot=\"scroll-area-viewport\"]'\r\n ) as HTMLElement | null;\r\n if (!scrollContainer) return;\r\n\r\n const { scrollLeft, scrollWidth, clientWidth } = scrollContainer;\r\n const isScrollable = scrollWidth > clientWidth;\r\n const canScrollLeft = scrollLeft > 5;\r\n const canScrollRight = scrollLeft < scrollWidth - clientWidth - 5;\r\n\r\n setScrollState((prev) => {\r\n if (\r\n prev.canScrollLeft !== canScrollLeft ||\r\n prev.canScrollRight !== canScrollRight ||\r\n prev.isScrollable !== isScrollable\r\n ) {\r\n return { canScrollLeft, canScrollRight, isScrollable };\r\n }\r\n return prev;\r\n });\r\n }, [ref]);\r\n\r\n const debouncedCheckScroll = useCallback(() => {\r\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\r\n timeoutRef.current = setTimeout(checkScroll, delay);\r\n }, [checkScroll, delay]);\r\n\r\n return { ...scrollState, checkScroll: debouncedCheckScroll };\r\n};\r\n","\"use client\";\r\n\r\nimport { useState, useEffect, useRef } from \"react\";\r\n\r\n/**\r\n * useDebounce — Returns a debounced version of the input value.\r\n *\r\n * @example\r\n * ```tsx\r\n * const [search, setSearch] = useState(\"\");\r\n * const debouncedSearch = useDebounce(search, 300);\r\n *\r\n * useEffect(() => {\r\n * fetchResults(debouncedSearch);\r\n * }, [debouncedSearch]);\r\n * ```\r\n */\r\nexport function useDebounce<T>(value: T, delay: number = 300): T {\r\n const [debounced, setDebounced] = useState<T>(value);\r\n\r\n useEffect(() => {\r\n const timer = setTimeout(() => setDebounced(value), delay);\r\n return () => clearTimeout(timer);\r\n }, [value, delay]);\r\n\r\n return debounced;\r\n}\r\n\r\n/**\r\n * useDebouncedCallback — Returns a debounced version of a callback function.\r\n *\r\n * @example\r\n * ```tsx\r\n * const debouncedSave = useDebouncedCallback((value: string) => {\r\n * saveToApi(value);\r\n * }, 500);\r\n *\r\n * <Input onChange={(e) => debouncedSave(e.target.value)} />\r\n * ```\r\n */\r\nexport function useDebouncedCallback<T extends (...args: any[]) => any>(\r\n callback: T,\r\n delay: number = 300,\r\n): (...args: Parameters<T>) => void {\r\n const timerRef = useRef<ReturnType<typeof setTimeout>>(undefined);\r\n const callbackRef = useRef(callback);\r\n\r\n // Keep the callback ref fresh\r\n callbackRef.current = callback;\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (timerRef.current) clearTimeout(timerRef.current);\r\n };\r\n }, []);\r\n\r\n return (...args: Parameters<T>) => {\r\n if (timerRef.current) clearTimeout(timerRef.current);\r\n timerRef.current = setTimeout(() => callbackRef.current(...args), delay);\r\n };\r\n}\r\n","\"use client\";\r\n\r\nimport { useState, useCallback, useRef, useEffect } from \"react\";\r\n\r\nexport interface UseCopyToClipboardReturn {\r\n /** Copy text to clipboard */\r\n copy: (text: string) => Promise<boolean>;\r\n /** Whether text was recently copied (resets after timeout) */\r\n copied: boolean;\r\n /** Any error that occurred during copy */\r\n error: Error | null;\r\n /** Reset the copied state manually */\r\n reset: () => void;\r\n}\r\n\r\n/**\r\n * useCopyToClipboard — Copy text to clipboard with status tracking.\r\n *\r\n * @param resetDelay - How long (ms) the `copied` state stays true. Default: 2000\r\n *\r\n * @example\r\n * ```tsx\r\n * const { copy, copied } = useCopyToClipboard();\r\n *\r\n * <Button onClick={() => copy(apiKey)}>\r\n * {copied ? \"Copied!\" : \"Copy API Key\"}\r\n * </Button>\r\n * ```\r\n */\r\nexport function useCopyToClipboard(\r\n resetDelay: number = 2000,\r\n): UseCopyToClipboardReturn {\r\n const [copied, setCopied] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n const timerRef = useRef<ReturnType<typeof setTimeout>>(undefined);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (timerRef.current) clearTimeout(timerRef.current);\r\n };\r\n }, []);\r\n\r\n const reset = useCallback(() => {\r\n setCopied(false);\r\n setError(null);\r\n }, []);\r\n\r\n const copy = useCallback(\r\n async (text: string): Promise<boolean> => {\r\n if (!navigator?.clipboard) {\r\n const err = new Error(\"Clipboard API not available\");\r\n setError(err);\r\n return false;\r\n }\r\n\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n setCopied(true);\r\n setError(null);\r\n\r\n if (timerRef.current) clearTimeout(timerRef.current);\r\n timerRef.current = setTimeout(() => setCopied(false), resetDelay);\r\n\r\n return true;\r\n } catch (e) {\r\n const err = e instanceof Error ? e : new Error(\"Copy failed\");\r\n setError(err);\r\n setCopied(false);\r\n return false;\r\n }\r\n },\r\n [resetDelay],\r\n );\r\n\r\n return { copy, copied, error, reset };\r\n}\r\n","\"use client\";\r\n\r\nimport { useState, useCallback, useEffect, useRef } from \"react\";\r\nimport { storage } from \"../lib/storage\";\r\n\r\n/**\r\n * useLocalStorage — Persist state in localStorage with type safety and optional expiry.\r\n *\r\n * @param key - The localStorage key\r\n * @param initialValue - Default value if no stored value exists\r\n * @param ttl - Time to live in milliseconds (optional)\r\n *\r\n * @example\r\n * ```tsx\r\n * const [theme, setTheme] = useLocalStorage(\"theme\", \"light\");\r\n * const [cache, setCache] = useLocalStorage(\"api-cache\", {}, 60000); // 1 min TTL\r\n * ```\r\n */\r\nexport function useLocalStorage<T>(\r\n key: string,\r\n initialValue: T,\r\n ttl?: number,\r\n): [T, (value: T | ((prev: T) => T)) => void, () => void] {\r\n // Get initial value from storage or use default\r\n const [storedValue, setStoredValue] = useState<T>(() => {\r\n const item = storage.get<T>(key, initialValue);\r\n return item !== null ? item : initialValue;\r\n });\r\n\r\n const keyRef = useRef(key);\r\n const ttlRef = useRef(ttl);\r\n\r\n // Update refs if props change\r\n useEffect(() => {\r\n keyRef.current = key;\r\n ttlRef.current = ttl;\r\n }, [key, ttl]);\r\n\r\n const setValue = useCallback((value: T | ((prev: T) => T)) => {\r\n setStoredValue((prev) => {\r\n const nextValue = value instanceof Function ? value(prev) : value;\r\n storage.set(keyRef.current, nextValue, ttlRef.current);\r\n return nextValue;\r\n });\r\n }, []);\r\n\r\n const removeValue = useCallback(() => {\r\n storage.remove(keyRef.current);\r\n setStoredValue(initialValue);\r\n }, [initialValue]);\r\n\r\n // Sync across tabs\r\n useEffect(() => {\r\n const handleStorage = (e: StorageEvent) => {\r\n if (e.key === keyRef.current) {\r\n // We use storage.get here to leverage the parsing logic,\r\n // though we can't easily pass the newValue directly to it cleanly\r\n // so we just re-read from storage to be safe and get expiry check\r\n const item = storage.get<T>(keyRef.current, initialValue);\r\n setStoredValue(item !== null ? item : initialValue);\r\n }\r\n };\r\n\r\n window.addEventListener(\"storage\", handleStorage);\r\n return () => window.removeEventListener(\"storage\", handleStorage);\r\n }, [initialValue]);\r\n\r\n return [storedValue, setValue, removeValue];\r\n}\r\n","\"use client\";\r\n\r\nimport { ReactNode, memo } from \"react\";\r\nimport {\r\n Accordion,\r\n AccordionItem,\r\n AccordionTrigger,\r\n AccordionContent,\r\n} from \"@/components/ui/accordion\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================================================\r\n// SINGLE ACCORDION SECTION\r\n// ============================================================================\r\n\r\nexport interface AccordionSectionProps {\r\n title: string;\r\n icon?: ReactNode;\r\n children: ReactNode;\r\n defaultOpen?: boolean;\r\n className?: string;\r\n badge?: ReactNode;\r\n}\r\n\r\n/**\r\n * AccordionSection - Single collapsible section with smooth animation\r\n *\r\n * @example\r\n * ```tsx\r\n * <AccordionSection title=\"Settings\" icon={<Settings className=\"h-4 w-4\" />}>\r\n * <div>Content here</div>\r\n * </AccordionSection>\r\n * ```\r\n */\r\nexport const AccordionSection = memo(function AccordionSection({\r\n title,\r\n icon,\r\n children,\r\n defaultOpen = false,\r\n className,\r\n badge,\r\n}: AccordionSectionProps) {\r\n return (\r\n <Accordion\r\n defaultValue={defaultOpen ? [\"section\"] : []}\r\n className={className}\r\n >\r\n <AccordionItem value=\"section\" className=\"border-0\">\r\n <AccordionTrigger className=\"py-3 hover:no-underline\">\r\n <div className=\"flex items-center gap-2\">\r\n {icon && <span className=\"text-muted-foreground\">{icon}</span>}\r\n <span className=\"font-medium\">{title}</span>\r\n {badge}\r\n </div>\r\n </AccordionTrigger>\r\n <AccordionContent>\r\n <div className=\"pt-2\">{children}</div>\r\n </AccordionContent>\r\n </AccordionItem>\r\n </Accordion>\r\n );\r\n});\r\n\r\n// ============================================================================\r\n// FAQ / GROUPED ACCORDION\r\n// ============================================================================\r\n\r\nexport interface FaqItem {\r\n id: string;\r\n question: string;\r\n answer: ReactNode;\r\n}\r\n\r\nexport interface FaqAccordionProps {\r\n items: FaqItem[];\r\n defaultOpen?: string;\r\n className?: string;\r\n /** Allow multiple items to be open at once */\r\n multiple?: boolean;\r\n}\r\n\r\n/**\r\n * FaqAccordion - FAQ-style accordion where only one item can be open by default\r\n *\r\n * @example\r\n * ```tsx\r\n * <FaqAccordion\r\n * items={[\r\n * { id: \"1\", question: \"What is this?\", answer: \"A FAQ accordion\" },\r\n * { id: \"2\", question: \"How does it work?\", answer: \"Click to expand\" },\r\n * ]}\r\n * />\r\n * ```\r\n */\r\nexport const FaqAccordion = memo(function FaqAccordion({\r\n items,\r\n defaultOpen,\r\n className,\r\n multiple = false,\r\n}: FaqAccordionProps) {\r\n return (\r\n <Accordion\r\n defaultValue={defaultOpen ? [defaultOpen] : []}\r\n multiple={multiple}\r\n className={cn(\"w-full\", className)}\r\n >\r\n {items.map((item) => (\r\n <AccordionItem key={item.id} value={item.id}>\r\n <AccordionTrigger className=\"text-left\">\r\n {item.question}\r\n </AccordionTrigger>\r\n <AccordionContent>{item.answer}</AccordionContent>\r\n </AccordionItem>\r\n ))}\r\n </Accordion>\r\n );\r\n});\r\n","import { ReactNode, ElementType } from \"react\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface DisplayHeadingProps {\r\n children: ReactNode;\r\n size?: \"lg\" | \"xl\" | \"2xl\";\r\n align?: \"left\" | \"center\" | \"right\";\r\n className?: string;\r\n highlightText?: string;\r\n highlightColor?: \"primary\" | \"secondary\" | \"accent\" | \"gradient\";\r\n as?: ElementType;\r\n}\r\n\r\n/**\r\n * DisplayHeading - Reusable component for hero/display headings\r\n * Provides consistent typography across the platform\r\n */\r\nexport function DisplayHeading({\r\n children,\r\n size = \"xl\",\r\n align = \"center\",\r\n className,\r\n highlightText,\r\n highlightColor = \"primary\",\r\n as: Component = \"h1\",\r\n ...props\r\n}: DisplayHeadingProps) {\r\n const sizeClasses = {\r\n lg: \"text-3xl lg:text-5xl\",\r\n xl: \"text-4xl lg:text-6xl\",\r\n \"2xl\": \"text-5xl lg:text-7xl\",\r\n };\r\n\r\n const alignClasses = {\r\n left: \"text-left\",\r\n center: \"text-center\",\r\n right: \"text-right\",\r\n };\r\n\r\n const highlightClasses = {\r\n primary: \"text-primary\",\r\n secondary: \"text-secondary\",\r\n accent: \"text-accent\",\r\n gradient:\r\n \"bg-gradient-to-r from-primary to-accent bg-clip-text text-transparent\",\r\n };\r\n\r\n const renderContent = () => {\r\n if (typeof children !== \"string\" || !highlightText) {\r\n return children;\r\n }\r\n\r\n const parts = children.split(highlightText);\r\n return (\r\n <>\r\n {parts[0]}\r\n <span className={highlightClasses[highlightColor]}>{highlightText}</span>\r\n {parts[1]}\r\n </>\r\n );\r\n };\r\n\r\n return (\r\n <Component\r\n className={cn(\r\n \"font-bold tracking-tight text-balance leading-[1.1]\",\r\n sizeClasses[size],\r\n alignClasses[align],\r\n className\r\n )}\r\n {...props}\r\n >\r\n {renderContent()}\r\n </Component>\r\n );\r\n}\r\n","// Social media SVG icons\r\n\r\nexport const FacebookIcon = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z\"></path>\r\n </svg>\r\n);\r\n\r\nexport const GoogleIcon = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"currentColor\"\r\n >\r\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" />\r\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\r\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\r\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\r\n </svg>\r\n);\r\n\r\nexport const TwitterXIcon = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 1200 1227\"\r\n width=\"18\"\r\n height=\"18\"\r\n fill=\"currentColor\"\r\n >\r\n <path d=\"M714.163 519.284L1160.89 0H1055.03L667.137 450.887L357.328 0H0L468.492 681.821L0 1226.37H105.866L515.491 750.218L842.672 1226.37H1200L714.137 519.284H714.163ZM569.165 687.828L521.697 619.934L144.011 79.6944H306.615L611.412 515.685L658.88 583.579L1055.08 1150.3H892.476L569.165 687.854V687.828Z\" />\r\n </svg>\r\n);\r\n\r\nexport const InstagramIcon = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"5\" ry=\"5\"></rect>\r\n <path d=\"M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z\"></path>\r\n <line x1=\"17.5\" y1=\"6.5\" x2=\"17.51\" y2=\"6.5\"></line>\r\n </svg>\r\n);\r\n\r\nexport const WhatsAppIcon = () => (\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"18\" height=\"18\">\r\n <path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z\" />\r\n </svg>\r\n);\r\n","\"use client\";\r\n\r\nimport Image from \"next/image\";\r\nimport { cn } from \"../utils\";\r\n\r\nconst aspectRatios = {\r\n square: \"aspect-square\",\r\n video: \"aspect-video\",\r\n portrait: \"aspect-[3/4]\",\r\n};\r\n\r\nconst sizes = {\r\n small: \"w-16 h-16\",\r\n medium: \"w-32 h-32\",\r\n large: \"w-48 h-48\",\r\n full: \"w-full h-full\",\r\n};\r\n\r\nexport interface ThumbnailProps {\r\n src?: string;\r\n alt?: string;\r\n aspect?: \"square\" | \"video\" | \"portrait\";\r\n size?: \"small\" | \"medium\" | \"large\" | \"full\";\r\n className?: string;\r\n fallback?: string;\r\n onClick?: () => void;\r\n}\r\n\r\nexport function Thumbnail({\r\n src,\r\n alt,\r\n aspect = \"square\",\r\n size = \"medium\",\r\n className,\r\n fallback = \"/placeholder.svg\",\r\n onClick,\r\n}: ThumbnailProps) {\r\n // If a custom size is provided through className, use that instead of predefined sizes\r\n const sizeClass = className?.includes(\"w-\") ? \"\" : sizes[size];\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"relative rounded-md overflow-hidden\",\r\n aspectRatios[aspect],\r\n sizeClass,\r\n onClick && \"cursor-pointer\",\r\n className\r\n )}\r\n onClick={onClick}\r\n >\r\n <Image\r\n src={src || fallback}\r\n alt={alt || \"Thumbnail\"}\r\n fill\r\n className=\"object-cover\"\r\n sizes={getSizes(size)}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nconst getSizes = (size: \"small\" | \"medium\" | \"large\" | \"full\") => {\r\n switch (size) {\r\n case \"small\":\r\n return \"64px\";\r\n case \"medium\":\r\n return \"128px\";\r\n case \"large\":\r\n return \"192px\";\r\n case \"full\":\r\n return \"(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw\";\r\n default:\r\n return \"128px\";\r\n }\r\n};\r\n","\"use client\";\r\n\r\nimport { useEffect, useState } from \"react\";\r\nimport {\r\n Pagination,\r\n PaginationContent,\r\n PaginationItem,\r\n PaginationLink,\r\n PaginationNext,\r\n PaginationPrevious,\r\n} from \"@/components/ui/pagination\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface CustomPaginationProps {\r\n page: number;\r\n pages: number;\r\n hasNext: boolean;\r\n hasPrev: boolean;\r\n onPageChange: (page: number) => void;\r\n}\r\n\r\nexport function CustomPagination({\r\n page,\r\n onPageChange,\r\n pages,\r\n hasPrev,\r\n hasNext,\r\n}: CustomPaginationProps) {\r\n const [isMobile, setIsMobile] = useState(false);\r\n const currentPageNum = Number(page);\r\n\r\n useEffect(() => {\r\n const checkMobile = () => {\r\n setIsMobile(window.innerWidth < 640);\r\n };\r\n\r\n checkMobile();\r\n window.addEventListener(\"resize\", checkMobile);\r\n return () => window.removeEventListener(\"resize\", checkMobile);\r\n }, []);\r\n\r\n if (pages <= 1) return null;\r\n\r\n const getPageNumbers = (): (number | string)[] => {\r\n const delta = isMobile ? 1 : 2;\r\n const range: number[] = [];\r\n const rangeWithDots: (number | string)[] = [];\r\n\r\n for (\r\n let i = Math.max(2, currentPageNum - delta);\r\n i <= Math.min(pages - 1, currentPageNum + delta);\r\n i++\r\n ) {\r\n range.push(i);\r\n }\r\n\r\n if (currentPageNum - delta > 2) {\r\n rangeWithDots.push(1, \"...\");\r\n } else {\r\n rangeWithDots.push(1);\r\n }\r\n\r\n rangeWithDots.push(...range);\r\n\r\n if (currentPageNum + delta < pages - 1) {\r\n rangeWithDots.push(\"...\", pages);\r\n } else if (pages > 1) {\r\n if (!range.includes(pages)) {\r\n rangeWithDots.push(pages);\r\n }\r\n }\r\n\r\n return [...new Set(rangeWithDots)];\r\n };\r\n\r\n if (isMobile && pages > 5) {\r\n return (\r\n <Pagination className=\"mx-0 w-auto\">\r\n <PaginationContent className=\"gap-1\">\r\n <PaginationItem>\r\n <PaginationPrevious\r\n onClick={() => (hasPrev ? onPageChange(currentPageNum - 1) : undefined)}\r\n className={cn(\r\n \"cursor-pointer transition-colors h-8 px-2 text-xs\",\r\n !hasPrev && \"pointer-events-none opacity-50 cursor-not-allowed\",\r\n hasPrev && \"hover:bg-accent hover:text-accent-foreground\"\r\n )}\r\n aria-disabled={!hasPrev}\r\n />\r\n </PaginationItem>\r\n\r\n <PaginationItem>\r\n <div className=\"flex h-8 items-center justify-center px-3 text-xs font-medium bg-primary text-primary-foreground rounded-md\">\r\n {currentPageNum} / {pages}\r\n </div>\r\n </PaginationItem>\r\n\r\n <PaginationItem>\r\n <PaginationNext\r\n onClick={() => (hasNext ? onPageChange(currentPageNum + 1) : undefined)}\r\n className={cn(\r\n \"cursor-pointer transition-colors h-8 px-2 text-xs\",\r\n !hasNext && \"pointer-events-none opacity-50 cursor-not-allowed\",\r\n hasNext && \"hover:bg-accent hover:text-accent-foreground\"\r\n )}\r\n aria-disabled={!hasNext}\r\n />\r\n </PaginationItem>\r\n </PaginationContent>\r\n </Pagination>\r\n );\r\n }\r\n\r\n return (\r\n <Pagination className=\"mx-0 w-auto\">\r\n <PaginationContent className=\"gap-1 flex-wrap\">\r\n <PaginationItem>\r\n <PaginationPrevious\r\n onClick={() => (hasPrev ? onPageChange(currentPageNum - 1) : undefined)}\r\n className={cn(\r\n \"cursor-pointer transition-colors\",\r\n isMobile ? \"h-8 px-2 text-xs\" : \"h-9 px-3 text-sm\",\r\n !hasPrev && \"pointer-events-none opacity-50 cursor-not-allowed\",\r\n hasPrev && \"hover:bg-accent hover:text-accent-foreground\"\r\n )}\r\n aria-disabled={!hasPrev}\r\n />\r\n </PaginationItem>\r\n\r\n {getPageNumbers().map((pageNum, index) => (\r\n <PaginationItem key={`pagination-page-${pageNum}-${index}`}>\r\n {pageNum === \"...\" ? (\r\n <span\r\n className={cn(\r\n \"flex items-center justify-center text-muted-foreground\",\r\n isMobile ? \"h-8 w-8 text-xs\" : \"h-9 w-9 text-sm\"\r\n )}\r\n >\r\n ...\r\n </span>\r\n ) : (\r\n <PaginationLink\r\n className={cn(\r\n \"cursor-pointer transition-colors\",\r\n isMobile ? \"h-8 w-8 text-xs p-0\" : \"h-9 w-9 text-sm p-0\",\r\n \"hover:bg-accent hover:text-accent-foreground\",\r\n Number(currentPageNum) === Number(pageNum) &&\r\n \"bg-primary text-primary-foreground hover:bg-primary/90\"\r\n )}\r\n onClick={() =>\r\n typeof pageNum === \"number\" ? onPageChange(pageNum) : undefined\r\n }\r\n isActive={Number(currentPageNum) === Number(pageNum)}\r\n aria-label={`Go to page ${pageNum}`}\r\n aria-current={\r\n Number(currentPageNum) === Number(pageNum) ? \"page\" : undefined\r\n }\r\n >\r\n {pageNum}\r\n </PaginationLink>\r\n )}\r\n </PaginationItem>\r\n ))}\r\n\r\n <PaginationItem>\r\n <PaginationNext\r\n onClick={() => (hasNext ? onPageChange(currentPageNum + 1) : undefined)}\r\n className={cn(\r\n \"cursor-pointer transition-colors\",\r\n isMobile ? \"h-8 px-2 text-xs\" : \"h-9 px-3 text-sm\",\r\n !hasNext && \"pointer-events-none opacity-50 cursor-not-allowed\",\r\n hasNext && \"hover:bg-accent hover:text-accent-foreground\"\r\n )}\r\n aria-disabled={!hasNext}\r\n />\r\n </PaginationItem>\r\n </PaginationContent>\r\n </Pagination>\r\n );\r\n}\r\n\r\nexport interface PaginationInfoProps {\r\n page: number;\r\n total: number;\r\n limit?: number;\r\n}\r\n\r\nexport function PaginationInfo({ page, total, limit = 10 }: PaginationInfoProps) {\r\n const [isMobile, setIsMobile] = useState(false);\r\n\r\n useEffect(() => {\r\n const checkMobile = () => {\r\n setIsMobile(window.innerWidth < 640);\r\n };\r\n\r\n checkMobile();\r\n window.addEventListener(\"resize\", checkMobile);\r\n return () => window.removeEventListener(\"resize\", checkMobile);\r\n }, []);\r\n\r\n if (total === 0) {\r\n return (\r\n <div className=\"flex-1 text-sm text-muted-foreground\">\r\n <p>No entries found</p>\r\n </div>\r\n );\r\n }\r\n\r\n const startEntry = (page - 1) * limit + 1;\r\n const endEntry = Math.min(page * limit, total);\r\n\r\n return (\r\n <div className=\"flex-1 text-sm text-muted-foreground\">\r\n <p className={cn(\"whitespace-nowrap\", isMobile && \"text-xs\")}>\r\n {isMobile ? (\r\n <span>\r\n {startEntry.toLocaleString()}-{endEntry.toLocaleString()} of{\" \"}\r\n {total.toLocaleString()}\r\n </span>\r\n ) : (\r\n <span>\r\n Showing{\" \"}\r\n <span className=\"font-medium text-foreground\">\r\n {startEntry.toLocaleString()}\r\n </span>{\" \"}\r\n to{\" \"}\r\n <span className=\"font-medium text-foreground\">\r\n {endEntry.toLocaleString()}\r\n </span>{\" \"}\r\n of{\" \"}\r\n <span className=\"font-medium text-foreground\">\r\n {total.toLocaleString()}\r\n </span>{\" \"}\r\n {total === 1 ? \"result\" : \"results\"}\r\n </span>\r\n )}\r\n </p>\r\n </div>\r\n );\r\n}\r\n\r\nexport type { CustomPaginationProps as CustomPaginationPropsExport };\r\nexport type { PaginationInfoProps as PaginationInfoPropsExport };\r\n","\"use client\";\r\n\r\nimport { CustomPagination, PaginationInfo } from \"./custom-pagination\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface ApiPaginationData {\r\n total: number;\r\n pages: number;\r\n page: number;\r\n limit: number;\r\n hasNext: boolean;\r\n hasPrev: boolean;\r\n}\r\n\r\nexport interface ApiPaginationProps extends Partial<ApiPaginationData> {\r\n onPageChange?: (page: number) => void;\r\n className?: string;\r\n showInfo?: boolean;\r\n infoPosition?: \"left\" | \"right\";\r\n}\r\n\r\n/**\r\n * ApiPagination - A reusable pagination component for API-driven data\r\n */\r\nexport function ApiPagination({\r\n total = 0,\r\n limit = 10,\r\n pages = 1,\r\n page = 1,\r\n hasNext = false,\r\n hasPrev = false,\r\n onPageChange = () => {},\r\n className,\r\n showInfo = true,\r\n infoPosition = \"left\",\r\n}: ApiPaginationProps) {\r\n const infoComponent = showInfo && (\r\n <div className=\"shrink-0\">\r\n <PaginationInfo total={total} page={page} limit={limit} />\r\n </div>\r\n );\r\n\r\n const paginationComponent = (\r\n <div className=\"flex justify-center sm:justify-end\">\r\n <CustomPagination\r\n page={page}\r\n pages={pages}\r\n hasPrev={hasPrev}\r\n hasNext={hasNext}\r\n onPageChange={onPageChange}\r\n />\r\n </div>\r\n );\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"shrink-0 bg-muted/30 rounded-lg border border-border p-3 mb-2\",\r\n className\r\n )}\r\n >\r\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between sm:gap-4\">\r\n {infoPosition === \"left\" ? (\r\n <>\r\n <div className=\"order-2 sm:order-1\">{infoComponent}</div>\r\n <div className=\"order-1 sm:order-2\">{paginationComponent}</div>\r\n </>\r\n ) : (\r\n <>\r\n <div className=\"order-1 sm:order-1\">{paginationComponent}</div>\r\n <div className=\"order-2 sm:order-2\">{infoComponent}</div>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { ReactNode } from \"react\";\r\nimport {\r\n Card,\r\n CardContent,\r\n CardHeader,\r\n CardTitle,\r\n CardDescription,\r\n CardFooter,\r\n} from \"@/components/ui/card\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================================================\r\n// CONSTANTS (module-scope to avoid recreation on every render)\r\n// ============================================================================\r\n\r\nconst CARD_VARIANTS = {\r\n default: \"\",\r\n outline: \"border-2\",\r\n ghost: \"border-0 shadow-none bg-transparent\",\r\n elevated: \"shadow-lg border-0\",\r\n primary: \"border-primary/20 bg-primary/5\",\r\n secondary: \"border-secondary/20 bg-secondary/5\",\r\n destructive: \"border-destructive/20 bg-destructive/5\",\r\n success: \"border-green-500/20 bg-green-500/5\",\r\n warning: \"border-yellow-500/20 bg-yellow-500/5\",\r\n} as const;\r\n\r\nconst CARD_SIZES = {\r\n sm: \"p-3\",\r\n default: \"p-6\",\r\n lg: \"p-8\",\r\n xl: \"p-10\",\r\n} as const;\r\n\r\nconst CARD_CONTENT_SIZES = {\r\n sm: \"pt-3\",\r\n default: \"pt-6\",\r\n lg: \"pt-8\",\r\n xl: \"pt-10\",\r\n} as const;\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface CardWrapperProps {\r\n title?: ReactNode;\r\n description?: ReactNode;\r\n children?: ReactNode;\r\n footer?: ReactNode;\r\n className?: string;\r\n headerClassName?: string;\r\n contentClassName?: string;\r\n footerClassName?: string;\r\n variant?: keyof typeof CARD_VARIANTS;\r\n size?: keyof typeof CARD_SIZES;\r\n hideHeader?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENTS\r\n// ============================================================================\r\n\r\nexport function CardWrapper({\r\n title,\r\n description,\r\n children,\r\n footer,\r\n className,\r\n headerClassName,\r\n contentClassName,\r\n footerClassName,\r\n variant = \"default\",\r\n size = \"default\",\r\n hideHeader = false,\r\n ...props\r\n}: CardWrapperProps) {\r\n\r\n return (\r\n <Card className={cn(CARD_VARIANTS[variant], className)} {...props}>\r\n {!hideHeader && (title || description) && (\r\n <CardHeader className={cn(CARD_SIZES[size], \"pb-4\", headerClassName)}>\r\n {title && (\r\n <CardTitle className=\"text-lg font-semibold\">{title}</CardTitle>\r\n )}\r\n {description && <CardDescription>{description}</CardDescription>}\r\n </CardHeader>\r\n )}\r\n\r\n <CardContent\r\n className={cn(hideHeader ? CARD_SIZES[size] : CARD_CONTENT_SIZES[size], contentClassName)}\r\n >\r\n {children}\r\n </CardContent>\r\n\r\n {footer && (\r\n <CardFooter className={cn(CARD_SIZES[size], \"pt-4 border-t\", footerClassName)}>\r\n <div className=\"w-full\">{footer}</div>\r\n </CardFooter>\r\n )}\r\n </Card>\r\n );\r\n}\r\n\r\nexport interface DataCardProps extends Omit<CardWrapperProps, \"children\"> {\r\n /** Each item's `color` should be a complete Tailwind class (e.g. \"text-green-600\") */\r\n data: Array<{ label: string; value: ReactNode; color?: string }>;\r\n}\r\n\r\nexport function DataCard({ title, data, className, ...props }: DataCardProps) {\r\n return (\r\n <CardWrapper title={title} className={cn(\"space-y-4\", className)} {...props}>\r\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-4\">\r\n {data.map((item, index) => (\r\n <div key={index} className=\"space-y-1\">\r\n <p className=\"text-sm text-muted-foreground\">{item.label}</p>\r\n <p className={cn(\"text-lg font-semibold\", item.color)}>\r\n {item.value}\r\n </p>\r\n </div>\r\n ))}\r\n </div>\r\n </CardWrapper>\r\n );\r\n}\r\n\r\nexport interface LoadingCardProps extends Omit<CardWrapperProps, \"children\"> {}\r\n\r\nexport function LoadingCard({ title, description, className, ...props }: LoadingCardProps) {\r\n return (\r\n <CardWrapper title={title} description={description} className={className} {...props}>\r\n <div className=\"flex items-center justify-center py-8\">\r\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-primary\"></div>\r\n <span className=\"ml-2\">Loading...</span>\r\n </div>\r\n </CardWrapper>\r\n );\r\n}\r\n\r\nexport interface StatsCardProps extends Omit<CardWrapperProps, \"children\" | \"variant\"> {\r\n value: ReactNode;\r\n icon?: ReactNode;\r\n trend?: { type: \"up\" | \"down\" | \"neutral\"; value: string };\r\n /** Visual variant for the card and icon styling */\r\n statsVariant?: \"default\" | \"success\" | \"warning\" | \"danger\" | \"info\";\r\n /** Additional class for the icon wrapper */\r\n iconClassName?: string;\r\n}\r\n\r\nconst STATS_CARD_VARIANTS = {\r\n default: \"\",\r\n success: \"bg-green-50 border-green-200 dark:bg-green-950/30 dark:border-green-900\",\r\n warning: \"bg-yellow-50 border-yellow-200 dark:bg-yellow-950/30 dark:border-yellow-900\",\r\n danger: \"bg-red-50 border-red-200 dark:bg-red-950/30 dark:border-red-900\",\r\n info: \"bg-blue-50 border-blue-200 dark:bg-blue-950/30 dark:border-blue-900\",\r\n} as const;\r\n\r\nconst STATS_ICON_VARIANTS = {\r\n default: \"text-muted-foreground\",\r\n success: \"text-green-600 dark:text-green-400\",\r\n warning: \"text-yellow-600 dark:text-yellow-400\",\r\n danger: \"text-red-600 dark:text-red-400\",\r\n info: \"text-blue-600 dark:text-blue-400\",\r\n} as const;\r\n\r\nconst STATS_ICON_WRAPPER_VARIANTS = {\r\n default: \"bg-muted border border-border\",\r\n success: \"bg-green-100/50 dark:bg-green-900/30\",\r\n warning: \"bg-yellow-100/50 dark:bg-yellow-900/30\",\r\n danger: \"bg-red-100/50 dark:bg-red-900/30\",\r\n info: \"bg-blue-100/50 dark:bg-blue-900/30\",\r\n} as const;\r\n\r\nexport function StatsCard({\r\n title,\r\n value,\r\n description,\r\n icon,\r\n trend,\r\n className,\r\n statsVariant = \"default\",\r\n iconClassName,\r\n ...props\r\n}: StatsCardProps) {\r\n return (\r\n <CardWrapper\r\n className={cn(\"relative overflow-hidden\", STATS_CARD_VARIANTS[statsVariant], className)}\r\n size=\"sm\"\r\n hideHeader\r\n {...props}\r\n >\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"space-y-1\">\r\n <p className=\"text-sm font-medium text-muted-foreground\">{title}</p>\r\n <p className=\"text-2xl font-bold\">{value}</p>\r\n {description && (\r\n <p className=\"text-xs text-muted-foreground\">{description}</p>\r\n )}\r\n </div>\r\n {icon && (\r\n <div className={cn(\r\n \"p-2 rounded-md\",\r\n STATS_ICON_WRAPPER_VARIANTS[statsVariant],\r\n STATS_ICON_VARIANTS[statsVariant],\r\n iconClassName\r\n )}>\r\n {icon}\r\n </div>\r\n )}\r\n </div>\r\n {trend && (\r\n <div\r\n className={cn(\r\n \"absolute top-2 right-2 text-xs px-2 py-1 rounded-full\",\r\n trend.type === \"up\" && \"bg-green-100 text-green-700 dark:bg-green-900/50 dark:text-green-300\",\r\n trend.type === \"down\" && \"bg-red-100 text-red-700 dark:bg-red-900/50 dark:text-red-300\",\r\n trend.type === \"neutral\" && \"bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-300\"\r\n )}\r\n >\r\n {trend.value}\r\n </div>\r\n )}\r\n </CardWrapper>\r\n );\r\n}\r\n\r\nexport interface DraggableCardProps extends Omit<CardWrapperProps, \"children\"> {\r\n subtitle?: ReactNode;\r\n badges?: ReactNode;\r\n actions?: ReactNode;\r\n details?: ReactNode;\r\n dragHandleProps?: any;\r\n isDragging?: boolean;\r\n isHidden?: boolean;\r\n children?: ReactNode;\r\n}\r\n\r\nexport function DraggableCard({\r\n title,\r\n subtitle,\r\n badges,\r\n actions,\r\n details,\r\n dragHandleProps,\r\n className,\r\n isDragging,\r\n isHidden,\r\n children,\r\n ...props\r\n}: DraggableCardProps) {\r\n return (\r\n <CardWrapper\r\n hideHeader\r\n className={cn(\r\n \"transition-all\",\r\n isDragging && \"shadow-lg rotate-2\",\r\n isHidden && \"opacity-50\",\r\n className\r\n )}\r\n contentClassName=\"!pt-4\"\r\n {...props}\r\n >\r\n <div className=\"flex items-start gap-3\">\r\n {dragHandleProps && (\r\n <div {...dragHandleProps} className=\"mt-1 cursor-grab hover:text-foreground\">\r\n {dragHandleProps.icon || (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className=\"text-muted-foreground\"\r\n >\r\n <circle cx=\"9\" cy=\"12\" r=\"1\" />\r\n <circle cx=\"9\" cy=\"5\" r=\"1\" />\r\n <circle cx=\"9\" cy=\"19\" r=\"1\" />\r\n <circle cx=\"15\" cy=\"12\" r=\"1\" />\r\n <circle cx=\"15\" cy=\"5\" r=\"1\" />\r\n <circle cx=\"15\" cy=\"19\" r=\"1\" />\r\n </svg>\r\n )}\r\n </div>\r\n )}\r\n\r\n <div className=\"flex-1 min-w-0 space-y-3\">\r\n <div className=\"flex flex-wrap items-center gap-2\">\r\n {title && <h4 className=\"font-medium\">{title}</h4>}\r\n {badges && <div className=\"flex flex-wrap gap-1\">{badges}</div>}\r\n </div>\r\n\r\n {subtitle && (\r\n <p className=\"text-xs text-muted-foreground break-words\">{subtitle}</p>\r\n )}\r\n\r\n {details}\r\n {children}\r\n </div>\r\n\r\n {actions && (\r\n <div className=\"flex items-center gap-2 flex-shrink-0\">{actions}</div>\r\n )}\r\n </div>\r\n </CardWrapper>\r\n );\r\n}\r\n","import { Skeleton } from \"@/components/ui/skeleton\";\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TableHeader,\r\n TableRow,\r\n} from \"@/components/ui/table\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================================================\r\n// SKELETON TABLE\r\n// ============================================================================\r\n\r\nexport interface SkeletonTableProps {\r\n /** Number of skeleton rows */\r\n rows?: number;\r\n /** Number of skeleton columns */\r\n columns?: number;\r\n /** Optional column headers - if provided, shows text instead of skeleton */\r\n headers?: string[];\r\n /** Additional CSS classes */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * SkeletonTable - Loading skeleton for tables\r\n * Matches DataTable structure for consistent loading states\r\n *\r\n * @example\r\n * ```tsx\r\n * <SkeletonTable rows={5} columns={4} />\r\n * <SkeletonTable headers={[\"Name\", \"Email\", \"Status\"]} rows={10} />\r\n * ```\r\n */\r\nexport function SkeletonTable({\r\n rows = 5,\r\n columns = 6,\r\n headers,\r\n className,\r\n}: SkeletonTableProps) {\r\n const columnCount = headers?.length || columns;\r\n\r\n return (\r\n <div className={cn(\"rounded-md border\", className)}>\r\n <Table>\r\n <TableHeader>\r\n <TableRow>\r\n {headers\r\n ? headers.map((header, i) => (\r\n <TableHead key={i}>{header}</TableHead>\r\n ))\r\n : Array.from({ length: columnCount }).map((_, i) => (\r\n <TableHead key={i}>\r\n <Skeleton className=\"h-4 w-20\" />\r\n </TableHead>\r\n ))}\r\n </TableRow>\r\n </TableHeader>\r\n <TableBody>\r\n {Array.from({ length: rows }).map((_, rowIndex) => (\r\n <TableRow key={rowIndex}>\r\n {Array.from({ length: columnCount }).map((_, colIndex) => (\r\n <TableCell key={colIndex}>\r\n <Skeleton className=\"h-4 w-full\" />\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n ))}\r\n </TableBody>\r\n </Table>\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// SKELETON LIST\r\n// ============================================================================\r\n\r\nexport interface SkeletonListProps {\r\n /** Number of skeleton items */\r\n items?: number;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Show avatar placeholder */\r\n showAvatar?: boolean;\r\n /** Avatar shape */\r\n avatarShape?: \"circle\" | \"square\";\r\n}\r\n\r\n/**\r\n * SkeletonList - Compact skeleton for lists with avatars\r\n *\r\n * @example\r\n * ```tsx\r\n * <SkeletonList items={5} />\r\n * <SkeletonList items={3} showAvatar={false} />\r\n * ```\r\n */\r\nexport function SkeletonList({\r\n items = 3,\r\n className,\r\n showAvatar = true,\r\n avatarShape = \"circle\",\r\n}: SkeletonListProps) {\r\n return (\r\n <div className={cn(\"space-y-3\", className)}>\r\n {Array.from({ length: items }).map((_, i) => (\r\n <div key={i} className=\"flex items-center gap-3\">\r\n {showAvatar && (\r\n <Skeleton\r\n className={cn(\r\n \"h-10 w-10 flex-shrink-0\",\r\n avatarShape === \"circle\" ? \"rounded-full\" : \"rounded-md\"\r\n )}\r\n />\r\n )}\r\n <div className=\"flex-1 space-y-2\">\r\n <Skeleton className=\"h-4 w-full\" />\r\n <Skeleton className=\"h-3 w-3/4\" />\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// SKELETON CARD\r\n// ============================================================================\r\n\r\nexport interface SkeletonCardProps {\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Show action buttons placeholder */\r\n showActions?: boolean;\r\n /** Number of text lines */\r\n lines?: number;\r\n}\r\n\r\n/**\r\n * SkeletonCard - Card skeleton for grid layouts\r\n *\r\n * @example\r\n * ```tsx\r\n * <SkeletonCard />\r\n * <SkeletonCard showActions={false} lines={2} />\r\n * ```\r\n */\r\nexport function SkeletonCard({\r\n className,\r\n showActions = true,\r\n lines = 3,\r\n}: SkeletonCardProps) {\r\n return (\r\n <div className={cn(\"rounded-lg border p-4 space-y-3\", className)}>\r\n <Skeleton className=\"h-5 w-3/4\" />\r\n {Array.from({ length: lines - 1 }).map((_, i) => (\r\n <Skeleton\r\n key={i}\r\n className={cn(\"h-4\", i === lines - 2 ? \"w-5/6\" : \"w-full\")}\r\n />\r\n ))}\r\n {showActions && (\r\n <div className=\"flex gap-2 pt-2\">\r\n <Skeleton className=\"h-8 w-20\" />\r\n <Skeleton className=\"h-8 w-20\" />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// SKELETON GRID\r\n// ============================================================================\r\n\r\nexport interface SkeletonGridProps {\r\n /** Number of skeleton cards */\r\n cards?: number;\r\n /** Grid columns configuration */\r\n columns?: 1 | 2 | 3 | 4;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Props passed to each SkeletonCard */\r\n cardProps?: Omit<SkeletonCardProps, \"className\">;\r\n}\r\n\r\n/**\r\n * SkeletonGrid - Grid of skeleton cards\r\n *\r\n * @example\r\n * ```tsx\r\n * <SkeletonGrid cards={6} columns={3} />\r\n * ```\r\n */\r\nexport function SkeletonGrid({\r\n cards = 6,\r\n columns = 3,\r\n className,\r\n cardProps,\r\n}: SkeletonGridProps) {\r\n const gridCols = {\r\n 1: \"grid-cols-1\",\r\n 2: \"grid-cols-1 sm:grid-cols-2\",\r\n 3: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-3\",\r\n 4: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\",\r\n };\r\n\r\n return (\r\n <div className={cn(\"grid gap-4\", gridCols[columns], className)}>\r\n {Array.from({ length: cards }).map((_, i) => (\r\n <SkeletonCard key={i} {...cardProps} />\r\n ))}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport {\r\n useState,\r\n ReactNode,\r\n isValidElement,\r\n cloneElement,\r\n ReactElement,\r\n} from \"react\";\r\nimport { ChevronDown, ChevronUp } from \"lucide-react\";\r\nimport {\r\n Collapsible,\r\n CollapsibleContent,\r\n CollapsibleTrigger,\r\n} from \"@/components/ui/collapsible\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface CollapsibleWrapperProps {\r\n children: ReactNode;\r\n trigger: ReactNode;\r\n defaultOpen?: boolean;\r\n open?: boolean;\r\n onOpenChange?: (open: boolean) => void;\r\n /** @deprecated Use render prop pattern with trigger element instead */\r\n triggerAsChild?: boolean;\r\n triggerVariant?:\r\n | \"default\"\r\n | \"destructive\"\r\n | \"outline\"\r\n | \"secondary\"\r\n | \"ghost\"\r\n | \"link\";\r\n triggerSize?: \"default\" | \"sm\" | \"lg\" | \"icon\";\r\n triggerClassName?: string;\r\n contentClassName?: string;\r\n className?: string;\r\n showChevron?: boolean;\r\n chevronPosition?: \"left\" | \"right\";\r\n disabled?: boolean;\r\n}\r\n\r\nexport function CollapsibleWrapper({\r\n children,\r\n trigger,\r\n defaultOpen = false,\r\n open,\r\n onOpenChange,\r\n triggerAsChild = false,\r\n triggerVariant = \"outline\",\r\n triggerSize = \"sm\",\r\n triggerClassName,\r\n contentClassName,\r\n className,\r\n showChevron = true,\r\n chevronPosition = \"right\",\r\n disabled = false,\r\n ...props\r\n}: CollapsibleWrapperProps) {\r\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\r\n\r\n const isOpen = open !== undefined ? open : internalOpen;\r\n const handleOpenChange = onOpenChange || setInternalOpen;\r\n\r\n const chevronElement = showChevron && (\r\n <div\r\n className={cn(\r\n \"flex items-center\",\r\n chevronPosition === \"left\" && \"order-first mr-2\",\r\n chevronPosition === \"right\" && \"ml-2\",\r\n )}\r\n >\r\n {isOpen ? (\r\n <ChevronUp className=\"h-4 w-4\" />\r\n ) : (\r\n <ChevronDown className=\"h-4 w-4\" />\r\n )}\r\n </div>\r\n );\r\n\r\n return (\r\n <Collapsible\r\n open={isOpen}\r\n onOpenChange={handleOpenChange}\r\n disabled={disabled}\r\n className={cn(\"w-full\", className)}\r\n {...props}\r\n >\r\n {triggerAsChild && isValidElement(trigger) ? (\r\n <CollapsibleTrigger render={trigger as ReactElement} />\r\n ) : (\r\n <CollapsibleTrigger\r\n render={\r\n <Button\r\n variant={triggerVariant}\r\n size={triggerSize}\r\n disabled={disabled}\r\n className={cn(\"justify-between\", triggerClassName)}\r\n />\r\n }\r\n >\r\n {trigger}\r\n {chevronElement}\r\n </CollapsibleTrigger>\r\n )}\r\n\r\n <CollapsibleContent className={cn(\"mt-2\", contentClassName)}>\r\n {children}\r\n </CollapsibleContent>\r\n </Collapsible>\r\n );\r\n}\r\n\r\nexport interface CollapsibleCardProps {\r\n title: ReactNode;\r\n children: ReactNode;\r\n defaultOpen?: boolean;\r\n className?: string;\r\n headerClassName?: string;\r\n contentClassName?: string;\r\n}\r\n\r\nexport function CollapsibleCard({\r\n title,\r\n children,\r\n defaultOpen = false,\r\n className,\r\n headerClassName,\r\n contentClassName,\r\n ...props\r\n}: CollapsibleCardProps) {\r\n const [isOpen, setIsOpen] = useState(defaultOpen);\r\n\r\n return (\r\n <Collapsible\r\n open={isOpen}\r\n onOpenChange={setIsOpen}\r\n className={cn(\"border rounded-lg overflow-hidden\", className)}\r\n {...props}\r\n >\r\n <CollapsibleTrigger\r\n render={\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n \"flex items-center justify-between w-full px-4 py-3 cursor-pointer transition-colors hover:bg-secondary/5 bg-transparent border-0 text-left\",\r\n headerClassName,\r\n )}\r\n />\r\n }\r\n >\r\n <span className=\"font-medium\">{title}</span>\r\n <ChevronDown\r\n className={cn(\r\n \"h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200\",\r\n isOpen && \"rotate-180\",\r\n )}\r\n />\r\n </CollapsibleTrigger>\r\n <CollapsibleContent>\r\n <div className={cn(\"px-4 py-3 border-t\", contentClassName)}>\r\n {children}\r\n </div>\r\n </CollapsibleContent>\r\n </Collapsible>\r\n );\r\n}\r\n\r\nexport interface CollapsibleSectionProps {\r\n label: ReactNode;\r\n children: ReactNode;\r\n defaultOpen?: boolean;\r\n className?: string;\r\n labelClassName?: string;\r\n contentClassName?: string;\r\n}\r\n\r\nexport function CollapsibleSection({\r\n label,\r\n children,\r\n defaultOpen = false,\r\n className,\r\n labelClassName,\r\n contentClassName,\r\n ...props\r\n}: CollapsibleSectionProps) {\r\n return (\r\n <CollapsibleWrapper\r\n trigger={label}\r\n defaultOpen={defaultOpen}\r\n triggerVariant=\"ghost\"\r\n triggerSize=\"sm\"\r\n triggerClassName={cn(\r\n \"h-8 px-2 font-medium justify-between\",\r\n labelClassName,\r\n )}\r\n contentClassName={cn(\"pl-4 mt-1\", contentClassName)}\r\n className={cn(\"space-y-1\", className)}\r\n {...props}\r\n >\r\n {children}\r\n </CollapsibleWrapper>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { ReactNode } from \"react\";\r\nimport { AlertTriangle, Loader2 } from \"lucide-react\";\r\nimport {\r\n AlertDialog,\r\n AlertDialogAction,\r\n AlertDialogCancel,\r\n AlertDialogContent,\r\n AlertDialogDescription,\r\n AlertDialogFooter,\r\n AlertDialogHeader,\r\n AlertDialogTitle,\r\n AlertDialogTrigger,\r\n} from \"@/components/ui/alert-dialog\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface ConfirmDialogProps {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n /** Trigger element that opens the dialog */\r\n trigger?: React.ReactElement;\r\n title?: string;\r\n description?: string;\r\n confirmText?: string;\r\n cancelText?: string;\r\n variant?: \"default\" | \"destructive\" | \"outline\" | \"secondary\" | \"ghost\" | \"link\";\r\n isLoading?: boolean;\r\n onConfirm?: () => void;\r\n onCancel?: () => void;\r\n icon?: ReactNode;\r\n children?: ReactNode;\r\n className?: string;\r\n /** Header className */\r\n headerClassName?: string;\r\n /** Description className */\r\n descriptionClassName?: string;\r\n /** Footer className */\r\n footerClassName?: string;\r\n /** Whether to show the cancel button (default: true) */\r\n showCancel?: boolean;\r\n}\r\n\r\nexport function ConfirmDialog({\r\n open,\r\n onOpenChange,\r\n trigger,\r\n title = \"Are you sure?\",\r\n description = \"This action cannot be undone.\",\r\n confirmText = \"Confirm\",\r\n cancelText = \"Cancel\",\r\n variant = \"destructive\",\r\n isLoading = false,\r\n onConfirm,\r\n onCancel,\r\n icon,\r\n children,\r\n className,\r\n headerClassName,\r\n descriptionClassName,\r\n footerClassName,\r\n showCancel = true,\r\n ...props\r\n}: ConfirmDialogProps) {\r\n const handleConfirm = () => {\r\n if (onConfirm) {\r\n onConfirm();\r\n }\r\n };\r\n\r\n const handleCancel = () => {\r\n if (onCancel) {\r\n onCancel();\r\n } else {\r\n onOpenChange(false);\r\n }\r\n };\r\n\r\n // Extract children and element for Base UI render prop pattern\r\n const triggerChildren = (trigger?.props as { children?: ReactNode })?.children;\r\n const triggerElement = trigger\r\n ? React.cloneElement(trigger, { children: undefined } as Record<string, unknown>)\r\n : null;\r\n\r\n return (\r\n <AlertDialog open={open} onOpenChange={onOpenChange} {...props}>\r\n {triggerElement && (\r\n <AlertDialogTrigger render={triggerElement}>\r\n {triggerChildren}\r\n </AlertDialogTrigger>\r\n )}\r\n <AlertDialogContent className={cn(\"max-w-md\", className)}>\r\n <AlertDialogHeader className={cn(headerClassName)}>\r\n <AlertDialogTitle className=\"flex items-center gap-2\">\r\n {icon ||\r\n (variant === \"destructive\" && (\r\n <AlertTriangle className=\"h-5 w-5 text-destructive\" />\r\n ))}\r\n {title}\r\n </AlertDialogTitle>\r\n {description && (\r\n <AlertDialogDescription className={cn(descriptionClassName)}>\r\n {description}\r\n </AlertDialogDescription>\r\n )}\r\n </AlertDialogHeader>\r\n\r\n {children && <div className=\"py-4\">{children}</div>}\r\n\r\n <AlertDialogFooter className={cn(footerClassName)}>\r\n {showCancel && (\r\n <AlertDialogCancel onClick={handleCancel} disabled={isLoading}>\r\n {cancelText}\r\n </AlertDialogCancel>\r\n )}\r\n {onConfirm && (\r\n <AlertDialogAction\r\n onClick={handleConfirm}\r\n disabled={isLoading}\r\n variant={variant}\r\n >\r\n {isLoading ? (\r\n <div className=\"flex items-center gap-2\">\r\n <Loader2 className=\"h-4 w-4 animate-spin\" />\r\n Loading...\r\n </div>\r\n ) : (\r\n confirmText\r\n )}\r\n </AlertDialogAction>\r\n )}\r\n </AlertDialogFooter>\r\n </AlertDialogContent>\r\n </AlertDialog>\r\n );\r\n}\r\n\r\n// Specialized delete confirmation dialog\r\nexport interface DeleteConfirmDialogProps {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n onConfirm?: () => void;\r\n isLoading?: boolean;\r\n itemName?: string;\r\n itemDetails?: ReactNode;\r\n}\r\n\r\nexport function DeleteConfirmDialog({\r\n open,\r\n onOpenChange,\r\n onConfirm,\r\n isLoading = false,\r\n itemName = \"item\",\r\n itemDetails,\r\n ...props\r\n}: DeleteConfirmDialogProps) {\r\n return (\r\n <ConfirmDialog\r\n open={open}\r\n onOpenChange={onOpenChange}\r\n title=\"Delete Item\"\r\n description={`Are you sure you want to delete this ${itemName}? This action cannot be undone.`}\r\n confirmText=\"Yes, Delete\"\r\n cancelText=\"No\"\r\n variant=\"destructive\"\r\n isLoading={isLoading}\r\n onConfirm={onConfirm}\r\n {...props}\r\n >\r\n {itemDetails && (\r\n <div className=\"bg-muted/50 p-3 rounded-md\">\r\n <div className=\"text-sm space-y-1\">{itemDetails}</div>\r\n </div>\r\n )}\r\n </ConfirmDialog>\r\n );\r\n}\r\n\r\n// Info/Warning alert (no cancel button)\r\nexport interface InfoAlertProps extends Omit<ConfirmDialogProps, \"showCancel\" | \"variant\"> {\r\n confirmText?: string;\r\n}\r\n\r\n/**\r\n * InfoAlert - Information/warning alert with only confirm button (no cancel)\r\n *\r\n * @example\r\n * ```tsx\r\n * <InfoAlert\r\n * open={open}\r\n * onOpenChange={setOpen}\r\n * title=\"Session expired\"\r\n * description=\"Please log in again\"\r\n * confirmText=\"OK\"\r\n * onConfirm={() => setOpen(false)}\r\n * />\r\n * ```\r\n */\r\nexport function InfoAlert({\r\n title,\r\n description,\r\n confirmText = \"OK\",\r\n onConfirm,\r\n onOpenChange,\r\n ...props\r\n}: InfoAlertProps) {\r\n return (\r\n <ConfirmDialog\r\n title={title}\r\n description={description}\r\n confirmText={confirmText}\r\n variant=\"default\"\r\n showCancel={false}\r\n onConfirm={onConfirm || (() => onOpenChange(false))}\r\n onOpenChange={onOpenChange}\r\n {...props}\r\n />\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { ReactNode } from \"react\";\r\nimport { AlertCircle, RefreshCw } from \"lucide-react\";\r\nimport { Alert, AlertDescription, AlertTitle } from \"@/components/ui/alert\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface ErrorStateProps {\r\n /** Error title */\r\n title?: string;\r\n /** Error message or Error object */\r\n error: string | Error | { message?: string } | null | undefined;\r\n /** Optional retry callback */\r\n onRetry?: () => void;\r\n /** Alert variant */\r\n variant?: \"default\" | \"destructive\";\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Custom icon */\r\n icon?: ReactNode;\r\n}\r\n\r\n/**\r\n * ErrorState Component\r\n *\r\n * Reusable error display component with retry functionality\r\n * Used for consistent error handling across pages\r\n */\r\nexport function ErrorState({\r\n title = \"Error\",\r\n error,\r\n onRetry,\r\n variant = \"destructive\",\r\n className,\r\n icon,\r\n}: ErrorStateProps) {\r\n const errorMessage =\r\n typeof error === \"string\"\r\n ? error\r\n : (error as { message?: string })?.message || \"Something went wrong. Please try again.\";\r\n\r\n return (\r\n <Alert variant={variant} className={cn(className)}>\r\n {icon || <AlertCircle className=\"h-4 w-4\" />}\r\n <AlertTitle>{title}</AlertTitle>\r\n <AlertDescription className=\"mt-2 flex flex-col gap-3\">\r\n <p className=\"text-sm\">{errorMessage}</p>\r\n {onRetry && (\r\n <div>\r\n <Button\r\n onClick={onRetry}\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"gap-2\"\r\n >\r\n <RefreshCw className=\"h-3 w-3\" />\r\n Try Again\r\n </Button>\r\n </div>\r\n )}\r\n </AlertDescription>\r\n </Alert>\r\n );\r\n}\r\n\r\nexport interface ErrorStateInlineProps {\r\n /** Error message or Error object */\r\n error: string | Error | { message?: string } | null | undefined;\r\n /** Optional retry callback */\r\n onRetry?: () => void;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Custom icon */\r\n icon?: ReactNode;\r\n}\r\n\r\n/**\r\n * Inline ErrorState variant - more compact for table cells\r\n */\r\nexport function ErrorStateInline({\r\n error,\r\n onRetry,\r\n className,\r\n icon,\r\n}: ErrorStateInlineProps) {\r\n const errorMessage =\r\n typeof error === \"string\"\r\n ? error\r\n : (error as { message?: string })?.message || \"Error loading data\";\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"flex items-center gap-2 text-sm text-destructive\",\r\n className\r\n )}\r\n >\r\n {icon || <AlertCircle className=\"h-4 w-4\" />}\r\n <span>{errorMessage}</span>\r\n {onRetry && (\r\n <Button\r\n onClick={onRetry}\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-6 px-2 gap-1\"\r\n >\r\n <RefreshCw className=\"h-3 w-3\" />\r\n Retry\r\n </Button>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import * as React from \"react\";\r\nimport { InboxIcon, SearchX, FileX2 } from \"lucide-react\";\r\nimport {\r\n Empty,\r\n EmptyHeader,\r\n EmptyMedia,\r\n EmptyTitle,\r\n EmptyDescription,\r\n EmptyContent,\r\n} from \"@/components/ui/empty\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface EmptyStateProps {\r\n /** Title text */\r\n title?: string;\r\n /** Description / subtitle */\r\n description?: string;\r\n /** Icon element (ReactNode) — e.g. <SearchX /> or <MyCustomIcon /> */\r\n icon?: React.ReactNode;\r\n /** Primary action button */\r\n action?: React.ReactNode;\r\n /** Secondary action button */\r\n secondaryAction?: React.ReactNode;\r\n /** Visual variant */\r\n variant?: \"default\" | \"compact\" | \"card\";\r\n /** Additional className */\r\n className?: string;\r\n /** Children rendered below the description */\r\n children?: React.ReactNode;\r\n}\r\n\r\n// ============================================================================\r\n// PRESETS\r\n// ============================================================================\r\n\r\nconst PRESETS = {\r\n noResults: {\r\n icon: <SearchX className=\"h-6 w-6\" />,\r\n title: \"No results found\",\r\n description: \"Try adjusting your search or filter criteria.\",\r\n },\r\n noData: {\r\n icon: <InboxIcon className=\"h-6 w-6\" />,\r\n title: \"No data yet\",\r\n description: \"Get started by creating your first item.\",\r\n },\r\n notFound: {\r\n icon: <FileX2 className=\"h-6 w-6\" />,\r\n title: \"Not found\",\r\n description:\r\n \"The item you're looking for doesn't exist or has been removed.\",\r\n },\r\n} as const;\r\n\r\n// ============================================================================\r\n// EMPTY STATE\r\n// ============================================================================\r\n\r\n/**\r\n * EmptyState — Higher-level wrapper around the composable Empty primitives.\r\n *\r\n * Composes: Empty, EmptyHeader, EmptyMedia, EmptyTitle, EmptyDescription, EmptyContent\r\n *\r\n * @example Default\r\n * ```tsx\r\n * <EmptyState\r\n * title=\"No projects yet\"\r\n * description=\"Create your first project to get started.\"\r\n * icon={<FolderPlus className=\"h-6 w-6\" />}\r\n * action={<Button>Create Project</Button>}\r\n * />\r\n * ```\r\n *\r\n * @example Compact (inline)\r\n * ```tsx\r\n * <EmptyState variant=\"compact\" title=\"No items\" />\r\n * ```\r\n *\r\n * @example With preset\r\n * ```tsx\r\n * <EmptyStateNoResults action={<Button onClick={clearFilters}>Clear filters</Button>} />\r\n * ```\r\n */\r\nexport function EmptyState({\r\n title = \"Nothing here\",\r\n description,\r\n icon = <InboxIcon className=\"h-6 w-6\" />,\r\n action,\r\n secondaryAction,\r\n variant = \"default\",\r\n className,\r\n children,\r\n}: EmptyStateProps) {\r\n if (variant === \"compact\") {\r\n return (\r\n <div\r\n data-slot=\"empty-state\"\r\n className={cn(\r\n \"flex items-center gap-3 py-6 px-4 text-muted-foreground\",\r\n className,\r\n )}\r\n >\r\n {icon && (\r\n <div className=\"flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0\">\r\n {icon}\r\n </div>\r\n )}\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium\">{title}</p>\r\n {description && (\r\n <p className=\"text-xs text-muted-foreground/80 mt-0.5\">\r\n {description}\r\n </p>\r\n )}\r\n </div>\r\n {action}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <Empty\r\n className={cn(\r\n variant === \"card\" && \"border border-dashed\",\r\n className,\r\n )}\r\n >\r\n <EmptyHeader>\r\n {icon && <EmptyMedia variant=\"icon\">{icon}</EmptyMedia>}\r\n <EmptyTitle>{title}</EmptyTitle>\r\n {description && <EmptyDescription>{description}</EmptyDescription>}\r\n </EmptyHeader>\r\n\r\n {children && <EmptyContent>{children}</EmptyContent>}\r\n\r\n {(action || secondaryAction) && (\r\n <EmptyContent>\r\n <div className=\"flex items-center gap-3\">\r\n {action}\r\n {secondaryAction}\r\n </div>\r\n </EmptyContent>\r\n )}\r\n </Empty>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// PRESET VARIANTS\r\n// ============================================================================\r\n\r\nexport type EmptyStatePresetProps = Omit<\r\n EmptyStateProps,\r\n \"icon\" | \"title\" | \"description\"\r\n> & {\r\n title?: string;\r\n description?: string;\r\n};\r\n\r\n/** No search results — with search icon */\r\nexport function EmptyStateNoResults(props: EmptyStatePresetProps) {\r\n return <EmptyState {...PRESETS.noResults} {...props} />;\r\n}\r\n\r\n/** No data — with inbox icon */\r\nexport function EmptyStateNoData(props: EmptyStatePresetProps) {\r\n return <EmptyState {...PRESETS.noData} {...props} />;\r\n}\r\n\r\n/** Not found — with file-x icon */\r\nexport function EmptyStateNotFound(props: EmptyStatePresetProps) {\r\n return <EmptyState {...PRESETS.notFound} {...props} />;\r\n}\r\n","import * as React from \"react\";\r\nimport { Loader2 } from \"lucide-react\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface LoadingStateProps {\r\n /** Loading message text */\r\n text?: string;\r\n /** Visual variant */\r\n variant?: \"default\" | \"inline\" | \"overlay\" | \"minimal\";\r\n /** Spinner size */\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n /** Additional className */\r\n className?: string;\r\n}\r\n\r\nexport interface LoadingOverlayProps {\r\n /** Loading message text */\r\n text?: string;\r\n /** Whether the overlay is visible */\r\n visible?: boolean;\r\n /** Additional className */\r\n className?: string;\r\n /** Children to render behind the overlay */\r\n children?: React.ReactNode;\r\n}\r\n\r\n// ============================================================================\r\n// SIZE MAP\r\n// ============================================================================\r\n\r\nconst SIZES = {\r\n sm: \"h-4 w-4\",\r\n md: \"h-6 w-6\",\r\n lg: \"h-10 w-10\",\r\n} as const;\r\n\r\nconst TEXT_SIZES = {\r\n sm: \"text-xs\",\r\n md: \"text-sm\",\r\n lg: \"text-base\",\r\n} as const;\r\n\r\n// ============================================================================\r\n// LOADING STATE\r\n// ============================================================================\r\n\r\n/**\r\n * LoadingState — Versatile loading indicator\r\n *\r\n * @example Default (centered, full area)\r\n * ```tsx\r\n * <LoadingState text=\"Loading projects...\" />\r\n * ```\r\n *\r\n * @example Inline (in a row)\r\n * ```tsx\r\n * <LoadingState variant=\"inline\" text=\"Saving...\" size=\"sm\" />\r\n * ```\r\n *\r\n * @example Minimal (just the spinner)\r\n * ```tsx\r\n * <LoadingState variant=\"minimal\" />\r\n * ```\r\n */\r\nexport function LoadingState({\r\n text,\r\n variant = \"default\",\r\n size = \"md\",\r\n className,\r\n}: LoadingStateProps) {\r\n const spinner = (\r\n <Loader2\r\n className={cn(SIZES[size], \"animate-spin text-muted-foreground\")}\r\n />\r\n );\r\n\r\n if (variant === \"minimal\") {\r\n return (\r\n <div className={cn(\"flex items-center justify-center\", className)}>\r\n {spinner}\r\n </div>\r\n );\r\n }\r\n\r\n if (variant === \"inline\") {\r\n return (\r\n <div\r\n className={cn(\r\n \"flex items-center gap-2 text-muted-foreground\",\r\n className,\r\n )}\r\n >\r\n {spinner}\r\n {text && <span className={TEXT_SIZES[size]}>{text}</span>}\r\n </div>\r\n );\r\n }\r\n\r\n // default — centered block\r\n return (\r\n <div\r\n className={cn(\r\n \"flex flex-col items-center justify-center gap-3 py-12 px-6\",\r\n className,\r\n )}\r\n >\r\n {spinner}\r\n {text && (\r\n <p className={cn(\"text-muted-foreground\", TEXT_SIZES[size])}>{text}</p>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// LOADING OVERLAY\r\n// ============================================================================\r\n\r\n/**\r\n * LoadingOverlay — Renders children with an overlay spinner on top\r\n *\r\n * @example\r\n * ```tsx\r\n * <LoadingOverlay visible={isSaving} text=\"Saving changes...\">\r\n * <MyFormContent />\r\n * </LoadingOverlay>\r\n * ```\r\n */\r\nexport function LoadingOverlay({\r\n text,\r\n visible = true,\r\n className,\r\n children,\r\n}: LoadingOverlayProps) {\r\n return (\r\n <div className={cn(\"relative\", className)}>\r\n {children}\r\n {visible && (\r\n <div className=\"absolute inset-0 z-10 flex flex-col items-center justify-center gap-3 rounded-[inherit] bg-background/90 backdrop-blur-sm\">\r\n <Loader2 className=\"h-6 w-6 animate-spin text-muted-foreground\" />\r\n {text && (\r\n <p className=\"text-sm text-muted-foreground font-medium\">{text}</p>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport {\r\n X,\r\n Info,\r\n AlertTriangle,\r\n CheckCircle2,\r\n AlertCircle,\r\n type LucideIcon,\r\n} from \"lucide-react\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport type StatusBannerVariant = \"info\" | \"warning\" | \"success\" | \"error\";\r\n\r\nexport interface StatusBannerProps {\r\n /** The banner variant/severity */\r\n variant?: StatusBannerVariant;\r\n /** Main message text or node */\r\n children: React.ReactNode;\r\n /** Optional custom icon */\r\n icon?: LucideIcon;\r\n /** Whether the banner can be dismissed */\r\n dismissible?: boolean;\r\n /** Callback when dismissed */\r\n onDismiss?: () => void;\r\n /** Optional action element (e.g. a link or button) */\r\n action?: React.ReactNode;\r\n /** Additional className */\r\n className?: string;\r\n}\r\n\r\n// ============================================================================\r\n// VARIANT CONFIG\r\n// ============================================================================\r\n\r\nconst VARIANT_MAP: Record<\r\n StatusBannerVariant,\r\n {\r\n icon: LucideIcon;\r\n bg: string;\r\n border: string;\r\n text: string;\r\n iconColor: string;\r\n }\r\n> = {\r\n info: {\r\n icon: Info,\r\n bg: \"bg-blue-50 dark:bg-blue-950/30\",\r\n border: \"border-blue-200 dark:border-blue-800\",\r\n text: \"text-blue-800 dark:text-blue-200\",\r\n iconColor: \"text-blue-500 dark:text-blue-400\",\r\n },\r\n warning: {\r\n icon: AlertTriangle,\r\n bg: \"bg-amber-50 dark:bg-amber-950/30\",\r\n border: \"border-amber-200 dark:border-amber-800\",\r\n text: \"text-amber-800 dark:text-amber-200\",\r\n iconColor: \"text-amber-500 dark:text-amber-400\",\r\n },\r\n success: {\r\n icon: CheckCircle2,\r\n bg: \"bg-emerald-50 dark:bg-emerald-950/30\",\r\n border: \"border-emerald-200 dark:border-emerald-800\",\r\n text: \"text-emerald-800 dark:text-emerald-200\",\r\n iconColor: \"text-emerald-500 dark:text-emerald-400\",\r\n },\r\n error: {\r\n icon: AlertCircle,\r\n bg: \"bg-red-50 dark:bg-red-950/30\",\r\n border: \"border-red-200 dark:border-red-800\",\r\n text: \"text-red-800 dark:text-red-200\",\r\n iconColor: \"text-red-500 dark:text-red-400\",\r\n },\r\n};\r\n\r\n// ============================================================================\r\n// STATUS BANNER\r\n// ============================================================================\r\n\r\n/**\r\n * StatusBanner — A persistent info/warning/success/error banner.\r\n *\r\n * @example\r\n * ```tsx\r\n * <StatusBanner variant=\"warning\" dismissible>\r\n * Your trial expires in 3 days. <a href=\"/pricing\">Upgrade now</a>\r\n * </StatusBanner>\r\n *\r\n * <StatusBanner variant=\"success\" action={<Button size=\"sm\">View</Button>}>\r\n * Your project was deployed successfully.\r\n * </StatusBanner>\r\n * ```\r\n */\r\nexport function StatusBanner({\r\n variant = \"info\",\r\n children,\r\n icon: CustomIcon,\r\n dismissible = false,\r\n onDismiss,\r\n action,\r\n className,\r\n}: StatusBannerProps) {\r\n const [dismissed, setDismissed] = React.useState(false);\r\n\r\n if (dismissed) return null;\r\n\r\n const config = VARIANT_MAP[variant];\r\n const Icon = CustomIcon || config.icon;\r\n\r\n const handleDismiss = () => {\r\n setDismissed(true);\r\n onDismiss?.();\r\n };\r\n\r\n return (\r\n <div\r\n role=\"alert\"\r\n className={cn(\r\n \"flex items-center gap-3 rounded-lg border px-4 py-3\",\r\n config.bg,\r\n config.border,\r\n config.text,\r\n className,\r\n )}\r\n >\r\n <Icon\r\n className={cn(\"h-4 w-4 shrink-0\", config.iconColor)}\r\n strokeWidth={2}\r\n />\r\n\r\n <div className=\"flex-1 min-w-0 text-sm\">{children}</div>\r\n\r\n {action && <div className=\"shrink-0\">{action}</div>}\r\n\r\n {dismissible && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className={cn(\r\n \"h-6 w-6 shrink-0 hover:bg-transparent opacity-60 hover:opacity-100\",\r\n config.text,\r\n )}\r\n onClick={handleDismiss}\r\n >\r\n <X className=\"h-3.5 w-3.5\" />\r\n <span className=\"sr-only\">Dismiss</span>\r\n </Button>\r\n )}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { Check } from \"lucide-react\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface StepperStep {\r\n /** Step label */\r\n label: string;\r\n /** Optional description shown below the label */\r\n description?: string;\r\n /** Optional icon for the step (replaces the number) */\r\n icon?: React.ReactNode;\r\n /** Whether this step is optional */\r\n optional?: boolean;\r\n}\r\n\r\nexport interface StepperProps {\r\n /** Array of step definitions */\r\n steps: (string | StepperStep)[];\r\n /** Active step index (0-based) */\r\n currentStep: number;\r\n /** Variant */\r\n variant?: \"default\" | \"compact\";\r\n /** Orientation */\r\n orientation?: \"horizontal\" | \"vertical\";\r\n /** Additional className */\r\n className?: string;\r\n /** Callback when a completed step is clicked */\r\n onStepClick?: (stepIndex: number) => void;\r\n /** Children (StepContent panels) */\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport interface StepContentProps {\r\n /** Step index this content belongs to (0-based) */\r\n step: number;\r\n /** Currently active step */\r\n currentStep: number;\r\n /** Children to render */\r\n children: React.ReactNode;\r\n /** Additional className */\r\n className?: string;\r\n /** Keep mounted when inactive (useful for forms) */\r\n keepMounted?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// HELPERS\r\n// ============================================================================\r\n\r\nfunction normalizeStep(step: string | StepperStep): StepperStep {\r\n return typeof step === \"string\" ? { label: step } : step;\r\n}\r\n\r\n// ============================================================================\r\n// STEP CIRCLE\r\n// ============================================================================\r\n\r\nconst StepCircle = React.memo(function StepCircle({\r\n index,\r\n isCompleted,\r\n isActive,\r\n icon,\r\n variant,\r\n}: {\r\n index: number;\r\n isCompleted: boolean;\r\n isActive: boolean;\r\n icon?: React.ReactNode;\r\n variant: \"default\" | \"compact\";\r\n}) {\r\n const size = variant === \"compact\" ? \"h-7 w-7\" : \"h-8 w-8\";\r\n const iconSize = variant === \"compact\" ? \"h-3.5 w-3.5\" : \"h-4 w-4\";\r\n\r\n return (\r\n <span\r\n className={cn(\r\n \"relative flex items-center justify-center rounded-full text-xs font-semibold shrink-0 transition-all duration-200\",\r\n size,\r\n isCompleted\r\n ? \"bg-primary text-primary-foreground\"\r\n : isActive\r\n ? \"bg-primary text-primary-foreground ring-2 ring-primary/20 ring-offset-2 ring-offset-background\"\r\n : \"border-2 border-muted-foreground/25 bg-background text-muted-foreground\",\r\n )}\r\n >\r\n {isCompleted ? (\r\n <Check className={iconSize} strokeWidth={3} />\r\n ) : (\r\n icon || index + 1\r\n )}\r\n </span>\r\n );\r\n});\r\n\r\n// ============================================================================\r\n// CONNECTOR\r\n// ============================================================================\r\n\r\nconst StepConnector = React.memo(function StepConnector({\r\n isCompleted,\r\n isVertical,\r\n}: {\r\n isCompleted: boolean;\r\n isVertical: boolean;\r\n}) {\r\n if (isVertical) {\r\n return (\r\n <div className=\"flex justify-center w-8 py-1\">\r\n <div\r\n className={cn(\r\n \"w-px h-6 transition-colors duration-200\",\r\n isCompleted ? \"bg-primary\" : \"bg-border\",\r\n )}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"flex-1 flex items-center min-w-4 mt-4\">\r\n <div\r\n className={cn(\r\n \"h-px w-full transition-colors duration-200\",\r\n isCompleted ? \"bg-primary\" : \"bg-border\",\r\n )}\r\n />\r\n </div>\r\n );\r\n});\r\n\r\n// ============================================================================\r\n// HORIZONTAL STEPPER\r\n// ============================================================================\r\n\r\nfunction HorizontalStepper({\r\n steps,\r\n currentStep,\r\n variant,\r\n onStepClick,\r\n}: {\r\n steps: StepperStep[];\r\n currentStep: number;\r\n variant: \"default\" | \"compact\";\r\n onStepClick?: (index: number) => void;\r\n}) {\r\n const activeRef = React.useRef<HTMLDivElement>(null);\r\n const navRef = React.useRef<HTMLElement>(null);\r\n\r\n // Auto-scroll active step into view\r\n React.useEffect(() => {\r\n if (activeRef.current && navRef.current) {\r\n activeRef.current.scrollIntoView({\r\n behavior: \"smooth\",\r\n block: \"nearest\",\r\n inline: \"center\",\r\n });\r\n }\r\n }, [currentStep]);\r\n\r\n return (\r\n <nav\r\n ref={navRef}\r\n aria-label=\"Progress\"\r\n role=\"list\"\r\n className=\"flex items-start w-full overflow-x-auto [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden pb-1\"\r\n >\r\n {steps.map((step, index) => {\r\n const isCompleted = index < currentStep;\r\n const isActive = index === currentStep;\r\n const isClickable = isCompleted && !!onStepClick;\r\n const isLast = index === steps.length - 1;\r\n\r\n return (\r\n <React.Fragment key={step.label}>\r\n {/* Step */}\r\n <div\r\n ref={isActive ? activeRef : undefined}\r\n role=\"listitem\"\r\n aria-current={isActive ? \"step\" : undefined}\r\n className={cn(\"flex flex-col items-center text-center shrink-0\")}\r\n style={{ minWidth: variant === \"compact\" ? 48 : 64 }}\r\n >\r\n <button\r\n type=\"button\"\r\n disabled={!isClickable}\r\n onClick={() => isClickable && onStepClick(index)}\r\n className={cn(\r\n \"flex flex-col items-center gap-1.5 group\",\r\n isClickable ? \"cursor-pointer\" : \"cursor-default\",\r\n )}\r\n >\r\n <StepCircle\r\n index={index}\r\n isCompleted={isCompleted}\r\n isActive={isActive}\r\n icon={step.icon}\r\n variant={variant}\r\n />\r\n\r\n {/* Label */}\r\n <div className=\"max-w-[5.5rem] sm:max-w-[7rem]\">\r\n <p\r\n className={cn(\r\n \"text-xs font-medium leading-tight truncate\",\r\n isActive || isCompleted\r\n ? \"text-foreground\"\r\n : \"text-muted-foreground\",\r\n )}\r\n >\r\n {step.label}\r\n </p>\r\n {step.optional && (\r\n <span className=\"text-[10px] text-muted-foreground font-normal\">\r\n optional\r\n </span>\r\n )}\r\n {step.description && variant !== \"compact\" && (\r\n <p className=\"text-[10px] text-muted-foreground mt-0.5 leading-tight truncate hidden sm:block\">\r\n {step.description}\r\n </p>\r\n )}\r\n </div>\r\n </button>\r\n </div>\r\n\r\n {/* Connector */}\r\n {!isLast && (\r\n <StepConnector isCompleted={isCompleted} isVertical={false} />\r\n )}\r\n </React.Fragment>\r\n );\r\n })}\r\n </nav>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// VERTICAL STEPPER\r\n// ============================================================================\r\n\r\nfunction VerticalStepper({\r\n steps,\r\n currentStep,\r\n variant,\r\n onStepClick,\r\n}: {\r\n steps: StepperStep[];\r\n currentStep: number;\r\n variant: \"default\" | \"compact\";\r\n onStepClick?: (index: number) => void;\r\n}) {\r\n return (\r\n <nav aria-label=\"Progress\" role=\"list\" className=\"flex flex-col\">\r\n {steps.map((step, index) => {\r\n const isCompleted = index < currentStep;\r\n const isActive = index === currentStep;\r\n const isClickable = isCompleted && !!onStepClick;\r\n const isLast = index === steps.length - 1;\r\n\r\n return (\r\n <React.Fragment key={step.label}>\r\n {/* Step */}\r\n <div\r\n role=\"listitem\"\r\n aria-current={isActive ? \"step\" : undefined}\r\n className=\"flex items-start gap-3\"\r\n >\r\n <button\r\n type=\"button\"\r\n disabled={!isClickable}\r\n onClick={() => isClickable && onStepClick(index)}\r\n className={cn(\r\n \"flex items-center gap-3\",\r\n isClickable ? \"cursor-pointer\" : \"cursor-default\",\r\n )}\r\n >\r\n <StepCircle\r\n index={index}\r\n isCompleted={isCompleted}\r\n isActive={isActive}\r\n icon={step.icon}\r\n variant={variant}\r\n />\r\n\r\n <div className=\"text-left\">\r\n <p\r\n className={cn(\r\n \"text-sm font-medium leading-tight\",\r\n isActive || isCompleted\r\n ? \"text-foreground\"\r\n : \"text-muted-foreground\",\r\n )}\r\n >\r\n {step.label}\r\n {step.optional && (\r\n <span className=\"ml-1 text-xs text-muted-foreground font-normal\">\r\n (optional)\r\n </span>\r\n )}\r\n </p>\r\n {step.description && variant !== \"compact\" && (\r\n <p className=\"text-xs text-muted-foreground mt-0.5\">\r\n {step.description}\r\n </p>\r\n )}\r\n </div>\r\n </button>\r\n </div>\r\n\r\n {/* Connector */}\r\n {!isLast && (\r\n <StepConnector isCompleted={isCompleted} isVertical={true} />\r\n )}\r\n </React.Fragment>\r\n );\r\n })}\r\n </nav>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// STEPPER\r\n// ============================================================================\r\n\r\n/**\r\n * Stepper — Multi-step progress indicator\r\n *\r\n * Features:\r\n * - Horizontal layout: circles in a row with labels below, proper connectors\r\n * - Vertical layout: circles on the left with labels to the right\r\n * - Compact variant for tight spaces\r\n * - Handles many steps gracefully without scrollbars\r\n * - Clickable completed steps for navigation\r\n * - Accessible: role=\"list\", aria-current=\"step\"\r\n *\r\n * @example Basic\r\n * ```tsx\r\n * const [step, setStep] = useState(0);\r\n *\r\n * <Stepper steps={[\"Details\", \"Config\", \"Review\"]} currentStep={step}>\r\n * <StepContent step={0} currentStep={step}>\r\n * <DetailsForm onNext={() => setStep(1)} />\r\n * </StepContent>\r\n * </Stepper>\r\n * ```\r\n *\r\n * @example With step objects\r\n * ```tsx\r\n * <Stepper\r\n * steps={[\r\n * { label: \"Account\", description: \"Set up your account\" },\r\n * { label: \"Profile\", description: \"Add your details\", optional: true },\r\n * { label: \"Complete\", description: \"Review and submit\" },\r\n * ]}\r\n * currentStep={1}\r\n * onStepClick={(i) => setStep(i)}\r\n * />\r\n * ```\r\n */\r\nexport function Stepper({\r\n steps,\r\n currentStep,\r\n variant = \"default\",\r\n orientation = \"horizontal\",\r\n className,\r\n onStepClick,\r\n children,\r\n ...props\r\n}: StepperProps) {\r\n const normalizedSteps = steps.map(normalizeStep);\r\n const isVertical = orientation === \"vertical\";\r\n\r\n return (\r\n <div className={cn(\"w-full\", className)} {...props}>\r\n {isVertical ? (\r\n <VerticalStepper\r\n steps={normalizedSteps}\r\n currentStep={currentStep}\r\n variant={variant}\r\n onStepClick={onStepClick}\r\n />\r\n ) : (\r\n <HorizontalStepper\r\n steps={normalizedSteps}\r\n currentStep={currentStep}\r\n variant={variant}\r\n onStepClick={onStepClick}\r\n />\r\n )}\r\n\r\n {/* Step content */}\r\n {children && (\r\n <div className={cn(\"mt-6\", isVertical && \"ml-11\")}>{children}</div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// STEP CONTENT\r\n// ============================================================================\r\n\r\n/**\r\n * StepContent — Renders content for a specific step.\r\n * Only visible when `step === currentStep`.\r\n *\r\n * @example\r\n * ```tsx\r\n * <StepContent step={0} currentStep={current}>\r\n * <MyForm />\r\n * </StepContent>\r\n * ```\r\n */\r\nexport function StepContent({\r\n step,\r\n currentStep,\r\n children,\r\n className,\r\n keepMounted = false,\r\n}: StepContentProps) {\r\n const isActive = step === currentStep;\r\n\r\n if (!isActive && !keepMounted) return null;\r\n\r\n return (\r\n <div\r\n className={cn(className)}\r\n hidden={!isActive}\r\n role=\"tabpanel\"\r\n aria-label={`Step ${step + 1}`}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { useState, ReactNode } from \"react\";\r\nimport { Copy, Check } from \"lucide-react\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { cn } from \"../utils\";\r\n\r\n// Simple clipboard utility\r\nasync function copyToClipboard(\r\n text: string,\r\n options?: { showToast?: boolean; successMessage?: string; errorMessage?: string }\r\n): Promise<boolean> {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport interface CopyButtonProps {\r\n value: string;\r\n className?: string;\r\n size?: \"default\" | \"sm\" | \"lg\" | \"icon\";\r\n variant?: \"default\" | \"destructive\" | \"outline\" | \"secondary\" | \"ghost\" | \"link\";\r\n showToast?: boolean;\r\n toastMessage?: string;\r\n errorMessage?: string;\r\n timeout?: number;\r\n children?: ReactNode;\r\n}\r\n\r\nexport function CopyButton({\r\n value,\r\n className,\r\n size = \"sm\",\r\n variant = \"ghost\",\r\n showToast = true,\r\n toastMessage = \"Copied to clipboard\",\r\n errorMessage = \"Failed to copy to clipboard\",\r\n timeout = 2000,\r\n children,\r\n ...props\r\n}: CopyButtonProps) {\r\n const [copied, setCopied] = useState(false);\r\n\r\n const handleCopy = async () => {\r\n if (!value) return;\r\n\r\n const success = await copyToClipboard(value, {\r\n showToast,\r\n successMessage: toastMessage,\r\n errorMessage,\r\n });\r\n\r\n if (success) {\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), timeout);\r\n }\r\n };\r\n\r\n return (\r\n <Button\r\n variant={variant}\r\n size={size}\r\n className={cn(\"h-6 w-6 p-0\", className)}\r\n onClick={handleCopy}\r\n disabled={!value}\r\n {...props}\r\n >\r\n {children ||\r\n (copied ? (\r\n <Check className=\"h-3 w-3 text-green-600\" />\r\n ) : (\r\n <Copy className=\"h-3 w-3\" />\r\n ))}\r\n </Button>\r\n );\r\n}\r\n\r\nexport interface CopyTextProps {\r\n value: string;\r\n displayValue?: string;\r\n className?: string;\r\n textClassName?: string;\r\n buttonClassName?: string;\r\n maxLength?: number;\r\n showButton?: boolean;\r\n}\r\n\r\nexport function CopyText({\r\n value,\r\n displayValue,\r\n className,\r\n textClassName,\r\n buttonClassName,\r\n maxLength = 30,\r\n showButton = true,\r\n ...buttonProps\r\n}: CopyTextProps) {\r\n const truncatedValue =\r\n displayValue ||\r\n (value && value.length > maxLength\r\n ? `${value.substring(0, maxLength)}...`\r\n : value || \"N/A\");\r\n\r\n return (\r\n <div className={cn(\"flex items-center gap-2\", className)}>\r\n <span className={cn(\"font-medium\", textClassName)} title={value || \"N/A\"}>\r\n {truncatedValue}\r\n </span>\r\n {showButton && value && (\r\n <CopyButton value={value} className={buttonClassName} {...buttonProps} />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport interface CopyCodeBlockProps {\r\n value: string;\r\n className?: string;\r\n language?: string;\r\n showLineNumbers?: boolean;\r\n}\r\n\r\nexport function CopyCodeBlock({\r\n value,\r\n className,\r\n language,\r\n showLineNumbers = false,\r\n ...buttonProps\r\n}: CopyCodeBlockProps) {\r\n return (\r\n <div className={cn(\"relative group\", className)}>\r\n <pre className=\"bg-muted p-4 rounded-md overflow-x-auto text-sm\">\r\n <code className={language ? `language-${language}` : \"\"}>{value}</code>\r\n </pre>\r\n <div className=\"absolute top-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity\">\r\n <CopyButton value={value} variant=\"secondary\" size=\"sm\" {...buttonProps} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport {\r\n ColumnDef,\r\n flexRender,\r\n getCoreRowModel,\r\n getSortedRowModel,\r\n SortingState,\r\n useReactTable,\r\n RowSelectionState,\r\n} from \"@tanstack/react-table\";\r\nimport React, { useState, useRef, useEffect, useCallback, useMemo, RefObject } from \"react\";\r\nimport { ArrowUpDown, ArrowUp, ArrowDown, ChevronLeft, ChevronRight, Search } from \"lucide-react\";\r\nimport { useScrollDetection } from \"../hooks/use-scroll-detection\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TableHeader,\r\n TableRow,\r\n} from \"@/components/ui/table\";\r\nimport { ScrollArea, ScrollBar } from \"@/components/ui/scroll-area\";\r\nimport { cn } from \"../utils\";\r\nimport { ApiPagination, ApiPaginationData } from \"./api-pagination\";\r\n\r\n// Scroll detection hook moved to hooks/use-scroll-detection.ts\r\n\r\ninterface ScrollButtonProps {\r\n direction: \"left\" | \"right\";\r\n onClick: () => void;\r\n visible: boolean;\r\n className?: string;\r\n}\r\n\r\nconst ScrollButton = React.memo(function ScrollButton({ direction, onClick, visible, className }: ScrollButtonProps) {\r\n if (!visible) return null;\r\n\r\n const handleClick = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n onClick();\r\n };\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n \"absolute top-1/2 -translate-y-1/2 z-50\",\r\n \"flex items-center justify-center\",\r\n \"size-10 rounded-md shadow-lg border-2 border-border\",\r\n \"bg-background hover:bg-muted\",\r\n \"transition-transform duration-200\",\r\n \"hover:scale-105 active:scale-95\",\r\n direction === \"left\" ? \"left-2\" : \"right-2\",\r\n className\r\n )}\r\n onClick={handleClick}\r\n onMouseDown={(e) => e.stopPropagation()}\r\n aria-label={`Scroll ${direction}`}\r\n >\r\n {direction === \"left\" ? (\r\n <ChevronLeft className=\"size-5\" />\r\n ) : (\r\n <ChevronRight className=\"size-5\" />\r\n )}\r\n </button>\r\n );\r\n});\r\n\r\nexport interface DataTablePaginationProps extends Partial<ApiPaginationData> {\r\n onPageChange?: (page: number) => void;\r\n}\r\n\r\nexport interface DataTableProps<TData, TValue> {\r\n columns: ColumnDef<TData, TValue>[];\r\n data: TData[];\r\n isLoading?: boolean;\r\n pagination?: DataTablePaginationProps;\r\n enableSorting?: boolean;\r\n enableRowSelection?: boolean;\r\n onRowSelectionChange?: (selectedRows: TData[]) => void;\r\n className?: string;\r\n /** Custom loading state renderer */\r\n loadingState?: React.ReactNode;\r\n /** Custom empty state renderer */\r\n emptyState?: React.ReactNode;\r\n}\r\n\r\nexport function DataTable<TData, TValue>({\r\n columns,\r\n data,\r\n isLoading = false,\r\n pagination,\r\n enableSorting = false,\r\n enableRowSelection = false,\r\n onRowSelectionChange,\r\n className,\r\n loadingState: customLoadingState,\r\n emptyState: customEmptyState,\r\n}: DataTableProps<TData, TValue>) {\r\n const [sorting, setSorting] = useState<SortingState>([]);\r\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({});\r\n const scrollAreaRef = useRef<HTMLDivElement>(null);\r\n const { canScrollLeft, canScrollRight, isScrollable, checkScroll } =\r\n useScrollDetection(scrollAreaRef);\r\n\r\n const {\r\n total = 0,\r\n limit = 10,\r\n pages = 1,\r\n page = 1,\r\n hasNext = false,\r\n hasPrev = false,\r\n onPageChange = () => {},\r\n } = pagination ?? {};\r\n\r\n const table = useReactTable({\r\n data,\r\n columns,\r\n getCoreRowModel: getCoreRowModel(),\r\n getSortedRowModel: enableSorting ? getSortedRowModel() : undefined,\r\n onSortingChange: setSorting,\r\n onRowSelectionChange: enableRowSelection\r\n ? (updater) => {\r\n setRowSelection(updater);\r\n if (onRowSelectionChange) {\r\n const newSelection =\r\n typeof updater === \"function\" ? updater(rowSelection) : updater;\r\n const selectedRows = data.filter((_, index) => newSelection[index]);\r\n onRowSelectionChange(selectedRows);\r\n }\r\n }\r\n : undefined,\r\n state: {\r\n sorting,\r\n rowSelection: enableRowSelection ? rowSelection : undefined,\r\n },\r\n enableRowSelection,\r\n });\r\n\r\n const scrollHorizontally = useCallback((direction: \"left\" | \"right\") => {\r\n const scrollContainer = scrollAreaRef.current?.querySelector(\r\n '[data-slot=\"scroll-area-viewport\"]'\r\n ) as HTMLElement | null;\r\n if (!scrollContainer) return;\r\n\r\n const scrollAmount = Math.min(300, scrollContainer.clientWidth * 0.8);\r\n scrollContainer.scrollBy({\r\n left: direction === \"left\" ? -scrollAmount : scrollAmount,\r\n behavior: \"smooth\",\r\n });\r\n }, []);\r\n\r\n const handleWheel = useCallback(\r\n (e: WheelEvent) => {\r\n if (!isScrollable) return;\r\n\r\n const scrollContainer = scrollAreaRef.current?.querySelector(\r\n '[data-slot=\"scroll-area-viewport\"]'\r\n ) as HTMLElement | null;\r\n if (!scrollContainer?.contains(e.target as Node)) return;\r\n\r\n if (e.shiftKey || Math.abs(e.deltaX) > Math.abs(e.deltaY)) {\r\n e.preventDefault();\r\n const delta = e.deltaY || e.deltaX;\r\n scrollContainer.scrollBy({\r\n left: delta,\r\n behavior: \"auto\",\r\n });\r\n }\r\n },\r\n [isScrollable]\r\n );\r\n\r\n useEffect(() => {\r\n const scrollContainer = scrollAreaRef.current?.querySelector(\r\n '[data-slot=\"scroll-area-viewport\"]'\r\n ) as HTMLElement | null;\r\n if (!scrollContainer) return;\r\n\r\n checkScroll();\r\n\r\n scrollContainer.addEventListener(\"scroll\", checkScroll, { passive: true });\r\n scrollContainer.addEventListener(\"wheel\", handleWheel, { passive: false });\r\n\r\n return () => {\r\n scrollContainer.removeEventListener(\"scroll\", checkScroll);\r\n scrollContainer.removeEventListener(\"wheel\", handleWheel);\r\n };\r\n }, [checkScroll, handleWheel]);\r\n\r\n useEffect(() => {\r\n const timer = setTimeout(checkScroll, 150);\r\n return () => clearTimeout(timer);\r\n }, [data, checkScroll]);\r\n\r\n const defaultLoadingState = useMemo(\r\n () => (\r\n <div className=\"w-full h-full min-h-[24rem] flex items-center justify-center bg-background/50 rounded-lg border border-border\">\r\n <div className=\"flex flex-col items-center gap-3\">\r\n <div className=\"animate-spin rounded-full h-8 w-8 border-2 border-primary border-t-transparent\" />\r\n <p className=\"text-sm text-muted-foreground\">Loading data...</p>\r\n </div>\r\n </div>\r\n ),\r\n []\r\n );\r\n\r\n const defaultEmptyState = useMemo(\r\n () => (\r\n <TableRow>\r\n <TableCell colSpan={columns.length} className=\"h-32 text-center\">\r\n <div className=\"flex flex-col items-center justify-center py-8\">\r\n <div className=\"rounded-full bg-muted p-3 mb-4\">\r\n <Search className=\"h-6 w-6 text-muted-foreground\" />\r\n </div>\r\n <p className=\"text-lg font-medium text-foreground mb-1\">No results found</p>\r\n <p className=\"text-sm text-muted-foreground\">\r\n Try adjusting your search or filters\r\n </p>\r\n </div>\r\n </TableCell>\r\n </TableRow>\r\n ),\r\n [columns.length]\r\n );\r\n\r\n if (isLoading) {\r\n return <>{customLoadingState || defaultLoadingState}</>;\r\n }\r\n\r\n return (\r\n <div className={cn(\"flex flex-col h-full gap-4\", className)}>\r\n <div className=\"flex-1 min-h-0 rounded-lg border overflow-hidden bg-background shadow-sm relative\">\r\n <ScrollArea ref={scrollAreaRef} className=\"h-full w-full\">\r\n <div className=\"min-w-full\">\r\n <Table>\r\n <TableHeader className=\"sticky top-0 z-10 bg-muted/50 backdrop-blur-sm\">\r\n {table.getHeaderGroups().map((headerGroup) => (\r\n <TableRow\r\n key={headerGroup.id}\r\n className=\"border-b border-border hover:bg-transparent\"\r\n >\r\n {headerGroup.headers.map((header) => (\r\n <TableHead\r\n key={header.id}\r\n className={cn(\r\n \"bg-muted/50 font-semibold text-foreground h-12 px-4 whitespace-nowrap\",\r\n \"first:rounded-tl-lg last:rounded-tr-lg\"\r\n )}\r\n >\r\n {header.isPlaceholder ? null : enableSorting &&\r\n header.column.getCanSort() ? (\r\n <Button\r\n variant=\"ghost\"\r\n onClick={() =>\r\n header.column.toggleSorting(\r\n header.column.getIsSorted() === \"asc\"\r\n )\r\n }\r\n className=\"h-auto p-0 font-semibold hover:bg-transparent whitespace-nowrap\"\r\n >\r\n {flexRender(\r\n header.column.columnDef.header,\r\n header.getContext()\r\n )}\r\n {header.column.getIsSorted() === \"asc\" ? (\r\n <ArrowUp className=\"ml-2 h-4 w-4\" />\r\n ) : header.column.getIsSorted() === \"desc\" ? (\r\n <ArrowDown className=\"ml-2 h-4 w-4\" />\r\n ) : (\r\n <ArrowUpDown className=\"ml-2 h-4 w-4 opacity-50\" />\r\n )}\r\n </Button>\r\n ) : (\r\n flexRender(\r\n header.column.columnDef.header,\r\n header.getContext()\r\n )\r\n )}\r\n </TableHead>\r\n ))}\r\n </TableRow>\r\n ))}\r\n </TableHeader>\r\n\r\n <TableBody>\r\n {table.getRowModel().rows?.length ? (\r\n table.getRowModel().rows.map((row, index) => (\r\n <TableRow\r\n key={row.id}\r\n className={cn(\r\n \"hover:bg-muted/50 transition-colors border-b border-border/50\",\r\n index % 2 === 0 ? \"bg-background\" : \"bg-muted/20\"\r\n )}\r\n >\r\n {row.getVisibleCells().map((cell) => (\r\n <TableCell\r\n key={cell.id}\r\n className=\"px-4 py-3 text-sm whitespace-nowrap\"\r\n >\r\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n ))\r\n ) : customEmptyState ? (\r\n <TableRow>\r\n <TableCell colSpan={columns.length} className=\"h-32 text-center\">\r\n {customEmptyState}\r\n </TableCell>\r\n </TableRow>\r\n ) : (\r\n defaultEmptyState\r\n )}\r\n </TableBody>\r\n </Table>\r\n </div>\r\n <ScrollBar orientation=\"horizontal\" />\r\n </ScrollArea>\r\n\r\n {/* Scroll navigation buttons */}\r\n {canScrollLeft && (\r\n <ScrollButton\r\n direction=\"left\"\r\n onClick={() => scrollHorizontally(\"left\")}\r\n visible={true}\r\n />\r\n )}\r\n {canScrollRight && (\r\n <ScrollButton\r\n direction=\"right\"\r\n onClick={() => scrollHorizontally(\"right\")}\r\n visible={true}\r\n />\r\n )}\r\n </div>\r\n\r\n {pagination && (\r\n <ApiPagination\r\n total={total}\r\n limit={limit}\r\n pages={pages}\r\n page={page}\r\n hasNext={hasNext}\r\n hasPrev={hasPrev}\r\n onPageChange={onPageChange}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { type ReactNode } from \"react\";\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogHeader,\r\n DialogTitle,\r\n DialogDescription,\r\n DialogFooter,\r\n DialogTrigger,\r\n} from \"@/components/ui/dialog\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { cn } from \"../utils\";\r\n\r\n// Size variants configuration\r\n// Uses max-w-none to reset any base max-width, then applies the desired constraint\r\nconst SIZE_VARIANTS = {\r\n sm: \"sm:max-w-sm\",\r\n default: \"sm:max-w-md\",\r\n lg: \"sm:max-w-lg md:max-w-2xl\",\r\n xl: \"sm:max-w-2xl md:max-w-4xl\",\r\n \"2xl\": \"sm:max-w-4xl md:max-w-6xl\",\r\n full: \"max-w-[95vw] h-[95vh]\",\r\n} as const;\r\n\r\ntype SizeVariant = keyof typeof SIZE_VARIANTS;\r\n\r\nexport interface DialogWrapperProps {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n title?: ReactNode;\r\n description?: ReactNode;\r\n children?: ReactNode;\r\n footer?: ReactNode;\r\n trigger?: ReactNode;\r\n size?: SizeVariant;\r\n className?: string;\r\n headerClassName?: string;\r\n contentClassName?: string;\r\n footerClassName?: string;\r\n hideHeader?: boolean;\r\n hideTitle?: boolean;\r\n hideDescription?: boolean;\r\n hideCloseButton?: boolean;\r\n}\r\n\r\nexport function DialogWrapper({\r\n open,\r\n onOpenChange,\r\n title,\r\n description,\r\n children,\r\n footer,\r\n trigger,\r\n size = \"default\",\r\n className,\r\n headerClassName,\r\n contentClassName,\r\n footerClassName,\r\n hideHeader = false,\r\n hideTitle = false,\r\n hideDescription = false,\r\n hideCloseButton = false,\r\n ...props\r\n}: DialogWrapperProps) {\r\n return (\r\n <Dialog open={open} onOpenChange={onOpenChange} {...props}>\r\n {trigger && <DialogTrigger render={trigger} />}\r\n <DialogContent\r\n showCloseButton={!hideCloseButton}\r\n className={cn(\"max-w-none\", SIZE_VARIANTS[size], contentClassName, className)}\r\n >\r\n {!hideHeader && (\r\n <DialogHeader className={cn(\"space-y-2\", headerClassName)}>\r\n {hideTitle ? (\r\n <DialogTitle className=\"sr-only\">{title || \"Dialog\"}</DialogTitle>\r\n ) : (\r\n <DialogTitle>{title || \"Dialog\"}</DialogTitle>\r\n )}\r\n {description &&\r\n (hideDescription ? (\r\n <DialogDescription className=\"sr-only\">\r\n {description}\r\n </DialogDescription>\r\n ) : (\r\n <DialogDescription>{description}</DialogDescription>\r\n ))}\r\n </DialogHeader>\r\n )}\r\n\r\n {children}\r\n\r\n {footer && (\r\n <DialogFooter className={cn(\"gap-2\", footerClassName)}>\r\n {footer}\r\n </DialogFooter>\r\n )}\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n\r\nexport interface FormDialogProps extends Omit<DialogWrapperProps, \"footer\"> {\r\n onSubmit?: (e: React.FormEvent<HTMLFormElement>) => void;\r\n onCancel?: () => void;\r\n submitText?: string;\r\n cancelText?: string;\r\n isLoading?: boolean;\r\n submitDisabled?: boolean;\r\n}\r\n\r\nexport function FormDialog({\r\n open,\r\n onOpenChange,\r\n title,\r\n description,\r\n children,\r\n onSubmit,\r\n onCancel,\r\n submitText = \"Save\",\r\n cancelText = \"Cancel\",\r\n isLoading = false,\r\n submitDisabled = false,\r\n ...props\r\n}: FormDialogProps) {\r\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\r\n e.preventDefault();\r\n onSubmit?.(e);\r\n };\r\n\r\n return (\r\n <DialogWrapper\r\n open={open}\r\n onOpenChange={onOpenChange}\r\n title={title}\r\n description={description}\r\n {...props}\r\n >\r\n <form onSubmit={handleSubmit}>\r\n {children}\r\n <DialogFooter className=\"gap-2 mt-4\">\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n onClick={onCancel || (() => onOpenChange(false))}\r\n disabled={isLoading}\r\n >\r\n {cancelText}\r\n </Button>\r\n <Button type=\"submit\" disabled={isLoading || submitDisabled}>\r\n {isLoading ? \"Loading...\" : submitText}\r\n </Button>\r\n </DialogFooter>\r\n </form>\r\n </DialogWrapper>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { MoreHorizontal, ChevronDown, LucideIcon } from \"lucide-react\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuTrigger,\r\n DropdownMenuSeparator,\r\n DropdownMenuLabel,\r\n DropdownMenuGroup,\r\n DropdownMenuCheckboxItem,\r\n DropdownMenuRadioGroup,\r\n DropdownMenuRadioItem,\r\n} from \"@/components/ui/dropdown-menu\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface DropdownWrapperProps {\r\n trigger: React.ReactNode;\r\n children: React.ReactNode;\r\n align?: \"start\" | \"center\" | \"end\";\r\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\r\n sideOffset?: number;\r\n className?: string;\r\n contentClassName?: string;\r\n}\r\n\r\nexport function DropdownWrapper({\r\n trigger,\r\n children,\r\n align = \"end\",\r\n side = \"bottom\",\r\n sideOffset = 4,\r\n className,\r\n contentClassName,\r\n ...props\r\n}: DropdownWrapperProps) {\r\n return (\r\n <DropdownMenu {...props}>\r\n <DropdownMenuTrigger render={trigger} />\r\n <DropdownMenuContent\r\n align={align}\r\n side={side}\r\n sideOffset={sideOffset}\r\n className={cn(\"min-w-[160px]\", contentClassName)}\r\n >\r\n {children}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n}\r\n\r\nexport interface ActionDropdownItem {\r\n type?: \"item\" | \"separator\" | \"label\" | \"group\";\r\n key?: string;\r\n label?: string | (() => string);\r\n icon?: LucideIcon;\r\n onClick?: (e: React.MouseEvent) => void;\r\n disabled?: boolean;\r\n hidden?: boolean;\r\n variant?: \"default\" | \"destructive\";\r\n shortcut?: string;\r\n className?: string;\r\n items?: ActionDropdownItem[];\r\n}\r\n\r\nexport interface ActionDropdownProps {\r\n items?: ActionDropdownItem[];\r\n triggerIcon?: LucideIcon;\r\n triggerVariant?: \"default\" | \"destructive\" | \"outline\" | \"secondary\" | \"ghost\" | \"link\";\r\n triggerSize?: \"default\" | \"sm\" | \"lg\" | \"icon\";\r\n triggerClassName?: string;\r\n triggerLabel?: string;\r\n showOnHover?: boolean;\r\n align?: \"start\" | \"center\" | \"end\";\r\n contentClassName?: string;\r\n onOpenChange?: (open: boolean) => void;\r\n stopPropagation?: boolean;\r\n}\r\n\r\nexport function ActionDropdown({\r\n items = [],\r\n triggerIcon: TriggerIcon = MoreHorizontal,\r\n triggerVariant = \"ghost\",\r\n triggerSize = \"sm\",\r\n triggerClassName,\r\n triggerLabel,\r\n showOnHover = false,\r\n align = \"end\",\r\n contentClassName,\r\n onOpenChange,\r\n stopPropagation = true,\r\n ...props\r\n}: ActionDropdownProps) {\r\n const handleTriggerClick = (e: React.MouseEvent) => {\r\n if (stopPropagation) {\r\n e.stopPropagation();\r\n }\r\n };\r\n\r\n const trigger = (\r\n <Button\r\n variant={triggerVariant}\r\n size={triggerSize}\r\n onClick={handleTriggerClick}\r\n className={cn(\r\n showOnHover && \"opacity-0 group-hover:opacity-100 transition-opacity\",\r\n triggerClassName\r\n )}\r\n >\r\n <TriggerIcon className=\"h-4 w-4\" />\r\n {triggerLabel && <span className=\"ml-2\">{triggerLabel}</span>}\r\n <span className=\"sr-only\">Open menu</span>\r\n </Button>\r\n );\r\n\r\n const handleItemClick = (item: ActionDropdownItem) => (e: React.MouseEvent) => {\r\n if (stopPropagation) {\r\n e.stopPropagation();\r\n }\r\n item.onClick?.(e);\r\n };\r\n\r\n return (\r\n <DropdownMenu onOpenChange={onOpenChange} {...props}>\r\n <DropdownMenuTrigger render={trigger} />\r\n <DropdownMenuContent\r\n align={align}\r\n className={cn(\"min-w-[180px]\", contentClassName)}\r\n >\r\n {items.map((item, index) => {\r\n if (item.hidden) return null;\r\n\r\n if (item.type === \"separator\") {\r\n return <DropdownMenuSeparator key={item.key || `separator-${index}`} />;\r\n }\r\n\r\n if (item.type === \"label\") {\r\n return (\r\n <DropdownMenuGroup key={item.key || `label-${index}`}>\r\n <DropdownMenuLabel className={item.className}>\r\n {item.label}\r\n </DropdownMenuLabel>\r\n </DropdownMenuGroup>\r\n );\r\n }\r\n\r\n if (item.type === \"group\") {\r\n return (\r\n <DropdownMenuGroup key={item.key || `group-${index}`}>\r\n {item.items?.map((groupItem, groupIndex) => {\r\n if (groupItem.hidden) return null;\r\n\r\n const GroupItemIcon = groupItem.icon;\r\n const groupItemLabel =\r\n typeof groupItem.label === \"function\" ? groupItem.label() : groupItem.label;\r\n return (\r\n <DropdownMenuItem\r\n key={groupItem.key || `group-item-${groupIndex}`}\r\n onClick={handleItemClick(groupItem)}\r\n disabled={groupItem.disabled}\r\n className={cn(\r\n groupItem.variant === \"destructive\" &&\r\n \"text-destructive focus:text-destructive\",\r\n groupItem.className\r\n )}\r\n >\r\n {GroupItemIcon && <GroupItemIcon className=\"h-4 w-4\" />}\r\n <span>{groupItemLabel}</span>\r\n {groupItem.shortcut && (\r\n <span className=\"ml-auto text-xs tracking-widest text-muted-foreground\">\r\n {groupItem.shortcut}\r\n </span>\r\n )}\r\n </DropdownMenuItem>\r\n );\r\n })}\r\n </DropdownMenuGroup>\r\n );\r\n }\r\n\r\n const ItemIcon = item.icon;\r\n const displayLabel =\r\n typeof item.label === \"function\" ? item.label() : item.label;\r\n\r\n return (\r\n <DropdownMenuItem\r\n key={item.key || `item-${index}`}\r\n onClick={handleItemClick(item)}\r\n disabled={item.disabled}\r\n className={cn(\r\n item.variant === \"destructive\" &&\r\n \"text-destructive focus:text-destructive\",\r\n item.className\r\n )}\r\n >\r\n {ItemIcon && <ItemIcon className=\"h-4 w-4\" />}\r\n <span>{displayLabel}</span>\r\n {item.shortcut && (\r\n <span className=\"ml-auto text-xs tracking-widest text-muted-foreground\">\r\n {item.shortcut}\r\n </span>\r\n )}\r\n </DropdownMenuItem>\r\n );\r\n })}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n}\r\n\r\nexport interface SelectDropdownOption {\r\n value: string;\r\n label: string;\r\n icon?: LucideIcon;\r\n}\r\n\r\nexport interface SelectDropdownProps {\r\n value?: string;\r\n onValueChange?: (value: string) => void;\r\n placeholder?: string;\r\n options?: SelectDropdownOption[];\r\n triggerClassName?: string;\r\n contentClassName?: string;\r\n disabled?: boolean;\r\n}\r\n\r\nexport function SelectDropdown({\r\n value,\r\n onValueChange,\r\n placeholder = \"Select option...\",\r\n options = [],\r\n triggerClassName,\r\n contentClassName,\r\n disabled = false,\r\n ...props\r\n}: SelectDropdownProps) {\r\n const selectedOption = options.find((option) => option.value === value);\r\n\r\n const trigger = (\r\n <Button\r\n variant=\"outline\"\r\n disabled={disabled}\r\n className={cn(\r\n \"w-full justify-between\",\r\n !selectedOption && \"text-muted-foreground\",\r\n triggerClassName\r\n )}\r\n >\r\n {selectedOption ? selectedOption.label : placeholder}\r\n <ChevronDown className=\"ml-2 h-4 w-4 shrink-0 opacity-50\" />\r\n </Button>\r\n );\r\n\r\n return (\r\n <DropdownMenu {...props}>\r\n <DropdownMenuTrigger render={trigger} />\r\n <DropdownMenuContent\r\n align=\"start\"\r\n className={cn(\r\n \"w-full min-w-(--anchor-width)\",\r\n contentClassName\r\n )}\r\n >\r\n {options.map((option) => (\r\n <DropdownMenuItem\r\n key={option.value}\r\n onClick={() => onValueChange?.(option.value)}\r\n className={cn(\"cursor-pointer\", value === option.value && \"bg-accent\")}\r\n >\r\n {option.icon && <option.icon className=\"mr-2 h-4 w-4\" />}\r\n {option.label}\r\n </DropdownMenuItem>\r\n ))}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n}\r\n\r\nexport interface CheckboxDropdownProps {\r\n values?: string[];\r\n onValuesChange?: (values: string[]) => void;\r\n placeholder?: string;\r\n options?: SelectDropdownOption[];\r\n triggerClassName?: string;\r\n contentClassName?: string;\r\n disabled?: boolean;\r\n showSelectedCount?: boolean;\r\n}\r\n\r\nexport function CheckboxDropdown({\r\n values = [],\r\n onValuesChange,\r\n placeholder = \"Select options...\",\r\n options = [],\r\n triggerClassName,\r\n contentClassName,\r\n disabled = false,\r\n showSelectedCount = true,\r\n ...props\r\n}: CheckboxDropdownProps) {\r\n const selectedOptions = options.filter((option) => values.includes(option.value));\r\n const displayText =\r\n selectedOptions.length > 0\r\n ? showSelectedCount\r\n ? `${selectedOptions.length} selected`\r\n : selectedOptions.map((opt) => opt.label).join(\", \")\r\n : placeholder;\r\n\r\n const trigger = (\r\n <Button\r\n variant=\"outline\"\r\n disabled={disabled}\r\n className={cn(\r\n \"w-full justify-between\",\r\n selectedOptions.length === 0 && \"text-muted-foreground\",\r\n triggerClassName\r\n )}\r\n >\r\n <span className=\"truncate\">{displayText}</span>\r\n <ChevronDown className=\"ml-2 h-4 w-4 shrink-0 opacity-50\" />\r\n </Button>\r\n );\r\n\r\n const handleCheckedChange = (optionValue: string, checked: boolean) => {\r\n if (checked) {\r\n onValuesChange?.([...values, optionValue]);\r\n } else {\r\n onValuesChange?.(values.filter((value) => value !== optionValue));\r\n }\r\n };\r\n\r\n return (\r\n <DropdownMenu {...props}>\r\n <DropdownMenuTrigger render={trigger} />\r\n <DropdownMenuContent\r\n align=\"start\"\r\n className={cn(\r\n \"w-full min-w-(--anchor-width)\",\r\n contentClassName\r\n )}\r\n >\r\n {options.map((option) => (\r\n <DropdownMenuCheckboxItem\r\n key={option.value}\r\n checked={values.includes(option.value)}\r\n onCheckedChange={(checked: boolean) => handleCheckedChange(option.value, checked)}\r\n >\r\n {option.icon && <option.icon className=\"mr-2 h-4 w-4\" />}\r\n {option.label}\r\n </DropdownMenuCheckboxItem>\r\n ))}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n}\r\n\r\nexport interface RadioDropdownProps {\r\n value?: string;\r\n onValueChange?: (value: string) => void;\r\n placeholder?: string;\r\n options?: SelectDropdownOption[];\r\n triggerClassName?: string;\r\n contentClassName?: string;\r\n disabled?: boolean;\r\n}\r\n\r\nexport function RadioDropdown({\r\n value,\r\n onValueChange,\r\n placeholder = \"Select option...\",\r\n options = [],\r\n triggerClassName,\r\n contentClassName,\r\n disabled = false,\r\n ...props\r\n}: RadioDropdownProps) {\r\n const selectedOption = options.find((option) => option.value === value);\r\n\r\n const trigger = (\r\n <Button\r\n variant=\"outline\"\r\n disabled={disabled}\r\n className={cn(\r\n \"w-full justify-between\",\r\n !selectedOption && \"text-muted-foreground\",\r\n triggerClassName\r\n )}\r\n >\r\n {selectedOption ? selectedOption.label : placeholder}\r\n <ChevronDown className=\"ml-2 h-4 w-4 shrink-0 opacity-50\" />\r\n </Button>\r\n );\r\n\r\n return (\r\n <DropdownMenu {...props}>\r\n <DropdownMenuTrigger render={trigger} />\r\n <DropdownMenuContent\r\n align=\"start\"\r\n className={cn(\r\n \"w-full min-w-(--anchor-width)\",\r\n contentClassName\r\n )}\r\n >\r\n <DropdownMenuRadioGroup value={value} onValueChange={onValueChange}>\r\n {options.map((option) => (\r\n <DropdownMenuRadioItem key={option.value} value={option.value}>\r\n {option.icon && <option.icon className=\"mr-2 h-4 w-4\" />}\r\n {option.label}\r\n </DropdownMenuRadioItem>\r\n ))}\r\n </DropdownMenuRadioGroup>\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { ComponentType, ReactNode } from \"react\";\r\nimport { LucideProps } from \"lucide-react\";\r\nimport { CopyText } from \"./copy-button\";\r\n\r\nexport interface InfoRowProps {\r\n label: string;\r\n value: ReactNode;\r\n copyable?: boolean;\r\n icon?: ComponentType<LucideProps>;\r\n}\r\n\r\nexport function InfoRow({ label, value, copyable = false, icon: Icon }: InfoRowProps) {\r\n if (!value && value !== 0) return null;\r\n\r\n return (\r\n <div className=\"flex flex-col sm:flex-row sm:justify-between sm:items-center py-3 gap-2 group hover:bg-muted rounded-md px-3 -mx-3 transition-colors\">\r\n <div className=\"flex items-center gap-2 min-w-0\">\r\n {Icon && <Icon className=\"h-4 w-4 text-muted-foreground flex-shrink-0\" />}\r\n <span className=\"text-sm font-medium text-muted-foreground truncate\">{label}</span>\r\n </div>\r\n <div className=\"sm:text-right min-w-0 flex-shrink-0\">\r\n {copyable ? (\r\n <CopyText\r\n value={String(value)}\r\n textClassName=\"text-foreground font-semibold\"\r\n maxLength={40}\r\n className=\"justify-start sm:justify-end\"\r\n />\r\n ) : (\r\n <span\r\n className=\"font-semibold text-foreground block truncate max-w-full sm:max-w-[250px]\"\r\n title={value?.toString() || \"N/A\"}\r\n >\r\n {value?.toString() || \"N/A\"}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { cva, VariantProps } from \"class-variance-authority\";\r\nimport { Item, ItemContent, ItemDescription } from \"@/components/ui/item\";\r\nimport { cn } from \"../utils\";\r\n\r\n/**\r\n * Item Component Helpers\r\n */\r\n\r\nconst iconItemMediaVariants = cva(\r\n \"rounded-xl flex items-center justify-center shrink-0\",\r\n {\r\n variants: {\r\n iconBg: {\r\n primary: \"bg-primary/10 text-primary\",\r\n gold: \"bg-primary/20 text-primary\",\r\n muted: \"bg-muted text-foreground\",\r\n gradient:\r\n \"bg-gradient-to-br from-primary/20 to-primary/10 text-primary\",\r\n none: \"bg-transparent\",\r\n },\r\n iconSize: {\r\n sm: \"size-8\",\r\n md: \"size-10 md:size-12\",\r\n lg: \"size-12 md:size-14\",\r\n xl: \"size-16 md:size-20\",\r\n },\r\n },\r\n defaultVariants: {\r\n iconBg: \"primary\",\r\n iconSize: \"md\",\r\n },\r\n },\r\n);\r\n\r\nconst iconSizeMap = {\r\n sm: 16,\r\n md: 20,\r\n lg: 24,\r\n xl: 32,\r\n};\r\n\r\nexport interface IconItemMediaProps\r\n extends\r\n React.HTMLAttributes<HTMLDivElement>,\r\n VariantProps<typeof iconItemMediaVariants> {\r\n icon?: React.ReactNode;\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport const IconItemMedia = React.memo(function IconItemMedia({\r\n icon,\r\n iconBg = \"primary\",\r\n iconSize = \"md\",\r\n className,\r\n children,\r\n ...props\r\n}: IconItemMediaProps) {\r\n return (\r\n <div\r\n data-slot=\"item-media\"\r\n role=\"presentation\"\r\n className={cn(iconItemMediaVariants({ iconBg, iconSize }), className)}\r\n {...props}\r\n >\r\n {children || icon}\r\n </div>\r\n );\r\n});\r\n\r\nIconItemMedia.displayName = \"IconItemMedia\";\r\n\r\nexport interface FeatureItemProps {\r\n icon?: React.ReactNode;\r\n iconBg?: \"primary\" | \"gold\" | \"muted\" | \"gradient\" | \"none\";\r\n iconSize?: \"sm\" | \"md\" | \"lg\" | \"xl\";\r\n title?: React.ReactNode;\r\n description?: React.ReactNode;\r\n variant?: \"default\" | \"outline\" | \"ghost\" | \"gradient-light\" | \"gradient\";\r\n size?: \"sm\" | \"default\" | \"lg\";\r\n layout?: \"vertical\" | \"horizontal\";\r\n titleAs?: React.ElementType;\r\n className?: string;\r\n titleClassName?: string;\r\n descriptionClassName?: string;\r\n iconClassName?: string;\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport const FeatureItem = React.memo(function FeatureItem({\r\n icon,\r\n iconBg = \"primary\",\r\n iconSize = \"md\",\r\n title,\r\n description,\r\n variant = \"outline\",\r\n size = \"default\",\r\n layout = \"vertical\",\r\n titleAs = \"h3\",\r\n className,\r\n titleClassName,\r\n descriptionClassName,\r\n iconClassName,\r\n children,\r\n ...props\r\n}: FeatureItemProps) {\r\n const hasGradientBorder =\r\n variant === \"gradient-light\" || variant === \"gradient\";\r\n const TitleComponent = titleAs;\r\n\r\n if (hasGradientBorder) {\r\n return (\r\n <div\r\n className={cn(\r\n variant === \"gradient-light\"\r\n ? \"gradient-border-light\"\r\n : \"gradient-border\",\r\n \"rounded-2xl hover:gradient-border-hover transition-all duration-300\",\r\n className,\r\n )}\r\n >\r\n <div\r\n className={cn(\r\n \"gradient-border-inner rounded-2xl p-6 flex\",\r\n layout === \"vertical\"\r\n ? \"flex-col items-start gap-4\"\r\n : \"flex-row items-center gap-4\",\r\n )}\r\n >\r\n {icon && (\r\n <IconItemMedia\r\n icon={icon}\r\n iconBg={iconBg}\r\n iconSize={iconSize}\r\n className={cn(\r\n layout === \"vertical\" ? \"\" : \"shrink-0\",\r\n iconClassName,\r\n )}\r\n />\r\n )}\r\n <div className=\"flex flex-col gap-2 flex-1\">\r\n {title && (\r\n <TitleComponent\r\n className={cn(\r\n \"text-base md:text-lg font-semibold text-foreground leading-tight\",\r\n titleClassName,\r\n )}\r\n >\r\n {title}\r\n </TitleComponent>\r\n )}\r\n {description && (\r\n <p\r\n className={cn(\r\n \"text-sm text-muted-foreground leading-relaxed\",\r\n descriptionClassName,\r\n )}\r\n >\r\n {description}\r\n </p>\r\n )}\r\n {children}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <Item\r\n variant={variant}\r\n size={size}\r\n className={cn(layout === \"vertical\" && \"flex-col items-start\", className)}\r\n {...props}\r\n >\r\n {icon && (\r\n <IconItemMedia\r\n icon={icon}\r\n iconBg={iconBg}\r\n iconSize={iconSize}\r\n className={iconClassName}\r\n />\r\n )}\r\n <ItemContent>\r\n {title && (\r\n <TitleComponent\r\n data-slot=\"item-title\"\r\n className={cn(\r\n \"text-base md:text-lg font-semibold text-foreground leading-tight mb-2\",\r\n titleClassName,\r\n )}\r\n >\r\n {title}\r\n </TitleComponent>\r\n )}\r\n {description && (\r\n <ItemDescription\r\n className={cn(\r\n \"text-sm text-muted-foreground leading-relaxed\",\r\n descriptionClassName,\r\n )}\r\n >\r\n {description}\r\n </ItemDescription>\r\n )}\r\n {children}\r\n </ItemContent>\r\n </Item>\r\n );\r\n});\r\n\r\nFeatureItem.displayName = \"FeatureItem\";\r\n\r\nexport interface FeatureListItem {\r\n id?: string;\r\n icon?: React.ReactNode;\r\n iconBg?: \"primary\" | \"gold\" | \"muted\" | \"gradient\" | \"none\";\r\n iconSize?: \"sm\" | \"md\" | \"lg\" | \"xl\";\r\n title: string;\r\n description?: string;\r\n}\r\n\r\nexport interface FeatureListProps {\r\n items?: FeatureListItem[];\r\n columns?: 2 | 3 | 4;\r\n variant?: \"default\" | \"outline\" | \"ghost\" | \"gradient-light\" | \"gradient\";\r\n iconBg?: \"primary\" | \"gold\" | \"muted\" | \"gradient\" | \"none\";\r\n iconSize?: \"sm\" | \"md\" | \"lg\" | \"xl\";\r\n layout?: \"vertical\" | \"horizontal\";\r\n className?: string;\r\n itemClassName?: string;\r\n}\r\n\r\nexport function FeatureList({\r\n items = [],\r\n columns = 3,\r\n variant = \"outline\",\r\n iconBg = \"primary\",\r\n iconSize = \"md\",\r\n layout = \"vertical\",\r\n className,\r\n itemClassName,\r\n ...props\r\n}: FeatureListProps) {\r\n const gridCols: Record<number, string> = {\r\n 2: \"md:grid-cols-2\",\r\n 3: \"md:grid-cols-2 lg:grid-cols-3\",\r\n 4: \"md:grid-cols-2 lg:grid-cols-4\",\r\n };\r\n\r\n return (\r\n <div\r\n role=\"list\"\r\n className={cn(\"grid gap-6\", gridCols[columns] || gridCols[3], className)}\r\n {...props}\r\n >\r\n {items.map((item, index) => (\r\n <FeatureItem\r\n key={item.id || item.title || index}\r\n icon={item.icon}\r\n iconBg={item.iconBg || iconBg}\r\n iconSize={item.iconSize || iconSize}\r\n title={item.title}\r\n description={item.description}\r\n variant={variant}\r\n layout={layout}\r\n className={itemClassName}\r\n />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nFeatureList.displayName = \"FeatureList\";\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { Moon, Sun } from \"lucide-react\";\r\nimport { useTheme } from \"next-themes\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuRadioGroup,\r\n DropdownMenuRadioItem,\r\n DropdownMenuTrigger,\r\n} from \"@/components/ui/dropdown-menu\";\r\n\r\nexport function ModeToggle() {\r\n const { theme, setTheme } = useTheme();\r\n const [mounted, setMounted] = React.useState(false);\r\n\r\n React.useEffect(() => {\r\n setMounted(true);\r\n }, []);\r\n\r\n if (!mounted) {\r\n return (\r\n <Button variant=\"ghost\" size=\"icon\">\r\n <Sun className=\"h-[1.2rem] w-[1.2rem]\" />\r\n <span className=\"sr-only\">Toggle theme</span>\r\n </Button>\r\n );\r\n }\r\n\r\n return (\r\n <DropdownMenu modal={false}>\r\n <DropdownMenuTrigger render={<Button variant=\"ghost\" size=\"icon\" />}>\r\n <Sun className=\"h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0\" />\r\n <Moon className=\"absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100\" />\r\n <span className=\"sr-only\">Toggle theme</span>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"end\">\r\n <DropdownMenuRadioGroup value={theme} onValueChange={setTheme}>\r\n <DropdownMenuRadioItem value=\"light\">Light</DropdownMenuRadioItem>\r\n <DropdownMenuRadioItem value=\"dark\">Dark</DropdownMenuRadioItem>\r\n <DropdownMenuRadioItem value=\"system\">System</DropdownMenuRadioItem>\r\n </DropdownMenuRadioGroup>\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { ChevronDown } from \"lucide-react\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport {\r\n Command,\r\n CommandEmpty,\r\n CommandGroup,\r\n CommandInput,\r\n CommandItem,\r\n CommandList,\r\n} from \"@/components/ui/command\";\r\nimport { InputGroup, InputGroupAddon, InputGroupInput } from \"@/components/ui/input-group\";\r\nimport {\r\n Popover,\r\n PopoverContent,\r\n PopoverTrigger,\r\n} from \"@/components/ui/popover\";\r\nimport { ScrollArea } from \"@/components/ui/scroll-area\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface PhoneCountry {\r\n code: string;\r\n name: string;\r\n dialCode: string;\r\n flag: string;\r\n}\r\n\r\n// Common countries with emoji flags - prioritize UK and common countries\r\nexport const DEFAULT_COUNTRIES: PhoneCountry[] = [\r\n { code: \"GB\", name: \"United Kingdom\", dialCode: \"+44\", flag: \"\\u{1F1EC}\\u{1F1E7}\" },\r\n { code: \"US\", name: \"United States\", dialCode: \"+1\", flag: \"\\u{1F1FA}\\u{1F1F8}\" },\r\n { code: \"IE\", name: \"Ireland\", dialCode: \"+353\", flag: \"\\u{1F1EE}\\u{1F1EA}\" },\r\n { code: \"FR\", name: \"France\", dialCode: \"+33\", flag: \"\\u{1F1EB}\\u{1F1F7}\" },\r\n { code: \"DE\", name: \"Germany\", dialCode: \"+49\", flag: \"\\u{1F1E9}\\u{1F1EA}\" },\r\n { code: \"IT\", name: \"Italy\", dialCode: \"+39\", flag: \"\\u{1F1EE}\\u{1F1F9}\" },\r\n { code: \"ES\", name: \"Spain\", dialCode: \"+34\", flag: \"\\u{1F1EA}\\u{1F1F8}\" },\r\n { code: \"NL\", name: \"Netherlands\", dialCode: \"+31\", flag: \"\\u{1F1F3}\\u{1F1F1}\" },\r\n { code: \"BE\", name: \"Belgium\", dialCode: \"+32\", flag: \"\\u{1F1E7}\\u{1F1EA}\" },\r\n { code: \"PT\", name: \"Portugal\", dialCode: \"+351\", flag: \"\\u{1F1F5}\\u{1F1F9}\" },\r\n { code: \"CH\", name: \"Switzerland\", dialCode: \"+41\", flag: \"\\u{1F1E8}\\u{1F1ED}\" },\r\n { code: \"AT\", name: \"Austria\", dialCode: \"+43\", flag: \"\\u{1F1E6}\\u{1F1F9}\" },\r\n { code: \"SE\", name: \"Sweden\", dialCode: \"+46\", flag: \"\\u{1F1F8}\\u{1F1EA}\" },\r\n { code: \"NO\", name: \"Norway\", dialCode: \"+47\", flag: \"\\u{1F1F3}\\u{1F1F4}\" },\r\n { code: \"DK\", name: \"Denmark\", dialCode: \"+45\", flag: \"\\u{1F1E9}\\u{1F1F0}\" },\r\n { code: \"PL\", name: \"Poland\", dialCode: \"+48\", flag: \"\\u{1F1F5}\\u{1F1F1}\" },\r\n { code: \"GR\", name: \"Greece\", dialCode: \"+30\", flag: \"\\u{1F1EC}\\u{1F1F7}\" },\r\n { code: \"CZ\", name: \"Czech Republic\", dialCode: \"+420\", flag: \"\\u{1F1E8}\\u{1F1FF}\" },\r\n { code: \"RO\", name: \"Romania\", dialCode: \"+40\", flag: \"\\u{1F1F7}\\u{1F1F4}\" },\r\n { code: \"HU\", name: \"Hungary\", dialCode: \"+36\", flag: \"\\u{1F1ED}\\u{1F1FA}\" },\r\n { code: \"AU\", name: \"Australia\", dialCode: \"+61\", flag: \"\\u{1F1E6}\\u{1F1FA}\" },\r\n { code: \"NZ\", name: \"New Zealand\", dialCode: \"+64\", flag: \"\\u{1F1F3}\\u{1F1FF}\" },\r\n { code: \"CA\", name: \"Canada\", dialCode: \"+1\", flag: \"\\u{1F1E8}\\u{1F1E6}\" },\r\n { code: \"IN\", name: \"India\", dialCode: \"+91\", flag: \"\\u{1F1EE}\\u{1F1F3}\" },\r\n { code: \"PK\", name: \"Pakistan\", dialCode: \"+92\", flag: \"\\u{1F1F5}\\u{1F1F0}\" },\r\n { code: \"BD\", name: \"Bangladesh\", dialCode: \"+880\", flag: \"\\u{1F1E7}\\u{1F1E9}\" },\r\n { code: \"AE\", name: \"UAE\", dialCode: \"+971\", flag: \"\\u{1F1E6}\\u{1F1EA}\" },\r\n { code: \"SA\", name: \"Saudi Arabia\", dialCode: \"+966\", flag: \"\\u{1F1F8}\\u{1F1E6}\" },\r\n { code: \"QA\", name: \"Qatar\", dialCode: \"+974\", flag: \"\\u{1F1F6}\\u{1F1E6}\" },\r\n { code: \"KW\", name: \"Kuwait\", dialCode: \"+965\", flag: \"\\u{1F1F0}\\u{1F1FC}\" },\r\n { code: \"SG\", name: \"Singapore\", dialCode: \"+65\", flag: \"\\u{1F1F8}\\u{1F1EC}\" },\r\n { code: \"MY\", name: \"Malaysia\", dialCode: \"+60\", flag: \"\\u{1F1F2}\\u{1F1FE}\" },\r\n { code: \"JP\", name: \"Japan\", dialCode: \"+81\", flag: \"\\u{1F1EF}\\u{1F1F5}\" },\r\n { code: \"KR\", name: \"South Korea\", dialCode: \"+82\", flag: \"\\u{1F1F0}\\u{1F1F7}\" },\r\n { code: \"CN\", name: \"China\", dialCode: \"+86\", flag: \"\\u{1F1E8}\\u{1F1F3}\" },\r\n { code: \"HK\", name: \"Hong Kong\", dialCode: \"+852\", flag: \"\\u{1F1ED}\\u{1F1F0}\" },\r\n { code: \"TW\", name: \"Taiwan\", dialCode: \"+886\", flag: \"\\u{1F1F9}\\u{1F1FC}\" },\r\n { code: \"TH\", name: \"Thailand\", dialCode: \"+66\", flag: \"\\u{1F1F9}\\u{1F1ED}\" },\r\n { code: \"PH\", name: \"Philippines\", dialCode: \"+63\", flag: \"\\u{1F1F5}\\u{1F1ED}\" },\r\n { code: \"VN\", name: \"Vietnam\", dialCode: \"+84\", flag: \"\\u{1F1FB}\\u{1F1F3}\" },\r\n { code: \"ID\", name: \"Indonesia\", dialCode: \"+62\", flag: \"\\u{1F1EE}\\u{1F1E9}\" },\r\n { code: \"ZA\", name: \"South Africa\", dialCode: \"+27\", flag: \"\\u{1F1FF}\\u{1F1E6}\" },\r\n { code: \"NG\", name: \"Nigeria\", dialCode: \"+234\", flag: \"\\u{1F1F3}\\u{1F1EC}\" },\r\n { code: \"EG\", name: \"Egypt\", dialCode: \"+20\", flag: \"\\u{1F1EA}\\u{1F1EC}\" },\r\n { code: \"BR\", name: \"Brazil\", dialCode: \"+55\", flag: \"\\u{1F1E7}\\u{1F1F7}\" },\r\n { code: \"MX\", name: \"Mexico\", dialCode: \"+52\", flag: \"\\u{1F1F2}\\u{1F1FD}\" },\r\n { code: \"AR\", name: \"Argentina\", dialCode: \"+54\", flag: \"\\u{1F1E6}\\u{1F1F7}\" },\r\n { code: \"TR\", name: \"Turkey\", dialCode: \"+90\", flag: \"\\u{1F1F9}\\u{1F1F7}\" },\r\n { code: \"RU\", name: \"Russia\", dialCode: \"+7\", flag: \"\\u{1F1F7}\\u{1F1FA}\" },\r\n { code: \"IL\", name: \"Israel\", dialCode: \"+972\", flag: \"\\u{1F1EE}\\u{1F1F1}\" },\r\n];\r\n\r\nexport interface PhoneInputProps\r\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"onChange\"> {\r\n onChange?: (value: string) => void;\r\n defaultCountry?: string;\r\n /** Custom list of countries to show. Defaults to a built-in list of ~50 countries. */\r\n countries?: PhoneCountry[];\r\n ref?: React.Ref<HTMLInputElement>;\r\n}\r\n\r\nfunction PhoneInput({\r\n className,\r\n onChange,\r\n value,\r\n defaultCountry = \"GB\",\r\n countries = DEFAULT_COUNTRIES,\r\n disabled,\r\n placeholder = \"Phone number\",\r\n ref,\r\n ...props\r\n}: PhoneInputProps) {\r\n const [isOpen, setIsOpen] = React.useState(false);\r\n const [searchValue, setSearchValue] = React.useState(\"\");\r\n\r\n const getCountryByCode = React.useCallback(\r\n (code: string) => countries.find((c) => c.code === code),\r\n [countries]\r\n );\r\n\r\n // Parse the value to extract country and number\r\n const parseValue = React.useCallback(\r\n (val: string | number | readonly string[] | undefined) => {\r\n const valString = val ? String(val) : \"\";\r\n if (!valString) {\r\n return {\r\n country: getCountryByCode(defaultCountry) || countries[0],\r\n number: \"\",\r\n };\r\n }\r\n\r\n // Try to match country by dial code\r\n const cleanVal = valString.replace(/\\s/g, \"\");\r\n for (const country of countries) {\r\n if (cleanVal.startsWith(country.dialCode)) {\r\n return {\r\n country,\r\n number: cleanVal.slice(country.dialCode.length),\r\n };\r\n }\r\n }\r\n\r\n // Default to selected country\r\n return {\r\n country: getCountryByCode(defaultCountry) || countries[0],\r\n number: cleanVal.replace(/^\\+/, \"\"),\r\n };\r\n },\r\n [defaultCountry, countries, getCountryByCode]\r\n );\r\n\r\n const { country, number } = parseValue(value);\r\n const [selectedCountry, setSelectedCountry] = React.useState<PhoneCountry>(country);\r\n\r\n // Update selected country when value changes\r\n React.useEffect(() => {\r\n const parsed = parseValue(value);\r\n setSelectedCountry(parsed.country);\r\n }, [value, parseValue]);\r\n\r\n const handleCountryChange = (newCountry: PhoneCountry) => {\r\n setSelectedCountry(newCountry);\r\n setIsOpen(false);\r\n // Update the full value with new country code\r\n if (number) {\r\n onChange?.(newCountry.dialCode + number);\r\n }\r\n };\r\n\r\n const handleNumberChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const newNumber = e.target.value.replace(/[^\\d]/g, \"\");\r\n if (newNumber) {\r\n onChange?.(selectedCountry.dialCode + newNumber);\r\n } else {\r\n onChange?.(\"\");\r\n }\r\n };\r\n\r\n return (\r\n <InputGroup className={className}>\r\n <InputGroupAddon align=\"inline-start\" className=\"p-0 overflow-hidden\">\r\n <Popover\r\n open={isOpen}\r\n modal\r\n onOpenChange={(open: boolean) => {\r\n setIsOpen(open);\r\n if (open) setSearchValue(\"\");\r\n }}\r\n >\r\n <PopoverTrigger\r\n render={\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n className=\"gap-1.5 rounded-none border-r px-3 focus:z-10 min-w-[90px] h-full\"\r\n disabled={disabled}\r\n >\r\n <span className=\"text-base leading-none\">\r\n {selectedCountry.flag}\r\n </span>\r\n <span className=\"text-xs text-muted-foreground\">\r\n {selectedCountry.dialCode}\r\n </span>\r\n <ChevronDown className=\"size-3.5 opacity-50\" />\r\n </Button>\r\n }\r\n />\r\n <PopoverContent className=\"w-[280px] p-0\" align=\"start\">\r\n <Command>\r\n <CommandInput\r\n value={searchValue}\r\n onValueChange={setSearchValue}\r\n placeholder=\"Search country...\"\r\n />\r\n <CommandList>\r\n <ScrollArea className=\"h-64\">\r\n <CommandEmpty>No country found.</CommandEmpty>\r\n <CommandGroup>\r\n {countries.filter(\r\n (c) =>\r\n c.name.toLowerCase().includes(searchValue.toLowerCase()) ||\r\n c.dialCode.includes(searchValue) ||\r\n c.code.toLowerCase().includes(searchValue.toLowerCase())\r\n ).map((c) => (\r\n <CommandItem\r\n key={c.code}\r\n className=\"gap-2 cursor-pointer\"\r\n onSelect={() => handleCountryChange(c)}\r\n value={`${c.name} ${c.code} ${c.dialCode}`}\r\n >\r\n <span className=\"text-base\">{c.flag}</span>\r\n <span className=\"flex-1 text-sm\">{c.name}</span>\r\n <span className=\"text-sm text-muted-foreground\">\r\n {c.dialCode}\r\n </span>\r\n </CommandItem>\r\n ))}\r\n </CommandGroup>\r\n </ScrollArea>\r\n </CommandList>\r\n </Command>\r\n </PopoverContent>\r\n </Popover>\r\n </InputGroupAddon>\r\n <InputGroupInput\r\n ref={ref}\r\n type=\"tel\"\r\n inputMode=\"numeric\"\r\n className=\"rounded-s-none\"\r\n placeholder={placeholder}\r\n value={number}\r\n onChange={handleNumberChange}\r\n disabled={disabled}\r\n {...props}\r\n />\r\n </InputGroup>\r\n );\r\n}\r\n\r\nexport { PhoneInput };\r\n","\"use client\";\r\n\r\nimport { ReactNode, ComponentType } from \"react\";\r\nimport { ChevronDownIcon, ChevronUpIcon, MinusIcon, LucideProps } from \"lucide-react\";\r\nimport { Badge } from \"@/components/ui/badge\";\r\nimport { Avatar, AvatarImage, AvatarFallback } from \"@/components/ui/avatar\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface PillProps {\r\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"outline\";\r\n themed?: boolean;\r\n className?: string;\r\n children?: ReactNode;\r\n}\r\n\r\nexport function Pill({\r\n variant = \"secondary\",\r\n themed = false,\r\n className,\r\n ...props\r\n}: PillProps) {\r\n return (\r\n <Badge\r\n className={cn(\"gap-2 rounded-full px-3 py-1.5 font-normal\", className)}\r\n variant={variant}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nexport interface PillAvatarProps {\r\n fallback?: string;\r\n className?: string;\r\n src?: string;\r\n alt?: string;\r\n}\r\n\r\nexport function PillAvatar({ fallback, className, src, alt, ...props }: PillAvatarProps) {\r\n return (\r\n <Avatar className={cn(\"-ml-1 h-4 w-4\", className)}>\r\n <AvatarImage src={src} alt={alt} {...props} />\r\n <AvatarFallback>{fallback}</AvatarFallback>\r\n </Avatar>\r\n );\r\n}\r\n\r\nexport interface PillButtonProps {\r\n className?: string;\r\n children?: ReactNode;\r\n onClick?: () => void;\r\n}\r\n\r\nexport function PillButton({ className, ...props }: PillButtonProps) {\r\n return (\r\n <Button\r\n className={cn(\"-my-2 -mr-2 size-6 rounded-full p-0.5 hover:bg-foreground/5\", className)}\r\n size=\"icon\"\r\n variant=\"ghost\"\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nexport interface PillStatusProps {\r\n children?: ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function PillStatus({ children, className, ...props }: PillStatusProps) {\r\n return (\r\n <div\r\n className={cn(\"flex items-center gap-2 border-r pr-2 font-medium\", className)}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\nexport interface PillIndicatorProps {\r\n variant?: \"success\" | \"error\" | \"warning\" | \"info\";\r\n pulse?: boolean;\r\n}\r\n\r\nexport function PillIndicator({ variant = \"success\", pulse = false }: PillIndicatorProps) {\r\n return (\r\n <span className=\"relative flex size-2\">\r\n {pulse && (\r\n <span\r\n className={cn(\r\n \"absolute inline-flex h-full w-full animate-ping rounded-full opacity-75\",\r\n variant === \"success\" && \"bg-emerald-400\",\r\n variant === \"error\" && \"bg-rose-400\",\r\n variant === \"warning\" && \"bg-amber-400\",\r\n variant === \"info\" && \"bg-sky-400\"\r\n )}\r\n />\r\n )}\r\n <span\r\n className={cn(\r\n \"relative inline-flex size-2 rounded-full\",\r\n variant === \"success\" && \"bg-emerald-500\",\r\n variant === \"error\" && \"bg-rose-500\",\r\n variant === \"warning\" && \"bg-amber-500\",\r\n variant === \"info\" && \"bg-sky-500\"\r\n )}\r\n />\r\n </span>\r\n );\r\n}\r\n\r\nexport interface PillDeltaProps {\r\n className?: string;\r\n delta?: number;\r\n}\r\n\r\nexport function PillDelta({ className, delta }: PillDeltaProps) {\r\n if (!delta) {\r\n return <MinusIcon className={cn(\"size-3 text-muted-foreground\", className)} />;\r\n }\r\n\r\n if (delta > 0) {\r\n return <ChevronUpIcon className={cn(\"size-3 text-emerald-500\", className)} />;\r\n }\r\n\r\n return <ChevronDownIcon className={cn(\"size-3 text-rose-500\", className)} />;\r\n}\r\n\r\nexport interface PillIconProps extends LucideProps {\r\n icon: ComponentType<LucideProps>;\r\n className?: string;\r\n}\r\n\r\nexport function PillIcon({ icon: Icon, className, ...props }: PillIconProps) {\r\n return (\r\n <Icon className={cn(\"size-3 text-muted-foreground\", className)} size={12} {...props} />\r\n );\r\n}\r\n\r\nexport interface PillAvatarGroupProps {\r\n children?: ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function PillAvatarGroup({ children, className, ...props }: PillAvatarGroupProps) {\r\n return (\r\n <div\r\n className={cn(\r\n \"-space-x-1 flex items-center\",\r\n \"[&>*:not(:first-of-type)]:mask-[radix-gradient(circle_9px_at_-4px_50%,transparent_99%,white_100%)]\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { memo, useMemo, ReactNode } from \"react\";\r\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from \"@/components/ui/tabs\";\r\nimport { ScrollArea } from \"@/components/ui/scroll-area\";\r\nimport { cn } from \"../utils\";\r\n\r\nconst LIST_BASE_CLASS =\r\n \"flex flex-wrap items-center justify-start gap-1 h-auto rounded-md p-1 shadow-sm transition-colors\";\r\n\r\nconst LIST_VARIANTS: Record<string, string> = {\r\n default: \"border border-border/50 bg-muted/60 backdrop-blur-sm\",\r\n primary: \"border border-primary/30 bg-primary/10\",\r\n secondary: \"border border-secondary/40 bg-secondary/10\",\r\n outline: \"border border-border bg-background\",\r\n ghost: \"border border-transparent bg-transparent shadow-none\",\r\n underline:\r\n \"w-full mb-4 rounded-none border-b border-border/60 bg-transparent p-0 shadow-none gap-6\",\r\n};\r\n\r\nconst TRIGGER_VARIANTS: Record<string, string> = {\r\n default:\r\n \"text-muted-foreground hover:bg-muted/40 hover:text-foreground data-active:bg-background data-active:text-foreground data-active:shadow-sm\",\r\n primary:\r\n \"text-primary hover:bg-primary/10 hover:text-primary data-active:bg-primary data-active:text-primary-foreground\",\r\n secondary:\r\n \"text-secondary-foreground hover:bg-secondary/10 hover:text-secondary-foreground data-active:bg-secondary data-active:text-secondary-foreground\",\r\n outline:\r\n \"text-foreground hover:bg-accent/40 hover:text-accent-foreground data-active:bg-accent data-active:text-accent-foreground\",\r\n ghost:\r\n \"text-muted-foreground hover:bg-muted/30 hover:text-foreground data-active:bg-muted data-active:text-foreground\",\r\n underline:\r\n \"text-muted-foreground rounded-none px-0 py-2 hover:bg-transparent hover:text-primary border-b-2 border-transparent data-active:border-primary data-active:text-primary data-active:shadow-none\",\r\n};\r\n\r\nexport interface TabsWrapperProps {\r\n defaultValue?: string;\r\n value?: string;\r\n onValueChange?: (value: string) => void;\r\n children: ReactNode;\r\n className?: string;\r\n listClassName?: string;\r\n contentClassName?: string;\r\n variant?:\r\n | \"default\"\r\n | \"primary\"\r\n | \"secondary\"\r\n | \"outline\"\r\n | \"ghost\"\r\n | \"underline\";\r\n orientation?: \"horizontal\" | \"vertical\";\r\n layout?: \"default\" | \"flex\" | \"sidebar\";\r\n withScrollArea?: boolean;\r\n scrollAreaClassName?: string;\r\n}\r\n\r\nexport const TabsWrapper = memo(function TabsWrapper({\r\n defaultValue,\r\n value,\r\n onValueChange,\r\n children,\r\n className,\r\n listClassName,\r\n contentClassName,\r\n variant = \"default\",\r\n orientation = \"horizontal\",\r\n layout = \"default\",\r\n withScrollArea = false,\r\n scrollAreaClassName,\r\n ...props\r\n}: TabsWrapperProps) {\r\n const isFlexLayout = useMemo(\r\n () => layout === \"flex\" || layout === \"sidebar\",\r\n [layout],\r\n );\r\n\r\n const computedClasses = useMemo(\r\n () => ({\r\n root: cn(\"w-full\", isFlexLayout && \"flex-1 flex flex-col\", className),\r\n list: cn(\r\n LIST_BASE_CLASS,\r\n isFlexLayout ? \"w-full\" : \"w-fit\",\r\n !isFlexLayout && variant !== \"underline\" && \"mb-6\",\r\n LIST_VARIANTS[variant] ?? LIST_VARIANTS.default,\r\n listClassName,\r\n ),\r\n }),\r\n [isFlexLayout, className, variant, listClassName],\r\n );\r\n\r\n return (\r\n <Tabs\r\n defaultValue={defaultValue}\r\n value={value}\r\n onValueChange={onValueChange}\r\n orientation={orientation}\r\n className={computedClasses.root}\r\n {...props}\r\n >\r\n <TabsList className={computedClasses.list}>{children}</TabsList>\r\n </Tabs>\r\n );\r\n});\r\n\r\nexport interface TabTriggerProps {\r\n value: string;\r\n children: ReactNode;\r\n className?: string;\r\n variant?:\r\n | \"default\"\r\n | \"primary\"\r\n | \"secondary\"\r\n | \"outline\"\r\n | \"ghost\"\r\n | \"underline\";\r\n icon?: ReactNode;\r\n hideTextOnMobile?: boolean;\r\n disabled?: boolean;\r\n}\r\n\r\nexport const TabTrigger = memo(function TabTrigger({\r\n value,\r\n children,\r\n className,\r\n variant = \"default\",\r\n icon,\r\n hideTextOnMobile = false,\r\n disabled = false,\r\n ...props\r\n}: TabTriggerProps) {\r\n const computedClassName = useMemo(\r\n () =>\r\n cn(\r\n \"flex items-center gap-2 transition-colors duration-200\",\r\n TRIGGER_VARIANTS[variant] ?? TRIGGER_VARIANTS.default,\r\n className,\r\n ),\r\n [variant, className],\r\n );\r\n\r\n return (\r\n <TabsTrigger\r\n value={value}\r\n disabled={disabled}\r\n className={computedClassName}\r\n {...props}\r\n >\r\n {icon}\r\n {hideTextOnMobile ? (\r\n <span className=\"hidden sm:inline\">{children}</span>\r\n ) : (\r\n children\r\n )}\r\n </TabsTrigger>\r\n );\r\n});\r\n\r\nexport interface TabContentProps {\r\n value: string;\r\n children: ReactNode;\r\n className?: string;\r\n withScrollArea?: boolean;\r\n scrollAreaClassName?: string;\r\n padding?: boolean;\r\n keepMounted?: boolean;\r\n}\r\n\r\nexport const TabContent = memo(function TabContent({\r\n value,\r\n children,\r\n className,\r\n withScrollArea = false,\r\n scrollAreaClassName,\r\n padding = true,\r\n keepMounted = false,\r\n ...props\r\n}: TabContentProps) {\r\n const contentClassName = useMemo(\r\n () =>\r\n cn(\r\n \"space-y-4\",\r\n padding && !withScrollArea && \"mt-6\",\r\n withScrollArea && \"mt-0 h-full\",\r\n className,\r\n ),\r\n [padding, withScrollArea, className],\r\n );\r\n\r\n const scrollAreaPaddingClassName = useMemo(\r\n () => cn(padding && \"px-6 py-4\"),\r\n [padding],\r\n );\r\n\r\n return (\r\n <TabsContent\r\n value={value}\r\n keepMounted={keepMounted}\r\n className={contentClassName}\r\n {...props}\r\n >\r\n {withScrollArea ? (\r\n <ScrollArea className={cn(\"h-full\", scrollAreaClassName)}>\r\n <div className={scrollAreaPaddingClassName}>{children}</div>\r\n </ScrollArea>\r\n ) : (\r\n children\r\n )}\r\n </TabsContent>\r\n );\r\n});\r\n\r\nexport interface DynamicTabItem {\r\n value: string;\r\n label: ReactNode;\r\n content: ReactNode;\r\n icon?: ReactNode;\r\n disabled?: boolean;\r\n hideTextOnMobile?: boolean;\r\n}\r\n\r\nexport interface DynamicTabsProps {\r\n tabs?: DynamicTabItem[];\r\n defaultValue?: string;\r\n value?: string;\r\n onValueChange?: (value: string) => void;\r\n variant?:\r\n | \"default\"\r\n | \"primary\"\r\n | \"secondary\"\r\n | \"outline\"\r\n | \"ghost\"\r\n | \"underline\";\r\n layout?: \"default\" | \"flex\" | \"sidebar\";\r\n className?: string;\r\n listClassName?: string;\r\n listWrapperClassName?: string;\r\n contentClassName?: string;\r\n scrollable?: boolean;\r\n}\r\n\r\nexport const DynamicTabs = memo(function DynamicTabs({\r\n tabs = [],\r\n defaultValue,\r\n value,\r\n onValueChange,\r\n variant = \"default\",\r\n layout = \"default\",\r\n className,\r\n listClassName,\r\n listWrapperClassName,\r\n contentClassName,\r\n scrollable = false,\r\n ...props\r\n}: DynamicTabsProps) {\r\n const isFlexLayout = useMemo(\r\n () => layout === \"flex\" || layout === \"sidebar\",\r\n [layout],\r\n );\r\n const useSheetDefaults = isFlexLayout && scrollable;\r\n\r\n const computedClasses = useMemo(\r\n () => ({\r\n root: cn(\r\n \"w-full\",\r\n isFlexLayout && \"flex-1 flex flex-col min-h-0\",\r\n className,\r\n ),\r\n listWrapper: cn(\r\n \"w-full\",\r\n useSheetDefaults ? \"px-0\" : \"px-6\",\r\n listWrapperClassName,\r\n ),\r\n flexList: cn(\r\n \"flex flex-wrap items-center justify-center gap-1 h-auto\",\r\n variant === \"underline\"\r\n ? \"rounded-none border-b border-border/60 bg-transparent p-0 shadow-none gap-6\"\r\n : \"rounded-md p-1 shadow-sm backdrop-blur-sm\",\r\n LIST_VARIANTS[variant] ?? LIST_VARIANTS.default,\r\n useSheetDefaults && \"mb-4 gap-0.5\",\r\n listClassName,\r\n ),\r\n standardList: cn(\r\n LIST_BASE_CLASS,\r\n variant !== \"underline\" && \"w-fit mb-6\",\r\n LIST_VARIANTS[variant] ?? LIST_VARIANTS.default,\r\n listClassName,\r\n ),\r\n contentWrapper: cn(isFlexLayout && \"flex-1 min-h-0 overflow-hidden\"),\r\n flexContent: cn(\r\n \"mt-0 h-full\",\r\n useSheetDefaults && \"px-1\",\r\n contentClassName,\r\n ),\r\n standardContent: cn(\r\n isFlexLayout ? \"h-full\" : \"space-y-4 mt-6\",\r\n contentClassName,\r\n ),\r\n }),\r\n [\r\n isFlexLayout,\r\n useSheetDefaults,\r\n className,\r\n listWrapperClassName,\r\n listClassName,\r\n variant,\r\n contentClassName,\r\n ],\r\n );\r\n\r\n return (\r\n <Tabs\r\n defaultValue={defaultValue}\r\n value={value}\r\n onValueChange={onValueChange}\r\n className={computedClasses.root}\r\n {...props}\r\n >\r\n {isFlexLayout ? (\r\n <div className={computedClasses.listWrapper}>\r\n <TabsList className={computedClasses.flexList}>\r\n {tabs.map((tab) => (\r\n <TabTrigger\r\n key={tab.value}\r\n value={tab.value}\r\n variant={variant}\r\n disabled={tab.disabled}\r\n className=\"justify-center px-3 py-2 text-xs sm:text-sm shrink-0\"\r\n >\r\n {tab.icon}\r\n {tab.hideTextOnMobile ? (\r\n <span className=\"hidden sm:inline\">{tab.label}</span>\r\n ) : (\r\n tab.label\r\n )}\r\n </TabTrigger>\r\n ))}\r\n </TabsList>\r\n </div>\r\n ) : (\r\n <TabsList className={computedClasses.standardList}>\r\n {tabs.map((tab) => (\r\n <TabTrigger\r\n key={tab.value}\r\n value={tab.value}\r\n variant={variant}\r\n disabled={tab.disabled}\r\n className=\"whitespace-nowrap\"\r\n >\r\n {tab.icon}\r\n {tab.hideTextOnMobile ? (\r\n <span className=\"hidden sm:inline text-sm\">{tab.label}</span>\r\n ) : (\r\n <span className=\"text-sm\">{tab.label}</span>\r\n )}\r\n </TabTrigger>\r\n ))}\r\n </TabsList>\r\n )}\r\n\r\n <div className={computedClasses.contentWrapper}>\r\n {isFlexLayout && scrollable ? (\r\n <ScrollArea className=\"h-full w-full\">\r\n {tabs.map((tab) => (\r\n <TabsContent\r\n key={tab.value}\r\n value={tab.value}\r\n className={computedClasses.flexContent}\r\n >\r\n {tab.content}\r\n </TabsContent>\r\n ))}\r\n </ScrollArea>\r\n ) : (\r\n tabs.map((tab) => (\r\n <TabsContent\r\n key={tab.value}\r\n value={tab.value}\r\n className={computedClasses.standardContent}\r\n >\r\n {tab.content}\r\n </TabsContent>\r\n ))\r\n )}\r\n </div>\r\n </Tabs>\r\n );\r\n});\r\n","\"use client\";\r\n\r\nimport { useState, ReactNode } from \"react\";\r\nimport { ArrowLeft, ArrowRight } from \"lucide-react\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport {\r\n ResizableHandle,\r\n ResizablePanel,\r\n ResizablePanelGroup,\r\n} from \"@/components/ui/resizable\";\r\nimport { useMediaQuery } from \"../hooks/use-media-query\";\r\nimport { DynamicTabs } from \"./tabs-wrapper\";\r\nimport { cn } from \"../utils\";\r\n\r\ninterface PanelConfig {\r\n title?: string;\r\n icon?: ReactNode;\r\n content: ReactNode;\r\n badge?: ReactNode;\r\n}\r\n\r\nexport interface ResponsiveSplitLayoutProps {\r\n leftPanel: PanelConfig;\r\n rightPanel: PanelConfig;\r\n className?: string;\r\n leftPanelClassName?: string;\r\n rightPanelClassName?: string;\r\n variant?: \"default\" | \"tabs\" | \"fixed\";\r\n desktopVariant?: \"default\" | \"tabs\" | \"fixed\";\r\n mobileVariant?: \"default\" | \"tabs\" | \"fixed\";\r\n defaultLayout?: [number, number];\r\n minSizes?: [number, number];\r\n rightPanelWidth?: number;\r\n persistLayoutKey?: string;\r\n mobileBreakpoint?: \"sm\" | \"md\" | \"lg\" | \"xl\";\r\n forceMobile?: boolean;\r\n forceDesktop?: boolean;\r\n}\r\n\r\nexport function ResponsiveSplitLayout({\r\n leftPanel,\r\n rightPanel,\r\n className,\r\n leftPanelClassName,\r\n rightPanelClassName,\r\n variant = \"default\",\r\n desktopVariant,\r\n mobileVariant,\r\n defaultLayout = [50, 50],\r\n minSizes = [20, 20],\r\n rightPanelWidth = 400,\r\n persistLayoutKey,\r\n mobileBreakpoint = \"md\",\r\n forceMobile = false,\r\n forceDesktop = false,\r\n}: ResponsiveSplitLayoutProps) {\r\n const [mobileView, setMobileView] = useState<\"left\" | \"right\">(\"left\");\r\n\r\n const breakpoints = {\r\n sm: 640,\r\n md: 768,\r\n lg: 1024,\r\n xl: 1280,\r\n };\r\n\r\n const mobileMaxWidth = breakpoints[mobileBreakpoint] - 1;\r\n const isMobileMedia = useMediaQuery(`(max-width: ${mobileMaxWidth}px)`, false);\r\n const isMobile = forceDesktop ? false : forceMobile ? true : isMobileMedia;\r\n\r\n const effectiveMobileVariant = mobileVariant ?? variant;\r\n const effectiveDesktopVariant = desktopVariant ?? variant;\r\n\r\n // Mobile view with tabs\r\n if (isMobile && effectiveMobileVariant === \"tabs\") {\r\n const tabs = [\r\n {\r\n value: \"left\",\r\n label: (\r\n <div className=\"flex items-center gap-2\">\r\n {leftPanel.icon}\r\n {leftPanel.title || \"Left\"}\r\n </div>\r\n ),\r\n content: (\r\n <div className={cn(\"h-full overflow-y-auto\", leftPanelClassName)}>\r\n {leftPanel.content}\r\n </div>\r\n ),\r\n },\r\n {\r\n value: \"right\",\r\n label: (\r\n <div className=\"flex items-center gap-2\">\r\n {rightPanel.icon}\r\n {rightPanel.title || \"Right\"}\r\n {rightPanel.badge && (\r\n <span className=\"ml-1 bg-primary text-primary-foreground text-xs rounded-full h-5 w-5 flex items-center justify-center\">\r\n {rightPanel.badge}\r\n </span>\r\n )}\r\n </div>\r\n ),\r\n content: (\r\n <div className={cn(\"h-full overflow-y-auto\", rightPanelClassName)}>\r\n {rightPanel.content}\r\n </div>\r\n ),\r\n },\r\n ];\r\n\r\n return (\r\n <div className={cn(\"h-full flex flex-col\", className)}>\r\n <DynamicTabs\r\n tabs={tabs}\r\n defaultValue=\"left\"\r\n value={mobileView}\r\n onValueChange={(val) => setMobileView(val as \"left\" | \"right\")}\r\n variant=\"default\"\r\n layout=\"flex\"\r\n className=\"h-full\"\r\n listWrapperClassName=\"px-4 py-2 flex-shrink-0\"\r\n contentClassName=\"mt-0 flex-1 min-h-0\"\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n // Mobile view with navigation buttons (default)\r\n if (isMobile) {\r\n const showLeft = mobileView === \"left\";\r\n const showRight = mobileView === \"right\";\r\n\r\n return (\r\n <div className={cn(\"flex flex-col h-full\", className)}>\r\n <div className=\"flex-1 overflow-hidden\">\r\n <div className={cn(\"h-full\", !showLeft && \"hidden\", leftPanelClassName)}>\r\n {leftPanel.content}\r\n </div>\r\n\r\n <div className={cn(\"h-full\", !showRight && \"hidden\", rightPanelClassName)}>\r\n {rightPanel.content}\r\n </div>\r\n </div>\r\n\r\n <div className=\"border-t p-4 bg-background\">\r\n <div className=\"flex items-center justify-between max-w-md mx-auto\">\r\n <Button\r\n variant={mobileView === \"left\" ? \"default\" : \"outline\"}\r\n onClick={() => setMobileView(\"left\")}\r\n className=\"flex-1 mr-2\"\r\n >\r\n {mobileView === \"right\" && <ArrowLeft className=\"h-4 w-4 mr-2\" />}\r\n {leftPanel.icon}\r\n <span className=\"ml-2\">{leftPanel.title || \"Left\"}</span>\r\n </Button>\r\n\r\n <Button\r\n variant={mobileView === \"right\" ? \"default\" : \"outline\"}\r\n onClick={() => setMobileView(\"right\")}\r\n className=\"flex-1 ml-2 relative\"\r\n >\r\n <span className=\"mr-2\">{rightPanel.title || \"Right\"}</span>\r\n {rightPanel.icon}\r\n {mobileView === \"left\" && <ArrowRight className=\"h-4 w-4 ml-2\" />}\r\n {rightPanel.badge && (\r\n <span className=\"absolute -top-2 -right-2 bg-primary text-primary-foreground text-xs rounded-full h-6 w-6 flex items-center justify-center\">\r\n {rightPanel.badge}\r\n </span>\r\n )}\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // Desktop view with fixed right panel width\r\n if (effectiveDesktopVariant === \"fixed\") {\r\n return (\r\n <div className={cn(\"flex h-full\", className)}>\r\n <div className={cn(\"flex-1 overflow-auto border-r\", leftPanelClassName)}>\r\n {leftPanel.content}\r\n </div>\r\n\r\n <div\r\n className={cn(\"overflow-auto\", rightPanelClassName)}\r\n style={{\r\n width: rightPanelWidth,\r\n minWidth: rightPanelWidth,\r\n flexShrink: 0,\r\n }}\r\n >\r\n {rightPanel.content}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // Desktop view with resizable panels (default)\r\n return (\r\n <ResizablePanelGroup\r\n direction=\"horizontal\"\r\n className={cn(\"h-full\", className)}\r\n autoSaveId={persistLayoutKey}\r\n >\r\n <ResizablePanel defaultSize={defaultLayout[0]} minSize={minSizes[0]}>\r\n <div className={cn(\"h-full overflow-auto\", leftPanelClassName)}>\r\n {leftPanel.content}\r\n </div>\r\n </ResizablePanel>\r\n\r\n <ResizableHandle withHandle />\r\n\r\n <ResizablePanel defaultSize={defaultLayout[1]} minSize={minSizes[1]}>\r\n <div className={cn(\"h-full overflow-auto\", rightPanelClassName)}>\r\n {rightPanel.content}\r\n </div>\r\n </ResizablePanel>\r\n </ResizablePanelGroup>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { ReactNode } from \"react\";\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TableHeader,\r\n TableRow,\r\n} from \"@/components/ui/table\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface TableWrapperColumn {\r\n key?: string;\r\n header: ReactNode;\r\n className?: string;\r\n cellClassName?: string;\r\n render?: (item: any, index: number) => ReactNode;\r\n}\r\n\r\nexport interface TableWrapperEmptyState {\r\n icon?: ReactNode;\r\n title?: string;\r\n description?: string;\r\n}\r\n\r\nexport interface TableWrapperProps {\r\n title?: ReactNode;\r\n description?: ReactNode;\r\n icon?: ReactNode;\r\n children?: ReactNode;\r\n columns?: TableWrapperColumn[];\r\n data?: any[];\r\n renderRow?: (item: any, index: number) => ReactNode;\r\n emptyState?: TableWrapperEmptyState;\r\n className?: string;\r\n tableClassName?: string;\r\n maxHeight?: string;\r\n}\r\n\r\nexport function TableWrapper({\r\n title,\r\n description,\r\n icon,\r\n children,\r\n columns,\r\n data,\r\n renderRow,\r\n emptyState,\r\n className,\r\n tableClassName,\r\n maxHeight = \"500px\",\r\n ...props\r\n}: TableWrapperProps) {\r\n const hasData = data && data.length > 0;\r\n\r\n const defaultEmptyState = emptyState || {\r\n icon: icon,\r\n title: \"No data available\",\r\n description: \"There are no items to display\",\r\n };\r\n\r\n return (\r\n <div className={cn(\"space-y-4\", className)} {...props}>\r\n {(title || description) && (\r\n <div className=\"space-y-1\">\r\n {title && <h3 className=\"text-lg font-semibold\">{title}</h3>}\r\n {description && (\r\n <p className=\"text-sm text-muted-foreground\">{description}</p>\r\n )}\r\n </div>\r\n )}\r\n\r\n {!hasData ? (\r\n <div className=\"flex flex-col items-center justify-center h-48 text-muted-foreground border rounded-lg\">\r\n {defaultEmptyState.icon && (\r\n <div className=\"h-12 w-12 mb-4 opacity-50\">{defaultEmptyState.icon}</div>\r\n )}\r\n <p className=\"text-lg\">{defaultEmptyState.title}</p>\r\n {defaultEmptyState.description && (\r\n <p className=\"text-sm\">{defaultEmptyState.description}</p>\r\n )}\r\n </div>\r\n ) : (\r\n <div\r\n className={cn(\r\n \"relative overflow-auto border rounded-lg\",\r\n maxHeight && `max-h-[${maxHeight}]`\r\n )}\r\n >\r\n <Table className={tableClassName}>\r\n {columns && (\r\n <TableHeader>\r\n <TableRow>\r\n {columns.map((column, index) => (\r\n <TableHead\r\n key={`table-column-head-${column.key ?? column.header ?? index}`}\r\n className={cn(column.className)}\r\n >\r\n {column.header}\r\n </TableHead>\r\n ))}\r\n </TableRow>\r\n </TableHeader>\r\n )}\r\n <TableBody>\r\n {data?.map((item, index) =>\r\n renderRow ? (\r\n renderRow(item, index)\r\n ) : (\r\n <TableRow key={`table-row-${index}`}>{children}</TableRow>\r\n )\r\n )}\r\n </TableBody>\r\n </Table>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport interface SimpleTableProps extends Omit<TableWrapperProps, \"renderRow\" | \"children\"> {\r\n columns: TableWrapperColumn[];\r\n data: any[];\r\n}\r\n\r\nexport function SimpleTable({\r\n title,\r\n data,\r\n columns,\r\n emptyState,\r\n className,\r\n ...props\r\n}: SimpleTableProps) {\r\n const renderRow = (item: any, index: number) => (\r\n <TableRow key={`simple-table-row-${index}`}>\r\n {columns.map((column, colIndex) => (\r\n <TableCell\r\n key={`simple-table-cell-${column.key ?? column.header ?? colIndex}`}\r\n className={column.cellClassName}\r\n >\r\n {column.render ? column.render(item, index) : item[column.key!]}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n );\r\n\r\n return (\r\n <TableWrapper\r\n title={title}\r\n data={data}\r\n columns={columns}\r\n renderRow={renderRow}\r\n emptyState={emptyState}\r\n className={className}\r\n {...props}\r\n />\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { type ReactNode } from \"react\";\r\nimport {\r\n Tooltip,\r\n TooltipContent,\r\n TooltipTrigger,\r\n} from \"@/components/ui/tooltip\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface TooltipWrapperProps {\r\n children: ReactNode;\r\n content: ReactNode;\r\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\r\n align?: \"start\" | \"center\" | \"end\";\r\n delay?: number;\r\n sideOffset?: number;\r\n className?: string;\r\n contentClassName?: string;\r\n disabled?: boolean;\r\n}\r\n\r\nexport function TooltipWrapper({\r\n children,\r\n content,\r\n side = \"top\",\r\n align = \"center\",\r\n delay = 700,\r\n sideOffset = 4,\r\n className,\r\n contentClassName,\r\n disabled = false,\r\n ...props\r\n}: TooltipWrapperProps) {\r\n if (disabled || !content) {\r\n return <>{children}</>;\r\n }\r\n\r\n return (\r\n <Tooltip delay={delay} {...props}>\r\n <TooltipTrigger className={className} render={children} />\r\n <TooltipContent side={side} align={align} sideOffset={sideOffset} className={cn(contentClassName)}>\r\n {content}\r\n </TooltipContent>\r\n </Tooltip>\r\n );\r\n}\r\n\r\nexport interface ButtonTooltipProps extends Omit<TooltipWrapperProps, \"content\"> {\r\n tooltip: ReactNode;\r\n variant?: \"default\" | \"outline\" | \"ghost\";\r\n size?: \"default\" | \"sm\" | \"lg\" | \"icon\";\r\n}\r\n\r\nexport function ButtonTooltip({\r\n children,\r\n tooltip,\r\n variant = \"outline\",\r\n size = \"icon\",\r\n className,\r\n ...props\r\n}: ButtonTooltipProps) {\r\n return (\r\n <TooltipWrapper content={tooltip} {...props}>\r\n {children}\r\n </TooltipWrapper>\r\n );\r\n}\r\n\r\nexport interface IconTooltipProps extends Omit<TooltipWrapperProps, \"content\" | \"children\"> {\r\n icon: ReactNode;\r\n tooltip: ReactNode;\r\n iconClassName?: string;\r\n size?: number;\r\n}\r\n\r\nexport function IconTooltip({\r\n icon,\r\n tooltip,\r\n className,\r\n iconClassName,\r\n size = 16,\r\n ...props\r\n}: IconTooltipProps) {\r\n return (\r\n <TooltipWrapper content={tooltip} className={className} {...props}>\r\n <div className={cn(\"cursor-pointer\", iconClassName)}>\r\n {typeof icon === \"string\" ? <span style={{ fontSize: size }}>{icon}</span> : icon}\r\n </div>\r\n </TooltipWrapper>\r\n );\r\n}\r\n\r\nexport interface InfoTooltipProps extends Omit<TooltipWrapperProps, \"content\" | \"children\"> {\r\n tooltip: ReactNode;\r\n size?: number;\r\n}\r\n\r\nexport function InfoTooltip({ tooltip, className, size = 16, ...props }: InfoTooltipProps) {\r\n return (\r\n <TooltipWrapper\r\n content={tooltip}\r\n className={cn(\"inline-flex items-center\", className)}\r\n {...props}\r\n >\r\n <div\r\n className=\"rounded-full bg-muted text-muted-foreground hover:bg-muted/80 transition-colors cursor-help inline-flex items-center justify-center\"\r\n style={{ width: size, height: size, fontSize: size * 0.6 }}\r\n >\r\n ?\r\n </div>\r\n </TooltipWrapper>\r\n );\r\n}\r\n\r\nexport interface ActionTooltipProps extends Omit<TooltipWrapperProps, \"content\"> {\r\n tooltip: ReactNode;\r\n action?: () => void;\r\n variant?: \"ghost\" | \"outline\";\r\n size?: \"sm\" | \"icon\";\r\n}\r\n\r\nexport function ActionTooltip({\r\n children,\r\n tooltip,\r\n action,\r\n variant = \"ghost\",\r\n size = \"sm\",\r\n className,\r\n ...props\r\n}: ActionTooltipProps) {\r\n return (\r\n <TooltipWrapper content={tooltip} {...props}>\r\n <button\r\n onClick={action}\r\n className={cn(\r\n \"inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors\",\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\r\n \"disabled:opacity-50 disabled:pointer-events-none\",\r\n variant === \"ghost\" && \"hover:bg-accent hover:text-accent-foreground\",\r\n variant === \"outline\" && \"border border-input hover:bg-accent hover:text-accent-foreground\",\r\n size === \"sm\" && \"h-8 px-2\",\r\n size === \"icon\" && \"h-8 w-8\",\r\n className\r\n )}\r\n >\r\n {children}\r\n </button>\r\n </TooltipWrapper>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport type { ChangeEvent, ReactNode, InputHTMLAttributes } from \"react\";\r\nimport * as React from \"react\";\r\nimport { Controller } from \"react-hook-form\";\r\nimport type { Control, FieldValues, FieldPath } from \"react-hook-form\";\r\nimport { Input } from \"@/components/ui/input\";\r\nimport {\r\n Field,\r\n FieldLabel,\r\n FieldDescription,\r\n FieldError,\r\n} from \"@/components/ui/field\";\r\nimport {\r\n InputGroup,\r\n InputGroupAddon,\r\n InputGroupInput,\r\n} from \"@/components/ui/input-group\";\r\nimport { cn } from \"../../utils\";\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\ninterface TransformFunctions {\r\n input?: (value: unknown) => string;\r\n output?: (value: string) => unknown;\r\n}\r\n\r\nexport interface FormInputProps<TFieldValues extends FieldValues = FieldValues> {\r\n // React Hook Form\r\n control?: Control<TFieldValues>;\r\n name: FieldPath<TFieldValues> | string;\r\n\r\n // Field configuration\r\n label?: string;\r\n placeholder?: string;\r\n description?: string;\r\n helperText?: string; // Alias for description\r\n required?: boolean;\r\n disabled?: boolean;\r\n readOnly?: boolean;\r\n type?: string;\r\n\r\n // Styling\r\n className?: string;\r\n labelClassName?: string;\r\n inputClassName?: string;\r\n inputGroupClassName?: string;\r\n\r\n // Input group addons\r\n iconLeft?: ReactNode;\r\n iconRight?: ReactNode;\r\n addonLeft?: ReactNode;\r\n addonRight?: ReactNode;\r\n\r\n // Value transformation\r\n transform?: TransformFunctions;\r\n onValueChange?: (value: unknown) => void;\r\n\r\n // Direct usage (without react-hook-form)\r\n value?: string | number;\r\n onChange?: (value: unknown) => void;\r\n\r\n // HTML input attributes\r\n min?: number | string;\r\n max?: number | string;\r\n step?: number | string;\r\n minLength?: number;\r\n maxLength?: number;\r\n pattern?: string;\r\n autoComplete?: string;\r\n autoFocus?: boolean;\r\n inputMode?: InputHTMLAttributes<HTMLInputElement>[\"inputMode\"];\r\n enterKeyHint?: InputHTMLAttributes<HTMLInputElement>[\"enterKeyHint\"];\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\n/**\r\n * FormInput - Text input with react-hook-form integration\r\n *\r\n * Features:\r\n * - Works with react-hook-form Controller\r\n * - Supports input groups with icons/addons\r\n * - Value transformation (input/output)\r\n * - Can be used standalone without form\r\n *\r\n * @example\r\n * ```tsx\r\n * // With react-hook-form\r\n * <FormInput\r\n * control={form.control}\r\n * name=\"email\"\r\n * type=\"email\"\r\n * label=\"Email\"\r\n * placeholder=\"user@example.com\"\r\n * required\r\n * />\r\n *\r\n * // With icon\r\n * <FormInput\r\n * control={form.control}\r\n * name=\"search\"\r\n * iconLeft={<SearchIcon />}\r\n * placeholder=\"Search...\"\r\n * />\r\n * ```\r\n */\r\nexport function FormInput<TFieldValues extends FieldValues = FieldValues>({\r\n control,\r\n name,\r\n label,\r\n placeholder,\r\n description,\r\n helperText,\r\n required,\r\n disabled,\r\n readOnly,\r\n type = \"text\",\r\n className,\r\n labelClassName,\r\n inputClassName,\r\n inputGroupClassName,\r\n iconLeft,\r\n iconRight,\r\n addonLeft,\r\n addonRight,\r\n onValueChange,\r\n transform,\r\n value,\r\n onChange,\r\n min,\r\n max,\r\n step,\r\n minLength,\r\n maxLength,\r\n pattern,\r\n autoComplete,\r\n autoFocus,\r\n inputMode,\r\n enterKeyHint,\r\n}: FormInputProps<TFieldValues>) {\r\n // Use helperText as alias for description\r\n const descriptionText = description || helperText;\r\n\r\n const handleChange = (\r\n e: ChangeEvent<HTMLInputElement>,\r\n field?: { onChange: (value: unknown) => void }\r\n ) => {\r\n const newValue = transform?.output\r\n ? transform.output(e.target.value)\r\n : e.target.value;\r\n\r\n if (field) {\r\n field.onChange(newValue);\r\n } else if (onChange) {\r\n onChange(newValue);\r\n }\r\n\r\n onValueChange?.(newValue);\r\n };\r\n\r\n // Determine if we need InputGroup (has icons or addons)\r\n const hasInputGroup =\r\n iconLeft || iconRight || addonLeft || addonRight;\r\n\r\n const renderInput = (\r\n field?: {\r\n value: unknown;\r\n onChange: (value: unknown) => void;\r\n onBlur: () => void;\r\n name: string;\r\n ref: React.Ref<HTMLInputElement>;\r\n },\r\n isDisabled?: boolean,\r\n fieldState?: { invalid?: boolean; error?: { message?: string } }\r\n ) => {\r\n const rawValue = field\r\n ? transform?.input\r\n ? transform.input(field.value)\r\n : field.value\r\n : transform?.input\r\n ? transform.input(value)\r\n : value;\r\n const safeValue = (rawValue as string) ?? \"\";\r\n\r\n // Build input props - only include valid HTML attributes\r\n const inputProps: React.InputHTMLAttributes<HTMLInputElement> & {\r\n ref?: React.Ref<HTMLInputElement>;\r\n } = {\r\n id: name,\r\n name: field?.name || name,\r\n type,\r\n disabled: isDisabled,\r\n readOnly,\r\n placeholder,\r\n value: safeValue,\r\n onChange: (e: ChangeEvent<HTMLInputElement>) => handleChange(e, field),\r\n onBlur: field?.onBlur,\r\n \"aria-invalid\": fieldState?.invalid || undefined,\r\n };\r\n\r\n // Add optional HTML input attributes only if defined\r\n if (min !== undefined) inputProps.min = min;\r\n if (max !== undefined) inputProps.max = max;\r\n if (step !== undefined) inputProps.step = step;\r\n if (minLength !== undefined) inputProps.minLength = minLength;\r\n if (maxLength !== undefined) inputProps.maxLength = maxLength;\r\n if (pattern !== undefined) inputProps.pattern = pattern;\r\n if (autoComplete !== undefined) inputProps.autoComplete = autoComplete;\r\n if (autoFocus !== undefined) inputProps.autoFocus = autoFocus;\r\n if (inputMode !== undefined) inputProps.inputMode = inputMode;\r\n if (enterKeyHint !== undefined) inputProps.enterKeyHint = enterKeyHint;\r\n\r\n // Add field ref if present\r\n if (field?.ref) {\r\n inputProps.ref = field.ref;\r\n }\r\n\r\n if (hasInputGroup) {\r\n return (\r\n <InputGroup\r\n className={cn(inputGroupClassName)}\r\n data-disabled={isDisabled}\r\n >\r\n {(addonLeft || iconLeft) && (\r\n <InputGroupAddon align=\"inline-start\">\r\n {addonLeft || iconLeft}\r\n </InputGroupAddon>\r\n )}\r\n <InputGroupInput {...inputProps} className={inputClassName} />\r\n {(addonRight || iconRight) && (\r\n <InputGroupAddon align=\"inline-end\">\r\n {addonRight || iconRight}\r\n </InputGroupAddon>\r\n )}\r\n </InputGroup>\r\n );\r\n }\r\n\r\n return <Input {...inputProps} className={inputClassName} />;\r\n };\r\n\r\n // Direct usage without React Hook Form\r\n if (!control) {\r\n return (\r\n <Field className={className} data-disabled={disabled}>\r\n {label && (\r\n <FieldLabel htmlFor={name} className={labelClassName}>\r\n {label}\r\n {required && <span className=\"text-destructive ml-1\">*</span>}\r\n </FieldLabel>\r\n )}\r\n {renderInput(undefined, disabled, undefined)}\r\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\r\n </Field>\r\n );\r\n }\r\n\r\n // Using with React Hook Form\r\n return (\r\n <Controller\r\n name={name as FieldPath<TFieldValues>}\r\n control={control}\r\n render={({ field, fieldState }) => (\r\n <Field\r\n className={className}\r\n data-disabled={disabled}\r\n data-invalid={fieldState.invalid}\r\n >\r\n {label && (\r\n <FieldLabel htmlFor={name} className={labelClassName}>\r\n {label}\r\n {required && <span className=\"text-destructive ml-1\">*</span>}\r\n </FieldLabel>\r\n )}\r\n {renderInput(field, disabled, fieldState)}\r\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\r\n {fieldState.invalid && fieldState.error && (\r\n <FieldError errors={[fieldState.error]} />\r\n )}\r\n </Field>\r\n )}\r\n />\r\n );\r\n}\r\n","\"use client\";\n\nimport type { ChangeEvent } from \"react\";\nimport * as React from \"react\";\nimport { useState, useEffect } from \"react\";\nimport { Controller } from \"react-hook-form\";\nimport type { Control, FieldValues, FieldPath } from \"react-hook-form\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupTextarea,\n} from \"@/components/ui/input-group\";\nimport { cn } from \"../../utils\";\nimport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n} from \"@/components/ui/field\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface FormTextareaProps<TFieldValues extends FieldValues = FieldValues> {\n // React Hook Form\n control?: Control<TFieldValues>;\n name: FieldPath<TFieldValues> | string;\n\n // Field configuration\n label?: string;\n placeholder?: string;\n description?: string;\n helperText?: string;\n required?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n rows?: number;\n\n // Value handling\n value?: string;\n onChange?: (value: string) => void;\n onValueChange?: (value: string) => void;\n\n // Styling\n className?: string;\n labelClassName?: string;\n textareaClassName?: string;\n inputGroupClassName?: string;\n\n // Input group addons\n iconLeft?: React.ReactNode;\n iconRight?: React.ReactNode;\n addonLeft?: React.ReactNode;\n addonRight?: React.ReactNode;\n\n // HTML textarea attributes\n minLength?: number;\n maxLength?: number;\n autoComplete?: string;\n autoFocus?: boolean;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\n/**\n * FormTextarea - Textarea with react-hook-form integration\n *\n * @example\n * ```tsx\n * <FormTextarea\n * control={form.control}\n * name=\"bio\"\n * label=\"Biography\"\n * placeholder=\"Tell us about yourself...\"\n * rows={5}\n * />\n * ```\n */\nexport function FormTextarea<TFieldValues extends FieldValues = FieldValues>({\n control,\n name,\n label,\n description,\n helperText,\n required,\n disabled,\n readOnly,\n placeholder,\n value: propValue,\n onChange: propOnChange,\n onValueChange,\n className,\n labelClassName,\n textareaClassName,\n inputGroupClassName,\n iconLeft,\n iconRight,\n addonLeft,\n addonRight,\n rows = 3,\n minLength,\n maxLength,\n autoComplete,\n autoFocus,\n}: FormTextareaProps<TFieldValues>) {\n const descriptionText = description || helperText;\n\n // Determine if we need InputGroup (has icons or addons)\n const hasInputGroup = iconLeft || iconRight || addonLeft || addonRight;\n\n // For direct usage without React Hook Form\n const [localValue, setLocalValue] = useState<string>(propValue || \"\");\n\n // Update local value when prop value changes\n useEffect(() => {\n if (propValue !== undefined) {\n setLocalValue(propValue);\n }\n }, [propValue]);\n\n // Handle direct value changes (without React Hook Form)\n const handleDirectValueChange = (value: string) => {\n setLocalValue(value);\n propOnChange?.(value);\n onValueChange?.(value);\n };\n\n const renderTextarea = (\n field?: {\n value: string;\n onChange: (e: ChangeEvent<HTMLTextAreaElement>) => void;\n onBlur: () => void;\n name: string;\n ref: React.Ref<HTMLTextAreaElement>;\n },\n isDisabled?: boolean,\n fieldState?: { invalid?: boolean; error?: { message?: string } }\n ) => {\n // Get value from either form field or direct props\n const value = field ? field.value : localValue;\n\n const handleChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value;\n\n if (field) {\n field.onChange(e);\n } else {\n handleDirectValueChange(newValue);\n }\n\n onValueChange?.(newValue);\n };\n\n // Build textarea props - only include valid HTML attributes\n const textareaProps: React.TextareaHTMLAttributes<HTMLTextAreaElement> & {\n ref?: React.Ref<HTMLTextAreaElement>;\n } = {\n id: name,\n name: field?.name || name,\n value: value ?? \"\",\n placeholder,\n disabled: isDisabled,\n readOnly,\n rows,\n onChange: handleChange,\n onBlur: field?.onBlur,\n \"aria-invalid\": fieldState?.invalid || undefined,\n };\n\n // Add optional HTML textarea attributes only if defined\n if (minLength !== undefined) textareaProps.minLength = minLength;\n if (maxLength !== undefined) textareaProps.maxLength = maxLength;\n if (autoComplete !== undefined) textareaProps.autoComplete = autoComplete;\n if (autoFocus !== undefined) textareaProps.autoFocus = autoFocus;\n\n // Add field ref if present\n if (field?.ref) {\n textareaProps.ref = field.ref;\n }\n\n if (hasInputGroup) {\n return (\n <InputGroup\n className={cn(inputGroupClassName)}\n data-disabled={isDisabled}\n >\n {(addonLeft || iconLeft) && (\n <InputGroupAddon align=\"inline-start\">\n {addonLeft || iconLeft}\n </InputGroupAddon>\n )}\n <InputGroupTextarea\n {...textareaProps}\n className={cn(\"overflow-auto resize-none\", textareaClassName)}\n />\n {(addonRight || iconRight) && (\n <InputGroupAddon align=\"inline-end\">\n {addonRight || iconRight}\n </InputGroupAddon>\n )}\n </InputGroup>\n );\n }\n\n return (\n <Textarea\n {...textareaProps}\n className={cn(\"overflow-auto resize-none\", textareaClassName)}\n />\n );\n };\n\n // Direct usage without React Hook Form\n if (!control) {\n return (\n <Field className={className} data-disabled={disabled}>\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n {renderTextarea(undefined, disabled, undefined)}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n </Field>\n );\n }\n\n // Using with React Hook Form\n return (\n <Controller\n name={name as FieldPath<TFieldValues>}\n control={control}\n render={({ field, fieldState }) => (\n <Field\n className={className}\n data-disabled={disabled}\n data-invalid={fieldState.invalid}\n >\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n {renderTextarea(field, disabled, fieldState)}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n {fieldState.invalid && fieldState.error && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useEffect, useState, useMemo } from \"react\";\nimport { Controller } from \"react-hook-form\";\nimport type { Control, FieldValues, FieldPath } from \"react-hook-form\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n SelectGroup,\n SelectLabel,\n} from \"@/components/ui/select\";\nimport { cn } from \"../../utils\";\nimport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n} from \"@/components/ui/field\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface SelectOption {\n value: string | number;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectOptionGroup {\n label: string;\n items: SelectOption[];\n}\n\nexport interface SelectInputProps<TFieldValues extends FieldValues = FieldValues> {\n // React Hook Form\n control?: Control<TFieldValues>;\n name: FieldPath<TFieldValues> | string;\n\n // Field configuration\n label?: string;\n placeholder?: string;\n description?: string;\n helperText?: string;\n required?: boolean;\n disabled?: boolean;\n\n // Options\n items?: SelectOption[];\n groups?: SelectOptionGroup[];\n allOption?: SelectOption;\n\n // Value handling\n valueKey?: string;\n displayKey?: string;\n value?: string | number;\n onValueChange?: (value: string) => void;\n\n // Styling\n className?: string;\n labelClassName?: string;\n triggerClassName?: string;\n contentClassName?: string;\n itemClassName?: string;\n Icon?: React.ComponentType<{ className?: string }>;\n\n // Select behavior\n defaultOpen?: boolean;\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n sideOffset?: number;\n align?: \"start\" | \"center\" | \"end\";\n alignOffset?: number;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\n/**\n * SelectInput - Select dropdown with react-hook-form integration\n *\n * Features:\n * - Flat and grouped options\n * - Custom placeholder\n * - Optional \"All\" option (use placeholder text to match)\n * - Custom styling\n *\n * Note: For \"All\" options with value=\"\", the placeholder will be shown when selected.\n * Make sure your placeholder text matches what you want to display for \"All\".\n *\n * @example\n * ```tsx\n * // Basic usage\n * <SelectInput\n * control={form.control}\n * name=\"role\"\n * label=\"Role\"\n * items={[\n * { value: \"admin\", label: \"Admin\" },\n * { value: \"user\", label: \"User\" },\n * ]}\n * />\n *\n * // With \"All\" option - placeholder shows when \"All\" is selected\n * <SelectInput\n * name=\"status\"\n * label=\"Status\"\n * items={[\n * { value: \"\", label: \"All\" }, // This will show placeholder when selected\n * { value: \"active\", label: \"Active\" },\n * ]}\n * placeholder=\"All\" // Make sure this matches the \"All\" label\n * />\n * ```\n */\nexport function SelectInput<TFieldValues extends FieldValues = FieldValues>({\n control,\n items = [],\n groups = [],\n name,\n label,\n placeholder = \"Select option\",\n allOption,\n description,\n helperText,\n required,\n disabled,\n className,\n labelClassName,\n triggerClassName,\n contentClassName,\n itemClassName,\n Icon,\n onValueChange,\n value: propValue,\n defaultOpen,\n side = \"bottom\",\n sideOffset = 4,\n align = \"start\",\n alignOffset = 0,\n}: SelectInputProps<TFieldValues>) {\n const descriptionText = description || helperText;\n\n // Special value for \"clear/all\" options - Base UI Select doesn't handle empty strings well\n const CLEAR_VALUE = \"__CLEAR__\";\n\n // Memoize filtered items and groups to avoid recomputation\n const displayItems = useMemo(() => {\n const filtered = items.filter((item) => item.value !== undefined && item.value !== null);\n return allOption ? [allOption, ...filtered] : filtered;\n }, [items, allOption]);\n\n const filteredGroups = useMemo(() => {\n return groups\n .map((group) => ({\n ...group,\n items: group.items.filter((item) => item.value !== undefined && item.value !== null),\n }))\n .filter((group) => group.items.length > 0);\n }, [groups]);\n\n // For direct usage without React Hook Form\n const [localValue, setLocalValue] = useState<string>(propValue?.toString() || \"\");\n\n // Update local value when prop value changes\n useEffect(() => {\n if (propValue !== undefined) {\n setLocalValue(propValue.toString());\n }\n }, [propValue]);\n\n // Pre-build a value→label lookup map for O(1) label resolution\n const labelMap = useMemo(() => {\n const map = new Map<string, string>();\n for (const item of displayItems) {\n map.set(item.value?.toString() ?? \"\", item.label);\n }\n for (const group of filteredGroups) {\n for (const item of group.items) {\n map.set(item.value?.toString() ?? \"\", item.label);\n }\n }\n return map;\n }, [displayItems, filteredGroups]);\n\n const renderSelect = (\n field?: { value: unknown; onChange: (value: string) => void },\n isDisabled?: boolean,\n fieldState?: { invalid?: boolean }\n ) => {\n // Use field value if React Hook Form is used, otherwise use local state\n const rawValue = field ? field.value?.toString() : localValue;\n\n const handleChange = (newValue: string) => {\n // Convert CLEAR_VALUE back to empty string for the actual value\n const actualValue = newValue === CLEAR_VALUE ? \"\" : newValue;\n if (field) {\n field.onChange(actualValue);\n } else {\n setLocalValue(actualValue);\n }\n onValueChange?.(actualValue);\n };\n\n // Helper to get value from item - convert empty strings to CLEAR_VALUE\n const getItemValue = (item: SelectOption, fallback: string): string => {\n const val =\n item.value !== undefined && item.value !== null\n ? item.value.toString()\n : fallback;\n // Convert empty string to CLEAR_VALUE for Select compatibility\n return val === \"\" ? CLEAR_VALUE : val;\n };\n\n // Helper to get label from item\n const getItemLabel = (item: SelectOption): string => {\n return item.label;\n };\n\n const getUniqueReactKey = (\n item: SelectOption,\n fallback: string,\n seen: Map<string, number>\n ): string => {\n const itemValue = getItemValue(item, fallback);\n const itemLabel = getItemLabel(item);\n const baseKey = `${itemValue}::${itemLabel}`;\n const nextCount = (seen.get(baseKey) ?? 0) + 1;\n seen.set(baseKey, nextCount);\n return nextCount === 1 ? baseKey : `${baseKey}::${nextCount}`;\n };\n\n // Render grouped options\n const renderGroupedContent = () => {\n if (filteredGroups.length === 0) return null;\n\n return filteredGroups.map((group, groupIdx) => {\n const seenKeys = new Map<string, number>();\n\n return (\n <SelectGroup key={`group-${groupIdx}`}>\n {group.label && <SelectLabel>{group.label}</SelectLabel>}\n {group.items.map((item, idx) => {\n const itemValue = getItemValue(item, `item-${groupIdx}-${idx}`);\n return (\n <SelectItem\n key={getUniqueReactKey(item, `item-${groupIdx}-${idx}`, seenKeys)}\n value={itemValue}\n className={cn(\"cursor-pointer\", itemClassName)}\n disabled={item.disabled}\n >\n {getItemLabel(item)}\n </SelectItem>\n );\n })}\n </SelectGroup>\n );\n });\n };\n\n // Render flat options\n const renderFlatContent = () => {\n if (displayItems.length === 0) {\n return (\n <div className=\"py-6 text-center text-sm text-muted-foreground\">\n No options available\n </div>\n );\n }\n\n const seenKeys = new Map<string, number>();\n return displayItems.map((item, idx) => {\n const itemValue = getItemValue(item, `item-${idx}`);\n return (\n <SelectItem\n key={getUniqueReactKey(item, `item-${idx}`, seenKeys)}\n value={itemValue}\n className={cn(\"cursor-pointer\", itemClassName)}\n disabled={item.disabled}\n >\n {getItemLabel(item)}\n </SelectItem>\n );\n });\n };\n\n // Pass value to Select:\n // - If rawValue is \"\" (empty string), pass CLEAR_VALUE to match the \"All\" SelectItem\n // - If rawValue has a real value, pass it to match the corresponding SelectItem\n // - If rawValue is undefined/null, pass undefined to show placeholder\n const selectValue = rawValue === \"\"\n ? CLEAR_VALUE\n : rawValue\n ? rawValue\n : undefined;\n\n // Find the label for the current value to display in the trigger\n const selectedLabel = (() => {\n if (!rawValue && rawValue !== \"\") return undefined;\n return labelMap.get(rawValue ?? \"\");\n })();\n\n return (\n <Select\n onValueChange={handleChange}\n value={selectValue}\n disabled={isDisabled}\n defaultOpen={defaultOpen}\n >\n <SelectTrigger\n className={cn(\"w-full\", triggerClassName)}\n aria-invalid={fieldState?.invalid || undefined}\n >\n {Icon && <Icon className=\"mr-2 h-4 w-4 text-primary\" />}\n <SelectValue placeholder={placeholder}>\n {selectedLabel || null}\n </SelectValue>\n </SelectTrigger>\n <SelectContent\n className={cn(contentClassName)}\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset}\n >\n {filteredGroups.length > 0 ? renderGroupedContent() : renderFlatContent()}\n </SelectContent>\n </Select>\n );\n };\n\n // Direct usage without React Hook Form\n if (!control) {\n return (\n <Field className={className} data-disabled={disabled}>\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n {renderSelect(undefined, disabled, undefined)}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n </Field>\n );\n }\n\n // Using with React Hook Form\n return (\n <Controller\n name={name as FieldPath<TFieldValues>}\n control={control}\n render={({ field, fieldState }) => (\n <Field\n className={className}\n data-disabled={disabled}\n data-invalid={fieldState.invalid}\n >\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n {renderSelect(field, disabled, fieldState)}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n {fieldState.invalid && fieldState.error && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useState, useEffect } from \"react\";\nimport { Controller } from \"react-hook-form\";\nimport type { Control, FieldValues, FieldPath } from \"react-hook-form\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport { cn } from \"../../utils\";\nimport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n} from \"@/components/ui/field\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface CheckboxItem {\n id: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface CheckboxInputProps<TFieldValues extends FieldValues = FieldValues> {\n // React Hook Form\n control?: Control<TFieldValues>;\n name: FieldPath<TFieldValues> | string;\n\n // Field configuration\n label?: string;\n description?: string;\n helperText?: string;\n required?: boolean;\n disabled?: boolean;\n\n // Checkbox items (for multi-checkbox)\n items?: CheckboxItem[];\n\n // Value handling (for direct usage)\n value?: string[];\n onChange?: (values: string[]) => void;\n onValueChange?: (values: string[]) => void;\n\n // Styling\n className?: string;\n labelClassName?: string;\n checkboxClassName?: string;\n itemClassName?: string;\n itemLabelClassName?: string;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\n/**\n * CheckboxInput - Checkbox group with react-hook-form integration\n *\n * Features:\n * - Multiple checkbox items\n * - Array value support\n * - Can be used standalone\n *\n * @example\n * ```tsx\n * <CheckboxInput\n * control={form.control}\n * name=\"features\"\n * label=\"Features\"\n * items={[\n * { id: \"wifi\", label: \"WiFi\" },\n * { id: \"parking\", label: \"Parking\" },\n * { id: \"pool\", label: \"Pool\" },\n * ]}\n * />\n * ```\n */\nexport function CheckboxInput<TFieldValues extends FieldValues = FieldValues>({\n control,\n name,\n label,\n description,\n helperText,\n required,\n disabled,\n items = [],\n value: propValue,\n onChange: propOnChange,\n onValueChange,\n className,\n labelClassName,\n checkboxClassName,\n itemClassName,\n itemLabelClassName,\n}: CheckboxInputProps<TFieldValues>) {\n const descriptionText = description || helperText;\n\n // For direct usage without React Hook Form\n const [localValues, setLocalValues] = useState<string[]>(propValue || []);\n\n // Update local value when prop value changes\n useEffect(() => {\n if (propValue !== undefined) {\n setLocalValues(propValue);\n }\n }, [propValue]);\n\n // Handle direct value changes (without React Hook Form)\n const handleDirectValueChange = (newValues: string[]) => {\n setLocalValues(newValues);\n propOnChange?.(newValues);\n onValueChange?.(newValues);\n };\n\n const renderCheckboxes = (\n field?: { value: string[]; onChange: (values: string[]) => void },\n isDisabled?: boolean,\n fieldState?: { invalid?: boolean }\n ) => {\n // Get values from either form field or direct props\n const values: string[] = field?.value || localValues || [];\n\n const handleCheckedChange = (itemId: string, checked: boolean) => {\n const newValues = checked\n ? [...values, itemId]\n : values.filter((value) => value !== itemId);\n\n if (field) {\n field.onChange(newValues);\n } else {\n handleDirectValueChange(newValues);\n }\n\n onValueChange?.(newValues);\n };\n\n return (\n <div data-slot=\"checkbox-group\" className=\"space-y-2\">\n {items.map((item) => (\n <div\n key={item.id}\n className={cn(\"flex items-center gap-2\", itemClassName)}\n >\n <Checkbox\n id={`${name}-${item.id}`}\n className={checkboxClassName}\n checked={values.includes(item.id)}\n disabled={isDisabled || item.disabled}\n onCheckedChange={(checked: boolean) =>\n handleCheckedChange(item.id, checked)\n }\n aria-invalid={fieldState?.invalid || undefined}\n />\n <label\n htmlFor={`${name}-${item.id}`}\n className={cn(\n \"text-sm font-normal cursor-pointer leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n itemLabelClassName\n )}\n >\n {item.label}\n </label>\n </div>\n ))}\n </div>\n );\n };\n\n // Direct usage without React Hook Form\n if (!control) {\n return (\n <Field className={className} data-disabled={disabled}>\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n {renderCheckboxes(undefined, disabled, undefined)}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n </Field>\n );\n }\n\n // Using with React Hook Form\n return (\n <Controller\n name={name as FieldPath<TFieldValues>}\n control={control}\n render={({ field, fieldState }) => (\n <Field\n className={className}\n data-disabled={disabled}\n data-invalid={fieldState.invalid}\n >\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n {renderCheckboxes(\n field as { value: string[]; onChange: (values: string[]) => void },\n disabled,\n fieldState\n )}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n {fieldState.invalid && fieldState.error && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useState, useEffect } from \"react\";\nimport { Controller } from \"react-hook-form\";\nimport type { Control, FieldValues, FieldPath } from \"react-hook-form\";\nimport { RadioGroup, RadioGroupItem } from \"@/components/ui/radio-group\";\nimport { cn } from \"../../utils\";\nimport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n} from \"@/components/ui/field\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface RadioChoice {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface RadioInputProps<TFieldValues extends FieldValues = FieldValues> {\n // React Hook Form\n control?: Control<TFieldValues>;\n name: FieldPath<TFieldValues> | string;\n\n // Field configuration\n label?: string;\n description?: string;\n helperText?: string;\n required?: boolean;\n disabled?: boolean;\n\n // Radio options\n choices?: RadioChoice[];\n items?: RadioChoice[]; // Alias for choices (for FormKit compatibility)\n\n // Layout\n orientation?: \"vertical\" | \"horizontal\";\n\n // Value handling\n value?: string;\n onChange?: (value: string) => void;\n onValueChange?: (value: string) => void;\n\n // Styling\n className?: string;\n labelClassName?: string;\n radioGroupClassName?: string;\n radioItemClassName?: string;\n radioLabelClassName?: string;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\n/**\n * RadioInput - Radio group with react-hook-form integration\n *\n * @example\n * ```tsx\n * <RadioInput\n * control={form.control}\n * name=\"plan\"\n * label=\"Select Plan\"\n * choices={[\n * { value: \"free\", label: \"Free\" },\n * { value: \"pro\", label: \"Pro\" },\n * { value: \"enterprise\", label: \"Enterprise\" },\n * ]}\n * orientation=\"horizontal\"\n * />\n * ```\n */\nexport function RadioInput<TFieldValues extends FieldValues = FieldValues>({\n control,\n name,\n label,\n description,\n helperText,\n required,\n disabled,\n choices = [],\n items,\n orientation = \"vertical\",\n value: propValue,\n onChange: propOnChange,\n onValueChange,\n className,\n labelClassName,\n radioGroupClassName,\n radioItemClassName,\n radioLabelClassName,\n}: RadioInputProps<TFieldValues>) {\n const descriptionText = description || helperText;\n\n // Support both 'choices' and 'items' prop names\n const radioOptions = items || choices;\n\n // For direct usage without React Hook Form\n const [localValue, setLocalValue] = useState<string>(propValue || \"\");\n\n // Update local value when prop value changes\n useEffect(() => {\n if (propValue !== undefined) {\n setLocalValue(propValue);\n }\n }, [propValue]);\n\n // Handle direct value changes (without React Hook Form)\n const handleDirectValueChange = (newValue: string) => {\n setLocalValue(newValue);\n propOnChange?.(newValue);\n onValueChange?.(newValue);\n };\n\n const renderRadioGroup = (\n field?: { value: string; onChange: (value: string) => void },\n isDisabled?: boolean,\n fieldState?: { invalid?: boolean }\n ) => {\n // Get value from either form field or direct props\n const value = field ? field.value : localValue;\n\n const handleValueChange = (newValue: string) => {\n if (field) {\n field.onChange(newValue);\n } else {\n handleDirectValueChange(newValue);\n }\n\n onValueChange?.(newValue);\n };\n\n return (\n <RadioGroup\n value={value}\n onValueChange={handleValueChange}\n disabled={isDisabled}\n aria-invalid={fieldState?.invalid || undefined}\n className={cn(\n orientation === \"horizontal\"\n ? \"flex flex-row flex-wrap gap-4\"\n : \"flex flex-col gap-3\",\n radioGroupClassName\n )}\n >\n {radioOptions.map((choice) => (\n <div\n key={choice.value}\n className={cn(\n \"flex items-center gap-2\",\n radioItemClassName\n )}\n >\n <RadioGroupItem\n id={`${name}-${choice.value}`}\n value={choice.value}\n disabled={isDisabled || choice.disabled}\n />\n <label\n htmlFor={`${name}-${choice.value}`}\n className={cn(\n \"text-sm font-normal cursor-pointer leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n radioLabelClassName\n )}\n >\n {choice.label}\n </label>\n </div>\n ))}\n </RadioGroup>\n );\n };\n\n // Direct usage without React Hook Form\n if (!control) {\n return (\n <Field className={className} data-disabled={disabled}>\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n {renderRadioGroup(undefined, disabled, undefined)}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n </Field>\n );\n }\n\n // Using with React Hook Form\n return (\n <Controller\n name={name as FieldPath<TFieldValues>}\n control={control}\n render={({ field, fieldState }) => (\n <Field\n className={className}\n data-disabled={disabled}\n data-invalid={fieldState.invalid}\n >\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n {renderRadioGroup(\n field as { value: string; onChange: (value: string) => void },\n disabled,\n fieldState\n )}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n {fieldState.invalid && fieldState.error && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useState, useEffect } from \"react\";\nimport { Controller } from \"react-hook-form\";\nimport type { Control, FieldValues, FieldPath } from \"react-hook-form\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { cn } from \"../../utils\";\nimport {\n Field,\n FieldContent,\n FieldLabel,\n FieldDescription,\n FieldError,\n} from \"@/components/ui/field\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface SwitchInputProps<TFieldValues extends FieldValues = FieldValues> {\n // React Hook Form\n control?: Control<TFieldValues>;\n name: FieldPath<TFieldValues> | string;\n\n // Field configuration\n label?: string;\n description?: string;\n helperText?: string;\n required?: boolean;\n disabled?: boolean;\n\n // Layout\n orientation?: \"horizontal\" | \"vertical\";\n\n // Value handling\n value?: boolean;\n onChange?: (value: boolean) => void;\n onValueChange?: (value: boolean) => void;\n\n // Styling\n className?: string;\n labelClassName?: string;\n switchClassName?: string;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\n/**\n * SwitchInput - Toggle switch with react-hook-form integration\n *\n * @example\n * ```tsx\n * <SwitchInput\n * control={form.control}\n * name=\"notifications\"\n * label=\"Enable notifications\"\n * description=\"Receive email updates\"\n * />\n * ```\n */\nexport function SwitchInput<TFieldValues extends FieldValues = FieldValues>({\n control,\n name,\n label,\n description,\n helperText,\n required,\n disabled,\n orientation = \"horizontal\",\n value: propValue,\n onChange: propOnChange,\n onValueChange,\n className,\n labelClassName,\n switchClassName,\n}: SwitchInputProps<TFieldValues>) {\n const descriptionText = description || helperText;\n\n // For direct usage without React Hook Form\n const [localValue, setLocalValue] = useState<boolean>(propValue || false);\n\n // Update local value when prop value changes\n useEffect(() => {\n if (propValue !== undefined) {\n setLocalValue(propValue);\n }\n }, [propValue]);\n\n // Handle direct value changes (without React Hook Form)\n const handleDirectValueChange = (newValue: boolean) => {\n setLocalValue(newValue);\n propOnChange?.(newValue);\n onValueChange?.(newValue);\n };\n\n const renderSwitch = (\n field?: { value: boolean; onChange: (value: boolean) => void },\n isDisabled?: boolean,\n fieldState?: { invalid?: boolean }\n ) => {\n // Get value from either form field or direct props\n const value = field ? (field.value ?? false) : (localValue ?? false);\n\n const handleCheckedChange = (checked: boolean) => {\n if (field) {\n field.onChange(checked);\n } else {\n handleDirectValueChange(checked);\n }\n\n onValueChange?.(checked);\n };\n\n return (\n <Switch\n id={name}\n checked={value}\n onCheckedChange={handleCheckedChange}\n disabled={isDisabled}\n className={switchClassName}\n aria-invalid={fieldState?.invalid || undefined}\n />\n );\n };\n\n // Direct usage without React Hook Form\n if (!control) {\n return (\n <Field\n className={className}\n data-disabled={disabled}\n orientation={orientation}\n >\n {renderSwitch(undefined, disabled, undefined)}\n <FieldContent>\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n </FieldContent>\n </Field>\n );\n }\n\n // Using with React Hook Form\n return (\n <Controller\n name={name as FieldPath<TFieldValues>}\n control={control}\n render={({ field, fieldState }) => (\n <Field\n className={className}\n data-disabled={disabled}\n data-invalid={fieldState.invalid}\n orientation={orientation}\n >\n {renderSwitch(\n field as { value: boolean; onChange: (value: boolean) => void },\n disabled,\n fieldState\n )}\n <FieldContent>\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n {fieldState.invalid && fieldState.error && (\n <FieldError errors={[fieldState.error]} />\n )}\n </FieldContent>\n </Field>\n )}\n />\n );\n}\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { useState } from \"react\";\r\nimport { Controller } from \"react-hook-form\";\r\nimport type { Control, FieldValues, FieldPath } from \"react-hook-form\";\r\nimport {\r\n Field,\r\n FieldLabel,\r\n FieldDescription,\r\n FieldError,\r\n} from \"@/components/ui/field\";\r\nimport { Calendar } from \"@/components/ui/calendar\";\r\nimport {\r\n Popover,\r\n PopoverContent,\r\n PopoverTrigger,\r\n} from \"@/components/ui/popover\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { CalendarIcon, X } from \"lucide-react\";\r\nimport { cn } from \"../../utils\";\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\ntype DateValue = Date | string | null | undefined;\r\n\r\nexport interface DateInputProps<TFieldValues extends FieldValues = FieldValues> {\r\n // React Hook Form\r\n control?: Control<TFieldValues>;\r\n name: FieldPath<TFieldValues> | string;\r\n\r\n // Field configuration\r\n label?: string;\r\n placeholder?: string;\r\n description?: string;\r\n helperText?: string;\r\n required?: boolean;\r\n disabled?: boolean;\r\n\r\n // Date constraints\r\n minDate?: DateValue;\r\n maxDate?: DateValue;\r\n\r\n // Value handling\r\n value?: DateValue;\r\n onChange?: (date: Date | undefined) => void;\r\n onValueChange?: (date: Date | undefined) => void;\r\n\r\n // Styling\r\n className?: string;\r\n labelClassName?: string;\r\n inputClassName?: string;\r\n\r\n // Options\r\n Icon?: React.ComponentType<{ className?: string }>;\r\n allowClear?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// HELPERS\r\n// ============================================================================\r\n\r\n/**\r\n * Convert various date formats to Date object\r\n */\r\nfunction toDate(val: DateValue): Date | undefined {\r\n if (!val) return undefined;\r\n if (val instanceof Date) return val;\r\n // Handle YYYY-MM-DD format\r\n if (typeof val === \"string\" && /^\\d{4}-\\d{2}-\\d{2}$/.test(val)) {\r\n const [y, m, d] = val.split(\"-\").map(Number);\r\n const dt = new Date(y!, (m || 1) - 1, d || 1);\r\n return isNaN(dt.getTime()) ? undefined : dt;\r\n }\r\n const dt = new Date(val);\r\n return isNaN(dt.getTime()) ? undefined : dt;\r\n}\r\n\r\n// ============================================================================\r\n// COMPONENT\r\n// ============================================================================\r\n\r\n/**\r\n * DateInput - Date picker with react-hook-form integration\r\n *\r\n * @example\r\n * ```tsx\r\n * <DateInput\r\n * control={form.control}\r\n * name=\"birthDate\"\r\n * label=\"Date of Birth\"\r\n * minDate=\"1900-01-01\"\r\n * maxDate={new Date()}\r\n * />\r\n * ```\r\n */\r\nexport function DateInput<TFieldValues extends FieldValues = FieldValues>({\r\n control,\r\n name,\r\n label,\r\n description,\r\n helperText,\r\n placeholder = \"Pick a date\",\r\n required,\r\n disabled,\r\n className,\r\n labelClassName,\r\n inputClassName,\r\n minDate,\r\n maxDate,\r\n onValueChange,\r\n value: propValue,\r\n onChange: propOnChange,\r\n Icon = CalendarIcon,\r\n allowClear = true,\r\n}: DateInputProps<TFieldValues>) {\r\n const descriptionText = description || helperText;\r\n\r\n // Check if date should be disabled\r\n const isDateDisabled = (date: Date): boolean => {\r\n if (!date) return false;\r\n const minDateObj = toDate(minDate);\r\n const maxDateObj = toDate(maxDate);\r\n if (minDateObj && date < minDateObj) return true;\r\n if (maxDateObj && date > maxDateObj) return true;\r\n return false;\r\n };\r\n\r\n // Render the date picker UI\r\n const renderDateInput = (\r\n field?: { value: DateValue; onChange: (date: Date | undefined) => void },\r\n isDisabled?: boolean\r\n ) => {\r\n const value = field ? field.value : propValue;\r\n const selected = toDate(value);\r\n const [open, setOpen] = useState(false);\r\n\r\n const handleSelect = (date: Date | undefined) => {\r\n if (field) field.onChange(date);\r\n else if (propOnChange) propOnChange(date);\r\n onValueChange?.(date);\r\n setOpen(false);\r\n };\r\n\r\n const handleClear = (e: React.MouseEvent) => {\r\n e?.stopPropagation?.();\r\n if (field) field.onChange(undefined);\r\n else if (propOnChange) propOnChange(undefined);\r\n onValueChange?.(undefined);\r\n };\r\n\r\n const displayText = selected\r\n ? selected.toLocaleDateString(\"en-US\", {\r\n month: \"short\",\r\n day: \"numeric\",\r\n year: \"numeric\",\r\n })\r\n : placeholder;\r\n\r\n return (\r\n <Popover open={open} onOpenChange={setOpen}>\r\n <PopoverTrigger\r\n render={\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n className={cn(\r\n \"w-full justify-start text-left font-normal\",\r\n !selected && \"text-muted-foreground\",\r\n inputClassName\r\n )}\r\n disabled={isDisabled}\r\n >\r\n <Icon className=\"mr-2 h-4 w-4\" />\r\n {displayText}\r\n {allowClear && selected && !isDisabled && (\r\n <X\r\n className=\"ml-auto h-4 w-4 opacity-50 hover:opacity-100\"\r\n onClick={handleClear}\r\n />\r\n )}\r\n </Button>\r\n }\r\n />\r\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\r\n <Calendar\r\n mode=\"single\"\r\n defaultMonth={selected}\r\n selected={selected}\r\n onSelect={handleSelect}\r\n disabled={isDateDisabled}\r\n initialFocus\r\n />\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n };\r\n\r\n // Direct usage without React Hook Form\r\n if (!control) {\r\n return (\r\n <Field className={className} data-disabled={disabled}>\r\n {label && (\r\n <FieldLabel htmlFor={name} className={labelClassName}>\r\n {label}\r\n {required && <span className=\"text-destructive ml-1\">*</span>}\r\n </FieldLabel>\r\n )}\r\n {renderDateInput(undefined, disabled)}\r\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\r\n </Field>\r\n );\r\n }\r\n\r\n // Using with React Hook Form via Controller\r\n return (\r\n <Controller\r\n name={name as FieldPath<TFieldValues>}\r\n control={control}\r\n render={({ field, fieldState }) => (\r\n <Field\r\n className={className}\r\n data-disabled={disabled}\r\n data-invalid={fieldState.invalid}\r\n >\r\n {label && (\r\n <FieldLabel htmlFor={name as string} className={labelClassName}>\r\n {label}\r\n {required && <span className=\"text-destructive ml-1\">*</span>}\r\n </FieldLabel>\r\n )}\r\n {renderDateInput(field as { value: DateValue; onChange: (date: Date | undefined) => void }, disabled)}\r\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\r\n {fieldState.invalid && fieldState.error && (\r\n <FieldError errors={[fieldState.error]} />\r\n )}\r\n </Field>\r\n )}\r\n />\r\n );\r\n}\r\n","\"use client\";\n\nimport { useState, useRef, useCallback, useMemo, type ClipboardEvent, type KeyboardEvent, type ChangeEvent } from \"react\";\nimport { Controller } from \"react-hook-form\";\nimport type { Control, FieldValues } from \"react-hook-form\";\nimport { X, Plus, Tag } from \"lucide-react\";\nimport { cn } from \"../../utils\";\nimport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n FieldContent,\n} from \"@/components/ui/field\";\nimport { Button } from \"@/components/ui/button\";\nimport { Badge } from \"@/components/ui/badge\";\nimport {\n InputGroup,\n InputGroupInput,\n InputGroupAddon,\n} from \"@/components/ui/input-group\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface TagInputProps {\n // React Hook Form\n control?: Control<FieldValues>;\n name: string;\n\n // Field configuration\n label?: string;\n placeholder?: string;\n description?: string;\n helperText?: string;\n required?: boolean;\n disabled?: boolean;\n\n // Tag behavior\n maxTags?: number;\n allowDuplicates?: boolean;\n delimiter?: string;\n\n // Suggestions\n suggestions?: string[];\n suggestionLimit?: number;\n\n // Value handling\n value?: string[];\n onChange?: (tags: string[]) => void;\n onValueChange?: (tags: string[]) => void;\n\n // Tag validation/transformation\n validateTag?: (tag: string) => boolean;\n transformTag?: (tag: string) => string;\n formatTag?: (tag: string) => string;\n\n // Styling\n className?: string;\n labelClassName?: string;\n inputClassName?: string;\n\n // Additional props\n [key: string]: unknown;\n}\n\ninterface RenderTagInputProps {\n field: { value: string[]; onChange: (tags: string[]) => void } | null;\n disabled?: boolean;\n error?: string | null;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\n/**\n * TagInput - Tag/chip input with react-hook-form integration\n *\n * @example\n * ```tsx\n * <TagInput\n * control={form.control}\n * name=\"tags\"\n * label=\"Tags\"\n * placeholder=\"Add tags...\"\n * maxTags={10}\n * suggestions={[\"react\", \"typescript\", \"nextjs\"]}\n * />\n * ```\n */\nexport function TagInput({\n control,\n name,\n label,\n description,\n helperText,\n placeholder = \"Add tag...\",\n required,\n disabled,\n className,\n labelClassName,\n inputClassName,\n maxTags,\n allowDuplicates = false,\n suggestions = [],\n suggestionLimit = 8,\n value: propValue = [],\n onChange: propOnChange,\n onValueChange,\n delimiter = \",\",\n validateTag,\n transformTag,\n formatTag,\n ...props\n}: TagInputProps) {\n const descriptionText = description || helperText;\n const [inputValue, setInputValue] = useState(\"\");\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Parse and validate multiple tags from a string\n const parseMultipleTags = useCallback(\n (input: string): string[] => {\n if (!input.trim()) return [];\n\n return input\n .split(delimiter)\n .map((tag) => tag.trim())\n .filter((tag) => tag.length > 0)\n .map((tag) => (transformTag ? transformTag(tag) : tag))\n .filter((tag) => !validateTag || validateTag(tag));\n },\n [delimiter, validateTag, transformTag]\n );\n\n // Add multiple tags at once\n const handleAddMultipleTags = useCallback(\n (\n tags: string[],\n newTags: string[],\n field: { onChange: (tags: string[]) => void } | null\n ): string[] => {\n if (!newTags || newTags.length === 0) return tags;\n\n const updatedTags = [...tags];\n let addedCount = 0;\n\n for (const newTag of newTags) {\n if (!newTag.trim()) continue;\n\n const trimmedTag = newTag.trim();\n\n if (!allowDuplicates && updatedTags.includes(trimmedTag)) {\n continue;\n }\n\n if (maxTags && updatedTags.length >= maxTags) {\n break;\n }\n\n updatedTags.push(trimmedTag);\n addedCount++;\n }\n\n if (addedCount > 0) {\n if (field) {\n field.onChange(updatedTags);\n } else if (propOnChange) {\n propOnChange(updatedTags);\n }\n onValueChange?.(updatedTags);\n }\n\n return updatedTags;\n },\n [allowDuplicates, maxTags, propOnChange, onValueChange]\n );\n\n // Handle single tag addition\n const handleAddTag = useCallback(\n (\n tags: string[],\n newTag: string,\n field: { onChange: (tags: string[]) => void } | null\n ): string[] => {\n const tagsToAdd = parseMultipleTags(newTag);\n const updatedTags = handleAddMultipleTags(tags, tagsToAdd, field);\n setInputValue(\"\");\n return updatedTags;\n },\n [parseMultipleTags, handleAddMultipleTags]\n );\n\n const handleRemoveTag = useCallback(\n (\n tags: string[],\n indexToRemove: number,\n field: { onChange: (tags: string[]) => void } | null\n ): string[] => {\n const updatedTags = tags.filter((_, index) => index !== indexToRemove);\n\n if (field) {\n field.onChange(updatedTags);\n } else if (propOnChange) {\n propOnChange(updatedTags);\n }\n\n onValueChange?.(updatedTags);\n return updatedTags;\n },\n [propOnChange, onValueChange]\n );\n\n // Handle input change\n const handleInputChange = useCallback(\n (\n e: ChangeEvent<HTMLInputElement>,\n tags: string[],\n field: { onChange: (tags: string[]) => void } | null\n ) => {\n const value = e.target.value;\n\n if (value.includes(delimiter)) {\n const parts = value.split(delimiter);\n const completeTags = parts.slice(0, -1);\n const remainingInput = parts[parts.length - 1] || \"\";\n\n if (completeTags.length > 0) {\n handleAddMultipleTags(\n tags,\n completeTags.map((t) => t.trim()).filter((t) => t),\n field\n );\n }\n\n setInputValue(remainingInput);\n } else {\n setInputValue(value);\n }\n },\n [delimiter, handleAddMultipleTags]\n );\n\n // Handle paste events\n const handlePaste = useCallback(\n (\n e: ClipboardEvent<HTMLInputElement>,\n tags: string[],\n field: { onChange: (tags: string[]) => void } | null\n ) => {\n e.preventDefault();\n const pastedText = e.clipboardData.getData(\"text\");\n const pastedTags = parseMultipleTags(pastedText);\n\n if (pastedTags.length > 0) {\n handleAddMultipleTags(tags, pastedTags, field);\n setInputValue(\"\");\n }\n },\n [parseMultipleTags, handleAddMultipleTags]\n );\n\n const handleKeyDown = useCallback(\n (\n e: KeyboardEvent<HTMLInputElement>,\n tags: string[],\n field: { onChange: (tags: string[]) => void } | null\n ) => {\n if (e.key === \"Enter\" || e.key === delimiter) {\n e.preventDefault();\n handleAddTag(tags, inputValue, field);\n } else if (e.key === \"Backspace\" && !inputValue && tags.length > 0) {\n e.preventDefault();\n handleRemoveTag(tags, tags.length - 1, field);\n }\n },\n [delimiter, inputValue, handleAddTag, handleRemoveTag]\n );\n\n const getPlaceholder = useCallback(\n (tagsCount: number): string => {\n if (tagsCount === 0) {\n return placeholder.includes(\"comma\")\n ? placeholder\n : `${placeholder} (separate with ${delimiter} for multiple)`;\n }\n return \"Add another...\";\n },\n [placeholder, delimiter]\n );\n\n const canAddMoreTags = useCallback(\n (tagsLength: number): boolean => {\n return !maxTags || tagsLength < maxTags;\n },\n [maxTags]\n );\n\n const renderTagInput = ({ field, disabled: isDisabled, error }: RenderTagInputProps) => {\n const tags: string[] = field ? field.value || [] : propValue || [];\n const showInput = !isDisabled && canAddMoreTags(tags.length);\n const normalizedInputRaw = (inputValue || \"\").trim();\n const normalizedInput = (transformTag ? transformTag(normalizedInputRaw) : normalizedInputRaw)\n .toLowerCase()\n .trim();\n\n const filteredSuggestions = useMemo(() => {\n if (!normalizedInput) return [];\n const existingSet = new Set(tags.map((t) => t.toLowerCase()));\n return suggestions\n .filter(Boolean)\n .map((s) => (transformTag ? transformTag(s) : s))\n .filter((s) => s.toLowerCase().includes(normalizedInput))\n .filter((s) => allowDuplicates || !existingSet.has(s.toLowerCase()))\n .slice(0, suggestionLimit);\n }, [normalizedInput, tags, suggestions, transformTag, allowDuplicates, suggestionLimit]);\n\n return (\n <>\n {/* Tags Display Area */}\n {tags.length > 0 && (\n <div\n className={cn(\n \"flex flex-wrap gap-1.5 mb-3\",\n \"p-2.5 rounded-md bg-muted/30 border border-border/50\"\n )}\n >\n {tags.map((tag, index) => {\n const displayTag = formatTag ? formatTag(tag) : tag;\n\n return (\n <Badge\n key={`${tag}-${index}`}\n variant=\"secondary\"\n className={cn(\n \"group flex items-center gap-1.5 px-2.5 py-1\",\n \"bg-background border border-border shadow-sm\",\n \"hover:border-primary/50 transition-all duration-200\",\n \"animate-in fade-in-0 zoom-in-95\",\n isDisabled && \"opacity-60\"\n )}\n >\n <Tag className=\"h-3 w-3 text-muted-foreground\" />\n <span\n className=\"max-w-[200px] truncate text-sm font-medium\"\n title={displayTag}\n >\n {displayTag}\n </span>\n {!isDisabled && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"h-4 w-4 p-0 ml-0.5\",\n \"text-muted-foreground/60 hover:text-destructive\",\n \"hover:bg-destructive/10 rounded-sm\",\n \"transition-colors\"\n )}\n onClick={(e) => {\n e.stopPropagation();\n handleRemoveTag(tags, index, field);\n }}\n aria-label={`Remove ${displayTag}`}\n >\n <X className=\"h-3 w-3\" />\n </Button>\n )}\n </Badge>\n );\n })}\n </div>\n )}\n\n {/* Input Field */}\n {showInput && (\n <div className=\"space-y-3\">\n <InputGroup className={cn(error && \"border-destructive\")}>\n <InputGroupAddon align=\"inline-start\">\n <Tag className=\"h-4 w-4\" />\n </InputGroupAddon>\n <InputGroupInput\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={(e: ChangeEvent<HTMLInputElement>) => handleInputChange(e, tags, field)}\n onKeyDown={(e: KeyboardEvent<HTMLInputElement>) => handleKeyDown(e, tags, field)}\n onPaste={(e: ClipboardEvent<HTMLInputElement>) => handlePaste(e, tags, field)}\n placeholder={getPlaceholder(tags.length)}\n disabled={isDisabled}\n aria-label=\"Add new tag\"\n aria-invalid={!!error}\n className={inputClassName}\n {...props}\n />\n {inputValue.trim() && (\n <InputGroupAddon align=\"inline-end\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6 text-primary hover:text-primary hover:bg-primary/10\"\n onClick={() => handleAddTag(tags, inputValue, field)}\n aria-label=\"Add tag\"\n >\n <Plus className=\"h-4 w-4\" />\n </Button>\n </InputGroupAddon>\n )}\n </InputGroup>\n\n {/* Suggestions list */}\n {filteredSuggestions.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5 p-2 rounded-md bg-muted/30 border border-dashed\">\n <span className=\"text-xs text-muted-foreground font-medium w-full mb-1\">\n Suggestions:\n </span>\n {filteredSuggestions.map((sug) => (\n <Button\n key={sug}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className={cn(\n \"h-7 px-2.5 text-xs\",\n \"hover:border-primary/50 hover:bg-primary/5\",\n \"transition-all duration-200\"\n )}\n onClick={(e) => {\n e.stopPropagation();\n handleAddMultipleTags(tags, [sug], field);\n setInputValue(\"\");\n }}\n aria-label={`Add ${formatTag ? formatTag(sug) : sug}`}\n >\n {formatTag ? formatTag(sug) : sug}\n <Plus className=\"h-3 w-3 ml-1.5 opacity-70\" />\n </Button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* Status indicators */}\n {maxTags && (\n <div\n className={cn(\n \"text-xs font-medium mt-2 flex items-center gap-1.5\",\n tags.length >= maxTags\n ? \"text-destructive\"\n : \"text-muted-foreground\"\n )}\n >\n <div\n className={cn(\n \"h-1.5 w-1.5 rounded-full\",\n tags.length >= maxTags\n ? \"bg-destructive\"\n : \"bg-muted-foreground/50\"\n )}\n />\n {tags.length}/{maxTags} tags\n </div>\n )}\n </>\n );\n };\n\n // Direct usage without React Hook Form\n if (!control) {\n return (\n <Field className={className} data-disabled={disabled}>\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n <FieldContent>\n {renderTagInput({ field: null, disabled, error: null })}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n </FieldContent>\n </Field>\n );\n }\n\n // Using with React Hook Form\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState }) => (\n <Field\n className={className}\n data-disabled={disabled}\n data-invalid={fieldState.invalid}\n >\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n <FieldContent>\n {renderTagInput({\n field: field as { value: string[]; onChange: (tags: string[]) => void },\n disabled,\n error: fieldState?.error?.message,\n })}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n {fieldState.invalid && fieldState.error && (\n <FieldError errors={[fieldState.error]} />\n )}\n </FieldContent>\n </Field>\n )}\n />\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { Controller } from \"react-hook-form\";\nimport type { Control, FieldValues, FieldPath } from \"react-hook-form\";\nimport { Check, ChevronDown, X, Tag as TagIcon } from \"lucide-react\";\nimport { cn } from \"../../utils\";\nimport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n FieldContent,\n} from \"@/components/ui/field\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/components/ui/popover\";\nimport { Input } from \"@/components/ui/input\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface TagChoiceItem {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface TagChoiceInputProps<TFieldValues extends FieldValues = FieldValues> {\n // React Hook Form\n control?: Control<TFieldValues>;\n name: FieldPath<TFieldValues> | string;\n\n // Field configuration\n label?: string;\n placeholder?: string;\n description?: string;\n helperText?: string;\n required?: boolean;\n disabled?: boolean;\n\n // Options\n items?: TagChoiceItem[];\n\n // Value handling\n value?: string[];\n onValueChange?: (values: string[]) => void;\n\n // Styling\n className?: string;\n}\n\ninterface TagChoiceInputInternalProps {\n label?: string;\n description?: string;\n placeholder?: string;\n required?: boolean;\n disabled?: boolean;\n className?: string;\n items: TagChoiceItem[];\n value: string[];\n onValueChange?: (values: string[]) => void;\n error?: string;\n}\n\n// ============================================================================\n// INTERNAL COMPONENT\n// ============================================================================\n\nfunction TagChoiceInputInternal({\n label,\n description,\n placeholder = \"Select...\",\n required,\n disabled,\n className,\n items = [],\n value = [],\n onValueChange,\n error,\n}: TagChoiceInputInternalProps) {\n const [open, setOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const selectedValues = value || [];\n\n const handleSelect = (itemValue: string) => {\n const isSelected = selectedValues.includes(itemValue);\n const newValue = isSelected\n ? selectedValues.filter((v) => v !== itemValue)\n : [...selectedValues, itemValue];\n onValueChange?.(newValue);\n };\n\n const handleRemove = (valueToRemove: string) => {\n const newValue = selectedValues.filter((v) => v !== valueToRemove);\n onValueChange?.(newValue);\n };\n\n const filteredItems = items.filter((item) =>\n item.label.toLowerCase().includes(searchQuery.toLowerCase())\n );\n\n return (\n <Field className={className} data-disabled={disabled} data-invalid={!!error}>\n {label && (\n <FieldLabel>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n\n <FieldContent>\n {/* Selected Tags Display */}\n {selectedValues.length > 0 && (\n <div\n className={cn(\n \"flex flex-wrap gap-1.5 mb-3\",\n \"p-2.5 rounded-md bg-muted/30 border border-border/50\"\n )}\n >\n {selectedValues.map((val) => {\n const item = items.find((i) => i.value === val);\n return (\n <Badge\n key={val}\n variant=\"secondary\"\n className={cn(\n \"group flex items-center gap-1.5 px-2.5 py-1\",\n \"bg-background border border-border shadow-sm\",\n \"hover:border-primary/50 transition-all duration-200\",\n disabled && \"opacity-60\"\n )}\n >\n <TagIcon className=\"h-3 w-3 text-muted-foreground\" />\n <span className=\"text-sm font-medium\">\n {item?.label || val}\n </span>\n {!disabled && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"h-4 w-4 p-0 ml-0.5\",\n \"text-muted-foreground/60 hover:text-destructive\",\n \"hover:bg-destructive/10 rounded-sm\",\n \"transition-colors\"\n )}\n onClick={(e) => {\n e.stopPropagation();\n handleRemove(val);\n }}\n aria-label={`Remove ${item?.label || val}`}\n >\n <X className=\"h-3 w-3\" />\n </Button>\n )}\n </Badge>\n );\n })}\n </div>\n )}\n\n {/* Selection Trigger */}\n <Popover open={open} onOpenChange={setOpen} modal={true}>\n <PopoverTrigger\n render={\n <Button\n type=\"button\"\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n disabled={disabled}\n className={cn(\n \"w-full justify-between h-auto min-h-[2.5rem] px-3 py-2\",\n \"hover:bg-accent/50 transition-colors\",\n error && \"border-destructive\",\n disabled && \"opacity-50 cursor-not-allowed\"\n )}\n >\n <div className=\"flex items-center gap-2\">\n <TagIcon className=\"h-4 w-4 text-muted-foreground\" />\n <span\n className={cn(\n \"text-sm\",\n selectedValues.length === 0 && \"text-muted-foreground\"\n )}\n >\n {selectedValues.length > 0\n ? `${selectedValues.length} selected`\n : placeholder}\n </span>\n </div>\n <ChevronDown\n className={cn(\n \"h-4 w-4 text-muted-foreground transition-transform duration-200\",\n open && \"rotate-180\"\n )}\n />\n </Button>\n }\n />\n <PopoverContent\n className=\"w-(--anchor-width) p-0\"\n align=\"start\"\n >\n <div className=\"p-2 border-b\">\n <Input\n placeholder=\"Search options...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"h-8\"\n />\n </div>\n <div className=\"max-h-[300px] overflow-y-auto p-1\">\n {filteredItems.length === 0 ? (\n <div className=\"py-6 text-center text-sm text-muted-foreground\">\n No options found\n </div>\n ) : (\n <div className=\"space-y-0.5\">\n {filteredItems.map((item) => {\n const isSelected = selectedValues.includes(item.value);\n return (\n <button\n key={item.value}\n type=\"button\"\n onClick={() => handleSelect(item.value)}\n disabled={item.disabled}\n className={cn(\n \"w-full flex items-center justify-between px-2 py-2\",\n \"text-sm rounded-sm\",\n \"hover:bg-accent hover:text-accent-foreground\",\n \"transition-colors cursor-pointer\",\n isSelected && \"bg-primary/10 text-primary font-medium\",\n item.disabled && \"opacity-50 cursor-not-allowed\"\n )}\n >\n <span>{item.label}</span>\n {isSelected && <Check className=\"h-4 w-4 text-primary\" />}\n </button>\n );\n })}\n </div>\n )}\n </div>\n <div className=\"border-t px-2 py-2 text-xs text-muted-foreground text-center\">\n {selectedValues.length > 0\n ? `${selectedValues.length} option${selectedValues.length > 1 ? \"s\" : \"\"} selected`\n : \"Select options from the list\"}\n </div>\n </PopoverContent>\n </Popover>\n\n {description && <FieldDescription>{description}</FieldDescription>}\n {error && <FieldError errors={[{ message: error }]} />}\n </FieldContent>\n </Field>\n );\n}\n\nTagChoiceInputInternal.displayName = \"TagChoiceInputInternal\";\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\n/**\n * TagChoiceInput - Multi-select with tags display\n *\n * @example\n * ```tsx\n * <TagChoiceInput\n * control={form.control}\n * name=\"categories\"\n * label=\"Categories\"\n * items={[\n * { value: \"tech\", label: \"Technology\" },\n * { value: \"design\", label: \"Design\" },\n * ]}\n * />\n * ```\n */\nexport function TagChoiceInput<TFieldValues extends FieldValues = FieldValues>({\n control,\n name,\n label,\n description,\n helperText,\n placeholder = \"Select...\",\n required,\n disabled,\n className,\n items = [],\n value: propValue = [],\n onValueChange,\n}: TagChoiceInputProps<TFieldValues>) {\n const descriptionText = description || helperText;\n\n if (control) {\n return (\n <Controller\n name={name as FieldPath<TFieldValues>}\n control={control}\n render={({ field, fieldState }) => (\n <TagChoiceInputInternal\n label={label}\n description={descriptionText}\n placeholder={placeholder}\n required={required}\n disabled={disabled}\n className={className}\n items={items}\n value={field.value || []}\n onValueChange={(val) => {\n field.onChange(val);\n onValueChange?.(val);\n }}\n error={fieldState?.error?.message}\n />\n )}\n />\n );\n }\n\n return (\n <TagChoiceInputInternal\n label={label}\n description={descriptionText}\n placeholder={placeholder}\n required={required}\n disabled={disabled}\n className={className}\n items={items}\n value={propValue}\n onValueChange={onValueChange}\n />\n );\n}\n\nTagChoiceInput.displayName = \"TagChoiceInput\";\n","\"use client\";\n\nimport { useMemo, useCallback } from \"react\";\nimport { Controller } from \"react-hook-form\";\nimport type { Control, FieldValues, FieldPath } from \"react-hook-form\";\nimport { cn } from \"../../utils\";\nimport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n} from \"@/components/ui/field\";\nimport {\n Combobox,\n ComboboxContent,\n ComboboxEmpty,\n ComboboxInput as BaseComboboxInput,\n ComboboxItem,\n ComboboxList,\n} from \"@/components/ui/combobox\";\nimport type { ReactNode } from \"react\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface ComboboxOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface ComboboxInputProps<\n TFieldValues extends FieldValues = FieldValues,\n> {\n // React Hook Form\n control?: Control<TFieldValues>;\n name: FieldPath<TFieldValues> | string;\n\n // Field configuration\n label?: string;\n placeholder?: string;\n emptyText?: string;\n description?: string;\n helperText?: string;\n required?: boolean;\n disabled?: boolean;\n\n // Options\n items?: ComboboxOption[];\n\n // Value handling\n value?: string;\n onChange?: (value: string) => void;\n onValueChange?: (value: string) => void;\n\n // Styling\n className?: string;\n labelClassName?: string;\n inputClassName?: string;\n\n // Custom rendering\n renderOption?: (option: ComboboxOption) => ReactNode;\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\n/**\n * ComboboxInput - Searchable select with react-hook-form integration using Base UI\n *\n * Passes `{ value, label }` objects to Base UI Combobox so it auto-resolves\n * labels for display and filtering. The form value is always the string `value`.\n *\n * @example\n * ```tsx\n * // With react-hook-form\n * <ComboboxInput\n * control={form.control}\n * name=\"country\"\n * label=\"Country\"\n * items={[\n * { value: \"us\", label: \"United States\" },\n * { value: \"uk\", label: \"United Kingdom\" },\n * ]}\n * placeholder=\"Select a country...\"\n * />\n *\n * // Standalone\n * <ComboboxInput\n * name=\"country\"\n * label=\"Country\"\n * items={items}\n * value={selectedCountry}\n * onValueChange={setSelectedCountry}\n * />\n * ```\n */\nexport function ComboboxInput<TFieldValues extends FieldValues = FieldValues>({\n control,\n name,\n label,\n placeholder = \"Select...\",\n emptyText = \"No items found.\",\n description,\n helperText,\n required,\n disabled,\n items = [],\n className,\n labelClassName,\n inputClassName,\n onValueChange,\n renderOption,\n value: propValue,\n onChange: propOnChange,\n}: ComboboxInputProps<TFieldValues>) {\n const descriptionText = description || helperText;\n\n const handleValueChange = useCallback(\n (\n newItem: ComboboxOption | null,\n field?: { onChange: (value: string) => void },\n ) => {\n const safeValue = newItem?.value || \"\";\n if (field) {\n field.onChange(safeValue);\n } else if (propOnChange) {\n propOnChange(safeValue);\n }\n onValueChange?.(safeValue);\n },\n [propOnChange, onValueChange],\n );\n\n const renderCombobox = (\n currentValue: string | undefined,\n field?: { onChange: (value: string) => void },\n isDisabled?: boolean,\n ) => {\n // Resolve string value to the full { value, label } object for Base UI\n const selectedItem = currentValue\n ? (items.find((item) => item.value === currentValue) ?? null)\n : null;\n\n return (\n <Combobox\n items={items}\n value={selectedItem}\n onValueChange={(item: ComboboxOption | null) =>\n handleValueChange(item, field)\n }\n disabled={isDisabled}\n >\n <BaseComboboxInput\n placeholder={placeholder}\n className={cn(inputClassName)}\n />\n <ComboboxContent>\n <ComboboxEmpty>{emptyText}</ComboboxEmpty>\n <ComboboxList>\n {(item: ComboboxOption) => {\n if (!item) return null;\n\n return (\n <ComboboxItem\n key={item.value}\n value={item}\n disabled={item.disabled}\n >\n {renderOption ? renderOption(item) : item.label}\n </ComboboxItem>\n );\n }}\n </ComboboxList>\n </ComboboxContent>\n </Combobox>\n );\n };\n\n // Direct usage without React Hook Form\n if (!control) {\n return (\n <Field className={className} data-disabled={disabled}>\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n {renderCombobox(propValue, undefined, disabled)}\n {descriptionText && (\n <FieldDescription>{descriptionText}</FieldDescription>\n )}\n </Field>\n );\n }\n\n // Using with React Hook Form\n return (\n <Controller\n name={name as FieldPath<TFieldValues>}\n control={control}\n render={({ field, fieldState }) => (\n <Field\n className={className}\n data-disabled={disabled}\n data-invalid={fieldState.invalid}\n >\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </FieldLabel>\n )}\n {renderCombobox(field.value, field, disabled)}\n {descriptionText && (\n <FieldDescription>{descriptionText}</FieldDescription>\n )}\n {fieldState.invalid && fieldState.error && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n );\n}\n","\"use client\";\n\nimport type { Ref, ChangeEvent } from \"react\";\nimport { Controller } from \"react-hook-form\";\nimport type { Control, FieldValues, FieldError as RHFFieldError } from \"react-hook-form\";\nimport { InputGroup, InputGroupInput, InputGroupAddon, InputGroupButton } from \"@/components/ui/input-group\";\nimport { Field, FieldLabel, FieldDescription, FieldError } from \"@/components/ui/field\";\nimport { Wand2 } from \"lucide-react\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface SlugFieldProps {\n // React Hook Form\n control?: Control<FieldValues>;\n name: string;\n\n // Field configuration\n label?: string;\n placeholder?: string;\n description?: string;\n helperText?: string;\n required?: boolean;\n disabled?: boolean;\n\n // Slug generation\n sourceValue?: string;\n onGenerate?: (sourceValue: string) => string;\n\n // Value handling\n value?: string;\n onChange?: (e: { target: { value: string } }) => void;\n onValueChange?: (value: string) => void;\n\n // Styling\n className?: string;\n labelClassName?: string;\n inputClassName?: string;\n\n // Error (for direct usage)\n error?: RHFFieldError;\n\n // Ref\n ref?: Ref<HTMLInputElement>;\n}\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\n/**\n * Generates a URL-friendly slug from a string\n */\nexport function generateSlug(text: string | undefined): string {\n if (!text) return \"\";\n return text\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, \"\") // Remove special characters\n .replace(/\\s+/g, \"-\") // Replace spaces with hyphens\n .replace(/-+/g, \"-\") // Replace multiple hyphens with single hyphen\n .replace(/^-+|-+$/g, \"\"); // Remove leading/trailing hyphens\n}\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\n/**\n * SlugField - URL slug input with auto-generation\n *\n * @example\n * ```tsx\n * <SlugField\n * control={form.control}\n * name=\"slug\"\n * label=\"URL Slug\"\n * sourceValue={form.watch(\"title\")}\n * description=\"This will be used in the page URL\"\n * required\n * />\n * ```\n */\nfunction SlugField({\n control,\n name,\n description,\n helperText,\n required,\n label,\n placeholder = \"my-page-slug\",\n disabled,\n sourceValue,\n onGenerate,\n className,\n inputClassName,\n labelClassName,\n onValueChange,\n value,\n onChange,\n error,\n ref,\n}: SlugFieldProps) {\n const descriptionText = description || helperText;\n\n const handleGenerate = (\n _currentValue: string | undefined,\n fieldOnChange?: (value: string) => void\n ) => {\n const newSlug = onGenerate\n ? onGenerate(sourceValue || \"\")\n : generateSlug(sourceValue);\n fieldOnChange?.(newSlug);\n onValueChange?.(newSlug);\n };\n\n const renderInput = (\n fieldValue: string | undefined,\n fieldOnChange?: (value: string) => void,\n isDisabled?: boolean,\n fieldState?: { invalid?: boolean; error?: RHFFieldError }\n ) => {\n return (\n <InputGroup>\n <InputGroupInput\n ref={ref}\n id={name}\n type=\"text\"\n disabled={isDisabled}\n placeholder={placeholder}\n value={fieldValue || \"\"}\n onChange={(e: ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n fieldOnChange?.(newValue);\n onValueChange?.(newValue);\n }}\n aria-invalid={fieldState?.invalid}\n className={inputClassName}\n />\n <InputGroupAddon align=\"inline-end\">\n <InputGroupButton\n type=\"button\"\n size=\"sm\"\n onClick={() => handleGenerate(fieldValue, fieldOnChange)}\n disabled={isDisabled || !sourceValue}\n title=\"Generate slug from source\"\n >\n <Wand2 className=\"h-4 w-4\" />\n Generate\n </InputGroupButton>\n </InputGroupAddon>\n </InputGroup>\n );\n };\n\n // With react-hook-form\n if (control && name) {\n return (\n <Controller\n name={name}\n control={control}\n render={({ field, fieldState }) => (\n <Field\n className={className}\n data-disabled={disabled}\n data-invalid={fieldState.invalid}\n >\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-red-500 ml-1\">*</span>}\n </FieldLabel>\n )}\n {renderInput(field.value, field.onChange, disabled, fieldState)}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n {fieldState.invalid && fieldState.error && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n );\n }\n\n // Direct usage (without react-hook-form)\n const handleDirectChange = (newValue: string) => {\n onChange?.({ target: { value: newValue } });\n onValueChange?.(newValue);\n };\n\n return (\n <Field className={className} data-disabled={disabled}>\n {label && (\n <FieldLabel htmlFor={name} className={labelClassName}>\n {label}\n {required && <span className=\"text-red-500 ml-1\">*</span>}\n </FieldLabel>\n )}\n {renderInput(value, handleDirectChange, disabled, { error })}\n {descriptionText && <FieldDescription>{descriptionText}</FieldDescription>}\n {error && <FieldError errors={[error]} />}\n </Field>\n );\n}\n\nexport { SlugField };\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { cn } from \"../../utils\";\r\n\r\nexport interface FormErrorSummaryProps {\r\n /** Form errors object from react-hook-form */\r\n errors?: Record<string, unknown>;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Custom title text */\r\n title?: string;\r\n}\r\n\r\n// Helper to flatten nested errors\r\nconst flattenErrors = (\r\n errors: Record<string, unknown>,\r\n prefix = \"\"\r\n): Array<{ field: string; message: string }> => {\r\n const flattened: Array<{ field: string; message: string }> = [];\r\n\r\n Object.entries(errors).forEach(([key, value]) => {\r\n const path = prefix ? `${prefix}.${key}` : key;\r\n\r\n if (value && typeof value === \"object\" && \"message\" in value) {\r\n // This is an error object\r\n flattened.push({ field: path, message: String(value.message) });\r\n } else if (value && typeof value === \"object\") {\r\n // This is a nested object, recurse\r\n flattened.push(...flattenErrors(value as Record<string, unknown>, path));\r\n }\r\n });\r\n\r\n return flattened;\r\n};\r\n\r\n/**\r\n * FormErrorSummary - Displays a summary of form validation errors\r\n *\r\n * Takes react-hook-form errors object and displays all errors in a list.\r\n * Automatically flattens nested errors for complex form structures.\r\n */\r\nexport function FormErrorSummary({\r\n errors,\r\n className,\r\n title = \"Please fix the following errors:\",\r\n}: FormErrorSummaryProps) {\r\n if (!errors || Object.keys(errors).length === 0) {\r\n return null;\r\n }\r\n\r\n const errorList = flattenErrors(errors);\r\n\r\n if (errorList.length === 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"bg-destructive/15 p-3 rounded-md border border-destructive/20\",\r\n className\r\n )}\r\n >\r\n <h4 className=\"text-sm font-medium text-destructive mb-2\">{title}</h4>\r\n <ul className=\"text-sm text-destructive space-y-1\">\r\n {errorList.map(({ field, message }, index) => (\r\n <li key={`${field}-${index}`} className=\"flex items-start gap-2\">\r\n <span className=\"text-destructive\">•</span>\r\n <span>\r\n <strong>{field}:</strong> {message}\r\n </span>\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { Calendar } from \"@/components/ui/calendar\";\r\nimport {\r\n Popover,\r\n PopoverContent,\r\n PopoverTrigger,\r\n} from \"@/components/ui/popover\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { cn } from \"../../utils\";\r\nimport { CalendarIcon, X } from \"lucide-react\";\r\n\r\nexport interface DateRange {\r\n from?: Date;\r\n to?: Date;\r\n}\r\n\r\nexport interface DateRangeFilterProps {\r\n /** Initial start date */\r\n initialStartDate?: Date;\r\n /** Initial end date */\r\n initialEndDate?: Date;\r\n /** Callback when filter is applied (receives startDate, endDate) */\r\n onFilter?: (startDate: Date | null, endDate: Date | null) => void;\r\n /** Callback when filter is cleared */\r\n onClear?: () => void;\r\n /** Additional classes for the container */\r\n className?: string;\r\n /** Additional classes for trigger button */\r\n buttonClassName?: string;\r\n /** Placeholder text when no date selected */\r\n placeholder?: string;\r\n /** Minimum selectable date */\r\n minDate?: Date;\r\n /** Maximum selectable date */\r\n maxDate?: Date;\r\n /** Align popover to the right */\r\n alignRight?: boolean;\r\n /** Number of months to display */\r\n numberOfMonths?: number;\r\n}\r\n\r\n/**\r\n * DateRangeFilter - A date range picker for filtering\r\n *\r\n * Features:\r\n * - Only applies filter when explicitly submitted\r\n * - Supports clearing filters\r\n * - Uses Popover to show calendar on click\r\n * - Configurable min/max dates\r\n */\r\nexport function DateRangeFilter({\r\n initialStartDate,\r\n initialEndDate,\r\n onFilter,\r\n onClear,\r\n className,\r\n buttonClassName,\r\n placeholder = \"Pick a date range\",\r\n minDate,\r\n maxDate,\r\n alignRight = true,\r\n numberOfMonths = 1,\r\n}: DateRangeFilterProps) {\r\n // Internal state for range selection (before applying)\r\n const [dateRange, setDateRange] = React.useState<DateRange | undefined>(\r\n initialStartDate || initialEndDate\r\n ? { from: initialStartDate, to: initialEndDate }\r\n : undefined\r\n );\r\n\r\n // Applied state (shown on button)\r\n const [appliedRange, setAppliedRange] = React.useState(dateRange);\r\n\r\n // Popover open state\r\n const [open, setOpen] = React.useState(false);\r\n\r\n // Update state when props change\r\n React.useEffect(() => {\r\n const newRange =\r\n initialStartDate || initialEndDate\r\n ? { from: initialStartDate, to: initialEndDate }\r\n : undefined;\r\n setDateRange(newRange);\r\n setAppliedRange(newRange);\r\n }, [initialStartDate, initialEndDate]);\r\n\r\n // Handle applying the filter\r\n const handleApplyFilter = () => {\r\n setAppliedRange(dateRange);\r\n onFilter?.(dateRange?.from || null, dateRange?.to || null);\r\n setOpen(false);\r\n };\r\n\r\n // Handle clearing the filter\r\n const handleClearFilter = (e?: React.MouseEvent) => {\r\n e?.stopPropagation?.();\r\n setDateRange(undefined);\r\n setAppliedRange(undefined);\r\n onClear?.();\r\n setOpen(false);\r\n };\r\n\r\n // Format the display text\r\n const getDisplayText = () => {\r\n if (!appliedRange?.from && !appliedRange?.to) return placeholder;\r\n\r\n const formatDate = (date: Date) => {\r\n return date.toLocaleDateString(\"en-US\", {\r\n month: \"short\",\r\n day: \"numeric\",\r\n year: \"numeric\",\r\n });\r\n };\r\n\r\n if (appliedRange.from && appliedRange.to) {\r\n return `${formatDate(appliedRange.from)} - ${formatDate(appliedRange.to)}`;\r\n }\r\n if (appliedRange.from) return `From ${formatDate(appliedRange.from)}`;\r\n if (appliedRange.to) return `Until ${formatDate(appliedRange.to)}`;\r\n };\r\n\r\n return (\r\n <div className={className}>\r\n <Popover open={open} onOpenChange={setOpen}>\r\n <PopoverTrigger\r\n render={\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n className={cn(\r\n \"w-full justify-start font-normal\",\r\n !(appliedRange?.from || appliedRange?.to) &&\r\n \"text-muted-foreground\",\r\n buttonClassName\r\n )}\r\n >\r\n <CalendarIcon className=\"mr-2 h-4 w-4\" />\r\n {getDisplayText()}\r\n {(appliedRange?.from || appliedRange?.to) && (\r\n <X\r\n className=\"ml-auto h-4 w-4 opacity-50 hover:opacity-100\"\r\n onClick={handleClearFilter}\r\n />\r\n )}\r\n </Button>\r\n }\r\n />\r\n <PopoverContent\r\n className=\"w-auto p-0\"\r\n align={alignRight ? \"end\" : \"start\"}\r\n side=\"bottom\"\r\n >\r\n <div className=\"p-3 space-y-4\">\r\n <Calendar\r\n mode=\"range\"\r\n defaultMonth={dateRange?.from}\r\n selected={dateRange}\r\n onSelect={setDateRange}\r\n disabled={(date: Date) => {\r\n if (minDate && date < minDate) return true;\r\n if (maxDate && date > maxDate) return true;\r\n return false;\r\n }}\r\n numberOfMonths={numberOfMonths}\r\n initialFocus\r\n />\r\n\r\n {/* Action buttons */}\r\n <div className=\"flex justify-between gap-2 pt-2 border-t\">\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => handleClearFilter()}\r\n >\r\n Clear\r\n </Button>\r\n <Button\r\n type=\"button\"\r\n size=\"sm\"\r\n onClick={handleApplyFilter}\r\n disabled={!dateRange?.from && !dateRange?.to}\r\n >\r\n Apply Filter\r\n </Button>\r\n </div>\r\n </div>\r\n </PopoverContent>\r\n </Popover>\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { useState, ReactNode } from \"react\";\r\nimport { format, isValid } from \"date-fns\";\r\nimport { Controller, Control, FieldValues, FieldPath } from \"react-hook-form\";\r\nimport { Calendar } from \"@/components/ui/calendar\";\r\nimport {\r\n Popover,\r\n PopoverContent,\r\n PopoverTrigger,\r\n} from \"@/components/ui/popover\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { cn } from \"../../utils\";\r\nimport { CalendarIcon, X, LucideIcon } from \"lucide-react\";\r\nimport {\r\n Field,\r\n FieldLabel,\r\n FieldDescription,\r\n FieldError,\r\n} from \"@/components/ui/field\";\r\n\r\n// ============================================\r\n// Types\r\n// ============================================\r\n\r\nexport interface DateRangeValue {\r\n from?: Date | string;\r\n to?: Date | string;\r\n}\r\n\r\nexport interface DateRangeInputProps<TFieldValues extends FieldValues = FieldValues> {\r\n /** React Hook Form control */\r\n control?: Control<TFieldValues>;\r\n /** Field name for form registration */\r\n name: FieldPath<TFieldValues> | string;\r\n /** Field label */\r\n label?: string;\r\n /** Description text below the input */\r\n description?: string;\r\n /** Placeholder text */\r\n placeholder?: string;\r\n /** Whether the field is required */\r\n required?: boolean;\r\n /** Whether the field is disabled */\r\n disabled?: boolean;\r\n /** Additional className for the wrapper */\r\n className?: string;\r\n /** Additional className for the label */\r\n labelClassName?: string;\r\n /** Additional className for the button */\r\n buttonClassName?: string;\r\n /** Additional className for the calendar popover */\r\n calendarClassName?: string;\r\n /** Minimum selectable date */\r\n minDate?: Date;\r\n /** Maximum selectable date */\r\n maxDate?: Date;\r\n /** Array of disabled dates */\r\n disabledDates?: Date[];\r\n /** Array of disabled days (0-6, where 0 is Sunday) */\r\n disabledDays?: number[];\r\n /** Callback when value changes */\r\n onValueChange?: (range: DateRangeValue) => void;\r\n /** Custom validation function for date range */\r\n validateDateRange?: (range: DateRangeValue) => boolean;\r\n /** Function to clear form errors */\r\n clearErrors?: (name: string) => void;\r\n /** Custom description component */\r\n descriptionComponent?: ReactNode;\r\n /** Whether to show clear button */\r\n allowClear?: boolean;\r\n /** Whether to show badge with date range */\r\n showBadge?: boolean;\r\n /** Custom icon component */\r\n Icon?: LucideIcon;\r\n /** Transform functions for input/output */\r\n transform?: {\r\n input: (value: any) => DateRangeValue;\r\n output: (range: DateRangeValue) => any;\r\n };\r\n}\r\n\r\n// ============================================\r\n// Helper Components\r\n// ============================================\r\n\r\ninterface DateRangePopoverProps {\r\n dateRange: DateRangeValue;\r\n placeholder: string;\r\n disabled?: boolean;\r\n buttonClassName?: string;\r\n calendarClassName?: string;\r\n allowClear: boolean;\r\n showBadge: boolean;\r\n Icon: LucideIcon;\r\n formatDateRange: (range: DateRangeValue) => string;\r\n isDateDisabled: (date: Date) => boolean;\r\n handleDateRangeSelect: (range: DateRangeValue | undefined) => void;\r\n handleClear: (e: React.MouseEvent) => void;\r\n minDate?: Date;\r\n maxDate?: Date;\r\n}\r\n\r\nfunction DateRangePopover({\r\n dateRange,\r\n placeholder,\r\n disabled,\r\n buttonClassName,\r\n calendarClassName,\r\n allowClear,\r\n showBadge,\r\n Icon,\r\n formatDateRange,\r\n isDateDisabled,\r\n handleDateRangeSelect,\r\n handleClear,\r\n minDate,\r\n maxDate,\r\n}: DateRangePopoverProps) {\r\n const hasValue = dateRange?.from || dateRange?.to;\r\n\r\n return (\r\n <div className=\"relative w-full\">\r\n <Popover>\r\n <PopoverTrigger\r\n render={\r\n <Button\r\n type=\"button\"\r\n disabled={disabled}\r\n variant=\"outline\"\r\n className={cn(\r\n \"w-full justify-start gap-2 font-normal\",\r\n !hasValue && \"text-muted-foreground\",\r\n hasValue && allowClear && \"pr-10\",\r\n buttonClassName\r\n )}\r\n >\r\n <Icon className=\"h-4 w-4 shrink-0\" />\r\n {hasValue ? (\r\n <span className=\"flex-1 truncate text-left\">\r\n {formatDateRange(dateRange)}\r\n {showBadge && dateRange?.from && dateRange?.to && (() => {\r\n const from = dateRange.from instanceof Date ? dateRange.from : new Date(dateRange.from);\r\n const to = dateRange.to instanceof Date ? dateRange.to : new Date(dateRange.to);\r\n const days = Math.ceil((to.getTime() - from.getTime()) / (1000 * 60 * 60 * 24)) + 1;\r\n return (\r\n <span className=\"ml-2 text-xs bg-secondary text-secondary-foreground py-0.5 px-2 rounded-full\">\r\n {days} {days === 1 ? 'day' : 'days'}\r\n </span>\r\n );\r\n })()}\r\n </span>\r\n ) : (\r\n <span className=\"text-left\">{placeholder}</span>\r\n )}\r\n </Button>\r\n }\r\n />\r\n <PopoverContent\r\n className={cn(\"w-auto p-0\", calendarClassName)}\r\n align=\"start\"\r\n >\r\n <Calendar\r\n mode=\"range\"\r\n selected={dateRange as any}\r\n onSelect={handleDateRangeSelect as any}\r\n disabled={isDateDisabled}\r\n initialFocus\r\n {...(minDate && { fromDate: minDate })}\r\n {...(maxDate && { toDate: maxDate })}\r\n />\r\n <div className=\"p-3 border-t border-border\">\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={handleClear}\r\n disabled={!hasValue}\r\n className=\"w-full\"\r\n type=\"button\"\r\n >\r\n Clear Date Range\r\n </Button>\r\n </div>\r\n </PopoverContent>\r\n </Popover>\r\n\r\n {hasValue && allowClear && !disabled && (\r\n <button\r\n type=\"button\"\r\n onClick={handleClear}\r\n className=\"absolute right-2 top-1/2 -translate-y-1/2 p-1 rounded-sm hover:bg-muted transition-colors\"\r\n aria-label=\"Clear date range\"\r\n >\r\n <X className=\"h-4 w-4 text-muted-foreground hover:text-foreground\" />\r\n </button>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================\r\n// Main Component\r\n// ============================================\r\n\r\nconst defaultTransform = {\r\n input: (value: any): DateRangeValue =>\r\n value\r\n ? {\r\n from: value.from ? new Date(value.from) : undefined,\r\n to: value.to ? new Date(value.to) : undefined,\r\n }\r\n : { from: undefined, to: undefined },\r\n output: (range: DateRangeValue) => ({\r\n from: range?.from\r\n ? range.from instanceof Date\r\n ? range.from.toISOString()\r\n : range.from\r\n : undefined,\r\n to: range?.to\r\n ? range.to instanceof Date\r\n ? range.to.toISOString()\r\n : range.to\r\n : undefined,\r\n }),\r\n};\r\n\r\n/**\r\n * DateRangeInput - Date range picker with react-hook-form integration\r\n *\r\n * @example\r\n * ```tsx\r\n * <DateRangeInput\r\n * control={control}\r\n * name=\"dateRange\"\r\n * label=\"Select Dates\"\r\n * placeholder=\"Pick a date range\"\r\n * />\r\n * ```\r\n */\r\nexport function DateRangeInput<TFieldValues extends FieldValues = FieldValues>({\r\n control,\r\n name,\r\n label,\r\n description,\r\n placeholder = \"Select date range\",\r\n required,\r\n disabled,\r\n className,\r\n labelClassName,\r\n buttonClassName,\r\n calendarClassName,\r\n minDate,\r\n maxDate,\r\n disabledDates,\r\n disabledDays,\r\n onValueChange,\r\n validateDateRange,\r\n clearErrors,\r\n descriptionComponent,\r\n allowClear = true,\r\n showBadge = false,\r\n Icon = CalendarIcon,\r\n transform = defaultTransform,\r\n}: DateRangeInputProps<TFieldValues>) {\r\n const [localDateRange, setLocalDateRange] = useState<DateRangeValue>({\r\n from: undefined,\r\n to: undefined,\r\n });\r\n\r\n const formatDateRange = (range: DateRangeValue): string => {\r\n if (!range || (!range.from && !range.to)) return \"\";\r\n\r\n const fromDate = range.from instanceof Date ? range.from : range.from ? new Date(range.from) : null;\r\n const toDate = range.to instanceof Date ? range.to : range.to ? new Date(range.to) : null;\r\n\r\n const fromFormatted = fromDate && isValid(fromDate) ? format(fromDate, \"MMM d\") : \"\";\r\n const toFormatted = toDate && isValid(toDate) ? format(toDate, \"MMM d\") : \"\";\r\n\r\n if (fromFormatted && toFormatted) {\r\n return `${fromFormatted} - ${toFormatted}`;\r\n } else if (fromFormatted) {\r\n return `From ${fromFormatted}`;\r\n } else if (toFormatted) {\r\n return `Until ${toFormatted}`;\r\n }\r\n\r\n return \"\";\r\n };\r\n\r\n const isDateDisabled = (date: Date): boolean => {\r\n if (!date || !isValid(date)) return true;\r\n if (disabled) return true;\r\n if (minDate && date < minDate) return true;\r\n if (maxDate && date > maxDate) return true;\r\n if (disabledDates?.some((d) => d.getTime() === date.getTime())) return true;\r\n if (disabledDays?.includes(date.getDay())) return true;\r\n return false;\r\n };\r\n\r\n const handleDateRangeSelect = (\r\n range: DateRangeValue | undefined,\r\n field?: any\r\n ) => {\r\n if (disabled) return;\r\n\r\n const safeRange = range || { from: undefined, to: undefined };\r\n\r\n if (validateDateRange && !validateDateRange(safeRange)) {\r\n return;\r\n }\r\n\r\n if (field) {\r\n const transformedValue = transform.output(safeRange);\r\n field.onChange(transformedValue);\r\n } else {\r\n setLocalDateRange(safeRange);\r\n }\r\n\r\n onValueChange?.(safeRange);\r\n\r\n if (clearErrors && name) {\r\n clearErrors(name);\r\n }\r\n };\r\n\r\n const handleClear = (field: any | null, e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n\r\n const emptyRange = { from: undefined, to: undefined };\r\n\r\n if (field) {\r\n field.onChange(emptyRange);\r\n } else {\r\n setLocalDateRange(emptyRange);\r\n }\r\n\r\n onValueChange?.(emptyRange);\r\n\r\n if (clearErrors && name) {\r\n clearErrors(name);\r\n }\r\n };\r\n\r\n // With react-hook-form\r\n if (control) {\r\n return (\r\n <Controller\r\n control={control}\r\n name={name as FieldPath<TFieldValues>}\r\n render={({ field, fieldState }) => {\r\n const dateRange = transform.input(field.value);\r\n\r\n return (\r\n <Field\r\n className={cn(\"w-full\", className)}\r\n data-invalid={!!fieldState.error}\r\n >\r\n {label && (\r\n <div className=\"flex items-center gap-2 mb-2\">\r\n <FieldLabel className={cn(\"grow\", labelClassName)}>\r\n {label}\r\n {required && <span className=\"text-destructive ml-1\">*</span>}\r\n </FieldLabel>\r\n <span className=\"text-muted-foreground shrink-0\">\r\n <Icon className=\"h-4 w-4\" />\r\n </span>\r\n </div>\r\n )}\r\n\r\n <DateRangePopover\r\n dateRange={dateRange}\r\n placeholder={placeholder}\r\n disabled={disabled}\r\n buttonClassName={buttonClassName}\r\n calendarClassName={calendarClassName}\r\n allowClear={allowClear}\r\n showBadge={showBadge}\r\n Icon={Icon}\r\n formatDateRange={formatDateRange}\r\n isDateDisabled={isDateDisabled}\r\n handleDateRangeSelect={(range) =>\r\n handleDateRangeSelect(range, field)\r\n }\r\n handleClear={(e) => handleClear(field, e)}\r\n minDate={minDate}\r\n maxDate={maxDate}\r\n />\r\n\r\n {description && !descriptionComponent && (\r\n <FieldDescription>{description}</FieldDescription>\r\n )}\r\n\r\n {descriptionComponent && (\r\n <div className=\"text-sm text-muted-foreground\">\r\n {descriptionComponent}\r\n </div>\r\n )}\r\n\r\n <FieldError\r\n errors={fieldState.error ? [fieldState.error] : undefined}\r\n />\r\n </Field>\r\n );\r\n }}\r\n />\r\n );\r\n }\r\n\r\n // Standalone without form\r\n return (\r\n <div className={cn(\"w-full\", className)}>\r\n {label && (\r\n <div className=\"flex items-center gap-2 mb-2\">\r\n <div className={cn(\"text-sm font-medium grow\", labelClassName)}>\r\n {label}\r\n {required && <span className=\"text-destructive ml-1\">*</span>}\r\n </div>\r\n <span className=\"text-muted-foreground shrink-0\">\r\n <Icon className=\"h-4 w-4\" />\r\n </span>\r\n </div>\r\n )}\r\n\r\n <DateRangePopover\r\n dateRange={localDateRange}\r\n placeholder={placeholder}\r\n disabled={disabled}\r\n buttonClassName={buttonClassName}\r\n calendarClassName={calendarClassName}\r\n allowClear={allowClear}\r\n showBadge={showBadge}\r\n Icon={Icon}\r\n formatDateRange={formatDateRange}\r\n isDateDisabled={isDateDisabled}\r\n handleDateRangeSelect={(range) => handleDateRangeSelect(range)}\r\n handleClear={(e) => handleClear(null, e)}\r\n minDate={minDate}\r\n maxDate={maxDate}\r\n />\r\n\r\n {description && (\r\n <div className=\"text-sm text-muted-foreground mt-1\">{description}</div>\r\n )}\r\n\r\n {descriptionComponent && (\r\n <div className=\"text-sm text-muted-foreground\">{descriptionComponent}</div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { useState, useMemo, useCallback, ReactNode } from \"react\";\r\nimport {\r\n format,\r\n startOfMonth,\r\n endOfMonth,\r\n eachDayOfInterval,\r\n isSameMonth,\r\n isSameDay,\r\n addMonths,\r\n subMonths,\r\n getDay,\r\n} from \"date-fns\";\r\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { cn } from \"../utils\";\r\n\r\nconst WEEKDAYS = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\r\n\r\nexport interface CalendarEvent {\r\n id: string;\r\n date: Date | string;\r\n [key: string]: any;\r\n}\r\n\r\nexport interface EventCalendarProps<T extends CalendarEvent> {\r\n /** Events to display on the calendar */\r\n events?: T[];\r\n /** Currently selected date */\r\n selectedDate?: Date | null;\r\n /** Callback when a date is selected */\r\n onDateSelect?: (date: Date, events: T[]) => void;\r\n /** Callback when month changes */\r\n onMonthChange?: (date: Date) => void;\r\n /** Initial month to display */\r\n initialMonth?: Date;\r\n /** Custom render for day cell content */\r\n renderDayContent?: (date: Date, events: T[], isSelected: boolean) => ReactNode;\r\n /** Custom render for event indicators */\r\n renderEventIndicators?: (events: T[]) => ReactNode;\r\n /** Get events for a specific date (custom filtering) */\r\n getEventsForDate?: (date: Date, events: T[]) => T[];\r\n /** Additional class names */\r\n className?: string;\r\n /** Header content (left side) */\r\n headerLeft?: ReactNode;\r\n /** Header content (right side, before navigation) */\r\n headerRight?: ReactNode;\r\n /** Minimum cell height */\r\n minCellHeight?: string;\r\n /** Show week numbers */\r\n showWeekNumbers?: boolean;\r\n /** Loading state */\r\n isLoading?: boolean;\r\n}\r\n\r\n/**\r\n * EventCalendar - A reusable calendar component for displaying events\r\n *\r\n * Can be used for attendance tracking, scheduling, etc.\r\n */\r\nexport function EventCalendar<T extends CalendarEvent>({\r\n events = [],\r\n selectedDate: controlledSelectedDate,\r\n onDateSelect,\r\n onMonthChange,\r\n initialMonth = new Date(),\r\n renderDayContent,\r\n renderEventIndicators,\r\n getEventsForDate,\r\n className,\r\n headerLeft,\r\n headerRight,\r\n minCellHeight = \"5rem\",\r\n showWeekNumbers = false,\r\n isLoading = false,\r\n}: EventCalendarProps<T>) {\r\n const [currentMonth, setCurrentMonth] = useState(initialMonth);\r\n const [internalSelectedDate, setInternalSelectedDate] = useState<Date | null>(null);\r\n\r\n const selectedDate = controlledSelectedDate ?? internalSelectedDate;\r\n\r\n // Generate days for the current month\r\n // Always render 6 rows (42 cells) for consistent layout\r\n const { days, paddingDaysBefore, paddingDaysAfter } = useMemo(() => {\r\n const monthStart = startOfMonth(currentMonth);\r\n const monthEnd = endOfMonth(currentMonth);\r\n const daysInMonth = eachDayOfInterval({ start: monthStart, end: monthEnd });\r\n const startDayOfWeek = getDay(monthStart);\r\n\r\n // Calculate total cells needed (always 6 rows = 42 cells)\r\n const totalCells = 42;\r\n const usedCells = startDayOfWeek + daysInMonth.length;\r\n const trailingPadding = totalCells - usedCells;\r\n\r\n return {\r\n days: daysInMonth,\r\n paddingDaysBefore: startDayOfWeek,\r\n paddingDaysAfter: trailingPadding,\r\n };\r\n }, [currentMonth]);\r\n\r\n // Default event filtering by date\r\n const defaultGetEventsForDate = useCallback(\r\n (date: Date, allEvents: T[]): T[] => {\r\n return allEvents.filter((event) => {\r\n const eventDate = typeof event.date === \"string\" ? new Date(event.date) : event.date;\r\n return isSameDay(eventDate, date);\r\n });\r\n },\r\n []\r\n );\r\n\r\n const getEvents = getEventsForDate || defaultGetEventsForDate;\r\n\r\n // Navigation handlers\r\n const handlePrevMonth = useCallback(() => {\r\n const newMonth = subMonths(currentMonth, 1);\r\n setCurrentMonth(newMonth);\r\n onMonthChange?.(newMonth);\r\n }, [currentMonth, onMonthChange]);\r\n\r\n const handleNextMonth = useCallback(() => {\r\n const newMonth = addMonths(currentMonth, 1);\r\n setCurrentMonth(newMonth);\r\n onMonthChange?.(newMonth);\r\n }, [currentMonth, onMonthChange]);\r\n\r\n // Date selection handler\r\n const handleDateClick = useCallback(\r\n (date: Date) => {\r\n const dayEvents = getEvents(date, events);\r\n setInternalSelectedDate(date);\r\n onDateSelect?.(date, dayEvents);\r\n },\r\n [events, getEvents, onDateSelect]\r\n );\r\n\r\n // Default event indicators\r\n const defaultRenderEventIndicators = useCallback((dayEvents: T[]) => {\r\n if (dayEvents.length === 0) return null;\r\n\r\n return (\r\n <div className=\"flex gap-0.5 mt-1\">\r\n {dayEvents.slice(0, 3).map((_, idx) => (\r\n <div\r\n key={idx}\r\n className=\"h-1.5 w-1.5 rounded-full bg-primary\"\r\n />\r\n ))}\r\n {dayEvents.length > 3 && (\r\n <span className=\"text-[10px] text-muted-foreground ml-0.5\">\r\n +{dayEvents.length - 3}\r\n </span>\r\n )}\r\n </div>\r\n );\r\n }, []);\r\n\r\n const renderIndicators = renderEventIndicators || defaultRenderEventIndicators;\r\n\r\n return (\r\n <div className={cn(\"space-y-4\", className)}>\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-4\">\r\n {headerLeft}\r\n <h2 className=\"text-lg font-semibold\">\r\n {format(currentMonth, \"MMMM yyyy\")}\r\n </h2>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n {headerRight}\r\n <div className=\"flex gap-1\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n onClick={handlePrevMonth}\r\n disabled={isLoading}\r\n >\r\n <ChevronLeft className=\"h-4 w-4\" />\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n onClick={handleNextMonth}\r\n disabled={isLoading}\r\n >\r\n <ChevronRight className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Calendar Grid */}\r\n <div className=\"rounded-lg border overflow-hidden\">\r\n {/* Weekday headers */}\r\n <div\r\n className={cn(\r\n \"grid bg-muted/50\",\r\n showWeekNumbers ? \"grid-cols-8\" : \"grid-cols-7\"\r\n )}\r\n >\r\n {showWeekNumbers && (\r\n <div className=\"px-2 py-3 text-center text-xs font-medium text-muted-foreground border-r\">\r\n Wk\r\n </div>\r\n )}\r\n {WEEKDAYS.map((day) => (\r\n <div\r\n key={day}\r\n className=\"px-2 py-3 text-center text-xs font-medium text-muted-foreground\"\r\n >\r\n {day}\r\n </div>\r\n ))}\r\n </div>\r\n\r\n {/* Days grid - always 6 rows for consistent layout */}\r\n <div\r\n className={cn(\r\n \"grid gap-px bg-border\",\r\n showWeekNumbers ? \"grid-cols-8\" : \"grid-cols-7\"\r\n )}\r\n >\r\n {/* Padding cells for start of month */}\r\n {Array.from({ length: paddingDaysBefore }).map((_, index) => (\r\n <div\r\n key={`padding-start-${index}`}\r\n className=\"bg-card\"\r\n style={{ minHeight: minCellHeight }}\r\n />\r\n ))}\r\n\r\n {/* Day cells */}\r\n {days.map((day) => {\r\n const dayEvents = getEvents(day, events);\r\n const isToday = isSameDay(day, new Date());\r\n const isSelected = selectedDate ? isSameDay(day, selectedDate) : false;\r\n const isCurrentMonth = isSameMonth(day, currentMonth);\r\n\r\n return (\r\n <div\r\n key={day.toISOString()}\r\n className={cn(\r\n \"bg-card p-2 cursor-pointer transition-colors hover:bg-muted/50\",\r\n isSelected && \"ring-2 ring-primary ring-inset bg-primary/5\",\r\n !isCurrentMonth && \"opacity-50\",\r\n isLoading && \"pointer-events-none opacity-50\"\r\n )}\r\n style={{ minHeight: minCellHeight }}\r\n onClick={() => handleDateClick(day)}\r\n >\r\n {renderDayContent ? (\r\n renderDayContent(day, dayEvents, isSelected)\r\n ) : (\r\n <>\r\n <div\r\n className={cn(\r\n \"flex h-7 w-7 items-center justify-center rounded-full text-sm\",\r\n isToday && \"bg-primary text-primary-foreground font-semibold\"\r\n )}\r\n >\r\n {format(day, \"d\")}\r\n </div>\r\n {renderIndicators(dayEvents)}\r\n </>\r\n )}\r\n </div>\r\n );\r\n })}\r\n\r\n {/* Padding cells for end of month (to fill 6 rows) */}\r\n {Array.from({ length: paddingDaysAfter }).map((_, index) => (\r\n <div\r\n key={`padding-end-${index}`}\r\n className=\"bg-card\"\r\n style={{ minHeight: minCellHeight }}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * CalendarDayDetail - Side panel component for showing selected day details\r\n */\r\nexport interface CalendarDayDetailProps {\r\n date: Date | null;\r\n title?: string;\r\n emptyMessage?: string;\r\n children?: ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function CalendarDayDetail({\r\n date,\r\n title,\r\n emptyMessage = \"Click on a day to see details\",\r\n children,\r\n className,\r\n}: CalendarDayDetailProps) {\r\n return (\r\n <div className={cn(\"rounded-lg border bg-card\", className)}>\r\n <div className=\"p-4 border-b\">\r\n <h3 className=\"font-semibold\">\r\n {date ? format(date, \"EEEE, MMMM d\") : title || \"Select a day\"}\r\n </h3>\r\n </div>\r\n <div className=\"p-4\">\r\n {!date ? (\r\n <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>\r\n ) : (\r\n children\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * CalendarWithDetail - Calendar with integrated detail panel\r\n */\r\nexport interface CalendarWithDetailProps<T extends CalendarEvent>\r\n extends Omit<EventCalendarProps<T>, \"onDateSelect\"> {\r\n /** Render detail panel content */\r\n renderDetail?: (date: Date, events: T[]) => ReactNode;\r\n /** Detail panel title when no date selected */\r\n detailTitle?: string;\r\n /** Detail panel empty message */\r\n detailEmptyMessage?: string;\r\n /** Layout direction */\r\n layout?: \"horizontal\" | \"vertical\";\r\n /** Detail panel position */\r\n detailPosition?: \"left\" | \"right\" | \"top\" | \"bottom\";\r\n /** Callback when date is selected */\r\n onDateSelect?: (date: Date, events: T[]) => void;\r\n}\r\n\r\nexport function CalendarWithDetail<T extends CalendarEvent>({\r\n renderDetail,\r\n detailTitle,\r\n detailEmptyMessage,\r\n layout = \"horizontal\",\r\n detailPosition = \"right\",\r\n onDateSelect,\r\n ...calendarProps\r\n}: CalendarWithDetailProps<T>) {\r\n const [selectedDate, setSelectedDate] = useState<Date | null>(null);\r\n const [selectedEvents, setSelectedEvents] = useState<T[]>([]);\r\n\r\n const handleDateSelect = useCallback(\r\n (date: Date, events: T[]) => {\r\n setSelectedDate(date);\r\n setSelectedEvents(events);\r\n onDateSelect?.(date, events);\r\n },\r\n [onDateSelect]\r\n );\r\n\r\n const isHorizontal = layout === \"horizontal\";\r\n const detailFirst = detailPosition === \"left\" || detailPosition === \"top\";\r\n\r\n const calendarElement = (\r\n <EventCalendar\r\n {...calendarProps}\r\n selectedDate={selectedDate}\r\n onDateSelect={handleDateSelect}\r\n />\r\n );\r\n\r\n const detailElement = (\r\n <CalendarDayDetail\r\n date={selectedDate}\r\n title={detailTitle}\r\n emptyMessage={detailEmptyMessage}\r\n className={isHorizontal ? \"min-w-[300px]\" : \"\"}\r\n >\r\n {selectedDate && renderDetail?.(selectedDate, selectedEvents)}\r\n </CalendarDayDetail>\r\n );\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"gap-4\",\r\n isHorizontal ? \"flex\" : \"flex flex-col\",\r\n isHorizontal && \"items-start\"\r\n )}\r\n >\r\n {detailFirst ? (\r\n <>\r\n {detailElement}\r\n <div className=\"flex-1\">{calendarElement}</div>\r\n </>\r\n ) : (\r\n <>\r\n <div className={isHorizontal ? \"flex-1\" : \"\"}>{calendarElement}</div>\r\n {detailElement}\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport {\r\n type ReactNode,\r\n type ElementType,\r\n type RefObject,\r\n useState,\r\n useEffect,\r\n useRef,\r\n createElement,\r\n Children,\r\n Fragment,\r\n} from \"react\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/** Available entrance animation types */\r\ntype Animation =\r\n | \"fadeIn\"\r\n | \"fadeInUp\"\r\n | \"scaleIn\"\r\n | \"slideInLeft\"\r\n | \"slideInRight\"\r\n | \"slideInUp\"\r\n | \"slideInDown\";\r\n\r\n/** Slide direction for SlideIn component */\r\ntype SlideDirection = \"left\" | \"right\" | \"up\" | \"down\";\r\n\r\n/** Options for the useInView hook */\r\ninterface UseInViewOptions {\r\n /** IntersectionObserver rootMargin (default: \"0px\") */\r\n margin?: string;\r\n /** Trigger only once (default: true) */\r\n once?: boolean;\r\n /** Enable/disable observation (default: true) */\r\n enabled?: boolean;\r\n}\r\n\r\n/** Shared base props for animation components */\r\ninterface AnimateBaseProps {\r\n children?: ReactNode;\r\n /** Delay in ms before animation starts */\r\n delay?: number;\r\n /** Animation duration in ms */\r\n duration?: number;\r\n /** Only animate when element scrolls into viewport */\r\n inView?: boolean;\r\n /** IntersectionObserver rootMargin for inView trigger */\r\n inViewMargin?: string;\r\n /** Fire animation only once (default: true) */\r\n once?: boolean;\r\n /** Disable animation entirely — renders children immediately */\r\n disabled?: boolean;\r\n className?: string;\r\n /** HTML element to render as (default: \"div\") */\r\n as?: ElementType;\r\n}\r\n\r\ninterface SlideInProps extends AnimateBaseProps {\r\n /** Direction to slide from */\r\n direction?: SlideDirection;\r\n}\r\n\r\ninterface StaggerChildrenProps {\r\n children?: ReactNode;\r\n /** Animation type for each child */\r\n animation?: Animation;\r\n /** Delay between each child in ms */\r\n staggerDelay?: number;\r\n /** Initial delay before first child animates */\r\n initialDelay?: number;\r\n /** Duration per child animation */\r\n duration?: number;\r\n inView?: boolean;\r\n inViewMargin?: string;\r\n once?: boolean;\r\n disabled?: boolean;\r\n className?: string;\r\n /** Extra classes applied to each child wrapper div */\r\n childClassName?: string;\r\n as?: ElementType;\r\n}\r\n\r\ninterface AnimatedTextProps {\r\n /** The text string to animate */\r\n text: string;\r\n as?: ElementType;\r\n animation?: Animation;\r\n /** Split text by word or character */\r\n splitBy?: \"word\" | \"character\";\r\n /** Delay between each segment in ms */\r\n staggerDelay?: number;\r\n delay?: number;\r\n duration?: number;\r\n inView?: boolean;\r\n inViewMargin?: string;\r\n once?: boolean;\r\n disabled?: boolean;\r\n className?: string;\r\n /** Extra classes on each animated text segment */\r\n segmentClassName?: string;\r\n}\r\n\r\ninterface AnimatedCounterProps {\r\n /** Start value (default: 0) */\r\n from?: number;\r\n /** Target value to count to */\r\n to: number;\r\n /** Count-up duration in ms (default: 2000) */\r\n duration?: number;\r\n /** Delay before counting starts in ms */\r\n delay?: number;\r\n /** Intl.NumberFormat locale for number formatting (e.g. \"en-US\") */\r\n locale?: string;\r\n /** Text rendered before the number */\r\n prefix?: string;\r\n /** Text rendered after the number */\r\n suffix?: string;\r\n /** Decimal places (default: 0) */\r\n decimals?: number;\r\n /** Custom number formatter — overrides locale/decimals */\r\n formatter?: (value: number) => string;\r\n inView?: boolean;\r\n inViewMargin?: string;\r\n once?: boolean;\r\n disabled?: boolean;\r\n className?: string;\r\n as?: ElementType;\r\n}\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\n/** Tailwind utility class for each animation — presence in dist ensures @keyframes emission via @source */\r\nconst ANIMATION_CLASSES: Record<Animation, string> = {\r\n fadeIn: \"animate-fade-in\",\r\n fadeInUp: \"animate-fade-in-up\",\r\n scaleIn: \"animate-scale-in\",\r\n slideInLeft: \"animate-slide-in-left\",\r\n slideInRight: \"animate-slide-in-right\",\r\n slideInUp: \"animate-slide-in-up\",\r\n slideInDown: \"animate-slide-in-down\",\r\n};\r\n\r\nconst SLIDE_MAP: Record<SlideDirection, Animation> = {\r\n left: \"slideInLeft\",\r\n right: \"slideInRight\",\r\n up: \"slideInUp\",\r\n down: \"slideInDown\",\r\n};\r\n\r\n// ============================================================================\r\n// Hooks\r\n// ============================================================================\r\n\r\n/**\r\n * useInView — observe when an element enters the viewport.\r\n *\r\n * @example\r\n * ```tsx\r\n * const ref = useRef<HTMLDivElement>(null);\r\n * const isInView = useInView(ref, { once: true, margin: \"-100px\" });\r\n * return <div ref={ref}>{isInView ? \"Visible!\" : \"Hidden\"}</div>;\r\n * ```\r\n */\r\nfunction useInView(\r\n ref: RefObject<Element | null>,\r\n options: UseInViewOptions = {},\r\n): boolean {\r\n const { margin = \"0px\", once = true, enabled = true } = options;\r\n const [inView, setInView] = useState(false);\r\n\r\n useEffect(() => {\r\n if (!enabled) return;\r\n const el = ref.current;\r\n if (!el) return;\r\n\r\n const observer = new IntersectionObserver(\r\n ([entry]) => {\r\n if (entry.isIntersecting) {\r\n setInView(true);\r\n if (once) observer.unobserve(el);\r\n } else if (!once) {\r\n setInView(false);\r\n }\r\n },\r\n { rootMargin: margin },\r\n );\r\n\r\n observer.observe(el);\r\n return () => observer.disconnect();\r\n }, [enabled, margin, once]);\r\n\r\n return inView;\r\n}\r\n\r\n// ============================================================================\r\n// Internal helpers\r\n// ============================================================================\r\n\r\nfunction useAnimationState(opts: {\r\n inView?: boolean;\r\n inViewMargin?: string;\r\n once?: boolean;\r\n disabled?: boolean;\r\n}) {\r\n const ref = useRef<HTMLElement>(null);\r\n const shouldAnimate = !opts.disabled;\r\n const isInView = useInView(ref, {\r\n margin: opts.inViewMargin,\r\n once: opts.once,\r\n enabled: !!opts.inView && shouldAnimate,\r\n });\r\n // active = should render animation classes right now\r\n const active = shouldAnimate && (!opts.inView || isInView);\r\n\r\n return { ref, shouldAnimate, active };\r\n}\r\n\r\n/** Per-instance timing overrides — only emitted when different from theme defaults */\r\nfunction animTimingStyle(delay: number, duration: number) {\r\n if (delay === 0 && duration === 600) return undefined;\r\n return {\r\n ...(duration !== 600 ? { animationDuration: `${duration}ms` } : {}),\r\n ...(delay > 0 ? { animationDelay: `${delay}ms` } : {}),\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Core: AnimateBase (internal — shared by all convenience components)\r\n// ============================================================================\r\n\r\nfunction AnimateBase({\r\n animation,\r\n children,\r\n delay = 0,\r\n duration = 600,\r\n inView = false,\r\n inViewMargin,\r\n once = true,\r\n disabled = false,\r\n className,\r\n as = \"div\",\r\n}: AnimateBaseProps & { animation: Animation }) {\r\n const { ref, shouldAnimate, active } = useAnimationState({\r\n inView,\r\n inViewMargin,\r\n once,\r\n disabled,\r\n });\r\n\r\n return createElement(\r\n as,\r\n {\r\n ref,\r\n \"data-fluid-animate\": shouldAnimate ? \"\" : undefined,\r\n className: cn(\r\n shouldAnimate && \"opacity-0\",\r\n active && ANIMATION_CLASSES[animation],\r\n className,\r\n ),\r\n style: active ? animTimingStyle(delay, duration) : undefined,\r\n },\r\n children,\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// Convenience Components\r\n// ============================================================================\r\n\r\n/** Fade in with opacity transition */\r\nfunction FadeIn(props: AnimateBaseProps) {\r\n return <AnimateBase animation=\"fadeIn\" {...props} />;\r\n}\r\n\r\n/** Fade in with upward motion */\r\nfunction FadeInUp(props: AnimateBaseProps) {\r\n return <AnimateBase animation=\"fadeInUp\" {...props} />;\r\n}\r\n\r\n/** Scale up into view */\r\nfunction ScaleIn(props: AnimateBaseProps) {\r\n return <AnimateBase animation=\"scaleIn\" {...props} />;\r\n}\r\n\r\n/** Slide in from a specified direction */\r\nfunction SlideIn({ direction = \"left\", ...props }: SlideInProps) {\r\n return <AnimateBase animation={SLIDE_MAP[direction]} {...props} />;\r\n}\r\n\r\n// ============================================================================\r\n// StaggerChildren — sequential reveal for lists / grids\r\n// ============================================================================\r\n\r\nfunction StaggerChildren({\r\n children,\r\n animation = \"fadeInUp\",\r\n staggerDelay = 100,\r\n initialDelay = 0,\r\n duration = 600,\r\n inView = false,\r\n inViewMargin,\r\n once = true,\r\n disabled = false,\r\n className,\r\n childClassName,\r\n as = \"div\",\r\n}: StaggerChildrenProps) {\r\n const { ref, shouldAnimate, active } = useAnimationState({\r\n inView,\r\n inViewMargin,\r\n once,\r\n disabled,\r\n });\r\n const items = Children.toArray(children);\r\n\r\n return createElement(\r\n as,\r\n { ref, className },\r\n items.map((child, i) => (\r\n <div\r\n key={i}\r\n data-fluid-animate={shouldAnimate ? \"\" : undefined}\r\n className={cn(\r\n shouldAnimate && \"opacity-0\",\r\n active && ANIMATION_CLASSES[animation],\r\n childClassName,\r\n )}\r\n style={\r\n active\r\n ? animTimingStyle(initialDelay + i * staggerDelay, duration)\r\n : undefined\r\n }\r\n >\r\n {child}\r\n </div>\r\n )),\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// AnimatedText — word-by-word or character-by-character reveal\r\n// ============================================================================\r\n\r\nfunction AnimatedText({\r\n text,\r\n as = \"div\",\r\n animation = \"fadeInUp\",\r\n splitBy = \"word\",\r\n staggerDelay = 80,\r\n delay = 0,\r\n duration = 600,\r\n inView = false,\r\n inViewMargin,\r\n once = true,\r\n disabled = false,\r\n className,\r\n segmentClassName,\r\n}: AnimatedTextProps) {\r\n const { ref, shouldAnimate, active } = useAnimationState({\r\n inView,\r\n inViewMargin,\r\n once,\r\n disabled,\r\n });\r\n\r\n const segments = splitBy === \"word\" ? text.split(\" \") : text.split(\"\");\r\n let animIndex = 0;\r\n\r\n return createElement(\r\n as,\r\n { ref, className },\r\n segments.map((segment, i) => {\r\n // Preserve spaces in character mode without animating them\r\n if (splitBy === \"character\" && segment === \" \") {\r\n return <Fragment key={i}>{\"\\u00A0\"}</Fragment>;\r\n }\r\n\r\n const idx = animIndex++;\r\n\r\n return (\r\n <Fragment key={i}>\r\n {splitBy === \"word\" && i > 0 && \" \"}\r\n <span\r\n data-fluid-animate={shouldAnimate ? \"\" : undefined}\r\n className={cn(\r\n \"inline-block\",\r\n shouldAnimate && \"opacity-0\",\r\n active && ANIMATION_CLASSES[animation],\r\n segmentClassName,\r\n )}\r\n style={\r\n active\r\n ? animTimingStyle(delay + idx * staggerDelay, duration)\r\n : undefined\r\n }\r\n >\r\n {segment}\r\n </span>\r\n </Fragment>\r\n );\r\n }),\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// AnimatedCounter — count up with easing\r\n// ============================================================================\r\n\r\nfunction easeOutCubic(t: number): number {\r\n return 1 - Math.pow(1 - t, 3);\r\n}\r\n\r\nfunction AnimatedCounter({\r\n from = 0,\r\n to,\r\n duration = 2000,\r\n delay = 0,\r\n locale,\r\n prefix,\r\n suffix,\r\n decimals = 0,\r\n formatter,\r\n inView = false,\r\n inViewMargin,\r\n once = true,\r\n disabled = false,\r\n className,\r\n as = \"span\",\r\n}: AnimatedCounterProps) {\r\n const ref = useRef<HTMLElement>(null);\r\n const isInView = useInView(ref, {\r\n margin: inViewMargin,\r\n once,\r\n enabled: inView && !disabled,\r\n });\r\n const active = !disabled && (!inView || isInView);\r\n const [count, setCount] = useState(from);\r\n const hasStarted = useRef(false);\r\n\r\n useEffect(() => {\r\n if (disabled) {\r\n setCount(to);\r\n return;\r\n }\r\n\r\n if (!active || hasStarted.current) return;\r\n hasStarted.current = true;\r\n\r\n // Respect reduced motion for JS-driven animation\r\n if (typeof window !== \"undefined\" && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches) {\r\n setCount(to);\r\n return;\r\n }\r\n\r\n const timeout = setTimeout(() => {\r\n const start = performance.now();\r\n const step = (now: number) => {\r\n const elapsed = now - start;\r\n const progress = Math.min(elapsed / duration, 1);\r\n const eased = easeOutCubic(progress);\r\n const current = from + (to - from) * eased;\r\n setCount(\r\n decimals > 0\r\n ? Number(current.toFixed(decimals))\r\n : Math.round(current),\r\n );\r\n if (progress < 1) requestAnimationFrame(step);\r\n };\r\n requestAnimationFrame(step);\r\n }, delay);\r\n\r\n return () => clearTimeout(timeout);\r\n }, [active, disabled, from, to, duration, delay, decimals]);\r\n\r\n const formatValue = (v: number): string => {\r\n if (formatter) return formatter(v);\r\n if (locale)\r\n return v.toLocaleString(locale, {\r\n minimumFractionDigits: decimals,\r\n maximumFractionDigits: decimals,\r\n });\r\n if (decimals > 0) return v.toFixed(decimals);\r\n return String(v);\r\n };\r\n\r\n return createElement(\r\n as,\r\n { ref, className },\r\n <>\r\n {prefix}\r\n {formatValue(count)}\r\n {suffix}\r\n </>,\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// Exports\r\n// ============================================================================\r\n\r\nexport {\r\n // Components\r\n FadeIn,\r\n FadeInUp,\r\n SlideIn,\r\n ScaleIn,\r\n StaggerChildren,\r\n AnimatedText,\r\n AnimatedCounter,\r\n // Hook\r\n useInView,\r\n};\r\n\r\nexport type {\r\n Animation,\r\n SlideDirection,\r\n UseInViewOptions,\r\n AnimateBaseProps,\r\n SlideInProps,\r\n StaggerChildrenProps,\r\n AnimatedTextProps,\r\n AnimatedCounterProps,\r\n};\r\n"]}