asterui 0.12.62 → 0.12.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Anchor.d.ts +2 -0
- package/dist/components/Anchor.js +79 -75
- package/dist/components/Anchor.js.map +1 -1
- package/dist/components/Autocomplete.d.ts +1 -0
- package/dist/components/Autocomplete.js +115 -110
- package/dist/components/Autocomplete.js.map +1 -1
- package/dist/components/Breadcrumb.d.ts +4 -2
- package/dist/components/Breadcrumb.js +54 -29
- package/dist/components/Breadcrumb.js.map +1 -1
- package/dist/components/Button.d.ts +5 -1
- package/dist/components/Button.js +117 -107
- package/dist/components/Button.js.map +1 -1
- package/dist/components/Chart.d.ts +1 -0
- package/dist/components/Chart.js +31 -30
- package/dist/components/Chart.js.map +1 -1
- package/dist/components/Chat.d.ts +1 -0
- package/dist/components/Chat.js +32 -30
- package/dist/components/Chat.js.map +1 -1
- package/dist/components/Collapse.js +58 -56
- package/dist/components/Collapse.js.map +1 -1
- package/dist/components/Command.d.ts +5 -2
- package/dist/components/Command.js +262 -233
- package/dist/components/Command.js.map +1 -1
- package/dist/components/ContextMenu.d.ts +4 -0
- package/dist/components/ContextMenu.js +149 -130
- package/dist/components/ContextMenu.js.map +1 -1
- package/dist/components/DatePicker.d.ts +19 -1
- package/dist/components/DatePicker.js +266 -87
- package/dist/components/DatePicker.js.map +1 -1
- package/dist/components/Dock.d.ts +2 -0
- package/dist/components/Dock.js +70 -46
- package/dist/components/Dock.js.map +1 -1
- package/dist/components/FileInput.d.ts +1 -0
- package/dist/components/FileInput.js +26 -26
- package/dist/components/FileInput.js.map +1 -1
- package/dist/components/Filter.d.ts +1 -0
- package/dist/components/Filter.js +43 -40
- package/dist/components/Filter.js.map +1 -1
- package/dist/components/Flex.d.ts +1 -0
- package/dist/components/Flex.js +43 -42
- package/dist/components/Flex.js.map +1 -1
- package/dist/components/FloatButton.d.ts +3 -0
- package/dist/components/FloatButton.js +178 -127
- package/dist/components/FloatButton.js.map +1 -1
- package/dist/components/Input.d.ts +1 -0
- package/dist/components/Input.js +201 -184
- package/dist/components/Input.js.map +1 -1
- package/dist/components/Loading.d.ts +1 -0
- package/dist/components/Loading.js +40 -37
- package/dist/components/Loading.js.map +1 -1
- package/dist/components/Masonry.d.ts +1 -0
- package/dist/components/Masonry.js +45 -42
- package/dist/components/Masonry.js.map +1 -1
- package/dist/components/Mention.d.ts +1 -0
- package/dist/components/Mention.js +95 -91
- package/dist/components/Mention.js.map +1 -1
- package/dist/components/Menu.d.ts +1 -1
- package/dist/components/Menu.js +99 -93
- package/dist/components/Menu.js.map +1 -1
- package/dist/components/Modal.js +26 -17
- package/dist/components/Modal.js.map +1 -1
- package/dist/components/MonthCalendar.d.ts +1 -0
- package/dist/components/MonthCalendar.js +104 -97
- package/dist/components/MonthCalendar.js.map +1 -1
- package/dist/components/Notification.js +53 -45
- package/dist/components/Notification.js.map +1 -1
- package/dist/components/QRCode.d.ts +1 -0
- package/dist/components/QRCode.js +84 -55
- package/dist/components/QRCode.js.map +1 -1
- package/dist/components/RadialProgress.d.ts +1 -0
- package/dist/components/RadialProgress.js +19 -17
- package/dist/components/RadialProgress.js.map +1 -1
- package/dist/components/Range.d.ts +1 -0
- package/dist/components/Range.js +45 -43
- package/dist/components/Range.js.map +1 -1
- package/dist/components/Rating.d.ts +4 -2
- package/dist/components/Rating.js +83 -79
- package/dist/components/Rating.js.map +1 -1
- package/dist/components/Responsive.d.ts +4 -2
- package/dist/components/Responsive.js +10 -9
- package/dist/components/Responsive.js.map +1 -1
- package/dist/components/Result.d.ts +1 -0
- package/dist/components/Result.js +24 -22
- package/dist/components/Result.js.map +1 -1
- package/dist/components/Select.d.ts +1 -0
- package/dist/components/Select.js +72 -62
- package/dist/components/Select.js.map +1 -1
- package/dist/components/Splitter.d.ts +2 -0
- package/dist/components/Splitter.js +137 -131
- package/dist/components/Splitter.js.map +1 -1
- package/dist/components/Stat.d.ts +4 -2
- package/dist/components/Stat.js +19 -18
- package/dist/components/Stat.js.map +1 -1
- package/dist/components/Steps.d.ts +4 -2
- package/dist/components/Steps.js +56 -52
- package/dist/components/Steps.js.map +1 -1
- package/dist/components/Tabs.js +69 -57
- package/dist/components/Tabs.js.map +1 -1
- package/dist/components/TextRotate.d.ts +1 -0
- package/dist/components/TextRotate.js +14 -12
- package/dist/components/TextRotate.js.map +1 -1
- package/dist/components/Textarea.d.ts +1 -0
- package/dist/components/Textarea.js +31 -30
- package/dist/components/Textarea.js.map +1 -1
- package/dist/components/ThemeController.d.ts +6 -3
- package/dist/components/ThemeController.js +101 -92
- package/dist/components/ThemeController.js.map +1 -1
- package/dist/components/Tooltip.js +38 -35
- package/dist/components/Tooltip.js.map +1 -1
- package/dist/components/Transfer.js +130 -121
- package/dist/components/Transfer.js.map +1 -1
- package/dist/components/TreeSelect.js +49 -48
- package/dist/components/TreeSelect.js.map +1 -1
- package/dist/components/Typography.d.ts +10 -5
- package/dist/components/Typography.js +84 -81
- package/dist/components/Typography.js.map +1 -1
- package/dist/components/VirtualList.d.ts +2 -1
- package/dist/components/VirtualList.js +40 -36
- package/dist/components/VirtualList.js.map +1 -1
- package/dist/components/Watermark.d.ts +1 -0
- package/dist/components/Watermark.js +74 -71
- package/dist/components/Watermark.js.map +1 -1
- package/dist/components/WeekCalendar.d.ts +1 -0
- package/dist/components/WeekCalendar.js +91 -76
- package/dist/components/WeekCalendar.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Command.js","sources":["../../src/components/Command.tsx"],"sourcesContent":["import React, {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\n// DaisyUI classes\nconst dModal = 'modal'\nconst dModalBox = 'modal-box'\nconst dKbd = 'kbd'\nconst dKbdXs = 'kbd-xs'\n\n// Types\nexport interface CommandItemConfig {\n key: string\n label: React.ReactNode\n group?: string\n keywords?: string[]\n disabled?: boolean\n onSelect?: () => void\n icon?: React.ReactNode\n}\n\nexport interface CommandProps extends Omit<React.HTMLAttributes<HTMLDialogElement>, 'children'> {\n children?: React.ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n defaultOpen?: boolean\n items?: CommandItemConfig[]\n filter?: (value: string, search: string, keywords?: string[]) => boolean\n loop?: boolean\n shortcut?: string[]\n placeholder?: string\n emptyMessage?: React.ReactNode\n}\n\ninterface CommandContextValue {\n searchValue: string\n setSearchValue: (value: string) => void\n highlightedIndex: number\n setHighlightedIndex: (index: number) => void\n registerItem: (id: string, value: string, keywords: string[], disabled: boolean) => void\n unregisterItem: (id: string) => void\n filteredItems: FilteredItem[]\n selectItem: (id: string) => void\n loop: boolean\n baseId: string\n currentPage: string\n setPage: (pageId: string) => void\n goBack: () => void\n pageStack: string[]\n}\n\ninterface FilteredItem {\n id: string\n value: string\n keywords: string[]\n disabled: boolean\n}\n\ninterface ItemRegistration {\n id: string\n value: string\n keywords: string[]\n disabled: boolean\n onSelect?: () => void\n}\n\nconst CommandContext = createContext<CommandContextValue | null>(null)\n\nfunction useCommandContext() {\n const context = useContext(CommandContext)\n if (!context) {\n throw new Error('Command compound components must be used within a Command')\n }\n return context\n}\n\n// Default filter function\nconst defaultFilter = (value: string, search: string, keywords: string[] = []): boolean => {\n const searchLower = search.toLowerCase()\n const valueLower = value.toLowerCase()\n if (valueLower.includes(searchLower)) return true\n return keywords.some((k) => k.toLowerCase().includes(searchLower))\n}\n\n// Root Command component\nconst CommandRoot = forwardRef<HTMLDialogElement, CommandProps>(\n (\n {\n children,\n open: controlledOpen,\n onOpenChange,\n defaultOpen = false,\n items,\n filter = defaultFilter,\n loop = true,\n shortcut = ['k'],\n placeholder = 'Type a command or search...',\n emptyMessage = 'No results found.',\n className = '',\n ...rest\n },\n ref\n ) => {\n const dialogRef = useRef<HTMLDialogElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const listRef = useRef<HTMLDivElement>(null)\n const previousActiveElement = useRef<HTMLElement | null>(null)\n const baseId = useId()\n\n // Controlled/uncontrolled open state\n const [internalOpen, setInternalOpen] = useState(defaultOpen)\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n const setIsOpen = useCallback(\n (newOpen: boolean) => {\n if (!isControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n },\n [isControlled, onOpenChange]\n )\n\n // State\n const [searchValue, setSearchValue] = useState('')\n const [highlightedIndex, setHighlightedIndex] = useState(0)\n const [registeredItems, setRegisteredItems] = useState<Map<string, ItemRegistration>>(new Map())\n const [pageStack, setPageStack] = useState<string[]>(['root'])\n const currentPage = pageStack[pageStack.length - 1]\n\n // Page navigation\n const setPage = useCallback((pageId: string) => {\n setPageStack((prev) => [...prev, pageId])\n setSearchValue('')\n setHighlightedIndex(0)\n }, [])\n\n const goBack = useCallback(() => {\n if (pageStack.length > 1) {\n setPageStack((prev) => prev.slice(0, -1))\n setSearchValue('')\n setHighlightedIndex(0)\n }\n }, [pageStack.length])\n\n // Item registration for compound components\n const registerItem = useCallback(\n (id: string, value: string, keywords: string[], disabled: boolean, onSelect?: () => void) => {\n setRegisteredItems((prev) => {\n const next = new Map(prev)\n next.set(id, { id, value, keywords, disabled, onSelect })\n return next\n })\n },\n []\n )\n\n const unregisterItem = useCallback((id: string) => {\n setRegisteredItems((prev) => {\n const next = new Map(prev)\n next.delete(id)\n return next\n })\n }, [])\n\n // Compute filtered items\n const filteredItems = useMemo((): FilteredItem[] => {\n // Use data-driven items if provided\n if (items) {\n return items\n .filter((item) => {\n if (!searchValue) return true\n const label = typeof item.label === 'string' ? item.label : ''\n return filter(label, searchValue, item.keywords)\n })\n .map((item) => ({\n id: item.key,\n value: typeof item.label === 'string' ? item.label : item.key,\n keywords: item.keywords || [],\n disabled: item.disabled || false,\n }))\n }\n\n // Use registered compound items\n const itemsArray = Array.from(registeredItems.values())\n return itemsArray.filter((item) => {\n if (!searchValue) return true\n return filter(item.value, searchValue, item.keywords)\n })\n }, [items, registeredItems, searchValue, filter])\n\n // Get enabled items for navigation\n const enabledItems = useMemo(\n () => filteredItems.filter((item) => !item.disabled),\n [filteredItems]\n )\n\n // Select item\n const selectItem = useCallback(\n (id: string) => {\n if (items) {\n const item = items.find((i) => i.key === id)\n if (item && !item.disabled) {\n item.onSelect?.()\n setIsOpen(false)\n }\n } else {\n const reg = registeredItems.get(id)\n if (reg && !reg.disabled) {\n reg.onSelect?.()\n setIsOpen(false)\n }\n }\n },\n [items, registeredItems, setIsOpen]\n )\n\n // Reset state when opening\n useEffect(() => {\n if (isOpen) {\n setSearchValue('')\n setHighlightedIndex(0)\n setPageStack(['root'])\n }\n }, [isOpen])\n\n // Handle dialog open/close\n useEffect(() => {\n const dialog = dialogRef.current\n if (!dialog) return\n\n if (isOpen) {\n if (!dialog.open) {\n previousActiveElement.current = document.activeElement as HTMLElement\n dialog.showModal()\n setTimeout(() => inputRef.current?.focus(), 0)\n }\n } else {\n if (dialog.open) {\n dialog.close()\n previousActiveElement.current?.focus()\n }\n }\n }, [isOpen])\n\n // Handle dialog close event\n useEffect(() => {\n const dialog = dialogRef.current\n if (!dialog) return\n\n const onDialogClose = () => {\n setIsOpen(false)\n }\n\n dialog.addEventListener('close', onDialogClose)\n return () => dialog.removeEventListener('close', onDialogClose)\n }, [setIsOpen])\n\n // Global keyboard shortcut\n useEffect(() => {\n const handleGlobalKeyDown = (e: KeyboardEvent) => {\n const key = shortcut[0]?.toLowerCase()\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === key) {\n e.preventDefault()\n setIsOpen(!isOpen)\n }\n }\n\n document.addEventListener('keydown', handleGlobalKeyDown)\n return () => document.removeEventListener('keydown', handleGlobalKeyDown)\n }, [shortcut, isOpen, setIsOpen])\n\n // Keyboard navigation\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault()\n if (enabledItems.length === 0) return\n setHighlightedIndex((prev) => {\n const next = prev + 1\n if (next >= enabledItems.length) {\n return loop ? 0 : prev\n }\n return next\n })\n break\n }\n case 'ArrowUp': {\n e.preventDefault()\n if (enabledItems.length === 0) return\n setHighlightedIndex((prev) => {\n const next = prev - 1\n if (next < 0) {\n return loop ? enabledItems.length - 1 : 0\n }\n return next\n })\n break\n }\n case 'Enter': {\n e.preventDefault()\n const item = enabledItems[highlightedIndex]\n if (item) {\n selectItem(item.id)\n }\n break\n }\n case 'Escape': {\n e.preventDefault()\n if (pageStack.length > 1) {\n goBack()\n } else {\n setIsOpen(false)\n }\n break\n }\n case 'Backspace': {\n if (searchValue === '' && pageStack.length > 1) {\n e.preventDefault()\n goBack()\n }\n break\n }\n }\n },\n [enabledItems, highlightedIndex, loop, selectItem, pageStack, goBack, searchValue, setIsOpen]\n )\n\n // Scroll highlighted item into view\n useEffect(() => {\n if (highlightedIndex >= 0 && listRef.current) {\n const items = listRef.current.querySelectorAll('[data-command-item]')\n const highlightedEl = items[highlightedIndex] as HTMLElement\n highlightedEl?.scrollIntoView({ block: 'nearest' })\n }\n }, [highlightedIndex])\n\n // Handle mask click\n const handleBackdropClick = (e: React.MouseEvent) => {\n if (e.target === dialogRef.current) {\n setIsOpen(false)\n }\n }\n\n const contextValue: CommandContextValue = {\n searchValue,\n setSearchValue,\n highlightedIndex,\n setHighlightedIndex,\n registerItem: (id, value, keywords, disabled) => registerItem(id, value, keywords, disabled),\n unregisterItem,\n filteredItems,\n selectItem,\n loop,\n baseId,\n currentPage,\n setPage,\n goBack,\n pageStack,\n }\n\n // Render data-driven items\n const renderDataDrivenItems = () => {\n if (!items) return null\n\n // Group items\n const groups = new Map<string, CommandItemConfig[]>()\n const ungrouped: CommandItemConfig[] = []\n\n filteredItems.forEach((fi) => {\n const item = items.find((i) => i.key === fi.id)\n if (!item) return\n if (item.group) {\n const group = groups.get(item.group) || []\n group.push(item)\n groups.set(item.group, group)\n } else {\n ungrouped.push(item)\n }\n })\n\n let globalIndex = 0\n\n return (\n <>\n {Array.from(groups.entries()).map(([groupName, groupItems]) => (\n <div key={groupName} role=\"group\" aria-label={groupName}>\n <div className=\"px-3 py-2 text-xs font-semibold text-base-content/60 uppercase tracking-wider\">\n {groupName}\n </div>\n {groupItems.map((item) => {\n const itemIndex = globalIndex++\n const isHighlighted = itemIndex === highlightedIndex\n return (\n <div\n key={item.key}\n role=\"option\"\n aria-selected={isHighlighted}\n aria-disabled={item.disabled}\n data-command-item\n data-highlighted={isHighlighted}\n className={[\n 'px-3 py-2 cursor-pointer flex items-center gap-3',\n isHighlighted && 'bg-primary text-primary-content',\n !isHighlighted && 'hover:bg-base-200',\n item.disabled && 'opacity-50 cursor-not-allowed',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => !item.disabled && selectItem(item.key)}\n onMouseEnter={() => !item.disabled && setHighlightedIndex(itemIndex)}\n >\n {item.icon && <span className=\"w-5 h-5\">{item.icon}</span>}\n <span>{item.label}</span>\n </div>\n )\n })}\n </div>\n ))}\n {ungrouped.length > 0 && (\n <div role=\"group\">\n {ungrouped.map((item) => {\n const itemIndex = globalIndex++\n const isHighlighted = itemIndex === highlightedIndex\n return (\n <div\n key={item.key}\n role=\"option\"\n aria-selected={isHighlighted}\n aria-disabled={item.disabled}\n data-command-item\n data-highlighted={isHighlighted}\n className={[\n 'px-3 py-2 cursor-pointer flex items-center gap-3',\n isHighlighted && 'bg-primary text-primary-content',\n !isHighlighted && 'hover:bg-base-200',\n item.disabled && 'opacity-50 cursor-not-allowed',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => !item.disabled && selectItem(item.key)}\n onMouseEnter={() => !item.disabled && setHighlightedIndex(itemIndex)}\n >\n {item.icon && <span className=\"w-5 h-5\">{item.icon}</span>}\n <span>{item.label}</span>\n </div>\n )\n })}\n </div>\n )}\n </>\n )\n }\n\n return (\n <dialog\n ref={(node) => {\n ;(dialogRef as React.MutableRefObject<HTMLDialogElement | null>).current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n }}\n className={`${dModal} ${className}`}\n onClick={handleBackdropClick}\n {...rest}\n >\n <div\n className={`${dModalBox} p-0 max-w-lg w-full overflow-hidden`}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Command palette\"\n >\n <CommandContext.Provider value={contextValue}>\n {/* Breadcrumb for nested pages */}\n {pageStack.length > 1 && (\n <div className=\"px-3 py-2 border-b border-base-content/10 flex items-center gap-2 text-sm\">\n <button\n onClick={goBack}\n className=\"hover:bg-base-200 rounded p-1\"\n aria-label=\"Go back\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n <span className=\"text-base-content/60\">{currentPage}</span>\n </div>\n )}\n\n {/* Search input */}\n <div className=\"px-3 py-3 border-b border-base-content/10\">\n <div className=\"flex items-center gap-3\">\n <svg\n className=\"w-5 h-5 text-base-content/50\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n <input\n ref={inputRef}\n type=\"text\"\n className=\"flex-1 bg-transparent border-none outline-none text-base placeholder:text-base-content/50\"\n placeholder={placeholder}\n value={searchValue}\n onChange={(e) => {\n setSearchValue(e.target.value)\n setHighlightedIndex(0)\n }}\n onKeyDown={handleKeyDown}\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={`${baseId}-listbox`}\n aria-activedescendant={\n enabledItems[highlightedIndex]\n ? `${baseId}-item-${enabledItems[highlightedIndex].id}`\n : undefined\n }\n />\n </div>\n </div>\n\n {/* List */}\n <div\n ref={listRef}\n className=\"max-h-80 overflow-y-auto py-2\"\n role=\"listbox\"\n id={`${baseId}-listbox`}\n >\n {items ? (\n filteredItems.length > 0 ? (\n renderDataDrivenItems()\n ) : (\n <div className=\"px-3 py-8 text-center text-base-content/60\">{emptyMessage}</div>\n )\n ) : (\n children\n )}\n </div>\n\n {/* Footer with shortcut hint */}\n <div className=\"px-3 py-2 border-t border-base-content/10 flex items-center justify-between text-xs text-base-content/50\">\n <div className=\"flex items-center gap-4\">\n <span className=\"flex items-center gap-1\">\n <kbd className={`${dKbd} ${dKbdXs}`}>↑↓</kbd> navigate\n </span>\n <span className=\"flex items-center gap-1\">\n <kbd className={`${dKbd} ${dKbdXs}`}>↵</kbd> select\n </span>\n <span className=\"flex items-center gap-1\">\n <kbd className={`${dKbd} ${dKbdXs}`}>esc</kbd> close\n </span>\n </div>\n </div>\n </CommandContext.Provider>\n </div>\n </dialog>\n )\n }\n)\n\nCommandRoot.displayName = 'Command'\n\n// Command.Input - for compound pattern customization\ninterface CommandInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange'> {\n value?: string\n onValueChange?: (value: string) => void\n}\n\nfunction CommandInput({ placeholder, value, onValueChange, ...rest }: CommandInputProps) {\n const { searchValue, setSearchValue } = useCommandContext()\n const controlledValue = value !== undefined ? value : searchValue\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value\n if (onValueChange) {\n onValueChange(newValue)\n } else {\n setSearchValue(newValue)\n }\n }\n\n return (\n <input\n type=\"text\"\n className=\"flex-1 bg-transparent border-none outline-none text-base placeholder:text-base-content/50\"\n placeholder={placeholder}\n value={controlledValue}\n onChange={handleChange}\n {...rest}\n />\n )\n}\n\n// Command.List\ninterface CommandListProps {\n children: React.ReactNode\n}\n\nfunction CommandList({ children }: CommandListProps) {\n const { baseId, currentPage } = useCommandContext()\n\n // Filter children to only show items for current page\n const filteredChildren = React.Children.toArray(children).filter((child) => {\n if (!React.isValidElement(child)) return false\n // Show Command.Page only if it matches currentPage\n if (child.type === CommandPage) {\n return (child.props as CommandPageProps).id === currentPage\n }\n // Show groups/items only on root page\n return currentPage === 'root'\n })\n\n return (\n <div role=\"listbox\" id={`${baseId}-listbox`} className=\"py-2\">\n {filteredChildren}\n </div>\n )\n}\n\n// Command.Group\ninterface CommandGroupProps {\n heading?: React.ReactNode\n children: React.ReactNode\n}\n\nfunction CommandGroup({ heading, children }: CommandGroupProps) {\n const { searchValue, filteredItems } = useCommandContext()\n\n // Check if any children match the filter\n const childArray = React.Children.toArray(children)\n const hasVisibleChildren = childArray.some((child) => {\n if (!React.isValidElement(child)) return false\n const childProps = child.props as CommandItemProps\n const childValue = childProps.value || ''\n if (!searchValue) return true\n return filteredItems.some((fi) => fi.value === childValue || fi.id === childProps.value)\n })\n\n if (searchValue && !hasVisibleChildren) {\n return null\n }\n\n return (\n <div role=\"group\" aria-label={typeof heading === 'string' ? heading : undefined}>\n {heading && (\n <div className=\"px-3 py-2 text-xs font-semibold text-base-content/60 uppercase tracking-wider\">\n {heading}\n </div>\n )}\n {children}\n </div>\n )\n}\n\n// Command.Item\ninterface CommandItemProps {\n children: React.ReactNode\n value?: string\n onSelect?: () => void\n disabled?: boolean\n keywords?: string[]\n icon?: React.ReactNode\n}\n\nfunction CommandItem({\n children,\n value,\n onSelect,\n disabled = false,\n keywords = [],\n icon,\n}: CommandItemProps) {\n const {\n registerItem,\n unregisterItem,\n filteredItems,\n highlightedIndex,\n setHighlightedIndex,\n baseId,\n } = useCommandContext()\n\n const itemId = useId()\n const itemValue = value || (typeof children === 'string' ? children : '')\n\n // Register item\n useEffect(() => {\n registerItem(itemId, itemValue, keywords, disabled)\n return () => unregisterItem(itemId)\n }, [itemId, itemValue, keywords, disabled, registerItem, unregisterItem])\n\n // Store onSelect in a ref so we can access it from selectItem\n const onSelectRef = useRef(onSelect)\n onSelectRef.current = onSelect\n\n // Check if this item is visible after filtering\n const isVisible = filteredItems.some((fi) => fi.id === itemId)\n if (!isVisible) return null\n\n // Find index in filtered items\n const enabledItems = filteredItems.filter((fi) => !fi.disabled)\n const itemIndex = enabledItems.findIndex((fi) => fi.id === itemId)\n const isHighlighted = itemIndex === highlightedIndex\n\n const handleClick = () => {\n if (!disabled && onSelect) {\n onSelect()\n }\n }\n\n return (\n <div\n id={`${baseId}-item-${itemId}`}\n role=\"option\"\n aria-selected={isHighlighted}\n aria-disabled={disabled}\n data-command-item\n data-highlighted={isHighlighted}\n className={[\n 'px-3 py-2 cursor-pointer flex items-center gap-3',\n isHighlighted && 'bg-primary text-primary-content',\n !isHighlighted && 'hover:bg-base-200',\n disabled && 'opacity-50 cursor-not-allowed',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={handleClick}\n onMouseEnter={() => !disabled && setHighlightedIndex(itemIndex)}\n >\n {icon && <span className=\"w-5 h-5\">{icon}</span>}\n <span>{children}</span>\n </div>\n )\n}\n\n// Command.Empty\ninterface CommandEmptyProps {\n children?: React.ReactNode\n}\n\nfunction CommandEmpty({ children = 'No results found.' }: CommandEmptyProps) {\n const { filteredItems, searchValue } = useCommandContext()\n\n if (filteredItems.length > 0 || !searchValue) {\n return null\n }\n\n return <div className=\"px-3 py-8 text-center text-base-content/60\">{children}</div>\n}\n\n// Command.Page - for nested navigation\ninterface CommandPageProps {\n id: string\n children: React.ReactNode\n}\n\nfunction CommandPage({ id, children }: CommandPageProps) {\n const { currentPage } = useCommandContext()\n\n if (currentPage !== id) {\n return null\n }\n\n return <>{children}</>\n}\n\n// Command.Separator\nfunction CommandSeparator() {\n return <div className=\"my-2 border-t border-base-content/10\" role=\"separator\" />\n}\n\n// Export compound component\nexport const Command = Object.assign(CommandRoot, {\n Input: CommandInput,\n List: CommandList,\n Group: CommandGroup,\n Item: CommandItem,\n Empty: CommandEmpty,\n Page: CommandPage,\n Separator: CommandSeparator,\n})\n\nexport default Command\n"],"names":["dModal","dModalBox","dKbd","dKbdXs","CommandContext","createContext","useCommandContext","context","useContext","defaultFilter","value","search","keywords","searchLower","k","CommandRoot","forwardRef","children","controlledOpen","onOpenChange","defaultOpen","items","filter","loop","shortcut","placeholder","emptyMessage","className","rest","ref","dialogRef","useRef","inputRef","listRef","previousActiveElement","baseId","useId","internalOpen","setInternalOpen","useState","isControlled","isOpen","setIsOpen","useCallback","newOpen","searchValue","setSearchValue","highlightedIndex","setHighlightedIndex","registeredItems","setRegisteredItems","pageStack","setPageStack","currentPage","setPage","pageId","prev","goBack","registerItem","id","disabled","onSelect","next","unregisterItem","filteredItems","useMemo","item","label","enabledItems","selectItem","i","reg","useEffect","dialog","onDialogClose","handleGlobalKeyDown","e","key","handleKeyDown","handleBackdropClick","contextValue","renderDataDrivenItems","groups","ungrouped","fi","group","globalIndex","jsxs","Fragment","groupName","groupItems","jsx","itemIndex","isHighlighted","node","CommandInput","onValueChange","newValue","CommandList","filteredChildren","React","child","CommandPage","CommandGroup","heading","hasVisibleChildren","childProps","childValue","CommandItem","icon","itemId","itemValue","onSelectRef","handleClick","CommandEmpty","CommandSeparator","Command"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Command.js","sources":["../../src/components/Command.tsx"],"sourcesContent":["import React, {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\n// DaisyUI classes\nconst dModal = 'modal'\nconst dModalBox = 'modal-box'\nconst dKbd = 'kbd'\nconst dKbdXs = 'kbd-xs'\n\n// Types\nexport interface CommandItemConfig {\n key: string\n label: React.ReactNode\n group?: string\n keywords?: string[]\n disabled?: boolean\n onSelect?: () => void\n icon?: React.ReactNode\n}\n\nexport interface CommandProps extends Omit<React.HTMLAttributes<HTMLDialogElement>, 'children'> {\n children?: React.ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n defaultOpen?: boolean\n items?: CommandItemConfig[]\n filter?: (value: string, search: string, keywords?: string[]) => boolean\n loop?: boolean\n shortcut?: string[]\n placeholder?: string\n emptyMessage?: React.ReactNode\n 'data-testid'?: string\n}\n\ninterface CommandContextValue {\n searchValue: string\n setSearchValue: (value: string) => void\n highlightedIndex: number\n setHighlightedIndex: (index: number) => void\n registerItem: (id: string, value: string, keywords: string[], disabled: boolean) => void\n unregisterItem: (id: string) => void\n filteredItems: FilteredItem[]\n selectItem: (id: string) => void\n loop: boolean\n baseId: string\n currentPage: string\n setPage: (pageId: string) => void\n goBack: () => void\n pageStack: string[]\n getTestId?: (suffix: string) => string | undefined\n}\n\ninterface FilteredItem {\n id: string\n value: string\n keywords: string[]\n disabled: boolean\n}\n\ninterface ItemRegistration {\n id: string\n value: string\n keywords: string[]\n disabled: boolean\n onSelect?: () => void\n}\n\nconst CommandContext = createContext<CommandContextValue | null>(null)\n\nfunction useCommandContext() {\n const context = useContext(CommandContext)\n if (!context) {\n throw new Error('Command compound components must be used within a Command')\n }\n return context\n}\n\n// Default filter function\nconst defaultFilter = (value: string, search: string, keywords: string[] = []): boolean => {\n const searchLower = search.toLowerCase()\n const valueLower = value.toLowerCase()\n if (valueLower.includes(searchLower)) return true\n return keywords.some((k) => k.toLowerCase().includes(searchLower))\n}\n\n// Root Command component\nconst CommandRoot = forwardRef<HTMLDialogElement, CommandProps>(\n (\n {\n children,\n open: controlledOpen,\n onOpenChange,\n defaultOpen = false,\n items,\n filter = defaultFilter,\n loop = true,\n shortcut = ['k'],\n placeholder = 'Type a command or search...',\n emptyMessage = 'No results found.',\n className = '',\n 'data-testid': testId,\n ...rest\n },\n ref\n ) => {\n const dialogRef = useRef<HTMLDialogElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const listRef = useRef<HTMLDivElement>(null)\n const previousActiveElement = useRef<HTMLElement | null>(null)\n const baseId = useId()\n\n // Controlled/uncontrolled open state\n const [internalOpen, setInternalOpen] = useState(defaultOpen)\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n const setIsOpen = useCallback(\n (newOpen: boolean) => {\n if (!isControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n },\n [isControlled, onOpenChange]\n )\n\n // State\n const [searchValue, setSearchValue] = useState('')\n const [highlightedIndex, setHighlightedIndex] = useState(0)\n const [registeredItems, setRegisteredItems] = useState<Map<string, ItemRegistration>>(new Map())\n const [pageStack, setPageStack] = useState<string[]>(['root'])\n const currentPage = pageStack[pageStack.length - 1]\n\n // Page navigation\n const setPage = useCallback((pageId: string) => {\n setPageStack((prev) => [...prev, pageId])\n setSearchValue('')\n setHighlightedIndex(0)\n }, [])\n\n const goBack = useCallback(() => {\n if (pageStack.length > 1) {\n setPageStack((prev) => prev.slice(0, -1))\n setSearchValue('')\n setHighlightedIndex(0)\n }\n }, [pageStack.length])\n\n // Item registration for compound components\n const registerItem = useCallback(\n (id: string, value: string, keywords: string[], disabled: boolean, onSelect?: () => void) => {\n setRegisteredItems((prev) => {\n const next = new Map(prev)\n next.set(id, { id, value, keywords, disabled, onSelect })\n return next\n })\n },\n []\n )\n\n const unregisterItem = useCallback((id: string) => {\n setRegisteredItems((prev) => {\n const next = new Map(prev)\n next.delete(id)\n return next\n })\n }, [])\n\n // Compute filtered items\n const filteredItems = useMemo((): FilteredItem[] => {\n // Use data-driven items if provided\n if (items) {\n return items\n .filter((item) => {\n if (!searchValue) return true\n const label = typeof item.label === 'string' ? item.label : ''\n return filter(label, searchValue, item.keywords)\n })\n .map((item) => ({\n id: item.key,\n value: typeof item.label === 'string' ? item.label : item.key,\n keywords: item.keywords || [],\n disabled: item.disabled || false,\n }))\n }\n\n // Use registered compound items\n const itemsArray = Array.from(registeredItems.values())\n return itemsArray.filter((item) => {\n if (!searchValue) return true\n return filter(item.value, searchValue, item.keywords)\n })\n }, [items, registeredItems, searchValue, filter])\n\n // Get enabled items for navigation\n const enabledItems = useMemo(\n () => filteredItems.filter((item) => !item.disabled),\n [filteredItems]\n )\n\n // Select item\n const selectItem = useCallback(\n (id: string) => {\n if (items) {\n const item = items.find((i) => i.key === id)\n if (item && !item.disabled) {\n item.onSelect?.()\n setIsOpen(false)\n }\n } else {\n const reg = registeredItems.get(id)\n if (reg && !reg.disabled) {\n reg.onSelect?.()\n setIsOpen(false)\n }\n }\n },\n [items, registeredItems, setIsOpen]\n )\n\n // Reset state when opening\n useEffect(() => {\n if (isOpen) {\n setSearchValue('')\n setHighlightedIndex(0)\n setPageStack(['root'])\n }\n }, [isOpen])\n\n // Handle dialog open/close\n useEffect(() => {\n const dialog = dialogRef.current\n if (!dialog) return\n\n if (isOpen) {\n if (!dialog.open) {\n previousActiveElement.current = document.activeElement as HTMLElement\n dialog.showModal()\n setTimeout(() => inputRef.current?.focus(), 0)\n }\n } else {\n if (dialog.open) {\n dialog.close()\n previousActiveElement.current?.focus()\n }\n }\n }, [isOpen])\n\n // Handle dialog close event\n useEffect(() => {\n const dialog = dialogRef.current\n if (!dialog) return\n\n const onDialogClose = () => {\n setIsOpen(false)\n }\n\n dialog.addEventListener('close', onDialogClose)\n return () => dialog.removeEventListener('close', onDialogClose)\n }, [setIsOpen])\n\n // Global keyboard shortcut\n useEffect(() => {\n const handleGlobalKeyDown = (e: KeyboardEvent) => {\n const key = shortcut[0]?.toLowerCase()\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === key) {\n e.preventDefault()\n setIsOpen(!isOpen)\n }\n }\n\n document.addEventListener('keydown', handleGlobalKeyDown)\n return () => document.removeEventListener('keydown', handleGlobalKeyDown)\n }, [shortcut, isOpen, setIsOpen])\n\n // Keyboard navigation\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault()\n if (enabledItems.length === 0) return\n setHighlightedIndex((prev) => {\n const next = prev + 1\n if (next >= enabledItems.length) {\n return loop ? 0 : prev\n }\n return next\n })\n break\n }\n case 'ArrowUp': {\n e.preventDefault()\n if (enabledItems.length === 0) return\n setHighlightedIndex((prev) => {\n const next = prev - 1\n if (next < 0) {\n return loop ? enabledItems.length - 1 : 0\n }\n return next\n })\n break\n }\n case 'Enter': {\n e.preventDefault()\n const item = enabledItems[highlightedIndex]\n if (item) {\n selectItem(item.id)\n }\n break\n }\n case 'Escape': {\n e.preventDefault()\n if (pageStack.length > 1) {\n goBack()\n } else {\n setIsOpen(false)\n }\n break\n }\n case 'Backspace': {\n if (searchValue === '' && pageStack.length > 1) {\n e.preventDefault()\n goBack()\n }\n break\n }\n }\n },\n [enabledItems, highlightedIndex, loop, selectItem, pageStack, goBack, searchValue, setIsOpen]\n )\n\n // Scroll highlighted item into view\n useEffect(() => {\n if (highlightedIndex >= 0 && listRef.current) {\n const items = listRef.current.querySelectorAll('[data-command-item]')\n const highlightedEl = items[highlightedIndex] as HTMLElement\n highlightedEl?.scrollIntoView({ block: 'nearest' })\n }\n }, [highlightedIndex])\n\n // Handle mask click\n const handleBackdropClick = (e: React.MouseEvent) => {\n if (e.target === dialogRef.current) {\n setIsOpen(false)\n }\n }\n\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n const contextValue: CommandContextValue = {\n searchValue,\n setSearchValue,\n highlightedIndex,\n setHighlightedIndex,\n registerItem: (id, value, keywords, disabled) => registerItem(id, value, keywords, disabled),\n unregisterItem,\n filteredItems,\n selectItem,\n loop,\n baseId,\n currentPage,\n setPage,\n goBack,\n pageStack,\n getTestId,\n }\n\n // Render data-driven items\n const renderDataDrivenItems = () => {\n if (!items) return null\n\n // Group items\n const groups = new Map<string, CommandItemConfig[]>()\n const ungrouped: CommandItemConfig[] = []\n\n filteredItems.forEach((fi) => {\n const item = items.find((i) => i.key === fi.id)\n if (!item) return\n if (item.group) {\n const group = groups.get(item.group) || []\n group.push(item)\n groups.set(item.group, group)\n } else {\n ungrouped.push(item)\n }\n })\n\n let globalIndex = 0\n\n return (\n <>\n {Array.from(groups.entries()).map(([groupName, groupItems]) => (\n <div key={groupName} role=\"group\" aria-label={groupName} data-testid={getTestId(`group-${groupName}`)}>\n <div className=\"px-3 py-2 text-xs font-semibold text-base-content/60 uppercase tracking-wider\">\n {groupName}\n </div>\n {groupItems.map((item) => {\n const itemIndex = globalIndex++\n const isHighlighted = itemIndex === highlightedIndex\n return (\n <div\n key={item.key}\n role=\"option\"\n aria-selected={isHighlighted}\n aria-disabled={item.disabled}\n data-command-item\n data-highlighted={isHighlighted}\n className={[\n 'px-3 py-2 cursor-pointer flex items-center gap-3',\n isHighlighted && 'bg-primary text-primary-content',\n !isHighlighted && 'hover:bg-base-200',\n item.disabled && 'opacity-50 cursor-not-allowed',\n ]\n .filter(Boolean)\n .join(' ')}\n data-testid={getTestId(`item-${item.key}`)}\n onClick={() => !item.disabled && selectItem(item.key)}\n onMouseEnter={() => !item.disabled && setHighlightedIndex(itemIndex)}\n >\n {item.icon && <span className=\"w-5 h-5\">{item.icon}</span>}\n <span>{item.label}</span>\n </div>\n )\n })}\n </div>\n ))}\n {ungrouped.length > 0 && (\n <div role=\"group\" data-testid={getTestId('group-ungrouped')}>\n {ungrouped.map((item) => {\n const itemIndex = globalIndex++\n const isHighlighted = itemIndex === highlightedIndex\n return (\n <div\n key={item.key}\n role=\"option\"\n aria-selected={isHighlighted}\n aria-disabled={item.disabled}\n data-command-item\n data-highlighted={isHighlighted}\n className={[\n 'px-3 py-2 cursor-pointer flex items-center gap-3',\n isHighlighted && 'bg-primary text-primary-content',\n !isHighlighted && 'hover:bg-base-200',\n item.disabled && 'opacity-50 cursor-not-allowed',\n ]\n .filter(Boolean)\n .join(' ')}\n data-testid={getTestId(`item-${item.key}`)}\n onClick={() => !item.disabled && selectItem(item.key)}\n onMouseEnter={() => !item.disabled && setHighlightedIndex(itemIndex)}\n >\n {item.icon && <span className=\"w-5 h-5\">{item.icon}</span>}\n <span>{item.label}</span>\n </div>\n )\n })}\n </div>\n )}\n </>\n )\n }\n\n return (\n <dialog\n ref={(node) => {\n ;(dialogRef as React.MutableRefObject<HTMLDialogElement | null>).current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n }}\n className={`${dModal} ${className}`}\n onClick={handleBackdropClick}\n data-testid={testId}\n {...rest}\n >\n <div\n className={`${dModalBox} p-0 max-w-lg w-full overflow-hidden`}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Command palette\"\n data-testid={getTestId('dialog')}\n >\n <CommandContext.Provider value={contextValue}>\n {/* Breadcrumb for nested pages */}\n {pageStack.length > 1 && (\n <div className=\"px-3 py-2 border-b border-base-content/10 flex items-center gap-2 text-sm\">\n <button\n onClick={goBack}\n className=\"hover:bg-base-200 rounded p-1\"\n aria-label=\"Go back\"\n data-testid={getTestId('back')}\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n <span className=\"text-base-content/60\">{currentPage}</span>\n </div>\n )}\n\n {/* Search input */}\n <div className=\"px-3 py-3 border-b border-base-content/10\">\n <div className=\"flex items-center gap-3\">\n <svg\n className=\"w-5 h-5 text-base-content/50\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n <input\n ref={inputRef}\n type=\"text\"\n className=\"flex-1 bg-transparent border-none outline-none text-base placeholder:text-base-content/50\"\n placeholder={placeholder}\n value={searchValue}\n onChange={(e) => {\n setSearchValue(e.target.value)\n setHighlightedIndex(0)\n }}\n onKeyDown={handleKeyDown}\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={`${baseId}-listbox`}\n aria-activedescendant={\n enabledItems[highlightedIndex]\n ? `${baseId}-item-${enabledItems[highlightedIndex].id}`\n : undefined\n }\n data-testid={getTestId('input')}\n />\n </div>\n </div>\n\n {/* List */}\n <div\n ref={listRef}\n className=\"max-h-80 overflow-y-auto py-2\"\n role=\"listbox\"\n id={`${baseId}-listbox`}\n data-testid={getTestId('list')}\n >\n {items ? (\n filteredItems.length > 0 ? (\n renderDataDrivenItems()\n ) : (\n <div className=\"px-3 py-8 text-center text-base-content/60\" data-testid={getTestId('empty')}>\n {emptyMessage}\n </div>\n )\n ) : (\n children\n )}\n </div>\n\n {/* Footer with shortcut hint */}\n <div\n className=\"px-3 py-2 border-t border-base-content/10 flex items-center justify-between text-xs text-base-content/50\"\n data-testid={getTestId('footer')}\n >\n <div className=\"flex items-center gap-4\">\n <span className=\"flex items-center gap-1\">\n <kbd className={`${dKbd} ${dKbdXs}`}>↑↓</kbd> navigate\n </span>\n <span className=\"flex items-center gap-1\">\n <kbd className={`${dKbd} ${dKbdXs}`}>↵</kbd> select\n </span>\n <span className=\"flex items-center gap-1\">\n <kbd className={`${dKbd} ${dKbdXs}`}>esc</kbd> close\n </span>\n </div>\n </div>\n </CommandContext.Provider>\n </div>\n </dialog>\n )\n }\n)\n\nCommandRoot.displayName = 'Command'\n\n// Command.Input - for compound pattern customization\ninterface CommandInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange'> {\n value?: string\n onValueChange?: (value: string) => void\n 'data-testid'?: string\n}\n\nfunction CommandInput({ placeholder, value, onValueChange, 'data-testid': testId, ...rest }: CommandInputProps) {\n const { searchValue, setSearchValue, getTestId } = useCommandContext()\n const controlledValue = value !== undefined ? value : searchValue\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value\n if (onValueChange) {\n onValueChange(newValue)\n } else {\n setSearchValue(newValue)\n }\n }\n\n return (\n <input\n type=\"text\"\n className=\"flex-1 bg-transparent border-none outline-none text-base placeholder:text-base-content/50\"\n placeholder={placeholder}\n value={controlledValue}\n onChange={handleChange}\n data-testid={testId ?? getTestId?.('input')}\n {...rest}\n />\n )\n}\n\n// Command.List\ninterface CommandListProps {\n children: React.ReactNode\n}\n\nfunction CommandList({ children }: CommandListProps) {\n const { baseId, currentPage, getTestId } = useCommandContext()\n\n // Filter children to only show items for current page\n const filteredChildren = React.Children.toArray(children).filter((child) => {\n if (!React.isValidElement(child)) return false\n // Show Command.Page only if it matches currentPage\n if (child.type === CommandPage) {\n return (child.props as CommandPageProps).id === currentPage\n }\n // Show groups/items only on root page\n return currentPage === 'root'\n })\n\n return (\n <div role=\"listbox\" id={`${baseId}-listbox`} className=\"py-2\" data-testid={getTestId?.('list')}>\n {filteredChildren}\n </div>\n )\n}\n\n// Command.Group\ninterface CommandGroupProps {\n heading?: React.ReactNode\n children: React.ReactNode\n}\n\nfunction CommandGroup({ heading, children }: CommandGroupProps) {\n const { searchValue, filteredItems, getTestId } = useCommandContext()\n\n // Check if any children match the filter\n const childArray = React.Children.toArray(children)\n const hasVisibleChildren = childArray.some((child) => {\n if (!React.isValidElement(child)) return false\n const childProps = child.props as CommandItemProps\n const childValue = childProps.value || ''\n if (!searchValue) return true\n return filteredItems.some((fi) => fi.value === childValue || fi.id === childProps.value)\n })\n\n if (searchValue && !hasVisibleChildren) {\n return null\n }\n\n return (\n <div\n role=\"group\"\n aria-label={typeof heading === 'string' ? heading : undefined}\n data-testid={getTestId?.(`group-${typeof heading === 'string' ? heading : 'group'}`)}\n >\n {heading && (\n <div className=\"px-3 py-2 text-xs font-semibold text-base-content/60 uppercase tracking-wider\">\n {heading}\n </div>\n )}\n {children}\n </div>\n )\n}\n\n// Command.Item\ninterface CommandItemProps {\n children: React.ReactNode\n value?: string\n onSelect?: () => void\n disabled?: boolean\n keywords?: string[]\n icon?: React.ReactNode\n 'data-testid'?: string\n}\n\nfunction CommandItem({\n children,\n value,\n onSelect,\n disabled = false,\n keywords = [],\n icon,\n 'data-testid': testId,\n}: CommandItemProps) {\n const {\n registerItem,\n unregisterItem,\n filteredItems,\n highlightedIndex,\n setHighlightedIndex,\n baseId,\n getTestId,\n } = useCommandContext()\n\n const itemId = useId()\n const itemValue = value || (typeof children === 'string' ? children : '')\n\n // Register item\n useEffect(() => {\n registerItem(itemId, itemValue, keywords, disabled)\n return () => unregisterItem(itemId)\n }, [itemId, itemValue, keywords, disabled, registerItem, unregisterItem])\n\n // Store onSelect in a ref so we can access it from selectItem\n const onSelectRef = useRef(onSelect)\n onSelectRef.current = onSelect\n\n // Check if this item is visible after filtering\n const isVisible = filteredItems.some((fi) => fi.id === itemId)\n if (!isVisible) return null\n\n // Find index in filtered items\n const enabledItems = filteredItems.filter((fi) => !fi.disabled)\n const itemIndex = enabledItems.findIndex((fi) => fi.id === itemId)\n const isHighlighted = itemIndex === highlightedIndex\n const itemTestId = testId ?? getTestId?.(`item-${itemValue || itemId}`)\n\n const handleClick = () => {\n if (!disabled && onSelect) {\n onSelect()\n }\n }\n\n return (\n <div\n id={`${baseId}-item-${itemId}`}\n role=\"option\"\n aria-selected={isHighlighted}\n aria-disabled={disabled}\n data-command-item\n data-highlighted={isHighlighted}\n data-testid={itemTestId}\n className={[\n 'px-3 py-2 cursor-pointer flex items-center gap-3',\n isHighlighted && 'bg-primary text-primary-content',\n !isHighlighted && 'hover:bg-base-200',\n disabled && 'opacity-50 cursor-not-allowed',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={handleClick}\n onMouseEnter={() => !disabled && setHighlightedIndex(itemIndex)}\n >\n {icon && <span className=\"w-5 h-5\">{icon}</span>}\n <span>{children}</span>\n </div>\n )\n}\n\n// Command.Empty\ninterface CommandEmptyProps {\n children?: React.ReactNode\n}\n\nfunction CommandEmpty({ children = 'No results found.' }: CommandEmptyProps) {\n const { filteredItems, searchValue, getTestId } = useCommandContext()\n\n if (filteredItems.length > 0 || !searchValue) {\n return null\n }\n\n return (\n <div className=\"px-3 py-8 text-center text-base-content/60\" data-testid={getTestId?.('empty')}>\n {children}\n </div>\n )\n}\n\n// Command.Page - for nested navigation\ninterface CommandPageProps {\n id: string\n children: React.ReactNode\n}\n\nfunction CommandPage({ id, children }: CommandPageProps) {\n const { currentPage } = useCommandContext()\n\n if (currentPage !== id) {\n return null\n }\n\n return <>{children}</>\n}\n\n// Command.Separator\nfunction CommandSeparator() {\n const { getTestId } = useCommandContext()\n return <div className=\"my-2 border-t border-base-content/10\" role=\"separator\" data-testid={getTestId?.('separator')} />\n}\n\n// Export compound component\nexport const Command = Object.assign(CommandRoot, {\n Input: CommandInput,\n List: CommandList,\n Group: CommandGroup,\n Item: CommandItem,\n Empty: CommandEmpty,\n Page: CommandPage,\n Separator: CommandSeparator,\n})\n\nexport default Command\n"],"names":["dModal","dModalBox","dKbd","dKbdXs","CommandContext","createContext","useCommandContext","context","useContext","defaultFilter","value","search","keywords","searchLower","k","CommandRoot","forwardRef","children","controlledOpen","onOpenChange","defaultOpen","items","filter","loop","shortcut","placeholder","emptyMessage","className","testId","rest","ref","dialogRef","useRef","inputRef","listRef","previousActiveElement","baseId","useId","internalOpen","setInternalOpen","useState","isControlled","isOpen","setIsOpen","useCallback","newOpen","searchValue","setSearchValue","highlightedIndex","setHighlightedIndex","registeredItems","setRegisteredItems","pageStack","setPageStack","currentPage","setPage","pageId","prev","goBack","registerItem","id","disabled","onSelect","next","unregisterItem","filteredItems","useMemo","item","label","enabledItems","selectItem","i","reg","useEffect","dialog","onDialogClose","handleGlobalKeyDown","e","key","handleKeyDown","handleBackdropClick","getTestId","suffix","contextValue","renderDataDrivenItems","groups","ungrouped","fi","group","globalIndex","jsxs","Fragment","groupName","groupItems","jsx","itemIndex","isHighlighted","node","CommandInput","onValueChange","newValue","CommandList","filteredChildren","React","child","CommandPage","CommandGroup","heading","hasVisibleChildren","childProps","childValue","CommandItem","icon","itemId","itemValue","onSelectRef","itemTestId","handleClick","CommandEmpty","CommandSeparator","Command"],"mappings":"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"}
|
|
@@ -19,6 +19,7 @@ export interface ContextMenuProps {
|
|
|
19
19
|
disabled?: boolean;
|
|
20
20
|
/** Additional CSS classes for the menu */
|
|
21
21
|
className?: string;
|
|
22
|
+
'data-testid'?: string;
|
|
22
23
|
}
|
|
23
24
|
export interface ContextMenuItemProps {
|
|
24
25
|
/** Item content */
|
|
@@ -33,10 +34,12 @@ export interface ContextMenuItemProps {
|
|
|
33
34
|
className?: string;
|
|
34
35
|
/** @internal */
|
|
35
36
|
_key?: string;
|
|
37
|
+
'data-testid'?: string;
|
|
36
38
|
}
|
|
37
39
|
export interface ContextMenuDividerProps {
|
|
38
40
|
/** Additional CSS classes */
|
|
39
41
|
className?: string;
|
|
42
|
+
'data-testid'?: string;
|
|
40
43
|
}
|
|
41
44
|
export interface ContextMenuSubMenuProps {
|
|
42
45
|
/** Submenu label */
|
|
@@ -51,6 +54,7 @@ export interface ContextMenuSubMenuProps {
|
|
|
51
54
|
className?: string;
|
|
52
55
|
/** @internal */
|
|
53
56
|
_key?: string;
|
|
57
|
+
'data-testid'?: string;
|
|
54
58
|
}
|
|
55
59
|
export declare const ContextMenu: React.FC<ContextMenuProps> & {
|
|
56
60
|
Item: React.FC<ContextMenuItemProps>;
|
|
@@ -1,223 +1,242 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import
|
|
3
|
-
import { createPortal as
|
|
4
|
-
import { useConfig as
|
|
5
|
-
const
|
|
6
|
-
const e =
|
|
1
|
+
import { jsxs as g, Fragment as F, jsx as t } from "react/jsx-runtime";
|
|
2
|
+
import M, { useState as k, useRef as $, useCallback as N, useEffect as R, createContext as K, useContext as X } from "react";
|
|
3
|
+
import { createPortal as Y } from "react-dom";
|
|
4
|
+
import { useConfig as q } from "../providers/ConfigProvider.js";
|
|
5
|
+
const E = "menu", D = "divider", j = K(null), P = () => {
|
|
6
|
+
const e = X(j);
|
|
7
7
|
if (!e)
|
|
8
8
|
throw new Error("ContextMenu compound components must be used within a ContextMenu");
|
|
9
9
|
return e;
|
|
10
|
-
},
|
|
10
|
+
}, W = ({
|
|
11
11
|
children: e,
|
|
12
|
-
icon:
|
|
13
|
-
disabled:
|
|
14
|
-
danger:
|
|
15
|
-
className:
|
|
16
|
-
_key:
|
|
12
|
+
icon: l,
|
|
13
|
+
disabled: a = !1,
|
|
14
|
+
danger: c = !1,
|
|
15
|
+
className: f = "",
|
|
16
|
+
_key: s,
|
|
17
|
+
"data-testid": m
|
|
17
18
|
}) => {
|
|
18
|
-
const { onSelect:
|
|
19
|
-
return /* @__PURE__ */
|
|
19
|
+
const { onSelect: i, onClose: h, getTestId: o } = P(), d = m ?? (s ? o?.(`item-${s}`) : void 0);
|
|
20
|
+
return /* @__PURE__ */ t("li", { className: f, role: "none", children: /* @__PURE__ */ g(
|
|
20
21
|
"button",
|
|
21
22
|
{
|
|
22
23
|
onClick: () => {
|
|
23
|
-
|
|
24
|
+
a || !s || (i(s), h());
|
|
24
25
|
},
|
|
25
|
-
disabled:
|
|
26
|
+
disabled: a,
|
|
26
27
|
role: "menuitem",
|
|
27
|
-
"aria-disabled":
|
|
28
|
+
"aria-disabled": a,
|
|
29
|
+
"data-testid": d,
|
|
28
30
|
className: `
|
|
29
31
|
flex items-center gap-2 w-full px-4 py-2 text-left text-sm
|
|
30
|
-
${
|
|
31
|
-
${
|
|
32
|
+
${a ? "opacity-50 cursor-not-allowed" : "hover:bg-base-200"}
|
|
33
|
+
${c ? "text-error hover:bg-error/10" : ""}
|
|
32
34
|
`,
|
|
33
35
|
children: [
|
|
34
|
-
|
|
35
|
-
/* @__PURE__ */
|
|
36
|
+
l && /* @__PURE__ */ t("span", { className: "w-4 h-4", "aria-hidden": "true", children: l }),
|
|
37
|
+
/* @__PURE__ */ t("span", { className: "flex-1", children: e })
|
|
36
38
|
]
|
|
37
39
|
}
|
|
38
40
|
) });
|
|
39
|
-
},
|
|
41
|
+
}, G = ({ className: e = "", "data-testid": l }) => /* @__PURE__ */ t("li", { className: `${D} my-1 ${e}`, role: "separator", "data-testid": l }), I = ({
|
|
40
42
|
label: e,
|
|
41
|
-
icon:
|
|
42
|
-
disabled:
|
|
43
|
-
children:
|
|
44
|
-
className:
|
|
45
|
-
_key:
|
|
43
|
+
icon: l,
|
|
44
|
+
disabled: a = !1,
|
|
45
|
+
children: c,
|
|
46
|
+
className: f = "",
|
|
47
|
+
_key: s,
|
|
48
|
+
"data-testid": m
|
|
46
49
|
}) => {
|
|
47
|
-
const [
|
|
48
|
-
|
|
49
|
-
},
|
|
50
|
-
|
|
50
|
+
const { getTestId: i } = P(), [h, o] = k(!1), d = $(null), u = m ?? (s ? i?.(`submenu-${s}`) : void 0), x = () => {
|
|
51
|
+
a || (d.current && clearTimeout(d.current), o(!0));
|
|
52
|
+
}, C = () => {
|
|
53
|
+
d.current = setTimeout(() => o(!1), 100);
|
|
51
54
|
};
|
|
52
|
-
return /* @__PURE__ */
|
|
55
|
+
return /* @__PURE__ */ g(
|
|
53
56
|
"li",
|
|
54
57
|
{
|
|
55
|
-
onMouseEnter:
|
|
56
|
-
onMouseLeave:
|
|
57
|
-
className: `relative ${
|
|
58
|
+
onMouseEnter: x,
|
|
59
|
+
onMouseLeave: C,
|
|
60
|
+
className: `relative ${f}`,
|
|
58
61
|
role: "none",
|
|
59
62
|
children: [
|
|
60
|
-
/* @__PURE__ */
|
|
63
|
+
/* @__PURE__ */ g(
|
|
61
64
|
"button",
|
|
62
65
|
{
|
|
63
|
-
disabled:
|
|
66
|
+
disabled: a,
|
|
64
67
|
role: "menuitem",
|
|
65
68
|
"aria-haspopup": "menu",
|
|
66
|
-
"aria-expanded":
|
|
67
|
-
"aria-disabled":
|
|
69
|
+
"aria-expanded": h,
|
|
70
|
+
"aria-disabled": a,
|
|
71
|
+
"data-testid": u,
|
|
68
72
|
className: `
|
|
69
73
|
flex items-center gap-2 w-full px-4 py-2 text-left text-sm
|
|
70
|
-
${
|
|
74
|
+
${a ? "opacity-50 cursor-not-allowed" : "hover:bg-base-200"}
|
|
71
75
|
`,
|
|
72
76
|
children: [
|
|
73
|
-
|
|
74
|
-
/* @__PURE__ */
|
|
75
|
-
/* @__PURE__ */
|
|
77
|
+
l && /* @__PURE__ */ t("span", { className: "w-4 h-4", "aria-hidden": "true", children: l }),
|
|
78
|
+
/* @__PURE__ */ t("span", { className: "flex-1", children: e }),
|
|
79
|
+
/* @__PURE__ */ t("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", "aria-hidden": "true", children: /* @__PURE__ */ t("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) })
|
|
76
80
|
]
|
|
77
81
|
}
|
|
78
82
|
),
|
|
79
|
-
|
|
83
|
+
h && /* @__PURE__ */ t(
|
|
80
84
|
"ul",
|
|
81
85
|
{
|
|
82
|
-
className: `${
|
|
83
|
-
onMouseEnter:
|
|
84
|
-
onMouseLeave:
|
|
86
|
+
className: `${E} bg-base-100 rounded-box shadow-lg border border-base-300 absolute left-full top-0 min-w-[160px] z-50 p-1`,
|
|
87
|
+
onMouseEnter: x,
|
|
88
|
+
onMouseLeave: C,
|
|
85
89
|
role: "menu",
|
|
86
|
-
|
|
90
|
+
"data-testid": u ? `${u}-menu` : void 0,
|
|
91
|
+
children: c
|
|
87
92
|
}
|
|
88
93
|
)
|
|
89
94
|
]
|
|
90
95
|
}
|
|
91
96
|
);
|
|
92
|
-
},
|
|
93
|
-
const [
|
|
97
|
+
}, z = ({ item: e, onSelect: l, onClose: a, getTestId: c }) => {
|
|
98
|
+
const [f, s] = k(!1), m = $(null), i = c?.(`item-${e.key}`);
|
|
94
99
|
if (e.divider)
|
|
95
|
-
return /* @__PURE__ */
|
|
96
|
-
const
|
|
97
|
-
e.disabled || e.children && e.children.length > 0 || (
|
|
98
|
-
},
|
|
99
|
-
|
|
100
|
-
},
|
|
101
|
-
|
|
100
|
+
return /* @__PURE__ */ t("li", { className: `${D} my-1`, role: "separator", "data-testid": c?.(`separator-${e.key}`) });
|
|
101
|
+
const h = () => {
|
|
102
|
+
e.disabled || e.children && e.children.length > 0 || (l(e.key), a());
|
|
103
|
+
}, o = e.children && e.children.length > 0, d = () => {
|
|
104
|
+
o && (m.current && clearTimeout(m.current), s(!0));
|
|
105
|
+
}, u = () => {
|
|
106
|
+
o && (m.current = setTimeout(() => s(!1), 100));
|
|
102
107
|
};
|
|
103
|
-
return /* @__PURE__ */
|
|
108
|
+
return /* @__PURE__ */ g(
|
|
104
109
|
"li",
|
|
105
110
|
{
|
|
106
|
-
onMouseEnter:
|
|
107
|
-
onMouseLeave:
|
|
111
|
+
onMouseEnter: d,
|
|
112
|
+
onMouseLeave: u,
|
|
108
113
|
className: "relative",
|
|
109
114
|
role: "none",
|
|
110
115
|
children: [
|
|
111
|
-
/* @__PURE__ */
|
|
116
|
+
/* @__PURE__ */ g(
|
|
112
117
|
"button",
|
|
113
118
|
{
|
|
114
|
-
onClick:
|
|
119
|
+
onClick: h,
|
|
115
120
|
disabled: e.disabled,
|
|
116
121
|
role: "menuitem",
|
|
117
|
-
"aria-haspopup":
|
|
118
|
-
"aria-expanded":
|
|
122
|
+
"aria-haspopup": o ? "menu" : void 0,
|
|
123
|
+
"aria-expanded": o ? f : void 0,
|
|
119
124
|
"aria-disabled": e.disabled,
|
|
125
|
+
"data-testid": i,
|
|
120
126
|
className: `
|
|
121
127
|
flex items-center gap-2 w-full px-4 py-2 text-left text-sm
|
|
122
128
|
${e.disabled ? "opacity-50 cursor-not-allowed" : "hover:bg-base-200"}
|
|
123
129
|
${e.danger ? "text-error hover:bg-error/10" : ""}
|
|
124
130
|
`,
|
|
125
131
|
children: [
|
|
126
|
-
e.icon && /* @__PURE__ */
|
|
127
|
-
/* @__PURE__ */
|
|
128
|
-
|
|
132
|
+
e.icon && /* @__PURE__ */ t("span", { className: "w-4 h-4", "aria-hidden": "true", children: e.icon }),
|
|
133
|
+
/* @__PURE__ */ t("span", { className: "flex-1", children: e.label }),
|
|
134
|
+
o && /* @__PURE__ */ t("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", "aria-hidden": "true", children: /* @__PURE__ */ t("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) })
|
|
129
135
|
]
|
|
130
136
|
}
|
|
131
137
|
),
|
|
132
|
-
|
|
138
|
+
o && f && /* @__PURE__ */ t(
|
|
133
139
|
"ul",
|
|
134
140
|
{
|
|
135
|
-
className: `${
|
|
136
|
-
onMouseEnter:
|
|
137
|
-
onMouseLeave:
|
|
141
|
+
className: `${E} bg-base-100 rounded-box shadow-lg border border-base-300 absolute left-full top-0 min-w-[160px] z-50 p-1`,
|
|
142
|
+
onMouseEnter: d,
|
|
143
|
+
onMouseLeave: u,
|
|
138
144
|
role: "menu",
|
|
139
|
-
|
|
145
|
+
"data-testid": i ? `${i}-menu` : void 0,
|
|
146
|
+
children: e.children.map((x) => /* @__PURE__ */ t(z, { item: x, onSelect: l, onClose: a, getTestId: c }, x.key))
|
|
140
147
|
}
|
|
141
148
|
)
|
|
142
149
|
]
|
|
143
150
|
}
|
|
144
151
|
);
|
|
145
|
-
},
|
|
152
|
+
}, J = ({
|
|
146
153
|
children: e,
|
|
147
|
-
items:
|
|
148
|
-
onSelect:
|
|
149
|
-
disabled:
|
|
150
|
-
className:
|
|
154
|
+
items: l,
|
|
155
|
+
onSelect: a,
|
|
156
|
+
disabled: c = !1,
|
|
157
|
+
className: f = "",
|
|
158
|
+
"data-testid": s
|
|
151
159
|
}) => {
|
|
152
|
-
const { getPopupContainer:
|
|
153
|
-
(
|
|
154
|
-
if (
|
|
155
|
-
|
|
156
|
-
let
|
|
157
|
-
|
|
160
|
+
const { getPopupContainer: m } = q(), [i, h] = k(!1), [o, d] = k({ x: 0, y: 0 }), u = $(null), x = $(null), C = N(
|
|
161
|
+
(n) => {
|
|
162
|
+
if (c) return;
|
|
163
|
+
n.preventDefault(), n.stopPropagation();
|
|
164
|
+
let r = n.clientX, p = n.clientY;
|
|
165
|
+
d({ x: r, y: p }), h(!0);
|
|
158
166
|
},
|
|
159
|
-
[
|
|
160
|
-
),
|
|
161
|
-
|
|
162
|
-
}, []),
|
|
163
|
-
(
|
|
164
|
-
|
|
167
|
+
[c]
|
|
168
|
+
), b = N(() => {
|
|
169
|
+
h(!1);
|
|
170
|
+
}, []), L = N(
|
|
171
|
+
(n) => {
|
|
172
|
+
a?.(n);
|
|
165
173
|
},
|
|
166
|
-
[
|
|
174
|
+
[a]
|
|
167
175
|
);
|
|
168
|
-
|
|
169
|
-
if (
|
|
170
|
-
const
|
|
171
|
-
let { x:
|
|
172
|
-
|
|
176
|
+
R(() => {
|
|
177
|
+
if (i && u.current) {
|
|
178
|
+
const r = u.current.getBoundingClientRect(), p = window.innerWidth, v = window.innerHeight;
|
|
179
|
+
let { x: w, y } = o;
|
|
180
|
+
w + r.width > p && (w = p - r.width - 8), y + r.height > v && (y = v - r.height - 8), (w !== o.x || y !== o.y) && d({ x: w, y });
|
|
173
181
|
}
|
|
174
|
-
}, [
|
|
175
|
-
if (!
|
|
176
|
-
const
|
|
177
|
-
|
|
178
|
-
},
|
|
179
|
-
|
|
180
|
-
},
|
|
181
|
-
|
|
182
|
+
}, [i, o]), R(() => {
|
|
183
|
+
if (!i) return;
|
|
184
|
+
const n = (v) => {
|
|
185
|
+
u.current && !u.current.contains(v.target) && b();
|
|
186
|
+
}, r = (v) => {
|
|
187
|
+
v.key === "Escape" && b();
|
|
188
|
+
}, p = () => {
|
|
189
|
+
b();
|
|
182
190
|
};
|
|
183
|
-
return document.addEventListener("mousedown",
|
|
184
|
-
document.removeEventListener("mousedown",
|
|
191
|
+
return document.addEventListener("mousedown", n), document.addEventListener("keydown", r), document.addEventListener("scroll", p, !0), () => {
|
|
192
|
+
document.removeEventListener("mousedown", n), document.removeEventListener("keydown", r), document.removeEventListener("scroll", p, !0);
|
|
185
193
|
};
|
|
186
|
-
}, [
|
|
187
|
-
const
|
|
188
|
-
if (
|
|
189
|
-
const
|
|
190
|
-
if (
|
|
191
|
-
return
|
|
194
|
+
}, [i, b]);
|
|
195
|
+
const B = (n) => M.Children.map(n, (r) => {
|
|
196
|
+
if (M.isValidElement(r)) {
|
|
197
|
+
const p = r.key != null ? String(r.key) : void 0;
|
|
198
|
+
if (r.type === W || r.type === I)
|
|
199
|
+
return M.cloneElement(r, { _key: p });
|
|
192
200
|
}
|
|
193
|
-
return
|
|
194
|
-
}),
|
|
195
|
-
onSelect:
|
|
196
|
-
onClose:
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
201
|
+
return r;
|
|
202
|
+
}), S = M.Children.toArray(e), V = S[0], A = B(S.slice(1)), H = l && l.length > 0, O = {
|
|
203
|
+
onSelect: L,
|
|
204
|
+
onClose: b,
|
|
205
|
+
getTestId: s ? (n) => `${s}-${n}` : void 0
|
|
206
|
+
}, T = (n) => s ? `${s}-${n}` : void 0;
|
|
207
|
+
return /* @__PURE__ */ g(F, { children: [
|
|
208
|
+
/* @__PURE__ */ t(
|
|
209
|
+
"div",
|
|
210
|
+
{
|
|
211
|
+
ref: x,
|
|
212
|
+
onContextMenu: C,
|
|
213
|
+
className: "inline-block",
|
|
214
|
+
"data-testid": s,
|
|
215
|
+
children: V
|
|
216
|
+
}
|
|
217
|
+
),
|
|
218
|
+
i && Y(
|
|
219
|
+
/* @__PURE__ */ t(j.Provider, { value: O, children: /* @__PURE__ */ t(
|
|
202
220
|
"ul",
|
|
203
221
|
{
|
|
204
|
-
ref:
|
|
205
|
-
className: `${
|
|
206
|
-
style: { left:
|
|
222
|
+
ref: u,
|
|
223
|
+
className: `${E} bg-base-100 rounded-box shadow-lg border border-base-300 min-w-[160px] p-1 fixed z-[9999] ${f}`,
|
|
224
|
+
style: { left: o.x, top: o.y },
|
|
207
225
|
role: "menu",
|
|
208
226
|
"aria-label": "Context menu",
|
|
209
|
-
|
|
227
|
+
"data-testid": T("menu"),
|
|
228
|
+
children: H ? l.map((n) => /* @__PURE__ */ t(z, { item: n, onSelect: L, onClose: b, getTestId: T }, n.key)) : A
|
|
210
229
|
}
|
|
211
230
|
) }),
|
|
212
|
-
|
|
231
|
+
m ? m(document.body) : document.body
|
|
213
232
|
)
|
|
214
233
|
] });
|
|
215
|
-
},
|
|
216
|
-
Item:
|
|
217
|
-
Divider:
|
|
218
|
-
SubMenu:
|
|
234
|
+
}, ee = Object.assign(J, {
|
|
235
|
+
Item: W,
|
|
236
|
+
Divider: G,
|
|
237
|
+
SubMenu: I
|
|
219
238
|
});
|
|
220
239
|
export {
|
|
221
|
-
|
|
240
|
+
ee as ContextMenu
|
|
222
241
|
};
|
|
223
242
|
//# sourceMappingURL=ContextMenu.js.map
|