@djangocfg/ui-tools 2.1.316 → 2.1.318
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/TreeRoot-A3J65L6F.mjs +4 -0
- package/dist/{TreeRoot-A25RIGYE.cjs.map → TreeRoot-A3J65L6F.mjs.map} +1 -1
- package/dist/TreeRoot-DSK5JILT.cjs +19 -0
- package/dist/{TreeRoot-HBRJEHBH.mjs.map → TreeRoot-DSK5JILT.cjs.map} +1 -1
- package/dist/{chunk-4CEOJDMB.cjs → chunk-3Z3A7FHA.cjs} +36 -15
- package/dist/chunk-3Z3A7FHA.cjs.map +1 -0
- package/dist/{chunk-NFIMVYJU.mjs → chunk-MOME6KYD.mjs} +36 -15
- package/dist/chunk-MOME6KYD.mjs.map +1 -0
- package/dist/file-icon/index.cjs +173 -0
- package/dist/file-icon/index.cjs.map +1 -0
- package/dist/file-icon/index.d.cts +98 -0
- package/dist/file-icon/index.d.ts +98 -0
- package/dist/file-icon/index.mjs +167 -0
- package/dist/file-icon/index.mjs.map +1 -0
- package/dist/index.cjs +122 -122
- package/dist/index.d.cts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.mjs +3 -3
- package/dist/tree/index.cjs +33 -33
- package/dist/tree/index.d.cts +10 -172
- package/dist/tree/index.d.ts +10 -172
- package/dist/tree/index.mjs +1 -1
- package/dist/types-CevSbyfD.d.cts +204 -0
- package/dist/types-CevSbyfD.d.ts +204 -0
- package/package.json +13 -7
- package/src/tools/FileIcon/FileIcon.tsx +102 -0
- package/src/tools/FileIcon/index.ts +15 -0
- package/src/tools/FileIcon/loader.ts +47 -0
- package/src/tools/FileIcon/specialFolders.ts +93 -0
- package/src/tools/FileIcon/treeAdapter.tsx +49 -0
- package/src/tools/Tree/README.md +100 -0
- package/src/tools/Tree/Tree.story.tsx +84 -0
- package/src/tools/Tree/TreeRoot.tsx +6 -1
- package/src/tools/Tree/components/TreeContent.tsx +3 -1
- package/src/tools/Tree/components/TreeRow.tsx +17 -8
- package/src/tools/Tree/context/TreeContext.tsx +14 -3
- package/src/tools/Tree/data/flatten.ts +10 -1
- package/src/tools/Tree/index.tsx +2 -0
- package/src/tools/Tree/types.ts +43 -2
- package/dist/TreeRoot-A25RIGYE.cjs +0 -19
- package/dist/TreeRoot-HBRJEHBH.mjs +0 -4
- package/dist/chunk-4CEOJDMB.cjs.map +0 -1
- package/dist/chunk-NFIMVYJU.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"TreeRoot-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"TreeRoot-A3J65L6F.mjs"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var chunk3Z3A7FHA_cjs = require('./chunk-3Z3A7FHA.cjs');
|
|
6
|
+
require('./chunk-WGEGR3DF.cjs');
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
Object.defineProperty(exports, "TreeRoot", {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function () { return chunk3Z3A7FHA_cjs.TreeRoot; }
|
|
13
|
+
});
|
|
14
|
+
Object.defineProperty(exports, "default", {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: function () { return chunk3Z3A7FHA_cjs.TreeRoot_default; }
|
|
17
|
+
});
|
|
18
|
+
//# sourceMappingURL=TreeRoot-DSK5JILT.cjs.map
|
|
19
|
+
//# sourceMappingURL=TreeRoot-DSK5JILT.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"TreeRoot-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"TreeRoot-DSK5JILT.cjs"}
|
|
@@ -56,10 +56,16 @@ var isNodeFolder = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((node) => {
|
|
|
56
56
|
if (typeof node.isFolder === "boolean") return node.isFolder;
|
|
57
57
|
return Array.isArray(node.children);
|
|
58
58
|
}, "isNodeFolder");
|
|
59
|
-
function flattenTree({
|
|
59
|
+
function flattenTree({
|
|
60
|
+
roots,
|
|
61
|
+
expandedIds,
|
|
62
|
+
cache,
|
|
63
|
+
filterNode
|
|
64
|
+
}) {
|
|
60
65
|
const out = [];
|
|
61
66
|
const walk = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((nodes, level, parentId) => {
|
|
62
67
|
for (const node of nodes) {
|
|
68
|
+
if (filterNode && !filterNode(node)) continue;
|
|
63
69
|
const isFolder = isNodeFolder(node);
|
|
64
70
|
const isExpanded = expandedIds.has(node.id);
|
|
65
71
|
const resolved = isFolder ? resolveChildren(cache, node) : { children: [], status: "loaded" };
|
|
@@ -294,6 +300,7 @@ function TreeProvider(props) {
|
|
|
294
300
|
getItemName,
|
|
295
301
|
loadChildren,
|
|
296
302
|
selectionMode = "single",
|
|
303
|
+
activationMode = "single-click",
|
|
297
304
|
initialExpandedIds,
|
|
298
305
|
initialSelectedIds,
|
|
299
306
|
indent,
|
|
@@ -301,6 +308,7 @@ function TreeProvider(props) {
|
|
|
301
308
|
onSelectionChange,
|
|
302
309
|
onExpansionChange,
|
|
303
310
|
onActivate,
|
|
311
|
+
filterNode,
|
|
304
312
|
enableSearch = false,
|
|
305
313
|
showIndentGuides = false,
|
|
306
314
|
renderIcon,
|
|
@@ -392,9 +400,10 @@ function TreeProvider(props) {
|
|
|
392
400
|
() => flattenTree({
|
|
393
401
|
roots: data,
|
|
394
402
|
expandedIds: state.expanded,
|
|
395
|
-
cache: cacheRef.current
|
|
403
|
+
cache: cacheRef.current,
|
|
404
|
+
filterNode
|
|
396
405
|
}),
|
|
397
|
-
[data, state.expanded, state.cacheTick]
|
|
406
|
+
[data, state.expanded, state.cacheTick, filterNode]
|
|
398
407
|
);
|
|
399
408
|
const matchingIds = React.useMemo(() => {
|
|
400
409
|
const set = /* @__PURE__ */ new Set();
|
|
@@ -489,7 +498,7 @@ function TreeProvider(props) {
|
|
|
489
498
|
);
|
|
490
499
|
}, [loadChildren, state.expanded, nodeById, fetchChildren]);
|
|
491
500
|
const activate = React.useCallback(
|
|
492
|
-
(node) => onActivateRef.current?.(node),
|
|
501
|
+
(node, opts = { preview: false }) => onActivateRef.current?.(node, opts),
|
|
493
502
|
[]
|
|
494
503
|
);
|
|
495
504
|
const value = React.useMemo(
|
|
@@ -517,6 +526,7 @@ function TreeProvider(props) {
|
|
|
517
526
|
appearance: resolvedAppearance,
|
|
518
527
|
indent: resolvedAppearance.indent,
|
|
519
528
|
selectionMode,
|
|
529
|
+
activationMode,
|
|
520
530
|
enableSearch,
|
|
521
531
|
showIndentGuides,
|
|
522
532
|
getItemName,
|
|
@@ -548,6 +558,7 @@ function TreeProvider(props) {
|
|
|
548
558
|
labels,
|
|
549
559
|
resolvedAppearance,
|
|
550
560
|
selectionMode,
|
|
561
|
+
activationMode,
|
|
551
562
|
enableSearch,
|
|
552
563
|
showIndentGuides,
|
|
553
564
|
getItemName,
|
|
@@ -646,6 +657,7 @@ function TreeRow({ row, className }) {
|
|
|
646
657
|
const ctx = useTreeContext();
|
|
647
658
|
const {
|
|
648
659
|
appearance,
|
|
660
|
+
activationMode,
|
|
649
661
|
showIndentGuides,
|
|
650
662
|
selected,
|
|
651
663
|
focused,
|
|
@@ -674,20 +686,23 @@ function TreeRow({ row, className }) {
|
|
|
674
686
|
isLoading,
|
|
675
687
|
isMatchingSearch
|
|
676
688
|
};
|
|
677
|
-
const
|
|
689
|
+
const handleClick = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((e) => {
|
|
678
690
|
if (node.disabled) return;
|
|
679
691
|
setFocus(node.id);
|
|
680
692
|
select(node.id);
|
|
681
|
-
if (isFolder)
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
693
|
+
if (isFolder) {
|
|
694
|
+
toggle(node.id);
|
|
695
|
+
} else if (activationMode === "single-click") {
|
|
696
|
+
activate(node, { preview: false });
|
|
697
|
+
} else if (activationMode === "single-click-preview") {
|
|
698
|
+
activate(node, { preview: true });
|
|
699
|
+
}
|
|
686
700
|
e.currentTarget.scrollIntoView?.({ block: "nearest" });
|
|
687
701
|
}, "handleClick");
|
|
688
702
|
const handleDoubleClick = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(() => {
|
|
689
703
|
if (node.disabled) return;
|
|
690
|
-
if (
|
|
704
|
+
if (isFolder) return;
|
|
705
|
+
activate(node, { preview: false });
|
|
691
706
|
}, "handleDoubleClick");
|
|
692
707
|
const trigger = /* @__PURE__ */ jsxRuntime.jsxs(
|
|
693
708
|
"div",
|
|
@@ -700,6 +715,7 @@ function TreeRow({ row, className }) {
|
|
|
700
715
|
"aria-disabled": node.disabled || void 0,
|
|
701
716
|
"data-tree-row": "",
|
|
702
717
|
"data-id": node.id,
|
|
718
|
+
"data-activation-mode": activationMode,
|
|
703
719
|
"data-selected": isSelected ? "true" : void 0,
|
|
704
720
|
"data-focused": isFocused && !isSelected ? "true" : void 0,
|
|
705
721
|
"data-folder": isFolder || void 0,
|
|
@@ -785,7 +801,7 @@ function TreeEmpty({ children, className }) {
|
|
|
785
801
|
}
|
|
786
802
|
chunkWGEGR3DF_cjs.__name(TreeEmpty, "TreeEmpty");
|
|
787
803
|
function TreeContent({ children, className, ariaLabel }) {
|
|
788
|
-
const { flatRows, labels, selected, focused, matchingIds } = useTreeContext();
|
|
804
|
+
const { flatRows, labels, selected, focused, matchingIds, appearance } = useTreeContext();
|
|
789
805
|
if (flatRows.length === 0) {
|
|
790
806
|
return /* @__PURE__ */ jsxRuntime.jsx(TreeEmpty, { children: labels.empty });
|
|
791
807
|
}
|
|
@@ -795,6 +811,7 @@ function TreeContent({ children, className, ariaLabel }) {
|
|
|
795
811
|
role: "tree",
|
|
796
812
|
"aria-label": ariaLabel ?? labels.ariaLabel,
|
|
797
813
|
className: lib.cn("relative flex flex-col py-1", className),
|
|
814
|
+
style: appearanceToStyle(appearance),
|
|
798
815
|
children: flatRows.map((row) => {
|
|
799
816
|
const slot = {
|
|
800
817
|
node: row.node,
|
|
@@ -1140,6 +1157,7 @@ function TreeRoot(props) {
|
|
|
1140
1157
|
getItemName,
|
|
1141
1158
|
loadChildren,
|
|
1142
1159
|
selectionMode,
|
|
1160
|
+
activationMode,
|
|
1143
1161
|
initialExpandedIds,
|
|
1144
1162
|
initialSelectedIds,
|
|
1145
1163
|
indent,
|
|
@@ -1147,6 +1165,7 @@ function TreeRoot(props) {
|
|
|
1147
1165
|
onSelectionChange,
|
|
1148
1166
|
onExpansionChange,
|
|
1149
1167
|
onActivate,
|
|
1168
|
+
filterNode,
|
|
1150
1169
|
enableSearch = false,
|
|
1151
1170
|
enableTypeAhead = true,
|
|
1152
1171
|
showIndentGuides = false,
|
|
@@ -1168,6 +1187,7 @@ function TreeRoot(props) {
|
|
|
1168
1187
|
getItemName,
|
|
1169
1188
|
loadChildren,
|
|
1170
1189
|
selectionMode,
|
|
1190
|
+
activationMode,
|
|
1171
1191
|
initialExpandedIds,
|
|
1172
1192
|
initialSelectedIds,
|
|
1173
1193
|
indent,
|
|
@@ -1175,6 +1195,7 @@ function TreeRoot(props) {
|
|
|
1175
1195
|
onSelectionChange,
|
|
1176
1196
|
onExpansionChange,
|
|
1177
1197
|
onActivate,
|
|
1198
|
+
filterNode,
|
|
1178
1199
|
enableSearch,
|
|
1179
1200
|
showIndentGuides,
|
|
1180
1201
|
renderIcon,
|
|
@@ -1214,7 +1235,7 @@ function TreeRootShell({
|
|
|
1214
1235
|
onSelect: ctx.select,
|
|
1215
1236
|
onActivate: /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((id) => {
|
|
1216
1237
|
const row = ctx.flatRows.find((r) => r.node.id === id);
|
|
1217
|
-
if (row) ctx.activate(row.node);
|
|
1238
|
+
if (row) ctx.activate(row.node, { preview: false });
|
|
1218
1239
|
}, "onActivate"),
|
|
1219
1240
|
onExpand: ctx.expand,
|
|
1220
1241
|
onCollapse: ctx.collapse,
|
|
@@ -1296,5 +1317,5 @@ exports.useTreeRows = useTreeRows;
|
|
|
1296
1317
|
exports.useTreeSearch = useTreeSearch;
|
|
1297
1318
|
exports.useTreeSelection = useTreeSelection;
|
|
1298
1319
|
exports.useTreeTypeAhead = useTreeTypeAhead;
|
|
1299
|
-
//# sourceMappingURL=chunk-
|
|
1300
|
-
//# sourceMappingURL=chunk-
|
|
1320
|
+
//# sourceMappingURL=chunk-3Z3A7FHA.cjs.map
|
|
1321
|
+
//# sourceMappingURL=chunk-3Z3A7FHA.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/Tree/types.ts","../src/tools/Tree/data/childCache.ts","../src/tools/Tree/data/flatten.ts","../src/tools/Tree/data/persist.ts","../src/tools/Tree/data/appearance.ts","../src/tools/Tree/context/TreeContext.tsx","../src/tools/Tree/components/TreeChevron.tsx","../src/tools/Tree/components/TreeIcon.tsx","../src/tools/Tree/components/TreeIndentGuides.tsx","../src/tools/Tree/components/TreeLabel.tsx","../src/tools/Tree/components/TreeRow.tsx","../src/tools/Tree/components/TreeEmpty.tsx","../src/tools/Tree/components/TreeContent.tsx","../src/tools/Tree/context/hooks.ts","../src/tools/Tree/components/TreeSearchInput.tsx","../src/tools/Tree/hooks/useTreeKeyboard.ts","../src/tools/Tree/hooks/useTreeTypeAhead.ts","../src/tools/Tree/TreeRoot.tsx"],"names":["__name","createContext","React","useMemo","useReducer","useRef","useCallback","children","useEffect","jsx","cn","ChevronDown","ChevronRight","FolderOpen","Folder","File","jsxs","Loader2","Fragment","Search","X","useHotkey"],"mappings":"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","file":"chunk-3Z3A7FHA.cjs","sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\n\nimport type { TreeAppearance } from './data/appearance';\n\nexport type TreeItemId = string;\n\n/** A single node in the consumer's tree data. Generic over your payload. */\nexport interface TreeNode<T = unknown> {\n id: TreeItemId;\n data: T;\n /** Inline children. Omit (and provide a `loadChildren`) for async loading. */\n children?: TreeNode<T>[];\n /**\n * Set to `true` to mark a node as a folder even when its `children` array\n * is empty (e.g. an unloaded async folder). Default: derived from\n * `Array.isArray(children)`.\n */\n isFolder?: boolean;\n /** Disable interaction. */\n disabled?: boolean;\n}\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\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\nexport type TreeSelectionMode = 'none' | 'single' | 'multiple';\n\n/**\n * How a node becomes \"activated\" (i.e. opened) on pointer interaction.\n *\n * - `'single-click'` (default): single click activates a leaf immediately;\n * double-click also activates. Folders always toggle on single click.\n * - `'double-click'`: single click only selects + focuses; double-click is\n * required to activate. Mirrors classic file-manager behaviour.\n * - `'single-click-preview'`: VSCode Explorer / Cursor behaviour. Single\n * click activates with `{ preview: true }` (consumer renders a preview\n * tab); double-click activates with `{ preview: false }` (pinned tab).\n *\n * Folders ignore this setting — they always toggle on single click and\n * never call `onActivate`.\n */\nexport type TreeActivationMode =\n | 'single-click'\n | 'double-click'\n | 'single-click-preview';\n\nexport interface TreeActivateOptions {\n /**\n * `true` when the activation came from a single click in\n * `'single-click-preview'` mode. `false` for double-click and for\n * non-preview modes. Consumers typically map this to a\n * preview-tab vs pinned-tab distinction.\n */\n preview: boolean;\n}\n\n/**\n * Async loader: called the first time a folder is expanded with no inline\n * `children`. Result is cached; concurrent expansions are de-duplicated.\n */\nexport type TreeLoadChildren<T> = (\n node: TreeNode<T>,\n) => Promise<TreeNode<T>[]>;\n\nexport interface TreeRowRenderProps<T> {\n node: TreeNode<T>;\n level: number;\n isSelected: boolean;\n isExpanded: boolean;\n isFocused: boolean;\n isFolder: boolean;\n isLoading: boolean;\n isMatchingSearch: boolean;\n}\n\nexport type TreeRowSlot<T> = (props: TreeRowRenderProps<T>) => ReactNode;\n\nexport type TreeContextMenuSlot<T> = (\n props: TreeRowRenderProps<T>,\n trigger: ReactNode,\n) => ReactNode;\n\nexport interface TreeRootProps<T> {\n /** Root nodes. Top-level items are rendered directly (no synthetic root). */\n data: TreeNode<T>[];\n /** Returns the human-readable name for a node (used by search/type-ahead). */\n getItemName: (node: TreeNode<T>) => string;\n\n /** Async loader for folders without inline `children`. */\n loadChildren?: TreeLoadChildren<T>;\n\n /** Selection behaviour. Default: `'single'`. */\n selectionMode?: TreeSelectionMode;\n /** Pointer activation behaviour. Default: `'single-click'`. */\n activationMode?: TreeActivationMode;\n /** Initially expanded ids. */\n initialExpandedIds?: TreeItemId[];\n /** Initially selected ids. */\n initialSelectedIds?: TreeItemId[];\n /** Pixels of indent per nesting level. Default: 16. (Shortcut for `appearance.indent`.) */\n indent?: number;\n /** Cosmetic configuration: density, sizes, accent intensity, radius. */\n appearance?: TreeAppearance;\n\n /** Triggered when selection changes. */\n onSelectionChange?: (selectedIds: TreeItemId[]) => void;\n /** Triggered when expanded set changes. */\n onExpansionChange?: (expandedIds: TreeItemId[]) => void;\n /**\n * Triggered when a leaf is activated (Enter / dblclick / click depending\n * on `activationMode`). Folders never call this — they toggle instead.\n */\n onActivate?: (node: TreeNode<T>, opts: TreeActivateOptions) => void;\n\n /**\n * Optional predicate. Nodes returning `false` (and their descendants) are\n * not rendered and not searchable. Use this to hide dot-files, system\n * entries, or anything else the consumer wants to filter out.\n */\n filterNode?: (node: TreeNode<T>) => boolean;\n\n /** Show built-in search input. Default: false. */\n enableSearch?: boolean;\n /** Type printable letters to jump to a matching name. Default: true. */\n enableTypeAhead?: boolean;\n /** Render vertical indent guides under expanded folders. Default: false. */\n showIndentGuides?: boolean;\n\n /** Custom row renderer. Falls back to the default <TreeRow />. */\n renderRow?: TreeRowSlot<T>;\n /** Replace default folder/file icon. */\n renderIcon?: TreeRowSlot<T>;\n /** Replace default label rendering. */\n renderLabel?: TreeRowSlot<T>;\n /** Right-side actions slot (per row). */\n renderActions?: TreeRowSlot<T>;\n /** Wrap each row in a context menu (right-click). Receives the row meta + trigger element. */\n renderContextMenu?: TreeContextMenuSlot<T>;\n\n /** Override built-in copy in your locale. */\n labels?: Partial<TreeLabels>;\n /** Persist expanded + (optional) selected ids in localStorage under this key. */\n persistKey?: string;\n /** Persist selection alongside expansion. Default: false. */\n persistSelection?: boolean;\n\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** Internal flat-row representation used by the renderer + keyboard nav. */\nexport interface FlatRow<T> {\n node: TreeNode<T>;\n level: number;\n parentId: TreeItemId | null;\n isFolder: boolean;\n isExpanded: boolean;\n isLoading: boolean;\n hasError: boolean;\n}\n","'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 for (const node of nodes) {\n if (filterNode && !filterNode(node)) continue;\n\n const isFolder = isNodeFolder(node);\n const isExpanded = expandedIds.has(node.id);\n const resolved = isFolder ? resolveChildren(cache, node) : { 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 });\n\n if (isFolder && isExpanded && resolved.children) {\n walk(resolved.children, level + 1, node.id);\n }\n }\n };\n\n walk(roots, 0, null);\n return out;\n}\n","'use client';\n\nimport type { TreeItemId } from '../types';\n\nconst KEY_PREFIX = '@djangocfg/tree:';\nconst VERSION = 1;\n\nexport interface PersistedTreeState {\n expandedItems: TreeItemId[];\n selectedItems: TreeItemId[];\n}\n\ninterface PersistedShape extends PersistedTreeState {\n version: number;\n}\n\nfunction safeStorage(): Storage | null {\n if (typeof window === 'undefined') return null;\n try {\n return window.localStorage;\n } catch {\n return null;\n }\n}\n\nexport function loadTreeState(key: string): PersistedTreeState | null {\n const storage = safeStorage();\n if (!storage) return null;\n try {\n const raw = storage.getItem(KEY_PREFIX + key);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as Partial<PersistedShape>;\n if (parsed.version !== VERSION) return null;\n return {\n expandedItems: Array.isArray(parsed.expandedItems) ? parsed.expandedItems : [],\n selectedItems: Array.isArray(parsed.selectedItems) ? parsed.selectedItems : [],\n };\n } catch {\n return null;\n }\n}\n\nexport function saveTreeState(key: string, state: PersistedTreeState): void {\n const storage = safeStorage();\n if (!storage) return;\n try {\n const payload: PersistedShape = { ...state, version: VERSION };\n storage.setItem(KEY_PREFIX + key, JSON.stringify(payload));\n } catch {\n /* quota / serialization — best-effort persistence */\n }\n}\n\nexport function clearTreeState(key: string): void {\n const storage = safeStorage();\n if (!storage) return;\n try {\n storage.removeItem(KEY_PREFIX + key);\n } catch {\n /* ignore */\n }\n}\n","'use client';\n\nimport type { CSSProperties } from 'react';\n\nexport type TreeDensity = 'compact' | 'cozy' | 'comfortable';\nexport type TreeAccentIntensity = 'subtle' | 'default' | 'strong';\nexport type TreeRadius = 'none' | 'sm' | 'md';\n\n/**\n * Cosmetic configuration. Every field is optional; missing values fall\n * back to the `cozy` preset (a comfortable VSCode-Explorer-like density).\n *\n * Customize the look without re-implementing slots.\n */\nexport interface TreeAppearance {\n /** Built-in size preset. Default: `'cozy'`. */\n density?: TreeDensity;\n /** Override row height in px (wins over density). */\n rowHeight?: number;\n /** Override icon + chevron size in px (wins over density). */\n iconSize?: number;\n /** Lucide stroke width for icon + chevron. Default: 1.5. */\n iconStrokeWidth?: number;\n /** Override label font size in px (wins over density). */\n fontSize?: number;\n /** Pixels between chevron / icon / label. Default depends on density. */\n gap?: number;\n /** Pixels between nesting levels. Default: 16. */\n indent?: number;\n /** Hover / selected highlight intensity. Default: `'default'`. */\n accent?: TreeAccentIntensity;\n /** Row corner radius. Default: `'sm'`. */\n radius?: TreeRadius;\n /** Indent-guide line opacity (0..1). Default: 0.4. */\n indentGuideOpacity?: number;\n /**\n * Show a 2px primary-tinted bar on the left of the selected row.\n * Mimics the VSCode active-tab indicator. Default: `true`.\n */\n showActiveIndicator?: boolean;\n}\n\nexport interface ResolvedAppearance {\n density: TreeDensity;\n rowHeight: number;\n iconSize: number;\n iconStrokeWidth: number;\n fontSize: number;\n gap: number;\n indent: number;\n accent: TreeAccentIntensity;\n radius: TreeRadius;\n indentGuideOpacity: number;\n showActiveIndicator: boolean;\n}\n\nconst DENSITY_PRESETS: Record<\n TreeDensity,\n Pick<ResolvedAppearance, 'rowHeight' | 'iconSize' | 'fontSize' | 'gap'>\n> = {\n compact: { rowHeight: 24, iconSize: 14, fontSize: 13, gap: 6 },\n cozy: { rowHeight: 28, iconSize: 16, fontSize: 13, gap: 8 },\n comfortable: { rowHeight: 32, iconSize: 16, fontSize: 14, gap: 8 },\n};\n\nexport const DEFAULT_TREE_APPEARANCE: ResolvedAppearance = {\n density: 'cozy',\n ...DENSITY_PRESETS.cozy,\n iconStrokeWidth: 1.5,\n indent: 16,\n accent: 'default',\n radius: 'sm',\n indentGuideOpacity: 0.4,\n showActiveIndicator: true,\n};\n\n/**\n * Merge a partial appearance with the default + density preset.\n *\n * Explicit numeric overrides (e.g. `rowHeight`) win over the density preset.\n */\nexport function resolveAppearance(\n input?: TreeAppearance,\n /** Outer `indent` prop (kept on TreeRoot for back-compat). */\n outerIndent?: number,\n): ResolvedAppearance {\n if (!input && outerIndent === undefined) return DEFAULT_TREE_APPEARANCE;\n\n const density: TreeDensity = input?.density ?? 'cozy';\n const preset = DENSITY_PRESETS[density];\n\n return {\n density,\n rowHeight: input?.rowHeight ?? preset.rowHeight,\n iconSize: input?.iconSize ?? preset.iconSize,\n iconStrokeWidth: input?.iconStrokeWidth ?? DEFAULT_TREE_APPEARANCE.iconStrokeWidth,\n fontSize: input?.fontSize ?? preset.fontSize,\n gap: input?.gap ?? preset.gap,\n indent: input?.indent ?? outerIndent ?? DEFAULT_TREE_APPEARANCE.indent,\n accent: input?.accent ?? DEFAULT_TREE_APPEARANCE.accent,\n radius: input?.radius ?? DEFAULT_TREE_APPEARANCE.radius,\n indentGuideOpacity:\n input?.indentGuideOpacity ?? DEFAULT_TREE_APPEARANCE.indentGuideOpacity,\n showActiveIndicator:\n input?.showActiveIndicator ?? DEFAULT_TREE_APPEARANCE.showActiveIndicator,\n };\n}\n\n/**\n * Build the `style` object that exposes the resolved appearance to any\n * descendant via CSS variables. Set on `<TreeRoot>`'s outer div.\n */\nexport function appearanceToStyle(a: ResolvedAppearance): CSSProperties {\n return {\n ['--tree-row-height' as string]: `${a.rowHeight}px`,\n ['--tree-icon-size' as string]: `${a.iconSize}px`,\n ['--tree-icon-stroke' as string]: a.iconStrokeWidth,\n ['--tree-font-size' as string]: `${a.fontSize}px`,\n ['--tree-gap' as string]: `${a.gap}px`,\n ['--tree-indent' as string]: `${a.indent}px`,\n ['--tree-guide-opacity' as string]: a.indentGuideOpacity,\n };\n}\n\nconst RADIUS_CLASS: Record<TreeRadius, string> = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n};\nexport function radiusClass(a: ResolvedAppearance) {\n return RADIUS_CLASS[a.radius];\n}\n\n/**\n * VSCode-style row state classes.\n *\n * - hover: subtle neutral wash\n * - focused (keyboard nav, not yet selected): slightly stronger neutral\n * - selected (tree NOT focused): muted neutral block\n * - selected + tree focused-within: primary-tinted block + colored text\n *\n * Intensity scales with `appearance.accent`.\n */\nconst HOVER: Record<TreeAccentIntensity, string> = {\n subtle: 'hover:bg-foreground/[.03]',\n default: 'hover:bg-foreground/[.06]',\n strong: 'hover:bg-foreground/[.09]',\n};\nconst FOCUSED_NOT_SELECTED: Record<TreeAccentIntensity, string> = {\n subtle: 'data-[focused=true]:bg-foreground/[.05]',\n default: 'data-[focused=true]:bg-foreground/[.08]',\n strong: 'data-[focused=true]:bg-foreground/[.12]',\n};\nconst SELECTED_INACTIVE: Record<TreeAccentIntensity, string> = {\n subtle: 'data-[selected=true]:bg-foreground/[.06]',\n default: 'data-[selected=true]:bg-foreground/[.10]',\n strong: 'data-[selected=true]:bg-foreground/[.14]',\n};\nconst SELECTED_ACTIVE: Record<TreeAccentIntensity, string> = {\n subtle:\n 'data-[selected=true]:group-focus-within/tree:bg-primary/10 data-[selected=true]:group-focus-within/tree:text-primary',\n default:\n 'data-[selected=true]:group-focus-within/tree:bg-primary/15 data-[selected=true]:group-focus-within/tree:text-primary',\n strong:\n 'data-[selected=true]:group-focus-within/tree:bg-primary/25 data-[selected=true]:group-focus-within/tree:text-primary',\n};\n\nexport function rowStateClasses(a: ResolvedAppearance) {\n return [\n HOVER[a.accent],\n FOCUSED_NOT_SELECTED[a.accent],\n SELECTED_INACTIVE[a.accent],\n SELECTED_ACTIVE[a.accent],\n ].join(' ');\n}\n","'use client';\n\nimport * as React from 'react';\nimport {\n createContext,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n} from 'react';\n\nimport {\n DEFAULT_TREE_LABELS,\n type FlatRow,\n type TreeContextMenuSlot,\n type TreeItemId,\n type TreeLabels,\n type TreeLoadChildren,\n type TreeNode,\n type TreeActivateOptions,\n type TreeActivationMode,\n type TreeRootProps,\n type TreeRowSlot,\n type TreeSelectionMode,\n} from '../types';\nimport {\n createChildCache,\n type ChildCache,\n type ChildEntry,\n} from '../data/childCache';\nimport { flattenTree } from '../data/flatten';\nimport { loadTreeState, saveTreeState } from '../data/persist';\nimport {\n resolveAppearance,\n type ResolvedAppearance,\n type TreeAppearance,\n} from '../data/appearance';\n\n// =====================================================================\n// Reducer\n// =====================================================================\n\ninterface State<T> {\n expanded: Set<TreeItemId>;\n selected: Set<TreeItemId>;\n focused: TreeItemId | null;\n query: string;\n /** Bumped on every cache mutation so memos see a fresh dep. */\n cacheTick: number;\n}\n\ntype Action<T> =\n | { type: 'expand'; id: TreeItemId }\n | { type: 'collapse'; id: TreeItemId }\n | { type: 'toggle'; id: TreeItemId }\n | { type: 'set-expanded'; ids: TreeItemId[] }\n | { type: 'select'; id: TreeItemId; mode: TreeSelectionMode }\n | { type: 'select-many'; ids: TreeItemId[] }\n | { type: 'clear-selection' }\n | { type: 'focus'; id: TreeItemId | null }\n | { type: 'set-query'; q: string }\n | { type: 'cache-tick' };\n\nconst reducer = <T,>(state: State<T>, action: Action<T>): State<T> => {\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 { ...state, selected: new Set([action.id]), focused: action.id };\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, 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() };\n case 'focus':\n return { ...state, focused: action.id };\n case 'set-query':\n return { ...state, query: action.q };\n case 'cache-tick':\n return { ...state, cacheTick: state.cacheTick + 1 };\n default:\n return state;\n }\n};\n\n// =====================================================================\n// Context value\n// =====================================================================\n\nexport interface TreeContextValue<T> {\n // State\n expanded: ReadonlySet<TreeItemId>;\n selected: ReadonlySet<TreeItemId>;\n focused: TreeItemId | null;\n query: string;\n\n // Flattened render rows (visible items only)\n flatRows: FlatRow<T>[];\n /** Search-matching node ids (subset of all flatRows). */\n matchingIds: ReadonlySet<TreeItemId>;\n\n // Imperative actions\n expand: (id: TreeItemId) => void;\n collapse: (id: TreeItemId) => void;\n toggle: (id: TreeItemId) => void;\n expandAll: () => void;\n collapseAll: () => void;\n select: (id: TreeItemId) => void;\n setSelectedIds: (ids: TreeItemId[]) => void;\n clearSelection: () => void;\n setFocus: (id: TreeItemId | null) => void;\n setQuery: (q: string) => void;\n refresh: (id: TreeItemId) => Promise<void>;\n refreshAll: () => Promise<void>;\n activate: (node: TreeNode<T>, opts?: TreeActivateOptions) => void;\n\n // Config / slots\n labels: TreeLabels;\n /** Resolved cosmetic config — never null. */\n appearance: ResolvedAppearance;\n /** Convenience alias for `appearance.indent`. */\n indent: number;\n selectionMode: TreeSelectionMode;\n activationMode: TreeActivationMode;\n enableSearch: boolean;\n showIndentGuides: boolean;\n getItemName: (node: TreeNode<T>) => string;\n\n renderIcon?: TreeRowSlot<T>;\n renderLabel?: TreeRowSlot<T>;\n renderActions?: TreeRowSlot<T>;\n renderContextMenu?: TreeContextMenuSlot<T>;\n}\n\nconst 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\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 | 'labels'\n | 'persistKey'\n | 'persistSelection'\n > {\n children: React.ReactNode;\n}\n\nconst setEqualsArr = (set: ReadonlySet<string>, arr: readonly string[]) => {\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\nconst collectAllIds = <T,>(\n roots: TreeNode<T>[],\n cache: ChildCache<T>,\n out: TreeItemId[],\n) => {\n for (const node of roots) {\n if (Array.isArray(node.children)) {\n out.push(node.id);\n collectAllIds(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) collectAllIds(entry.children, cache, out);\n }\n }\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 labels: labelsOverride,\n persistKey,\n persistSelection = false,\n children,\n } = props;\n\n const labels = useMemo(\n () => ({ ...DEFAULT_TREE_LABELS, ...labelsOverride }),\n [labelsOverride],\n );\n\n const resolvedAppearance = useMemo(\n () => resolveAppearance(appearance, indent),\n [appearance, indent],\n );\n\n // Persisted state, loaded once.\n const persisted = useMemo(\n () => (persistKey ? loadTreeState(persistKey) : null),\n [persistKey],\n );\n\n const [state, dispatch] = useReducer(reducer<T>, undefined, () => ({\n expanded: new Set(persisted?.expandedItems ?? initialExpandedIds ?? []),\n selected: new Set(\n (persistSelection ? persisted?.selectedItems : undefined) ??\n initialSelectedIds ??\n [],\n ),\n focused: null,\n query: '',\n cacheTick: 0,\n }));\n\n // Async cache survives provider re-renders, lives in a ref.\n const cacheRef = useRef<ChildCache<T>>(createChildCache<T>());\n const inflightRef = useRef<Map<TreeItemId, Promise<void>>>(new Map());\n\n // Trigger one fetch per (folder id) — concurrent expansions are deduped.\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 dispatch({ type: 'cache-tick' });\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 dispatch({ type: 'cache-tick' });\n }\n })();\n\n inflightRef.current.set(node.id, promise);\n return promise;\n },\n [loadChildren],\n );\n\n // Build a quick id → node map for any visible node (incl. cached children).\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, state.cacheTick]);\n\n // On expand, kick async fetch (no-op if already cached or has inline children).\n useEffect(() => {\n if (!loadChildren) return;\n for (const id of state.expanded) {\n const node = nodeById.get(id);\n if (!node) continue;\n void fetchChildren(node);\n }\n }, [loadChildren, state.expanded, state.cacheTick, nodeById, fetchChildren]);\n\n // Flatten on relevant changes.\n const flatRows = useMemo(\n () =>\n flattenTree<T>({\n roots: data,\n expandedIds: state.expanded,\n cache: cacheRef.current,\n filterNode,\n }),\n [data, state.expanded, state.cacheTick, filterNode],\n );\n\n // Search matches (case-insensitive substring on getItemName).\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 // External callbacks via stable refs.\n const onSelectionChangeRef = useRef(onSelectionChange);\n const onExpansionChangeRef = useRef(onExpansionChange);\n const onActivateRef = useRef(onActivate);\n onSelectionChangeRef.current = onSelectionChange;\n onExpansionChangeRef.current = onExpansionChange;\n onActivateRef.current = onActivate;\n\n // Notify on changes + persist.\n const lastSelectedArrRef = useRef<TreeItemId[]>([...state.selected]);\n const lastExpandedArrRef = useRef<TreeItemId[]>([...state.expanded]);\n\n useEffect(() => {\n const arr = [...state.expanded];\n if (!setEqualsArr(state.expanded, lastExpandedArrRef.current)) {\n lastExpandedArrRef.current = arr;\n onExpansionChangeRef.current?.(arr);\n if (persistKey) {\n saveTreeState(persistKey, {\n expandedItems: arr,\n selectedItems: persistSelection ? [...state.selected] : [],\n });\n }\n }\n }, [state.expanded, persistKey, persistSelection, state.selected]);\n\n useEffect(() => {\n const arr = [...state.selected];\n if (!setEqualsArr(state.selected, lastSelectedArrRef.current)) {\n lastSelectedArrRef.current = arr;\n onSelectionChangeRef.current?.(arr);\n if (persistKey && persistSelection) {\n saveTreeState(persistKey, {\n expandedItems: [...state.expanded],\n selectedItems: arr,\n });\n }\n }\n }, [state.selected, persistKey, persistSelection, state.expanded]);\n\n // Imperative actions.\n const expand = useCallback((id: TreeItemId) => dispatch({ type: 'expand', id }), []);\n const collapse = useCallback((id: TreeItemId) => dispatch({ type: 'collapse', id }), []);\n const toggle = useCallback((id: TreeItemId) => dispatch({ type: 'toggle', id }), []);\n\n const expandAll = useCallback(() => {\n const ids: TreeItemId[] = [];\n collectAllIds(data, cacheRef.current, ids);\n dispatch({ type: 'set-expanded', ids });\n }, [data]);\n\n const collapseAll = useCallback(\n () => dispatch({ type: 'set-expanded', ids: [] }),\n [],\n );\n\n const select = useCallback(\n (id: TreeItemId) => dispatch({ type: 'select', id, mode: selectionMode }),\n [selectionMode],\n );\n const setSelectedIds = useCallback(\n (ids: TreeItemId[]) => dispatch({ type: 'select-many', ids }),\n [],\n );\n const clearSelection = useCallback(() => dispatch({ type: 'clear-selection' }), []);\n const setFocus = useCallback(\n (id: TreeItemId | null) => dispatch({ type: 'focus', id }),\n [],\n );\n const setQuery = useCallback((q: string) => dispatch({ type: 'set-query', q }), []);\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 dispatch({ type: 'cache-tick' });\n await fetchChildren(node);\n },\n [nodeById, loadChildren, fetchChildren],\n );\n\n const refreshAll = useCallback(async () => {\n cacheRef.current.clear();\n dispatch({ type: 'cache-tick' });\n if (!loadChildren) return;\n await Promise.all(\n [...state.expanded].map((id) => {\n const node = nodeById.get(id);\n return node ? fetchChildren(node) : undefined;\n }),\n );\n }, [loadChildren, state.expanded, nodeById, fetchChildren]);\n\n const activate = useCallback(\n (node: TreeNode<T>, opts: TreeActivateOptions = { preview: false }) =>\n onActivateRef.current?.(node, opts),\n [],\n );\n\n const value = useMemo<TreeContextValue<T>>(\n () => ({\n expanded: state.expanded,\n selected: state.selected,\n focused: state.focused,\n query: state.query,\n flatRows,\n matchingIds,\n expand,\n collapse,\n toggle,\n expandAll,\n collapseAll,\n select,\n setSelectedIds,\n clearSelection,\n setFocus,\n setQuery,\n refresh,\n refreshAll,\n activate,\n labels,\n appearance: resolvedAppearance,\n indent: resolvedAppearance.indent,\n selectionMode,\n activationMode,\n enableSearch,\n showIndentGuides,\n getItemName,\n renderIcon,\n renderLabel,\n renderActions,\n renderContextMenu,\n }),\n [\n state.expanded,\n state.selected,\n state.focused,\n state.query,\n flatRows,\n matchingIds,\n expand,\n collapse,\n toggle,\n expandAll,\n collapseAll,\n select,\n setSelectedIds,\n clearSelection,\n setFocus,\n setQuery,\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 renderContextMenu,\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 };\n","'use client';\n\nimport { ChevronDown, ChevronRight } from 'lucide-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\nexport function TreeChevron({ 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","'use client';\n\nimport { File, Folder, FolderOpen } from 'lucide-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\nexport function TreeIcon({ 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","'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 { cn } from '@djangocfg/ui-core/lib';\n\nexport interface TreeLabelProps {\n children: React.ReactNode;\n isMatchingSearch?: boolean;\n className?: string;\n}\n\nexport function TreeLabel({ children, isMatchingSearch, className }: TreeLabelProps) {\n return (\n <span\n style={{ fontSize: 'var(--tree-font-size)' }}\n className={cn(\n 'truncate leading-tight tracking-[-0.005em]',\n isMatchingSearch && 'font-medium text-foreground',\n className,\n )}\n >\n {children}\n </span>\n );\n}\n","'use client';\n\nimport { Loader2 } from 'lucide-react';\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 { TreeIcon } from './TreeIcon';\nimport { TreeIndentGuides } from './TreeIndentGuides';\nimport { TreeLabel } from './TreeLabel';\n\nexport interface TreeRowProps<T> {\n row: FlatRow<T>;\n className?: string;\n}\n\nexport function TreeRow<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 toggle,\n setFocus,\n activate,\n getItemName,\n renderIcon,\n renderLabel,\n renderActions,\n renderContextMenu,\n } = ctx;\n\n const { node, level, isFolder, isExpanded, isLoading } = row;\n const isSelected = selected.has(node.id);\n const isFocused = focused === node.id;\n const isMatchingSearch = matchingIds.has(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 handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (node.disabled) return;\n setFocus(node.id);\n select(node.id);\n if (isFolder) {\n toggle(node.id);\n } else if (activationMode === 'single-click') {\n activate(node, { preview: false });\n } else if (activationMode === 'single-click-preview') {\n activate(node, { preview: true });\n }\n e.currentTarget.scrollIntoView?.({ block: 'nearest' });\n };\n\n const handleDoubleClick = () => {\n if (node.disabled) return;\n if (isFolder) return;\n activate(node, { preview: false });\n };\n\n const trigger = (\n <div\n role=\"treeitem\"\n aria-level={level + 1}\n aria-expanded={isFolder ? isExpanded : undefined}\n aria-selected={isSelected || undefined}\n aria-current={isSelected ? 'true' : undefined}\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-focused={isFocused && !isSelected ? 'true' : undefined}\n data-folder={isFolder || undefined}\n data-expanded={isExpanded || undefined}\n tabIndex={isFocused ? 0 : -1}\n style={{\n paddingLeft: 6 + level * appearance.indent,\n height: 'var(--tree-row-height)',\n gap: 'var(--tree-gap)',\n }}\n onClick={handleClick}\n onDoubleClick={handleDoubleClick}\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 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 {showIndentGuides && level > 0 ? (\n <TreeIndentGuides level={level} indent={appearance.indent} />\n ) : null}\n\n <TreeChevron isExpanded={isExpanded} isFolder={isFolder} />\n\n {isLoading ? (\n <Loader2\n aria-hidden\n strokeWidth={appearance.iconStrokeWidth}\n style={{ width: 'var(--tree-icon-size)', height: 'var(--tree-icon-size)' }}\n className=\"shrink-0 animate-spin text-muted-foreground/70\"\n />\n ) : renderIcon ? (\n renderIcon(slot)\n ) : (\n <TreeIcon isFolder={isFolder} isExpanded={isExpanded} />\n )}\n\n <span\n className=\"flex min-w-0 flex-1 items-center\"\n style={{ gap: 'var(--tree-gap)' }}\n >\n {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","'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\nexport function TreeContent<T>({ children, className, ariaLabel }: TreeContentProps<T>) {\n const { flatRows, labels, selected, focused, matchingIds, appearance } = useTreeContext<T>();\n\n if (flatRows.length === 0) {\n return <TreeEmpty>{labels.empty}</TreeEmpty>;\n }\n\n return (\n <div\n role=\"tree\"\n aria-label={ariaLabel ?? labels.ariaLabel}\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 { 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 select: ctx.select,\n setSelectedIds: ctx.setSelectedIds,\n clear: ctx.clearSelection,\n isSelected,\n }),\n [selectedIds, ctx.select, ctx.setSelectedIds, ctx.clearSelection, isSelected],\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 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 { useCallback, useRef } from 'react';\nimport { useHotkey } from '@djangocfg/ui-core/hooks';\n\nimport type { FlatRow, TreeItemId } from '../types';\n\nexport interface UseTreeKeyboardOptions<T> {\n rows: FlatRow<T>[];\n focusedId: TreeItemId | null;\n enabled?: boolean;\n onFocus: (id: TreeItemId) => void;\n onSelect: (id: TreeItemId) => void;\n onActivate: (id: TreeItemId) => void;\n onExpand: (id: TreeItemId) => void;\n onCollapse: (id: TreeItemId) => void;\n onClearSelection: () => void;\n}\n\nexport interface UseTreeKeyboardReturn {\n /** Attach to the tree container. Hotkeys only fire when focus is inside. */\n ref: (instance: HTMLElement | null) => void;\n}\n\n/**\n * Standard tree keyboard navigation, scoped to the container ref.\n *\n * - ↑ / ↓ : prev / next visible row\n * - Home / End : first / last visible row\n * - → : expand folder; if already expanded, jump to first child\n * - ← : collapse folder; if already collapsed (or leaf), jump to parent\n * - Enter / Space : activate (folder => toggle, leaf => onActivate)\n * - Esc : clear selection\n *\n * Built on `useHotkey` (react-hotkeys-hook) — focus gating is automatic; no\n * manual `addEventListener` or `data-scope` juggling.\n */\nexport function useTreeKeyboard<T>({\n rows,\n focusedId,\n enabled = true,\n onFocus,\n onSelect,\n onActivate,\n onExpand,\n onCollapse,\n onClearSelection,\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 = () => {\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 const refDown = useHotkey(\n 'down',\n () => {\n const { rows: r, idx } = getCurrent();\n if (r.length === 0) return;\n const next = r[Math.min(idx + 1, r.length - 1)] ?? r[0];\n onFocus(next.node.id);\n },\n { enabled, preventDefault: true, description: 'Next row' },\n );\n\n const refUp = useHotkey(\n 'up',\n () => {\n const { rows: r, idx } = getCurrent();\n if (r.length === 0) return;\n const prev = r[Math.max(idx - 1, 0)] ?? r[0];\n onFocus(prev.node.id);\n },\n { enabled, preventDefault: true, description: 'Previous row' },\n );\n\n const refHome = useHotkey(\n 'home',\n () => {\n const { rows: r } = getCurrent();\n if (r.length === 0) return;\n onFocus(r[0].node.id);\n },\n { enabled, preventDefault: true, description: 'First row' },\n );\n\n const refEnd = useHotkey(\n 'end',\n () => {\n const { rows: r } = getCurrent();\n if (r.length === 0) return;\n onFocus(r[r.length - 1].node.id);\n },\n { enabled, preventDefault: true, description: 'Last row' },\n );\n\n const refRight = useHotkey(\n 'right',\n () => {\n const { rows: r, idx, current } = getCurrent();\n if (!current) return;\n if (current.isFolder && !current.isExpanded) {\n onExpand(current.node.id);\n } else if (current.isFolder && current.isExpanded) {\n const next = r[idx + 1];\n if (next) onFocus(next.node.id);\n }\n },\n { enabled, preventDefault: true, description: 'Expand / first child' },\n );\n\n const refLeft = useHotkey(\n 'left',\n () => {\n const { current } = getCurrent();\n if (!current) return;\n if (current.isFolder && current.isExpanded) {\n onCollapse(current.node.id);\n } else if (current.parentId) {\n onFocus(current.parentId);\n }\n },\n { enabled, preventDefault: true, description: 'Collapse / parent' },\n );\n\n const refActivate = useHotkey(\n ['enter', 'space'],\n () => {\n const { current } = getCurrent();\n if (!current) return;\n onSelect(current.node.id);\n if (current.isFolder) {\n if (current.isExpanded) onCollapse(current.node.id);\n else onExpand(current.node.id);\n } else {\n onActivate(current.node.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 },\n [refDown, refUp, refHome, refEnd, refRight, refLeft, refActivate, refEscape],\n );\n\n return { ref };\n}\n","'use client';\n\nimport { useEffect, useRef } from 'react';\n\nimport type { FlatRow, TreeNode } from '../types';\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 const tag = (e.target as HTMLElement | null)?.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA') return;\n if ((e.target as HTMLElement | null)?.isContentEditable) return;\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n\n if (\n e.key === 'Escape' ||\n e.key === 'Enter' ||\n e.key === 'Tab' ||\n e.key.startsWith('Arrow') ||\n e.key === 'Home' ||\n e.key === 'End' ||\n e.key === 'PageUp' ||\n e.key === 'PageDown'\n ) {\n reset();\n return;\n }\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 prefix = bufferRef.current;\n const hit = rowsRef.current.find((row) =>\n getNameRef.current(row.node).toLowerCase().startsWith(prefix),\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 { useCallback, useRef } from 'react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { TreeProvider, useTreeContext } from './context/TreeContext';\nimport { TreeContent } from './components/TreeContent';\nimport { TreeSearchInput } from './components/TreeSearchInput';\nimport { appearanceToStyle } from './data/appearance';\nimport { useTreeKeyboard } from './hooks/useTreeKeyboard';\nimport { useTreeTypeAhead } from './hooks/useTreeTypeAhead';\nimport type { 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 renderRow,\n renderIcon,\n renderLabel,\n renderActions,\n renderContextMenu,\n labels,\n persistKey,\n persistSelection = false,\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 renderContextMenu={renderContextMenu}\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 renderRow={renderRow}\n />\n </TreeProvider>\n );\n}\n\ninterface TreeRootShellProps<T> {\n className?: string;\n style?: React.CSSProperties;\n enableSearch: boolean;\n enableTypeAhead: boolean;\n renderRow?: TreeRootProps<T>['renderRow'];\n}\n\nfunction TreeRootShell<T>({\n className,\n style,\n enableSearch,\n enableTypeAhead,\n renderRow,\n}: TreeRootShellProps<T>) {\n const containerRef = useRef<HTMLDivElement>(null);\n const ctx = useTreeContext<T>();\n\n // Keyboard navigation (↑↓ ←→ Home/End Enter Esc) — scoped via callback ref.\n const { ref: keyboardRef } = useTreeKeyboard<T>({\n rows: ctx.flatRows,\n focusedId: ctx.focused,\n onFocus: ctx.setFocus,\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 });\n\n const setContainerRef = useCallback(\n (instance: HTMLDivElement | null) => {\n containerRef.current = instance;\n keyboardRef(instance);\n },\n [keyboardRef],\n );\n\n // Type-ahead jump.\n const onTypeAheadMatch = useCallback(\n (id: string) => {\n ctx.setFocus(id);\n // Scroll the row into view if it has rendered.\n const el = containerRef.current?.querySelector<HTMLElement>(\n `[data-tree-row][data-id=\"${CSS.escape(id)}\"]`,\n );\n el?.scrollIntoView({ block: 'nearest' });\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 return (\n <div\n ref={setContainerRef}\n tabIndex={0}\n className={cn(\n 'group/tree flex h-full w-full flex-col gap-2 outline-none',\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=\"min-h-0 flex-1 overflow-auto px-1\">\n <TreeContent<T>>{renderRow}</TreeContent>\n </div>\n </div>\n );\n}\n\nexport default TreeRoot;\nexport { TreeRoot };\n"]}
|
|
@@ -35,10 +35,16 @@ var isNodeFolder = /* @__PURE__ */ __name((node) => {
|
|
|
35
35
|
if (typeof node.isFolder === "boolean") return node.isFolder;
|
|
36
36
|
return Array.isArray(node.children);
|
|
37
37
|
}, "isNodeFolder");
|
|
38
|
-
function flattenTree({
|
|
38
|
+
function flattenTree({
|
|
39
|
+
roots,
|
|
40
|
+
expandedIds,
|
|
41
|
+
cache,
|
|
42
|
+
filterNode
|
|
43
|
+
}) {
|
|
39
44
|
const out = [];
|
|
40
45
|
const walk = /* @__PURE__ */ __name((nodes, level, parentId) => {
|
|
41
46
|
for (const node of nodes) {
|
|
47
|
+
if (filterNode && !filterNode(node)) continue;
|
|
42
48
|
const isFolder = isNodeFolder(node);
|
|
43
49
|
const isExpanded = expandedIds.has(node.id);
|
|
44
50
|
const resolved = isFolder ? resolveChildren(cache, node) : { children: [], status: "loaded" };
|
|
@@ -273,6 +279,7 @@ function TreeProvider(props) {
|
|
|
273
279
|
getItemName,
|
|
274
280
|
loadChildren,
|
|
275
281
|
selectionMode = "single",
|
|
282
|
+
activationMode = "single-click",
|
|
276
283
|
initialExpandedIds,
|
|
277
284
|
initialSelectedIds,
|
|
278
285
|
indent,
|
|
@@ -280,6 +287,7 @@ function TreeProvider(props) {
|
|
|
280
287
|
onSelectionChange,
|
|
281
288
|
onExpansionChange,
|
|
282
289
|
onActivate,
|
|
290
|
+
filterNode,
|
|
283
291
|
enableSearch = false,
|
|
284
292
|
showIndentGuides = false,
|
|
285
293
|
renderIcon,
|
|
@@ -371,9 +379,10 @@ function TreeProvider(props) {
|
|
|
371
379
|
() => flattenTree({
|
|
372
380
|
roots: data,
|
|
373
381
|
expandedIds: state.expanded,
|
|
374
|
-
cache: cacheRef.current
|
|
382
|
+
cache: cacheRef.current,
|
|
383
|
+
filterNode
|
|
375
384
|
}),
|
|
376
|
-
[data, state.expanded, state.cacheTick]
|
|
385
|
+
[data, state.expanded, state.cacheTick, filterNode]
|
|
377
386
|
);
|
|
378
387
|
const matchingIds = useMemo(() => {
|
|
379
388
|
const set = /* @__PURE__ */ new Set();
|
|
@@ -468,7 +477,7 @@ function TreeProvider(props) {
|
|
|
468
477
|
);
|
|
469
478
|
}, [loadChildren, state.expanded, nodeById, fetchChildren]);
|
|
470
479
|
const activate = useCallback(
|
|
471
|
-
(node) => onActivateRef.current?.(node),
|
|
480
|
+
(node, opts = { preview: false }) => onActivateRef.current?.(node, opts),
|
|
472
481
|
[]
|
|
473
482
|
);
|
|
474
483
|
const value = useMemo(
|
|
@@ -496,6 +505,7 @@ function TreeProvider(props) {
|
|
|
496
505
|
appearance: resolvedAppearance,
|
|
497
506
|
indent: resolvedAppearance.indent,
|
|
498
507
|
selectionMode,
|
|
508
|
+
activationMode,
|
|
499
509
|
enableSearch,
|
|
500
510
|
showIndentGuides,
|
|
501
511
|
getItemName,
|
|
@@ -527,6 +537,7 @@ function TreeProvider(props) {
|
|
|
527
537
|
labels,
|
|
528
538
|
resolvedAppearance,
|
|
529
539
|
selectionMode,
|
|
540
|
+
activationMode,
|
|
530
541
|
enableSearch,
|
|
531
542
|
showIndentGuides,
|
|
532
543
|
getItemName,
|
|
@@ -625,6 +636,7 @@ function TreeRow({ row, className }) {
|
|
|
625
636
|
const ctx = useTreeContext();
|
|
626
637
|
const {
|
|
627
638
|
appearance,
|
|
639
|
+
activationMode,
|
|
628
640
|
showIndentGuides,
|
|
629
641
|
selected,
|
|
630
642
|
focused,
|
|
@@ -653,20 +665,23 @@ function TreeRow({ row, className }) {
|
|
|
653
665
|
isLoading,
|
|
654
666
|
isMatchingSearch
|
|
655
667
|
};
|
|
656
|
-
const
|
|
668
|
+
const handleClick = /* @__PURE__ */ __name((e) => {
|
|
657
669
|
if (node.disabled) return;
|
|
658
670
|
setFocus(node.id);
|
|
659
671
|
select(node.id);
|
|
660
|
-
if (isFolder)
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
672
|
+
if (isFolder) {
|
|
673
|
+
toggle(node.id);
|
|
674
|
+
} else if (activationMode === "single-click") {
|
|
675
|
+
activate(node, { preview: false });
|
|
676
|
+
} else if (activationMode === "single-click-preview") {
|
|
677
|
+
activate(node, { preview: true });
|
|
678
|
+
}
|
|
665
679
|
e.currentTarget.scrollIntoView?.({ block: "nearest" });
|
|
666
680
|
}, "handleClick");
|
|
667
681
|
const handleDoubleClick = /* @__PURE__ */ __name(() => {
|
|
668
682
|
if (node.disabled) return;
|
|
669
|
-
if (
|
|
683
|
+
if (isFolder) return;
|
|
684
|
+
activate(node, { preview: false });
|
|
670
685
|
}, "handleDoubleClick");
|
|
671
686
|
const trigger = /* @__PURE__ */ jsxs(
|
|
672
687
|
"div",
|
|
@@ -679,6 +694,7 @@ function TreeRow({ row, className }) {
|
|
|
679
694
|
"aria-disabled": node.disabled || void 0,
|
|
680
695
|
"data-tree-row": "",
|
|
681
696
|
"data-id": node.id,
|
|
697
|
+
"data-activation-mode": activationMode,
|
|
682
698
|
"data-selected": isSelected ? "true" : void 0,
|
|
683
699
|
"data-focused": isFocused && !isSelected ? "true" : void 0,
|
|
684
700
|
"data-folder": isFolder || void 0,
|
|
@@ -764,7 +780,7 @@ function TreeEmpty({ children, className }) {
|
|
|
764
780
|
}
|
|
765
781
|
__name(TreeEmpty, "TreeEmpty");
|
|
766
782
|
function TreeContent({ children, className, ariaLabel }) {
|
|
767
|
-
const { flatRows, labels, selected, focused, matchingIds } = useTreeContext();
|
|
783
|
+
const { flatRows, labels, selected, focused, matchingIds, appearance } = useTreeContext();
|
|
768
784
|
if (flatRows.length === 0) {
|
|
769
785
|
return /* @__PURE__ */ jsx(TreeEmpty, { children: labels.empty });
|
|
770
786
|
}
|
|
@@ -774,6 +790,7 @@ function TreeContent({ children, className, ariaLabel }) {
|
|
|
774
790
|
role: "tree",
|
|
775
791
|
"aria-label": ariaLabel ?? labels.ariaLabel,
|
|
776
792
|
className: cn("relative flex flex-col py-1", className),
|
|
793
|
+
style: appearanceToStyle(appearance),
|
|
777
794
|
children: flatRows.map((row) => {
|
|
778
795
|
const slot = {
|
|
779
796
|
node: row.node,
|
|
@@ -1119,6 +1136,7 @@ function TreeRoot(props) {
|
|
|
1119
1136
|
getItemName,
|
|
1120
1137
|
loadChildren,
|
|
1121
1138
|
selectionMode,
|
|
1139
|
+
activationMode,
|
|
1122
1140
|
initialExpandedIds,
|
|
1123
1141
|
initialSelectedIds,
|
|
1124
1142
|
indent,
|
|
@@ -1126,6 +1144,7 @@ function TreeRoot(props) {
|
|
|
1126
1144
|
onSelectionChange,
|
|
1127
1145
|
onExpansionChange,
|
|
1128
1146
|
onActivate,
|
|
1147
|
+
filterNode,
|
|
1129
1148
|
enableSearch = false,
|
|
1130
1149
|
enableTypeAhead = true,
|
|
1131
1150
|
showIndentGuides = false,
|
|
@@ -1147,6 +1166,7 @@ function TreeRoot(props) {
|
|
|
1147
1166
|
getItemName,
|
|
1148
1167
|
loadChildren,
|
|
1149
1168
|
selectionMode,
|
|
1169
|
+
activationMode,
|
|
1150
1170
|
initialExpandedIds,
|
|
1151
1171
|
initialSelectedIds,
|
|
1152
1172
|
indent,
|
|
@@ -1154,6 +1174,7 @@ function TreeRoot(props) {
|
|
|
1154
1174
|
onSelectionChange,
|
|
1155
1175
|
onExpansionChange,
|
|
1156
1176
|
onActivate,
|
|
1177
|
+
filterNode,
|
|
1157
1178
|
enableSearch,
|
|
1158
1179
|
showIndentGuides,
|
|
1159
1180
|
renderIcon,
|
|
@@ -1193,7 +1214,7 @@ function TreeRootShell({
|
|
|
1193
1214
|
onSelect: ctx.select,
|
|
1194
1215
|
onActivate: /* @__PURE__ */ __name((id) => {
|
|
1195
1216
|
const row = ctx.flatRows.find((r) => r.node.id === id);
|
|
1196
|
-
if (row) ctx.activate(row.node);
|
|
1217
|
+
if (row) ctx.activate(row.node, { preview: false });
|
|
1197
1218
|
}, "onActivate"),
|
|
1198
1219
|
onExpand: ctx.expand,
|
|
1199
1220
|
onCollapse: ctx.collapse,
|
|
@@ -1245,5 +1266,5 @@ __name(TreeRootShell, "TreeRootShell");
|
|
|
1245
1266
|
var TreeRoot_default = TreeRoot;
|
|
1246
1267
|
|
|
1247
1268
|
export { DEFAULT_TREE_APPEARANCE, DEFAULT_TREE_LABELS, TreeChevron, TreeContent, TreeEmpty, TreeIcon, TreeIndentGuides, TreeLabel, TreeProvider, TreeRoot, TreeRoot_default, TreeRow, TreeSearchInput, appearanceToStyle, clearTreeState, createChildCache, flattenTree, loadTreeState, resolveAppearance, resolveChildren, saveTreeState, useTreeActions, useTreeContext, useTreeExpansion, useTreeFocus, useTreeKeyboard, useTreeLabels, useTreeRows, useTreeSearch, useTreeSelection, useTreeTypeAhead };
|
|
1248
|
-
//# sourceMappingURL=chunk-
|
|
1249
|
-
//# sourceMappingURL=chunk-
|
|
1269
|
+
//# sourceMappingURL=chunk-MOME6KYD.mjs.map
|
|
1270
|
+
//# sourceMappingURL=chunk-MOME6KYD.mjs.map
|