@djangocfg/ui-tools 2.1.417 → 2.1.418
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/audio-player/index.cjs +1 -2
- package/dist/audio-player/index.cjs.map +1 -1
- package/dist/audio-player/index.d.cts +3 -11
- package/dist/audio-player/index.d.ts +3 -11
- package/dist/audio-player/index.mjs +1 -2
- package/dist/audio-player/index.mjs.map +1 -1
- package/dist/tree/index.cjs +0 -3
- package/dist/tree/index.cjs.map +1 -1
- package/dist/tree/index.mjs +0 -3
- package/dist/tree/index.mjs.map +1 -1
- package/package.json +30 -14
- package/src/tools/data/Tree/components/TreeRow.tsx +0 -11
- package/src/tools/forms/CodeEditor/components/Editor.tsx +19 -0
- package/src/tools/forms/CodeEditor/types/index.ts +7 -0
- package/src/tools/forms/MarkdownEditor/MarkdownEditor.tsx +40 -0
- package/src/tools/forms/MarkdownEditor/styles.css +174 -21
- package/src/tools/forms/NotionEditor/CustomKeymap.ts +48 -0
- package/src/tools/forms/NotionEditor/LinkDialog.tsx +133 -0
- package/src/tools/forms/NotionEditor/NotionEditor.tsx +304 -0
- package/src/tools/forms/NotionEditor/SlashExtension.ts +32 -0
- package/src/tools/forms/NotionEditor/SlashList.tsx +136 -0
- package/src/tools/forms/NotionEditor/TaskItemView.tsx +41 -0
- package/src/tools/forms/NotionEditor/createSlashSuggestion.ts +121 -0
- package/src/tools/forms/NotionEditor/extensions.ts +105 -0
- package/src/tools/forms/NotionEditor/index.ts +1 -0
- package/src/tools/forms/NotionEditor/lazy.tsx +44 -0
- package/src/tools/forms/NotionEditor/slashItems.ts +159 -0
- package/src/tools/forms/NotionEditor/styles.css +478 -0
- package/src/tools/forms/NotionEditor/types.ts +28 -0
- package/src/tools/media/AudioPlayer/PlayerShell.tsx +3 -11
- package/src/tools/media/AudioPlayer/types.ts +4 -11
- package/src/tools/media/ImageViewer/components/ImageViewer.tsx +8 -0
- package/src/tools/media/ImageViewer/types.ts +4 -0
- package/src/tools/media/VideoPlayer/VideoPlayer.tsx +20 -1
- package/src/tools/media/VideoPlayer/types.ts +4 -0
package/dist/tree/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/tools/data/Tree/data/childCache.ts","../../src/tools/data/Tree/data/flatten.ts","../../src/tools/data/Tree/data/persist.ts","../../src/tools/data/Tree/data/appearance.ts","../../src/tools/data/Tree/types/labels.ts","../../src/tools/data/Tree/context/state/reducer.ts","../../src/tools/data/Tree/context/state/initial.ts","../../src/tools/data/Tree/context/async-children/collect-ids.ts","../../src/tools/data/Tree/context/async-children/use-async-children.ts","../../src/tools/data/Tree/context/expansion/use-expansion.ts","../../src/tools/data/Tree/data/selection.ts","../../src/tools/data/Tree/context/selection/use-selection.ts","../../src/tools/data/Tree/context/rename/use-rename.ts","../../src/tools/data/Tree/context/clipboard/use-clipboard.ts","../../src/tools/data/Tree/context/menu/builtin-actions.ts","../../src/tools/data/Tree/context/menu/use-resolved-menu.ts","../../src/tools/data/Tree/context/menu/render.tsx","../../src/tools/data/Tree/data/dnd.ts","../../src/tools/data/Tree/context/dnd/use-dnd.ts","../../src/tools/data/Tree/context/persist/use-persist-sync.ts","../../src/tools/data/Tree/context/TreeContext.tsx","../../src/tools/data/Tree/TreeDndProvider.tsx","../../src/tools/data/Tree/components/TreeChevron.tsx","../../src/tools/data/Tree/components/TreeDropIndicator.tsx","../../src/tools/data/Tree/components/TreeIcon.tsx","../../src/tools/data/Tree/components/TreeIndentGuides.tsx","../../src/tools/data/Tree/components/TreeLabel.tsx","../../src/tools/data/Tree/data/renameUtils.ts","../../src/tools/data/Tree/components/TreeRenameInput.tsx","../../src/tools/data/Tree/components/TreeRow.tsx","../../src/tools/data/Tree/components/TreeEmpty.tsx","../../src/tools/data/Tree/components/TreeContent.tsx","../../src/tools/data/Tree/components/TreeEmptyArea.tsx","../../src/tools/data/Tree/context/hooks.ts","../../src/tools/data/Tree/components/TreeSearchInput.tsx","../../src/tools/data/Tree/hooks/keyboard/arrow-nav.ts","../../src/tools/data/Tree/hooks/keyboard/expand-collapse.ts","../../src/tools/data/Tree/hooks/keyboard/activation.ts","../../src/tools/data/Tree/hooks/keyboard/use-tree-keyboard.ts","../../src/tools/data/Tree/hooks/type-ahead/match-prefix.ts","../../src/tools/data/Tree/hooks/type-ahead/use-tree-type-ahead.ts","../../src/tools/data/Tree/hooks/finder-hotkeys/build-ctx.ts","../../src/tools/data/Tree/hooks/finder-hotkeys/use-tree-finder-hotkeys.ts","../../src/tools/data/Tree/TreeRoot.tsx","../../src/tools/data/Tree/FinderTree.tsx","../../src/tools/data/Tree/components/TreeSkeleton.tsx","../../src/tools/data/Tree/components/TreeError.tsx","../../src/tools/data/Tree/data/createDemoTree.ts"],"names":["useCallback","useRef","getDialog","useMemo","useEffect","jsx","current","cn","memo","dot","useState","jsxs","Fragment","useDroppable","ContextMenu","ContextMenuTrigger","ContextMenuContent","ContextMenuSeparator","ContextMenuItem","ContextMenuShortcut","useHotkey"],"mappings":"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","file":"index.mjs","sourcesContent":["'use client';\n\nimport type { TreeItemId, TreeNode } from '../types';\n\nexport type ChildEntryStatus = 'idle' | 'loading' | 'loaded' | 'error';\n\nexport interface ChildEntry<T> {\n status: ChildEntryStatus;\n children: TreeNode<T>[];\n error?: string;\n}\n\nexport type ChildCache<T> = Map<TreeItemId, ChildEntry<T>>;\n\nexport const createChildCache = <T>(): ChildCache<T> => new Map();\n\nexport const getEntry = <T>(\n cache: ChildCache<T>,\n id: TreeItemId,\n): ChildEntry<T> | undefined => cache.get(id);\n\n/**\n * Resolve a node's children for the current render.\n *\n * - If the node carries inline `children`, those win (no async fetch).\n * - Otherwise we look in the cache.\n *\n * Returns `null` when nothing is loaded yet (caller may show a skeleton).\n */\nexport const resolveChildren = <T>(\n cache: ChildCache<T>,\n node: TreeNode<T>,\n): { children: TreeNode<T>[] | null; status: ChildEntryStatus; error?: string } => {\n if (Array.isArray(node.children)) {\n return { children: node.children, status: 'loaded' };\n }\n const entry = cache.get(node.id);\n if (!entry) return { children: null, status: 'idle' };\n if (entry.status === 'loaded') {\n return { children: entry.children, status: 'loaded' };\n }\n return { children: null, status: entry.status, error: entry.error };\n};\n","'use client';\n\nimport type { FlatRow, TreeItemId, TreeNode } from '../types';\nimport { resolveChildren, type ChildCache } from './childCache';\n\nexport interface FlattenInput<T> {\n roots: TreeNode<T>[];\n expandedIds: ReadonlySet<TreeItemId>;\n cache: ChildCache<T>;\n /** Optional predicate. Nodes returning `false` (and their descendants) are excluded. */\n filterNode?: (node: TreeNode<T>) => boolean;\n}\n\nconst isNodeFolder = <T>(node: TreeNode<T>): boolean => {\n if (typeof node.isFolder === 'boolean') return node.isFolder;\n return Array.isArray(node.children);\n};\n\n/**\n * Walk the tree top-to-bottom and produce a flat list of visible rows.\n *\n * Visibility rule: a child row appears only when every ancestor is in\n * `expandedIds`. The output is ordered exactly as it should render,\n * which keeps keyboard navigation (next/prev row) trivial.\n */\nexport function flattenTree<T>({\n roots,\n expandedIds,\n cache,\n filterNode,\n}: FlattenInput<T>): FlatRow<T>[] {\n const out: FlatRow<T>[] = [];\n\n const walk = (nodes: TreeNode<T>[], level: number, parentId: TreeItemId | null) => {\n // Visible siblings only — `aria-setsize`/`posinset` must ignore filtered nodes.\n const visible = filterNode ? nodes.filter(filterNode) : nodes;\n const setSize = visible.length;\n\n visible.forEach((node, index) => {\n const isFolder = isNodeFolder(node);\n const isExpanded = expandedIds.has(node.id);\n const resolved = isFolder\n ? resolveChildren(cache, node)\n : { children: [], status: 'loaded' as const };\n\n out.push({\n node,\n level,\n parentId,\n isFolder,\n isExpanded,\n isLoading: resolved.status === 'loading',\n hasError: resolved.status === 'error',\n posInSet: index + 1,\n setSize,\n });\n\n if (isFolder && isExpanded && resolved.children) {\n walk(resolved.children, level + 1, node.id);\n }\n });\n };\n\n walk(roots, 0, null);\n return out;\n}\n","'use client';\n\nimport type { TreeItemId } from '../types';\n\nconst KEY_PREFIX = '@djangocfg/tree:';\nconst VERSION = 1;\n\nexport interface PersistedTreeState {\n expandedItems: TreeItemId[];\n selectedItems: TreeItemId[];\n}\n\ninterface PersistedShape extends PersistedTreeState {\n version: number;\n}\n\nfunction safeStorage(): Storage | null {\n if (typeof window === 'undefined') return null;\n try {\n return window.localStorage;\n } catch {\n return null;\n }\n}\n\nexport function loadTreeState(key: string): PersistedTreeState | null {\n const storage = safeStorage();\n if (!storage) return null;\n try {\n const raw = storage.getItem(KEY_PREFIX + key);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as Partial<PersistedShape>;\n if (parsed.version !== VERSION) return null;\n return {\n expandedItems: Array.isArray(parsed.expandedItems) ? parsed.expandedItems : [],\n selectedItems: Array.isArray(parsed.selectedItems) ? parsed.selectedItems : [],\n };\n } catch {\n return null;\n }\n}\n\nexport function saveTreeState(key: string, state: PersistedTreeState): void {\n const storage = safeStorage();\n if (!storage) return;\n try {\n const payload: PersistedShape = { ...state, version: VERSION };\n storage.setItem(KEY_PREFIX + key, JSON.stringify(payload));\n } catch {\n /* quota / serialization — best-effort persistence */\n }\n}\n\nexport function clearTreeState(key: string): void {\n const storage = safeStorage();\n if (!storage) return;\n try {\n storage.removeItem(KEY_PREFIX + key);\n } catch {\n /* ignore */\n }\n}\n","'use client';\n\nimport type { CSSProperties } from 'react';\n\nexport type TreeDensity = 'compact' | 'cozy' | 'comfortable';\nexport type TreeAccentIntensity = 'subtle' | 'default' | 'strong';\nexport type TreeRadius = 'none' | 'sm' | 'md';\n\n/**\n * Cosmetic configuration. Every field is optional; missing values fall\n * back to the `cozy` preset (a comfortable VSCode-Explorer-like density).\n *\n * Customize the look without re-implementing slots.\n */\nexport interface TreeAppearance {\n /** Built-in size preset. Default: `'cozy'`. */\n density?: TreeDensity;\n /** Override row height in px (wins over density). */\n rowHeight?: number;\n /** Override icon + chevron size in px (wins over density). */\n iconSize?: number;\n /** Lucide stroke width for icon + chevron. Default: 1.5. */\n iconStrokeWidth?: number;\n /** Override label font size in px (wins over density). */\n fontSize?: number;\n /** Pixels between chevron / icon / label. Default depends on density. */\n gap?: number;\n /** Pixels between nesting levels. Default: 16. */\n indent?: number;\n /** Hover / selected highlight intensity. Default: `'default'`. */\n accent?: TreeAccentIntensity;\n /** Row corner radius. Default: `'sm'`. */\n radius?: TreeRadius;\n /** Indent-guide line opacity (0..1). Default: 0.4. */\n indentGuideOpacity?: number;\n /**\n * Show a 2px primary-tinted bar on the left of the selected row.\n * Mimics the VSCode active-tab indicator. Default: `true`.\n */\n showActiveIndicator?: boolean;\n}\n\nexport interface ResolvedAppearance {\n density: TreeDensity;\n rowHeight: number;\n iconSize: number;\n iconStrokeWidth: number;\n fontSize: number;\n gap: number;\n indent: number;\n accent: TreeAccentIntensity;\n radius: TreeRadius;\n indentGuideOpacity: number;\n showActiveIndicator: boolean;\n}\n\nconst DENSITY_PRESETS: Record<\n TreeDensity,\n Pick<ResolvedAppearance, 'rowHeight' | 'iconSize' | 'fontSize' | 'gap'>\n> = {\n compact: { rowHeight: 24, iconSize: 14, fontSize: 13, gap: 6 },\n cozy: { rowHeight: 28, iconSize: 16, fontSize: 13, gap: 8 },\n comfortable: { rowHeight: 32, iconSize: 16, fontSize: 14, gap: 8 },\n};\n\nexport const DEFAULT_TREE_APPEARANCE: ResolvedAppearance = {\n density: 'cozy',\n ...DENSITY_PRESETS.cozy,\n iconStrokeWidth: 1.5,\n indent: 16,\n accent: 'default',\n radius: 'sm',\n indentGuideOpacity: 0.4,\n showActiveIndicator: true,\n};\n\n/**\n * Merge a partial appearance with the default + density preset.\n *\n * Explicit numeric overrides (e.g. `rowHeight`) win over the density preset.\n */\nexport function resolveAppearance(\n input?: TreeAppearance,\n /** Outer `indent` prop (kept on TreeRoot for back-compat). */\n outerIndent?: number,\n): ResolvedAppearance {\n if (!input && outerIndent === undefined) return DEFAULT_TREE_APPEARANCE;\n\n const density: TreeDensity = input?.density ?? 'cozy';\n const preset = DENSITY_PRESETS[density];\n\n return {\n density,\n rowHeight: input?.rowHeight ?? preset.rowHeight,\n iconSize: input?.iconSize ?? preset.iconSize,\n iconStrokeWidth: input?.iconStrokeWidth ?? DEFAULT_TREE_APPEARANCE.iconStrokeWidth,\n fontSize: input?.fontSize ?? preset.fontSize,\n gap: input?.gap ?? preset.gap,\n indent: input?.indent ?? outerIndent ?? DEFAULT_TREE_APPEARANCE.indent,\n accent: input?.accent ?? DEFAULT_TREE_APPEARANCE.accent,\n radius: input?.radius ?? DEFAULT_TREE_APPEARANCE.radius,\n indentGuideOpacity:\n input?.indentGuideOpacity ?? DEFAULT_TREE_APPEARANCE.indentGuideOpacity,\n showActiveIndicator:\n input?.showActiveIndicator ?? DEFAULT_TREE_APPEARANCE.showActiveIndicator,\n };\n}\n\n/**\n * Build the `style` object that exposes the resolved appearance to any\n * descendant via CSS variables. Set on `<TreeRoot>`'s outer div.\n */\nexport function appearanceToStyle(a: ResolvedAppearance): CSSProperties {\n return {\n ['--tree-row-height' as string]: `${a.rowHeight}px`,\n ['--tree-icon-size' as string]: `${a.iconSize}px`,\n ['--tree-icon-stroke' as string]: a.iconStrokeWidth,\n ['--tree-font-size' as string]: `${a.fontSize}px`,\n ['--tree-gap' as string]: `${a.gap}px`,\n ['--tree-indent' as string]: `${a.indent}px`,\n ['--tree-guide-opacity' as string]: a.indentGuideOpacity,\n };\n}\n\nconst RADIUS_CLASS: Record<TreeRadius, string> = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n};\nexport function radiusClass(a: ResolvedAppearance) {\n return RADIUS_CLASS[a.radius];\n}\n\n/**\n * VSCode-style row state classes.\n *\n * - hover: subtle neutral wash\n * - focused (keyboard nav, not yet selected): slightly stronger neutral\n * - selected (tree NOT focused): muted neutral block\n * - selected + tree focused-within: primary-tinted block + colored text\n *\n * Intensity scales with `appearance.accent`.\n */\nconst HOVER: Record<TreeAccentIntensity, string> = {\n subtle: 'hover:bg-foreground/[.03]',\n default: 'hover:bg-foreground/[.06]',\n strong: 'hover:bg-foreground/[.09]',\n};\nconst FOCUSED_NOT_SELECTED: Record<TreeAccentIntensity, string> = {\n subtle: 'data-[focused=true]:bg-foreground/[.05]',\n default: 'data-[focused=true]:bg-foreground/[.08]',\n strong: 'data-[focused=true]:bg-foreground/[.12]',\n};\nconst SELECTED_INACTIVE: Record<TreeAccentIntensity, string> = {\n subtle: 'data-[selected=true]:bg-foreground/[.06]',\n default: 'data-[selected=true]:bg-foreground/[.10]',\n strong: 'data-[selected=true]:bg-foreground/[.14]',\n};\nconst SELECTED_ACTIVE: Record<TreeAccentIntensity, string> = {\n subtle:\n 'data-[selected=true]:group-focus-within/tree:bg-primary/10 data-[selected=true]:group-focus-within/tree:text-primary',\n default:\n 'data-[selected=true]:group-focus-within/tree:bg-primary/15 data-[selected=true]:group-focus-within/tree:text-primary',\n strong:\n 'data-[selected=true]:group-focus-within/tree:bg-primary/25 data-[selected=true]:group-focus-within/tree:text-primary',\n};\n\nexport function rowStateClasses(a: ResolvedAppearance) {\n return [\n HOVER[a.accent],\n FOCUSED_NOT_SELECTED[a.accent],\n SELECTED_INACTIVE[a.accent],\n SELECTED_ACTIVE[a.accent],\n ].join(' ');\n}\n","'use client';\n\nexport interface TreeLabels {\n loading: string;\n empty: string;\n error: string;\n searchPlaceholder: string;\n searchMatches: (count: number) => string;\n ariaLabel: string;\n\n // ---- CRUD flow copy (used by built-in adapter actions + dialogs) ----\n\n /** Default context-menu item labels. */\n actionOpen: string;\n actionRename: string;\n actionDuplicate: string;\n actionCut: string;\n actionCopy: string;\n actionPaste: string;\n actionDelete: string;\n actionNewFile: string;\n actionNewFolder: string;\n\n /** Delete confirmation dialog. */\n confirmDeleteTitle: (count: number) => string;\n confirmDeleteMessage: (names: string[]) => string;\n confirmDeleteOk: string;\n confirmDeleteCancel: string;\n\n /** New file prompt. */\n newFileTitle: string;\n newFileMessage: string;\n newFilePlaceholder: string;\n newFileDefault: string;\n\n /** New folder prompt. */\n newFolderTitle: string;\n newFolderMessage: string;\n newFolderPlaceholder: string;\n newFolderDefault: string;\n\n /** Rename prompt (used when inline rename is unavailable / disabled). */\n renameTitle: string;\n renameMessage: string;\n\n /** Name validation. */\n invalidNameEmpty: string;\n\n /** Suffix used by the default `duplicate` flow when the consumer's adapter\n * needs a hint name. Receives the source name. */\n duplicateSuffix: (name: string) => string;\n}\n\nexport const DEFAULT_TREE_LABELS: TreeLabels = {\n loading: 'Loading…',\n empty: 'Nothing to show',\n error: 'Failed to load',\n searchPlaceholder: 'Search…',\n searchMatches: (n) => `${n} match${n === 1 ? '' : 'es'}`,\n ariaLabel: 'Tree',\n\n actionOpen: 'Open',\n actionRename: 'Rename',\n actionDuplicate: 'Duplicate',\n actionCut: 'Cut',\n actionCopy: 'Copy',\n actionPaste: 'Paste',\n actionDelete: 'Delete',\n actionNewFile: 'New file',\n actionNewFolder: 'New folder',\n\n confirmDeleteTitle: (n) =>\n n === 1 ? 'Delete item?' : `Delete ${n} items?`,\n confirmDeleteMessage: (names) =>\n names.length === 1\n ? `\"${names[0]}\" will be removed. This action cannot be undone.`\n : `${names.length} items will be removed. This action cannot be undone.`,\n confirmDeleteOk: 'Delete',\n confirmDeleteCancel: 'Cancel',\n\n newFileTitle: 'New file',\n newFileMessage: 'File name',\n newFilePlaceholder: 'untitled.txt',\n newFileDefault: 'untitled.txt',\n\n newFolderTitle: 'New folder',\n newFolderMessage: 'Folder name',\n newFolderPlaceholder: 'untitled folder',\n newFolderDefault: 'untitled folder',\n\n renameTitle: 'Rename',\n renameMessage: 'New name',\n\n invalidNameEmpty: 'Name cannot be empty',\n\n duplicateSuffix: (name) => `${name} copy`,\n};\n","'use client';\n\nimport type { Action, State } from './types';\n\n/**\n * Pure reducer for `<TreeProvider>`. Intentionally small — most domain\n * logic (Finder selection rules, async cache, persistence) lives in\n * dedicated hooks under `context/<feature>/` and only dispatches one of\n * these actions when the result needs to land in React state.\n */\nexport function reducer(state: State, action: Action): State {\n switch (action.type) {\n case 'expand': {\n if (state.expanded.has(action.id)) return state;\n const next = new Set(state.expanded);\n next.add(action.id);\n return { ...state, expanded: next };\n }\n case 'collapse': {\n if (!state.expanded.has(action.id)) return state;\n const next = new Set(state.expanded);\n next.delete(action.id);\n return { ...state, expanded: next };\n }\n case 'toggle': {\n const next = new Set(state.expanded);\n if (next.has(action.id)) next.delete(action.id);\n else next.add(action.id);\n return { ...state, expanded: next };\n }\n case 'set-expanded':\n return { ...state, expanded: new Set(action.ids) };\n case 'select': {\n if (action.mode === 'none') return state;\n if (action.mode === 'single') {\n return {\n ...state,\n selected: new Set([action.id]),\n anchor: action.id,\n focused: action.id,\n };\n }\n const next = new Set(state.selected);\n if (next.has(action.id)) next.delete(action.id);\n else next.add(action.id);\n return { ...state, selected: next, anchor: action.id, focused: action.id };\n }\n case 'select-many':\n return { ...state, selected: new Set(action.ids) };\n case 'clear-selection':\n return { ...state, selected: new Set(), anchor: null };\n case 'selection-replace':\n return {\n ...state,\n selected: new Set(action.selected),\n anchor: action.anchor,\n focused: action.focused,\n };\n case 'set-anchor':\n return { ...state, anchor: action.id };\n case 'focus':\n return { ...state, focused: action.id };\n case 'set-query':\n return { ...state, query: action.q };\n case 'start-rename':\n return { ...state, renaming: action.id };\n case 'stop-rename':\n return state.renaming === null ? state : { ...state, renaming: null };\n case 'clipboard-set':\n return { ...state, clipboard: action.payload };\n case 'cache-tick':\n return { ...state, cacheTick: state.cacheTick + 1 };\n default:\n return state;\n }\n}\n","'use client';\n\nimport type { PersistedTreeState } from '../../data/persist';\nimport type { TreeItemId } from '../../types';\nimport type { State } from './types';\n\nexport interface CreateInitialStateInput {\n persisted: PersistedTreeState | null;\n initialExpandedIds?: TreeItemId[];\n initialSelectedIds?: TreeItemId[];\n persistSelection: boolean;\n}\n\n/**\n * Build the reducer's initial state from persistence + initial props.\n * Anchor is set to the first restored selection (if any) so a hard\n * reload doesn't break shift-extend.\n */\nexport function createInitialState(input: CreateInitialStateInput): State {\n const { persisted, initialExpandedIds, initialSelectedIds, persistSelection } =\n input;\n const initialSelected = new Set(\n (persistSelection ? persisted?.selectedItems : undefined) ??\n initialSelectedIds ??\n [],\n );\n const initialAnchor: TreeItemId | null =\n initialSelected.size > 0\n ? (initialSelected.values().next().value as TreeItemId)\n : null;\n return {\n expanded: new Set(persisted?.expandedItems ?? initialExpandedIds ?? []),\n selected: initialSelected,\n anchor: initialAnchor,\n focused: null,\n query: '',\n renaming: null,\n clipboard: null,\n cacheTick: 0,\n };\n}\n","'use client';\n\nimport type { ChildCache } from '../../data/childCache';\nimport type { TreeItemId, TreeNode } from '../../types';\n\n/**\n * Walk `roots` + cached async children and push every *folder* id into\n * `out`. Used by `expandAll`.\n *\n * Leaves are intentionally not collected — expanding a leaf is a no-op.\n */\nexport function collectAllFolderIds<T>(\n roots: TreeNode<T>[],\n cache: ChildCache<T>,\n out: TreeItemId[],\n): void {\n for (const node of roots) {\n if (Array.isArray(node.children)) {\n out.push(node.id);\n collectAllFolderIds(node.children, cache, out);\n } else if (node.isFolder) {\n out.push(node.id);\n const entry = cache.get(node.id);\n if (entry?.children) collectAllFolderIds(entry.children, cache, out);\n }\n }\n}\n","'use client';\n\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\n\nimport { createChildCache, type ChildCache } from '../../data/childCache';\nimport type {\n TreeItemId,\n TreeLoadChildren,\n TreeNode,\n} from '../../types';\nimport { collectAllFolderIds } from './collect-ids';\n\nexport interface UseAsyncChildrenOptions<T> {\n data: TreeNode<T>[];\n loadChildren?: TreeLoadChildren<T>;\n /** Current set of expanded ids — controls which async fetches fire. */\n expanded: ReadonlySet<TreeItemId>;\n /** Bumps every time the cache mutates — invalidates downstream memos. */\n cacheTick: number;\n /** Dispatch into the reducer (used to bump `cacheTick`). */\n bumpCacheTick: () => void;\n}\n\nexport interface UseAsyncChildrenReturn<T> {\n /** Live async-children cache (mutable ref, not React state). */\n cache: ChildCache<T>;\n /** Id → node lookup across the root tree + cached async children. */\n nodeById: Map<TreeItemId, TreeNode<T>>;\n /** Fetch a single folder's children (deduped, idempotent). */\n fetchChildren: (node: TreeNode<T>) => Promise<void> | void;\n /** Drop one node's cache entry and refetch. */\n refresh: (id: TreeItemId) => Promise<void>;\n /** Clear the entire cache and refetch every currently-expanded folder. */\n refreshAll: () => Promise<void>;\n /** Collect every folder id known to Tree (root + cached). For `expandAll`. */\n collectFolderIds: () => TreeItemId[];\n}\n\n/**\n * Manage async children: a long-lived cache (in a ref), dedup-ed\n * `loadChildren` calls, and a `nodeById` map that walks both inline\n * children and cached async ones. The cache lives outside reducer state\n * because mutating a Map per render is cheaper than spreading it; we\n * trigger downstream re-renders via the `cacheTick` counter.\n */\nexport function useAsyncChildren<T>({\n data,\n loadChildren,\n expanded,\n cacheTick,\n bumpCacheTick,\n}: UseAsyncChildrenOptions<T>): UseAsyncChildrenReturn<T> {\n // The cache survives provider re-renders and async work.\n const cacheRef = useRef<ChildCache<T>>(createChildCache<T>());\n const inflightRef = useRef<Map<TreeItemId, Promise<void>>>(new Map());\n\n const fetchChildren = useCallback(\n async (node: TreeNode<T>) => {\n if (!loadChildren) return;\n if (Array.isArray(node.children)) return;\n const existing = cacheRef.current.get(node.id);\n if (existing?.status === 'loaded' || existing?.status === 'loading') return;\n const inflight = inflightRef.current.get(node.id);\n if (inflight) return inflight;\n\n cacheRef.current.set(node.id, { status: 'loading', children: [] });\n bumpCacheTick();\n\n const promise = (async () => {\n try {\n const children = await loadChildren(node);\n cacheRef.current.set(node.id, { status: 'loaded', children });\n } catch (err) {\n cacheRef.current.set(node.id, {\n status: 'error',\n children: [],\n error: err instanceof Error ? err.message : String(err),\n });\n } finally {\n inflightRef.current.delete(node.id);\n bumpCacheTick();\n }\n })();\n\n inflightRef.current.set(node.id, promise);\n return promise;\n },\n [loadChildren, bumpCacheTick],\n );\n\n // Build a quick id → node map across roots + cached async children.\n // Re-runs whenever the cache mutates (cacheTick) or `data` changes.\n const nodeById = useMemo(() => {\n const map = new Map<TreeItemId, TreeNode<T>>();\n const walk = (nodes: TreeNode<T>[]) => {\n for (const n of nodes) {\n map.set(n.id, n);\n if (Array.isArray(n.children)) walk(n.children);\n else {\n const entry = cacheRef.current.get(n.id);\n if (entry?.children) walk(entry.children);\n }\n }\n };\n walk(data);\n return map;\n }, [data, cacheTick]);\n\n // Auto-fetch every expanded folder that isn't already in cache. Cheap\n // — `fetchChildren` short-circuits when cached or already inflight.\n useEffect(() => {\n if (!loadChildren) return;\n for (const id of expanded) {\n const node = nodeById.get(id);\n if (!node) continue;\n void fetchChildren(node);\n }\n }, [loadChildren, expanded, cacheTick, nodeById, fetchChildren]);\n\n const refresh = useCallback(\n async (id: TreeItemId) => {\n const node = nodeById.get(id);\n if (!node || !loadChildren) return;\n cacheRef.current.delete(id);\n bumpCacheTick();\n await fetchChildren(node);\n },\n [nodeById, loadChildren, fetchChildren, bumpCacheTick],\n );\n\n const refreshAll = useCallback(async () => {\n cacheRef.current.clear();\n bumpCacheTick();\n if (!loadChildren) return;\n await Promise.all(\n [...expanded].map((id) => {\n const node = nodeById.get(id);\n return node ? fetchChildren(node) : undefined;\n }),\n );\n }, [loadChildren, expanded, nodeById, fetchChildren, bumpCacheTick]);\n\n const collectFolderIds = useCallback(() => {\n const ids: TreeItemId[] = [];\n collectAllFolderIds(data, cacheRef.current, ids);\n return ids;\n }, [data]);\n\n return {\n cache: cacheRef.current,\n nodeById,\n fetchChildren,\n refresh,\n refreshAll,\n collectFolderIds,\n };\n}\n","'use client';\n\nimport { useCallback } from 'react';\n\nimport type { Action } from '../state';\nimport type { TreeItemId } from '../../types';\n\nexport interface UseExpansionOptions {\n dispatch: React.Dispatch<Action>;\n /** Build the \"all folder ids\" list — usually wired to `useAsyncChildren`. */\n collectFolderIds: () => TreeItemId[];\n}\n\nexport interface UseExpansionReturn {\n expand: (id: TreeItemId) => void;\n collapse: (id: TreeItemId) => void;\n toggle: (id: TreeItemId) => void;\n expandAll: () => void;\n collapseAll: () => void;\n}\n\n/**\n * Thin action wrappers around the reducer's expansion actions, plus\n * `expandAll` / `collapseAll`. `expandAll` walks roots and cached async\n * children so partially-loaded trees expand everything they currently\n * know about.\n */\nexport function useExpansion({\n dispatch,\n collectFolderIds,\n}: UseExpansionOptions): UseExpansionReturn {\n const expand = useCallback(\n (id: TreeItemId) => dispatch({ type: 'expand', id }),\n [dispatch],\n );\n const collapse = useCallback(\n (id: TreeItemId) => dispatch({ type: 'collapse', id }),\n [dispatch],\n );\n const toggle = useCallback(\n (id: TreeItemId) => dispatch({ type: 'toggle', id }),\n [dispatch],\n );\n\n const expandAll = useCallback(() => {\n dispatch({ type: 'set-expanded', ids: collectFolderIds() });\n }, [dispatch, collectFolderIds]);\n\n const collapseAll = useCallback(\n () => dispatch({ type: 'set-expanded', ids: [] }),\n [dispatch],\n );\n\n return { expand, collapse, toggle, expandAll, collapseAll };\n}\n","'use client';\n\nimport type { FlatRow, TreeItemId } from '../types';\n\n// =====================================================================\n// Selection helpers — pure functions over flatRows + state.\n//\n// Finder/Explorer rules implemented here:\n// - plain click → replace selection, set anchor = id\n// - meta-click → toggle id, set anchor = id (clicked row becomes new anchor)\n// - shift-click → range [anchor..id] (replaces selection)\n// - shift+meta → union(range [anchor..id], previous selection)\n// - shift+arrows → extend range from anchor through new focused row\n// - mod+a → select all visible rows\n// - escape → clear selection (anchor stays — focused stays)\n// =====================================================================\n\nexport interface SelectionState {\n selected: ReadonlySet<TreeItemId>;\n /** Anchor for shift-range. `null` when nothing has been selected yet. */\n anchor: TreeItemId | null;\n /** Visual cursor — usually equals the last clicked / arrow-moved row. */\n focused: TreeItemId | null;\n}\n\nfunction indexOf(rows: readonly FlatRow<unknown>[], id: TreeItemId | null): number {\n if (id == null) return -1;\n for (let i = 0; i < rows.length; i++) {\n if (rows[i].node.id === id) return i;\n }\n return -1;\n}\n\n/**\n * Inclusive range of ids between `fromId` and `toId` according to their\n * positions in `rows`. Returns an empty array if either endpoint is not in\n * `rows` (e.g. anchor pointed at a row that got collapsed away).\n */\nexport function computeRange<T>(\n rows: readonly FlatRow<T>[],\n fromId: TreeItemId | null,\n toId: TreeItemId | null,\n): TreeItemId[] {\n if (fromId == null || toId == null) return [];\n const a = indexOf(rows, fromId);\n const b = indexOf(rows, toId);\n if (a < 0 || b < 0) return [];\n const [lo, hi] = a <= b ? [a, b] : [b, a];\n const out: TreeItemId[] = [];\n for (let i = lo; i <= hi; i++) out.push(rows[i].node.id);\n return out;\n}\n\n/**\n * Click selection — derives next `{selected, anchor, focused}` from a\n * pointer event's modifier keys. `rows` is the current flat view (used\n * for shift-range computation).\n */\nexport interface ClickModifiers {\n shift: boolean;\n meta: boolean;\n}\n\nexport function selectionFromClick<T>(\n state: SelectionState,\n rows: readonly FlatRow<T>[],\n id: TreeItemId,\n mods: ClickModifiers,\n multi: boolean,\n): SelectionState {\n // Single-selection mode → always collapse to one id.\n if (!multi) {\n return { selected: new Set([id]), anchor: id, focused: id };\n }\n\n // shift+meta → union of current selection with range from anchor to id.\n if (mods.shift && mods.meta) {\n const anchor = state.anchor ?? state.focused ?? id;\n const range = computeRange(rows, anchor, id);\n const next = new Set(state.selected);\n for (const r of range) next.add(r);\n return { selected: next, anchor: state.anchor ?? id, focused: id };\n }\n\n // shift-only → replace with range from anchor to id.\n if (mods.shift) {\n const anchor = state.anchor ?? state.focused ?? id;\n const range = computeRange(rows, anchor, id);\n return {\n selected: new Set(range.length > 0 ? range : [id]),\n anchor: state.anchor ?? anchor,\n focused: id,\n };\n }\n\n // meta-only → toggle id, reset anchor.\n if (mods.meta) {\n const next = new Set(state.selected);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return { selected: next, anchor: id, focused: id };\n }\n\n // Plain click → replace selection.\n return { selected: new Set([id]), anchor: id, focused: id };\n}\n\n/**\n * Move-focus selection — used by arrow keys. When `extend` is true (shift),\n * recompute the range from anchor through the new focused id. Otherwise\n * collapse selection to the new id and reset anchor.\n */\nexport function selectionFromMove<T>(\n state: SelectionState,\n rows: readonly FlatRow<T>[],\n nextFocusedId: TreeItemId,\n extend: boolean,\n multi: boolean,\n): SelectionState {\n if (!multi || !extend) {\n return { selected: new Set([nextFocusedId]), anchor: nextFocusedId, focused: nextFocusedId };\n }\n const anchor = state.anchor ?? state.focused ?? nextFocusedId;\n const range = computeRange(rows, anchor, nextFocusedId);\n return {\n selected: new Set(range.length > 0 ? range : [nextFocusedId]),\n anchor,\n focused: nextFocusedId,\n };\n}\n\n/**\n * Select every visible row (Cmd/Ctrl+A). Anchor is set to the first row\n * so a subsequent shift-click extends from a predictable starting point.\n */\nexport function selectionSelectAll<T>(\n rows: readonly FlatRow<T>[],\n focused: TreeItemId | null,\n): SelectionState {\n if (rows.length === 0) {\n return { selected: new Set(), anchor: null, focused };\n }\n const ids = rows.map((r) => r.node.id);\n return {\n selected: new Set(ids),\n anchor: ids[0],\n focused: focused ?? ids[0],\n };\n}\n\n/**\n * Esc behaviour — clear selected items and anchor, but keep focused so the\n * visual cursor stays where the user left it (Finder mimics this).\n */\nexport function selectionClear(state: SelectionState): SelectionState {\n return { selected: new Set(), anchor: null, focused: state.focused };\n}\n","'use client';\n\nimport { useCallback, useRef } from 'react';\n\nimport {\n selectionFromClick,\n selectionFromMove,\n selectionSelectAll,\n type ClickModifiers,\n} from '../../data/selection';\nimport type {\n FlatRow,\n TreeItemId,\n TreeSelectionMode,\n} from '../../types';\nimport type { Action } from '../state';\n\nexport interface UseSelectionOptions<T> {\n dispatch: React.Dispatch<Action>;\n selectionMode: TreeSelectionMode;\n /** Current visible rows — fed in each render, latched into a ref. */\n flatRows: FlatRow<T>[];\n /** Current selection snapshot (latched into a ref alongside `flatRows`). */\n selected: ReadonlySet<TreeItemId>;\n anchor: TreeItemId | null;\n focused: TreeItemId | null;\n}\n\nexport interface UseSelectionReturn {\n select: (id: TreeItemId) => void;\n setSelectedIds: (ids: TreeItemId[]) => void;\n clearSelection: () => void;\n clickSelect: (id: TreeItemId, mods: ClickModifiers) => void;\n moveSelect: (id: TreeItemId, opts: { extend: boolean }) => void;\n selectAll: () => void;\n setFocus: (id: TreeItemId | null) => void;\n}\n\n/**\n * Finder/Explorer-style selection actions. Reads the *current* rows /\n * selection from refs latched per-render, so the returned callbacks\n * stay stable across renders (which matters for `react-hotkeys-hook`\n * and for memoised TreeRow children).\n */\nexport function useSelection<T>({\n dispatch,\n selectionMode,\n flatRows,\n selected,\n anchor,\n focused,\n}: UseSelectionOptions<T>): UseSelectionReturn {\n // Latch the snapshot the callbacks read from.\n const flatRowsRef = useRef<FlatRow<T>[]>(flatRows);\n flatRowsRef.current = flatRows;\n const selectionRef = useRef({ selected, anchor, focused });\n selectionRef.current = { selected, anchor, focused };\n\n const select = useCallback(\n (id: TreeItemId) => dispatch({ type: 'select', id, mode: selectionMode }),\n [dispatch, selectionMode],\n );\n const setSelectedIds = useCallback(\n (ids: TreeItemId[]) => dispatch({ type: 'select-many', ids }),\n [dispatch],\n );\n const clearSelection = useCallback(\n () => dispatch({ type: 'clear-selection' }),\n [dispatch],\n );\n const setFocus = useCallback(\n (id: TreeItemId | null) => dispatch({ type: 'focus', id }),\n [dispatch],\n );\n\n const clickSelect = useCallback(\n (id: TreeItemId, mods: ClickModifiers) => {\n if (selectionMode === 'none') return;\n if (selectionMode === 'single') {\n dispatch({ type: 'select', id, mode: 'single' });\n return;\n }\n const next = selectionFromClick(\n selectionRef.current,\n flatRowsRef.current,\n id,\n mods,\n true,\n );\n dispatch({\n type: 'selection-replace',\n selected: [...next.selected],\n anchor: next.anchor,\n focused: next.focused,\n });\n },\n [dispatch, selectionMode],\n );\n\n const moveSelect = useCallback(\n (id: TreeItemId, opts: { extend: boolean }) => {\n if (selectionMode !== 'multiple' || !opts.extend) {\n dispatch({ type: 'focus', id });\n return;\n }\n const next = selectionFromMove(\n selectionRef.current,\n flatRowsRef.current,\n id,\n true,\n true,\n );\n dispatch({\n type: 'selection-replace',\n selected: [...next.selected],\n anchor: next.anchor,\n focused: next.focused,\n });\n },\n [dispatch, selectionMode],\n );\n\n const selectAll = useCallback(() => {\n if (selectionMode !== 'multiple') return;\n const next = selectionSelectAll(\n flatRowsRef.current,\n selectionRef.current.focused,\n );\n dispatch({\n type: 'selection-replace',\n selected: [...next.selected],\n anchor: next.anchor,\n focused: next.focused,\n });\n }, [dispatch, selectionMode]);\n\n return {\n select,\n setSelectedIds,\n clearSelection,\n clickSelect,\n moveSelect,\n selectAll,\n setFocus,\n };\n}\n","'use client';\n\nimport { useCallback } from 'react';\n\nimport { getDialog } from '@djangocfg/ui-core/lib/dialog-service';\n\nimport type {\n TreeAdapter,\n TreeItemId,\n TreeLabels,\n TreeNode,\n} from '../../types';\nimport type { Action } from '../state';\n\nexport interface UseRenameOptions<T> {\n dispatch: React.Dispatch<Action>;\n adapter?: TreeAdapter<T>;\n /** Master switch — hooks honour it on every entrypoint. */\n enableInlineRename: boolean;\n nodeById: Map<TreeItemId, TreeNode<T>>;\n getItemName: (node: TreeNode<T>) => string;\n labels: TreeLabels;\n}\n\nexport interface UseRenameReturn {\n /** True only when both the host opted in AND adapter exposes `rename`. */\n enabled: boolean;\n startRename: (id: TreeItemId) => void;\n cancelRename: () => void;\n commitRename: (id: TreeItemId, nextName: string) => Promise<boolean>;\n}\n\n/**\n * Inline rename callbacks. The visible UI lives in `TreeRenameInput`;\n * this hook owns the start/cancel/commit transitions and dialog-driven\n * error surfacing.\n */\nexport function useRename<T>({\n dispatch,\n adapter,\n enableInlineRename,\n nodeById,\n getItemName,\n labels,\n}: UseRenameOptions<T>): UseRenameReturn {\n const enabled = enableInlineRename && !!adapter?.rename;\n\n const startRename = useCallback(\n (id: TreeItemId) => {\n if (!enableInlineRename) return;\n if (!adapter?.rename) {\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line no-console\n console.warn(\n '[Tree] startRename called but adapter.rename is not defined.',\n );\n }\n return;\n }\n dispatch({ type: 'start-rename', id });\n },\n [dispatch, enableInlineRename, adapter],\n );\n\n const cancelRename = useCallback(\n () => dispatch({ type: 'stop-rename' }),\n [dispatch],\n );\n\n const commitRename = useCallback(\n async (id: TreeItemId, nextName: string): Promise<boolean> => {\n if (!adapter?.rename) {\n dispatch({ type: 'stop-rename' });\n return false;\n }\n const node = nodeById.get(id);\n if (!node) {\n dispatch({ type: 'stop-rename' });\n return false;\n }\n const trimmed = nextName.trim();\n if (trimmed === getItemName(node)) {\n dispatch({ type: 'stop-rename' });\n return true;\n }\n let err: string | null = null;\n if (trimmed === '') err = labels.invalidNameEmpty;\n else err = adapter.validateName?.(trimmed, { node }) ?? null;\n\n if (err) {\n const dialog = getDialog();\n await dialog?.alert({ title: labels.error, message: err });\n return false;\n }\n\n try {\n await adapter.rename(node, trimmed);\n } catch (e) {\n const dialog = getDialog();\n await dialog?.alert({\n title: labels.error,\n message: e instanceof Error ? e.message : String(e),\n });\n return false;\n }\n dispatch({ type: 'stop-rename' });\n return true;\n },\n [dispatch, adapter, nodeById, getItemName, labels],\n );\n\n return { enabled, startRename, cancelRename, commitRename };\n}\n","'use client';\n\nimport { useCallback, useRef } from 'react';\n\nimport { getDialog } from '@djangocfg/ui-core/lib/dialog-service';\n\nimport type { ClipboardState } from '../../data/clipboard';\nimport type {\n TreeAdapter,\n TreeItemId,\n TreeLabels,\n TreeMovePosition,\n TreeNode,\n} from '../../types';\nimport type { Action } from '../state';\n\nexport interface UseClipboardOptions<T> {\n dispatch: React.Dispatch<Action>;\n /** Current clipboard snapshot — latched into a ref for async paste. */\n clipboard: ClipboardState;\n adapter?: TreeAdapter<T>;\n nodeById: Map<TreeItemId, TreeNode<T>>;\n labels: TreeLabels;\n}\n\nexport interface UseClipboardReturn<T> {\n cutToClipboard: (ids: TreeItemId[]) => void;\n copyToClipboard: (ids: TreeItemId[]) => void;\n /** Apply clipboard to `target` (a row, or `null` = root). */\n pasteFromClipboard: (\n target: TreeNode<T> | null,\n position?: TreeMovePosition,\n ) => Promise<void>;\n clearClipboard: () => void;\n}\n\n/**\n * Tree-local clipboard. Cut + paste dispatches `adapter.move`, copy +\n * paste dispatches `adapter.copy`. Errors are surfaced through\n * `window.dialog.alert` so they don't get swallowed silently.\n */\nexport function useClipboard<T>({\n dispatch,\n clipboard,\n adapter,\n nodeById,\n labels,\n}: UseClipboardOptions<T>): UseClipboardReturn<T> {\n const clipboardRef = useRef(clipboard);\n clipboardRef.current = clipboard;\n\n const cutToClipboard = useCallback(\n (ids: TreeItemId[]) => {\n if (ids.length === 0) return;\n dispatch({ type: 'clipboard-set', payload: { kind: 'cut', ids } });\n },\n [dispatch],\n );\n\n const copyToClipboard = useCallback(\n (ids: TreeItemId[]) => {\n if (ids.length === 0) return;\n dispatch({ type: 'clipboard-set', payload: { kind: 'copy', ids } });\n },\n [dispatch],\n );\n\n const clearClipboard = useCallback(\n () => dispatch({ type: 'clipboard-set', payload: null }),\n [dispatch],\n );\n\n const pasteFromClipboard = useCallback(\n async (\n target: TreeNode<T> | null,\n position: TreeMovePosition = 'inside',\n ) => {\n const cb = clipboardRef.current;\n if (!cb || cb.ids.length === 0) return;\n if (!adapter) return;\n const nodes = cb.ids\n .map((id) => nodeById.get(id))\n .filter((n): n is TreeNode<T> => !!n);\n if (nodes.length === 0) {\n dispatch({ type: 'clipboard-set', payload: null });\n return;\n }\n try {\n if (cb.kind === 'cut') {\n if (!adapter.move) return;\n await adapter.move(nodes, target, position);\n // Cut + paste consumes the clipboard. Copy + paste retains it.\n dispatch({ type: 'clipboard-set', payload: null });\n } else {\n if (!adapter.copy) return;\n await adapter.copy(nodes, target, position);\n }\n } catch (e) {\n const dialog = getDialog();\n await dialog?.alert({\n title: labels.error,\n message: e instanceof Error ? e.message : String(e),\n });\n }\n },\n [dispatch, adapter, nodeById, labels],\n );\n\n return {\n cutToClipboard,\n copyToClipboard,\n pasteFromClipboard,\n clearClipboard,\n };\n}\n","'use client';\n\nimport { getDialog } from '@djangocfg/ui-core/lib/dialog-service';\nimport {\n Copy,\n CornerUpLeft,\n FilePlus,\n FolderPlus,\n Pencil,\n Scissors,\n Trash2,\n} from 'lucide-react';\nimport type { ComponentType } from 'react';\n\nimport type {\n TreeAdapter,\n TreeBuiltinAction,\n TreeContextMenuItem,\n TreeItemId,\n TreeLabels,\n TreeNode,\n TreeRowRenderProps,\n} from '../../types';\n\n// =====================================================================\n// BuiltinActionContext — everything the action handler needs from Tree.\n// Kept as a plain object (not a React context) so the same code can be\n// shared by hotkeys, right-click menus, and the empty-area menu.\n// =====================================================================\n\nexport interface BuiltinActionContext<T> {\n adapter: TreeAdapter<T>;\n labels: TreeLabels;\n /** Currently selected nodes (full objects, resolved from ids). */\n selectedNodes: TreeNode<T>[];\n /** Row the user right-clicked / triggered the action on. May be null\n * for empty-area actions (paste / new file / new folder at root). */\n targetNode: TreeNode<T> | null;\n /** Returns the human-readable name for a node (uses `getItemName`). */\n getName: (node: TreeNode<T>) => string;\n /** Imperative: start inline rename on this id (no-op if disabled). */\n startInlineRename?: (id: TreeItemId) => void;\n /** Clipboard hooks (P5). Provided by Tree's context; pure forwarding. */\n clipboard?: {\n /** Current clipboard kind, if any (so we can hide \"Paste\" when empty). */\n hasItems: boolean;\n cut: (ids: TreeItemId[]) => void;\n copy: (ids: TreeItemId[]) => void;\n paste: () => void | Promise<void>;\n };\n}\n\ninterface BuiltinActionDescriptor<T> {\n id: TreeBuiltinAction;\n label: (ctx: BuiltinActionContext<T>) => string;\n icon: ComponentType<{ className?: string }>;\n destructive?: boolean;\n shortcut?: string;\n /** Should this row appear in the menu given the current adapter + selection? */\n available: (ctx: BuiltinActionContext<T>) => boolean;\n run: (ctx: BuiltinActionContext<T>) => Promise<void> | void;\n}\n\n// =====================================================================\n// Dialog helpers — thin wrappers that bail out gracefully if\n// <DialogProvider /> isn't mounted. Tree should still render in that\n// case, just without CRUD flows.\n// =====================================================================\n\nasync function confirmDelete<T>(ctx: BuiltinActionContext<T>): Promise<boolean> {\n const dialog = getDialog();\n if (!dialog) return false;\n const { selectedNodes, labels, getName } = ctx;\n return dialog.confirm({\n title: labels.confirmDeleteTitle(selectedNodes.length),\n message: labels.confirmDeleteMessage(selectedNodes.map(getName)),\n confirmText: labels.confirmDeleteOk,\n cancelText: labels.confirmDeleteCancel,\n variant: 'destructive',\n });\n}\n\nasync function promptName<T>(\n ctx: BuiltinActionContext<T>,\n spec: {\n title: string;\n message: string;\n placeholder: string;\n defaultValue: string;\n },\n): Promise<string | null> {\n const dialog = getDialog();\n if (!dialog) return null;\n return dialog.prompt({\n title: spec.title,\n message: spec.message,\n placeholder: spec.placeholder,\n defaultValue: spec.defaultValue,\n });\n}\n\nasync function alertError<T>(\n ctx: BuiltinActionContext<T>,\n message: string,\n): Promise<void> {\n const dialog = getDialog();\n if (!dialog) return;\n await dialog.alert({ message, title: ctx.labels.error });\n}\n\n/**\n * Validate a name through `adapter.validateName` and a tiny built-in\n * non-empty check. Returns `null` if valid, otherwise the error message\n * to surface via `dialog.alert`.\n */\nfunction validateName<T>(\n ctx: BuiltinActionContext<T>,\n name: string,\n validateCtx: { node?: TreeNode<T>; parent?: TreeNode<T> | null },\n): string | null {\n if (name.trim() === '') return ctx.labels.invalidNameEmpty;\n return ctx.adapter.validateName?.(name, validateCtx) ?? null;\n}\n\n// =====================================================================\n// Built-in action descriptors. Order matters — it controls menu order.\n// =====================================================================\n\nconst BUILTIN_ACTIONS: BuiltinActionDescriptor<unknown>[] = [\n {\n id: 'open',\n label: (ctx) => ctx.labels.actionOpen,\n icon: CornerUpLeft,\n available: () => false, // wired by Tree on activate; not in menu by default\n run: () => {},\n },\n {\n id: 'rename',\n label: (ctx) => ctx.labels.actionRename,\n icon: Pencil,\n shortcut: 'F2',\n available: (ctx) =>\n !!ctx.adapter.rename &&\n ctx.selectedNodes.length === 1 &&\n !ctx.selectedNodes[0].disabled,\n run: async (ctx) => {\n // Prefer inline rename when Tree can drive it; fall back to a prompt.\n const node = ctx.selectedNodes[0];\n if (ctx.startInlineRename) {\n ctx.startInlineRename(node.id);\n return;\n }\n const name = await promptName(ctx, {\n title: ctx.labels.renameTitle,\n message: ctx.labels.renameMessage,\n placeholder: ctx.getName(node),\n defaultValue: ctx.getName(node),\n });\n if (name === null) return;\n const err = validateName(ctx, name, { node });\n if (err) return alertError(ctx, err);\n await ctx.adapter.rename!(node, name);\n },\n },\n {\n id: 'duplicate',\n label: (ctx) => ctx.labels.actionDuplicate,\n icon: Copy,\n shortcut: '⌘D',\n available: (ctx) => !!ctx.adapter.duplicate && ctx.selectedNodes.length > 0,\n run: (ctx) => ctx.adapter.duplicate!(ctx.selectedNodes),\n },\n {\n id: 'cut',\n label: (ctx) => ctx.labels.actionCut,\n icon: Scissors,\n shortcut: '⌘X',\n // Only meaningful when the adapter supports `move` (paste-after-cut)\n // AND Tree provided a clipboard binding.\n available: (ctx) =>\n !!ctx.adapter.move && !!ctx.clipboard && ctx.selectedNodes.length > 0,\n run: (ctx) => {\n ctx.clipboard?.cut(ctx.selectedNodes.map((n) => n.id));\n },\n },\n {\n id: 'copy',\n label: (ctx) => ctx.labels.actionCopy,\n icon: Copy,\n shortcut: '⌘C',\n available: (ctx) =>\n !!ctx.adapter.copy && !!ctx.clipboard && ctx.selectedNodes.length > 0,\n run: (ctx) => {\n ctx.clipboard?.copy(ctx.selectedNodes.map((n) => n.id));\n },\n },\n {\n id: 'paste',\n label: (ctx) => ctx.labels.actionPaste,\n icon: CornerUpLeft,\n shortcut: '⌘V',\n available: (ctx) => !!ctx.clipboard?.hasItems,\n run: async (ctx) => {\n await ctx.clipboard?.paste();\n },\n },\n {\n id: 'delete',\n label: (ctx) => ctx.labels.actionDelete,\n icon: Trash2,\n shortcut: '⌘⌫',\n destructive: true,\n available: (ctx) => !!ctx.adapter.remove && ctx.selectedNodes.length > 0,\n run: async (ctx) => {\n const ok = await confirmDelete(ctx);\n if (!ok) return;\n await ctx.adapter.remove!(ctx.selectedNodes);\n },\n },\n {\n id: 'new-file',\n label: (ctx) => ctx.labels.actionNewFile,\n icon: FilePlus,\n available: (ctx) => !!ctx.adapter.createFile,\n run: async (ctx) => {\n const parent = resolveParentForCreate(ctx);\n const name = await promptName(ctx, {\n title: ctx.labels.newFileTitle,\n message: ctx.labels.newFileMessage,\n placeholder: ctx.labels.newFilePlaceholder,\n defaultValue: ctx.labels.newFileDefault,\n });\n if (name === null) return;\n const err = validateName(ctx, name, { parent });\n if (err) return alertError(ctx, err);\n await ctx.adapter.createFile!(parent, name);\n },\n },\n {\n id: 'new-folder',\n label: (ctx) => ctx.labels.actionNewFolder,\n icon: FolderPlus,\n shortcut: '⌘⇧N',\n available: (ctx) => !!ctx.adapter.createFolder,\n run: async (ctx) => {\n const parent = resolveParentForCreate(ctx);\n const name = await promptName(ctx, {\n title: ctx.labels.newFolderTitle,\n message: ctx.labels.newFolderMessage,\n placeholder: ctx.labels.newFolderPlaceholder,\n defaultValue: ctx.labels.newFolderDefault,\n });\n if (name === null) return;\n const err = validateName(ctx, name, { parent });\n if (err) return alertError(ctx, err);\n await ctx.adapter.createFolder!(parent, name);\n },\n },\n];\n\n/**\n * Default order of items in the auto-built context menu when the\n * consumer doesn't override `defaultMenuItems`. Separators are\n * conventional Finder/Explorer groupings.\n */\nexport const DEFAULT_BUILTIN_MENU_ORDER: (TreeBuiltinAction | 'separator')[] = [\n 'rename',\n 'duplicate',\n 'separator',\n 'cut',\n 'copy',\n 'paste',\n 'separator',\n 'new-file',\n 'new-folder',\n 'separator',\n 'delete',\n];\n\n/**\n * Where should a \"new file / new folder\" land?\n *\n * - target row is a folder → create inside it\n * - target row is a leaf → create as sibling (under its parent)\n * - no target row → root (null)\n */\nfunction resolveParentForCreate<T>(ctx: BuiltinActionContext<T>): TreeNode<T> | null {\n const { targetNode } = ctx;\n if (!targetNode) return null;\n // We can't know the parent without walking the tree — Tree passes the\n // target's effective \"container\" via targetNode for folders; leaves go\n // to root for now. Consumers that need sibling-creation can pass a\n // custom contextMenuActions resolver.\n const isFolder = Array.isArray(targetNode.children) || !!targetNode.isFolder;\n return isFolder ? targetNode : null;\n}\n\n/**\n * Build the list of `TreeContextMenuItem`s for the current selection /\n * target row using the configured `defaultMenuItems` (or the default\n * order). Returns `null` when no items are available — caller should\n * suppress the menu entirely.\n */\nexport function buildDefaultMenuItems<T>(\n ctx: BuiltinActionContext<T>,\n order: (TreeBuiltinAction | 'separator')[] = DEFAULT_BUILTIN_MENU_ORDER,\n): TreeContextMenuItem<T>[] | null {\n const items: TreeContextMenuItem<T>[] = [];\n let pendingSeparator = false;\n\n for (const entry of order) {\n if (entry === 'separator') {\n pendingSeparator = items.length > 0;\n continue;\n }\n const desc = BUILTIN_ACTIONS.find((a) => a.id === entry) as\n | BuiltinActionDescriptor<T>\n | undefined;\n if (!desc) continue;\n if (!desc.available(ctx)) continue;\n if (pendingSeparator) {\n items.push('separator');\n pendingSeparator = false;\n }\n items.push({\n id: desc.id,\n label: desc.label(ctx),\n icon: desc.icon,\n shortcut: desc.shortcut,\n destructive: desc.destructive,\n onSelect: () => void desc.run(ctx),\n });\n }\n\n return items.length > 0 ? items : null;\n}\n\n/**\n * Internal: run a built-in action by id. Used by Finder hotkeys (P4).\n * Returns `false` if the action isn't currently available (e.g. delete\n * with no selection).\n */\nexport async function runBuiltinAction<T>(\n id: TreeBuiltinAction,\n ctx: BuiltinActionContext<T>,\n): Promise<boolean> {\n const desc = BUILTIN_ACTIONS.find((a) => a.id === id) as\n | BuiltinActionDescriptor<T>\n | undefined;\n if (!desc) return false;\n if (!desc.available(ctx)) return false;\n await desc.run(ctx);\n return true;\n}\n\n// Re-export typed bits used by callers.\nexport type { TreeRowRenderProps };\n","'use client';\n\nimport { useMemo } from 'react';\n\nimport type { ClipboardState } from '../../data/clipboard';\nimport type {\n TreeAdapter,\n TreeBuiltinAction,\n TreeContextMenuActionsResolver,\n TreeContextMenuItem,\n TreeItemId,\n TreeLabels,\n TreeMovePosition,\n TreeNode,\n TreeRowRenderProps,\n} from '../../types';\n\nexport type { TreeContextMenuActionsResolver };\nimport {\n buildDefaultMenuItems,\n type BuiltinActionContext,\n} from './builtin-actions';\n\n/**\n * Internal row-driven resolver — same shape as\n * `TreeContextMenuActionsResolver` but takes a plain `TreeRowRenderProps`\n * instead of the context-with-selection. The provider injects\n * `selectedNodes` itself.\n */\nexport type ResolvedMenuResolver<T> = (\n row: TreeRowRenderProps<T>,\n) => TreeContextMenuItem<T>[] | null | undefined;\n\nexport interface UseResolvedMenuOptions<T> {\n adapter?: TreeAdapter<T>;\n contextMenuActions?: TreeContextMenuActionsResolver<T>;\n defaultMenuItems?: TreeBuiltinAction[];\n labels: TreeLabels;\n selected: ReadonlySet<TreeItemId>;\n clipboard: ClipboardState;\n nodeById: Map<TreeItemId, TreeNode<T>>;\n getItemName: (node: TreeNode<T>) => string;\n enableInlineRename: boolean;\n startRename: (id: TreeItemId) => void;\n cutToClipboard: (ids: TreeItemId[]) => void;\n copyToClipboard: (ids: TreeItemId[]) => void;\n pasteFromClipboard: (\n target: TreeNode<T> | null,\n position?: TreeMovePosition,\n ) => Promise<void>;\n}\n\n/**\n * Build the merged declarative menu resolver — built-in adapter actions\n * (filtered by `defaultMenuItems`) prepended to the consumer's\n * `contextMenuActions` result. Returns `undefined` when neither side\n * supplies anything, so `TreeRow` can skip rendering a menu entirely.\n *\n * The resolver injects `selectedNodes` on every call so the consumer's\n * resolver receives the multi-selection without having to read it from\n * elsewhere. Finder/Explorer convention applies: if the right-clicked\n * row isn't in the current selection, the menu acts on a single-row\n * effective selection (the row itself).\n */\nexport function useResolvedMenu<T>(\n opts: UseResolvedMenuOptions<T>,\n): ResolvedMenuResolver<T> | undefined {\n const {\n adapter,\n contextMenuActions,\n defaultMenuItems,\n labels,\n selected,\n clipboard,\n nodeById,\n getItemName,\n enableInlineRename,\n startRename,\n cutToClipboard,\n copyToClipboard,\n pasteFromClipboard,\n } = opts;\n\n return useMemo<ResolvedMenuResolver<T> | undefined>(() => {\n if (!adapter && !contextMenuActions) return undefined;\n\n return (rowProps) => {\n const selectedIds = selected.has(rowProps.node.id)\n ? [...selected]\n : [rowProps.node.id];\n const selectedNodes = selectedIds\n .map((id) => nodeById.get(id))\n .filter((n): n is TreeNode<T> => !!n);\n\n const builtin = adapter\n ? buildDefaultMenuItems<T>(\n {\n adapter,\n labels,\n selectedNodes,\n targetNode: rowProps.node,\n getName: getItemName,\n startInlineRename:\n enableInlineRename && adapter.rename ? startRename : undefined,\n clipboard: {\n hasItems: !!clipboard && clipboard.ids.length > 0,\n cut: cutToClipboard,\n copy: copyToClipboard,\n paste: () => pasteFromClipboard(rowProps.node, 'inside'),\n },\n } satisfies BuiltinActionContext<T>,\n defaultMenuItems\n ? (defaultMenuItems as (TreeBuiltinAction | 'separator')[])\n : undefined,\n )\n : null;\n\n const user =\n contextMenuActions?.({ ...rowProps, selectedNodes }) ?? null;\n\n if (!builtin && !user) return null;\n if (!user) return builtin;\n if (!builtin) return user;\n return [...builtin, 'separator', ...user];\n };\n }, [\n adapter,\n contextMenuActions,\n defaultMenuItems,\n labels,\n selected,\n clipboard,\n nodeById,\n getItemName,\n enableInlineRename,\n startRename,\n cutToClipboard,\n copyToClipboard,\n pasteFromClipboard,\n ]);\n}\n","'use client';\n\nimport {\n ContextMenu,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuTrigger,\n} from '@djangocfg/ui-core/components';\n\nimport type {\n TreeContextMenuItem,\n TreeRowRenderProps,\n} from '../../types';\n\n/**\n * Render an array of declarative menu items as a themed `<ContextMenu>`\n * wrapped around the supplied trigger element. Pure presentational layer\n * — the caller resolves and merges items.\n */\nexport function renderItemsAsContextMenu<T>(\n rowProps: TreeRowRenderProps<T>,\n items: TreeContextMenuItem<T>[],\n trigger: React.ReactNode,\n): React.ReactNode {\n return (\n <ContextMenu>\n <ContextMenuTrigger asChild>{trigger}</ContextMenuTrigger>\n <ContextMenuContent>\n {items.map((item, idx) => {\n if (item === 'separator') {\n return <ContextMenuSeparator key={`sep-${idx}`} />;\n }\n const Icon = item.icon;\n return (\n <ContextMenuItem\n key={item.id}\n disabled={item.disabled}\n variant={item.destructive ? 'destructive' : undefined}\n onSelect={() => item.onSelect(rowProps)}\n >\n {Icon ? <Icon /> : null}\n {item.label}\n {item.shortcut ? (\n <ContextMenuShortcut>{item.shortcut}</ContextMenuShortcut>\n ) : null}\n </ContextMenuItem>\n );\n })}\n </ContextMenuContent>\n </ContextMenu>\n );\n}\n\n/**\n * Drop trailing / leading / duplicate separators so a merged menu never\n * shows a separator next to a section header or another separator.\n */\nexport function tidyMenuItems<T>(\n items: TreeContextMenuItem<T>[],\n): TreeContextMenuItem<T>[] {\n const out: TreeContextMenuItem<T>[] = [];\n for (const it of items) {\n if (it === 'separator') {\n if (out.length === 0) continue;\n if (out[out.length - 1] === 'separator') continue;\n out.push(it);\n } else {\n out.push(it);\n }\n }\n while (out.length > 0 && out[out.length - 1] === 'separator') out.pop();\n return out;\n}\n","'use client';\n\nimport type { FlatRow, TreeItemId, TreeMovePosition, TreeNode } from '../types';\n\n// =====================================================================\n// Drag-and-drop primitives — pure, framework-agnostic.\n//\n// @dnd-kit handles the pointer/keyboard sensors and overlay rendering;\n// these helpers only translate pointer geometry into a domain-level\n// drop position (`before` / `inside` / `after`) and validate whether\n// a given drag/drop combo is allowed.\n//\n// Folder vs leaf semantics:\n// - leaves → no `inside` zone; row splits into top/bottom halves\n// for `before` / `after` reorder\n// - folders → top third = `before`, middle third = `inside`,\n// bottom third = `after`\n// =====================================================================\n\nexport interface DropZoneInput {\n /** Pointer Y in viewport coordinates. */\n pointerY: number;\n /** Row bounding box (`getBoundingClientRect()`). */\n rowRect: { top: number; bottom: number; height: number };\n /** Folders accept `inside` drops; leaves only reorder via before/after. */\n isFolder: boolean;\n}\n\n/**\n * Translate pointer geometry into a drop position relative to the row.\n *\n * For folders the row is split into three zones (top third / middle /\n * bottom third). For leaves it's split in half (before / after).\n */\nexport function resolveDropZone(input: DropZoneInput): TreeMovePosition {\n const { pointerY, rowRect, isFolder } = input;\n const offset = pointerY - rowRect.top;\n const ratio = rowRect.height > 0 ? offset / rowRect.height : 0.5;\n\n if (isFolder) {\n if (ratio < 0.33) return 'before';\n if (ratio > 0.66) return 'after';\n return 'inside';\n }\n return ratio < 0.5 ? 'before' : 'after';\n}\n\n// =====================================================================\n// canDrop — default validator.\n//\n// Rejects:\n// 1. Dropping a node onto itself.\n// 2. Dropping a folder into one of its own descendants (would create\n// a cycle).\n// 3. Dropping `inside` a non-folder (defensive — UI already routes\n// these as `before`/`after`, but the API can be called directly).\n//\n// Consumers can pass their own `canDrop` via `<TreeRoot canDrop={…}>`\n// to layer extra rules on top (e.g. read-only branches, type matching).\n// =====================================================================\n\nexport interface CanDropInput<T> {\n /** Nodes being dragged. */\n source: TreeNode<T>[];\n /** Row under the pointer (`null` = root drop zone). */\n target: TreeNode<T> | null;\n /** Resolved drop position. */\n position: TreeMovePosition;\n /** Tree's id→node lookup, used to walk descendants. */\n getNodeById: (id: TreeItemId) => TreeNode<T> | undefined;\n}\n\nexport function defaultCanDrop<T>(input: CanDropInput<T>): boolean {\n const { source, target, position } = input;\n if (source.length === 0) return false;\n if (!target) return true; // root drop is always allowed when no other rule rejects.\n\n // Inside a leaf doesn't make sense.\n if (position === 'inside') {\n const isFolder = Array.isArray(target.children) || !!target.isFolder;\n if (!isFolder) return false;\n }\n\n for (const node of source) {\n if (node.id === target.id) return false;\n if (isDescendant(node, target.id)) return false;\n }\n return true;\n}\n\n/**\n * Walk `root`'s inline children searching for `id`. Cached async children\n * are *not* walked here because the cycle check needs to be cheap and\n * deterministic — a missing cycle in unloaded branches is acceptable\n * (the consumer's `adapter.move` is the final gatekeeper).\n */\nfunction isDescendant<T>(root: TreeNode<T>, id: TreeItemId): boolean {\n if (!Array.isArray(root.children)) return false;\n for (const child of root.children) {\n if (child.id === id) return true;\n if (isDescendant(child, id)) return true;\n }\n return false;\n}\n\n// =====================================================================\n// DataTransfer mime — used both for in-tree drags and (later) for\n// receiving dragged files from the OS. The id payload is the JSON-\n// encoded list of `TreeItemId`s.\n// =====================================================================\n\nexport const TREE_DND_MIME = 'application/x-djangocfg-tree';\n\n/**\n * Sentinel droppable id used by `<TreeEmptyArea>` to claim the\n * \"root drop target\" slot. `<TreeDndProvider>` recognises this id and\n * maps it to `{ id: null, position: 'inside' }` in `dnd.dropTarget`.\n *\n * Lives in `data/` (not in the component) so both producer and\n * consumer reference one constant instead of duplicating the magic\n * string.\n */\nexport const TREE_ROOT_DROP_ID = '__tree_root_drop__';\n","'use client';\n\nimport { useCallback, useMemo, useState } from 'react';\n\nimport { getDialog } from '@djangocfg/ui-core/lib/dialog-service';\n\nimport { defaultCanDrop } from '../../data/dnd';\nimport type {\n TreeAdapter,\n TreeItemId,\n TreeLabels,\n TreeMovePosition,\n TreeNode,\n} from '../../types';\n\nexport interface UseDndOptions<T> {\n enabled: boolean;\n adapter?: TreeAdapter<T>;\n nodeById: Map<TreeItemId, TreeNode<T>>;\n /**\n * Multi-selection at the moment dragging begins. If the dragged row\n * is part of the selection, we drag all selected rows; otherwise we\n * drag just the row.\n */\n selected: ReadonlySet<TreeItemId>;\n labels: TreeLabels;\n /** Optional consumer-defined drop validator (layered on top of `defaultCanDrop`). */\n canDrop?: (ctx: {\n source: TreeNode<T>[];\n target: TreeNode<T> | null;\n position: TreeMovePosition;\n }) => boolean;\n}\n\nexport interface DropTargetState {\n id: TreeItemId | null; // null = root drop zone\n position: TreeMovePosition;\n}\n\nexport interface UseDndReturn<T> {\n /** True when the host enabled DnD AND adapter.move is defined. */\n active: boolean;\n /** Ids currently being dragged (empty when not dragging). */\n draggingIds: ReadonlySet<TreeItemId>;\n /** Live drop target (`null` when nothing under the pointer). */\n dropTarget: DropTargetState | null;\n /** Called by row sensors on dragstart. */\n beginDrag: (rowId: TreeItemId) => void;\n /**\n * Called on dragover. `null` clears the indicator. Tree already\n * filters self/cycle drops via `defaultCanDrop` — the row component\n * decides the position from pointer geometry first.\n */\n setDropTarget: (target: DropTargetState | null) => void;\n /** Commit drop — calls `adapter.move` and resets transient state. */\n commitDrop: () => Promise<void>;\n /** Cancel without committing (Esc, drop outside). */\n cancelDrag: () => void;\n /**\n * Validate a candidate drop in real time. Combines `defaultCanDrop`\n * with the consumer's `canDrop`. Used by the row component to\n * suppress the indicator on invalid hovers.\n */\n isAllowedDrop: (target: TreeNode<T> | null, position: TreeMovePosition) => boolean;\n}\n\nexport function useDnd<T>({\n enabled,\n adapter,\n nodeById,\n selected,\n labels,\n canDrop,\n}: UseDndOptions<T>): UseDndReturn<T> {\n const active = enabled && !!adapter?.move;\n\n const [draggingIds, setDraggingIds] = useState<ReadonlySet<TreeItemId>>(\n () => new Set(),\n );\n const [dropTarget, setDropTarget] = useState<DropTargetState | null>(null);\n\n const beginDrag = useCallback(\n (rowId: TreeItemId) => {\n if (!active) return;\n // If the dragged row is part of the selection, drag the whole\n // selection. Otherwise it's a single-row drag (and we don't\n // touch the existing selection).\n const ids = selected.has(rowId)\n ? new Set(selected)\n : new Set<TreeItemId>([rowId]);\n setDraggingIds(ids);\n },\n [active, selected],\n );\n\n const cancelDrag = useCallback(() => {\n setDraggingIds(new Set());\n setDropTarget(null);\n }, []);\n\n const resolveSourceNodes = useCallback((): TreeNode<T>[] => {\n const out: TreeNode<T>[] = [];\n for (const id of draggingIds) {\n const node = nodeById.get(id);\n if (node) out.push(node);\n }\n return out;\n }, [draggingIds, nodeById]);\n\n const isAllowedDrop = useCallback(\n (target: TreeNode<T> | null, position: TreeMovePosition): boolean => {\n if (!active) return false;\n if (draggingIds.size === 0) return false;\n const source = resolveSourceNodes();\n if (\n !defaultCanDrop<T>({\n source,\n target,\n position,\n getNodeById: (id) => nodeById.get(id),\n })\n ) {\n return false;\n }\n // Layer the consumer's rule on top.\n return canDrop?.({ source, target, position }) ?? true;\n },\n [active, draggingIds, resolveSourceNodes, nodeById, canDrop],\n );\n\n const commitDrop = useCallback(async () => {\n if (!active || !adapter?.move) {\n cancelDrag();\n return;\n }\n const t = dropTarget;\n if (!t) {\n cancelDrag();\n return;\n }\n const targetNode = t.id ? nodeById.get(t.id) ?? null : null;\n const source = resolveSourceNodes();\n if (source.length === 0) {\n cancelDrag();\n return;\n }\n if (!isAllowedDrop(targetNode, t.position)) {\n cancelDrag();\n return;\n }\n try {\n await adapter.move(source, targetNode, t.position);\n } catch (e) {\n const dialog = getDialog();\n await dialog?.alert({\n title: labels.error,\n message: e instanceof Error ? e.message : String(e),\n });\n } finally {\n cancelDrag();\n }\n }, [\n active,\n adapter,\n cancelDrag,\n dropTarget,\n isAllowedDrop,\n labels,\n nodeById,\n resolveSourceNodes,\n ]);\n\n return useMemo(\n () => ({\n active,\n draggingIds,\n dropTarget,\n beginDrag,\n setDropTarget,\n commitDrop,\n cancelDrag,\n isAllowedDrop,\n }),\n [\n active,\n draggingIds,\n dropTarget,\n beginDrag,\n commitDrop,\n cancelDrag,\n isAllowedDrop,\n ],\n );\n}\n","'use client';\n\nimport { useEffect, useRef } from 'react';\n\nimport { saveTreeState } from '../../data/persist';\nimport type { TreeItemId } from '../../types';\n\nexport interface UsePersistSyncOptions {\n expanded: ReadonlySet<TreeItemId>;\n selected: ReadonlySet<TreeItemId>;\n persistKey?: string;\n persistSelection: boolean;\n onSelectionChange?: (ids: TreeItemId[]) => void;\n onExpansionChange?: (ids: TreeItemId[]) => void;\n}\n\n/**\n * Persist `expanded` / `selected` into `localStorage` under `persistKey`,\n * and forward changes through the consumer's notify callbacks. We\n * compare by content (not identity) because the reducer recreates\n * `Set`s on every change — without diffing we'd fire `onSelectionChange`\n * on every render.\n */\nexport function usePersistSync({\n expanded,\n selected,\n persistKey,\n persistSelection,\n onSelectionChange,\n onExpansionChange,\n}: UsePersistSyncOptions): void {\n // Stable refs so we don't re-bind effects every render.\n const onSelectionChangeRef = useRef(onSelectionChange);\n const onExpansionChangeRef = useRef(onExpansionChange);\n onSelectionChangeRef.current = onSelectionChange;\n onExpansionChangeRef.current = onExpansionChange;\n\n const lastSelectedArrRef = useRef<TreeItemId[]>([...selected]);\n const lastExpandedArrRef = useRef<TreeItemId[]>([...expanded]);\n\n useEffect(() => {\n const arr = [...expanded];\n if (!setEqualsArr(expanded, lastExpandedArrRef.current)) {\n lastExpandedArrRef.current = arr;\n onExpansionChangeRef.current?.(arr);\n if (persistKey) {\n saveTreeState(persistKey, {\n expandedItems: arr,\n selectedItems: persistSelection ? [...selected] : [],\n });\n }\n }\n }, [expanded, persistKey, persistSelection, selected]);\n\n useEffect(() => {\n const arr = [...selected];\n if (!setEqualsArr(selected, lastSelectedArrRef.current)) {\n lastSelectedArrRef.current = arr;\n onSelectionChangeRef.current?.(arr);\n if (persistKey && persistSelection) {\n saveTreeState(persistKey, {\n expandedItems: [...expanded],\n selectedItems: arr,\n });\n }\n }\n }, [selected, persistKey, persistSelection, expanded]);\n}\n\nfunction setEqualsArr(set: ReadonlySet<string>, arr: readonly string[]): boolean {\n if (set.size !== arr.length) return false;\n for (const id of arr) if (!set.has(id)) return false;\n return true;\n}\n","'use client';\n\nimport * as React from 'react';\nimport { createContext, useCallback, useMemo, useReducer, useRef } from 'react';\n\nimport { flattenTree } from '../data/flatten';\nimport { loadTreeState } from '../data/persist';\nimport { resolveAppearance } from '../data/appearance';\nimport {\n DEFAULT_TREE_LABELS,\n type FlatRow,\n type TreeActivateOptions,\n type TreeContextMenuSlot,\n type TreeItemId,\n type TreeLabels,\n type TreeNode,\n type TreeRootProps,\n} from '../types';\n\nimport { reducer, createInitialState } from './state';\nimport { useAsyncChildren } from './async-children';\nimport { useExpansion } from './expansion';\nimport { useSelection } from './selection';\nimport { useRename } from './rename';\nimport { useClipboard } from './clipboard';\nimport { useResolvedMenu, renderItemsAsContextMenu, tidyMenuItems } from './menu';\nimport { useDnd, type UseDndReturn } from './dnd';\nimport { usePersistSync } from './persist';\nimport type { TreeContextValue } from './TreeContextValue';\n\n// Re-exported from this module: the value interface (so consumers\n// continue to `import type { TreeContextValue }` from `./context`).\nexport type { TreeContextValue } from './TreeContextValue';\n\n/**\n * Internal context object. Exported so `TreeRoot` can wrap it with an\n * override-provider that injects a slot-form `renderContextMenu`\n * derived from the declarative resolver. Consumers should use\n * `useTreeContext()` instead of touching this directly.\n */\nexport const TreeContext = createContext<TreeContextValue<unknown> | null>(null);\n\nexport function useTreeContext<T>(): TreeContextValue<T> {\n const ctx = React.useContext(TreeContext);\n if (!ctx) {\n throw new Error('useTreeContext must be used inside <TreeProvider>');\n }\n return ctx as TreeContextValue<T>;\n}\n\n// =====================================================================\n// Provider — thin assembly. The real work lives in:\n//\n// state/ reducer + initial state\n// async-children/ child cache, nodeById, fetchChildren, refresh, refreshAll\n// expansion/ expand / collapse / toggle / expandAll / collapseAll\n// selection/ click / move / select-all + plain select / clear\n// rename/ start / cancel / commit\n// clipboard/ cut / copy / paste / clear\n// menu/ built-in actions registry + merged declarative resolver\n// persist/ localStorage + onSelectionChange/onExpansionChange\n//\n// This file only stitches them together and shapes the final\n// `TreeContextValue`. If a feature grows, add a folder above — don't\n// extend this file.\n// =====================================================================\n\nexport interface TreeProviderProps<T>\n extends Pick<\n TreeRootProps<T>,\n | 'data'\n | 'getItemName'\n | 'loadChildren'\n | 'selectionMode'\n | 'activationMode'\n | 'initialExpandedIds'\n | 'initialSelectedIds'\n | 'indent'\n | 'appearance'\n | 'onSelectionChange'\n | 'onExpansionChange'\n | 'onActivate'\n | 'filterNode'\n | 'enableSearch'\n | 'showIndentGuides'\n | 'renderIcon'\n | 'renderLabel'\n | 'renderActions'\n | 'renderContextMenu'\n | 'contextMenuActions'\n | 'labels'\n | 'persistKey'\n | 'persistSelection'\n | 'adapter'\n | 'defaultMenuItems'\n | 'enableInlineRename'\n | 'enableDnD'\n | 'canDrop'\n > {\n children: React.ReactNode;\n}\n\nexport function TreeProvider<T>(props: TreeProviderProps<T>) {\n const {\n data,\n getItemName,\n loadChildren,\n selectionMode = 'single',\n activationMode = 'single-click',\n initialExpandedIds,\n initialSelectedIds,\n indent,\n appearance,\n onSelectionChange,\n onExpansionChange,\n onActivate,\n filterNode,\n enableSearch = false,\n showIndentGuides = false,\n renderIcon,\n renderLabel,\n renderActions,\n renderContextMenu,\n contextMenuActions,\n labels: labelsOverride,\n persistKey,\n persistSelection = false,\n adapter,\n defaultMenuItems,\n enableInlineRename = false,\n enableDnD = false,\n canDrop,\n children,\n } = props;\n\n // ---- Stable config ------------------------------------------------\n\n const labels = useMemo<TreeLabels>(\n () => ({ ...DEFAULT_TREE_LABELS, ...labelsOverride }),\n [labelsOverride],\n );\n\n const resolvedAppearance = useMemo(\n () => resolveAppearance(appearance, indent),\n [appearance, indent],\n );\n\n // ---- Reducer ------------------------------------------------------\n\n const persisted = useMemo(\n () => (persistKey ? loadTreeState(persistKey) : null),\n [persistKey],\n );\n\n const [state, dispatch] = useReducer(reducer, undefined, () =>\n createInitialState({\n persisted,\n initialExpandedIds,\n initialSelectedIds,\n persistSelection,\n }),\n );\n\n const bumpCacheTick = useCallback(() => dispatch({ type: 'cache-tick' }), []);\n\n // ---- Async children (cache + nodeById + refresh) ------------------\n\n const {\n nodeById,\n refresh,\n refreshAll,\n collectFolderIds,\n cache,\n } = useAsyncChildren<T>({\n data,\n loadChildren,\n expanded: state.expanded,\n cacheTick: state.cacheTick,\n bumpCacheTick,\n });\n\n // ---- Flat rows (depend on cache via cacheTick) --------------------\n\n const flatRows = useMemo<FlatRow<T>[]>(\n () =>\n flattenTree<T>({\n roots: data,\n expandedIds: state.expanded,\n cache,\n filterNode,\n }),\n [data, state.expanded, state.cacheTick, cache, filterNode],\n );\n\n const matchingIds = useMemo(() => {\n const set = new Set<TreeItemId>();\n if (!enableSearch || state.query.trim() === '') return set;\n const q = state.query.trim().toLowerCase();\n for (const row of flatRows) {\n if (getItemName(row.node).toLowerCase().includes(q)) {\n set.add(row.node.id);\n }\n }\n return set;\n }, [enableSearch, state.query, flatRows, getItemName]);\n\n // ---- Feature hooks ------------------------------------------------\n\n const expansion = useExpansion({ dispatch, collectFolderIds });\n const selection = useSelection<T>({\n dispatch,\n selectionMode,\n flatRows,\n selected: state.selected,\n anchor: state.anchor,\n focused: state.focused,\n });\n const rename = useRename<T>({\n dispatch,\n adapter,\n enableInlineRename,\n nodeById,\n getItemName,\n labels,\n });\n const clipboard = useClipboard<T>({\n dispatch,\n clipboard: state.clipboard,\n adapter,\n nodeById,\n labels,\n });\n const dnd = useDnd<T>({\n enabled: enableDnD,\n adapter,\n nodeById,\n selected: state.selected,\n labels,\n canDrop,\n });\n\n // ---- Activation ---------------------------------------------------\n\n const onActivateRef = useRef(onActivate);\n onActivateRef.current = onActivate;\n const activate = useCallback(\n (node: TreeNode<T>, opts: TreeActivateOptions = { preview: false }) =>\n onActivateRef.current?.(node, opts),\n [],\n );\n\n const setQuery = useCallback(\n (q: string) => dispatch({ type: 'set-query', q }),\n [],\n );\n\n // ---- Persist + notify callbacks -----------------------------------\n\n usePersistSync({\n expanded: state.expanded,\n selected: state.selected,\n persistKey,\n persistSelection,\n onSelectionChange,\n onExpansionChange,\n });\n\n // ---- Resolved context-menu resolver -------------------------------\n\n const resolvedContextMenuActions = useResolvedMenu<T>({\n adapter,\n contextMenuActions,\n defaultMenuItems,\n labels,\n selected: state.selected,\n clipboard: state.clipboard,\n nodeById,\n getItemName,\n enableInlineRename,\n startRename: rename.startRename,\n cutToClipboard: clipboard.cutToClipboard,\n copyToClipboard: clipboard.copyToClipboard,\n pasteFromClipboard: clipboard.pasteFromClipboard,\n });\n\n // Translate the declarative resolver into a slot-form\n // `renderContextMenu` so <TreeRow> doesn't need to know about it.\n // Explicit slot prop wins (escape-hatch for full custom menus).\n const finalRenderContextMenu = useMemo<TreeContextMenuSlot<T> | undefined>(\n () => {\n if (renderContextMenu) return renderContextMenu;\n const resolve = resolvedContextMenuActions;\n if (!resolve) return undefined;\n return (rowProps, trigger) => {\n const items = resolve(rowProps);\n const cleaned = items ? tidyMenuItems(items) : null;\n if (!cleaned || cleaned.length === 0) return trigger;\n return renderItemsAsContextMenu(rowProps, cleaned, trigger);\n };\n },\n [renderContextMenu, resolvedContextMenuActions],\n );\n\n // ---- Final value --------------------------------------------------\n\n const value = useMemo<TreeContextValue<T>>(\n () => ({\n // state\n expanded: state.expanded,\n selected: state.selected,\n anchor: state.anchor,\n focused: state.focused,\n query: state.query,\n renamingId: state.renaming,\n inlineRenameEnabled: rename.enabled,\n clipboard: state.clipboard,\n flatRows,\n matchingIds,\n\n // expansion\n ...expansion,\n\n // selection (note: `select` is from selection hook; expansion exports no `select`)\n ...selection,\n\n setQuery,\n\n // clipboard\n ...clipboard,\n\n // rename\n startRename: rename.startRename,\n cancelRename: rename.cancelRename,\n commitRename: rename.commitRename,\n\n // async\n refresh,\n refreshAll,\n activate,\n\n // config\n labels,\n appearance: resolvedAppearance,\n indent: resolvedAppearance.indent,\n selectionMode,\n activationMode,\n enableSearch,\n showIndentGuides,\n getItemName,\n\n // slots\n renderIcon,\n renderLabel,\n renderActions,\n renderContextMenu: finalRenderContextMenu,\n\n adapter,\n resolvedContextMenuActions,\n getNodeById: (id: TreeItemId) => nodeById.get(id),\n dnd,\n }),\n [\n state.expanded,\n state.selected,\n state.anchor,\n state.focused,\n state.query,\n state.renaming,\n state.clipboard,\n rename.enabled,\n rename.startRename,\n rename.cancelRename,\n rename.commitRename,\n flatRows,\n matchingIds,\n expansion,\n selection,\n setQuery,\n clipboard,\n refresh,\n refreshAll,\n activate,\n labels,\n resolvedAppearance,\n selectionMode,\n activationMode,\n enableSearch,\n showIndentGuides,\n getItemName,\n renderIcon,\n renderLabel,\n renderActions,\n finalRenderContextMenu,\n adapter,\n resolvedContextMenuActions,\n nodeById,\n dnd,\n ],\n );\n\n return (\n <TreeContext.Provider value={value as TreeContextValue<unknown>}>\n {children}\n </TreeContext.Provider>\n );\n}\n\n// Re-export internal types referenced by hook consumers.\nexport type { ChildCache, ChildEntry } from '../data/childCache';\n","'use client';\n\nimport {\n DndContext,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragMoveEvent,\n type DragStartEvent,\n} from '@dnd-kit/core';\nimport { useCallback, useRef } from 'react';\n\nimport { useTreeContext } from './context/TreeContext';\nimport { resolveDropZone, TREE_ROOT_DROP_ID } from './data/dnd';\nimport type { TreeItemId } from './types';\n\ninterface TreeDndProviderProps {\n children: React.ReactNode;\n}\n\n/**\n * Wrap Tree's body in a `<DndContext>` when DnD is enabled.\n *\n * One central drag handler decides the drop zone (`before` / `inside` /\n * `after`) from the cursor position vs. the hovered row's bounding box.\n * Rows themselves only register `useDraggable` + `useDroppable` — no\n * per-row `onPointerMove`, so dragging across 1000 rows stays cheap.\n *\n * Sensors: pointer (with a small activation distance so a plain click\n * doesn't initiate a drag) + keyboard (drag with Space/Enter, arrows,\n * Space drops — built-in accessibility).\n */\nexport function TreeDndProvider({ children }: TreeDndProviderProps) {\n const ctx = useTreeContext();\n const { dnd } = ctx;\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 4 } }),\n useSensor(KeyboardSensor),\n );\n\n // Latest cursor position — @dnd-kit gives us the active rectangle but\n // not the raw pointer Y. We grab it from pointermove ourselves and\n // use it inside `onDragMove` to compute the drop zone.\n const cursorYRef = useRef(0);\n\n const handleDragStart = useCallback(\n (e: DragStartEvent) => {\n dnd.beginDrag(e.active.id as TreeItemId);\n },\n [dnd],\n );\n\n const handleDragMove = useCallback(\n (e: DragMoveEvent) => {\n const overId = e.over?.id;\n // Root drop target — TreeEmptyArea registers under this id.\n if (overId === TREE_ROOT_DROP_ID) {\n const current = dnd.dropTarget;\n if (current?.id !== null || current?.position !== 'inside') {\n dnd.setDropTarget({ id: null, position: 'inside' });\n }\n return;\n }\n if (typeof overId !== 'string') {\n if (dnd.dropTarget !== null) dnd.setDropTarget(null);\n return;\n }\n\n // The dnd-kit `over.rect` is the droppable's bounding box. Combined\n // with the latest cursor Y we recover the same before/inside/after\n // split Finder uses.\n const rect = e.over?.rect;\n if (!rect) return;\n\n // `data-folder` on the dom row tells us if `inside` is allowed.\n const el = document.querySelector<HTMLElement>(\n `[data-tree-row][data-id=\"${CSS.escape(overId)}\"]`,\n );\n const isFolder = el?.dataset.folder === 'true';\n\n const position = resolveDropZone({\n pointerY: cursorYRef.current,\n rowRect: { top: rect.top, bottom: rect.top + rect.height, height: rect.height },\n isFolder,\n });\n\n const current = dnd.dropTarget;\n if (current?.id !== overId || current.position !== position) {\n dnd.setDropTarget({ id: overId, position });\n }\n },\n [dnd],\n );\n\n const handleDragEnd = useCallback(\n async (_e: DragEndEvent) => {\n await dnd.commitDrop();\n },\n [dnd],\n );\n\n const handleDragCancel = useCallback(() => {\n dnd.cancelDrag();\n }, [dnd]);\n\n // Track the latest cursor Y position globally while a drag is in flight.\n // Used by `handleDragMove` to figure out which third of the row we're\n // over. Cheap — one passive listener, no re-renders.\n const handlePointerMove = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n cursorYRef.current = e.clientY;\n }, []);\n\n if (!dnd.active) {\n return <>{children}</>;\n }\n\n return (\n <DndContext\n sensors={sensors}\n onDragStart={handleDragStart}\n onDragMove={handleDragMove}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n >\n <div\n onPointerMove={handlePointerMove}\n className=\"contents\"\n data-tree-dnd-surface=\"\"\n >\n {children}\n </div>\n </DndContext>\n );\n}\n","'use client';\n\nimport { ChevronDown, ChevronRight } from 'lucide-react';\nimport { memo } from 'react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useTreeContext } from '../context/TreeContext';\n\nexport interface TreeChevronProps {\n isExpanded: boolean;\n isFolder: boolean;\n className?: string;\n}\n\n/**\n * TreeChevron — expand/collapse chevron for a tree row.\n *\n * Memoised: re-renders only when `isExpanded`, `isFolder` or `className`\n * change. Reads appearance from context.\n */\nfunction TreeChevronRaw({ isExpanded, isFolder, className }: TreeChevronProps) {\n const { appearance } = useTreeContext();\n const size = { width: 'var(--tree-icon-size)', height: 'var(--tree-icon-size)' };\n\n if (!isFolder) {\n return (\n <span\n aria-hidden\n style={size}\n className={cn('inline-block shrink-0', className)}\n />\n );\n }\n const Icon = isExpanded ? ChevronDown : ChevronRight;\n return (\n <Icon\n aria-hidden\n strokeWidth={appearance.iconStrokeWidth}\n style={size}\n className={cn(\n 'shrink-0 text-muted-foreground/70 transition-transform',\n className,\n )}\n />\n );\n}\n\nexport const TreeChevron = memo(TreeChevronRaw);\n","'use client';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport type { TreeMovePosition } from '../types';\n\nexport interface TreeDropIndicatorProps {\n position: TreeMovePosition;\n /** Indent in pixels — keeps the line aligned with the row's text. */\n indent: number;\n /** Render a \"rejected\" style (red wash) when the drop is forbidden. */\n invalid?: boolean;\n}\n\n/**\n * Visual hint for an in-progress drag-and-drop. Three modes:\n *\n * - `before` / `after` → a 2px horizontal line above / below the row\n * - `inside` → a translucent primary wash filling the row\n *\n * Indents the line by the row's depth so it visually aligns with the\n * target's content (rather than running edge-to-edge).\n *\n * Positioned absolutely — the parent `TreeRow` provides `position: relative`.\n */\nexport function TreeDropIndicator({\n position,\n indent,\n invalid = false,\n}: TreeDropIndicatorProps) {\n if (position === 'inside') {\n return (\n <span\n aria-hidden\n data-tree-drop=\"inside\"\n className={cn(\n 'pointer-events-none absolute inset-0 rounded-sm ring-1',\n invalid\n ? 'bg-destructive/10 ring-destructive/40'\n : 'bg-primary/10 ring-primary/40',\n )}\n />\n );\n }\n\n const isBefore = position === 'before';\n return (\n <span\n aria-hidden\n data-tree-drop={position}\n style={{ paddingLeft: indent }}\n className={cn(\n 'pointer-events-none absolute right-0 left-0 h-px',\n isBefore ? 'top-0' : 'bottom-0',\n )}\n >\n <span\n className={cn(\n 'block h-0.5 rounded-full',\n invalid ? 'bg-destructive/70' : 'bg-primary',\n )}\n />\n </span>\n );\n}\n","'use client';\n\nimport { File, Folder, FolderOpen } from 'lucide-react';\nimport { memo } from 'react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useTreeContext } from '../context/TreeContext';\n\nexport interface TreeIconProps {\n isFolder: boolean;\n isExpanded: boolean;\n className?: string;\n}\n\n/**\n * TreeIcon — file/folder icon for a tree row.\n *\n * Memoised: re-renders only when `isFolder`, `isExpanded` or `className`\n * change. Reads appearance from context — context updates will still\n * trigger re-render as expected.\n */\nfunction TreeIconRaw({ isFolder, isExpanded, className }: TreeIconProps) {\n const { appearance } = useTreeContext();\n const Icon = isFolder ? (isExpanded ? FolderOpen : Folder) : File;\n return (\n <Icon\n aria-hidden\n strokeWidth={appearance.iconStrokeWidth}\n style={{ width: 'var(--tree-icon-size)', height: 'var(--tree-icon-size)' }}\n className={cn(\n 'shrink-0',\n isFolder ? 'text-foreground/70' : 'text-muted-foreground/80',\n className,\n )}\n />\n );\n}\n\nexport const TreeIcon = memo(TreeIconRaw);\n","'use client';\n\nimport { useTreeContext } from '../context/TreeContext';\n\nexport interface TreeIndentGuidesProps {\n level: number;\n indent: number;\n}\n\n/**\n * Vertical guide lines under nested rows. Renders one absolute-positioned\n * 1px column per ancestor level. Decorative — `aria-hidden` and\n * pointer-events disabled. Opacity comes from the tree appearance.\n */\nexport function TreeIndentGuides({ level, indent }: TreeIndentGuidesProps) {\n const { appearance } = useTreeContext();\n if (level <= 0) return null;\n return (\n <span\n aria-hidden\n className=\"pointer-events-none absolute inset-y-0 left-0\"\n style={{ width: 8 + level * indent, opacity: appearance.indentGuideOpacity }}\n >\n {Array.from({ length: level }).map((_, i) => (\n <span\n key={i}\n className=\"absolute inset-y-0 w-px bg-border\"\n style={{ left: 8 + i * indent + indent / 2 - 0.5 }}\n />\n ))}\n </span>\n );\n}\n","'use client';\n\nimport { memo } from 'react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nexport interface TreeLabelProps {\n children: React.ReactNode;\n isMatchingSearch?: boolean;\n className?: string;\n}\n\n/**\n * TreeLabel — truncated label for a tree row.\n *\n * Memoised: re-renders only when `children`, `isMatchingSearch` or\n * `className` change. `children` is compared by reference.\n */\nfunction TreeLabelRaw({ children, isMatchingSearch, className }: TreeLabelProps) {\n return (\n <span\n // Colour is set inline via the semantic token rather than the\n // `text-foreground` Tailwind utility: that class isn't always\n // emitted into a consuming app's stylesheet (the bundler only\n // generates utilities it sees referenced in scanned source), so\n // relying on it left the label rendering as UA-default black on\n // a dark surface. `var(--foreground)` always resolves.\n style={{ fontSize: 'var(--tree-font-size)', color: 'var(--foreground)' }}\n className={cn(\n 'truncate leading-tight tracking-[-0.005em]',\n isMatchingSearch && 'font-medium',\n className,\n )}\n >\n {children}\n </span>\n );\n}\n\nexport const TreeLabel = memo(TreeLabelRaw);\n","'use client';\n\n// =====================================================================\n// Filename split — used by the inline-rename input to auto-select the\n// \"base\" portion without the extension (Finder / macOS behaviour).\n//\n// Rules:\n// - dotfiles like \".env\" or \".gitignore\" → base = whole name, ext = ''\n// - \"foo\" → base = 'foo', ext = ''\n// - \"foo.txt\" → base = 'foo', ext = '.txt'\n// - \"foo.bar.baz\" → base = 'foo.bar', ext = '.baz'\n// - \"folder/\" (trailing slash) → trailing slash kept in ext\n//\n// We deliberately don't handle nested dots or multi-part extensions like\n// \".tar.gz\". Finder picks the last `.` and so do we — it's good enough\n// for selection UX and consistent with the OS.\n// =====================================================================\n\nexport interface SplitName {\n base: string;\n ext: string;\n}\n\nexport function splitFileName(name: string): SplitName {\n if (name.length === 0) return { base: '', ext: '' };\n\n // Dotfiles — leading dot is part of the base, not an extension.\n if (name.startsWith('.')) {\n const rest = name.slice(1);\n const dot = rest.lastIndexOf('.');\n if (dot < 0) return { base: name, ext: '' };\n return { base: '.' + rest.slice(0, dot), ext: rest.slice(dot) };\n }\n\n const dot = name.lastIndexOf('.');\n if (dot <= 0) return { base: name, ext: '' };\n return { base: name.slice(0, dot), ext: name.slice(dot) };\n}\n\n/**\n * Returns the `[selectionStart, selectionEnd]` pair to use on focus of an\n * `<input>` so only the base name is highlighted (Finder behaviour).\n *\n * Folders pass `isFolder=true` to skip extension detection and select\n * the entire name — folders don't have file extensions semantically.\n */\nexport function autoSelectRange(name: string, isFolder: boolean): [number, number] {\n if (isFolder) return [0, name.length];\n const { base } = splitFileName(name);\n return [0, base.length];\n}\n","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { autoSelectRange } from '../data/renameUtils';\n\nexport interface TreeRenameInputProps {\n initialValue: string;\n isFolder: boolean;\n /** Called with the new (trimmed) name when the user presses Enter / blurs. */\n onCommit: (nextName: string) => void | Promise<unknown>;\n /** Called when the user presses Escape. */\n onCancel: () => void;\n className?: string;\n}\n\n/**\n * Inline rename input rendered in place of `<TreeLabel>` while a row is\n * being renamed. Mounts focused with the *base* portion of the name\n * pre-selected (Finder behaviour — `foo.txt` selects `foo`).\n *\n * Behaviour:\n * - Enter → commit\n * - Escape → cancel (no adapter call)\n * - blur → commit (matches Finder; intentional even for empty\n * names — the host validates and re-opens on error)\n * - all other keys are stopped from bubbling so Tree's container\n * hotkeys (↑↓ delete F2 etc.) don't fire while typing.\n */\nexport function TreeRenameInput({\n initialValue,\n isFolder,\n onCommit,\n onCancel,\n className,\n}: TreeRenameInputProps) {\n const [value, setValue] = useState(initialValue);\n const inputRef = useRef<HTMLInputElement>(null);\n // Track whether we already committed/cancelled so the blur handler\n // doesn't fire a second time after Enter/Escape.\n const settledRef = useRef(false);\n\n useEffect(() => {\n const el = inputRef.current;\n if (!el) return;\n el.focus();\n const [start, end] = autoSelectRange(initialValue, isFolder);\n // setSelectionRange on a freshly focused input — schedule on next\n // tick to dodge browser quirks where focus() resets the selection.\n requestAnimationFrame(() => {\n try {\n el.setSelectionRange(start, end);\n } catch {\n /* Some input types reject setSelectionRange — safe to ignore. */\n }\n });\n // Run only once on mount.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const commit = () => {\n if (settledRef.current) return;\n settledRef.current = true;\n void onCommit(value);\n };\n\n const cancel = () => {\n if (settledRef.current) return;\n settledRef.current = true;\n onCancel();\n };\n\n return (\n <input\n ref={inputRef}\n type=\"text\"\n value={value}\n // Tree's container hotkeys (delete / arrows / F2 …) must not fire\n // while the user is typing the new name.\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === 'Enter') {\n e.preventDefault();\n commit();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n cancel();\n }\n }}\n onChange={(e) => setValue(e.target.value)}\n onBlur={commit}\n // Prevent click/dblclick on the row from re-firing while the input\n // is mounted (otherwise a focused click commits + re-selects).\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n // Right-click inside the input should be the native input menu,\n // not the row's context menu.\n onContextMenu={(e) => e.stopPropagation()}\n className={cn(\n 'min-w-0 flex-1 rounded-sm border border-primary/50 bg-background',\n 'px-1 py-0 text-foreground outline-none',\n 'focus:ring-1 focus:ring-primary/40',\n className,\n )}\n style={{\n // Match the row's font metrics so the input doesn't visibly jolt.\n fontSize: 'var(--tree-font-size)',\n height: 'calc(var(--tree-row-height) - 4px)',\n }}\n />\n );\n}\n","'use client';\n\nimport { Loader2 } from 'lucide-react';\nimport { memo, useCallback } from 'react';\nimport { useDraggable, useDroppable } from '@dnd-kit/core';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useTreeContext } from '../context/TreeContext';\nimport { radiusClass, rowStateClasses } from '../data/appearance';\nimport type { FlatRow, TreeRowRenderProps } from '../types';\nimport { TreeChevron } from './TreeChevron';\nimport { treeRowDomId } from './TreeContent';\nimport { TreeDropIndicator } from './TreeDropIndicator';\nimport { TreeIcon } from './TreeIcon';\nimport { TreeIndentGuides } from './TreeIndentGuides';\nimport { TreeLabel } from './TreeLabel';\nimport { TreeRenameInput } from './TreeRenameInput';\n\nexport interface TreeRowProps<T> {\n row: FlatRow<T>;\n className?: string;\n}\n\n/**\n * TreeRow — single row in a virtualised tree.\n *\n * Memoised: re-renders only when `row` reference or `className` change.\n * `row` is treated as immutable — the parent should not mutate node\n * objects in place.\n */\nfunction TreeRowRaw<T>({ row, className }: TreeRowProps<T>) {\n const ctx = useTreeContext<T>();\n const {\n appearance,\n activationMode,\n showIndentGuides,\n selected,\n focused,\n matchingIds,\n select,\n setSelectedIds,\n clickSelect,\n toggle,\n setFocus,\n activate,\n getItemName,\n renderIcon,\n renderLabel,\n renderActions,\n renderContextMenu,\n renamingId,\n commitRename,\n cancelRename,\n clipboard,\n dnd,\n } = ctx;\n\n const { node, level, isFolder, isExpanded, isLoading, posInSet, setSize } = row;\n const isSelected = selected.has(node.id);\n const isFocused = focused === node.id;\n const isMatchingSearch = matchingIds.has(node.id);\n const isMultiSelect = ctx.selectionMode === 'multiple';\n const isCut =\n clipboard?.kind === 'cut' && clipboard.ids.includes(node.id);\n\n const slot: TreeRowRenderProps<T> = {\n node,\n level,\n isSelected,\n isExpanded,\n isFocused,\n isFolder,\n isLoading,\n isMatchingSearch,\n };\n\n // Folders always toggle on single click regardless of `activationMode`.\n // Leaves dispatch by mode:\n // single-click → click activates {preview:false}\n // double-click → click only selects; dblclick activates {preview:false}\n // single-click-preview → click activates {preview:true}; dblclick activates {preview:false}\n const isRenaming = renamingId === node.id;\n const isDragging = dnd.draggingIds.has(node.id);\n const dropTarget = dnd.dropTarget;\n const isDropTarget = dropTarget?.id === node.id;\n const dropPosition = isDropTarget ? dropTarget!.position : null;\n\n // ─── DnD wiring ──────────────────────────────────────────────────\n // Hooks are called unconditionally so we don't violate rules-of-\n // hooks; the `disabled` flag short-circuits @dnd-kit when DnD is off\n // or the row is in inline rename.\n //\n // Drop-zone resolution (before/inside/after) is centralised in\n // `<TreeDndProvider>` via `onDragMove` — rows don't need a\n // `onPointerMove` of their own. Saves a listener × N rows.\n const dndDisabled = !dnd.active || isRenaming || node.disabled;\n const draggable = useDraggable({ id: node.id, disabled: dndDisabled });\n const droppable = useDroppable({ id: node.id, disabled: dndDisabled });\n\n const setRowEl = useCallback(\n (el: HTMLDivElement | null) => {\n draggable.setNodeRef(el);\n droppable.setNodeRef(el);\n },\n [draggable, droppable],\n );\n\n const isAllowedDrop =\n dropPosition && !isDragging\n ? dnd.isAllowedDrop(node, dropPosition)\n : true;\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (node.disabled || isRenaming) return;\n setFocus(node.id);\n // Multi-select: full Finder/Explorer semantics — plain replaces, meta\n // toggles, shift extends range from anchor, shift+meta unions range.\n // Single-select: clickSelect collapses to {id}. None: no-op.\n if (isMultiSelect) {\n clickSelect(node.id, { shift: e.shiftKey, meta: e.metaKey || e.ctrlKey });\n } else {\n select(node.id);\n }\n if (isFolder) {\n // Don't toggle on shift/meta clicks — those are pure selection edits.\n if (e.shiftKey || e.metaKey || e.ctrlKey) return;\n toggle(node.id);\n } else if (activationMode === 'single-click') {\n // Selection-only modifier clicks should not activate the leaf.\n if (e.shiftKey || e.metaKey || e.ctrlKey) return;\n activate(node, { preview: false });\n } else if (activationMode === 'single-click-preview') {\n if (e.shiftKey || e.metaKey || e.ctrlKey) return;\n activate(node, { preview: true });\n }\n };\n\n const handleDoubleClick = () => {\n if (node.disabled || isRenaming) return;\n if (isFolder) return;\n activate(node, { preview: false });\n };\n\n // Finder/Explorer semantics: right-click on an unselected row switches\n // selection to that single row (so menu actions apply to it). Right-\n // click on a row already in the selection leaves the multi-selection\n // intact (so destructive bulk actions stay safe).\n const handleContextMenu = () => {\n if (node.disabled || isRenaming) return;\n setFocus(node.id);\n if (!isSelected) {\n setSelectedIds([node.id]);\n }\n };\n\n const trigger = (\n <div\n ref={dnd.active ? setRowEl : undefined}\n id={treeRowDomId(node.id)}\n role=\"treeitem\"\n aria-level={level + 1}\n aria-posinset={posInSet}\n aria-setsize={setSize}\n aria-expanded={isFolder ? isExpanded : undefined}\n aria-selected={ctx.selectionMode === 'none' ? undefined : isSelected}\n aria-disabled={node.disabled || undefined}\n data-tree-row=\"\"\n data-id={node.id}\n data-activation-mode={activationMode}\n data-selected={isSelected ? 'true' : undefined}\n data-clipboard={isCut ? 'cut' : undefined}\n data-dragging={isDragging ? 'true' : undefined}\n data-focused={isFocused && !isSelected ? 'true' : undefined}\n data-folder={isFolder || undefined}\n data-expanded={isExpanded || undefined}\n tabIndex={-1}\n style={{\n paddingLeft: 6 + level * appearance.indent,\n height: 'var(--tree-row-height)',\n gap: 'var(--tree-gap)',\n }}\n {...(dnd.active ? draggable.listeners : {})}\n {...(dnd.active ? draggable.attributes : {})}\n // Block the browser's native \"click moves focus into the\n // focusable target\" behaviour. Tree owns its own focus model\n // (arrow keys drive `setFocus`, click only selects + activates),\n // and stealing focus on every click stops downstream auto-focus\n // patterns from working — e.g. clicking a file in a tree-plus-\n // preview layout would let the row grab focus after the preview\n // viewer tries to take it. The synthetic `onClick` below still\n // fires; only the focus side-effect of mousedown is suppressed.\n onMouseDown={(e) => {\n if (e.button === 0) e.preventDefault();\n }}\n onClick={handleClick}\n onDoubleClick={handleDoubleClick}\n onContextMenu={handleContextMenu}\n onFocus={() => setFocus(node.id)}\n className={cn(\n 'group/row relative flex w-full select-none items-center pr-2 text-left',\n 'transition-colors outline-none',\n node.disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n radiusClass(appearance),\n rowStateClasses(appearance),\n 'focus-visible:ring-1 focus-visible:ring-ring/50',\n isMatchingSearch && 'ring-1 ring-primary/30',\n isCut && 'opacity-60',\n isDragging && 'opacity-40',\n node.disabled && 'opacity-50',\n className,\n )}\n >\n {/* Active-row left indicator (VSCode style) */}\n {appearance.showActiveIndicator && isSelected ? (\n <span\n aria-hidden\n className={cn(\n 'absolute left-0 top-1 bottom-1 w-0.5 rounded-r-full',\n 'bg-foreground/30 group-focus-within/tree:bg-primary',\n )}\n />\n ) : null}\n\n {/* DnD drop indicator — top/bottom line for sibling reorder,\n fill for \"drop into folder\". */}\n {dropPosition && !isDragging ? (\n <TreeDropIndicator\n position={dropPosition}\n indent={6 + level * appearance.indent}\n invalid={!isAllowedDrop}\n />\n ) : null}\n\n {showIndentGuides && level > 0 ? (\n <TreeIndentGuides level={level} indent={appearance.indent} />\n ) : null}\n\n <TreeChevron isExpanded={isExpanded} isFolder={isFolder} />\n\n {isLoading ? (\n <Loader2\n aria-hidden\n strokeWidth={appearance.iconStrokeWidth}\n style={{ width: 'var(--tree-icon-size)', height: 'var(--tree-icon-size)' }}\n className=\"shrink-0 animate-spin text-muted-foreground/70\"\n />\n ) : renderIcon ? (\n renderIcon(slot)\n ) : (\n <TreeIcon isFolder={isFolder} isExpanded={isExpanded} />\n )}\n\n <span\n className=\"flex min-w-0 flex-1 items-center\"\n style={{ gap: 'var(--tree-gap)' }}\n >\n {renamingId === node.id ? (\n <TreeRenameInput\n initialValue={getItemName(node)}\n isFolder={isFolder}\n onCommit={(next) => commitRename(node.id, next)}\n onCancel={cancelRename}\n />\n ) : renderLabel ? (\n renderLabel(slot)\n ) : (\n <TreeLabel isMatchingSearch={isMatchingSearch}>{getItemName(node)}</TreeLabel>\n )}\n </span>\n\n {renderActions ? (\n <span\n className=\"ml-auto flex shrink-0 items-center gap-1 opacity-0 transition-opacity group-hover/row:opacity-100 group-focus-within/row:opacity-100\"\n onClick={(e) => e.stopPropagation()}\n >\n {renderActions(slot)}\n </span>\n ) : null}\n </div>\n );\n\n if (renderContextMenu) {\n return <>{renderContextMenu(slot, trigger)}</>;\n }\n return trigger;\n}\n\nexport const TreeRow = memo(TreeRowRaw) as typeof TreeRowRaw;\n","'use client';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\nexport interface TreeEmptyProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport function TreeEmpty({ children, className }: TreeEmptyProps) {\n return (\n <div\n className={cn(\n 'flex h-full min-h-32 items-center justify-center px-4 py-6 text-sm text-muted-foreground',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","'use client';\n\nimport { Fragment, type ReactNode } from 'react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useTreeContext } from '../context/TreeContext';\nimport { appearanceToStyle } from '../data/appearance';\nimport type { FlatRow, TreeRowRenderProps, TreeRowSlot } from '../types';\nimport { TreeRow } from './TreeRow';\nimport { TreeEmpty } from './TreeEmpty';\n\nexport interface TreeContentProps<T> {\n /** Custom row renderer; falls back to <TreeRow />. */\n children?: TreeRowSlot<T>;\n className?: string;\n /** Override aria-label for the container. */\n ariaLabel?: string;\n /**\n * Container ARIA role. Defaults to `'tree'` for standalone composition\n * use. `<TreeRoot>` passes `'group'` because its own outer element\n * already carries `role=\"tree\"` + `aria-activedescendant`.\n */\n role?: 'tree' | 'group' | 'presentation';\n}\n\n/** DOM id for a tree row — referenced by `aria-activedescendant`. */\nexport const treeRowDomId = (id: string) => `tree-row-${id}`;\n\nexport function TreeContent<T>({\n children,\n className,\n ariaLabel,\n role = 'tree',\n}: TreeContentProps<T>) {\n const { flatRows, labels, selected, focused, matchingIds, appearance, selectionMode } =\n useTreeContext<T>();\n\n if (flatRows.length === 0) {\n return <TreeEmpty>{labels.empty}</TreeEmpty>;\n }\n\n const isTree = role === 'tree';\n\n return (\n <div\n role={role}\n aria-label={isTree ? (ariaLabel ?? labels.ariaLabel) : undefined}\n aria-multiselectable={\n isTree && selectionMode === 'multiple' ? true : undefined\n }\n className={cn('relative flex flex-col py-1', className)}\n style={appearanceToStyle(appearance)}\n >\n {flatRows.map((row: FlatRow<T>) => {\n const slot: TreeRowRenderProps<T> = {\n node: row.node,\n level: row.level,\n isSelected: selected.has(row.node.id),\n isExpanded: row.isExpanded,\n isFocused: focused === row.node.id,\n isFolder: row.isFolder,\n isLoading: row.isLoading,\n isMatchingSearch: matchingIds.has(row.node.id),\n };\n const node: ReactNode = children ? children(slot) : <TreeRow row={row} />;\n return <Fragment key={row.node.id}>{node}</Fragment>;\n })}\n </div>\n );\n}\n","'use client';\n\nimport { useMemo } from 'react';\nimport { useDroppable } from '@dnd-kit/core';\nimport {\n ContextMenu,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuTrigger,\n} from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useTreeContext } from '../context/TreeContext';\nimport {\n buildDefaultMenuItems,\n type BuiltinActionContext,\n} from '../context/menu';\nimport { TREE_ROOT_DROP_ID } from '../data/dnd';\nimport type { TreeContextMenuItem } from '../types';\n\nexport interface TreeEmptyAreaProps {\n className?: string;\n}\n\n/**\n * Fills the remaining vertical space below `<TreeContent>` so the user\n * can right-click \"into nothing\" to get a Finder/Explorer-style empty\n * area menu (paste / new file / new folder at root), and so DnD has a\n * root drop target.\n *\n * Built-in actions are derived the same way as for rows — through\n * `buildDefaultMenuItems`, with `targetNode = null` (root) and\n * `selectedNodes = []` (nothing under the right-click). Items whose\n * `available()` predicate fails are simply skipped, so a tree without\n * `adapter.createFile/Folder` and without a clipboard payload shows\n * no menu at all.\n */\nexport function TreeEmptyArea({ className }: TreeEmptyAreaProps) {\n const ctx = useTreeContext();\n const {\n adapter,\n labels,\n getItemName,\n clipboard,\n cutToClipboard,\n copyToClipboard,\n pasteFromClipboard,\n startRename,\n inlineRenameEnabled,\n dnd,\n } = ctx;\n\n // Root drop target — receives drops that miss every row. The shared\n // `TreeDndProvider.onDragMove` detects when `e.over.id === ROOT_DROP_ID`\n // and pushes `{ id: null, position: 'inside' }` into `dnd.dropTarget`,\n // so this component doesn't need an `onPointerMove` of its own.\n const { setNodeRef: setDroppableRef, isOver } = useDroppable({\n id: TREE_ROOT_DROP_ID,\n disabled: !dnd.active,\n });\n\n // Resolve menu items every render — they depend on clipboard state\n // (paste shows/hides) and on whether the adapter exposes\n // createFile / createFolder.\n const items = useMemo<TreeContextMenuItem<unknown>[] | null>(() => {\n if (!adapter) return null;\n const builtinCtx: BuiltinActionContext<unknown> = {\n adapter,\n labels,\n selectedNodes: [],\n targetNode: null,\n getName: getItemName,\n startInlineRename: inlineRenameEnabled ? startRename : undefined,\n clipboard: {\n hasItems: !!clipboard && clipboard.ids.length > 0,\n cut: cutToClipboard,\n copy: copyToClipboard,\n paste: () => pasteFromClipboard(null, 'inside'),\n },\n };\n return buildDefaultMenuItems(builtinCtx);\n }, [\n adapter,\n labels,\n getItemName,\n inlineRenameEnabled,\n startRename,\n clipboard,\n cutToClipboard,\n copyToClipboard,\n pasteFromClipboard,\n ]);\n\n const surface = (\n <div\n ref={dnd.active ? setDroppableRef : undefined}\n data-tree-empty-area=\"\"\n data-drop-active={dnd.active && isOver ? 'true' : undefined}\n className={cn(\n // Soaks up the remaining vertical space inside the scroll\n // container so right-click on whitespace lands here, not on\n // the scroll viewport.\n 'min-h-[2.5rem] flex-1',\n dnd.active && isOver && 'bg-primary/5 rounded-sm ring-1 ring-primary/30',\n className,\n )}\n />\n );\n\n // No items and no DnD overlap → render plain spacer. Wrapping in a\n // `<ContextMenu>` with zero items would still capture right-clicks\n // and show an empty popover — that's worse than browser default.\n if (!items || items.length === 0) {\n return surface;\n }\n\n return (\n <ContextMenu>\n <ContextMenuTrigger asChild>{surface}</ContextMenuTrigger>\n <ContextMenuContent>\n {items.map((item, idx) => {\n if (item === 'separator') {\n return <ContextMenuSeparator key={`sep-${idx}`} />;\n }\n const Icon = item.icon;\n return (\n <ContextMenuItem\n key={item.id}\n disabled={item.disabled}\n variant={item.destructive ? 'destructive' : undefined}\n // Pass a synthetic \"no-target\" row props — the built-in\n // action handlers we surface here (new-file / new-folder\n // / paste) don't read row-specific fields anyway.\n onSelect={() =>\n item.onSelect({\n node: undefined as never,\n level: 0,\n isSelected: false,\n isExpanded: false,\n isFocused: false,\n isFolder: false,\n isLoading: false,\n isMatchingSearch: false,\n })\n }\n >\n {Icon ? <Icon /> : null}\n {item.label}\n {item.shortcut ? (\n <ContextMenuShortcut>{item.shortcut}</ContextMenuShortcut>\n ) : null}\n </ContextMenuItem>\n );\n })}\n </ContextMenuContent>\n </ContextMenu>\n );\n}\n","'use client';\n\nimport { useCallback, useMemo } from 'react';\n\nimport type { TreeItemId } from '../types';\nimport { useTreeContext } from './TreeContext';\n\nexport function useTreeLabels() {\n return useTreeContext().labels;\n}\n\nexport function useTreeRows<T>() {\n return useTreeContext<T>().flatRows;\n}\n\nexport function useTreeSelection<T>() {\n const ctx = useTreeContext<T>();\n const selectedIds = useMemo(() => [...ctx.selected], [ctx.selected]);\n const isSelected = useCallback(\n (id: TreeItemId) => ctx.selected.has(id),\n [ctx.selected],\n );\n return useMemo(\n () => ({\n selectedIds,\n anchor: ctx.anchor,\n select: ctx.select,\n setSelectedIds: ctx.setSelectedIds,\n clear: ctx.clearSelection,\n clickSelect: ctx.clickSelect,\n moveSelect: ctx.moveSelect,\n selectAll: ctx.selectAll,\n isSelected,\n }),\n [\n selectedIds,\n ctx.anchor,\n ctx.select,\n ctx.setSelectedIds,\n ctx.clearSelection,\n ctx.clickSelect,\n ctx.moveSelect,\n ctx.selectAll,\n isSelected,\n ],\n );\n}\n\nexport function useTreeExpansion<T>() {\n const ctx = useTreeContext<T>();\n const expandedIds = useMemo(() => [...ctx.expanded], [ctx.expanded]);\n const isExpanded = useCallback(\n (id: TreeItemId) => ctx.expanded.has(id),\n [ctx.expanded],\n );\n return useMemo(\n () => ({\n expandedIds,\n expand: ctx.expand,\n collapse: ctx.collapse,\n toggle: ctx.toggle,\n expandAll: ctx.expandAll,\n collapseAll: ctx.collapseAll,\n isExpanded,\n }),\n [\n expandedIds,\n ctx.expand,\n ctx.collapse,\n ctx.toggle,\n ctx.expandAll,\n ctx.collapseAll,\n isExpanded,\n ],\n );\n}\n\nexport function useTreeFocus<T>() {\n const ctx = useTreeContext<T>();\n return useMemo(\n () => ({ focusedId: ctx.focused, setFocus: ctx.setFocus }),\n [ctx.focused, ctx.setFocus],\n );\n}\n\nexport function useTreeSearch<T>() {\n const ctx = useTreeContext<T>();\n return useMemo(\n () => ({\n isOpen: ctx.enableSearch,\n query: ctx.query,\n setQuery: ctx.setQuery,\n matchingIds: ctx.matchingIds,\n matchCount: ctx.matchingIds.size,\n }),\n [ctx.enableSearch, ctx.query, ctx.setQuery, ctx.matchingIds],\n );\n}\n\nexport function useTreeDnd<T>() {\n const ctx = useTreeContext<T>();\n return ctx.dnd;\n}\n\nexport function useTreeClipboard<T>() {\n const ctx = useTreeContext<T>();\n const isCut = useCallback(\n (id: TreeItemId) => ctx.clipboard?.kind === 'cut' && ctx.clipboard.ids.includes(id),\n [ctx.clipboard],\n );\n return useMemo(\n () => ({\n clipboard: ctx.clipboard,\n isCut,\n cut: ctx.cutToClipboard,\n copy: ctx.copyToClipboard,\n paste: ctx.pasteFromClipboard,\n clear: ctx.clearClipboard,\n }),\n [\n ctx.clipboard,\n isCut,\n ctx.cutToClipboard,\n ctx.copyToClipboard,\n ctx.pasteFromClipboard,\n ctx.clearClipboard,\n ],\n );\n}\n\nexport function useTreeRename<T>() {\n const ctx = useTreeContext<T>();\n return useMemo(\n () => ({\n /** True when the host allowed inline rename AND the adapter exposes `rename`. */\n enabled: ctx.inlineRenameEnabled,\n /** Currently renaming id, or `null`. */\n renamingId: ctx.renamingId,\n startRename: ctx.startRename,\n cancelRename: ctx.cancelRename,\n commitRename: ctx.commitRename,\n }),\n [\n ctx.inlineRenameEnabled,\n ctx.renamingId,\n ctx.startRename,\n ctx.cancelRename,\n ctx.commitRename,\n ],\n );\n}\n\nexport function useTreeActions<T>() {\n const ctx = useTreeContext<T>();\n return useMemo(\n () => ({\n expand: ctx.expand,\n collapse: ctx.collapse,\n toggle: ctx.toggle,\n expandAll: ctx.expandAll,\n collapseAll: ctx.collapseAll,\n refresh: ctx.refresh,\n refreshAll: ctx.refreshAll,\n activate: ctx.activate,\n }),\n [\n ctx.expand,\n ctx.collapse,\n ctx.toggle,\n ctx.expandAll,\n ctx.collapseAll,\n ctx.refresh,\n ctx.refreshAll,\n ctx.activate,\n ],\n );\n}\n","'use client';\n\nimport { Search, X } from 'lucide-react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useTreeContext } from '../context/TreeContext';\nimport { useTreeSearch } from '../context/hooks';\n\nexport interface TreeSearchInputProps {\n className?: string;\n showMatches?: boolean;\n}\n\nexport function TreeSearchInput({ className, showMatches = true }: TreeSearchInputProps) {\n const { labels } = useTreeContext();\n const { query, setQuery, matchCount } = useTreeSearch();\n\n return (\n <div\n className={cn(\n 'flex items-center gap-2 rounded-md border border-border bg-background px-2',\n className,\n )}\n >\n <Search aria-hidden className=\"size-3.5 shrink-0 text-muted-foreground\" />\n <input\n type=\"search\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={labels.searchPlaceholder}\n className=\"h-7 w-full bg-transparent text-sm outline-none placeholder:text-muted-foreground\"\n />\n {showMatches && query.trim().length > 0 ? (\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {labels.searchMatches(matchCount)}\n </span>\n ) : null}\n {query.length > 0 ? (\n <button\n type=\"button\"\n onClick={() => setQuery('')}\n aria-label=\"Clear search\"\n className=\"shrink-0 rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n <X aria-hidden className=\"size-3.5\" />\n </button>\n ) : null}\n </div>\n );\n}\n","'use client';\n\nimport type { FlatRow, TreeItemId } from '../../types';\n\n/** Pick the id one row below the current focused row (clamped at the end). */\nexport function nextRowId<T>(rows: readonly FlatRow<T>[], idx: number): TreeItemId | null {\n if (rows.length === 0) return null;\n const next = rows[Math.min(idx + 1, rows.length - 1)] ?? rows[0];\n return next.node.id;\n}\n\n/** Pick the id one row above the current focused row (clamped at the start). */\nexport function prevRowId<T>(rows: readonly FlatRow<T>[], idx: number): TreeItemId | null {\n if (rows.length === 0) return null;\n const prev = rows[Math.max(idx - 1, 0)] ?? rows[0];\n return prev.node.id;\n}\n\n/** First / last visible row id, or null if the list is empty. */\nexport function edgeRowId<T>(\n rows: readonly FlatRow<T>[],\n edge: 'first' | 'last',\n): TreeItemId | null {\n if (rows.length === 0) return null;\n return edge === 'first' ? rows[0].node.id : rows[rows.length - 1].node.id;\n}\n","'use client';\n\nimport type { FlatRow } from '../../types';\n\n/**\n * What should `→` do on the current row?\n *\n * - collapsed folder → expand it\n * - expanded folder → jump to first visible child\n * - leaf → no-op\n */\nexport type RightArrowOutcome<T> =\n | { kind: 'expand'; id: string }\n | { kind: 'focus'; id: string }\n | { kind: 'noop' };\n\nexport function resolveRightArrow<T>(\n current: FlatRow<T> | null,\n rows: readonly FlatRow<T>[],\n idx: number,\n): RightArrowOutcome<T> {\n if (!current) return { kind: 'noop' };\n if (current.isFolder && !current.isExpanded) {\n return { kind: 'expand', id: current.node.id };\n }\n if (current.isFolder && current.isExpanded) {\n const next = rows[idx + 1];\n return next ? { kind: 'focus', id: next.node.id } : { kind: 'noop' };\n }\n return { kind: 'noop' };\n}\n\n/**\n * What should `←` do on the current row?\n *\n * - expanded folder → collapse it\n * - leaf / collapsed w/ parent → focus parent\n * - root leaf → no-op\n */\nexport type LeftArrowOutcome<T> =\n | { kind: 'collapse'; id: string }\n | { kind: 'focus'; id: string }\n | { kind: 'noop' };\n\nexport function resolveLeftArrow<T>(current: FlatRow<T> | null): LeftArrowOutcome<T> {\n if (!current) return { kind: 'noop' };\n if (current.isFolder && current.isExpanded) {\n return { kind: 'collapse', id: current.node.id };\n }\n if (current.parentId) {\n return { kind: 'focus', id: current.parentId };\n }\n return { kind: 'noop' };\n}\n","'use client';\n\nimport type { FlatRow } from '../../types';\n\n/**\n * Enter / Space on the current row:\n * - folder: toggle (collapse if expanded, else expand)\n * - leaf: activate\n *\n * Always selects (single-select semantics for keyboard input).\n */\nexport type ActivateOutcome<T> =\n | { kind: 'toggle-folder'; id: string; willExpand: boolean }\n | { kind: 'activate-leaf'; id: string }\n | { kind: 'noop' };\n\nexport function resolveActivate<T>(current: FlatRow<T> | null): ActivateOutcome<T> {\n if (!current) return { kind: 'noop' };\n if (current.isFolder) {\n return {\n kind: 'toggle-folder',\n id: current.node.id,\n willExpand: !current.isExpanded,\n };\n }\n return { kind: 'activate-leaf', id: current.node.id };\n}\n","'use client';\n\nimport { useCallback, useRef } from 'react';\nimport { useHotkey } from '@djangocfg/ui-core/hooks';\n\nimport { edgeRowId, nextRowId, prevRowId } from './arrow-nav';\nimport { resolveLeftArrow, resolveRightArrow } from './expand-collapse';\nimport { resolveActivate } from './activation';\nimport type {\n CurrentRow,\n UseTreeKeyboardOptions,\n UseTreeKeyboardReturn,\n} from './types';\n\n/**\n * Standard tree keyboard navigation, scoped to the container ref.\n *\n * - ↑ / ↓ : prev / next visible row (Shift extends range)\n * - Home / End : first / last visible row (Shift extends range)\n * - → / ← : expand-or-jump-to-child / collapse-or-jump-to-parent\n * - Enter / Space : activate (folder → toggle, leaf → onActivate)\n * - Esc : clear selection\n * - Cmd/Ctrl + A : select all (multi-select only)\n *\n * Pure decision-making lives in the sibling helpers (`arrow-nav.ts`,\n * `expand-collapse.ts`, `activation.ts`) so it's unit-testable without\n * a DOM. This file only wires up `useHotkey` bindings and dispatches\n * the helper outcomes back to the consumer's callbacks.\n */\nexport function useTreeKeyboard<T>({\n rows,\n focusedId,\n enabled = true,\n multiSelect = false,\n onFocus,\n onSelect,\n onActivate,\n onExpand,\n onCollapse,\n onClearSelection,\n onSelectAll,\n}: UseTreeKeyboardOptions<T>): UseTreeKeyboardReturn {\n // Keep latest values in refs so the callbacks below stay stable across\n // renders — react-hotkeys-hook re-binds on dep change otherwise.\n const rowsRef = useRef(rows);\n const focusedIdRef = useRef(focusedId);\n rowsRef.current = rows;\n focusedIdRef.current = focusedId;\n\n const getCurrent = (): CurrentRow<T> => {\n const r = rowsRef.current;\n const id = focusedIdRef.current;\n const idx = id ? r.findIndex((x) => x.node.id === id) : -1;\n return { rows: r, idx, current: idx >= 0 ? r[idx] : null };\n };\n\n // Down / Shift+Down. Plain moves focus, shift extends selection range.\n const refDown = useHotkey(\n ['down', 'shift+down'],\n (e) => {\n const { rows: r, idx } = getCurrent();\n const id = nextRowId(r, idx);\n if (id) onFocus(id, { extend: multiSelect && e.shiftKey });\n },\n { enabled, preventDefault: true, description: 'Next row (Shift extends)' },\n );\n\n const refUp = useHotkey(\n ['up', 'shift+up'],\n (e) => {\n const { rows: r, idx } = getCurrent();\n const id = prevRowId(r, idx);\n if (id) onFocus(id, { extend: multiSelect && e.shiftKey });\n },\n { enabled, preventDefault: true, description: 'Previous row (Shift extends)' },\n );\n\n const refHome = useHotkey(\n ['home', 'shift+home'],\n (e) => {\n const id = edgeRowId(rowsRef.current, 'first');\n if (id) onFocus(id, { extend: multiSelect && e.shiftKey });\n },\n { enabled, preventDefault: true, description: 'First row (Shift extends)' },\n );\n\n const refEnd = useHotkey(\n ['end', 'shift+end'],\n (e) => {\n const id = edgeRowId(rowsRef.current, 'last');\n if (id) onFocus(id, { extend: multiSelect && e.shiftKey });\n },\n { enabled, preventDefault: true, description: 'Last row (Shift extends)' },\n );\n\n const refSelectAll = useHotkey(\n 'mod+a',\n () => {\n if (!multiSelect) return;\n onSelectAll?.();\n },\n {\n enabled: enabled && multiSelect,\n preventDefault: true,\n description: 'Select all visible rows',\n },\n );\n\n const refRight = useHotkey(\n 'right',\n () => {\n const { rows: r, idx, current } = getCurrent();\n const out = resolveRightArrow(current, r, idx);\n switch (out.kind) {\n case 'expand':\n onExpand(out.id);\n return;\n case 'focus':\n onFocus(out.id, { extend: false });\n return;\n case 'noop':\n return;\n }\n },\n { enabled, preventDefault: true, description: 'Expand / first child' },\n );\n\n const refLeft = useHotkey(\n 'left',\n () => {\n const { current } = getCurrent();\n const out = resolveLeftArrow(current);\n switch (out.kind) {\n case 'collapse':\n onCollapse(out.id);\n return;\n case 'focus':\n onFocus(out.id, { extend: false });\n return;\n case 'noop':\n return;\n }\n },\n { enabled, preventDefault: true, description: 'Collapse / parent' },\n );\n\n const refActivate = useHotkey(\n ['enter', 'space'],\n () => {\n const { current } = getCurrent();\n const out = resolveActivate(current);\n if (out.kind === 'noop') return;\n onSelect(out.kind === 'activate-leaf' ? out.id : out.id);\n if (out.kind === 'toggle-folder') {\n if (out.willExpand) onExpand(out.id);\n else onCollapse(out.id);\n } else {\n onActivate(out.id);\n }\n },\n { enabled, preventDefault: true, description: 'Activate / toggle' },\n );\n\n const refEscape = useHotkey(\n 'escape',\n () => onClearSelection(),\n { enabled, preventDefault: true, description: 'Clear selection' },\n );\n\n const ref = useCallback(\n (instance: HTMLElement | null) => {\n refDown(instance);\n refUp(instance);\n refHome(instance);\n refEnd(instance);\n refRight(instance);\n refLeft(instance);\n refActivate(instance);\n refEscape(instance);\n refSelectAll(instance);\n },\n [\n refDown,\n refUp,\n refHome,\n refEnd,\n refRight,\n refLeft,\n refActivate,\n refEscape,\n refSelectAll,\n ],\n );\n\n return { ref };\n}\n","'use client';\n\nimport type { FlatRow, TreeNode } from '../../types';\n\n/** Find the first row whose name starts with `prefix` (case-insensitive). */\nexport function findRowByPrefix<T>(\n rows: readonly FlatRow<T>[],\n getName: (node: TreeNode<T>) => string,\n prefix: string,\n): FlatRow<T> | undefined {\n if (prefix.length === 0) return undefined;\n return rows.find((row) => getName(row.node).toLowerCase().startsWith(prefix));\n}\n\n/**\n * Should this key terminate type-ahead instead of extending the buffer?\n * Navigation, Enter, Tab, Escape — all reset; everything else continues.\n */\nexport function isResetKey(key: string): boolean {\n return (\n key === 'Escape' ||\n key === 'Enter' ||\n key === 'Tab' ||\n key.startsWith('Arrow') ||\n key === 'Home' ||\n key === 'End' ||\n key === 'PageUp' ||\n key === 'PageDown'\n );\n}\n\n/**\n * Skip keystrokes that originate inside a text field so type-ahead\n * doesn't yank focus while the user is filling in a form.\n */\nexport function isTypingTarget(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null;\n if (!el) return false;\n const tag = el.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return true;\n return el.isContentEditable === true;\n}\n","'use client';\n\nimport { useEffect, useRef } from 'react';\n\nimport type { FlatRow, TreeNode } from '../../types';\nimport { findRowByPrefix, isResetKey, isTypingTarget } from './match-prefix';\n\nconst FLUSH_MS = 600;\n\nexport interface UseTreeTypeAheadOptions<T> {\n /** Visible flat rows in render order. */\n rows: FlatRow<T>[];\n /** How to read the displayed name of a node (matched case-insensitively). */\n getItemName: (node: TreeNode<T>) => string;\n /** Element receiving keydown events. */\n containerRef: React.RefObject<HTMLElement | null>;\n /** Called with the matched node id so the consumer can focus / scroll. */\n onMatch: (id: string) => void;\n /** Disable without removing the call site. */\n enabled?: boolean;\n}\n\n/**\n * Type-ahead jump (Finder / VSCode style).\n *\n * Builds a rolling buffer of printable keys (within ~600 ms of each other)\n * and notifies the consumer of the first row whose name starts with that\n * prefix. Resets on Esc / Enter / navigation keys / timeout.\n */\nexport function useTreeTypeAhead<T>({\n rows,\n getItemName,\n containerRef,\n onMatch,\n enabled = true,\n}: UseTreeTypeAheadOptions<T>) {\n const bufferRef = useRef('');\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const rowsRef = useRef(rows);\n const getNameRef = useRef(getItemName);\n const onMatchRef = useRef(onMatch);\n rowsRef.current = rows;\n getNameRef.current = getItemName;\n onMatchRef.current = onMatch;\n\n useEffect(() => {\n if (!enabled) return;\n const target = containerRef.current;\n if (!target) return;\n\n const reset = () => {\n bufferRef.current = '';\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n };\n\n const handler = (e: KeyboardEvent) => {\n if (isTypingTarget(e.target)) return;\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n if (isResetKey(e.key)) {\n reset();\n return;\n }\n if (e.key.length !== 1) return;\n\n bufferRef.current += e.key.toLowerCase();\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(reset, FLUSH_MS);\n\n const hit = findRowByPrefix(\n rowsRef.current,\n getNameRef.current,\n bufferRef.current,\n );\n if (hit) {\n e.preventDefault();\n onMatchRef.current(hit.node.id);\n }\n };\n\n target.addEventListener('keydown', handler);\n return () => {\n target.removeEventListener('keydown', handler);\n reset();\n };\n }, [containerRef, enabled]);\n}\n","'use client';\n\nimport type { BuiltinActionContext } from '../../context/menu';\nimport type {\n TreeAdapter,\n TreeItemId,\n TreeLabels,\n TreeNode,\n} from '../../types';\n\nexport interface BuildCtxInput<T> {\n adapter?: TreeAdapter<T>;\n labels: TreeLabels;\n selected: ReadonlySet<TreeItemId>;\n focused: TreeItemId | null;\n getNodeById: (id: TreeItemId) => TreeNode<T> | undefined;\n getItemName: (node: TreeNode<T>) => string;\n startInlineRename?: (id: TreeItemId) => void;\n clipboard?: BuiltinActionContext<T>['clipboard'];\n}\n\n/**\n * Build a `BuiltinActionContext<T>` snapshot from the current Tree state.\n * Returns `null` when the adapter is missing — the hotkey handlers\n * short-circuit on null so no built-in action fires without an adapter.\n */\nexport function buildBuiltinCtx<T>(\n input: BuildCtxInput<T>,\n): BuiltinActionContext<T> | null {\n if (!input.adapter) return null;\n const selectedNodes: TreeNode<T>[] = [];\n for (const id of input.selected) {\n const n = input.getNodeById(id);\n if (n) selectedNodes.push(n);\n }\n const targetNode = input.focused\n ? input.getNodeById(input.focused) ?? null\n : null;\n return {\n adapter: input.adapter,\n labels: input.labels,\n selectedNodes,\n targetNode,\n getName: input.getItemName,\n startInlineRename: input.startInlineRename,\n clipboard: input.clipboard,\n };\n}\n","'use client';\n\nimport { useCallback, useRef } from 'react';\nimport { useHotkey } from '@djangocfg/ui-core/hooks';\n\nimport { runBuiltinAction, type BuiltinActionContext } from '../../context/menu';\nimport type {\n TreeAdapter,\n TreeBuiltinAction,\n TreeItemId,\n TreeLabels,\n TreeNode,\n} from '../../types';\nimport { buildBuiltinCtx } from './build-ctx';\n\nexport interface UseTreeFinderHotkeysOptions<T> {\n /** Off by default — Tree opt-ins via `enableFinderHotkeys`. */\n enabled: boolean;\n /** Adapter — used both for action availability and dispatch. */\n adapter?: TreeAdapter<T>;\n /** Labels (passed through into adapter action context for dialogs). */\n labels: TreeLabels;\n /** Live selection (set of ids). */\n selected: ReadonlySet<TreeItemId>;\n /** Live focused id (used as \"target\" for new-file/new-folder actions). */\n focused: TreeItemId | null;\n /** Id → node lookup. */\n getNodeById: (id: TreeItemId) => TreeNode<T> | undefined;\n /** Display name resolver. */\n getItemName: (node: TreeNode<T>) => string;\n /** Open inline rename on the row (P3). Falls back to a prompt otherwise. */\n startInlineRename?: (id: TreeItemId) => void;\n /** Clipboard bindings (P5). When undefined, ⌘C/X/V are no-ops. */\n clipboard?: BuiltinActionContext<T>['clipboard'];\n /** Whether typing is currently in inline-rename input — pauses bindings. */\n paused?: boolean;\n}\n\nexport interface UseTreeFinderHotkeysReturn {\n /** Attach to the tree container ref so hotkeys only fire when it has focus. */\n ref: (instance: HTMLElement | null) => void;\n}\n\n/**\n * Wire the platform-aware Finder/Explorer shortcuts to the built-in\n * adapter actions. Bindings are scoped to the container ref via\n * `useHotkey`, so they don't leak to the rest of the page.\n *\n * Each shortcut is bound by an explicit `useHotkey` call (no `.map(useHotkey)`\n * loop, so the rules-of-hooks lint passes cleanly). The handler routes\n * through `runBuiltinAction`, which silently no-ops when the adapter\n * doesn't expose the matching method — so a Tree with `adapter = { remove }`\n * only effectively reacts to ⌘⌫ / Delete.\n */\nexport function useTreeFinderHotkeys<T>(\n opts: UseTreeFinderHotkeysOptions<T>,\n): UseTreeFinderHotkeysReturn {\n const optsRef = useRef(opts);\n optsRef.current = opts;\n\n const run = useCallback(async (action: TreeBuiltinAction) => {\n const o = optsRef.current;\n if (o.paused) return;\n const ctx = buildBuiltinCtx({\n adapter: o.adapter,\n labels: o.labels,\n selected: o.selected,\n focused: o.focused,\n getNodeById: o.getNodeById,\n getItemName: o.getItemName,\n startInlineRename: o.startInlineRename,\n clipboard: o.clipboard,\n });\n if (!ctx) return;\n await runBuiltinAction(action, ctx);\n }, []);\n\n // One explicit binding per shortcut. Adding a new built-in action means\n // adding one more line here — the trade-off is verbose-but-static vs.\n // a fragile `.map(useHotkey)` loop.\n\n const refDelete = useHotkey(\n ['mod+backspace', 'delete'],\n () => void run('delete'),\n {\n enabled: opts.enabled,\n preventDefault: true,\n description: 'Delete selected items',\n scope: 'tree',\n },\n );\n\n const refRename = useHotkey('f2', () => void run('rename'), {\n enabled: opts.enabled,\n preventDefault: true,\n description: 'Rename selected item',\n scope: 'tree',\n });\n\n const refDuplicate = useHotkey('mod+d', () => void run('duplicate'), {\n enabled: opts.enabled,\n preventDefault: true,\n description: 'Duplicate selected items',\n scope: 'tree',\n });\n\n const refNewFolder = useHotkey('mod+shift+n', () => void run('new-folder'), {\n enabled: opts.enabled,\n preventDefault: true,\n description: 'New folder',\n scope: 'tree',\n });\n\n const refNewFile = useHotkey('mod+n', () => void run('new-file'), {\n enabled: opts.enabled,\n preventDefault: true,\n description: 'New file',\n scope: 'tree',\n });\n\n const refCut = useHotkey('mod+x', () => void run('cut'), {\n enabled: opts.enabled,\n preventDefault: true,\n description: 'Cut',\n scope: 'tree',\n });\n\n const refCopy = useHotkey('mod+c', () => void run('copy'), {\n enabled: opts.enabled,\n preventDefault: true,\n description: 'Copy',\n scope: 'tree',\n });\n\n const refPaste = useHotkey('mod+v', () => void run('paste'), {\n enabled: opts.enabled,\n preventDefault: true,\n description: 'Paste',\n scope: 'tree',\n });\n\n const ref = useCallback(\n (instance: HTMLElement | null) => {\n refDelete(instance);\n refRename(instance);\n refDuplicate(instance);\n refNewFolder(instance);\n refNewFile(instance);\n refCut(instance);\n refCopy(instance);\n refPaste(instance);\n },\n [\n refDelete,\n refRename,\n refDuplicate,\n refNewFolder,\n refNewFile,\n refCut,\n refCopy,\n refPaste,\n ],\n );\n\n return { ref };\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef } from 'react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { TreeProvider, useTreeContext } from './context/TreeContext';\nimport { TreeDndProvider } from './TreeDndProvider';\nimport { TreeContent, treeRowDomId } from './components/TreeContent';\nimport { TreeEmptyArea } from './components/TreeEmptyArea';\nimport { TreeSearchInput } from './components/TreeSearchInput';\nimport { appearanceToStyle } from './data/appearance';\nimport {\n useTreeKeyboard,\n useTreeTypeAhead,\n useTreeFinderHotkeys,\n} from './hooks';\nimport type { TreeActionsHandle, TreeRootProps } from './types';\n\n/**\n * High-level entry point. Wraps Provider + (optional) search bar + content.\n *\n * For full control, compose with <TreeProvider>, <TreeContent>,\n * <TreeSearchInput>, <TreeRow>, etc. directly from `@djangocfg/ui-tools/tree`.\n */\nfunction TreeRoot<T>(props: TreeRootProps<T>) {\n const {\n data,\n getItemName,\n loadChildren,\n selectionMode,\n activationMode,\n initialExpandedIds,\n initialSelectedIds,\n indent,\n appearance,\n onSelectionChange,\n onExpansionChange,\n onActivate,\n filterNode,\n enableSearch = false,\n enableTypeAhead = true,\n showIndentGuides = false,\n enableInlineRename = false,\n enableFinderHotkeys = false,\n enableDnD = false,\n canDrop,\n renderRow,\n renderIcon,\n renderLabel,\n renderActions,\n renderContextMenu,\n contextMenuActions,\n labels,\n persistKey,\n persistSelection = false,\n adapter,\n defaultMenuItems,\n actionsRef,\n className,\n style,\n } = props;\n\n return (\n <TreeProvider<T>\n data={data}\n getItemName={getItemName}\n loadChildren={loadChildren}\n selectionMode={selectionMode}\n activationMode={activationMode}\n initialExpandedIds={initialExpandedIds}\n initialSelectedIds={initialSelectedIds}\n indent={indent}\n appearance={appearance}\n onSelectionChange={onSelectionChange}\n onExpansionChange={onExpansionChange}\n onActivate={onActivate}\n filterNode={filterNode}\n enableSearch={enableSearch}\n showIndentGuides={showIndentGuides}\n renderIcon={renderIcon}\n renderLabel={renderLabel}\n renderActions={renderActions}\n // The provider builds the *declarative* merged resolver. Slot\n // conversion happens inside <TreeRootShell /> via the inner ctx,\n // so built-in actions can read live selection state.\n renderContextMenu={renderContextMenu}\n contextMenuActions={contextMenuActions}\n adapter={adapter}\n defaultMenuItems={defaultMenuItems}\n enableInlineRename={enableInlineRename}\n enableDnD={enableDnD}\n canDrop={canDrop}\n labels={labels}\n persistKey={persistKey}\n persistSelection={persistSelection}\n >\n <TreeRootShell<T>\n className={className}\n style={style}\n enableSearch={enableSearch}\n enableTypeAhead={enableTypeAhead}\n enableFinderHotkeys={enableFinderHotkeys}\n renderRow={renderRow}\n actionsRef={actionsRef}\n />\n </TreeProvider>\n );\n}\n\ninterface TreeRootShellProps<T> {\n className?: string;\n style?: React.CSSProperties;\n enableSearch: boolean;\n enableTypeAhead: boolean;\n enableFinderHotkeys: boolean;\n renderRow?: TreeRootProps<T>['renderRow'];\n actionsRef?: React.MutableRefObject<TreeActionsHandle | null>;\n}\n\nfunction TreeRootShell<T>({\n className,\n style,\n enableSearch,\n enableTypeAhead,\n enableFinderHotkeys,\n renderRow,\n actionsRef,\n}: TreeRootShellProps<T>) {\n const containerRef = useRef<HTMLDivElement>(null);\n const ctx = useTreeContext<T>();\n\n // Publish the action handle to the outer ref so host code can call\n // refresh / refreshAll after a mutation that originated outside Tree.\n // Effect runs after mount; the ref stays populated until unmount.\n useEffect(() => {\n if (!actionsRef) return;\n actionsRef.current = {\n refresh: ctx.refresh,\n refreshAll: ctx.refreshAll,\n expandAll: ctx.expandAll,\n collapseAll: ctx.collapseAll,\n };\n return () => {\n if (actionsRef.current) actionsRef.current = null;\n };\n }, [\n actionsRef,\n ctx.refresh,\n ctx.refreshAll,\n ctx.expandAll,\n ctx.collapseAll,\n ]);\n\n // Keyboard navigation (↑↓ ←→ Home/End Enter Esc Cmd+A, Shift-extend) —\n // scoped via callback ref.\n const isMulti = ctx.selectionMode === 'multiple';\n const { ref: keyboardRef } = useTreeKeyboard<T>({\n rows: ctx.flatRows,\n focusedId: ctx.focused,\n multiSelect: isMulti,\n // Pause container hotkeys while inline rename is active so the\n // user can type freely (TreeRenameInput stops bubbling already, but\n // gating here is the cleaner second line of defence).\n enabled: ctx.renamingId === null,\n onFocus: (id, { extend }) => {\n if (extend && isMulti) {\n ctx.moveSelect(id, { extend: true });\n } else {\n ctx.setFocus(id);\n }\n },\n onSelect: ctx.select,\n onActivate: (id) => {\n // Keyboard Enter / Space is always an explicit action — pin (no preview).\n const row = ctx.flatRows.find((r) => r.node.id === id);\n if (row) ctx.activate(row.node, { preview: false });\n },\n onExpand: ctx.expand,\n onCollapse: ctx.collapse,\n onClearSelection: ctx.clearSelection,\n onSelectAll: ctx.selectAll,\n });\n\n // Finder hotkeys (P4) — ⌘⌫, F2, ⌘D, ⌘N, ⌘⇧N, ⌘C/X/V. Bound only when\n // `enableFinderHotkeys` is true; individual shortcuts further gated\n // by adapter method availability inside the hook.\n const { ref: finderHotkeysRef } = useTreeFinderHotkeys<T>({\n enabled: enableFinderHotkeys,\n paused: ctx.renamingId !== null,\n adapter: ctx.adapter,\n labels: ctx.labels,\n selected: ctx.selected,\n focused: ctx.focused,\n getNodeById: ctx.getNodeById,\n getItemName: ctx.getItemName,\n startInlineRename: ctx.inlineRenameEnabled ? ctx.startRename : undefined,\n clipboard: {\n hasItems: !!ctx.clipboard && ctx.clipboard.ids.length > 0,\n cut: ctx.cutToClipboard,\n copy: ctx.copyToClipboard,\n // Hotkey paste targets the currently focused row (or null = root).\n paste: () => {\n const target = ctx.focused ? ctx.getNodeById(ctx.focused) ?? null : null;\n return ctx.pasteFromClipboard(target, 'inside');\n },\n },\n });\n\n const setContainerRef = useCallback(\n (instance: HTMLDivElement | null) => {\n containerRef.current = instance;\n keyboardRef(instance);\n finderHotkeysRef(instance);\n },\n [keyboardRef, finderHotkeysRef],\n );\n\n // Keep the focused row scrolled into view whenever focus moves (keyboard\n // nav, type-ahead, programmatic). Centralised so every focus source gets\n // consistent scrolling — previously only type-ahead scrolled.\n const focusedId = ctx.focused;\n useEffect(() => {\n if (!focusedId) return;\n const el = containerRef.current?.querySelector<HTMLElement>(\n `[data-tree-row][data-id=\"${CSS.escape(focusedId)}\"]`,\n );\n el?.scrollIntoView({ block: 'nearest' });\n }, [focusedId]);\n\n // Type-ahead jump — focus update; scrolling handled by the effect above.\n const onTypeAheadMatch = useCallback(\n (id: string) => {\n ctx.setFocus(id);\n },\n [ctx],\n );\n\n useTreeTypeAhead<T>({\n rows: ctx.flatRows,\n getItemName: ctx.getItemName,\n containerRef,\n onMatch: onTypeAheadMatch,\n enabled: enableTypeAhead,\n });\n\n // Tree body. `ctx.renderContextMenu` is already the final slot —\n // TreeProvider does the declarative→slot merge centrally, so Shell\n // doesn't re-derive it (and no nested provider override is needed).\n const treeBody = (\n <div\n ref={setContainerRef}\n tabIndex={0}\n role=\"tree\"\n aria-label={ctx.labels.ariaLabel}\n aria-multiselectable={ctx.selectionMode === 'multiple' || undefined}\n aria-activedescendant={focusedId ? treeRowDomId(focusedId) : undefined}\n className={cn(\n 'group/tree flex h-full w-full flex-col gap-2 rounded-sm outline-none',\n 'focus-visible:ring-1 focus-visible:ring-ring/50',\n className,\n )}\n style={{ ...appearanceToStyle(ctx.appearance), ...style }}\n data-tree-root=\"\"\n >\n {enableSearch ? <TreeSearchInput className=\"mx-2 mt-2\" /> : null}\n <div className=\"flex min-h-0 flex-1 flex-col overflow-auto px-1\">\n <TreeContent<T> role=\"group\">{renderRow}</TreeContent>\n {/* Empty-area: catches right-clicks on whitespace below the\n last row + acts as the root drop target for DnD. Always\n rendered — it self-disables when there's nothing to do. */}\n <TreeEmptyArea />\n </div>\n </div>\n );\n\n // Wrap in @dnd-kit context only when DnD is active — `TreeDndProvider`\n // short-circuits to a fragment otherwise, so we don't pay the\n // sensor-registration cost.\n return <TreeDndProvider>{treeBody}</TreeDndProvider>;\n}\n\nexport default TreeRoot;\nexport { TreeRoot };\n","'use client';\n\nimport { TreeRoot } from './TreeRoot';\nimport type { TreeRootProps } from './types';\n\n/**\n * `<FinderTree>` — opinionated Finder/Explorer-style preset.\n *\n * Equivalent to `<TreeRoot>` with multi-selection, double-click activation,\n * inline rename, indent guides, and a cozy appearance turned on. Pass an\n * `adapter` to get the built-in CRUD menu wired to `window.dialog.*`.\n *\n * Override any preset default by simply passing the same prop:\n *\n * ```tsx\n * <FinderTree<FsNode>\n * data={data}\n * getItemName={(n) => n.data.name}\n * adapter={fsAdapter}\n * // override one preset default — everything else stays Finder-y:\n * activationMode=\"single-click-preview\"\n * />\n * ```\n */\nexport function FinderTree<T>(props: TreeRootProps<T>) {\n return (\n <TreeRoot<T>\n // Finder/Explorer defaults — every one is overridable via `props`.\n selectionMode=\"multiple\"\n activationMode=\"double-click\"\n enableInlineRename\n enableFinderHotkeys\n enableDnD\n enableTypeAhead\n showIndentGuides\n appearance={{ density: 'cozy' }}\n {...props}\n />\n );\n}\n\nexport default FinderTree;\n","'use client';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\nexport interface TreeSkeletonProps {\n rows?: number;\n className?: string;\n}\n\nexport function TreeSkeleton({ rows = 6, className }: TreeSkeletonProps) {\n return (\n <div className={cn('flex flex-col gap-1 p-2', className)} aria-hidden>\n {Array.from({ length: rows }).map((_, i) => (\n <div key={i} className=\"flex items-center gap-2\" style={{ paddingLeft: (i % 3) * 16 }}>\n <span className=\"size-4 shrink-0 animate-pulse rounded bg-muted\" />\n <span className=\"size-4 shrink-0 animate-pulse rounded bg-muted\" />\n <span className=\"h-3 flex-1 animate-pulse rounded bg-muted\" />\n </div>\n ))}\n </div>\n );\n}\n","'use client';\n\nimport { AlertCircle } from 'lucide-react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nexport interface TreeErrorProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport function TreeError({ children, className }: TreeErrorProps) {\n return (\n <div\n className={cn(\n 'flex items-start gap-2 rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive',\n className,\n )}\n role=\"alert\"\n >\n <AlertCircle aria-hidden className=\"mt-0.5 size-4 shrink-0\" />\n <span>{children}</span>\n </div>\n );\n}\n","'use client';\n\nimport type { TreeNode } from '../types';\n\nexport interface DemoNode {\n name: string;\n}\n\n/**\n * Build a deterministic synthetic tree for stories and tests.\n *\n * @example\n * const data = createDemoTree({ depth: 4, breadth: 3 });\n * <TreeRoot data={data} getItemName={(n) => n.data.name} />\n */\nexport function createDemoTree({\n depth = 3,\n breadth = 4,\n rootPrefix = 'node',\n}: {\n depth?: number;\n breadth?: number;\n rootPrefix?: string;\n} = {}): TreeNode<DemoNode>[] {\n const make = (id: string, name: string, level: number): TreeNode<DemoNode> => {\n if (level >= depth) {\n return { id, data: { name } };\n }\n const children: TreeNode<DemoNode>[] = [];\n for (let i = 0; i < breadth; i++) {\n const childId = `${id}/${i}`;\n children.push(make(childId, `${name}-${i}`, level + 1));\n }\n return { id, data: { name }, children };\n };\n\n const roots: TreeNode<DemoNode>[] = [];\n for (let i = 0; i < breadth; i++) {\n roots.push(make(`${rootPrefix}-${i}`, `${rootPrefix} ${i}`, 1));\n }\n return roots;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/tools/data/Tree/data/childCache.ts","../../src/tools/data/Tree/data/flatten.ts","../../src/tools/data/Tree/data/persist.ts","../../src/tools/data/Tree/data/appearance.ts","../../src/tools/data/Tree/types/labels.ts","../../src/tools/data/Tree/context/state/reducer.ts","../../src/tools/data/Tree/context/state/initial.ts","../../src/tools/data/Tree/context/async-children/collect-ids.ts","../../src/tools/data/Tree/context/async-children/use-async-children.ts","../../src/tools/data/Tree/context/expansion/use-expansion.ts","../../src/tools/data/Tree/data/selection.ts","../../src/tools/data/Tree/context/selection/use-selection.ts","../../src/tools/data/Tree/context/rename/use-rename.ts","../../src/tools/data/Tree/context/clipboard/use-clipboard.ts","../../src/tools/data/Tree/context/menu/builtin-actions.ts","../../src/tools/data/Tree/context/menu/use-resolved-menu.ts","../../src/tools/data/Tree/context/menu/render.tsx","../../src/tools/data/Tree/data/dnd.ts","../../src/tools/data/Tree/context/dnd/use-dnd.ts","../../src/tools/data/Tree/context/persist/use-persist-sync.ts","../../src/tools/data/Tree/context/TreeContext.tsx","../../src/tools/data/Tree/TreeDndProvider.tsx","../../src/tools/data/Tree/components/TreeChevron.tsx","../../src/tools/data/Tree/components/TreeDropIndicator.tsx","../../src/tools/data/Tree/components/TreeIcon.tsx","../../src/tools/data/Tree/components/TreeIndentGuides.tsx","../../src/tools/data/Tree/components/TreeLabel.tsx","../../src/tools/data/Tree/data/renameUtils.ts","../../src/tools/data/Tree/components/TreeRenameInput.tsx","../../src/tools/data/Tree/components/TreeRow.tsx","../../src/tools/data/Tree/components/TreeEmpty.tsx","../../src/tools/data/Tree/components/TreeContent.tsx","../../src/tools/data/Tree/components/TreeEmptyArea.tsx","../../src/tools/data/Tree/context/hooks.ts","../../src/tools/data/Tree/components/TreeSearchInput.tsx","../../src/tools/data/Tree/hooks/keyboard/arrow-nav.ts","../../src/tools/data/Tree/hooks/keyboard/expand-collapse.ts","../../src/tools/data/Tree/hooks/keyboard/activation.ts","../../src/tools/data/Tree/hooks/keyboard/use-tree-keyboard.ts","../../src/tools/data/Tree/hooks/type-ahead/match-prefix.ts","../../src/tools/data/Tree/hooks/type-ahead/use-tree-type-ahead.ts","../../src/tools/data/Tree/hooks/finder-hotkeys/build-ctx.ts","../../src/tools/data/Tree/hooks/finder-hotkeys/use-tree-finder-hotkeys.ts","../../src/tools/data/Tree/TreeRoot.tsx","../../src/tools/data/Tree/FinderTree.tsx","../../src/tools/data/Tree/components/TreeSkeleton.tsx","../../src/tools/data/Tree/components/TreeError.tsx","../../src/tools/data/Tree/data/createDemoTree.ts"],"names":["useCallback","useRef","getDialog","useMemo","useEffect","jsx","current","cn","memo","dot","useState","jsxs","Fragment","useDroppable","ContextMenu","ContextMenuTrigger","ContextMenuContent","ContextMenuSeparator","ContextMenuItem","ContextMenuShortcut","useHotkey"],"mappings":"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","file":"index.mjs","sourcesContent":["'use client';\n\nimport type { TreeItemId, TreeNode } from '../types';\n\nexport type ChildEntryStatus = 'idle' | 'loading' | 'loaded' | 'error';\n\nexport interface ChildEntry<T> {\n status: ChildEntryStatus;\n children: TreeNode<T>[];\n error?: string;\n}\n\nexport type ChildCache<T> = Map<TreeItemId, ChildEntry<T>>;\n\nexport const createChildCache = <T>(): ChildCache<T> => new Map();\n\nexport const getEntry = <T>(\n cache: ChildCache<T>,\n id: TreeItemId,\n): ChildEntry<T> | undefined => cache.get(id);\n\n/**\n * Resolve a node's children for the current render.\n *\n * - If the node carries inline `children`, those win (no async fetch).\n * - Otherwise we look in the cache.\n *\n * Returns `null` when nothing is loaded yet (caller may show a skeleton).\n */\nexport const resolveChildren = <T>(\n cache: ChildCache<T>,\n node: TreeNode<T>,\n): { children: TreeNode<T>[] | null; status: ChildEntryStatus; error?: string } => {\n if (Array.isArray(node.children)) {\n return { children: node.children, status: 'loaded' };\n }\n const entry = cache.get(node.id);\n if (!entry) return { children: null, status: 'idle' };\n if (entry.status === 'loaded') {\n return { children: entry.children, status: 'loaded' };\n }\n return { children: null, status: entry.status, error: entry.error };\n};\n","'use client';\n\nimport type { FlatRow, TreeItemId, TreeNode } from '../types';\nimport { resolveChildren, type ChildCache } from './childCache';\n\nexport interface FlattenInput<T> {\n roots: TreeNode<T>[];\n expandedIds: ReadonlySet<TreeItemId>;\n cache: ChildCache<T>;\n /** Optional predicate. Nodes returning `false` (and their descendants) are excluded. */\n filterNode?: (node: TreeNode<T>) => boolean;\n}\n\nconst isNodeFolder = <T>(node: TreeNode<T>): boolean => {\n if (typeof node.isFolder === 'boolean') return node.isFolder;\n return Array.isArray(node.children);\n};\n\n/**\n * Walk the tree top-to-bottom and produce a flat list of visible rows.\n *\n * Visibility rule: a child row appears only when every ancestor is in\n * `expandedIds`. The output is ordered exactly as it should render,\n * which keeps keyboard navigation (next/prev row) trivial.\n */\nexport function flattenTree<T>({\n roots,\n expandedIds,\n cache,\n filterNode,\n}: FlattenInput<T>): FlatRow<T>[] {\n const out: FlatRow<T>[] = [];\n\n const walk = (nodes: TreeNode<T>[], level: number, parentId: TreeItemId | null) => {\n // Visible siblings only — `aria-setsize`/`posinset` must ignore filtered nodes.\n const visible = filterNode ? nodes.filter(filterNode) : nodes;\n const setSize = visible.length;\n\n visible.forEach((node, index) => {\n const isFolder = isNodeFolder(node);\n const isExpanded = expandedIds.has(node.id);\n const resolved = isFolder\n ? resolveChildren(cache, node)\n : { children: [], status: 'loaded' as const };\n\n out.push({\n node,\n level,\n parentId,\n isFolder,\n isExpanded,\n isLoading: resolved.status === 'loading',\n hasError: resolved.status === 'error',\n posInSet: index + 1,\n setSize,\n });\n\n if (isFolder && isExpanded && resolved.children) {\n walk(resolved.children, level + 1, node.id);\n }\n });\n };\n\n walk(roots, 0, null);\n return out;\n}\n","'use client';\n\nimport type { TreeItemId } from '../types';\n\nconst KEY_PREFIX = '@djangocfg/tree:';\nconst VERSION = 1;\n\nexport interface PersistedTreeState {\n expandedItems: TreeItemId[];\n selectedItems: TreeItemId[];\n}\n\ninterface PersistedShape extends PersistedTreeState {\n version: number;\n}\n\nfunction safeStorage(): Storage | null {\n if (typeof window === 'undefined') return null;\n try {\n return window.localStorage;\n } catch {\n return null;\n }\n}\n\nexport function loadTreeState(key: string): PersistedTreeState | null {\n const storage = safeStorage();\n if (!storage) return null;\n try {\n const raw = storage.getItem(KEY_PREFIX + key);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as Partial<PersistedShape>;\n if (parsed.version !== VERSION) return null;\n return {\n expandedItems: Array.isArray(parsed.expandedItems) ? parsed.expandedItems : [],\n selectedItems: Array.isArray(parsed.selectedItems) ? parsed.selectedItems : [],\n };\n } catch {\n return null;\n }\n}\n\nexport function saveTreeState(key: string, state: PersistedTreeState): void {\n const storage = safeStorage();\n if (!storage) return;\n try {\n const payload: PersistedShape = { ...state, version: VERSION };\n storage.setItem(KEY_PREFIX + key, JSON.stringify(payload));\n } catch {\n /* quota / serialization — best-effort persistence */\n }\n}\n\nexport function clearTreeState(key: string): void {\n const storage = safeStorage();\n if (!storage) return;\n try {\n storage.removeItem(KEY_PREFIX + key);\n } catch {\n /* ignore */\n }\n}\n","'use client';\n\nimport type { CSSProperties } from 'react';\n\nexport type TreeDensity = 'compact' | 'cozy' | 'comfortable';\nexport type TreeAccentIntensity = 'subtle' | 'default' | 'strong';\nexport type TreeRadius = 'none' | 'sm' | 'md';\n\n/**\n * Cosmetic configuration. Every field is optional; missing values fall\n * back to the `cozy` preset (a comfortable VSCode-Explorer-like density).\n *\n * Customize the look without re-implementing slots.\n */\nexport interface TreeAppearance {\n /** Built-in size preset. Default: `'cozy'`. */\n density?: TreeDensity;\n /** Override row height in px (wins over density). */\n rowHeight?: number;\n /** Override icon + chevron size in px (wins over density). */\n iconSize?: number;\n /** Lucide stroke width for icon + chevron. Default: 1.5. */\n iconStrokeWidth?: number;\n /** Override label font size in px (wins over density). */\n fontSize?: number;\n /** Pixels between chevron / icon / label. Default depends on density. */\n gap?: number;\n /** Pixels between nesting levels. Default: 16. */\n indent?: number;\n /** Hover / selected highlight intensity. Default: `'default'`. */\n accent?: TreeAccentIntensity;\n /** Row corner radius. Default: `'sm'`. */\n radius?: TreeRadius;\n /** Indent-guide line opacity (0..1). Default: 0.4. */\n indentGuideOpacity?: number;\n /**\n * Show a 2px primary-tinted bar on the left of the selected row.\n * Mimics the VSCode active-tab indicator. Default: `true`.\n */\n showActiveIndicator?: boolean;\n}\n\nexport interface ResolvedAppearance {\n density: TreeDensity;\n rowHeight: number;\n iconSize: number;\n iconStrokeWidth: number;\n fontSize: number;\n gap: number;\n indent: number;\n accent: TreeAccentIntensity;\n radius: TreeRadius;\n indentGuideOpacity: number;\n showActiveIndicator: boolean;\n}\n\nconst DENSITY_PRESETS: Record<\n TreeDensity,\n Pick<ResolvedAppearance, 'rowHeight' | 'iconSize' | 'fontSize' | 'gap'>\n> = {\n compact: { rowHeight: 24, iconSize: 14, fontSize: 13, gap: 6 },\n cozy: { rowHeight: 28, iconSize: 16, fontSize: 13, gap: 8 },\n comfortable: { rowHeight: 32, iconSize: 16, fontSize: 14, gap: 8 },\n};\n\nexport const DEFAULT_TREE_APPEARANCE: ResolvedAppearance = {\n density: 'cozy',\n ...DENSITY_PRESETS.cozy,\n iconStrokeWidth: 1.5,\n indent: 16,\n accent: 'default',\n radius: 'sm',\n indentGuideOpacity: 0.4,\n showActiveIndicator: true,\n};\n\n/**\n * Merge a partial appearance with the default + density preset.\n *\n * Explicit numeric overrides (e.g. `rowHeight`) win over the density preset.\n */\nexport function resolveAppearance(\n input?: TreeAppearance,\n /** Outer `indent` prop (kept on TreeRoot for back-compat). */\n outerIndent?: number,\n): ResolvedAppearance {\n if (!input && outerIndent === undefined) return DEFAULT_TREE_APPEARANCE;\n\n const density: TreeDensity = input?.density ?? 'cozy';\n const preset = DENSITY_PRESETS[density];\n\n return {\n density,\n rowHeight: input?.rowHeight ?? preset.rowHeight,\n iconSize: input?.iconSize ?? preset.iconSize,\n iconStrokeWidth: input?.iconStrokeWidth ?? DEFAULT_TREE_APPEARANCE.iconStrokeWidth,\n fontSize: input?.fontSize ?? preset.fontSize,\n gap: input?.gap ?? preset.gap,\n indent: input?.indent ?? outerIndent ?? DEFAULT_TREE_APPEARANCE.indent,\n accent: input?.accent ?? DEFAULT_TREE_APPEARANCE.accent,\n radius: input?.radius ?? DEFAULT_TREE_APPEARANCE.radius,\n indentGuideOpacity:\n input?.indentGuideOpacity ?? DEFAULT_TREE_APPEARANCE.indentGuideOpacity,\n showActiveIndicator:\n input?.showActiveIndicator ?? DEFAULT_TREE_APPEARANCE.showActiveIndicator,\n };\n}\n\n/**\n * Build the `style` object that exposes the resolved appearance to any\n * descendant via CSS variables. Set on `<TreeRoot>`'s outer div.\n */\nexport function appearanceToStyle(a: ResolvedAppearance): CSSProperties {\n return {\n ['--tree-row-height' as string]: `${a.rowHeight}px`,\n ['--tree-icon-size' as string]: `${a.iconSize}px`,\n ['--tree-icon-stroke' as string]: a.iconStrokeWidth,\n ['--tree-font-size' as string]: `${a.fontSize}px`,\n ['--tree-gap' as string]: `${a.gap}px`,\n ['--tree-indent' as string]: `${a.indent}px`,\n ['--tree-guide-opacity' as string]: a.indentGuideOpacity,\n };\n}\n\nconst RADIUS_CLASS: Record<TreeRadius, string> = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n};\nexport function radiusClass(a: ResolvedAppearance) {\n return RADIUS_CLASS[a.radius];\n}\n\n/**\n * VSCode-style row state classes.\n *\n * - hover: subtle neutral wash\n * - focused (keyboard nav, not yet selected): slightly stronger neutral\n * - selected (tree NOT focused): muted neutral block\n * - selected + tree focused-within: primary-tinted block + colored text\n *\n * Intensity scales with `appearance.accent`.\n */\nconst HOVER: Record<TreeAccentIntensity, string> = {\n subtle: 'hover:bg-foreground/[.03]',\n default: 'hover:bg-foreground/[.06]',\n strong: 'hover:bg-foreground/[.09]',\n};\nconst FOCUSED_NOT_SELECTED: Record<TreeAccentIntensity, string> = {\n subtle: 'data-[focused=true]:bg-foreground/[.05]',\n default: 'data-[focused=true]:bg-foreground/[.08]',\n strong: 'data-[focused=true]:bg-foreground/[.12]',\n};\nconst SELECTED_INACTIVE: Record<TreeAccentIntensity, string> = {\n subtle: 'data-[selected=true]:bg-foreground/[.06]',\n default: 'data-[selected=true]:bg-foreground/[.10]',\n strong: 'data-[selected=true]:bg-foreground/[.14]',\n};\nconst SELECTED_ACTIVE: Record<TreeAccentIntensity, string> = {\n subtle:\n 'data-[selected=true]:group-focus-within/tree:bg-primary/10 data-[selected=true]:group-focus-within/tree:text-primary',\n default:\n 'data-[selected=true]:group-focus-within/tree:bg-primary/15 data-[selected=true]:group-focus-within/tree:text-primary',\n strong:\n 'data-[selected=true]:group-focus-within/tree:bg-primary/25 data-[selected=true]:group-focus-within/tree:text-primary',\n};\n\nexport function rowStateClasses(a: ResolvedAppearance) {\n return [\n HOVER[a.accent],\n FOCUSED_NOT_SELECTED[a.accent],\n SELECTED_INACTIVE[a.accent],\n SELECTED_ACTIVE[a.accent],\n ].join(' ');\n}\n","'use client';\n\nexport interface TreeLabels {\n loading: string;\n empty: string;\n error: string;\n searchPlaceholder: string;\n searchMatches: (count: number) => string;\n ariaLabel: string;\n\n // ---- CRUD flow copy (used by built-in adapter actions + dialogs) ----\n\n /** Default context-menu item labels. */\n actionOpen: string;\n actionRename: string;\n actionDuplicate: string;\n actionCut: string;\n actionCopy: string;\n actionPaste: string;\n actionDelete: string;\n actionNewFile: string;\n actionNewFolder: string;\n\n /** Delete confirmation dialog. */\n confirmDeleteTitle: (count: number) => string;\n confirmDeleteMessage: (names: string[]) => string;\n confirmDeleteOk: string;\n confirmDeleteCancel: string;\n\n /** New file prompt. */\n newFileTitle: string;\n newFileMessage: string;\n newFilePlaceholder: string;\n newFileDefault: string;\n\n /** New folder prompt. */\n newFolderTitle: string;\n newFolderMessage: string;\n newFolderPlaceholder: string;\n newFolderDefault: string;\n\n /** Rename prompt (used when inline rename is unavailable / disabled). */\n renameTitle: string;\n renameMessage: string;\n\n /** Name validation. */\n invalidNameEmpty: string;\n\n /** Suffix used by the default `duplicate` flow when the consumer's adapter\n * needs a hint name. Receives the source name. */\n duplicateSuffix: (name: string) => string;\n}\n\nexport const DEFAULT_TREE_LABELS: TreeLabels = {\n loading: 'Loading…',\n empty: 'Nothing to show',\n error: 'Failed to load',\n searchPlaceholder: 'Search…',\n searchMatches: (n) => `${n} match${n === 1 ? '' : 'es'}`,\n ariaLabel: 'Tree',\n\n actionOpen: 'Open',\n actionRename: 'Rename',\n actionDuplicate: 'Duplicate',\n actionCut: 'Cut',\n actionCopy: 'Copy',\n actionPaste: 'Paste',\n actionDelete: 'Delete',\n actionNewFile: 'New file',\n actionNewFolder: 'New folder',\n\n confirmDeleteTitle: (n) =>\n n === 1 ? 'Delete item?' : `Delete ${n} items?`,\n confirmDeleteMessage: (names) =>\n names.length === 1\n ? `\"${names[0]}\" will be removed. This action cannot be undone.`\n : `${names.length} items will be removed. This action cannot be undone.`,\n confirmDeleteOk: 'Delete',\n confirmDeleteCancel: 'Cancel',\n\n newFileTitle: 'New file',\n newFileMessage: 'File name',\n newFilePlaceholder: 'untitled.txt',\n newFileDefault: 'untitled.txt',\n\n newFolderTitle: 'New folder',\n newFolderMessage: 'Folder name',\n newFolderPlaceholder: 'untitled folder',\n newFolderDefault: 'untitled folder',\n\n renameTitle: 'Rename',\n renameMessage: 'New name',\n\n invalidNameEmpty: 'Name cannot be empty',\n\n duplicateSuffix: (name) => `${name} copy`,\n};\n","'use client';\n\nimport type { Action, State } from './types';\n\n/**\n * Pure reducer for `<TreeProvider>`. Intentionally small — most domain\n * logic (Finder selection rules, async cache, persistence) lives in\n * dedicated hooks under `context/<feature>/` and only dispatches one of\n * these actions when the result needs to land in React state.\n */\nexport function reducer(state: State, action: Action): State {\n switch (action.type) {\n case 'expand': {\n if (state.expanded.has(action.id)) return state;\n const next = new Set(state.expanded);\n next.add(action.id);\n return { ...state, expanded: next };\n }\n case 'collapse': {\n if (!state.expanded.has(action.id)) return state;\n const next = new Set(state.expanded);\n next.delete(action.id);\n return { ...state, expanded: next };\n }\n case 'toggle': {\n const next = new Set(state.expanded);\n if (next.has(action.id)) next.delete(action.id);\n else next.add(action.id);\n return { ...state, expanded: next };\n }\n case 'set-expanded':\n return { ...state, expanded: new Set(action.ids) };\n case 'select': {\n if (action.mode === 'none') return state;\n if (action.mode === 'single') {\n return {\n ...state,\n selected: new Set([action.id]),\n anchor: action.id,\n focused: action.id,\n };\n }\n const next = new Set(state.selected);\n if (next.has(action.id)) next.delete(action.id);\n else next.add(action.id);\n return { ...state, selected: next, anchor: action.id, focused: action.id };\n }\n case 'select-many':\n return { ...state, selected: new Set(action.ids) };\n case 'clear-selection':\n return { ...state, selected: new Set(), anchor: null };\n case 'selection-replace':\n return {\n ...state,\n selected: new Set(action.selected),\n anchor: action.anchor,\n focused: action.focused,\n };\n case 'set-anchor':\n return { ...state, anchor: action.id };\n case 'focus':\n return { ...state, focused: action.id };\n case 'set-query':\n return { ...state, query: action.q };\n case 'start-rename':\n return { ...state, renaming: action.id };\n case 'stop-rename':\n return state.renaming === null ? state : { ...state, renaming: null };\n case 'clipboard-set':\n return { ...state, clipboard: action.payload };\n case 'cache-tick':\n return { ...state, cacheTick: state.cacheTick + 1 };\n default:\n return state;\n }\n}\n","'use client';\n\nimport type { PersistedTreeState } from '../../data/persist';\nimport type { TreeItemId } from '../../types';\nimport type { State } from './types';\n\nexport interface CreateInitialStateInput {\n persisted: PersistedTreeState | null;\n initialExpandedIds?: TreeItemId[];\n initialSelectedIds?: TreeItemId[];\n persistSelection: boolean;\n}\n\n/**\n * Build the reducer's initial state from persistence + initial props.\n * Anchor is set to the first restored selection (if any) so a hard\n * reload doesn't break shift-extend.\n */\nexport function createInitialState(input: CreateInitialStateInput): State {\n const { persisted, initialExpandedIds, initialSelectedIds, persistSelection } =\n input;\n const initialSelected = new Set(\n (persistSelection ? persisted?.selectedItems : undefined) ??\n initialSelectedIds ??\n [],\n );\n const initialAnchor: TreeItemId | null =\n initialSelected.size > 0\n ? (initialSelected.values().next().value as TreeItemId)\n : null;\n return {\n expanded: new Set(persisted?.expandedItems ?? initialExpandedIds ?? []),\n selected: initialSelected,\n anchor: initialAnchor,\n focused: null,\n query: '',\n renaming: null,\n clipboard: null,\n cacheTick: 0,\n };\n}\n","'use client';\n\nimport type { ChildCache } from '../../data/childCache';\nimport type { TreeItemId, TreeNode } from '../../types';\n\n/**\n * Walk `roots` + cached async children and push every *folder* id into\n * `out`. Used by `expandAll`.\n *\n * Leaves are intentionally not collected — expanding a leaf is a no-op.\n */\nexport function collectAllFolderIds<T>(\n roots: TreeNode<T>[],\n cache: ChildCache<T>,\n out: TreeItemId[],\n): void {\n for (const node of roots) {\n if (Array.isArray(node.children)) {\n out.push(node.id);\n collectAllFolderIds(node.children, cache, out);\n } else if (node.isFolder) {\n out.push(node.id);\n const entry = cache.get(node.id);\n if (entry?.children) collectAllFolderIds(entry.children, cache, out);\n }\n }\n}\n","'use client';\n\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\n\nimport { createChildCache, type ChildCache } from '../../data/childCache';\nimport type {\n TreeItemId,\n TreeLoadChildren,\n TreeNode,\n} from '../../types';\nimport { collectAllFolderIds } from './collect-ids';\n\nexport interface UseAsyncChildrenOptions<T> {\n data: TreeNode<T>[];\n loadChildren?: TreeLoadChildren<T>;\n /** Current set of expanded ids — controls which async fetches fire. */\n expanded: ReadonlySet<TreeItemId>;\n /** Bumps every time the cache mutates — invalidates downstream memos. */\n cacheTick: number;\n /** Dispatch into the reducer (used to bump `cacheTick`). */\n bumpCacheTick: () => void;\n}\n\nexport interface UseAsyncChildrenReturn<T> {\n /** Live async-children cache (mutable ref, not React state). */\n cache: ChildCache<T>;\n /** Id → node lookup across the root tree + cached async children. */\n nodeById: Map<TreeItemId, TreeNode<T>>;\n /** Fetch a single folder's children (deduped, idempotent). */\n fetchChildren: (node: TreeNode<T>) => Promise<void> | void;\n /** Drop one node's cache entry and refetch. */\n refresh: (id: TreeItemId) => Promise<void>;\n /** Clear the entire cache and refetch every currently-expanded folder. */\n refreshAll: () => Promise<void>;\n /** Collect every folder id known to Tree (root + cached). For `expandAll`. */\n collectFolderIds: () => TreeItemId[];\n}\n\n/**\n * Manage async children: a long-lived cache (in a ref), dedup-ed\n * `loadChildren` calls, and a `nodeById` map that walks both inline\n * children and cached async ones. The cache lives outside reducer state\n * because mutating a Map per render is cheaper than spreading it; we\n * trigger downstream re-renders via the `cacheTick` counter.\n */\nexport function useAsyncChildren<T>({\n data,\n loadChildren,\n expanded,\n cacheTick,\n bumpCacheTick,\n}: UseAsyncChildrenOptions<T>): UseAsyncChildrenReturn<T> {\n // The cache survives provider re-renders and async work.\n const cacheRef = useRef<ChildCache<T>>(createChildCache<T>());\n const inflightRef = useRef<Map<TreeItemId, Promise<void>>>(new Map());\n\n const fetchChildren = useCallback(\n async (node: TreeNode<T>) => {\n if (!loadChildren) return;\n if (Array.isArray(node.children)) return;\n const existing = cacheRef.current.get(node.id);\n if (existing?.status === 'loaded' || existing?.status === 'loading') return;\n const inflight = inflightRef.current.get(node.id);\n if (inflight) return inflight;\n\n cacheRef.current.set(node.id, { status: 'loading', children: [] });\n bumpCacheTick();\n\n const promise = (async () => {\n try {\n const children = await loadChildren(node);\n cacheRef.current.set(node.id, { status: 'loaded', children });\n } catch (err) {\n cacheRef.current.set(node.id, {\n status: 'error',\n children: [],\n error: err instanceof Error ? err.message : String(err),\n });\n } finally {\n inflightRef.current.delete(node.id);\n bumpCacheTick();\n }\n })();\n\n inflightRef.current.set(node.id, promise);\n return promise;\n },\n [loadChildren, bumpCacheTick],\n );\n\n // Build a quick id → node map across roots + cached async children.\n // Re-runs whenever the cache mutates (cacheTick) or `data` changes.\n const nodeById = useMemo(() => {\n const map = new Map<TreeItemId, TreeNode<T>>();\n const walk = (nodes: TreeNode<T>[]) => {\n for (const n of nodes) {\n map.set(n.id, n);\n if (Array.isArray(n.children)) walk(n.children);\n else {\n const entry = cacheRef.current.get(n.id);\n if (entry?.children) walk(entry.children);\n }\n }\n };\n walk(data);\n return map;\n }, [data, cacheTick]);\n\n // Auto-fetch every expanded folder that isn't already in cache. Cheap\n // — `fetchChildren` short-circuits when cached or already inflight.\n useEffect(() => {\n if (!loadChildren) return;\n for (const id of expanded) {\n const node = nodeById.get(id);\n if (!node) continue;\n void fetchChildren(node);\n }\n }, [loadChildren, expanded, cacheTick, nodeById, fetchChildren]);\n\n const refresh = useCallback(\n async (id: TreeItemId) => {\n const node = nodeById.get(id);\n if (!node || !loadChildren) return;\n cacheRef.current.delete(id);\n bumpCacheTick();\n await fetchChildren(node);\n },\n [nodeById, loadChildren, fetchChildren, bumpCacheTick],\n );\n\n const refreshAll = useCallback(async () => {\n cacheRef.current.clear();\n bumpCacheTick();\n if (!loadChildren) return;\n await Promise.all(\n [...expanded].map((id) => {\n const node = nodeById.get(id);\n return node ? fetchChildren(node) : undefined;\n }),\n );\n }, [loadChildren, expanded, nodeById, fetchChildren, bumpCacheTick]);\n\n const collectFolderIds = useCallback(() => {\n const ids: TreeItemId[] = [];\n collectAllFolderIds(data, cacheRef.current, ids);\n return ids;\n }, [data]);\n\n return {\n cache: cacheRef.current,\n nodeById,\n fetchChildren,\n refresh,\n refreshAll,\n collectFolderIds,\n };\n}\n","'use client';\n\nimport { useCallback } from 'react';\n\nimport type { Action } from '../state';\nimport type { TreeItemId } from '../../types';\n\nexport interface UseExpansionOptions {\n dispatch: React.Dispatch<Action>;\n /** Build the \"all folder ids\" list — usually wired to `useAsyncChildren`. */\n collectFolderIds: () => TreeItemId[];\n}\n\nexport interface UseExpansionReturn {\n expand: (id: TreeItemId) => void;\n collapse: (id: TreeItemId) => void;\n toggle: (id: TreeItemId) => void;\n expandAll: () => void;\n collapseAll: () => void;\n}\n\n/**\n * Thin action wrappers around the reducer's expansion actions, plus\n * `expandAll` / `collapseAll`. `expandAll` walks roots and cached async\n * children so partially-loaded trees expand everything they currently\n * know about.\n */\nexport function useExpansion({\n dispatch,\n collectFolderIds,\n}: UseExpansionOptions): UseExpansionReturn {\n const expand = useCallback(\n (id: TreeItemId) => dispatch({ type: 'expand', id }),\n [dispatch],\n );\n const collapse = useCallback(\n (id: TreeItemId) => dispatch({ type: 'collapse', id }),\n [dispatch],\n );\n const toggle = useCallback(\n (id: TreeItemId) => dispatch({ type: 'toggle', id }),\n [dispatch],\n );\n\n const expandAll = useCallback(() => {\n dispatch({ type: 'set-expanded', ids: collectFolderIds() });\n }, [dispatch, collectFolderIds]);\n\n const collapseAll = useCallback(\n () => dispatch({ type: 'set-expanded', ids: [] }),\n [dispatch],\n );\n\n return { expand, collapse, toggle, expandAll, collapseAll };\n}\n","'use client';\n\nimport type { FlatRow, TreeItemId } from '../types';\n\n// =====================================================================\n// Selection helpers — pure functions over flatRows + state.\n//\n// Finder/Explorer rules implemented here:\n// - plain click → replace selection, set anchor = id\n// - meta-click → toggle id, set anchor = id (clicked row becomes new anchor)\n// - shift-click → range [anchor..id] (replaces selection)\n// - shift+meta → union(range [anchor..id], previous selection)\n// - shift+arrows → extend range from anchor through new focused row\n// - mod+a → select all visible rows\n// - escape → clear selection (anchor stays — focused stays)\n// =====================================================================\n\nexport interface SelectionState {\n selected: ReadonlySet<TreeItemId>;\n /** Anchor for shift-range. `null` when nothing has been selected yet. */\n anchor: TreeItemId | null;\n /** Visual cursor — usually equals the last clicked / arrow-moved row. */\n focused: TreeItemId | null;\n}\n\nfunction indexOf(rows: readonly FlatRow<unknown>[], id: TreeItemId | null): number {\n if (id == null) return -1;\n for (let i = 0; i < rows.length; i++) {\n if (rows[i].node.id === id) return i;\n }\n return -1;\n}\n\n/**\n * Inclusive range of ids between `fromId` and `toId` according to their\n * positions in `rows`. Returns an empty array if either endpoint is not in\n * `rows` (e.g. anchor pointed at a row that got collapsed away).\n */\nexport function computeRange<T>(\n rows: readonly FlatRow<T>[],\n fromId: TreeItemId | null,\n toId: TreeItemId | null,\n): TreeItemId[] {\n if (fromId == null || toId == null) return [];\n const a = indexOf(rows, fromId);\n const b = indexOf(rows, toId);\n if (a < 0 || b < 0) return [];\n const [lo, hi] = a <= b ? [a, b] : [b, a];\n const out: TreeItemId[] = [];\n for (let i = lo; i <= hi; i++) out.push(rows[i].node.id);\n return out;\n}\n\n/**\n * Click selection — derives next `{selected, anchor, focused}` from a\n * pointer event's modifier keys. `rows` is the current flat view (used\n * for shift-range computation).\n */\nexport interface ClickModifiers {\n shift: boolean;\n meta: boolean;\n}\n\nexport function selectionFromClick<T>(\n state: SelectionState,\n rows: readonly FlatRow<T>[],\n id: TreeItemId,\n mods: ClickModifiers,\n multi: boolean,\n): SelectionState {\n // Single-selection mode → always collapse to one id.\n if (!multi) {\n return { selected: new Set([id]), anchor: id, focused: id };\n }\n\n // shift+meta → union of current selection with range from anchor to id.\n if (mods.shift && mods.meta) {\n const anchor = state.anchor ?? state.focused ?? id;\n const range = computeRange(rows, anchor, id);\n const next = new Set(state.selected);\n for (const r of range) next.add(r);\n return { selected: next, anchor: state.anchor ?? id, focused: id };\n }\n\n // shift-only → replace with range from anchor to id.\n if (mods.shift) {\n const anchor = state.anchor ?? state.focused ?? id;\n const range = computeRange(rows, anchor, id);\n return {\n selected: new Set(range.length > 0 ? range : [id]),\n anchor: state.anchor ?? anchor,\n focused: id,\n };\n }\n\n // meta-only → toggle id, reset anchor.\n if (mods.meta) {\n const next = new Set(state.selected);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return { selected: next, anchor: id, focused: id };\n }\n\n // Plain click → replace selection.\n return { selected: new Set([id]), anchor: id, focused: id };\n}\n\n/**\n * Move-focus selection — used by arrow keys. When `extend` is true (shift),\n * recompute the range from anchor through the new focused id. Otherwise\n * collapse selection to the new id and reset anchor.\n */\nexport function selectionFromMove<T>(\n state: SelectionState,\n rows: readonly FlatRow<T>[],\n nextFocusedId: TreeItemId,\n extend: boolean,\n multi: boolean,\n): SelectionState {\n if (!multi || !extend) {\n return { selected: new Set([nextFocusedId]), anchor: nextFocusedId, focused: nextFocusedId };\n }\n const anchor = state.anchor ?? state.focused ?? nextFocusedId;\n const range = computeRange(rows, anchor, nextFocusedId);\n return {\n selected: new Set(range.length > 0 ? range : [nextFocusedId]),\n anchor,\n focused: nextFocusedId,\n };\n}\n\n/**\n * Select every visible row (Cmd/Ctrl+A). Anchor is set to the first row\n * so a subsequent shift-click extends from a predictable starting point.\n */\nexport function selectionSelectAll<T>(\n rows: readonly FlatRow<T>[],\n focused: TreeItemId | null,\n): SelectionState {\n if (rows.length === 0) {\n return { selected: new Set(), anchor: null, focused };\n }\n const ids = rows.map((r) => r.node.id);\n return {\n selected: new Set(ids),\n anchor: ids[0],\n focused: focused ?? ids[0],\n };\n}\n\n/**\n * Esc behaviour — clear selected items and anchor, but keep focused so the\n * visual cursor stays where the user left it (Finder mimics this).\n */\nexport function selectionClear(state: SelectionState): SelectionState {\n return { selected: new Set(), anchor: null, focused: state.focused };\n}\n","'use client';\n\nimport { useCallback, useRef } from 'react';\n\nimport {\n selectionFromClick,\n selectionFromMove,\n selectionSelectAll,\n type ClickModifiers,\n} from '../../data/selection';\nimport type {\n FlatRow,\n TreeItemId,\n TreeSelectionMode,\n} from '../../types';\nimport type { Action } from '../state';\n\nexport interface UseSelectionOptions<T> {\n dispatch: React.Dispatch<Action>;\n selectionMode: TreeSelectionMode;\n /** Current visible rows — fed in each render, latched into a ref. */\n flatRows: FlatRow<T>[];\n /** Current selection snapshot (latched into a ref alongside `flatRows`). */\n selected: ReadonlySet<TreeItemId>;\n anchor: TreeItemId | null;\n focused: TreeItemId | null;\n}\n\nexport interface UseSelectionReturn {\n select: (id: TreeItemId) => void;\n setSelectedIds: (ids: TreeItemId[]) => void;\n clearSelection: () => void;\n clickSelect: (id: TreeItemId, mods: ClickModifiers) => void;\n moveSelect: (id: TreeItemId, opts: { extend: boolean }) => void;\n selectAll: () => void;\n setFocus: (id: TreeItemId | null) => void;\n}\n\n/**\n * Finder/Explorer-style selection actions. Reads the *current* rows /\n * selection from refs latched per-render, so the returned callbacks\n * stay stable across renders (which matters for `react-hotkeys-hook`\n * and for memoised TreeRow children).\n */\nexport function useSelection<T>({\n dispatch,\n selectionMode,\n flatRows,\n selected,\n anchor,\n focused,\n}: UseSelectionOptions<T>): UseSelectionReturn {\n // Latch the snapshot the callbacks read from.\n const flatRowsRef = useRef<FlatRow<T>[]>(flatRows);\n flatRowsRef.current = flatRows;\n const selectionRef = useRef({ selected, anchor, focused });\n selectionRef.current = { selected, anchor, focused };\n\n const select = useCallback(\n (id: TreeItemId) => dispatch({ type: 'select', id, mode: selectionMode }),\n [dispatch, selectionMode],\n );\n const setSelectedIds = useCallback(\n (ids: TreeItemId[]) => dispatch({ type: 'select-many', ids }),\n [dispatch],\n );\n const clearSelection = useCallback(\n () => dispatch({ type: 'clear-selection' }),\n [dispatch],\n );\n const setFocus = useCallback(\n (id: TreeItemId | null) => dispatch({ type: 'focus', id }),\n [dispatch],\n );\n\n const clickSelect = useCallback(\n (id: TreeItemId, mods: ClickModifiers) => {\n if (selectionMode === 'none') return;\n if (selectionMode === 'single') {\n dispatch({ type: 'select', id, mode: 'single' });\n return;\n }\n const next = selectionFromClick(\n selectionRef.current,\n flatRowsRef.current,\n id,\n mods,\n true,\n );\n dispatch({\n type: 'selection-replace',\n selected: [...next.selected],\n anchor: next.anchor,\n focused: next.focused,\n });\n },\n [dispatch, selectionMode],\n );\n\n const moveSelect = useCallback(\n (id: TreeItemId, opts: { extend: boolean }) => {\n if (selectionMode !== 'multiple' || !opts.extend) {\n dispatch({ type: 'focus', id });\n return;\n }\n const next = selectionFromMove(\n selectionRef.current,\n flatRowsRef.current,\n id,\n true,\n true,\n );\n dispatch({\n type: 'selection-replace',\n selected: [...next.selected],\n anchor: next.anchor,\n focused: next.focused,\n });\n },\n [dispatch, selectionMode],\n );\n\n const selectAll = useCallback(() => {\n if (selectionMode !== 'multiple') return;\n const next = selectionSelectAll(\n flatRowsRef.current,\n selectionRef.current.focused,\n );\n dispatch({\n type: 'selection-replace',\n selected: [...next.selected],\n anchor: next.anchor,\n focused: next.focused,\n });\n }, [dispatch, selectionMode]);\n\n return {\n select,\n setSelectedIds,\n clearSelection,\n clickSelect,\n moveSelect,\n selectAll,\n setFocus,\n };\n}\n","'use client';\n\nimport { useCallback } from 'react';\n\nimport { getDialog } from '@djangocfg/ui-core/lib/dialog-service';\n\nimport type {\n TreeAdapter,\n TreeItemId,\n TreeLabels,\n TreeNode,\n} from '../../types';\nimport type { Action } from '../state';\n\nexport interface UseRenameOptions<T> {\n dispatch: React.Dispatch<Action>;\n adapter?: TreeAdapter<T>;\n /** Master switch — hooks honour it on every entrypoint. */\n enableInlineRename: boolean;\n nodeById: Map<TreeItemId, TreeNode<T>>;\n getItemName: (node: TreeNode<T>) => string;\n labels: TreeLabels;\n}\n\nexport interface UseRenameReturn {\n /** True only when both the host opted in AND adapter exposes `rename`. */\n enabled: boolean;\n startRename: (id: TreeItemId) => void;\n cancelRename: () => void;\n commitRename: (id: TreeItemId, nextName: string) => Promise<boolean>;\n}\n\n/**\n * Inline rename callbacks. The visible UI lives in `TreeRenameInput`;\n * this hook owns the start/cancel/commit transitions and dialog-driven\n * error surfacing.\n */\nexport function useRename<T>({\n dispatch,\n adapter,\n enableInlineRename,\n nodeById,\n getItemName,\n labels,\n}: UseRenameOptions<T>): UseRenameReturn {\n const enabled = enableInlineRename && !!adapter?.rename;\n\n const startRename = useCallback(\n (id: TreeItemId) => {\n if (!enableInlineRename) return;\n if (!adapter?.rename) {\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line no-console\n console.warn(\n '[Tree] startRename called but adapter.rename is not defined.',\n );\n }\n return;\n }\n dispatch({ type: 'start-rename', id });\n },\n [dispatch, enableInlineRename, adapter],\n );\n\n const cancelRename = useCallback(\n () => dispatch({ type: 'stop-rename' }),\n [dispatch],\n );\n\n const commitRename = useCallback(\n async (id: TreeItemId, nextName: string): Promise<boolean> => {\n if (!adapter?.rename) {\n dispatch({ type: 'stop-rename' });\n return false;\n }\n const node = nodeById.get(id);\n if (!node) {\n dispatch({ type: 'stop-rename' });\n return false;\n }\n const trimmed = nextName.trim();\n if (trimmed === getItemName(node)) {\n dispatch({ type: 'stop-rename' });\n return true;\n }\n let err: string | null = null;\n if (trimmed === '') err = labels.invalidNameEmpty;\n else err = adapter.validateName?.(trimmed, { node }) ?? null;\n\n if (err) {\n const dialog = getDialog();\n await dialog?.alert({ title: labels.error, message: err });\n return false;\n }\n\n try {\n await adapter.rename(node, trimmed);\n } catch (e) {\n const dialog = getDialog();\n await dialog?.alert({\n title: labels.error,\n message: e instanceof Error ? e.message : String(e),\n });\n return false;\n }\n dispatch({ type: 'stop-rename' });\n return true;\n },\n [dispatch, adapter, nodeById, getItemName, labels],\n );\n\n return { enabled, startRename, cancelRename, commitRename };\n}\n","'use client';\n\nimport { useCallback, useRef } from 'react';\n\nimport { getDialog } from '@djangocfg/ui-core/lib/dialog-service';\n\nimport type { ClipboardState } from '../../data/clipboard';\nimport type {\n TreeAdapter,\n TreeItemId,\n TreeLabels,\n TreeMovePosition,\n TreeNode,\n} from '../../types';\nimport type { Action } from '../state';\n\nexport interface UseClipboardOptions<T> {\n dispatch: React.Dispatch<Action>;\n /** Current clipboard snapshot — latched into a ref for async paste. */\n clipboard: ClipboardState;\n adapter?: TreeAdapter<T>;\n nodeById: Map<TreeItemId, TreeNode<T>>;\n labels: TreeLabels;\n}\n\nexport interface UseClipboardReturn<T> {\n cutToClipboard: (ids: TreeItemId[]) => void;\n copyToClipboard: (ids: TreeItemId[]) => void;\n /** Apply clipboard to `target` (a row, or `null` = root). */\n pasteFromClipboard: (\n target: TreeNode<T> | null,\n position?: TreeMovePosition,\n ) => Promise<void>;\n clearClipboard: () => void;\n}\n\n/**\n * Tree-local clipboard. Cut + paste dispatches `adapter.move`, copy +\n * paste dispatches `adapter.copy`. Errors are surfaced through\n * `window.dialog.alert` so they don't get swallowed silently.\n */\nexport function useClipboard<T>({\n dispatch,\n clipboard,\n adapter,\n nodeById,\n labels,\n}: UseClipboardOptions<T>): UseClipboardReturn<T> {\n const clipboardRef = useRef(clipboard);\n clipboardRef.current = clipboard;\n\n const cutToClipboard = useCallback(\n (ids: TreeItemId[]) => {\n if (ids.length === 0) return;\n dispatch({ type: 'clipboard-set', payload: { kind: 'cut', ids } });\n },\n [dispatch],\n );\n\n const copyToClipboard = useCallback(\n (ids: TreeItemId[]) => {\n if (ids.length === 0) return;\n dispatch({ type: 'clipboard-set', payload: { kind: 'copy', ids } });\n },\n [dispatch],\n );\n\n const clearClipboard = useCallback(\n () => dispatch({ type: 'clipboard-set', payload: null }),\n [dispatch],\n );\n\n const pasteFromClipboard = useCallback(\n async (\n target: TreeNode<T> | null,\n position: TreeMovePosition = 'inside',\n ) => {\n const cb = clipboardRef.current;\n if (!cb || cb.ids.length === 0) return;\n if (!adapter) return;\n const nodes = cb.ids\n .map((id) => nodeById.get(id))\n .filter((n): n is TreeNode<T> => !!n);\n if (nodes.length === 0) {\n dispatch({ type: 'clipboard-set', payload: null });\n return;\n }\n try {\n if (cb.kind === 'cut') {\n if (!adapter.move) return;\n await adapter.move(nodes, target, position);\n // Cut + paste consumes the clipboard. Copy + paste retains it.\n dispatch({ type: 'clipboard-set', payload: null });\n } else {\n if (!adapter.copy) return;\n await adapter.copy(nodes, target, position);\n }\n } catch (e) {\n const dialog = getDialog();\n await dialog?.alert({\n title: labels.error,\n message: e instanceof Error ? e.message : String(e),\n });\n }\n },\n [dispatch, adapter, nodeById, labels],\n );\n\n return {\n cutToClipboard,\n copyToClipboard,\n pasteFromClipboard,\n clearClipboard,\n };\n}\n","'use client';\n\nimport { getDialog } from '@djangocfg/ui-core/lib/dialog-service';\nimport {\n Copy,\n CornerUpLeft,\n FilePlus,\n FolderPlus,\n Pencil,\n Scissors,\n Trash2,\n} from 'lucide-react';\nimport type { ComponentType } from 'react';\n\nimport type {\n TreeAdapter,\n TreeBuiltinAction,\n TreeContextMenuItem,\n TreeItemId,\n TreeLabels,\n TreeNode,\n TreeRowRenderProps,\n} from '../../types';\n\n// =====================================================================\n// BuiltinActionContext — everything the action handler needs from Tree.\n// Kept as a plain object (not a React context) so the same code can be\n// shared by hotkeys, right-click menus, and the empty-area menu.\n// =====================================================================\n\nexport interface BuiltinActionContext<T> {\n adapter: TreeAdapter<T>;\n labels: TreeLabels;\n /** Currently selected nodes (full objects, resolved from ids). */\n selectedNodes: TreeNode<T>[];\n /** Row the user right-clicked / triggered the action on. May be null\n * for empty-area actions (paste / new file / new folder at root). */\n targetNode: TreeNode<T> | null;\n /** Returns the human-readable name for a node (uses `getItemName`). */\n getName: (node: TreeNode<T>) => string;\n /** Imperative: start inline rename on this id (no-op if disabled). */\n startInlineRename?: (id: TreeItemId) => void;\n /** Clipboard hooks (P5). Provided by Tree's context; pure forwarding. */\n clipboard?: {\n /** Current clipboard kind, if any (so we can hide \"Paste\" when empty). */\n hasItems: boolean;\n cut: (ids: TreeItemId[]) => void;\n copy: (ids: TreeItemId[]) => void;\n paste: () => void | Promise<void>;\n };\n}\n\ninterface BuiltinActionDescriptor<T> {\n id: TreeBuiltinAction;\n label: (ctx: BuiltinActionContext<T>) => string;\n icon: ComponentType<{ className?: string }>;\n destructive?: boolean;\n shortcut?: string;\n /** Should this row appear in the menu given the current adapter + selection? */\n available: (ctx: BuiltinActionContext<T>) => boolean;\n run: (ctx: BuiltinActionContext<T>) => Promise<void> | void;\n}\n\n// =====================================================================\n// Dialog helpers — thin wrappers that bail out gracefully if\n// <DialogProvider /> isn't mounted. Tree should still render in that\n// case, just without CRUD flows.\n// =====================================================================\n\nasync function confirmDelete<T>(ctx: BuiltinActionContext<T>): Promise<boolean> {\n const dialog = getDialog();\n if (!dialog) return false;\n const { selectedNodes, labels, getName } = ctx;\n return dialog.confirm({\n title: labels.confirmDeleteTitle(selectedNodes.length),\n message: labels.confirmDeleteMessage(selectedNodes.map(getName)),\n confirmText: labels.confirmDeleteOk,\n cancelText: labels.confirmDeleteCancel,\n variant: 'destructive',\n });\n}\n\nasync function promptName<T>(\n ctx: BuiltinActionContext<T>,\n spec: {\n title: string;\n message: string;\n placeholder: string;\n defaultValue: string;\n },\n): Promise<string | null> {\n const dialog = getDialog();\n if (!dialog) return null;\n return dialog.prompt({\n title: spec.title,\n message: spec.message,\n placeholder: spec.placeholder,\n defaultValue: spec.defaultValue,\n });\n}\n\nasync function alertError<T>(\n ctx: BuiltinActionContext<T>,\n message: string,\n): Promise<void> {\n const dialog = getDialog();\n if (!dialog) return;\n await dialog.alert({ message, title: ctx.labels.error });\n}\n\n/**\n * Validate a name through `adapter.validateName` and a tiny built-in\n * non-empty check. Returns `null` if valid, otherwise the error message\n * to surface via `dialog.alert`.\n */\nfunction validateName<T>(\n ctx: BuiltinActionContext<T>,\n name: string,\n validateCtx: { node?: TreeNode<T>; parent?: TreeNode<T> | null },\n): string | null {\n if (name.trim() === '') return ctx.labels.invalidNameEmpty;\n return ctx.adapter.validateName?.(name, validateCtx) ?? null;\n}\n\n// =====================================================================\n// Built-in action descriptors. Order matters — it controls menu order.\n// =====================================================================\n\nconst BUILTIN_ACTIONS: BuiltinActionDescriptor<unknown>[] = [\n {\n id: 'open',\n label: (ctx) => ctx.labels.actionOpen,\n icon: CornerUpLeft,\n available: () => false, // wired by Tree on activate; not in menu by default\n run: () => {},\n },\n {\n id: 'rename',\n label: (ctx) => ctx.labels.actionRename,\n icon: Pencil,\n shortcut: 'F2',\n available: (ctx) =>\n !!ctx.adapter.rename &&\n ctx.selectedNodes.length === 1 &&\n !ctx.selectedNodes[0].disabled,\n run: async (ctx) => {\n // Prefer inline rename when Tree can drive it; fall back to a prompt.\n const node = ctx.selectedNodes[0];\n if (ctx.startInlineRename) {\n ctx.startInlineRename(node.id);\n return;\n }\n const name = await promptName(ctx, {\n title: ctx.labels.renameTitle,\n message: ctx.labels.renameMessage,\n placeholder: ctx.getName(node),\n defaultValue: ctx.getName(node),\n });\n if (name === null) return;\n const err = validateName(ctx, name, { node });\n if (err) return alertError(ctx, err);\n await ctx.adapter.rename!(node, name);\n },\n },\n {\n id: 'duplicate',\n label: (ctx) => ctx.labels.actionDuplicate,\n icon: Copy,\n shortcut: '⌘D',\n available: (ctx) => !!ctx.adapter.duplicate && ctx.selectedNodes.length > 0,\n run: (ctx) => ctx.adapter.duplicate!(ctx.selectedNodes),\n },\n {\n id: 'cut',\n label: (ctx) => ctx.labels.actionCut,\n icon: Scissors,\n shortcut: '⌘X',\n // Only meaningful when the adapter supports `move` (paste-after-cut)\n // AND Tree provided a clipboard binding.\n available: (ctx) =>\n !!ctx.adapter.move && !!ctx.clipboard && ctx.selectedNodes.length > 0,\n run: (ctx) => {\n ctx.clipboard?.cut(ctx.selectedNodes.map((n) => n.id));\n },\n },\n {\n id: 'copy',\n label: (ctx) => ctx.labels.actionCopy,\n icon: Copy,\n shortcut: '⌘C',\n available: (ctx) =>\n !!ctx.adapter.copy && !!ctx.clipboard && ctx.selectedNodes.length > 0,\n run: (ctx) => {\n ctx.clipboard?.copy(ctx.selectedNodes.map((n) => n.id));\n },\n },\n {\n id: 'paste',\n label: (ctx) => ctx.labels.actionPaste,\n icon: CornerUpLeft,\n shortcut: '⌘V',\n available: (ctx) => !!ctx.clipboard?.hasItems,\n run: async (ctx) => {\n await ctx.clipboard?.paste();\n },\n },\n {\n id: 'delete',\n label: (ctx) => ctx.labels.actionDelete,\n icon: Trash2,\n shortcut: '⌘⌫',\n destructive: true,\n available: (ctx) => !!ctx.adapter.remove && ctx.selectedNodes.length > 0,\n run: async (ctx) => {\n const ok = await confirmDelete(ctx);\n if (!ok) return;\n await ctx.adapter.remove!(ctx.selectedNodes);\n },\n },\n {\n id: 'new-file',\n label: (ctx) => ctx.labels.actionNewFile,\n icon: FilePlus,\n available: (ctx) => !!ctx.adapter.createFile,\n run: async (ctx) => {\n const parent = resolveParentForCreate(ctx);\n const name = await promptName(ctx, {\n title: ctx.labels.newFileTitle,\n message: ctx.labels.newFileMessage,\n placeholder: ctx.labels.newFilePlaceholder,\n defaultValue: ctx.labels.newFileDefault,\n });\n if (name === null) return;\n const err = validateName(ctx, name, { parent });\n if (err) return alertError(ctx, err);\n await ctx.adapter.createFile!(parent, name);\n },\n },\n {\n id: 'new-folder',\n label: (ctx) => ctx.labels.actionNewFolder,\n icon: FolderPlus,\n shortcut: '⌘⇧N',\n available: (ctx) => !!ctx.adapter.createFolder,\n run: async (ctx) => {\n const parent = resolveParentForCreate(ctx);\n const name = await promptName(ctx, {\n title: ctx.labels.newFolderTitle,\n message: ctx.labels.newFolderMessage,\n placeholder: ctx.labels.newFolderPlaceholder,\n defaultValue: ctx.labels.newFolderDefault,\n });\n if (name === null) return;\n const err = validateName(ctx, name, { parent });\n if (err) return alertError(ctx, err);\n await ctx.adapter.createFolder!(parent, name);\n },\n },\n];\n\n/**\n * Default order of items in the auto-built context menu when the\n * consumer doesn't override `defaultMenuItems`. Separators are\n * conventional Finder/Explorer groupings.\n */\nexport const DEFAULT_BUILTIN_MENU_ORDER: (TreeBuiltinAction | 'separator')[] = [\n 'rename',\n 'duplicate',\n 'separator',\n 'cut',\n 'copy',\n 'paste',\n 'separator',\n 'new-file',\n 'new-folder',\n 'separator',\n 'delete',\n];\n\n/**\n * Where should a \"new file / new folder\" land?\n *\n * - target row is a folder → create inside it\n * - target row is a leaf → create as sibling (under its parent)\n * - no target row → root (null)\n */\nfunction resolveParentForCreate<T>(ctx: BuiltinActionContext<T>): TreeNode<T> | null {\n const { targetNode } = ctx;\n if (!targetNode) return null;\n // We can't know the parent without walking the tree — Tree passes the\n // target's effective \"container\" via targetNode for folders; leaves go\n // to root for now. Consumers that need sibling-creation can pass a\n // custom contextMenuActions resolver.\n const isFolder = Array.isArray(targetNode.children) || !!targetNode.isFolder;\n return isFolder ? targetNode : null;\n}\n\n/**\n * Build the list of `TreeContextMenuItem`s for the current selection /\n * target row using the configured `defaultMenuItems` (or the default\n * order). Returns `null` when no items are available — caller should\n * suppress the menu entirely.\n */\nexport function buildDefaultMenuItems<T>(\n ctx: BuiltinActionContext<T>,\n order: (TreeBuiltinAction | 'separator')[] = DEFAULT_BUILTIN_MENU_ORDER,\n): TreeContextMenuItem<T>[] | null {\n const items: TreeContextMenuItem<T>[] = [];\n let pendingSeparator = false;\n\n for (const entry of order) {\n if (entry === 'separator') {\n pendingSeparator = items.length > 0;\n continue;\n }\n const desc = BUILTIN_ACTIONS.find((a) => a.id === entry) as\n | BuiltinActionDescriptor<T>\n | undefined;\n if (!desc) continue;\n if (!desc.available(ctx)) continue;\n if (pendingSeparator) {\n items.push('separator');\n pendingSeparator = false;\n }\n items.push({\n id: desc.id,\n label: desc.label(ctx),\n icon: desc.icon,\n shortcut: desc.shortcut,\n destructive: desc.destructive,\n onSelect: () => void desc.run(ctx),\n });\n }\n\n return items.length > 0 ? items : null;\n}\n\n/**\n * Internal: run a built-in action by id. Used by Finder hotkeys (P4).\n * Returns `false` if the action isn't currently available (e.g. delete\n * with no selection).\n */\nexport async function runBuiltinAction<T>(\n id: TreeBuiltinAction,\n ctx: BuiltinActionContext<T>,\n): Promise<boolean> {\n const desc = BUILTIN_ACTIONS.find((a) => a.id === id) as\n | BuiltinActionDescriptor<T>\n | undefined;\n if (!desc) return false;\n if (!desc.available(ctx)) return false;\n await desc.run(ctx);\n return true;\n}\n\n// Re-export typed bits used by callers.\nexport type { TreeRowRenderProps };\n","'use client';\n\nimport { useMemo } from 'react';\n\nimport type { ClipboardState } from '../../data/clipboard';\nimport type {\n TreeAdapter,\n TreeBuiltinAction,\n TreeContextMenuActionsResolver,\n TreeContextMenuItem,\n TreeItemId,\n TreeLabels,\n TreeMovePosition,\n TreeNode,\n TreeRowRenderProps,\n} from '../../types';\n\nexport type { TreeContextMenuActionsResolver };\nimport {\n buildDefaultMenuItems,\n type BuiltinActionContext,\n} from './builtin-actions';\n\n/**\n * Internal row-driven resolver — same shape as\n * `TreeContextMenuActionsResolver` but takes a plain `TreeRowRenderProps`\n * instead of the context-with-selection. The provider injects\n * `selectedNodes` itself.\n */\nexport type ResolvedMenuResolver<T> = (\n row: TreeRowRenderProps<T>,\n) => TreeContextMenuItem<T>[] | null | undefined;\n\nexport interface UseResolvedMenuOptions<T> {\n adapter?: TreeAdapter<T>;\n contextMenuActions?: TreeContextMenuActionsResolver<T>;\n defaultMenuItems?: TreeBuiltinAction[];\n labels: TreeLabels;\n selected: ReadonlySet<TreeItemId>;\n clipboard: ClipboardState;\n nodeById: Map<TreeItemId, TreeNode<T>>;\n getItemName: (node: TreeNode<T>) => string;\n enableInlineRename: boolean;\n startRename: (id: TreeItemId) => void;\n cutToClipboard: (ids: TreeItemId[]) => void;\n copyToClipboard: (ids: TreeItemId[]) => void;\n pasteFromClipboard: (\n target: TreeNode<T> | null,\n position?: TreeMovePosition,\n ) => Promise<void>;\n}\n\n/**\n * Build the merged declarative menu resolver — built-in adapter actions\n * (filtered by `defaultMenuItems`) prepended to the consumer's\n * `contextMenuActions` result. Returns `undefined` when neither side\n * supplies anything, so `TreeRow` can skip rendering a menu entirely.\n *\n * The resolver injects `selectedNodes` on every call so the consumer's\n * resolver receives the multi-selection without having to read it from\n * elsewhere. Finder/Explorer convention applies: if the right-clicked\n * row isn't in the current selection, the menu acts on a single-row\n * effective selection (the row itself).\n */\nexport function useResolvedMenu<T>(\n opts: UseResolvedMenuOptions<T>,\n): ResolvedMenuResolver<T> | undefined {\n const {\n adapter,\n contextMenuActions,\n defaultMenuItems,\n labels,\n selected,\n clipboard,\n nodeById,\n getItemName,\n enableInlineRename,\n startRename,\n cutToClipboard,\n copyToClipboard,\n pasteFromClipboard,\n } = opts;\n\n return useMemo<ResolvedMenuResolver<T> | undefined>(() => {\n if (!adapter && !contextMenuActions) return undefined;\n\n return (rowProps) => {\n const selectedIds = selected.has(rowProps.node.id)\n ? [...selected]\n : [rowProps.node.id];\n const selectedNodes = selectedIds\n .map((id) => nodeById.get(id))\n .filter((n): n is TreeNode<T> => !!n);\n\n const builtin = adapter\n ? buildDefaultMenuItems<T>(\n {\n adapter,\n labels,\n selectedNodes,\n targetNode: rowProps.node,\n getName: getItemName,\n startInlineRename:\n enableInlineRename && adapter.rename ? startRename : undefined,\n clipboard: {\n hasItems: !!clipboard && clipboard.ids.length > 0,\n cut: cutToClipboard,\n copy: copyToClipboard,\n paste: () => pasteFromClipboard(rowProps.node, 'inside'),\n },\n } satisfies BuiltinActionContext<T>,\n defaultMenuItems\n ? (defaultMenuItems as (TreeBuiltinAction | 'separator')[])\n : undefined,\n )\n : null;\n\n const user =\n contextMenuActions?.({ ...rowProps, selectedNodes }) ?? null;\n\n if (!builtin && !user) return null;\n if (!user) return builtin;\n if (!builtin) return user;\n return [...builtin, 'separator', ...user];\n };\n }, [\n adapter,\n contextMenuActions,\n defaultMenuItems,\n labels,\n selected,\n clipboard,\n nodeById,\n getItemName,\n enableInlineRename,\n startRename,\n cutToClipboard,\n copyToClipboard,\n pasteFromClipboard,\n ]);\n}\n","'use client';\n\nimport {\n ContextMenu,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuTrigger,\n} from '@djangocfg/ui-core/components';\n\nimport type {\n TreeContextMenuItem,\n TreeRowRenderProps,\n} from '../../types';\n\n/**\n * Render an array of declarative menu items as a themed `<ContextMenu>`\n * wrapped around the supplied trigger element. Pure presentational layer\n * — the caller resolves and merges items.\n */\nexport function renderItemsAsContextMenu<T>(\n rowProps: TreeRowRenderProps<T>,\n items: TreeContextMenuItem<T>[],\n trigger: React.ReactNode,\n): React.ReactNode {\n return (\n <ContextMenu>\n <ContextMenuTrigger asChild>{trigger}</ContextMenuTrigger>\n <ContextMenuContent>\n {items.map((item, idx) => {\n if (item === 'separator') {\n return <ContextMenuSeparator key={`sep-${idx}`} />;\n }\n const Icon = item.icon;\n return (\n <ContextMenuItem\n key={item.id}\n disabled={item.disabled}\n variant={item.destructive ? 'destructive' : undefined}\n onSelect={() => item.onSelect(rowProps)}\n >\n {Icon ? <Icon /> : null}\n {item.label}\n {item.shortcut ? (\n <ContextMenuShortcut>{item.shortcut}</ContextMenuShortcut>\n ) : null}\n </ContextMenuItem>\n );\n })}\n </ContextMenuContent>\n </ContextMenu>\n );\n}\n\n/**\n * Drop trailing / leading / duplicate separators so a merged menu never\n * shows a separator next to a section header or another separator.\n */\nexport function tidyMenuItems<T>(\n items: TreeContextMenuItem<T>[],\n): TreeContextMenuItem<T>[] {\n const out: TreeContextMenuItem<T>[] = [];\n for (const it of items) {\n if (it === 'separator') {\n if (out.length === 0) continue;\n if (out[out.length - 1] === 'separator') continue;\n out.push(it);\n } else {\n out.push(it);\n }\n }\n while (out.length > 0 && out[out.length - 1] === 'separator') out.pop();\n return out;\n}\n","'use client';\n\nimport type { FlatRow, TreeItemId, TreeMovePosition, TreeNode } from '../types';\n\n// =====================================================================\n// Drag-and-drop primitives — pure, framework-agnostic.\n//\n// @dnd-kit handles the pointer/keyboard sensors and overlay rendering;\n// these helpers only translate pointer geometry into a domain-level\n// drop position (`before` / `inside` / `after`) and validate whether\n// a given drag/drop combo is allowed.\n//\n// Folder vs leaf semantics:\n// - leaves → no `inside` zone; row splits into top/bottom halves\n// for `before` / `after` reorder\n// - folders → top third = `before`, middle third = `inside`,\n// bottom third = `after`\n// =====================================================================\n\nexport interface DropZoneInput {\n /** Pointer Y in viewport coordinates. */\n pointerY: number;\n /** Row bounding box (`getBoundingClientRect()`). */\n rowRect: { top: number; bottom: number; height: number };\n /** Folders accept `inside` drops; leaves only reorder via before/after. */\n isFolder: boolean;\n}\n\n/**\n * Translate pointer geometry into a drop position relative to the row.\n *\n * For folders the row is split into three zones (top third / middle /\n * bottom third). For leaves it's split in half (before / after).\n */\nexport function resolveDropZone(input: DropZoneInput): TreeMovePosition {\n const { pointerY, rowRect, isFolder } = input;\n const offset = pointerY - rowRect.top;\n const ratio = rowRect.height > 0 ? offset / rowRect.height : 0.5;\n\n if (isFolder) {\n if (ratio < 0.33) return 'before';\n if (ratio > 0.66) return 'after';\n return 'inside';\n }\n return ratio < 0.5 ? 'before' : 'after';\n}\n\n// =====================================================================\n// canDrop — default validator.\n//\n// Rejects:\n// 1. Dropping a node onto itself.\n// 2. Dropping a folder into one of its own descendants (would create\n// a cycle).\n// 3. Dropping `inside` a non-folder (defensive — UI already routes\n// these as `before`/`after`, but the API can be called directly).\n//\n// Consumers can pass their own `canDrop` via `<TreeRoot canDrop={…}>`\n// to layer extra rules on top (e.g. read-only branches, type matching).\n// =====================================================================\n\nexport interface CanDropInput<T> {\n /** Nodes being dragged. */\n source: TreeNode<T>[];\n /** Row under the pointer (`null` = root drop zone). */\n target: TreeNode<T> | null;\n /** Resolved drop position. */\n position: TreeMovePosition;\n /** Tree's id→node lookup, used to walk descendants. */\n getNodeById: (id: TreeItemId) => TreeNode<T> | undefined;\n}\n\nexport function defaultCanDrop<T>(input: CanDropInput<T>): boolean {\n const { source, target, position } = input;\n if (source.length === 0) return false;\n if (!target) return true; // root drop is always allowed when no other rule rejects.\n\n // Inside a leaf doesn't make sense.\n if (position === 'inside') {\n const isFolder = Array.isArray(target.children) || !!target.isFolder;\n if (!isFolder) return false;\n }\n\n for (const node of source) {\n if (node.id === target.id) return false;\n if (isDescendant(node, target.id)) return false;\n }\n return true;\n}\n\n/**\n * Walk `root`'s inline children searching for `id`. Cached async children\n * are *not* walked here because the cycle check needs to be cheap and\n * deterministic — a missing cycle in unloaded branches is acceptable\n * (the consumer's `adapter.move` is the final gatekeeper).\n */\nfunction isDescendant<T>(root: TreeNode<T>, id: TreeItemId): boolean {\n if (!Array.isArray(root.children)) return false;\n for (const child of root.children) {\n if (child.id === id) return true;\n if (isDescendant(child, id)) return true;\n }\n return false;\n}\n\n// =====================================================================\n// DataTransfer mime — used both for in-tree drags and (later) for\n// receiving dragged files from the OS. The id payload is the JSON-\n// encoded list of `TreeItemId`s.\n// =====================================================================\n\nexport const TREE_DND_MIME = 'application/x-djangocfg-tree';\n\n/**\n * Sentinel droppable id used by `<TreeEmptyArea>` to claim the\n * \"root drop target\" slot. `<TreeDndProvider>` recognises this id and\n * maps it to `{ id: null, position: 'inside' }` in `dnd.dropTarget`.\n *\n * Lives in `data/` (not in the component) so both producer and\n * consumer reference one constant instead of duplicating the magic\n * string.\n */\nexport const TREE_ROOT_DROP_ID = '__tree_root_drop__';\n","'use client';\n\nimport { useCallback, useMemo, useState } from 'react';\n\nimport { getDialog } from '@djangocfg/ui-core/lib/dialog-service';\n\nimport { defaultCanDrop } from '../../data/dnd';\nimport type {\n TreeAdapter,\n TreeItemId,\n TreeLabels,\n TreeMovePosition,\n TreeNode,\n} from '../../types';\n\nexport interface UseDndOptions<T> {\n enabled: boolean;\n adapter?: TreeAdapter<T>;\n nodeById: Map<TreeItemId, TreeNode<T>>;\n /**\n * Multi-selection at the moment dragging begins. If the dragged row\n * is part of the selection, we drag all selected rows; otherwise we\n * drag just the row.\n */\n selected: ReadonlySet<TreeItemId>;\n labels: TreeLabels;\n /** Optional consumer-defined drop validator (layered on top of `defaultCanDrop`). */\n canDrop?: (ctx: {\n source: TreeNode<T>[];\n target: TreeNode<T> | null;\n position: TreeMovePosition;\n }) => boolean;\n}\n\nexport interface DropTargetState {\n id: TreeItemId | null; // null = root drop zone\n position: TreeMovePosition;\n}\n\nexport interface UseDndReturn<T> {\n /** True when the host enabled DnD AND adapter.move is defined. */\n active: boolean;\n /** Ids currently being dragged (empty when not dragging). */\n draggingIds: ReadonlySet<TreeItemId>;\n /** Live drop target (`null` when nothing under the pointer). */\n dropTarget: DropTargetState | null;\n /** Called by row sensors on dragstart. */\n beginDrag: (rowId: TreeItemId) => void;\n /**\n * Called on dragover. `null` clears the indicator. Tree already\n * filters self/cycle drops via `defaultCanDrop` — the row component\n * decides the position from pointer geometry first.\n */\n setDropTarget: (target: DropTargetState | null) => void;\n /** Commit drop — calls `adapter.move` and resets transient state. */\n commitDrop: () => Promise<void>;\n /** Cancel without committing (Esc, drop outside). */\n cancelDrag: () => void;\n /**\n * Validate a candidate drop in real time. Combines `defaultCanDrop`\n * with the consumer's `canDrop`. Used by the row component to\n * suppress the indicator on invalid hovers.\n */\n isAllowedDrop: (target: TreeNode<T> | null, position: TreeMovePosition) => boolean;\n}\n\nexport function useDnd<T>({\n enabled,\n adapter,\n nodeById,\n selected,\n labels,\n canDrop,\n}: UseDndOptions<T>): UseDndReturn<T> {\n const active = enabled && !!adapter?.move;\n\n const [draggingIds, setDraggingIds] = useState<ReadonlySet<TreeItemId>>(\n () => new Set(),\n );\n const [dropTarget, setDropTarget] = useState<DropTargetState | null>(null);\n\n const beginDrag = useCallback(\n (rowId: TreeItemId) => {\n if (!active) return;\n // If the dragged row is part of the selection, drag the whole\n // selection. Otherwise it's a single-row drag (and we don't\n // touch the existing selection).\n const ids = selected.has(rowId)\n ? new Set(selected)\n : new Set<TreeItemId>([rowId]);\n setDraggingIds(ids);\n },\n [active, selected],\n );\n\n const cancelDrag = useCallback(() => {\n setDraggingIds(new Set());\n setDropTarget(null);\n }, []);\n\n const resolveSourceNodes = useCallback((): TreeNode<T>[] => {\n const out: TreeNode<T>[] = [];\n for (const id of draggingIds) {\n const node = nodeById.get(id);\n if (node) out.push(node);\n }\n return out;\n }, [draggingIds, nodeById]);\n\n const isAllowedDrop = useCallback(\n (target: TreeNode<T> | null, position: TreeMovePosition): boolean => {\n if (!active) return false;\n if (draggingIds.size === 0) return false;\n const source = resolveSourceNodes();\n if (\n !defaultCanDrop<T>({\n source,\n target,\n position,\n getNodeById: (id) => nodeById.get(id),\n })\n ) {\n return false;\n }\n // Layer the consumer's rule on top.\n return canDrop?.({ source, target, position }) ?? true;\n },\n [active, draggingIds, resolveSourceNodes, nodeById, canDrop],\n );\n\n const commitDrop = useCallback(async () => {\n if (!active || !adapter?.move) {\n cancelDrag();\n return;\n }\n const t = dropTarget;\n if (!t) {\n cancelDrag();\n return;\n }\n const targetNode = t.id ? nodeById.get(t.id) ?? null : null;\n const source = resolveSourceNodes();\n if (source.length === 0) {\n cancelDrag();\n return;\n }\n if (!isAllowedDrop(targetNode, t.position)) {\n cancelDrag();\n return;\n }\n try {\n await adapter.move(source, targetNode, t.position);\n } catch (e) {\n const dialog = getDialog();\n await dialog?.alert({\n title: labels.error,\n message: e instanceof Error ? e.message : String(e),\n });\n } finally {\n cancelDrag();\n }\n }, [\n active,\n adapter,\n cancelDrag,\n dropTarget,\n isAllowedDrop,\n labels,\n nodeById,\n resolveSourceNodes,\n ]);\n\n return useMemo(\n () => ({\n active,\n draggingIds,\n dropTarget,\n beginDrag,\n setDropTarget,\n commitDrop,\n cancelDrag,\n isAllowedDrop,\n }),\n [\n active,\n draggingIds,\n dropTarget,\n beginDrag,\n commitDrop,\n cancelDrag,\n isAllowedDrop,\n ],\n );\n}\n","'use client';\n\nimport { useEffect, useRef } from 'react';\n\nimport { saveTreeState } from '../../data/persist';\nimport type { TreeItemId } from '../../types';\n\nexport interface UsePersistSyncOptions {\n expanded: ReadonlySet<TreeItemId>;\n selected: ReadonlySet<TreeItemId>;\n persistKey?: string;\n persistSelection: boolean;\n onSelectionChange?: (ids: TreeItemId[]) => void;\n onExpansionChange?: (ids: TreeItemId[]) => void;\n}\n\n/**\n * Persist `expanded` / `selected` into `localStorage` under `persistKey`,\n * and forward changes through the consumer's notify callbacks. We\n * compare by content (not identity) because the reducer recreates\n * `Set`s on every change — without diffing we'd fire `onSelectionChange`\n * on every render.\n */\nexport function usePersistSync({\n expanded,\n selected,\n persistKey,\n persistSelection,\n onSelectionChange,\n onExpansionChange,\n}: UsePersistSyncOptions): void {\n // Stable refs so we don't re-bind effects every render.\n const onSelectionChangeRef = useRef(onSelectionChange);\n const onExpansionChangeRef = useRef(onExpansionChange);\n onSelectionChangeRef.current = onSelectionChange;\n onExpansionChangeRef.current = onExpansionChange;\n\n const lastSelectedArrRef = useRef<TreeItemId[]>([...selected]);\n const lastExpandedArrRef = useRef<TreeItemId[]>([...expanded]);\n\n useEffect(() => {\n const arr = [...expanded];\n if (!setEqualsArr(expanded, lastExpandedArrRef.current)) {\n lastExpandedArrRef.current = arr;\n onExpansionChangeRef.current?.(arr);\n if (persistKey) {\n saveTreeState(persistKey, {\n expandedItems: arr,\n selectedItems: persistSelection ? [...selected] : [],\n });\n }\n }\n }, [expanded, persistKey, persistSelection, selected]);\n\n useEffect(() => {\n const arr = [...selected];\n if (!setEqualsArr(selected, lastSelectedArrRef.current)) {\n lastSelectedArrRef.current = arr;\n onSelectionChangeRef.current?.(arr);\n if (persistKey && persistSelection) {\n saveTreeState(persistKey, {\n expandedItems: [...expanded],\n selectedItems: arr,\n });\n }\n }\n }, [selected, persistKey, persistSelection, expanded]);\n}\n\nfunction setEqualsArr(set: ReadonlySet<string>, arr: readonly string[]): boolean {\n if (set.size !== arr.length) return false;\n for (const id of arr) if (!set.has(id)) return false;\n return true;\n}\n","'use client';\n\nimport * as React from 'react';\nimport { createContext, useCallback, useMemo, useReducer, useRef } from 'react';\n\nimport { flattenTree } from '../data/flatten';\nimport { loadTreeState } from '../data/persist';\nimport { resolveAppearance } from '../data/appearance';\nimport {\n DEFAULT_TREE_LABELS,\n type FlatRow,\n type TreeActivateOptions,\n type TreeContextMenuSlot,\n type TreeItemId,\n type TreeLabels,\n type TreeNode,\n type TreeRootProps,\n} from '../types';\n\nimport { reducer, createInitialState } from './state';\nimport { useAsyncChildren } from './async-children';\nimport { useExpansion } from './expansion';\nimport { useSelection } from './selection';\nimport { useRename } from './rename';\nimport { useClipboard } from './clipboard';\nimport { useResolvedMenu, renderItemsAsContextMenu, tidyMenuItems } from './menu';\nimport { useDnd, type UseDndReturn } from './dnd';\nimport { usePersistSync } from './persist';\nimport type { TreeContextValue } from './TreeContextValue';\n\n// Re-exported from this module: the value interface (so consumers\n// continue to `import type { TreeContextValue }` from `./context`).\nexport type { TreeContextValue } from './TreeContextValue';\n\n/**\n * Internal context object. Exported so `TreeRoot` can wrap it with an\n * override-provider that injects a slot-form `renderContextMenu`\n * derived from the declarative resolver. Consumers should use\n * `useTreeContext()` instead of touching this directly.\n */\nexport const TreeContext = createContext<TreeContextValue<unknown> | null>(null);\n\nexport function useTreeContext<T>(): TreeContextValue<T> {\n const ctx = React.useContext(TreeContext);\n if (!ctx) {\n throw new Error('useTreeContext must be used inside <TreeProvider>');\n }\n return ctx as TreeContextValue<T>;\n}\n\n// =====================================================================\n// Provider — thin assembly. The real work lives in:\n//\n// state/ reducer + initial state\n// async-children/ child cache, nodeById, fetchChildren, refresh, refreshAll\n// expansion/ expand / collapse / toggle / expandAll / collapseAll\n// selection/ click / move / select-all + plain select / clear\n// rename/ start / cancel / commit\n// clipboard/ cut / copy / paste / clear\n// menu/ built-in actions registry + merged declarative resolver\n// persist/ localStorage + onSelectionChange/onExpansionChange\n//\n// This file only stitches them together and shapes the final\n// `TreeContextValue`. If a feature grows, add a folder above — don't\n// extend this file.\n// =====================================================================\n\nexport interface TreeProviderProps<T>\n extends Pick<\n TreeRootProps<T>,\n | 'data'\n | 'getItemName'\n | 'loadChildren'\n | 'selectionMode'\n | 'activationMode'\n | 'initialExpandedIds'\n | 'initialSelectedIds'\n | 'indent'\n | 'appearance'\n | 'onSelectionChange'\n | 'onExpansionChange'\n | 'onActivate'\n | 'filterNode'\n | 'enableSearch'\n | 'showIndentGuides'\n | 'renderIcon'\n | 'renderLabel'\n | 'renderActions'\n | 'renderContextMenu'\n | 'contextMenuActions'\n | 'labels'\n | 'persistKey'\n | 'persistSelection'\n | 'adapter'\n | 'defaultMenuItems'\n | 'enableInlineRename'\n | 'enableDnD'\n | 'canDrop'\n > {\n children: React.ReactNode;\n}\n\nexport function TreeProvider<T>(props: TreeProviderProps<T>) {\n const {\n data,\n getItemName,\n loadChildren,\n selectionMode = 'single',\n activationMode = 'single-click',\n initialExpandedIds,\n initialSelectedIds,\n indent,\n appearance,\n onSelectionChange,\n onExpansionChange,\n onActivate,\n filterNode,\n enableSearch = false,\n showIndentGuides = false,\n renderIcon,\n renderLabel,\n renderActions,\n renderContextMenu,\n contextMenuActions,\n labels: labelsOverride,\n persistKey,\n persistSelection = false,\n adapter,\n defaultMenuItems,\n enableInlineRename = false,\n enableDnD = false,\n canDrop,\n children,\n } = props;\n\n // ---- Stable config ------------------------------------------------\n\n const labels = useMemo<TreeLabels>(\n () => ({ ...DEFAULT_TREE_LABELS, ...labelsOverride }),\n [labelsOverride],\n );\n\n const resolvedAppearance = useMemo(\n () => resolveAppearance(appearance, indent),\n [appearance, indent],\n );\n\n // ---- Reducer ------------------------------------------------------\n\n const persisted = useMemo(\n () => (persistKey ? loadTreeState(persistKey) : null),\n [persistKey],\n );\n\n const [state, dispatch] = useReducer(reducer, undefined, () =>\n createInitialState({\n persisted,\n initialExpandedIds,\n initialSelectedIds,\n persistSelection,\n }),\n );\n\n const bumpCacheTick = useCallback(() => dispatch({ type: 'cache-tick' }), []);\n\n // ---- Async children (cache + nodeById + refresh) ------------------\n\n const {\n nodeById,\n refresh,\n refreshAll,\n collectFolderIds,\n cache,\n } = useAsyncChildren<T>({\n data,\n loadChildren,\n expanded: state.expanded,\n cacheTick: state.cacheTick,\n bumpCacheTick,\n });\n\n // ---- Flat rows (depend on cache via cacheTick) --------------------\n\n const flatRows = useMemo<FlatRow<T>[]>(\n () =>\n flattenTree<T>({\n roots: data,\n expandedIds: state.expanded,\n cache,\n filterNode,\n }),\n [data, state.expanded, state.cacheTick, cache, filterNode],\n );\n\n const matchingIds = useMemo(() => {\n const set = new Set<TreeItemId>();\n if (!enableSearch || state.query.trim() === '') return set;\n const q = state.query.trim().toLowerCase();\n for (const row of flatRows) {\n if (getItemName(row.node).toLowerCase().includes(q)) {\n set.add(row.node.id);\n }\n }\n return set;\n }, [enableSearch, state.query, flatRows, getItemName]);\n\n // ---- Feature hooks ------------------------------------------------\n\n const expansion = useExpansion({ dispatch, collectFolderIds });\n const selection = useSelection<T>({\n dispatch,\n selectionMode,\n flatRows,\n selected: state.selected,\n anchor: state.anchor,\n focused: state.focused,\n });\n const rename = useRename<T>({\n dispatch,\n adapter,\n enableInlineRename,\n nodeById,\n getItemName,\n labels,\n });\n const clipboard = useClipboard<T>({\n dispatch,\n clipboard: state.clipboard,\n adapter,\n nodeById,\n labels,\n });\n const dnd = useDnd<T>({\n enabled: enableDnD,\n adapter,\n nodeById,\n selected: state.selected,\n labels,\n canDrop,\n });\n\n // ---- Activation ---------------------------------------------------\n\n const onActivateRef = useRef(onActivate);\n onActivateRef.current = onActivate;\n const activate = useCallback(\n (node: TreeNode<T>, opts: TreeActivateOptions = { preview: false }) =>\n onActivateRef.current?.(node, opts),\n [],\n );\n\n const setQuery = useCallback(\n (q: string) => dispatch({ type: 'set-query', q }),\n [],\n );\n\n // ---- Persist + notify callbacks -----------------------------------\n\n usePersistSync({\n expanded: state.expanded,\n selected: state.selected,\n persistKey,\n persistSelection,\n onSelectionChange,\n onExpansionChange,\n });\n\n // ---- Resolved context-menu resolver -------------------------------\n\n const resolvedContextMenuActions = useResolvedMenu<T>({\n adapter,\n contextMenuActions,\n defaultMenuItems,\n labels,\n selected: state.selected,\n clipboard: state.clipboard,\n nodeById,\n getItemName,\n enableInlineRename,\n startRename: rename.startRename,\n cutToClipboard: clipboard.cutToClipboard,\n copyToClipboard: clipboard.copyToClipboard,\n pasteFromClipboard: clipboard.pasteFromClipboard,\n });\n\n // Translate the declarative resolver into a slot-form\n // `renderContextMenu` so <TreeRow> doesn't need to know about it.\n // Explicit slot prop wins (escape-hatch for full custom menus).\n const finalRenderContextMenu = useMemo<TreeContextMenuSlot<T> | undefined>(\n () => {\n if (renderContextMenu) return renderContextMenu;\n const resolve = resolvedContextMenuActions;\n if (!resolve) return undefined;\n return (rowProps, trigger) => {\n const items = resolve(rowProps);\n const cleaned = items ? tidyMenuItems(items) : null;\n if (!cleaned || cleaned.length === 0) return trigger;\n return renderItemsAsContextMenu(rowProps, cleaned, trigger);\n };\n },\n [renderContextMenu, resolvedContextMenuActions],\n );\n\n // ---- Final value --------------------------------------------------\n\n const value = useMemo<TreeContextValue<T>>(\n () => ({\n // state\n expanded: state.expanded,\n selected: state.selected,\n anchor: state.anchor,\n focused: state.focused,\n query: state.query,\n renamingId: state.renaming,\n inlineRenameEnabled: rename.enabled,\n clipboard: state.clipboard,\n flatRows,\n matchingIds,\n\n // expansion\n ...expansion,\n\n // selection (note: `select` is from selection hook; expansion exports no `select`)\n ...selection,\n\n setQuery,\n\n // clipboard\n ...clipboard,\n\n // rename\n startRename: rename.startRename,\n cancelRename: rename.cancelRename,\n commitRename: rename.commitRename,\n\n // async\n refresh,\n refreshAll,\n activate,\n\n // config\n labels,\n appearance: resolvedAppearance,\n indent: resolvedAppearance.indent,\n selectionMode,\n activationMode,\n enableSearch,\n showIndentGuides,\n getItemName,\n\n // slots\n renderIcon,\n renderLabel,\n renderActions,\n renderContextMenu: finalRenderContextMenu,\n\n adapter,\n resolvedContextMenuActions,\n getNodeById: (id: TreeItemId) => nodeById.get(id),\n dnd,\n }),\n [\n state.expanded,\n state.selected,\n state.anchor,\n state.focused,\n state.query,\n state.renaming,\n state.clipboard,\n rename.enabled,\n rename.startRename,\n rename.cancelRename,\n rename.commitRename,\n flatRows,\n matchingIds,\n expansion,\n selection,\n setQuery,\n clipboard,\n refresh,\n refreshAll,\n activate,\n labels,\n resolvedAppearance,\n selectionMode,\n activationMode,\n enableSearch,\n showIndentGuides,\n getItemName,\n renderIcon,\n renderLabel,\n renderActions,\n finalRenderContextMenu,\n adapter,\n resolvedContextMenuActions,\n nodeById,\n dnd,\n ],\n );\n\n return (\n <TreeContext.Provider value={value as TreeContextValue<unknown>}>\n {children}\n </TreeContext.Provider>\n );\n}\n\n// Re-export internal types referenced by hook consumers.\nexport type { ChildCache, ChildEntry } from '../data/childCache';\n","'use client';\n\nimport {\n DndContext,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragMoveEvent,\n type DragStartEvent,\n} from '@dnd-kit/core';\nimport { useCallback, useRef } from 'react';\n\nimport { useTreeContext } from './context/TreeContext';\nimport { resolveDropZone, TREE_ROOT_DROP_ID } from './data/dnd';\nimport type { TreeItemId } from './types';\n\ninterface TreeDndProviderProps {\n children: React.ReactNode;\n}\n\n/**\n * Wrap Tree's body in a `<DndContext>` when DnD is enabled.\n *\n * One central drag handler decides the drop zone (`before` / `inside` /\n * `after`) from the cursor position vs. the hovered row's bounding box.\n * Rows themselves only register `useDraggable` + `useDroppable` — no\n * per-row `onPointerMove`, so dragging across 1000 rows stays cheap.\n *\n * Sensors: pointer (with a small activation distance so a plain click\n * doesn't initiate a drag) + keyboard (drag with Space/Enter, arrows,\n * Space drops — built-in accessibility).\n */\nexport function TreeDndProvider({ children }: TreeDndProviderProps) {\n const ctx = useTreeContext();\n const { dnd } = ctx;\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 4 } }),\n useSensor(KeyboardSensor),\n );\n\n // Latest cursor position — @dnd-kit gives us the active rectangle but\n // not the raw pointer Y. We grab it from pointermove ourselves and\n // use it inside `onDragMove` to compute the drop zone.\n const cursorYRef = useRef(0);\n\n const handleDragStart = useCallback(\n (e: DragStartEvent) => {\n dnd.beginDrag(e.active.id as TreeItemId);\n },\n [dnd],\n );\n\n const handleDragMove = useCallback(\n (e: DragMoveEvent) => {\n const overId = e.over?.id;\n // Root drop target — TreeEmptyArea registers under this id.\n if (overId === TREE_ROOT_DROP_ID) {\n const current = dnd.dropTarget;\n if (current?.id !== null || current?.position !== 'inside') {\n dnd.setDropTarget({ id: null, position: 'inside' });\n }\n return;\n }\n if (typeof overId !== 'string') {\n if (dnd.dropTarget !== null) dnd.setDropTarget(null);\n return;\n }\n\n // The dnd-kit `over.rect` is the droppable's bounding box. Combined\n // with the latest cursor Y we recover the same before/inside/after\n // split Finder uses.\n const rect = e.over?.rect;\n if (!rect) return;\n\n // `data-folder` on the dom row tells us if `inside` is allowed.\n const el = document.querySelector<HTMLElement>(\n `[data-tree-row][data-id=\"${CSS.escape(overId)}\"]`,\n );\n const isFolder = el?.dataset.folder === 'true';\n\n const position = resolveDropZone({\n pointerY: cursorYRef.current,\n rowRect: { top: rect.top, bottom: rect.top + rect.height, height: rect.height },\n isFolder,\n });\n\n const current = dnd.dropTarget;\n if (current?.id !== overId || current.position !== position) {\n dnd.setDropTarget({ id: overId, position });\n }\n },\n [dnd],\n );\n\n const handleDragEnd = useCallback(\n async (_e: DragEndEvent) => {\n await dnd.commitDrop();\n },\n [dnd],\n );\n\n const handleDragCancel = useCallback(() => {\n dnd.cancelDrag();\n }, [dnd]);\n\n // Track the latest cursor Y position globally while a drag is in flight.\n // Used by `handleDragMove` to figure out which third of the row we're\n // over. Cheap — one passive listener, no re-renders.\n const handlePointerMove = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n cursorYRef.current = e.clientY;\n }, []);\n\n if (!dnd.active) {\n return <>{children}</>;\n }\n\n return (\n <DndContext\n sensors={sensors}\n onDragStart={handleDragStart}\n onDragMove={handleDragMove}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n >\n <div\n onPointerMove={handlePointerMove}\n className=\"contents\"\n data-tree-dnd-surface=\"\"\n >\n {children}\n </div>\n </DndContext>\n );\n}\n","'use client';\n\nimport { ChevronDown, ChevronRight } from 'lucide-react';\nimport { memo } from 'react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useTreeContext } from '../context/TreeContext';\n\nexport interface TreeChevronProps {\n isExpanded: boolean;\n isFolder: boolean;\n className?: string;\n}\n\n/**\n * TreeChevron — expand/collapse chevron for a tree row.\n *\n * Memoised: re-renders only when `isExpanded`, `isFolder` or `className`\n * change. Reads appearance from context.\n */\nfunction TreeChevronRaw({ isExpanded, isFolder, className }: TreeChevronProps) {\n const { appearance } = useTreeContext();\n const size = { width: 'var(--tree-icon-size)', height: 'var(--tree-icon-size)' };\n\n if (!isFolder) {\n return (\n <span\n aria-hidden\n style={size}\n className={cn('inline-block shrink-0', className)}\n />\n );\n }\n const Icon = isExpanded ? ChevronDown : ChevronRight;\n return (\n <Icon\n aria-hidden\n strokeWidth={appearance.iconStrokeWidth}\n style={size}\n className={cn(\n 'shrink-0 text-muted-foreground/70 transition-transform',\n className,\n )}\n />\n );\n}\n\nexport const TreeChevron = memo(TreeChevronRaw);\n","'use client';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport type { TreeMovePosition } from '../types';\n\nexport interface TreeDropIndicatorProps {\n position: TreeMovePosition;\n /** Indent in pixels — keeps the line aligned with the row's text. */\n indent: number;\n /** Render a \"rejected\" style (red wash) when the drop is forbidden. */\n invalid?: boolean;\n}\n\n/**\n * Visual hint for an in-progress drag-and-drop. Three modes:\n *\n * - `before` / `after` → a 2px horizontal line above / below the row\n * - `inside` → a translucent primary wash filling the row\n *\n * Indents the line by the row's depth so it visually aligns with the\n * target's content (rather than running edge-to-edge).\n *\n * Positioned absolutely — the parent `TreeRow` provides `position: relative`.\n */\nexport function TreeDropIndicator({\n position,\n indent,\n invalid = false,\n}: TreeDropIndicatorProps) {\n if (position === 'inside') {\n return (\n <span\n aria-hidden\n data-tree-drop=\"inside\"\n className={cn(\n 'pointer-events-none absolute inset-0 rounded-sm ring-1',\n invalid\n ? 'bg-destructive/10 ring-destructive/40'\n : 'bg-primary/10 ring-primary/40',\n )}\n />\n );\n }\n\n const isBefore = position === 'before';\n return (\n <span\n aria-hidden\n data-tree-drop={position}\n style={{ paddingLeft: indent }}\n className={cn(\n 'pointer-events-none absolute right-0 left-0 h-px',\n isBefore ? 'top-0' : 'bottom-0',\n )}\n >\n <span\n className={cn(\n 'block h-0.5 rounded-full',\n invalid ? 'bg-destructive/70' : 'bg-primary',\n )}\n />\n </span>\n );\n}\n","'use client';\n\nimport { File, Folder, FolderOpen } from 'lucide-react';\nimport { memo } from 'react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useTreeContext } from '../context/TreeContext';\n\nexport interface TreeIconProps {\n isFolder: boolean;\n isExpanded: boolean;\n className?: string;\n}\n\n/**\n * TreeIcon — file/folder icon for a tree row.\n *\n * Memoised: re-renders only when `isFolder`, `isExpanded` or `className`\n * change. Reads appearance from context — context updates will still\n * trigger re-render as expected.\n */\nfunction TreeIconRaw({ isFolder, isExpanded, className }: TreeIconProps) {\n const { appearance } = useTreeContext();\n const Icon = isFolder ? (isExpanded ? FolderOpen : Folder) : File;\n return (\n <Icon\n aria-hidden\n strokeWidth={appearance.iconStrokeWidth}\n style={{ width: 'var(--tree-icon-size)', height: 'var(--tree-icon-size)' }}\n className={cn(\n 'shrink-0',\n isFolder ? 'text-foreground/70' : 'text-muted-foreground/80',\n className,\n )}\n />\n );\n}\n\nexport const TreeIcon = memo(TreeIconRaw);\n","'use client';\n\nimport { useTreeContext } from '../context/TreeContext';\n\nexport interface TreeIndentGuidesProps {\n level: number;\n indent: number;\n}\n\n/**\n * Vertical guide lines under nested rows. Renders one absolute-positioned\n * 1px column per ancestor level. Decorative — `aria-hidden` and\n * pointer-events disabled. Opacity comes from the tree appearance.\n */\nexport function TreeIndentGuides({ level, indent }: TreeIndentGuidesProps) {\n const { appearance } = useTreeContext();\n if (level <= 0) return null;\n return (\n <span\n aria-hidden\n className=\"pointer-events-none absolute inset-y-0 left-0\"\n style={{ width: 8 + level * indent, opacity: appearance.indentGuideOpacity }}\n >\n {Array.from({ length: level }).map((_, i) => (\n <span\n key={i}\n className=\"absolute inset-y-0 w-px bg-border\"\n style={{ left: 8 + i * indent + indent / 2 - 0.5 }}\n />\n ))}\n </span>\n );\n}\n","'use client';\n\nimport { memo } from 'react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nexport interface TreeLabelProps {\n children: React.ReactNode;\n isMatchingSearch?: boolean;\n className?: string;\n}\n\n/**\n * TreeLabel — truncated label for a tree row.\n *\n * Memoised: re-renders only when `children`, `isMatchingSearch` or\n * `className` change. `children` is compared by reference.\n */\nfunction TreeLabelRaw({ children, isMatchingSearch, className }: TreeLabelProps) {\n return (\n <span\n // Colour is set inline via the semantic token rather than the\n // `text-foreground` Tailwind utility: that class isn't always\n // emitted into a consuming app's stylesheet (the bundler only\n // generates utilities it sees referenced in scanned source), so\n // relying on it left the label rendering as UA-default black on\n // a dark surface. `var(--foreground)` always resolves.\n style={{ fontSize: 'var(--tree-font-size)', color: 'var(--foreground)' }}\n className={cn(\n 'truncate leading-tight tracking-[-0.005em]',\n isMatchingSearch && 'font-medium',\n className,\n )}\n >\n {children}\n </span>\n );\n}\n\nexport const TreeLabel = memo(TreeLabelRaw);\n","'use client';\n\n// =====================================================================\n// Filename split — used by the inline-rename input to auto-select the\n// \"base\" portion without the extension (Finder / macOS behaviour).\n//\n// Rules:\n// - dotfiles like \".env\" or \".gitignore\" → base = whole name, ext = ''\n// - \"foo\" → base = 'foo', ext = ''\n// - \"foo.txt\" → base = 'foo', ext = '.txt'\n// - \"foo.bar.baz\" → base = 'foo.bar', ext = '.baz'\n// - \"folder/\" (trailing slash) → trailing slash kept in ext\n//\n// We deliberately don't handle nested dots or multi-part extensions like\n// \".tar.gz\". Finder picks the last `.` and so do we — it's good enough\n// for selection UX and consistent with the OS.\n// =====================================================================\n\nexport interface SplitName {\n base: string;\n ext: string;\n}\n\nexport function splitFileName(name: string): SplitName {\n if (name.length === 0) return { base: '', ext: '' };\n\n // Dotfiles — leading dot is part of the base, not an extension.\n if (name.startsWith('.')) {\n const rest = name.slice(1);\n const dot = rest.lastIndexOf('.');\n if (dot < 0) return { base: name, ext: '' };\n return { base: '.' + rest.slice(0, dot), ext: rest.slice(dot) };\n }\n\n const dot = name.lastIndexOf('.');\n if (dot <= 0) return { base: name, ext: '' };\n return { base: name.slice(0, dot), ext: name.slice(dot) };\n}\n\n/**\n * Returns the `[selectionStart, selectionEnd]` pair to use on focus of an\n * `<input>` so only the base name is highlighted (Finder behaviour).\n *\n * Folders pass `isFolder=true` to skip extension detection and select\n * the entire name — folders don't have file extensions semantically.\n */\nexport function autoSelectRange(name: string, isFolder: boolean): [number, number] {\n if (isFolder) return [0, name.length];\n const { base } = splitFileName(name);\n return [0, base.length];\n}\n","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { autoSelectRange } from '../data/renameUtils';\n\nexport interface TreeRenameInputProps {\n initialValue: string;\n isFolder: boolean;\n /** Called with the new (trimmed) name when the user presses Enter / blurs. */\n onCommit: (nextName: string) => void | Promise<unknown>;\n /** Called when the user presses Escape. */\n onCancel: () => void;\n className?: string;\n}\n\n/**\n * Inline rename input rendered in place of `<TreeLabel>` while a row is\n * being renamed. Mounts focused with the *base* portion of the name\n * pre-selected (Finder behaviour — `foo.txt` selects `foo`).\n *\n * Behaviour:\n * - Enter → commit\n * - Escape → cancel (no adapter call)\n * - blur → commit (matches Finder; intentional even for empty\n * names — the host validates and re-opens on error)\n * - all other keys are stopped from bubbling so Tree's container\n * hotkeys (↑↓ delete F2 etc.) don't fire while typing.\n */\nexport function TreeRenameInput({\n initialValue,\n isFolder,\n onCommit,\n onCancel,\n className,\n}: TreeRenameInputProps) {\n const [value, setValue] = useState(initialValue);\n const inputRef = useRef<HTMLInputElement>(null);\n // Track whether we already committed/cancelled so the blur handler\n // doesn't fire a second time after Enter/Escape.\n const settledRef = useRef(false);\n\n useEffect(() => {\n const el = inputRef.current;\n if (!el) return;\n el.focus();\n const [start, end] = autoSelectRange(initialValue, isFolder);\n // setSelectionRange on a freshly focused input — schedule on next\n // tick to dodge browser quirks where focus() resets the selection.\n requestAnimationFrame(() => {\n try {\n el.setSelectionRange(start, end);\n } catch {\n /* Some input types reject setSelectionRange — safe to ignore. */\n }\n });\n // Run only once on mount.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const commit = () => {\n if (settledRef.current) return;\n settledRef.current = true;\n void onCommit(value);\n };\n\n const cancel = () => {\n if (settledRef.current) return;\n settledRef.current = true;\n onCancel();\n };\n\n return (\n <input\n ref={inputRef}\n type=\"text\"\n value={value}\n // Tree's container hotkeys (delete / arrows / F2 …) must not fire\n // while the user is typing the new name.\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === 'Enter') {\n e.preventDefault();\n commit();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n cancel();\n }\n }}\n onChange={(e) => setValue(e.target.value)}\n onBlur={commit}\n // Prevent click/dblclick on the row from re-firing while the input\n // is mounted (otherwise a focused click commits + re-selects).\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n // Right-click inside the input should be the native input menu,\n // not the row's context menu.\n onContextMenu={(e) => e.stopPropagation()}\n className={cn(\n 'min-w-0 flex-1 rounded-sm border border-primary/50 bg-background',\n 'px-1 py-0 text-foreground outline-none',\n 'focus:ring-1 focus:ring-primary/40',\n className,\n )}\n style={{\n // Match the row's font metrics so the input doesn't visibly jolt.\n fontSize: 'var(--tree-font-size)',\n height: 'calc(var(--tree-row-height) - 4px)',\n }}\n />\n );\n}\n","'use client';\n\nimport { Loader2 } from 'lucide-react';\nimport { memo, useCallback } from 'react';\nimport { useDraggable, useDroppable } from '@dnd-kit/core';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useTreeContext } from '../context/TreeContext';\nimport { radiusClass, rowStateClasses } from '../data/appearance';\nimport type { FlatRow, TreeRowRenderProps } from '../types';\nimport { TreeChevron } from './TreeChevron';\nimport { treeRowDomId } from './TreeContent';\nimport { TreeDropIndicator } from './TreeDropIndicator';\nimport { TreeIcon } from './TreeIcon';\nimport { TreeIndentGuides } from './TreeIndentGuides';\nimport { TreeLabel } from './TreeLabel';\nimport { TreeRenameInput } from './TreeRenameInput';\n\nexport interface TreeRowProps<T> {\n row: FlatRow<T>;\n className?: string;\n}\n\n/**\n * TreeRow — single row in a virtualised tree.\n *\n * Memoised: re-renders only when `row` reference or `className` change.\n * `row` is treated as immutable — the parent should not mutate node\n * objects in place.\n */\nfunction TreeRowRaw<T>({ row, className }: TreeRowProps<T>) {\n const ctx = useTreeContext<T>();\n const {\n appearance,\n activationMode,\n showIndentGuides,\n selected,\n focused,\n matchingIds,\n select,\n setSelectedIds,\n clickSelect,\n toggle,\n setFocus,\n activate,\n getItemName,\n renderIcon,\n renderLabel,\n renderActions,\n renderContextMenu,\n renamingId,\n commitRename,\n cancelRename,\n clipboard,\n dnd,\n } = ctx;\n\n const { node, level, isFolder, isExpanded, isLoading, posInSet, setSize } = row;\n const isSelected = selected.has(node.id);\n const isFocused = focused === node.id;\n const isMatchingSearch = matchingIds.has(node.id);\n const isMultiSelect = ctx.selectionMode === 'multiple';\n const isCut =\n clipboard?.kind === 'cut' && clipboard.ids.includes(node.id);\n\n const slot: TreeRowRenderProps<T> = {\n node,\n level,\n isSelected,\n isExpanded,\n isFocused,\n isFolder,\n isLoading,\n isMatchingSearch,\n };\n\n // Folders always toggle on single click regardless of `activationMode`.\n // Leaves dispatch by mode:\n // single-click → click activates {preview:false}\n // double-click → click only selects; dblclick activates {preview:false}\n // single-click-preview → click activates {preview:true}; dblclick activates {preview:false}\n const isRenaming = renamingId === node.id;\n const isDragging = dnd.draggingIds.has(node.id);\n const dropTarget = dnd.dropTarget;\n const isDropTarget = dropTarget?.id === node.id;\n const dropPosition = isDropTarget ? dropTarget!.position : null;\n\n // ─── DnD wiring ──────────────────────────────────────────────────\n // Hooks are called unconditionally so we don't violate rules-of-\n // hooks; the `disabled` flag short-circuits @dnd-kit when DnD is off\n // or the row is in inline rename.\n //\n // Drop-zone resolution (before/inside/after) is centralised in\n // `<TreeDndProvider>` via `onDragMove` — rows don't need a\n // `onPointerMove` of their own. Saves a listener × N rows.\n const dndDisabled = !dnd.active || isRenaming || node.disabled;\n const draggable = useDraggable({ id: node.id, disabled: dndDisabled });\n const droppable = useDroppable({ id: node.id, disabled: dndDisabled });\n\n const setRowEl = useCallback(\n (el: HTMLDivElement | null) => {\n draggable.setNodeRef(el);\n droppable.setNodeRef(el);\n },\n [draggable, droppable],\n );\n\n const isAllowedDrop =\n dropPosition && !isDragging\n ? dnd.isAllowedDrop(node, dropPosition)\n : true;\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (node.disabled || isRenaming) return;\n setFocus(node.id);\n // Multi-select: full Finder/Explorer semantics — plain replaces, meta\n // toggles, shift extends range from anchor, shift+meta unions range.\n // Single-select: clickSelect collapses to {id}. None: no-op.\n if (isMultiSelect) {\n clickSelect(node.id, { shift: e.shiftKey, meta: e.metaKey || e.ctrlKey });\n } else {\n select(node.id);\n }\n if (isFolder) {\n // Don't toggle on shift/meta clicks — those are pure selection edits.\n if (e.shiftKey || e.metaKey || e.ctrlKey) return;\n toggle(node.id);\n } else if (activationMode === 'single-click') {\n // Selection-only modifier clicks should not activate the leaf.\n if (e.shiftKey || e.metaKey || e.ctrlKey) return;\n activate(node, { preview: false });\n } else if (activationMode === 'single-click-preview') {\n if (e.shiftKey || e.metaKey || e.ctrlKey) return;\n activate(node, { preview: true });\n }\n };\n\n const handleDoubleClick = () => {\n if (node.disabled || isRenaming) return;\n if (isFolder) return;\n activate(node, { preview: false });\n };\n\n // Finder/Explorer semantics: right-click on an unselected row switches\n // selection to that single row (so menu actions apply to it). Right-\n // click on a row already in the selection leaves the multi-selection\n // intact (so destructive bulk actions stay safe).\n const handleContextMenu = () => {\n if (node.disabled || isRenaming) return;\n setFocus(node.id);\n if (!isSelected) {\n setSelectedIds([node.id]);\n }\n };\n\n const trigger = (\n <div\n ref={dnd.active ? setRowEl : undefined}\n id={treeRowDomId(node.id)}\n role=\"treeitem\"\n aria-level={level + 1}\n aria-posinset={posInSet}\n aria-setsize={setSize}\n aria-expanded={isFolder ? isExpanded : undefined}\n aria-selected={ctx.selectionMode === 'none' ? undefined : isSelected}\n aria-disabled={node.disabled || undefined}\n data-tree-row=\"\"\n data-id={node.id}\n data-activation-mode={activationMode}\n data-selected={isSelected ? 'true' : undefined}\n data-clipboard={isCut ? 'cut' : undefined}\n data-dragging={isDragging ? 'true' : undefined}\n data-focused={isFocused && !isSelected ? 'true' : undefined}\n data-folder={isFolder || undefined}\n data-expanded={isExpanded || undefined}\n tabIndex={-1}\n style={{\n paddingLeft: 6 + level * appearance.indent,\n height: 'var(--tree-row-height)',\n gap: 'var(--tree-gap)',\n }}\n {...(dnd.active ? draggable.listeners : {})}\n {...(dnd.active ? draggable.attributes : {})}\n onClick={handleClick}\n onDoubleClick={handleDoubleClick}\n onContextMenu={handleContextMenu}\n onFocus={() => setFocus(node.id)}\n className={cn(\n 'group/row relative flex w-full select-none items-center pr-2 text-left',\n 'transition-colors outline-none',\n node.disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n radiusClass(appearance),\n rowStateClasses(appearance),\n 'focus-visible:ring-1 focus-visible:ring-ring/50',\n isMatchingSearch && 'ring-1 ring-primary/30',\n isCut && 'opacity-60',\n isDragging && 'opacity-40',\n node.disabled && 'opacity-50',\n className,\n )}\n >\n {/* Active-row left indicator (VSCode style) */}\n {appearance.showActiveIndicator && isSelected ? (\n <span\n aria-hidden\n className={cn(\n 'absolute left-0 top-1 bottom-1 w-0.5 rounded-r-full',\n 'bg-foreground/30 group-focus-within/tree:bg-primary',\n )}\n />\n ) : null}\n\n {/* DnD drop indicator — top/bottom line for sibling reorder,\n fill for \"drop into folder\". */}\n {dropPosition && !isDragging ? (\n <TreeDropIndicator\n position={dropPosition}\n indent={6 + level * appearance.indent}\n invalid={!isAllowedDrop}\n />\n ) : null}\n\n {showIndentGuides && level > 0 ? (\n <TreeIndentGuides level={level} indent={appearance.indent} />\n ) : null}\n\n <TreeChevron isExpanded={isExpanded} isFolder={isFolder} />\n\n {isLoading ? (\n <Loader2\n aria-hidden\n strokeWidth={appearance.iconStrokeWidth}\n style={{ width: 'var(--tree-icon-size)', height: 'var(--tree-icon-size)' }}\n className=\"shrink-0 animate-spin text-muted-foreground/70\"\n />\n ) : renderIcon ? (\n renderIcon(slot)\n ) : (\n <TreeIcon isFolder={isFolder} isExpanded={isExpanded} />\n )}\n\n <span\n className=\"flex min-w-0 flex-1 items-center\"\n style={{ gap: 'var(--tree-gap)' }}\n >\n {renamingId === node.id ? (\n <TreeRenameInput\n initialValue={getItemName(node)}\n isFolder={isFolder}\n onCommit={(next) => commitRename(node.id, next)}\n onCancel={cancelRename}\n />\n ) : renderLabel ? (\n renderLabel(slot)\n ) : (\n <TreeLabel isMatchingSearch={isMatchingSearch}>{getItemName(node)}</TreeLabel>\n )}\n </span>\n\n {renderActions ? (\n <span\n className=\"ml-auto flex shrink-0 items-center gap-1 opacity-0 transition-opacity group-hover/row:opacity-100 group-focus-within/row:opacity-100\"\n onClick={(e) => e.stopPropagation()}\n >\n {renderActions(slot)}\n </span>\n ) : null}\n </div>\n );\n\n if (renderContextMenu) {\n return <>{renderContextMenu(slot, trigger)}</>;\n }\n return trigger;\n}\n\nexport const TreeRow = memo(TreeRowRaw) as typeof TreeRowRaw;\n","'use client';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\nexport interface TreeEmptyProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport function TreeEmpty({ children, className }: TreeEmptyProps) {\n return (\n <div\n className={cn(\n 'flex h-full min-h-32 items-center justify-center px-4 py-6 text-sm text-muted-foreground',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","'use client';\n\nimport { Fragment, type ReactNode } from 'react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useTreeContext } from '../context/TreeContext';\nimport { appearanceToStyle } from '../data/appearance';\nimport type { FlatRow, TreeRowRenderProps, TreeRowSlot } from '../types';\nimport { TreeRow } from './TreeRow';\nimport { TreeEmpty } from './TreeEmpty';\n\nexport interface TreeContentProps<T> {\n /** Custom row renderer; falls back to <TreeRow />. */\n children?: TreeRowSlot<T>;\n className?: string;\n /** Override aria-label for the container. */\n ariaLabel?: string;\n /**\n * Container ARIA role. Defaults to `'tree'` for standalone composition\n * use. `<TreeRoot>` passes `'group'` because its own outer element\n * already carries `role=\"tree\"` + `aria-activedescendant`.\n */\n role?: 'tree' | 'group' | 'presentation';\n}\n\n/** DOM id for a tree row — referenced by `aria-activedescendant`. */\nexport const treeRowDomId = (id: string) => `tree-row-${id}`;\n\nexport function TreeContent<T>({\n children,\n className,\n ariaLabel,\n role = 'tree',\n}: TreeContentProps<T>) {\n const { flatRows, labels, selected, focused, matchingIds, appearance, selectionMode } =\n useTreeContext<T>();\n\n if (flatRows.length === 0) {\n return <TreeEmpty>{labels.empty}</TreeEmpty>;\n }\n\n const isTree = role === 'tree';\n\n return (\n <div\n role={role}\n aria-label={isTree ? (ariaLabel ?? labels.ariaLabel) : undefined}\n aria-multiselectable={\n isTree && selectionMode === 'multiple' ? true : undefined\n }\n className={cn('relative flex flex-col py-1', className)}\n style={appearanceToStyle(appearance)}\n >\n {flatRows.map((row: FlatRow<T>) => {\n const slot: TreeRowRenderProps<T> = {\n node: row.node,\n level: row.level,\n isSelected: selected.has(row.node.id),\n isExpanded: row.isExpanded,\n isFocused: focused === row.node.id,\n isFolder: row.isFolder,\n isLoading: row.isLoading,\n isMatchingSearch: matchingIds.has(row.node.id),\n };\n const node: ReactNode = children ? children(slot) : <TreeRow row={row} />;\n return <Fragment key={row.node.id}>{node}</Fragment>;\n })}\n </div>\n );\n}\n","'use client';\n\nimport { useMemo } from 'react';\nimport { useDroppable } from '@dnd-kit/core';\nimport {\n ContextMenu,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuTrigger,\n} from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useTreeContext } from '../context/TreeContext';\nimport {\n buildDefaultMenuItems,\n type BuiltinActionContext,\n} from '../context/menu';\nimport { TREE_ROOT_DROP_ID } from '../data/dnd';\nimport type { TreeContextMenuItem } from '../types';\n\nexport interface TreeEmptyAreaProps {\n className?: string;\n}\n\n/**\n * Fills the remaining vertical space below `<TreeContent>` so the user\n * can right-click \"into nothing\" to get a Finder/Explorer-style empty\n * area menu (paste / new file / new folder at root), and so DnD has a\n * root drop target.\n *\n * Built-in actions are derived the same way as for rows — through\n * `buildDefaultMenuItems`, with `targetNode = null` (root) and\n * `selectedNodes = []` (nothing under the right-click). Items whose\n * `available()` predicate fails are simply skipped, so a tree without\n * `adapter.createFile/Folder` and without a clipboard payload shows\n * no menu at all.\n */\nexport function TreeEmptyArea({ className }: TreeEmptyAreaProps) {\n const ctx = useTreeContext();\n const {\n adapter,\n labels,\n getItemName,\n clipboard,\n cutToClipboard,\n copyToClipboard,\n pasteFromClipboard,\n startRename,\n inlineRenameEnabled,\n dnd,\n } = ctx;\n\n // Root drop target — receives drops that miss every row. The shared\n // `TreeDndProvider.onDragMove` detects when `e.over.id === ROOT_DROP_ID`\n // and pushes `{ id: null, position: 'inside' }` into `dnd.dropTarget`,\n // so this component doesn't need an `onPointerMove` of its own.\n const { setNodeRef: setDroppableRef, isOver } = useDroppable({\n id: TREE_ROOT_DROP_ID,\n disabled: !dnd.active,\n });\n\n // Resolve menu items every render — they depend on clipboard state\n // (paste shows/hides) and on whether the adapter exposes\n // createFile / createFolder.\n const items = useMemo<TreeContextMenuItem<unknown>[] | null>(() => {\n if (!adapter) return null;\n const builtinCtx: BuiltinActionContext<unknown> = {\n adapter,\n labels,\n selectedNodes: [],\n targetNode: null,\n getName: getItemName,\n startInlineRename: inlineRenameEnabled ? startRename : undefined,\n clipboard: {\n hasItems: !!clipboard && clipboard.ids.length > 0,\n cut: cutToClipboard,\n copy: copyToClipboard,\n paste: () => pasteFromClipboard(null, 'inside'),\n },\n };\n return buildDefaultMenuItems(builtinCtx);\n }, [\n adapter,\n labels,\n getItemName,\n inlineRenameEnabled,\n startRename,\n clipboard,\n cutToClipboard,\n copyToClipboard,\n pasteFromClipboard,\n ]);\n\n const surface = (\n <div\n ref={dnd.active ? setDroppableRef : undefined}\n data-tree-empty-area=\"\"\n data-drop-active={dnd.active && isOver ? 'true' : undefined}\n className={cn(\n // Soaks up the remaining vertical space inside the scroll\n // container so right-click on whitespace lands here, not on\n // the scroll viewport.\n 'min-h-[2.5rem] flex-1',\n dnd.active && isOver && 'bg-primary/5 rounded-sm ring-1 ring-primary/30',\n className,\n )}\n />\n );\n\n // No items and no DnD overlap → render plain spacer. Wrapping in a\n // `<ContextMenu>` with zero items would still capture right-clicks\n // and show an empty popover — that's worse than browser default.\n if (!items || items.length === 0) {\n return surface;\n }\n\n return (\n <ContextMenu>\n <ContextMenuTrigger asChild>{surface}</ContextMenuTrigger>\n <ContextMenuContent>\n {items.map((item, idx) => {\n if (item === 'separator') {\n return <ContextMenuSeparator key={`sep-${idx}`} />;\n }\n const Icon = item.icon;\n return (\n <ContextMenuItem\n key={item.id}\n disabled={item.disabled}\n variant={item.destructive ? 'destructive' : undefined}\n // Pass a synthetic \"no-target\" row props — the built-in\n // action handlers we surface here (new-file / new-folder\n // / paste) don't read row-specific fields anyway.\n onSelect={() =>\n item.onSelect({\n node: undefined as never,\n level: 0,\n isSelected: false,\n isExpanded: false,\n isFocused: false,\n isFolder: false,\n isLoading: false,\n isMatchingSearch: false,\n })\n }\n >\n {Icon ? <Icon /> : null}\n {item.label}\n {item.shortcut ? (\n <ContextMenuShortcut>{item.shortcut}</ContextMenuShortcut>\n ) : null}\n </ContextMenuItem>\n );\n })}\n </ContextMenuContent>\n </ContextMenu>\n );\n}\n","'use client';\n\nimport { useCallback, useMemo } from 'react';\n\nimport type { TreeItemId } from '../types';\nimport { useTreeContext } from './TreeContext';\n\nexport function useTreeLabels() {\n return useTreeContext().labels;\n}\n\nexport function useTreeRows<T>() {\n return useTreeContext<T>().flatRows;\n}\n\nexport function useTreeSelection<T>() {\n const ctx = useTreeContext<T>();\n const selectedIds = useMemo(() => [...ctx.selected], [ctx.selected]);\n const isSelected = useCallback(\n (id: TreeItemId) => ctx.selected.has(id),\n [ctx.selected],\n );\n return useMemo(\n () => ({\n selectedIds,\n anchor: ctx.anchor,\n select: ctx.select,\n setSelectedIds: ctx.setSelectedIds,\n clear: ctx.clearSelection,\n clickSelect: ctx.clickSelect,\n moveSelect: ctx.moveSelect,\n selectAll: ctx.selectAll,\n isSelected,\n }),\n [\n selectedIds,\n ctx.anchor,\n ctx.select,\n ctx.setSelectedIds,\n ctx.clearSelection,\n ctx.clickSelect,\n ctx.moveSelect,\n ctx.selectAll,\n isSelected,\n ],\n );\n}\n\nexport function useTreeExpansion<T>() {\n const ctx = useTreeContext<T>();\n const expandedIds = useMemo(() => [...ctx.expanded], [ctx.expanded]);\n const isExpanded = useCallback(\n (id: TreeItemId) => ctx.expanded.has(id),\n [ctx.expanded],\n );\n return useMemo(\n () => ({\n expandedIds,\n expand: ctx.expand,\n collapse: ctx.collapse,\n toggle: ctx.toggle,\n expandAll: ctx.expandAll,\n collapseAll: ctx.collapseAll,\n isExpanded,\n }),\n [\n expandedIds,\n ctx.expand,\n ctx.collapse,\n ctx.toggle,\n ctx.expandAll,\n ctx.collapseAll,\n isExpanded,\n ],\n );\n}\n\nexport function useTreeFocus<T>() {\n const ctx = useTreeContext<T>();\n return useMemo(\n () => ({ focusedId: ctx.focused, setFocus: ctx.setFocus }),\n [ctx.focused, ctx.setFocus],\n );\n}\n\nexport function useTreeSearch<T>() {\n const ctx = useTreeContext<T>();\n return useMemo(\n () => ({\n isOpen: ctx.enableSearch,\n query: ctx.query,\n setQuery: ctx.setQuery,\n matchingIds: ctx.matchingIds,\n matchCount: ctx.matchingIds.size,\n }),\n [ctx.enableSearch, ctx.query, ctx.setQuery, ctx.matchingIds],\n );\n}\n\nexport function useTreeDnd<T>() {\n const ctx = useTreeContext<T>();\n return ctx.dnd;\n}\n\nexport function useTreeClipboard<T>() {\n const ctx = useTreeContext<T>();\n const isCut = useCallback(\n (id: TreeItemId) => ctx.clipboard?.kind === 'cut' && ctx.clipboard.ids.includes(id),\n [ctx.clipboard],\n );\n return useMemo(\n () => ({\n clipboard: ctx.clipboard,\n isCut,\n cut: ctx.cutToClipboard,\n copy: ctx.copyToClipboard,\n paste: ctx.pasteFromClipboard,\n clear: ctx.clearClipboard,\n }),\n [\n ctx.clipboard,\n isCut,\n ctx.cutToClipboard,\n ctx.copyToClipboard,\n ctx.pasteFromClipboard,\n ctx.clearClipboard,\n ],\n );\n}\n\nexport function useTreeRename<T>() {\n const ctx = useTreeContext<T>();\n return useMemo(\n () => ({\n /** True when the host allowed inline rename AND the adapter exposes `rename`. */\n enabled: ctx.inlineRenameEnabled,\n /** Currently renaming id, or `null`. */\n renamingId: ctx.renamingId,\n startRename: ctx.startRename,\n cancelRename: ctx.cancelRename,\n commitRename: ctx.commitRename,\n }),\n [\n ctx.inlineRenameEnabled,\n ctx.renamingId,\n ctx.startRename,\n ctx.cancelRename,\n ctx.commitRename,\n ],\n );\n}\n\nexport function useTreeActions<T>() {\n const ctx = useTreeContext<T>();\n return useMemo(\n () => ({\n expand: ctx.expand,\n collapse: ctx.collapse,\n toggle: ctx.toggle,\n expandAll: ctx.expandAll,\n collapseAll: ctx.collapseAll,\n refresh: ctx.refresh,\n refreshAll: ctx.refreshAll,\n activate: ctx.activate,\n }),\n [\n ctx.expand,\n ctx.collapse,\n ctx.toggle,\n ctx.expandAll,\n ctx.collapseAll,\n ctx.refresh,\n ctx.refreshAll,\n ctx.activate,\n ],\n );\n}\n","'use client';\n\nimport { Search, X } from 'lucide-react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useTreeContext } from '../context/TreeContext';\nimport { useTreeSearch } from '../context/hooks';\n\nexport interface TreeSearchInputProps {\n className?: string;\n showMatches?: boolean;\n}\n\nexport function TreeSearchInput({ className, showMatches = true }: TreeSearchInputProps) {\n const { labels } = useTreeContext();\n const { query, setQuery, matchCount } = useTreeSearch();\n\n return (\n <div\n className={cn(\n 'flex items-center gap-2 rounded-md border border-border bg-background px-2',\n className,\n )}\n >\n <Search aria-hidden className=\"size-3.5 shrink-0 text-muted-foreground\" />\n <input\n type=\"search\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={labels.searchPlaceholder}\n className=\"h-7 w-full bg-transparent text-sm outline-none placeholder:text-muted-foreground\"\n />\n {showMatches && query.trim().length > 0 ? (\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {labels.searchMatches(matchCount)}\n </span>\n ) : null}\n {query.length > 0 ? (\n <button\n type=\"button\"\n onClick={() => setQuery('')}\n aria-label=\"Clear search\"\n className=\"shrink-0 rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n <X aria-hidden className=\"size-3.5\" />\n </button>\n ) : null}\n </div>\n );\n}\n","'use client';\n\nimport type { FlatRow, TreeItemId } from '../../types';\n\n/** Pick the id one row below the current focused row (clamped at the end). */\nexport function nextRowId<T>(rows: readonly FlatRow<T>[], idx: number): TreeItemId | null {\n if (rows.length === 0) return null;\n const next = rows[Math.min(idx + 1, rows.length - 1)] ?? rows[0];\n return next.node.id;\n}\n\n/** Pick the id one row above the current focused row (clamped at the start). */\nexport function prevRowId<T>(rows: readonly FlatRow<T>[], idx: number): TreeItemId | null {\n if (rows.length === 0) return null;\n const prev = rows[Math.max(idx - 1, 0)] ?? rows[0];\n return prev.node.id;\n}\n\n/** First / last visible row id, or null if the list is empty. */\nexport function edgeRowId<T>(\n rows: readonly FlatRow<T>[],\n edge: 'first' | 'last',\n): TreeItemId | null {\n if (rows.length === 0) return null;\n return edge === 'first' ? rows[0].node.id : rows[rows.length - 1].node.id;\n}\n","'use client';\n\nimport type { FlatRow } from '../../types';\n\n/**\n * What should `→` do on the current row?\n *\n * - collapsed folder → expand it\n * - expanded folder → jump to first visible child\n * - leaf → no-op\n */\nexport type RightArrowOutcome<T> =\n | { kind: 'expand'; id: string }\n | { kind: 'focus'; id: string }\n | { kind: 'noop' };\n\nexport function resolveRightArrow<T>(\n current: FlatRow<T> | null,\n rows: readonly FlatRow<T>[],\n idx: number,\n): RightArrowOutcome<T> {\n if (!current) return { kind: 'noop' };\n if (current.isFolder && !current.isExpanded) {\n return { kind: 'expand', id: current.node.id };\n }\n if (current.isFolder && current.isExpanded) {\n const next = rows[idx + 1];\n return next ? { kind: 'focus', id: next.node.id } : { kind: 'noop' };\n }\n return { kind: 'noop' };\n}\n\n/**\n * What should `←` do on the current row?\n *\n * - expanded folder → collapse it\n * - leaf / collapsed w/ parent → focus parent\n * - root leaf → no-op\n */\nexport type LeftArrowOutcome<T> =\n | { kind: 'collapse'; id: string }\n | { kind: 'focus'; id: string }\n | { kind: 'noop' };\n\nexport function resolveLeftArrow<T>(current: FlatRow<T> | null): LeftArrowOutcome<T> {\n if (!current) return { kind: 'noop' };\n if (current.isFolder && current.isExpanded) {\n return { kind: 'collapse', id: current.node.id };\n }\n if (current.parentId) {\n return { kind: 'focus', id: current.parentId };\n }\n return { kind: 'noop' };\n}\n","'use client';\n\nimport type { FlatRow } from '../../types';\n\n/**\n * Enter / Space on the current row:\n * - folder: toggle (collapse if expanded, else expand)\n * - leaf: activate\n *\n * Always selects (single-select semantics for keyboard input).\n */\nexport type ActivateOutcome<T> =\n | { kind: 'toggle-folder'; id: string; willExpand: boolean }\n | { kind: 'activate-leaf'; id: string }\n | { kind: 'noop' };\n\nexport function resolveActivate<T>(current: FlatRow<T> | null): ActivateOutcome<T> {\n if (!current) return { kind: 'noop' };\n if (current.isFolder) {\n return {\n kind: 'toggle-folder',\n id: current.node.id,\n willExpand: !current.isExpanded,\n };\n }\n return { kind: 'activate-leaf', id: current.node.id };\n}\n","'use client';\n\nimport { useCallback, useRef } from 'react';\nimport { useHotkey } from '@djangocfg/ui-core/hooks';\n\nimport { edgeRowId, nextRowId, prevRowId } from './arrow-nav';\nimport { resolveLeftArrow, resolveRightArrow } from './expand-collapse';\nimport { resolveActivate } from './activation';\nimport type {\n CurrentRow,\n UseTreeKeyboardOptions,\n UseTreeKeyboardReturn,\n} from './types';\n\n/**\n * Standard tree keyboard navigation, scoped to the container ref.\n *\n * - ↑ / ↓ : prev / next visible row (Shift extends range)\n * - Home / End : first / last visible row (Shift extends range)\n * - → / ← : expand-or-jump-to-child / collapse-or-jump-to-parent\n * - Enter / Space : activate (folder → toggle, leaf → onActivate)\n * - Esc : clear selection\n * - Cmd/Ctrl + A : select all (multi-select only)\n *\n * Pure decision-making lives in the sibling helpers (`arrow-nav.ts`,\n * `expand-collapse.ts`, `activation.ts`) so it's unit-testable without\n * a DOM. This file only wires up `useHotkey` bindings and dispatches\n * the helper outcomes back to the consumer's callbacks.\n */\nexport function useTreeKeyboard<T>({\n rows,\n focusedId,\n enabled = true,\n multiSelect = false,\n onFocus,\n onSelect,\n onActivate,\n onExpand,\n onCollapse,\n onClearSelection,\n onSelectAll,\n}: UseTreeKeyboardOptions<T>): UseTreeKeyboardReturn {\n // Keep latest values in refs so the callbacks below stay stable across\n // renders — react-hotkeys-hook re-binds on dep change otherwise.\n const rowsRef = useRef(rows);\n const focusedIdRef = useRef(focusedId);\n rowsRef.current = rows;\n focusedIdRef.current = focusedId;\n\n const getCurrent = (): CurrentRow<T> => {\n const r = rowsRef.current;\n const id = focusedIdRef.current;\n const idx = id ? r.findIndex((x) => x.node.id === id) : -1;\n return { rows: r, idx, current: idx >= 0 ? r[idx] : null };\n };\n\n // Down / Shift+Down. Plain moves focus, shift extends selection range.\n const refDown = useHotkey(\n ['down', 'shift+down'],\n (e) => {\n const { rows: r, idx } = getCurrent();\n const id = nextRowId(r, idx);\n if (id) onFocus(id, { extend: multiSelect && e.shiftKey });\n },\n { enabled, preventDefault: true, description: 'Next row (Shift extends)' },\n );\n\n const refUp = useHotkey(\n ['up', 'shift+up'],\n (e) => {\n const { rows: r, idx } = getCurrent();\n const id = prevRowId(r, idx);\n if (id) onFocus(id, { extend: multiSelect && e.shiftKey });\n },\n { enabled, preventDefault: true, description: 'Previous row (Shift extends)' },\n );\n\n const refHome = useHotkey(\n ['home', 'shift+home'],\n (e) => {\n const id = edgeRowId(rowsRef.current, 'first');\n if (id) onFocus(id, { extend: multiSelect && e.shiftKey });\n },\n { enabled, preventDefault: true, description: 'First row (Shift extends)' },\n );\n\n const refEnd = useHotkey(\n ['end', 'shift+end'],\n (e) => {\n const id = edgeRowId(rowsRef.current, 'last');\n if (id) onFocus(id, { extend: multiSelect && e.shiftKey });\n },\n { enabled, preventDefault: true, description: 'Last row (Shift extends)' },\n );\n\n const refSelectAll = useHotkey(\n 'mod+a',\n () => {\n if (!multiSelect) return;\n onSelectAll?.();\n },\n {\n enabled: enabled && multiSelect,\n preventDefault: true,\n description: 'Select all visible rows',\n },\n );\n\n const refRight = useHotkey(\n 'right',\n () => {\n const { rows: r, idx, current } = getCurrent();\n const out = resolveRightArrow(current, r, idx);\n switch (out.kind) {\n case 'expand':\n onExpand(out.id);\n return;\n case 'focus':\n onFocus(out.id, { extend: false });\n return;\n case 'noop':\n return;\n }\n },\n { enabled, preventDefault: true, description: 'Expand / first child' },\n );\n\n const refLeft = useHotkey(\n 'left',\n () => {\n const { current } = getCurrent();\n const out = resolveLeftArrow(current);\n switch (out.kind) {\n case 'collapse':\n onCollapse(out.id);\n return;\n case 'focus':\n onFocus(out.id, { extend: false });\n return;\n case 'noop':\n return;\n }\n },\n { enabled, preventDefault: true, description: 'Collapse / parent' },\n );\n\n const refActivate = useHotkey(\n ['enter', 'space'],\n () => {\n const { current } = getCurrent();\n const out = resolveActivate(current);\n if (out.kind === 'noop') return;\n onSelect(out.kind === 'activate-leaf' ? out.id : out.id);\n if (out.kind === 'toggle-folder') {\n if (out.willExpand) onExpand(out.id);\n else onCollapse(out.id);\n } else {\n onActivate(out.id);\n }\n },\n { enabled, preventDefault: true, description: 'Activate / toggle' },\n );\n\n const refEscape = useHotkey(\n 'escape',\n () => onClearSelection(),\n { enabled, preventDefault: true, description: 'Clear selection' },\n );\n\n const ref = useCallback(\n (instance: HTMLElement | null) => {\n refDown(instance);\n refUp(instance);\n refHome(instance);\n refEnd(instance);\n refRight(instance);\n refLeft(instance);\n refActivate(instance);\n refEscape(instance);\n refSelectAll(instance);\n },\n [\n refDown,\n refUp,\n refHome,\n refEnd,\n refRight,\n refLeft,\n refActivate,\n refEscape,\n refSelectAll,\n ],\n );\n\n return { ref };\n}\n","'use client';\n\nimport type { FlatRow, TreeNode } from '../../types';\n\n/** Find the first row whose name starts with `prefix` (case-insensitive). */\nexport function findRowByPrefix<T>(\n rows: readonly FlatRow<T>[],\n getName: (node: TreeNode<T>) => string,\n prefix: string,\n): FlatRow<T> | undefined {\n if (prefix.length === 0) return undefined;\n return rows.find((row) => getName(row.node).toLowerCase().startsWith(prefix));\n}\n\n/**\n * Should this key terminate type-ahead instead of extending the buffer?\n * Navigation, Enter, Tab, Escape — all reset; everything else continues.\n */\nexport function isResetKey(key: string): boolean {\n return (\n key === 'Escape' ||\n key === 'Enter' ||\n key === 'Tab' ||\n key.startsWith('Arrow') ||\n key === 'Home' ||\n key === 'End' ||\n key === 'PageUp' ||\n key === 'PageDown'\n );\n}\n\n/**\n * Skip keystrokes that originate inside a text field so type-ahead\n * doesn't yank focus while the user is filling in a form.\n */\nexport function isTypingTarget(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null;\n if (!el) return false;\n const tag = el.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return true;\n return el.isContentEditable === true;\n}\n","'use client';\n\nimport { useEffect, useRef } from 'react';\n\nimport type { FlatRow, TreeNode } from '../../types';\nimport { findRowByPrefix, isResetKey, isTypingTarget } from './match-prefix';\n\nconst FLUSH_MS = 600;\n\nexport interface UseTreeTypeAheadOptions<T> {\n /** Visible flat rows in render order. */\n rows: FlatRow<T>[];\n /** How to read the displayed name of a node (matched case-insensitively). */\n getItemName: (node: TreeNode<T>) => string;\n /** Element receiving keydown events. */\n containerRef: React.RefObject<HTMLElement | null>;\n /** Called with the matched node id so the consumer can focus / scroll. */\n onMatch: (id: string) => void;\n /** Disable without removing the call site. */\n enabled?: boolean;\n}\n\n/**\n * Type-ahead jump (Finder / VSCode style).\n *\n * Builds a rolling buffer of printable keys (within ~600 ms of each other)\n * and notifies the consumer of the first row whose name starts with that\n * prefix. Resets on Esc / Enter / navigation keys / timeout.\n */\nexport function useTreeTypeAhead<T>({\n rows,\n getItemName,\n containerRef,\n onMatch,\n enabled = true,\n}: UseTreeTypeAheadOptions<T>) {\n const bufferRef = useRef('');\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const rowsRef = useRef(rows);\n const getNameRef = useRef(getItemName);\n const onMatchRef = useRef(onMatch);\n rowsRef.current = rows;\n getNameRef.current = getItemName;\n onMatchRef.current = onMatch;\n\n useEffect(() => {\n if (!enabled) return;\n const target = containerRef.current;\n if (!target) return;\n\n const reset = () => {\n bufferRef.current = '';\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n };\n\n const handler = (e: KeyboardEvent) => {\n if (isTypingTarget(e.target)) return;\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n if (isResetKey(e.key)) {\n reset();\n return;\n }\n if (e.key.length !== 1) return;\n\n bufferRef.current += e.key.toLowerCase();\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(reset, FLUSH_MS);\n\n const hit = findRowByPrefix(\n rowsRef.current,\n getNameRef.current,\n bufferRef.current,\n );\n if (hit) {\n e.preventDefault();\n onMatchRef.current(hit.node.id);\n }\n };\n\n target.addEventListener('keydown', handler);\n return () => {\n target.removeEventListener('keydown', handler);\n reset();\n };\n }, [containerRef, enabled]);\n}\n","'use client';\n\nimport type { BuiltinActionContext } from '../../context/menu';\nimport type {\n TreeAdapter,\n TreeItemId,\n TreeLabels,\n TreeNode,\n} from '../../types';\n\nexport interface BuildCtxInput<T> {\n adapter?: TreeAdapter<T>;\n labels: TreeLabels;\n selected: ReadonlySet<TreeItemId>;\n focused: TreeItemId | null;\n getNodeById: (id: TreeItemId) => TreeNode<T> | undefined;\n getItemName: (node: TreeNode<T>) => string;\n startInlineRename?: (id: TreeItemId) => void;\n clipboard?: BuiltinActionContext<T>['clipboard'];\n}\n\n/**\n * Build a `BuiltinActionContext<T>` snapshot from the current Tree state.\n * Returns `null` when the adapter is missing — the hotkey handlers\n * short-circuit on null so no built-in action fires without an adapter.\n */\nexport function buildBuiltinCtx<T>(\n input: BuildCtxInput<T>,\n): BuiltinActionContext<T> | null {\n if (!input.adapter) return null;\n const selectedNodes: TreeNode<T>[] = [];\n for (const id of input.selected) {\n const n = input.getNodeById(id);\n if (n) selectedNodes.push(n);\n }\n const targetNode = input.focused\n ? input.getNodeById(input.focused) ?? null\n : null;\n return {\n adapter: input.adapter,\n labels: input.labels,\n selectedNodes,\n targetNode,\n getName: input.getItemName,\n startInlineRename: input.startInlineRename,\n clipboard: input.clipboard,\n };\n}\n","'use client';\n\nimport { useCallback, useRef } from 'react';\nimport { useHotkey } from '@djangocfg/ui-core/hooks';\n\nimport { runBuiltinAction, type BuiltinActionContext } from '../../context/menu';\nimport type {\n TreeAdapter,\n TreeBuiltinAction,\n TreeItemId,\n TreeLabels,\n TreeNode,\n} from '../../types';\nimport { buildBuiltinCtx } from './build-ctx';\n\nexport interface UseTreeFinderHotkeysOptions<T> {\n /** Off by default — Tree opt-ins via `enableFinderHotkeys`. */\n enabled: boolean;\n /** Adapter — used both for action availability and dispatch. */\n adapter?: TreeAdapter<T>;\n /** Labels (passed through into adapter action context for dialogs). */\n labels: TreeLabels;\n /** Live selection (set of ids). */\n selected: ReadonlySet<TreeItemId>;\n /** Live focused id (used as \"target\" for new-file/new-folder actions). */\n focused: TreeItemId | null;\n /** Id → node lookup. */\n getNodeById: (id: TreeItemId) => TreeNode<T> | undefined;\n /** Display name resolver. */\n getItemName: (node: TreeNode<T>) => string;\n /** Open inline rename on the row (P3). Falls back to a prompt otherwise. */\n startInlineRename?: (id: TreeItemId) => void;\n /** Clipboard bindings (P5). When undefined, ⌘C/X/V are no-ops. */\n clipboard?: BuiltinActionContext<T>['clipboard'];\n /** Whether typing is currently in inline-rename input — pauses bindings. */\n paused?: boolean;\n}\n\nexport interface UseTreeFinderHotkeysReturn {\n /** Attach to the tree container ref so hotkeys only fire when it has focus. */\n ref: (instance: HTMLElement | null) => void;\n}\n\n/**\n * Wire the platform-aware Finder/Explorer shortcuts to the built-in\n * adapter actions. Bindings are scoped to the container ref via\n * `useHotkey`, so they don't leak to the rest of the page.\n *\n * Each shortcut is bound by an explicit `useHotkey` call (no `.map(useHotkey)`\n * loop, so the rules-of-hooks lint passes cleanly). The handler routes\n * through `runBuiltinAction`, which silently no-ops when the adapter\n * doesn't expose the matching method — so a Tree with `adapter = { remove }`\n * only effectively reacts to ⌘⌫ / Delete.\n */\nexport function useTreeFinderHotkeys<T>(\n opts: UseTreeFinderHotkeysOptions<T>,\n): UseTreeFinderHotkeysReturn {\n const optsRef = useRef(opts);\n optsRef.current = opts;\n\n const run = useCallback(async (action: TreeBuiltinAction) => {\n const o = optsRef.current;\n if (o.paused) return;\n const ctx = buildBuiltinCtx({\n adapter: o.adapter,\n labels: o.labels,\n selected: o.selected,\n focused: o.focused,\n getNodeById: o.getNodeById,\n getItemName: o.getItemName,\n startInlineRename: o.startInlineRename,\n clipboard: o.clipboard,\n });\n if (!ctx) return;\n await runBuiltinAction(action, ctx);\n }, []);\n\n // One explicit binding per shortcut. Adding a new built-in action means\n // adding one more line here — the trade-off is verbose-but-static vs.\n // a fragile `.map(useHotkey)` loop.\n\n const refDelete = useHotkey(\n ['mod+backspace', 'delete'],\n () => void run('delete'),\n {\n enabled: opts.enabled,\n preventDefault: true,\n description: 'Delete selected items',\n scope: 'tree',\n },\n );\n\n const refRename = useHotkey('f2', () => void run('rename'), {\n enabled: opts.enabled,\n preventDefault: true,\n description: 'Rename selected item',\n scope: 'tree',\n });\n\n const refDuplicate = useHotkey('mod+d', () => void run('duplicate'), {\n enabled: opts.enabled,\n preventDefault: true,\n description: 'Duplicate selected items',\n scope: 'tree',\n });\n\n const refNewFolder = useHotkey('mod+shift+n', () => void run('new-folder'), {\n enabled: opts.enabled,\n preventDefault: true,\n description: 'New folder',\n scope: 'tree',\n });\n\n const refNewFile = useHotkey('mod+n', () => void run('new-file'), {\n enabled: opts.enabled,\n preventDefault: true,\n description: 'New file',\n scope: 'tree',\n });\n\n const refCut = useHotkey('mod+x', () => void run('cut'), {\n enabled: opts.enabled,\n preventDefault: true,\n description: 'Cut',\n scope: 'tree',\n });\n\n const refCopy = useHotkey('mod+c', () => void run('copy'), {\n enabled: opts.enabled,\n preventDefault: true,\n description: 'Copy',\n scope: 'tree',\n });\n\n const refPaste = useHotkey('mod+v', () => void run('paste'), {\n enabled: opts.enabled,\n preventDefault: true,\n description: 'Paste',\n scope: 'tree',\n });\n\n const ref = useCallback(\n (instance: HTMLElement | null) => {\n refDelete(instance);\n refRename(instance);\n refDuplicate(instance);\n refNewFolder(instance);\n refNewFile(instance);\n refCut(instance);\n refCopy(instance);\n refPaste(instance);\n },\n [\n refDelete,\n refRename,\n refDuplicate,\n refNewFolder,\n refNewFile,\n refCut,\n refCopy,\n refPaste,\n ],\n );\n\n return { ref };\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef } from 'react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { TreeProvider, useTreeContext } from './context/TreeContext';\nimport { TreeDndProvider } from './TreeDndProvider';\nimport { TreeContent, treeRowDomId } from './components/TreeContent';\nimport { TreeEmptyArea } from './components/TreeEmptyArea';\nimport { TreeSearchInput } from './components/TreeSearchInput';\nimport { appearanceToStyle } from './data/appearance';\nimport {\n useTreeKeyboard,\n useTreeTypeAhead,\n useTreeFinderHotkeys,\n} from './hooks';\nimport type { TreeActionsHandle, TreeRootProps } from './types';\n\n/**\n * High-level entry point. Wraps Provider + (optional) search bar + content.\n *\n * For full control, compose with <TreeProvider>, <TreeContent>,\n * <TreeSearchInput>, <TreeRow>, etc. directly from `@djangocfg/ui-tools/tree`.\n */\nfunction TreeRoot<T>(props: TreeRootProps<T>) {\n const {\n data,\n getItemName,\n loadChildren,\n selectionMode,\n activationMode,\n initialExpandedIds,\n initialSelectedIds,\n indent,\n appearance,\n onSelectionChange,\n onExpansionChange,\n onActivate,\n filterNode,\n enableSearch = false,\n enableTypeAhead = true,\n showIndentGuides = false,\n enableInlineRename = false,\n enableFinderHotkeys = false,\n enableDnD = false,\n canDrop,\n renderRow,\n renderIcon,\n renderLabel,\n renderActions,\n renderContextMenu,\n contextMenuActions,\n labels,\n persistKey,\n persistSelection = false,\n adapter,\n defaultMenuItems,\n actionsRef,\n className,\n style,\n } = props;\n\n return (\n <TreeProvider<T>\n data={data}\n getItemName={getItemName}\n loadChildren={loadChildren}\n selectionMode={selectionMode}\n activationMode={activationMode}\n initialExpandedIds={initialExpandedIds}\n initialSelectedIds={initialSelectedIds}\n indent={indent}\n appearance={appearance}\n onSelectionChange={onSelectionChange}\n onExpansionChange={onExpansionChange}\n onActivate={onActivate}\n filterNode={filterNode}\n enableSearch={enableSearch}\n showIndentGuides={showIndentGuides}\n renderIcon={renderIcon}\n renderLabel={renderLabel}\n renderActions={renderActions}\n // The provider builds the *declarative* merged resolver. Slot\n // conversion happens inside <TreeRootShell /> via the inner ctx,\n // so built-in actions can read live selection state.\n renderContextMenu={renderContextMenu}\n contextMenuActions={contextMenuActions}\n adapter={adapter}\n defaultMenuItems={defaultMenuItems}\n enableInlineRename={enableInlineRename}\n enableDnD={enableDnD}\n canDrop={canDrop}\n labels={labels}\n persistKey={persistKey}\n persistSelection={persistSelection}\n >\n <TreeRootShell<T>\n className={className}\n style={style}\n enableSearch={enableSearch}\n enableTypeAhead={enableTypeAhead}\n enableFinderHotkeys={enableFinderHotkeys}\n renderRow={renderRow}\n actionsRef={actionsRef}\n />\n </TreeProvider>\n );\n}\n\ninterface TreeRootShellProps<T> {\n className?: string;\n style?: React.CSSProperties;\n enableSearch: boolean;\n enableTypeAhead: boolean;\n enableFinderHotkeys: boolean;\n renderRow?: TreeRootProps<T>['renderRow'];\n actionsRef?: React.MutableRefObject<TreeActionsHandle | null>;\n}\n\nfunction TreeRootShell<T>({\n className,\n style,\n enableSearch,\n enableTypeAhead,\n enableFinderHotkeys,\n renderRow,\n actionsRef,\n}: TreeRootShellProps<T>) {\n const containerRef = useRef<HTMLDivElement>(null);\n const ctx = useTreeContext<T>();\n\n // Publish the action handle to the outer ref so host code can call\n // refresh / refreshAll after a mutation that originated outside Tree.\n // Effect runs after mount; the ref stays populated until unmount.\n useEffect(() => {\n if (!actionsRef) return;\n actionsRef.current = {\n refresh: ctx.refresh,\n refreshAll: ctx.refreshAll,\n expandAll: ctx.expandAll,\n collapseAll: ctx.collapseAll,\n };\n return () => {\n if (actionsRef.current) actionsRef.current = null;\n };\n }, [\n actionsRef,\n ctx.refresh,\n ctx.refreshAll,\n ctx.expandAll,\n ctx.collapseAll,\n ]);\n\n // Keyboard navigation (↑↓ ←→ Home/End Enter Esc Cmd+A, Shift-extend) —\n // scoped via callback ref.\n const isMulti = ctx.selectionMode === 'multiple';\n const { ref: keyboardRef } = useTreeKeyboard<T>({\n rows: ctx.flatRows,\n focusedId: ctx.focused,\n multiSelect: isMulti,\n // Pause container hotkeys while inline rename is active so the\n // user can type freely (TreeRenameInput stops bubbling already, but\n // gating here is the cleaner second line of defence).\n enabled: ctx.renamingId === null,\n onFocus: (id, { extend }) => {\n if (extend && isMulti) {\n ctx.moveSelect(id, { extend: true });\n } else {\n ctx.setFocus(id);\n }\n },\n onSelect: ctx.select,\n onActivate: (id) => {\n // Keyboard Enter / Space is always an explicit action — pin (no preview).\n const row = ctx.flatRows.find((r) => r.node.id === id);\n if (row) ctx.activate(row.node, { preview: false });\n },\n onExpand: ctx.expand,\n onCollapse: ctx.collapse,\n onClearSelection: ctx.clearSelection,\n onSelectAll: ctx.selectAll,\n });\n\n // Finder hotkeys (P4) — ⌘⌫, F2, ⌘D, ⌘N, ⌘⇧N, ⌘C/X/V. Bound only when\n // `enableFinderHotkeys` is true; individual shortcuts further gated\n // by adapter method availability inside the hook.\n const { ref: finderHotkeysRef } = useTreeFinderHotkeys<T>({\n enabled: enableFinderHotkeys,\n paused: ctx.renamingId !== null,\n adapter: ctx.adapter,\n labels: ctx.labels,\n selected: ctx.selected,\n focused: ctx.focused,\n getNodeById: ctx.getNodeById,\n getItemName: ctx.getItemName,\n startInlineRename: ctx.inlineRenameEnabled ? ctx.startRename : undefined,\n clipboard: {\n hasItems: !!ctx.clipboard && ctx.clipboard.ids.length > 0,\n cut: ctx.cutToClipboard,\n copy: ctx.copyToClipboard,\n // Hotkey paste targets the currently focused row (or null = root).\n paste: () => {\n const target = ctx.focused ? ctx.getNodeById(ctx.focused) ?? null : null;\n return ctx.pasteFromClipboard(target, 'inside');\n },\n },\n });\n\n const setContainerRef = useCallback(\n (instance: HTMLDivElement | null) => {\n containerRef.current = instance;\n keyboardRef(instance);\n finderHotkeysRef(instance);\n },\n [keyboardRef, finderHotkeysRef],\n );\n\n // Keep the focused row scrolled into view whenever focus moves (keyboard\n // nav, type-ahead, programmatic). Centralised so every focus source gets\n // consistent scrolling — previously only type-ahead scrolled.\n const focusedId = ctx.focused;\n useEffect(() => {\n if (!focusedId) return;\n const el = containerRef.current?.querySelector<HTMLElement>(\n `[data-tree-row][data-id=\"${CSS.escape(focusedId)}\"]`,\n );\n el?.scrollIntoView({ block: 'nearest' });\n }, [focusedId]);\n\n // Type-ahead jump — focus update; scrolling handled by the effect above.\n const onTypeAheadMatch = useCallback(\n (id: string) => {\n ctx.setFocus(id);\n },\n [ctx],\n );\n\n useTreeTypeAhead<T>({\n rows: ctx.flatRows,\n getItemName: ctx.getItemName,\n containerRef,\n onMatch: onTypeAheadMatch,\n enabled: enableTypeAhead,\n });\n\n // Tree body. `ctx.renderContextMenu` is already the final slot —\n // TreeProvider does the declarative→slot merge centrally, so Shell\n // doesn't re-derive it (and no nested provider override is needed).\n const treeBody = (\n <div\n ref={setContainerRef}\n tabIndex={0}\n role=\"tree\"\n aria-label={ctx.labels.ariaLabel}\n aria-multiselectable={ctx.selectionMode === 'multiple' || undefined}\n aria-activedescendant={focusedId ? treeRowDomId(focusedId) : undefined}\n className={cn(\n 'group/tree flex h-full w-full flex-col gap-2 rounded-sm outline-none',\n 'focus-visible:ring-1 focus-visible:ring-ring/50',\n className,\n )}\n style={{ ...appearanceToStyle(ctx.appearance), ...style }}\n data-tree-root=\"\"\n >\n {enableSearch ? <TreeSearchInput className=\"mx-2 mt-2\" /> : null}\n <div className=\"flex min-h-0 flex-1 flex-col overflow-auto px-1\">\n <TreeContent<T> role=\"group\">{renderRow}</TreeContent>\n {/* Empty-area: catches right-clicks on whitespace below the\n last row + acts as the root drop target for DnD. Always\n rendered — it self-disables when there's nothing to do. */}\n <TreeEmptyArea />\n </div>\n </div>\n );\n\n // Wrap in @dnd-kit context only when DnD is active — `TreeDndProvider`\n // short-circuits to a fragment otherwise, so we don't pay the\n // sensor-registration cost.\n return <TreeDndProvider>{treeBody}</TreeDndProvider>;\n}\n\nexport default TreeRoot;\nexport { TreeRoot };\n","'use client';\n\nimport { TreeRoot } from './TreeRoot';\nimport type { TreeRootProps } from './types';\n\n/**\n * `<FinderTree>` — opinionated Finder/Explorer-style preset.\n *\n * Equivalent to `<TreeRoot>` with multi-selection, double-click activation,\n * inline rename, indent guides, and a cozy appearance turned on. Pass an\n * `adapter` to get the built-in CRUD menu wired to `window.dialog.*`.\n *\n * Override any preset default by simply passing the same prop:\n *\n * ```tsx\n * <FinderTree<FsNode>\n * data={data}\n * getItemName={(n) => n.data.name}\n * adapter={fsAdapter}\n * // override one preset default — everything else stays Finder-y:\n * activationMode=\"single-click-preview\"\n * />\n * ```\n */\nexport function FinderTree<T>(props: TreeRootProps<T>) {\n return (\n <TreeRoot<T>\n // Finder/Explorer defaults — every one is overridable via `props`.\n selectionMode=\"multiple\"\n activationMode=\"double-click\"\n enableInlineRename\n enableFinderHotkeys\n enableDnD\n enableTypeAhead\n showIndentGuides\n appearance={{ density: 'cozy' }}\n {...props}\n />\n );\n}\n\nexport default FinderTree;\n","'use client';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\nexport interface TreeSkeletonProps {\n rows?: number;\n className?: string;\n}\n\nexport function TreeSkeleton({ rows = 6, className }: TreeSkeletonProps) {\n return (\n <div className={cn('flex flex-col gap-1 p-2', className)} aria-hidden>\n {Array.from({ length: rows }).map((_, i) => (\n <div key={i} className=\"flex items-center gap-2\" style={{ paddingLeft: (i % 3) * 16 }}>\n <span className=\"size-4 shrink-0 animate-pulse rounded bg-muted\" />\n <span className=\"size-4 shrink-0 animate-pulse rounded bg-muted\" />\n <span className=\"h-3 flex-1 animate-pulse rounded bg-muted\" />\n </div>\n ))}\n </div>\n );\n}\n","'use client';\n\nimport { AlertCircle } from 'lucide-react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nexport interface TreeErrorProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport function TreeError({ children, className }: TreeErrorProps) {\n return (\n <div\n className={cn(\n 'flex items-start gap-2 rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive',\n className,\n )}\n role=\"alert\"\n >\n <AlertCircle aria-hidden className=\"mt-0.5 size-4 shrink-0\" />\n <span>{children}</span>\n </div>\n );\n}\n","'use client';\n\nimport type { TreeNode } from '../types';\n\nexport interface DemoNode {\n name: string;\n}\n\n/**\n * Build a deterministic synthetic tree for stories and tests.\n *\n * @example\n * const data = createDemoTree({ depth: 4, breadth: 3 });\n * <TreeRoot data={data} getItemName={(n) => n.data.name} />\n */\nexport function createDemoTree({\n depth = 3,\n breadth = 4,\n rootPrefix = 'node',\n}: {\n depth?: number;\n breadth?: number;\n rootPrefix?: string;\n} = {}): TreeNode<DemoNode>[] {\n const make = (id: string, name: string, level: number): TreeNode<DemoNode> => {\n if (level >= depth) {\n return { id, data: { name } };\n }\n const children: TreeNode<DemoNode>[] = [];\n for (let i = 0; i < breadth; i++) {\n const childId = `${id}/${i}`;\n children.push(make(childId, `${name}-${i}`, level + 1));\n }\n return { id, data: { name }, children };\n };\n\n const roots: TreeNode<DemoNode>[] = [];\n for (let i = 0; i < breadth; i++) {\n roots.push(make(`${rootPrefix}-${i}`, `${rootPrefix} ${i}`, 1));\n }\n return roots;\n}\n"]}
|