react-lookup-select 1.0.2 → 1.0.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/LICENSE +21 -0
- package/dist/index.cjs +109 -34
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +152 -1
- package/dist/index.d.ts +152 -1
- package/dist/index.js +110 -35
- package/dist/index.js.map +1 -1
- package/dist/styles.css +49 -59
- package/package.json +2 -2
- package/readme.md +166 -0
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/LookupSelect.tsx","../src/internal/state.ts","../src/internal/core.ts","../src/hooks/useAccessibility.ts","../src/components/Trigger.tsx","../src/components/Modal.tsx","../src/components/Grid.tsx","../src/components/VirtualGrid.tsx","../src/components/Pagination.tsx"],"sourcesContent":["// Main export file for @onurlulardan/react-lookup-select\nexport { LookupSelect } from './components/LookupSelect';\n\n// Public API Types - according to project.md Section 2\nexport type {\n // Main Props Interface\n LookupSelectProps,\n\n // Core Types\n SelectMode,\n ColumnDef,\n QueryState,\n DataSourceResult,\n DataSourceFn,\n ValueMapper,\n ReturnShape,\n ReturnMap,\n\n // Theming and Customization\n i18nStrings,\n ComponentsOverrides,\n ClassNames,\n Styles,\n ThemeTokens,\n} from './internal/types';\n","import React from 'react';\nimport { LookupSelectProps } from '../internal/types';\nimport { useLookupSelectState } from '../internal/state';\nimport {\n useKeyboardNavigation,\n useFocusManagement,\n useScreenReaderAnnouncements,\n} from '../hooks/useAccessibility';\nimport { Trigger } from './Trigger';\nimport { Modal, SearchInput, ModalFooter } from './Modal';\nimport { Grid } from './Grid';\nimport { VirtualGrid } from './VirtualGrid';\nimport { Pagination } from './Pagination';\n\n/**\n * LookupSelect - Headless React lookup select component with modal and grid\n */\nexport function LookupSelect<T = any>(props: LookupSelectProps<T>) {\n const {\n columns,\n mapper,\n mode = 'single',\n data = [],\n dataSource,\n variant = 'default',\n size = 'medium',\n icon,\n renderTrigger,\n modalTitle,\n classNames,\n styles,\n theme,\n i18n,\n pageSize = 20,\n selectableRow,\n virtualization = false,\n virtualRowHeight = 40,\n virtualOverscan = 5,\n virtualContainerHeight = 400,\n virtualThreshold = 100,\n } = props;\n\n // Headless state management\n const {\n modalOpen,\n openModal,\n closeModal,\n currentSelections,\n toggleRowSelection,\n clearSelections,\n isRowSelected,\n updateQuery,\n getCurrentQuery,\n confirmSelection,\n cancelSelection,\n } = useLookupSelectState(props);\n\n // i18n defaults - comprehensive multilingual support\n const texts = {\n triggerPlaceholder: 'Please select',\n searchPlaceholder: 'Search...',\n confirmText: 'Apply',\n cancelText: 'Cancel',\n modalTitle: 'Select Record',\n emptyText: 'No records found',\n loadingText: 'Loading...',\n errorPrefix: 'Error:',\n selectedCount: (n: number) => `${n} selected`,\n clearText: 'Clear',\n selectAllLabel: 'Select all',\n selectRowLabel: (rowText: string) => `Select ${rowText} option`,\n sortColumnLabel: (columnTitle: string) => `Sort by ${columnTitle} column`,\n closeModalLabel: 'Close modal',\n paginationInfo: (current: number, total: number) =>\n `Page ${current} / ${total}`,\n totalRecords: (total: number) => `${total} records`,\n searchResults: (count: number) => `${count} results found`,\n ...i18n,\n };\n\n // Hybrid mode optimization: Increase page size for virtualization\n const optimizedPageSize = React.useMemo(() => {\n if (dataSource && virtualization) {\n // For hybrid mode, fetch larger chunks (5-10x virtual container capacity)\n const containerCapacity = Math.ceil(\n virtualContainerHeight / virtualRowHeight\n );\n return Math.max(pageSize, containerCapacity * 5); // 5x buffer for smooth scrolling\n }\n return pageSize;\n }, [\n dataSource,\n virtualization,\n virtualContainerHeight,\n virtualRowHeight,\n pageSize,\n ]);\n\n // Accessibility hooks\n const { announce } = useScreenReaderAnnouncements();\n\n useFocusManagement(modalOpen);\n\n useKeyboardNavigation({\n isModalOpen: modalOpen,\n onClose: closeModal,\n onConfirm: confirmSelection,\n currentData: [],\n selectedRows: currentSelections,\n mode,\n });\n\n // Search state\n const [searchValue, setSearchValue] = React.useState('');\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<string | undefined>();\n\n // Server-side data state\n const [serverData, setServerData] = React.useState<T[]>([]);\n const [totalCount, setTotalCount] = React.useState(0);\n const [currentPage, setCurrentPage] = React.useState(1);\n\n const handleSearchChange = React.useCallback(\n (value: string) => {\n setSearchValue(value);\n updateQuery({ search: value, page: 1 }); // Reset to page 1 on search\n },\n [updateQuery]\n ); // Filtered data - client-side filtering if data provided\n const filteredData = React.useMemo(() => {\n if (!searchValue || dataSource) {\n return data;\n }\n\n return data.filter((item) => {\n // Search in all columns\n return columns.some((column) => {\n const cellValue = item[column.key as keyof T];\n return cellValue\n ?.toString()\n .toLowerCase()\n .includes(searchValue.toLowerCase());\n });\n });\n }, [data, searchValue, columns, dataSource]);\n\n // Data source - client vs server-side\n const currentData = dataSource ? serverData : filteredData;\n\n const loadServerData = React.useCallback(async () => {\n if (!dataSource) return;\n\n setLoading(true);\n setError(undefined);\n\n try {\n const query = getCurrentQuery();\n const result = await dataSource({\n ...query,\n search: searchValue,\n page: currentPage,\n pageSize: optimizedPageSize,\n });\n\n setServerData(result.rows);\n setTotalCount(result.total);\n setLoading(false);\n } catch (err) {\n setError(\n err instanceof Error ? err.message : 'Error occurred while loading data'\n );\n setLoading(false);\n }\n }, [\n dataSource,\n getCurrentQuery,\n searchValue,\n currentPage,\n optimizedPageSize,\n ]);\n\n // Load data when modal opens or query changes\n React.useEffect(() => {\n if (dataSource && modalOpen) {\n loadServerData();\n }\n }, [dataSource, modalOpen, loadServerData]);\n\n // Page change handler\n const handlePageChange = React.useCallback(\n (newPage: number) => {\n setCurrentPage(newPage);\n updateQuery({ page: newPage });\n },\n [updateQuery]\n );\n\n // Sort change handler\n const handleSortChange = React.useCallback(\n (sortBy: string, sortDir: 'asc' | 'desc') => {\n updateQuery({ sortBy, sortDir, page: 1 }); // Reset to page 1 on sort\n setCurrentPage(1);\n },\n [updateQuery]\n );\n\n // Virtualization logic\n const shouldUseVirtualization = React.useMemo(() => {\n if (!virtualization) return false;\n // Auto-enable virtualization if data exceeds threshold\n return currentData.length >= virtualThreshold;\n }, [virtualization, currentData.length, virtualThreshold]);\n\n const virtualizationConfig = React.useMemo(\n () => ({\n enabled: shouldUseVirtualization,\n rowHeight: virtualRowHeight,\n overscan: virtualOverscan,\n containerHeight: virtualContainerHeight,\n threshold: virtualThreshold,\n }),\n [\n shouldUseVirtualization,\n virtualRowHeight,\n virtualOverscan,\n virtualContainerHeight,\n virtualThreshold,\n ]\n );\n\n // Grid component with current data - Performance optimized with useCallback\n const renderGrid = React.useCallback(() => {\n const commonGridProps = {\n data: currentData,\n columns,\n mode,\n mapper,\n selectedRows: currentSelections,\n onRowToggle: toggleRowSelection,\n isRowSelected,\n selectableRow,\n loading,\n error,\n emptyText: texts.emptyText,\n className: classNames?.grid,\n style: styles?.grid,\n currentSort: dataSource\n ? {\n sortBy: getCurrentQuery().sortBy || '',\n sortDir: getCurrentQuery().sortDir || 'asc',\n }\n : undefined,\n onSort: dataSource ? handleSortChange : undefined,\n };\n\n if (shouldUseVirtualization) {\n return (\n <VirtualGrid\n {...commonGridProps}\n virtualization={virtualizationConfig}\n />\n );\n }\n\n return <Grid {...commonGridProps} />;\n }, [\n currentData,\n columns,\n mode,\n mapper,\n currentSelections,\n toggleRowSelection,\n isRowSelected,\n selectableRow,\n loading,\n error,\n texts.emptyText,\n classNames?.grid,\n styles?.grid,\n dataSource,\n getCurrentQuery,\n handleSortChange,\n shouldUseVirtualization,\n virtualizationConfig,\n ]);\n\n // Generate theme class names\n const getThemeClasses = () => {\n const classes = ['lookup-select'];\n\n if (variant && variant !== 'default') {\n classes.push(`lookup-select--theme-${variant}`);\n }\n\n if (size && size !== 'medium') {\n classes.push(`lookup-select--size-${size}`);\n }\n\n if (classNames?.root) {\n classes.push(classNames.root);\n }\n\n return classes.join(' ');\n };\n\n // Generate inline theme styles\n const getThemeStyles = () => {\n const themeStyles: Record<string, string> = {};\n\n if (theme) {\n if (theme.colorPrimary)\n themeStyles['--lookup-select-color-primary'] = theme.colorPrimary;\n if (theme.colorBg)\n themeStyles['--lookup-select-color-bg'] = theme.colorBg;\n if (theme.colorText)\n themeStyles['--lookup-select-color-text'] = theme.colorText;\n if (theme.borderRadius)\n themeStyles['--lookup-select-border-radius'] =\n typeof theme.borderRadius === 'number'\n ? `${theme.borderRadius}px`\n : theme.borderRadius;\n if (theme.spacing)\n themeStyles['--lookup-select-spacing'] = `${theme.spacing}px`;\n }\n\n return { ...themeStyles, ...styles?.root } as React.CSSProperties;\n };\n\n return (\n <div className={getThemeClasses()} style={getThemeStyles()}>\n <Trigger\n isOpen={modalOpen}\n onToggle={openModal}\n selectedItems={currentSelections}\n placeholder={texts.triggerPlaceholder}\n icon={icon}\n mapper={mapper}\n mode={mode}\n className={classNames?.trigger}\n style={styles?.trigger}\n renderTrigger={renderTrigger}\n onClear={clearSelections}\n onRemoveTag={(item) => toggleRowSelection(item)}\n />\n\n <Modal\n isOpen={modalOpen}\n onClose={cancelSelection}\n title={modalTitle || texts.modalTitle}\n className={classNames?.modal}\n style={styles?.modal}\n >\n {/* Search Input */}\n <SearchInput\n value={searchValue}\n onChange={handleSearchChange}\n placeholder={texts.searchPlaceholder}\n />\n\n <div className=\"lookup-select__modal-content\">\n {renderGrid()}\n\n {/* Pagination - only for server-side data */}\n {dataSource && (\n <Pagination\n currentPage={currentPage}\n totalCount={totalCount}\n pageSize={optimizedPageSize}\n onPageChange={handlePageChange}\n />\n )}\n </div>\n\n {/* Footer */}\n <ModalFooter\n onConfirm={confirmSelection}\n onCancel={cancelSelection}\n confirmText={texts.confirmText}\n cancelText={texts.cancelText}\n selectedCount={currentSelections.length}\n />\n </Modal>\n </div>\n );\n}\n","import { useState, useCallback, useMemo, useEffect } from 'react';\nimport { LookupSelectProps, QueryState } from './types';\nimport { SelectionManager, QueryManager, mapReturnValue } from './core';\n\n/**\n * State machine: idle → modalOpen → selecting → confirming/cancelled\n */\n\nexport type ModalState = 'closed' | 'open';\n\n/**\n * Main state hook - controlled/uncontrolled behavior\n */\nexport function useLookupSelectState<T>(props: LookupSelectProps<T>) {\n const {\n mode = 'single',\n mapper,\n returnShape = 'id-text',\n returnMap,\n value,\n defaultValue,\n onChange,\n open,\n defaultOpen = false,\n onOpenChange,\n pageSize = 20,\n onQueryChange,\n onSelectionChange,\n onConfirm,\n onCancel,\n data,\n } = props;\n\n // Modal state management (controlled/uncontrolled)\n const [internalModalOpen, setInternalModalOpen] = useState(defaultOpen);\n const modalOpen = open !== undefined ? open : internalModalOpen;\n\n const handleModalOpenChange = useCallback(\n (newOpen: boolean) => {\n if (open === undefined) {\n setInternalModalOpen(newOpen);\n }\n onOpenChange?.(newOpen);\n },\n [open, onOpenChange]\n );\n\n // Selection manager\n const selectionManager = useMemo(() => {\n return new SelectionManager(mode, mapper);\n }, [mode, mapper]);\n\n // Query manager\n const queryManager = useMemo(() => {\n return new QueryManager({ pageSize });\n }, [pageSize]);\n\n // Current selections state\n const [currentSelections, setCurrentSelections] = useState<T[]>([]);\n\n // Helper function to resolve value objects to actual data rows\n const resolveValueToRows = useCallback(\n (valueToResolve: any): T[] => {\n if (!valueToResolve || !data) return [];\n\n const values = Array.isArray(valueToResolve)\n ? valueToResolve\n : [valueToResolve];\n const resolvedRows: T[] = [];\n\n for (const val of values) {\n // If it's already a full row object, use it directly\n if (\n typeof val === 'object' &&\n val !== null &&\n mapper.getId(val as T) !== undefined\n ) {\n resolvedRows.push(val as T);\n }\n // If it's an id-text object or just an ID, find the matching row in data\n else {\n const searchId =\n typeof val === 'object' && val !== null && 'id' in val\n ? val.id\n : val;\n const matchingRow = data.find(\n (row) => mapper.getId(row) === searchId\n );\n if (matchingRow) {\n resolvedRows.push(matchingRow);\n }\n }\n }\n\n return resolvedRows;\n },\n [data, mapper]\n );\n\n // Initialize default/controlled values when data is available\n useEffect(() => {\n const initialValue = value !== undefined ? value : defaultValue;\n if (!initialValue || !data) return;\n\n const resolvedSelections = resolveValueToRows(initialValue);\n\n if (resolvedSelections.length > 0) {\n // Clear previous selections\n selectionManager.clearSelection();\n\n // Add new selections\n for (const row of resolvedSelections) {\n selectionManager.toggleRow(row);\n }\n\n setCurrentSelections(resolvedSelections);\n }\n }, [value, defaultValue, data, resolveValueToRows, selectionManager]);\n\n // Toggle row selection\n const toggleRowSelection = useCallback(\n (row: T) => {\n const newState = selectionManager.toggleRow(row);\n const selectedRows = selectionManager.getSelectedRows();\n setCurrentSelections(selectedRows);\n onSelectionChange?.(selectedRows);\n },\n [selectionManager, onSelectionChange]\n );\n\n // Clear all selections\n const clearSelections = useCallback(() => {\n selectionManager.clearSelection();\n setCurrentSelections([]);\n onSelectionChange?.([]);\n }, [selectionManager, onSelectionChange]);\n\n // Check if row is selected\n const isRowSelected = useCallback(\n (row: T) => {\n return selectionManager.isRowSelected(row);\n },\n [selectionManager]\n );\n\n // Query state updates\n const updateQuery = useCallback(\n (updates: Partial<QueryState>) => {\n const currentState = queryManager.getState();\n const newState = { ...currentState, ...updates };\n\n if (updates.search !== undefined) {\n queryManager.updateSearch(updates.search);\n }\n if (updates.page !== undefined) {\n queryManager.updatePage(updates.page);\n }\n if (updates.sortBy !== undefined && updates.sortDir !== undefined) {\n queryManager.updateSort(updates.sortBy, updates.sortDir);\n }\n if (updates.pageSize !== undefined) {\n queryManager.updatePageSize(updates.pageSize);\n }\n\n onQueryChange?.(queryManager.getState());\n },\n [queryManager, onQueryChange]\n );\n\n // Confirm selection (Apply button)\n const confirmSelection = useCallback(() => {\n const selectedRows = selectionManager.getSelectedRows();\n const returnValue = mapReturnValue(selectedRows, {\n mode,\n mapper,\n returnShape,\n returnMap,\n });\n\n onChange?.(returnValue);\n onConfirm?.(returnValue);\n handleModalOpenChange(false);\n }, [\n selectionManager,\n mode,\n mapper,\n returnShape,\n returnMap,\n onChange,\n onConfirm,\n handleModalOpenChange,\n ]);\n\n // Cancel selection (Close modal without applying)\n const cancelSelection = useCallback(() => {\n // Reset selections to original value\n selectionManager.clearSelection();\n setCurrentSelections([]);\n onCancel?.();\n handleModalOpenChange(false);\n }, [selectionManager, onCancel, handleModalOpenChange]);\n\n // Get current query state\n const getCurrentQuery = useCallback(() => {\n return queryManager.getState();\n }, [queryManager]);\n\n return {\n // Modal state\n modalOpen,\n openModal: () => handleModalOpenChange(true),\n closeModal: () => handleModalOpenChange(false),\n\n // Selection state\n currentSelections,\n toggleRowSelection,\n clearSelections,\n isRowSelected,\n\n // Query state\n updateQuery,\n getCurrentQuery,\n\n // Actions\n confirmSelection,\n cancelSelection,\n };\n}\n","import {\n LookupSelectProps,\n QueryState,\n SelectMode,\n ValueMapper,\n} from './types';\n\n/**\n * Headless core logic - selection state, query state, mapping and return value generation\n */\n\n/**\n * Selection state - Set<rowId> + Map<rowId, row> for fast access\n */\nexport interface SelectionState<T> {\n selectedIds: Set<string | number>;\n selectedRows: Map<string | number, T>;\n}\n\n/**\n * Selection state creator\n */\nexport function createSelectionState<T>(): SelectionState<T> {\n return {\n selectedIds: new Set<string | number>(),\n selectedRows: new Map<string | number, T>(),\n };\n}\n\n/**\n * Selection state update functions\n */\nexport class SelectionManager<T> {\n private state: SelectionState<T>;\n private mode: SelectMode;\n private mapper: ValueMapper<T>;\n\n constructor(\n mode: SelectMode,\n mapper: ValueMapper<T>,\n initialState?: SelectionState<T>\n ) {\n this.mode = mode;\n this.mapper = mapper;\n this.state = initialState || createSelectionState<T>();\n }\n\n /**\n * Row selection/deselection\n */\n toggleRow(row: T): SelectionState<T> {\n const id = this.mapper.getId(row);\n const newState = {\n selectedIds: new Set(this.state.selectedIds),\n selectedRows: new Map(this.state.selectedRows),\n };\n\n if (this.state.selectedIds.has(id)) {\n // Remove selection\n newState.selectedIds.delete(id);\n newState.selectedRows.delete(id);\n } else {\n // Select\n if (this.mode === 'single') {\n // Clear others in single mode\n newState.selectedIds.clear();\n newState.selectedRows.clear();\n }\n newState.selectedIds.add(id);\n newState.selectedRows.set(id, row);\n }\n\n this.state = newState;\n return newState;\n }\n\n /**\n * Return selected rows as array\n */\n getSelectedRows(): T[] {\n return Array.from(this.state.selectedRows.values());\n }\n\n /**\n * Check if row is selected\n */\n isRowSelected(row: T): boolean {\n const id = this.mapper.getId(row);\n return this.state.selectedIds.has(id);\n }\n\n /**\n * Clear all selections\n */\n clearSelection(): SelectionState<T> {\n this.state = createSelectionState<T>();\n return this.state;\n }\n\n /**\n * Get current state\n */\n getState(): SelectionState<T> {\n return this.state;\n }\n}\n\n/**\n * Query state creator - with default values\n */\nexport function createQueryState(pageSize: number = 20): QueryState {\n return {\n page: 1,\n pageSize,\n search: undefined,\n sortBy: undefined,\n sortDir: undefined,\n };\n}\n\n/**\n * Query state update functions\n */\nexport class QueryManager {\n private state: QueryState;\n\n constructor(initialState?: Partial<QueryState>) {\n this.state = { ...createQueryState(), ...initialState };\n }\n\n /**\n * Update search term - returns to page 1\n */\n updateSearch(search: string): QueryState {\n this.state = { ...this.state, search, page: 1 };\n return this.state;\n }\n\n /**\n * Update pagination\n */\n updatePage(page: number): QueryState {\n this.state = { ...this.state, page };\n return this.state;\n }\n\n /**\n * Update sorting - returns to page 1\n */\n updateSort(sortBy: string, sortDir: 'asc' | 'desc'): QueryState {\n this.state = { ...this.state, sortBy, sortDir, page: 1 };\n return this.state;\n }\n\n /**\n * Update page size - returns to page 1\n */\n updatePageSize(pageSize: number): QueryState {\n this.state = { ...this.state, pageSize, page: 1 };\n return this.state;\n }\n\n /**\n * Get current state\n */\n getState(): QueryState {\n return this.state;\n }\n}\n\n/**\n * Return value generation - project.md Section 4 logic\n */\nexport function mapReturnValue<T>(\n selectedRows: T[],\n props: Pick<\n LookupSelectProps<T>,\n 'returnShape' | 'returnMap' | 'mapper' | 'mode'\n >\n) {\n const { returnShape = 'id-text', returnMap, mapper, mode = 'single' } = props;\n\n if (selectedRows.length === 0) {\n return mode === 'single' ? null : [];\n }\n\n let mappedValues;\n\n switch (returnShape) {\n case 'id-text':\n // returnShape = 'id-text' → Single: { id, text } | Multiple: { id, text }[]\n mappedValues = selectedRows.map((row) => ({\n id: mapper.getId(row),\n text: mapper.getText(row),\n }));\n break;\n case 'row':\n // returnShape = 'row' → Single: T | Multiple: T[]\n mappedValues = selectedRows;\n break;\n case 'custom':\n // returnShape = 'custom' → returnMap.map(row) result\n if (!returnMap) {\n throw new Error('returnMap is required when returnShape is \"custom\"');\n }\n mappedValues = selectedRows.map((row) => returnMap.map(row));\n break;\n default:\n throw new Error(`Unknown returnShape: ${returnShape}`);\n }\n\n return mode === 'single' ? mappedValues[0] : mappedValues;\n}\n","import { useEffect, useCallback } from 'react';\n\n/**\n * Keyboard navigation hook for LookupSelect\n * Handles Enter, Escape, Arrow keys, Tab navigation\n */\nexport function useKeyboardNavigation({\n isModalOpen,\n onClose,\n onConfirm,\n onRowSelect,\n currentData,\n selectedRows,\n mode,\n}: {\n isModalOpen: boolean;\n onClose: () => void;\n onConfirm?: () => void;\n onRowSelect?: (row: any) => void;\n currentData: any[];\n selectedRows: any[];\n mode: 'single' | 'multiple';\n}) {\n // Handle keyboard shortcuts\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (!isModalOpen) return;\n\n switch (event.key) {\n case 'Escape':\n event.preventDefault();\n onClose();\n break;\n\n case 'Enter':\n if (event.ctrlKey || event.metaKey) {\n event.preventDefault();\n onConfirm?.();\n }\n break;\n\n case 'ArrowDown':\n case 'ArrowUp':\n // Grid navigation handled by Grid component\n break;\n\n default:\n break;\n }\n },\n [isModalOpen, onClose, onConfirm]\n );\n\n useEffect(() => {\n if (isModalOpen) {\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }\n }, [isModalOpen, handleKeyDown]);\n\n return {\n handleKeyDown,\n };\n}\n\n/**\n * Focus management hook for accessibility\n * Manages focus trap and initial focus\n */\nexport function useFocusManagement(isOpen: boolean) {\n useEffect(() => {\n if (!isOpen) return;\n\n const modal = document.querySelector('[role=\"dialog\"]') as HTMLElement;\n if (!modal) return;\n\n // Get all focusable elements in modal\n const focusableElements = modal.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n ) as NodeListOf<HTMLElement>;\n\n const firstFocusable = focusableElements[0];\n const lastFocusable = focusableElements[focusableElements.length - 1];\n\n // Focus first element (usually search input)\n firstFocusable?.focus();\n\n const handleTabKey = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n\n if (e.shiftKey) {\n // Shift + Tab\n if (document.activeElement === firstFocusable) {\n e.preventDefault();\n lastFocusable?.focus();\n }\n } else {\n // Tab\n if (document.activeElement === lastFocusable) {\n e.preventDefault();\n firstFocusable?.focus();\n }\n }\n };\n\n document.addEventListener('keydown', handleTabKey);\n\n return () => {\n document.removeEventListener('keydown', handleTabKey);\n };\n }, [isOpen]);\n}\n\n/**\n * Screen reader announcements hook\n * Provides live region announcements for state changes\n */\nexport function useScreenReaderAnnouncements() {\n const announce = useCallback(\n (message: string, priority: 'polite' | 'assertive' = 'polite') => {\n const announcement = document.createElement('div');\n announcement.setAttribute('aria-live', priority);\n announcement.setAttribute('aria-atomic', 'true');\n announcement.className = 'sr-only'; // Screen reader only class\n announcement.textContent = message;\n\n document.body.appendChild(announcement);\n\n // Remove after announcement\n setTimeout(() => {\n document.body.removeChild(announcement);\n }, 1000);\n },\n []\n );\n\n return { announce };\n}\n","import React from 'react';\nimport { LookupSelectProps } from '../internal/types';\n\n/**\n * Trigger component - ComboBox appearance, opens modal when clicked\n */\n\ninterface TriggerProps<T> {\n isOpen: boolean;\n onToggle: () => void;\n selectedItems: T[];\n placeholder?: string;\n icon?: React.ReactNode;\n mapper: LookupSelectProps<T>['mapper'];\n mode: LookupSelectProps<T>['mode'];\n className?: string;\n style?: React.CSSProperties;\n renderTrigger?: (selected: T | T[] | null) => React.ReactNode;\n onClear?: () => void;\n onRemoveTag?: (item: T) => void;\n}\n\nexport function Trigger<T>({\n isOpen,\n onToggle,\n selectedItems,\n placeholder = 'Please select',\n icon,\n mapper,\n mode = 'single',\n className,\n style,\n renderTrigger,\n onClear,\n onRemoveTag,\n}: TriggerProps<T>) {\n const selectedValue =\n mode === 'single' ? selectedItems[0] || null : selectedItems;\n\n // Use custom trigger if available\n if (renderTrigger) {\n return (\n <div\n role=\"button\"\n tabIndex={0}\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n onClick={onToggle}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onToggle();\n }\n }}\n className={className}\n style={style}\n >\n {renderTrigger(selectedValue)}\n </div>\n );\n }\n\n // Default trigger appearance\n return (\n <div\n role=\"button\"\n tabIndex={0}\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n className={`lookup-select__trigger ${className || ''}`}\n style={style}\n onClick={onToggle}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onToggle();\n }\n }}\n >\n <div className=\"lookup-select__trigger-content\">\n {selectedItems.length === 0 ? (\n <span className=\"lookup-select__placeholder\">{placeholder}</span>\n ) : mode === 'single' ? (\n <span className=\"lookup-select__selected-text\">\n {mapper.getText(selectedItems[0])}\n </span>\n ) : (\n <div className=\"lookup-select__tags\">\n {selectedItems.slice(0, 3).map((item) => (\n <span key={mapper.getId(item)} className=\"lookup-select__tag\">\n {mapper.getText(item)}\n <button\n type=\"button\"\n className=\"lookup-select__tag-remove\"\n onClick={(e) => {\n e.stopPropagation();\n onRemoveTag?.(item);\n }}\n aria-label={`Remove ${mapper.getText(item)}`}\n >\n ×\n </button>\n </span>\n ))}\n {selectedItems.length > 3 && (\n <span className=\"lookup-select__tag lookup-select__tag--more\">\n +{selectedItems.length - 3} more\n </span>\n )}\n </div>\n )}\n </div>\n\n <div className=\"lookup-select__trigger-actions\">\n {/* Clear button - only show if there are selections */}\n {selectedItems.length > 0 && onClear && (\n <button\n type=\"button\"\n className=\"lookup-select__clear-button\"\n onClick={(e) => {\n e.stopPropagation();\n onClear();\n }}\n aria-label=\"Clear selection\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path\n d=\"M10.5 5.5L5.5 10.5M5.5 5.5L10.5 10.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n\n {/* Dropdown icon */}\n <div className=\"lookup-select__trigger-icon\">\n {icon || (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import React, { useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\n\n/**\n * Modal component - header/search/body/footer\n */\n\ninterface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n className?: string;\n style?: React.CSSProperties;\n children: React.ReactNode;\n // ARIA & Accessibility props\n ariaLabel?: string;\n ariaLabelledBy?: string;\n ariaDescribedBy?: string;\n closeButtonLabel?: string;\n}\n\nexport function Modal({\n isOpen,\n onClose,\n title = 'Select Record',\n className,\n style,\n children,\n ariaLabel,\n ariaLabelledBy,\n ariaDescribedBy,\n closeButtonLabel = 'Close modal',\n}: ModalProps) {\n const modalRef = useRef<HTMLDivElement>(null);\n const previousFocusRef = useRef<HTMLElement | null>(null);\n\n // Focus trap implementation\n useEffect(() => {\n if (!isOpen) return;\n\n // Store currently focused element\n previousFocusRef.current = document.activeElement as HTMLElement;\n\n // Focus first focusable element in modal\n const focusableElements = modalRef.current?.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n\n if (focusableElements && focusableElements.length > 0) {\n (focusableElements[0] as HTMLElement).focus();\n }\n\n // Handle Escape key\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n\n // Handle Tab key for focus trap\n const handleTab = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n\n const focusableElements = modalRef.current?.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n\n if (!focusableElements || focusableElements.length === 0) return;\n\n const firstElement = focusableElements[0] as HTMLElement;\n const lastElement = focusableElements[\n focusableElements.length - 1\n ] as HTMLElement;\n\n if (e.shiftKey) {\n // Shift + Tab\n if (document.activeElement === firstElement) {\n lastElement.focus();\n e.preventDefault();\n }\n } else {\n // Tab\n if (document.activeElement === lastElement) {\n firstElement.focus();\n e.preventDefault();\n }\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n document.addEventListener('keydown', handleTab);\n\n // Cleanup\n return () => {\n document.removeEventListener('keydown', handleEscape);\n document.removeEventListener('keydown', handleTab);\n\n // Restore focus to previous element\n if (previousFocusRef.current) {\n previousFocusRef.current.focus();\n }\n };\n }, [isOpen, onClose]);\n\n // Prevent body scroll when modal is open\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n\n return () => {\n document.body.style.overflow = '';\n };\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n return createPortal(\n <div\n className=\"lookup-select__modal-overlay\"\n onClick={onClose}\n role=\"presentation\"\n >\n <div\n ref={modalRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n aria-labelledby={\n ariaLabelledBy || (title ? 'lookup-select-modal-title' : undefined)\n }\n aria-describedby={ariaDescribedBy}\n className={`lookup-select__modal ${className || ''}`}\n style={style}\n onClick={(e) => e.stopPropagation()}\n tabIndex={-1}\n >\n <div className=\"lookup-select__modal-header\">\n <h2\n id=\"lookup-select-modal-title\"\n className=\"lookup-select__modal-title\"\n >\n {title}\n </h2>\n <button\n type=\"button\"\n className=\"lookup-select__modal-close\"\n onClick={onClose}\n aria-label={closeButtonLabel}\n tabIndex={0}\n >\n ×\n </button>\n </div>\n\n <div className=\"lookup-select__modal-body\" role=\"document\">\n {children}\n </div>\n </div>\n </div>,\n document.body\n );\n}\n\n/**\n * Search input component - for searching within modal\n */\ninterface SearchInputProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n className?: string;\n}\n\nexport function SearchInput({\n value,\n onChange,\n placeholder = 'Search...',\n className,\n}: SearchInputProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Auto focus on mount\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n }, []);\n\n return (\n <div className={`lookup-select__search ${className || ''}`}>\n <input\n ref={inputRef}\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n className=\"lookup-select__search-input\"\n aria-label=\"Search records\"\n />\n <div className=\"lookup-select__search-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z\" />\n </svg>\n </div>\n </div>\n );\n}\n\n/**\n * Modal footer - confirm/cancel buttons\n */\ninterface ModalFooterProps {\n onConfirm: () => void;\n onCancel: () => void;\n confirmText?: string;\n cancelText?: string;\n selectedCount?: number;\n className?: string;\n}\n\nexport function ModalFooter({\n onConfirm,\n onCancel,\n confirmText = 'Apply',\n cancelText = 'Cancel',\n selectedCount = 0,\n className,\n}: ModalFooterProps) {\n return (\n <div className={`lookup-select__modal-footer ${className || ''}`}>\n <div className=\"lookup-select__selected-count\">\n {selectedCount > 0 ? `${selectedCount} selected` : 'No selection'}\n </div>\n\n <div className=\"lookup-select__modal-actions\">\n <button\n type=\"button\"\n className=\"lookup-select__button lookup-select__button--secondary\"\n onClick={onCancel}\n >\n {cancelText}\n </button>\n <button\n type=\"button\"\n className=\"lookup-select__button lookup-select__button--primary\"\n onClick={onConfirm}\n disabled={selectedCount === 0}\n >\n {confirmText}\n </button>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { ColumnDef, ValueMapper, SelectMode } from '../internal/types';\n\n/**\n * Grid component - Simple table + column render\n */\n\ninterface GridProps<T> {\n data: T[];\n columns: ColumnDef<T>[];\n mode: SelectMode;\n mapper: ValueMapper<T>;\n selectedRows: T[];\n onRowToggle: (row: T) => void;\n onRowClick?: (row: T) => void;\n isRowSelected: (row: T) => boolean;\n selectableRow?: (row: T) => boolean;\n onSort?: (sortBy: string, sortDir: 'asc' | 'desc') => void;\n currentSort?: { sortBy?: string; sortDir?: 'asc' | 'desc' };\n loading?: boolean;\n error?: string;\n emptyText?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function Grid<T>({\n data,\n columns,\n mode,\n mapper,\n selectedRows,\n onRowToggle,\n onRowClick,\n isRowSelected,\n selectableRow,\n onSort,\n currentSort,\n loading = false,\n error,\n emptyText = 'No records found',\n className,\n style,\n}: GridProps<T>) {\n const handleSort = (columnKey: string) => {\n if (!onSort) return;\n\n const currentSortBy = currentSort?.sortBy;\n const currentSortDir = currentSort?.sortDir;\n\n let newSortDir: 'asc' | 'desc' = 'asc';\n\n if (currentSortBy === columnKey) {\n // Same column - toggle direction\n newSortDir = currentSortDir === 'asc' ? 'desc' : 'asc';\n }\n\n onSort(columnKey, newSortDir);\n };\n\n const getSortIcon = (columnKey: string) => {\n if (currentSort?.sortBy !== columnKey) {\n return '↕'; // Both directions\n }\n\n return currentSort.sortDir === 'asc' ? '↑' : '↓';\n };\n\n // Loading state\n if (loading) {\n return (\n <div className=\"lookup-select__grid-state\">\n <div className=\"lookup-select__loading\">\n <p>Loading...</p>\n </div>\n </div>\n );\n }\n\n // Error state\n if (error) {\n return (\n <div className=\"lookup-select__grid-state\">\n <div className=\"lookup-select__error\">\n <p>Error: {error}</p>\n </div>\n </div>\n );\n }\n\n // Empty state\n if (data.length === 0) {\n return (\n <div className=\"lookup-select__grid-state\">\n <div className=\"lookup-select__empty\">\n <p>{emptyText}</p>\n </div>\n </div>\n );\n }\n\n const handleRowClick = (row: T, event: React.MouseEvent) => {\n // Don't trigger row click when checkbox is clicked\n if ((event.target as HTMLElement).closest('.lookup-select__checkbox')) {\n return;\n }\n\n // Selectable check\n if (selectableRow && !selectableRow(row)) {\n return;\n }\n\n // Disabled row check\n if (mapper.getDisabled?.(row)) {\n return;\n }\n\n onRowClick?.(row);\n onRowToggle(row);\n };\n\n const handleCheckboxChange = (\n row: T,\n event: React.ChangeEvent<HTMLInputElement>\n ) => {\n event.stopPropagation();\n\n // Selectable check\n if (selectableRow && !selectableRow(row)) {\n return;\n }\n\n // Disabled row check\n if (mapper.getDisabled?.(row)) {\n return;\n }\n\n onRowToggle(row);\n };\n\n const isRowDisabled = (row: T) => {\n if (mapper.getDisabled?.(row)) return true;\n if (selectableRow && !selectableRow(row)) return true;\n return false;\n };\n\n return (\n <div className={`lookup-select__grid ${className || ''}`} style={style}>\n <table\n className=\"lookup-select__table\"\n role=\"grid\"\n aria-label=\"Record list\"\n aria-rowcount={data.length}\n aria-multiselectable={mode === 'multiple'}\n >\n <thead className=\"lookup-select__table-head\">\n <tr>\n {/* Checkbox column for multiple mode */}\n {mode === 'multiple' && (\n <th className=\"lookup-select__table-header lookup-select__table-header--checkbox\">\n <div className=\"lookup-select__checkbox\">\n <input\n type=\"checkbox\"\n checked={\n selectedRows.length > 0 &&\n selectedRows.length ===\n data.filter((row) => !isRowDisabled(row)).length\n }\n ref={(input) => {\n if (input) {\n input.indeterminate =\n selectedRows.length > 0 &&\n selectedRows.length <\n data.filter((row) => !isRowDisabled(row)).length;\n }\n }}\n onChange={(e) => {\n const selectableRows = data.filter(\n (row) => !isRowDisabled(row)\n );\n if (e.target.checked) {\n // Select all selectable rows\n selectableRows.forEach((row) => {\n if (!isRowSelected(row)) {\n onRowToggle(row);\n }\n });\n } else {\n // Deselect all\n selectedRows.forEach((row) => {\n onRowToggle(row);\n });\n }\n }}\n aria-label=\"Select all\"\n />\n </div>\n </th>\n )}\n\n {/* Column headers */}\n {columns.map((column, index) => (\n <th\n key={\n typeof column.key === 'string'\n ? column.key\n : String(column.key)\n }\n className=\"lookup-select__table-header\"\n style={{ width: column.width }}\n >\n <div className=\"lookup-select__table-header-content\">\n {column.title}\n {column.sortable && (\n <button\n type=\"button\"\n className=\"lookup-select__sort-button\"\n aria-label={`Sort by ${column.title} column`}\n onClick={() => handleSort(String(column.key))}\n >\n {getSortIcon(String(column.key))}\n </button>\n )}\n </div>\n </th>\n ))}\n </tr>\n </thead>\n\n <tbody className=\"lookup-select__table-body\">\n {data.map((row, rowIndex) => {\n const rowId = mapper.getId(row);\n const selected = isRowSelected(row);\n const disabled = isRowDisabled(row);\n\n return (\n <tr\n key={rowId}\n className={`\n lookup-select__table-row\n ${selected ? 'lookup-select__table-row--selected' : ''}\n ${disabled ? 'lookup-select__table-row--disabled' : ''}\n `}\n onClick={(e) => !disabled && handleRowClick(row, e)}\n role={disabled ? undefined : 'button'}\n tabIndex={disabled ? undefined : 0}\n onKeyDown={(e) => {\n if (disabled) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onRowToggle(row);\n }\n }}\n aria-label={\n disabled ? undefined : `Select ${mapper.getText(row)} row`\n }\n >\n {/* Checkbox cell for multiple mode */}\n {mode === 'multiple' && (\n <td className=\"lookup-select__table-cell lookup-select__table-cell--checkbox\">\n <div className=\"lookup-select__checkbox\">\n <input\n type=\"checkbox\"\n checked={selected}\n onChange={(e) => handleCheckboxChange(row, e)}\n disabled={disabled}\n aria-label={`Select ${mapper.getText(row)}`}\n />\n </div>\n </td>\n )}\n\n {/* Data cells */}\n {columns.map((column, columnIndex) => {\n const cellKey = `${rowId}-${typeof column.key === 'string' ? column.key : String(column.key)}`;\n let cellContent;\n\n if (column.render) {\n cellContent = column.render(row, rowIndex);\n } else {\n const value = row[column.key as keyof T];\n cellContent = value?.toString() || '';\n }\n\n return (\n <td key={cellKey} className=\"lookup-select__table-cell\">\n {cellContent}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n\n/**\n * Loading Spinner component\n */\nexport function LoadingSpinner() {\n return (\n <div className=\"lookup-select__loading-spinner\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"8\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"12.566\"\n strokeDashoffset=\"12.566\"\n >\n <animate\n attributeName=\"stroke-dasharray\"\n dur=\"1.5s\"\n values=\"0 12.566;6.283 6.283;0 12.566\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"stroke-dashoffset\"\n dur=\"1.5s\"\n values=\"0;-6.283;-12.566\"\n repeatCount=\"indefinite\"\n />\n </circle>\n </svg>\n </div>\n );\n}\n","import React from 'react';\nimport {\n ColumnDef,\n ValueMapper,\n SelectMode,\n VirtualizationConfig,\n} from '../internal/types';\n\ninterface VirtualGridProps<T> {\n data: T[];\n columns: ColumnDef<T>[];\n mode: SelectMode;\n mapper: ValueMapper<T>;\n selectedRows: T[];\n onRowToggle: (row: T) => void;\n isRowSelected: (row: T) => boolean;\n selectableRow?: (row: T) => boolean;\n loading?: boolean;\n error?: string;\n emptyText?: string;\n className?: string;\n style?: React.CSSProperties;\n currentSort?: { sortBy?: string; sortDir?: 'asc' | 'desc' };\n onSort?: (sortBy: string, sortDir: 'asc' | 'desc') => void;\n virtualization: VirtualizationConfig;\n}\n\ninterface VirtualItem<T> {\n index: number;\n row: T;\n style: React.CSSProperties;\n}\n\nexport function VirtualGrid<T = any>(props: VirtualGridProps<T>) {\n const {\n data,\n columns,\n mode,\n mapper,\n selectedRows,\n onRowToggle,\n isRowSelected,\n selectableRow,\n loading,\n error,\n emptyText,\n className,\n style,\n currentSort,\n onSort,\n virtualization,\n } = props;\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const headerCheckboxRef = React.useRef<HTMLInputElement>(null);\n const [scrollTop, setScrollTop] = React.useState(0);\n const [actualContainerHeight, setActualContainerHeight] = React.useState(\n virtualization.containerHeight\n );\n\n // Update actual container height when container is available\n React.useEffect(() => {\n if (containerRef.current) {\n const updateHeight = () => {\n if (containerRef.current) {\n setActualContainerHeight(containerRef.current.clientHeight);\n }\n };\n\n updateHeight();\n\n const resizeObserver = new ResizeObserver(updateHeight);\n resizeObserver.observe(containerRef.current);\n\n return () => resizeObserver.disconnect();\n }\n }, []);\n\n // Handle header checkbox indeterminate state\n React.useEffect(() => {\n if (headerCheckboxRef.current) {\n const hasSelected = selectedRows.length > 0;\n const hasUnselected = selectedRows.length < data.length;\n headerCheckboxRef.current.indeterminate = hasSelected && hasUnselected;\n }\n }, [selectedRows.length, data.length]);\n\n // Calculate visible range\n const itemCount = data.length;\n const { rowHeight, overscan } = virtualization;\n\n const startIndex = Math.max(0, Math.floor(scrollTop / rowHeight) - overscan);\n const endIndex = Math.min(\n itemCount - 1,\n Math.floor((scrollTop + actualContainerHeight) / rowHeight) + overscan\n );\n\n const visibleItems: VirtualItem<T>[] = React.useMemo(() => {\n const items = [];\n for (let i = startIndex; i <= endIndex; i++) {\n items.push({\n index: i,\n row: data[i],\n style: {\n position: 'absolute' as const,\n top: i * rowHeight,\n left: 0,\n right: 0,\n height: rowHeight,\n },\n });\n }\n return items;\n }, [startIndex, endIndex, data, rowHeight]);\n\n const handleScroll = React.useCallback((e: React.UIEvent<HTMLDivElement>) => {\n setScrollTop(e.currentTarget.scrollTop);\n }, []);\n\n const totalHeight = itemCount * rowHeight;\n\n // Loading state\n if (loading) {\n return (\n <div className=\"lookup-select__grid-state\">\n <div className=\"lookup-select__loading\">\n <p>Loading...</p>\n </div>\n </div>\n );\n }\n\n // Error state\n if (error) {\n return (\n <div className=\"lookup-select__grid-state\">\n <div className=\"lookup-select__error\">\n <p>Error: {error}</p>\n </div>\n </div>\n );\n }\n\n // Empty state\n if (data.length === 0) {\n return (\n <div className=\"lookup-select__grid-state\">\n <div className=\"lookup-select__empty\">\n <p>{emptyText}</p>\n </div>\n </div>\n );\n }\n\n const handleSort = (columnKey: string) => {\n if (onSort) {\n const newSortDir =\n currentSort?.sortBy === columnKey && currentSort.sortDir === 'asc'\n ? 'desc'\n : 'asc';\n onSort(columnKey, newSortDir);\n }\n };\n\n const getSortIcon = (columnKey: string) => {\n if (currentSort?.sortBy !== columnKey) {\n return '↕'; // Both directions\n }\n return currentSort.sortDir === 'asc' ? '↑' : '↓';\n };\n\n const handleCheckboxChange = (\n row: T,\n event: React.ChangeEvent<HTMLInputElement>\n ) => {\n event.stopPropagation();\n onRowToggle(row);\n };\n\n const handleRowClick = (row: T) => {\n if (mode === 'single') {\n onRowToggle(row);\n }\n };\n\n return (\n <div\n className={`lookup-select__virtual-grid ${className || ''}`}\n style={style}\n >\n {/* Header */}\n <div className=\"lookup-select__grid-header\">\n <table className=\"lookup-select__table\">\n <thead>\n <tr>\n {mode === 'multiple' && (\n <th className=\"lookup-select__header-cell lookup-select__header-cell--checkbox\">\n <input\n ref={headerCheckboxRef}\n type=\"checkbox\"\n className=\"lookup-select__checkbox\"\n checked={\n selectedRows.length === data.length && data.length > 0\n }\n onChange={(e) => {\n if (e.target.checked) {\n // Select all visible items\n data.forEach((row) => {\n if (\n !isRowSelected(row) &&\n (!selectableRow || selectableRow(row))\n ) {\n onRowToggle(row);\n }\n });\n } else {\n // Deselect all\n selectedRows.forEach((row) => onRowToggle(row));\n }\n }}\n aria-label=\"Select all\"\n />\n </th>\n )}\n {columns.map((column) => (\n <th\n key={String(column.key)}\n className={`lookup-select__header-cell ${column.sortable ? 'lookup-select__header-cell--sortable' : ''}`}\n style={{ width: column.width }}\n >\n <div className=\"lookup-select__header-content\">\n <span>{column.title}</span>\n {column.sortable && (\n <button\n type=\"button\"\n className=\"lookup-select__sort-button\"\n aria-label={`Sort by ${column.title} column`}\n onClick={() => handleSort(String(column.key))}\n >\n {getSortIcon(String(column.key))}\n </button>\n )}\n </div>\n </th>\n ))}\n </tr>\n </thead>\n </table>\n </div>\n\n {/* Virtual Scrollable Body */}\n <div\n ref={containerRef}\n className=\"lookup-select__virtual-container\"\n style={{\n flex: 1,\n overflow: 'auto',\n position: 'relative',\n }}\n onScroll={handleScroll}\n >\n <div\n className=\"lookup-select__virtual-content\"\n style={{\n height: totalHeight,\n position: 'relative',\n }}\n >\n {visibleItems.map((item) => (\n <VirtualRow<T>\n key={item.index}\n item={item}\n columns={columns}\n mode={mode}\n mapper={mapper}\n isSelected={isRowSelected(item.row)}\n isSelectable={!selectableRow || selectableRow(item.row)}\n onToggle={() => onRowToggle(item.row)}\n onCheckboxChange={(e) => handleCheckboxChange(item.row, e)}\n onClick={() => handleRowClick(item.row)}\n />\n ))}\n </div>\n </div>\n </div>\n );\n}\n\n// Memoized Virtual Row Component\nfunction VirtualRowComponent<T>({\n item,\n columns,\n mode,\n mapper,\n isSelected,\n isSelectable,\n onToggle,\n onCheckboxChange,\n onClick,\n}: {\n item: VirtualItem<T>;\n columns: ColumnDef<T>[];\n mode: SelectMode;\n mapper: ValueMapper<T>;\n isSelected: boolean;\n isSelectable: boolean;\n onToggle: () => void;\n onCheckboxChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n onClick: () => void;\n}) {\n const { row, style } = item;\n\n return (\n <div\n className={`lookup-select__virtual-row ${isSelected ? 'lookup-select__row--selected' : ''} ${!isSelectable ? 'lookup-select__row--disabled' : ''}`}\n style={style}\n onClick={isSelectable ? onClick : undefined}\n >\n <table className=\"lookup-select__table\">\n <tbody>\n <tr>\n {mode === 'multiple' && (\n <td className=\"lookup-select__cell lookup-select__cell--checkbox\">\n <input\n type=\"checkbox\"\n className=\"lookup-select__checkbox\"\n checked={isSelected}\n disabled={!isSelectable}\n onChange={onCheckboxChange}\n onClick={(e) => e.stopPropagation()}\n />\n </td>\n )}\n {columns.map((column) => (\n <td\n key={String(column.key)}\n className=\"lookup-select__cell\"\n style={{ width: column.width }}\n >\n {column.render\n ? column.render(row, item.index)\n : String(row[column.key as keyof typeof row] || '')}\n </td>\n ))}\n </tr>\n </tbody>\n </table>\n </div>\n );\n}\n\nconst VirtualRow = React.memo(\n VirtualRowComponent\n) as typeof VirtualRowComponent;\n","import React from 'react';\n\n/**\n * Pagination component - pagination for server-side data\n * Project.md Phas }}\n onClick={() => onPageChange(pageNum)}\n aria-label={`Page ${pageNum}`}\n aria-current={currentPage === pageNum ? 'page' : undefined} total, page synchronization\n */\n\ninterface PaginationProps {\n currentPage: number;\n totalCount: number;\n pageSize: number;\n onPageChange: (page: number) => void;\n className?: string;\n}\n\nexport function Pagination({\n currentPage,\n totalCount,\n pageSize,\n onPageChange,\n className,\n}: PaginationProps) {\n const totalPages = Math.ceil(totalCount / pageSize);\n\n if (totalPages <= 1) {\n return null; // Don't show pagination if only 1 page\n }\n\n const getVisiblePages = () => {\n const delta = 2; // Show 2 pages on each side of current\n const range = [];\n const rangeWithDots = [];\n\n for (\n let i = Math.max(2, currentPage - delta);\n i <= Math.min(totalPages - 1, currentPage + delta);\n i++\n ) {\n range.push(i);\n }\n\n if (currentPage - delta > 2) {\n rangeWithDots.push(1, '...');\n } else {\n rangeWithDots.push(1);\n }\n\n rangeWithDots.push(...range);\n\n if (currentPage + delta < totalPages - 1) {\n rangeWithDots.push('...', totalPages);\n } else if (totalPages > 1) {\n rangeWithDots.push(totalPages);\n }\n\n return rangeWithDots;\n };\n\n const visiblePages = getVisiblePages();\n\n const startRecord = (currentPage - 1) * pageSize + 1;\n const endRecord = Math.min(currentPage * pageSize, totalCount);\n\n return (\n <div className={`lookup-select__pagination ${className || ''}`}>\n <div className=\"lookup-select__pagination-info\">\n {totalCount > 0 ? (\n <>\n {startRecord}-{endRecord} / {totalCount} records\n </>\n ) : (\n '0 records'\n )}\n </div>\n\n <div className=\"lookup-select__pagination-controls\">\n {/* Previous button */}\n <button\n type=\"button\"\n className=\"lookup-select__pagination-button\"\n disabled={currentPage === 1}\n onClick={() => onPageChange(currentPage - 1)}\n aria-label=\"Previous page\"\n >\n ‹\n </button>\n\n {/* Page numbers */}\n {visiblePages.map((page, index) => {\n if (page === '...') {\n return (\n <span\n key={`dots-${index}`}\n className=\"lookup-select__pagination-dots\"\n >\n ...\n </span>\n );\n }\n\n const pageNum = page as number;\n return (\n <button\n key={pageNum}\n type=\"button\"\n className={`\n lookup-select__pagination-button\n ${currentPage === pageNum ? 'lookup-select__pagination-button--active' : ''}\n `}\n onClick={() => onPageChange(pageNum)}\n aria-label={`Sayfa ${pageNum}`}\n aria-current={currentPage === pageNum ? 'page' : undefined}\n >\n {pageNum}\n </button>\n );\n })}\n\n {/* Next button */}\n <button\n type=\"button\"\n className=\"lookup-select__pagination-button\"\n disabled={currentPage === totalPages}\n onClick={() => onPageChange(currentPage + 1)}\n aria-label=\"Next page\"\n >\n ›\n </button>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["import_react","import_react","import_react","import_jsx_runtime","focusableElements","import_jsx_runtime","import_react","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","React"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/LookupSelect.tsx","../src/internal/state.ts","../src/internal/core.ts","../src/hooks/useAccessibility.ts","../src/components/Trigger.tsx","../src/components/Modal.tsx","../src/components/Grid.tsx","../src/components/VirtualGrid.tsx","../src/components/Pagination.tsx"],"sourcesContent":["// Main export file for react-lookup-select\nexport { LookupSelect } from './components/LookupSelect';\n\n// Public API Types - according to project.md Section 2\nexport type {\n // Main Props Interface\n LookupSelectProps,\n\n // Core Types\n SelectMode,\n ColumnDef,\n QueryState,\n DataSourceResult,\n DataSourceFn,\n ValueMapper,\n ReturnShape,\n ReturnMap,\n\n // Theming and Customization\n i18nStrings,\n ComponentsOverrides,\n ClassNames,\n Styles,\n ThemeTokens,\n\n // Render Props Interfaces\n ModalRenderProps,\n GridRenderProps,\n HeaderRenderProps,\n FooterRenderProps,\n SearchRenderProps,\n PaginationRenderProps,\n} from './internal/types';\n","import React from 'react';\nimport { LookupSelectProps } from '../internal/types';\nimport { useLookupSelectState } from '../internal/state';\nimport {\n useKeyboardNavigation,\n useFocusManagement,\n useScreenReaderAnnouncements,\n} from '../hooks/useAccessibility';\nimport { Trigger } from './Trigger';\nimport { Modal, SearchInput, ModalFooter } from './Modal';\nimport { Grid } from './Grid';\nimport { VirtualGrid } from './VirtualGrid';\nimport { Pagination } from './Pagination';\n\n/**\n * LookupSelect - Headless React lookup select component with modal and grid\n */\nexport function LookupSelect<T = any>(props: LookupSelectProps<T>) {\n const {\n columns,\n mapper,\n mode = 'single',\n data = [],\n dataSource,\n variant = 'default',\n size = 'medium',\n icon,\n renderTrigger,\n renderModal,\n renderGrid,\n renderHeader,\n renderFooter,\n renderSearch,\n renderPagination,\n modalTitle,\n classNames,\n styles,\n theme,\n i18n,\n pageSize = 20,\n selectableRow,\n virtualization = false,\n virtualRowHeight = 40,\n virtualOverscan = 5,\n virtualContainerHeight = 400,\n virtualThreshold = 100,\n } = props;\n\n // Headless state management\n const {\n modalOpen,\n openModal,\n closeModal,\n currentSelections,\n toggleRowSelection,\n clearSelections,\n isRowSelected,\n updateQuery,\n getCurrentQuery,\n confirmSelection,\n cancelSelection,\n } = useLookupSelectState(props);\n\n // i18n defaults - comprehensive multilingual support\n const texts = {\n triggerPlaceholder: 'Please select',\n searchPlaceholder: 'Search...',\n confirmText: 'Apply',\n cancelText: 'Cancel',\n modalTitle: 'Select Record',\n emptyText: 'No records found',\n loadingText: 'Loading...',\n errorPrefix: 'Error:',\n selectedCount: (n: number) => `${n} selected`,\n clearText: 'Clear',\n selectAllLabel: 'Select all',\n selectRowLabel: (rowText: string) => `Select ${rowText} option`,\n sortColumnLabel: (columnTitle: string) => `Sort by ${columnTitle} column`,\n closeModalLabel: 'Close modal',\n paginationInfo: (current: number, total: number) =>\n `Page ${current} / ${total}`,\n totalRecords: (total: number) => `${total} records`,\n searchResults: (count: number) => `${count} results found`,\n ...i18n,\n };\n\n // Hybrid mode optimization: Increase page size for virtualization\n const optimizedPageSize = React.useMemo(() => {\n if (dataSource && virtualization) {\n // For hybrid mode, fetch larger chunks (5-10x virtual container capacity)\n const containerCapacity = Math.ceil(\n virtualContainerHeight / virtualRowHeight\n );\n return Math.max(pageSize, containerCapacity * 5); // 5x buffer for smooth scrolling\n }\n return pageSize;\n }, [\n dataSource,\n virtualization,\n virtualContainerHeight,\n virtualRowHeight,\n pageSize,\n ]);\n\n // Accessibility hooks\n const { announce } = useScreenReaderAnnouncements();\n\n useFocusManagement(modalOpen);\n\n useKeyboardNavigation({\n isModalOpen: modalOpen,\n onClose: closeModal,\n onConfirm: confirmSelection,\n currentData: [],\n selectedRows: currentSelections,\n mode,\n });\n\n // Search state\n const [searchValue, setSearchValue] = React.useState('');\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<string | undefined>();\n\n // Server-side data state\n const [serverData, setServerData] = React.useState<T[]>([]);\n const [totalCount, setTotalCount] = React.useState(0);\n const [currentPage, setCurrentPage] = React.useState(1);\n\n const handleSearchChange = React.useCallback(\n (value: string) => {\n setSearchValue(value);\n updateQuery({ search: value, page: 1 }); // Reset to page 1 on search\n },\n [updateQuery]\n ); // Filtered data - client-side filtering if data provided\n const filteredData = React.useMemo(() => {\n if (!searchValue || dataSource) {\n return data;\n }\n\n return data.filter((item) => {\n // Search in all columns\n return columns.some((column) => {\n const cellValue = item[column.key as keyof T];\n return cellValue\n ?.toString()\n .toLowerCase()\n .includes(searchValue.toLowerCase());\n });\n });\n }, [data, searchValue, columns, dataSource]);\n\n // Data source - client vs server-side\n const currentData = dataSource ? serverData : filteredData;\n\n const loadServerData = React.useCallback(async () => {\n if (!dataSource) return;\n\n setLoading(true);\n setError(undefined);\n\n try {\n const query = getCurrentQuery();\n const result = await dataSource({\n ...query,\n search: searchValue,\n page: currentPage,\n pageSize: optimizedPageSize,\n });\n\n setServerData(result.rows);\n setTotalCount(result.total);\n setLoading(false);\n } catch (err) {\n setError(\n err instanceof Error ? err.message : 'Error occurred while loading data'\n );\n setLoading(false);\n }\n }, [\n dataSource,\n getCurrentQuery,\n searchValue,\n currentPage,\n optimizedPageSize,\n ]);\n\n // Load data when modal opens or query changes\n React.useEffect(() => {\n if (dataSource && modalOpen) {\n loadServerData();\n }\n }, [dataSource, modalOpen, loadServerData]);\n\n // Page change handler\n const handlePageChange = React.useCallback(\n (newPage: number) => {\n setCurrentPage(newPage);\n updateQuery({ page: newPage });\n },\n [updateQuery]\n );\n\n // Sort change handler\n const handleSortChange = React.useCallback(\n (sortBy: string, sortDir: 'asc' | 'desc') => {\n updateQuery({ sortBy, sortDir, page: 1 }); // Reset to page 1 on sort\n setCurrentPage(1);\n },\n [updateQuery]\n );\n\n // Virtualization logic\n const shouldUseVirtualization = React.useMemo(() => {\n if (!virtualization) return false;\n // Auto-enable virtualization if data exceeds threshold\n return currentData.length >= virtualThreshold;\n }, [virtualization, currentData.length, virtualThreshold]);\n\n const virtualizationConfig = React.useMemo(\n () => ({\n enabled: shouldUseVirtualization,\n rowHeight: virtualRowHeight,\n overscan: virtualOverscan,\n containerHeight: virtualContainerHeight,\n threshold: virtualThreshold,\n }),\n [\n shouldUseVirtualization,\n virtualRowHeight,\n virtualOverscan,\n virtualContainerHeight,\n virtualThreshold,\n ]\n );\n\n // Grid component with current data - Performance optimized with useCallback\n const renderGridComponent = React.useCallback(() => {\n const commonGridProps = {\n data: currentData,\n columns,\n mode,\n mapper,\n selectedRows: currentSelections,\n onRowToggle: toggleRowSelection,\n isRowSelected,\n selectableRow,\n loading,\n error,\n emptyText: texts.emptyText,\n className: classNames?.grid,\n style: styles?.grid,\n currentSort: dataSource\n ? {\n sortBy: getCurrentQuery().sortBy || '',\n sortDir: getCurrentQuery().sortDir || 'asc',\n }\n : undefined,\n onSort: dataSource ? handleSortChange : undefined,\n };\n\n if (shouldUseVirtualization) {\n return (\n <VirtualGrid\n {...commonGridProps}\n virtualization={virtualizationConfig}\n />\n );\n }\n\n return <Grid {...commonGridProps} />;\n }, [\n currentData,\n columns,\n mode,\n mapper,\n currentSelections,\n toggleRowSelection,\n isRowSelected,\n selectableRow,\n loading,\n error,\n texts.emptyText,\n classNames?.grid,\n styles?.grid,\n dataSource,\n getCurrentQuery,\n handleSortChange,\n shouldUseVirtualization,\n virtualizationConfig,\n ]);\n\n // Custom render prop helpers\n const renderModalContent = () => {\n // Default modal content\n const defaultContent = (\n <>\n {/* Search Input */}\n {renderSearch ? (\n renderSearch({\n value: searchValue,\n onChange: handleSearchChange,\n placeholder: texts.searchPlaceholder,\n loading,\n onClear: () => handleSearchChange(''),\n })\n ) : (\n <SearchInput\n value={searchValue}\n onChange={handleSearchChange}\n placeholder={texts.searchPlaceholder}\n />\n )}\n\n <div className=\"lookup-select__modal-content\">\n {renderGrid\n ? renderGrid({\n data: currentData,\n columns,\n selectedIds: currentSelections.map(mapper.getId),\n onRowSelect: toggleRowSelection,\n onSelectAll:\n mode === 'multiple'\n ? () => {\n // Toggle all rows\n const allIds = currentData.map(mapper.getId);\n const selectedIds = currentSelections.map(mapper.getId);\n if (allIds.length === selectedIds.length) {\n clearSelections();\n } else {\n currentData.forEach((row) => {\n if (!isRowSelected(row)) {\n toggleRowSelection(row);\n }\n });\n }\n }\n : undefined,\n onClearAll: clearSelections,\n loading,\n error,\n mode,\n mapper,\n virtualization: shouldUseVirtualization\n ? virtualizationConfig\n : undefined,\n selectableRow,\n onSortChange: handleSortChange,\n sortBy: getCurrentQuery().sortBy,\n sortDir: getCurrentQuery().sortDir,\n })\n : renderGridComponent()}\n\n {/* Pagination - only for server-side data */}\n {dataSource && !renderPagination && (\n <Pagination\n currentPage={currentPage}\n totalCount={totalCount}\n pageSize={optimizedPageSize}\n onPageChange={handlePageChange}\n />\n )}\n\n {dataSource &&\n renderPagination &&\n renderPagination({\n currentPage,\n totalPages: Math.ceil(totalCount / optimizedPageSize),\n onPageChange: handlePageChange,\n pageSize: optimizedPageSize,\n onPageSizeChange: (newSize) => {\n // Page size change logic can be added here\n },\n totalCount,\n loading,\n })}\n </div>\n\n {/* Footer */}\n {renderFooter ? (\n renderFooter({\n selectedCount: currentSelections.length,\n totalCount,\n onConfirm: confirmSelection,\n onCancel: cancelSelection,\n currentPage,\n totalPages: Math.ceil(totalCount / optimizedPageSize),\n onPageChange: handlePageChange,\n pageSize: optimizedPageSize,\n loading,\n mode,\n })\n ) : (\n <ModalFooter\n onConfirm={confirmSelection}\n onCancel={cancelSelection}\n confirmText={texts.confirmText}\n cancelText={texts.cancelText}\n selectedCount={currentSelections.length}\n />\n )}\n </>\n );\n\n return defaultContent;\n };\n\n // Generate theme class names\n const getThemeClasses = () => {\n const classes = ['lookup-select'];\n\n if (variant && variant !== 'default') {\n classes.push(`lookup-select--theme-${variant}`);\n }\n\n if (size && size !== 'medium') {\n classes.push(`lookup-select--size-${size}`);\n }\n\n if (classNames?.root) {\n classes.push(classNames.root);\n }\n\n return classes.join(' ');\n };\n\n // Generate inline theme styles\n const getThemeStyles = () => {\n const themeStyles: Record<string, string> = {};\n\n if (theme) {\n if (theme.colorPrimary)\n themeStyles['--lookup-select-color-primary'] = theme.colorPrimary;\n if (theme.colorBg)\n themeStyles['--lookup-select-color-bg'] = theme.colorBg;\n if (theme.colorText)\n themeStyles['--lookup-select-color-text'] = theme.colorText;\n if (theme.borderRadius)\n themeStyles['--lookup-select-border-radius'] =\n typeof theme.borderRadius === 'number'\n ? `${theme.borderRadius}px`\n : theme.borderRadius;\n if (theme.spacing)\n themeStyles['--lookup-select-spacing'] = `${theme.spacing}px`;\n }\n\n return { ...themeStyles, ...styles?.root } as React.CSSProperties;\n };\n\n return (\n <div className={getThemeClasses()} style={getThemeStyles()}>\n <Trigger\n isOpen={modalOpen}\n onToggle={openModal}\n selectedItems={currentSelections}\n placeholder={texts.triggerPlaceholder}\n icon={icon}\n mapper={mapper}\n mode={mode}\n className={classNames?.trigger}\n style={styles?.trigger}\n renderTrigger={renderTrigger}\n onClear={clearSelections}\n onRemoveTag={(item) => toggleRowSelection(item)}\n />\n\n {renderModal ? (\n renderModal({\n isOpen: modalOpen,\n onClose: cancelSelection,\n children: renderModalContent(),\n title: modalTitle || texts.modalTitle,\n loading,\n error,\n query: getCurrentQuery(),\n selectedCount: currentSelections.length,\n totalCount,\n })\n ) : (\n <Modal\n isOpen={modalOpen}\n onClose={cancelSelection}\n title={modalTitle || texts.modalTitle}\n className={classNames?.modal}\n style={styles?.modal}\n >\n {renderModalContent()}\n </Modal>\n )}\n </div>\n );\n}\n","import { useState, useCallback, useMemo, useEffect } from 'react';\nimport { LookupSelectProps, QueryState } from './types';\nimport { SelectionManager, QueryManager, mapReturnValue } from './core';\n\n/**\n * State machine: idle → modalOpen → selecting → confirming/cancelled\n */\n\nexport type ModalState = 'closed' | 'open';\n\n/**\n * Main state hook - controlled/uncontrolled behavior\n */\nexport function useLookupSelectState<T>(props: LookupSelectProps<T>) {\n const {\n mode = 'single',\n mapper,\n returnShape = 'id-text',\n returnMap,\n value,\n defaultValue,\n onChange,\n open,\n defaultOpen = false,\n onOpenChange,\n pageSize = 20,\n onQueryChange,\n onSelectionChange,\n onConfirm,\n onCancel,\n data,\n } = props;\n\n // Modal state management (controlled/uncontrolled)\n const [internalModalOpen, setInternalModalOpen] = useState(defaultOpen);\n const modalOpen = open !== undefined ? open : internalModalOpen;\n\n const handleModalOpenChange = useCallback(\n (newOpen: boolean) => {\n if (open === undefined) {\n setInternalModalOpen(newOpen);\n }\n onOpenChange?.(newOpen);\n },\n [open, onOpenChange]\n );\n\n // Selection manager\n const selectionManager = useMemo(() => {\n return new SelectionManager(mode, mapper);\n }, [mode, mapper]);\n\n // Query manager\n const queryManager = useMemo(() => {\n return new QueryManager({ pageSize });\n }, [pageSize]);\n\n // Current selections state\n const [currentSelections, setCurrentSelections] = useState<T[]>([]);\n\n // Helper function to resolve value objects to actual data rows\n const resolveValueToRows = useCallback(\n (valueToResolve: any): T[] => {\n if (!valueToResolve || !data) return [];\n\n const values = Array.isArray(valueToResolve)\n ? valueToResolve\n : [valueToResolve];\n const resolvedRows: T[] = [];\n\n for (const val of values) {\n // If it's already a full row object, use it directly\n if (\n typeof val === 'object' &&\n val !== null &&\n mapper.getId(val as T) !== undefined\n ) {\n resolvedRows.push(val as T);\n }\n // If it's an id-text object or just an ID, find the matching row in data\n else {\n const searchId =\n typeof val === 'object' && val !== null && 'id' in val\n ? val.id\n : val;\n const matchingRow = data.find(\n (row) => mapper.getId(row) === searchId\n );\n if (matchingRow) {\n resolvedRows.push(matchingRow);\n }\n }\n }\n\n return resolvedRows;\n },\n [data, mapper]\n );\n\n // Initialize default/controlled values when data is available\n useEffect(() => {\n const initialValue = value !== undefined ? value : defaultValue;\n if (!initialValue || !data) return;\n\n const resolvedSelections = resolveValueToRows(initialValue);\n\n if (resolvedSelections.length > 0) {\n // Clear previous selections\n selectionManager.clearSelection();\n\n // Add new selections\n for (const row of resolvedSelections) {\n selectionManager.toggleRow(row);\n }\n\n setCurrentSelections(resolvedSelections);\n }\n }, [value, defaultValue, data, resolveValueToRows, selectionManager]);\n\n // Toggle row selection\n const toggleRowSelection = useCallback(\n (row: T) => {\n const newState = selectionManager.toggleRow(row);\n const selectedRows = selectionManager.getSelectedRows();\n setCurrentSelections(selectedRows);\n onSelectionChange?.(selectedRows);\n },\n [selectionManager, onSelectionChange]\n );\n\n // Clear all selections\n const clearSelections = useCallback(() => {\n selectionManager.clearSelection();\n setCurrentSelections([]);\n onSelectionChange?.([]);\n }, [selectionManager, onSelectionChange]);\n\n // Check if row is selected\n const isRowSelected = useCallback(\n (row: T) => {\n return selectionManager.isRowSelected(row);\n },\n [selectionManager]\n );\n\n // Query state updates\n const updateQuery = useCallback(\n (updates: Partial<QueryState>) => {\n const currentState = queryManager.getState();\n const newState = { ...currentState, ...updates };\n\n if (updates.search !== undefined) {\n queryManager.updateSearch(updates.search);\n }\n if (updates.page !== undefined) {\n queryManager.updatePage(updates.page);\n }\n if (updates.sortBy !== undefined && updates.sortDir !== undefined) {\n queryManager.updateSort(updates.sortBy, updates.sortDir);\n }\n if (updates.pageSize !== undefined) {\n queryManager.updatePageSize(updates.pageSize);\n }\n\n onQueryChange?.(queryManager.getState());\n },\n [queryManager, onQueryChange]\n );\n\n // Confirm selection (Apply button)\n const confirmSelection = useCallback(() => {\n const selectedRows = selectionManager.getSelectedRows();\n const returnValue = mapReturnValue(selectedRows, {\n mode,\n mapper,\n returnShape,\n returnMap,\n });\n\n onChange?.(returnValue);\n onConfirm?.(returnValue);\n handleModalOpenChange(false);\n }, [\n selectionManager,\n mode,\n mapper,\n returnShape,\n returnMap,\n onChange,\n onConfirm,\n handleModalOpenChange,\n ]);\n\n // Cancel selection (Close modal without applying)\n const cancelSelection = useCallback(() => {\n // Reset selections to original value\n selectionManager.clearSelection();\n setCurrentSelections([]);\n onCancel?.();\n handleModalOpenChange(false);\n }, [selectionManager, onCancel, handleModalOpenChange]);\n\n // Get current query state\n const getCurrentQuery = useCallback(() => {\n return queryManager.getState();\n }, [queryManager]);\n\n return {\n // Modal state\n modalOpen,\n openModal: () => handleModalOpenChange(true),\n closeModal: () => handleModalOpenChange(false),\n\n // Selection state\n currentSelections,\n toggleRowSelection,\n clearSelections,\n isRowSelected,\n\n // Query state\n updateQuery,\n getCurrentQuery,\n\n // Actions\n confirmSelection,\n cancelSelection,\n };\n}\n","import {\n LookupSelectProps,\n QueryState,\n SelectMode,\n ValueMapper,\n} from './types';\n\n/**\n * Headless core logic - selection state, query state, mapping and return value generation\n */\n\n/**\n * Selection state - Set<rowId> + Map<rowId, row> for fast access\n */\nexport interface SelectionState<T> {\n selectedIds: Set<string | number>;\n selectedRows: Map<string | number, T>;\n}\n\n/**\n * Selection state creator\n */\nexport function createSelectionState<T>(): SelectionState<T> {\n return {\n selectedIds: new Set<string | number>(),\n selectedRows: new Map<string | number, T>(),\n };\n}\n\n/**\n * Selection state update functions\n */\nexport class SelectionManager<T> {\n private state: SelectionState<T>;\n private mode: SelectMode;\n private mapper: ValueMapper<T>;\n\n constructor(\n mode: SelectMode,\n mapper: ValueMapper<T>,\n initialState?: SelectionState<T>\n ) {\n this.mode = mode;\n this.mapper = mapper;\n this.state = initialState || createSelectionState<T>();\n }\n\n /**\n * Row selection/deselection\n */\n toggleRow(row: T): SelectionState<T> {\n const id = this.mapper.getId(row);\n const newState = {\n selectedIds: new Set(this.state.selectedIds),\n selectedRows: new Map(this.state.selectedRows),\n };\n\n if (this.state.selectedIds.has(id)) {\n // Remove selection\n newState.selectedIds.delete(id);\n newState.selectedRows.delete(id);\n } else {\n // Select\n if (this.mode === 'single') {\n // Clear others in single mode\n newState.selectedIds.clear();\n newState.selectedRows.clear();\n }\n newState.selectedIds.add(id);\n newState.selectedRows.set(id, row);\n }\n\n this.state = newState;\n return newState;\n }\n\n /**\n * Return selected rows as array\n */\n getSelectedRows(): T[] {\n return Array.from(this.state.selectedRows.values());\n }\n\n /**\n * Check if row is selected\n */\n isRowSelected(row: T): boolean {\n const id = this.mapper.getId(row);\n return this.state.selectedIds.has(id);\n }\n\n /**\n * Clear all selections\n */\n clearSelection(): SelectionState<T> {\n this.state = createSelectionState<T>();\n return this.state;\n }\n\n /**\n * Get current state\n */\n getState(): SelectionState<T> {\n return this.state;\n }\n}\n\n/**\n * Query state creator - with default values\n */\nexport function createQueryState(pageSize: number = 20): QueryState {\n return {\n page: 1,\n pageSize,\n search: undefined,\n sortBy: undefined,\n sortDir: undefined,\n };\n}\n\n/**\n * Query state update functions\n */\nexport class QueryManager {\n private state: QueryState;\n\n constructor(initialState?: Partial<QueryState>) {\n this.state = { ...createQueryState(), ...initialState };\n }\n\n /**\n * Update search term - returns to page 1\n */\n updateSearch(search: string): QueryState {\n this.state = { ...this.state, search, page: 1 };\n return this.state;\n }\n\n /**\n * Update pagination\n */\n updatePage(page: number): QueryState {\n this.state = { ...this.state, page };\n return this.state;\n }\n\n /**\n * Update sorting - returns to page 1\n */\n updateSort(sortBy: string, sortDir: 'asc' | 'desc'): QueryState {\n this.state = { ...this.state, sortBy, sortDir, page: 1 };\n return this.state;\n }\n\n /**\n * Update page size - returns to page 1\n */\n updatePageSize(pageSize: number): QueryState {\n this.state = { ...this.state, pageSize, page: 1 };\n return this.state;\n }\n\n /**\n * Get current state\n */\n getState(): QueryState {\n return this.state;\n }\n}\n\n/**\n * Return value generation - project.md Section 4 logic\n */\nexport function mapReturnValue<T>(\n selectedRows: T[],\n props: Pick<\n LookupSelectProps<T>,\n 'returnShape' | 'returnMap' | 'mapper' | 'mode'\n >\n) {\n const { returnShape = 'id-text', returnMap, mapper, mode = 'single' } = props;\n\n if (selectedRows.length === 0) {\n return mode === 'single' ? null : [];\n }\n\n let mappedValues;\n\n switch (returnShape) {\n case 'id-text':\n // returnShape = 'id-text' → Single: { id, text } | Multiple: { id, text }[]\n mappedValues = selectedRows.map((row) => ({\n id: mapper.getId(row),\n text: mapper.getText(row),\n }));\n break;\n case 'row':\n // returnShape = 'row' → Single: T | Multiple: T[]\n mappedValues = selectedRows;\n break;\n case 'custom':\n // returnShape = 'custom' → returnMap.map(row) result\n if (!returnMap) {\n throw new Error('returnMap is required when returnShape is \"custom\"');\n }\n mappedValues = selectedRows.map((row) => returnMap.map(row));\n break;\n default:\n throw new Error(`Unknown returnShape: ${returnShape}`);\n }\n\n return mode === 'single' ? mappedValues[0] : mappedValues;\n}\n","import { useEffect, useCallback } from 'react';\n\n/**\n * Keyboard navigation hook for LookupSelect\n * Handles Enter, Escape, Arrow keys, Tab navigation\n */\nexport function useKeyboardNavigation({\n isModalOpen,\n onClose,\n onConfirm,\n onRowSelect,\n currentData,\n selectedRows,\n mode,\n}: {\n isModalOpen: boolean;\n onClose: () => void;\n onConfirm?: () => void;\n onRowSelect?: (row: any) => void;\n currentData: any[];\n selectedRows: any[];\n mode: 'single' | 'multiple';\n}) {\n // Handle keyboard shortcuts\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (!isModalOpen) return;\n\n switch (event.key) {\n case 'Escape':\n event.preventDefault();\n onClose();\n break;\n\n case 'Enter':\n if (event.ctrlKey || event.metaKey) {\n event.preventDefault();\n onConfirm?.();\n }\n break;\n\n case 'ArrowDown':\n case 'ArrowUp':\n // Grid navigation handled by Grid component\n break;\n\n default:\n break;\n }\n },\n [isModalOpen, onClose, onConfirm]\n );\n\n useEffect(() => {\n if (isModalOpen) {\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }\n }, [isModalOpen, handleKeyDown]);\n\n return {\n handleKeyDown,\n };\n}\n\n/**\n * Focus management hook for accessibility\n * Manages focus trap and initial focus\n */\nexport function useFocusManagement(isOpen: boolean) {\n useEffect(() => {\n if (!isOpen) return;\n\n const modal = document.querySelector('[role=\"dialog\"]') as HTMLElement;\n if (!modal) return;\n\n // Get all focusable elements in modal\n const focusableElements = modal.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n ) as NodeListOf<HTMLElement>;\n\n const firstFocusable = focusableElements[0];\n const lastFocusable = focusableElements[focusableElements.length - 1];\n\n // Focus first element (usually search input)\n firstFocusable?.focus();\n\n const handleTabKey = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n\n if (e.shiftKey) {\n // Shift + Tab\n if (document.activeElement === firstFocusable) {\n e.preventDefault();\n lastFocusable?.focus();\n }\n } else {\n // Tab\n if (document.activeElement === lastFocusable) {\n e.preventDefault();\n firstFocusable?.focus();\n }\n }\n };\n\n document.addEventListener('keydown', handleTabKey);\n\n return () => {\n document.removeEventListener('keydown', handleTabKey);\n };\n }, [isOpen]);\n}\n\n/**\n * Screen reader announcements hook\n * Provides live region announcements for state changes\n */\nexport function useScreenReaderAnnouncements() {\n const announce = useCallback(\n (message: string, priority: 'polite' | 'assertive' = 'polite') => {\n const announcement = document.createElement('div');\n announcement.setAttribute('aria-live', priority);\n announcement.setAttribute('aria-atomic', 'true');\n announcement.className = 'sr-only'; // Screen reader only class\n announcement.textContent = message;\n\n document.body.appendChild(announcement);\n\n // Remove after announcement\n setTimeout(() => {\n document.body.removeChild(announcement);\n }, 1000);\n },\n []\n );\n\n return { announce };\n}\n","import React from 'react';\nimport { LookupSelectProps } from '../internal/types';\n\n/**\n * Trigger component - ComboBox appearance, opens modal when clicked\n */\n\ninterface TriggerProps<T> {\n isOpen: boolean;\n onToggle: () => void;\n selectedItems: T[];\n placeholder?: string;\n icon?: React.ReactNode;\n mapper: LookupSelectProps<T>['mapper'];\n mode: LookupSelectProps<T>['mode'];\n className?: string;\n style?: React.CSSProperties;\n renderTrigger?: (selected: T | T[] | null) => React.ReactNode;\n onClear?: () => void;\n onRemoveTag?: (item: T) => void;\n}\n\nexport function Trigger<T>({\n isOpen,\n onToggle,\n selectedItems,\n placeholder = 'Please select',\n icon,\n mapper,\n mode = 'single',\n className,\n style,\n renderTrigger,\n onClear,\n onRemoveTag,\n}: TriggerProps<T>) {\n const selectedValue =\n mode === 'single' ? selectedItems[0] || null : selectedItems;\n\n // Use custom trigger if available\n if (renderTrigger) {\n return (\n <div\n role=\"button\"\n tabIndex={0}\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n onClick={onToggle}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onToggle();\n }\n }}\n className={className}\n style={style}\n >\n {renderTrigger(selectedValue)}\n </div>\n );\n }\n\n // Default trigger appearance\n return (\n <div\n role=\"button\"\n tabIndex={0}\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n className={`lookup-select__trigger ${className || ''}`}\n style={style}\n onClick={onToggle}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onToggle();\n }\n }}\n >\n <div className=\"lookup-select__trigger-content\">\n {selectedItems.length === 0 ? (\n <span className=\"lookup-select__placeholder\">{placeholder}</span>\n ) : mode === 'single' ? (\n <span className=\"lookup-select__selected-text\">\n {mapper.getText(selectedItems[0])}\n </span>\n ) : (\n <div className=\"lookup-select__tags\">\n {selectedItems.slice(0, 3).map((item) => (\n <span key={mapper.getId(item)} className=\"lookup-select__tag\">\n {mapper.getText(item)}\n <button\n type=\"button\"\n className=\"lookup-select__tag-remove\"\n onClick={(e) => {\n e.stopPropagation();\n onRemoveTag?.(item);\n }}\n aria-label={`Remove ${mapper.getText(item)}`}\n >\n ×\n </button>\n </span>\n ))}\n {selectedItems.length > 3 && (\n <span className=\"lookup-select__tag lookup-select__tag--more\">\n +{selectedItems.length - 3} more\n </span>\n )}\n </div>\n )}\n </div>\n\n <div className=\"lookup-select__trigger-actions\">\n {/* Clear button - only show if there are selections */}\n {selectedItems.length > 0 && onClear && (\n <button\n type=\"button\"\n className=\"lookup-select__clear-button\"\n onClick={(e) => {\n e.stopPropagation();\n onClear();\n }}\n aria-label=\"Clear selection\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path\n d=\"M10.5 5.5L5.5 10.5M5.5 5.5L10.5 10.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n\n {/* Dropdown icon */}\n <div className=\"lookup-select__trigger-icon\">\n {icon || (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import React, { useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\n\n/**\n * Modal component - header/search/body/footer\n */\n\ninterface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n className?: string;\n style?: React.CSSProperties;\n children: React.ReactNode;\n // ARIA & Accessibility props\n ariaLabel?: string;\n ariaLabelledBy?: string;\n ariaDescribedBy?: string;\n closeButtonLabel?: string;\n}\n\nexport function Modal({\n isOpen,\n onClose,\n title = 'Select Record',\n className,\n style,\n children,\n ariaLabel,\n ariaLabelledBy,\n ariaDescribedBy,\n closeButtonLabel = 'Close modal',\n}: ModalProps) {\n const modalRef = useRef<HTMLDivElement>(null);\n const previousFocusRef = useRef<HTMLElement | null>(null);\n\n // Focus trap implementation\n useEffect(() => {\n if (!isOpen) return;\n\n // Store currently focused element\n previousFocusRef.current = document.activeElement as HTMLElement;\n\n // Focus first focusable element in modal\n const focusableElements = modalRef.current?.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n\n if (focusableElements && focusableElements.length > 0) {\n (focusableElements[0] as HTMLElement).focus();\n }\n\n // Handle Escape key\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n\n // Handle Tab key for focus trap\n const handleTab = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n\n const focusableElements = modalRef.current?.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n\n if (!focusableElements || focusableElements.length === 0) return;\n\n const firstElement = focusableElements[0] as HTMLElement;\n const lastElement = focusableElements[\n focusableElements.length - 1\n ] as HTMLElement;\n\n if (e.shiftKey) {\n // Shift + Tab\n if (document.activeElement === firstElement) {\n lastElement.focus();\n e.preventDefault();\n }\n } else {\n // Tab\n if (document.activeElement === lastElement) {\n firstElement.focus();\n e.preventDefault();\n }\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n document.addEventListener('keydown', handleTab);\n\n // Cleanup\n return () => {\n document.removeEventListener('keydown', handleEscape);\n document.removeEventListener('keydown', handleTab);\n\n // Restore focus to previous element\n if (previousFocusRef.current) {\n previousFocusRef.current.focus();\n }\n };\n }, [isOpen, onClose]);\n\n // Prevent body scroll when modal is open\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n\n return () => {\n document.body.style.overflow = '';\n };\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n return createPortal(\n <div\n className=\"lookup-select__modal-overlay\"\n onClick={onClose}\n role=\"presentation\"\n >\n <div\n ref={modalRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n aria-labelledby={\n ariaLabelledBy || (title ? 'lookup-select-modal-title' : undefined)\n }\n aria-describedby={ariaDescribedBy}\n className={`lookup-select__modal ${className || ''}`}\n style={style}\n onClick={(e) => e.stopPropagation()}\n tabIndex={-1}\n >\n <div className=\"lookup-select__modal-header\">\n <h2\n id=\"lookup-select-modal-title\"\n className=\"lookup-select__modal-title\"\n >\n {title}\n </h2>\n <button\n type=\"button\"\n className=\"lookup-select__modal-close\"\n onClick={onClose}\n aria-label={closeButtonLabel}\n tabIndex={0}\n >\n ×\n </button>\n </div>\n\n <div className=\"lookup-select__modal-body\" role=\"document\">\n {children}\n </div>\n </div>\n </div>,\n document.body\n );\n}\n\n/**\n * Search input component - for searching within modal\n */\ninterface SearchInputProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n className?: string;\n}\n\nexport function SearchInput({\n value,\n onChange,\n placeholder = 'Search...',\n className,\n}: SearchInputProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Auto focus on mount\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n }, []);\n\n return (\n <div className={`lookup-select__search ${className || ''}`}>\n <input\n ref={inputRef}\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n className=\"lookup-select__search-input\"\n aria-label=\"Search records\"\n />\n <div className=\"lookup-select__search-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z\" />\n </svg>\n </div>\n </div>\n );\n}\n\n/**\n * Modal footer - confirm/cancel buttons\n */\ninterface ModalFooterProps {\n onConfirm: () => void;\n onCancel: () => void;\n confirmText?: string;\n cancelText?: string;\n selectedCount?: number;\n className?: string;\n}\n\nexport function ModalFooter({\n onConfirm,\n onCancel,\n confirmText = 'Apply',\n cancelText = 'Cancel',\n selectedCount = 0,\n className,\n}: ModalFooterProps) {\n return (\n <div className={`lookup-select__modal-footer ${className || ''}`}>\n <div className=\"lookup-select__selected-count\">\n {selectedCount > 0 ? `${selectedCount} selected` : 'No selection'}\n </div>\n\n <div className=\"lookup-select__modal-actions\">\n <button\n type=\"button\"\n className=\"lookup-select__button lookup-select__button--secondary\"\n onClick={onCancel}\n >\n {cancelText}\n </button>\n <button\n type=\"button\"\n className=\"lookup-select__button lookup-select__button--primary\"\n onClick={onConfirm}\n disabled={selectedCount === 0}\n >\n {confirmText}\n </button>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { ColumnDef, ValueMapper, SelectMode } from '../internal/types';\n\n/**\n * Grid component - Simple table + column render\n */\n\ninterface GridProps<T> {\n data: T[];\n columns: ColumnDef<T>[];\n mode: SelectMode;\n mapper: ValueMapper<T>;\n selectedRows: T[];\n onRowToggle: (row: T) => void;\n onRowClick?: (row: T) => void;\n isRowSelected: (row: T) => boolean;\n selectableRow?: (row: T) => boolean;\n onSort?: (sortBy: string, sortDir: 'asc' | 'desc') => void;\n currentSort?: { sortBy?: string; sortDir?: 'asc' | 'desc' };\n loading?: boolean;\n error?: string;\n emptyText?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function Grid<T>({\n data,\n columns,\n mode,\n mapper,\n selectedRows,\n onRowToggle,\n onRowClick,\n isRowSelected,\n selectableRow,\n onSort,\n currentSort,\n loading = false,\n error,\n emptyText = 'No records found',\n className,\n style,\n}: GridProps<T>) {\n const handleSort = (columnKey: string) => {\n if (!onSort) return;\n\n const currentSortBy = currentSort?.sortBy;\n const currentSortDir = currentSort?.sortDir;\n\n let newSortDir: 'asc' | 'desc' = 'asc';\n\n if (currentSortBy === columnKey) {\n // Same column - toggle direction\n newSortDir = currentSortDir === 'asc' ? 'desc' : 'asc';\n }\n\n onSort(columnKey, newSortDir);\n };\n\n const getSortIcon = (columnKey: string) => {\n if (currentSort?.sortBy !== columnKey) {\n return '↕'; // Both directions\n }\n\n return currentSort.sortDir === 'asc' ? '↑' : '↓';\n };\n\n // Loading state\n if (loading) {\n return (\n <div className=\"lookup-select__grid-state\">\n <div className=\"lookup-select__loading\">\n <p>Loading...</p>\n </div>\n </div>\n );\n }\n\n // Error state\n if (error) {\n return (\n <div className=\"lookup-select__grid-state\">\n <div className=\"lookup-select__error\">\n <p>Error: {error}</p>\n </div>\n </div>\n );\n }\n\n // Empty state\n if (data.length === 0) {\n return (\n <div className=\"lookup-select__grid-state\">\n <div className=\"lookup-select__empty\">\n <p>{emptyText}</p>\n </div>\n </div>\n );\n }\n\n const handleRowClick = (row: T, event: React.MouseEvent) => {\n // Don't trigger row click when checkbox is clicked\n if ((event.target as HTMLElement).closest('.lookup-select__checkbox')) {\n return;\n }\n\n // Selectable check\n if (selectableRow && !selectableRow(row)) {\n return;\n }\n\n // Disabled row check\n if (mapper.getDisabled?.(row)) {\n return;\n }\n\n onRowClick?.(row);\n onRowToggle(row);\n };\n\n const handleCheckboxChange = (\n row: T,\n event: React.ChangeEvent<HTMLInputElement>\n ) => {\n event.stopPropagation();\n\n // Selectable check\n if (selectableRow && !selectableRow(row)) {\n return;\n }\n\n // Disabled row check\n if (mapper.getDisabled?.(row)) {\n return;\n }\n\n onRowToggle(row);\n };\n\n const isRowDisabled = (row: T) => {\n if (mapper.getDisabled?.(row)) return true;\n if (selectableRow && !selectableRow(row)) return true;\n return false;\n };\n\n return (\n <div className={`lookup-select__grid ${className || ''}`} style={style}>\n <table\n className=\"lookup-select__table\"\n role=\"grid\"\n aria-label=\"Record list\"\n aria-rowcount={data.length}\n aria-multiselectable={mode === 'multiple'}\n >\n <thead className=\"lookup-select__table-head\">\n <tr>\n {/* Checkbox column for multiple mode */}\n {mode === 'multiple' && (\n <th className=\"lookup-select__table-header lookup-select__table-header--checkbox\">\n <div className=\"lookup-select__checkbox\">\n <input\n type=\"checkbox\"\n checked={\n selectedRows.length > 0 &&\n selectedRows.length ===\n data.filter((row) => !isRowDisabled(row)).length\n }\n ref={(input) => {\n if (input) {\n input.indeterminate =\n selectedRows.length > 0 &&\n selectedRows.length <\n data.filter((row) => !isRowDisabled(row)).length;\n }\n }}\n onChange={(e) => {\n const selectableRows = data.filter(\n (row) => !isRowDisabled(row)\n );\n if (e.target.checked) {\n // Select all selectable rows\n selectableRows.forEach((row) => {\n if (!isRowSelected(row)) {\n onRowToggle(row);\n }\n });\n } else {\n // Deselect all\n selectedRows.forEach((row) => {\n onRowToggle(row);\n });\n }\n }}\n aria-label=\"Select all\"\n />\n </div>\n </th>\n )}\n\n {/* Column headers */}\n {columns.map((column, index) => (\n <th\n key={\n typeof column.key === 'string'\n ? column.key\n : String(column.key)\n }\n className=\"lookup-select__table-header\"\n style={{ width: column.width }}\n >\n <div className=\"lookup-select__table-header-content\">\n {column.title}\n {column.sortable && (\n <button\n type=\"button\"\n className=\"lookup-select__sort-button\"\n aria-label={`Sort by ${column.title} column`}\n onClick={() => handleSort(String(column.key))}\n >\n {getSortIcon(String(column.key))}\n </button>\n )}\n </div>\n </th>\n ))}\n </tr>\n </thead>\n\n <tbody className=\"lookup-select__table-body\">\n {data.map((row, rowIndex) => {\n const rowId = mapper.getId(row);\n const selected = isRowSelected(row);\n const disabled = isRowDisabled(row);\n\n return (\n <tr\n key={rowId}\n className={`\n lookup-select__table-row\n ${selected ? 'lookup-select__table-row--selected' : ''}\n ${disabled ? 'lookup-select__table-row--disabled' : ''}\n `}\n onClick={(e) => !disabled && handleRowClick(row, e)}\n role={disabled ? undefined : 'button'}\n tabIndex={disabled ? undefined : 0}\n onKeyDown={(e) => {\n if (disabled) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onRowToggle(row);\n }\n }}\n aria-label={\n disabled ? undefined : `Select ${mapper.getText(row)} row`\n }\n >\n {/* Checkbox cell for multiple mode */}\n {mode === 'multiple' && (\n <td className=\"lookup-select__table-cell lookup-select__table-cell--checkbox\">\n <div className=\"lookup-select__checkbox\">\n <input\n type=\"checkbox\"\n checked={selected}\n onChange={(e) => handleCheckboxChange(row, e)}\n disabled={disabled}\n aria-label={`Select ${mapper.getText(row)}`}\n />\n </div>\n </td>\n )}\n\n {/* Data cells */}\n {columns.map((column, columnIndex) => {\n const cellKey = `${rowId}-${typeof column.key === 'string' ? column.key : String(column.key)}`;\n let cellContent;\n\n if (column.render) {\n cellContent = column.render(row, rowIndex);\n } else {\n const value = row[column.key as keyof T];\n cellContent = value?.toString() || '';\n }\n\n return (\n <td key={cellKey} className=\"lookup-select__table-cell\">\n {cellContent}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n\n/**\n * Loading Spinner component\n */\nexport function LoadingSpinner() {\n return (\n <div className=\"lookup-select__loading-spinner\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"8\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"12.566\"\n strokeDashoffset=\"12.566\"\n >\n <animate\n attributeName=\"stroke-dasharray\"\n dur=\"1.5s\"\n values=\"0 12.566;6.283 6.283;0 12.566\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"stroke-dashoffset\"\n dur=\"1.5s\"\n values=\"0;-6.283;-12.566\"\n repeatCount=\"indefinite\"\n />\n </circle>\n </svg>\n </div>\n );\n}\n","import React from 'react';\nimport {\n ColumnDef,\n ValueMapper,\n SelectMode,\n VirtualizationConfig,\n} from '../internal/types';\n\ninterface VirtualGridProps<T> {\n data: T[];\n columns: ColumnDef<T>[];\n mode: SelectMode;\n mapper: ValueMapper<T>;\n selectedRows: T[];\n onRowToggle: (row: T) => void;\n isRowSelected: (row: T) => boolean;\n selectableRow?: (row: T) => boolean;\n loading?: boolean;\n error?: string;\n emptyText?: string;\n className?: string;\n style?: React.CSSProperties;\n currentSort?: { sortBy?: string; sortDir?: 'asc' | 'desc' };\n onSort?: (sortBy: string, sortDir: 'asc' | 'desc') => void;\n virtualization: VirtualizationConfig;\n}\n\ninterface VirtualItem<T> {\n index: number;\n row: T;\n style: React.CSSProperties;\n}\n\nexport function VirtualGrid<T = any>(props: VirtualGridProps<T>) {\n const {\n data,\n columns,\n mode,\n mapper,\n selectedRows,\n onRowToggle,\n isRowSelected,\n selectableRow,\n loading,\n error,\n emptyText,\n className,\n style,\n currentSort,\n onSort,\n virtualization,\n } = props;\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const headerCheckboxRef = React.useRef<HTMLInputElement>(null);\n const [scrollTop, setScrollTop] = React.useState(0);\n const [actualContainerHeight, setActualContainerHeight] = React.useState(\n virtualization.containerHeight\n );\n\n // Update actual container height when container is available\n React.useEffect(() => {\n if (containerRef.current) {\n const updateHeight = () => {\n if (containerRef.current) {\n setActualContainerHeight(containerRef.current.clientHeight);\n }\n };\n\n updateHeight();\n\n const resizeObserver = new ResizeObserver(updateHeight);\n resizeObserver.observe(containerRef.current);\n\n return () => resizeObserver.disconnect();\n }\n }, []);\n\n // Handle header checkbox indeterminate state\n React.useEffect(() => {\n if (headerCheckboxRef.current) {\n const hasSelected = selectedRows.length > 0;\n const hasUnselected = selectedRows.length < data.length;\n headerCheckboxRef.current.indeterminate = hasSelected && hasUnselected;\n }\n }, [selectedRows.length, data.length]);\n\n // Calculate visible range\n const itemCount = data.length;\n const { rowHeight, overscan } = virtualization;\n\n const startIndex = Math.max(0, Math.floor(scrollTop / rowHeight) - overscan);\n const endIndex = Math.min(\n itemCount - 1,\n Math.floor((scrollTop + actualContainerHeight) / rowHeight) + overscan\n );\n\n const visibleItems: VirtualItem<T>[] = React.useMemo(() => {\n const items = [];\n for (let i = startIndex; i <= endIndex; i++) {\n items.push({\n index: i,\n row: data[i],\n style: {\n position: 'absolute' as const,\n top: i * rowHeight,\n left: 0,\n right: 0,\n height: rowHeight,\n },\n });\n }\n return items;\n }, [startIndex, endIndex, data, rowHeight]);\n\n const handleScroll = React.useCallback((e: React.UIEvent<HTMLDivElement>) => {\n setScrollTop(e.currentTarget.scrollTop);\n }, []);\n\n const totalHeight = itemCount * rowHeight;\n\n // Loading state\n if (loading) {\n return (\n <div className=\"lookup-select__grid-state\">\n <div className=\"lookup-select__loading\">\n <p>Loading...</p>\n </div>\n </div>\n );\n }\n\n // Error state\n if (error) {\n return (\n <div className=\"lookup-select__grid-state\">\n <div className=\"lookup-select__error\">\n <p>Error: {error}</p>\n </div>\n </div>\n );\n }\n\n // Empty state\n if (data.length === 0) {\n return (\n <div className=\"lookup-select__grid-state\">\n <div className=\"lookup-select__empty\">\n <p>{emptyText}</p>\n </div>\n </div>\n );\n }\n\n const handleSort = (columnKey: string) => {\n if (onSort) {\n const newSortDir =\n currentSort?.sortBy === columnKey && currentSort.sortDir === 'asc'\n ? 'desc'\n : 'asc';\n onSort(columnKey, newSortDir);\n }\n };\n\n const getSortIcon = (columnKey: string) => {\n if (currentSort?.sortBy !== columnKey) {\n return '↕'; // Both directions\n }\n return currentSort.sortDir === 'asc' ? '↑' : '↓';\n };\n\n const handleCheckboxChange = (\n row: T,\n event: React.ChangeEvent<HTMLInputElement>\n ) => {\n event.stopPropagation();\n onRowToggle(row);\n };\n\n const handleRowClick = (row: T) => {\n if (mode === 'single') {\n onRowToggle(row);\n }\n };\n\n return (\n <div\n className={`lookup-select__virtual-grid ${className || ''}`}\n style={style}\n >\n {/* Header */}\n <div className=\"lookup-select__grid-header\">\n <table className=\"lookup-select__table\">\n <thead>\n <tr>\n {mode === 'multiple' && (\n <th className=\"lookup-select__header-cell lookup-select__header-cell--checkbox\">\n <input\n ref={headerCheckboxRef}\n type=\"checkbox\"\n className=\"lookup-select__checkbox\"\n checked={\n selectedRows.length === data.length && data.length > 0\n }\n onChange={(e) => {\n if (e.target.checked) {\n // Select all visible items\n data.forEach((row) => {\n if (\n !isRowSelected(row) &&\n (!selectableRow || selectableRow(row))\n ) {\n onRowToggle(row);\n }\n });\n } else {\n // Deselect all\n selectedRows.forEach((row) => onRowToggle(row));\n }\n }}\n aria-label=\"Select all\"\n />\n </th>\n )}\n {columns.map((column) => (\n <th\n key={String(column.key)}\n className={`lookup-select__header-cell ${column.sortable ? 'lookup-select__header-cell--sortable' : ''}`}\n style={{ width: column.width }}\n >\n <div className=\"lookup-select__header-content\">\n <span>{column.title}</span>\n {column.sortable && (\n <button\n type=\"button\"\n className=\"lookup-select__sort-button\"\n aria-label={`Sort by ${column.title} column`}\n onClick={() => handleSort(String(column.key))}\n >\n {getSortIcon(String(column.key))}\n </button>\n )}\n </div>\n </th>\n ))}\n </tr>\n </thead>\n </table>\n </div>\n\n {/* Virtual Scrollable Body */}\n <div\n ref={containerRef}\n className=\"lookup-select__virtual-container\"\n style={{\n flex: 1,\n overflow: 'auto',\n position: 'relative',\n }}\n onScroll={handleScroll}\n >\n <div\n className=\"lookup-select__virtual-content\"\n style={{\n height: totalHeight,\n position: 'relative',\n }}\n >\n {visibleItems.map((item) => (\n <VirtualRow<T>\n key={item.index}\n item={item}\n columns={columns}\n mode={mode}\n mapper={mapper}\n isSelected={isRowSelected(item.row)}\n isSelectable={!selectableRow || selectableRow(item.row)}\n onToggle={() => onRowToggle(item.row)}\n onCheckboxChange={(e) => handleCheckboxChange(item.row, e)}\n onClick={() => handleRowClick(item.row)}\n />\n ))}\n </div>\n </div>\n </div>\n );\n}\n\n// Memoized Virtual Row Component\nfunction VirtualRowComponent<T>({\n item,\n columns,\n mode,\n mapper,\n isSelected,\n isSelectable,\n onToggle,\n onCheckboxChange,\n onClick,\n}: {\n item: VirtualItem<T>;\n columns: ColumnDef<T>[];\n mode: SelectMode;\n mapper: ValueMapper<T>;\n isSelected: boolean;\n isSelectable: boolean;\n onToggle: () => void;\n onCheckboxChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n onClick: () => void;\n}) {\n const { row, style } = item;\n\n return (\n <div\n className={`lookup-select__virtual-row ${isSelected ? 'lookup-select__row--selected' : ''} ${!isSelectable ? 'lookup-select__row--disabled' : ''}`}\n style={style}\n onClick={isSelectable ? onClick : undefined}\n >\n <table className=\"lookup-select__table\">\n <tbody>\n <tr>\n {mode === 'multiple' && (\n <td className=\"lookup-select__cell lookup-select__cell--checkbox\">\n <input\n type=\"checkbox\"\n className=\"lookup-select__checkbox\"\n checked={isSelected}\n disabled={!isSelectable}\n onChange={onCheckboxChange}\n onClick={(e) => e.stopPropagation()}\n />\n </td>\n )}\n {columns.map((column) => (\n <td\n key={String(column.key)}\n className=\"lookup-select__cell\"\n style={{ width: column.width }}\n >\n {column.render\n ? column.render(row, item.index)\n : String(row[column.key as keyof typeof row] || '')}\n </td>\n ))}\n </tr>\n </tbody>\n </table>\n </div>\n );\n}\n\nconst VirtualRow = React.memo(\n VirtualRowComponent\n) as typeof VirtualRowComponent;\n","import React from 'react';\n\n/**\n * Pagination component - pagination for server-side data\n * Project.md Phas }}\n onClick={() => onPageChange(pageNum)}\n aria-label={`Page ${pageNum}`}\n aria-current={currentPage === pageNum ? 'page' : undefined} total, page synchronization\n */\n\ninterface PaginationProps {\n currentPage: number;\n totalCount: number;\n pageSize: number;\n onPageChange: (page: number) => void;\n className?: string;\n}\n\nexport function Pagination({\n currentPage,\n totalCount,\n pageSize,\n onPageChange,\n className,\n}: PaginationProps) {\n const totalPages = Math.ceil(totalCount / pageSize);\n\n if (totalPages <= 1) {\n return null; // Don't show pagination if only 1 page\n }\n\n const getVisiblePages = () => {\n const delta = 2; // Show 2 pages on each side of current\n const range = [];\n const rangeWithDots = [];\n\n for (\n let i = Math.max(2, currentPage - delta);\n i <= Math.min(totalPages - 1, currentPage + delta);\n i++\n ) {\n range.push(i);\n }\n\n if (currentPage - delta > 2) {\n rangeWithDots.push(1, '...');\n } else {\n rangeWithDots.push(1);\n }\n\n rangeWithDots.push(...range);\n\n if (currentPage + delta < totalPages - 1) {\n rangeWithDots.push('...', totalPages);\n } else if (totalPages > 1) {\n rangeWithDots.push(totalPages);\n }\n\n return rangeWithDots;\n };\n\n const visiblePages = getVisiblePages();\n\n const startRecord = (currentPage - 1) * pageSize + 1;\n const endRecord = Math.min(currentPage * pageSize, totalCount);\n\n return (\n <div className={`lookup-select__pagination ${className || ''}`}>\n <div className=\"lookup-select__pagination-info\">\n {totalCount > 0 ? (\n <>\n {startRecord}-{endRecord} / {totalCount} records\n </>\n ) : (\n '0 records'\n )}\n </div>\n\n <div className=\"lookup-select__pagination-controls\">\n {/* Previous button */}\n <button\n type=\"button\"\n className=\"lookup-select__pagination-button\"\n disabled={currentPage === 1}\n onClick={() => onPageChange(currentPage - 1)}\n aria-label=\"Previous page\"\n >\n ‹\n </button>\n\n {/* Page numbers */}\n {visiblePages.map((page, index) => {\n if (page === '...') {\n return (\n <span\n key={`dots-${index}`}\n className=\"lookup-select__pagination-dots\"\n >\n ...\n </span>\n );\n }\n\n const pageNum = page as number;\n return (\n <button\n key={pageNum}\n type=\"button\"\n className={`\n lookup-select__pagination-button\n ${currentPage === pageNum ? 'lookup-select__pagination-button--active' : ''}\n `}\n onClick={() => onPageChange(pageNum)}\n aria-label={`Sayfa ${pageNum}`}\n aria-current={currentPage === pageNum ? 'page' : undefined}\n >\n {pageNum}\n </button>\n );\n })}\n\n {/* Next button */}\n <button\n type=\"button\"\n className=\"lookup-select__pagination-button\"\n disabled={currentPage === totalPages}\n onClick={() => onPageChange(currentPage + 1)}\n aria-label=\"Next page\"\n >\n ›\n </button>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,gBAAkB;;;ACAlB,mBAA0D;;;ACsBnD,SAAS,uBAA6C;AAC3D,SAAO;AAAA,IACL,aAAa,oBAAI,IAAqB;AAAA,IACtC,cAAc,oBAAI,IAAwB;AAAA,EAC5C;AACF;AAKO,IAAM,mBAAN,MAA0B;AAAA,EAK/B,YACE,MACA,QACA,cACA;AACA,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,QAAQ,gBAAgB,qBAAwB;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,KAA2B;AACnC,UAAM,KAAK,KAAK,OAAO,MAAM,GAAG;AAChC,UAAM,WAAW;AAAA,MACf,aAAa,IAAI,IAAI,KAAK,MAAM,WAAW;AAAA,MAC3C,cAAc,IAAI,IAAI,KAAK,MAAM,YAAY;AAAA,IAC/C;AAEA,QAAI,KAAK,MAAM,YAAY,IAAI,EAAE,GAAG;AAElC,eAAS,YAAY,OAAO,EAAE;AAC9B,eAAS,aAAa,OAAO,EAAE;AAAA,IACjC,OAAO;AAEL,UAAI,KAAK,SAAS,UAAU;AAE1B,iBAAS,YAAY,MAAM;AAC3B,iBAAS,aAAa,MAAM;AAAA,MAC9B;AACA,eAAS,YAAY,IAAI,EAAE;AAC3B,eAAS,aAAa,IAAI,IAAI,GAAG;AAAA,IACnC;AAEA,SAAK,QAAQ;AACb,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAuB;AACrB,WAAO,MAAM,KAAK,KAAK,MAAM,aAAa,OAAO,CAAC;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,KAAiB;AAC7B,UAAM,KAAK,KAAK,OAAO,MAAM,GAAG;AAChC,WAAO,KAAK,MAAM,YAAY,IAAI,EAAE;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAoC;AAClC,SAAK,QAAQ,qBAAwB;AACrC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAA8B;AAC5B,WAAO,KAAK;AAAA,EACd;AACF;AAKO,SAAS,iBAAiB,WAAmB,IAAgB;AAClE,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AACF;AAKO,IAAM,eAAN,MAAmB;AAAA,EAGxB,YAAY,cAAoC;AAC9C,SAAK,QAAQ,EAAE,GAAG,iBAAiB,GAAG,GAAG,aAAa;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAA4B;AACvC,SAAK,QAAQ,EAAE,GAAG,KAAK,OAAO,QAAQ,MAAM,EAAE;AAC9C,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAA0B;AACnC,SAAK,QAAQ,EAAE,GAAG,KAAK,OAAO,KAAK;AACnC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,QAAgB,SAAqC;AAC9D,SAAK,QAAQ,EAAE,GAAG,KAAK,OAAO,QAAQ,SAAS,MAAM,EAAE;AACvD,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,UAA8B;AAC3C,SAAK,QAAQ,EAAE,GAAG,KAAK,OAAO,UAAU,MAAM,EAAE;AAChD,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAuB;AACrB,WAAO,KAAK;AAAA,EACd;AACF;AAKO,SAAS,eACd,cACA,OAIA;AACA,QAAM,EAAE,cAAc,WAAW,WAAW,QAAQ,OAAO,SAAS,IAAI;AAExE,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO,SAAS,WAAW,OAAO,CAAC;AAAA,EACrC;AAEA,MAAI;AAEJ,UAAQ,aAAa;AAAA,IACnB,KAAK;AAEH,qBAAe,aAAa,IAAI,CAAC,SAAS;AAAA,QACxC,IAAI,OAAO,MAAM,GAAG;AAAA,QACpB,MAAM,OAAO,QAAQ,GAAG;AAAA,MAC1B,EAAE;AACF;AAAA,IACF,KAAK;AAEH,qBAAe;AACf;AAAA,IACF,KAAK;AAEH,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,MAAM,oDAAoD;AAAA,MACtE;AACA,qBAAe,aAAa,IAAI,CAAC,QAAQ,UAAU,IAAI,GAAG,CAAC;AAC3D;AAAA,IACF;AACE,YAAM,IAAI,MAAM,wBAAwB,WAAW,EAAE;AAAA,EACzD;AAEA,SAAO,SAAS,WAAW,aAAa,CAAC,IAAI;AAC/C;;;ADvMO,SAAS,qBAAwB,OAA6B;AACnE,QAAM;AAAA,IACJ,OAAO;AAAA,IACP;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAGJ,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,uBAAS,WAAW;AACtE,QAAM,YAAY,SAAS,SAAY,OAAO;AAE9C,QAAM,4BAAwB;AAAA,IAC5B,CAAC,YAAqB;AACpB,UAAI,SAAS,QAAW;AACtB,6BAAqB,OAAO;AAAA,MAC9B;AACA,qBAAe,OAAO;AAAA,IACxB;AAAA,IACA,CAAC,MAAM,YAAY;AAAA,EACrB;AAGA,QAAM,uBAAmB,sBAAQ,MAAM;AACrC,WAAO,IAAI,iBAAiB,MAAM,MAAM;AAAA,EAC1C,GAAG,CAAC,MAAM,MAAM,CAAC;AAGjB,QAAM,mBAAe,sBAAQ,MAAM;AACjC,WAAO,IAAI,aAAa,EAAE,SAAS,CAAC;AAAA,EACtC,GAAG,CAAC,QAAQ,CAAC;AAGb,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,uBAAc,CAAC,CAAC;AAGlE,QAAM,yBAAqB;AAAA,IACzB,CAAC,mBAA6B;AAC5B,UAAI,CAAC,kBAAkB,CAAC,KAAM,QAAO,CAAC;AAEtC,YAAM,SAAS,MAAM,QAAQ,cAAc,IACvC,iBACA,CAAC,cAAc;AACnB,YAAM,eAAoB,CAAC;AAE3B,iBAAW,OAAO,QAAQ;AAExB,YACE,OAAO,QAAQ,YACf,QAAQ,QACR,OAAO,MAAM,GAAQ,MAAM,QAC3B;AACA,uBAAa,KAAK,GAAQ;AAAA,QAC5B,OAEK;AACH,gBAAM,WACJ,OAAO,QAAQ,YAAY,QAAQ,QAAQ,QAAQ,MAC/C,IAAI,KACJ;AACN,gBAAM,cAAc,KAAK;AAAA,YACvB,CAAC,QAAQ,OAAO,MAAM,GAAG,MAAM;AAAA,UACjC;AACA,cAAI,aAAa;AACf,yBAAa,KAAK,WAAW;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,MAAM,MAAM;AAAA,EACf;AAGA,8BAAU,MAAM;AACd,UAAM,eAAe,UAAU,SAAY,QAAQ;AACnD,QAAI,CAAC,gBAAgB,CAAC,KAAM;AAE5B,UAAM,qBAAqB,mBAAmB,YAAY;AAE1D,QAAI,mBAAmB,SAAS,GAAG;AAEjC,uBAAiB,eAAe;AAGhC,iBAAW,OAAO,oBAAoB;AACpC,yBAAiB,UAAU,GAAG;AAAA,MAChC;AAEA,2BAAqB,kBAAkB;AAAA,IACzC;AAAA,EACF,GAAG,CAAC,OAAO,cAAc,MAAM,oBAAoB,gBAAgB,CAAC;AAGpE,QAAM,yBAAqB;AAAA,IACzB,CAAC,QAAW;AACV,YAAM,WAAW,iBAAiB,UAAU,GAAG;AAC/C,YAAM,eAAe,iBAAiB,gBAAgB;AACtD,2BAAqB,YAAY;AACjC,0BAAoB,YAAY;AAAA,IAClC;AAAA,IACA,CAAC,kBAAkB,iBAAiB;AAAA,EACtC;AAGA,QAAM,sBAAkB,0BAAY,MAAM;AACxC,qBAAiB,eAAe;AAChC,yBAAqB,CAAC,CAAC;AACvB,wBAAoB,CAAC,CAAC;AAAA,EACxB,GAAG,CAAC,kBAAkB,iBAAiB,CAAC;AAGxC,QAAM,oBAAgB;AAAA,IACpB,CAAC,QAAW;AACV,aAAO,iBAAiB,cAAc,GAAG;AAAA,IAC3C;AAAA,IACA,CAAC,gBAAgB;AAAA,EACnB;AAGA,QAAM,kBAAc;AAAA,IAClB,CAAC,YAAiC;AAChC,YAAM,eAAe,aAAa,SAAS;AAC3C,YAAM,WAAW,EAAE,GAAG,cAAc,GAAG,QAAQ;AAE/C,UAAI,QAAQ,WAAW,QAAW;AAChC,qBAAa,aAAa,QAAQ,MAAM;AAAA,MAC1C;AACA,UAAI,QAAQ,SAAS,QAAW;AAC9B,qBAAa,WAAW,QAAQ,IAAI;AAAA,MACtC;AACA,UAAI,QAAQ,WAAW,UAAa,QAAQ,YAAY,QAAW;AACjE,qBAAa,WAAW,QAAQ,QAAQ,QAAQ,OAAO;AAAA,MACzD;AACA,UAAI,QAAQ,aAAa,QAAW;AAClC,qBAAa,eAAe,QAAQ,QAAQ;AAAA,MAC9C;AAEA,sBAAgB,aAAa,SAAS,CAAC;AAAA,IACzC;AAAA,IACA,CAAC,cAAc,aAAa;AAAA,EAC9B;AAGA,QAAM,uBAAmB,0BAAY,MAAM;AACzC,UAAM,eAAe,iBAAiB,gBAAgB;AACtD,UAAM,cAAc,eAAe,cAAc;AAAA,MAC/C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,eAAW,WAAW;AACtB,gBAAY,WAAW;AACvB,0BAAsB,KAAK;AAAA,EAC7B,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAGD,QAAM,sBAAkB,0BAAY,MAAM;AAExC,qBAAiB,eAAe;AAChC,yBAAqB,CAAC,CAAC;AACvB,eAAW;AACX,0BAAsB,KAAK;AAAA,EAC7B,GAAG,CAAC,kBAAkB,UAAU,qBAAqB,CAAC;AAGtD,QAAM,sBAAkB,0BAAY,MAAM;AACxC,WAAO,aAAa,SAAS;AAAA,EAC/B,GAAG,CAAC,YAAY,CAAC;AAEjB,SAAO;AAAA;AAAA,IAEL;AAAA,IACA,WAAW,MAAM,sBAAsB,IAAI;AAAA,IAC3C,YAAY,MAAM,sBAAsB,KAAK;AAAA;AAAA,IAG7C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAGA;AAAA,IACA;AAAA;AAAA,IAGA;AAAA,IACA;AAAA,EACF;AACF;;;AEnOA,IAAAC,gBAAuC;AAMhC,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQG;AAED,QAAM,oBAAgB;AAAA,IACpB,CAAC,UAAyB;AACxB,UAAI,CAAC,YAAa;AAElB,cAAQ,MAAM,KAAK;AAAA,QACjB,KAAK;AACH,gBAAM,eAAe;AACrB,kBAAQ;AACR;AAAA,QAEF,KAAK;AACH,cAAI,MAAM,WAAW,MAAM,SAAS;AAClC,kBAAM,eAAe;AACrB,wBAAY;AAAA,UACd;AACA;AAAA,QAEF,KAAK;AAAA,QACL,KAAK;AAEH;AAAA,QAEF;AACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,CAAC,aAAa,SAAS,SAAS;AAAA,EAClC;AAEA,+BAAU,MAAM;AACd,QAAI,aAAa;AACf,eAAS,iBAAiB,WAAW,aAAa;AAClD,aAAO,MAAM;AACX,iBAAS,oBAAoB,WAAW,aAAa;AAAA,MACvD;AAAA,IACF;AAAA,EACF,GAAG,CAAC,aAAa,aAAa,CAAC;AAE/B,SAAO;AAAA,IACL;AAAA,EACF;AACF;AAMO,SAAS,mBAAmB,QAAiB;AAClD,+BAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AAEb,UAAM,QAAQ,SAAS,cAAc,iBAAiB;AACtD,QAAI,CAAC,MAAO;AAGZ,UAAM,oBAAoB,MAAM;AAAA,MAC9B;AAAA,IACF;AAEA,UAAM,iBAAiB,kBAAkB,CAAC;AAC1C,UAAM,gBAAgB,kBAAkB,kBAAkB,SAAS,CAAC;AAGpE,oBAAgB,MAAM;AAEtB,UAAM,eAAe,CAAC,MAAqB;AACzC,UAAI,EAAE,QAAQ,MAAO;AAErB,UAAI,EAAE,UAAU;AAEd,YAAI,SAAS,kBAAkB,gBAAgB;AAC7C,YAAE,eAAe;AACjB,yBAAe,MAAM;AAAA,QACvB;AAAA,MACF,OAAO;AAEL,YAAI,SAAS,kBAAkB,eAAe;AAC5C,YAAE,eAAe;AACjB,0BAAgB,MAAM;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAEA,aAAS,iBAAiB,WAAW,YAAY;AAEjD,WAAO,MAAM;AACX,eAAS,oBAAoB,WAAW,YAAY;AAAA,IACtD;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AACb;AAMO,SAAS,+BAA+B;AAC7C,QAAM,eAAW;AAAA,IACf,CAAC,SAAiB,WAAmC,aAAa;AAChE,YAAM,eAAe,SAAS,cAAc,KAAK;AACjD,mBAAa,aAAa,aAAa,QAAQ;AAC/C,mBAAa,aAAa,eAAe,MAAM;AAC/C,mBAAa,YAAY;AACzB,mBAAa,cAAc;AAE3B,eAAS,KAAK,YAAY,YAAY;AAGtC,iBAAW,MAAM;AACf,iBAAS,KAAK,YAAY,YAAY;AAAA,MACxC,GAAG,GAAI;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,SAAS;AACpB;;;ACjGM;AApBC,SAAS,QAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAClB,QAAM,gBACJ,SAAS,WAAW,cAAc,CAAC,KAAK,OAAO;AAGjD,MAAI,eAAe;AACjB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,UAAU;AAAA,QACV,iBAAc;AAAA,QACd,iBAAe;AAAA,QACf,SAAS;AAAA,QACT,WAAW,CAAC,MAAM;AAChB,cAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,cAAE,eAAe;AACjB,qBAAS;AAAA,UACX;AAAA,QACF;AAAA,QACA;AAAA,QACA;AAAA,QAEC,wBAAc,aAAa;AAAA;AAAA,IAC9B;AAAA,EAEJ;AAGA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,UAAU;AAAA,MACV,iBAAc;AAAA,MACd,iBAAe;AAAA,MACf,WAAW,0BAA0B,aAAa,EAAE;AAAA,MACpD;AAAA,MACA,SAAS;AAAA,MACT,WAAW,CAAC,MAAM;AAChB,YAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,YAAE,eAAe;AACjB,mBAAS;AAAA,QACX;AAAA,MACF;AAAA,MAEA;AAAA,oDAAC,SAAI,WAAU,kCACZ,wBAAc,WAAW,IACxB,4CAAC,UAAK,WAAU,8BAA8B,uBAAY,IACxD,SAAS,WACX,4CAAC,UAAK,WAAU,gCACb,iBAAO,QAAQ,cAAc,CAAC,CAAC,GAClC,IAEA,6CAAC,SAAI,WAAU,uBACZ;AAAA,wBAAc,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,SAC9B,6CAAC,UAA8B,WAAU,sBACtC;AAAA,mBAAO,QAAQ,IAAI;AAAA,YACpB;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS,CAAC,MAAM;AACd,oBAAE,gBAAgB;AAClB,gCAAc,IAAI;AAAA,gBACpB;AAAA,gBACA,cAAY,UAAU,OAAO,QAAQ,IAAI,CAAC;AAAA,gBAC3C;AAAA;AAAA,YAED;AAAA,eAZS,OAAO,MAAM,IAAI,CAa5B,CACD;AAAA,UACA,cAAc,SAAS,KACtB,6CAAC,UAAK,WAAU,+CAA8C;AAAA;AAAA,YAC1D,cAAc,SAAS;AAAA,YAAE;AAAA,aAC7B;AAAA,WAEJ,GAEJ;AAAA,QAEA,6CAAC,SAAI,WAAU,kCAEZ;AAAA,wBAAc,SAAS,KAAK,WAC3B;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS,CAAC,MAAM;AACd,kBAAE,gBAAgB;AAClB,wBAAQ;AAAA,cACV;AAAA,cACA,cAAW;AAAA,cAEX,sDAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,gBACnD;AAAA,gBAAC;AAAA;AAAA,kBACC,GAAE;AAAA,kBACF,QAAO;AAAA,kBACP,aAAY;AAAA,kBACZ,eAAc;AAAA,kBACd,gBAAe;AAAA;AAAA,cACjB,GACF;AAAA;AAAA,UACF;AAAA,UAIF,4CAAC,SAAI,WAAU,+BACZ,kBACC,4CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,gBACnD;AAAA,YAAC;AAAA;AAAA,cACC,GAAE;AAAA,cACF,QAAO;AAAA,cACP,aAAY;AAAA,cACZ,MAAK;AAAA,cACL,eAAc;AAAA,cACd,gBAAe;AAAA;AAAA,UACjB,GACF,GAEJ;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AC3JA,IAAAC,gBAAyC;AACzC,uBAA6B;AA0IrB,IAAAC,sBAAA;AAtHD,SAAS,MAAM;AAAA,EACpB;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmB;AACrB,GAAe;AACb,QAAM,eAAW,sBAAuB,IAAI;AAC5C,QAAM,uBAAmB,sBAA2B,IAAI;AAGxD,+BAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AAGb,qBAAiB,UAAU,SAAS;AAGpC,UAAM,oBAAoB,SAAS,SAAS;AAAA,MAC1C;AAAA,IACF;AAEA,QAAI,qBAAqB,kBAAkB,SAAS,GAAG;AACrD,MAAC,kBAAkB,CAAC,EAAkB,MAAM;AAAA,IAC9C;AAGA,UAAM,eAAe,CAAC,MAAqB;AACzC,UAAI,EAAE,QAAQ,UAAU;AACtB,gBAAQ;AAAA,MACV;AAAA,IACF;AAGA,UAAM,YAAY,CAAC,MAAqB;AACtC,UAAI,EAAE,QAAQ,MAAO;AAErB,YAAMC,qBAAoB,SAAS,SAAS;AAAA,QAC1C;AAAA,MACF;AAEA,UAAI,CAACA,sBAAqBA,mBAAkB,WAAW,EAAG;AAE1D,YAAM,eAAeA,mBAAkB,CAAC;AACxC,YAAM,cAAcA,mBAClBA,mBAAkB,SAAS,CAC7B;AAEA,UAAI,EAAE,UAAU;AAEd,YAAI,SAAS,kBAAkB,cAAc;AAC3C,sBAAY,MAAM;AAClB,YAAE,eAAe;AAAA,QACnB;AAAA,MACF,OAAO;AAEL,YAAI,SAAS,kBAAkB,aAAa;AAC1C,uBAAa,MAAM;AACnB,YAAE,eAAe;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAEA,aAAS,iBAAiB,WAAW,YAAY;AACjD,aAAS,iBAAiB,WAAW,SAAS;AAG9C,WAAO,MAAM;AACX,eAAS,oBAAoB,WAAW,YAAY;AACpD,eAAS,oBAAoB,WAAW,SAAS;AAGjD,UAAI,iBAAiB,SAAS;AAC5B,yBAAiB,QAAQ,MAAM;AAAA,MACjC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,OAAO,CAAC;AAGpB,+BAAU,MAAM;AACd,QAAI,QAAQ;AACV,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC,OAAO;AACL,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC;AAEA,WAAO,MAAM;AACX,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,MAAI,CAAC,OAAQ,QAAO;AAEpB,aAAO;AAAA,IACL;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAK;AAAA,QAEL;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,MAAK;AAAA,YACL,cAAW;AAAA,YACX,cAAY;AAAA,YACZ,mBACE,mBAAmB,QAAQ,8BAA8B;AAAA,YAE3D,oBAAkB;AAAA,YAClB,WAAW,wBAAwB,aAAa,EAAE;AAAA,YAClD;AAAA,YACA,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,YAClC,UAAU;AAAA,YAEV;AAAA,4DAAC,SAAI,WAAU,+BACb;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,IAAG;AAAA,oBACH,WAAU;AAAA,oBAET;AAAA;AAAA,gBACH;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,SAAS;AAAA,oBACT,cAAY;AAAA,oBACZ,UAAU;AAAA,oBACX;AAAA;AAAA,gBAED;AAAA,iBACF;AAAA,cAEA,6CAAC,SAAI,WAAU,6BAA4B,MAAK,YAC7C,UACH;AAAA;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IACA,SAAS;AAAA,EACX;AACF;AAYO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AACF,GAAqB;AACnB,QAAM,eAAW,sBAAyB,IAAI;AAG9C,+BAAU,MAAM;AACd,QAAI,SAAS,SAAS;AACpB,eAAS,QAAQ,MAAM;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SACE,8CAAC,SAAI,WAAW,yBAAyB,aAAa,EAAE,IACtD;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,MAAK;AAAA,QACL;AAAA,QACA,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,QACxC;AAAA,QACA,WAAU;AAAA,QACV,cAAW;AAAA;AAAA,IACb;AAAA,IACA,6CAAC,SAAI,WAAU,8BACb,uDAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,gBACnD,uDAAC,UAAK,GAAE,6LAA4L,GACtM,GACF;AAAA,KACF;AAEJ;AAcO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB;AACF,GAAqB;AACnB,SACE,8CAAC,SAAI,WAAW,+BAA+B,aAAa,EAAE,IAC5D;AAAA,iDAAC,SAAI,WAAU,iCACZ,0BAAgB,IAAI,GAAG,aAAa,cAAc,gBACrD;AAAA,IAEA,8CAAC,SAAI,WAAU,gCACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS;AAAA,UAER;AAAA;AAAA,MACH;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS;AAAA,UACT,UAAU,kBAAkB;AAAA,UAE3B;AAAA;AAAA,MACH;AAAA,OACF;AAAA,KACF;AAEJ;;;ACvLU,IAAAC,sBAAA;AA/CH,SAAS,KAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AACF,GAAiB;AACf,QAAM,aAAa,CAAC,cAAsB;AACxC,QAAI,CAAC,OAAQ;AAEb,UAAM,gBAAgB,aAAa;AACnC,UAAM,iBAAiB,aAAa;AAEpC,QAAI,aAA6B;AAEjC,QAAI,kBAAkB,WAAW;AAE/B,mBAAa,mBAAmB,QAAQ,SAAS;AAAA,IACnD;AAEA,WAAO,WAAW,UAAU;AAAA,EAC9B;AAEA,QAAM,cAAc,CAAC,cAAsB;AACzC,QAAI,aAAa,WAAW,WAAW;AACrC,aAAO;AAAA,IACT;AAEA,WAAO,YAAY,YAAY,QAAQ,WAAM;AAAA,EAC/C;AAGA,MAAI,SAAS;AACX,WACE,6CAAC,SAAI,WAAU,6BACb,uDAAC,SAAI,WAAU,0BACb,uDAAC,OAAE,wBAAU,GACf,GACF;AAAA,EAEJ;AAGA,MAAI,OAAO;AACT,WACE,6CAAC,SAAI,WAAU,6BACb,uDAAC,SAAI,WAAU,wBACb,wDAAC,OAAE;AAAA;AAAA,MAAQ;AAAA,OAAM,GACnB,GACF;AAAA,EAEJ;AAGA,MAAI,KAAK,WAAW,GAAG;AACrB,WACE,6CAAC,SAAI,WAAU,6BACb,uDAAC,SAAI,WAAU,wBACb,uDAAC,OAAG,qBAAU,GAChB,GACF;AAAA,EAEJ;AAEA,QAAM,iBAAiB,CAAC,KAAQ,UAA4B;AAE1D,QAAK,MAAM,OAAuB,QAAQ,0BAA0B,GAAG;AACrE;AAAA,IACF;AAGA,QAAI,iBAAiB,CAAC,cAAc,GAAG,GAAG;AACxC;AAAA,IACF;AAGA,QAAI,OAAO,cAAc,GAAG,GAAG;AAC7B;AAAA,IACF;AAEA,iBAAa,GAAG;AAChB,gBAAY,GAAG;AAAA,EACjB;AAEA,QAAM,uBAAuB,CAC3B,KACA,UACG;AACH,UAAM,gBAAgB;AAGtB,QAAI,iBAAiB,CAAC,cAAc,GAAG,GAAG;AACxC;AAAA,IACF;AAGA,QAAI,OAAO,cAAc,GAAG,GAAG;AAC7B;AAAA,IACF;AAEA,gBAAY,GAAG;AAAA,EACjB;AAEA,QAAM,gBAAgB,CAAC,QAAW;AAChC,QAAI,OAAO,cAAc,GAAG,EAAG,QAAO;AACtC,QAAI,iBAAiB,CAAC,cAAc,GAAG,EAAG,QAAO;AACjD,WAAO;AAAA,EACT;AAEA,SACE,6CAAC,SAAI,WAAW,uBAAuB,aAAa,EAAE,IAAI,OACxD;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,MAAK;AAAA,MACL,cAAW;AAAA,MACX,iBAAe,KAAK;AAAA,MACpB,wBAAsB,SAAS;AAAA,MAE/B;AAAA,qDAAC,WAAM,WAAU,6BACf,wDAAC,QAEE;AAAA,mBAAS,cACR,6CAAC,QAAG,WAAU,qEACZ,uDAAC,SAAI,WAAU,2BACb;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SACE,aAAa,SAAS,KACtB,aAAa,WACX,KAAK,OAAO,CAAC,QAAQ,CAAC,cAAc,GAAG,CAAC,EAAE;AAAA,cAE9C,KAAK,CAAC,UAAU;AACd,oBAAI,OAAO;AACT,wBAAM,gBACJ,aAAa,SAAS,KACtB,aAAa,SACX,KAAK,OAAO,CAAC,QAAQ,CAAC,cAAc,GAAG,CAAC,EAAE;AAAA,gBAChD;AAAA,cACF;AAAA,cACA,UAAU,CAAC,MAAM;AACf,sBAAM,iBAAiB,KAAK;AAAA,kBAC1B,CAAC,QAAQ,CAAC,cAAc,GAAG;AAAA,gBAC7B;AACA,oBAAI,EAAE,OAAO,SAAS;AAEpB,iCAAe,QAAQ,CAAC,QAAQ;AAC9B,wBAAI,CAAC,cAAc,GAAG,GAAG;AACvB,kCAAY,GAAG;AAAA,oBACjB;AAAA,kBACF,CAAC;AAAA,gBACH,OAAO;AAEL,+BAAa,QAAQ,CAAC,QAAQ;AAC5B,gCAAY,GAAG;AAAA,kBACjB,CAAC;AAAA,gBACH;AAAA,cACF;AAAA,cACA,cAAW;AAAA;AAAA,UACb,GACF,GACF;AAAA,UAID,QAAQ,IAAI,CAAC,QAAQ,UACpB;AAAA,YAAC;AAAA;AAAA,cAMC,WAAU;AAAA,cACV,OAAO,EAAE,OAAO,OAAO,MAAM;AAAA,cAE7B,wDAAC,SAAI,WAAU,uCACZ;AAAA,uBAAO;AAAA,gBACP,OAAO,YACN;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,cAAY,WAAW,OAAO,KAAK;AAAA,oBACnC,SAAS,MAAM,WAAW,OAAO,OAAO,GAAG,CAAC;AAAA,oBAE3C,sBAAY,OAAO,OAAO,GAAG,CAAC;AAAA;AAAA,gBACjC;AAAA,iBAEJ;AAAA;AAAA,YAnBE,OAAO,OAAO,QAAQ,WAClB,OAAO,MACP,OAAO,OAAO,GAAG;AAAA,UAkBzB,CACD;AAAA,WACH,GACF;AAAA,QAEA,6CAAC,WAAM,WAAU,6BACd,eAAK,IAAI,CAAC,KAAK,aAAa;AAC3B,gBAAM,QAAQ,OAAO,MAAM,GAAG;AAC9B,gBAAM,WAAW,cAAc,GAAG;AAClC,gBAAM,WAAW,cAAc,GAAG;AAElC,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,WAAW;AAAA;AAAA,oBAEP,WAAW,uCAAuC,EAAE;AAAA,oBACpD,WAAW,uCAAuC,EAAE;AAAA;AAAA,cAExD,SAAS,CAAC,MAAM,CAAC,YAAY,eAAe,KAAK,CAAC;AAAA,cAClD,MAAM,WAAW,SAAY;AAAA,cAC7B,UAAU,WAAW,SAAY;AAAA,cACjC,WAAW,CAAC,MAAM;AAChB,oBAAI,SAAU;AACd,oBAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,oBAAE,eAAe;AACjB,8BAAY,GAAG;AAAA,gBACjB;AAAA,cACF;AAAA,cACA,cACE,WAAW,SAAY,UAAU,OAAO,QAAQ,GAAG,CAAC;AAAA,cAIrD;AAAA,yBAAS,cACR,6CAAC,QAAG,WAAU,iEACZ,uDAAC,SAAI,WAAU,2BACb;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS;AAAA,oBACT,UAAU,CAAC,MAAM,qBAAqB,KAAK,CAAC;AAAA,oBAC5C;AAAA,oBACA,cAAY,UAAU,OAAO,QAAQ,GAAG,CAAC;AAAA;AAAA,gBAC3C,GACF,GACF;AAAA,gBAID,QAAQ,IAAI,CAAC,QAAQ,gBAAgB;AACpC,wBAAM,UAAU,GAAG,KAAK,IAAI,OAAO,OAAO,QAAQ,WAAW,OAAO,MAAM,OAAO,OAAO,GAAG,CAAC;AAC5F,sBAAI;AAEJ,sBAAI,OAAO,QAAQ;AACjB,kCAAc,OAAO,OAAO,KAAK,QAAQ;AAAA,kBAC3C,OAAO;AACL,0BAAM,QAAQ,IAAI,OAAO,GAAc;AACvC,kCAAc,OAAO,SAAS,KAAK;AAAA,kBACrC;AAEA,yBACE,6CAAC,QAAiB,WAAU,6BACzB,yBADM,OAET;AAAA,gBAEJ,CAAC;AAAA;AAAA;AAAA,YApDI;AAAA,UAqDP;AAAA,QAEJ,CAAC,GACH;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;;;ACzSA,IAAAC,gBAAkB;AA8HR,IAAAC,sBAAA;AA7FH,SAAS,YAAqB,OAA4B;AAC/D,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,eAAe,cAAAC,QAAM,OAAuB,IAAI;AACtD,QAAM,oBAAoB,cAAAA,QAAM,OAAyB,IAAI;AAC7D,QAAM,CAAC,WAAW,YAAY,IAAI,cAAAA,QAAM,SAAS,CAAC;AAClD,QAAM,CAAC,uBAAuB,wBAAwB,IAAI,cAAAA,QAAM;AAAA,IAC9D,eAAe;AAAA,EACjB;AAGA,gBAAAA,QAAM,UAAU,MAAM;AACpB,QAAI,aAAa,SAAS;AACxB,YAAM,eAAe,MAAM;AACzB,YAAI,aAAa,SAAS;AACxB,mCAAyB,aAAa,QAAQ,YAAY;AAAA,QAC5D;AAAA,MACF;AAEA,mBAAa;AAEb,YAAM,iBAAiB,IAAI,eAAe,YAAY;AACtD,qBAAe,QAAQ,aAAa,OAAO;AAE3C,aAAO,MAAM,eAAe,WAAW;AAAA,IACzC;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,gBAAAA,QAAM,UAAU,MAAM;AACpB,QAAI,kBAAkB,SAAS;AAC7B,YAAM,cAAc,aAAa,SAAS;AAC1C,YAAM,gBAAgB,aAAa,SAAS,KAAK;AACjD,wBAAkB,QAAQ,gBAAgB,eAAe;AAAA,IAC3D;AAAA,EACF,GAAG,CAAC,aAAa,QAAQ,KAAK,MAAM,CAAC;AAGrC,QAAM,YAAY,KAAK;AACvB,QAAM,EAAE,WAAW,SAAS,IAAI;AAEhC,QAAM,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,YAAY,SAAS,IAAI,QAAQ;AAC3E,QAAM,WAAW,KAAK;AAAA,IACpB,YAAY;AAAA,IACZ,KAAK,OAAO,YAAY,yBAAyB,SAAS,IAAI;AAAA,EAChE;AAEA,QAAM,eAAiC,cAAAA,QAAM,QAAQ,MAAM;AACzD,UAAM,QAAQ,CAAC;AACf,aAAS,IAAI,YAAY,KAAK,UAAU,KAAK;AAC3C,YAAM,KAAK;AAAA,QACT,OAAO;AAAA,QACP,KAAK,KAAK,CAAC;AAAA,QACX,OAAO;AAAA,UACL,UAAU;AAAA,UACV,KAAK,IAAI;AAAA,UACT,MAAM;AAAA,UACN,OAAO;AAAA,UACP,QAAQ;AAAA,QACV;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT,GAAG,CAAC,YAAY,UAAU,MAAM,SAAS,CAAC;AAE1C,QAAM,eAAe,cAAAA,QAAM,YAAY,CAAC,MAAqC;AAC3E,iBAAa,EAAE,cAAc,SAAS;AAAA,EACxC,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc,YAAY;AAGhC,MAAI,SAAS;AACX,WACE,6CAAC,SAAI,WAAU,6BACb,uDAAC,SAAI,WAAU,0BACb,uDAAC,OAAE,wBAAU,GACf,GACF;AAAA,EAEJ;AAGA,MAAI,OAAO;AACT,WACE,6CAAC,SAAI,WAAU,6BACb,uDAAC,SAAI,WAAU,wBACb,wDAAC,OAAE;AAAA;AAAA,MAAQ;AAAA,OAAM,GACnB,GACF;AAAA,EAEJ;AAGA,MAAI,KAAK,WAAW,GAAG;AACrB,WACE,6CAAC,SAAI,WAAU,6BACb,uDAAC,SAAI,WAAU,wBACb,uDAAC,OAAG,qBAAU,GAChB,GACF;AAAA,EAEJ;AAEA,QAAM,aAAa,CAAC,cAAsB;AACxC,QAAI,QAAQ;AACV,YAAM,aACJ,aAAa,WAAW,aAAa,YAAY,YAAY,QACzD,SACA;AACN,aAAO,WAAW,UAAU;AAAA,IAC9B;AAAA,EACF;AAEA,QAAM,cAAc,CAAC,cAAsB;AACzC,QAAI,aAAa,WAAW,WAAW;AACrC,aAAO;AAAA,IACT;AACA,WAAO,YAAY,YAAY,QAAQ,WAAM;AAAA,EAC/C;AAEA,QAAM,uBAAuB,CAC3B,KACA,UACG;AACH,UAAM,gBAAgB;AACtB,gBAAY,GAAG;AAAA,EACjB;AAEA,QAAM,iBAAiB,CAAC,QAAW;AACjC,QAAI,SAAS,UAAU;AACrB,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,+BAA+B,aAAa,EAAE;AAAA,MACzD;AAAA,MAGA;AAAA,qDAAC,SAAI,WAAU,8BACb,uDAAC,WAAM,WAAU,wBACf,uDAAC,WACC,wDAAC,QACE;AAAA,mBAAS,cACR,6CAAC,QAAG,WAAU,mEACZ;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SACE,aAAa,WAAW,KAAK,UAAU,KAAK,SAAS;AAAA,cAEvD,UAAU,CAAC,MAAM;AACf,oBAAI,EAAE,OAAO,SAAS;AAEpB,uBAAK,QAAQ,CAAC,QAAQ;AACpB,wBACE,CAAC,cAAc,GAAG,MACjB,CAAC,iBAAiB,cAAc,GAAG,IACpC;AACA,kCAAY,GAAG;AAAA,oBACjB;AAAA,kBACF,CAAC;AAAA,gBACH,OAAO;AAEL,+BAAa,QAAQ,CAAC,QAAQ,YAAY,GAAG,CAAC;AAAA,gBAChD;AAAA,cACF;AAAA,cACA,cAAW;AAAA;AAAA,UACb,GACF;AAAA,UAED,QAAQ,IAAI,CAAC,WACZ;AAAA,YAAC;AAAA;AAAA,cAEC,WAAW,8BAA8B,OAAO,WAAW,yCAAyC,EAAE;AAAA,cACtG,OAAO,EAAE,OAAO,OAAO,MAAM;AAAA,cAE7B,wDAAC,SAAI,WAAU,iCACb;AAAA,6DAAC,UAAM,iBAAO,OAAM;AAAA,gBACnB,OAAO,YACN;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,cAAY,WAAW,OAAO,KAAK;AAAA,oBACnC,SAAS,MAAM,WAAW,OAAO,OAAO,GAAG,CAAC;AAAA,oBAE3C,sBAAY,OAAO,OAAO,GAAG,CAAC;AAAA;AAAA,gBACjC;AAAA,iBAEJ;AAAA;AAAA,YAhBK,OAAO,OAAO,GAAG;AAAA,UAiBxB,CACD;AAAA,WACH,GACF,GACF,GACF;AAAA,QAGA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,WAAU;AAAA,YACV,OAAO;AAAA,cACL,MAAM;AAAA,cACN,UAAU;AAAA,cACV,UAAU;AAAA,YACZ;AAAA,YACA,UAAU;AAAA,YAEV;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO;AAAA,kBACL,QAAQ;AAAA,kBACR,UAAU;AAAA,gBACZ;AAAA,gBAEC,uBAAa,IAAI,CAAC,SACjB;AAAA,kBAAC;AAAA;AAAA,oBAEC;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA,YAAY,cAAc,KAAK,GAAG;AAAA,oBAClC,cAAc,CAAC,iBAAiB,cAAc,KAAK,GAAG;AAAA,oBACtD,UAAU,MAAM,YAAY,KAAK,GAAG;AAAA,oBACpC,kBAAkB,CAAC,MAAM,qBAAqB,KAAK,KAAK,CAAC;AAAA,oBACzD,SAAS,MAAM,eAAe,KAAK,GAAG;AAAA;AAAA,kBATjC,KAAK;AAAA,gBAUZ,CACD;AAAA;AAAA,YACH;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAGA,SAAS,oBAAuB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAUG;AACD,QAAM,EAAE,KAAK,MAAM,IAAI;AAEvB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,8BAA8B,aAAa,iCAAiC,EAAE,IAAI,CAAC,eAAe,iCAAiC,EAAE;AAAA,MAChJ;AAAA,MACA,SAAS,eAAe,UAAU;AAAA,MAElC,uDAAC,WAAM,WAAU,wBACf,uDAAC,WACC,wDAAC,QACE;AAAA,iBAAS,cACR,6CAAC,QAAG,WAAU,qDACZ;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS;AAAA,YACT,UAAU,CAAC;AAAA,YACX,UAAU;AAAA,YACV,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA;AAAA,QACpC,GACF;AAAA,QAED,QAAQ,IAAI,CAAC,WACZ;AAAA,UAAC;AAAA;AAAA,YAEC,WAAU;AAAA,YACV,OAAO,EAAE,OAAO,OAAO,MAAM;AAAA,YAE5B,iBAAO,SACJ,OAAO,OAAO,KAAK,KAAK,KAAK,IAC7B,OAAO,IAAI,OAAO,GAAuB,KAAK,EAAE;AAAA;AAAA,UAN/C,OAAO,OAAO,GAAG;AAAA,QAOxB,CACD;AAAA,SACH,GACF,GACF;AAAA;AAAA,EACF;AAEJ;AAEA,IAAM,aAAa,cAAAA,QAAM;AAAA,EACvB;AACF;;;AC7RM,IAAAC,sBAAA;AAlDC,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAClB,QAAM,aAAa,KAAK,KAAK,aAAa,QAAQ;AAElD,MAAI,cAAc,GAAG;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,MAAM;AAC5B,UAAM,QAAQ;AACd,UAAM,QAAQ,CAAC;AACf,UAAM,gBAAgB,CAAC;AAEvB,aACM,IAAI,KAAK,IAAI,GAAG,cAAc,KAAK,GACvC,KAAK,KAAK,IAAI,aAAa,GAAG,cAAc,KAAK,GACjD,KACA;AACA,YAAM,KAAK,CAAC;AAAA,IACd;AAEA,QAAI,cAAc,QAAQ,GAAG;AAC3B,oBAAc,KAAK,GAAG,KAAK;AAAA,IAC7B,OAAO;AACL,oBAAc,KAAK,CAAC;AAAA,IACtB;AAEA,kBAAc,KAAK,GAAG,KAAK;AAE3B,QAAI,cAAc,QAAQ,aAAa,GAAG;AACxC,oBAAc,KAAK,OAAO,UAAU;AAAA,IACtC,WAAW,aAAa,GAAG;AACzB,oBAAc,KAAK,UAAU;AAAA,IAC/B;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,gBAAgB;AAErC,QAAM,eAAe,cAAc,KAAK,WAAW;AACnD,QAAM,YAAY,KAAK,IAAI,cAAc,UAAU,UAAU;AAE7D,SACE,8CAAC,SAAI,WAAW,6BAA6B,aAAa,EAAE,IAC1D;AAAA,iDAAC,SAAI,WAAU,kCACZ,uBAAa,IACZ,8EACG;AAAA;AAAA,MAAY;AAAA,MAAE;AAAA,MAAU;AAAA,MAAI;AAAA,MAAW;AAAA,OAC1C,IAEA,aAEJ;AAAA,IAEA,8CAAC,SAAI,WAAU,sCAEb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,UAAU,gBAAgB;AAAA,UAC1B,SAAS,MAAM,aAAa,cAAc,CAAC;AAAA,UAC3C,cAAW;AAAA,UACZ;AAAA;AAAA,MAED;AAAA,MAGC,aAAa,IAAI,CAAC,MAAM,UAAU;AACjC,YAAI,SAAS,OAAO;AAClB,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,WAAU;AAAA,cACX;AAAA;AAAA,YAFM,QAAQ,KAAK;AAAA,UAIpB;AAAA,QAEJ;AAEA,cAAM,UAAU;AAChB,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,WAAW;AAAA;AAAA,kBAEP,gBAAgB,UAAU,6CAA6C,EAAE;AAAA;AAAA,YAE7E,SAAS,MAAM,aAAa,OAAO;AAAA,YACnC,cAAY,SAAS,OAAO;AAAA,YAC5B,gBAAc,gBAAgB,UAAU,SAAS;AAAA,YAEhD;AAAA;AAAA,UAVI;AAAA,QAWP;AAAA,MAEJ,CAAC;AAAA,MAGD;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,UAAU,gBAAgB;AAAA,UAC1B,SAAS,MAAM,aAAa,cAAc,CAAC;AAAA,UAC3C,cAAW;AAAA,UACZ;AAAA;AAAA,MAED;AAAA,OACF;AAAA,KACF;AAEJ;;;ARiIQ,IAAAC,sBAAA;AAtPD,SAAS,aAAsB,OAA6B;AACjE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,OAAO,CAAC;AAAA,IACR;AAAA,IACA,UAAU;AAAA,IACV,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB,yBAAyB;AAAA,IACzB,mBAAmB;AAAA,EACrB,IAAI;AAGJ,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,qBAAqB,KAAK;AAG9B,QAAM,QAAQ;AAAA,IACZ,oBAAoB;AAAA,IACpB,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,aAAa;AAAA,IACb,eAAe,CAAC,MAAc,GAAG,CAAC;AAAA,IAClC,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,gBAAgB,CAAC,YAAoB,UAAU,OAAO;AAAA,IACtD,iBAAiB,CAAC,gBAAwB,WAAW,WAAW;AAAA,IAChE,iBAAiB;AAAA,IACjB,gBAAgB,CAAC,SAAiB,UAChC,QAAQ,OAAO,MAAM,KAAK;AAAA,IAC5B,cAAc,CAAC,UAAkB,GAAG,KAAK;AAAA,IACzC,eAAe,CAAC,UAAkB,GAAG,KAAK;AAAA,IAC1C,GAAG;AAAA,EACL;AAGA,QAAM,oBAAoB,cAAAC,QAAM,QAAQ,MAAM;AAC5C,QAAI,cAAc,gBAAgB;AAEhC,YAAM,oBAAoB,KAAK;AAAA,QAC7B,yBAAyB;AAAA,MAC3B;AACA,aAAO,KAAK,IAAI,UAAU,oBAAoB,CAAC;AAAA,IACjD;AACA,WAAO;AAAA,EACT,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAGD,QAAM,EAAE,SAAS,IAAI,6BAA6B;AAElD,qBAAmB,SAAS;AAE5B,wBAAsB;AAAA,IACpB,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,aAAa,CAAC;AAAA,IACd,cAAc;AAAA,IACd;AAAA,EACF,CAAC;AAGD,QAAM,CAAC,aAAa,cAAc,IAAI,cAAAA,QAAM,SAAS,EAAE;AACvD,QAAM,CAAC,SAAS,UAAU,IAAI,cAAAA,QAAM,SAAS,KAAK;AAClD,QAAM,CAAC,OAAO,QAAQ,IAAI,cAAAA,QAAM,SAA6B;AAG7D,QAAM,CAAC,YAAY,aAAa,IAAI,cAAAA,QAAM,SAAc,CAAC,CAAC;AAC1D,QAAM,CAAC,YAAY,aAAa,IAAI,cAAAA,QAAM,SAAS,CAAC;AACpD,QAAM,CAAC,aAAa,cAAc,IAAI,cAAAA,QAAM,SAAS,CAAC;AAEtD,QAAM,qBAAqB,cAAAA,QAAM;AAAA,IAC/B,CAAC,UAAkB;AACjB,qBAAe,KAAK;AACpB,kBAAY,EAAE,QAAQ,OAAO,MAAM,EAAE,CAAC;AAAA,IACxC;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AACA,QAAM,eAAe,cAAAA,QAAM,QAAQ,MAAM;AACvC,QAAI,CAAC,eAAe,YAAY;AAC9B,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,OAAO,CAAC,SAAS;AAE3B,aAAO,QAAQ,KAAK,CAAC,WAAW;AAC9B,cAAM,YAAY,KAAK,OAAO,GAAc;AAC5C,eAAO,WACH,SAAS,EACV,YAAY,EACZ,SAAS,YAAY,YAAY,CAAC;AAAA,MACvC,CAAC;AAAA,IACH,CAAC;AAAA,EACH,GAAG,CAAC,MAAM,aAAa,SAAS,UAAU,CAAC;AAG3C,QAAM,cAAc,aAAa,aAAa;AAE9C,QAAM,iBAAiB,cAAAA,QAAM,YAAY,YAAY;AACnD,QAAI,CAAC,WAAY;AAEjB,eAAW,IAAI;AACf,aAAS,MAAS;AAElB,QAAI;AACF,YAAM,QAAQ,gBAAgB;AAC9B,YAAM,SAAS,MAAM,WAAW;AAAA,QAC9B,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,UAAU;AAAA,MACZ,CAAC;AAED,oBAAc,OAAO,IAAI;AACzB,oBAAc,OAAO,KAAK;AAC1B,iBAAW,KAAK;AAAA,IAClB,SAAS,KAAK;AACZ;AAAA,QACE,eAAe,QAAQ,IAAI,UAAU;AAAA,MACvC;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAGD,gBAAAA,QAAM,UAAU,MAAM;AACpB,QAAI,cAAc,WAAW;AAC3B,qBAAe;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,YAAY,WAAW,cAAc,CAAC;AAG1C,QAAM,mBAAmB,cAAAA,QAAM;AAAA,IAC7B,CAAC,YAAoB;AACnB,qBAAe,OAAO;AACtB,kBAAY,EAAE,MAAM,QAAQ,CAAC;AAAA,IAC/B;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAGA,QAAM,mBAAmB,cAAAA,QAAM;AAAA,IAC7B,CAAC,QAAgB,YAA4B;AAC3C,kBAAY,EAAE,QAAQ,SAAS,MAAM,EAAE,CAAC;AACxC,qBAAe,CAAC;AAAA,IAClB;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAGA,QAAM,0BAA0B,cAAAA,QAAM,QAAQ,MAAM;AAClD,QAAI,CAAC,eAAgB,QAAO;AAE5B,WAAO,YAAY,UAAU;AAAA,EAC/B,GAAG,CAAC,gBAAgB,YAAY,QAAQ,gBAAgB,CAAC;AAEzD,QAAM,uBAAuB,cAAAA,QAAM;AAAA,IACjC,OAAO;AAAA,MACL,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,iBAAiB;AAAA,MACjB,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,QAAM,sBAAsB,cAAAA,QAAM,YAAY,MAAM;AAClD,UAAM,kBAAkB;AAAA,MACtB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,MAAM;AAAA,MACjB,WAAW,YAAY;AAAA,MACvB,OAAO,QAAQ;AAAA,MACf,aAAa,aACT;AAAA,QACE,QAAQ,gBAAgB,EAAE,UAAU;AAAA,QACpC,SAAS,gBAAgB,EAAE,WAAW;AAAA,MACxC,IACA;AAAA,MACJ,QAAQ,aAAa,mBAAmB;AAAA,IAC1C;AAEA,QAAI,yBAAyB;AAC3B,aACE;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,gBAAgB;AAAA;AAAA,MAClB;AAAA,IAEJ;AAEA,WAAO,6CAAC,QAAM,GAAG,iBAAiB;AAAA,EACpC,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAGD,QAAM,qBAAqB,MAAM;AAE/B,UAAM,iBACJ,8EAEG;AAAA,qBACC,aAAa;AAAA,QACX,OAAO;AAAA,QACP,UAAU;AAAA,QACV,aAAa,MAAM;AAAA,QACnB;AAAA,QACA,SAAS,MAAM,mBAAmB,EAAE;AAAA,MACtC,CAAC,IAED;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,UAAU;AAAA,UACV,aAAa,MAAM;AAAA;AAAA,MACrB;AAAA,MAGF,8CAAC,SAAI,WAAU,gCACZ;AAAA,qBACG,WAAW;AAAA,UACT,MAAM;AAAA,UACN;AAAA,UACA,aAAa,kBAAkB,IAAI,OAAO,KAAK;AAAA,UAC/C,aAAa;AAAA,UACb,aACE,SAAS,aACL,MAAM;AAEJ,kBAAM,SAAS,YAAY,IAAI,OAAO,KAAK;AAC3C,kBAAM,cAAc,kBAAkB,IAAI,OAAO,KAAK;AACtD,gBAAI,OAAO,WAAW,YAAY,QAAQ;AACxC,8BAAgB;AAAA,YAClB,OAAO;AACL,0BAAY,QAAQ,CAAC,QAAQ;AAC3B,oBAAI,CAAC,cAAc,GAAG,GAAG;AACvB,qCAAmB,GAAG;AAAA,gBACxB;AAAA,cACF,CAAC;AAAA,YACH;AAAA,UACF,IACA;AAAA,UACN,YAAY;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,gBAAgB,0BACZ,uBACA;AAAA,UACJ;AAAA,UACA,cAAc;AAAA,UACd,QAAQ,gBAAgB,EAAE;AAAA,UAC1B,SAAS,gBAAgB,EAAE;AAAA,QAC7B,CAAC,IACD,oBAAoB;AAAA,QAGvB,cAAc,CAAC,oBACd;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,UAAU;AAAA,YACV,cAAc;AAAA;AAAA,QAChB;AAAA,QAGD,cACC,oBACA,iBAAiB;AAAA,UACf;AAAA,UACA,YAAY,KAAK,KAAK,aAAa,iBAAiB;AAAA,UACpD,cAAc;AAAA,UACd,UAAU;AAAA,UACV,kBAAkB,CAAC,YAAY;AAAA,UAE/B;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,SACL;AAAA,MAGC,eACC,aAAa;AAAA,QACX,eAAe,kBAAkB;AAAA,QACjC;AAAA,QACA,WAAW;AAAA,QACX,UAAU;AAAA,QACV;AAAA,QACA,YAAY,KAAK,KAAK,aAAa,iBAAiB;AAAA,QACpD,cAAc;AAAA,QACd,UAAU;AAAA,QACV;AAAA,QACA;AAAA,MACF,CAAC,IAED;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,UACX,UAAU;AAAA,UACV,aAAa,MAAM;AAAA,UACnB,YAAY,MAAM;AAAA,UAClB,eAAe,kBAAkB;AAAA;AAAA,MACnC;AAAA,OAEJ;AAGF,WAAO;AAAA,EACT;AAGA,QAAM,kBAAkB,MAAM;AAC5B,UAAM,UAAU,CAAC,eAAe;AAEhC,QAAI,WAAW,YAAY,WAAW;AACpC,cAAQ,KAAK,wBAAwB,OAAO,EAAE;AAAA,IAChD;AAEA,QAAI,QAAQ,SAAS,UAAU;AAC7B,cAAQ,KAAK,uBAAuB,IAAI,EAAE;AAAA,IAC5C;AAEA,QAAI,YAAY,MAAM;AACpB,cAAQ,KAAK,WAAW,IAAI;AAAA,IAC9B;AAEA,WAAO,QAAQ,KAAK,GAAG;AAAA,EACzB;AAGA,QAAM,iBAAiB,MAAM;AAC3B,UAAM,cAAsC,CAAC;AAE7C,QAAI,OAAO;AACT,UAAI,MAAM;AACR,oBAAY,+BAA+B,IAAI,MAAM;AACvD,UAAI,MAAM;AACR,oBAAY,0BAA0B,IAAI,MAAM;AAClD,UAAI,MAAM;AACR,oBAAY,4BAA4B,IAAI,MAAM;AACpD,UAAI,MAAM;AACR,oBAAY,+BAA+B,IACzC,OAAO,MAAM,iBAAiB,WAC1B,GAAG,MAAM,YAAY,OACrB,MAAM;AACd,UAAI,MAAM;AACR,oBAAY,yBAAyB,IAAI,GAAG,MAAM,OAAO;AAAA,IAC7D;AAEA,WAAO,EAAE,GAAG,aAAa,GAAG,QAAQ,KAAK;AAAA,EAC3C;AAEA,SACE,8CAAC,SAAI,WAAW,gBAAgB,GAAG,OAAO,eAAe,GACvD;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,eAAe;AAAA,QACf,aAAa,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,YAAY;AAAA,QACvB,OAAO,QAAQ;AAAA,QACf;AAAA,QACA,SAAS;AAAA,QACT,aAAa,CAAC,SAAS,mBAAmB,IAAI;AAAA;AAAA,IAChD;AAAA,IAEC,cACC,YAAY;AAAA,MACV,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU,mBAAmB;AAAA,MAC7B,OAAO,cAAc,MAAM;AAAA,MAC3B;AAAA,MACA;AAAA,MACA,OAAO,gBAAgB;AAAA,MACvB,eAAe,kBAAkB;AAAA,MACjC;AAAA,IACF,CAAC,IAED;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO,cAAc,MAAM;AAAA,QAC3B,WAAW,YAAY;AAAA,QACvB,OAAO,QAAQ;AAAA,QAEd,6BAAmB;AAAA;AAAA,IACtB;AAAA,KAEJ;AAEJ;","names":["import_react","import_react","import_react","import_jsx_runtime","focusableElements","import_jsx_runtime","import_react","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","React"]}
|