@djangocfg/ui-tools 2.1.390 → 2.1.393

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 (183) hide show
  1. package/README.md +7 -10
  2. package/dist/chunk-PAWJFY3S.mjs +6 -0
  3. package/dist/{chunk-N2XQF2OL.mjs.map → chunk-PAWJFY3S.mjs.map} +1 -1
  4. package/dist/chunk-PK6SKIKE.cjs +8 -0
  5. package/dist/{chunk-OLISEQHS.cjs.map → chunk-PK6SKIKE.cjs.map} +1 -1
  6. package/dist/file-icon/index.cjs +6 -6
  7. package/dist/file-icon/index.d.cts +1 -1
  8. package/dist/file-icon/index.d.ts +1 -1
  9. package/dist/file-icon/index.mjs +1 -1
  10. package/dist/tree/index.cjs +1372 -143
  11. package/dist/tree/index.cjs.map +1 -1
  12. package/dist/tree/index.d.cts +2 -2
  13. package/dist/tree/index.d.ts +2 -2
  14. package/dist/tree/index.mjs +1322 -3
  15. package/dist/tree/index.mjs.map +1 -1
  16. package/dist/{types-CevSbyfD.d.cts → types-B_zhyAqR.d.cts} +1 -1
  17. package/dist/{types-CevSbyfD.d.ts → types-B_zhyAqR.d.ts} +1 -1
  18. package/package.json +6 -14
  19. package/src/tools/AudioPlayer/README.md +4 -4
  20. package/src/tools/Chat/README.md +6 -6
  21. package/src/tools/CronScheduler/index.tsx +1 -1
  22. package/src/tools/CronScheduler/lazy.tsx +1 -1
  23. package/src/tools/ImageViewer/README.md +1 -1
  24. package/src/tools/JsonForm/README.md +2 -2
  25. package/src/tools/MarkdownEditor/README.md +3 -3
  26. package/src/tools/MarkdownMessage/README.md +2 -2
  27. package/src/tools/OpenapiViewer/components/DocsLayout/grouping.ts +5 -1
  28. package/src/tools/SpeechRecognition/README.md +1 -1
  29. package/dist/ChatRoot-EFNXQXXN.cjs +0 -15
  30. package/dist/ChatRoot-EFNXQXXN.cjs.map +0 -1
  31. package/dist/ChatRoot-FITF5RVP.mjs +0 -6
  32. package/dist/ChatRoot-FITF5RVP.mjs.map +0 -1
  33. package/dist/ChatRoot-PNNGQCYF.css +0 -7
  34. package/dist/ChatRoot-PNNGQCYF.css.map +0 -1
  35. package/dist/CronScheduler.client-DLMXCPAJ.mjs +0 -67
  36. package/dist/CronScheduler.client-DLMXCPAJ.mjs.map +0 -1
  37. package/dist/CronScheduler.client-WEJF4PWQ.cjs +0 -72
  38. package/dist/CronScheduler.client-WEJF4PWQ.cjs.map +0 -1
  39. package/dist/DictationField-AS2F33WI.cjs +0 -13
  40. package/dist/DictationField-AS2F33WI.cjs.map +0 -1
  41. package/dist/DictationField-WPONUCYE.mjs +0 -4
  42. package/dist/DictationField-WPONUCYE.mjs.map +0 -1
  43. package/dist/DocsLayout-EKASBSP7.mjs +0 -3448
  44. package/dist/DocsLayout-EKASBSP7.mjs.map +0 -1
  45. package/dist/DocsLayout-MBFIB4NO.css +0 -7
  46. package/dist/DocsLayout-MBFIB4NO.css.map +0 -1
  47. package/dist/DocsLayout-OURFYWQE.cjs +0 -3455
  48. package/dist/DocsLayout-OURFYWQE.cjs.map +0 -1
  49. package/dist/JsonSchemaForm-DD7CLRIG.cjs +0 -13
  50. package/dist/JsonSchemaForm-DD7CLRIG.cjs.map +0 -1
  51. package/dist/JsonSchemaForm-XKUIVELK.mjs +0 -4
  52. package/dist/JsonSchemaForm-XKUIVELK.mjs.map +0 -1
  53. package/dist/JsonTree-43PQAJKY.mjs +0 -5
  54. package/dist/JsonTree-43PQAJKY.mjs.map +0 -1
  55. package/dist/JsonTree-MLET23ZA.css +0 -7
  56. package/dist/JsonTree-MLET23ZA.css.map +0 -1
  57. package/dist/JsonTree-X6W5YEVY.cjs +0 -11
  58. package/dist/JsonTree-X6W5YEVY.cjs.map +0 -1
  59. package/dist/LottiePlayer.client-2S7ISJ2S.cjs +0 -168
  60. package/dist/LottiePlayer.client-2S7ISJ2S.cjs.map +0 -1
  61. package/dist/LottiePlayer.client-5LDSSJWS.mjs +0 -161
  62. package/dist/LottiePlayer.client-5LDSSJWS.mjs.map +0 -1
  63. package/dist/MapContainer-AKIPABJK.mjs +0 -4
  64. package/dist/MapContainer-AKIPABJK.mjs.map +0 -1
  65. package/dist/MapContainer-STVDMC36.cjs +0 -17
  66. package/dist/MapContainer-STVDMC36.cjs.map +0 -1
  67. package/dist/Mermaid.client-DDXWXZXY.css +0 -7
  68. package/dist/Mermaid.client-DDXWXZXY.css.map +0 -1
  69. package/dist/Mermaid.client-NL4SVR7F.mjs +0 -481
  70. package/dist/Mermaid.client-NL4SVR7F.mjs.map +0 -1
  71. package/dist/Mermaid.client-NNTI6DFX.cjs +0 -487
  72. package/dist/Mermaid.client-NNTI6DFX.cjs.map +0 -1
  73. package/dist/Player-BRV7XTWR.mjs +0 -4
  74. package/dist/Player-BRV7XTWR.mjs.map +0 -1
  75. package/dist/Player-PM7F7DD7.cjs +0 -13
  76. package/dist/Player-PM7F7DD7.cjs.map +0 -1
  77. package/dist/Player-ZGQKKOWI.css +0 -66
  78. package/dist/Player-ZGQKKOWI.css.map +0 -1
  79. package/dist/PrettyCode.client-GWFAIVFN.css +0 -7
  80. package/dist/PrettyCode.client-GWFAIVFN.css.map +0 -1
  81. package/dist/PrettyCode.client-KOHDVPPN.cjs +0 -285
  82. package/dist/PrettyCode.client-KOHDVPPN.cjs.map +0 -1
  83. package/dist/PrettyCode.client-ZGYGKE7G.mjs +0 -283
  84. package/dist/PrettyCode.client-ZGYGKE7G.mjs.map +0 -1
  85. package/dist/TreeRoot-5COOOSWG.mjs +0 -4
  86. package/dist/TreeRoot-5COOOSWG.mjs.map +0 -1
  87. package/dist/TreeRoot-AABP2J6Y.cjs +0 -19
  88. package/dist/TreeRoot-AABP2J6Y.cjs.map +0 -1
  89. package/dist/chunk-2NG4SXEP.mjs +0 -743
  90. package/dist/chunk-2NG4SXEP.mjs.map +0 -1
  91. package/dist/chunk-4LFB7I5K.cjs +0 -1387
  92. package/dist/chunk-4LFB7I5K.cjs.map +0 -1
  93. package/dist/chunk-5D2OCOPQ.cjs +0 -222
  94. package/dist/chunk-5D2OCOPQ.cjs.map +0 -1
  95. package/dist/chunk-5I5QNGUG.cjs +0 -611
  96. package/dist/chunk-5I5QNGUG.cjs.map +0 -1
  97. package/dist/chunk-6ZX2G25W.mjs +0 -1361
  98. package/dist/chunk-6ZX2G25W.mjs.map +0 -1
  99. package/dist/chunk-76NNDZH6.cjs +0 -1061
  100. package/dist/chunk-76NNDZH6.cjs.map +0 -1
  101. package/dist/chunk-7CWGZPO3.mjs +0 -214
  102. package/dist/chunk-7CWGZPO3.mjs.map +0 -1
  103. package/dist/chunk-7EYHNP3E.cjs +0 -965
  104. package/dist/chunk-7EYHNP3E.cjs.map +0 -1
  105. package/dist/chunk-7IYXZUJO.cjs +0 -769
  106. package/dist/chunk-7IYXZUJO.cjs.map +0 -1
  107. package/dist/chunk-ADEN3UA4.cjs +0 -892
  108. package/dist/chunk-ADEN3UA4.cjs.map +0 -1
  109. package/dist/chunk-B6IR5KSC.mjs +0 -59
  110. package/dist/chunk-B6IR5KSC.mjs.map +0 -1
  111. package/dist/chunk-C6GXVH5J.mjs +0 -338
  112. package/dist/chunk-C6GXVH5J.mjs.map +0 -1
  113. package/dist/chunk-DMX7W4XZ.mjs +0 -1113
  114. package/dist/chunk-DMX7W4XZ.mjs.map +0 -1
  115. package/dist/chunk-ECONRHIG.mjs +0 -212
  116. package/dist/chunk-ECONRHIG.mjs.map +0 -1
  117. package/dist/chunk-FEN5S772.cjs +0 -1227
  118. package/dist/chunk-FEN5S772.cjs.map +0 -1
  119. package/dist/chunk-FP2RLYQZ.cjs +0 -187
  120. package/dist/chunk-FP2RLYQZ.cjs.map +0 -1
  121. package/dist/chunk-FVVF7VCD.cjs +0 -1325
  122. package/dist/chunk-FVVF7VCD.cjs.map +0 -1
  123. package/dist/chunk-GYIO7W7M.mjs +0 -1197
  124. package/dist/chunk-GYIO7W7M.mjs.map +0 -1
  125. package/dist/chunk-KNDLV4PI.cjs +0 -1356
  126. package/dist/chunk-KNDLV4PI.cjs.map +0 -1
  127. package/dist/chunk-KNEQRUBA.mjs +0 -181
  128. package/dist/chunk-KNEQRUBA.mjs.map +0 -1
  129. package/dist/chunk-N2XQF2OL.mjs +0 -14
  130. package/dist/chunk-N4MZYNR4.mjs +0 -1342
  131. package/dist/chunk-N4MZYNR4.mjs.map +0 -1
  132. package/dist/chunk-NTVBIIUD.mjs +0 -1439
  133. package/dist/chunk-NTVBIIUD.mjs.map +0 -1
  134. package/dist/chunk-OBRSGM64.mjs +0 -607
  135. package/dist/chunk-OBRSGM64.mjs.map +0 -1
  136. package/dist/chunk-ODO4GMW7.mjs +0 -79
  137. package/dist/chunk-ODO4GMW7.mjs.map +0 -1
  138. package/dist/chunk-OLISEQHS.cjs +0 -18
  139. package/dist/chunk-PVAX67JG.mjs +0 -1041
  140. package/dist/chunk-PVAX67JG.mjs.map +0 -1
  141. package/dist/chunk-QJ6GTUCO.cjs +0 -81
  142. package/dist/chunk-QJ6GTUCO.cjs.map +0 -1
  143. package/dist/chunk-T3MWM23F.cjs +0 -214
  144. package/dist/chunk-T3MWM23F.cjs.map +0 -1
  145. package/dist/chunk-TBSHZO5R.cjs +0 -1134
  146. package/dist/chunk-TBSHZO5R.cjs.map +0 -1
  147. package/dist/chunk-UNCS5V5F.mjs +0 -887
  148. package/dist/chunk-UNCS5V5F.mjs.map +0 -1
  149. package/dist/chunk-VWQ5WOIL.mjs +0 -2059
  150. package/dist/chunk-VWQ5WOIL.mjs.map +0 -1
  151. package/dist/chunk-W75B7Y6C.cjs +0 -1478
  152. package/dist/chunk-W75B7Y6C.cjs.map +0 -1
  153. package/dist/chunk-Y6UTOBF6.mjs +0 -938
  154. package/dist/chunk-Y6UTOBF6.mjs.map +0 -1
  155. package/dist/chunk-YDPDTOSP.cjs +0 -2061
  156. package/dist/chunk-YDPDTOSP.cjs.map +0 -1
  157. package/dist/chunk-YW5IVWHQ.cjs +0 -346
  158. package/dist/chunk-YW5IVWHQ.cjs.map +0 -1
  159. package/dist/chunk-YXZ6GU7H.cjs +0 -63
  160. package/dist/chunk-YXZ6GU7H.cjs.map +0 -1
  161. package/dist/chunk-ZL7FH4NW.mjs +0 -1274
  162. package/dist/chunk-ZL7FH4NW.mjs.map +0 -1
  163. package/dist/components-EHOGXATG.cjs +0 -22
  164. package/dist/components-EHOGXATG.cjs.map +0 -1
  165. package/dist/components-MQ6DR7TX.cjs +0 -26
  166. package/dist/components-MQ6DR7TX.cjs.map +0 -1
  167. package/dist/components-XRX7QGLB.mjs +0 -5
  168. package/dist/components-XRX7QGLB.mjs.map +0 -1
  169. package/dist/components-YATKRWLH.mjs +0 -5
  170. package/dist/components-YATKRWLH.mjs.map +0 -1
  171. package/dist/index.cjs +0 -3674
  172. package/dist/index.cjs.map +0 -1
  173. package/dist/index.css +0 -234
  174. package/dist/index.css.map +0 -1
  175. package/dist/index.d.cts +0 -4929
  176. package/dist/index.d.ts +0 -4929
  177. package/dist/index.mjs +0 -2912
  178. package/dist/index.mjs.map +0 -1
  179. package/dist/launcher-5Y42OBSN.mjs +0 -6
  180. package/dist/launcher-5Y42OBSN.mjs.map +0 -1
  181. package/dist/launcher-PMW2YB24.cjs +0 -59
  182. package/dist/launcher-PMW2YB24.cjs.map +0 -1
  183. package/src/index.ts +0 -157
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
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","../../src/tools/Tree/components/TreeSkeleton.tsx","../../src/tools/Tree/components/TreeError.tsx","../../src/tools/Tree/data/createDemoTree.ts"],"names":["children","jsx","cn","memo","Fragment","useMemo","useCallback","jsxs","useRef","useEffect"],"mappings":"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","file":"index.mjs","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 { memo } from 'react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useTreeContext } from '../context/TreeContext';\n\nexport interface TreeChevronProps {\n isExpanded: boolean;\n isFolder: boolean;\n className?: string;\n}\n\n/**\n * TreeChevron — expand/collapse chevron for a tree row.\n *\n * Memoised: re-renders only when `isExpanded`, `isFolder` or `className`\n * change. Reads appearance from context.\n */\nfunction TreeChevronRaw({ isExpanded, isFolder, className }: TreeChevronProps) {\n const { appearance } = useTreeContext();\n const size = { width: 'var(--tree-icon-size)', height: 'var(--tree-icon-size)' };\n\n if (!isFolder) {\n return (\n <span\n aria-hidden\n style={size}\n className={cn('inline-block shrink-0', className)}\n />\n );\n }\n const Icon = isExpanded ? ChevronDown : ChevronRight;\n return (\n <Icon\n aria-hidden\n strokeWidth={appearance.iconStrokeWidth}\n style={size}\n className={cn(\n 'shrink-0 text-muted-foreground/70 transition-transform',\n className,\n )}\n />\n );\n}\n\nexport const TreeChevron = memo(TreeChevronRaw);\n","'use client';\n\nimport { File, Folder, FolderOpen } from 'lucide-react';\nimport { memo } from 'react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useTreeContext } from '../context/TreeContext';\n\nexport interface TreeIconProps {\n isFolder: boolean;\n isExpanded: boolean;\n className?: string;\n}\n\n/**\n * TreeIcon — file/folder icon for a tree row.\n *\n * Memoised: re-renders only when `isFolder`, `isExpanded` or `className`\n * change. Reads appearance from context — context updates will still\n * trigger re-render as expected.\n */\nfunction TreeIconRaw({ isFolder, isExpanded, className }: TreeIconProps) {\n const { appearance } = useTreeContext();\n const Icon = isFolder ? (isExpanded ? FolderOpen : Folder) : File;\n return (\n <Icon\n aria-hidden\n strokeWidth={appearance.iconStrokeWidth}\n style={{ width: 'var(--tree-icon-size)', height: 'var(--tree-icon-size)' }}\n className={cn(\n 'shrink-0',\n isFolder ? 'text-foreground/70' : 'text-muted-foreground/80',\n className,\n )}\n />\n );\n}\n\nexport const TreeIcon = memo(TreeIconRaw);\n","'use client';\n\nimport { useTreeContext } from '../context/TreeContext';\n\nexport interface TreeIndentGuidesProps {\n level: number;\n indent: number;\n}\n\n/**\n * Vertical guide lines under nested rows. Renders one absolute-positioned\n * 1px column per ancestor level. Decorative — `aria-hidden` and\n * pointer-events disabled. Opacity comes from the tree appearance.\n */\nexport function TreeIndentGuides({ level, indent }: TreeIndentGuidesProps) {\n const { appearance } = useTreeContext();\n if (level <= 0) return null;\n return (\n <span\n aria-hidden\n className=\"pointer-events-none absolute inset-y-0 left-0\"\n style={{ width: 8 + level * indent, opacity: appearance.indentGuideOpacity }}\n >\n {Array.from({ length: level }).map((_, i) => (\n <span\n key={i}\n className=\"absolute inset-y-0 w-px bg-border\"\n style={{ left: 8 + i * indent + indent / 2 - 0.5 }}\n />\n ))}\n </span>\n );\n}\n","'use client';\n\nimport { memo } from 'react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nexport interface TreeLabelProps {\n children: React.ReactNode;\n isMatchingSearch?: boolean;\n className?: string;\n}\n\n/**\n * TreeLabel — truncated label for a tree row.\n *\n * Memoised: re-renders only when `children`, `isMatchingSearch` or\n * `className` change. `children` is compared by reference.\n */\nfunction TreeLabelRaw({ children, isMatchingSearch, className }: TreeLabelProps) {\n return (\n <span\n 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\nexport const TreeLabel = memo(TreeLabelRaw);\n","'use client';\n\nimport { Loader2 } from 'lucide-react';\nimport { memo } from '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\n/**\n * TreeRow — single row in a virtualised tree.\n *\n * Memoised: re-renders only when `row` reference or `className` change.\n * `row` is treated as immutable — the parent should not mutate node\n * objects in place.\n */\nfunction TreeRowRaw<T>({ row, className }: TreeRowProps<T>) {\n const ctx = useTreeContext<T>();\n const {\n appearance,\n activationMode,\n showIndentGuides,\n selected,\n focused,\n matchingIds,\n select,\n 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\nexport const TreeRow = memo(TreeRowRaw) as typeof TreeRowRaw;\n","'use client';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\nexport interface TreeEmptyProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport function TreeEmpty({ children, className }: TreeEmptyProps) {\n return (\n <div\n className={cn(\n 'flex h-full min-h-32 items-center justify-center px-4 py-6 text-sm text-muted-foreground',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","'use client';\n\nimport { Fragment, type ReactNode } from 'react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useTreeContext } from '../context/TreeContext';\nimport { appearanceToStyle } from '../data/appearance';\nimport type { FlatRow, TreeRowRenderProps, TreeRowSlot } from '../types';\nimport { TreeRow } from './TreeRow';\nimport { TreeEmpty } from './TreeEmpty';\n\nexport interface TreeContentProps<T> {\n /** Custom row renderer; falls back to <TreeRow />. */\n children?: TreeRowSlot<T>;\n className?: string;\n /** Override aria-label for the container. */\n ariaLabel?: string;\n}\n\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","'use client';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\nexport interface TreeSkeletonProps {\n rows?: number;\n className?: string;\n}\n\nexport function TreeSkeleton({ rows = 6, className }: TreeSkeletonProps) {\n return (\n <div className={cn('flex flex-col gap-1 p-2', className)} aria-hidden>\n {Array.from({ length: rows }).map((_, i) => (\n <div key={i} className=\"flex items-center gap-2\" style={{ paddingLeft: (i % 3) * 16 }}>\n <span className=\"size-4 shrink-0 animate-pulse rounded bg-muted\" />\n <span className=\"size-4 shrink-0 animate-pulse rounded bg-muted\" />\n <span className=\"h-3 flex-1 animate-pulse rounded bg-muted\" />\n </div>\n ))}\n </div>\n );\n}\n","'use client';\n\nimport { AlertCircle } from 'lucide-react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nexport interface TreeErrorProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport function TreeError({ children, className }: TreeErrorProps) {\n return (\n <div\n className={cn(\n 'flex items-start gap-2 rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive',\n className,\n )}\n role=\"alert\"\n >\n <AlertCircle aria-hidden className=\"mt-0.5 size-4 shrink-0\" />\n <span>{children}</span>\n </div>\n );\n}\n","'use client';\n\nimport type { TreeNode } from '../types';\n\nexport interface DemoNode {\n name: string;\n}\n\n/**\n * Build a deterministic synthetic tree for stories and tests.\n *\n * @example\n * const data = createDemoTree({ depth: 4, breadth: 3 });\n * <TreeRoot data={data} getItemName={(n) => n.data.name} />\n */\nexport function createDemoTree({\n depth = 3,\n breadth = 4,\n rootPrefix = 'node',\n}: {\n depth?: number;\n breadth?: number;\n rootPrefix?: string;\n} = {}): TreeNode<DemoNode>[] {\n const make = (id: string, name: string, level: number): TreeNode<DemoNode> => {\n if (level >= depth) {\n return { id, data: { name } };\n }\n const children: TreeNode<DemoNode>[] = [];\n for (let i = 0; i < breadth; i++) {\n const childId = `${id}/${i}`;\n children.push(make(childId, `${name}-${i}`, level + 1));\n }\n return { id, data: { name }, children };\n };\n\n const roots: TreeNode<DemoNode>[] = [];\n for (let i = 0; i < breadth; i++) {\n roots.push(make(`${rootPrefix}-${i}`, `${rootPrefix} ${i}`, 1));\n }\n return roots;\n}\n"]}
@@ -201,4 +201,4 @@ interface FlatRow<T> {
201
201
  hasError: boolean;
202
202
  }
