{"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":["__name","useRef","useCallback","useMemo","useEffect","getDialog","CornerUpLeft","Pencil","Copy","Scissors","Trash2","FilePlus","FolderPlus","useState","jsxs","ContextMenu","jsx","ContextMenuTrigger","ContextMenuContent","ContextMenuSeparator","ContextMenuItem","ContextMenuShortcut","createContext","React","useReducer","useSensors","useSensor","PointerSensor","KeyboardSensor","current","Fragment","DndContext","cn","ChevronDown","ChevronRight","memo","FolderOpen","Folder","File","dot","useDraggable","useDroppable","Loader2","Search","X","useHotkey","AlertCircle"],"mappings":"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","file":"index.cjs","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 * High-level look. Sets sensible defaults for icons / row sizing / the\n * active indicator; any individual `TreeAppearance` field still overrides.\n *\n *  - `'explorer'` (default) — classic file/folder tree: leaf + folder\n *    icons, fixed single-line rows, VSCode active-bar.\n *  - `'list'` — macOS-sidebar / chat-history look: no icons (chevron\n *    only on groups), auto-height rows (multi-line label friendly), quiet\n *    selection (no active-bar).\n */\nexport type TreeVariant = 'explorer' | 'list';\n\nexport type TreeRowSizing = 'fixed' | 'auto';\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   * High-level look. Default: `'explorer'`. Sets defaults for the three\n   * fields below; pass any of them explicitly to override the variant.\n   */\n  variant?: TreeVariant;\n  /** Hide per-leaf icons (chevron + label only). Variant default. */\n  hideLeafIcons?: boolean;\n  /** Hide folder icons too (chevron stays). Variant default. */\n  hideFolderIcons?: boolean;\n  /**\n   * `'fixed'` — every row is exactly `rowHeight` (single-line explorer).\n   * `'auto'` — `rowHeight` is a *minimum*; rows grow to fit a multi-line\n   * label (title + meta). Variant default.\n   */\n  rowSizing?: TreeRowSizing;\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  hideLeafIcons: boolean;\n  hideFolderIcons: boolean;\n  rowSizing: TreeRowSizing;\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\n/**\n * Per-variant defaults for the icon / sizing / indicator fields. The\n * `'list'` variant is the macOS-sidebar / chat-history look.\n */\nconst VARIANT_DEFAULTS: Record<\n  TreeVariant,\n  Pick<\n    ResolvedAppearance,\n    'hideLeafIcons' | 'hideFolderIcons' | 'rowSizing' | 'showActiveIndicator'\n  >\n> = {\n  explorer: {\n    hideLeafIcons: false,\n    hideFolderIcons: false,\n    rowSizing: 'fixed',\n    showActiveIndicator: true,\n  },\n  list: {\n    hideLeafIcons: true,\n    hideFolderIcons: true,\n    rowSizing: 'auto',\n    showActiveIndicator: false,\n  },\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  ...VARIANT_DEFAULTS.explorer,\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  // Variant sets the icon/sizing/indicator defaults; explicit fields win.\n  const variant: TreeVariant = input?.variant ?? 'explorer';\n  const v = VARIANT_DEFAULTS[variant];\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: input?.showActiveIndicator ?? v.showActiveIndicator,\n    hideLeafIcons: input?.hideLeafIcons ?? v.hideLeafIcons,\n    hideFolderIcons: input?.hideFolderIcons ?? v.hideFolderIcons,\n    rowSizing: input?.rowSizing ?? v.rowSizing,\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 { useState } from 'react';\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\ninterface RowContextMenuProps<T> {\n  rowProps: TreeRowRenderProps<T>;\n  items: TreeContextMenuItem<T>[];\n  trigger: React.ReactNode;\n}\n\n/**\n * Per-row context menu.\n *\n * PERF: every visible row wraps its trigger in a `<ContextMenu>`, so a\n * large tree mounts hundreds of these. Building the full\n * `<ContextMenuContent>` item subtree for each of them on every render is\n * what made right-click feel laggy (the selection change on right-click\n * re-renders all rows, each rebuilding its menu body). We now render the\n * content body ONLY while this row's menu is actually open — closed rows\n * cost just the lightweight `ContextMenu` + `Trigger` shell.\n */\nfunction RowContextMenu<T>({\n  rowProps,\n  items,\n  trigger,\n}: RowContextMenuProps<T>) {\n  const [open, setOpen] = useState(false);\n  return (\n    <ContextMenu onOpenChange={setOpen}>\n      <ContextMenuTrigger asChild>{trigger}</ContextMenuTrigger>\n      {open ? (\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      ) : null}\n    </ContextMenu>\n  );\n}\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 <RowContextMenu rowProps={rowProps} items={items} trigger={trigger} />;\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        // `auto` sizing lets a multi-line label (e.g. title + meta in a\n        // chat-history list) grow the row instead of overflowing a fixed\n        // height. `fixed` keeps the classic single-line explorer row.\n        ...(appearance.rowSizing === 'auto'\n          ? {\n              minHeight: 'var(--tree-row-height)',\n              paddingTop: 4,\n              paddingBottom: 4,\n            }\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      ) : (isFolder ? appearance.hideFolderIcons : appearance.hideLeafIcons) ? null : (\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"]}