@fragments-sdk/ui 0.11.1 → 0.13.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/README.md +15 -0
- package/dist/assets/ui.css +25 -18
- package/dist/blocks/AccountSettings.block.d.ts +1 -1
- package/dist/blocks/ActivityFeed.block.d.ts +1 -1
- package/dist/blocks/ActivityFeedSkeleton.block.d.ts +1 -1
- package/dist/blocks/BlogEditor.block.d.ts +1 -1
- package/dist/blocks/ChatInterface.block.d.ts +1 -1
- package/dist/blocks/ChatMessages.block.d.ts +1 -1
- package/dist/blocks/CheckoutForm.block.d.ts +1 -1
- package/dist/blocks/CommandPalette.block.d.ts +1 -1
- package/dist/blocks/ContactForm.block.d.ts +1 -1
- package/dist/blocks/DashboardLayout.block.d.ts +1 -1
- package/dist/blocks/DashboardPage.block.d.ts +1 -1
- package/dist/blocks/DashboardSkeleton.block.d.ts +1 -1
- package/dist/blocks/DataTable.block.d.ts +1 -1
- package/dist/blocks/EmptyState.block.d.ts +1 -1
- package/dist/blocks/FAQSection.block.d.ts +1 -1
- package/dist/blocks/FeatureGrid.block.d.ts +1 -1
- package/dist/blocks/HeroSection.block.d.ts +1 -1
- package/dist/blocks/LoginForm.block.d.ts +1 -1
- package/dist/blocks/NavigationHeader.block.d.ts +1 -1
- package/dist/blocks/PaginatedTable.block.d.ts +1 -1
- package/dist/blocks/PricingComparison.block.d.ts +1 -1
- package/dist/blocks/ProductCard.block.d.ts +1 -1
- package/dist/blocks/RegistrationForm.block.d.ts +1 -1
- package/dist/blocks/SettingsDrawer.block.d.ts +1 -1
- package/dist/blocks/SettingsPanel.block.d.ts +1 -1
- package/dist/blocks/ShoppingCart.block.d.ts +1 -1
- package/dist/blocks/StatsCard.block.d.ts +1 -1
- package/dist/blocks/StatsCardSkeleton.block.d.ts +1 -1
- package/dist/blocks/TableSkeleton.block.d.ts +1 -1
- package/dist/blocks/ThinkingStates.block.d.ts +1 -1
- package/dist/codeblock.cjs +7 -1
- package/dist/codeblock.cjs.map +1 -1
- package/dist/codeblock.js +7 -1
- package/dist/codeblock.js.map +1 -1
- package/dist/components/Accordion/index.cjs +11 -4
- package/dist/components/Accordion/index.cjs.map +1 -1
- package/dist/components/Accordion/index.d.ts +3 -3
- package/dist/components/Accordion/index.d.ts.map +1 -1
- package/dist/components/Accordion/index.js +11 -4
- package/dist/components/Accordion/index.js.map +1 -1
- package/dist/components/Alert/index.cjs.map +1 -1
- package/dist/components/Alert/index.d.ts +7 -0
- package/dist/components/Alert/index.d.ts.map +1 -1
- package/dist/components/Alert/index.js.map +1 -1
- package/dist/components/Avatar/index.cjs.map +1 -1
- package/dist/components/Avatar/index.d.ts +4 -0
- package/dist/components/Avatar/index.d.ts.map +1 -1
- package/dist/components/Avatar/index.js.map +1 -1
- package/dist/components/Badge/index.cjs.map +1 -1
- package/dist/components/Badge/index.d.ts +12 -0
- package/dist/components/Badge/index.d.ts.map +1 -1
- package/dist/components/Badge/index.js.map +1 -1
- package/dist/components/Button/index.cjs +9 -1
- package/dist/components/Button/index.cjs.map +1 -1
- package/dist/components/Button/index.d.ts +14 -1
- package/dist/components/Button/index.d.ts.map +1 -1
- package/dist/components/Button/index.js +9 -1
- package/dist/components/Button/index.js.map +1 -1
- package/dist/components/Card/index.cjs +2 -1
- package/dist/components/Card/index.cjs.map +1 -1
- package/dist/components/Card/index.d.ts +12 -2
- package/dist/components/Card/index.d.ts.map +1 -1
- package/dist/components/Card/index.js +2 -1
- package/dist/components/Card/index.js.map +1 -1
- package/dist/components/Checkbox/index.cjs.map +1 -1
- package/dist/components/Checkbox/index.d.ts +6 -1
- package/dist/components/Checkbox/index.d.ts.map +1 -1
- package/dist/components/Checkbox/index.js.map +1 -1
- package/dist/components/Chip/index.cjs +2 -1
- package/dist/components/Chip/index.cjs.map +1 -1
- package/dist/components/Chip/index.d.ts +10 -3
- package/dist/components/Chip/index.d.ts.map +1 -1
- package/dist/components/Chip/index.js +2 -1
- package/dist/components/Chip/index.js.map +1 -1
- package/dist/components/CodeBlock/index.d.ts +1 -1
- package/dist/components/CodeBlock/index.d.ts.map +1 -1
- package/dist/components/Collapsible/index.cjs +45 -10
- package/dist/components/Collapsible/index.cjs.map +1 -1
- package/dist/components/Collapsible/index.d.ts +6 -12
- package/dist/components/Collapsible/index.d.ts.map +1 -1
- package/dist/components/Collapsible/index.js +45 -10
- package/dist/components/Collapsible/index.js.map +1 -1
- package/dist/components/Combobox/index.cjs +18 -9
- package/dist/components/Combobox/index.cjs.map +1 -1
- package/dist/components/Combobox/index.d.ts +8 -12
- package/dist/components/Combobox/index.d.ts.map +1 -1
- package/dist/components/Combobox/index.js +18 -9
- package/dist/components/Combobox/index.js.map +1 -1
- package/dist/components/Command/index.cjs +54 -21
- package/dist/components/Command/index.cjs.map +1 -1
- package/dist/components/Command/index.d.ts +2 -2
- package/dist/components/Command/index.d.ts.map +1 -1
- package/dist/components/Command/index.js +54 -21
- package/dist/components/Command/index.js.map +1 -1
- package/dist/components/DataTable/index.cjs +13 -1
- package/dist/components/DataTable/index.cjs.map +1 -1
- package/dist/components/DataTable/index.d.ts.map +1 -1
- package/dist/components/DataTable/index.js +13 -1
- package/dist/components/DataTable/index.js.map +1 -1
- package/dist/components/DatePicker/index.d.ts +2 -3
- package/dist/components/DatePicker/index.d.ts.map +1 -1
- package/dist/components/Dialog/index.cjs +12 -9
- package/dist/components/Dialog/index.cjs.map +1 -1
- package/dist/components/Dialog/index.d.ts +20 -12
- package/dist/components/Dialog/index.d.ts.map +1 -1
- package/dist/components/Dialog/index.js +12 -9
- package/dist/components/Dialog/index.js.map +1 -1
- package/dist/components/Drawer/index.cjs +12 -9
- package/dist/components/Drawer/index.cjs.map +1 -1
- package/dist/components/Drawer/index.d.ts +22 -12
- package/dist/components/Drawer/index.d.ts.map +1 -1
- package/dist/components/Drawer/index.js +12 -9
- package/dist/components/Drawer/index.js.map +1 -1
- package/dist/components/Grid/index.cjs +4 -1
- package/dist/components/Grid/index.cjs.map +1 -1
- package/dist/components/Grid/index.d.ts +6 -2
- package/dist/components/Grid/index.d.ts.map +1 -1
- package/dist/components/Grid/index.js +4 -1
- package/dist/components/Grid/index.js.map +1 -1
- package/dist/components/Input/index.cjs.map +1 -1
- package/dist/components/Input/index.d.ts +15 -1
- package/dist/components/Input/index.d.ts.map +1 -1
- package/dist/components/Input/index.js.map +1 -1
- package/dist/components/Menu/index.cjs +30 -16
- package/dist/components/Menu/index.cjs.map +1 -1
- package/dist/components/Menu/index.d.ts +17 -25
- package/dist/components/Menu/index.d.ts.map +1 -1
- package/dist/components/Menu/index.js +30 -16
- package/dist/components/Menu/index.js.map +1 -1
- package/dist/components/NavigationMenu/NavigationMenuContext.cjs.map +1 -1
- package/dist/components/NavigationMenu/NavigationMenuContext.d.ts +1 -0
- package/dist/components/NavigationMenu/NavigationMenuContext.d.ts.map +1 -1
- package/dist/components/NavigationMenu/NavigationMenuContext.js.map +1 -1
- package/dist/components/NavigationMenu/index.cjs +43 -11
- package/dist/components/NavigationMenu/index.cjs.map +1 -1
- package/dist/components/NavigationMenu/index.d.ts.map +1 -1
- package/dist/components/NavigationMenu/index.js +43 -11
- package/dist/components/NavigationMenu/index.js.map +1 -1
- package/dist/components/NavigationMenu/useNavigationMenu.cjs +2 -0
- package/dist/components/NavigationMenu/useNavigationMenu.cjs.map +1 -1
- package/dist/components/NavigationMenu/useNavigationMenu.d.ts +1 -0
- package/dist/components/NavigationMenu/useNavigationMenu.d.ts.map +1 -1
- package/dist/components/NavigationMenu/useNavigationMenu.js +2 -0
- package/dist/components/NavigationMenu/useNavigationMenu.js.map +1 -1
- package/dist/components/Popover/index.cjs +11 -10
- package/dist/components/Popover/index.cjs.map +1 -1
- package/dist/components/Popover/index.d.ts +17 -12
- package/dist/components/Popover/index.d.ts.map +1 -1
- package/dist/components/Popover/index.js +11 -10
- package/dist/components/Popover/index.js.map +1 -1
- package/dist/components/RadioGroup/index.cjs.map +1 -1
- package/dist/components/RadioGroup/index.d.ts +4 -0
- package/dist/components/RadioGroup/index.d.ts.map +1 -1
- package/dist/components/RadioGroup/index.js.map +1 -1
- package/dist/components/Select/index.cjs +7 -6
- package/dist/components/Select/index.cjs.map +1 -1
- package/dist/components/Select/index.d.ts +20 -9
- package/dist/components/Select/index.d.ts.map +1 -1
- package/dist/components/Select/index.js +7 -6
- package/dist/components/Select/index.js.map +1 -1
- package/dist/components/Sidebar/index.cjs +71 -24
- package/dist/components/Sidebar/index.cjs.map +1 -1
- package/dist/components/Sidebar/index.d.ts +21 -33
- package/dist/components/Sidebar/index.d.ts.map +1 -1
- package/dist/components/Sidebar/index.js +71 -24
- package/dist/components/Sidebar/index.js.map +1 -1
- package/dist/components/Slider/index.cjs +3 -1
- package/dist/components/Slider/index.cjs.map +1 -1
- package/dist/components/Slider/index.d.ts +10 -0
- package/dist/components/Slider/index.d.ts.map +1 -1
- package/dist/components/Slider/index.js +3 -1
- package/dist/components/Slider/index.js.map +1 -1
- package/dist/components/Stack/index.cjs +6 -0
- package/dist/components/Stack/index.cjs.map +1 -1
- package/dist/components/Stack/index.d.ts +12 -6
- package/dist/components/Stack/index.d.ts.map +1 -1
- package/dist/components/Stack/index.js +6 -0
- package/dist/components/Stack/index.js.map +1 -1
- package/dist/components/Tabs/index.cjs.map +1 -1
- package/dist/components/Tabs/index.d.ts +13 -1
- package/dist/components/Tabs/index.d.ts.map +1 -1
- package/dist/components/Tabs/index.js.map +1 -1
- package/dist/components/Text/Text.module.scss.cjs +44 -32
- package/dist/components/Text/Text.module.scss.cjs.map +1 -1
- package/dist/components/Text/Text.module.scss.js +44 -32
- package/dist/components/Text/Text.module.scss.js.map +1 -1
- package/dist/components/Text/index.cjs.map +1 -1
- package/dist/components/Text/index.d.ts +18 -3
- package/dist/components/Text/index.d.ts.map +1 -1
- package/dist/components/Text/index.js.map +1 -1
- package/dist/components/Theme/index.cjs.map +1 -1
- package/dist/components/Theme/index.d.ts +12 -0
- package/dist/components/Theme/index.d.ts.map +1 -1
- package/dist/components/Theme/index.js.map +1 -1
- package/dist/components/Toggle/index.cjs +2 -1
- package/dist/components/Toggle/index.cjs.map +1 -1
- package/dist/components/Toggle/index.d.ts +9 -0
- package/dist/components/Toggle/index.d.ts.map +1 -1
- package/dist/components/Toggle/index.js +2 -1
- package/dist/components/Toggle/index.js.map +1 -1
- package/dist/components/ToggleGroup/index.cjs +4 -1
- package/dist/components/ToggleGroup/index.cjs.map +1 -1
- package/dist/components/ToggleGroup/index.d.ts +13 -4
- package/dist/components/ToggleGroup/index.d.ts.map +1 -1
- package/dist/components/ToggleGroup/index.js +4 -1
- package/dist/components/ToggleGroup/index.js.map +1 -1
- package/dist/components/Tooltip/index.cjs +20 -10
- package/dist/components/Tooltip/index.cjs.map +1 -1
- package/dist/components/Tooltip/index.d.ts +5 -1
- package/dist/components/Tooltip/index.d.ts.map +1 -1
- package/dist/components/Tooltip/index.js +20 -10
- package/dist/components/Tooltip/index.js.map +1 -1
- package/dist/datepicker.cjs +24 -10
- package/dist/datepicker.cjs.map +1 -1
- package/dist/datepicker.js +24 -10
- package/dist/datepicker.js.map +1 -1
- package/dist/index.cjs +4 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/css-warning.cjs +18 -0
- package/dist/utils/css-warning.cjs.map +1 -0
- package/dist/utils/css-warning.d.ts +2 -0
- package/dist/utils/css-warning.d.ts.map +1 -0
- package/dist/utils/css-warning.js +18 -0
- package/dist/utils/css-warning.js.map +1 -0
- package/fragments.json +1 -1
- package/package.json +2 -2
- package/src/components/Accordion/Accordion.test.tsx +33 -0
- package/src/components/Accordion/index.tsx +10 -3
- package/src/components/Alert/index.tsx +7 -0
- package/src/components/Avatar/index.tsx +4 -0
- package/src/components/Badge/Badge.fragment.tsx +10 -2
- package/src/components/Badge/index.tsx +12 -0
- package/src/components/Button/Button.fragment.tsx +12 -2
- package/src/components/Button/Button.test.tsx +16 -0
- package/src/components/Button/index.tsx +27 -2
- package/src/components/Card/Card.fragment.tsx +14 -2
- package/src/components/Card/Card.test.tsx +5 -0
- package/src/components/Card/index.tsx +15 -2
- package/src/components/Checkbox/index.tsx +6 -1
- package/src/components/Chip/Chip.fragment.tsx +12 -2
- package/src/components/Chip/Chip.test.tsx +5 -0
- package/src/components/Chip/index.tsx +14 -4
- package/src/components/CodeBlock/index.tsx +13 -2
- package/src/components/Collapsible/Collapsible.test.tsx +41 -0
- package/src/components/Collapsible/index.tsx +53 -16
- package/src/components/Combobox/Combobox.test.tsx +55 -0
- package/src/components/Combobox/index.tsx +23 -17
- package/src/components/Command/Command.test.tsx +93 -0
- package/src/components/Command/index.tsx +61 -18
- package/src/components/DataTable/DataTable.test.tsx +11 -2
- package/src/components/DataTable/index.tsx +22 -2
- package/src/components/DatePicker/DatePicker.test.tsx +79 -0
- package/src/components/DatePicker/index.tsx +29 -14
- package/src/components/Dialog/Dialog.test.tsx +23 -0
- package/src/components/Dialog/index.tsx +27 -16
- package/src/components/Drawer/Drawer.test.tsx +27 -0
- package/src/components/Drawer/index.tsx +29 -16
- package/src/components/Grid/Grid.fragment.tsx +14 -2
- package/src/components/Grid/Grid.test.tsx +6 -0
- package/src/components/Grid/index.tsx +12 -3
- package/src/components/Input/index.tsx +15 -1
- package/src/components/Menu/index.tsx +35 -30
- package/src/components/NavigationMenu/NavigationMenu.fragment.tsx +1 -1
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +40 -4
- package/src/components/NavigationMenu/NavigationMenuContext.ts +3 -0
- package/src/components/NavigationMenu/index.tsx +49 -13
- package/src/components/NavigationMenu/useNavigationMenu.ts +4 -0
- package/src/components/Popover/Popover.test.tsx +23 -0
- package/src/components/Popover/index.tsx +24 -18
- package/src/components/RadioGroup/index.tsx +4 -0
- package/src/components/Select/Select.test.tsx +41 -0
- package/src/components/Select/index.tsx +24 -12
- package/src/components/Sidebar/Sidebar.test.tsx +83 -4
- package/src/components/Sidebar/index.tsx +87 -45
- package/src/components/Slider/Slider.fragment.tsx +5 -1
- package/src/components/Slider/Slider.test.tsx +6 -0
- package/src/components/Slider/index.tsx +13 -1
- package/src/components/Stack/Stack.fragment.tsx +22 -2
- package/src/components/Stack/Stack.test.tsx +6 -0
- package/src/components/Stack/index.tsx +20 -6
- package/src/components/Tabs/index.tsx +13 -1
- package/src/components/Text/Text.fragment.tsx +10 -8
- package/src/components/Text/Text.module.scss +8 -2
- package/src/components/Text/Text.test.tsx +15 -0
- package/src/components/Text/index.tsx +18 -3
- package/src/components/Theme/index.tsx +12 -0
- package/src/components/Toggle/Toggle.fragment.tsx +5 -1
- package/src/components/Toggle/Toggle.test.tsx +19 -0
- package/src/components/Toggle/index.tsx +11 -1
- package/src/components/ToggleGroup/ToggleGroup.fragment.tsx +5 -2
- package/src/components/ToggleGroup/ToggleGroup.test.tsx +20 -0
- package/src/components/ToggleGroup/index.tsx +15 -4
- package/src/components/Tooltip/Tooltip.test.tsx +17 -0
- package/src/components/Tooltip/index.tsx +58 -34
- package/src/index.ts +6 -0
- package/src/tokens/_seeds.scss +5 -3
- package/src/tokens/_variables.scss +2 -0
- package/src/utils/css-warning.ts +29 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/components/Command/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Command.module.scss';\n\n// ============================================\n// Types\n// ============================================\n\nexport interface CommandProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Controlled search value */\n search?: string;\n /** Default search value */\n defaultSearch?: string;\n /** Called when search input changes */\n onSearchChange?: (search: string) => void;\n /** Custom filter function. Return 0 to hide, >0 to show (higher = better match).\n Default: case-insensitive substring match on value + keywords */\n filter?: (value: string, search: string, keywords?: string[]) => number;\n /** Whether to loop keyboard navigation. Default: true */\n loop?: boolean;\n}\n\nexport interface CommandInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n className?: string;\n}\n\nexport interface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport interface CommandItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n children: React.ReactNode;\n /** Value used for filtering (falls back to text content) */\n value?: string;\n /** Extra keywords for filtering */\n keywords?: string[];\n /** Whether this item is disabled */\n disabled?: boolean;\n /** Called when item is selected (Enter or click) */\n onItemSelect?: () => void;\n}\n\nexport interface CommandGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Group heading text */\n heading?: string;\n}\n\nexport interface CommandEmptyProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport type CommandSeparatorProps = React.HTMLAttributes<HTMLDivElement>;\n\n// ============================================\n// Default filter\n// ============================================\n\nfunction defaultFilter(value: string, search: string, keywords?: string[]): number {\n if (!search) return 1;\n const searchLower = search.toLowerCase();\n const valueLower = value.toLowerCase();\n\n if (valueLower.includes(searchLower)) return 1;\n\n if (keywords) {\n for (const keyword of keywords) {\n if (keyword.toLowerCase().includes(searchLower)) return 1;\n }\n }\n\n return 0;\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface ItemRegistration {\n value: string;\n keywords?: string[];\n}\n\ninterface CommandContextValue {\n search: string;\n setSearch: (search: string) => void;\n filter: (value: string, search: string, keywords?: string[]) => number;\n scores: Map<string, number>;\n registerItem: (id: string, registration: ItemRegistration) => void;\n unregisterItem: (id: string) => void;\n activeId: string | null;\n setActiveId: (id: string | null) => void;\n loop: boolean;\n listRef: React.RefObject<HTMLDivElement | null>;\n visibleCount: number;\n}\n\nconst CommandContext = React.createContext<CommandContextValue | null>(null);\n\nfunction useCommandContext() {\n const ctx = React.useContext(CommandContext);\n if (!ctx) throw new Error('Command sub-components must be used within <Command>');\n return ctx;\n}\n\n// ============================================\n// Search Icon\n// ============================================\n\nfunction SearchIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\n// ============================================\n// Components\n// ============================================\n\nfunction CommandRoot({\n children,\n search: controlledSearch,\n defaultSearch = '',\n onSearchChange,\n filter = defaultFilter,\n loop = true,\n className,\n ...htmlProps\n}: CommandProps) {\n const [uncontrolledSearch, setUncontrolledSearch] = React.useState(defaultSearch);\n const isControlled = controlledSearch !== undefined;\n const search = isControlled ? controlledSearch : uncontrolledSearch;\n\n const [items, setItems] = React.useState<Map<string, ItemRegistration>>(new Map());\n const [activeId, setActiveId] = React.useState<string | null>(null);\n const listRef = React.useRef<HTMLDivElement | null>(null);\n\n const setSearch = React.useCallback(\n (value: string) => {\n if (!isControlled) {\n setUncontrolledSearch(value);\n }\n onSearchChange?.(value);\n },\n [isControlled, onSearchChange]\n );\n\n const registerItem = React.useCallback((id: string, registration: ItemRegistration) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.set(id, registration);\n return next;\n });\n }, []);\n\n const unregisterItem = React.useCallback((id: string) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n // Compute scores for all items\n const scores = React.useMemo(() => {\n const result = new Map<string, number>();\n for (const [id, registration] of items) {\n const score = filter(registration.value, search, registration.keywords);\n result.set(id, score);\n }\n return result;\n }, [items, search, filter]);\n\n const visibleCount = React.useMemo(() => {\n let count = 0;\n for (const score of scores.values()) {\n if (score > 0) count++;\n }\n return count;\n }, [scores]);\n\n // Reset active when search changes\n React.useEffect(() => {\n setActiveId(null);\n }, [search]);\n\n const contextValue = React.useMemo<CommandContextValue>(\n () => ({\n search,\n setSearch,\n filter,\n scores,\n registerItem,\n unregisterItem,\n activeId,\n setActiveId,\n loop,\n listRef,\n visibleCount,\n }),\n [search, setSearch, filter, scores, registerItem, unregisterItem, activeId, loop, visibleCount]\n );\n\n return (\n <CommandContext.Provider value={contextValue}>\n <div\n {...htmlProps}\n className={[styles.command, className].filter(Boolean).join(' ')}\n role=\"search\"\n >\n {children}\n </div>\n </CommandContext.Provider>\n );\n}\n\nfunction CommandInput({ className, ...htmlProps }: CommandInputProps) {\n const { search, setSearch, listRef, setActiveId, activeId, loop } = useCommandContext();\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const getEnabledItems = React.useCallback(() => {\n const list = listRef.current;\n if (!list) return [];\n return Array.from(\n list.querySelectorAll<HTMLElement>('[data-command-item]:not([data-disabled=\"true\"])')\n ).filter((el) => el.style.display !== 'none');\n }, [listRef]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n htmlProps.onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n const items = getEnabledItems();\n if (items.length === 0) return;\n\n const currentIndex = activeId\n ? items.findIndex((item) => item.id === activeId)\n : -1;\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[0].id);\n } else if (currentIndex < items.length - 1) {\n setActiveId(items[currentIndex + 1].id);\n } else if (loop) {\n setActiveId(items[0].id);\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[items.length - 1].id);\n } else if (currentIndex > 0) {\n setActiveId(items[currentIndex - 1].id);\n } else if (loop) {\n setActiveId(items[items.length - 1].id);\n }\n break;\n }\n case 'Home': {\n event.preventDefault();\n setActiveId(items[0].id);\n break;\n }\n case 'End': {\n event.preventDefault();\n setActiveId(items[items.length - 1].id);\n break;\n }\n case 'Enter': {\n event.preventDefault();\n if (activeId) {\n const activeItem = items.find((item) => item.id === activeId);\n if (activeItem) {\n activeItem.click();\n }\n }\n break;\n }\n }\n };\n\n return (\n <div className={styles.inputWrapper}>\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={true}\n aria-controls=\"command-list\"\n aria-autocomplete=\"list\"\n aria-activedescendant={activeId ?? undefined}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onKeyDown={handleKeyDown}\n className={[styles.input, className].filter(Boolean).join(' ')}\n {...htmlProps}\n />\n </div>\n );\n}\n\nfunction CommandList({ children, className, ...htmlProps }: CommandListProps) {\n const { listRef } = useCommandContext();\n\n return (\n <div\n ref={listRef}\n id=\"command-list\"\n role=\"listbox\"\n className={[styles.list, className].filter(Boolean).join(' ')}\n {...htmlProps}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandItem({\n children,\n value: valueProp,\n keywords,\n disabled = false,\n onItemSelect,\n className,\n ...htmlProps\n}: CommandItemProps) {\n const { scores, registerItem, unregisterItem, activeId, setActiveId } = useCommandContext();\n const generatedId = React.useId();\n const itemId = (htmlProps.id as string | undefined) ?? `command-item-${generatedId}`;\n const itemRef = React.useRef<HTMLDivElement>(null);\n\n // Extract text content for filtering if no value prop\n const textValue = React.useMemo(() => {\n if (valueProp) return valueProp;\n if (typeof children === 'string') return children;\n return '';\n }, [valueProp, children]);\n\n // Register with context\n React.useEffect(() => {\n registerItem(itemId, { value: textValue, keywords });\n return () => unregisterItem(itemId);\n }, [itemId, textValue, keywords, registerItem, unregisterItem]);\n\n const score = scores.get(itemId) ?? 1;\n const isVisible = score > 0;\n const isActive = activeId === itemId;\n\n // Scroll active item into view\n React.useEffect(() => {\n if (isActive && itemRef.current) {\n itemRef.current.scrollIntoView({ block: 'nearest' });\n }\n }, [isActive]);\n\n const handleClick = () => {\n if (disabled) return;\n onItemSelect?.();\n };\n\n const handleMouseEnter = () => {\n if (!disabled) {\n setActiveId(itemId);\n }\n };\n\n return (\n <div\n ref={itemRef}\n {...htmlProps}\n id={itemId}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={disabled}\n data-command-item=\"\"\n data-active={isActive || undefined}\n data-disabled={disabled || undefined}\n onClick={handleClick}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleClick(); } }}\n onMouseEnter={handleMouseEnter}\n className={[\n styles.item,\n isActive && styles.itemActive,\n disabled && styles.itemDisabled,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ display: isVisible ? undefined : 'none' }}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandGroup({ children, heading, className, ...htmlProps }: CommandGroupProps) {\n const labelId = React.useId();\n const groupRef = React.useRef<HTMLDivElement>(null);\n const { scores } = useCommandContext();\n const [hasVisibleChildren, setHasVisibleChildren] = React.useState(true);\n\n // Check if any children are visible after each score update\n React.useEffect(() => {\n if (!groupRef.current) return;\n const items = groupRef.current.querySelectorAll<HTMLElement>('[data-command-item]');\n const anyVisible = Array.from(items).some((item) => item.style.display !== 'none');\n setHasVisibleChildren(anyVisible);\n }, [scores]);\n\n return (\n <div\n ref={groupRef}\n {...htmlProps}\n role=\"group\"\n aria-labelledby={heading ? labelId : undefined}\n className={[styles.group, className].filter(Boolean).join(' ')}\n style={{ display: hasVisibleChildren ? undefined : 'none' }}\n >\n {heading && (\n <div id={labelId} className={styles.groupHeading}>\n {heading}\n </div>\n )}\n {children}\n </div>\n );\n}\n\nfunction CommandEmpty({ children, className, ...htmlProps }: CommandEmptyProps) {\n const { visibleCount } = useCommandContext();\n\n if (visibleCount > 0) return null;\n\n return (\n <div\n {...htmlProps}\n role=\"option\"\n aria-disabled=\"true\"\n aria-selected=\"false\"\n className={[styles.empty, className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandSeparator({ className, ...htmlProps }: CommandSeparatorProps) {\n return (\n <div\n {...htmlProps}\n role=\"separator\"\n className={[styles.separator, className].filter(Boolean).join(' ')}\n />\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Command = Object.assign(CommandRoot, {\n Input: CommandInput,\n List: CommandList,\n Item: CommandItem,\n Group: CommandGroup,\n Empty: CommandEmpty,\n Separator: CommandSeparator,\n});\n\nexport {\n CommandRoot,\n CommandInput,\n CommandList,\n CommandItem,\n CommandGroup,\n CommandEmpty,\n CommandSeparator,\n};\n"],"names":["React","jsxs","jsx","styles"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/components/Command/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Command.module.scss';\n\n// ============================================\n// Types\n// ============================================\n\nexport interface CommandProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Controlled search value */\n search?: string;\n /** Default search value */\n defaultSearch?: string;\n /** Called when search input changes */\n onSearchChange?: (search: string) => void;\n /** Custom filter function. Return 0 to hide, >0 to show (higher = better match).\n Default: case-insensitive substring match on value + keywords */\n filter?: (value: string, search: string, keywords?: string[]) => number;\n /** Whether to loop keyboard navigation. Default: true */\n loop?: boolean;\n}\n\nexport interface CommandInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n className?: string;\n}\n\nexport interface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport interface CommandItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n children: React.ReactNode;\n /** Value used for filtering (falls back to text content) */\n value?: string;\n /** Extra keywords for filtering */\n keywords?: string[];\n /** Whether this item is disabled */\n disabled?: boolean;\n /** Called when item is selected (Enter or click) */\n onItemSelect?: () => void;\n}\n\nexport interface CommandGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Group heading text */\n heading?: string;\n}\n\nexport interface CommandEmptyProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport type CommandSeparatorProps = React.HTMLAttributes<HTMLDivElement>;\n\n// ============================================\n// Default filter\n// ============================================\n\nfunction defaultFilter(value: string, search: string, keywords?: string[]): number {\n if (!search) return 1;\n const searchLower = search.toLowerCase();\n const valueLower = value.toLowerCase();\n\n if (valueLower.includes(searchLower)) return 1;\n\n if (keywords) {\n for (const keyword of keywords) {\n if (keyword.toLowerCase().includes(searchLower)) return 1;\n }\n }\n\n return 0;\n}\n\nfunction getTextContent(node: React.ReactNode): string {\n if (typeof node === 'string' || typeof node === 'number') return String(node);\n if (Array.isArray(node)) return node.map(getTextContent).join(' ');\n if (React.isValidElement(node)) {\n const childProps = node.props as { children?: React.ReactNode };\n return getTextContent(childProps.children);\n }\n return '';\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface ItemRegistration {\n value: string;\n keywords?: string[];\n}\n\ninterface CommandContextValue {\n search: string;\n setSearch: (search: string) => void;\n filter: (value: string, search: string, keywords?: string[]) => number;\n scores: Map<string, number>;\n registerItem: (id: string, registration: ItemRegistration) => void;\n unregisterItem: (id: string) => void;\n activeId: string | null;\n setActiveId: (id: string | null) => void;\n loop: boolean;\n listRef: React.RefObject<HTMLDivElement | null>;\n visibleCount: number;\n listId: string;\n}\n\nconst CommandContext = React.createContext<CommandContextValue | null>(null);\n\nfunction useCommandContext() {\n const ctx = React.useContext(CommandContext);\n if (!ctx) throw new Error('Command sub-components must be used within <Command>');\n return ctx;\n}\n\n// ============================================\n// Search Icon\n// ============================================\n\nfunction SearchIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\n// ============================================\n// Components\n// ============================================\n\nfunction CommandRoot({\n children,\n search: controlledSearch,\n defaultSearch = '',\n onSearchChange,\n filter = defaultFilter,\n loop = true,\n className,\n ...htmlProps\n}: CommandProps) {\n const [uncontrolledSearch, setUncontrolledSearch] = React.useState(defaultSearch);\n const isControlled = controlledSearch !== undefined;\n const search = isControlled ? controlledSearch : uncontrolledSearch;\n\n const [items, setItems] = React.useState<Map<string, ItemRegistration>>(new Map());\n const [activeId, setActiveId] = React.useState<string | null>(null);\n const listRef = React.useRef<HTMLDivElement | null>(null);\n const generatedListId = React.useId();\n const listId = `command-list-${generatedListId}`;\n\n const setSearch = React.useCallback(\n (value: string) => {\n if (!isControlled) {\n setUncontrolledSearch(value);\n }\n onSearchChange?.(value);\n },\n [isControlled, onSearchChange]\n );\n\n const registerItem = React.useCallback((id: string, registration: ItemRegistration) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.set(id, registration);\n return next;\n });\n }, []);\n\n const unregisterItem = React.useCallback((id: string) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n // Compute scores for all items\n const scores = React.useMemo(() => {\n const result = new Map<string, number>();\n for (const [id, registration] of items) {\n const score = filter(registration.value, search, registration.keywords);\n result.set(id, score);\n }\n return result;\n }, [items, search, filter]);\n\n const visibleCount = React.useMemo(() => {\n let count = 0;\n for (const score of scores.values()) {\n if (score > 0) count++;\n }\n return count;\n }, [scores]);\n\n // Reset active when search changes\n React.useEffect(() => {\n setActiveId(null);\n }, [search]);\n\n const contextValue = React.useMemo<CommandContextValue>(\n () => ({\n search,\n setSearch,\n filter,\n scores,\n registerItem,\n unregisterItem,\n activeId,\n setActiveId,\n loop,\n listRef,\n visibleCount,\n listId,\n }),\n [search, setSearch, filter, scores, registerItem, unregisterItem, activeId, loop, visibleCount, listId]\n );\n\n return (\n <CommandContext.Provider value={contextValue}>\n <div\n {...htmlProps}\n className={[styles.command, className].filter(Boolean).join(' ')}\n role=\"search\"\n >\n {children}\n </div>\n </CommandContext.Provider>\n );\n}\n\nfunction CommandInput({\n className,\n onChange,\n onKeyDown,\n ...htmlProps\n}: CommandInputProps) {\n const { search, setSearch, listRef, setActiveId, activeId, loop, listId } = useCommandContext();\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const getEnabledItems = React.useCallback(() => {\n const list = listRef.current;\n if (!list) return [];\n return Array.from(\n list.querySelectorAll<HTMLElement>('[data-command-item]:not([data-disabled=\"true\"])')\n ).filter((el) => el.style.display !== 'none');\n }, [listRef]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n const items = getEnabledItems();\n if (items.length === 0) return;\n\n const currentIndex = activeId\n ? items.findIndex((item) => item.id === activeId)\n : -1;\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[0].id);\n } else if (currentIndex < items.length - 1) {\n setActiveId(items[currentIndex + 1].id);\n } else if (loop) {\n setActiveId(items[0].id);\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[items.length - 1].id);\n } else if (currentIndex > 0) {\n setActiveId(items[currentIndex - 1].id);\n } else if (loop) {\n setActiveId(items[items.length - 1].id);\n }\n break;\n }\n case 'Home': {\n event.preventDefault();\n setActiveId(items[0].id);\n break;\n }\n case 'End': {\n event.preventDefault();\n setActiveId(items[items.length - 1].id);\n break;\n }\n case 'Enter': {\n event.preventDefault();\n if (activeId) {\n const activeItem = items.find((item) => item.id === activeId);\n if (activeItem) {\n activeItem.click();\n }\n }\n break;\n }\n }\n };\n\n return (\n <div className={styles.inputWrapper}>\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={true}\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={activeId ?? undefined}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n value={search}\n {...htmlProps}\n onChange={(e) => {\n onChange?.(e);\n if (e.defaultPrevented) return;\n setSearch(e.target.value);\n }}\n onKeyDown={handleKeyDown}\n className={[styles.input, className].filter(Boolean).join(' ')}\n />\n </div>\n );\n}\n\nfunction CommandList({ children, className, ...htmlProps }: CommandListProps) {\n const { listRef, listId } = useCommandContext();\n\n return (\n <div\n ref={listRef}\n {...htmlProps}\n id={listId}\n role=\"listbox\"\n className={[styles.list, className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandItem({\n children,\n value: valueProp,\n keywords,\n disabled = false,\n onItemSelect,\n className,\n onClick,\n onKeyDown,\n onMouseEnter,\n style,\n ...htmlProps\n}: CommandItemProps) {\n const { scores, registerItem, unregisterItem, activeId, setActiveId } = useCommandContext();\n const generatedId = React.useId();\n const itemId = (htmlProps.id as string | undefined) ?? `command-item-${generatedId}`;\n const itemRef = React.useRef<HTMLDivElement>(null);\n\n // Extract text content for filtering if no value prop\n const textValue = React.useMemo(() => {\n if (valueProp) return valueProp;\n return getTextContent(children).trim();\n }, [valueProp, children]);\n\n // Register with context\n React.useEffect(() => {\n registerItem(itemId, { value: textValue, keywords });\n return () => unregisterItem(itemId);\n }, [itemId, textValue, keywords, registerItem, unregisterItem]);\n\n const score = scores.get(itemId) ?? 1;\n const isVisible = score > 0;\n const isActive = activeId === itemId;\n\n // Scroll active item into view\n React.useEffect(() => {\n if (isActive && itemRef.current) {\n itemRef.current.scrollIntoView({ block: 'nearest' });\n }\n }, [isActive]);\n\n const activateItem = () => {\n if (disabled) return;\n onItemSelect?.();\n };\n\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n onClick?.(event);\n if (event.defaultPrevented) return;\n activateItem();\n };\n\n const handleMouseEnter = (event: React.MouseEvent<HTMLDivElement>) => {\n onMouseEnter?.(event);\n if (event.defaultPrevented) return;\n if (!disabled) {\n setActiveId(itemId);\n }\n };\n\n return (\n <div\n ref={itemRef}\n {...htmlProps}\n id={itemId}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={disabled}\n data-command-item=\"\"\n data-active={isActive || undefined}\n data-disabled={disabled || undefined}\n onClick={handleClick}\n onKeyDown={(e) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n activateItem();\n }\n }}\n onMouseEnter={handleMouseEnter}\n className={[\n styles.item,\n isActive && styles.itemActive,\n disabled && styles.itemDisabled,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ ...style, display: isVisible ? undefined : 'none' }}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandGroup({ children, heading, className, ...htmlProps }: CommandGroupProps) {\n const labelId = React.useId();\n const groupRef = React.useRef<HTMLDivElement>(null);\n const { scores } = useCommandContext();\n const [hasVisibleChildren, setHasVisibleChildren] = React.useState(true);\n\n // Check if any children are visible after each score update\n React.useEffect(() => {\n if (!groupRef.current) return;\n const items = groupRef.current.querySelectorAll<HTMLElement>('[data-command-item]');\n const anyVisible = Array.from(items).some((item) => item.style.display !== 'none');\n setHasVisibleChildren(anyVisible);\n }, [scores]);\n\n const { style, ...restHtmlProps } = htmlProps;\n\n return (\n <div\n ref={groupRef}\n {...restHtmlProps}\n role=\"group\"\n aria-labelledby={heading ? labelId : undefined}\n className={[styles.group, className].filter(Boolean).join(' ')}\n style={{ ...style, display: hasVisibleChildren ? undefined : 'none' }}\n >\n {heading && (\n <div id={labelId} className={styles.groupHeading}>\n {heading}\n </div>\n )}\n {children}\n </div>\n );\n}\n\nfunction CommandEmpty({ children, className, ...htmlProps }: CommandEmptyProps) {\n const { visibleCount } = useCommandContext();\n\n if (visibleCount > 0) return null;\n\n return (\n <div\n {...htmlProps}\n role=\"option\"\n aria-disabled=\"true\"\n aria-selected=\"false\"\n className={[styles.empty, className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandSeparator({ className, ...htmlProps }: CommandSeparatorProps) {\n return (\n <div\n {...htmlProps}\n role=\"separator\"\n className={[styles.separator, className].filter(Boolean).join(' ')}\n />\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Command = Object.assign(CommandRoot, {\n Input: CommandInput,\n List: CommandList,\n Item: CommandItem,\n Group: CommandGroup,\n Empty: CommandEmpty,\n Separator: CommandSeparator,\n});\n\nexport {\n CommandRoot,\n CommandInput,\n CommandList,\n CommandItem,\n CommandGroup,\n CommandEmpty,\n CommandSeparator,\n};\n"],"names":["React","jsxs","jsx","styles"],"mappings":"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"}
|
|
@@ -40,9 +40,9 @@ export interface CommandEmptyProps extends React.HTMLAttributes<HTMLDivElement>
|
|
|
40
40
|
}
|
|
41
41
|
export type CommandSeparatorProps = React.HTMLAttributes<HTMLDivElement>;
|
|
42
42
|
declare function CommandRoot({ children, search: controlledSearch, defaultSearch, onSearchChange, filter, loop, className, ...htmlProps }: CommandProps): import("react/jsx-runtime").JSX.Element;
|
|
43
|
-
declare function CommandInput({ className, ...htmlProps }: CommandInputProps): import("react/jsx-runtime").JSX.Element;
|
|
43
|
+
declare function CommandInput({ className, onChange, onKeyDown, ...htmlProps }: CommandInputProps): import("react/jsx-runtime").JSX.Element;
|
|
44
44
|
declare function CommandList({ children, className, ...htmlProps }: CommandListProps): import("react/jsx-runtime").JSX.Element;
|
|
45
|
-
declare function CommandItem({ children, value: valueProp, keywords, disabled, onItemSelect, className, ...htmlProps }: CommandItemProps): import("react/jsx-runtime").JSX.Element;
|
|
45
|
+
declare function CommandItem({ children, value: valueProp, keywords, disabled, onItemSelect, className, onClick, onKeyDown, onMouseEnter, style, ...htmlProps }: CommandItemProps): import("react/jsx-runtime").JSX.Element;
|
|
46
46
|
declare function CommandGroup({ children, heading, className, ...htmlProps }: CommandGroupProps): import("react/jsx-runtime").JSX.Element;
|
|
47
47
|
declare function CommandEmpty({ children, className, ...htmlProps }: CommandEmptyProps): import("react/jsx-runtime").JSX.Element | null;
|
|
48
48
|
declare function CommandSeparator({ className, ...htmlProps }: CommandSeparatorProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Command/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,MAAM,WAAW,YAAa,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACxE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C;wEACoE;IACpE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;IACxE,yDAAyD;IACzD,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,iBAAkB,SAAQ,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC;IACpF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAiB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC5E,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC;IAC9F,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAkB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC7E,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAkB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC7E,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,MAAM,MAAM,qBAAqB,GAAG,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Command/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,15 @@ function defaultFilter(value, search, keywords) {
|
|
|
13
13
|
}
|
|
14
14
|
return 0;
|
|
15
15
|
}
|
|
16
|
+
function getTextContent(node) {
|
|
17
|
+
if (typeof node === "string" || typeof node === "number") return String(node);
|
|
18
|
+
if (Array.isArray(node)) return node.map(getTextContent).join(" ");
|
|
19
|
+
if (React.isValidElement(node)) {
|
|
20
|
+
const childProps = node.props;
|
|
21
|
+
return getTextContent(childProps.children);
|
|
22
|
+
}
|
|
23
|
+
return "";
|
|
24
|
+
}
|
|
16
25
|
const CommandContext = React.createContext(null);
|
|
17
26
|
function useCommandContext() {
|
|
18
27
|
const ctx = React.useContext(CommandContext);
|
|
@@ -56,6 +65,8 @@ function CommandRoot({
|
|
|
56
65
|
const [items, setItems] = React.useState(/* @__PURE__ */ new Map());
|
|
57
66
|
const [activeId, setActiveId] = React.useState(null);
|
|
58
67
|
const listRef = React.useRef(null);
|
|
68
|
+
const generatedListId = React.useId();
|
|
69
|
+
const listId = `command-list-${generatedListId}`;
|
|
59
70
|
const setSearch = React.useCallback(
|
|
60
71
|
(value) => {
|
|
61
72
|
if (!isControlled) {
|
|
@@ -109,9 +120,10 @@ function CommandRoot({
|
|
|
109
120
|
setActiveId,
|
|
110
121
|
loop,
|
|
111
122
|
listRef,
|
|
112
|
-
visibleCount
|
|
123
|
+
visibleCount,
|
|
124
|
+
listId
|
|
113
125
|
}),
|
|
114
|
-
[search, setSearch, filter, scores, registerItem, unregisterItem, activeId, loop, visibleCount]
|
|
126
|
+
[search, setSearch, filter, scores, registerItem, unregisterItem, activeId, loop, visibleCount, listId]
|
|
115
127
|
);
|
|
116
128
|
return /* @__PURE__ */ jsx(CommandContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(
|
|
117
129
|
"div",
|
|
@@ -123,8 +135,13 @@ function CommandRoot({
|
|
|
123
135
|
}
|
|
124
136
|
) });
|
|
125
137
|
}
|
|
126
|
-
function CommandInput({
|
|
127
|
-
|
|
138
|
+
function CommandInput({
|
|
139
|
+
className,
|
|
140
|
+
onChange,
|
|
141
|
+
onKeyDown,
|
|
142
|
+
...htmlProps
|
|
143
|
+
}) {
|
|
144
|
+
const { search, setSearch, listRef, setActiveId, activeId, loop, listId } = useCommandContext();
|
|
128
145
|
const inputRef = React.useRef(null);
|
|
129
146
|
const getEnabledItems = React.useCallback(() => {
|
|
130
147
|
const list = listRef.current;
|
|
@@ -134,8 +151,7 @@ function CommandInput({ className, ...htmlProps }) {
|
|
|
134
151
|
).filter((el) => el.style.display !== "none");
|
|
135
152
|
}, [listRef]);
|
|
136
153
|
const handleKeyDown = (event) => {
|
|
137
|
-
|
|
138
|
-
(_a = htmlProps.onKeyDown) == null ? void 0 : _a.call(htmlProps, event);
|
|
154
|
+
onKeyDown == null ? void 0 : onKeyDown(event);
|
|
139
155
|
if (event.defaultPrevented) return;
|
|
140
156
|
const items = getEnabledItems();
|
|
141
157
|
if (items.length === 0) return;
|
|
@@ -194,31 +210,35 @@ function CommandInput({ className, ...htmlProps }) {
|
|
|
194
210
|
type: "text",
|
|
195
211
|
role: "combobox",
|
|
196
212
|
"aria-expanded": true,
|
|
197
|
-
"aria-controls":
|
|
213
|
+
"aria-controls": listId,
|
|
198
214
|
"aria-autocomplete": "list",
|
|
199
215
|
"aria-activedescendant": activeId ?? void 0,
|
|
200
216
|
autoComplete: "off",
|
|
201
217
|
autoCorrect: "off",
|
|
202
218
|
spellCheck: false,
|
|
203
219
|
value: search,
|
|
204
|
-
|
|
220
|
+
...htmlProps,
|
|
221
|
+
onChange: (e) => {
|
|
222
|
+
onChange == null ? void 0 : onChange(e);
|
|
223
|
+
if (e.defaultPrevented) return;
|
|
224
|
+
setSearch(e.target.value);
|
|
225
|
+
},
|
|
205
226
|
onKeyDown: handleKeyDown,
|
|
206
|
-
className: [styles.input, className].filter(Boolean).join(" ")
|
|
207
|
-
...htmlProps
|
|
227
|
+
className: [styles.input, className].filter(Boolean).join(" ")
|
|
208
228
|
}
|
|
209
229
|
)
|
|
210
230
|
] });
|
|
211
231
|
}
|
|
212
232
|
function CommandList({ children, className, ...htmlProps }) {
|
|
213
|
-
const { listRef } = useCommandContext();
|
|
233
|
+
const { listRef, listId } = useCommandContext();
|
|
214
234
|
return /* @__PURE__ */ jsx(
|
|
215
235
|
"div",
|
|
216
236
|
{
|
|
217
237
|
ref: listRef,
|
|
218
|
-
|
|
238
|
+
...htmlProps,
|
|
239
|
+
id: listId,
|
|
219
240
|
role: "listbox",
|
|
220
241
|
className: [styles.list, className].filter(Boolean).join(" "),
|
|
221
|
-
...htmlProps,
|
|
222
242
|
children
|
|
223
243
|
}
|
|
224
244
|
);
|
|
@@ -230,6 +250,10 @@ function CommandItem({
|
|
|
230
250
|
disabled = false,
|
|
231
251
|
onItemSelect,
|
|
232
252
|
className,
|
|
253
|
+
onClick,
|
|
254
|
+
onKeyDown,
|
|
255
|
+
onMouseEnter,
|
|
256
|
+
style,
|
|
233
257
|
...htmlProps
|
|
234
258
|
}) {
|
|
235
259
|
const { scores, registerItem, unregisterItem, activeId, setActiveId } = useCommandContext();
|
|
@@ -238,8 +262,7 @@ function CommandItem({
|
|
|
238
262
|
const itemRef = React.useRef(null);
|
|
239
263
|
const textValue = React.useMemo(() => {
|
|
240
264
|
if (valueProp) return valueProp;
|
|
241
|
-
|
|
242
|
-
return "";
|
|
265
|
+
return getTextContent(children).trim();
|
|
243
266
|
}, [valueProp, children]);
|
|
244
267
|
React.useEffect(() => {
|
|
245
268
|
registerItem(itemId, { value: textValue, keywords });
|
|
@@ -253,11 +276,18 @@ function CommandItem({
|
|
|
253
276
|
itemRef.current.scrollIntoView({ block: "nearest" });
|
|
254
277
|
}
|
|
255
278
|
}, [isActive]);
|
|
256
|
-
const
|
|
279
|
+
const activateItem = () => {
|
|
257
280
|
if (disabled) return;
|
|
258
281
|
onItemSelect == null ? void 0 : onItemSelect();
|
|
259
282
|
};
|
|
260
|
-
const
|
|
283
|
+
const handleClick = (event) => {
|
|
284
|
+
onClick == null ? void 0 : onClick(event);
|
|
285
|
+
if (event.defaultPrevented) return;
|
|
286
|
+
activateItem();
|
|
287
|
+
};
|
|
288
|
+
const handleMouseEnter = (event) => {
|
|
289
|
+
onMouseEnter == null ? void 0 : onMouseEnter(event);
|
|
290
|
+
if (event.defaultPrevented) return;
|
|
261
291
|
if (!disabled) {
|
|
262
292
|
setActiveId(itemId);
|
|
263
293
|
}
|
|
@@ -276,9 +306,11 @@ function CommandItem({
|
|
|
276
306
|
"data-disabled": disabled || void 0,
|
|
277
307
|
onClick: handleClick,
|
|
278
308
|
onKeyDown: (e) => {
|
|
309
|
+
onKeyDown == null ? void 0 : onKeyDown(e);
|
|
310
|
+
if (e.defaultPrevented) return;
|
|
279
311
|
if (e.key === "Enter" || e.key === " ") {
|
|
280
312
|
e.preventDefault();
|
|
281
|
-
|
|
313
|
+
activateItem();
|
|
282
314
|
}
|
|
283
315
|
},
|
|
284
316
|
onMouseEnter: handleMouseEnter,
|
|
@@ -288,7 +320,7 @@ function CommandItem({
|
|
|
288
320
|
disabled && styles.itemDisabled,
|
|
289
321
|
className
|
|
290
322
|
].filter(Boolean).join(" "),
|
|
291
|
-
style: { display: isVisible ? void 0 : "none" },
|
|
323
|
+
style: { ...style, display: isVisible ? void 0 : "none" },
|
|
292
324
|
children
|
|
293
325
|
}
|
|
294
326
|
);
|
|
@@ -304,15 +336,16 @@ function CommandGroup({ children, heading, className, ...htmlProps }) {
|
|
|
304
336
|
const anyVisible = Array.from(items).some((item) => item.style.display !== "none");
|
|
305
337
|
setHasVisibleChildren(anyVisible);
|
|
306
338
|
}, [scores]);
|
|
339
|
+
const { style, ...restHtmlProps } = htmlProps;
|
|
307
340
|
return /* @__PURE__ */ jsxs(
|
|
308
341
|
"div",
|
|
309
342
|
{
|
|
310
343
|
ref: groupRef,
|
|
311
|
-
...
|
|
344
|
+
...restHtmlProps,
|
|
312
345
|
role: "group",
|
|
313
346
|
"aria-labelledby": heading ? labelId : void 0,
|
|
314
347
|
className: [styles.group, className].filter(Boolean).join(" "),
|
|
315
|
-
style: { display: hasVisibleChildren ? void 0 : "none" },
|
|
348
|
+
style: { ...style, display: hasVisibleChildren ? void 0 : "none" },
|
|
316
349
|
children: [
|
|
317
350
|
heading && /* @__PURE__ */ jsx("div", { id: labelId, className: styles.groupHeading, children: heading }),
|
|
318
351
|
children
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/Command/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Command.module.scss';\n\n// ============================================\n// Types\n// ============================================\n\nexport interface CommandProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Controlled search value */\n search?: string;\n /** Default search value */\n defaultSearch?: string;\n /** Called when search input changes */\n onSearchChange?: (search: string) => void;\n /** Custom filter function. Return 0 to hide, >0 to show (higher = better match).\n Default: case-insensitive substring match on value + keywords */\n filter?: (value: string, search: string, keywords?: string[]) => number;\n /** Whether to loop keyboard navigation. Default: true */\n loop?: boolean;\n}\n\nexport interface CommandInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n className?: string;\n}\n\nexport interface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport interface CommandItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n children: React.ReactNode;\n /** Value used for filtering (falls back to text content) */\n value?: string;\n /** Extra keywords for filtering */\n keywords?: string[];\n /** Whether this item is disabled */\n disabled?: boolean;\n /** Called when item is selected (Enter or click) */\n onItemSelect?: () => void;\n}\n\nexport interface CommandGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Group heading text */\n heading?: string;\n}\n\nexport interface CommandEmptyProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport type CommandSeparatorProps = React.HTMLAttributes<HTMLDivElement>;\n\n// ============================================\n// Default filter\n// ============================================\n\nfunction defaultFilter(value: string, search: string, keywords?: string[]): number {\n if (!search) return 1;\n const searchLower = search.toLowerCase();\n const valueLower = value.toLowerCase();\n\n if (valueLower.includes(searchLower)) return 1;\n\n if (keywords) {\n for (const keyword of keywords) {\n if (keyword.toLowerCase().includes(searchLower)) return 1;\n }\n }\n\n return 0;\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface ItemRegistration {\n value: string;\n keywords?: string[];\n}\n\ninterface CommandContextValue {\n search: string;\n setSearch: (search: string) => void;\n filter: (value: string, search: string, keywords?: string[]) => number;\n scores: Map<string, number>;\n registerItem: (id: string, registration: ItemRegistration) => void;\n unregisterItem: (id: string) => void;\n activeId: string | null;\n setActiveId: (id: string | null) => void;\n loop: boolean;\n listRef: React.RefObject<HTMLDivElement | null>;\n visibleCount: number;\n}\n\nconst CommandContext = React.createContext<CommandContextValue | null>(null);\n\nfunction useCommandContext() {\n const ctx = React.useContext(CommandContext);\n if (!ctx) throw new Error('Command sub-components must be used within <Command>');\n return ctx;\n}\n\n// ============================================\n// Search Icon\n// ============================================\n\nfunction SearchIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\n// ============================================\n// Components\n// ============================================\n\nfunction CommandRoot({\n children,\n search: controlledSearch,\n defaultSearch = '',\n onSearchChange,\n filter = defaultFilter,\n loop = true,\n className,\n ...htmlProps\n}: CommandProps) {\n const [uncontrolledSearch, setUncontrolledSearch] = React.useState(defaultSearch);\n const isControlled = controlledSearch !== undefined;\n const search = isControlled ? controlledSearch : uncontrolledSearch;\n\n const [items, setItems] = React.useState<Map<string, ItemRegistration>>(new Map());\n const [activeId, setActiveId] = React.useState<string | null>(null);\n const listRef = React.useRef<HTMLDivElement | null>(null);\n\n const setSearch = React.useCallback(\n (value: string) => {\n if (!isControlled) {\n setUncontrolledSearch(value);\n }\n onSearchChange?.(value);\n },\n [isControlled, onSearchChange]\n );\n\n const registerItem = React.useCallback((id: string, registration: ItemRegistration) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.set(id, registration);\n return next;\n });\n }, []);\n\n const unregisterItem = React.useCallback((id: string) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n // Compute scores for all items\n const scores = React.useMemo(() => {\n const result = new Map<string, number>();\n for (const [id, registration] of items) {\n const score = filter(registration.value, search, registration.keywords);\n result.set(id, score);\n }\n return result;\n }, [items, search, filter]);\n\n const visibleCount = React.useMemo(() => {\n let count = 0;\n for (const score of scores.values()) {\n if (score > 0) count++;\n }\n return count;\n }, [scores]);\n\n // Reset active when search changes\n React.useEffect(() => {\n setActiveId(null);\n }, [search]);\n\n const contextValue = React.useMemo<CommandContextValue>(\n () => ({\n search,\n setSearch,\n filter,\n scores,\n registerItem,\n unregisterItem,\n activeId,\n setActiveId,\n loop,\n listRef,\n visibleCount,\n }),\n [search, setSearch, filter, scores, registerItem, unregisterItem, activeId, loop, visibleCount]\n );\n\n return (\n <CommandContext.Provider value={contextValue}>\n <div\n {...htmlProps}\n className={[styles.command, className].filter(Boolean).join(' ')}\n role=\"search\"\n >\n {children}\n </div>\n </CommandContext.Provider>\n );\n}\n\nfunction CommandInput({ className, ...htmlProps }: CommandInputProps) {\n const { search, setSearch, listRef, setActiveId, activeId, loop } = useCommandContext();\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const getEnabledItems = React.useCallback(() => {\n const list = listRef.current;\n if (!list) return [];\n return Array.from(\n list.querySelectorAll<HTMLElement>('[data-command-item]:not([data-disabled=\"true\"])')\n ).filter((el) => el.style.display !== 'none');\n }, [listRef]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n htmlProps.onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n const items = getEnabledItems();\n if (items.length === 0) return;\n\n const currentIndex = activeId\n ? items.findIndex((item) => item.id === activeId)\n : -1;\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[0].id);\n } else if (currentIndex < items.length - 1) {\n setActiveId(items[currentIndex + 1].id);\n } else if (loop) {\n setActiveId(items[0].id);\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[items.length - 1].id);\n } else if (currentIndex > 0) {\n setActiveId(items[currentIndex - 1].id);\n } else if (loop) {\n setActiveId(items[items.length - 1].id);\n }\n break;\n }\n case 'Home': {\n event.preventDefault();\n setActiveId(items[0].id);\n break;\n }\n case 'End': {\n event.preventDefault();\n setActiveId(items[items.length - 1].id);\n break;\n }\n case 'Enter': {\n event.preventDefault();\n if (activeId) {\n const activeItem = items.find((item) => item.id === activeId);\n if (activeItem) {\n activeItem.click();\n }\n }\n break;\n }\n }\n };\n\n return (\n <div className={styles.inputWrapper}>\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={true}\n aria-controls=\"command-list\"\n aria-autocomplete=\"list\"\n aria-activedescendant={activeId ?? undefined}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onKeyDown={handleKeyDown}\n className={[styles.input, className].filter(Boolean).join(' ')}\n {...htmlProps}\n />\n </div>\n );\n}\n\nfunction CommandList({ children, className, ...htmlProps }: CommandListProps) {\n const { listRef } = useCommandContext();\n\n return (\n <div\n ref={listRef}\n id=\"command-list\"\n role=\"listbox\"\n className={[styles.list, className].filter(Boolean).join(' ')}\n {...htmlProps}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandItem({\n children,\n value: valueProp,\n keywords,\n disabled = false,\n onItemSelect,\n className,\n ...htmlProps\n}: CommandItemProps) {\n const { scores, registerItem, unregisterItem, activeId, setActiveId } = useCommandContext();\n const generatedId = React.useId();\n const itemId = (htmlProps.id as string | undefined) ?? `command-item-${generatedId}`;\n const itemRef = React.useRef<HTMLDivElement>(null);\n\n // Extract text content for filtering if no value prop\n const textValue = React.useMemo(() => {\n if (valueProp) return valueProp;\n if (typeof children === 'string') return children;\n return '';\n }, [valueProp, children]);\n\n // Register with context\n React.useEffect(() => {\n registerItem(itemId, { value: textValue, keywords });\n return () => unregisterItem(itemId);\n }, [itemId, textValue, keywords, registerItem, unregisterItem]);\n\n const score = scores.get(itemId) ?? 1;\n const isVisible = score > 0;\n const isActive = activeId === itemId;\n\n // Scroll active item into view\n React.useEffect(() => {\n if (isActive && itemRef.current) {\n itemRef.current.scrollIntoView({ block: 'nearest' });\n }\n }, [isActive]);\n\n const handleClick = () => {\n if (disabled) return;\n onItemSelect?.();\n };\n\n const handleMouseEnter = () => {\n if (!disabled) {\n setActiveId(itemId);\n }\n };\n\n return (\n <div\n ref={itemRef}\n {...htmlProps}\n id={itemId}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={disabled}\n data-command-item=\"\"\n data-active={isActive || undefined}\n data-disabled={disabled || undefined}\n onClick={handleClick}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleClick(); } }}\n onMouseEnter={handleMouseEnter}\n className={[\n styles.item,\n isActive && styles.itemActive,\n disabled && styles.itemDisabled,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ display: isVisible ? undefined : 'none' }}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandGroup({ children, heading, className, ...htmlProps }: CommandGroupProps) {\n const labelId = React.useId();\n const groupRef = React.useRef<HTMLDivElement>(null);\n const { scores } = useCommandContext();\n const [hasVisibleChildren, setHasVisibleChildren] = React.useState(true);\n\n // Check if any children are visible after each score update\n React.useEffect(() => {\n if (!groupRef.current) return;\n const items = groupRef.current.querySelectorAll<HTMLElement>('[data-command-item]');\n const anyVisible = Array.from(items).some((item) => item.style.display !== 'none');\n setHasVisibleChildren(anyVisible);\n }, [scores]);\n\n return (\n <div\n ref={groupRef}\n {...htmlProps}\n role=\"group\"\n aria-labelledby={heading ? labelId : undefined}\n className={[styles.group, className].filter(Boolean).join(' ')}\n style={{ display: hasVisibleChildren ? undefined : 'none' }}\n >\n {heading && (\n <div id={labelId} className={styles.groupHeading}>\n {heading}\n </div>\n )}\n {children}\n </div>\n );\n}\n\nfunction CommandEmpty({ children, className, ...htmlProps }: CommandEmptyProps) {\n const { visibleCount } = useCommandContext();\n\n if (visibleCount > 0) return null;\n\n return (\n <div\n {...htmlProps}\n role=\"option\"\n aria-disabled=\"true\"\n aria-selected=\"false\"\n className={[styles.empty, className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandSeparator({ className, ...htmlProps }: CommandSeparatorProps) {\n return (\n <div\n {...htmlProps}\n role=\"separator\"\n className={[styles.separator, className].filter(Boolean).join(' ')}\n />\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Command = Object.assign(CommandRoot, {\n Input: CommandInput,\n List: CommandList,\n Item: CommandItem,\n Group: CommandGroup,\n Empty: CommandEmpty,\n Separator: CommandSeparator,\n});\n\nexport {\n CommandRoot,\n CommandInput,\n CommandList,\n CommandItem,\n CommandGroup,\n CommandEmpty,\n CommandSeparator,\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/Command/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Command.module.scss';\n\n// ============================================\n// Types\n// ============================================\n\nexport interface CommandProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Controlled search value */\n search?: string;\n /** Default search value */\n defaultSearch?: string;\n /** Called when search input changes */\n onSearchChange?: (search: string) => void;\n /** Custom filter function. Return 0 to hide, >0 to show (higher = better match).\n Default: case-insensitive substring match on value + keywords */\n filter?: (value: string, search: string, keywords?: string[]) => number;\n /** Whether to loop keyboard navigation. Default: true */\n loop?: boolean;\n}\n\nexport interface CommandInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n className?: string;\n}\n\nexport interface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport interface CommandItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n children: React.ReactNode;\n /** Value used for filtering (falls back to text content) */\n value?: string;\n /** Extra keywords for filtering */\n keywords?: string[];\n /** Whether this item is disabled */\n disabled?: boolean;\n /** Called when item is selected (Enter or click) */\n onItemSelect?: () => void;\n}\n\nexport interface CommandGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Group heading text */\n heading?: string;\n}\n\nexport interface CommandEmptyProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport type CommandSeparatorProps = React.HTMLAttributes<HTMLDivElement>;\n\n// ============================================\n// Default filter\n// ============================================\n\nfunction defaultFilter(value: string, search: string, keywords?: string[]): number {\n if (!search) return 1;\n const searchLower = search.toLowerCase();\n const valueLower = value.toLowerCase();\n\n if (valueLower.includes(searchLower)) return 1;\n\n if (keywords) {\n for (const keyword of keywords) {\n if (keyword.toLowerCase().includes(searchLower)) return 1;\n }\n }\n\n return 0;\n}\n\nfunction getTextContent(node: React.ReactNode): string {\n if (typeof node === 'string' || typeof node === 'number') return String(node);\n if (Array.isArray(node)) return node.map(getTextContent).join(' ');\n if (React.isValidElement(node)) {\n const childProps = node.props as { children?: React.ReactNode };\n return getTextContent(childProps.children);\n }\n return '';\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface ItemRegistration {\n value: string;\n keywords?: string[];\n}\n\ninterface CommandContextValue {\n search: string;\n setSearch: (search: string) => void;\n filter: (value: string, search: string, keywords?: string[]) => number;\n scores: Map<string, number>;\n registerItem: (id: string, registration: ItemRegistration) => void;\n unregisterItem: (id: string) => void;\n activeId: string | null;\n setActiveId: (id: string | null) => void;\n loop: boolean;\n listRef: React.RefObject<HTMLDivElement | null>;\n visibleCount: number;\n listId: string;\n}\n\nconst CommandContext = React.createContext<CommandContextValue | null>(null);\n\nfunction useCommandContext() {\n const ctx = React.useContext(CommandContext);\n if (!ctx) throw new Error('Command sub-components must be used within <Command>');\n return ctx;\n}\n\n// ============================================\n// Search Icon\n// ============================================\n\nfunction SearchIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\n// ============================================\n// Components\n// ============================================\n\nfunction CommandRoot({\n children,\n search: controlledSearch,\n defaultSearch = '',\n onSearchChange,\n filter = defaultFilter,\n loop = true,\n className,\n ...htmlProps\n}: CommandProps) {\n const [uncontrolledSearch, setUncontrolledSearch] = React.useState(defaultSearch);\n const isControlled = controlledSearch !== undefined;\n const search = isControlled ? controlledSearch : uncontrolledSearch;\n\n const [items, setItems] = React.useState<Map<string, ItemRegistration>>(new Map());\n const [activeId, setActiveId] = React.useState<string | null>(null);\n const listRef = React.useRef<HTMLDivElement | null>(null);\n const generatedListId = React.useId();\n const listId = `command-list-${generatedListId}`;\n\n const setSearch = React.useCallback(\n (value: string) => {\n if (!isControlled) {\n setUncontrolledSearch(value);\n }\n onSearchChange?.(value);\n },\n [isControlled, onSearchChange]\n );\n\n const registerItem = React.useCallback((id: string, registration: ItemRegistration) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.set(id, registration);\n return next;\n });\n }, []);\n\n const unregisterItem = React.useCallback((id: string) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n // Compute scores for all items\n const scores = React.useMemo(() => {\n const result = new Map<string, number>();\n for (const [id, registration] of items) {\n const score = filter(registration.value, search, registration.keywords);\n result.set(id, score);\n }\n return result;\n }, [items, search, filter]);\n\n const visibleCount = React.useMemo(() => {\n let count = 0;\n for (const score of scores.values()) {\n if (score > 0) count++;\n }\n return count;\n }, [scores]);\n\n // Reset active when search changes\n React.useEffect(() => {\n setActiveId(null);\n }, [search]);\n\n const contextValue = React.useMemo<CommandContextValue>(\n () => ({\n search,\n setSearch,\n filter,\n scores,\n registerItem,\n unregisterItem,\n activeId,\n setActiveId,\n loop,\n listRef,\n visibleCount,\n listId,\n }),\n [search, setSearch, filter, scores, registerItem, unregisterItem, activeId, loop, visibleCount, listId]\n );\n\n return (\n <CommandContext.Provider value={contextValue}>\n <div\n {...htmlProps}\n className={[styles.command, className].filter(Boolean).join(' ')}\n role=\"search\"\n >\n {children}\n </div>\n </CommandContext.Provider>\n );\n}\n\nfunction CommandInput({\n className,\n onChange,\n onKeyDown,\n ...htmlProps\n}: CommandInputProps) {\n const { search, setSearch, listRef, setActiveId, activeId, loop, listId } = useCommandContext();\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const getEnabledItems = React.useCallback(() => {\n const list = listRef.current;\n if (!list) return [];\n return Array.from(\n list.querySelectorAll<HTMLElement>('[data-command-item]:not([data-disabled=\"true\"])')\n ).filter((el) => el.style.display !== 'none');\n }, [listRef]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n const items = getEnabledItems();\n if (items.length === 0) return;\n\n const currentIndex = activeId\n ? items.findIndex((item) => item.id === activeId)\n : -1;\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[0].id);\n } else if (currentIndex < items.length - 1) {\n setActiveId(items[currentIndex + 1].id);\n } else if (loop) {\n setActiveId(items[0].id);\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[items.length - 1].id);\n } else if (currentIndex > 0) {\n setActiveId(items[currentIndex - 1].id);\n } else if (loop) {\n setActiveId(items[items.length - 1].id);\n }\n break;\n }\n case 'Home': {\n event.preventDefault();\n setActiveId(items[0].id);\n break;\n }\n case 'End': {\n event.preventDefault();\n setActiveId(items[items.length - 1].id);\n break;\n }\n case 'Enter': {\n event.preventDefault();\n if (activeId) {\n const activeItem = items.find((item) => item.id === activeId);\n if (activeItem) {\n activeItem.click();\n }\n }\n break;\n }\n }\n };\n\n return (\n <div className={styles.inputWrapper}>\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={true}\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={activeId ?? undefined}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n value={search}\n {...htmlProps}\n onChange={(e) => {\n onChange?.(e);\n if (e.defaultPrevented) return;\n setSearch(e.target.value);\n }}\n onKeyDown={handleKeyDown}\n className={[styles.input, className].filter(Boolean).join(' ')}\n />\n </div>\n );\n}\n\nfunction CommandList({ children, className, ...htmlProps }: CommandListProps) {\n const { listRef, listId } = useCommandContext();\n\n return (\n <div\n ref={listRef}\n {...htmlProps}\n id={listId}\n role=\"listbox\"\n className={[styles.list, className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandItem({\n children,\n value: valueProp,\n keywords,\n disabled = false,\n onItemSelect,\n className,\n onClick,\n onKeyDown,\n onMouseEnter,\n style,\n ...htmlProps\n}: CommandItemProps) {\n const { scores, registerItem, unregisterItem, activeId, setActiveId } = useCommandContext();\n const generatedId = React.useId();\n const itemId = (htmlProps.id as string | undefined) ?? `command-item-${generatedId}`;\n const itemRef = React.useRef<HTMLDivElement>(null);\n\n // Extract text content for filtering if no value prop\n const textValue = React.useMemo(() => {\n if (valueProp) return valueProp;\n return getTextContent(children).trim();\n }, [valueProp, children]);\n\n // Register with context\n React.useEffect(() => {\n registerItem(itemId, { value: textValue, keywords });\n return () => unregisterItem(itemId);\n }, [itemId, textValue, keywords, registerItem, unregisterItem]);\n\n const score = scores.get(itemId) ?? 1;\n const isVisible = score > 0;\n const isActive = activeId === itemId;\n\n // Scroll active item into view\n React.useEffect(() => {\n if (isActive && itemRef.current) {\n itemRef.current.scrollIntoView({ block: 'nearest' });\n }\n }, [isActive]);\n\n const activateItem = () => {\n if (disabled) return;\n onItemSelect?.();\n };\n\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n onClick?.(event);\n if (event.defaultPrevented) return;\n activateItem();\n };\n\n const handleMouseEnter = (event: React.MouseEvent<HTMLDivElement>) => {\n onMouseEnter?.(event);\n if (event.defaultPrevented) return;\n if (!disabled) {\n setActiveId(itemId);\n }\n };\n\n return (\n <div\n ref={itemRef}\n {...htmlProps}\n id={itemId}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={disabled}\n data-command-item=\"\"\n data-active={isActive || undefined}\n data-disabled={disabled || undefined}\n onClick={handleClick}\n onKeyDown={(e) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n activateItem();\n }\n }}\n onMouseEnter={handleMouseEnter}\n className={[\n styles.item,\n isActive && styles.itemActive,\n disabled && styles.itemDisabled,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ ...style, display: isVisible ? undefined : 'none' }}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandGroup({ children, heading, className, ...htmlProps }: CommandGroupProps) {\n const labelId = React.useId();\n const groupRef = React.useRef<HTMLDivElement>(null);\n const { scores } = useCommandContext();\n const [hasVisibleChildren, setHasVisibleChildren] = React.useState(true);\n\n // Check if any children are visible after each score update\n React.useEffect(() => {\n if (!groupRef.current) return;\n const items = groupRef.current.querySelectorAll<HTMLElement>('[data-command-item]');\n const anyVisible = Array.from(items).some((item) => item.style.display !== 'none');\n setHasVisibleChildren(anyVisible);\n }, [scores]);\n\n const { style, ...restHtmlProps } = htmlProps;\n\n return (\n <div\n ref={groupRef}\n {...restHtmlProps}\n role=\"group\"\n aria-labelledby={heading ? labelId : undefined}\n className={[styles.group, className].filter(Boolean).join(' ')}\n style={{ ...style, display: hasVisibleChildren ? undefined : 'none' }}\n >\n {heading && (\n <div id={labelId} className={styles.groupHeading}>\n {heading}\n </div>\n )}\n {children}\n </div>\n );\n}\n\nfunction CommandEmpty({ children, className, ...htmlProps }: CommandEmptyProps) {\n const { visibleCount } = useCommandContext();\n\n if (visibleCount > 0) return null;\n\n return (\n <div\n {...htmlProps}\n role=\"option\"\n aria-disabled=\"true\"\n aria-selected=\"false\"\n className={[styles.empty, className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandSeparator({ className, ...htmlProps }: CommandSeparatorProps) {\n return (\n <div\n {...htmlProps}\n role=\"separator\"\n className={[styles.separator, className].filter(Boolean).join(' ')}\n />\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Command = Object.assign(CommandRoot, {\n Input: CommandInput,\n List: CommandList,\n Item: CommandItem,\n Group: CommandGroup,\n Empty: CommandEmpty,\n Separator: CommandSeparator,\n});\n\nexport {\n CommandRoot,\n CommandInput,\n CommandList,\n CommandItem,\n CommandGroup,\n CommandEmpty,\n CommandSeparator,\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -174,7 +174,19 @@ function DataTableRoot({
|
|
|
174
174
|
className
|
|
175
175
|
].filter(Boolean).join(" ");
|
|
176
176
|
if (isEmpty) {
|
|
177
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: DataTable_module.default.
|
|
177
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: [DataTable_module.default.wrapper, bordered && DataTable_module.default.bordered].filter(Boolean).join(" "), children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
178
|
+
"table",
|
|
179
|
+
{
|
|
180
|
+
...htmlProps,
|
|
181
|
+
className: rootClasses,
|
|
182
|
+
"aria-label": ariaLabel,
|
|
183
|
+
"aria-describedby": ariaDescribedBy,
|
|
184
|
+
children: [
|
|
185
|
+
caption && /* @__PURE__ */ jsxRuntime.jsx("caption", { className: captionHidden ? DataTable_module.default.captionHidden : DataTable_module.default.caption, children: caption }),
|
|
186
|
+
/* @__PURE__ */ jsxRuntime.jsx("tbody", { className: DataTable_module.default.tbody, children: /* @__PURE__ */ jsxRuntime.jsx("tr", { className: DataTable_module.default.row, children: /* @__PURE__ */ jsxRuntime.jsx("td", { className: DataTable_module.default.td, colSpan: Math.max(columns.length, 1), children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: DataTable_module.default.emptyState, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: DataTable_module.default.emptyMessage, children: emptyMessage }) }) }) }) })
|
|
187
|
+
]
|
|
188
|
+
}
|
|
189
|
+
) });
|
|
178
190
|
}
|
|
179
191
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: [DataTable_module.default.wrapper, bordered && DataTable_module.default.bordered].filter(Boolean).join(" "), children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
180
192
|
"table",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/components/DataTable/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\n// Import globals to ensure CSS variables are defined\nimport '../../styles/globals.scss';\nimport styles from './DataTable.module.scss';\nimport { Checkbox } from '../Checkbox';\n\n// ============================================\n// Types (self-owned — no external dependency for types)\n// ============================================\n\n/** Column definition compatible with @tanstack/react-table */\nexport type ColumnDef<TData = unknown, TValue = unknown> = {\n id?: string;\n accessorKey?: string;\n accessorFn?: (row: TData) => TValue;\n header?: string | ((context: any) => React.ReactNode);\n cell?: string | ((context: any) => React.ReactNode);\n size?: number;\n minSize?: number;\n maxSize?: number;\n enableSorting?: boolean;\n [key: string]: unknown;\n};\n\nexport type SortingState = Array<{ id: string; desc: boolean }>;\nexport type RowSelectionState = Record<string, boolean>;\nexport type ExpandedState = true | Record<string, boolean>;\ntype OnChangeFn<T> = ((updaterOrValue: T | ((prev: T) => T)) => void);\n\nexport type DataTableColumn<T> = ColumnDef<T, unknown>;\n\n// ============================================\n// Lazy-loaded dependency (@tanstack/react-table)\n// ============================================\n\nlet _useReactTable: any = null;\nlet _getCoreRowModel: any = null;\nlet _getSortedRowModel: any = null;\nlet _getExpandedRowModel: any = null;\nlet _flexRender: any = null;\nlet _tableLoaded = false;\nlet _tableFailed = false;\n\nfunction loadTableDeps() {\n if (_tableLoaded) return;\n _tableLoaded = true;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const rt = require('@tanstack/react-table');\n _useReactTable = rt.useReactTable;\n _getCoreRowModel = rt.getCoreRowModel;\n _getSortedRowModel = rt.getSortedRowModel;\n _getExpandedRowModel = rt.getExpandedRowModel;\n _flexRender = rt.flexRender;\n } catch {\n _tableFailed = true;\n }\n}\n\nexport interface DataTableProps<T> extends Omit<React.HTMLAttributes<HTMLTableElement>, 'onClick'> {\n /** Column definitions */\n columns: DataTableColumn<T>[];\n /** Data array */\n data: T[];\n /** Unique key extractor for each row */\n getRowId?: (row: T) => string;\n /** Enable sorting */\n sortable?: boolean;\n /** Controlled sorting state */\n sorting?: SortingState;\n /** Sorting change handler */\n onSortingChange?: OnChangeFn<SortingState>;\n /** Enable row selection */\n selectable?: boolean;\n /** Show checkbox column for row selection */\n showCheckbox?: boolean;\n /** Controlled selection state */\n rowSelection?: RowSelectionState;\n /** Selection change handler */\n onRowSelectionChange?: OnChangeFn<RowSelectionState>;\n /** Row click handler */\n onRowClick?: (row: T) => void;\n /** Extract sub-rows from a row for expandable tree tables */\n getSubRows?: (row: T) => T[] | undefined;\n /** Controlled expanded state */\n expanded?: ExpandedState;\n /** Expanded state change handler */\n onExpandedChange?: OnChangeFn<ExpandedState>;\n /** Empty state message */\n emptyMessage?: string;\n /** Size variant */\n size?: 'sm' | 'md';\n /** Visible caption for the table (recommended for accessibility) */\n caption?: string;\n /** Hide the caption visually but keep it for screen readers */\n captionHidden?: boolean;\n /** Show alternating row backgrounds */\n striped?: boolean;\n /** Wrap table in a bordered container */\n bordered?: boolean;\n}\n\nfunction getColumnSizeStyle(\n column: {\n getSize: () => number;\n columnDef: { size?: number; minSize?: number; maxSize?: number };\n }\n): React.CSSProperties | undefined {\n const { size, minSize, maxSize } = column.columnDef;\n const hasExplicitSize = size !== undefined || minSize !== undefined || maxSize !== undefined;\n\n if (!hasExplicitSize) {\n return undefined;\n }\n\n const resolvedSize = column.getSize();\n\n return {\n width: resolvedSize,\n minWidth: minSize ?? resolvedSize,\n maxWidth: maxSize ?? resolvedSize,\n };\n}\n\nfunction isInteractiveTarget(\n target: EventTarget | null,\n currentTarget: HTMLTableRowElement\n) {\n if (!(target instanceof Element)) return false;\n\n const interactiveElement = target.closest(\n 'button, a, input, select, textarea, [role=\"button\"], [role=\"link\"], [role=\"checkbox\"], [role=\"switch\"]'\n );\n\n return Boolean(interactiveElement && currentTarget.contains(interactiveElement));\n}\n\nfunction DataTableRoot<T>({\n columns: userColumns,\n data,\n getRowId,\n sortable = false,\n sorting: controlledSorting,\n onSortingChange,\n selectable = false,\n showCheckbox = false,\n rowSelection: controlledRowSelection,\n onRowSelectionChange,\n onRowClick,\n getSubRows,\n expanded: controlledExpanded,\n onExpandedChange,\n emptyMessage = 'No data available',\n size = 'md',\n className,\n caption,\n captionHidden = false,\n striped = false,\n bordered = false,\n 'aria-label': ariaLabel,\n 'aria-describedby': ariaDescribedBy,\n ...htmlProps\n}: DataTableProps<T>) {\n loadTableDeps();\n\n // Internal sorting state when uncontrolled\n const [internalSorting, setInternalSorting] = React.useState<SortingState>([]);\n const sorting = controlledSorting ?? internalSorting;\n const handleSortingChange = onSortingChange ?? setInternalSorting;\n\n // Internal selection state when uncontrolled\n const [internalRowSelection, setInternalRowSelection] = React.useState<RowSelectionState>({});\n const rowSelection = controlledRowSelection ?? internalRowSelection;\n const handleRowSelectionChange = onRowSelectionChange ?? setInternalRowSelection;\n\n // Internal expanded state when uncontrolled\n const [internalExpanded, setInternalExpanded] = React.useState<ExpandedState>({});\n const expanded = controlledExpanded ?? internalExpanded;\n const handleExpandedChange = onExpandedChange ?? setInternalExpanded;\n\n // Build columns with optional checkbox prepended\n const columns = React.useMemo(() => {\n if (!showCheckbox || !selectable) return userColumns;\n\n const checkboxColumn: DataTableColumn<T> = {\n id: '__checkbox',\n size: 40,\n minSize: 40,\n maxSize: 40,\n enableSorting: false,\n header: ({ table }: any) => (\n <Checkbox\n size=\"sm\"\n checked={table.getIsAllRowsSelected()}\n indeterminate={table.getIsSomeRowsSelected()}\n onCheckedChange={() => table.toggleAllRowsSelected()}\n aria-label=\"Select all rows\"\n />\n ),\n cell: ({ row }: any) => (\n <Checkbox\n size=\"sm\"\n checked={row.getIsSelected()}\n disabled={!row.getCanSelect()}\n onCheckedChange={() => row.toggleSelected()}\n aria-label={`Select row ${row.id}`}\n />\n ),\n };\n\n return [checkboxColumn, ...userColumns];\n }, [userColumns, showCheckbox, selectable]);\n\n const hasExplicitColumnSizing = React.useMemo(\n () =>\n columns.some((column) =>\n column.size !== undefined ||\n column.minSize !== undefined ||\n column.maxSize !== undefined\n ),\n [columns]\n );\n\n if (_tableFailed || !_useReactTable) {\n if (_tableFailed && process.env.NODE_ENV === 'development') {\n console.warn(\n '[@fragments-sdk/ui] DataTable: @tanstack/react-table is not installed. ' +\n 'Install it with: npm install @tanstack/react-table'\n );\n }\n return null;\n }\n\n const hasSubRows = !!getSubRows;\n\n const table = _useReactTable({\n data,\n columns,\n getRowId,\n getSubRows: getSubRows as any,\n getCoreRowModel: _getCoreRowModel(),\n getSortedRowModel: sortable ? _getSortedRowModel() : undefined,\n getExpandedRowModel: hasSubRows && _getExpandedRowModel ? _getExpandedRowModel() : undefined,\n state: {\n sorting: sortable ? sorting : undefined,\n rowSelection: selectable ? rowSelection : undefined,\n expanded: hasSubRows ? expanded : undefined,\n },\n onSortingChange: sortable ? handleSortingChange : undefined,\n onRowSelectionChange: selectable ? handleRowSelectionChange : undefined,\n onExpandedChange: hasSubRows ? handleExpandedChange : undefined,\n enableRowSelection: selectable,\n enableSorting: sortable,\n enableExpanding: hasSubRows,\n });\n\n const isEmpty = data.length === 0;\n\n const rootClasses = [\n styles.table,\n hasExplicitColumnSizing && styles.fixedLayout,\n styles[size],\n striped && styles.striped,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n if (isEmpty) {\n return (\n <div className={styles.emptyState}>\n <span className={styles.emptyMessage}>{emptyMessage}</span>\n </div>\n );\n }\n\n return (\n <div className={[styles.wrapper, bordered && styles.bordered].filter(Boolean).join(' ')}>\n <table\n {...htmlProps}\n className={rootClasses}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedBy}\n >\n {caption && (\n <caption className={captionHidden ? styles.captionHidden : styles.caption}>\n {caption}\n </caption>\n )}\n <thead className={styles.thead}>\n {table.getHeaderGroups().map((headerGroup: any) => (\n <tr key={headerGroup.id} className={styles.headerRow}>\n {headerGroup.headers.map((header: any) => {\n const canSort = sortable && header.column.getCanSort();\n const sortDirection = header.column.getIsSorted();\n const toggleSorting = canSort ? header.column.getToggleSortingHandler() : undefined;\n\n return (\n <th\n key={header.id}\n className={[styles.th, canSort && styles.thSortable].filter(Boolean).join(' ')}\n style={getColumnSizeStyle(header.column)}\n scope=\"col\"\n aria-sort={\n sortDirection\n ? sortDirection === 'asc'\n ? 'ascending'\n : 'descending'\n : canSort\n ? 'none'\n : undefined\n }\n >\n {canSort ? (\n <button\n type=\"button\"\n className={styles.sortButton}\n onClick={toggleSorting}\n >\n <span className={styles.headerContent}>\n {header.isPlaceholder\n ? null\n : _flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n </span>\n <span className={styles.sortIndicator} aria-hidden=\"true\">\n {sortDirection === 'asc' ? (\n <SortAscIcon />\n ) : sortDirection === 'desc' ? (\n <SortDescIcon />\n ) : (\n <SortIcon />\n )}\n </span>\n </button>\n ) : (\n <div className={styles.headerContent}>\n {header.isPlaceholder\n ? null\n : _flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n </div>\n )}\n </th>\n );\n })}\n </tr>\n ))}\n </thead>\n <tbody className={styles.tbody}>\n {table.getRowModel().rows.map((row: any) => {\n const isClickable = !!onRowClick;\n const isSelected = selectable ? row.getIsSelected() : false;\n const depth: number = row.depth ?? 0;\n const canExpand = hasSubRows && row.getCanExpand();\n const handleRowClick = (event: React.MouseEvent<HTMLTableRowElement>) => {\n if (!onRowClick) return;\n if (isInteractiveTarget(event.target, event.currentTarget)) return;\n onRowClick(row.original);\n };\n\n const handleRowKeyDown = (event: React.KeyboardEvent<HTMLTableRowElement>) => {\n if (!onRowClick) return;\n if (isInteractiveTarget(event.target, event.currentTarget)) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onRowClick(row.original);\n }\n };\n\n return (\n <tr\n key={row.id}\n className={[\n styles.row,\n isClickable && styles.clickable,\n isSelected && styles.selected,\n depth > 0 && styles.subRow,\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={isClickable ? handleRowClick : undefined}\n onKeyDown={isClickable ? handleRowKeyDown : undefined}\n tabIndex={isClickable ? 0 : undefined}\n data-selected={isSelected || undefined}\n data-depth={depth > 0 ? depth : undefined}\n >\n {row.getVisibleCells().map((cell: any, cellIndex: number) => {\n const isFirstDataCell = hasSubRows && cellIndex === (showCheckbox && selectable ? 1 : 0);\n return (\n <td\n key={cell.id}\n className={styles.td}\n style={{\n ...getColumnSizeStyle(cell.column),\n ...(isFirstDataCell && depth > 0 ? { paddingLeft: `${depth * 24 + 12}px` } : undefined),\n }}\n >\n {isFirstDataCell && canExpand ? (\n <span className={styles.expandCell}>\n <button\n type=\"button\"\n className={styles.expandButton}\n onClick={row.getToggleExpandedHandler()}\n aria-label={row.getIsExpanded() ? 'Collapse row' : 'Expand row'}\n aria-expanded={row.getIsExpanded()}\n >\n <ExpandIcon expanded={row.getIsExpanded()} />\n </button>\n {_flexRender(cell.column.columnDef.cell, cell.getContext())}\n </span>\n ) : (\n _flexRender(cell.column.columnDef.cell, cell.getContext())\n )}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n\n// Expand/collapse icon for sub-rows\nfunction ExpandIcon({ expanded }: { expanded: boolean }) {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n style={{\n transform: expanded ? 'rotate(90deg)' : undefined,\n transition: 'transform 150ms ease',\n }}\n >\n <path d=\"M4.5 2.5L8 6L4.5 9.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\n// Sort icons - minimal and functional\nfunction SortIcon() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 2L8.5 5H3.5L6 2Z\"\n fill=\"currentColor\"\n opacity=\"0.3\"\n />\n <path\n d=\"M6 10L3.5 7H8.5L6 10Z\"\n fill=\"currentColor\"\n opacity=\"0.3\"\n />\n </svg>\n );\n}\n\nfunction SortAscIcon() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 2L8.5 5H3.5L6 2Z\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction SortDescIcon() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 10L3.5 7H8.5L6 10Z\" fill=\"currentColor\" />\n </svg>\n );\n}\n\n// Helper to create simple columns without TanStack's createColumnHelper\nexport function createColumns<T>(\n columns: Array<{\n key: string;\n header: string;\n width?: number;\n cell?: (row: T) => React.ReactNode;\n }>\n): DataTableColumn<T>[] {\n return columns.map((col) => ({\n id: col.key,\n accessorKey: col.key,\n header: col.header,\n size: col.width,\n minSize: col.width,\n maxSize: col.width,\n cell: col.cell\n ? ({ row }) => col.cell!(row.original)\n : ({ getValue }) => getValue() ?? '--',\n }));\n}\n\nexport const DataTable = Object.assign(DataTableRoot, {\n Root: DataTableRoot,\n Columns: createColumns,\n});\n"],"names":["React","table","jsx","Checkbox","styles","jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/components/DataTable/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\n// Import globals to ensure CSS variables are defined\nimport '../../styles/globals.scss';\nimport styles from './DataTable.module.scss';\nimport { Checkbox } from '../Checkbox';\n\n// ============================================\n// Types (self-owned — no external dependency for types)\n// ============================================\n\n/** Column definition compatible with @tanstack/react-table */\nexport type ColumnDef<TData = unknown, TValue = unknown> = {\n id?: string;\n accessorKey?: string;\n accessorFn?: (row: TData) => TValue;\n header?: string | ((context: any) => React.ReactNode);\n cell?: string | ((context: any) => React.ReactNode);\n size?: number;\n minSize?: number;\n maxSize?: number;\n enableSorting?: boolean;\n [key: string]: unknown;\n};\n\nexport type SortingState = Array<{ id: string; desc: boolean }>;\nexport type RowSelectionState = Record<string, boolean>;\nexport type ExpandedState = true | Record<string, boolean>;\ntype OnChangeFn<T> = ((updaterOrValue: T | ((prev: T) => T)) => void);\n\nexport type DataTableColumn<T> = ColumnDef<T, unknown>;\n\n// ============================================\n// Lazy-loaded dependency (@tanstack/react-table)\n// ============================================\n\nlet _useReactTable: any = null;\nlet _getCoreRowModel: any = null;\nlet _getSortedRowModel: any = null;\nlet _getExpandedRowModel: any = null;\nlet _flexRender: any = null;\nlet _tableLoaded = false;\nlet _tableFailed = false;\n\nfunction loadTableDeps() {\n if (_tableLoaded) return;\n _tableLoaded = true;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const rt = require('@tanstack/react-table');\n _useReactTable = rt.useReactTable;\n _getCoreRowModel = rt.getCoreRowModel;\n _getSortedRowModel = rt.getSortedRowModel;\n _getExpandedRowModel = rt.getExpandedRowModel;\n _flexRender = rt.flexRender;\n } catch {\n _tableFailed = true;\n }\n}\n\nexport interface DataTableProps<T> extends Omit<React.HTMLAttributes<HTMLTableElement>, 'onClick'> {\n /** Column definitions */\n columns: DataTableColumn<T>[];\n /** Data array */\n data: T[];\n /** Unique key extractor for each row */\n getRowId?: (row: T) => string;\n /** Enable sorting */\n sortable?: boolean;\n /** Controlled sorting state */\n sorting?: SortingState;\n /** Sorting change handler */\n onSortingChange?: OnChangeFn<SortingState>;\n /** Enable row selection */\n selectable?: boolean;\n /** Show checkbox column for row selection */\n showCheckbox?: boolean;\n /** Controlled selection state */\n rowSelection?: RowSelectionState;\n /** Selection change handler */\n onRowSelectionChange?: OnChangeFn<RowSelectionState>;\n /** Row click handler */\n onRowClick?: (row: T) => void;\n /** Extract sub-rows from a row for expandable tree tables */\n getSubRows?: (row: T) => T[] | undefined;\n /** Controlled expanded state */\n expanded?: ExpandedState;\n /** Expanded state change handler */\n onExpandedChange?: OnChangeFn<ExpandedState>;\n /** Empty state message */\n emptyMessage?: string;\n /** Size variant */\n size?: 'sm' | 'md';\n /** Visible caption for the table (recommended for accessibility) */\n caption?: string;\n /** Hide the caption visually but keep it for screen readers */\n captionHidden?: boolean;\n /** Show alternating row backgrounds */\n striped?: boolean;\n /** Wrap table in a bordered container */\n bordered?: boolean;\n}\n\nfunction getColumnSizeStyle(\n column: {\n getSize: () => number;\n columnDef: { size?: number; minSize?: number; maxSize?: number };\n }\n): React.CSSProperties | undefined {\n const { size, minSize, maxSize } = column.columnDef;\n const hasExplicitSize = size !== undefined || minSize !== undefined || maxSize !== undefined;\n\n if (!hasExplicitSize) {\n return undefined;\n }\n\n const resolvedSize = column.getSize();\n\n return {\n width: resolvedSize,\n minWidth: minSize ?? resolvedSize,\n maxWidth: maxSize ?? resolvedSize,\n };\n}\n\nfunction isInteractiveTarget(\n target: EventTarget | null,\n currentTarget: HTMLTableRowElement\n) {\n if (!(target instanceof Element)) return false;\n\n const interactiveElement = target.closest(\n 'button, a, input, select, textarea, [role=\"button\"], [role=\"link\"], [role=\"checkbox\"], [role=\"switch\"]'\n );\n\n return Boolean(interactiveElement && currentTarget.contains(interactiveElement));\n}\n\nfunction DataTableRoot<T>({\n columns: userColumns,\n data,\n getRowId,\n sortable = false,\n sorting: controlledSorting,\n onSortingChange,\n selectable = false,\n showCheckbox = false,\n rowSelection: controlledRowSelection,\n onRowSelectionChange,\n onRowClick,\n getSubRows,\n expanded: controlledExpanded,\n onExpandedChange,\n emptyMessage = 'No data available',\n size = 'md',\n className,\n caption,\n captionHidden = false,\n striped = false,\n bordered = false,\n 'aria-label': ariaLabel,\n 'aria-describedby': ariaDescribedBy,\n ...htmlProps\n}: DataTableProps<T>) {\n loadTableDeps();\n\n // Internal sorting state when uncontrolled\n const [internalSorting, setInternalSorting] = React.useState<SortingState>([]);\n const sorting = controlledSorting ?? internalSorting;\n const handleSortingChange = onSortingChange ?? setInternalSorting;\n\n // Internal selection state when uncontrolled\n const [internalRowSelection, setInternalRowSelection] = React.useState<RowSelectionState>({});\n const rowSelection = controlledRowSelection ?? internalRowSelection;\n const handleRowSelectionChange = onRowSelectionChange ?? setInternalRowSelection;\n\n // Internal expanded state when uncontrolled\n const [internalExpanded, setInternalExpanded] = React.useState<ExpandedState>({});\n const expanded = controlledExpanded ?? internalExpanded;\n const handleExpandedChange = onExpandedChange ?? setInternalExpanded;\n\n // Build columns with optional checkbox prepended\n const columns = React.useMemo(() => {\n if (!showCheckbox || !selectable) return userColumns;\n\n const checkboxColumn: DataTableColumn<T> = {\n id: '__checkbox',\n size: 40,\n minSize: 40,\n maxSize: 40,\n enableSorting: false,\n header: ({ table }: any) => (\n <Checkbox\n size=\"sm\"\n checked={table.getIsAllRowsSelected()}\n indeterminate={table.getIsSomeRowsSelected()}\n onCheckedChange={() => table.toggleAllRowsSelected()}\n aria-label=\"Select all rows\"\n />\n ),\n cell: ({ row }: any) => (\n <Checkbox\n size=\"sm\"\n checked={row.getIsSelected()}\n disabled={!row.getCanSelect()}\n onCheckedChange={() => row.toggleSelected()}\n aria-label={`Select row ${row.id}`}\n />\n ),\n };\n\n return [checkboxColumn, ...userColumns];\n }, [userColumns, showCheckbox, selectable]);\n\n const hasExplicitColumnSizing = React.useMemo(\n () =>\n columns.some((column) =>\n column.size !== undefined ||\n column.minSize !== undefined ||\n column.maxSize !== undefined\n ),\n [columns]\n );\n\n if (_tableFailed || !_useReactTable) {\n if (_tableFailed && process.env.NODE_ENV === 'development') {\n console.warn(\n '[@fragments-sdk/ui] DataTable: @tanstack/react-table is not installed. ' +\n 'Install it with: npm install @tanstack/react-table'\n );\n }\n return null;\n }\n\n const hasSubRows = !!getSubRows;\n\n const table = _useReactTable({\n data,\n columns,\n getRowId,\n getSubRows: getSubRows as any,\n getCoreRowModel: _getCoreRowModel(),\n getSortedRowModel: sortable ? _getSortedRowModel() : undefined,\n getExpandedRowModel: hasSubRows && _getExpandedRowModel ? _getExpandedRowModel() : undefined,\n state: {\n sorting: sortable ? sorting : undefined,\n rowSelection: selectable ? rowSelection : undefined,\n expanded: hasSubRows ? expanded : undefined,\n },\n onSortingChange: sortable ? handleSortingChange : undefined,\n onRowSelectionChange: selectable ? handleRowSelectionChange : undefined,\n onExpandedChange: hasSubRows ? handleExpandedChange : undefined,\n enableRowSelection: selectable,\n enableSorting: sortable,\n enableExpanding: hasSubRows,\n });\n\n const isEmpty = data.length === 0;\n\n const rootClasses = [\n styles.table,\n hasExplicitColumnSizing && styles.fixedLayout,\n styles[size],\n striped && styles.striped,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n if (isEmpty) {\n return (\n <div className={[styles.wrapper, bordered && styles.bordered].filter(Boolean).join(' ')}>\n <table\n {...htmlProps}\n className={rootClasses}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedBy}\n >\n {caption && (\n <caption className={captionHidden ? styles.captionHidden : styles.caption}>\n {caption}\n </caption>\n )}\n <tbody className={styles.tbody}>\n <tr className={styles.row}>\n <td className={styles.td} colSpan={Math.max(columns.length, 1)}>\n <div className={styles.emptyState}>\n <span className={styles.emptyMessage}>{emptyMessage}</span>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n );\n }\n\n return (\n <div className={[styles.wrapper, bordered && styles.bordered].filter(Boolean).join(' ')}>\n <table\n {...htmlProps}\n className={rootClasses}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedBy}\n >\n {caption && (\n <caption className={captionHidden ? styles.captionHidden : styles.caption}>\n {caption}\n </caption>\n )}\n <thead className={styles.thead}>\n {table.getHeaderGroups().map((headerGroup: any) => (\n <tr key={headerGroup.id} className={styles.headerRow}>\n {headerGroup.headers.map((header: any) => {\n const canSort = sortable && header.column.getCanSort();\n const sortDirection = header.column.getIsSorted();\n const toggleSorting = canSort ? header.column.getToggleSortingHandler() : undefined;\n\n return (\n <th\n key={header.id}\n className={[styles.th, canSort && styles.thSortable].filter(Boolean).join(' ')}\n style={getColumnSizeStyle(header.column)}\n scope=\"col\"\n aria-sort={\n sortDirection\n ? sortDirection === 'asc'\n ? 'ascending'\n : 'descending'\n : canSort\n ? 'none'\n : undefined\n }\n >\n {canSort ? (\n <button\n type=\"button\"\n className={styles.sortButton}\n onClick={toggleSorting}\n >\n <span className={styles.headerContent}>\n {header.isPlaceholder\n ? null\n : _flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n </span>\n <span className={styles.sortIndicator} aria-hidden=\"true\">\n {sortDirection === 'asc' ? (\n <SortAscIcon />\n ) : sortDirection === 'desc' ? (\n <SortDescIcon />\n ) : (\n <SortIcon />\n )}\n </span>\n </button>\n ) : (\n <div className={styles.headerContent}>\n {header.isPlaceholder\n ? null\n : _flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n </div>\n )}\n </th>\n );\n })}\n </tr>\n ))}\n </thead>\n <tbody className={styles.tbody}>\n {table.getRowModel().rows.map((row: any) => {\n const isClickable = !!onRowClick;\n const isSelected = selectable ? row.getIsSelected() : false;\n const depth: number = row.depth ?? 0;\n const canExpand = hasSubRows && row.getCanExpand();\n const handleRowClick = (event: React.MouseEvent<HTMLTableRowElement>) => {\n if (!onRowClick) return;\n if (isInteractiveTarget(event.target, event.currentTarget)) return;\n onRowClick(row.original);\n };\n\n const handleRowKeyDown = (event: React.KeyboardEvent<HTMLTableRowElement>) => {\n if (!onRowClick) return;\n if (isInteractiveTarget(event.target, event.currentTarget)) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onRowClick(row.original);\n }\n };\n\n return (\n <tr\n key={row.id}\n className={[\n styles.row,\n isClickable && styles.clickable,\n isSelected && styles.selected,\n depth > 0 && styles.subRow,\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={isClickable ? handleRowClick : undefined}\n onKeyDown={isClickable ? handleRowKeyDown : undefined}\n tabIndex={isClickable ? 0 : undefined}\n data-selected={isSelected || undefined}\n data-depth={depth > 0 ? depth : undefined}\n >\n {row.getVisibleCells().map((cell: any, cellIndex: number) => {\n const isFirstDataCell = hasSubRows && cellIndex === (showCheckbox && selectable ? 1 : 0);\n return (\n <td\n key={cell.id}\n className={styles.td}\n style={{\n ...getColumnSizeStyle(cell.column),\n ...(isFirstDataCell && depth > 0 ? { paddingLeft: `${depth * 24 + 12}px` } : undefined),\n }}\n >\n {isFirstDataCell && canExpand ? (\n <span className={styles.expandCell}>\n <button\n type=\"button\"\n className={styles.expandButton}\n onClick={row.getToggleExpandedHandler()}\n aria-label={row.getIsExpanded() ? 'Collapse row' : 'Expand row'}\n aria-expanded={row.getIsExpanded()}\n >\n <ExpandIcon expanded={row.getIsExpanded()} />\n </button>\n {_flexRender(cell.column.columnDef.cell, cell.getContext())}\n </span>\n ) : (\n _flexRender(cell.column.columnDef.cell, cell.getContext())\n )}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n\n// Expand/collapse icon for sub-rows\nfunction ExpandIcon({ expanded }: { expanded: boolean }) {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n style={{\n transform: expanded ? 'rotate(90deg)' : undefined,\n transition: 'transform 150ms ease',\n }}\n >\n <path d=\"M4.5 2.5L8 6L4.5 9.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\n// Sort icons - minimal and functional\nfunction SortIcon() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 2L8.5 5H3.5L6 2Z\"\n fill=\"currentColor\"\n opacity=\"0.3\"\n />\n <path\n d=\"M6 10L3.5 7H8.5L6 10Z\"\n fill=\"currentColor\"\n opacity=\"0.3\"\n />\n </svg>\n );\n}\n\nfunction SortAscIcon() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 2L8.5 5H3.5L6 2Z\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction SortDescIcon() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 10L3.5 7H8.5L6 10Z\" fill=\"currentColor\" />\n </svg>\n );\n}\n\n// Helper to create simple columns without TanStack's createColumnHelper\nexport function createColumns<T>(\n columns: Array<{\n key: string;\n header: string;\n width?: number;\n cell?: (row: T) => React.ReactNode;\n }>\n): DataTableColumn<T>[] {\n return columns.map((col) => ({\n id: col.key,\n accessorKey: col.key,\n header: col.header,\n size: col.width,\n minSize: col.width,\n maxSize: col.width,\n cell: col.cell\n ? ({ row }) => col.cell!(row.original)\n : ({ getValue }) => getValue() ?? '--',\n }));\n}\n\nexport const DataTable = Object.assign(DataTableRoot, {\n Root: DataTableRoot,\n Columns: createColumns,\n});\n"],"names":["React","table","jsx","Checkbox","styles","jsxs"],"mappings":"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"}
|