203
203
 
204
- export { DEFAULT_TREE_LABELS as D, type FlatRow as F, type ResolvedAppearance as R, type TreeNode as T, type TreeRowSlot as a, type TreeRootProps as b, DEFAULT_TREE_APPEARANCE as c, appearanceToStyle as d, type TreeContextMenuSlot as e, type TreeItemId as f, type TreeLabels as g, type TreeSelectionMode as h, type TreeRowRenderProps as i, type TreeLoadChildren as j, type TreeAppearance as k, type TreeDensity as l, type TreeAccentIntensity as m, type TreeRadius as n, type TreeActivateOptions as o, type TreeActivationMode as p, resolveAppearance as r };
204
+ export { DEFAULT_TREE_APPEARANCE as D, type FlatRow as F, type ResolvedAppearance as R, type TreeRootProps as T, type TreeItemId as a, type TreeNode as b, type TreeActivateOptions as c, type TreeLabels as d, type TreeSelectionMode as e, type TreeActivationMode as f, type TreeRowSlot as g, type TreeContextMenuSlot as h, appearanceToStyle as i, type TreeAppearance as j, type TreeDensity as k, type TreeAccentIntensity as l, type TreeRadius as m, DEFAULT_TREE_LABELS as n, type TreeRowRenderProps as o, type TreeLoadChildren as p, resolveAppearance as r };
@@ -201,4 +201,4 @@ interface FlatRow<T> {
201
201
  hasError: boolean;
202
202
  }
