react-lookup-select 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1604 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +293 -0
- package/dist/index.d.ts +293 -0
- package/dist/index.js +1567 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.css +873 -0
- package/package.json +75 -0
- package/readme.md +274 -0
|
@@ -0,0 +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"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Selection mode: single or multiple
|
|
6
|
+
*/
|
|
7
|
+
type SelectMode = 'single' | 'multiple';
|
|
8
|
+
/**
|
|
9
|
+
* Theme types
|
|
10
|
+
*/
|
|
11
|
+
type Theme = 'default' | 'dark' | 'minimal' | 'compact';
|
|
12
|
+
/**
|
|
13
|
+
* Size variants
|
|
14
|
+
*/
|
|
15
|
+
type Size = 'small' | 'medium' | 'large';
|
|
16
|
+
/**
|
|
17
|
+
* Grid column definition
|
|
18
|
+
* @template T - Data type
|
|
19
|
+
*/
|
|
20
|
+
type ColumnDef<T> = {
|
|
21
|
+
/** Data field (string is also supported) */
|
|
22
|
+
key: keyof T | string;
|
|
23
|
+
/** Column title */
|
|
24
|
+
title: string;
|
|
25
|
+
/** Optional width */
|
|
26
|
+
width?: number | string;
|
|
27
|
+
/** Can trigger server/client sort */
|
|
28
|
+
sortable?: boolean;
|
|
29
|
+
/** Custom cell render function */
|
|
30
|
+
render?: (row: T, index: number) => ReactNode;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Query state - pagination, search and sorting information
|
|
34
|
+
*/
|
|
35
|
+
type QueryState = {
|
|
36
|
+
/** Page number */
|
|
37
|
+
page: number;
|
|
38
|
+
/** Page size */
|
|
39
|
+
pageSize: number;
|
|
40
|
+
/** Search text */
|
|
41
|
+
search?: string;
|
|
42
|
+
/** Sort column */
|
|
43
|
+
sortBy?: string;
|
|
44
|
+
/** Sort direction */
|
|
45
|
+
sortDir?: 'asc' | 'desc';
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* DataSource function return result
|
|
49
|
+
* @template T - Data type
|
|
50
|
+
*/
|
|
51
|
+
type DataSourceResult<T> = {
|
|
52
|
+
/** Row data */
|
|
53
|
+
rows: T[];
|
|
54
|
+
/** Total record count */
|
|
55
|
+
total: number;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Server-side data source function
|
|
59
|
+
* @template T - Data type
|
|
60
|
+
*/
|
|
61
|
+
type DataSourceFn<T> = (q: QueryState) => Promise<DataSourceResult<T>>;
|
|
62
|
+
/**
|
|
63
|
+
* Value mapping functions
|
|
64
|
+
* @template T - Data type
|
|
65
|
+
*/
|
|
66
|
+
type ValueMapper<T> = {
|
|
67
|
+
/** ID getter function */
|
|
68
|
+
getId: (row: T) => string | number;
|
|
69
|
+
/** Text getter function - e.g: (r) => `${r.name} ${r.surname}` */
|
|
70
|
+
getText: (row: T) => string;
|
|
71
|
+
/** Optional: disable check */
|
|
72
|
+
getDisabled?: (row: T) => boolean;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Return value shape
|
|
76
|
+
*/
|
|
77
|
+
type ReturnShape = 'id-text' | 'row' | 'custom';
|
|
78
|
+
/**
|
|
79
|
+
* Custom return value mapping
|
|
80
|
+
* @template T - Data type
|
|
81
|
+
*/
|
|
82
|
+
type ReturnMap<T> = {
|
|
83
|
+
/** Custom mapping function - e.g: (r) => ({ id: r.userId, label: `${r.name} ${r.surname}` }) */
|
|
84
|
+
map: (row: T) => any;
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* i18n text translations - Comprehensive multilingual support
|
|
88
|
+
*/
|
|
89
|
+
type i18nStrings = {
|
|
90
|
+
/** Trigger placeholder - "Please select" */
|
|
91
|
+
triggerPlaceholder?: string;
|
|
92
|
+
/** Search placeholder - "Search" */
|
|
93
|
+
searchPlaceholder?: string;
|
|
94
|
+
/** Confirm button - "Apply" */
|
|
95
|
+
confirmText?: string;
|
|
96
|
+
/** Cancel button - "Cancel" */
|
|
97
|
+
cancelText?: string;
|
|
98
|
+
/** Modal title - "Select Record" */
|
|
99
|
+
modalTitle?: string;
|
|
100
|
+
/** Empty state text - "No records found" */
|
|
101
|
+
emptyText?: string;
|
|
102
|
+
/** Loading text - "Loading..." */
|
|
103
|
+
loadingText?: string;
|
|
104
|
+
/** Error state prefix - "Error:" */
|
|
105
|
+
errorPrefix?: string;
|
|
106
|
+
/** Selected count - "{n} selected" */
|
|
107
|
+
selectedCount?: (n: number) => string;
|
|
108
|
+
/** Clear button - "Clear" */
|
|
109
|
+
clearText?: string;
|
|
110
|
+
/** Select all checkbox aria-label */
|
|
111
|
+
selectAllLabel?: string;
|
|
112
|
+
/** Row selection checkbox aria-label */
|
|
113
|
+
selectRowLabel?: (rowText: string) => string;
|
|
114
|
+
/** Sort button aria-label */
|
|
115
|
+
sortColumnLabel?: (columnTitle: string) => string;
|
|
116
|
+
/** Modal close button aria-label */
|
|
117
|
+
closeModalLabel?: string;
|
|
118
|
+
/** Pagination info - "Page {current} / {total}" */
|
|
119
|
+
paginationInfo?: (current: number, total: number) => string;
|
|
120
|
+
/** Total record count - "{total} records" */
|
|
121
|
+
totalRecords?: (total: number) => string;
|
|
122
|
+
/** Page size selector - "Show {size} records" */
|
|
123
|
+
pageSize?: (size: number) => string;
|
|
124
|
+
/** First page - "First" */
|
|
125
|
+
firstPage?: string;
|
|
126
|
+
/** Last page - "Last" */
|
|
127
|
+
lastPage?: string;
|
|
128
|
+
/** Previous page - "Previous" */
|
|
129
|
+
previousPage?: string;
|
|
130
|
+
/** Next page - "Next" */
|
|
131
|
+
nextPage?: string;
|
|
132
|
+
/** Search result info - "{count} results found" */
|
|
133
|
+
searchResults?: (count: number) => string;
|
|
134
|
+
/** Clear filters - "Clear filters" */
|
|
135
|
+
clearFilters?: string;
|
|
136
|
+
};
|
|
137
|
+
/**
|
|
138
|
+
* Component overrides - preserves headless core
|
|
139
|
+
*/
|
|
140
|
+
type ComponentsOverrides = {
|
|
141
|
+
/** Custom trigger component */
|
|
142
|
+
Trigger?: React.ComponentType<any>;
|
|
143
|
+
/** Custom modal component */
|
|
144
|
+
Modal?: React.ComponentType<any>;
|
|
145
|
+
/** Custom grid component */
|
|
146
|
+
Grid?: React.ComponentType<any>;
|
|
147
|
+
/** Custom checkbox component */
|
|
148
|
+
Checkbox?: React.ComponentType<any>;
|
|
149
|
+
/** Custom icon component */
|
|
150
|
+
Icon?: React.ComponentType<any>;
|
|
151
|
+
};
|
|
152
|
+
/**
|
|
153
|
+
* CSS class names - class override for each part
|
|
154
|
+
*/
|
|
155
|
+
type ClassNames = {
|
|
156
|
+
/** Root container class */
|
|
157
|
+
root?: string;
|
|
158
|
+
/** Trigger class */
|
|
159
|
+
trigger?: string;
|
|
160
|
+
/** Modal class */
|
|
161
|
+
modal?: string;
|
|
162
|
+
/** Header class */
|
|
163
|
+
header?: string;
|
|
164
|
+
/** Footer class */
|
|
165
|
+
footer?: string;
|
|
166
|
+
/** Grid class */
|
|
167
|
+
grid?: string;
|
|
168
|
+
/** Row class */
|
|
169
|
+
row?: string;
|
|
170
|
+
/** Cell class */
|
|
171
|
+
cell?: string;
|
|
172
|
+
/** Selected item chip/tag class */
|
|
173
|
+
tag?: string;
|
|
174
|
+
};
|
|
175
|
+
/**
|
|
176
|
+
* Inline style injection areas
|
|
177
|
+
*/
|
|
178
|
+
type Styles = Partial<{
|
|
179
|
+
/** Root container styles */
|
|
180
|
+
root: React.CSSProperties;
|
|
181
|
+
/** Trigger styles */
|
|
182
|
+
trigger: React.CSSProperties;
|
|
183
|
+
/** Modal styles */
|
|
184
|
+
modal: React.CSSProperties;
|
|
185
|
+
/** Header styles */
|
|
186
|
+
header: React.CSSProperties;
|
|
187
|
+
/** Footer styles */
|
|
188
|
+
footer: React.CSSProperties;
|
|
189
|
+
/** Grid styles */
|
|
190
|
+
grid: React.CSSProperties;
|
|
191
|
+
/** Row styles */
|
|
192
|
+
row: React.CSSProperties;
|
|
193
|
+
/** Cell styles */
|
|
194
|
+
cell: React.CSSProperties;
|
|
195
|
+
/** Tag styles */
|
|
196
|
+
tag: React.CSSProperties;
|
|
197
|
+
}>;
|
|
198
|
+
/**
|
|
199
|
+
* Theme tokens - can be bridged with CSS variables
|
|
200
|
+
*/
|
|
201
|
+
type ThemeTokens = Partial<{
|
|
202
|
+
/** Primary color */
|
|
203
|
+
colorPrimary: string;
|
|
204
|
+
/** Background color */
|
|
205
|
+
colorBg: string;
|
|
206
|
+
/** Text color */
|
|
207
|
+
colorText: string;
|
|
208
|
+
/** Border radius */
|
|
209
|
+
borderRadius: string | number;
|
|
210
|
+
/** Spacing multiplier */
|
|
211
|
+
spacing: number;
|
|
212
|
+
}>;
|
|
213
|
+
/**
|
|
214
|
+
* Main LookupSelect component props interface
|
|
215
|
+
* @template T - Data type
|
|
216
|
+
*/
|
|
217
|
+
type LookupSelectProps<T> = {
|
|
218
|
+
/** Selection mode - default: 'single' */
|
|
219
|
+
mode?: SelectMode;
|
|
220
|
+
/** Client-side data array */
|
|
221
|
+
data?: T[];
|
|
222
|
+
/** Server-side data source function */
|
|
223
|
+
dataSource?: DataSourceFn<T>;
|
|
224
|
+
/** Grid columns definition */
|
|
225
|
+
columns: ColumnDef<T>[];
|
|
226
|
+
/** ID/text/disabled generator */
|
|
227
|
+
mapper: ValueMapper<T>;
|
|
228
|
+
/** Controlled value */
|
|
229
|
+
value?: T | T[] | null;
|
|
230
|
+
/** Uncontrolled initial value */
|
|
231
|
+
defaultValue?: T | T[] | null;
|
|
232
|
+
/** Value change callback - according to return shape */
|
|
233
|
+
onChange?: (val: any) => void;
|
|
234
|
+
/** Return value format - 'id-text' (default) | 'row' | 'custom' */
|
|
235
|
+
returnShape?: ReturnShape;
|
|
236
|
+
/** Custom return mapping - only for 'custom' */
|
|
237
|
+
returnMap?: ReturnMap<T>;
|
|
238
|
+
/** Controlled modal state */
|
|
239
|
+
open?: boolean;
|
|
240
|
+
/** Uncontrolled modal initial state */
|
|
241
|
+
defaultOpen?: boolean;
|
|
242
|
+
/** Modal state change callback */
|
|
243
|
+
onOpenChange?: (open: boolean) => void;
|
|
244
|
+
/** Modal title - i18n.modalTitle override */
|
|
245
|
+
modalTitle?: string;
|
|
246
|
+
/** Trigger icon override */
|
|
247
|
+
icon?: ReactNode;
|
|
248
|
+
/** Completely custom trigger render function */
|
|
249
|
+
renderTrigger?: (selected: T | T[] | null) => ReactNode;
|
|
250
|
+
/** Row-based selection constraint function */
|
|
251
|
+
selectableRow?: (row: T) => boolean;
|
|
252
|
+
/** Is virtualization active for large data? */
|
|
253
|
+
virtualization?: boolean;
|
|
254
|
+
/** Fixed row height for virtual grid (px) - default: 40 */
|
|
255
|
+
virtualRowHeight?: number;
|
|
256
|
+
/** Number of extra rows to render outside visible area - default: 5 */
|
|
257
|
+
virtualOverscan?: number;
|
|
258
|
+
/** Virtual container height (px) - default: 400 */
|
|
259
|
+
virtualContainerHeight?: number;
|
|
260
|
+
/** Virtualization threshold - activates with more items than this number - default: 100 */
|
|
261
|
+
virtualThreshold?: number;
|
|
262
|
+
/** Page size - default 20 */
|
|
263
|
+
pageSize?: number;
|
|
264
|
+
/** Predefined theme */
|
|
265
|
+
variant?: Theme;
|
|
266
|
+
/** Size variant */
|
|
267
|
+
size?: Size;
|
|
268
|
+
/** CSS class names */
|
|
269
|
+
classNames?: ClassNames;
|
|
270
|
+
/** Inline styles */
|
|
271
|
+
styles?: Styles;
|
|
272
|
+
/** Theme tokens */
|
|
273
|
+
theme?: ThemeTokens;
|
|
274
|
+
/** Low level component overrides */
|
|
275
|
+
components?: ComponentsOverrides;
|
|
276
|
+
/** Text translations */
|
|
277
|
+
i18n?: i18nStrings;
|
|
278
|
+
/** Search/sort/page change callback */
|
|
279
|
+
onQueryChange?: (q: QueryState) => void;
|
|
280
|
+
/** "Apply" button callback */
|
|
281
|
+
onConfirm?: (val: any) => void;
|
|
282
|
+
/** Modal close callback */
|
|
283
|
+
onCancel?: () => void;
|
|
284
|
+
/** Modal internal selection change callback */
|
|
285
|
+
onSelectionChange?: (rows: T[]) => void;
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* LookupSelect - Headless React lookup select component with modal and grid
|
|
290
|
+
*/
|
|
291
|
+
declare function LookupSelect<T = any>(props: LookupSelectProps<T>): react_jsx_runtime.JSX.Element;
|
|
292
|
+
|
|
293
|
+
export { type ClassNames, type ColumnDef, type ComponentsOverrides, type DataSourceFn, type DataSourceResult, LookupSelect, type LookupSelectProps, type QueryState, type ReturnMap, type ReturnShape, type SelectMode, type Styles, type ThemeTokens, type ValueMapper, type i18nStrings };
|