@skygraph/react 0.6.4 → 0.6.6

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.
Files changed (57) hide show
  1. package/README.md +70 -70
  2. package/dist/{Table-CMKo6Pc3.d.cts → Table-Bhlshbs2.d.cts} +39 -0
  3. package/dist/{Table-CAay8MmA.d.ts → Table-DOGK_njf.d.ts} +39 -0
  4. package/dist/{chunk-Y6XZ5TLD.js → chunk-B6BK5B64.js} +3 -3
  5. package/dist/chunk-B6BK5B64.js.map +1 -0
  6. package/dist/{chunk-PEX2UTNG.js → chunk-EA2J67A4.js} +2 -2
  7. package/dist/chunk-EA2J67A4.js.map +1 -0
  8. package/dist/{chunk-BNMJSYI2.js → chunk-EWUB2QCP.js} +2 -2
  9. package/dist/chunk-EWUB2QCP.js.map +1 -0
  10. package/dist/{chunk-7AA2JPZB.js → chunk-G4MRXKGC.js} +21 -14
  11. package/dist/chunk-G4MRXKGC.js.map +1 -0
  12. package/dist/{chunk-EFDB2ENB.js → chunk-MTHPDCO3.js} +8 -6
  13. package/dist/chunk-MTHPDCO3.js.map +1 -0
  14. package/dist/{chunk-KGFFQGCM.js → chunk-N4S66XHX.js} +8 -4
  15. package/dist/chunk-N4S66XHX.js.map +1 -0
  16. package/dist/{chunk-SEQI65CF.js → chunk-U7BXGUMC.js} +1 -1
  17. package/dist/chunk-U7BXGUMC.js.map +1 -0
  18. package/dist/{chunk-45YW5VSP.js → chunk-UCCGEZPJ.js} +2 -2
  19. package/dist/chunk-UCCGEZPJ.js.map +1 -0
  20. package/dist/{chunk-VLRLCHEL.js → chunk-YJZKXU5O.js} +1 -1
  21. package/dist/chunk-YJZKXU5O.js.map +1 -0
  22. package/dist/{chunk-ZJC2QUWA.js → chunk-YWCL3MUL.js} +1 -1
  23. package/dist/chunk-YWCL3MUL.js.map +1 -0
  24. package/dist/datagrid.cjs +3 -4
  25. package/dist/datagrid.cjs.map +1 -1
  26. package/dist/datagrid.js +4 -4
  27. package/dist/devtools.cjs.map +1 -1
  28. package/dist/devtools.js +1 -1
  29. package/dist/form.cjs.map +1 -1
  30. package/dist/form.js +3 -3
  31. package/dist/index.cjs +1239 -255
  32. package/dist/index.cjs.map +1 -1
  33. package/dist/index.d.cts +16 -4
  34. package/dist/index.d.ts +16 -4
  35. package/dist/index.js +1113 -150
  36. package/dist/index.js.map +1 -1
  37. package/dist/table.cjs +17 -10
  38. package/dist/table.cjs.map +1 -1
  39. package/dist/table.d.cts +1 -1
  40. package/dist/table.d.ts +1 -1
  41. package/dist/table.js +4 -4
  42. package/dist/tree.cjs +11 -7
  43. package/dist/tree.cjs.map +1 -1
  44. package/dist/tree.js +3 -3
  45. package/dist/virtual.cjs.map +1 -1
  46. package/dist/virtual.js +2 -2
  47. package/package.json +2 -2
  48. package/dist/chunk-45YW5VSP.js.map +0 -1
  49. package/dist/chunk-7AA2JPZB.js.map +0 -1
  50. package/dist/chunk-BNMJSYI2.js.map +0 -1
  51. package/dist/chunk-EFDB2ENB.js.map +0 -1
  52. package/dist/chunk-KGFFQGCM.js.map +0 -1
  53. package/dist/chunk-PEX2UTNG.js.map +0 -1
  54. package/dist/chunk-SEQI65CF.js.map +0 -1
  55. package/dist/chunk-VLRLCHEL.js.map +0 -1
  56. package/dist/chunk-Y6XZ5TLD.js.map +0 -1
  57. package/dist/chunk-ZJC2QUWA.js.map +0 -1