203
203
 
204
- export { DEFAULT_TREE_LABELS as D, type FlatRow as F, type ResolvedAppearance as R, type TreeNode as T, type TreeRowSlot as a, type TreeRootProps as b, DEFAULT_TREE_APPEARANCE as c, appearanceToStyle as d, type TreeContextMenuSlot as e, type TreeItemId as f, type TreeLabels as g, type TreeSelectionMode as h, type TreeRowRenderProps as i, type TreeLoadChildren as j, type TreeAppearance as k, type TreeDensity as l, type TreeAccentIntensity as m, type TreeRadius as n, type TreeActivateOptions as o, type TreeActivationMode as p, resolveAppearance as r };
204
+ export { DEFAULT_TREE_APPEARANCE as D, type FlatRow as F, type ResolvedAppearance as R, type TreeRootProps as T, type TreeItemId as a, type TreeNode as b, type TreeActivateOptions as c, type TreeLabels as d, type TreeSelectionMode as e, type TreeActivationMode as f, type TreeRowSlot as g, type TreeContextMenuSlot as h, appearanceToStyle as i, type TreeAppearance as j, type TreeDensity as k, type TreeAccentIntensity as l, type TreeRadius as m, DEFAULT_TREE_LABELS as n, type TreeRowRenderProps as o, type TreeLoadChildren as p, resolveAppearance as r };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@djangocfg/ui-tools",
3
- "version": "2.1.390",
3
+ "version": "2.1.393",
4
4
  "description": "Heavy React tools with lazy loading - for Electron, Vite, CRA, Next.js apps",
