@djangocfg/ui-tools 2.1.317 → 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.
Files changed (40) hide show
  1. package/dist/TreeRoot-A3J65L6F.mjs +4 -0
  2. package/dist/{TreeRoot-R6XVHYQK.mjs.map → TreeRoot-A3J65L6F.mjs.map} +1 -1
  3. package/dist/TreeRoot-DSK5JILT.cjs +19 -0
  4. package/dist/{TreeRoot-RAMQSBMO.cjs.map → TreeRoot-DSK5JILT.cjs.map} +1 -1
  5. package/dist/{chunk-44ZTWYAF.cjs → chunk-3Z3A7FHA.cjs} +17 -6
  6. package/dist/chunk-3Z3A7FHA.cjs.map +1 -0
  7. package/dist/{chunk-NTJL2SXK.mjs → chunk-MOME6KYD.mjs} +17 -6
  8. package/dist/chunk-MOME6KYD.mjs.map +1 -0
  9. package/dist/file-icon/index.cjs +59 -3
  10. package/dist/file-icon/index.cjs.map +1 -1
  11. package/dist/file-icon/index.d.cts +33 -4
  12. package/dist/file-icon/index.d.ts +33 -4
  13. package/dist/file-icon/index.mjs +60 -5
  14. package/dist/file-icon/index.mjs.map +1 -1
  15. package/dist/index.cjs +33 -33
  16. package/dist/index.d.cts +2 -2
  17. package/dist/index.d.ts +2 -2
  18. package/dist/index.mjs +2 -2
  19. package/dist/tree/index.cjs +33 -33
  20. package/dist/tree/index.d.cts +6 -4
  21. package/dist/tree/index.d.ts +6 -4
  22. package/dist/tree/index.mjs +1 -1
  23. package/dist/{types-Cclwv4Hl.d.cts → types-CevSbyfD.d.cts} +6 -0
  24. package/dist/{types-Cclwv4Hl.d.ts → types-CevSbyfD.d.ts} +6 -0
  25. package/package.json +6 -6
  26. package/src/tools/FileIcon/FileIcon.tsx +13 -2
  27. package/src/tools/FileIcon/index.ts +6 -0
  28. package/src/tools/FileIcon/specialFolders.ts +93 -0
  29. package/src/tools/FileIcon/treeAdapter.tsx +8 -0
  30. package/src/tools/Tree/README.md +46 -2
  31. package/src/tools/Tree/Tree.story.tsx +36 -0
  32. package/src/tools/Tree/TreeRoot.tsx +2 -0
  33. package/src/tools/Tree/components/TreeContent.tsx +3 -1
  34. package/src/tools/Tree/context/TreeContext.tsx +4 -1
  35. package/src/tools/Tree/data/flatten.ts +10 -1
  36. package/src/tools/Tree/types.ts +7 -0
  37. package/dist/TreeRoot-R6XVHYQK.mjs +0 -4
  38. package/dist/TreeRoot-RAMQSBMO.cjs +0 -19
  39. package/dist/chunk-44ZTWYAF.cjs.map +0 -1
  40. package/dist/chunk-NTJL2SXK.mjs.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { __name } from '../chunk-CGILA3WO.mjs';
2
2
  import { useState, useEffect } from 'react';
3
- import { FolderOpen, Folder, File } from 'lucide-react';
3
+ import { FolderGit2, Github, Settings, Terminal, FlaskConical, BookOpen, FolderOutput, Image, FolderInput, Package, FolderCode, FolderOpen, Folder, File } from 'lucide-react';
4
4
  import { cn } from '@djangocfg/ui-core/lib';
5
5
  import { jsx } from 'react/jsx-runtime';
6
6
 
@@ -34,11 +34,60 @@ function getMaterialIconsSync() {
34
34
  return cached ?? null;
35
35
  }
36
36
  __name(getMaterialIconsSync, "getMaterialIconsSync");