package/dist/tree.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tree.ts","../src/components/complex/Tree/Tree.tsx","../src/hooks/useTree.ts","../src/components/complex/Tree/TreeNodeRow.tsx","../src/components/ui/Checkbox.tsx","../src/components/ConfigProvider.tsx","../src/components/ui/Spin.tsx","../src/components/complex/Tree/types.ts","../src/components/complex/TreeSelect/TreeSelect.tsx"],"sourcesContent":["export { Tree } from './components/complex/Tree'\nexport type {\n TreeProps,\n TreeLocale,\n TreeNodeStatus,\n TreeNodeAction,\n CheckInfo,\n SelectInfo,\n ExpandInfo,\n DragInfo,\n DropInfo,\n EditInfo,\n} from './components/complex/Tree'\nexport { useTree } from './hooks/useTree'\nexport type { UseTreeOptions, UseTreeReturn } from './hooks/useTree'\nexport { TreeSelect } from './components/complex/TreeSelect'\nexport type { TreeSelectProps } from './components/complex/TreeSelect'\n","import React, { useState, useEffect, useMemo, useCallback, useRef } from 'react'\nimport { useTree } from '../../../hooks/useTree'\nimport { TreeNodeRow } from './TreeNodeRow'\nimport type { TreeProps, TreeKey, TreeNodeData } from './types'\nimport { DEFAULT_TREE_LOCALE, DEFAULT_INDENT, NODE_HEIGHT } from './types'\n\n/**\n * Hierarchical list with expand/collapse, checkboxes, selection, search, keyboard focus, and optional drag-and-drop.\n * State is managed by `useTree`; rows are rendered through `TreeNodeRow`.\n */\nexport function Tree(props: TreeProps) {\n const {\n treeData,\n fieldNames,\n checkable = false,\n checkStrictly = false,\n checkedKeys: controlledCheckedKeys,\n defaultCheckedKeys,\n onCheck,\n selectable = true,\n multiple = false,\n selectedKeys: controlledSelectedKeys,\n defaultSelectedKeys,\n onSelect,\n expandedKeys: controlledExpandedKeys,\n defaultExpandedKeys,\n defaultExpandAll = false,\n autoExpandParent = false,\n onExpand,\n draggable = false,\n allowDrop,\n onDragStart,\n onDragOver,\n onDragLeave,\n onDragEnd,\n onDrop,\n loadData,\n showLine = false,\n showIcon = false,\n icon: globalIcon,\n switcherIcon,\n blockNode = false,\n height,\n virtual = true,\n disabled = false,\n indentSize = DEFAULT_INDENT,\n directory = false,\n onRightClick,\n // Search\n showSearch = false,\n searchValue: controlledSearchValue,\n defaultSearchValue = '',\n onSearch,\n filterTreeNode,\n highlightSearch = true,\n // Keyboard\n keyboard = true,\n // Editable\n editable = false,\n onEdit,\n onEditCancel,\n // Custom render\n titleRender,\n // Actions\n actions,\n // Toolbar\n showToolbar = false,\n toolbarExtra,\n // Animation\n animated = true,\n // Focus\n autoFocus = false,\n focusedKey: controlledFocusedKey,\n onFocus: onFocusCallback,\n // Scroll\n scrollToKey,\n // Status\n nodeStatus,\n locale,\n className,\n style,\n unstyled,\n } = props\n\n const t = useMemo(() => ({ ...DEFAULT_TREE_LOCALE, ...locale }), [locale])\n\n const showLineConfig = typeof showLine === 'object' ? showLine : { showLeafIcon: false }\n const isShowLine = !!showLine\n\n const {\n tree,\n treeState,\n flatNodes,\n toggleExpand,\n setExpandedKeys,\n expandAll,\n collapseAll,\n toggleCheck,\n setCheckedKeys,\n select,\n setSelectedKeys,\n markLoading,\n markLoaded,\n moveNode,\n filterNodes,\n refresh,\n } = useTree({\n data: treeData,\n fieldNames,\n checkStrictly,\n defaultExpandAll,\n defaultExpandedKeys,\n defaultCheckedKeys,\n defaultSelectedKeys,\n })\n\n // ═══════════════════════════════════════════\n // SEARCH STATE\n // ═══════════════════════════════════════════\n const [internalSearchValue, setInternalSearchValue] = useState(defaultSearchValue)\n const searchValue = controlledSearchValue ?? internalSearchValue\n\n const handleSearchChange = useCallback(\n (value: string) => {\n if (controlledSearchValue === undefined) {\n setInternalSearchValue(value)\n }\n onSearch?.(value)\n\n if (!value) {\n filterNodes(null)\n return\n }\n\n const predicate = filterTreeNode\n ? (node: TreeNodeData) => filterTreeNode(node, value)\n : (node: TreeNodeData) => {\n const title = String(node.title ?? '')\n return title.toLowerCase().includes(value.toLowerCase())\n }\n\n filterNodes(predicate)\n\n if (autoExpandParent) {\n const filtered = tree.getFilteredKeys()\n if (filtered) {\n setExpandedKeys(filtered)\n }\n }\n },\n [\n controlledSearchValue,\n onSearch,\n filterTreeNode,\n filterNodes,\n autoExpandParent,\n tree,\n setExpandedKeys,\n ],\n )\n\n useEffect(() => {\n if (controlledSearchValue !== undefined && controlledSearchValue !== internalSearchValue) {\n handleSearchChange(controlledSearchValue)\n }\n }, [controlledSearchValue]) // eslint-disable-line react-hooks/exhaustive-deps\n\n // ═══════════════════════════════════════════\n // SYNC DATA CHANGES\n // ═══════════════════════════════════════════\n const prevDataRef = useRef(treeData)\n useEffect(() => {\n if (prevDataRef.current !== treeData) {\n prevDataRef.current = treeData\n tree.setData(treeData)\n refresh()\n }\n }, [treeData, tree, refresh])\n\n // Controlled keys\n useEffect(() => {\n if (controlledExpandedKeys !== undefined) setExpandedKeys(controlledExpandedKeys)\n }, [controlledExpandedKeys, setExpandedKeys])\n\n useEffect(() => {\n if (controlledCheckedKeys !== undefined) setCheckedKeys(controlledCheckedKeys)\n }, [controlledCheckedKeys, setCheckedKeys])\n\n useEffect(() => {\n if (controlledSelectedKeys !== undefined) setSelectedKeys(controlledSelectedKeys)\n }, [controlledSelectedKeys, setSelectedKeys])\n\n // ═══════════════════════════════════════════\n // FOCUS STATE\n // ═══════════════════════════════════════════\n const [internalFocusedKey, setInternalFocusedKey] = useState<TreeKey | null>(null)\n const focusedKey = controlledFocusedKey ?? internalFocusedKey\n const treeRef = useRef<HTMLDivElement>(null)\n\n const setFocusedKey = useCallback(\n (key: TreeKey | null) => {\n setInternalFocusedKey(key)\n if (key !== null) onFocusCallback?.(key)\n },\n [onFocusCallback],\n )\n\n useEffect(() => {\n if (autoFocus && flatNodes.length > 0 && focusedKey === null) {\n setFocusedKey(flatNodes[0].key)\n }\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n // ═══════════════════════════════════════════\n // EDITING STATE\n // ═══════════════════════════════════════════\n const [editingKey, setEditingKey] = useState<TreeKey | null>(null)\n\n const isNodeEditable = useCallback(\n (node: TreeNodeData): boolean => {\n if (typeof editable === 'function') return editable(node)\n return !!editable\n },\n [editable],\n )\n\n const handleEditStart = useCallback((key: TreeKey) => {\n setEditingKey(key)\n }, [])\n\n const handleEditConfirm = useCallback(\n (key: TreeKey, value: string) => {\n const node = tree.getNode(key)\n if (node && onEdit) {\n onEdit({ key, node, value, oldValue: String(node.title ?? '') })\n }\n setEditingKey(null)\n },\n [tree, onEdit],\n )\n\n const handleEditCancelInternal = useCallback(\n (key: TreeKey) => {\n setEditingKey(null)\n onEditCancel?.(key)\n },\n [onEditCancel],\n )\n\n // ═══════════════════════════════════════════\n // DRAG STATE\n // ═══════════════════════════════════════════\n const [dragKey, setDragKey] = useState<TreeKey | null>(null)\n const [dropKey, setDropKey] = useState<TreeKey | null>(null)\n const [dropPosition, setDropPosition] = useState<-1 | 0 | 1>(0)\n\n // ═══════════════════════════════════════════\n // EVENT HANDLERS\n // ═══════════════════════════════════════════\n const handleExpand = useCallback(\n (key: TreeKey) => {\n toggleExpand(key)\n const node = tree.getNode(key)\n if (node && onExpand) {\n const newState = tree.getState()\n const expanded = newState.expandedKeys.includes(key)\n onExpand(newState.expandedKeys, { expanded, node })\n }\n },\n [toggleExpand, tree, onExpand],\n )\n\n const handleCheck = useCallback(\n (key: TreeKey) => {\n toggleCheck(key)\n if (onCheck) {\n const newState = tree.getState()\n const node = tree.getNode(key)!\n const checkedNodes = newState.checkedKeys\n .map((ck: TreeKey) => tree.getNode(ck))\n .filter(Boolean) as TreeNodeData[]\n onCheck(newState.checkedKeys, {\n checked: newState.checkedKeys.includes(key),\n node,\n checkedNodes,\n halfCheckedKeys: newState.halfCheckedKeys,\n })\n }\n },\n [toggleCheck, tree, onCheck],\n )\n\n const handleSelect = useCallback(\n (key: TreeKey) => {\n select(key, multiple)\n if (onSelect) {\n const newState = tree.getState()\n const node = tree.getNode(key)!\n const selectedNodes = newState.selectedKeys\n .map((sk: TreeKey) => tree.getNode(sk))\n .filter(Boolean) as TreeNodeData[]\n onSelect(newState.selectedKeys, {\n selected: newState.selectedKeys.includes(key),\n node,\n selectedNodes,\n })\n }\n },\n [select, multiple, tree, onSelect],\n )\n\n const handleLoadData = useCallback(\n (node: TreeNodeData) => {\n if (!loadData) return\n const key = node.key\n if (treeState.loadedKeys.includes(key) || treeState.loadingKeys.includes(key)) return\n markLoading(key)\n loadData(node).then(() => {\n markLoaded(key)\n })\n },\n [loadData, treeState.loadedKeys, treeState.loadingKeys, markLoading, markLoaded],\n )\n\n // Drag handlers\n const handleDragStart = useCallback(\n (e: React.DragEvent, key: TreeKey) => {\n setDragKey(key)\n e.dataTransfer.effectAllowed = 'move'\n const node = tree.getNode(key)\n if (node) onDragStart?.({ event: e, node })\n },\n [tree, onDragStart],\n )\n\n const handleDragOver = useCallback(\n (e: React.DragEvent, key: TreeKey) => {\n e.preventDefault()\n setDropKey(key)\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\n const y = e.clientY - rect.top\n const h = rect.height\n let pos: -1 | 0 | 1 = 0\n if (y < h * 0.25) pos = -1\n else if (y > h * 0.75) pos = 1\n setDropPosition(pos)\n const node = tree.getNode(key)\n if (node) onDragOver?.({ event: e, node })\n },\n [tree, onDragOver],\n )\n\n const handleDragLeave = useCallback(\n (e: React.DragEvent, key: TreeKey) => {\n setDropKey(null)\n const node = tree.getNode(key)\n if (node) onDragLeave?.({ event: e, node })\n },\n [tree, onDragLeave],\n )\n\n const handleDragEnd = useCallback(\n (e: React.DragEvent, key: TreeKey) => {\n setDragKey(null)\n setDropKey(null)\n const node = tree.getNode(key)\n if (node) onDragEnd?.({ event: e, node })\n },\n [tree, onDragEnd],\n )\n\n const handleDrop = useCallback(\n (e: React.DragEvent, key: TreeKey) => {\n e.preventDefault()\n if (dragKey === null || dragKey === key) {\n setDragKey(null)\n setDropKey(null)\n return\n }\n\n const dragNode = tree.getNode(dragKey)\n const dropNode = tree.getNode(key)\n if (!dragNode || !dropNode) return\n\n if (allowDrop && !allowDrop({ dragNode, dropNode, dropPosition })) {\n setDragKey(null)\n setDropKey(null)\n return\n }\n\n moveNode(dragKey, key, dropPosition)\n\n if (onDrop) {\n onDrop({ event: e, node: dropNode, dragNode, dropPosition })\n }\n\n setDragKey(null)\n setDropKey(null)\n },\n [dragKey, dropPosition, tree, allowDrop, moveNode, onDrop],\n )\n\n const handleRightClick = useCallback(\n (e: React.MouseEvent, node: TreeNodeData) => {\n onRightClick?.({ event: e, node })\n },\n [onRightClick],\n )\n\n const isDraggable = (node: TreeNodeData): boolean => {\n if (typeof draggable === 'function') return draggable(node)\n return !!draggable\n }\n\n // ═══════════════════════════════════════════\n // VIRTUAL SCROLL (refs declared early — used by keyboard handlers below)\n // ═══════════════════════════════════════════\n const containerRef = useRef<HTMLDivElement>(null)\n const [scrollTop, setScrollTop] = useState(0)\n const itemHeight = NODE_HEIGHT\n\n // Scrolls the virtual viewport so the row for `key` is visible. Declared\n // before `handleKeyDown` so it can be listed in the callback's deps array\n // (otherwise eslint-react-hooks/exhaustive-deps complains).\n const scrollToFocused = useCallback(\n (key: TreeKey) => {\n const index = flatNodes.findIndex((item) => item.key === key)\n if (index === -1) return\n const el = containerRef.current ?? treeRef.current\n if (!el) return\n const targetTop = index * itemHeight\n const { scrollTop: st, clientHeight: ch } = el\n if (targetTop < st) {\n el.scrollTop = targetTop\n } else if (targetTop + itemHeight > st + ch) {\n el.scrollTop = targetTop + itemHeight - ch\n }\n },\n [flatNodes, itemHeight],\n )\n\n // ═══════════════════════════════════════════\n // KEYBOARD NAVIGATION\n // ═══════════════════════════════════════════\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (!keyboard || disabled || editingKey !== null) return\n\n const currentIndex = flatNodes.findIndex((item) => item.key === focusedKey)\n if (currentIndex === -1 && flatNodes.length === 0) return\n\n const focusNode = (index: number) => {\n if (index >= 0 && index < flatNodes.length) {\n setFocusedKey(flatNodes[index].key)\n scrollToFocused(flatNodes[index].key)\n }\n }\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault()\n focusNode(currentIndex === -1 ? 0 : Math.min(currentIndex + 1, flatNodes.length - 1))\n break\n }\n case 'ArrowUp': {\n e.preventDefault()\n focusNode(currentIndex === -1 ? 0 : Math.max(currentIndex - 1, 0))\n break\n }\n case 'ArrowRight': {\n e.preventDefault()\n if (currentIndex === -1) break\n const item = flatNodes[currentIndex]\n if (!item.isLeaf && !treeState.expandedKeys.includes(item.key)) {\n handleExpand(item.key)\n } else if (!item.isLeaf && treeState.expandedKeys.includes(item.key)) {\n focusNode(currentIndex + 1)\n }\n break\n }\n case 'ArrowLeft': {\n e.preventDefault()\n if (currentIndex === -1) break\n const item = flatNodes[currentIndex]\n if (!item.isLeaf && treeState.expandedKeys.includes(item.key)) {\n handleExpand(item.key)\n } else if (item.parentKey !== null) {\n const parentIndex = flatNodes.findIndex((n) => n.key === item.parentKey)\n if (parentIndex !== -1) focusNode(parentIndex)\n }\n break\n }\n case 'Home': {\n e.preventDefault()\n focusNode(0)\n break\n }\n case 'End': {\n e.preventDefault()\n focusNode(flatNodes.length - 1)\n break\n }\n case 'Enter': {\n e.preventDefault()\n if (currentIndex === -1) break\n const item = flatNodes[currentIndex]\n if (selectable) handleSelect(item.key)\n break\n }\n case ' ': {\n e.preventDefault()\n if (currentIndex === -1) break\n const item = flatNodes[currentIndex]\n if (checkable) handleCheck(item.key)\n else if (!item.isLeaf) handleExpand(item.key)\n break\n }\n case '*': {\n e.preventDefault()\n expandAll()\n break\n }\n case 'F2': {\n e.preventDefault()\n if (currentIndex === -1) break\n const item = flatNodes[currentIndex]\n if (isNodeEditable(item.node)) {\n handleEditStart(item.key)\n }\n break\n }\n }\n },\n [\n keyboard,\n disabled,\n editingKey,\n flatNodes,\n focusedKey,\n treeState.expandedKeys,\n handleExpand,\n handleCheck,\n handleSelect,\n expandAll,\n setFocusedKey,\n checkable,\n selectable,\n scrollToFocused,\n isNodeEditable,\n handleEditStart,\n ],\n )\n\n // ═══════════════════════════════════════════\n // VIRTUAL SCROLL (handlers + memoized slices)\n // ═══════════════════════════════════════════\n const handleScroll = useCallback(() => {\n if (containerRef.current) {\n setScrollTop(containerRef.current.scrollTop)\n }\n }, [])\n\n const useVirtual = virtual && height !== undefined && flatNodes.length > 50\n\n // Larger overscan keeps rows mounted during fast scroll. `+ overscan*2` so\n // the visible window has padding both above and below the viewport.\n const VIRTUAL_OVERSCAN = 5\n\n const visibleSlice = useMemo(() => {\n if (!useVirtual || !height) {\n return { nodes: flatNodes, startIndex: 0 }\n }\n const rawStart = Math.floor(scrollTop / itemHeight)\n const startIndex = Math.max(0, rawStart - VIRTUAL_OVERSCAN)\n const visibleCount = Math.ceil(height / itemHeight) + VIRTUAL_OVERSCAN * 2\n const endIndex = Math.min(flatNodes.length, startIndex + visibleCount)\n return { nodes: flatNodes.slice(startIndex, endIndex), startIndex }\n }, [flatNodes, useVirtual, height, scrollTop, itemHeight])\n\n const visibleNodes = visibleSlice.nodes\n const virtualOffset = visibleSlice.startIndex * itemHeight\n\n const totalHeight = flatNodes.length * itemHeight\n const virtualBottomPad = Math.max(\n 0,\n totalHeight - virtualOffset - visibleNodes.length * itemHeight,\n )\n\n // scrollToKey prop\n useEffect(() => {\n if (scrollToKey !== undefined) {\n const index = flatNodes.findIndex((item) => item.key === scrollToKey)\n if (index !== -1) {\n scrollToFocused(scrollToKey)\n setFocusedKey(scrollToKey)\n }\n }\n }, [scrollToKey]) // eslint-disable-line react-hooks/exhaustive-deps\n\n // ═══════════════════════════════════════════\n // TOOLBAR HANDLERS\n // ═══════════════════════════════════════════\n const handleExpandAll = useCallback(() => {\n expandAll()\n if (onExpand) onExpand(tree.getState().expandedKeys, { expanded: true, node: treeData[0] })\n }, [expandAll, onExpand, tree, treeData])\n\n const handleCollapseAll = useCallback(() => {\n collapseAll()\n if (onExpand) onExpand([], { expanded: false, node: treeData[0] })\n }, [collapseAll, onExpand, treeData])\n\n const handleCheckAll = useCallback(() => {\n const allKeys = tree.getAllKeys()\n setCheckedKeys(allKeys)\n if (onCheck) {\n const allNodes = allKeys\n .map((k: TreeKey) => tree.getNode(k))\n .filter(Boolean) as TreeNodeData[]\n onCheck(allKeys, {\n checked: true,\n node: allNodes[0],\n checkedNodes: allNodes,\n halfCheckedKeys: [],\n })\n }\n }, [tree, setCheckedKeys, onCheck])\n\n const handleUncheckAll = useCallback(() => {\n setCheckedKeys([])\n if (onCheck) {\n onCheck([], { checked: false, node: treeData[0], checkedNodes: [], halfCheckedKeys: [] })\n }\n }, [setCheckedKeys, onCheck, treeData])\n\n // ═══════════════════════════════════════════\n // RENDER HELPERS\n // ═══════════════════════════════════════════\n const siblingsMap = useMemo(() => {\n if (!isShowLine) return null\n const map = new Map<TreeKey, { isLast: boolean; parentIsLast: boolean[] }>()\n function walk(list: TreeNodeData[], depth: number, parentIsLast: boolean[]) {\n for (let i = 0; i < list.length; i++) {\n const node = list[i]\n const key = node.key\n const isLast = i === list.length - 1\n map.set(key, { isLast, parentIsLast: [...parentIsLast] })\n const children = node.children\n if (children && children.length > 0) {\n walk(children, depth + 1, [...parentIsLast, isLast])\n }\n }\n }\n walk(treeData, 0, [])\n return map\n }, [treeData, isShowLine])\n\n const renderNode = (item: {\n node: TreeNodeData\n key: TreeKey\n depth: number\n isLeaf: boolean\n parentKey?: TreeKey | null\n }) => {\n const lineInfo = siblingsMap?.get(item.key)\n return (\n <TreeNodeRow\n key={item.key}\n node={item.node}\n nodeKey={item.key}\n depth={item.depth}\n isLeaf={item.isLeaf}\n indentSize={indentSize}\n expanded={treeState.expandedKeys.includes(item.key)}\n checked={treeState.checkedKeys.includes(item.key)}\n halfChecked={treeState.halfCheckedKeys.includes(item.key)}\n selected={treeState.selectedKeys.includes(item.key)}\n loading={treeState.loadingKeys.includes(item.key)}\n disabled={disabled || !!item.node.disabled}\n focused={focusedKey === item.key}\n checkable={checkable}\n selectable={selectable}\n showLine={isShowLine}\n showLeafIcon={showLineConfig.showLeafIcon ?? false}\n showIcon={showIcon || directory}\n blockNode={blockNode}\n directory={directory}\n animated={animated}\n globalIcon={globalIcon}\n nodeIcon={\n item.node.icon as\n | React.ReactNode\n | ((props: { expanded: boolean; selected: boolean }) => React.ReactNode)\n | undefined\n }\n switcherIcon={switcherIcon}\n draggable={isDraggable(item.node)}\n dropPosition={dropKey === item.key ? dropPosition : null}\n dragKey={dragKey}\n t={t}\n onExpand={handleExpand}\n onCheck={handleCheck}\n onSelect={handleSelect}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDragEnd={handleDragEnd}\n onDrop={handleDrop}\n onRightClick={onRightClick ? handleRightClick : undefined}\n onLoadData={loadData ? handleLoadData : undefined}\n nodeClassName={item.node.className as string | undefined}\n nodeStyle={item.node.style as React.CSSProperties | undefined}\n // New features\n titleRender={titleRender}\n searchValue={highlightSearch ? searchValue : ''}\n editable={isNodeEditable(item.node)}\n editing={editingKey === item.key}\n onEditStart={handleEditStart}\n onEditConfirm={handleEditConfirm}\n onEditCancel={handleEditCancelInternal}\n actions={actions}\n status={nodeStatus?.(item.node) ?? 'default'}\n lineIsLast={lineInfo?.isLast ?? false}\n lineParentIsLast={lineInfo?.parentIsLast ?? []}\n onFocusNode={setFocusedKey}\n />\n )\n }\n\n // ═══════════════════════════════════════════\n // UNSTYLED RENDER\n // ═══════════════════════════════════════════\n if (unstyled) {\n return (\n <div\n ref={treeRef}\n className={className}\n style={style}\n role=\"tree\"\n tabIndex={0}\n onKeyDown={handleKeyDown}\n >\n {flatNodes.map((item) => renderNode(item))}\n </div>\n )\n }\n\n // ═══════════════════════════════════════════\n // STYLED RENDER\n // ═══════════════════════════════════════════\n const wrapperCls = [\n 'sg-tree',\n isShowLine ? 'sg-tree-show-line' : '',\n blockNode ? 'sg-tree-block-node' : '',\n directory ? 'sg-tree-directory' : '',\n disabled ? 'sg-tree-disabled' : '',\n animated ? 'sg-tree-animated' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const renderSearch = () => {\n if (!showSearch) return null\n return (\n <div className=\"sg-tree-search\">\n <input\n className=\"sg-tree-search-input\"\n type=\"text\"\n value={searchValue}\n onChange={(e) => handleSearchChange(e.target.value)}\n placeholder={t.searchPlaceholder}\n aria-label={t.searchPlaceholder}\n />\n {searchValue && (\n <button\n className=\"sg-tree-search-clear\"\n onClick={() => handleSearchChange('')}\n aria-label={t.clearSearch}\n type=\"button\"\n >\n ×\n </button>\n )}\n </div>\n )\n }\n\n const renderToolbar = () => {\n if (!showToolbar) return null\n return (\n <div className=\"sg-tree-toolbar\">\n <div className=\"sg-tree-toolbar-actions\">\n <button\n className=\"sg-tree-toolbar-btn\"\n onClick={handleExpandAll}\n title={t.expandAllText}\n type=\"button\"\n >\n ⊞\n </button>\n <button\n className=\"sg-tree-toolbar-btn\"\n onClick={handleCollapseAll}\n title={t.collapseAllText}\n type=\"button\"\n >\n ⊟\n </button>\n {checkable && (\n <>\n <span className=\"sg-tree-toolbar-divider\" />\n <button\n className=\"sg-tree-toolbar-btn\"\n onClick={handleCheckAll}\n title={t.checkAllText}\n type=\"button\"\n >\n ☑\n </button>\n <button\n className=\"sg-tree-toolbar-btn\"\n onClick={handleUncheckAll}\n title={t.uncheckAllText}\n type=\"button\"\n >\n ☐\n </button>\n </>\n )}\n </div>\n {toolbarExtra && <div className=\"sg-tree-toolbar-extra\">{toolbarExtra}</div>}\n </div>\n )\n }\n\n const renderNodes = (list: typeof visibleNodes) => list.map((item) => renderNode(item))\n\n if (flatNodes.length === 0) {\n return (\n <div className={wrapperCls} style={style} role=\"tree\">\n {renderSearch()}\n {renderToolbar()}\n <div className=\"sg-tree-empty\">{t.emptyText}</div>\n </div>\n )\n }\n\n if (useVirtual && height) {\n return (\n <div className={wrapperCls} style={style}>\n {renderSearch()}\n {renderToolbar()}\n <div\n ref={containerRef}\n className=\"sg-tree-virtual-container\"\n style={{ height, overflow: 'auto' }}\n onScroll={handleScroll}\n onKeyDown={handleKeyDown}\n role=\"tree\"\n tabIndex={0}\n >\n <div\n style={{\n paddingTop: virtualOffset,\n paddingBottom: virtualBottomPad,\n boxSizing: 'border-box',\n }}\n >\n {renderNodes(visibleNodes)}\n </div>\n </div>\n </div>\n )\n }\n\n return (\n <div\n ref={treeRef}\n className={wrapperCls}\n style={style}\n role=\"tree\"\n tabIndex={0}\n onKeyDown={handleKeyDown}\n >\n {renderSearch()}\n {renderToolbar()}\n {renderNodes(visibleNodes)}\n </div>\n )\n}\n","import { useState, useCallback, useMemo } from 'react'\nimport { createCore, createTree } from '@skygraph/core'\nimport type {\n Core,\n TreeEngine,\n TreeState,\n TreeEngineOptions,\n TreeKey,\n TreeNodeData,\n} from '@skygraph/core'\n\nexport interface UseTreeOptions extends TreeEngineOptions {\n data?: TreeNodeData[]\n}\n\nexport interface UseTreeReturn {\n core: Core\n tree: TreeEngine\n treeState: TreeState\n flatNodes: ReturnType<TreeEngine['getFlatNodes']>\n expand: (key: TreeKey) => void\n collapse: (key: TreeKey) => void\n toggleExpand: (key: TreeKey) => void\n setExpandedKeys: (keys: TreeKey[]) => void\n expandAll: () => void\n collapseAll: () => void\n expandToLevel: (level: number) => void\n check: (key: TreeKey) => void\n uncheck: (key: TreeKey) => void\n toggleCheck: (key: TreeKey) => void\n setCheckedKeys: (keys: TreeKey[]) => void\n checkAll: () => void\n uncheckAll: () => void\n select: (key: TreeKey, multiple?: boolean) => void\n deselect: (key: TreeKey) => void\n setSelectedKeys: (keys: TreeKey[]) => void\n markLoading: (key: TreeKey) => void\n markLoaded: (key: TreeKey) => void\n addChildren: (parentKey: TreeKey, children: TreeNodeData[]) => void\n moveNode: (dragKey: TreeKey, dropKey: TreeKey, position: -1 | 0 | 1) => TreeNodeData[] | null\n filterNodes: (predicate: ((node: TreeNodeData) => boolean) | null) => void\n getNodePath: (key: TreeKey) => TreeKey[]\n refresh: () => void\n}\n\nexport function useTree(options?: UseTreeOptions): UseTreeReturn {\n const [{ core, tree }] = useState(() => {\n const c = createCore()\n const t = createTree(c, options)\n if (options?.data) {\n t.setData(options.data)\n }\n return { core: c, tree: t }\n })\n\n const [treeState, setTreeState] = useState(() => tree.getState())\n const [flatNodes, setFlatNodes] = useState(() => tree.getFlatNodes())\n\n const refresh = useCallback(() => {\n setTreeState(tree.getState())\n setFlatNodes(tree.getFlatNodes())\n }, [tree])\n\n const expand = useCallback((key: TreeKey) => { tree.expand(key); refresh() }, [tree, refresh])\n const collapse = useCallback((key: TreeKey) => { tree.collapse(key); refresh() }, [tree, refresh])\n const toggleExpand = useCallback((key: TreeKey) => { tree.toggleExpand(key); refresh() }, [tree, refresh])\n const setExpandedKeys = useCallback((keys: TreeKey[]) => { tree.setExpandedKeys(keys); refresh() }, [tree, refresh])\n const expandAll = useCallback(() => { tree.expandAll(); refresh() }, [tree, refresh])\n const collapseAll = useCallback(() => { tree.collapseAll(); refresh() }, [tree, refresh])\n\n const check = useCallback((key: TreeKey) => { tree.check(key); refresh() }, [tree, refresh])\n const uncheck = useCallback((key: TreeKey) => { tree.uncheck(key); refresh() }, [tree, refresh])\n const toggleCheck = useCallback((key: TreeKey) => { tree.toggleCheck(key); refresh() }, [tree, refresh])\n const setCheckedKeys = useCallback((keys: TreeKey[]) => { tree.setCheckedKeys(keys); refresh() }, [tree, refresh])\n\n const select = useCallback((key: TreeKey, multiple?: boolean) => { tree.select(key, multiple); refresh() }, [tree, refresh])\n const deselect = useCallback((key: TreeKey) => { tree.deselect(key); refresh() }, [tree, refresh])\n const setSelectedKeys = useCallback((keys: TreeKey[]) => { tree.setSelectedKeys(keys); refresh() }, [tree, refresh])\n\n const markLoading = useCallback((key: TreeKey) => { tree.markLoading(key); refresh() }, [tree, refresh])\n const markLoaded = useCallback((key: TreeKey) => { tree.markLoaded(key); refresh() }, [tree, refresh])\n const addChildren = useCallback((parentKey: TreeKey, children: TreeNodeData[]) => { tree.addChildren(parentKey, children); refresh() }, [tree, refresh])\n\n const moveNode = useCallback((dragKey: TreeKey, dropKey: TreeKey, position: -1 | 0 | 1) => {\n const result = tree.moveNode(dragKey, dropKey, position)\n refresh()\n return result\n }, [tree, refresh])\n\n const filterNodes = useCallback((predicate: ((node: TreeNodeData) => boolean) | null) => {\n tree.filterNodes(predicate)\n refresh()\n }, [tree, refresh])\n\n const expandToLevel = useCallback((level: number) => {\n const flat = tree.getFlatNodes()\n const keys: TreeKey[] = []\n for (const item of flat) {\n if (item.depth < level && !item.isLeaf) {\n keys.push(item.key)\n }\n }\n tree.expandAll()\n const allFlat = tree.getFlatNodes()\n const expandKeys: TreeKey[] = []\n for (const item of allFlat) {\n if (item.depth < level && !item.isLeaf) {\n expandKeys.push(item.key)\n }\n }\n tree.setExpandedKeys(expandKeys)\n refresh()\n }, [tree, refresh])\n\n const checkAll = useCallback(() => {\n const allKeys = tree.getAllKeys()\n tree.setCheckedKeys(allKeys)\n refresh()\n }, [tree, refresh])\n\n const uncheckAll = useCallback(() => {\n tree.setCheckedKeys([])\n refresh()\n }, [tree, refresh])\n\n const getNodePath = useCallback((key: TreeKey): TreeKey[] => {\n const path: TreeKey[] = []\n let current: TreeKey | null = key\n while (current !== null) {\n path.unshift(current)\n current = tree.getParentKey(current)\n }\n return path\n }, [tree])\n\n return useMemo(() => ({\n core, tree, treeState, flatNodes,\n expand, collapse, toggleExpand, setExpandedKeys, expandAll, collapseAll, expandToLevel,\n check, uncheck, toggleCheck, setCheckedKeys, checkAll, uncheckAll,\n select, deselect, setSelectedKeys,\n markLoading, markLoaded, addChildren,\n moveNode, filterNodes, getNodePath, refresh,\n }), [\n core, tree, treeState, flatNodes,\n expand, collapse, toggleExpand, setExpandedKeys, expandAll, collapseAll, expandToLevel,\n check, uncheck, toggleCheck, setCheckedKeys, checkAll, uncheckAll,\n select, deselect, setSelectedKeys,\n markLoading, markLoaded, addChildren,\n moveNode, filterNodes, getNodePath, refresh,\n ])\n}\n","import React, { useState, useRef, useEffect, useCallback } from 'react'\nimport { Checkbox } from '../../ui/Checkbox'\nimport { Spin } from '../../ui/Spin'\nimport type { TreeKey, TreeNodeData, TreeLocale, TreeNodeAction, TreeNodeStatus } from './types'\n\n/** Internal props for a single rendered tree node row. */\ninterface TreeNodeRowProps {\n /** Node data. */\n node: TreeNodeData\n /** Node key. */\n nodeKey: TreeKey\n /** Nesting depth for layout. */\n depth: number\n /** Whether this node is a leaf in the flattened list. */\n isLeaf: boolean\n /** Indentation step in pixels. */\n indentSize: number\n\n /** Expanded state. */\n expanded: boolean\n /** Checked state. */\n checked: boolean\n /** Indeterminate checkbox state. */\n halfChecked: boolean\n /** Selected state. */\n selected: boolean\n /** Async children loading flag. */\n loading: boolean\n /** Row interaction disabled. */\n disabled: boolean\n /** Whether this row has keyboard focus. */\n focused: boolean\n\n /** Checkbox column visible. */\n checkable: boolean\n /** Title click selects the node. */\n selectable: boolean\n /** Vertical guide lines enabled. */\n showLine: boolean\n /** Custom leaf connector when `showLine` is on. */\n showLeafIcon: boolean | React.ReactNode\n /** Leading custom or folder icon. */\n showIcon: boolean\n /** Full row hit target for selection. */\n blockNode: boolean\n /** Directory-style expand-on-select for folders. */\n directory: boolean\n /** Animate expand/collapse affordance. */\n animated: boolean\n\n /** Tree-level default icon. */\n globalIcon?: React.ReactNode | ((props: { expanded: boolean; selected: boolean }) => React.ReactNode)\n /** Per-node icon override. */\n nodeIcon?: React.ReactNode | ((props: { expanded: boolean; selected: boolean }) => React.ReactNode)\n /** Custom expander icon. */\n switcherIcon?: React.ReactNode | ((props: { expanded: boolean; loading: boolean; isLeaf: boolean }) => React.ReactNode)\n\n /** Row is draggable. */\n draggable: boolean\n /** Active drop indicator band on this row. */\n dropPosition: -1 | 0 | 1 | null\n /** Key of the row currently being dragged, if any. */\n dragKey: TreeKey | null\n\n /** Resolved locale strings. */\n t: Required<TreeLocale>\n\n /** Toggle expand. */\n onExpand: (key: TreeKey) => void\n /** Toggle check. */\n onCheck: (key: TreeKey) => void\n /** Toggle select. */\n onSelect: (key: TreeKey) => void\n /** Native drag start. */\n onDragStart: (e: React.DragEvent, key: TreeKey) => void\n /** Native drag over. */\n onDragOver: (e: React.DragEvent, key: TreeKey) => void\n /** Native drag leave. */\n onDragLeave: (e: React.DragEvent, key: TreeKey) => void\n /** Native drag end. */\n onDragEnd: (e: React.DragEvent, key: TreeKey) => void\n /** Native drop. */\n onDrop: (e: React.DragEvent, key: TreeKey) => void\n /** Context menu handler. */\n onRightClick?: (e: React.MouseEvent, node: TreeNodeData) => void\n /** Lazy-load children on expand. */\n onLoadData?: (node: TreeNodeData) => void\n /** Moves roving tabindex / focus highlight. */\n onFocusNode: (key: TreeKey | null) => void\n\n /** Custom title render replacing default text. */\n titleRender?: (node: TreeNodeData, info: { expanded: boolean; selected: boolean; checked: boolean; halfChecked: boolean }) => React.ReactNode\n /** Current filter string for search highlighting. */\n searchValue?: string\n\n /** Inline edit allowed for this row. */\n editable: boolean\n /** Row is currently in edit mode. */\n editing: boolean\n /** Enter edit mode. */\n onEditStart: (key: TreeKey) => void\n /** Commit edited title. */\n onEditConfirm: (key: TreeKey, value: string) => void\n /** Cancel edit mode. */\n onEditCancel: (key: TreeKey) => void\n\n /** Hover action buttons. */\n actions?: TreeNodeAction[]\n\n /** Semantic status styling for the row. */\n status: TreeNodeStatus\n\n /** Whether this node is the last child of its parent (line drawing). */\n lineIsLast: boolean\n /** Ancestor “last child” flags for line drawing. */\n lineParentIsLast: boolean[]\n\n /** Unstyled row. */\n unstyled?: boolean\n /** Extra class from node. */\n nodeClassName?: string\n /** Inline style from node. */\n nodeStyle?: React.CSSProperties\n}\n\n/** Renders one tree row: lines, switcher, checkbox, icon, title, edit field, and actions. */\nexport function TreeNodeRow(props: TreeNodeRowProps) {\n const {\n node, nodeKey, depth, isLeaf, indentSize,\n expanded, checked, halfChecked, selected, loading, disabled, focused,\n checkable, selectable, showLine, showLeafIcon, showIcon, blockNode, directory,\n globalIcon, nodeIcon, switcherIcon,\n draggable, dropPosition, dragKey,\n onExpand, onCheck, onSelect,\n onDragStart, onDragOver, onDragLeave, onDragEnd, onDrop,\n onRightClick, onLoadData, onFocusNode,\n titleRender, searchValue,\n editable, editing, onEditStart, onEditConfirm, onEditCancel,\n actions,\n status,\n lineIsLast, lineParentIsLast,\n unstyled, nodeClassName, nodeStyle,\n } = props\n\n const rowRef = useRef<HTMLDivElement>(null)\n const editInputRef = useRef<HTMLInputElement>(null)\n const [editValue, setEditValue] = useState('')\n\n useEffect(() => {\n if (editing) {\n setEditValue(String(node.title ?? ''))\n setTimeout(() => editInputRef.current?.focus(), 0)\n }\n }, [editing, node.title])\n\n useEffect(() => {\n if (focused && rowRef.current) {\n rowRef.current.scrollIntoView?.({ block: 'nearest' })\n }\n }, [focused])\n\n const handleSwitcherClick = (e: React.MouseEvent) => {\n e.stopPropagation()\n if (isLeaf) return\n if (!expanded && loading) return\n onExpand(nodeKey)\n if (!expanded && !isLeaf && onLoadData) {\n onLoadData(node)\n }\n }\n\n const handleCheckChange = () => {\n if (disabled || node.disableCheckbox) return\n onCheck(nodeKey)\n }\n\n const handleSelect = () => {\n if (disabled || (node.selectable === false)) return\n if (!selectable) return\n onSelect(nodeKey)\n if (directory && !isLeaf) {\n onExpand(nodeKey)\n }\n }\n\n const handleClick = () => {\n onFocusNode(nodeKey)\n handleSelect()\n }\n\n const handleDoubleClick = () => {\n if (editable && !editing) {\n onEditStart(nodeKey)\n }\n }\n\n const handleContextMenu = (e: React.MouseEvent) => {\n if (onRightClick) {\n e.preventDefault()\n onRightClick(e, node)\n }\n }\n\n const handleEditKeyDown = useCallback((e: React.KeyboardEvent) => {\n e.stopPropagation()\n if (e.key === 'Enter') {\n onEditConfirm(nodeKey, editValue)\n } else if (e.key === 'Escape') {\n onEditCancel(nodeKey)\n }\n }, [nodeKey, editValue, onEditConfirm, onEditCancel])\n\n const handleEditBlur = useCallback(() => {\n onEditConfirm(nodeKey, editValue)\n }, [nodeKey, editValue, onEditConfirm])\n\n // Highlighted title with search match\n const renderHighlightedTitle = (title: string) => {\n if (!searchValue) return title\n const index = title.toLowerCase().indexOf(searchValue.toLowerCase())\n if (index === -1) return title\n const before = title.slice(0, index)\n const match = title.slice(index, index + searchValue.length)\n const after = title.slice(index + searchValue.length)\n return (\n <>\n {before}\n <span className=\"sg-tree-highlight\">{match}</span>\n {after}\n </>\n )\n }\n\n // Switcher icon\n const renderSwitcher = () => {\n if (isLeaf) {\n if (showLine) {\n if (showLeafIcon === false) return <span className=\"sg-tree-switcher sg-tree-switcher-noop\" />\n if (showLeafIcon && typeof showLeafIcon !== 'boolean') {\n return <span className=\"sg-tree-switcher sg-tree-switcher-leaf-icon\">{showLeafIcon}</span>\n }\n return <span className=\"sg-tree-switcher sg-tree-switcher-leaf\">─</span>\n }\n return <span className=\"sg-tree-switcher sg-tree-switcher-noop\" />\n }\n\n if (loading) {\n return <span className=\"sg-tree-switcher sg-tree-switcher-loading\"><Spin size=\"small\" /></span>\n }\n\n let iconContent: React.ReactNode\n if (switcherIcon) {\n iconContent = typeof switcherIcon === 'function'\n ? switcherIcon({ expanded, loading, isLeaf })\n : switcherIcon\n } else {\n iconContent = (\n <svg\n className={`sg-tree-switcher-arrow${expanded ? ' sg-tree-switcher-arrow-open' : ''}`}\n width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\"\n >\n <path d=\"M3 2L7 5L3 8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n )\n }\n\n return (\n <span\n className={`sg-tree-switcher${expanded ? ' sg-tree-switcher-open' : ' sg-tree-switcher-close'}`}\n onClick={handleSwitcherClick}\n >\n {iconContent}\n </span>\n )\n }\n\n // Node icon\n const renderIcon = () => {\n if (!showIcon && !directory) return null\n const iconSource = nodeIcon ?? globalIcon\n let iconContent: React.ReactNode = null\n\n if (iconSource) {\n iconContent = typeof iconSource === 'function'\n ? iconSource({ expanded, selected })\n : iconSource\n } else if (directory) {\n iconContent = expanded ? '📂' : '📁'\n }\n\n if (!iconContent) return null\n return <span className=\"sg-tree-icon\">{iconContent}</span>\n }\n\n // Title content\n const renderTitle = () => {\n if (editing) {\n return (\n <input\n ref={editInputRef}\n className=\"sg-tree-edit-input\"\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onKeyDown={handleEditKeyDown}\n onBlur={handleEditBlur}\n onClick={(e) => e.stopPropagation()}\n />\n )\n }\n\n if (titleRender) {\n return titleRender(node, { expanded, selected, checked, halfChecked })\n }\n\n const titleText = String(node.title ?? nodeKey)\n return renderHighlightedTitle(titleText)\n }\n\n // Action buttons\n const renderActions = () => {\n if (!actions || actions.length === 0) return null\n const visibleActions = actions.filter((a) => !a.visible || a.visible(node))\n if (visibleActions.length === 0) return null\n\n return (\n <span className=\"sg-tree-actions\" onClick={(e) => e.stopPropagation()}>\n {visibleActions.map((action) => {\n const isDisabled = action.disabled?.(node) ?? false\n return (\n <button\n key={action.key}\n className={`sg-tree-action-btn${action.danger ? ' sg-tree-action-danger' : ''}${isDisabled ? ' sg-tree-action-disabled' : ''}`}\n title={action.title}\n onClick={(e) => {\n e.stopPropagation()\n if (!isDisabled) action.onClick(node, nodeKey)\n }}\n disabled={isDisabled}\n type=\"button\"\n >\n {action.icon ?? action.title ?? action.key}\n </button>\n )\n })}\n </span>\n )\n }\n\n // Connecting lines\n const renderIndentLines = () => {\n if (!showLine) return null\n const lines: React.ReactNode[] = []\n for (let i = 0; i < depth; i++) {\n const isParentLast = lineParentIsLast[i] ?? false\n lines.push(\n <span\n key={i}\n className={`sg-tree-indent-line${isParentLast ? ' sg-tree-indent-line-hidden' : ''}`}\n style={{ left: i * indentSize + indentSize / 2 }}\n />\n )\n }\n if (depth > 0) {\n lines.push(\n <span\n key=\"branch\"\n className={`sg-tree-indent-branch${lineIsLast ? ' sg-tree-indent-branch-last' : ''}`}\n style={{ left: (depth - 1) * indentSize + indentSize / 2 }}\n />\n )\n }\n return <>{lines}</>\n }\n\n // Status dot\n const renderStatus = () => {\n if (status === 'default') return null\n return <span className={`sg-tree-status sg-tree-status-${status}`} />\n }\n\n if (unstyled) {\n return (\n <div\n ref={rowRef}\n role=\"treeitem\"\n aria-expanded={isLeaf ? undefined : expanded}\n aria-selected={selected}\n aria-checked={checkable ? checked : undefined}\n aria-level={depth + 1}\n data-key={nodeKey}\n >\n {checkable && (\n <Checkbox\n checked={checked}\n indeterminate={halfChecked}\n disabled={disabled || node.disableCheckbox}\n onChange={handleCheckChange}\n unstyled\n />\n )}\n <span onClick={handleClick}>{renderTitle()}</span>\n </div>\n )\n }\n\n const isDragging = dragKey === nodeKey\n\n const rowCls = [\n 'sg-tree-node',\n selected ? 'sg-tree-node-selected' : '',\n disabled ? 'sg-tree-node-disabled' : '',\n isLeaf ? 'sg-tree-node-leaf' : '',\n expanded ? 'sg-tree-node-expanded' : '',\n draggable ? 'sg-tree-node-draggable' : '',\n isDragging ? 'sg-tree-node-dragging' : '',\n dropPosition === 0 ? 'sg-tree-node-drop-inner' : '',\n dropPosition === -1 ? 'sg-tree-node-drop-before' : '',\n dropPosition === 1 ? 'sg-tree-node-drop-after' : '',\n showLine ? 'sg-tree-node-show-line' : '',\n blockNode ? 'sg-tree-node-block' : '',\n directory ? 'sg-tree-node-directory' : '',\n focused ? 'sg-tree-node-focused' : '',\n editing ? 'sg-tree-node-editing' : '',\n status !== 'default' ? `sg-tree-node-status-${status}` : '',\n nodeClassName,\n ].filter(Boolean).join(' ')\n\n return (\n <div\n ref={rowRef}\n className={rowCls}\n style={{ ...nodeStyle, paddingLeft: depth * indentSize }}\n role=\"treeitem\"\n aria-expanded={isLeaf ? undefined : expanded}\n aria-selected={selected}\n aria-checked={checkable ? checked : undefined}\n aria-level={depth + 1}\n data-key={nodeKey}\n draggable={draggable && !editing}\n onDragStart={draggable ? (e) => onDragStart(e, nodeKey) : undefined}\n onDragOver={draggable ? (e) => { e.preventDefault(); onDragOver(e, nodeKey) } : undefined}\n onDragLeave={draggable ? (e) => onDragLeave(e, nodeKey) : undefined}\n onDragEnd={draggable ? (e) => onDragEnd(e, nodeKey) : undefined}\n onDrop={draggable ? (e) => { e.preventDefault(); onDrop(e, nodeKey) } : undefined}\n onContextMenu={handleContextMenu}\n onClick={handleClick}\n onDoubleClick={editable ? handleDoubleClick : undefined}\n >\n {renderIndentLines()}\n {renderSwitcher()}\n\n {checkable && node.checkable !== false && (\n <Checkbox\n checked={checked}\n indeterminate={halfChecked}\n disabled={disabled || node.disableCheckbox}\n onChange={handleCheckChange}\n />\n )}\n\n {renderIcon()}\n {renderStatus()}\n\n <span\n className={`sg-tree-title${selectable && !editing ? ' sg-tree-title-selectable' : ''}`}\n >\n {renderTitle()}\n </span>\n\n {renderActions()}\n </div>\n )\n}\n","import React from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, InteractiveProps } from '../../types'\nimport { Spin } from './Spin'\n\n/** Props for the Checkbox component. */\nexport interface CheckboxProps extends BaseComponentProps, InteractiveProps {\n /** Controlled checked state. */\n checked?: boolean\n /** Uncontrolled initial checked state. */\n defaultChecked?: boolean\n /** Renders the native checkbox in indeterminate state. */\n indeterminate?: boolean\n /** Called when the checked state changes. */\n onChange?: (checked: boolean) => void\n /** Label content beside the control. */\n children?: React.ReactNode\n}\n\n/** Labeled checkbox with indeterminate support and optional loading state. */\nexport function Checkbox({\n checked,\n defaultChecked,\n disabled: disabledProp,\n loading,\n indeterminate,\n onChange,\n children,\n className,\n style,\n unstyled,\n}: CheckboxProps) {\n const config = useConfig()\n const disabled = disabledProp ?? config.disabled ?? false\n\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n React.useEffect(() => {\n if (inputRef.current) {\n inputRef.current.indeterminate = indeterminate ?? false\n }\n }, [indeterminate])\n\n const wrapperClass = unstyled\n ? (className ?? '')\n : [\n 'sg-checkbox',\n disabled || loading ? 'sg-checkbox-disabled' : '',\n loading ? 'sg-checkbox-loading' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <label className={wrapperClass} style={style}>\n <input\n ref={inputRef}\n type=\"checkbox\"\n aria-checked={checked}\n className={unstyled ? '' : 'sg-checkbox-input'}\n checked={checked}\n defaultChecked={defaultChecked}\n disabled={disabled || loading}\n onChange={(e) => onChange?.(e.target.checked)}\n />\n {!unstyled && <span className=\"sg-checkbox-box\" aria-hidden />}\n {children && <span className={unstyled ? '' : 'sg-checkbox-label'}>{children}</span>}\n {loading && <Spin size=\"small\" unstyled={unstyled} />}\n </label>\n )\n}\n","import React, { createContext, useContext, useMemo } from 'react'\nimport type { SizeType, SgLocale } from '../types'\n\n/** Text/layout direction shared by descendant components. */\nexport type Direction = 'ltr' | 'rtl'\n\n/**\n * Friendly design-token overrides. Each entry is mapped to a `--sg-*` CSS\n * custom property and emitted onto a `display: contents` scope wrapper, so\n * overrides cascade to every descendant without affecting layout.\n *\n * Numeric values for length-like tokens (`borderRadius`, `fontSize`) are\n * suffixed with `px`; everything else is emitted verbatim.\n */\nexport interface SgThemeToken {\n /** Brand / primary color → `--sg-color-primary`. */\n colorPrimary?: string\n /** Success color → `--sg-color-success`. */\n colorSuccess?: string\n /** Warning color → `--sg-color-warning`. */\n colorWarning?: string\n /** Error / danger color → `--sg-color-error`. */\n colorError?: string\n /** Base text color → `--sg-color-text`. */\n colorText?: string\n /** Base background color → `--sg-color-bg`. */\n colorBg?: string\n /** Base border color → `--sg-color-border`. */\n colorBorder?: string\n /** Base corner radius → `--sg-border-radius` (number ⇒ px). */\n borderRadius?: number | string\n /** Base font size → `--sg-font-size` (number ⇒ px). */\n fontSize?: number | string\n /** Base font family → `--sg-font-sans`. */\n fontFamily?: string\n}\n\n/**\n * Theme configuration. Combines a built-in light/dark preset (`mode`),\n * friendly token overrides (`token`), and an escape hatch for raw CSS\n * variables (`cssVars`). All three are applied to a scope wrapper.\n */\nexport interface ThemeConfig {\n /** Built-in palette preset applied via `data-sg-theme`. */\n mode?: 'light' | 'dark'\n /** Friendly token overrides mapped to `--sg-*` variables. */\n token?: SgThemeToken\n /** Raw CSS variable overrides (full names, e.g. `{ '--sg-color-link': '#f50' }`). */\n cssVars?: Record<string, string>\n}\n\n/** Content-Security-Policy options for runtime-injected styles. */\nexport interface CSPConfig {\n /** `nonce` attribute applied to dynamically created `<style>` tags. */\n nonce?: string\n}\n\n/** Customizes the empty state rendered by data components (`Empty`, `Table`, …). */\nexport type RenderEmptyHandler = (componentName?: string) => React.ReactNode\n\n/**\n * Global Skygraph component configuration merged through React context.\n *\n * По `prefixCls`: сознательно НЕ входит в публичный API до реализации\n * (вариант A в `docs/styling-plan.md`, фаза 4). На практике все корневые классы\n * имеют стабильный префикс `.sg-*`; если нужна изоляция — используйте изолированный\n * скоуп на хосте (шадоу-рут/отдельный контейнер со своими токенами).\n */\nexport interface SgConfig {\n /** Default size token for nested components. */\n size?: SizeType\n /** Disables interactions for nested components when true. */\n disabled?: boolean\n /** Enables bordered styling for nested components when true. */\n bordered?: boolean\n /** Text / layout direction (`ltr` by default) applied via the `dir` attribute. */\n direction?: Direction\n /** Locale messages shallow-merged with the parent provider when set. */\n locale?: SgLocale\n /** Theme preset + token overrides applied to a scope wrapper. */\n theme?: ThemeConfig\n /**\n * Returns the mount node for popups (dropdowns, tooltips, pickers). Defaults\n * to `document.body` in consumers. Useful to keep overlays inside a scrolling\n * or scoped container.\n */\n getPopupContainer?: (triggerNode?: HTMLElement) => HTMLElement\n /** Returns the scroll/target container for affix-like positioning. */\n getTargetContainer?: () => HTMLElement\n /** Global override for the default empty state. */\n renderEmpty?: RenderEmptyHandler\n /** Content-Security-Policy options for injected styles. */\n csp?: CSPConfig\n}\n\nconst SgConfigContext = createContext<SgConfig>({})\n\n/** Props for `ConfigProvider`, extending `SgConfig` with React children. */\nexport interface ConfigProviderProps extends SgConfig {\n /** Tree of components that consume merged configuration from this provider. */\n children: React.ReactNode\n}\n\n/** Maps friendly token names to their `--sg-*` CSS variable. */\nconst TOKEN_TO_CSS_VAR: Record<keyof SgThemeToken, string> = {\n colorPrimary: '--sg-color-primary',\n colorSuccess: '--sg-color-success',\n colorWarning: '--sg-color-warning',\n colorError: '--sg-color-error',\n colorText: '--sg-color-text',\n colorBg: '--sg-color-bg',\n colorBorder: '--sg-color-border',\n borderRadius: '--sg-border-radius',\n fontSize: '--sg-font-size',\n fontFamily: '--sg-font-sans',\n}\n\n/** Token keys whose numeric values should be emitted as `px` lengths. */\nconst PX_TOKENS = new Set<keyof SgThemeToken>(['borderRadius', 'fontSize'])\n\n/** Builds a CSS-variable map from a theme's `token` + `cssVars`. */\nexport function buildThemeVars(theme?: ThemeConfig): Record<string, string> {\n const vars: Record<string, string> = {}\n if (!theme) return vars\n if (theme.token) {\n for (const key of Object.keys(theme.token) as Array<keyof SgThemeToken>) {\n const value = theme.token[key]\n if (value == null) continue\n const cssVar = TOKEN_TO_CSS_VAR[key]\n if (!cssVar) continue\n vars[cssVar] = typeof value === 'number' && PX_TOKENS.has(key) ? `${value}px` : String(value)\n }\n }\n if (theme.cssVars) {\n for (const [name, value] of Object.entries(theme.cssVars)) {\n if (value == null) continue\n vars[name.startsWith('--') ? name : `--${name}`] = String(value)\n }\n }\n return vars\n}\n\n/** Shallow-merges a parent and child theme (`token` / `cssVars` merged key-wise). */\nfunction mergeTheme(parent?: ThemeConfig, child?: ThemeConfig): ThemeConfig | undefined {\n if (!parent) return child\n if (!child) return parent\n return {\n mode: child.mode ?? parent.mode,\n token: { ...parent.token, ...child.token },\n cssVars: { ...parent.cssVars, ...child.cssVars },\n }\n}\n\n/**\n * Merges Skygraph configuration with any parent provider and exposes it via context.\n * Descendants read values through `useConfig` or `useConfigWithDefaults`.\n *\n * When `theme` or `direction` is set, children are wrapped in a `display: contents`\n * element that carries the `dir`/`data-sg-theme` attributes and CSS variables, so\n * the scope inherits without introducing an extra layout box.\n */\nexport function ConfigProvider({ children, ...config }: ConfigProviderProps) {\n const parent = useContext(SgConfigContext)\n\n const merged = useMemo<SgConfig>(\n () => ({\n size: config.size ?? parent.size,\n disabled: config.disabled ?? parent.disabled,\n bordered: config.bordered ?? parent.bordered,\n direction: config.direction ?? parent.direction,\n locale: config.locale\n ? parent.locale\n ? { ...parent.locale, ...config.locale }\n : config.locale\n : parent.locale,\n theme: mergeTheme(parent.theme, config.theme),\n getPopupContainer: config.getPopupContainer ?? parent.getPopupContainer,\n getTargetContainer: config.getTargetContainer ?? parent.getTargetContainer,\n renderEmpty: config.renderEmpty ?? parent.renderEmpty,\n csp: config.csp ?? parent.csp,\n }),\n [\n config.size,\n config.disabled,\n config.bordered,\n config.direction,\n config.locale,\n config.theme,\n config.getPopupContainer,\n config.getTargetContainer,\n config.renderEmpty,\n config.csp,\n parent,\n ],\n )\n\n // Only the *own* props are emitted to the DOM scope; CSS variables and the\n // `dir` attribute cascade to descendants, so nested providers stay correct.\n const ownVars = useMemo(() => buildThemeVars(config.theme), [config.theme])\n const mode = config.theme?.mode\n const direction = config.direction\n const needsScope = Boolean(direction || mode || Object.keys(ownVars).length > 0)\n\n const content = needsScope ? (\n <div\n className=\"sg-config-provider\"\n style={{ display: 'contents', ...ownVars } as React.CSSProperties}\n dir={direction}\n data-sg-theme={mode}\n >\n {children}\n </div>\n ) : (\n children\n )\n\n return <SgConfigContext.Provider value={merged}>{content}</SgConfigContext.Provider>\n}\n\n/** Returns the merged `SgConfig` from the nearest ancestor `ConfigProvider`. */\nexport function useConfig(): SgConfig {\n return useContext(SgConfigContext)\n}\n\n/**\n * Resolves effective `size`, `disabled`, and `direction` from props, context,\n * and explicit defaults. Returns the original props plus the resolved values.\n */\nexport function useConfigWithDefaults<T extends Record<string, unknown>>(\n props: T,\n defaults: { size?: SizeType; disabled?: boolean; bordered?: boolean; direction?: Direction },\n): T & { resolvedSize: SizeType; resolvedDisabled: boolean; resolvedDirection: Direction } {\n const config = useContext(SgConfigContext)\n\n return useMemo(() => {\n const resolvedSize =\n ((props as Record<string, unknown>).size as SizeType | undefined) ??\n config.size ??\n defaults.size ??\n 'middle'\n const resolvedDisabled =\n ((props as Record<string, unknown>).disabled as boolean | undefined) ??\n config.disabled ??\n defaults.disabled ??\n false\n const resolvedDirection =\n ((props as Record<string, unknown>).direction as Direction | undefined) ??\n config.direction ??\n defaults.direction ??\n 'ltr'\n\n return { ...props, resolvedSize, resolvedDisabled, resolvedDirection }\n }, [\n props,\n config.size,\n config.disabled,\n config.direction,\n defaults.size,\n defaults.disabled,\n defaults.direction,\n ])\n}\n","import React from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, SizableProps } from '../../types'\n\n/** Props for loading spinner, overlay, and optional content blur. */\nexport interface SpinProps extends BaseComponentProps, SizableProps {\n /** When `true`, shows the loading state (subject to `delay`). @default true */\n spinning?: boolean\n /** Milliseconds to wait before showing the spinner after `spinning` becomes true. */\n delay?: number\n /** Optional text below the indicator. */\n tip?: string\n /** When `true`, covers the viewport instead of inline or wrapping children. */\n fullscreen?: boolean\n /** Custom spinner node; defaults to a styled status element. */\n indicator?: React.ReactNode\n /** When set, shows an overlay with blur on this content while loading. */\n children?: React.ReactNode\n}\n\n/**\n * Loading indicator with optional delay, tip, fullscreen mode, and child overlay.\n */\nexport function Spin({\n spinning = true,\n size: sizeProp,\n delay,\n tip,\n fullscreen,\n indicator,\n children,\n className,\n style,\n unstyled,\n}: SpinProps) {\n const config = useConfig()\n const resolvedSize = sizeProp ?? config.size ?? 'middle'\n\n const [visible, setVisible] = React.useState(delay ? false : spinning)\n\n React.useEffect(() => {\n if (!delay) {\n setVisible(spinning)\n return\n }\n\n if (spinning) {\n const timer = setTimeout(() => setVisible(true), delay)\n return () => clearTimeout(timer)\n }\n\n setVisible(false)\n }, [spinning, delay])\n\n if (!visible && !children) return null\n if (!visible && children) return <>{children}</>\n\n const spinSizeClass = resolvedSize === 'middle' ? 'default' : resolvedSize\n const spinClasses = unstyled\n ? (className ?? '')\n : ['sg-spin', `sg-spin-${spinSizeClass}`, className].filter(Boolean).join(' ')\n\n const spinElement = indicator ?? (\n <span\n className={spinClasses}\n style={style}\n role=\"status\"\n aria-live=\"polite\"\n aria-label={config.locale?.spin?.loading ?? 'Loading'}\n />\n )\n\n if (fullscreen) {\n return (\n <div className={unstyled ? '' : 'sg-spin-fullscreen'}>\n <div className={unstyled ? '' : 'sg-spin-fullscreen-inner'}>\n {spinElement}\n {tip && <div className={unstyled ? '' : 'sg-spin-tip'}>{tip}</div>}\n </div>\n </div>\n )\n }\n\n if (!children) {\n return (\n <span className={unstyled ? '' : 'sg-spin-standalone'} style={style}>\n {spinElement}\n {tip && <div className={unstyled ? '' : 'sg-spin-tip'}>{tip}</div>}\n </span>\n )\n }\n\n return (\n <div className={unstyled ? '' : 'sg-spin-container'} style={style}>\n <div className={unstyled ? '' : 'sg-spin-overlay'}>\n {spinElement}\n {tip && <div className={unstyled ? '' : 'sg-spin-tip'}>{tip}</div>}\n </div>\n <div className={visible ? (unstyled ? '' : 'sg-spin-blur') : ''}>{children}</div>\n </div>\n )\n}\n","import type React from 'react'\nimport type { TreeKey, TreeNodeData, TreeFieldNames } from '@skygraph/core'\n\n/** Re-exports core tree data types. */\nexport type { TreeKey, TreeNodeData, TreeFieldNames }\n\n/** Payload for `onCheck` describing the toggle and affected nodes. */\nexport interface CheckInfo {\n /** Whether the toggled node ended checked. */\n checked: boolean\n /** Node whose checkbox was toggled. */\n node: TreeNodeData\n /** All fully checked nodes after the update. */\n checkedNodes: TreeNodeData[]\n /** Keys in indeterminate half-checked state. */\n halfCheckedKeys: TreeKey[]\n}\n\n/** Payload for `onSelect` after a selection change. */\nexport interface SelectInfo {\n /** Whether the node ended selected. */\n selected: boolean\n /** Node that was clicked for selection. */\n node: TreeNodeData\n /** All selected nodes after the update. */\n selectedNodes: TreeNodeData[]\n}\n\n/** Payload for `onExpand` after an expand/collapse. */\nexport interface ExpandInfo {\n /** Whether the node ended expanded. */\n expanded: boolean\n /** Node whose expander was toggled. */\n node: TreeNodeData\n}\n\n/** Drag lifecycle event payload with DOM event and node. */\nexport interface DragInfo {\n /** Browser drag event. */\n event: React.DragEvent\n /** Associated tree node. */\n node: TreeNodeData\n}\n\n/** Drop completion payload including dragged node and position. */\nexport interface DropInfo {\n /** Browser drop event. */\n event: React.DragEvent\n /** Drop target node. */\n node: TreeNodeData\n /** Node that was dragged. */\n dragNode: TreeNodeData\n /** Insert position relative to the target. */\n dropPosition: -1 | 0 | 1\n}\n\n/** Payload when an inline edit is committed (if editing is used). */\nexport interface EditInfo {\n /** Edited node key. */\n key: TreeKey\n /** Edited node. */\n node: TreeNodeData\n /** New title text. */\n value: string\n /** Previous title text. */\n oldValue: string\n}\n\n/** Visual status hint for a node row. */\nexport type TreeNodeStatus = 'default' | 'success' | 'warning' | 'error' | 'info'\n\n/** Declarative action button on a tree node row. */\nexport interface TreeNodeAction {\n /** Action identifier. */\n key: string\n /** Button icon. */\n icon?: React.ReactNode\n /** Tooltip or aria label text. */\n title?: string\n /** Click handler receiving node and key. */\n onClick: (node: TreeNodeData, key: TreeKey) => void\n /** Hides the action for nodes where this returns false. */\n visible?: (node: TreeNodeData) => boolean\n /** Disables the action per node. */\n disabled?: (node: TreeNodeData) => boolean\n /** Destructive styling. */\n danger?: boolean\n}\n\n/** Localizable strings for built-in tree UI. */\nexport interface TreeLocale {\n /** Empty tree placeholder. */\n emptyText?: React.ReactNode\n /** Async loading label. */\n loadingText?: string\n /** Search field placeholder. */\n searchPlaceholder?: string\n /** Toolbar control to expand all nodes. */\n expandAllText?: string\n /** Toolbar control to collapse all nodes. */\n collapseAllText?: string\n /** Toolbar control to check all checkboxes. */\n checkAllText?: string\n /** Toolbar control to clear all checks. */\n uncheckAllText?: string\n /** Accessible label for the clear-search (×) button. */\n clearSearch?: string\n}\n\n/** Default English strings for `Tree`. */\nexport const DEFAULT_TREE_LOCALE: Required<TreeLocale> = {\n emptyText: 'No data',\n loadingText: 'Loading...',\n searchPlaceholder: 'Search...',\n expandAllText: 'Expand All',\n collapseAllText: 'Collapse All',\n checkAllText: 'Check All',\n uncheckAllText: 'Uncheck All',\n clearSearch: 'Clear search',\n}\n\n/** Default indent between tree levels in pixels. */\nexport const DEFAULT_INDENT = 24\n/** Default node row height used for virtual scroll estimates. */\nexport const NODE_HEIGHT = 28\n\n/** Props for the `Tree` component. */\nexport interface TreeProps {\n /** Hierarchical data with keys and optional children. */\n treeData: TreeNodeData[]\n /** Renames `title`, `key`, `children`, and other field accessors. */\n fieldNames?: TreeFieldNames\n\n /** Shows checkboxes on nodes. @default false */\n checkable?: boolean\n /** When true, parent and child checks are independent. @default false */\n checkStrictly?: boolean\n /** Controlled checked keys. */\n checkedKeys?: TreeKey[]\n /** Initial checked keys in uncontrolled mode. */\n defaultCheckedKeys?: TreeKey[]\n /** Fires after check state changes. */\n onCheck?: (checkedKeys: TreeKey[], info: CheckInfo) => void\n\n /** Allows clicking titles to select nodes. @default true */\n selectable?: boolean\n /** Allows multiple selected nodes. @default false */\n multiple?: boolean\n /** Controlled selected keys. */\n selectedKeys?: TreeKey[]\n /** Initial selected keys in uncontrolled mode. */\n defaultSelectedKeys?: TreeKey[]\n /** Fires after selection changes. */\n onSelect?: (selectedKeys: TreeKey[], info: SelectInfo) => void\n\n /** Controlled expanded keys. */\n expandedKeys?: TreeKey[]\n /** Initial expanded keys in uncontrolled mode. */\n defaultExpandedKeys?: TreeKey[]\n /** Expands every parent on first render when uncontrolled. @default false */\n defaultExpandAll?: boolean\n /** Expands ancestors of the focused or matched node when filtering. @default false */\n autoExpandParent?: boolean\n /** Fires after expand/collapse. */\n onExpand?: (expandedKeys: TreeKey[], info: ExpandInfo) => void\n\n /** Enables drag handles per node or per node predicate. @default false */\n draggable?: boolean | ((node: TreeNodeData) => boolean)\n /** Validates whether a drop is allowed. */\n allowDrop?: (info: {\n dragNode: TreeNodeData\n dropNode: TreeNodeData\n dropPosition: -1 | 0 | 1\n }) => boolean\n /** Drag start callback. */\n onDragStart?: (info: DragInfo) => void\n /** Drag enter callback. */\n onDragEnter?: (info: DragInfo) => void\n /** Drag over callback. */\n onDragOver?: (info: DragInfo) => void\n /** Drag leave callback. */\n onDragLeave?: (info: DragInfo) => void\n /** Drag end callback. */\n onDragEnd?: (info: DragInfo) => void\n /** Drop callback after a successful internal move. */\n onDrop?: (info: DropInfo) => void\n\n /** Loads children asynchronously; return promise resolves when data is ready. */\n loadData?: (node: TreeNodeData) => Promise<void>\n /** Keys whose children have finished loading. */\n loadedKeys?: TreeKey[]\n\n /** Renders guide lines between levels or configures leaf icons. @default false */\n showLine?: boolean | { showLeafIcon?: boolean | React.ReactNode }\n /** Shows a leading icon column. @default false */\n showIcon?: boolean\n /** Default node icon render or element. */\n icon?: React.ReactNode | ((props: { expanded: boolean; selected: boolean }) => React.ReactNode)\n /** Custom expand/collapse control. */\n switcherIcon?:\n | React.ReactNode\n | ((props: { expanded: boolean; loading: boolean; isLeaf: boolean }) => React.ReactNode)\n /** Makes the whole row clickable for selection. @default false */\n blockNode?: boolean\n /** Fixed viewport height enabling internal virtual scroll. */\n height?: number\n /** Uses windowed rendering when `height` is set and the list is large. @default true */\n virtual?: boolean\n /** Disables all interactions. @default false */\n disabled?: boolean\n /** Horizontal indent per depth level in pixels. @default 24 */\n indentSize?: number\n\n /** Directory-style selection expands folders on click. @default false */\n directory?: boolean\n\n /** Context menu handler on node rows. */\n onRightClick?: (info: { event: React.MouseEvent; node: TreeNodeData }) => void\n\n /** Shows the toolbar search field. @default false */\n showSearch?: boolean\n /** Controlled filter text. */\n searchValue?: string\n /** Initial filter text when uncontrolled. @default '' */\n defaultSearchValue?: string\n /** Emits filter text changes. */\n onSearch?: (value: string) => void\n /** Predicate to include nodes while searching. */\n filterTreeNode?: (node: TreeNodeData, searchValue: string) => boolean\n /** Highlights matched text in titles. @default true */\n highlightSearch?: boolean\n\n /** Enables built-in keyboard navigation helpers. @default true */\n keyboard?: boolean\n\n /** Enables inline editing of titles per node or predicate. @default false */\n editable?: boolean | ((node: TreeNodeData) => boolean)\n /** Commit handler for inline edits. */\n onEdit?: (info: EditInfo) => void\n /** Cancel handler for inline edits. */\n onEditCancel?: (key: TreeKey) => void\n\n /** Custom title area render. */\n titleRender?: (\n node: TreeNodeData,\n info: { expanded: boolean; selected: boolean; checked: boolean; halfChecked: boolean },\n ) => React.ReactNode\n\n /** Inline action buttons on node rows. */\n actions?: TreeNodeAction[]\n\n /** Shows toolbar with expand/collapse/check-all controls. @default false */\n showToolbar?: boolean\n /** Extra toolbar nodes after built-ins. */\n toolbarExtra?: React.ReactNode\n\n /** Enables expand/collapse animations. @default true */\n animated?: boolean\n\n /** Focuses a node on mount when supported. @default false */\n autoFocus?: boolean\n /** Controlled focused node key. */\n focusedKey?: TreeKey\n /** Fires when focus moves to a node. */\n onFocus?: (key: TreeKey) => void\n\n /** Scrolls the given key into view when it changes. */\n scrollToKey?: TreeKey\n\n /** Maps a node to a status color variant. */\n nodeStatus?: (node: TreeNodeData) => TreeNodeStatus\n\n /** Overrides default locale strings. */\n locale?: TreeLocale\n\n /** Root wrapper class name. */\n className?: string\n /** Root wrapper style. */\n style?: React.CSSProperties\n /** Renders semantic tree without Skygraph styles. */\n unstyled?: boolean\n}\n","import React, { useState, useEffect, useRef, useCallback, useMemo } from 'react'\nimport { Tree } from '../Tree'\nimport { useConfig } from '../../ConfigProvider'\nimport type { TreeSelectProps, TreeKey, TreeNodeData } from './types'\n\nfunction toArray(val: TreeKey | TreeKey[] | undefined): TreeKey[] {\n if (val === undefined) return []\n return Array.isArray(val) ? val : [val]\n}\n\nfunction collectAllKeys(nodes: TreeNodeData[]): TreeKey[] {\n const keys: TreeKey[] = []\n const walk = (list: TreeNodeData[]) => {\n for (const n of list) {\n keys.push(n.key)\n if (n.children) walk(n.children)\n }\n }\n walk(nodes)\n return keys\n}\n\nfunction findNode(nodes: TreeNodeData[], key: TreeKey): TreeNodeData | undefined {\n for (const n of nodes) {\n if (n.key === key) return n\n if (n.children) {\n const found = findNode(n.children, key)\n if (found) return found\n }\n }\n return undefined\n}\n\nfunction getNodeLabel(node: TreeNodeData | undefined): React.ReactNode {\n if (!node) return ''\n return node.title ?? String(node.key)\n}\n\nfunction filterTreeKeepMatches(\n nodes: TreeNodeData[],\n predicate: (node: TreeNodeData) => boolean,\n): TreeNodeData[] {\n const result: TreeNodeData[] = []\n for (const node of nodes) {\n const childResult = node.children ? filterTreeKeepMatches(node.children, predicate) : []\n if (predicate(node) || childResult.length > 0) {\n result.push({\n ...node,\n children: childResult.length > 0 ? childResult : undefined,\n })\n }\n }\n return result\n}\n\nfunction getParentKeys(nodes: TreeNodeData[], targetKey: TreeKey): TreeKey[] {\n const parents: TreeKey[] = []\n const walk = (list: TreeNodeData[], path: TreeKey[]): boolean => {\n for (const n of list) {\n if (n.key === targetKey) {\n parents.push(...path)\n return true\n }\n if (n.children && walk(n.children, [...path, n.key])) return true\n }\n return false\n }\n walk(nodes, [])\n return parents\n}\n\nfunction applyStrategy(\n checkedKeys: TreeKey[],\n treeData: TreeNodeData[],\n strategy: 'SHOW_ALL' | 'SHOW_PARENT' | 'SHOW_CHILD',\n): TreeKey[] {\n if (strategy === 'SHOW_ALL') return checkedKeys\n\n const checkedSet = new Set(checkedKeys)\n\n if (strategy === 'SHOW_CHILD') {\n return checkedKeys.filter((key) => {\n const node = findNode(treeData, key)\n return !node?.children || node.children.length === 0\n })\n }\n\n if (strategy === 'SHOW_PARENT') {\n return checkedKeys.filter((key) => {\n const parentKeys = getParentKeys(treeData, key)\n return !parentKeys.some((pk) => checkedSet.has(pk))\n })\n }\n\n return checkedKeys\n}\n\n/**\n * Dropdown that embeds `Tree` for single or multiple selection, optional checkboxes, and search.\n * Manages open state, filtering, and tag display for multi-value modes.\n */\nexport function TreeSelect(props: TreeSelectProps) {\n const {\n treeData,\n value: controlledValue,\n defaultValue,\n onChange,\n fieldNames,\n multiple = false,\n treeCheckable = false,\n treeCheckStrictly = false,\n treeDefaultExpandAll = false,\n treeDefaultExpandedKeys,\n showSearch = false,\n filterTreeNode,\n placeholder = 'Please select',\n allowClear = false,\n disabled = false,\n size = 'middle',\n maxTagCount,\n dropdownStyle,\n treeLine = false,\n showCheckedStrategy = 'SHOW_ALL',\n onSearch,\n className,\n style,\n unstyled,\n } = props\n\n const treeSelectLocale = useConfig().locale?.treeSelect\n const searchPlaceholder = treeSelectLocale?.searchPlaceholder ?? 'Search...'\n const noMatchesText = treeSelectLocale?.noMatches ?? 'No matches'\n\n const isMultiple = multiple || treeCheckable\n\n const [internalValue, setInternalValue] = useState<TreeKey[]>(() =>\n toArray(controlledValue ?? defaultValue),\n )\n const [open, setOpen] = useState(false)\n const [searchValue, setSearchValue] = useState('')\n const wrapperRef = useRef<HTMLDivElement>(null)\n const searchRef = useRef<HTMLInputElement>(null)\n\n const currentValue = useMemo(\n () => toArray(controlledValue ?? internalValue),\n [controlledValue, internalValue],\n )\n\n useEffect(() => {\n if (controlledValue !== undefined) {\n setInternalValue(toArray(controlledValue))\n }\n }, [controlledValue])\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (wrapperRef.current && !wrapperRef.current.contains(e.target as Node)) {\n setOpen(false)\n setSearchValue('')\n }\n }\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [])\n\n useEffect(() => {\n if (open && showSearch && searchRef.current) {\n searchRef.current.focus()\n }\n }, [open, showSearch])\n\n const defaultFilter = useCallback((input: string, node: TreeNodeData): boolean => {\n const title = String(node.title ?? node.key).toLowerCase()\n return title.includes(input.toLowerCase())\n }, [])\n\n const filterFn = filterTreeNode ?? defaultFilter\n\n const filteredTreeData = useMemo(() => {\n if (!searchValue) return treeData\n return filterTreeKeepMatches(treeData, (node) => filterFn(searchValue, node))\n }, [treeData, searchValue, filterFn])\n\n const filteredExpandedKeys = useMemo(() => {\n if (!searchValue) return undefined\n return collectAllKeys(filteredTreeData)\n }, [searchValue, filteredTreeData])\n\n const fireChange = useCallback(\n (keys: TreeKey[], triggerNode: TreeNodeData) => {\n setInternalValue(keys)\n const labels = keys.map((k) => getNodeLabel(findNode(treeData, k)))\n if (onChange) {\n const result = isMultiple ? keys : keys[0]\n onChange(result as TreeKey & TreeKey[], labels, { triggerNode })\n }\n },\n [treeData, onChange, isMultiple],\n )\n\n const handleTreeSelect = useCallback(\n (\n _selectedKeys: TreeKey[],\n info: { selected: boolean; node: TreeNodeData; selectedNodes: TreeNodeData[] },\n ) => {\n if (treeCheckable) return\n const node = info.node\n if (isMultiple) {\n const newKeys = info.selected\n ? [...currentValue, node.key]\n : currentValue.filter((k) => k !== node.key)\n fireChange(newKeys, node)\n } else {\n fireChange([node.key], node)\n setOpen(false)\n setSearchValue('')\n }\n },\n [treeCheckable, isMultiple, currentValue, fireChange],\n )\n\n const handleTreeCheck = useCallback(\n (\n checkedKeys: TreeKey[],\n info: {\n checked: boolean\n node: TreeNodeData\n checkedNodes: TreeNodeData[]\n halfCheckedKeys: TreeKey[]\n },\n ) => {\n const displayed = applyStrategy(checkedKeys, treeData, showCheckedStrategy)\n fireChange(displayed, info.node)\n },\n [treeData, showCheckedStrategy, fireChange],\n )\n\n const handleRemoveTag = useCallback(\n (key: TreeKey, e: React.MouseEvent) => {\n e.stopPropagation()\n if (disabled) return\n const node = findNode(treeData, key) ?? ({ key } as TreeNodeData)\n const newKeys = currentValue.filter((k) => k !== key)\n fireChange(newKeys, node)\n },\n [disabled, treeData, currentValue, fireChange],\n )\n\n const handleClear = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n if (disabled) return\n const node = treeData[0] ?? ({ key: '' } as TreeNodeData)\n fireChange([], node)\n setSearchValue('')\n },\n [disabled, treeData, fireChange],\n )\n\n const handleSearchChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value\n setSearchValue(val)\n onSearch?.(val)\n },\n [onSearch],\n )\n\n const handleTriggerClick = useCallback(() => {\n if (disabled) return\n setOpen((prev) => !prev)\n }, [disabled])\n\n const displayedValues = useMemo(() => {\n if (!isMultiple) return currentValue\n return applyStrategy(currentValue, treeData, showCheckedStrategy)\n }, [isMultiple, currentValue, treeData, showCheckedStrategy])\n\n const treeCheckedKeys = useMemo(() => {\n if (!treeCheckable) return undefined\n return currentValue\n }, [treeCheckable, currentValue])\n\n const treeSelectedKeys = useMemo(() => {\n if (treeCheckable) return undefined\n return currentValue\n }, [treeCheckable, currentValue])\n\n // Unstyled render\n if (unstyled) {\n return (\n <div ref={wrapperRef} className={className} style={style}>\n <div onClick={handleTriggerClick}>\n {displayedValues.length === 0 && <span>{placeholder}</span>}\n {!isMultiple && displayedValues.length > 0 && (\n <span>{getNodeLabel(findNode(treeData, displayedValues[0]))}</span>\n )}\n {isMultiple &&\n displayedValues.map((key) => (\n <span key={String(key)}>\n {getNodeLabel(findNode(treeData, key))}\n <span onClick={(e) => handleRemoveTag(key, e)}>&times;</span>\n </span>\n ))}\n </div>\n {open && (\n <div>\n {showSearch && (\n <input\n ref={searchRef}\n value={searchValue}\n onChange={handleSearchChange}\n placeholder={searchPlaceholder}\n />\n )}\n <Tree\n treeData={filteredTreeData}\n fieldNames={fieldNames}\n checkable={treeCheckable}\n checkStrictly={treeCheckStrictly}\n checkedKeys={treeCheckedKeys}\n selectedKeys={treeSelectedKeys}\n multiple={isMultiple}\n defaultExpandAll={treeDefaultExpandAll}\n defaultExpandedKeys={treeDefaultExpandedKeys}\n expandedKeys={filteredExpandedKeys}\n showLine={treeLine}\n onSelect={handleTreeSelect}\n onCheck={handleTreeCheck}\n unstyled\n />\n </div>\n )}\n </div>\n )\n }\n\n // Styled render\n const wrapperCls = [\n 'sg-treeselect',\n `sg-treeselect-${size}`,\n open ? 'sg-treeselect-open' : '',\n disabled ? 'sg-treeselect-disabled' : '',\n isMultiple ? 'sg-treeselect-multiple' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const visibleTags =\n maxTagCount !== undefined && isMultiple\n ? displayedValues.slice(0, maxTagCount)\n : displayedValues\n\n const hiddenCount =\n maxTagCount !== undefined && isMultiple ? Math.max(0, displayedValues.length - maxTagCount) : 0\n\n return (\n <div className={wrapperCls} style={style} ref={wrapperRef}>\n <div className=\"sg-treeselect-selector\" onClick={handleTriggerClick}>\n <div className=\"sg-treeselect-selection-wrap\">\n {displayedValues.length === 0 && !searchValue && (\n <span className=\"sg-treeselect-placeholder\">{placeholder}</span>\n )}\n\n {!isMultiple && displayedValues.length > 0 && !searchValue && (\n <span className=\"sg-treeselect-selection-item\">\n {getNodeLabel(findNode(treeData, displayedValues[0]))}\n </span>\n )}\n\n {isMultiple &&\n visibleTags.map((key) => (\n <span key={String(key)} className=\"sg-treeselect-tag\">\n <span className=\"sg-treeselect-tag-label\">\n {getNodeLabel(findNode(treeData, key))}\n </span>\n <span className=\"sg-treeselect-tag-close\" onClick={(e) => handleRemoveTag(key, e)}>\n &times;\n </span>\n </span>\n ))}\n\n {hiddenCount > 0 && (\n <span className=\"sg-treeselect-tag sg-treeselect-tag-rest\">+{hiddenCount}...</span>\n )}\n\n {showSearch && open && (\n <input\n ref={searchRef}\n className=\"sg-treeselect-search-input\"\n value={searchValue}\n onChange={handleSearchChange}\n placeholder={displayedValues.length === 0 ? '' : ''}\n />\n )}\n </div>\n\n <div className=\"sg-treeselect-actions\">\n {allowClear && displayedValues.length > 0 && (\n <span className=\"sg-treeselect-clear\" onClick={handleClear}>\n &times;\n </span>\n )}\n <span className=\"sg-treeselect-arrow\">{open ? '\\u25B2' : '\\u25BC'}</span>\n </div>\n </div>\n\n {open && (\n <div className=\"sg-treeselect-dropdown\" style={dropdownStyle}>\n {filteredTreeData.length === 0 ? (\n <div className=\"sg-treeselect-empty\">{noMatchesText}</div>\n ) : (\n <Tree\n treeData={filteredTreeData}\n fieldNames={fieldNames}\n checkable={treeCheckable}\n checkStrictly={treeCheckStrictly}\n checkedKeys={treeCheckedKeys}\n selectedKeys={treeSelectedKeys}\n multiple={isMultiple}\n defaultExpandAll={treeDefaultExpandAll}\n defaultExpandedKeys={treeDefaultExpandedKeys}\n expandedKeys={filteredExpandedKeys}\n showLine={treeLine}\n onSelect={handleTreeSelect}\n onCheck={handleTreeCheck}\n />\n )}\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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","names":["import_react","import_react","import_react","import_react","import_react","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/tree.ts","../src/components/complex/Tree/Tree.tsx","../src/hooks/useTree.ts","../src/components/ConfigProvider.tsx","../src/components/complex/Tree/TreeNodeRow.tsx","../src/components/ui/Checkbox.tsx","../src/components/ui/Spin.tsx","../src/components/complex/Tree/types.ts","../src/components/complex/TreeSelect/TreeSelect.tsx"],"sourcesContent":["export { Tree } from './components/complex/Tree'\r\nexport type {\r\n TreeProps,\r\n TreeLocale,\r\n TreeNodeStatus,\r\n TreeNodeAction,\r\n CheckInfo,\r\n SelectInfo,\r\n ExpandInfo,\r\n DragInfo,\r\n DropInfo,\r\n EditInfo,\r\n} from './components/complex/Tree'\r\nexport { useTree } from './hooks/useTree'\r\nexport type { UseTreeOptions, UseTreeReturn } from './hooks/useTree'\r\nexport { TreeSelect } from './components/complex/TreeSelect'\r\nexport type { TreeSelectProps } from './components/complex/TreeSelect'\r\n","import React, { useState, useEffect, useMemo, useCallback, useRef } from 'react'\r\nimport { useTree } from '../../../hooks/useTree'\r\nimport { useConfig } from '../../ConfigProvider'\r\nimport { TreeNodeRow } from './TreeNodeRow'\r\nimport type { TreeProps, TreeKey, TreeNodeData } from './types'\r\nimport { DEFAULT_TREE_LOCALE, DEFAULT_INDENT, NODE_HEIGHT } from './types'\r\n\r\n/**\r\n * Hierarchical list with expand/collapse, checkboxes, selection, search, keyboard focus, and optional drag-and-drop.\r\n * State is managed by `useTree`; rows are rendered through `TreeNodeRow`.\r\n */\r\nexport function Tree(props: TreeProps) {\r\n const {\r\n treeData,\r\n fieldNames,\r\n checkable = false,\r\n checkStrictly = false,\r\n checkedKeys: controlledCheckedKeys,\r\n defaultCheckedKeys,\r\n onCheck,\r\n selectable = true,\r\n multiple = false,\r\n selectedKeys: controlledSelectedKeys,\r\n defaultSelectedKeys,\r\n onSelect,\r\n expandedKeys: controlledExpandedKeys,\r\n defaultExpandedKeys,\r\n defaultExpandAll = false,\r\n autoExpandParent = false,\r\n onExpand,\r\n draggable = false,\r\n allowDrop,\r\n onDragStart,\r\n onDragOver,\r\n onDragLeave,\r\n onDragEnd,\r\n onDrop,\r\n loadData,\r\n showLine = false,\r\n showIcon = false,\r\n icon: globalIcon,\r\n switcherIcon,\r\n blockNode = false,\r\n height,\r\n virtual = true,\r\n disabled = false,\r\n indentSize = DEFAULT_INDENT,\r\n directory = false,\r\n onRightClick,\r\n // Search\r\n showSearch = false,\r\n searchValue: controlledSearchValue,\r\n defaultSearchValue = '',\r\n onSearch,\r\n filterTreeNode,\r\n highlightSearch = true,\r\n // Keyboard\r\n keyboard = true,\r\n // Editable\r\n editable = false,\r\n onEdit,\r\n onEditCancel,\r\n // Custom render\r\n titleRender,\r\n // Actions\r\n actions,\r\n // Toolbar\r\n showToolbar = false,\r\n toolbarExtra,\r\n // Animation\r\n animated = true,\r\n // Focus\r\n autoFocus = false,\r\n focusedKey: controlledFocusedKey,\r\n onFocus: onFocusCallback,\r\n // Scroll\r\n scrollToKey,\r\n // Status\r\n nodeStatus,\r\n locale,\r\n className,\r\n style,\r\n unstyled,\r\n } = props\r\n\r\n const config = useConfig()\r\n const t = useMemo(\r\n () => ({ ...DEFAULT_TREE_LOCALE, ...config.locale?.tree, ...locale }),\r\n [config.locale?.tree, locale],\r\n )\r\n\r\n const showLineConfig = typeof showLine === 'object' ? showLine : { showLeafIcon: false }\r\n const isShowLine = !!showLine\r\n\r\n const {\r\n tree,\r\n treeState,\r\n flatNodes,\r\n toggleExpand,\r\n setExpandedKeys,\r\n expandAll,\r\n collapseAll,\r\n toggleCheck,\r\n setCheckedKeys,\r\n select,\r\n setSelectedKeys,\r\n markLoading,\r\n markLoaded,\r\n moveNode,\r\n filterNodes,\r\n refresh,\r\n } = useTree({\r\n data: treeData,\r\n fieldNames,\r\n checkStrictly,\r\n defaultExpandAll,\r\n defaultExpandedKeys,\r\n defaultCheckedKeys,\r\n defaultSelectedKeys,\r\n })\r\n\r\n // ═══════════════════════════════════════════\r\n // SEARCH STATE\r\n // ═══════════════════════════════════════════\r\n const [internalSearchValue, setInternalSearchValue] = useState(defaultSearchValue)\r\n const searchValue = controlledSearchValue ?? internalSearchValue\r\n\r\n const handleSearchChange = useCallback(\r\n (value: string) => {\r\n if (controlledSearchValue === undefined) {\r\n setInternalSearchValue(value)\r\n }\r\n onSearch?.(value)\r\n\r\n if (!value) {\r\n filterNodes(null)\r\n return\r\n }\r\n\r\n const predicate = filterTreeNode\r\n ? (node: TreeNodeData) => filterTreeNode(node, value)\r\n : (node: TreeNodeData) => {\r\n const title = String(node.title ?? '')\r\n return title.toLowerCase().includes(value.toLowerCase())\r\n }\r\n\r\n filterNodes(predicate)\r\n\r\n if (autoExpandParent) {\r\n const filtered = tree.getFilteredKeys()\r\n if (filtered) {\r\n setExpandedKeys(filtered)\r\n }\r\n }\r\n },\r\n [\r\n controlledSearchValue,\r\n onSearch,\r\n filterTreeNode,\r\n filterNodes,\r\n autoExpandParent,\r\n tree,\r\n setExpandedKeys,\r\n ],\r\n )\r\n\r\n useEffect(() => {\r\n if (controlledSearchValue !== undefined && controlledSearchValue !== internalSearchValue) {\r\n handleSearchChange(controlledSearchValue)\r\n }\r\n }, [controlledSearchValue]) // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n // ═══════════════════════════════════════════\r\n // SYNC DATA CHANGES\r\n // ═══════════════════════════════════════════\r\n const prevDataRef = useRef(treeData)\r\n useEffect(() => {\r\n if (prevDataRef.current !== treeData) {\r\n prevDataRef.current = treeData\r\n tree.setData(treeData)\r\n refresh()\r\n }\r\n }, [treeData, tree, refresh])\r\n\r\n // Controlled keys\r\n useEffect(() => {\r\n if (controlledExpandedKeys !== undefined) setExpandedKeys(controlledExpandedKeys)\r\n }, [controlledExpandedKeys, setExpandedKeys])\r\n\r\n useEffect(() => {\r\n if (controlledCheckedKeys !== undefined) setCheckedKeys(controlledCheckedKeys)\r\n }, [controlledCheckedKeys, setCheckedKeys])\r\n\r\n useEffect(() => {\r\n if (controlledSelectedKeys !== undefined) setSelectedKeys(controlledSelectedKeys)\r\n }, [controlledSelectedKeys, setSelectedKeys])\r\n\r\n // ═══════════════════════════════════════════\r\n // FOCUS STATE\r\n // ═══════════════════════════════════════════\r\n const [internalFocusedKey, setInternalFocusedKey] = useState<TreeKey | null>(null)\r\n const focusedKey = controlledFocusedKey ?? internalFocusedKey\r\n const treeRef = useRef<HTMLDivElement>(null)\r\n\r\n const setFocusedKey = useCallback(\r\n (key: TreeKey | null) => {\r\n setInternalFocusedKey(key)\r\n if (key !== null) onFocusCallback?.(key)\r\n },\r\n [onFocusCallback],\r\n )\r\n\r\n useEffect(() => {\r\n if (autoFocus && flatNodes.length > 0 && focusedKey === null) {\r\n setFocusedKey(flatNodes[0].key)\r\n }\r\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n // ═══════════════════════════════════════════\r\n // EDITING STATE\r\n // ═══════════════════════════════════════════\r\n const [editingKey, setEditingKey] = useState<TreeKey | null>(null)\r\n\r\n const isNodeEditable = useCallback(\r\n (node: TreeNodeData): boolean => {\r\n if (typeof editable === 'function') return editable(node)\r\n return !!editable\r\n },\r\n [editable],\r\n )\r\n\r\n const handleEditStart = useCallback((key: TreeKey) => {\r\n setEditingKey(key)\r\n }, [])\r\n\r\n const handleEditConfirm = useCallback(\r\n (key: TreeKey, value: string) => {\r\n const node = tree.getNode(key)\r\n if (node && onEdit) {\r\n onEdit({ key, node, value, oldValue: String(node.title ?? '') })\r\n }\r\n setEditingKey(null)\r\n },\r\n [tree, onEdit],\r\n )\r\n\r\n const handleEditCancelInternal = useCallback(\r\n (key: TreeKey) => {\r\n setEditingKey(null)\r\n onEditCancel?.(key)\r\n },\r\n [onEditCancel],\r\n )\r\n\r\n // ═══════════════════════════════════════════\r\n // DRAG STATE\r\n // ═══════════════════════════════════════════\r\n const [dragKey, setDragKey] = useState<TreeKey | null>(null)\r\n const [dropKey, setDropKey] = useState<TreeKey | null>(null)\r\n const [dropPosition, setDropPosition] = useState<-1 | 0 | 1>(0)\r\n\r\n // ═══════════════════════════════════════════\r\n // EVENT HANDLERS\r\n // ═══════════════════════════════════════════\r\n const handleExpand = useCallback(\r\n (key: TreeKey) => {\r\n toggleExpand(key)\r\n const node = tree.getNode(key)\r\n if (node && onExpand) {\r\n const newState = tree.getState()\r\n const expanded = newState.expandedKeys.includes(key)\r\n onExpand(newState.expandedKeys, { expanded, node })\r\n }\r\n },\r\n [toggleExpand, tree, onExpand],\r\n )\r\n\r\n const handleCheck = useCallback(\r\n (key: TreeKey) => {\r\n toggleCheck(key)\r\n if (onCheck) {\r\n const newState = tree.getState()\r\n const node = tree.getNode(key)!\r\n const checkedNodes = newState.checkedKeys\r\n .map((ck: TreeKey) => tree.getNode(ck))\r\n .filter(Boolean) as TreeNodeData[]\r\n onCheck(newState.checkedKeys, {\r\n checked: newState.checkedKeys.includes(key),\r\n node,\r\n checkedNodes,\r\n halfCheckedKeys: newState.halfCheckedKeys,\r\n })\r\n }\r\n },\r\n [toggleCheck, tree, onCheck],\r\n )\r\n\r\n const handleSelect = useCallback(\r\n (key: TreeKey) => {\r\n select(key, multiple)\r\n if (onSelect) {\r\n const newState = tree.getState()\r\n const node = tree.getNode(key)!\r\n const selectedNodes = newState.selectedKeys\r\n .map((sk: TreeKey) => tree.getNode(sk))\r\n .filter(Boolean) as TreeNodeData[]\r\n onSelect(newState.selectedKeys, {\r\n selected: newState.selectedKeys.includes(key),\r\n node,\r\n selectedNodes,\r\n })\r\n }\r\n },\r\n [select, multiple, tree, onSelect],\r\n )\r\n\r\n const handleLoadData = useCallback(\r\n (node: TreeNodeData) => {\r\n if (!loadData) return\r\n const key = node.key\r\n if (treeState.loadedKeys.includes(key) || treeState.loadingKeys.includes(key)) return\r\n markLoading(key)\r\n loadData(node).then(() => {\r\n markLoaded(key)\r\n })\r\n },\r\n [loadData, treeState.loadedKeys, treeState.loadingKeys, markLoading, markLoaded],\r\n )\r\n\r\n // Drag handlers\r\n const handleDragStart = useCallback(\r\n (e: React.DragEvent, key: TreeKey) => {\r\n setDragKey(key)\r\n e.dataTransfer.effectAllowed = 'move'\r\n const node = tree.getNode(key)\r\n if (node) onDragStart?.({ event: e, node })\r\n },\r\n [tree, onDragStart],\r\n )\r\n\r\n const handleDragOver = useCallback(\r\n (e: React.DragEvent, key: TreeKey) => {\r\n e.preventDefault()\r\n setDropKey(key)\r\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\r\n const y = e.clientY - rect.top\r\n const h = rect.height\r\n let pos: -1 | 0 | 1 = 0\r\n if (y < h * 0.25) pos = -1\r\n else if (y > h * 0.75) pos = 1\r\n setDropPosition(pos)\r\n const node = tree.getNode(key)\r\n if (node) onDragOver?.({ event: e, node })\r\n },\r\n [tree, onDragOver],\r\n )\r\n\r\n const handleDragLeave = useCallback(\r\n (e: React.DragEvent, key: TreeKey) => {\r\n setDropKey(null)\r\n const node = tree.getNode(key)\r\n if (node) onDragLeave?.({ event: e, node })\r\n },\r\n [tree, onDragLeave],\r\n )\r\n\r\n const handleDragEnd = useCallback(\r\n (e: React.DragEvent, key: TreeKey) => {\r\n setDragKey(null)\r\n setDropKey(null)\r\n const node = tree.getNode(key)\r\n if (node) onDragEnd?.({ event: e, node })\r\n },\r\n [tree, onDragEnd],\r\n )\r\n\r\n const handleDrop = useCallback(\r\n (e: React.DragEvent, key: TreeKey) => {\r\n e.preventDefault()\r\n if (dragKey === null || dragKey === key) {\r\n setDragKey(null)\r\n setDropKey(null)\r\n return\r\n }\r\n\r\n const dragNode = tree.getNode(dragKey)\r\n const dropNode = tree.getNode(key)\r\n if (!dragNode || !dropNode) return\r\n\r\n if (allowDrop && !allowDrop({ dragNode, dropNode, dropPosition })) {\r\n setDragKey(null)\r\n setDropKey(null)\r\n return\r\n }\r\n\r\n moveNode(dragKey, key, dropPosition)\r\n\r\n if (onDrop) {\r\n onDrop({ event: e, node: dropNode, dragNode, dropPosition })\r\n }\r\n\r\n setDragKey(null)\r\n setDropKey(null)\r\n },\r\n [dragKey, dropPosition, tree, allowDrop, moveNode, onDrop],\r\n )\r\n\r\n const handleRightClick = useCallback(\r\n (e: React.MouseEvent, node: TreeNodeData) => {\r\n onRightClick?.({ event: e, node })\r\n },\r\n [onRightClick],\r\n )\r\n\r\n const isDraggable = (node: TreeNodeData): boolean => {\r\n if (typeof draggable === 'function') return draggable(node)\r\n return !!draggable\r\n }\r\n\r\n // ═══════════════════════════════════════════\r\n // VIRTUAL SCROLL (refs declared early — used by keyboard handlers below)\r\n // ═══════════════════════════════════════════\r\n const containerRef = useRef<HTMLDivElement>(null)\r\n const [scrollTop, setScrollTop] = useState(0)\r\n const itemHeight = NODE_HEIGHT\r\n\r\n // Scrolls the virtual viewport so the row for `key` is visible. Declared\r\n // before `handleKeyDown` so it can be listed in the callback's deps array\r\n // (otherwise eslint-react-hooks/exhaustive-deps complains).\r\n const scrollToFocused = useCallback(\r\n (key: TreeKey) => {\r\n const index = flatNodes.findIndex((item) => item.key === key)\r\n if (index === -1) return\r\n const el = containerRef.current ?? treeRef.current\r\n if (!el) return\r\n const targetTop = index * itemHeight\r\n const { scrollTop: st, clientHeight: ch } = el\r\n if (targetTop < st) {\r\n el.scrollTop = targetTop\r\n } else if (targetTop + itemHeight > st + ch) {\r\n el.scrollTop = targetTop + itemHeight - ch\r\n }\r\n },\r\n [flatNodes, itemHeight],\r\n )\r\n\r\n // ═══════════════════════════════════════════\r\n // KEYBOARD NAVIGATION\r\n // ═══════════════════════════════════════════\r\n const handleKeyDown = useCallback(\r\n (e: React.KeyboardEvent) => {\r\n if (!keyboard || disabled || editingKey !== null) return\r\n\r\n const currentIndex = flatNodes.findIndex((item) => item.key === focusedKey)\r\n if (currentIndex === -1 && flatNodes.length === 0) return\r\n\r\n const focusNode = (index: number) => {\r\n if (index >= 0 && index < flatNodes.length) {\r\n setFocusedKey(flatNodes[index].key)\r\n scrollToFocused(flatNodes[index].key)\r\n }\r\n }\r\n\r\n switch (e.key) {\r\n case 'ArrowDown': {\r\n e.preventDefault()\r\n focusNode(currentIndex === -1 ? 0 : Math.min(currentIndex + 1, flatNodes.length - 1))\r\n break\r\n }\r\n case 'ArrowUp': {\r\n e.preventDefault()\r\n focusNode(currentIndex === -1 ? 0 : Math.max(currentIndex - 1, 0))\r\n break\r\n }\r\n case 'ArrowRight': {\r\n e.preventDefault()\r\n if (currentIndex === -1) break\r\n const item = flatNodes[currentIndex]\r\n if (!item.isLeaf && !treeState.expandedKeys.includes(item.key)) {\r\n handleExpand(item.key)\r\n } else if (!item.isLeaf && treeState.expandedKeys.includes(item.key)) {\r\n focusNode(currentIndex + 1)\r\n }\r\n break\r\n }\r\n case 'ArrowLeft': {\r\n e.preventDefault()\r\n if (currentIndex === -1) break\r\n const item = flatNodes[currentIndex]\r\n if (!item.isLeaf && treeState.expandedKeys.includes(item.key)) {\r\n handleExpand(item.key)\r\n } else if (item.parentKey !== null) {\r\n const parentIndex = flatNodes.findIndex((n) => n.key === item.parentKey)\r\n if (parentIndex !== -1) focusNode(parentIndex)\r\n }\r\n break\r\n }\r\n case 'Home': {\r\n e.preventDefault()\r\n focusNode(0)\r\n break\r\n }\r\n case 'End': {\r\n e.preventDefault()\r\n focusNode(flatNodes.length - 1)\r\n break\r\n }\r\n case 'Enter': {\r\n e.preventDefault()\r\n if (currentIndex === -1) break\r\n const item = flatNodes[currentIndex]\r\n if (selectable) handleSelect(item.key)\r\n break\r\n }\r\n case ' ': {\r\n e.preventDefault()\r\n if (currentIndex === -1) break\r\n const item = flatNodes[currentIndex]\r\n if (checkable) handleCheck(item.key)\r\n else if (!item.isLeaf) handleExpand(item.key)\r\n break\r\n }\r\n case '*': {\r\n e.preventDefault()\r\n expandAll()\r\n break\r\n }\r\n case 'F2': {\r\n e.preventDefault()\r\n if (currentIndex === -1) break\r\n const item = flatNodes[currentIndex]\r\n if (isNodeEditable(item.node)) {\r\n handleEditStart(item.key)\r\n }\r\n break\r\n }\r\n }\r\n },\r\n [\r\n keyboard,\r\n disabled,\r\n editingKey,\r\n flatNodes,\r\n focusedKey,\r\n treeState.expandedKeys,\r\n handleExpand,\r\n handleCheck,\r\n handleSelect,\r\n expandAll,\r\n setFocusedKey,\r\n checkable,\r\n selectable,\r\n scrollToFocused,\r\n isNodeEditable,\r\n handleEditStart,\r\n ],\r\n )\r\n\r\n // ═══════════════════════════════════════════\r\n // VIRTUAL SCROLL (handlers + memoized slices)\r\n // ═══════════════════════════════════════════\r\n const handleScroll = useCallback(() => {\r\n if (containerRef.current) {\r\n setScrollTop(containerRef.current.scrollTop)\r\n }\r\n }, [])\r\n\r\n const useVirtual = virtual && height !== undefined && flatNodes.length > 50\r\n\r\n // Larger overscan keeps rows mounted during fast scroll. `+ overscan*2` so\r\n // the visible window has padding both above and below the viewport.\r\n const VIRTUAL_OVERSCAN = 5\r\n\r\n const visibleSlice = useMemo(() => {\r\n if (!useVirtual || !height) {\r\n return { nodes: flatNodes, startIndex: 0 }\r\n }\r\n const rawStart = Math.floor(scrollTop / itemHeight)\r\n const startIndex = Math.max(0, rawStart - VIRTUAL_OVERSCAN)\r\n const visibleCount = Math.ceil(height / itemHeight) + VIRTUAL_OVERSCAN * 2\r\n const endIndex = Math.min(flatNodes.length, startIndex + visibleCount)\r\n return { nodes: flatNodes.slice(startIndex, endIndex), startIndex }\r\n }, [flatNodes, useVirtual, height, scrollTop, itemHeight])\r\n\r\n const visibleNodes = visibleSlice.nodes\r\n const virtualOffset = visibleSlice.startIndex * itemHeight\r\n\r\n const totalHeight = flatNodes.length * itemHeight\r\n const virtualBottomPad = Math.max(\r\n 0,\r\n totalHeight - virtualOffset - visibleNodes.length * itemHeight,\r\n )\r\n\r\n // scrollToKey prop\r\n useEffect(() => {\r\n if (scrollToKey !== undefined) {\r\n const index = flatNodes.findIndex((item) => item.key === scrollToKey)\r\n if (index !== -1) {\r\n scrollToFocused(scrollToKey)\r\n setFocusedKey(scrollToKey)\r\n }\r\n }\r\n }, [scrollToKey]) // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n // ═══════════════════════════════════════════\r\n // TOOLBAR HANDLERS\r\n // ═══════════════════════════════════════════\r\n const handleExpandAll = useCallback(() => {\r\n expandAll()\r\n if (onExpand) onExpand(tree.getState().expandedKeys, { expanded: true, node: treeData[0] })\r\n }, [expandAll, onExpand, tree, treeData])\r\n\r\n const handleCollapseAll = useCallback(() => {\r\n collapseAll()\r\n if (onExpand) onExpand([], { expanded: false, node: treeData[0] })\r\n }, [collapseAll, onExpand, treeData])\r\n\r\n const handleCheckAll = useCallback(() => {\r\n const allKeys = tree.getAllKeys()\r\n setCheckedKeys(allKeys)\r\n if (onCheck) {\r\n const allNodes = allKeys\r\n .map((k: TreeKey) => tree.getNode(k))\r\n .filter(Boolean) as TreeNodeData[]\r\n onCheck(allKeys, {\r\n checked: true,\r\n node: allNodes[0],\r\n checkedNodes: allNodes,\r\n halfCheckedKeys: [],\r\n })\r\n }\r\n }, [tree, setCheckedKeys, onCheck])\r\n\r\n const handleUncheckAll = useCallback(() => {\r\n setCheckedKeys([])\r\n if (onCheck) {\r\n onCheck([], { checked: false, node: treeData[0], checkedNodes: [], halfCheckedKeys: [] })\r\n }\r\n }, [setCheckedKeys, onCheck, treeData])\r\n\r\n // ═══════════════════════════════════════════\r\n // RENDER HELPERS\r\n // ═══════════════════════════════════════════\r\n const siblingsMap = useMemo(() => {\r\n if (!isShowLine) return null\r\n const map = new Map<TreeKey, { isLast: boolean; parentIsLast: boolean[] }>()\r\n function walk(list: TreeNodeData[], depth: number, parentIsLast: boolean[]) {\r\n for (let i = 0; i < list.length; i++) {\r\n const node = list[i]\r\n const key = node.key\r\n const isLast = i === list.length - 1\r\n map.set(key, { isLast, parentIsLast: [...parentIsLast] })\r\n const children = node.children\r\n if (children && children.length > 0) {\r\n walk(children, depth + 1, [...parentIsLast, isLast])\r\n }\r\n }\r\n }\r\n walk(treeData, 0, [])\r\n return map\r\n }, [treeData, isShowLine])\r\n\r\n const renderNode = (item: {\r\n node: TreeNodeData\r\n key: TreeKey\r\n depth: number\r\n isLeaf: boolean\r\n parentKey?: TreeKey | null\r\n }) => {\r\n const lineInfo = siblingsMap?.get(item.key)\r\n return (\r\n <TreeNodeRow\r\n key={item.key}\r\n node={item.node}\r\n nodeKey={item.key}\r\n depth={item.depth}\r\n isLeaf={item.isLeaf}\r\n indentSize={indentSize}\r\n expanded={treeState.expandedKeys.includes(item.key)}\r\n checked={treeState.checkedKeys.includes(item.key)}\r\n halfChecked={treeState.halfCheckedKeys.includes(item.key)}\r\n selected={treeState.selectedKeys.includes(item.key)}\r\n loading={treeState.loadingKeys.includes(item.key)}\r\n disabled={disabled || !!item.node.disabled}\r\n focused={focusedKey === item.key}\r\n checkable={checkable}\r\n selectable={selectable}\r\n showLine={isShowLine}\r\n showLeafIcon={showLineConfig.showLeafIcon ?? false}\r\n showIcon={showIcon || directory}\r\n blockNode={blockNode}\r\n directory={directory}\r\n animated={animated}\r\n globalIcon={globalIcon}\r\n nodeIcon={\r\n item.node.icon as\r\n | React.ReactNode\r\n | ((props: { expanded: boolean; selected: boolean }) => React.ReactNode)\r\n | undefined\r\n }\r\n switcherIcon={switcherIcon}\r\n draggable={isDraggable(item.node)}\r\n dropPosition={dropKey === item.key ? dropPosition : null}\r\n dragKey={dragKey}\r\n t={t}\r\n onExpand={handleExpand}\r\n onCheck={handleCheck}\r\n onSelect={handleSelect}\r\n onDragStart={handleDragStart}\r\n onDragOver={handleDragOver}\r\n onDragLeave={handleDragLeave}\r\n onDragEnd={handleDragEnd}\r\n onDrop={handleDrop}\r\n onRightClick={onRightClick ? handleRightClick : undefined}\r\n onLoadData={loadData ? handleLoadData : undefined}\r\n nodeClassName={item.node.className as string | undefined}\r\n nodeStyle={item.node.style as React.CSSProperties | undefined}\r\n // New features\r\n titleRender={titleRender}\r\n searchValue={highlightSearch ? searchValue : ''}\r\n editable={isNodeEditable(item.node)}\r\n editing={editingKey === item.key}\r\n onEditStart={handleEditStart}\r\n onEditConfirm={handleEditConfirm}\r\n onEditCancel={handleEditCancelInternal}\r\n actions={actions}\r\n status={nodeStatus?.(item.node) ?? 'default'}\r\n lineIsLast={lineInfo?.isLast ?? false}\r\n lineParentIsLast={lineInfo?.parentIsLast ?? []}\r\n onFocusNode={setFocusedKey}\r\n />\r\n )\r\n }\r\n\r\n // ═══════════════════════════════════════════\r\n // UNSTYLED RENDER\r\n // ═══════════════════════════════════════════\r\n if (unstyled) {\r\n return (\r\n <div\r\n ref={treeRef}\r\n className={className}\r\n style={style}\r\n role=\"tree\"\r\n tabIndex={0}\r\n onKeyDown={handleKeyDown}\r\n >\r\n {flatNodes.map((item) => renderNode(item))}\r\n </div>\r\n )\r\n }\r\n\r\n // ═══════════════════════════════════════════\r\n // STYLED RENDER\r\n // ═══════════════════════════════════════════\r\n const wrapperCls = [\r\n 'sg-tree',\r\n isShowLine ? 'sg-tree-show-line' : '',\r\n blockNode ? 'sg-tree-block-node' : '',\r\n directory ? 'sg-tree-directory' : '',\r\n disabled ? 'sg-tree-disabled' : '',\r\n animated ? 'sg-tree-animated' : '',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n const renderSearch = () => {\r\n if (!showSearch) return null\r\n return (\r\n <div className=\"sg-tree-search\">\r\n <input\r\n className=\"sg-tree-search-input\"\r\n type=\"text\"\r\n value={searchValue}\r\n onChange={(e) => handleSearchChange(e.target.value)}\r\n placeholder={t.searchPlaceholder}\r\n aria-label={t.searchPlaceholder}\r\n />\r\n {searchValue && (\r\n <button\r\n className=\"sg-tree-search-clear\"\r\n onClick={() => handleSearchChange('')}\r\n aria-label={t.clearSearch}\r\n type=\"button\"\r\n >\r\n ×\r\n </button>\r\n )}\r\n </div>\r\n )\r\n }\r\n\r\n const renderToolbar = () => {\r\n if (!showToolbar) return null\r\n return (\r\n <div className=\"sg-tree-toolbar\">\r\n <div className=\"sg-tree-toolbar-actions\">\r\n <button\r\n className=\"sg-tree-toolbar-btn\"\r\n onClick={handleExpandAll}\r\n title={t.expandAllText}\r\n type=\"button\"\r\n >\r\n ⊞\r\n </button>\r\n <button\r\n className=\"sg-tree-toolbar-btn\"\r\n onClick={handleCollapseAll}\r\n title={t.collapseAllText}\r\n type=\"button\"\r\n >\r\n ⊟\r\n </button>\r\n {checkable && (\r\n <>\r\n <span className=\"sg-tree-toolbar-divider\" />\r\n <button\r\n className=\"sg-tree-toolbar-btn\"\r\n onClick={handleCheckAll}\r\n title={t.checkAllText}\r\n type=\"button\"\r\n >\r\n ☑\r\n </button>\r\n <button\r\n className=\"sg-tree-toolbar-btn\"\r\n onClick={handleUncheckAll}\r\n title={t.uncheckAllText}\r\n type=\"button\"\r\n >\r\n ☐\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n {toolbarExtra && <div className=\"sg-tree-toolbar-extra\">{toolbarExtra}</div>}\r\n </div>\r\n )\r\n }\r\n\r\n const renderNodes = (list: typeof visibleNodes) => list.map((item) => renderNode(item))\r\n\r\n if (flatNodes.length === 0) {\r\n return (\r\n <div className={wrapperCls} style={style} role=\"tree\">\r\n {renderSearch()}\r\n {renderToolbar()}\r\n <div className=\"sg-tree-empty\">{t.emptyText}</div>\r\n </div>\r\n )\r\n }\r\n\r\n if (useVirtual && height) {\r\n return (\r\n <div className={wrapperCls} style={style}>\r\n {renderSearch()}\r\n {renderToolbar()}\r\n <div\r\n ref={containerRef}\r\n className=\"sg-tree-virtual-container\"\r\n style={{ height, overflow: 'auto' }}\r\n onScroll={handleScroll}\r\n onKeyDown={handleKeyDown}\r\n role=\"tree\"\r\n tabIndex={0}\r\n >\r\n <div\r\n style={{\r\n paddingTop: virtualOffset,\r\n paddingBottom: virtualBottomPad,\r\n boxSizing: 'border-box',\r\n }}\r\n >\r\n {renderNodes(visibleNodes)}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <div\r\n ref={treeRef}\r\n className={wrapperCls}\r\n style={style}\r\n role=\"tree\"\r\n tabIndex={0}\r\n onKeyDown={handleKeyDown}\r\n >\r\n {renderSearch()}\r\n {renderToolbar()}\r\n {renderNodes(visibleNodes)}\r\n </div>\r\n )\r\n}\r\n","import { useState, useCallback, useMemo } from 'react'\r\nimport { createCore, createTree } from '@skygraph/core'\r\nimport type {\r\n Core,\r\n TreeEngine,\r\n TreeState,\r\n TreeEngineOptions,\r\n TreeKey,\r\n TreeNodeData,\r\n} from '@skygraph/core'\r\n\r\nexport interface UseTreeOptions extends TreeEngineOptions {\r\n data?: TreeNodeData[]\r\n}\r\n\r\nexport interface UseTreeReturn {\r\n core: Core\r\n tree: TreeEngine\r\n treeState: TreeState\r\n flatNodes: ReturnType<TreeEngine['getFlatNodes']>\r\n expand: (key: TreeKey) => void\r\n collapse: (key: TreeKey) => void\r\n toggleExpand: (key: TreeKey) => void\r\n setExpandedKeys: (keys: TreeKey[]) => void\r\n expandAll: () => void\r\n collapseAll: () => void\r\n expandToLevel: (level: number) => void\r\n check: (key: TreeKey) => void\r\n uncheck: (key: TreeKey) => void\r\n toggleCheck: (key: TreeKey) => void\r\n setCheckedKeys: (keys: TreeKey[]) => void\r\n checkAll: () => void\r\n uncheckAll: () => void\r\n select: (key: TreeKey, multiple?: boolean) => void\r\n deselect: (key: TreeKey) => void\r\n setSelectedKeys: (keys: TreeKey[]) => void\r\n markLoading: (key: TreeKey) => void\r\n markLoaded: (key: TreeKey) => void\r\n addChildren: (parentKey: TreeKey, children: TreeNodeData[]) => void\r\n moveNode: (dragKey: TreeKey, dropKey: TreeKey, position: -1 | 0 | 1) => TreeNodeData[] | null\r\n filterNodes: (predicate: ((node: TreeNodeData) => boolean) | null) => void\r\n getNodePath: (key: TreeKey) => TreeKey[]\r\n refresh: () => void\r\n}\r\n\r\nexport function useTree(options?: UseTreeOptions): UseTreeReturn {\r\n const [{ core, tree }] = useState(() => {\r\n const c = createCore()\r\n const t = createTree(c, options)\r\n if (options?.data) {\r\n t.setData(options.data)\r\n }\r\n return { core: c, tree: t }\r\n })\r\n\r\n const [treeState, setTreeState] = useState(() => tree.getState())\r\n const [flatNodes, setFlatNodes] = useState(() => tree.getFlatNodes())\r\n\r\n const refresh = useCallback(() => {\r\n setTreeState(tree.getState())\r\n setFlatNodes(tree.getFlatNodes())\r\n }, [tree])\r\n\r\n const expand = useCallback((key: TreeKey) => { tree.expand(key); refresh() }, [tree, refresh])\r\n const collapse = useCallback((key: TreeKey) => { tree.collapse(key); refresh() }, [tree, refresh])\r\n const toggleExpand = useCallback((key: TreeKey) => { tree.toggleExpand(key); refresh() }, [tree, refresh])\r\n const setExpandedKeys = useCallback((keys: TreeKey[]) => { tree.setExpandedKeys(keys); refresh() }, [tree, refresh])\r\n const expandAll = useCallback(() => { tree.expandAll(); refresh() }, [tree, refresh])\r\n const collapseAll = useCallback(() => { tree.collapseAll(); refresh() }, [tree, refresh])\r\n\r\n const check = useCallback((key: TreeKey) => { tree.check(key); refresh() }, [tree, refresh])\r\n const uncheck = useCallback((key: TreeKey) => { tree.uncheck(key); refresh() }, [tree, refresh])\r\n const toggleCheck = useCallback((key: TreeKey) => { tree.toggleCheck(key); refresh() }, [tree, refresh])\r\n const setCheckedKeys = useCallback((keys: TreeKey[]) => { tree.setCheckedKeys(keys); refresh() }, [tree, refresh])\r\n\r\n const select = useCallback((key: TreeKey, multiple?: boolean) => { tree.select(key, multiple); refresh() }, [tree, refresh])\r\n const deselect = useCallback((key: TreeKey) => { tree.deselect(key); refresh() }, [tree, refresh])\r\n const setSelectedKeys = useCallback((keys: TreeKey[]) => { tree.setSelectedKeys(keys); refresh() }, [tree, refresh])\r\n\r\n const markLoading = useCallback((key: TreeKey) => { tree.markLoading(key); refresh() }, [tree, refresh])\r\n const markLoaded = useCallback((key: TreeKey) => { tree.markLoaded(key); refresh() }, [tree, refresh])\r\n const addChildren = useCallback((parentKey: TreeKey, children: TreeNodeData[]) => { tree.addChildren(parentKey, children); refresh() }, [tree, refresh])\r\n\r\n const moveNode = useCallback((dragKey: TreeKey, dropKey: TreeKey, position: -1 | 0 | 1) => {\r\n const result = tree.moveNode(dragKey, dropKey, position)\r\n refresh()\r\n return result\r\n }, [tree, refresh])\r\n\r\n const filterNodes = useCallback((predicate: ((node: TreeNodeData) => boolean) | null) => {\r\n tree.filterNodes(predicate)\r\n refresh()\r\n }, [tree, refresh])\r\n\r\n const expandToLevel = useCallback((level: number) => {\r\n const flat = tree.getFlatNodes()\r\n const keys: TreeKey[] = []\r\n for (const item of flat) {\r\n if (item.depth < level && !item.isLeaf) {\r\n keys.push(item.key)\r\n }\r\n }\r\n tree.expandAll()\r\n const allFlat = tree.getFlatNodes()\r\n const expandKeys: TreeKey[] = []\r\n for (const item of allFlat) {\r\n if (item.depth < level && !item.isLeaf) {\r\n expandKeys.push(item.key)\r\n }\r\n }\r\n tree.setExpandedKeys(expandKeys)\r\n refresh()\r\n }, [tree, refresh])\r\n\r\n const checkAll = useCallback(() => {\r\n const allKeys = tree.getAllKeys()\r\n tree.setCheckedKeys(allKeys)\r\n refresh()\r\n }, [tree, refresh])\r\n\r\n const uncheckAll = useCallback(() => {\r\n tree.setCheckedKeys([])\r\n refresh()\r\n }, [tree, refresh])\r\n\r\n const getNodePath = useCallback((key: TreeKey): TreeKey[] => {\r\n const path: TreeKey[] = []\r\n let current: TreeKey | null = key\r\n while (current !== null) {\r\n path.unshift(current)\r\n current = tree.getParentKey(current)\r\n }\r\n return path\r\n }, [tree])\r\n\r\n return useMemo(() => ({\r\n core, tree, treeState, flatNodes,\r\n expand, collapse, toggleExpand, setExpandedKeys, expandAll, collapseAll, expandToLevel,\r\n check, uncheck, toggleCheck, setCheckedKeys, checkAll, uncheckAll,\r\n select, deselect, setSelectedKeys,\r\n markLoading, markLoaded, addChildren,\r\n moveNode, filterNodes, getNodePath, refresh,\r\n }), [\r\n core, tree, treeState, flatNodes,\r\n expand, collapse, toggleExpand, setExpandedKeys, expandAll, collapseAll, expandToLevel,\r\n check, uncheck, toggleCheck, setCheckedKeys, checkAll, uncheckAll,\r\n select, deselect, setSelectedKeys,\r\n markLoading, markLoaded, addChildren,\r\n moveNode, filterNodes, getNodePath, refresh,\r\n ])\r\n}\r\n","import React, { createContext, useContext, useMemo } from 'react'\r\nimport type { SizeType, SgLocale } from '../types'\r\n\r\n/** Text/layout direction shared by descendant components. */\r\nexport type Direction = 'ltr' | 'rtl'\r\n\r\n/**\r\n * Friendly design-token overrides. Each entry is mapped to a `--sg-*` CSS\r\n * custom property and emitted onto a `display: contents` scope wrapper, so\r\n * overrides cascade to every descendant without affecting layout.\r\n *\r\n * Numeric values for length-like tokens (`borderRadius`, `fontSize`) are\r\n * suffixed with `px`; everything else is emitted verbatim.\r\n */\r\nexport interface SgThemeToken {\r\n /** Brand / primary color → `--sg-color-primary`. */\r\n colorPrimary?: string\r\n /** Success color → `--sg-color-success`. */\r\n colorSuccess?: string\r\n /** Warning color → `--sg-color-warning`. */\r\n colorWarning?: string\r\n /** Error / danger color → `--sg-color-error`. */\r\n colorError?: string\r\n /** Base text color → `--sg-color-text`. */\r\n colorText?: string\r\n /** Base background color → `--sg-color-bg`. */\r\n colorBg?: string\r\n /** Base border color → `--sg-color-border`. */\r\n colorBorder?: string\r\n /** Base corner radius → `--sg-border-radius` (number ⇒ px). */\r\n borderRadius?: number | string\r\n /** Base font size → `--sg-font-size` (number ⇒ px). */\r\n fontSize?: number | string\r\n /** Base font family → `--sg-font-sans`. */\r\n fontFamily?: string\r\n}\r\n\r\n/**\r\n * Theme configuration. Combines a built-in light/dark preset (`mode`),\r\n * friendly token overrides (`token`), and an escape hatch for raw CSS\r\n * variables (`cssVars`). All three are applied to a scope wrapper.\r\n */\r\nexport interface ThemeConfig {\r\n /** Built-in palette preset applied via `data-sg-theme`. */\r\n mode?: 'light' | 'dark'\r\n /** Friendly token overrides mapped to `--sg-*` variables. */\r\n token?: SgThemeToken\r\n /** Raw CSS variable overrides (full names, e.g. `{ '--sg-color-link': '#f50' }`). */\r\n cssVars?: Record<string, string>\r\n}\r\n\r\n/** Content-Security-Policy options for runtime-injected styles. */\r\nexport interface CSPConfig {\r\n /** `nonce` attribute applied to dynamically created `<style>` tags. */\r\n nonce?: string\r\n}\r\n\r\n/** Customizes the empty state rendered by data components (`Empty`, `Table`, …). */\r\nexport type RenderEmptyHandler = (componentName?: string) => React.ReactNode\r\n\r\n/**\r\n * Global Skygraph component configuration merged through React context.\r\n *\r\n * По `prefixCls`: сознательно НЕ входит в публичный API до реализации\r\n * (вариант A в `docs/styling-plan.md`, фаза 4). На практике все корневые классы\r\n * имеют стабильный префикс `.sg-*`; если нужна изоляция — используйте изолированный\r\n * скоуп на хосте (шадоу-рут/отдельный контейнер со своими токенами).\r\n */\r\nexport interface SgConfig {\r\n /** Default size token for nested components. */\r\n size?: SizeType\r\n /** Disables interactions for nested components when true. */\r\n disabled?: boolean\r\n /** Enables bordered styling for nested components when true. */\r\n bordered?: boolean\r\n /** Text / layout direction (`ltr` by default) applied via the `dir` attribute. */\r\n direction?: Direction\r\n /** Locale messages shallow-merged with the parent provider when set. */\r\n locale?: SgLocale\r\n /** Theme preset + token overrides applied to a scope wrapper. */\r\n theme?: ThemeConfig\r\n /**\r\n * Returns the mount node for popups (dropdowns, tooltips, pickers). Defaults\r\n * to `document.body` in consumers. Useful to keep overlays inside a scrolling\r\n * or scoped container.\r\n */\r\n getPopupContainer?: (triggerNode?: HTMLElement) => HTMLElement\r\n /** Returns the scroll/target container for affix-like positioning. */\r\n getTargetContainer?: () => HTMLElement\r\n /** Global override for the default empty state. */\r\n renderEmpty?: RenderEmptyHandler\r\n /** Content-Security-Policy options for injected styles. */\r\n csp?: CSPConfig\r\n}\r\n\r\nconst SgConfigContext = createContext<SgConfig>({})\r\n\r\n/** Props for `ConfigProvider`, extending `SgConfig` with React children. */\r\nexport interface ConfigProviderProps extends SgConfig {\r\n /** Tree of components that consume merged configuration from this provider. */\r\n children: React.ReactNode\r\n}\r\n\r\n/** Maps friendly token names to their `--sg-*` CSS variable. */\r\nconst TOKEN_TO_CSS_VAR: Record<keyof SgThemeToken, string> = {\r\n colorPrimary: '--sg-color-primary',\r\n colorSuccess: '--sg-color-success',\r\n colorWarning: '--sg-color-warning',\r\n colorError: '--sg-color-error',\r\n colorText: '--sg-color-text',\r\n colorBg: '--sg-color-bg',\r\n colorBorder: '--sg-color-border',\r\n borderRadius: '--sg-border-radius',\r\n fontSize: '--sg-font-size',\r\n fontFamily: '--sg-font-sans',\r\n}\r\n\r\n/** Token keys whose numeric values should be emitted as `px` lengths. */\r\nconst PX_TOKENS = new Set<keyof SgThemeToken>(['borderRadius', 'fontSize'])\r\n\r\n/** Builds a CSS-variable map from a theme's `token` + `cssVars`. */\r\nexport function buildThemeVars(theme?: ThemeConfig): Record<string, string> {\r\n const vars: Record<string, string> = {}\r\n if (!theme) return vars\r\n if (theme.token) {\r\n for (const key of Object.keys(theme.token) as Array<keyof SgThemeToken>) {\r\n const value = theme.token[key]\r\n if (value == null) continue\r\n const cssVar = TOKEN_TO_CSS_VAR[key]\r\n if (!cssVar) continue\r\n vars[cssVar] = typeof value === 'number' && PX_TOKENS.has(key) ? `${value}px` : String(value)\r\n }\r\n }\r\n if (theme.cssVars) {\r\n for (const [name, value] of Object.entries(theme.cssVars)) {\r\n if (value == null) continue\r\n vars[name.startsWith('--') ? name : `--${name}`] = String(value)\r\n }\r\n }\r\n return vars\r\n}\r\n\r\n/** Shallow-merges a parent and child theme (`token` / `cssVars` merged key-wise). */\r\nfunction mergeTheme(parent?: ThemeConfig, child?: ThemeConfig): ThemeConfig | undefined {\r\n if (!parent) return child\r\n if (!child) return parent\r\n return {\r\n mode: child.mode ?? parent.mode,\r\n token: { ...parent.token, ...child.token },\r\n cssVars: { ...parent.cssVars, ...child.cssVars },\r\n }\r\n}\r\n\r\n/**\r\n * Merges Skygraph configuration with any parent provider and exposes it via context.\r\n * Descendants read values through `useConfig` or `useConfigWithDefaults`.\r\n *\r\n * When `theme` or `direction` is set, children are wrapped in a `display: contents`\r\n * element that carries the `dir`/`data-sg-theme` attributes and CSS variables, so\r\n * the scope inherits without introducing an extra layout box.\r\n */\r\nexport function ConfigProvider({ children, ...config }: ConfigProviderProps) {\r\n const parent = useContext(SgConfigContext)\r\n\r\n const merged = useMemo<SgConfig>(\r\n () => ({\r\n size: config.size ?? parent.size,\r\n disabled: config.disabled ?? parent.disabled,\r\n bordered: config.bordered ?? parent.bordered,\r\n direction: config.direction ?? parent.direction,\r\n locale: config.locale\r\n ? parent.locale\r\n ? { ...parent.locale, ...config.locale }\r\n : config.locale\r\n : parent.locale,\r\n theme: mergeTheme(parent.theme, config.theme),\r\n getPopupContainer: config.getPopupContainer ?? parent.getPopupContainer,\r\n getTargetContainer: config.getTargetContainer ?? parent.getTargetContainer,\r\n renderEmpty: config.renderEmpty ?? parent.renderEmpty,\r\n csp: config.csp ?? parent.csp,\r\n }),\r\n [\r\n config.size,\r\n config.disabled,\r\n config.bordered,\r\n config.direction,\r\n config.locale,\r\n config.theme,\r\n config.getPopupContainer,\r\n config.getTargetContainer,\r\n config.renderEmpty,\r\n config.csp,\r\n parent,\r\n ],\r\n )\r\n\r\n // Only the *own* props are emitted to the DOM scope; CSS variables and the\r\n // `dir` attribute cascade to descendants, so nested providers stay correct.\r\n const ownVars = useMemo(() => buildThemeVars(config.theme), [config.theme])\r\n const mode = config.theme?.mode\r\n const direction = config.direction\r\n const needsScope = Boolean(direction || mode || Object.keys(ownVars).length > 0)\r\n\r\n const content = needsScope ? (\r\n <div\r\n className=\"sg-config-provider\"\r\n style={{ display: 'contents', ...ownVars } as React.CSSProperties}\r\n dir={direction}\r\n data-sg-theme={mode}\r\n >\r\n {children}\r\n </div>\r\n ) : (\r\n children\r\n )\r\n\r\n return <SgConfigContext.Provider value={merged}>{content}</SgConfigContext.Provider>\r\n}\r\n\r\n/** Returns the merged `SgConfig` from the nearest ancestor `ConfigProvider`. */\r\nexport function useConfig(): SgConfig {\r\n return useContext(SgConfigContext)\r\n}\r\n\r\n/**\r\n * Resolves effective `size`, `disabled`, and `direction` from props, context,\r\n * and explicit defaults. Returns the original props plus the resolved values.\r\n */\r\nexport function useConfigWithDefaults<T extends Record<string, unknown>>(\r\n props: T,\r\n defaults: { size?: SizeType; disabled?: boolean; bordered?: boolean; direction?: Direction },\r\n): T & { resolvedSize: SizeType; resolvedDisabled: boolean; resolvedDirection: Direction } {\r\n const config = useContext(SgConfigContext)\r\n\r\n return useMemo(() => {\r\n const resolvedSize =\r\n ((props as Record<string, unknown>).size as SizeType | undefined) ??\r\n config.size ??\r\n defaults.size ??\r\n 'middle'\r\n const resolvedDisabled =\r\n ((props as Record<string, unknown>).disabled as boolean | undefined) ??\r\n config.disabled ??\r\n defaults.disabled ??\r\n false\r\n const resolvedDirection =\r\n ((props as Record<string, unknown>).direction as Direction | undefined) ??\r\n config.direction ??\r\n defaults.direction ??\r\n 'ltr'\r\n\r\n return { ...props, resolvedSize, resolvedDisabled, resolvedDirection }\r\n }, [\r\n props,\r\n config.size,\r\n config.disabled,\r\n config.direction,\r\n defaults.size,\r\n defaults.disabled,\r\n defaults.direction,\r\n ])\r\n}\r\n","import React, { useState, useRef, useEffect, useCallback } from 'react'\r\nimport { Checkbox } from '../../ui/Checkbox'\r\nimport { Spin } from '../../ui/Spin'\r\nimport type { TreeKey, TreeNodeData, TreeLocale, TreeNodeAction, TreeNodeStatus } from './types'\r\n\r\n/** Internal props for a single rendered tree node row. */\r\ninterface TreeNodeRowProps {\r\n /** Node data. */\r\n node: TreeNodeData\r\n /** Node key. */\r\n nodeKey: TreeKey\r\n /** Nesting depth for layout. */\r\n depth: number\r\n /** Whether this node is a leaf in the flattened list. */\r\n isLeaf: boolean\r\n /** Indentation step in pixels. */\r\n indentSize: number\r\n\r\n /** Expanded state. */\r\n expanded: boolean\r\n /** Checked state. */\r\n checked: boolean\r\n /** Indeterminate checkbox state. */\r\n halfChecked: boolean\r\n /** Selected state. */\r\n selected: boolean\r\n /** Async children loading flag. */\r\n loading: boolean\r\n /** Row interaction disabled. */\r\n disabled: boolean\r\n /** Whether this row has keyboard focus. */\r\n focused: boolean\r\n\r\n /** Checkbox column visible. */\r\n checkable: boolean\r\n /** Title click selects the node. */\r\n selectable: boolean\r\n /** Vertical guide lines enabled. */\r\n showLine: boolean\r\n /** Custom leaf connector when `showLine` is on. */\r\n showLeafIcon: boolean | React.ReactNode\r\n /** Leading custom or folder icon. */\r\n showIcon: boolean\r\n /** Full row hit target for selection. */\r\n blockNode: boolean\r\n /** Directory-style expand-on-select for folders. */\r\n directory: boolean\r\n /** Animate expand/collapse affordance. */\r\n animated: boolean\r\n\r\n /** Tree-level default icon. */\r\n globalIcon?: React.ReactNode | ((props: { expanded: boolean; selected: boolean }) => React.ReactNode)\r\n /** Per-node icon override. */\r\n nodeIcon?: React.ReactNode | ((props: { expanded: boolean; selected: boolean }) => React.ReactNode)\r\n /** Custom expander icon. */\r\n switcherIcon?: React.ReactNode | ((props: { expanded: boolean; loading: boolean; isLeaf: boolean }) => React.ReactNode)\r\n\r\n /** Row is draggable. */\r\n draggable: boolean\r\n /** Active drop indicator band on this row. */\r\n dropPosition: -1 | 0 | 1 | null\r\n /** Key of the row currently being dragged, if any. */\r\n dragKey: TreeKey | null\r\n\r\n /** Resolved locale strings. */\r\n t: Required<TreeLocale>\r\n\r\n /** Toggle expand. */\r\n onExpand: (key: TreeKey) => void\r\n /** Toggle check. */\r\n onCheck: (key: TreeKey) => void\r\n /** Toggle select. */\r\n onSelect: (key: TreeKey) => void\r\n /** Native drag start. */\r\n onDragStart: (e: React.DragEvent, key: TreeKey) => void\r\n /** Native drag over. */\r\n onDragOver: (e: React.DragEvent, key: TreeKey) => void\r\n /** Native drag leave. */\r\n onDragLeave: (e: React.DragEvent, key: TreeKey) => void\r\n /** Native drag end. */\r\n onDragEnd: (e: React.DragEvent, key: TreeKey) => void\r\n /** Native drop. */\r\n onDrop: (e: React.DragEvent, key: TreeKey) => void\r\n /** Context menu handler. */\r\n onRightClick?: (e: React.MouseEvent, node: TreeNodeData) => void\r\n /** Lazy-load children on expand. */\r\n onLoadData?: (node: TreeNodeData) => void\r\n /** Moves roving tabindex / focus highlight. */\r\n onFocusNode: (key: TreeKey | null) => void\r\n\r\n /** Custom title render replacing default text. */\r\n titleRender?: (node: TreeNodeData, info: { expanded: boolean; selected: boolean; checked: boolean; halfChecked: boolean }) => React.ReactNode\r\n /** Current filter string for search highlighting. */\r\n searchValue?: string\r\n\r\n /** Inline edit allowed for this row. */\r\n editable: boolean\r\n /** Row is currently in edit mode. */\r\n editing: boolean\r\n /** Enter edit mode. */\r\n onEditStart: (key: TreeKey) => void\r\n /** Commit edited title. */\r\n onEditConfirm: (key: TreeKey, value: string) => void\r\n /** Cancel edit mode. */\r\n onEditCancel: (key: TreeKey) => void\r\n\r\n /** Hover action buttons. */\r\n actions?: TreeNodeAction[]\r\n\r\n /** Semantic status styling for the row. */\r\n status: TreeNodeStatus\r\n\r\n /** Whether this node is the last child of its parent (line drawing). */\r\n lineIsLast: boolean\r\n /** Ancestor “last child” flags for line drawing. */\r\n lineParentIsLast: boolean[]\r\n\r\n /** Unstyled row. */\r\n unstyled?: boolean\r\n /** Extra class from node. */\r\n nodeClassName?: string\r\n /** Inline style from node. */\r\n nodeStyle?: React.CSSProperties\r\n}\r\n\r\n/** Renders one tree row: lines, switcher, checkbox, icon, title, edit field, and actions. */\r\nexport function TreeNodeRow(props: TreeNodeRowProps) {\r\n const {\r\n node, nodeKey, depth, isLeaf, indentSize,\r\n expanded, checked, halfChecked, selected, loading, disabled, focused,\r\n checkable, selectable, showLine, showLeafIcon, showIcon, blockNode, directory,\r\n globalIcon, nodeIcon, switcherIcon,\r\n draggable, dropPosition, dragKey,\r\n onExpand, onCheck, onSelect,\r\n onDragStart, onDragOver, onDragLeave, onDragEnd, onDrop,\r\n onRightClick, onLoadData, onFocusNode,\r\n titleRender, searchValue,\r\n editable, editing, onEditStart, onEditConfirm, onEditCancel,\r\n actions,\r\n status,\r\n lineIsLast, lineParentIsLast,\r\n unstyled, nodeClassName, nodeStyle,\r\n } = props\r\n\r\n const rowRef = useRef<HTMLDivElement>(null)\r\n const editInputRef = useRef<HTMLInputElement>(null)\r\n const [editValue, setEditValue] = useState('')\r\n\r\n useEffect(() => {\r\n if (editing) {\r\n setEditValue(String(node.title ?? ''))\r\n setTimeout(() => editInputRef.current?.focus(), 0)\r\n }\r\n }, [editing, node.title])\r\n\r\n useEffect(() => {\r\n if (focused && rowRef.current) {\r\n rowRef.current.scrollIntoView?.({ block: 'nearest' })\r\n }\r\n }, [focused])\r\n\r\n const handleSwitcherClick = (e: React.MouseEvent) => {\r\n e.stopPropagation()\r\n if (isLeaf) return\r\n if (!expanded && loading) return\r\n onExpand(nodeKey)\r\n if (!expanded && !isLeaf && onLoadData) {\r\n onLoadData(node)\r\n }\r\n }\r\n\r\n const handleCheckChange = () => {\r\n if (disabled || node.disableCheckbox) return\r\n onCheck(nodeKey)\r\n }\r\n\r\n const handleSelect = () => {\r\n if (disabled || (node.selectable === false)) return\r\n if (!selectable) return\r\n onSelect(nodeKey)\r\n if (directory && !isLeaf) {\r\n onExpand(nodeKey)\r\n }\r\n }\r\n\r\n const handleClick = () => {\r\n onFocusNode(nodeKey)\r\n handleSelect()\r\n }\r\n\r\n const handleDoubleClick = () => {\r\n if (editable && !editing) {\r\n onEditStart(nodeKey)\r\n }\r\n }\r\n\r\n const handleContextMenu = (e: React.MouseEvent) => {\r\n if (onRightClick) {\r\n e.preventDefault()\r\n onRightClick(e, node)\r\n }\r\n }\r\n\r\n const handleEditKeyDown = useCallback((e: React.KeyboardEvent) => {\r\n e.stopPropagation()\r\n if (e.key === 'Enter') {\r\n onEditConfirm(nodeKey, editValue)\r\n } else if (e.key === 'Escape') {\r\n onEditCancel(nodeKey)\r\n }\r\n }, [nodeKey, editValue, onEditConfirm, onEditCancel])\r\n\r\n const handleEditBlur = useCallback(() => {\r\n onEditConfirm(nodeKey, editValue)\r\n }, [nodeKey, editValue, onEditConfirm])\r\n\r\n // Highlighted title with search match\r\n const renderHighlightedTitle = (title: string) => {\r\n if (!searchValue) return title\r\n const index = title.toLowerCase().indexOf(searchValue.toLowerCase())\r\n if (index === -1) return title\r\n const before = title.slice(0, index)\r\n const match = title.slice(index, index + searchValue.length)\r\n const after = title.slice(index + searchValue.length)\r\n return (\r\n <>\r\n {before}\r\n <span className=\"sg-tree-highlight\">{match}</span>\r\n {after}\r\n </>\r\n )\r\n }\r\n\r\n // Switcher icon\r\n const renderSwitcher = () => {\r\n if (isLeaf) {\r\n if (showLine) {\r\n if (showLeafIcon === false) return <span className=\"sg-tree-switcher sg-tree-switcher-noop\" />\r\n if (showLeafIcon && typeof showLeafIcon !== 'boolean') {\r\n return <span className=\"sg-tree-switcher sg-tree-switcher-leaf-icon\">{showLeafIcon}</span>\r\n }\r\n return <span className=\"sg-tree-switcher sg-tree-switcher-leaf\">─</span>\r\n }\r\n return <span className=\"sg-tree-switcher sg-tree-switcher-noop\" />\r\n }\r\n\r\n if (loading) {\r\n return <span className=\"sg-tree-switcher sg-tree-switcher-loading\"><Spin size=\"small\" /></span>\r\n }\r\n\r\n let iconContent: React.ReactNode\r\n if (switcherIcon) {\r\n iconContent = typeof switcherIcon === 'function'\r\n ? switcherIcon({ expanded, loading, isLeaf })\r\n : switcherIcon\r\n } else {\r\n iconContent = (\r\n <svg\r\n className={`sg-tree-switcher-arrow${expanded ? ' sg-tree-switcher-arrow-open' : ''}`}\r\n width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\"\r\n >\r\n <path d=\"M3 2L7 5L3 8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\r\n </svg>\r\n )\r\n }\r\n\r\n return (\r\n <span\r\n className={`sg-tree-switcher${expanded ? ' sg-tree-switcher-open' : ' sg-tree-switcher-close'}`}\r\n onClick={handleSwitcherClick}\r\n >\r\n {iconContent}\r\n </span>\r\n )\r\n }\r\n\r\n // Node icon\r\n const renderIcon = () => {\r\n if (!showIcon && !directory) return null\r\n const iconSource = nodeIcon ?? globalIcon\r\n let iconContent: React.ReactNode = null\r\n\r\n if (iconSource) {\r\n iconContent = typeof iconSource === 'function'\r\n ? iconSource({ expanded, selected })\r\n : iconSource\r\n } else if (directory) {\r\n iconContent = expanded ? '📂' : '📁'\r\n }\r\n\r\n if (!iconContent) return null\r\n return <span className=\"sg-tree-icon\">{iconContent}</span>\r\n }\r\n\r\n // Title content\r\n const renderTitle = () => {\r\n if (editing) {\r\n return (\r\n <input\r\n ref={editInputRef}\r\n className=\"sg-tree-edit-input\"\r\n value={editValue}\r\n onChange={(e) => setEditValue(e.target.value)}\r\n onKeyDown={handleEditKeyDown}\r\n onBlur={handleEditBlur}\r\n onClick={(e) => e.stopPropagation()}\r\n />\r\n )\r\n }\r\n\r\n if (titleRender) {\r\n return titleRender(node, { expanded, selected, checked, halfChecked })\r\n }\r\n\r\n const titleText = String(node.title ?? nodeKey)\r\n return renderHighlightedTitle(titleText)\r\n }\r\n\r\n // Action buttons\r\n const renderActions = () => {\r\n if (!actions || actions.length === 0) return null\r\n const visibleActions = actions.filter((a) => !a.visible || a.visible(node))\r\n if (visibleActions.length === 0) return null\r\n\r\n return (\r\n <span className=\"sg-tree-actions\" onClick={(e) => e.stopPropagation()}>\r\n {visibleActions.map((action) => {\r\n const isDisabled = action.disabled?.(node) ?? false\r\n return (\r\n <button\r\n key={action.key}\r\n className={`sg-tree-action-btn${action.danger ? ' sg-tree-action-danger' : ''}${isDisabled ? ' sg-tree-action-disabled' : ''}`}\r\n title={action.title}\r\n onClick={(e) => {\r\n e.stopPropagation()\r\n if (!isDisabled) action.onClick(node, nodeKey)\r\n }}\r\n disabled={isDisabled}\r\n type=\"button\"\r\n >\r\n {action.icon ?? action.title ?? action.key}\r\n </button>\r\n )\r\n })}\r\n </span>\r\n )\r\n }\r\n\r\n // Connecting lines\r\n const renderIndentLines = () => {\r\n if (!showLine) return null\r\n const lines: React.ReactNode[] = []\r\n for (let i = 0; i < depth; i++) {\r\n const isParentLast = lineParentIsLast[i] ?? false\r\n lines.push(\r\n <span\r\n key={i}\r\n className={`sg-tree-indent-line${isParentLast ? ' sg-tree-indent-line-hidden' : ''}`}\r\n style={{ left: i * indentSize + indentSize / 2 }}\r\n />\r\n )\r\n }\r\n if (depth > 0) {\r\n lines.push(\r\n <span\r\n key=\"branch\"\r\n className={`sg-tree-indent-branch${lineIsLast ? ' sg-tree-indent-branch-last' : ''}`}\r\n style={{ left: (depth - 1) * indentSize + indentSize / 2 }}\r\n />\r\n )\r\n }\r\n return <>{lines}</>\r\n }\r\n\r\n // Status dot\r\n const renderStatus = () => {\r\n if (status === 'default') return null\r\n return <span className={`sg-tree-status sg-tree-status-${status}`} />\r\n }\r\n\r\n if (unstyled) {\r\n return (\r\n <div\r\n ref={rowRef}\r\n role=\"treeitem\"\r\n aria-expanded={isLeaf ? undefined : expanded}\r\n aria-selected={selected}\r\n aria-checked={checkable ? checked : undefined}\r\n aria-level={depth + 1}\r\n data-key={nodeKey}\r\n >\r\n {checkable && (\r\n <Checkbox\r\n checked={checked}\r\n indeterminate={halfChecked}\r\n disabled={disabled || node.disableCheckbox}\r\n onChange={handleCheckChange}\r\n unstyled\r\n />\r\n )}\r\n <span onClick={handleClick}>{renderTitle()}</span>\r\n </div>\r\n )\r\n }\r\n\r\n const isDragging = dragKey === nodeKey\r\n\r\n const rowCls = [\r\n 'sg-tree-node',\r\n selected ? 'sg-tree-node-selected' : '',\r\n disabled ? 'sg-tree-node-disabled' : '',\r\n isLeaf ? 'sg-tree-node-leaf' : '',\r\n expanded ? 'sg-tree-node-expanded' : '',\r\n draggable ? 'sg-tree-node-draggable' : '',\r\n isDragging ? 'sg-tree-node-dragging' : '',\r\n dropPosition === 0 ? 'sg-tree-node-drop-inner' : '',\r\n dropPosition === -1 ? 'sg-tree-node-drop-before' : '',\r\n dropPosition === 1 ? 'sg-tree-node-drop-after' : '',\r\n showLine ? 'sg-tree-node-show-line' : '',\r\n blockNode ? 'sg-tree-node-block' : '',\r\n directory ? 'sg-tree-node-directory' : '',\r\n focused ? 'sg-tree-node-focused' : '',\r\n editing ? 'sg-tree-node-editing' : '',\r\n status !== 'default' ? `sg-tree-node-status-${status}` : '',\r\n nodeClassName,\r\n ].filter(Boolean).join(' ')\r\n\r\n return (\r\n <div\r\n ref={rowRef}\r\n className={rowCls}\r\n style={{ ...nodeStyle, paddingLeft: depth * indentSize }}\r\n role=\"treeitem\"\r\n aria-expanded={isLeaf ? undefined : expanded}\r\n aria-selected={selected}\r\n aria-checked={checkable ? checked : undefined}\r\n aria-level={depth + 1}\r\n data-key={nodeKey}\r\n draggable={draggable && !editing}\r\n onDragStart={draggable ? (e) => onDragStart(e, nodeKey) : undefined}\r\n onDragOver={draggable ? (e) => { e.preventDefault(); onDragOver(e, nodeKey) } : undefined}\r\n onDragLeave={draggable ? (e) => onDragLeave(e, nodeKey) : undefined}\r\n onDragEnd={draggable ? (e) => onDragEnd(e, nodeKey) : undefined}\r\n onDrop={draggable ? (e) => { e.preventDefault(); onDrop(e, nodeKey) } : undefined}\r\n onContextMenu={handleContextMenu}\r\n onClick={handleClick}\r\n onDoubleClick={editable ? handleDoubleClick : undefined}\r\n >\r\n {renderIndentLines()}\r\n {renderSwitcher()}\r\n\r\n {checkable && node.checkable !== false && (\r\n <Checkbox\r\n checked={checked}\r\n indeterminate={halfChecked}\r\n disabled={disabled || node.disableCheckbox}\r\n onChange={handleCheckChange}\r\n />\r\n )}\r\n\r\n {renderIcon()}\r\n {renderStatus()}\r\n\r\n <span\r\n className={`sg-tree-title${selectable && !editing ? ' sg-tree-title-selectable' : ''}`}\r\n >\r\n {renderTitle()}\r\n </span>\r\n\r\n {renderActions()}\r\n </div>\r\n )\r\n}\r\n","import React from 'react'\r\nimport { useConfig } from '../ConfigProvider'\r\nimport type { BaseComponentProps, InteractiveProps } from '../../types'\r\nimport { Spin } from './Spin'\r\n\r\n/** Props for the Checkbox component. */\r\nexport interface CheckboxProps extends BaseComponentProps, InteractiveProps {\r\n /** Controlled checked state. */\r\n checked?: boolean\r\n /** Uncontrolled initial checked state. */\r\n defaultChecked?: boolean\r\n /** Renders the native checkbox in indeterminate state. */\r\n indeterminate?: boolean\r\n /** Called when the checked state changes. */\r\n onChange?: (checked: boolean) => void\r\n /** Label content beside the control. */\r\n children?: React.ReactNode\r\n}\r\n\r\n/** Labeled checkbox with indeterminate support and optional loading state. */\r\nexport function Checkbox({\r\n checked,\r\n defaultChecked,\r\n disabled: disabledProp,\r\n loading,\r\n indeterminate,\r\n onChange,\r\n children,\r\n className,\r\n style,\r\n unstyled,\r\n}: CheckboxProps) {\r\n const config = useConfig()\r\n const disabled = disabledProp ?? config.disabled ?? false\r\n\r\n const inputRef = React.useRef<HTMLInputElement>(null)\r\n\r\n React.useEffect(() => {\r\n if (inputRef.current) {\r\n inputRef.current.indeterminate = indeterminate ?? false\r\n }\r\n }, [indeterminate])\r\n\r\n const wrapperClass = unstyled\r\n ? (className ?? '')\r\n : [\r\n 'sg-checkbox',\r\n disabled || loading ? 'sg-checkbox-disabled' : '',\r\n loading ? 'sg-checkbox-loading' : '',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n return (\r\n <label className={wrapperClass} style={style}>\r\n <input\r\n ref={inputRef}\r\n type=\"checkbox\"\r\n aria-checked={checked}\r\n className={unstyled ? '' : 'sg-checkbox-input'}\r\n checked={checked}\r\n defaultChecked={defaultChecked}\r\n disabled={disabled || loading}\r\n onChange={(e) => onChange?.(e.target.checked)}\r\n />\r\n {!unstyled && <span className=\"sg-checkbox-box\" aria-hidden />}\r\n {children && <span className={unstyled ? '' : 'sg-checkbox-label'}>{children}</span>}\r\n {loading && <Spin size=\"small\" unstyled={unstyled} />}\r\n </label>\r\n )\r\n}\r\n","import React from 'react'\r\nimport { useConfig } from '../ConfigProvider'\r\nimport type { BaseComponentProps, SizableProps } from '../../types'\r\n\r\n/** Props for loading spinner, overlay, and optional content blur. */\r\nexport interface SpinProps extends BaseComponentProps, SizableProps {\r\n /** When `true`, shows the loading state (subject to `delay`). @default true */\r\n spinning?: boolean\r\n /** Milliseconds to wait before showing the spinner after `spinning` becomes true. */\r\n delay?: number\r\n /** Optional text below the indicator. */\r\n tip?: string\r\n /** When `true`, covers the viewport instead of inline or wrapping children. */\r\n fullscreen?: boolean\r\n /** Custom spinner node; defaults to a styled status element. */\r\n indicator?: React.ReactNode\r\n /** When set, shows an overlay with blur on this content while loading. */\r\n children?: React.ReactNode\r\n}\r\n\r\n/**\r\n * Loading indicator with optional delay, tip, fullscreen mode, and child overlay.\r\n */\r\nexport function Spin({\r\n spinning = true,\r\n size: sizeProp,\r\n delay,\r\n tip,\r\n fullscreen,\r\n indicator,\r\n children,\r\n className,\r\n style,\r\n unstyled,\r\n}: SpinProps) {\r\n const config = useConfig()\r\n const resolvedSize = sizeProp ?? config.size ?? 'middle'\r\n\r\n const [visible, setVisible] = React.useState(delay ? false : spinning)\r\n\r\n React.useEffect(() => {\r\n if (!delay) {\r\n setVisible(spinning)\r\n return\r\n }\r\n\r\n if (spinning) {\r\n const timer = setTimeout(() => setVisible(true), delay)\r\n return () => clearTimeout(timer)\r\n }\r\n\r\n setVisible(false)\r\n }, [spinning, delay])\r\n\r\n if (!visible && !children) return null\r\n if (!visible && children) return <>{children}</>\r\n\r\n const spinSizeClass = resolvedSize === 'middle' ? 'default' : resolvedSize\r\n const spinClasses = unstyled\r\n ? (className ?? '')\r\n : ['sg-spin', `sg-spin-${spinSizeClass}`, className].filter(Boolean).join(' ')\r\n\r\n const spinElement = indicator ?? (\r\n <span\r\n className={spinClasses}\r\n style={style}\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n aria-label={config.locale?.spin?.loading ?? 'Loading'}\r\n />\r\n )\r\n\r\n if (fullscreen) {\r\n return (\r\n <div className={unstyled ? '' : 'sg-spin-fullscreen'}>\r\n <div className={unstyled ? '' : 'sg-spin-fullscreen-inner'}>\r\n {spinElement}\r\n {tip && <div className={unstyled ? '' : 'sg-spin-tip'}>{tip}</div>}\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n if (!children) {\r\n return (\r\n <span className={unstyled ? '' : 'sg-spin-standalone'} style={style}>\r\n {spinElement}\r\n {tip && <div className={unstyled ? '' : 'sg-spin-tip'}>{tip}</div>}\r\n </span>\r\n )\r\n }\r\n\r\n return (\r\n <div className={unstyled ? '' : 'sg-spin-container'} style={style}>\r\n <div className={unstyled ? '' : 'sg-spin-overlay'}>\r\n {spinElement}\r\n {tip && <div className={unstyled ? '' : 'sg-spin-tip'}>{tip}</div>}\r\n </div>\r\n <div className={visible ? (unstyled ? '' : 'sg-spin-blur') : ''}>{children}</div>\r\n </div>\r\n )\r\n}\r\n","import type React from 'react'\r\nimport type { TreeKey, TreeNodeData, TreeFieldNames } from '@skygraph/core'\r\n\r\n/** Re-exports core tree data types. */\r\nexport type { TreeKey, TreeNodeData, TreeFieldNames }\r\n\r\n/** Payload for `onCheck` describing the toggle and affected nodes. */\r\nexport interface CheckInfo {\r\n /** Whether the toggled node ended checked. */\r\n checked: boolean\r\n /** Node whose checkbox was toggled. */\r\n node: TreeNodeData\r\n /** All fully checked nodes after the update. */\r\n checkedNodes: TreeNodeData[]\r\n /** Keys in indeterminate half-checked state. */\r\n halfCheckedKeys: TreeKey[]\r\n}\r\n\r\n/** Payload for `onSelect` after a selection change. */\r\nexport interface SelectInfo {\r\n /** Whether the node ended selected. */\r\n selected: boolean\r\n /** Node that was clicked for selection. */\r\n node: TreeNodeData\r\n /** All selected nodes after the update. */\r\n selectedNodes: TreeNodeData[]\r\n}\r\n\r\n/** Payload for `onExpand` after an expand/collapse. */\r\nexport interface ExpandInfo {\r\n /** Whether the node ended expanded. */\r\n expanded: boolean\r\n /** Node whose expander was toggled. */\r\n node: TreeNodeData\r\n}\r\n\r\n/** Drag lifecycle event payload with DOM event and node. */\r\nexport interface DragInfo {\r\n /** Browser drag event. */\r\n event: React.DragEvent\r\n /** Associated tree node. */\r\n node: TreeNodeData\r\n}\r\n\r\n/** Drop completion payload including dragged node and position. */\r\nexport interface DropInfo {\r\n /** Browser drop event. */\r\n event: React.DragEvent\r\n /** Drop target node. */\r\n node: TreeNodeData\r\n /** Node that was dragged. */\r\n dragNode: TreeNodeData\r\n /** Insert position relative to the target. */\r\n dropPosition: -1 | 0 | 1\r\n}\r\n\r\n/** Payload when an inline edit is committed (if editing is used). */\r\nexport interface EditInfo {\r\n /** Edited node key. */\r\n key: TreeKey\r\n /** Edited node. */\r\n node: TreeNodeData\r\n /** New title text. */\r\n value: string\r\n /** Previous title text. */\r\n oldValue: string\r\n}\r\n\r\n/** Visual status hint for a node row. */\r\nexport type TreeNodeStatus = 'default' | 'success' | 'warning' | 'error' | 'info'\r\n\r\n/** Declarative action button on a tree node row. */\r\nexport interface TreeNodeAction {\r\n /** Action identifier. */\r\n key: string\r\n /** Button icon. */\r\n icon?: React.ReactNode\r\n /** Tooltip or aria label text. */\r\n title?: string\r\n /** Click handler receiving node and key. */\r\n onClick: (node: TreeNodeData, key: TreeKey) => void\r\n /** Hides the action for nodes where this returns false. */\r\n visible?: (node: TreeNodeData) => boolean\r\n /** Disables the action per node. */\r\n disabled?: (node: TreeNodeData) => boolean\r\n /** Destructive styling. */\r\n danger?: boolean\r\n}\r\n\r\n/** Localizable strings for built-in tree UI. */\r\nexport interface TreeLocale {\r\n /** Empty tree placeholder. */\r\n emptyText?: React.ReactNode\r\n /** Async loading label. */\r\n loadingText?: string\r\n /** Search field placeholder. */\r\n searchPlaceholder?: string\r\n /** Toolbar control to expand all nodes. */\r\n expandAllText?: string\r\n /** Toolbar control to collapse all nodes. */\r\n collapseAllText?: string\r\n /** Toolbar control to check all checkboxes. */\r\n checkAllText?: string\r\n /** Toolbar control to clear all checks. */\r\n uncheckAllText?: string\r\n /** Accessible label for the clear-search (×) button. */\r\n clearSearch?: string\r\n}\r\n\r\n/** Default English strings for `Tree`. */\r\nexport const DEFAULT_TREE_LOCALE: Required<TreeLocale> = {\r\n emptyText: 'No data',\r\n loadingText: 'Loading...',\r\n searchPlaceholder: 'Search...',\r\n expandAllText: 'Expand All',\r\n collapseAllText: 'Collapse All',\r\n checkAllText: 'Check All',\r\n uncheckAllText: 'Uncheck All',\r\n clearSearch: 'Clear search',\r\n}\r\n\r\n/** Default indent between tree levels in pixels. */\r\nexport const DEFAULT_INDENT = 24\r\n/** Default node row height used for virtual scroll estimates. */\r\nexport const NODE_HEIGHT = 28\r\n\r\n/** Props for the `Tree` component. */\r\nexport interface TreeProps {\r\n /** Hierarchical data with keys and optional children. */\r\n treeData: TreeNodeData[]\r\n /** Renames `title`, `key`, `children`, and other field accessors. */\r\n fieldNames?: TreeFieldNames\r\n\r\n /** Shows checkboxes on nodes. @default false */\r\n checkable?: boolean\r\n /** When true, parent and child checks are independent. @default false */\r\n checkStrictly?: boolean\r\n /** Controlled checked keys. */\r\n checkedKeys?: TreeKey[]\r\n /** Initial checked keys in uncontrolled mode. */\r\n defaultCheckedKeys?: TreeKey[]\r\n /** Fires after check state changes. */\r\n onCheck?: (checkedKeys: TreeKey[], info: CheckInfo) => void\r\n\r\n /** Allows clicking titles to select nodes. @default true */\r\n selectable?: boolean\r\n /** Allows multiple selected nodes. @default false */\r\n multiple?: boolean\r\n /** Controlled selected keys. */\r\n selectedKeys?: TreeKey[]\r\n /** Initial selected keys in uncontrolled mode. */\r\n defaultSelectedKeys?: TreeKey[]\r\n /** Fires after selection changes. */\r\n onSelect?: (selectedKeys: TreeKey[], info: SelectInfo) => void\r\n\r\n /** Controlled expanded keys. */\r\n expandedKeys?: TreeKey[]\r\n /** Initial expanded keys in uncontrolled mode. */\r\n defaultExpandedKeys?: TreeKey[]\r\n /** Expands every parent on first render when uncontrolled. @default false */\r\n defaultExpandAll?: boolean\r\n /** Expands ancestors of the focused or matched node when filtering. @default false */\r\n autoExpandParent?: boolean\r\n /** Fires after expand/collapse. */\r\n onExpand?: (expandedKeys: TreeKey[], info: ExpandInfo) => void\r\n\r\n /** Enables drag handles per node or per node predicate. @default false */\r\n draggable?: boolean | ((node: TreeNodeData) => boolean)\r\n /** Validates whether a drop is allowed. */\r\n allowDrop?: (info: {\r\n dragNode: TreeNodeData\r\n dropNode: TreeNodeData\r\n dropPosition: -1 | 0 | 1\r\n }) => boolean\r\n /** Drag start callback. */\r\n onDragStart?: (info: DragInfo) => void\r\n /** Drag enter callback. */\r\n onDragEnter?: (info: DragInfo) => void\r\n /** Drag over callback. */\r\n onDragOver?: (info: DragInfo) => void\r\n /** Drag leave callback. */\r\n onDragLeave?: (info: DragInfo) => void\r\n /** Drag end callback. */\r\n onDragEnd?: (info: DragInfo) => void\r\n /** Drop callback after a successful internal move. */\r\n onDrop?: (info: DropInfo) => void\r\n\r\n /** Loads children asynchronously; return promise resolves when data is ready. */\r\n loadData?: (node: TreeNodeData) => Promise<void>\r\n /** Keys whose children have finished loading. */\r\n loadedKeys?: TreeKey[]\r\n\r\n /** Renders guide lines between levels or configures leaf icons. @default false */\r\n showLine?: boolean | { showLeafIcon?: boolean | React.ReactNode }\r\n /** Shows a leading icon column. @default false */\r\n showIcon?: boolean\r\n /** Default node icon render or element. */\r\n icon?: React.ReactNode | ((props: { expanded: boolean; selected: boolean }) => React.ReactNode)\r\n /** Custom expand/collapse control. */\r\n switcherIcon?:\r\n | React.ReactNode\r\n | ((props: { expanded: boolean; loading: boolean; isLeaf: boolean }) => React.ReactNode)\r\n /** Makes the whole row clickable for selection. @default false */\r\n blockNode?: boolean\r\n /** Fixed viewport height enabling internal virtual scroll. */\r\n height?: number\r\n /** Uses windowed rendering when `height` is set and the list is large. @default true */\r\n virtual?: boolean\r\n /** Disables all interactions. @default false */\r\n disabled?: boolean\r\n /** Horizontal indent per depth level in pixels. @default 24 */\r\n indentSize?: number\r\n\r\n /** Directory-style selection expands folders on click. @default false */\r\n directory?: boolean\r\n\r\n /** Context menu handler on node rows. */\r\n onRightClick?: (info: { event: React.MouseEvent; node: TreeNodeData }) => void\r\n\r\n /** Shows the toolbar search field. @default false */\r\n showSearch?: boolean\r\n /** Controlled filter text. */\r\n searchValue?: string\r\n /** Initial filter text when uncontrolled. @default '' */\r\n defaultSearchValue?: string\r\n /** Emits filter text changes. */\r\n onSearch?: (value: string) => void\r\n /** Predicate to include nodes while searching. */\r\n filterTreeNode?: (node: TreeNodeData, searchValue: string) => boolean\r\n /** Highlights matched text in titles. @default true */\r\n highlightSearch?: boolean\r\n\r\n /** Enables built-in keyboard navigation helpers. @default true */\r\n keyboard?: boolean\r\n\r\n /** Enables inline editing of titles per node or predicate. @default false */\r\n editable?: boolean | ((node: TreeNodeData) => boolean)\r\n /** Commit handler for inline edits. */\r\n onEdit?: (info: EditInfo) => void\r\n /** Cancel handler for inline edits. */\r\n onEditCancel?: (key: TreeKey) => void\r\n\r\n /** Custom title area render. */\r\n titleRender?: (\r\n node: TreeNodeData,\r\n info: { expanded: boolean; selected: boolean; checked: boolean; halfChecked: boolean },\r\n ) => React.ReactNode\r\n\r\n /** Inline action buttons on node rows. */\r\n actions?: TreeNodeAction[]\r\n\r\n /** Shows toolbar with expand/collapse/check-all controls. @default false */\r\n showToolbar?: boolean\r\n /** Extra toolbar nodes after built-ins. */\r\n toolbarExtra?: React.ReactNode\r\n\r\n /** Enables expand/collapse animations. @default true */\r\n animated?: boolean\r\n\r\n /** Focuses a node on mount when supported. @default false */\r\n autoFocus?: boolean\r\n /** Controlled focused node key. */\r\n focusedKey?: TreeKey\r\n /** Fires when focus moves to a node. */\r\n onFocus?: (key: TreeKey) => void\r\n\r\n /** Scrolls the given key into view when it changes. */\r\n scrollToKey?: TreeKey\r\n\r\n /** Maps a node to a status color variant. */\r\n nodeStatus?: (node: TreeNodeData) => TreeNodeStatus\r\n\r\n /** Overrides default locale strings. */\r\n locale?: TreeLocale\r\n\r\n /** Root wrapper class name. */\r\n className?: string\r\n /** Root wrapper style. */\r\n style?: React.CSSProperties\r\n /** Renders semantic tree without Skygraph styles. */\r\n unstyled?: boolean\r\n}\r\n","import React, { useState, useEffect, useRef, useCallback, useMemo } from 'react'\r\nimport { Tree } from '../Tree'\r\nimport { useConfig } from '../../ConfigProvider'\r\nimport type { TreeSelectProps, TreeKey, TreeNodeData } from './types'\r\n\r\nfunction toArray(val: TreeKey | TreeKey[] | undefined): TreeKey[] {\r\n if (val === undefined) return []\r\n return Array.isArray(val) ? val : [val]\r\n}\r\n\r\nfunction collectAllKeys(nodes: TreeNodeData[]): TreeKey[] {\r\n const keys: TreeKey[] = []\r\n const walk = (list: TreeNodeData[]) => {\r\n for (const n of list) {\r\n keys.push(n.key)\r\n if (n.children) walk(n.children)\r\n }\r\n }\r\n walk(nodes)\r\n return keys\r\n}\r\n\r\nfunction findNode(nodes: TreeNodeData[], key: TreeKey): TreeNodeData | undefined {\r\n for (const n of nodes) {\r\n if (n.key === key) return n\r\n if (n.children) {\r\n const found = findNode(n.children, key)\r\n if (found) return found\r\n }\r\n }\r\n return undefined\r\n}\r\n\r\nfunction getNodeLabel(node: TreeNodeData | undefined): React.ReactNode {\r\n if (!node) return ''\r\n return node.title ?? String(node.key)\r\n}\r\n\r\nfunction filterTreeKeepMatches(\r\n nodes: TreeNodeData[],\r\n predicate: (node: TreeNodeData) => boolean,\r\n): TreeNodeData[] {\r\n const result: TreeNodeData[] = []\r\n for (const node of nodes) {\r\n const childResult = node.children ? filterTreeKeepMatches(node.children, predicate) : []\r\n if (predicate(node) || childResult.length > 0) {\r\n result.push({\r\n ...node,\r\n children: childResult.length > 0 ? childResult : undefined,\r\n })\r\n }\r\n }\r\n return result\r\n}\r\n\r\nfunction getParentKeys(nodes: TreeNodeData[], targetKey: TreeKey): TreeKey[] {\r\n const parents: TreeKey[] = []\r\n const walk = (list: TreeNodeData[], path: TreeKey[]): boolean => {\r\n for (const n of list) {\r\n if (n.key === targetKey) {\r\n parents.push(...path)\r\n return true\r\n }\r\n if (n.children && walk(n.children, [...path, n.key])) return true\r\n }\r\n return false\r\n }\r\n walk(nodes, [])\r\n return parents\r\n}\r\n\r\nfunction applyStrategy(\r\n checkedKeys: TreeKey[],\r\n treeData: TreeNodeData[],\r\n strategy: 'SHOW_ALL' | 'SHOW_PARENT' | 'SHOW_CHILD',\r\n): TreeKey[] {\r\n if (strategy === 'SHOW_ALL') return checkedKeys\r\n\r\n const checkedSet = new Set(checkedKeys)\r\n\r\n if (strategy === 'SHOW_CHILD') {\r\n return checkedKeys.filter((key) => {\r\n const node = findNode(treeData, key)\r\n return !node?.children || node.children.length === 0\r\n })\r\n }\r\n\r\n if (strategy === 'SHOW_PARENT') {\r\n return checkedKeys.filter((key) => {\r\n const parentKeys = getParentKeys(treeData, key)\r\n return !parentKeys.some((pk) => checkedSet.has(pk))\r\n })\r\n }\r\n\r\n return checkedKeys\r\n}\r\n\r\n/**\r\n * Dropdown that embeds `Tree` for single or multiple selection, optional checkboxes, and search.\r\n * Manages open state, filtering, and tag display for multi-value modes.\r\n */\r\nexport function TreeSelect(props: TreeSelectProps) {\r\n const {\r\n treeData,\r\n value: controlledValue,\r\n defaultValue,\r\n onChange,\r\n fieldNames,\r\n multiple = false,\r\n treeCheckable = false,\r\n treeCheckStrictly = false,\r\n treeDefaultExpandAll = false,\r\n treeDefaultExpandedKeys,\r\n showSearch = false,\r\n filterTreeNode,\r\n placeholder = 'Please select',\r\n allowClear = false,\r\n disabled = false,\r\n size = 'middle',\r\n maxTagCount,\r\n dropdownStyle,\r\n treeLine = false,\r\n showCheckedStrategy = 'SHOW_ALL',\r\n onSearch,\r\n className,\r\n style,\r\n unstyled,\r\n } = props\r\n\r\n const treeSelectLocale = useConfig().locale?.treeSelect\r\n const searchPlaceholder = treeSelectLocale?.searchPlaceholder ?? 'Search...'\r\n const noMatchesText = treeSelectLocale?.noMatches ?? 'No matches'\r\n\r\n const isMultiple = multiple || treeCheckable\r\n\r\n const [internalValue, setInternalValue] = useState<TreeKey[]>(() =>\r\n toArray(controlledValue ?? defaultValue),\r\n )\r\n const [open, setOpen] = useState(false)\r\n const [searchValue, setSearchValue] = useState('')\r\n const wrapperRef = useRef<HTMLDivElement>(null)\r\n const searchRef = useRef<HTMLInputElement>(null)\r\n\r\n const currentValue = useMemo(\r\n () => toArray(controlledValue ?? internalValue),\r\n [controlledValue, internalValue],\r\n )\r\n\r\n useEffect(() => {\r\n if (controlledValue !== undefined) {\r\n setInternalValue(toArray(controlledValue))\r\n }\r\n }, [controlledValue])\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (e: MouseEvent) => {\r\n if (wrapperRef.current && !wrapperRef.current.contains(e.target as Node)) {\r\n setOpen(false)\r\n setSearchValue('')\r\n }\r\n }\r\n document.addEventListener('mousedown', handleClickOutside)\r\n return () => document.removeEventListener('mousedown', handleClickOutside)\r\n }, [])\r\n\r\n useEffect(() => {\r\n if (open && showSearch && searchRef.current) {\r\n searchRef.current.focus()\r\n }\r\n }, [open, showSearch])\r\n\r\n const defaultFilter = useCallback((input: string, node: TreeNodeData): boolean => {\r\n const title = String(node.title ?? node.key).toLowerCase()\r\n return title.includes(input.toLowerCase())\r\n }, [])\r\n\r\n const filterFn = filterTreeNode ?? defaultFilter\r\n\r\n const filteredTreeData = useMemo(() => {\r\n if (!searchValue) return treeData\r\n return filterTreeKeepMatches(treeData, (node) => filterFn(searchValue, node))\r\n }, [treeData, searchValue, filterFn])\r\n\r\n const filteredExpandedKeys = useMemo(() => {\r\n if (!searchValue) return undefined\r\n return collectAllKeys(filteredTreeData)\r\n }, [searchValue, filteredTreeData])\r\n\r\n const fireChange = useCallback(\r\n (keys: TreeKey[], triggerNode: TreeNodeData) => {\r\n setInternalValue(keys)\r\n const labels = keys.map((k) => getNodeLabel(findNode(treeData, k)))\r\n if (onChange) {\r\n const result = isMultiple ? keys : keys[0]\r\n onChange(result as TreeKey & TreeKey[], labels, { triggerNode })\r\n }\r\n },\r\n [treeData, onChange, isMultiple],\r\n )\r\n\r\n const handleTreeSelect = useCallback(\r\n (\r\n _selectedKeys: TreeKey[],\r\n info: { selected: boolean; node: TreeNodeData; selectedNodes: TreeNodeData[] },\r\n ) => {\r\n if (treeCheckable) return\r\n const node = info.node\r\n if (isMultiple) {\r\n const newKeys = info.selected\r\n ? [...currentValue, node.key]\r\n : currentValue.filter((k) => k !== node.key)\r\n fireChange(newKeys, node)\r\n } else {\r\n fireChange([node.key], node)\r\n setOpen(false)\r\n setSearchValue('')\r\n }\r\n },\r\n [treeCheckable, isMultiple, currentValue, fireChange],\r\n )\r\n\r\n const handleTreeCheck = useCallback(\r\n (\r\n checkedKeys: TreeKey[],\r\n info: {\r\n checked: boolean\r\n node: TreeNodeData\r\n checkedNodes: TreeNodeData[]\r\n halfCheckedKeys: TreeKey[]\r\n },\r\n ) => {\r\n const displayed = applyStrategy(checkedKeys, treeData, showCheckedStrategy)\r\n fireChange(displayed, info.node)\r\n },\r\n [treeData, showCheckedStrategy, fireChange],\r\n )\r\n\r\n const handleRemoveTag = useCallback(\r\n (key: TreeKey, e: React.MouseEvent) => {\r\n e.stopPropagation()\r\n if (disabled) return\r\n const node = findNode(treeData, key) ?? ({ key } as TreeNodeData)\r\n const newKeys = currentValue.filter((k) => k !== key)\r\n fireChange(newKeys, node)\r\n },\r\n [disabled, treeData, currentValue, fireChange],\r\n )\r\n\r\n const handleClear = useCallback(\r\n (e: React.MouseEvent) => {\r\n e.stopPropagation()\r\n if (disabled) return\r\n const node = treeData[0] ?? ({ key: '' } as TreeNodeData)\r\n fireChange([], node)\r\n setSearchValue('')\r\n },\r\n [disabled, treeData, fireChange],\r\n )\r\n\r\n const handleSearchChange = useCallback(\r\n (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const val = e.target.value\r\n setSearchValue(val)\r\n onSearch?.(val)\r\n },\r\n [onSearch],\r\n )\r\n\r\n const handleTriggerClick = useCallback(() => {\r\n if (disabled) return\r\n setOpen((prev) => !prev)\r\n }, [disabled])\r\n\r\n const displayedValues = useMemo(() => {\r\n if (!isMultiple) return currentValue\r\n return applyStrategy(currentValue, treeData, showCheckedStrategy)\r\n }, [isMultiple, currentValue, treeData, showCheckedStrategy])\r\n\r\n const treeCheckedKeys = useMemo(() => {\r\n if (!treeCheckable) return undefined\r\n return currentValue\r\n }, [treeCheckable, currentValue])\r\n\r\n const treeSelectedKeys = useMemo(() => {\r\n if (treeCheckable) return undefined\r\n return currentValue\r\n }, [treeCheckable, currentValue])\r\n\r\n // Unstyled render\r\n if (unstyled) {\r\n return (\r\n <div ref={wrapperRef} className={className} style={style}>\r\n <div onClick={handleTriggerClick}>\r\n {displayedValues.length === 0 && <span>{placeholder}</span>}\r\n {!isMultiple && displayedValues.length > 0 && (\r\n <span>{getNodeLabel(findNode(treeData, displayedValues[0]))}</span>\r\n )}\r\n {isMultiple &&\r\n displayedValues.map((key) => (\r\n <span key={String(key)}>\r\n {getNodeLabel(findNode(treeData, key))}\r\n <span onClick={(e) => handleRemoveTag(key, e)}>&times;</span>\r\n </span>\r\n ))}\r\n </div>\r\n {open && (\r\n <div>\r\n {showSearch && (\r\n <input\r\n ref={searchRef}\r\n value={searchValue}\r\n onChange={handleSearchChange}\r\n placeholder={searchPlaceholder}\r\n />\r\n )}\r\n <Tree\r\n treeData={filteredTreeData}\r\n fieldNames={fieldNames}\r\n checkable={treeCheckable}\r\n checkStrictly={treeCheckStrictly}\r\n checkedKeys={treeCheckedKeys}\r\n selectedKeys={treeSelectedKeys}\r\n multiple={isMultiple}\r\n defaultExpandAll={treeDefaultExpandAll}\r\n defaultExpandedKeys={treeDefaultExpandedKeys}\r\n expandedKeys={filteredExpandedKeys}\r\n showLine={treeLine}\r\n onSelect={handleTreeSelect}\r\n onCheck={handleTreeCheck}\r\n unstyled\r\n />\r\n </div>\r\n )}\r\n </div>\r\n )\r\n }\r\n\r\n // Styled render\r\n const wrapperCls = [\r\n 'sg-treeselect',\r\n `sg-treeselect-${size}`,\r\n open ? 'sg-treeselect-open' : '',\r\n disabled ? 'sg-treeselect-disabled' : '',\r\n isMultiple ? 'sg-treeselect-multiple' : '',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n const visibleTags =\r\n maxTagCount !== undefined && isMultiple\r\n ? displayedValues.slice(0, maxTagCount)\r\n : displayedValues\r\n\r\n const hiddenCount =\r\n maxTagCount !== undefined && isMultiple ? Math.max(0, displayedValues.length - maxTagCount) : 0\r\n\r\n return (\r\n <div className={wrapperCls} style={style} ref={wrapperRef}>\r\n <div className=\"sg-treeselect-selector\" onClick={handleTriggerClick}>\r\n <div className=\"sg-treeselect-selection-wrap\">\r\n {displayedValues.length === 0 && !searchValue && (\r\n <span className=\"sg-treeselect-placeholder\">{placeholder}</span>\r\n )}\r\n\r\n {!isMultiple && displayedValues.length > 0 && !searchValue && (\r\n <span className=\"sg-treeselect-selection-item\">\r\n {getNodeLabel(findNode(treeData, displayedValues[0]))}\r\n </span>\r\n )}\r\n\r\n {isMultiple &&\r\n visibleTags.map((key) => (\r\n <span key={String(key)} className=\"sg-treeselect-tag\">\r\n <span className=\"sg-treeselect-tag-label\">\r\n {getNodeLabel(findNode(treeData, key))}\r\n </span>\r\n <span className=\"sg-treeselect-tag-close\" onClick={(e) => handleRemoveTag(key, e)}>\r\n &times;\r\n </span>\r\n </span>\r\n ))}\r\n\r\n {hiddenCount > 0 && (\r\n <span className=\"sg-treeselect-tag sg-treeselect-tag-rest\">+{hiddenCount}...</span>\r\n )}\r\n\r\n {showSearch && open && (\r\n <input\r\n ref={searchRef}\r\n className=\"sg-treeselect-search-input\"\r\n value={searchValue}\r\n onChange={handleSearchChange}\r\n placeholder={displayedValues.length === 0 ? '' : ''}\r\n />\r\n )}\r\n </div>\r\n\r\n <div className=\"sg-treeselect-actions\">\r\n {allowClear && displayedValues.length > 0 && (\r\n <span className=\"sg-treeselect-clear\" onClick={handleClear}>\r\n &times;\r\n </span>\r\n )}\r\n <span className=\"sg-treeselect-arrow\">{open ? '\\u25B2' : '\\u25BC'}</span>\r\n </div>\r\n </div>\r\n\r\n {open && (\r\n <div className=\"sg-treeselect-dropdown\" style={dropdownStyle}>\r\n {filteredTreeData.length === 0 ? (\r\n <div className=\"sg-treeselect-empty\">{noMatchesText}</div>\r\n ) : (\r\n <Tree\r\n treeData={filteredTreeData}\r\n fieldNames={fieldNames}\r\n checkable={treeCheckable}\r\n checkStrictly={treeCheckStrictly}\r\n checkedKeys={treeCheckedKeys}\r\n selectedKeys={treeSelectedKeys}\r\n multiple={isMultiple}\r\n defaultExpandAll={treeDefaultExpandAll}\r\n defaultExpandedKeys={treeDefaultExpandedKeys}\r\n expandedKeys={filteredExpandedKeys}\r\n showLine={treeLine}\r\n onSelect={handleTreeSelect}\r\n onCheck={handleTreeCheck}\r\n />\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n"],"mappings":"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","names":["import_react","import_react","import_react","import_react","import_react","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime"]}