5
5
  "keywords": [
6
6
  "ui-tools",
@@ -30,15 +30,7 @@
30
30
  },
31
31
  "license": "MIT",
32
32
  "type": "module",
33
- "main": "./dist/index.cjs",
34
- "module": "./dist/index.mjs",
35
- "types": "./dist/index.d.ts",
36
33
  "exports": {
37
- ".": {
38
- "types": "./dist/index.d.ts",
39
- "import": "./dist/index.mjs",
40
- "require": "./dist/index.cjs"
41
- },
42
34
  "./gallery": {
43
35
  "types": "./src/tools/Gallery/index.ts",
44
36
  "import": "./src/tools/Gallery/index.ts",
@@ -162,8 +154,8 @@
162
154
  "test:watch": "vitest"
163
155
  },
164
156
  "peerDependencies": {
165
- "@djangocfg/i18n": "^2.1.390",
166
- "@djangocfg/ui-core": "^2.1.390",
157
+ "@djangocfg/i18n": "^2.1.393",
158
+ "@djangocfg/ui-core": "^2.1.393",
167
159
  "consola": "^3.4.2",
168
160
  "lodash-es": "^4.18.1",
169
161
  "lucide-react": "^0.545.0",
@@ -217,9 +209,9 @@
217
209
  "material-file-icons": "^2.4.0"
218
210
  },
219
211
  "devDependencies": {
220
- "@djangocfg/i18n": "^2.1.390",
221
- "@djangocfg/typescript-config": "^2.1.390",
222
- "@djangocfg/ui-core": "^2.1.390",
212
+ "@djangocfg/i18n": "^2.1.393",
213
+ "@djangocfg/typescript-config": "^2.1.393",
214
+ "@djangocfg/ui-core": "^2.1.393",
223
215
  "@types/lodash-es": "^4.17.12",
224
216
  "@types/mapbox__mapbox-gl-draw": "^1.4.8",
225
217
  "@types/node": "^24.7.2",
@@ -9,7 +9,7 @@ Architecture, ADRs and the visual direction live at
9
9
  ## Quick start
10
10
 
11
11
  ```tsx
12
- import { LazyAudioPlayer } from '@djangocfg/ui-tools';
12
+ import { LazyAudioPlayer } from '@djangocfg/ui-tools/audio-player';
13
13
 
14
14
  <LazyAudioPlayer
15
15
  src="/audio/track.mp3"
@@ -96,7 +96,7 @@ import {
96
96
  useActivePlayer, // currently playing id (or null)
97
97
  useLastActivePlayer, // most recently active id (sticky)
98
98
  useIsActivePlayer, // boolean for a specific id
99
- } from '@djangocfg/ui-tools';
99
+ } from '@djangocfg/ui-tools/audio-player';
100
100
  ```
101
101
 
102
102
  ## Custom layouts (slot composition)
@@ -110,7 +110,7 @@ import {
110
110
  Cover, Title, Artist, TimeDisplay,
111
111
  PlayButton, VolumeControl, LoopButton,
112
112
  Waveform,
113
- } from '@djangocfg/ui-tools';
113
+ } from '@djangocfg/ui-tools/audio-player';
114
114
 
115
115
  <PlayerProvider src="/track.mp3" title="…" artist="…" cover="/cover.jpg">
116
116
  <div className="grid grid-cols-[96px_1fr_auto] gap-4 rounded-lg border bg-card p-4">
@@ -156,7 +156,7 @@ import {
156
156
  usePlayerPaused, // boolean shortcut
157
157
  usePlayerDuration, // number shortcut
158
158
  usePlayerPreferences, // { volume, muted } from the persistent store
159
- } from '@djangocfg/ui-tools';
159
+ } from '@djangocfg/ui-tools/audio-player';
160
160
  ```
161
161
 
162
162
  These work inside `<Player>`'s tree; if you need your own JSX around the
@@ -5,7 +5,7 @@ Decomposed, transport-agnostic chat. Streaming-aware, markdown-native, mobile-re
5
5
  ## TL;DR
6
6
 
7
7
  ```tsx