37
+ var SPECIAL_FOLDERS = {
38
+ src: FolderCode,
39
+ source: FolderCode,
40
+ lib: FolderCode,
41
+ app: FolderCode,
42
+ packages: Package,
43
+ node_modules: Package,
44
+ vendor: Package,
45
+ public: FolderInput,
46
+ static: FolderInput,
47
+ assets: Image,
48
+ images: Image,
49
+ media: Image,
50
+ dist: FolderOutput,
51
+ build: FolderOutput,
52
+ out: FolderOutput,
53
+ ".next": FolderOutput,
54
+ ".nuxt": FolderOutput,
55
+ ".turbo": FolderOutput,
56
+ docs: BookOpen,
57
+ documentation: BookOpen,
58
+ tests: FlaskConical,
59
+ test: FlaskConical,
60
+ __tests__: FlaskConical,
61
+ __test__: FlaskConical,
62
+ scripts: Terminal,
63
+ bin: Terminal,
64
+ config: Settings,
65
+ configs: Settings,
66
+ ".config": Settings,
67
+ ".vscode": Settings,
68
+ ".idea": Settings,
69
+ ".git": FolderGit2,
70
+ ".github": Github,
71
+ ".gitlab": FolderGit2
72
+ };
73
+ function resolveFolderIcon({
74
+ name,
75
+ isExpanded = false,
76
+ overrides
77
+ }) {
78
+ const key = name.trim().toLowerCase();
79
+ if (overrides?.[key]) return overrides[key];
80
+ const special = SPECIAL_FOLDERS[key];
81
+ if (special) return special;
82
+ return isExpanded ? FolderOpen : Folder;
83
+ }
84
+ __name(resolveFolderIcon, "resolveFolderIcon");
37
85
  function FileIcon({
38
86
  name,
39
87
  isFolder = false,
40
88
  isExpanded = false,
41
89
  size = 16,
90
+ folderOverrides,
42
91
  className
43
92
  }) {
44
93
  const [svg, setSvg] = useState(() => {
@@ -61,7 +110,11 @@ function FileIcon({
61
110
  };
62
111
  }, [isFolder, name]);
63
112
  if (isFolder) {
64
- const Icon = isExpanded ? FolderOpen : Folder;
113
+ const Icon = resolveFolderIcon({
114
+ name,
115
+ isExpanded,
116
+ overrides: folderOverrides
117
+ });
65
118
  return /* @__PURE__ */ jsx(
66
119
  Icon,
67
120
  {
@@ -93,7 +146,8 @@ function FileIcon({
93
146
  __name(FileIcon, "FileIcon");
94
147
  function createFileIconSlot({
95
148
  getName,
96
- size = 16
149
+ size = 16,
150
+ folderOverrides
97
151
  }) {
98
152
  return ({ node, isFolder, isExpanded }) => /* @__PURE__ */ jsx(
99
153
  FileIcon,
@@ -101,12 +155,13 @@ function createFileIconSlot({
101
155
  name: getName(node),
102
156
  isFolder,
103
157
  isExpanded,
104
- size
158
+ size,
159
+ folderOverrides
105
160
  }
106
161
  );
107
162
  }
108
163
  __name(createFileIconSlot, "createFileIconSlot");
109
164
 
110
- export { FileIcon, createFileIconSlot, getMaterialIconsSync, loadMaterialIcons };
165
+ export { FileIcon, createFileIconSlot, getMaterialIconsSync, loadMaterialIcons, resolveFolderIcon };
111
166
  //# sourceMappingURL=index.mjs.map
112
167
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/tools/FileIcon/loader.ts","../../src/tools/FileIcon/FileIcon.tsx","../../src/tools/FileIcon/treeAdapter.tsx"],"names":["FileFallback","jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["'use client';\n\n/**\n * Lazy loader for `material-file-icons`. The package is an optional dependency:\n * if it's installed in the consumer's tree, we render its rich VSCode-style\n * SVGs; if not, the loader resolves to `null` and `<FileIcon>` falls back to a\n * Lucide icon. Either way, ui-tools never throws or warns about a missing\n * package.\n *\n * Resolution is cached per-process so we don't re-import on every render.\n */\n\ntype GetIconFn = (name: string) => { svg: string } | undefined;\n\nlet cached: GetIconFn | null | undefined;\nlet inflight: Promise<GetIconFn | null> | null = null;\n\nexport async function loadMaterialIcons(): Promise<GetIconFn | null> {\n if (cached !== undefined) return cached;\n if (inflight) return inflight;\n\n inflight = (async () => {\n try {\n // Computed specifier so bundlers don't try to eagerly resolve it.\n const specifier = 'material-file-icons';\n const mod = (await import(/* @vite-ignore */ specifier)) as {\n getIcon?: GetIconFn;\n default?: { getIcon?: GetIconFn };\n };\n const fn = mod.getIcon ?? mod.default?.getIcon ?? null;\n cached = fn;\n return fn;\n } catch {\n cached = null;\n return null;\n } finally {\n inflight = null;\n }\n })();\n\n return inflight;\n}\n\n/** Synchronous accessor — returns null until `loadMaterialIcons` resolves. */\nexport function getMaterialIconsSync(): GetIconFn | null {\n return cached ?? null;\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport { File as FileFallback, Folder, FolderOpen } from 'lucide-react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { getMaterialIconsSync, loadMaterialIcons } from './loader';\n\nexport type FileIconSize = 12 | 14 | 16 | 18 | 20 | 24 | 28 | 32 | 40 | 48 | 64;\n\nexport interface FileIconProps {\n /** File name (with extension) or folder name. */\n name: string;\n /** Render a folder icon instead of a file icon. */\n isFolder?: boolean;\n /** Folder open / closed state. Ignored when `isFolder` is false. */\n isExpanded?: boolean;\n /** Pixel size of the icon. */\n size?: FileIconSize;\n className?: string;\n}\n\n/**\n * VSCode-style file icon.\n *\n * - Folders render Lucide `Folder` / `FolderOpen` (amber tint).\n * - Files use `material-file-icons` if it's installed in the consumer; otherwise\n * fall back to a neutral Lucide `File` icon.\n *\n * The optional dependency is loaded lazily on first render — there is zero\n * bundle cost for consumers who never mount this component.\n */\nexport function FileIcon({\n name,\n isFolder = false,\n isExpanded = false,\n size = 16,\n className,\n}: FileIconProps) {\n const [svg, setSvg] = useState<string | null>(() => {\n if (isFolder) return null;\n const fn = getMaterialIconsSync();\n return fn ? (fn(name)?.svg ?? null) : null;\n });\n\n useEffect(() => {\n if (isFolder) {\n setSvg(null);\n return;\n }\n let cancelled = false;\n void loadMaterialIcons().then((fn) => {\n if (cancelled) return;\n setSvg(fn ? (fn(name)?.svg ?? null) : null);\n });\n return () => {\n cancelled = true;\n };\n }, [isFolder, name]);\n\n if (isFolder) {\n const Icon = isExpanded ? FolderOpen : Folder;\n return (\n <Icon\n className={cn('shrink-0 text-amber-500', className)}\n style={{ width: size, height: size }}\n />\n );\n }\n\n if (!svg) {\n return (\n <FileFallback\n className={cn('shrink-0 text-muted-foreground/80', className)}\n style={{ width: size, height: size }}\n />\n );\n }\n\n return (\n <span\n role=\"img\"\n aria-hidden\n className={cn('inline-block shrink-0', className)}\n style={{ width: size, height: size }}\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n );\n}\n\nexport default FileIcon;\n","'use client';\n\nimport type { TreeNode, TreeRowSlot } from '../Tree/types';\nimport { FileIcon, type FileIconSize } from './FileIcon';\n\nexport interface CreateFileIconSlotOptions<T> {\n /**\n * How to read the displayed name (with extension) for a node. Use the same\n * accessor you pass to `<TreeRoot getItemName={...} />`.\n */\n getName: (node: TreeNode<T>) => string;\n /** Pixel size for both file and folder icons. Default: 16. */\n size?: FileIconSize;\n}\n\n/**\n * Build a `renderIcon` slot for `<TreeRoot>` that uses `<FileIcon>` for both\n * leaves and folders.\n *\n * @example\n * ```tsx\n * <TreeRoot\n * data={data}\n * getItemName={(n) => n.data.name}\n * renderIcon={createFileIconSlot({ getName: (n) => n.data.name })}\n * />\n * ```\n */\nexport function createFileIconSlot<T>({\n getName,\n size = 16,\n}: CreateFileIconSlotOptions<T>): TreeRowSlot<T> {\n return ({ node, isFolder, isExpanded }) => (\n <FileIcon\n name={getName(node)}\n isFolder={isFolder}\n isExpanded={isExpanded}\n size={size}\n />\n );\n}\n"]}
1
+ {"version":3,"sources":["../../src/tools/FileIcon/loader.ts","../../src/tools/FileIcon/specialFolders.ts","../../src/tools/FileIcon/FileIcon.tsx","../../src/tools/FileIcon/treeAdapter.tsx"],"names":["ImageIcon","FileFallback","jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["'use client';\n\n/**\n * Lazy loader for `material-file-icons`. The package is an optional dependency:\n * if it's installed in the consumer's tree, we render its rich VSCode-style\n * SVGs; if not, the loader resolves to `null` and `<FileIcon>` falls back to a\n * Lucide icon. Either way, ui-tools never throws or warns about a missing\n * package.\n *\n * Resolution is cached per-process so we don't re-import on every render.\n */\n\ntype GetIconFn = (name: string) => { svg: string } | undefined;\n\nlet cached: GetIconFn | null | undefined;\nlet inflight: Promise<GetIconFn | null> | null = null;\n\nexport async function loadMaterialIcons(): Promise<GetIconFn | null> {\n if (cached !== undefined) return cached;\n if (inflight) return inflight;\n\n inflight = (async () => {\n try {\n // Computed specifier so bundlers don't try to eagerly resolve it.\n const specifier = 'material-file-icons';\n const mod = (await import(/* @vite-ignore */ specifier)) as {\n getIcon?: GetIconFn;\n default?: { getIcon?: GetIconFn };\n };\n const fn = mod.getIcon ?? mod.default?.getIcon ?? null;\n cached = fn;\n return fn;\n } catch {\n cached = null;\n return null;\n } finally {\n inflight = null;\n }\n })();\n\n return inflight;\n}\n\n/** Synchronous accessor — returns null until `loadMaterialIcons` resolves. */\nexport function getMaterialIconsSync(): GetIconFn | null {\n return cached ?? null;\n}\n","'use client';\n\nimport {\n BookOpen,\n FlaskConical,\n Folder,\n FolderCode,\n FolderGit2,\n FolderInput,\n FolderOpen,\n FolderOutput,\n Github,\n Image as ImageIcon,\n Package,\n Settings,\n Terminal,\n type LucideIcon,\n} from 'lucide-react';\n\n/**\n * Conventional folder names → Lucide icon. Lookup is case-insensitive and\n * trimmed. Anything not in this map falls back to a generic folder icon.\n *\n * Designed to feel \"right\" across the common dev project layouts (Node,\n * Python, Go, Rust, Django, Next, Vite). Not exhaustive on purpose —\n * keeps the bundle light and the behaviour predictable.\n */\nconst SPECIAL_FOLDERS: Record<string, LucideIcon> = {\n src: FolderCode,\n source: FolderCode,\n lib: FolderCode,\n app: FolderCode,\n packages: Package,\n node_modules: Package,\n vendor: Package,\n public: FolderInput,\n static: FolderInput,\n assets: ImageIcon,\n images: ImageIcon,\n media: ImageIcon,\n dist: FolderOutput,\n build: FolderOutput,\n out: FolderOutput,\n '.next': FolderOutput,\n '.nuxt': FolderOutput,\n '.turbo': FolderOutput,\n docs: BookOpen,\n documentation: BookOpen,\n tests: FlaskConical,\n test: FlaskConical,\n __tests__: FlaskConical,\n __test__: FlaskConical,\n scripts: Terminal,\n bin: Terminal,\n config: Settings,\n configs: Settings,\n '.config': Settings,\n '.vscode': Settings,\n '.idea': Settings,\n '.git': FolderGit2,\n '.github': Github,\n '.gitlab': FolderGit2,\n};\n\nexport interface ResolveFolderIconOptions {\n /** Folder display name (no path). */\n name: string;\n /** Open / closed state — only used for the *generic* folder fallback. */\n isExpanded?: boolean;\n /**\n * Optional override map. Wins over the built-in table. Keys are\n * matched case-insensitively after `trim()`.\n */\n overrides?: Record<string, LucideIcon>;\n}\n\n/**\n * Pick the right folder icon for `name`. Returns `Folder` / `FolderOpen`\n * for unknown names so callers can render the generic open/closed pair.\n */\nexport function resolveFolderIcon({\n name,\n isExpanded = false,\n overrides,\n}: ResolveFolderIconOptions): LucideIcon {\n const key = name.trim().toLowerCase();\n if (overrides?.[key]) return overrides[key];\n const special = SPECIAL_FOLDERS[key];\n if (special) return special;\n return isExpanded ? FolderOpen : Folder;\n}\n\nexport type FolderIconOverrides = Record<string, LucideIcon>;\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport { File as FileFallback } from 'lucide-react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { getMaterialIconsSync, loadMaterialIcons } from './loader';\nimport { resolveFolderIcon, type FolderIconOverrides } from './specialFolders';\n\nexport type FileIconSize = 12 | 14 | 16 | 18 | 20 | 24 | 28 | 32 | 40 | 48 | 64;\n\nexport interface FileIconProps {\n /** File name (with extension) or folder name. */\n name: string;\n /** Render a folder icon instead of a file icon. */\n isFolder?: boolean;\n /** Folder open / closed state. Ignored when `isFolder` is false. */\n isExpanded?: boolean;\n /** Pixel size of the icon. */\n size?: FileIconSize;\n /**\n * Override or extend the built-in special-folder mapping. Keys are\n * matched case-insensitively. Only used when `isFolder` is true.\n */\n folderOverrides?: FolderIconOverrides;\n className?: string;\n}\n\n/**\n * VSCode-style file icon.\n *\n * - Folders render Lucide `Folder` / `FolderOpen` (amber tint).\n * - Files use `material-file-icons` if it's installed in the consumer; otherwise\n * fall back to a neutral Lucide `File` icon.\n *\n * The optional dependency is loaded lazily on first render — there is zero\n * bundle cost for consumers who never mount this component.\n */\nexport function FileIcon({\n name,\n isFolder = false,\n isExpanded = false,\n size = 16,\n folderOverrides,\n className,\n}: FileIconProps) {\n const [svg, setSvg] = useState<string | null>(() => {\n if (isFolder) return null;\n const fn = getMaterialIconsSync();\n return fn ? (fn(name)?.svg ?? null) : null;\n });\n\n useEffect(() => {\n if (isFolder) {\n setSvg(null);\n return;\n }\n let cancelled = false;\n void loadMaterialIcons().then((fn) => {\n if (cancelled) return;\n setSvg(fn ? (fn(name)?.svg ?? null) : null);\n });\n return () => {\n cancelled = true;\n };\n }, [isFolder, name]);\n\n if (isFolder) {\n const Icon = resolveFolderIcon({\n name,\n isExpanded,\n overrides: folderOverrides,\n });\n return (\n <Icon\n className={cn('shrink-0 text-amber-500', className)}\n style={{ width: size, height: size }}\n />\n );\n }\n\n if (!svg) {\n return (\n <FileFallback\n className={cn('shrink-0 text-muted-foreground/80', className)}\n style={{ width: size, height: size }}\n />\n );\n }\n\n return (\n <span\n role=\"img\"\n aria-hidden\n className={cn('inline-block shrink-0', className)}\n style={{ width: size, height: size }}\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n );\n}\n\nexport default FileIcon;\n","'use client';\n\nimport type { TreeNode, TreeRowSlot } from '../Tree/types';\nimport { FileIcon, type FileIconSize } from './FileIcon';\nimport type { FolderIconOverrides } from './specialFolders';\n\nexport interface CreateFileIconSlotOptions<T> {\n /**\n * How to read the displayed name (with extension) for a node. Use the same\n * accessor you pass to `<TreeRoot getItemName={...} />`.\n */\n getName: (node: TreeNode<T>) => string;\n /** Pixel size for both file and folder icons. Default: 16. */\n size?: FileIconSize;\n /**\n * Override or extend the built-in special-folder mapping (e.g. give\n * `tests` a custom icon). Keys are matched case-insensitively.\n */\n folderOverrides?: FolderIconOverrides;\n}\n\n/**\n * Build a `renderIcon` slot for `<TreeRoot>` that uses `<FileIcon>` for both\n * leaves and folders.\n *\n * @example\n * ```tsx\n * <TreeRoot\n * data={data}\n * getItemName={(n) => n.data.name}\n * renderIcon={createFileIconSlot({ getName: (n) => n.data.name })}\n * />\n * ```\n */\nexport function createFileIconSlot<T>({\n getName,\n size = 16,\n folderOverrides,\n}: CreateFileIconSlotOptions<T>): TreeRowSlot<T> {\n return ({ node, isFolder, isExpanded }) => (\n <FileIcon\n name={getName(node)}\n isFolder={isFolder}\n isExpanded={isExpanded}\n size={size}\n folderOverrides={folderOverrides}\n />\n );\n}\n"]}
package/dist/index.cjs CHANGED
@@ -8,7 +8,7 @@ var chunkIHAY6FO6_cjs = require('./chunk-IHAY6FO6.cjs');
8
8
  var chunk77HQWEQ6_cjs = require('./chunk-77HQWEQ6.cjs');
9
9
  var chunkF2CMIIOH_cjs = require('./chunk-F2CMIIOH.cjs');
10
10
  var chunkYXBOAGIM_cjs = require('./chunk-YXBOAGIM.cjs');
11
- var chunk44ZTWYAF_cjs = require('./chunk-44ZTWYAF.cjs');
11
+ var chunk3Z3A7FHA_cjs = require('./chunk-3Z3A7FHA.cjs');
12
12
  var chunkS44PW6NK_cjs = require('./chunk-S44PW6NK.cjs');
13
13
  var chunk33AMWFBZ_cjs = require('./chunk-33AMWFBZ.cjs');
14
14
  require('./chunk-2SMCH62O.cjs');
@@ -363,7 +363,7 @@ var LazyCronScheduler = createLazyComponent(
363
363
  }
364
364
  );
365
365
  var LazyTree = createLazyComponent(
366
- () => import('./TreeRoot-RAMQSBMO.cjs'),
366
+ () => import('./TreeRoot-DSK5JILT.cjs'),
367
367
  {
368
368
  displayName: "LazyTree",
369
369
  fallback: /* @__PURE__ */ jsxRuntime.jsx(LoadingFallback, { minHeight: 200, text: "Loading tree\u2026" })
@@ -1671,127 +1671,127 @@ Object.defineProperty(exports, "createDemoTree", {
1671
1671
  });
1672
1672
  Object.defineProperty(exports, "DEFAULT_TREE_APPEARANCE", {
1673
1673
  enumerable: true,
1674
- get: function () { return chunk44ZTWYAF_cjs.DEFAULT_TREE_APPEARANCE; }
1674
+ get: function () { return chunk3Z3A7FHA_cjs.DEFAULT_TREE_APPEARANCE; }
1675
1675
  });
1676
1676
  Object.defineProperty(exports, "DEFAULT_TREE_LABELS", {
1677
1677
  enumerable: true,
1678
- get: function () { return chunk44ZTWYAF_cjs.DEFAULT_TREE_LABELS; }
1678
+ get: function () { return chunk3Z3A7FHA_cjs.DEFAULT_TREE_LABELS; }
1679
1679
  });
1680
1680
  Object.defineProperty(exports, "Tree", {
1681
1681
  enumerable: true,
1682
- get: function () { return chunk44ZTWYAF_cjs.TreeRoot; }
1682
+ get: function () { return chunk3Z3A7FHA_cjs.TreeRoot; }
1683
1683
  });
1684
1684
  Object.defineProperty(exports, "TreeChevron", {
1685
1685
  enumerable: true,
1686
- get: function () { return chunk44ZTWYAF_cjs.TreeChevron; }
1686
+ get: function () { return chunk3Z3A7FHA_cjs.TreeChevron; }
1687
1687
  });
1688
1688
  Object.defineProperty(exports, "TreeContent", {
1689
1689
  enumerable: true,
1690
- get: function () { return chunk44ZTWYAF_cjs.TreeContent; }
1690
+ get: function () { return chunk3Z3A7FHA_cjs.TreeContent; }
1691
1691
  });
1692
1692
  Object.defineProperty(exports, "TreeEmpty", {
1693
1693
  enumerable: true,
1694
- get: function () { return chunk44ZTWYAF_cjs.TreeEmpty; }
1694
+ get: function () { return chunk3Z3A7FHA_cjs.TreeEmpty; }
1695
1695
  });
1696
1696
  Object.defineProperty(exports, "TreeIcon", {
1697
1697
  enumerable: true,
1698
- get: function () { return chunk44ZTWYAF_cjs.TreeIcon; }
1698
+ get: function () { return chunk3Z3A7FHA_cjs.TreeIcon; }
1699
1699
  });
1700
1700
  Object.defineProperty(exports, "TreeIndentGuides", {
1701
1701
  enumerable: true,
1702
- get: function () { return chunk44ZTWYAF_cjs.TreeIndentGuides; }
1702
+ get: function () { return chunk3Z3A7FHA_cjs.TreeIndentGuides; }
1703
1703
  });
1704
1704
  Object.defineProperty(exports, "TreeLabel", {
1705
1705
  enumerable: true,
1706
- get: function () { return chunk44ZTWYAF_cjs.TreeLabel; }
1706
+ get: function () { return chunk3Z3A7FHA_cjs.TreeLabel; }
1707
1707
  });
1708
1708
  Object.defineProperty(exports, "TreeProvider", {
1709
1709
  enumerable: true,
1710
- get: function () { return chunk44ZTWYAF_cjs.TreeProvider; }
1710
+ get: function () { return chunk3Z3A7FHA_cjs.TreeProvider; }
1711
1711
  });
1712
1712
  Object.defineProperty(exports, "TreeRoot", {
1713
1713
  enumerable: true,
1714
- get: function () { return chunk44ZTWYAF_cjs.TreeRoot; }
1714
+ get: function () { return chunk3Z3A7FHA_cjs.TreeRoot; }
1715
1715
  });
1716
1716
  Object.defineProperty(exports, "TreeRow", {
1717
1717
  enumerable: true,
1718
- get: function () { return chunk44ZTWYAF_cjs.TreeRow; }
1718
+ get: function () { return chunk3Z3A7FHA_cjs.TreeRow; }
1719
1719
  });
1720
1720
  Object.defineProperty(exports, "TreeSearchInput", {
1721
1721
  enumerable: true,
1722
- get: function () { return chunk44ZTWYAF_cjs.TreeSearchInput; }
1722
+ get: function () { return chunk3Z3A7FHA_cjs.TreeSearchInput; }
1723
1723
  });
1724
1724
  Object.defineProperty(exports, "appearanceToStyle", {
1725
1725
  enumerable: true,
1726
- get: function () { return chunk44ZTWYAF_cjs.appearanceToStyle; }
1726
+ get: function () { return chunk3Z3A7FHA_cjs.appearanceToStyle; }
1727
1727
  });
1728
1728
  Object.defineProperty(exports, "clearTreeState", {
1729
1729
  enumerable: true,
1730
- get: function () { return chunk44ZTWYAF_cjs.clearTreeState; }
1730
+ get: function () { return chunk3Z3A7FHA_cjs.clearTreeState; }
1731
1731
  });
1732
1732
  Object.defineProperty(exports, "createChildCache", {
1733
1733
  enumerable: true,
1734
- get: function () { return chunk44ZTWYAF_cjs.createChildCache; }
1734
+ get: function () { return chunk3Z3A7FHA_cjs.createChildCache; }
1735
1735
  });
1736
1736
  Object.defineProperty(exports, "flattenTree", {
1737
1737
  enumerable: true,
1738
- get: function () { return chunk44ZTWYAF_cjs.flattenTree; }
1738
+ get: function () { return chunk3Z3A7FHA_cjs.flattenTree; }
1739
1739
  });
1740
1740
  Object.defineProperty(exports, "loadTreeState", {
1741
1741
  enumerable: true,
1742
- get: function () { return chunk44ZTWYAF_cjs.loadTreeState; }
1742
+ get: function () { return chunk3Z3A7FHA_cjs.loadTreeState; }
1743
1743
  });
1744
1744
  Object.defineProperty(exports, "resolveAppearance", {
1745
1745
  enumerable: true,
1746
- get: function () { return chunk44ZTWYAF_cjs.resolveAppearance; }
1746
+ get: function () { return chunk3Z3A7FHA_cjs.resolveAppearance; }
1747
1747
  });
1748
1748
  Object.defineProperty(exports, "resolveChildren", {
1749
1749
  enumerable: true,
1750
- get: function () { return chunk44ZTWYAF_cjs.resolveChildren; }
1750
+ get: function () { return chunk3Z3A7FHA_cjs.resolveChildren; }
1751
1751
  });
1752
1752
  Object.defineProperty(exports, "saveTreeState", {
1753
1753
  enumerable: true,
1754
- get: function () { return chunk44ZTWYAF_cjs.saveTreeState; }
1754
+ get: function () { return chunk3Z3A7FHA_cjs.saveTreeState; }
1755
1755
  });
1756
1756
  Object.defineProperty(exports, "useTreeActions", {
1757
1757
  enumerable: true,
1758
- get: function () { return chunk44ZTWYAF_cjs.useTreeActions; }
1758
+ get: function () { return chunk3Z3A7FHA_cjs.useTreeActions; }
1759
1759
  });
1760
1760
  Object.defineProperty(exports, "useTreeContext", {
1761
1761
  enumerable: true,
1762
- get: function () { return chunk44ZTWYAF_cjs.useTreeContext; }
1762
+ get: function () { return chunk3Z3A7FHA_cjs.useTreeContext; }
1763
1763
  });
1764
1764
  Object.defineProperty(exports, "useTreeExpansion", {
1765
1765
  enumerable: true,
1766
- get: function () { return chunk44ZTWYAF_cjs.useTreeExpansion; }
1766
+ get: function () { return chunk3Z3A7FHA_cjs.useTreeExpansion; }
1767
1767
  });
1768
1768
  Object.defineProperty(exports, "useTreeFocus", {
1769
1769
  enumerable: true,
1770
- get: function () { return chunk44ZTWYAF_cjs.useTreeFocus; }
1770
+ get: function () { return chunk3Z3A7FHA_cjs.useTreeFocus; }
1771
1771
  });
1772
1772
  Object.defineProperty(exports, "useTreeKeyboard", {
1773
1773
  enumerable: true,
1774
- get: function () { return chunk44ZTWYAF_cjs.useTreeKeyboard; }
1774
+ get: function () { return chunk3Z3A7FHA_cjs.useTreeKeyboard; }
1775
1775
  });
1776
1776
  Object.defineProperty(exports, "useTreeLabels", {
1777
1777
  enumerable: true,
1778
- get: function () { return chunk44ZTWYAF_cjs.useTreeLabels; }
1778
+ get: function () { return chunk3Z3A7FHA_cjs.useTreeLabels; }
1779
1779
  });
1780
1780
  Object.defineProperty(exports, "useTreeRows", {
1781
1781
  enumerable: true,
1782
- get: function () { return chunk44ZTWYAF_cjs.useTreeRows; }
1782
+ get: function () { return chunk3Z3A7FHA_cjs.useTreeRows; }
1783
1783
  });
1784
1784
  Object.defineProperty(exports, "useTreeSearch", {
1785
1785
  enumerable: true,
1786
- get: function () { return chunk44ZTWYAF_cjs.useTreeSearch; }
1786
+ get: function () { return chunk3Z3A7FHA_cjs.useTreeSearch; }
1787
1787
  });
1788
1788
  Object.defineProperty(exports, "useTreeSelection", {
1789
1789
  enumerable: true,
1790
- get: function () { return chunk44ZTWYAF_cjs.useTreeSelection; }
1790
+ get: function () { return chunk3Z3A7FHA_cjs.useTreeSelection; }
1791
1791
  });
1792
1792
  Object.defineProperty(exports, "useTreeTypeAhead", {
1793
1793
  enumerable: true,
1794
- get: function () { return chunk44ZTWYAF_cjs.useTreeTypeAhead; }
1794
+ get: function () { return chunk3Z3A7FHA_cjs.useTreeTypeAhead; }
1795
1795
  });
1796
1796
  Object.defineProperty(exports, "MarkdownMessage", {
1797
1797
  enumerable: true,
package/dist/index.d.cts CHANGED
@@ -8,8 +8,8 @@ export { Language } from 'prism-react-renderer';
8
8
  import { RJSFSchema, UiSchema, WidgetProps, FieldTemplateProps, ObjectFieldTemplateProps, ArrayFieldTemplateProps, ArrayFieldItemTemplateProps, ErrorListProps } from '@rjsf/utils';
9
9
  import { FormProps, IChangeEvent } from '@rjsf/core';
10
10
  import { CommonExternalProps } from 'react-json-tree';
11
- import { b as TreeRootProps } from './types-Cclwv4Hl.cjs';
12
- export { c as DEFAULT_TREE_APPEARANCE, D as DEFAULT_TREE_LABELS, F as FlatRow, R as ResolvedAppearance, m as TreeAccentIntensity, k as TreeAppearance, e as TreeContextMenuSlot, l as TreeDensity, f as TreeItemId, g as TreeLabels, j as TreeLoadChildren, T as TreeNode, n as TreeRadius, i as TreeRowRenderProps, a as TreeRowSlot, h as TreeSelectionMode, d as appearanceToStyle, r as resolveAppearance } from './types-Cclwv4Hl.cjs';
11
+ import { b as TreeRootProps } from './types-CevSbyfD.cjs';
12
+ export { c as DEFAULT_TREE_APPEARANCE, D as DEFAULT_TREE_LABELS, F as FlatRow, R as ResolvedAppearance, m as TreeAccentIntensity, k as TreeAppearance, e as TreeContextMenuSlot, l as TreeDensity, f as TreeItemId, g as TreeLabels, j as TreeLoadChildren, T as TreeNode, n as TreeRadius, i as TreeRowRenderProps, a as TreeRowSlot, h as TreeSelectionMode, d as appearanceToStyle, r as resolveAppearance } from './types-CevSbyfD.cjs';
13
13
  import { MediaPlayerInstance } from '@vidstack/react';
14
14
  import * as monaco from 'monaco-editor';
15
15
  export { ChildCache, ChildEntry, ChildEntryStatus, DemoNode, FlattenInput, PersistedTreeState, TreeRoot as Tree, TreeChevron, TreeChevronProps, TreeContent, TreeContentProps, TreeContextValue, TreeEmpty, TreeEmptyProps, TreeError, TreeErrorProps, TreeIcon, TreeIconProps, TreeIndentGuides, TreeIndentGuidesProps, TreeLabel, TreeLabelProps, TreeProvider, TreeProviderProps, TreeRoot, TreeRow, TreeRowProps, TreeSearchInput, TreeSearchInputProps, TreeSkeleton, TreeSkeletonProps, UseTreeKeyboardOptions, UseTreeTypeAheadOptions, clearTreeState, createChildCache, createDemoTree, flattenTree, loadTreeState, resolveChildren, saveTreeState, useTreeActions, useTreeContext, useTreeExpansion, useTreeFocus, useTreeKeyboard, useTreeLabels, useTreeRows, useTreeSearch, useTreeSelection, useTreeTypeAhead } from './tree/index.cjs';
package/dist/index.d.ts CHANGED
@@ -8,8 +8,8 @@ export { Language } from 'prism-react-renderer';
8
8
  import { RJSFSchema, UiSchema, WidgetProps, FieldTemplateProps, ObjectFieldTemplateProps, ArrayFieldTemplateProps, ArrayFieldItemTemplateProps, ErrorListProps } from '@rjsf/utils';
9
9
  import { FormProps, IChangeEvent } from '@rjsf/core';
10
10
  import { CommonExternalProps } from 'react-json-tree';
11
- import { b as TreeRootProps } from './types-Cclwv4Hl.js';
12
- export { c as DEFAULT_TREE_APPEARANCE, D as DEFAULT_TREE_LABELS, F as FlatRow, R as ResolvedAppearance, m as TreeAccentIntensity, k as TreeAppearance, e as TreeContextMenuSlot, l as TreeDensity, f as TreeItemId, g as TreeLabels, j as TreeLoadChildren, T as TreeNode, n as TreeRadius, i as TreeRowRenderProps, a as TreeRowSlot, h as TreeSelectionMode, d as appearanceToStyle, r as resolveAppearance } from './types-Cclwv4Hl.js';
11
+ import { b as TreeRootProps } from './types-CevSbyfD.js';
12
+ export { c as DEFAULT_TREE_APPEARANCE, D as DEFAULT_TREE_LABELS, F as FlatRow, R as ResolvedAppearance, m as TreeAccentIntensity, k as TreeAppearance, e as TreeContextMenuSlot, l as TreeDensity, f as TreeItemId, g as TreeLabels, j as TreeLoadChildren, T as TreeNode, n as TreeRadius, i as TreeRowRenderProps, a as TreeRowSlot, h as TreeSelectionMode, d as appearanceToStyle, r as resolveAppearance } from './types-CevSbyfD.js';
13
13
  import { MediaPlayerInstance } from '@vidstack/react';
14
14
  import * as monaco from 'monaco-editor';
15
15
  export { ChildCache, ChildEntry, ChildEntryStatus, DemoNode, FlattenInput, PersistedTreeState, TreeRoot as Tree, TreeChevron, TreeChevronProps, TreeContent, TreeContentProps, TreeContextValue, TreeEmpty, TreeEmptyProps, TreeError, TreeErrorProps, TreeIcon, TreeIconProps, TreeIndentGuides, TreeIndentGuidesProps, TreeLabel, TreeLabelProps, TreeProvider, TreeProviderProps, TreeRoot, TreeRow, TreeRowProps, TreeSearchInput, TreeSearchInputProps, TreeSkeleton, TreeSkeletonProps, UseTreeKeyboardOptions, UseTreeTypeAheadOptions, clearTreeState, createChildCache, createDemoTree, flattenTree, loadTreeState, resolveChildren, saveTreeState, useTreeActions, useTreeContext, useTreeExpansion, useTreeFocus, useTreeKeyboard, useTreeLabels, useTreeRows, useTreeSearch, useTreeSelection, useTreeTypeAhead } from './tree/index.js';
package/dist/index.mjs CHANGED
@@ -6,7 +6,7 @@ export { ImageViewer } from './chunk-GGKGH5PM.mjs';
6
6
  export { generateContentKey, useAudioCache, useBlobUrlCleanup, useImageCache, useMediaCacheStore, useVideoCache, useVideoPlayerSettings } from './chunk-5LBDYFWH.mjs';
7
7
  export { CronSchedulerProvider, CustomInput, DayChips, MonthDayGrid, SchedulePreview, ScheduleTypeSelector, TimeSelector, buildCron, humanizeCron, isValidCron, parseCron, useCronCustom, useCronMonthDays, useCronPreview, useCronScheduler, useCronSchedulerContext, useCronTime, useCronType, useCronWeekDays } from './chunk-PZKAH7WQ.mjs';
8
8
  export { TreeError, TreeSkeleton, createDemoTree } from './chunk-KR6B3LVY.mjs';
9
- export { DEFAULT_TREE_APPEARANCE, DEFAULT_TREE_LABELS, TreeRoot as Tree, TreeChevron, TreeContent, TreeEmpty, TreeIcon, TreeIndentGuides, TreeLabel, TreeProvider, TreeRoot, TreeRow, TreeSearchInput, appearanceToStyle, clearTreeState, createChildCache, flattenTree, loadTreeState, resolveAppearance, resolveChildren, saveTreeState, useTreeActions, useTreeContext, useTreeExpansion, useTreeFocus, useTreeKeyboard, useTreeLabels, useTreeRows, useTreeSearch, useTreeSelection, useTreeTypeAhead } from './chunk-NTJL2SXK.mjs';
9
+ export { DEFAULT_TREE_APPEARANCE, DEFAULT_TREE_LABELS, TreeRoot as Tree, TreeChevron, TreeContent, TreeEmpty, TreeIcon, TreeIndentGuides, TreeLabel, TreeProvider, TreeRoot, TreeRow, TreeSearchInput, appearanceToStyle, clearTreeState, createChildCache, flattenTree, loadTreeState, resolveAppearance, resolveChildren, saveTreeState, useTreeActions, useTreeContext, useTreeExpansion, useTreeFocus, useTreeKeyboard, useTreeLabels, useTreeRows, useTreeSearch, useTreeSelection, useTreeTypeAhead } from './chunk-MOME6KYD.mjs';
10
10
  import { PlaygroundProvider } from './chunk-GBLQTHWT.mjs';
11
11
  export { MarkdownMessage, Mermaid_default as Mermaid, PrettyCode_default as PrettyCode, extractTextFromChildren, useCollapsibleContent } from './chunk-GBLQTHWT.mjs';
12
12
  export { JsonTree_default as JsonTree } from './chunk-LFWQ36LJ.mjs';
@@ -338,7 +338,7 @@ var LazyCronScheduler = createLazyComponent(
338
338
  }
339
339
  );
340
340
  var LazyTree = createLazyComponent(
341
- () => import('./TreeRoot-R6XVHYQK.mjs'),
341
+ () => import('./TreeRoot-A3J65L6F.mjs'),
342
342
  {
343
343
  displayName: "LazyTree",
344
344
  fallback: /* @__PURE__ */ jsx(LoadingFallback, { minHeight: 200, text: "Loading tree\u2026" })
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var chunkYXBOAGIM_cjs = require('../chunk-YXBOAGIM.cjs');
6
- var chunk44ZTWYAF_cjs = require('../chunk-44ZTWYAF.cjs');
6
+ var chunk3Z3A7FHA_cjs = require('../chunk-3Z3A7FHA.cjs');
7
7
  require('../chunk-WGEGR3DF.cjs');
8
8
 
9
9
 
@@ -22,131 +22,131 @@ Object.defineProperty(exports, "createDemoTree", {
22
22
  });
23
23
  Object.defineProperty(exports, "DEFAULT_TREE_APPEARANCE", {
24
24
  enumerable: true,
25
- get: function () { return chunk44ZTWYAF_cjs.DEFAULT_TREE_APPEARANCE; }
25
+ get: function () { return chunk3Z3A7FHA_cjs.DEFAULT_TREE_APPEARANCE; }
26
26
  });
27
27
  Object.defineProperty(exports, "DEFAULT_TREE_LABELS", {
28
28
  enumerable: true,
29
- get: function () { return chunk44ZTWYAF_cjs.DEFAULT_TREE_LABELS; }
29
+ get: function () { return chunk3Z3A7FHA_cjs.DEFAULT_TREE_LABELS; }
30
30
  });
31
31
  Object.defineProperty(exports, "Tree", {
32
32
  enumerable: true,
33
- get: function () { return chunk44ZTWYAF_cjs.TreeRoot; }
33
+ get: function () { return chunk3Z3A7FHA_cjs.TreeRoot; }
34
34
  });
35
35
  Object.defineProperty(exports, "TreeChevron", {
36
36
  enumerable: true,
37
- get: function () { return chunk44ZTWYAF_cjs.TreeChevron; }
37
+ get: function () { return chunk3Z3A7FHA_cjs.TreeChevron; }
38
38
  });
39
39
  Object.defineProperty(exports, "TreeContent", {
40
40
  enumerable: true,
41
- get: function () { return chunk44ZTWYAF_cjs.TreeContent; }
41
+ get: function () { return chunk3Z3A7FHA_cjs.TreeContent; }
42
42
  });
43
43
  Object.defineProperty(exports, "TreeEmpty", {
44
44
  enumerable: true,
45
- get: function () { return chunk44ZTWYAF_cjs.TreeEmpty; }
45
+ get: function () { return chunk3Z3A7FHA_cjs.TreeEmpty; }
46
46
  });
47
47
  Object.defineProperty(exports, "TreeIcon", {
48
48
  enumerable: true,
49
- get: function () { return chunk44ZTWYAF_cjs.TreeIcon; }
49
+ get: function () { return chunk3Z3A7FHA_cjs.TreeIcon; }
50
50
  });
51
51
  Object.defineProperty(exports, "TreeIndentGuides", {
52
52
  enumerable: true,
53
- get: function () { return chunk44ZTWYAF_cjs.TreeIndentGuides; }
53
+ get: function () { return chunk3Z3A7FHA_cjs.TreeIndentGuides; }
54
54
  });
55
55
  Object.defineProperty(exports, "TreeLabel", {
56
56
  enumerable: true,
57
- get: function () { return chunk44ZTWYAF_cjs.TreeLabel; }
57
+ get: function () { return chunk3Z3A7FHA_cjs.TreeLabel; }
58
58
  });
59
59
  Object.defineProperty(exports, "TreeProvider", {
60
60
  enumerable: true,
61
- get: function () { return chunk44ZTWYAF_cjs.TreeProvider; }
61
+ get: function () { return chunk3Z3A7FHA_cjs.TreeProvider; }
62
62
  });
63
63
  Object.defineProperty(exports, "TreeRoot", {
64
64
  enumerable: true,
65
- get: function () { return chunk44ZTWYAF_cjs.TreeRoot; }
65
+ get: function () { return chunk3Z3A7FHA_cjs.TreeRoot; }
66
66
  });
67
67
  Object.defineProperty(exports, "TreeRow", {
68
68
  enumerable: true,
69
- get: function () { return chunk44ZTWYAF_cjs.TreeRow; }
69
+ get: function () { return chunk3Z3A7FHA_cjs.TreeRow; }
70
70
  });
71
71
  Object.defineProperty(exports, "TreeSearchInput", {
72
72
  enumerable: true,
73
- get: function () { return chunk44ZTWYAF_cjs.TreeSearchInput; }
73
+ get: function () { return chunk3Z3A7FHA_cjs.TreeSearchInput; }
74
74
  });
75
75
  Object.defineProperty(exports, "appearanceToStyle", {
76
76
  enumerable: true,
77
- get: function () { return chunk44ZTWYAF_cjs.appearanceToStyle; }
77
+ get: function () { return chunk3Z3A7FHA_cjs.appearanceToStyle; }
78
78
  });
79
79
  Object.defineProperty(exports, "clearTreeState", {
80
80
  enumerable: true,
81
- get: function () { return chunk44ZTWYAF_cjs.clearTreeState; }
81
+ get: function () { return chunk3Z3A7FHA_cjs.clearTreeState; }
82
82
  });
83
83
  Object.defineProperty(exports, "createChildCache", {
84
84
  enumerable: true,
85
- get: function () { return chunk44ZTWYAF_cjs.createChildCache; }
85
+ get: function () { return chunk3Z3A7FHA_cjs.createChildCache; }
86
86
  });
87
87
  Object.defineProperty(exports, "default", {
88
88
  enumerable: true,
89
- get: function () { return chunk44ZTWYAF_cjs.TreeRoot_default; }
89
+ get: function () { return chunk3Z3A7FHA_cjs.TreeRoot_default; }
90
90
  });
91
91
  Object.defineProperty(exports, "flattenTree", {
92
92
  enumerable: true,
93
- get: function () { return chunk44ZTWYAF_cjs.flattenTree; }
93
+ get: function () { return chunk3Z3A7FHA_cjs.flattenTree; }
94
94
  });
95
95
  Object.defineProperty(exports, "loadTreeState", {
96
96
  enumerable: true,
97
- get: function () { return chunk44ZTWYAF_cjs.loadTreeState; }
97
+ get: function () { return chunk3Z3A7FHA_cjs.loadTreeState; }
98
98
  });
99
99
  Object.defineProperty(exports, "resolveAppearance", {
100
100
  enumerable: true,
101
- get: function () { return chunk44ZTWYAF_cjs.resolveAppearance; }
101
+ get: function () { return chunk3Z3A7FHA_cjs.resolveAppearance; }
102
102
  });
103
103
  Object.defineProperty(exports, "resolveChildren", {
104
104
  enumerable: true,
105
- get: function () { return chunk44ZTWYAF_cjs.resolveChildren; }
105
+ get: function () { return chunk3Z3A7FHA_cjs.resolveChildren; }
106
106
  });
107
107
  Object.defineProperty(exports, "saveTreeState", {
108
108
  enumerable: true,
109
- get: function () { return chunk44ZTWYAF_cjs.saveTreeState; }
109
+ get: function () { return chunk3Z3A7FHA_cjs.saveTreeState; }
110
110
  });
111
111
  Object.defineProperty(exports, "useTreeActions", {
112
112
  enumerable: true,
113
- get: function () { return chunk44ZTWYAF_cjs.useTreeActions; }
113
+ get: function () { return chunk3Z3A7FHA_cjs.useTreeActions; }
114
114
  });
115
115
  Object.defineProperty(exports, "useTreeContext", {
116
116
  enumerable: true,
117
- get: function () { return chunk44ZTWYAF_cjs.useTreeContext; }
117
+ get: function () { return chunk3Z3A7FHA_cjs.useTreeContext; }
118
118
  });
119
119
  Object.defineProperty(exports, "useTreeExpansion", {
120
120
  enumerable: true,
121
- get: function () { return chunk44ZTWYAF_cjs.useTreeExpansion; }
121
+ get: function () { return chunk3Z3A7FHA_cjs.useTreeExpansion; }
122
122
  });
123
123
  Object.defineProperty(exports, "useTreeFocus", {
124
124
  enumerable: true,
125
- get: function () { return chunk44ZTWYAF_cjs.useTreeFocus; }
125
+ get: function () { return chunk3Z3A7FHA_cjs.useTreeFocus; }
126
126
  });
127
127
  Object.defineProperty(exports, "useTreeKeyboard", {
128
128
  enumerable: true,
129
- get: function () { return chunk44ZTWYAF_cjs.useTreeKeyboard; }
129
+ get: function () { return chunk3Z3A7FHA_cjs.useTreeKeyboard; }
130
130
  });
131
131
  Object.defineProperty(exports, "useTreeLabels", {
132
132
  enumerable: true,
133
- get: function () { return chunk44ZTWYAF_cjs.useTreeLabels; }
133
+ get: function () { return chunk3Z3A7FHA_cjs.useTreeLabels; }
134
134
  });
135
135
  Object.defineProperty(exports, "useTreeRows", {
136
136
  enumerable: true,
137
- get: function () { return chunk44ZTWYAF_cjs.useTreeRows; }
137
+ get: function () { return chunk3Z3A7FHA_cjs.useTreeRows; }
138
138
  });
139
139
  Object.defineProperty(exports, "useTreeSearch", {
140
140
  enumerable: true,
141
- get: function () { return chunk44ZTWYAF_cjs.useTreeSearch; }
141
+ get: function () { return chunk3Z3A7FHA_cjs.useTreeSearch; }
142
142
  });
143
143
  Object.defineProperty(exports, "useTreeSelection", {
144
144
  enumerable: true,
145
- get: function () { return chunk44ZTWYAF_cjs.useTreeSelection; }
145
+ get: function () { return chunk3Z3A7FHA_cjs.useTreeSelection; }
146
146
  });
147
147
  Object.defineProperty(exports, "useTreeTypeAhead", {
148
148
  enumerable: true,
149
- get: function () { return chunk44ZTWYAF_cjs.useTreeTypeAhead; }
149
+ get: function () { return chunk3Z3A7FHA_cjs.useTreeTypeAhead; }
150
150
  });
151
151
  //# sourceMappingURL=index.cjs.map
152
152
  //# sourceMappingURL=index.cjs.map
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { b as TreeRootProps, f as TreeItemId, T as TreeNode, F as FlatRow, o as TreeActivateOptions, g as TreeLabels, R as ResolvedAppearance, h as TreeSelectionMode, p as TreeActivationMode, a as TreeRowSlot, e as TreeContextMenuSlot } from '../types-Cclwv4Hl.cjs';
3
- export { c as DEFAULT_TREE_APPEARANCE, D as DEFAULT_TREE_LABELS, m as TreeAccentIntensity, k as TreeAppearance, l as TreeDensity, j as TreeLoadChildren, n as TreeRadius, i as TreeRowRenderProps, d as appearanceToStyle, r as resolveAppearance } from '../types-Cclwv4Hl.cjs';
2
+ import { b as TreeRootProps, f as TreeItemId, T as TreeNode, F as FlatRow, o as TreeActivateOptions, g as TreeLabels, R as ResolvedAppearance, h as TreeSelectionMode, p as TreeActivationMode, a as TreeRowSlot, e as TreeContextMenuSlot } from '../types-CevSbyfD.cjs';
3
+ export { c as DEFAULT_TREE_APPEARANCE, D as DEFAULT_TREE_LABELS, m as TreeAccentIntensity, k as TreeAppearance, l as TreeDensity, j as TreeLoadChildren, n as TreeRadius, i as TreeRowRenderProps, d as appearanceToStyle, r as resolveAppearance } from '../types-CevSbyfD.cjs';
4
4
  import * as React$1 from 'react';
5
5
 
6
6
  /**
@@ -70,7 +70,7 @@ interface TreeContextValue<T> {
70
70
  renderContextMenu?: TreeContextMenuSlot<T>;
71
71
  }
72
72
  declare function useTreeContext<T>(): TreeContextValue<T>;
73
- interface TreeProviderProps<T> extends Pick<TreeRootProps<T>, 'data' | 'getItemName' | 'loadChildren' | 'selectionMode' | 'activationMode' | 'initialExpandedIds' | 'initialSelectedIds' | 'indent' | 'appearance' | 'onSelectionChange' | 'onExpansionChange' | 'onActivate' | 'enableSearch' | 'showIndentGuides' | 'renderIcon' | 'renderLabel' | 'renderActions' | 'renderContextMenu' | 'labels' | 'persistKey' | 'persistSelection'> {
73
+ interface TreeProviderProps<T> extends Pick<TreeRootProps<T>, 'data' | 'getItemName' | 'loadChildren' | 'selectionMode' | 'activationMode' | 'initialExpandedIds' | 'initialSelectedIds' | 'indent' | 'appearance' | 'onSelectionChange' | 'onExpansionChange' | 'onActivate' | 'filterNode' | 'enableSearch' | 'showIndentGuides' | 'renderIcon' | 'renderLabel' | 'renderActions' | 'renderContextMenu' | 'labels' | 'persistKey' | 'persistSelection'> {
74
74
  children: React$1.ReactNode;
75
75
  }
76
76
  declare function TreeProvider<T>(props: TreeProviderProps<T>): react_jsx_runtime.JSX.Element;
@@ -241,6 +241,8 @@ interface FlattenInput<T> {
241
241
  roots: TreeNode<T>[];
242
242
  expandedIds: ReadonlySet<TreeItemId>;
243
243
  cache: ChildCache<T>;
244
+ /** Optional predicate. Nodes returning `false` (and their descendants) are excluded. */
245
+ filterNode?: (node: TreeNode<T>) => boolean;
244
246
  }
245
247
  /**
246
248
  * Walk the tree top-to-bottom and produce a flat list of visible rows.
@@ -249,7 +251,7 @@ interface FlattenInput<T> {
249
251
  * `expandedIds`. The output is ordered exactly as it should render,
250
252
  * which keeps keyboard navigation (next/prev row) trivial.
251
253
  */
252
- declare function flattenTree<T>({ roots, expandedIds, cache }: FlattenInput<T>): FlatRow<T>[];
254
+ declare function flattenTree<T>({ roots, expandedIds, cache, filterNode, }: FlattenInput<T>): FlatRow<T>[];
253
255
 
254
256
  interface PersistedTreeState {
255
257
  expandedItems: TreeItemId[];
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { b as TreeRootProps, f as TreeItemId, T as TreeNode, F as FlatRow, o as TreeActivateOptions, g as TreeLabels, R as ResolvedAppearance, h as TreeSelectionMode, p as TreeActivationMode, a as TreeRowSlot, e as TreeContextMenuSlot } from '../types-Cclwv4Hl.js';
3
- export { c as DEFAULT_TREE_APPEARANCE, D as DEFAULT_TREE_LABELS, m as TreeAccentIntensity, k as TreeAppearance, l as TreeDensity, j as TreeLoadChildren, n as TreeRadius, i as TreeRowRenderProps, d as appearanceToStyle, r as resolveAppearance } from '../types-Cclwv4Hl.js';
2
+ import { b as TreeRootProps, f as TreeItemId, T as TreeNode, F as FlatRow, o as TreeActivateOptions, g as TreeLabels, R as ResolvedAppearance, h as TreeSelectionMode, p as TreeActivationMode, a as TreeRowSlot, e as TreeContextMenuSlot } from '../types-CevSbyfD.js';
3
+ export { c as DEFAULT_TREE_APPEARANCE, D as DEFAULT_TREE_LABELS, m as TreeAccentIntensity, k as TreeAppearance, l as TreeDensity, j as TreeLoadChildren, n as TreeRadius, i as TreeRowRenderProps, d as appearanceToStyle, r as resolveAppearance } from '../types-CevSbyfD.js';
4
4
  import * as React$1 from 'react';
5
5
 
6
6
  /**
@@ -70,7 +70,7 @@ interface TreeContextValue<T> {
70
70
  renderContextMenu?: TreeContextMenuSlot<T>;
71
71
  }
72
72
  declare function useTreeContext<T>(): TreeContextValue<T>;
73
- interface TreeProviderProps<T> extends Pick<TreeRootProps<T>, 'data' | 'getItemName' | 'loadChildren' | 'selectionMode' | 'activationMode' | 'initialExpandedIds' | 'initialSelectedIds' | 'indent' | 'appearance' | 'onSelectionChange' | 'onExpansionChange' | 'onActivate' | 'enableSearch' | 'showIndentGuides' | 'renderIcon' | 'renderLabel' | 'renderActions' | 'renderContextMenu' | 'labels' | 'persistKey' | 'persistSelection'> {
73
+ interface TreeProviderProps<T> extends Pick<TreeRootProps<T>, 'data' | 'getItemName' | 'loadChildren' | 'selectionMode' | 'activationMode' | 'initialExpandedIds' | 'initialSelectedIds' | 'indent' | 'appearance' | 'onSelectionChange' | 'onExpansionChange' | 'onActivate' | 'filterNode' | 'enableSearch' | 'showIndentGuides' | 'renderIcon' | 'renderLabel' | 'renderActions' | 'renderContextMenu' | 'labels' | 'persistKey' | 'persistSelection'> {
74
74
  children: React$1.ReactNode;
75
75
  }
76
76
  declare function TreeProvider<T>(props: TreeProviderProps<T>): react_jsx_runtime.JSX.Element;
@@ -241,6 +241,8 @@ interface FlattenInput<T> {
241
241
  roots: TreeNode<T>[];
242
242
  expandedIds: ReadonlySet<TreeItemId>;
243
243
  cache: ChildCache<T>;
244
+ /** Optional predicate. Nodes returning `false` (and their descendants) are excluded. */
245
+ filterNode?: (node: TreeNode<T>) => boolean;
244
246
  }
245
247
  /**
246
248
  * Walk the tree top-to-bottom and produce a flat list of visible rows.
@@ -249,7 +251,7 @@ interface FlattenInput<T> {
249
251
  * `expandedIds`. The output is ordered exactly as it should render,
250
252
  * which keeps keyboard navigation (next/prev row) trivial.
251
253
  */
252
- declare function flattenTree<T>({ roots, expandedIds, cache }: FlattenInput<T>): FlatRow<T>[];
254
+ declare function flattenTree<T>({ roots, expandedIds, cache, filterNode, }: FlattenInput<T>): FlatRow<T>[];
253
255
 
254
256
  interface PersistedTreeState {
255
257
  expandedItems: TreeItemId[];
@@ -1,5 +1,5 @@
1
1
  export { TreeError, TreeSkeleton, createDemoTree } from '../chunk-KR6B3LVY.mjs';
2
- export { DEFAULT_TREE_APPEARANCE, DEFAULT_TREE_LABELS, TreeRoot as Tree, TreeChevron, TreeContent, TreeEmpty, TreeIcon, TreeIndentGuides, TreeLabel, TreeProvider, TreeRoot, TreeRow, TreeSearchInput, appearanceToStyle, clearTreeState, createChildCache, TreeRoot_default as default, flattenTree, loadTreeState, resolveAppearance, resolveChildren, saveTreeState, useTreeActions, useTreeContext, useTreeExpansion, useTreeFocus, useTreeKeyboard, useTreeLabels, useTreeRows, useTreeSearch, useTreeSelection, useTreeTypeAhead } from '../chunk-NTJL2SXK.mjs';
2
+ export { DEFAULT_TREE_APPEARANCE, DEFAULT_TREE_LABELS, TreeRoot as Tree, TreeChevron, TreeContent, TreeEmpty, TreeIcon, TreeIndentGuides, TreeLabel, TreeProvider, TreeRoot, TreeRow, TreeSearchInput, appearanceToStyle, clearTreeState, createChildCache, TreeRoot_default as default, flattenTree, loadTreeState, resolveAppearance, resolveChildren, saveTreeState, useTreeActions, useTreeContext, useTreeExpansion, useTreeFocus, useTreeKeyboard, useTreeLabels, useTreeRows, useTreeSearch, useTreeSelection, useTreeTypeAhead } from '../chunk-MOME6KYD.mjs';
3
3
  import '../chunk-CGILA3WO.mjs';
4
4
  //# sourceMappingURL=index.mjs.map
5
5
  //# sourceMappingURL=index.mjs.map