asterui 0.12.22 → 0.12.24
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/Cascader.d.ts +55 -5
- package/dist/components/Tree.d.ts +78 -2
- package/dist/components/TreeSelect.d.ts +35 -2
- package/dist/index.d.ts +1 -1
- package/dist/index15.js +391 -137
- package/dist/index15.js.map +1 -1
- package/dist/index93.js +422 -194
- package/dist/index93.js.map +1 -1
- package/dist/index94.js +626 -263
- package/dist/index94.js.map +1 -1
- package/dist/index97.js +23 -23
- package/dist/index97.js.map +1 -1
- package/package.json +1 -1
package/dist/index15.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index15.js","sources":["../src/components/Cascader.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback, useId } from 'react'\n\nexport interface CascaderOption {\n value: string | number\n label: React.ReactNode\n disabled?: boolean\n children?: CascaderOption[]\n}\n\nexport interface CascaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n options: CascaderOption[]\n value?: (string | number)[]\n onChange?: (value: (string | number)[], selectedOptions: CascaderOption[]) => void\n placeholder?: string\n disabled?: boolean\n allowClear?: boolean\n expandTrigger?: 'click' | 'hover'\n displayRender?: (labels: React.ReactNode[], selectedOptions: CascaderOption[]) => React.ReactNode\n size?: 'xs' | 'sm' | 'md' | 'lg'\n}\n\nexport function Cascader({\n options,\n value,\n onChange,\n placeholder = 'Please select',\n disabled = false,\n allowClear = true,\n expandTrigger = 'click',\n displayRender,\n size = 'md',\n className = '',\n ...rest\n}: CascaderProps) {\n const [isOpen, setIsOpen] = useState(false)\n const [selectedPath, setSelectedPath] = useState<(string | number)[]>(value || [])\n const [hoveredPath, setHoveredPath] = useState<(string | number)[]>([])\n const containerRef = useRef<HTMLDivElement>(null)\n const inputId = useId()\n const listboxId = useId()\n\n // Sync with controlled value\n useEffect(() => {\n if (value !== undefined) {\n setSelectedPath(value)\n }\n }, [value])\n\n // Close on outside click\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setIsOpen(false)\n setHoveredPath([])\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen])\n\n // Get options at each level based on path\n const getOptionsAtLevel = useCallback((level: number, path: (string | number)[]): CascaderOption[] => {\n if (level === 0) return options\n\n let currentOptions = options\n for (let i = 0; i < level; i++) {\n const selected = currentOptions.find(opt => opt.value === path[i])\n if (!selected?.children) return []\n currentOptions = selected.children\n }\n return currentOptions\n }, [options])\n\n // Get selected options objects from path\n const getSelectedOptions = useCallback((path: (string | number)[]): CascaderOption[] => {\n const result: CascaderOption[] = []\n let currentOptions = options\n\n for (const val of path) {\n const found = currentOptions.find(opt => opt.value === val)\n if (!found) break\n result.push(found)\n currentOptions = found.children || []\n }\n\n return result\n }, [options])\n\n // Determine which path to use for displaying columns\n const activePath = isOpen ? (hoveredPath.length > 0 ? hoveredPath : selectedPath) : selectedPath\n\n // Build columns to display\n const columns: CascaderOption[][] = []\n columns.push(options)\n\n for (let i = 0; i < activePath.length; i++) {\n const nextOptions = getOptionsAtLevel(i + 1, activePath)\n if (nextOptions.length > 0) {\n columns.push(nextOptions)\n }\n }\n\n const handleOptionClick = (option: CascaderOption, level: number) => {\n if (option.disabled) return\n\n const newPath = [...activePath.slice(0, level), option.value]\n\n if (option.children && option.children.length > 0) {\n // Has children - just expand, don't select yet\n setHoveredPath(newPath)\n } else {\n // Leaf node - select and close\n setSelectedPath(newPath)\n setIsOpen(false)\n setHoveredPath([])\n onChange?.(newPath, getSelectedOptions(newPath))\n }\n }\n\n const handleOptionHover = (option: CascaderOption, level: number) => {\n if (expandTrigger !== 'hover' || option.disabled) return\n\n const newPath = [...activePath.slice(0, level), option.value]\n setHoveredPath(newPath)\n }\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation()\n setSelectedPath([])\n onChange?.([], [])\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) return\n\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault()\n setIsOpen(!isOpen)\n break\n case 'Escape':\n e.preventDefault()\n setIsOpen(false)\n setHoveredPath([])\n break\n }\n }\n\n // Display value\n const selectedOptions = getSelectedOptions(selectedPath)\n const labels = selectedOptions.map(opt => opt.label)\n const displayValue = displayRender\n ? displayRender(labels, selectedOptions)\n : labels.join(' / ')\n\n // Size classes\n const sizeClasses = {\n xs: 'input-xs text-xs',\n sm: 'input-sm text-sm',\n md: 'input-md',\n lg: 'input-lg text-lg',\n }\n\n const dropdownSizeClasses = {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n }\n\n return (\n <div ref={containerRef} className={`relative inline-block w-full ${className}`} data-state={isOpen ? 'open' : 'closed'} {...rest}>\n {/* Input/Trigger */}\n <div\n id={inputId}\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-controls={listboxId}\n tabIndex={disabled ? -1 : 0}\n className={`input input-bordered w-full flex items-center justify-between cursor-pointer ${sizeClasses[size]} ${\n disabled ? 'input-disabled cursor-not-allowed' : ''\n } ${isOpen ? 'border-primary' : ''}`}\n onClick={() => !disabled && setIsOpen(!isOpen)}\n onKeyDown={handleKeyDown}\n >\n <span className={selectedPath.length === 0 ? 'text-base-content/50' : ''}>\n {selectedPath.length > 0 ? displayValue : placeholder}\n </span>\n <div className=\"flex items-center gap-1\">\n {allowClear && selectedPath.length > 0 && !disabled && (\n <button\n type=\"button\"\n className=\"btn btn-ghost btn-xs btn-circle\"\n onClick={handleClear}\n aria-label=\"Clear selection\"\n >\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n <svg\n className={`w-4 h-4 transition-transform ${isOpen ? 'rotate-180' : ''}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n </div>\n\n {/* Dropdown */}\n {isOpen && (\n <div\n id={listboxId}\n className={`absolute z-50 mt-1 bg-base-100 border border-base-300 rounded-lg shadow-lg flex ${dropdownSizeClasses[size]}`}\n >\n {columns.map((columnOptions, colIndex) => (\n <ul\n key={colIndex}\n role=\"listbox\"\n className={`min-w-[120px] max-h-[200px] overflow-y-auto py-1 ${\n colIndex > 0 ? 'border-l border-base-300' : ''\n }`}\n >\n {columnOptions.map((option) => {\n const isSelected = selectedPath[colIndex] === option.value\n const isHovered = activePath[colIndex] === option.value\n const hasChildren = option.children && option.children.length > 0\n\n return (\n <li\n key={option.value}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={option.disabled}\n className={`px-3 py-2 cursor-pointer flex items-center justify-between gap-2 ${\n option.disabled\n ? 'text-base-content/30 cursor-not-allowed'\n : isSelected\n ? 'bg-primary text-primary-content'\n : isHovered\n ? 'bg-base-200'\n : 'hover:bg-base-200'\n }`}\n onClick={() => handleOptionClick(option, colIndex)}\n onMouseEnter={() => handleOptionHover(option, colIndex)}\n >\n <span>{option.label}</span>\n {hasChildren && (\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=\"M9 5l7 7-7 7\" />\n </svg>\n )}\n </li>\n )\n })}\n </ul>\n ))}\n </div>\n )}\n </div>\n )\n}\n"],"names":["Cascader","options","value","onChange","placeholder","disabled","allowClear","expandTrigger","displayRender","size","className","rest","isOpen","setIsOpen","useState","selectedPath","setSelectedPath","hoveredPath","setHoveredPath","containerRef","useRef","inputId","useId","listboxId","useEffect","handleClickOutside","e","getOptionsAtLevel","useCallback","level","path","currentOptions","i","selected","opt","getSelectedOptions","result","val","found","activePath","columns","nextOptions","handleOptionClick","option","newPath","handleOptionHover","handleClear","handleKeyDown","selectedOptions","labels","displayValue","sizeClasses","dropdownSizeClasses","jsxs","jsx","columnOptions","colIndex","isSelected","isHovered","hasChildren"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index15.js","sources":["../src/components/Cascader.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback, useId, forwardRef, useMemo } from 'react'\n\nexport interface CascaderOption {\n value: string\n label: React.ReactNode\n disabled?: boolean\n children?: CascaderOption[]\n isLeaf?: boolean\n}\n\nexport type CascaderColor = 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error'\nexport type CascaderSize = 'xs' | 'sm' | 'md' | 'lg'\n\nexport interface CascaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Hierarchical options data */\n options: CascaderOption[]\n /** Controlled selected value path */\n value?: string[]\n /** Default selected value path (uncontrolled) */\n defaultValue?: string[]\n /** Callback when selection changes */\n onChange?: (value: string[], selectedOptions: CascaderOption[]) => void\n /** Placeholder text */\n placeholder?: string\n /** Disable the cascader */\n disabled?: boolean\n /** Show clear button */\n allowClear?: boolean\n /** How to expand sub-menus */\n expandTrigger?: 'click' | 'hover'\n /** Allow selection of any level, not just leaf nodes */\n changeOnSelect?: boolean\n /** Custom display render function */\n displayRender?: (labels: React.ReactNode[], selectedOptions: CascaderOption[]) => React.ReactNode\n /** Input size */\n size?: CascaderSize\n /** Focus ring color */\n color?: CascaderColor\n /** Validation status */\n status?: 'error' | 'warning'\n /** Enable search/filter functionality */\n showSearch?: boolean | {\n filter?: (inputValue: string, path: CascaderOption[]) => boolean\n render?: (inputValue: string, path: CascaderOption[]) => React.ReactNode\n matchInputWidth?: boolean\n }\n /** Content when no results found */\n notFoundContent?: React.ReactNode\n /** Async data loading function */\n loadData?: (selectedOptions: CascaderOption[]) => Promise<void>\n /** Custom field names for data mapping */\n fieldNames?: {\n label?: string\n value?: string\n children?: string\n }\n /** Controlled open state */\n open?: boolean\n /** Callback when dropdown visibility changes */\n onDropdownVisibleChange?: (open: boolean) => void\n /** Class name for dropdown */\n popupClassName?: string\n /** Custom dropdown render wrapper */\n dropdownRender?: (menu: React.ReactNode) => React.ReactNode\n /** Multiple selection mode */\n multiple?: boolean\n /** Max tags to show in multiple mode */\n maxTagCount?: number | 'responsive'\n /** Accessible label */\n 'aria-label'?: string\n}\n\n// Helper to get nested value using field names\nfunction getFieldValue<T>(option: Record<string, unknown>, field: string, fallback: string): T {\n return (option[field] ?? option[fallback]) as T\n}\n\nexport const Cascader = forwardRef<HTMLDivElement, CascaderProps>(({\n options,\n value,\n defaultValue,\n onChange,\n placeholder = 'Please select',\n disabled = false,\n allowClear = true,\n expandTrigger = 'click',\n changeOnSelect = false,\n displayRender,\n size = 'md',\n color,\n status,\n showSearch = false,\n notFoundContent = 'No results found',\n loadData,\n fieldNames,\n open: controlledOpen,\n onDropdownVisibleChange,\n popupClassName = '',\n dropdownRender,\n multiple = false,\n maxTagCount,\n className = '',\n 'aria-label': ariaLabel,\n 'data-testid': testId,\n ...rest\n}, ref) => {\n const baseTestId = testId ?? 'cascader'\n const isControlledOpen = controlledOpen !== undefined\n const [internalOpen, setInternalOpen] = useState(false)\n const isOpen = isControlledOpen ? controlledOpen : internalOpen\n\n const setIsOpen = useCallback((open: boolean) => {\n if (!isControlledOpen) {\n setInternalOpen(open)\n }\n onDropdownVisibleChange?.(open)\n }, [isControlledOpen, onDropdownVisibleChange])\n\n const [selectedPath, setSelectedPath] = useState<string[]>(value ?? defaultValue ?? [])\n const [selectedPaths, setSelectedPaths] = useState<string[][]>(\n value ? [value] : defaultValue ? [defaultValue] : []\n )\n const [hoveredPath, setHoveredPath] = useState<string[]>([])\n const [focusedIndex, setFocusedIndex] = useState<{ column: number; row: number }>({ column: 0, row: 0 })\n const [searchValue, setSearchValue] = useState('')\n const [loadingKeys, setLoadingKeys] = useState<Set<string>>(new Set())\n\n const containerRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n const baseId = useId()\n const inputId = `${baseId}-input`\n const listboxId = `${baseId}-listbox`\n\n // Field name mapping\n const labelField = fieldNames?.label ?? 'label'\n const valueField = fieldNames?.value ?? 'value'\n const childrenField = fieldNames?.children ?? 'children'\n\n // Normalize options with field names\n const normalizeOption = useCallback((opt: Record<string, unknown>): CascaderOption => ({\n value: getFieldValue<string>(opt, valueField, 'value'),\n label: getFieldValue<React.ReactNode>(opt, labelField, 'label'),\n disabled: opt.disabled as boolean | undefined,\n isLeaf: opt.isLeaf as boolean | undefined,\n children: opt[childrenField]\n ? (opt[childrenField] as Record<string, unknown>[]).map(normalizeOption)\n : undefined,\n }), [labelField, valueField, childrenField])\n\n const normalizedOptions = useMemo(() =>\n options.map(opt => normalizeOption(opt as unknown as Record<string, unknown>)),\n [options, normalizeOption]\n )\n\n // Sync with controlled value\n useEffect(() => {\n if (value !== undefined) {\n setSelectedPath(value)\n if (multiple) {\n setSelectedPaths([value])\n }\n }\n }, [value, multiple])\n\n // Close on outside click\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setIsOpen(false)\n setHoveredPath([])\n setSearchValue('')\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen, setIsOpen])\n\n // Get options at each level based on path\n const getOptionsAtLevel = useCallback((level: number, path: string[]): CascaderOption[] => {\n if (level === 0) return normalizedOptions\n\n let currentOptions = normalizedOptions\n for (let i = 0; i < level; i++) {\n const selected = currentOptions.find(opt => opt.value === path[i])\n if (!selected?.children) return []\n currentOptions = selected.children\n }\n return currentOptions\n }, [normalizedOptions])\n\n // Get selected options objects from path\n const getSelectedOptions = useCallback((path: string[]): CascaderOption[] => {\n const result: CascaderOption[] = []\n let currentOptions = normalizedOptions\n\n for (const val of path) {\n const found = currentOptions.find(opt => opt.value === val)\n if (!found) break\n result.push(found)\n currentOptions = found.children || []\n }\n\n return result\n }, [normalizedOptions])\n\n // Get all paths for search\n const getAllPaths = useCallback((): { path: CascaderOption[]; values: string[] }[] => {\n const paths: { path: CascaderOption[]; values: string[] }[] = []\n\n const traverse = (opts: CascaderOption[], currentPath: CascaderOption[], currentValues: string[]) => {\n for (const opt of opts) {\n const newPath = [...currentPath, opt]\n const newValues = [...currentValues, opt.value]\n\n if (!opt.children || opt.children.length === 0) {\n paths.push({ path: newPath, values: newValues })\n } else {\n if (changeOnSelect) {\n paths.push({ path: newPath, values: newValues })\n }\n traverse(opt.children, newPath, newValues)\n }\n }\n }\n\n traverse(normalizedOptions, [], [])\n return paths\n }, [normalizedOptions, changeOnSelect])\n\n // Filter paths for search\n const filteredPaths = useMemo(() => {\n if (!showSearch || !searchValue.trim()) return null\n\n const allPaths = getAllPaths()\n const searchLower = searchValue.toLowerCase()\n\n const filterFn = typeof showSearch === 'object' && showSearch.filter\n ? showSearch.filter\n : (inputValue: string, path: CascaderOption[]) =>\n path.some(opt =>\n String(opt.label).toLowerCase().includes(inputValue.toLowerCase())\n )\n\n return allPaths.filter(({ path }) => filterFn(searchLower, path))\n }, [showSearch, searchValue, getAllPaths])\n\n // Determine which path to use for displaying columns\n const activePath = isOpen ? (hoveredPath.length > 0 ? hoveredPath : selectedPath) : selectedPath\n\n // Build columns to display (only when not searching)\n const columns: CascaderOption[][] = useMemo(() => {\n if (filteredPaths) return []\n\n const cols: CascaderOption[][] = []\n cols.push(normalizedOptions)\n\n for (let i = 0; i < activePath.length; i++) {\n const nextOptions = getOptionsAtLevel(i + 1, activePath)\n if (nextOptions.length > 0) {\n cols.push(nextOptions)\n }\n }\n return cols\n }, [filteredPaths, normalizedOptions, activePath, getOptionsAtLevel])\n\n const handleOptionClick = async (option: CascaderOption, level: number) => {\n if (option.disabled) return\n\n const newPath = [...activePath.slice(0, level), option.value]\n const selectedOpts = getSelectedOptions(newPath)\n\n // Handle async loading\n if (loadData && !option.children && !option.isLeaf) {\n const key = option.value\n if (!loadingKeys.has(key)) {\n setLoadingKeys(prev => new Set(prev).add(key))\n try {\n await loadData(selectedOpts)\n } finally {\n setLoadingKeys(prev => {\n const next = new Set(prev)\n next.delete(key)\n return next\n })\n }\n }\n setHoveredPath(newPath)\n return\n }\n\n if (option.children && option.children.length > 0) {\n // Has children - expand\n setHoveredPath(newPath)\n\n if (changeOnSelect) {\n // In changeOnSelect mode, also select this node\n setSelectedPath(newPath)\n onChange?.(newPath, selectedOpts)\n }\n } else {\n // Leaf node - select and close\n if (multiple) {\n const pathStr = newPath.join('/')\n const isSelected = selectedPaths.some(p => p.join('/') === pathStr)\n let newPaths: string[][]\n if (isSelected) {\n newPaths = selectedPaths.filter(p => p.join('/') !== pathStr)\n } else {\n newPaths = [...selectedPaths, newPath]\n }\n setSelectedPaths(newPaths)\n // Don't close in multiple mode\n } else {\n setSelectedPath(newPath)\n setIsOpen(false)\n setHoveredPath([])\n setSearchValue('')\n onChange?.(newPath, selectedOpts)\n }\n }\n }\n\n const handleSearchResultClick = (values: string[], path: CascaderOption[]) => {\n if (multiple) {\n const pathStr = values.join('/')\n const isSelected = selectedPaths.some(p => p.join('/') === pathStr)\n let newPaths: string[][]\n if (isSelected) {\n newPaths = selectedPaths.filter(p => p.join('/') !== pathStr)\n } else {\n newPaths = [...selectedPaths, values]\n }\n setSelectedPaths(newPaths)\n } else {\n setSelectedPath(values)\n setIsOpen(false)\n setSearchValue('')\n onChange?.(values, path)\n }\n }\n\n const handleOptionHover = (option: CascaderOption, level: number) => {\n if (expandTrigger !== 'hover' || option.disabled) return\n\n const newPath = [...activePath.slice(0, level), option.value]\n setHoveredPath(newPath)\n }\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation()\n if (multiple) {\n setSelectedPaths([])\n onChange?.([], [])\n } else {\n setSelectedPath([])\n onChange?.([], [])\n }\n }\n\n const handleRemoveTag = (pathToRemove: string[], e: React.MouseEvent) => {\n e.stopPropagation()\n const pathStr = pathToRemove.join('/')\n const newPaths = selectedPaths.filter(p => p.join('/') !== pathStr)\n setSelectedPaths(newPaths)\n if (newPaths.length > 0) {\n onChange?.(newPaths[newPaths.length - 1], getSelectedOptions(newPaths[newPaths.length - 1]))\n } else {\n onChange?.([], [])\n }\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) return\n\n switch (e.key) {\n case 'Enter':\n e.preventDefault()\n if (!isOpen) {\n setIsOpen(true)\n } else if (filteredPaths && filteredPaths.length > 0) {\n const { values, path } = filteredPaths[focusedIndex.row] || {}\n if (values) {\n handleSearchResultClick(values, path)\n }\n } else {\n const currentColumn = columns[focusedIndex.column]\n if (currentColumn) {\n const option = currentColumn[focusedIndex.row]\n if (option) {\n handleOptionClick(option, focusedIndex.column)\n }\n }\n }\n break\n case ' ':\n if (!showSearch) {\n e.preventDefault()\n setIsOpen(!isOpen)\n }\n break\n case 'Escape':\n e.preventDefault()\n setIsOpen(false)\n setHoveredPath([])\n setSearchValue('')\n break\n case 'ArrowDown':\n e.preventDefault()\n if (!isOpen) {\n setIsOpen(true)\n } else if (filteredPaths) {\n setFocusedIndex(prev => ({\n ...prev,\n row: Math.min(prev.row + 1, filteredPaths.length - 1)\n }))\n } else {\n const currentColumn = columns[focusedIndex.column]\n if (currentColumn) {\n setFocusedIndex(prev => ({\n ...prev,\n row: Math.min(prev.row + 1, currentColumn.length - 1)\n }))\n }\n }\n break\n case 'ArrowUp':\n e.preventDefault()\n if (filteredPaths) {\n setFocusedIndex(prev => ({\n ...prev,\n row: Math.max(prev.row - 1, 0)\n }))\n } else {\n setFocusedIndex(prev => ({\n ...prev,\n row: Math.max(prev.row - 1, 0)\n }))\n }\n break\n case 'ArrowRight':\n e.preventDefault()\n if (!filteredPaths && focusedIndex.column < columns.length - 1) {\n setFocusedIndex(prev => ({\n column: prev.column + 1,\n row: 0\n }))\n }\n break\n case 'ArrowLeft':\n e.preventDefault()\n if (!filteredPaths && focusedIndex.column > 0) {\n setFocusedIndex(prev => ({\n column: prev.column - 1,\n row: 0\n }))\n }\n break\n case 'Home':\n e.preventDefault()\n setFocusedIndex(prev => ({ ...prev, row: 0 }))\n break\n case 'End':\n e.preventDefault()\n if (filteredPaths) {\n setFocusedIndex(prev => ({ ...prev, row: filteredPaths.length - 1 }))\n } else {\n const currentColumn = columns[focusedIndex.column]\n if (currentColumn) {\n setFocusedIndex(prev => ({ ...prev, row: currentColumn.length - 1 }))\n }\n }\n break\n }\n }\n\n // Reset focus when dropdown opens/closes\n useEffect(() => {\n if (isOpen) {\n setFocusedIndex({ column: 0, row: 0 })\n }\n }, [isOpen])\n\n // Display value\n const selectedOptions = getSelectedOptions(selectedPath)\n const labels = selectedOptions.map(opt => opt.label)\n const displayValue = displayRender\n ? displayRender(labels, selectedOptions)\n : labels.join(' / ')\n\n // Size classes\n const sizeClasses: Record<CascaderSize, string> = {\n xs: 'input-xs text-xs min-h-6',\n sm: 'input-sm text-sm min-h-8',\n md: 'input-md min-h-10',\n lg: 'input-lg text-lg min-h-12',\n }\n\n const dropdownSizeClasses: Record<CascaderSize, string> = {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n }\n\n // Color and status classes\n const colorClasses: Record<CascaderColor, string> = {\n primary: 'border-primary focus:border-primary',\n secondary: 'border-secondary focus:border-secondary',\n accent: 'border-accent focus:border-accent',\n info: 'border-info focus:border-info',\n success: 'border-success focus:border-success',\n warning: 'border-warning focus:border-warning',\n error: 'border-error focus:border-error',\n }\n\n const getColorClass = () => {\n if (status === 'error') return 'input-error'\n if (status === 'warning') return 'input-warning'\n if (color && isOpen) return colorClasses[color]\n if (isOpen) return 'input-primary'\n return ''\n }\n\n const getOptionId = (colIndex: number, optIndex: number) =>\n `${baseId}-option-${colIndex}-${optIndex}`\n\n const getSearchOptionId = (index: number) =>\n `${baseId}-search-option-${index}`\n\n // Render tags for multiple mode\n const renderTags = () => {\n const paths = selectedPaths\n const displayPaths = maxTagCount === 'responsive' || typeof maxTagCount === 'number'\n ? paths.slice(0, typeof maxTagCount === 'number' ? maxTagCount : 3)\n : paths\n const hiddenCount = paths.length - displayPaths.length\n\n return (\n <div className=\"flex flex-wrap gap-1 flex-1\">\n {displayPaths.map((path) => {\n const opts = getSelectedOptions(path)\n const label = opts.map(o => o.label).join(' / ')\n return (\n <span\n key={path.join('/')}\n className=\"badge badge-sm gap-1\"\n >\n {label}\n <button\n type=\"button\"\n className=\"btn btn-ghost btn-xs btn-circle w-3 h-3 min-h-0\"\n onClick={(e) => handleRemoveTag(path, e)}\n aria-label={`Remove ${label}`}\n >\n <svg className=\"w-2 h-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </span>\n )\n })}\n {hiddenCount > 0 && (\n <span className=\"badge badge-sm\">+{hiddenCount}</span>\n )}\n </div>\n )\n }\n\n // Render search results\n const renderSearchResults = () => {\n if (!filteredPaths) return null\n\n if (filteredPaths.length === 0) {\n return (\n <div className=\"p-4 text-center text-base-content/50\">\n {notFoundContent}\n </div>\n )\n }\n\n const renderFn = typeof showSearch === 'object' && showSearch.render\n ? showSearch.render\n : null\n\n return (\n <ul role=\"listbox\" className=\"max-h-[200px] overflow-y-auto py-1\">\n {filteredPaths.map(({ path, values }, index) => {\n const isSelected = multiple\n ? selectedPaths.some(p => p.join('/') === values.join('/'))\n : selectedPath.join('/') === values.join('/')\n const isFocused = focusedIndex.row === index\n\n return (\n <li\n key={values.join('/')}\n id={getSearchOptionId(index)}\n role=\"option\"\n aria-selected={isSelected}\n data-testid={`${baseTestId}-search-option-${values.join('-')}`}\n data-state={isSelected ? 'selected' : undefined}\n className={`px-3 py-2 cursor-pointer ${\n isSelected\n ? 'bg-primary text-primary-content'\n : isFocused\n ? 'bg-base-200'\n : 'hover:bg-base-200'\n }`}\n onClick={() => handleSearchResultClick(values, path)}\n >\n {renderFn\n ? renderFn(searchValue, path)\n : path.map(opt => opt.label).join(' / ')\n }\n </li>\n )\n })}\n </ul>\n )\n }\n\n // Render dropdown content\n const renderDropdownContent = () => {\n const content = filteredPaths ? renderSearchResults() : (\n <div className=\"flex\">\n {columns.map((columnOptions, colIndex) => (\n <ul\n key={colIndex}\n role=\"listbox\"\n aria-label={`Level ${colIndex + 1} options`}\n className={`min-w-[120px] max-h-[200px] overflow-y-auto py-1 ${\n colIndex > 0 ? 'border-l border-base-300' : ''\n }`}\n >\n {columnOptions.map((option, optIndex) => {\n const isSelected = selectedPath[colIndex] === option.value\n const isHovered = activePath[colIndex] === option.value\n const hasChildren = option.children && option.children.length > 0\n const isLoading = loadingKeys.has(option.value)\n const isFocused = focusedIndex.column === colIndex && focusedIndex.row === optIndex\n const optionId = getOptionId(colIndex, optIndex)\n\n return (\n <li\n key={option.value}\n id={optionId}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={option.disabled}\n data-testid={`${baseTestId}-option-${option.value}`}\n data-state={isSelected ? 'selected' : isHovered ? 'hovered' : undefined}\n data-value={option.value}\n className={`px-3 py-2 cursor-pointer flex items-center justify-between gap-2 ${\n option.disabled\n ? 'text-base-content/30 cursor-not-allowed'\n : isSelected\n ? 'bg-primary text-primary-content'\n : isFocused\n ? 'bg-base-200'\n : isHovered\n ? 'bg-base-200'\n : 'hover:bg-base-200'\n }`}\n onClick={() => handleOptionClick(option, colIndex)}\n onMouseEnter={() => handleOptionHover(option, colIndex)}\n >\n <span>{option.label}</span>\n {isLoading ? (\n <span className=\"loading loading-spinner loading-xs\" />\n ) : hasChildren ? (\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=\"M9 5l7 7-7 7\" />\n </svg>\n ) : null}\n </li>\n )\n })}\n </ul>\n ))}\n </div>\n )\n\n return dropdownRender ? dropdownRender(content) : content\n }\n\n // Get active descendant ID\n const getActiveDescendant = () => {\n if (!isOpen) return undefined\n if (filteredPaths) {\n return getSearchOptionId(focusedIndex.row)\n }\n return getOptionId(focusedIndex.column, focusedIndex.row)\n }\n\n const hasValue = multiple ? selectedPaths.length > 0 : selectedPath.length > 0\n\n return (\n <div\n ref={(node) => {\n containerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n }}\n className={`relative inline-block w-full ${className}`}\n data-testid={baseTestId}\n data-state={isOpen ? 'open' : 'closed'}\n {...rest}\n >\n {/* Input/Trigger */}\n <div\n id={inputId}\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-controls={listboxId}\n aria-activedescendant={getActiveDescendant()}\n aria-label={ariaLabel}\n aria-disabled={disabled}\n tabIndex={disabled ? -1 : 0}\n className={`input input-bordered w-full flex items-center justify-between cursor-pointer gap-1 ${sizeClasses[size]} ${\n disabled ? 'input-disabled cursor-not-allowed' : ''\n } ${getColorClass()}`}\n onClick={() => {\n if (!disabled) {\n setIsOpen(!isOpen)\n if (showSearch && !isOpen) {\n setTimeout(() => inputRef.current?.focus(), 0)\n }\n }\n }}\n onKeyDown={handleKeyDown}\n >\n {multiple && selectedPaths.length > 0 ? (\n renderTags()\n ) : showSearch && isOpen ? (\n <input\n ref={inputRef}\n type=\"text\"\n className=\"flex-1 bg-transparent outline-none min-w-[50px]\"\n value={searchValue}\n onChange={(e) => setSearchValue(e.target.value)}\n onClick={(e) => e.stopPropagation()}\n placeholder={hasValue ? String(displayValue) : placeholder}\n aria-label=\"Search options\"\n />\n ) : (\n <span className={`flex-1 truncate ${!hasValue ? 'text-base-content/50' : ''}`}>\n {hasValue ? displayValue : placeholder}\n </span>\n )}\n <div className=\"flex items-center gap-1 shrink-0\">\n {allowClear && hasValue && !disabled && (\n <button\n type=\"button\"\n className=\"btn btn-ghost btn-xs btn-circle\"\n onClick={handleClear}\n aria-label=\"Clear selection\"\n data-testid={`${baseTestId}-clear`}\n >\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n <svg\n className={`w-4 h-4 transition-transform ${isOpen ? 'rotate-180' : ''}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n </div>\n\n {/* Dropdown */}\n {isOpen && (\n <div\n ref={dropdownRef}\n id={listboxId}\n className={`absolute z-50 mt-1 bg-base-100 border border-base-300 rounded-lg shadow-lg ${dropdownSizeClasses[size]} ${popupClassName}`}\n data-testid={`${baseTestId}-dropdown`}\n >\n {renderDropdownContent()}\n </div>\n )}\n </div>\n )\n})\n\nCascader.displayName = 'Cascader'\n"],"names":["getFieldValue","option","field","fallback","Cascader","forwardRef","options","value","defaultValue","onChange","placeholder","disabled","allowClear","expandTrigger","changeOnSelect","displayRender","size","color","status","showSearch","notFoundContent","loadData","fieldNames","controlledOpen","onDropdownVisibleChange","popupClassName","dropdownRender","multiple","maxTagCount","className","ariaLabel","testId","rest","ref","baseTestId","isControlledOpen","internalOpen","setInternalOpen","useState","isOpen","setIsOpen","useCallback","open","selectedPath","setSelectedPath","selectedPaths","setSelectedPaths","hoveredPath","setHoveredPath","focusedIndex","setFocusedIndex","searchValue","setSearchValue","loadingKeys","setLoadingKeys","containerRef","useRef","inputRef","dropdownRef","baseId","useId","inputId","listboxId","labelField","valueField","childrenField","normalizeOption","opt","normalizedOptions","useMemo","useEffect","handleClickOutside","e","getOptionsAtLevel","level","path","currentOptions","i","selected","getSelectedOptions","result","val","found","getAllPaths","paths","traverse","opts","currentPath","currentValues","newPath","newValues","filteredPaths","allPaths","searchLower","filterFn","inputValue","activePath","columns","cols","nextOptions","handleOptionClick","selectedOpts","key","prev","next","pathStr","isSelected","p","newPaths","handleSearchResultClick","values","handleOptionHover","handleClear","handleRemoveTag","pathToRemove","handleKeyDown","currentColumn","selectedOptions","labels","displayValue","sizeClasses","dropdownSizeClasses","colorClasses","getColorClass","getOptionId","colIndex","optIndex","getSearchOptionId","index","renderTags","displayPaths","hiddenCount","jsxs","label","o","jsx","renderSearchResults","renderFn","isFocused","renderDropdownContent","content","columnOptions","isHovered","hasChildren","isLoading","optionId","getActiveDescendant","hasValue","node"],"mappings":"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"}
|