8
- import { ChatRoot, createPydanticAIChatTransport, ChatLauncher } from '@djangocfg/ui-tools';
8
+ import { ChatRoot, createPydanticAIChatTransport, ChatLauncher } from '@djangocfg/ui-tools/chat';
9
9
 
10
10
  const transport = createPydanticAIChatTransport({
11
11
  buildStreamUrl: (sid, msg) => `${API}/chat/sessions/${sid}/stream?message=${encodeURIComponent(msg)}`,
@@ -322,7 +322,7 @@ const audio = useChatAudio();
322
322
  Customize:
323
323
 
324
324
  ```tsx
325
- import { useChatAudio, DEFAULT_CHAT_SOUNDS } from '@djangocfg/ui-tools';
325
+ import { useChatAudio, DEFAULT_CHAT_SOUNDS } from '@djangocfg/ui-tools/chat';
326
326
 
327
327
  // Override one event, keep the rest
328
328
  useChatAudio({ sounds: { ...DEFAULT_CHAT_SOUNDS, mention: '/sfx/custom.mp3' } });
@@ -387,7 +387,7 @@ Calls `window.dialog.confirm` (destructive variant) from `@djangocfg/ui-core/lib
387
387
 
388
388
  ```tsx
389
389
  // ❌ DON'T: ChatRoot from `dist`, VoiceComposerSlot from `src` → two contexts
390
- import { ChatRoot } from '@djangocfg/ui-tools';
390
+ import { ChatRoot } from '@djangocfg/ui-tools/chat';
391
391
  import { VoiceComposerSlot } from '@djangocfg/ui-tools/speech-recognition';
392
392
  // ^^^^^^^^^^^^^^^^^^^
393
393
  // VoiceComposerSlot's internal useChatContextOptional() reads a DIFFERENT
@@ -408,7 +408,7 @@ If two ChatProvider context instances ever end up in the same page, `ChatProvide
408
408
  Every chat surface that depends on role/error state uses the centralized tokens, not inline Tailwind literals. Change `bg-primary`/contrast in one file — fixes every consumer.
409
409
 
410
410
  ```ts
411
- import { BUBBLE_SURFACE, ANCHOR, TOGGLE, DESTRUCTIVE_SURFACE } from '@djangocfg/ui-tools';
411
+ import { BUBBLE_SURFACE, ANCHOR, TOGGLE, DESTRUCTIVE_SURFACE } from '@djangocfg/ui-tools/chat';
412
412
 
413
413
  // Token shape
414
414
  BUBBLE_SURFACE.user // 'bg-primary text-primary-foreground rounded-tr-md'
@@ -424,7 +424,7 @@ DESTRUCTIVE_SURFACE.banner / .hover / .hoverStrong / .text / .menuItem
424
424
  Prefer hooks in components — they memoize and present a stable facade:
425
425
 
426
426
  ```tsx
427
- import { useChatBubbleStyles, useChatRoleStyles, useChatDestructiveStyles } from '@djangocfg/ui-tools';
427
+ import { useChatBubbleStyles, useChatRoleStyles, useChatDestructiveStyles } from '@djangocfg/ui-tools/chat';
428
428
 
429
429
  function MyBubble({ message }) {
430
430
  const { surface, anchor } = useChatBubbleStyles(message.role, !!message.isError);
@@ -472,7 +472,7 @@ import {
472
472
  createPydanticAISSEMap,
473
473
  mapPydanticAIEvent,
474
474
  createToolIdQueue,
475
- } from '@djangocfg/ui-tools';
475
+ } from '@djangocfg/ui-tools/chat';
476
476
 
477
477
  // In a custom transport / hand-rolled stream loop:
478
478
  const toolIds = createToolIdQueue();
@@ -7,7 +7,7 @@
7
7
  * Lazy-loaded for optimal bundle size (~15KB).
8
8
  *
9
9
  * @example
10
- * import { CronScheduler } from '@djangocfg/ui-tools';
10
+ * import { CronScheduler } from '@djangocfg/ui-tools/cron-scheduler';
11
11
  *
12
12
  * <CronScheduler
13
13
  * value={cron}
@@ -7,7 +7,7 @@
7
7
  * Use this for automatic code-splitting with Suspense fallback.
8
8
  *
9
9
  * @example
10
- * import { LazyCronScheduler } from '@djangocfg/ui-tools';
10
+ * import { LazyCronScheduler } from '@djangocfg/ui-tools/cron-scheduler';
11
11
  *
12
12
  * <LazyCronScheduler
13
13
  * value={cron}
@@ -18,7 +18,7 @@ Image viewer with zoom, pan, rotate, flip and gallery navigation.
18
18
  ## Installation
19
19
 
20
20
  ```tsx
21
- import { ImageViewer } from '@djangocfg/ui-tools';
21
+ import { ImageViewer } from '@djangocfg/ui-tools/image-viewer';
22
22
  ```
23
23
 
24
24
  ## Basic Usage
@@ -5,7 +5,7 @@ Schema-driven forms on top of [react-jsonschema-form](https://github.com/rjsf-te
5
5
  ```tsx
6
6
  import { JsonSchemaForm } from '@djangocfg/ui-tools/json-form';
7
7
  // or, for code-splitting:
8
- import { LazyJsonSchemaForm } from '@djangocfg/ui-tools';
8
+ import { LazyJsonSchemaForm } from '@djangocfg/ui-tools/json-form';
9
9
 
10
10
  const schema = {
11
11
  type: 'object',
@@ -236,7 +236,7 @@ import type {
236
236
  DisabledWhenRule,
237
237
  UiGroup,
238
238
  JsonFormContext,
239
- } from '@djangocfg/ui-tools';
239
+ } from '@djangocfg/ui-tools/json-form';
240
240
  ```
241
241
 
242
242
  ### Portable schema types (`CustomJson*`)
@@ -18,7 +18,7 @@ WYSIWYG markdown editor based on Tiptap. Renders markdown visually (headings, li
18
18
  ## Quick Start
19
19
 
20
20
  ```tsx
21
- import { MarkdownEditor } from '@djangocfg/ui-tools';
21
+ import { MarkdownEditor } from '@djangocfg/ui-tools/markdown-editor';
22
22
 
23
23
  function MyComponent() {
24
24
  const [bio, setBio] = useState('# Hello\n\nThis is **markdown**.');
@@ -96,7 +96,7 @@ By default Tiptap's `Mention` extension emits a useless shortcode like `[@ id=".
96
96
  Six presets are exported from `@djangocfg/ui-tools`:
97
97
 
98
98
  ```tsx
99
- import { MarkdownEditor, mentionPresets } from '@djangocfg/ui-tools';
99
+ import { MarkdownEditor, mentionPresets } from '@djangocfg/ui-tools/markdown-editor';
100
100
 
101
101
  <MarkdownEditor
102
102
  value={text}
@@ -131,7 +131,7 @@ Pick by use case:
131
131
  The signature is just `(attrs: MentionAttrs) => string`:
132
132
 
133
133
  ```tsx
134
- import type { MentionMarkdownRenderer } from '@djangocfg/ui-tools';
134
+ import type { MentionMarkdownRenderer } from '@djangocfg/ui-tools/markdown-editor';
135
135
 
136
136
  const renderMention: MentionMarkdownRenderer = ({ id, label }) =>
137
137
  `{{user:${id}|${label}}}`;
@@ -3,7 +3,7 @@
3
3
  Chat-tuned, read-only markdown renderer. Drop-in for any chat bubble — assistant or user.
4
4
 
5
5
  ```tsx
6
- import { MarkdownMessage } from '@djangocfg/ui-tools';
6
+ import { MarkdownMessage } from '@djangocfg/ui-tools/markdown-message';
7
7
 
8
8
  <MarkdownMessage content={text} isUser={false} />
9
9
  ```
@@ -106,7 +106,7 @@ The split exists because:
106
106
  uses for the same reason.
107
107
 
108
108
  ```tsx
109
- import { MarkdownMessage, ChatMessageRow, ActionRow } from '@djangocfg/ui-tools';
109
+ import { MarkdownMessage, ChatMessageRow, ActionRow } from '@djangocfg/ui-tools/markdown-message';
110
110
 
111
111
  function ChatBubble({ role, content }) {
112
112
  const isUser = role === 'user';
@@ -49,7 +49,11 @@ const methodRank = (ep: ApiEndpoint) => METHOD_ORDER[ep.method] ?? 99;
49
49
  * cluster), then by HTTP method (read → write → delete).
50
50
  */
51
51
  export function groupEndpoints(list: ApiEndpoint[]): EndpointGroup[] {
52
- const byCategory = groupBy(list, 'category');
52
+ // Explicit cast: lodash's `groupBy` overload with a string key returns
53
+ // `Dictionary<T[]>` but the type narrows to `unknown` under strict TS in
54
+ // some setups (subpath consumers compiling raw src). Cast preserves the
55
+ // runtime behaviour and keeps `.map(e => e.path)` typed correctly.
56
+ const byCategory = groupBy(list, 'category') as Record<string, ApiEndpoint[]>;
53
57
  const all: EndpointGroup[] = Object.entries(byCategory).map(([category, endpoints]) => ({
54
58
  category,
55
59
  endpoints: orderBy(endpoints, ['path', methodRank], ['asc', 'asc']),
@@ -283,7 +283,7 @@ const unsubscribe = useSpeechPrefs.subscribe((state) => {
283
283
  Scoped, namespaced [consola](https://github.com/unjs/consola) wrapper that silences itself in production by default. Mirrors `getChatLogger()` in the Chat tool so both surfaces feel the same in DevTools.
284
284
 
285
285
  ```ts
286
- import { getSpeechLogger } from '@djangocfg/ui-tools';
286
+ import { getSpeechLogger } from '@djangocfg/ui-tools/speech-recognition';
287
287
 
288
288
  const log = getSpeechLogger();
289
289
  log.dictation.info('final merged', { len: 42 });
@@ -1,15 +0,0 @@
1
- 'use strict';
2
-
3
- var chunk4LFB7I5K_cjs = require('./chunk-4LFB7I5K.cjs');
4
- require('./chunk-TBSHZO5R.cjs');
5
- require('./chunk-7IYXZUJO.cjs');
6
- require('./chunk-OLISEQHS.cjs');
7
-
8
-
9
-
10
- Object.defineProperty(exports, "ChatRoot", {
11
- enumerable: true,
12
- get: function () { return chunk4LFB7I5K_cjs.ChatRoot; }
13
- });
14
- //# sourceMappingURL=ChatRoot-EFNXQXXN.cjs.map
15
- //# sourceMappingURL=ChatRoot-EFNXQXXN.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"ChatRoot-EFNXQXXN.cjs"}
@@ -1,6 +0,0 @@
1
- export { ChatRoot } from './chunk-6ZX2G25W.mjs';
2
- import './chunk-DMX7W4XZ.mjs';
3
- import './chunk-2NG4SXEP.mjs';
4
- import './chunk-N2XQF2OL.mjs';
5
- //# sourceMappingURL=ChatRoot-FITF5RVP.mjs.map
6
- //# sourceMappingURL=ChatRoot-FITF5RVP.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"ChatRoot-FITF5RVP.mjs"}
@@ -1,7 +0,0 @@
1
- @source "../src/**/*.{ts,tsx}";
2
- /* src/components/FloatingToolbar/FloatingToolbar.css */
3
- .scroll-unlocked {
4
- box-shadow: 0 0 0 2px hsl(var(--ring));
5
- transition: box-shadow 150ms;
6
- }
7
- /*# sourceMappingURL=ChatRoot-PNNGQCYF.css.map */
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/FloatingToolbar/FloatingToolbar.css"],"sourcesContent":["/* Focus ring when scroll isolation is unlocked */\n.scroll-unlocked {\n box-shadow: 0 0 0 2px hsl(var(--ring));\n transition: box-shadow 150ms;\n}\n"],"mappings":";AACA,CAAC;AACC,cAAY,EAAE,EAAE,EAAE,IAAI,IAAI,IAAI;AAC9B,cAAY,WAAW;AACzB;","names":[]}