jaci-ui 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/README.md +37 -0
- package/dist/components/command/command.cjs +55 -34
- package/dist/components/command/command.cjs.map +1 -1
- package/dist/components/command/command.d.cts +1 -0
- package/dist/components/command/command.d.ts +1 -0
- package/dist/components/command/command.js +55 -34
- package/dist/components/command/command.js.map +1 -1
- package/dist/components/data-toolbar/data-toolbar.cjs +141 -0
- package/dist/components/data-toolbar/data-toolbar.cjs.map +1 -0
- package/dist/components/data-toolbar/data-toolbar.d.cts +50 -0
- package/dist/components/data-toolbar/data-toolbar.d.ts +50 -0
- package/dist/components/data-toolbar/data-toolbar.js +132 -0
- package/dist/components/data-toolbar/data-toolbar.js.map +1 -0
- package/dist/components/data-toolbar/index.d.cts +2 -0
- package/dist/components/data-toolbar/index.d.ts +2 -0
- package/dist/components/data-view/data-view.cjs +33 -1
- package/dist/components/data-view/data-view.cjs.map +1 -1
- package/dist/components/data-view/data-view.d.cts +12 -1
- package/dist/components/data-view/data-view.d.ts +12 -1
- package/dist/components/data-view/data-view.js +31 -2
- package/dist/components/data-view/data-view.js.map +1 -1
- package/dist/components/data-view/index.d.cts +2 -2
- package/dist/components/data-view/index.d.ts +2 -2
- package/dist/components/list/list.cjs +3 -1
- package/dist/components/list/list.cjs.map +1 -1
- package/dist/components/list/list.d.cts +3 -1
- package/dist/components/list/list.d.ts +3 -1
- package/dist/components/list/list.js +3 -1
- package/dist/components/list/list.js.map +1 -1
- package/dist/components/pagination/index.d.cts +2 -2
- package/dist/components/pagination/index.d.ts +2 -2
- package/dist/components/pagination/pagination.cjs +122 -21
- package/dist/components/pagination/pagination.cjs.map +1 -1
- package/dist/components/pagination/pagination.d.cts +25 -13
- package/dist/components/pagination/pagination.d.ts +25 -13
- package/dist/components/pagination/pagination.js +122 -23
- package/dist/components/pagination/pagination.js.map +1 -1
- package/dist/components/table/index.d.cts +2 -2
- package/dist/components/table/index.d.ts +2 -2
- package/dist/components/table/table.cjs +265 -46
- package/dist/components/table/table.cjs.map +1 -1
- package/dist/components/table/table.d.cts +41 -8
- package/dist/components/table/table.d.ts +41 -8
- package/dist/components/table/table.js +264 -48
- package/dist/components/table/table.js.map +1 -1
- package/dist/components/tree-view/index.d.cts +2 -2
- package/dist/components/tree-view/index.d.ts +2 -2
- package/dist/components/tree-view/tree-view.cjs +60 -3
- package/dist/components/tree-view/tree-view.cjs.map +1 -1
- package/dist/components/tree-view/tree-view.d.cts +12 -1
- package/dist/components/tree-view/tree-view.d.ts +12 -1
- package/dist/components/tree-view/tree-view.js +58 -4
- package/dist/components/tree-view/tree-view.js.map +1 -1
- package/dist/index.cjs +22 -0
- package/dist/index.d.cts +7 -5
- package/dist/index.d.ts +7 -5
- package/dist/index.js +6 -5
- package/dist/styled-system/recipes/data-toolbar.cjs +40 -0
- package/dist/styled-system/recipes/data-toolbar.cjs.map +1 -0
- package/dist/styled-system/recipes/data-toolbar.js +40 -0
- package/dist/styled-system/recipes/data-toolbar.js.map +1 -0
- package/dist/styled-system/recipes/data-view.cjs +3 -0
- package/dist/styled-system/recipes/data-view.cjs.map +1 -1
- package/dist/styled-system/recipes/data-view.js +3 -0
- package/dist/styled-system/recipes/data-view.js.map +1 -1
- package/dist/styled-system/recipes/list.cjs +7 -1
- package/dist/styled-system/recipes/list.cjs.map +1 -1
- package/dist/styled-system/recipes/list.js +7 -1
- package/dist/styled-system/recipes/list.js.map +1 -1
- package/dist/styled-system/recipes/pagination.cjs +9 -1
- package/dist/styled-system/recipes/pagination.cjs.map +1 -1
- package/dist/styled-system/recipes/pagination.js +9 -1
- package/dist/styled-system/recipes/pagination.js.map +1 -1
- package/dist/styled-system/recipes/table.cjs +15 -2
- package/dist/styled-system/recipes/table.cjs.map +1 -1
- package/dist/styled-system/recipes/table.js +15 -2
- package/dist/styled-system/recipes/table.js.map +1 -1
- package/dist/styled-system/recipes/tree-view.cjs +4 -1
- package/dist/styled-system/recipes/tree-view.cjs.map +1 -1
- package/dist/styled-system/recipes/tree-view.js +4 -1
- package/dist/styled-system/recipes/tree-view.js.map +1 -1
- package/dist/styles.css +237 -1
- package/package.json +1 -1
|
@@ -47,7 +47,7 @@ const TreeViewRoot = (0, react.forwardRef)(function TreeViewRoot({ children, cla
|
|
|
47
47
|
const node = nodesRef.current.get(id);
|
|
48
48
|
if (node) node.element = element;
|
|
49
49
|
}, []);
|
|
50
|
-
const hasChildren = (0, react.useCallback)((id) => nodes.some((node) => node.parentId === id), [nodes]);
|
|
50
|
+
const hasChildren = (0, react.useCallback)((id) => nodes.some((node) => node.parentId === id) || Boolean(nodes.find((node) => node.id === id)?.hasChildren), [nodes]);
|
|
51
51
|
const isVisible = (0, react.useCallback)((id) => {
|
|
52
52
|
let current = nodes.find((node) => node.id === id);
|
|
53
53
|
while (current?.parentId) {
|
|
@@ -199,7 +199,7 @@ const TreeViewRoot = (0, react.forwardRef)(function TreeViewRoot({ children, cla
|
|
|
199
199
|
})
|
|
200
200
|
});
|
|
201
201
|
});
|
|
202
|
-
const TreeViewItem = (0, react.forwardRef)(function TreeViewItem({ children, className, disabled = false, onClick, onFocus, onKeyDown, style, selectable = true, id, ...props }, ref) {
|
|
202
|
+
const TreeViewItem = (0, react.forwardRef)(function TreeViewItem({ children, className, disabled = false, hasChildren: hasChildrenProp = false, loading = false, onClick, onFocus, onKeyDown, style, selectable = true, id, ...props }, ref) {
|
|
203
203
|
const context = useTreeViewContext();
|
|
204
204
|
const parentId = (0, react.useContext)(TreeParentContext);
|
|
205
205
|
const styles = require_tree_view.treeView();
|
|
@@ -207,13 +207,17 @@ const TreeViewItem = (0, react.forwardRef)(function TreeViewItem({ children, cla
|
|
|
207
207
|
id,
|
|
208
208
|
parentId,
|
|
209
209
|
disabled,
|
|
210
|
+
hasChildren: hasChildrenProp,
|
|
211
|
+
loading,
|
|
210
212
|
selectable,
|
|
211
213
|
order: 0,
|
|
212
214
|
element: null
|
|
213
215
|
}), [
|
|
214
216
|
context.registerNode,
|
|
215
217
|
disabled,
|
|
218
|
+
hasChildrenProp,
|
|
216
219
|
id,
|
|
220
|
+
loading,
|
|
217
221
|
parentId,
|
|
218
222
|
selectable
|
|
219
223
|
]);
|
|
@@ -239,6 +243,7 @@ const TreeViewItem = (0, react.forwardRef)(function TreeViewItem({ children, cla
|
|
|
239
243
|
},
|
|
240
244
|
"aria-disabled": disabled || void 0,
|
|
241
245
|
"aria-expanded": context.hasChildren(id) ? context.expanded.has(id) : void 0,
|
|
246
|
+
"aria-busy": loading || void 0,
|
|
242
247
|
"aria-level": registeredNode ? context.getDepth(id) : parentId ? 2 : 1,
|
|
243
248
|
"aria-posinset": siblingIndex >= 0 ? siblingIndex + 1 : 1,
|
|
244
249
|
"aria-setsize": siblings.length || 1,
|
|
@@ -248,6 +253,7 @@ const TreeViewItem = (0, react.forwardRef)(function TreeViewItem({ children, cla
|
|
|
248
253
|
"data-expanded": context.expanded.has(id) || void 0,
|
|
249
254
|
"data-jaci-component": "tree-view",
|
|
250
255
|
"data-selected": selected || void 0,
|
|
256
|
+
"data-loading": loading || void 0,
|
|
251
257
|
"data-slot": "tree-view-item",
|
|
252
258
|
onClick: (event) => {
|
|
253
259
|
event.stopPropagation();
|
|
@@ -303,12 +309,16 @@ const TreeViewGroup = (0, react.forwardRef)(function TreeViewGroup({ children, c
|
|
|
303
309
|
const TreeViewToggle = (0, react.forwardRef)(function TreeViewToggle({ children, className, onClick, ...props }, ref) {
|
|
304
310
|
const context = useTreeViewContext();
|
|
305
311
|
const id = (0, react.useContext)(TreeItemContext);
|
|
312
|
+
const item = id ? context.nodes.find((candidate) => candidate.id === id) : void 0;
|
|
313
|
+
const disabled = context.disabled || Boolean(item?.disabled);
|
|
306
314
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
307
315
|
...props,
|
|
308
316
|
ref,
|
|
309
317
|
"aria-expanded": id ? context.expanded.has(id) : void 0,
|
|
318
|
+
"aria-disabled": disabled || void 0,
|
|
310
319
|
className: require_cx.cx(require_tree_view.treeView().toggle, className),
|
|
311
320
|
"data-slot": "tree-view-toggle",
|
|
321
|
+
disabled: disabled || props.disabled,
|
|
312
322
|
onClick: (event) => {
|
|
313
323
|
event.stopPropagation();
|
|
314
324
|
onClick?.(event);
|
|
@@ -327,18 +337,65 @@ const TreeViewLabel = (0, react.forwardRef)(function TreeViewLabel({ className,
|
|
|
327
337
|
"data-slot": "tree-view-label"
|
|
328
338
|
});
|
|
329
339
|
});
|
|
340
|
+
const TreeViewLoading = (0, react.forwardRef)(function TreeViewLoading({ children = "Loading…", className, ...props }, ref) {
|
|
341
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
342
|
+
...props,
|
|
343
|
+
ref,
|
|
344
|
+
"aria-disabled": "true",
|
|
345
|
+
"aria-live": "polite",
|
|
346
|
+
"aria-level": 1,
|
|
347
|
+
className: require_cx.cx(require_tree_view.treeView().loading, className),
|
|
348
|
+
"data-slot": "tree-view-loading",
|
|
349
|
+
role: "treeitem",
|
|
350
|
+
tabIndex: -1,
|
|
351
|
+
children
|
|
352
|
+
});
|
|
353
|
+
});
|
|
354
|
+
const TreeViewEmpty = (0, react.forwardRef)(function TreeViewEmpty({ children = "No items found.", className, ...props }, ref) {
|
|
355
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
356
|
+
...props,
|
|
357
|
+
ref,
|
|
358
|
+
"aria-disabled": "true",
|
|
359
|
+
"aria-level": 1,
|
|
360
|
+
className: require_cx.cx(require_tree_view.treeView().empty, className),
|
|
361
|
+
"data-slot": "tree-view-empty",
|
|
362
|
+
role: "treeitem",
|
|
363
|
+
tabIndex: -1,
|
|
364
|
+
children
|
|
365
|
+
});
|
|
366
|
+
});
|
|
367
|
+
const TreeViewError = (0, react.forwardRef)(function TreeViewError({ children = "Something went wrong.", className, ...props }, ref) {
|
|
368
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
369
|
+
...props,
|
|
370
|
+
ref,
|
|
371
|
+
"aria-disabled": "true",
|
|
372
|
+
"aria-live": "assertive",
|
|
373
|
+
"aria-level": 1,
|
|
374
|
+
className: require_cx.cx(require_tree_view.treeView().error, className),
|
|
375
|
+
"data-slot": "tree-view-error",
|
|
376
|
+
role: "treeitem",
|
|
377
|
+
tabIndex: -1,
|
|
378
|
+
children
|
|
379
|
+
});
|
|
380
|
+
});
|
|
330
381
|
const TreeView = {
|
|
331
382
|
Root: TreeViewRoot,
|
|
332
383
|
Item: TreeViewItem,
|
|
333
384
|
Group: TreeViewGroup,
|
|
334
385
|
Toggle: TreeViewToggle,
|
|
335
|
-
Label: TreeViewLabel
|
|
386
|
+
Label: TreeViewLabel,
|
|
387
|
+
Loading: TreeViewLoading,
|
|
388
|
+
Empty: TreeViewEmpty,
|
|
389
|
+
Error: TreeViewError
|
|
336
390
|
};
|
|
337
391
|
//#endregion
|
|
338
392
|
exports.TreeView = TreeView;
|
|
393
|
+
exports.TreeViewEmpty = TreeViewEmpty;
|
|
394
|
+
exports.TreeViewError = TreeViewError;
|
|
339
395
|
exports.TreeViewGroup = TreeViewGroup;
|
|
340
396
|
exports.TreeViewItem = TreeViewItem;
|
|
341
397
|
exports.TreeViewLabel = TreeViewLabel;
|
|
398
|
+
exports.TreeViewLoading = TreeViewLoading;
|
|
342
399
|
exports.TreeViewRoot = TreeViewRoot;
|
|
343
400
|
exports.TreeViewToggle = TreeViewToggle;
|
|
344
401
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-view.cjs","names":["treeView","cx","Children"],"sources":["../../../src/components/tree-view/tree-view.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Children, isValidElement } from \"react\";\nimport type { ComponentPropsWithoutRef, KeyboardEvent, ReactNode } from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { treeView } from \"../../styled-system/recipes\";\n\nexport type TreeViewSelectionMode = \"none\" | \"single\" | \"multiple\";\nexport type TreeViewSelection = string | readonly string[] | null;\n\ninterface TreeNodeRecord {\n id: string;\n parentId: string | undefined;\n disabled: boolean;\n selectable: boolean;\n order: number;\n element: HTMLDivElement | null;\n}\n\ninterface TreeViewContextValue {\n disabled: boolean;\n loopFocus: boolean;\n selectionMode: TreeViewSelectionMode;\n expanded: ReadonlySet<string>;\n selected: ReadonlySet<string>;\n nodes: readonly TreeNodeRecord[];\n registerNode: (node: TreeNodeRecord) => () => void;\n setNodeElement: (id: string, element: HTMLDivElement | null) => void;\n isVisible: (id: string) => boolean;\n hasChildren: (id: string) => boolean;\n getDepth: (id: string) => number;\n getSiblings: (id: string) => readonly TreeNodeRecord[];\n toggleExpanded: (id: string) => void;\n selectNode: (id: string) => void;\n focusNode: (id: string) => void;\n handleKeyDown: (id: string, event: KeyboardEvent<HTMLDivElement>) => void;\n activeId: string | null;\n setActiveId: (id: string) => void;\n}\n\nconst TreeViewContext = createContext<TreeViewContextValue | null>(null);\nconst TreeParentContext = createContext<string | undefined>(undefined);\nconst TreeItemContext = createContext<string | null>(null);\n\nfunction useTreeViewContext() {\n const context = useContext(TreeViewContext);\n if (!context) throw new Error(\"TreeView parts must be rendered inside TreeView.Root.\");\n return context;\n}\n\nfunction asSet(value: string | readonly string[] | null | undefined, mode: TreeViewSelectionMode) {\n if (mode === \"multiple\") return new Set(Array.isArray(value) ? value : value ? [value] : []);\n return new Set(typeof value === \"string\" ? [value] : []);\n}\n\nexport interface TreeViewRootProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"children\"> {\n expanded?: readonly string[];\n defaultExpanded?: readonly string[];\n onExpandedChange?: (expanded: string[]) => void;\n selected?: TreeViewSelection;\n defaultSelected?: TreeViewSelection;\n onSelectedChange?: (selected: TreeViewSelection) => void;\n selectionMode?: TreeViewSelectionMode;\n loopFocus?: boolean;\n disabled?: boolean;\n children?: ReactNode;\n}\n\nexport const TreeViewRoot = forwardRef<HTMLDivElement, TreeViewRootProps>(function TreeViewRoot(\n {\n children,\n className,\n defaultExpanded = [],\n defaultSelected = null,\n disabled = false,\n expanded: controlledExpanded,\n loopFocus = true,\n onExpandedChange,\n onSelectedChange,\n selected: controlledSelected,\n selectionMode = \"single\",\n ...props\n },\n ref,\n) {\n const [uncontrolledExpanded, setUncontrolledExpanded] = useState(() => new Set(defaultExpanded));\n const [uncontrolledSelected, setUncontrolledSelected] = useState(() =>\n asSet(defaultSelected, selectionMode),\n );\n const [activeId, setActiveId] = useState<string | null>(null);\n const [, setVersion] = useState(0);\n const nodesRef = useRef(new Map<string, TreeNodeRecord>());\n const orderRef = useRef(0);\n const styles = treeView();\n const expanded = useMemo(\n () => new Set(controlledExpanded ?? uncontrolledExpanded),\n [controlledExpanded, uncontrolledExpanded],\n );\n const selected = useMemo(\n () =>\n controlledSelected === undefined\n ? uncontrolledSelected\n : asSet(controlledSelected, selectionMode),\n [controlledSelected, selectionMode, uncontrolledSelected],\n );\n const nodes = Array.from(nodesRef.current.values()).sort((a, b) => a.order - b.order);\n\n const registerNode = useCallback((node: TreeNodeRecord) => {\n const registeredNode = { ...node, order: orderRef.current++ };\n nodesRef.current.set(node.id, registeredNode);\n setVersion((current) => current + 1);\n return () => {\n if (nodesRef.current.get(node.id) === registeredNode) nodesRef.current.delete(node.id);\n setVersion((current) => current + 1);\n };\n }, []);\n\n const setNodeElement = useCallback((id: string, element: HTMLDivElement | null) => {\n const node = nodesRef.current.get(id);\n if (node) node.element = element;\n }, []);\n\n const hasChildren = useCallback(\n (id: string) => nodes.some((node) => node.parentId === id),\n [nodes],\n );\n const isVisible = useCallback(\n (id: string) => {\n let current = nodes.find((node) => node.id === id);\n while (current?.parentId) {\n if (!expanded.has(current.parentId)) return false;\n current = nodes.find((node) => node.id === current?.parentId);\n }\n return true;\n },\n [expanded, nodes],\n );\n const getDepth = useCallback(\n (id: string) => {\n let depth = 1;\n let current = nodes.find((node) => node.id === id);\n while (current?.parentId) {\n depth += 1;\n current = nodes.find((node) => node.id === current?.parentId);\n }\n return depth;\n },\n [nodes],\n );\n const getSiblings = useCallback(\n (id: string) => {\n const node = nodes.find((candidate) => candidate.id === id);\n return nodes.filter((candidate) => candidate.parentId === node?.parentId);\n },\n [nodes],\n );\n\n const toggleExpanded = useCallback(\n (id: string) => {\n if (disabled || !hasChildren(id)) return;\n const next = new Set(expanded);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n if (controlledExpanded === undefined) setUncontrolledExpanded(next);\n onExpandedChange?.(Array.from(next));\n },\n [controlledExpanded, disabled, expanded, hasChildren, onExpandedChange],\n );\n\n const selectNode = useCallback(\n (id: string) => {\n const node = nodes.find((candidate) => candidate.id === id);\n if (disabled || !node || node.disabled || !node.selectable || selectionMode === \"none\")\n return;\n const next = new Set(selected);\n if (selectionMode === \"single\") {\n next.clear();\n next.add(id);\n } else if (next.has(id)) next.delete(id);\n else next.add(id);\n if (controlledSelected === undefined) setUncontrolledSelected(next);\n onSelectedChange?.(\n selectionMode === \"multiple\" ? Array.from(next) : (next.values().next().value ?? null),\n );\n },\n [controlledSelected, disabled, nodes, onSelectedChange, selected, selectionMode],\n );\n\n const visibleNodes = nodes.filter((node) => isVisible(node.id));\n const focusNode = useCallback(\n (id: string) => {\n const node = nodes.find((candidate) => candidate.id === id);\n if (!node || node.disabled || !isVisible(id)) return;\n setActiveId(id);\n node.element?.focus();\n },\n [isVisible, nodes],\n );\n\n const handleKeyDown = useCallback(\n (id: string, event: KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n const index = visibleNodes.findIndex((node) => node.id === id);\n const node = nodes.find((candidate) => candidate.id === id);\n if (!node) return;\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n const direction = event.key === \"ArrowDown\" ? 1 : -1;\n let nextIndex = index + direction;\n if (loopFocus) nextIndex = (nextIndex + visibleNodes.length) % visibleNodes.length;\n const nextNode = visibleNodes[nextIndex];\n if (nextIndex >= 0 && nextIndex < visibleNodes.length && nextNode) focusNode(nextNode.id);\n } else if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n focusNode((event.key === \"Home\" ? visibleNodes[0] : visibleNodes.at(-1))?.id ?? id);\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault();\n if (hasChildren(id) && !expanded.has(id)) toggleExpanded(id);\n else if (hasChildren(id))\n focusNode(nodes.find((candidate) => candidate.parentId === id)?.id ?? id);\n } else if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n if (hasChildren(id) && expanded.has(id)) toggleExpanded(id);\n else if (node.parentId) focusNode(node.parentId);\n } else if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n selectNode(id);\n }\n },\n [\n disabled,\n expanded,\n focusNode,\n hasChildren,\n loopFocus,\n nodes,\n selectNode,\n toggleExpanded,\n visibleNodes,\n ],\n );\n\n const context = useMemo<TreeViewContextValue>(\n () => ({\n disabled,\n loopFocus,\n selectionMode,\n expanded,\n selected,\n nodes,\n registerNode,\n setNodeElement,\n isVisible,\n hasChildren,\n getDepth,\n getSiblings,\n toggleExpanded,\n selectNode,\n focusNode,\n handleKeyDown,\n activeId,\n setActiveId,\n }),\n [\n activeId,\n disabled,\n expanded,\n focusNode,\n getDepth,\n getSiblings,\n handleKeyDown,\n hasChildren,\n isVisible,\n loopFocus,\n nodes,\n registerNode,\n selectNode,\n selected,\n selectionMode,\n setNodeElement,\n toggleExpanded,\n ],\n );\n\n return (\n <TreeViewContext.Provider value={context}>\n <div\n {...props}\n ref={ref}\n aria-multiselectable={selectionMode === \"multiple\" || undefined}\n className={cx(styles.root, className)}\n data-disabled={disabled || undefined}\n data-jaci-component=\"tree-view\"\n data-slot=\"tree-view\"\n role=\"tree\"\n >\n {children}\n </div>\n </TreeViewContext.Provider>\n );\n});\n\nexport interface TreeViewItemProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"id\"> {\n id: string;\n disabled?: boolean;\n selectable?: boolean;\n}\n\nexport const TreeViewItem = forwardRef<HTMLDivElement, TreeViewItemProps>(function TreeViewItem(\n {\n children,\n className,\n disabled = false,\n onClick,\n onFocus,\n onKeyDown,\n style,\n selectable = true,\n id,\n ...props\n },\n ref,\n) {\n const context = useTreeViewContext();\n const parentId = useContext(TreeParentContext);\n const styles = treeView();\n useEffect(\n () => context.registerNode({ id, parentId, disabled, selectable, order: 0, element: null }),\n [context.registerNode, disabled, id, parentId, selectable],\n );\n const siblings = context.getSiblings(id);\n const registeredNode = context.nodes.find((candidate) => candidate.id === id);\n const selected = context.selected.has(id);\n const visible = context.isVisible(id);\n const siblingIndex = siblings.findIndex((candidate) => candidate.id === id);\n const tabIndex =\n context.activeId === id || (context.activeId === null && context.nodes[0]?.id === id) ? 0 : -1;\n const childNodes = Children.toArray(children);\n const groupNodes = childNodes.filter(\n (child) => isValidElement(child) && child.type === TreeViewGroup,\n );\n const rowNodes = childNodes.filter(\n (child) => !(isValidElement(child) && child.type === TreeViewGroup),\n );\n\n return (\n <TreeParentContext.Provider value={id}>\n <TreeItemContext.Provider value={id}>\n <div\n {...props}\n ref={(element) => {\n context.setNodeElement(id, element);\n if (typeof ref === \"function\") ref(element);\n else if (ref) ref.current = element;\n }}\n aria-disabled={disabled || undefined}\n aria-expanded={context.hasChildren(id) ? context.expanded.has(id) : undefined}\n aria-level={registeredNode ? context.getDepth(id) : parentId ? 2 : 1}\n aria-posinset={siblingIndex >= 0 ? siblingIndex + 1 : 1}\n aria-setsize={siblings.length || 1}\n aria-selected={context.selectionMode === \"none\" ? undefined : selected}\n className={styles.itemWrapper}\n data-disabled={disabled || undefined}\n data-expanded={context.expanded.has(id) || undefined}\n data-jaci-component=\"tree-view\"\n data-selected={selected || undefined}\n data-slot=\"tree-view-item\"\n onClick={(event) => {\n event.stopPropagation();\n onClick?.(event);\n if (!event.defaultPrevented) context.selectNode(id);\n }}\n onFocus={(event) => {\n context.setActiveId(id);\n onFocus?.(event);\n }}\n onKeyDown={(event) => {\n event.stopPropagation();\n context.handleKeyDown(id, event);\n onKeyDown?.(event);\n }}\n role=\"treeitem\"\n tabIndex={visible ? tabIndex : -1}\n >\n <div\n className={cx(styles.item, className)}\n data-disabled={disabled || undefined}\n data-expanded={context.expanded.has(id) || undefined}\n data-selected={selected || undefined}\n data-slot=\"tree-view-item-row\"\n style={style}\n >\n {rowNodes}\n </div>\n {groupNodes}\n </div>\n </TreeItemContext.Provider>\n </TreeParentContext.Provider>\n );\n});\n\nexport type TreeViewGroupProps = ComponentPropsWithoutRef<\"div\">;\nexport const TreeViewGroup = forwardRef<HTMLDivElement, TreeViewGroupProps>(function TreeViewGroup(\n { children, className, style, ...props },\n ref,\n) {\n const context = useTreeViewContext();\n const parentId = useContext(TreeParentContext);\n const styles = treeView();\n const visible = parentId ? context.expanded.has(parentId) : true;\n return (\n // biome-ignore lint/a11y/useSemanticElements: WAI-ARIA tree groups require role=\"group\".\n <div\n {...props}\n ref={ref}\n aria-hidden={!visible || undefined}\n className={cx(styles.group, className)}\n data-jaci-component=\"tree-view\"\n data-expanded={visible || undefined}\n data-slot=\"tree-view-group\"\n hidden={!visible}\n role=\"group\"\n style={{ ...style, display: visible ? style?.display : \"none\" }}\n >\n {children}\n </div>\n );\n});\n\nexport type TreeViewToggleProps = ComponentPropsWithoutRef<\"button\">;\nexport const TreeViewToggle = forwardRef<HTMLButtonElement, TreeViewToggleProps>(\n function TreeViewToggle({ children, className, onClick, ...props }, ref) {\n const context = useTreeViewContext();\n const itemId = useContext(TreeItemContext);\n const id = itemId;\n return (\n <button\n {...props}\n ref={ref}\n aria-expanded={id ? context.expanded.has(id) : undefined}\n className={cx(treeView().toggle, className)}\n data-slot=\"tree-view-toggle\"\n onClick={(event) => {\n event.stopPropagation();\n onClick?.(event);\n if (!event.defaultPrevented && id) context.toggleExpanded(id);\n }}\n tabIndex={-1}\n type=\"button\"\n >\n {children ?? (id && context.expanded.has(id) ? \"▾\" : \"▸\")}\n </button>\n );\n },\n);\n\nexport type TreeViewLabelProps = ComponentPropsWithoutRef<\"span\">;\nexport const TreeViewLabel = forwardRef<HTMLSpanElement, TreeViewLabelProps>(function TreeViewLabel(\n { className, ...props },\n ref,\n) {\n return (\n <span\n {...props}\n ref={ref}\n className={cx(treeView().label, className)}\n data-slot=\"tree-view-label\"\n />\n );\n});\n\nexport const TreeView = {\n Root: TreeViewRoot,\n Item: TreeViewItem,\n Group: TreeViewGroup,\n Toggle: TreeViewToggle,\n Label: TreeViewLabel,\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tree-view.cjs","names":["treeView","cx","Children"],"sources":["../../../src/components/tree-view/tree-view.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Children, isValidElement } from \"react\";\nimport type { ComponentPropsWithoutRef, KeyboardEvent, ReactNode } from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { treeView } from \"../../styled-system/recipes\";\n\nexport type TreeViewSelectionMode = \"none\" | \"single\" | \"multiple\";\nexport type TreeViewSelection = string | readonly string[] | null;\n\ninterface TreeNodeRecord {\n id: string;\n parentId: string | undefined;\n disabled: boolean;\n hasChildren: boolean;\n loading: boolean;\n selectable: boolean;\n order: number;\n element: HTMLDivElement | null;\n}\n\ninterface TreeViewContextValue {\n disabled: boolean;\n loopFocus: boolean;\n selectionMode: TreeViewSelectionMode;\n expanded: ReadonlySet<string>;\n selected: ReadonlySet<string>;\n nodes: readonly TreeNodeRecord[];\n registerNode: (node: TreeNodeRecord) => () => void;\n setNodeElement: (id: string, element: HTMLDivElement | null) => void;\n isVisible: (id: string) => boolean;\n hasChildren: (id: string) => boolean;\n getDepth: (id: string) => number;\n getSiblings: (id: string) => readonly TreeNodeRecord[];\n toggleExpanded: (id: string) => void;\n selectNode: (id: string) => void;\n focusNode: (id: string) => void;\n handleKeyDown: (id: string, event: KeyboardEvent<HTMLDivElement>) => void;\n activeId: string | null;\n setActiveId: (id: string) => void;\n}\n\nconst TreeViewContext = createContext<TreeViewContextValue | null>(null);\nconst TreeParentContext = createContext<string | undefined>(undefined);\nconst TreeItemContext = createContext<string | null>(null);\n\nfunction useTreeViewContext() {\n const context = useContext(TreeViewContext);\n if (!context) throw new Error(\"TreeView parts must be rendered inside TreeView.Root.\");\n return context;\n}\n\nfunction asSet(value: string | readonly string[] | null | undefined, mode: TreeViewSelectionMode) {\n if (mode === \"multiple\") return new Set(Array.isArray(value) ? value : value ? [value] : []);\n return new Set(typeof value === \"string\" ? [value] : []);\n}\n\nexport interface TreeViewRootProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"children\"> {\n expanded?: readonly string[];\n defaultExpanded?: readonly string[];\n onExpandedChange?: (expanded: string[]) => void;\n selected?: TreeViewSelection;\n defaultSelected?: TreeViewSelection;\n onSelectedChange?: (selected: TreeViewSelection) => void;\n selectionMode?: TreeViewSelectionMode;\n loopFocus?: boolean;\n disabled?: boolean;\n children?: ReactNode;\n}\n\nexport const TreeViewRoot = forwardRef<HTMLDivElement, TreeViewRootProps>(function TreeViewRoot(\n {\n children,\n className,\n defaultExpanded = [],\n defaultSelected = null,\n disabled = false,\n expanded: controlledExpanded,\n loopFocus = true,\n onExpandedChange,\n onSelectedChange,\n selected: controlledSelected,\n selectionMode = \"single\",\n ...props\n },\n ref,\n) {\n const [uncontrolledExpanded, setUncontrolledExpanded] = useState(() => new Set(defaultExpanded));\n const [uncontrolledSelected, setUncontrolledSelected] = useState(() =>\n asSet(defaultSelected, selectionMode),\n );\n const [activeId, setActiveId] = useState<string | null>(null);\n const [, setVersion] = useState(0);\n const nodesRef = useRef(new Map<string, TreeNodeRecord>());\n const orderRef = useRef(0);\n const styles = treeView();\n const expanded = useMemo(\n () => new Set(controlledExpanded ?? uncontrolledExpanded),\n [controlledExpanded, uncontrolledExpanded],\n );\n const selected = useMemo(\n () =>\n controlledSelected === undefined\n ? uncontrolledSelected\n : asSet(controlledSelected, selectionMode),\n [controlledSelected, selectionMode, uncontrolledSelected],\n );\n const nodes = Array.from(nodesRef.current.values()).sort((a, b) => a.order - b.order);\n\n const registerNode = useCallback((node: TreeNodeRecord) => {\n const registeredNode = { ...node, order: orderRef.current++ };\n nodesRef.current.set(node.id, registeredNode);\n setVersion((current) => current + 1);\n return () => {\n if (nodesRef.current.get(node.id) === registeredNode) nodesRef.current.delete(node.id);\n setVersion((current) => current + 1);\n };\n }, []);\n\n const setNodeElement = useCallback((id: string, element: HTMLDivElement | null) => {\n const node = nodesRef.current.get(id);\n if (node) node.element = element;\n }, []);\n\n const hasChildren = useCallback(\n (id: string) =>\n nodes.some((node) => node.parentId === id) ||\n Boolean(nodes.find((node) => node.id === id)?.hasChildren),\n [nodes],\n );\n const isVisible = useCallback(\n (id: string) => {\n let current = nodes.find((node) => node.id === id);\n while (current?.parentId) {\n if (!expanded.has(current.parentId)) return false;\n current = nodes.find((node) => node.id === current?.parentId);\n }\n return true;\n },\n [expanded, nodes],\n );\n const getDepth = useCallback(\n (id: string) => {\n let depth = 1;\n let current = nodes.find((node) => node.id === id);\n while (current?.parentId) {\n depth += 1;\n current = nodes.find((node) => node.id === current?.parentId);\n }\n return depth;\n },\n [nodes],\n );\n const getSiblings = useCallback(\n (id: string) => {\n const node = nodes.find((candidate) => candidate.id === id);\n return nodes.filter((candidate) => candidate.parentId === node?.parentId);\n },\n [nodes],\n );\n\n const toggleExpanded = useCallback(\n (id: string) => {\n if (disabled || !hasChildren(id)) return;\n const next = new Set(expanded);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n if (controlledExpanded === undefined) setUncontrolledExpanded(next);\n onExpandedChange?.(Array.from(next));\n },\n [controlledExpanded, disabled, expanded, hasChildren, onExpandedChange],\n );\n\n const selectNode = useCallback(\n (id: string) => {\n const node = nodes.find((candidate) => candidate.id === id);\n if (disabled || !node || node.disabled || !node.selectable || selectionMode === \"none\")\n return;\n const next = new Set(selected);\n if (selectionMode === \"single\") {\n next.clear();\n next.add(id);\n } else if (next.has(id)) next.delete(id);\n else next.add(id);\n if (controlledSelected === undefined) setUncontrolledSelected(next);\n onSelectedChange?.(\n selectionMode === \"multiple\" ? Array.from(next) : (next.values().next().value ?? null),\n );\n },\n [controlledSelected, disabled, nodes, onSelectedChange, selected, selectionMode],\n );\n\n const visibleNodes = nodes.filter((node) => isVisible(node.id));\n const focusNode = useCallback(\n (id: string) => {\n const node = nodes.find((candidate) => candidate.id === id);\n if (!node || node.disabled || !isVisible(id)) return;\n setActiveId(id);\n node.element?.focus();\n },\n [isVisible, nodes],\n );\n\n const handleKeyDown = useCallback(\n (id: string, event: KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n const index = visibleNodes.findIndex((node) => node.id === id);\n const node = nodes.find((candidate) => candidate.id === id);\n if (!node) return;\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n const direction = event.key === \"ArrowDown\" ? 1 : -1;\n let nextIndex = index + direction;\n if (loopFocus) nextIndex = (nextIndex + visibleNodes.length) % visibleNodes.length;\n const nextNode = visibleNodes[nextIndex];\n if (nextIndex >= 0 && nextIndex < visibleNodes.length && nextNode) focusNode(nextNode.id);\n } else if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n focusNode((event.key === \"Home\" ? visibleNodes[0] : visibleNodes.at(-1))?.id ?? id);\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault();\n if (hasChildren(id) && !expanded.has(id)) toggleExpanded(id);\n else if (hasChildren(id))\n focusNode(nodes.find((candidate) => candidate.parentId === id)?.id ?? id);\n } else if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n if (hasChildren(id) && expanded.has(id)) toggleExpanded(id);\n else if (node.parentId) focusNode(node.parentId);\n } else if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n selectNode(id);\n }\n },\n [\n disabled,\n expanded,\n focusNode,\n hasChildren,\n loopFocus,\n nodes,\n selectNode,\n toggleExpanded,\n visibleNodes,\n ],\n );\n\n const context = useMemo<TreeViewContextValue>(\n () => ({\n disabled,\n loopFocus,\n selectionMode,\n expanded,\n selected,\n nodes,\n registerNode,\n setNodeElement,\n isVisible,\n hasChildren,\n getDepth,\n getSiblings,\n toggleExpanded,\n selectNode,\n focusNode,\n handleKeyDown,\n activeId,\n setActiveId,\n }),\n [\n activeId,\n disabled,\n expanded,\n focusNode,\n getDepth,\n getSiblings,\n handleKeyDown,\n hasChildren,\n isVisible,\n loopFocus,\n nodes,\n registerNode,\n selectNode,\n selected,\n selectionMode,\n setNodeElement,\n toggleExpanded,\n ],\n );\n\n return (\n <TreeViewContext.Provider value={context}>\n <div\n {...props}\n ref={ref}\n aria-multiselectable={selectionMode === \"multiple\" || undefined}\n className={cx(styles.root, className)}\n data-disabled={disabled || undefined}\n data-jaci-component=\"tree-view\"\n data-slot=\"tree-view\"\n role=\"tree\"\n >\n {children}\n </div>\n </TreeViewContext.Provider>\n );\n});\n\nexport interface TreeViewItemProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"id\"> {\n id: string;\n disabled?: boolean;\n hasChildren?: boolean;\n loading?: boolean;\n selectable?: boolean;\n}\n\nexport const TreeViewItem = forwardRef<HTMLDivElement, TreeViewItemProps>(function TreeViewItem(\n {\n children,\n className,\n disabled = false,\n hasChildren: hasChildrenProp = false,\n loading = false,\n onClick,\n onFocus,\n onKeyDown,\n style,\n selectable = true,\n id,\n ...props\n },\n ref,\n) {\n const context = useTreeViewContext();\n const parentId = useContext(TreeParentContext);\n const styles = treeView();\n useEffect(\n () =>\n context.registerNode({\n id,\n parentId,\n disabled,\n hasChildren: hasChildrenProp,\n loading,\n selectable,\n order: 0,\n element: null,\n }),\n [context.registerNode, disabled, hasChildrenProp, id, loading, parentId, selectable],\n );\n const siblings = context.getSiblings(id);\n const registeredNode = context.nodes.find((candidate) => candidate.id === id);\n const selected = context.selected.has(id);\n const visible = context.isVisible(id);\n const siblingIndex = siblings.findIndex((candidate) => candidate.id === id);\n const tabIndex =\n context.activeId === id || (context.activeId === null && context.nodes[0]?.id === id) ? 0 : -1;\n const childNodes = Children.toArray(children);\n const groupNodes = childNodes.filter(\n (child) => isValidElement(child) && child.type === TreeViewGroup,\n );\n const rowNodes = childNodes.filter(\n (child) => !(isValidElement(child) && child.type === TreeViewGroup),\n );\n\n return (\n <TreeParentContext.Provider value={id}>\n <TreeItemContext.Provider value={id}>\n <div\n {...props}\n ref={(element) => {\n context.setNodeElement(id, element);\n if (typeof ref === \"function\") ref(element);\n else if (ref) ref.current = element;\n }}\n aria-disabled={disabled || undefined}\n aria-expanded={context.hasChildren(id) ? context.expanded.has(id) : undefined}\n aria-busy={loading || undefined}\n aria-level={registeredNode ? context.getDepth(id) : parentId ? 2 : 1}\n aria-posinset={siblingIndex >= 0 ? siblingIndex + 1 : 1}\n aria-setsize={siblings.length || 1}\n aria-selected={context.selectionMode === \"none\" ? undefined : selected}\n className={styles.itemWrapper}\n data-disabled={disabled || undefined}\n data-expanded={context.expanded.has(id) || undefined}\n data-jaci-component=\"tree-view\"\n data-selected={selected || undefined}\n data-loading={loading || undefined}\n data-slot=\"tree-view-item\"\n onClick={(event) => {\n event.stopPropagation();\n onClick?.(event);\n if (!event.defaultPrevented) context.selectNode(id);\n }}\n onFocus={(event) => {\n context.setActiveId(id);\n onFocus?.(event);\n }}\n onKeyDown={(event) => {\n event.stopPropagation();\n context.handleKeyDown(id, event);\n onKeyDown?.(event);\n }}\n role=\"treeitem\"\n tabIndex={visible ? tabIndex : -1}\n >\n <div\n className={cx(styles.item, className)}\n data-disabled={disabled || undefined}\n data-expanded={context.expanded.has(id) || undefined}\n data-selected={selected || undefined}\n data-slot=\"tree-view-item-row\"\n style={style}\n >\n {rowNodes}\n </div>\n {groupNodes}\n </div>\n </TreeItemContext.Provider>\n </TreeParentContext.Provider>\n );\n});\n\nexport type TreeViewGroupProps = ComponentPropsWithoutRef<\"div\">;\nexport const TreeViewGroup = forwardRef<HTMLDivElement, TreeViewGroupProps>(function TreeViewGroup(\n { children, className, style, ...props },\n ref,\n) {\n const context = useTreeViewContext();\n const parentId = useContext(TreeParentContext);\n const styles = treeView();\n const visible = parentId ? context.expanded.has(parentId) : true;\n return (\n // biome-ignore lint/a11y/useSemanticElements: WAI-ARIA tree groups require role=\"group\".\n <div\n {...props}\n ref={ref}\n aria-hidden={!visible || undefined}\n className={cx(styles.group, className)}\n data-jaci-component=\"tree-view\"\n data-expanded={visible || undefined}\n data-slot=\"tree-view-group\"\n hidden={!visible}\n role=\"group\"\n style={{ ...style, display: visible ? style?.display : \"none\" }}\n >\n {children}\n </div>\n );\n});\n\nexport type TreeViewToggleProps = ComponentPropsWithoutRef<\"button\">;\nexport const TreeViewToggle = forwardRef<HTMLButtonElement, TreeViewToggleProps>(\n function TreeViewToggle({ children, className, onClick, ...props }, ref) {\n const context = useTreeViewContext();\n const itemId = useContext(TreeItemContext);\n const id = itemId;\n const item = id ? context.nodes.find((candidate) => candidate.id === id) : undefined;\n const disabled = context.disabled || Boolean(item?.disabled);\n return (\n <button\n {...props}\n ref={ref}\n aria-expanded={id ? context.expanded.has(id) : undefined}\n aria-disabled={disabled || undefined}\n className={cx(treeView().toggle, className)}\n data-slot=\"tree-view-toggle\"\n disabled={disabled || props.disabled}\n onClick={(event) => {\n event.stopPropagation();\n onClick?.(event);\n if (!event.defaultPrevented && id) context.toggleExpanded(id);\n }}\n tabIndex={-1}\n type=\"button\"\n >\n {children ?? (id && context.expanded.has(id) ? \"▾\" : \"▸\")}\n </button>\n );\n },\n);\n\nexport type TreeViewLabelProps = ComponentPropsWithoutRef<\"span\">;\nexport const TreeViewLabel = forwardRef<HTMLSpanElement, TreeViewLabelProps>(function TreeViewLabel(\n { className, ...props },\n ref,\n) {\n return (\n <span\n {...props}\n ref={ref}\n className={cx(treeView().label, className)}\n data-slot=\"tree-view-label\"\n />\n );\n});\n\nexport interface TreeViewStateProps extends ComponentPropsWithoutRef<\"div\"> {\n children?: ReactNode;\n}\n\nexport const TreeViewLoading = forwardRef<HTMLDivElement, TreeViewStateProps>(\n function TreeViewLoading({ children = \"Loading…\", className, ...props }, ref) {\n return (\n <div\n {...props}\n ref={ref}\n aria-disabled=\"true\"\n aria-live=\"polite\"\n aria-level={1}\n className={cx(treeView().loading, className)}\n data-slot=\"tree-view-loading\"\n role=\"treeitem\"\n tabIndex={-1}\n >\n {children}\n </div>\n );\n },\n);\n\nexport const TreeViewEmpty = forwardRef<HTMLDivElement, TreeViewStateProps>(function TreeViewEmpty(\n { children = \"No items found.\", className, ...props },\n ref,\n) {\n return (\n <div\n {...props}\n ref={ref}\n aria-disabled=\"true\"\n aria-level={1}\n className={cx(treeView().empty, className)}\n data-slot=\"tree-view-empty\"\n role=\"treeitem\"\n tabIndex={-1}\n >\n {children}\n </div>\n );\n});\n\nexport const TreeViewError = forwardRef<HTMLDivElement, TreeViewStateProps>(function TreeViewError(\n { children = \"Something went wrong.\", className, ...props },\n ref,\n) {\n return (\n <div\n {...props}\n ref={ref}\n aria-disabled=\"true\"\n aria-live=\"assertive\"\n aria-level={1}\n className={cx(treeView().error, className)}\n data-slot=\"tree-view-error\"\n role=\"treeitem\"\n tabIndex={-1}\n >\n {children}\n </div>\n );\n});\n\nexport const TreeView = {\n Root: TreeViewRoot,\n Item: TreeViewItem,\n Group: TreeViewGroup,\n Toggle: TreeViewToggle,\n Label: TreeViewLabel,\n Loading: TreeViewLoading,\n Empty: TreeViewEmpty,\n Error: TreeViewError,\n};\n"],"mappings":"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"}
|
|
@@ -18,6 +18,8 @@ declare const TreeViewRoot: import("react").ForwardRefExoticComponent<TreeViewRo
|
|
|
18
18
|
interface TreeViewItemProps extends Omit<ComponentPropsWithoutRef<"div">, "id"> {
|
|
19
19
|
id: string;
|
|
20
20
|
disabled?: boolean;
|
|
21
|
+
hasChildren?: boolean;
|
|
22
|
+
loading?: boolean;
|
|
21
23
|
selectable?: boolean;
|
|
22
24
|
}
|
|
23
25
|
declare const TreeViewItem: import("react").ForwardRefExoticComponent<TreeViewItemProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
@@ -27,13 +29,22 @@ type TreeViewToggleProps = ComponentPropsWithoutRef<"button">;
|
|
|
27
29
|
declare const TreeViewToggle: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & import("react").RefAttributes<HTMLButtonElement>>;
|
|
28
30
|
type TreeViewLabelProps = ComponentPropsWithoutRef<"span">;
|
|
29
31
|
declare const TreeViewLabel: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "ref"> & import("react").RefAttributes<HTMLSpanElement>>;
|
|
32
|
+
interface TreeViewStateProps extends ComponentPropsWithoutRef<"div"> {
|
|
33
|
+
children?: ReactNode;
|
|
34
|
+
}
|
|
35
|
+
declare const TreeViewLoading: import("react").ForwardRefExoticComponent<TreeViewStateProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
36
|
+
declare const TreeViewEmpty: import("react").ForwardRefExoticComponent<TreeViewStateProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
37
|
+
declare const TreeViewError: import("react").ForwardRefExoticComponent<TreeViewStateProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
30
38
|
declare const TreeView: {
|
|
31
39
|
Root: import("react").ForwardRefExoticComponent<TreeViewRootProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
32
40
|
Item: import("react").ForwardRefExoticComponent<TreeViewItemProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
33
41
|
Group: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
34
42
|
Toggle: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & import("react").RefAttributes<HTMLButtonElement>>;
|
|
35
43
|
Label: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "ref"> & import("react").RefAttributes<HTMLSpanElement>>;
|
|
44
|
+
Loading: import("react").ForwardRefExoticComponent<TreeViewStateProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
45
|
+
Empty: import("react").ForwardRefExoticComponent<TreeViewStateProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
46
|
+
Error: import("react").ForwardRefExoticComponent<TreeViewStateProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
36
47
|
};
|
|
37
48
|
//#endregion
|
|
38
|
-
export { TreeView, TreeViewGroup, TreeViewGroupProps, TreeViewItem, TreeViewItemProps, TreeViewLabel, TreeViewLabelProps, TreeViewRoot, TreeViewRootProps, TreeViewSelection, TreeViewSelectionMode, TreeViewToggle, TreeViewToggleProps };
|
|
49
|
+
export { TreeView, TreeViewEmpty, TreeViewError, TreeViewGroup, TreeViewGroupProps, TreeViewItem, TreeViewItemProps, TreeViewLabel, TreeViewLabelProps, TreeViewLoading, TreeViewRoot, TreeViewRootProps, TreeViewSelection, TreeViewSelectionMode, TreeViewStateProps, TreeViewToggle, TreeViewToggleProps };
|
|
39
50
|
//# sourceMappingURL=tree-view.d.cts.map
|
|
@@ -18,6 +18,8 @@ declare const TreeViewRoot: import("react").ForwardRefExoticComponent<TreeViewRo
|
|
|
18
18
|
interface TreeViewItemProps extends Omit<ComponentPropsWithoutRef<"div">, "id"> {
|
|
19
19
|
id: string;
|
|
20
20
|
disabled?: boolean;
|
|
21
|
+
hasChildren?: boolean;
|
|
22
|
+
loading?: boolean;
|
|
21
23
|
selectable?: boolean;
|
|
22
24
|
}
|
|
23
25
|
declare const TreeViewItem: import("react").ForwardRefExoticComponent<TreeViewItemProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
@@ -27,13 +29,22 @@ type TreeViewToggleProps = ComponentPropsWithoutRef<"button">;
|
|
|
27
29
|
declare const TreeViewToggle: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & import("react").RefAttributes<HTMLButtonElement>>;
|
|
28
30
|
type TreeViewLabelProps = ComponentPropsWithoutRef<"span">;
|
|
29
31
|
declare const TreeViewLabel: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "ref"> & import("react").RefAttributes<HTMLSpanElement>>;
|
|
32
|
+
interface TreeViewStateProps extends ComponentPropsWithoutRef<"div"> {
|
|
33
|
+
children?: ReactNode;
|
|
34
|
+
}
|
|
35
|
+
declare const TreeViewLoading: import("react").ForwardRefExoticComponent<TreeViewStateProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
36
|
+
declare const TreeViewEmpty: import("react").ForwardRefExoticComponent<TreeViewStateProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
37
|
+
declare const TreeViewError: import("react").ForwardRefExoticComponent<TreeViewStateProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
30
38
|
declare const TreeView: {
|
|
31
39
|
Root: import("react").ForwardRefExoticComponent<TreeViewRootProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
32
40
|
Item: import("react").ForwardRefExoticComponent<TreeViewItemProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
33
41
|
Group: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
34
42
|
Toggle: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & import("react").RefAttributes<HTMLButtonElement>>;
|
|
35
43
|
Label: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "ref"> & import("react").RefAttributes<HTMLSpanElement>>;
|
|
44
|
+
Loading: import("react").ForwardRefExoticComponent<TreeViewStateProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
45
|
+
Empty: import("react").ForwardRefExoticComponent<TreeViewStateProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
46
|
+
Error: import("react").ForwardRefExoticComponent<TreeViewStateProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
36
47
|
};
|
|
37
48
|
//#endregion
|
|
38
|
-
export { TreeView, TreeViewGroup, TreeViewGroupProps, TreeViewItem, TreeViewItemProps, TreeViewLabel, TreeViewLabelProps, TreeViewRoot, TreeViewRootProps, TreeViewSelection, TreeViewSelectionMode, TreeViewToggle, TreeViewToggleProps };
|
|
49
|
+
export { TreeView, TreeViewEmpty, TreeViewError, TreeViewGroup, TreeViewGroupProps, TreeViewItem, TreeViewItemProps, TreeViewLabel, TreeViewLabelProps, TreeViewLoading, TreeViewRoot, TreeViewRootProps, TreeViewSelection, TreeViewSelectionMode, TreeViewStateProps, TreeViewToggle, TreeViewToggleProps };
|
|
39
50
|
//# sourceMappingURL=tree-view.d.ts.map
|
|
@@ -47,7 +47,7 @@ const TreeViewRoot = forwardRef(function TreeViewRoot({ children, className, def
|
|
|
47
47
|
const node = nodesRef.current.get(id);
|
|
48
48
|
if (node) node.element = element;
|
|
49
49
|
}, []);
|
|
50
|
-
const hasChildren = useCallback((id) => nodes.some((node) => node.parentId === id), [nodes]);
|
|
50
|
+
const hasChildren = useCallback((id) => nodes.some((node) => node.parentId === id) || Boolean(nodes.find((node) => node.id === id)?.hasChildren), [nodes]);
|
|
51
51
|
const isVisible = useCallback((id) => {
|
|
52
52
|
let current = nodes.find((node) => node.id === id);
|
|
53
53
|
while (current?.parentId) {
|
|
@@ -199,7 +199,7 @@ const TreeViewRoot = forwardRef(function TreeViewRoot({ children, className, def
|
|
|
199
199
|
})
|
|
200
200
|
});
|
|
201
201
|
});
|
|
202
|
-
const TreeViewItem = forwardRef(function TreeViewItem({ children, className, disabled = false, onClick, onFocus, onKeyDown, style, selectable = true, id, ...props }, ref) {
|
|
202
|
+
const TreeViewItem = forwardRef(function TreeViewItem({ children, className, disabled = false, hasChildren: hasChildrenProp = false, loading = false, onClick, onFocus, onKeyDown, style, selectable = true, id, ...props }, ref) {
|
|
203
203
|
const context = useTreeViewContext();
|
|
204
204
|
const parentId = useContext(TreeParentContext);
|
|
205
205
|
const styles = treeView();
|
|
@@ -207,13 +207,17 @@ const TreeViewItem = forwardRef(function TreeViewItem({ children, className, dis
|
|
|
207
207
|
id,
|
|
208
208
|
parentId,
|
|
209
209
|
disabled,
|
|
210
|
+
hasChildren: hasChildrenProp,
|
|
211
|
+
loading,
|
|
210
212
|
selectable,
|
|
211
213
|
order: 0,
|
|
212
214
|
element: null
|
|
213
215
|
}), [
|
|
214
216
|
context.registerNode,
|
|
215
217
|
disabled,
|
|
218
|
+
hasChildrenProp,
|
|
216
219
|
id,
|
|
220
|
+
loading,
|
|
217
221
|
parentId,
|
|
218
222
|
selectable
|
|
219
223
|
]);
|
|
@@ -239,6 +243,7 @@ const TreeViewItem = forwardRef(function TreeViewItem({ children, className, dis
|
|
|
239
243
|
},
|
|
240
244
|
"aria-disabled": disabled || void 0,
|
|
241
245
|
"aria-expanded": context.hasChildren(id) ? context.expanded.has(id) : void 0,
|
|
246
|
+
"aria-busy": loading || void 0,
|
|
242
247
|
"aria-level": registeredNode ? context.getDepth(id) : parentId ? 2 : 1,
|
|
243
248
|
"aria-posinset": siblingIndex >= 0 ? siblingIndex + 1 : 1,
|
|
244
249
|
"aria-setsize": siblings.length || 1,
|
|
@@ -248,6 +253,7 @@ const TreeViewItem = forwardRef(function TreeViewItem({ children, className, dis
|
|
|
248
253
|
"data-expanded": context.expanded.has(id) || void 0,
|
|
249
254
|
"data-jaci-component": "tree-view",
|
|
250
255
|
"data-selected": selected || void 0,
|
|
256
|
+
"data-loading": loading || void 0,
|
|
251
257
|
"data-slot": "tree-view-item",
|
|
252
258
|
onClick: (event) => {
|
|
253
259
|
event.stopPropagation();
|
|
@@ -303,12 +309,16 @@ const TreeViewGroup = forwardRef(function TreeViewGroup({ children, className, s
|
|
|
303
309
|
const TreeViewToggle = forwardRef(function TreeViewToggle({ children, className, onClick, ...props }, ref) {
|
|
304
310
|
const context = useTreeViewContext();
|
|
305
311
|
const id = useContext(TreeItemContext);
|
|
312
|
+
const item = id ? context.nodes.find((candidate) => candidate.id === id) : void 0;
|
|
313
|
+
const disabled = context.disabled || Boolean(item?.disabled);
|
|
306
314
|
return /* @__PURE__ */ jsx("button", {
|
|
307
315
|
...props,
|
|
308
316
|
ref,
|
|
309
317
|
"aria-expanded": id ? context.expanded.has(id) : void 0,
|
|
318
|
+
"aria-disabled": disabled || void 0,
|
|
310
319
|
className: cx(treeView().toggle, className),
|
|
311
320
|
"data-slot": "tree-view-toggle",
|
|
321
|
+
disabled: disabled || props.disabled,
|
|
312
322
|
onClick: (event) => {
|
|
313
323
|
event.stopPropagation();
|
|
314
324
|
onClick?.(event);
|
|
@@ -327,14 +337,58 @@ const TreeViewLabel = forwardRef(function TreeViewLabel({ className, ...props },
|
|
|
327
337
|
"data-slot": "tree-view-label"
|
|
328
338
|
});
|
|
329
339
|
});
|
|
340
|
+
const TreeViewLoading = forwardRef(function TreeViewLoading({ children = "Loading…", className, ...props }, ref) {
|
|
341
|
+
return /* @__PURE__ */ jsx("div", {
|
|
342
|
+
...props,
|
|
343
|
+
ref,
|
|
344
|
+
"aria-disabled": "true",
|
|
345
|
+
"aria-live": "polite",
|
|
346
|
+
"aria-level": 1,
|
|
347
|
+
className: cx(treeView().loading, className),
|
|
348
|
+
"data-slot": "tree-view-loading",
|
|
349
|
+
role: "treeitem",
|
|
350
|
+
tabIndex: -1,
|
|
351
|
+
children
|
|
352
|
+
});
|
|
353
|
+
});
|
|
354
|
+
const TreeViewEmpty = forwardRef(function TreeViewEmpty({ children = "No items found.", className, ...props }, ref) {
|
|
355
|
+
return /* @__PURE__ */ jsx("div", {
|
|
356
|
+
...props,
|
|
357
|
+
ref,
|
|
358
|
+
"aria-disabled": "true",
|
|
359
|
+
"aria-level": 1,
|
|
360
|
+
className: cx(treeView().empty, className),
|
|
361
|
+
"data-slot": "tree-view-empty",
|
|
362
|
+
role: "treeitem",
|
|
363
|
+
tabIndex: -1,
|
|
364
|
+
children
|
|
365
|
+
});
|
|
366
|
+
});
|
|
367
|
+
const TreeViewError = forwardRef(function TreeViewError({ children = "Something went wrong.", className, ...props }, ref) {
|
|
368
|
+
return /* @__PURE__ */ jsx("div", {
|
|
369
|
+
...props,
|
|
370
|
+
ref,
|
|
371
|
+
"aria-disabled": "true",
|
|
372
|
+
"aria-live": "assertive",
|
|
373
|
+
"aria-level": 1,
|
|
374
|
+
className: cx(treeView().error, className),
|
|
375
|
+
"data-slot": "tree-view-error",
|
|
376
|
+
role: "treeitem",
|
|
377
|
+
tabIndex: -1,
|
|
378
|
+
children
|
|
379
|
+
});
|
|
380
|
+
});
|
|
330
381
|
const TreeView = {
|
|
331
382
|
Root: TreeViewRoot,
|
|
332
383
|
Item: TreeViewItem,
|
|
333
384
|
Group: TreeViewGroup,
|
|
334
385
|
Toggle: TreeViewToggle,
|
|
335
|
-
Label: TreeViewLabel
|
|
386
|
+
Label: TreeViewLabel,
|
|
387
|
+
Loading: TreeViewLoading,
|
|
388
|
+
Empty: TreeViewEmpty,
|
|
389
|
+
Error: TreeViewError
|
|
336
390
|
};
|
|
337
391
|
//#endregion
|
|
338
|
-
export { TreeView, TreeViewGroup, TreeViewItem, TreeViewLabel, TreeViewRoot, TreeViewToggle };
|
|
392
|
+
export { TreeView, TreeViewEmpty, TreeViewError, TreeViewGroup, TreeViewItem, TreeViewLabel, TreeViewLoading, TreeViewRoot, TreeViewToggle };
|
|
339
393
|
|
|
340
394
|
//# sourceMappingURL=tree-view.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-view.js","names":[],"sources":["../../../src/components/tree-view/tree-view.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Children, isValidElement } from \"react\";\nimport type { ComponentPropsWithoutRef, KeyboardEvent, ReactNode } from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { treeView } from \"../../styled-system/recipes\";\n\nexport type TreeViewSelectionMode = \"none\" | \"single\" | \"multiple\";\nexport type TreeViewSelection = string | readonly string[] | null;\n\ninterface TreeNodeRecord {\n id: string;\n parentId: string | undefined;\n disabled: boolean;\n selectable: boolean;\n order: number;\n element: HTMLDivElement | null;\n}\n\ninterface TreeViewContextValue {\n disabled: boolean;\n loopFocus: boolean;\n selectionMode: TreeViewSelectionMode;\n expanded: ReadonlySet<string>;\n selected: ReadonlySet<string>;\n nodes: readonly TreeNodeRecord[];\n registerNode: (node: TreeNodeRecord) => () => void;\n setNodeElement: (id: string, element: HTMLDivElement | null) => void;\n isVisible: (id: string) => boolean;\n hasChildren: (id: string) => boolean;\n getDepth: (id: string) => number;\n getSiblings: (id: string) => readonly TreeNodeRecord[];\n toggleExpanded: (id: string) => void;\n selectNode: (id: string) => void;\n focusNode: (id: string) => void;\n handleKeyDown: (id: string, event: KeyboardEvent<HTMLDivElement>) => void;\n activeId: string | null;\n setActiveId: (id: string) => void;\n}\n\nconst TreeViewContext = createContext<TreeViewContextValue | null>(null);\nconst TreeParentContext = createContext<string | undefined>(undefined);\nconst TreeItemContext = createContext<string | null>(null);\n\nfunction useTreeViewContext() {\n const context = useContext(TreeViewContext);\n if (!context) throw new Error(\"TreeView parts must be rendered inside TreeView.Root.\");\n return context;\n}\n\nfunction asSet(value: string | readonly string[] | null | undefined, mode: TreeViewSelectionMode) {\n if (mode === \"multiple\") return new Set(Array.isArray(value) ? value : value ? [value] : []);\n return new Set(typeof value === \"string\" ? [value] : []);\n}\n\nexport interface TreeViewRootProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"children\"> {\n expanded?: readonly string[];\n defaultExpanded?: readonly string[];\n onExpandedChange?: (expanded: string[]) => void;\n selected?: TreeViewSelection;\n defaultSelected?: TreeViewSelection;\n onSelectedChange?: (selected: TreeViewSelection) => void;\n selectionMode?: TreeViewSelectionMode;\n loopFocus?: boolean;\n disabled?: boolean;\n children?: ReactNode;\n}\n\nexport const TreeViewRoot = forwardRef<HTMLDivElement, TreeViewRootProps>(function TreeViewRoot(\n {\n children,\n className,\n defaultExpanded = [],\n defaultSelected = null,\n disabled = false,\n expanded: controlledExpanded,\n loopFocus = true,\n onExpandedChange,\n onSelectedChange,\n selected: controlledSelected,\n selectionMode = \"single\",\n ...props\n },\n ref,\n) {\n const [uncontrolledExpanded, setUncontrolledExpanded] = useState(() => new Set(defaultExpanded));\n const [uncontrolledSelected, setUncontrolledSelected] = useState(() =>\n asSet(defaultSelected, selectionMode),\n );\n const [activeId, setActiveId] = useState<string | null>(null);\n const [, setVersion] = useState(0);\n const nodesRef = useRef(new Map<string, TreeNodeRecord>());\n const orderRef = useRef(0);\n const styles = treeView();\n const expanded = useMemo(\n () => new Set(controlledExpanded ?? uncontrolledExpanded),\n [controlledExpanded, uncontrolledExpanded],\n );\n const selected = useMemo(\n () =>\n controlledSelected === undefined\n ? uncontrolledSelected\n : asSet(controlledSelected, selectionMode),\n [controlledSelected, selectionMode, uncontrolledSelected],\n );\n const nodes = Array.from(nodesRef.current.values()).sort((a, b) => a.order - b.order);\n\n const registerNode = useCallback((node: TreeNodeRecord) => {\n const registeredNode = { ...node, order: orderRef.current++ };\n nodesRef.current.set(node.id, registeredNode);\n setVersion((current) => current + 1);\n return () => {\n if (nodesRef.current.get(node.id) === registeredNode) nodesRef.current.delete(node.id);\n setVersion((current) => current + 1);\n };\n }, []);\n\n const setNodeElement = useCallback((id: string, element: HTMLDivElement | null) => {\n const node = nodesRef.current.get(id);\n if (node) node.element = element;\n }, []);\n\n const hasChildren = useCallback(\n (id: string) => nodes.some((node) => node.parentId === id),\n [nodes],\n );\n const isVisible = useCallback(\n (id: string) => {\n let current = nodes.find((node) => node.id === id);\n while (current?.parentId) {\n if (!expanded.has(current.parentId)) return false;\n current = nodes.find((node) => node.id === current?.parentId);\n }\n return true;\n },\n [expanded, nodes],\n );\n const getDepth = useCallback(\n (id: string) => {\n let depth = 1;\n let current = nodes.find((node) => node.id === id);\n while (current?.parentId) {\n depth += 1;\n current = nodes.find((node) => node.id === current?.parentId);\n }\n return depth;\n },\n [nodes],\n );\n const getSiblings = useCallback(\n (id: string) => {\n const node = nodes.find((candidate) => candidate.id === id);\n return nodes.filter((candidate) => candidate.parentId === node?.parentId);\n },\n [nodes],\n );\n\n const toggleExpanded = useCallback(\n (id: string) => {\n if (disabled || !hasChildren(id)) return;\n const next = new Set(expanded);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n if (controlledExpanded === undefined) setUncontrolledExpanded(next);\n onExpandedChange?.(Array.from(next));\n },\n [controlledExpanded, disabled, expanded, hasChildren, onExpandedChange],\n );\n\n const selectNode = useCallback(\n (id: string) => {\n const node = nodes.find((candidate) => candidate.id === id);\n if (disabled || !node || node.disabled || !node.selectable || selectionMode === \"none\")\n return;\n const next = new Set(selected);\n if (selectionMode === \"single\") {\n next.clear();\n next.add(id);\n } else if (next.has(id)) next.delete(id);\n else next.add(id);\n if (controlledSelected === undefined) setUncontrolledSelected(next);\n onSelectedChange?.(\n selectionMode === \"multiple\" ? Array.from(next) : (next.values().next().value ?? null),\n );\n },\n [controlledSelected, disabled, nodes, onSelectedChange, selected, selectionMode],\n );\n\n const visibleNodes = nodes.filter((node) => isVisible(node.id));\n const focusNode = useCallback(\n (id: string) => {\n const node = nodes.find((candidate) => candidate.id === id);\n if (!node || node.disabled || !isVisible(id)) return;\n setActiveId(id);\n node.element?.focus();\n },\n [isVisible, nodes],\n );\n\n const handleKeyDown = useCallback(\n (id: string, event: KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n const index = visibleNodes.findIndex((node) => node.id === id);\n const node = nodes.find((candidate) => candidate.id === id);\n if (!node) return;\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n const direction = event.key === \"ArrowDown\" ? 1 : -1;\n let nextIndex = index + direction;\n if (loopFocus) nextIndex = (nextIndex + visibleNodes.length) % visibleNodes.length;\n const nextNode = visibleNodes[nextIndex];\n if (nextIndex >= 0 && nextIndex < visibleNodes.length && nextNode) focusNode(nextNode.id);\n } else if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n focusNode((event.key === \"Home\" ? visibleNodes[0] : visibleNodes.at(-1))?.id ?? id);\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault();\n if (hasChildren(id) && !expanded.has(id)) toggleExpanded(id);\n else if (hasChildren(id))\n focusNode(nodes.find((candidate) => candidate.parentId === id)?.id ?? id);\n } else if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n if (hasChildren(id) && expanded.has(id)) toggleExpanded(id);\n else if (node.parentId) focusNode(node.parentId);\n } else if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n selectNode(id);\n }\n },\n [\n disabled,\n expanded,\n focusNode,\n hasChildren,\n loopFocus,\n nodes,\n selectNode,\n toggleExpanded,\n visibleNodes,\n ],\n );\n\n const context = useMemo<TreeViewContextValue>(\n () => ({\n disabled,\n loopFocus,\n selectionMode,\n expanded,\n selected,\n nodes,\n registerNode,\n setNodeElement,\n isVisible,\n hasChildren,\n getDepth,\n getSiblings,\n toggleExpanded,\n selectNode,\n focusNode,\n handleKeyDown,\n activeId,\n setActiveId,\n }),\n [\n activeId,\n disabled,\n expanded,\n focusNode,\n getDepth,\n getSiblings,\n handleKeyDown,\n hasChildren,\n isVisible,\n loopFocus,\n nodes,\n registerNode,\n selectNode,\n selected,\n selectionMode,\n setNodeElement,\n toggleExpanded,\n ],\n );\n\n return (\n <TreeViewContext.Provider value={context}>\n <div\n {...props}\n ref={ref}\n aria-multiselectable={selectionMode === \"multiple\" || undefined}\n className={cx(styles.root, className)}\n data-disabled={disabled || undefined}\n data-jaci-component=\"tree-view\"\n data-slot=\"tree-view\"\n role=\"tree\"\n >\n {children}\n </div>\n </TreeViewContext.Provider>\n );\n});\n\nexport interface TreeViewItemProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"id\"> {\n id: string;\n disabled?: boolean;\n selectable?: boolean;\n}\n\nexport const TreeViewItem = forwardRef<HTMLDivElement, TreeViewItemProps>(function TreeViewItem(\n {\n children,\n className,\n disabled = false,\n onClick,\n onFocus,\n onKeyDown,\n style,\n selectable = true,\n id,\n ...props\n },\n ref,\n) {\n const context = useTreeViewContext();\n const parentId = useContext(TreeParentContext);\n const styles = treeView();\n useEffect(\n () => context.registerNode({ id, parentId, disabled, selectable, order: 0, element: null }),\n [context.registerNode, disabled, id, parentId, selectable],\n );\n const siblings = context.getSiblings(id);\n const registeredNode = context.nodes.find((candidate) => candidate.id === id);\n const selected = context.selected.has(id);\n const visible = context.isVisible(id);\n const siblingIndex = siblings.findIndex((candidate) => candidate.id === id);\n const tabIndex =\n context.activeId === id || (context.activeId === null && context.nodes[0]?.id === id) ? 0 : -1;\n const childNodes = Children.toArray(children);\n const groupNodes = childNodes.filter(\n (child) => isValidElement(child) && child.type === TreeViewGroup,\n );\n const rowNodes = childNodes.filter(\n (child) => !(isValidElement(child) && child.type === TreeViewGroup),\n );\n\n return (\n <TreeParentContext.Provider value={id}>\n <TreeItemContext.Provider value={id}>\n <div\n {...props}\n ref={(element) => {\n context.setNodeElement(id, element);\n if (typeof ref === \"function\") ref(element);\n else if (ref) ref.current = element;\n }}\n aria-disabled={disabled || undefined}\n aria-expanded={context.hasChildren(id) ? context.expanded.has(id) : undefined}\n aria-level={registeredNode ? context.getDepth(id) : parentId ? 2 : 1}\n aria-posinset={siblingIndex >= 0 ? siblingIndex + 1 : 1}\n aria-setsize={siblings.length || 1}\n aria-selected={context.selectionMode === \"none\" ? undefined : selected}\n className={styles.itemWrapper}\n data-disabled={disabled || undefined}\n data-expanded={context.expanded.has(id) || undefined}\n data-jaci-component=\"tree-view\"\n data-selected={selected || undefined}\n data-slot=\"tree-view-item\"\n onClick={(event) => {\n event.stopPropagation();\n onClick?.(event);\n if (!event.defaultPrevented) context.selectNode(id);\n }}\n onFocus={(event) => {\n context.setActiveId(id);\n onFocus?.(event);\n }}\n onKeyDown={(event) => {\n event.stopPropagation();\n context.handleKeyDown(id, event);\n onKeyDown?.(event);\n }}\n role=\"treeitem\"\n tabIndex={visible ? tabIndex : -1}\n >\n <div\n className={cx(styles.item, className)}\n data-disabled={disabled || undefined}\n data-expanded={context.expanded.has(id) || undefined}\n data-selected={selected || undefined}\n data-slot=\"tree-view-item-row\"\n style={style}\n >\n {rowNodes}\n </div>\n {groupNodes}\n </div>\n </TreeItemContext.Provider>\n </TreeParentContext.Provider>\n );\n});\n\nexport type TreeViewGroupProps = ComponentPropsWithoutRef<\"div\">;\nexport const TreeViewGroup = forwardRef<HTMLDivElement, TreeViewGroupProps>(function TreeViewGroup(\n { children, className, style, ...props },\n ref,\n) {\n const context = useTreeViewContext();\n const parentId = useContext(TreeParentContext);\n const styles = treeView();\n const visible = parentId ? context.expanded.has(parentId) : true;\n return (\n // biome-ignore lint/a11y/useSemanticElements: WAI-ARIA tree groups require role=\"group\".\n <div\n {...props}\n ref={ref}\n aria-hidden={!visible || undefined}\n className={cx(styles.group, className)}\n data-jaci-component=\"tree-view\"\n data-expanded={visible || undefined}\n data-slot=\"tree-view-group\"\n hidden={!visible}\n role=\"group\"\n style={{ ...style, display: visible ? style?.display : \"none\" }}\n >\n {children}\n </div>\n );\n});\n\nexport type TreeViewToggleProps = ComponentPropsWithoutRef<\"button\">;\nexport const TreeViewToggle = forwardRef<HTMLButtonElement, TreeViewToggleProps>(\n function TreeViewToggle({ children, className, onClick, ...props }, ref) {\n const context = useTreeViewContext();\n const itemId = useContext(TreeItemContext);\n const id = itemId;\n return (\n <button\n {...props}\n ref={ref}\n aria-expanded={id ? context.expanded.has(id) : undefined}\n className={cx(treeView().toggle, className)}\n data-slot=\"tree-view-toggle\"\n onClick={(event) => {\n event.stopPropagation();\n onClick?.(event);\n if (!event.defaultPrevented && id) context.toggleExpanded(id);\n }}\n tabIndex={-1}\n type=\"button\"\n >\n {children ?? (id && context.expanded.has(id) ? \"▾\" : \"▸\")}\n </button>\n );\n },\n);\n\nexport type TreeViewLabelProps = ComponentPropsWithoutRef<\"span\">;\nexport const TreeViewLabel = forwardRef<HTMLSpanElement, TreeViewLabelProps>(function TreeViewLabel(\n { className, ...props },\n ref,\n) {\n return (\n <span\n {...props}\n ref={ref}\n className={cx(treeView().label, className)}\n data-slot=\"tree-view-label\"\n />\n );\n});\n\nexport const TreeView = {\n Root: TreeViewRoot,\n Item: TreeViewItem,\n Group: TreeViewGroup,\n Toggle: TreeViewToggle,\n Label: TreeViewLabel,\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tree-view.js","names":[],"sources":["../../../src/components/tree-view/tree-view.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Children, isValidElement } from \"react\";\nimport type { ComponentPropsWithoutRef, KeyboardEvent, ReactNode } from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { treeView } from \"../../styled-system/recipes\";\n\nexport type TreeViewSelectionMode = \"none\" | \"single\" | \"multiple\";\nexport type TreeViewSelection = string | readonly string[] | null;\n\ninterface TreeNodeRecord {\n id: string;\n parentId: string | undefined;\n disabled: boolean;\n hasChildren: boolean;\n loading: boolean;\n selectable: boolean;\n order: number;\n element: HTMLDivElement | null;\n}\n\ninterface TreeViewContextValue {\n disabled: boolean;\n loopFocus: boolean;\n selectionMode: TreeViewSelectionMode;\n expanded: ReadonlySet<string>;\n selected: ReadonlySet<string>;\n nodes: readonly TreeNodeRecord[];\n registerNode: (node: TreeNodeRecord) => () => void;\n setNodeElement: (id: string, element: HTMLDivElement | null) => void;\n isVisible: (id: string) => boolean;\n hasChildren: (id: string) => boolean;\n getDepth: (id: string) => number;\n getSiblings: (id: string) => readonly TreeNodeRecord[];\n toggleExpanded: (id: string) => void;\n selectNode: (id: string) => void;\n focusNode: (id: string) => void;\n handleKeyDown: (id: string, event: KeyboardEvent<HTMLDivElement>) => void;\n activeId: string | null;\n setActiveId: (id: string) => void;\n}\n\nconst TreeViewContext = createContext<TreeViewContextValue | null>(null);\nconst TreeParentContext = createContext<string | undefined>(undefined);\nconst TreeItemContext = createContext<string | null>(null);\n\nfunction useTreeViewContext() {\n const context = useContext(TreeViewContext);\n if (!context) throw new Error(\"TreeView parts must be rendered inside TreeView.Root.\");\n return context;\n}\n\nfunction asSet(value: string | readonly string[] | null | undefined, mode: TreeViewSelectionMode) {\n if (mode === \"multiple\") return new Set(Array.isArray(value) ? value : value ? [value] : []);\n return new Set(typeof value === \"string\" ? [value] : []);\n}\n\nexport interface TreeViewRootProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"children\"> {\n expanded?: readonly string[];\n defaultExpanded?: readonly string[];\n onExpandedChange?: (expanded: string[]) => void;\n selected?: TreeViewSelection;\n defaultSelected?: TreeViewSelection;\n onSelectedChange?: (selected: TreeViewSelection) => void;\n selectionMode?: TreeViewSelectionMode;\n loopFocus?: boolean;\n disabled?: boolean;\n children?: ReactNode;\n}\n\nexport const TreeViewRoot = forwardRef<HTMLDivElement, TreeViewRootProps>(function TreeViewRoot(\n {\n children,\n className,\n defaultExpanded = [],\n defaultSelected = null,\n disabled = false,\n expanded: controlledExpanded,\n loopFocus = true,\n onExpandedChange,\n onSelectedChange,\n selected: controlledSelected,\n selectionMode = \"single\",\n ...props\n },\n ref,\n) {\n const [uncontrolledExpanded, setUncontrolledExpanded] = useState(() => new Set(defaultExpanded));\n const [uncontrolledSelected, setUncontrolledSelected] = useState(() =>\n asSet(defaultSelected, selectionMode),\n );\n const [activeId, setActiveId] = useState<string | null>(null);\n const [, setVersion] = useState(0);\n const nodesRef = useRef(new Map<string, TreeNodeRecord>());\n const orderRef = useRef(0);\n const styles = treeView();\n const expanded = useMemo(\n () => new Set(controlledExpanded ?? uncontrolledExpanded),\n [controlledExpanded, uncontrolledExpanded],\n );\n const selected = useMemo(\n () =>\n controlledSelected === undefined\n ? uncontrolledSelected\n : asSet(controlledSelected, selectionMode),\n [controlledSelected, selectionMode, uncontrolledSelected],\n );\n const nodes = Array.from(nodesRef.current.values()).sort((a, b) => a.order - b.order);\n\n const registerNode = useCallback((node: TreeNodeRecord) => {\n const registeredNode = { ...node, order: orderRef.current++ };\n nodesRef.current.set(node.id, registeredNode);\n setVersion((current) => current + 1);\n return () => {\n if (nodesRef.current.get(node.id) === registeredNode) nodesRef.current.delete(node.id);\n setVersion((current) => current + 1);\n };\n }, []);\n\n const setNodeElement = useCallback((id: string, element: HTMLDivElement | null) => {\n const node = nodesRef.current.get(id);\n if (node) node.element = element;\n }, []);\n\n const hasChildren = useCallback(\n (id: string) =>\n nodes.some((node) => node.parentId === id) ||\n Boolean(nodes.find((node) => node.id === id)?.hasChildren),\n [nodes],\n );\n const isVisible = useCallback(\n (id: string) => {\n let current = nodes.find((node) => node.id === id);\n while (current?.parentId) {\n if (!expanded.has(current.parentId)) return false;\n current = nodes.find((node) => node.id === current?.parentId);\n }\n return true;\n },\n [expanded, nodes],\n );\n const getDepth = useCallback(\n (id: string) => {\n let depth = 1;\n let current = nodes.find((node) => node.id === id);\n while (current?.parentId) {\n depth += 1;\n current = nodes.find((node) => node.id === current?.parentId);\n }\n return depth;\n },\n [nodes],\n );\n const getSiblings = useCallback(\n (id: string) => {\n const node = nodes.find((candidate) => candidate.id === id);\n return nodes.filter((candidate) => candidate.parentId === node?.parentId);\n },\n [nodes],\n );\n\n const toggleExpanded = useCallback(\n (id: string) => {\n if (disabled || !hasChildren(id)) return;\n const next = new Set(expanded);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n if (controlledExpanded === undefined) setUncontrolledExpanded(next);\n onExpandedChange?.(Array.from(next));\n },\n [controlledExpanded, disabled, expanded, hasChildren, onExpandedChange],\n );\n\n const selectNode = useCallback(\n (id: string) => {\n const node = nodes.find((candidate) => candidate.id === id);\n if (disabled || !node || node.disabled || !node.selectable || selectionMode === \"none\")\n return;\n const next = new Set(selected);\n if (selectionMode === \"single\") {\n next.clear();\n next.add(id);\n } else if (next.has(id)) next.delete(id);\n else next.add(id);\n if (controlledSelected === undefined) setUncontrolledSelected(next);\n onSelectedChange?.(\n selectionMode === \"multiple\" ? Array.from(next) : (next.values().next().value ?? null),\n );\n },\n [controlledSelected, disabled, nodes, onSelectedChange, selected, selectionMode],\n );\n\n const visibleNodes = nodes.filter((node) => isVisible(node.id));\n const focusNode = useCallback(\n (id: string) => {\n const node = nodes.find((candidate) => candidate.id === id);\n if (!node || node.disabled || !isVisible(id)) return;\n setActiveId(id);\n node.element?.focus();\n },\n [isVisible, nodes],\n );\n\n const handleKeyDown = useCallback(\n (id: string, event: KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n const index = visibleNodes.findIndex((node) => node.id === id);\n const node = nodes.find((candidate) => candidate.id === id);\n if (!node) return;\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n const direction = event.key === \"ArrowDown\" ? 1 : -1;\n let nextIndex = index + direction;\n if (loopFocus) nextIndex = (nextIndex + visibleNodes.length) % visibleNodes.length;\n const nextNode = visibleNodes[nextIndex];\n if (nextIndex >= 0 && nextIndex < visibleNodes.length && nextNode) focusNode(nextNode.id);\n } else if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n focusNode((event.key === \"Home\" ? visibleNodes[0] : visibleNodes.at(-1))?.id ?? id);\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault();\n if (hasChildren(id) && !expanded.has(id)) toggleExpanded(id);\n else if (hasChildren(id))\n focusNode(nodes.find((candidate) => candidate.parentId === id)?.id ?? id);\n } else if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n if (hasChildren(id) && expanded.has(id)) toggleExpanded(id);\n else if (node.parentId) focusNode(node.parentId);\n } else if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n selectNode(id);\n }\n },\n [\n disabled,\n expanded,\n focusNode,\n hasChildren,\n loopFocus,\n nodes,\n selectNode,\n toggleExpanded,\n visibleNodes,\n ],\n );\n\n const context = useMemo<TreeViewContextValue>(\n () => ({\n disabled,\n loopFocus,\n selectionMode,\n expanded,\n selected,\n nodes,\n registerNode,\n setNodeElement,\n isVisible,\n hasChildren,\n getDepth,\n getSiblings,\n toggleExpanded,\n selectNode,\n focusNode,\n handleKeyDown,\n activeId,\n setActiveId,\n }),\n [\n activeId,\n disabled,\n expanded,\n focusNode,\n getDepth,\n getSiblings,\n handleKeyDown,\n hasChildren,\n isVisible,\n loopFocus,\n nodes,\n registerNode,\n selectNode,\n selected,\n selectionMode,\n setNodeElement,\n toggleExpanded,\n ],\n );\n\n return (\n <TreeViewContext.Provider value={context}>\n <div\n {...props}\n ref={ref}\n aria-multiselectable={selectionMode === \"multiple\" || undefined}\n className={cx(styles.root, className)}\n data-disabled={disabled || undefined}\n data-jaci-component=\"tree-view\"\n data-slot=\"tree-view\"\n role=\"tree\"\n >\n {children}\n </div>\n </TreeViewContext.Provider>\n );\n});\n\nexport interface TreeViewItemProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"id\"> {\n id: string;\n disabled?: boolean;\n hasChildren?: boolean;\n loading?: boolean;\n selectable?: boolean;\n}\n\nexport const TreeViewItem = forwardRef<HTMLDivElement, TreeViewItemProps>(function TreeViewItem(\n {\n children,\n className,\n disabled = false,\n hasChildren: hasChildrenProp = false,\n loading = false,\n onClick,\n onFocus,\n onKeyDown,\n style,\n selectable = true,\n id,\n ...props\n },\n ref,\n) {\n const context = useTreeViewContext();\n const parentId = useContext(TreeParentContext);\n const styles = treeView();\n useEffect(\n () =>\n context.registerNode({\n id,\n parentId,\n disabled,\n hasChildren: hasChildrenProp,\n loading,\n selectable,\n order: 0,\n element: null,\n }),\n [context.registerNode, disabled, hasChildrenProp, id, loading, parentId, selectable],\n );\n const siblings = context.getSiblings(id);\n const registeredNode = context.nodes.find((candidate) => candidate.id === id);\n const selected = context.selected.has(id);\n const visible = context.isVisible(id);\n const siblingIndex = siblings.findIndex((candidate) => candidate.id === id);\n const tabIndex =\n context.activeId === id || (context.activeId === null && context.nodes[0]?.id === id) ? 0 : -1;\n const childNodes = Children.toArray(children);\n const groupNodes = childNodes.filter(\n (child) => isValidElement(child) && child.type === TreeViewGroup,\n );\n const rowNodes = childNodes.filter(\n (child) => !(isValidElement(child) && child.type === TreeViewGroup),\n );\n\n return (\n <TreeParentContext.Provider value={id}>\n <TreeItemContext.Provider value={id}>\n <div\n {...props}\n ref={(element) => {\n context.setNodeElement(id, element);\n if (typeof ref === \"function\") ref(element);\n else if (ref) ref.current = element;\n }}\n aria-disabled={disabled || undefined}\n aria-expanded={context.hasChildren(id) ? context.expanded.has(id) : undefined}\n aria-busy={loading || undefined}\n aria-level={registeredNode ? context.getDepth(id) : parentId ? 2 : 1}\n aria-posinset={siblingIndex >= 0 ? siblingIndex + 1 : 1}\n aria-setsize={siblings.length || 1}\n aria-selected={context.selectionMode === \"none\" ? undefined : selected}\n className={styles.itemWrapper}\n data-disabled={disabled || undefined}\n data-expanded={context.expanded.has(id) || undefined}\n data-jaci-component=\"tree-view\"\n data-selected={selected || undefined}\n data-loading={loading || undefined}\n data-slot=\"tree-view-item\"\n onClick={(event) => {\n event.stopPropagation();\n onClick?.(event);\n if (!event.defaultPrevented) context.selectNode(id);\n }}\n onFocus={(event) => {\n context.setActiveId(id);\n onFocus?.(event);\n }}\n onKeyDown={(event) => {\n event.stopPropagation();\n context.handleKeyDown(id, event);\n onKeyDown?.(event);\n }}\n role=\"treeitem\"\n tabIndex={visible ? tabIndex : -1}\n >\n <div\n className={cx(styles.item, className)}\n data-disabled={disabled || undefined}\n data-expanded={context.expanded.has(id) || undefined}\n data-selected={selected || undefined}\n data-slot=\"tree-view-item-row\"\n style={style}\n >\n {rowNodes}\n </div>\n {groupNodes}\n </div>\n </TreeItemContext.Provider>\n </TreeParentContext.Provider>\n );\n});\n\nexport type TreeViewGroupProps = ComponentPropsWithoutRef<\"div\">;\nexport const TreeViewGroup = forwardRef<HTMLDivElement, TreeViewGroupProps>(function TreeViewGroup(\n { children, className, style, ...props },\n ref,\n) {\n const context = useTreeViewContext();\n const parentId = useContext(TreeParentContext);\n const styles = treeView();\n const visible = parentId ? context.expanded.has(parentId) : true;\n return (\n // biome-ignore lint/a11y/useSemanticElements: WAI-ARIA tree groups require role=\"group\".\n <div\n {...props}\n ref={ref}\n aria-hidden={!visible || undefined}\n className={cx(styles.group, className)}\n data-jaci-component=\"tree-view\"\n data-expanded={visible || undefined}\n data-slot=\"tree-view-group\"\n hidden={!visible}\n role=\"group\"\n style={{ ...style, display: visible ? style?.display : \"none\" }}\n >\n {children}\n </div>\n );\n});\n\nexport type TreeViewToggleProps = ComponentPropsWithoutRef<\"button\">;\nexport const TreeViewToggle = forwardRef<HTMLButtonElement, TreeViewToggleProps>(\n function TreeViewToggle({ children, className, onClick, ...props }, ref) {\n const context = useTreeViewContext();\n const itemId = useContext(TreeItemContext);\n const id = itemId;\n const item = id ? context.nodes.find((candidate) => candidate.id === id) : undefined;\n const disabled = context.disabled || Boolean(item?.disabled);\n return (\n <button\n {...props}\n ref={ref}\n aria-expanded={id ? context.expanded.has(id) : undefined}\n aria-disabled={disabled || undefined}\n className={cx(treeView().toggle, className)}\n data-slot=\"tree-view-toggle\"\n disabled={disabled || props.disabled}\n onClick={(event) => {\n event.stopPropagation();\n onClick?.(event);\n if (!event.defaultPrevented && id) context.toggleExpanded(id);\n }}\n tabIndex={-1}\n type=\"button\"\n >\n {children ?? (id && context.expanded.has(id) ? \"▾\" : \"▸\")}\n </button>\n );\n },\n);\n\nexport type TreeViewLabelProps = ComponentPropsWithoutRef<\"span\">;\nexport const TreeViewLabel = forwardRef<HTMLSpanElement, TreeViewLabelProps>(function TreeViewLabel(\n { className, ...props },\n ref,\n) {\n return (\n <span\n {...props}\n ref={ref}\n className={cx(treeView().label, className)}\n data-slot=\"tree-view-label\"\n />\n );\n});\n\nexport interface TreeViewStateProps extends ComponentPropsWithoutRef<\"div\"> {\n children?: ReactNode;\n}\n\nexport const TreeViewLoading = forwardRef<HTMLDivElement, TreeViewStateProps>(\n function TreeViewLoading({ children = \"Loading…\", className, ...props }, ref) {\n return (\n <div\n {...props}\n ref={ref}\n aria-disabled=\"true\"\n aria-live=\"polite\"\n aria-level={1}\n className={cx(treeView().loading, className)}\n data-slot=\"tree-view-loading\"\n role=\"treeitem\"\n tabIndex={-1}\n >\n {children}\n </div>\n );\n },\n);\n\nexport const TreeViewEmpty = forwardRef<HTMLDivElement, TreeViewStateProps>(function TreeViewEmpty(\n { children = \"No items found.\", className, ...props },\n ref,\n) {\n return (\n <div\n {...props}\n ref={ref}\n aria-disabled=\"true\"\n aria-level={1}\n className={cx(treeView().empty, className)}\n data-slot=\"tree-view-empty\"\n role=\"treeitem\"\n tabIndex={-1}\n >\n {children}\n </div>\n );\n});\n\nexport const TreeViewError = forwardRef<HTMLDivElement, TreeViewStateProps>(function TreeViewError(\n { children = \"Something went wrong.\", className, ...props },\n ref,\n) {\n return (\n <div\n {...props}\n ref={ref}\n aria-disabled=\"true\"\n aria-live=\"assertive\"\n aria-level={1}\n className={cx(treeView().error, className)}\n data-slot=\"tree-view-error\"\n role=\"treeitem\"\n tabIndex={-1}\n >\n {children}\n </div>\n );\n});\n\nexport const TreeView = {\n Root: TreeViewRoot,\n Item: TreeViewItem,\n Group: TreeViewGroup,\n Toggle: TreeViewToggle,\n Label: TreeViewLabel,\n Loading: TreeViewLoading,\n Empty: TreeViewEmpty,\n Error: TreeViewError,\n};\n"],"mappings":";;;;;;AAqDA,MAAM,kBAAkB,cAA2C,IAAI;AACvE,MAAM,oBAAoB,cAAkC,KAAA,CAAS;AACrE,MAAM,kBAAkB,cAA6B,IAAI;AAEzD,SAAS,qBAAqB;CAC5B,MAAM,UAAU,WAAW,eAAe;CAC1C,IAAI,CAAC,SAAS,MAAM,IAAI,MAAM,uDAAuD;CACrF,OAAO;AACT;AAEA,SAAS,MAAM,OAAsD,MAA6B;CAChG,IAAI,SAAS,YAAY,OAAO,IAAI,IAAI,MAAM,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC;CAC3F,OAAO,IAAI,IAAI,OAAO,UAAU,WAAW,CAAC,KAAK,IAAI,CAAC,CAAC;AACzD;AAeA,MAAa,eAAe,WAA8C,SAAS,aACjF,EACE,UACA,WACA,kBAAkB,CAAC,GACnB,kBAAkB,MAClB,WAAW,OACX,UAAU,oBACV,YAAY,MACZ,kBACA,kBACA,UAAU,oBACV,gBAAgB,UAChB,GAAG,SAEL,KACA;CACA,MAAM,CAAC,sBAAsB,2BAA2B,eAAe,IAAI,IAAI,eAAe,CAAC;CAC/F,MAAM,CAAC,sBAAsB,2BAA2B,eACtD,MAAM,iBAAiB,aAAa,CACtC;CACA,MAAM,CAAC,UAAU,eAAe,SAAwB,IAAI;CAC5D,MAAM,GAAG,cAAc,SAAS,CAAC;CACjC,MAAM,WAAW,uBAAO,IAAI,IAA4B,CAAC;CACzD,MAAM,WAAW,OAAO,CAAC;CACzB,MAAM,SAAS,SAAS;CACxB,MAAM,WAAW,cACT,IAAI,IAAI,sBAAsB,oBAAoB,GACxD,CAAC,oBAAoB,oBAAoB,CAC3C;CACA,MAAM,WAAW,cAEb,uBAAuB,KAAA,IACnB,uBACA,MAAM,oBAAoB,aAAa,GAC7C;EAAC;EAAoB;EAAe;CAAoB,CAC1D;CACA,MAAM,QAAQ,MAAM,KAAK,SAAS,QAAQ,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;CAEpF,MAAM,eAAe,aAAa,SAAyB;EACzD,MAAM,iBAAiB;GAAE,GAAG;GAAM,OAAO,SAAS;EAAU;EAC5D,SAAS,QAAQ,IAAI,KAAK,IAAI,cAAc;EAC5C,YAAY,YAAY,UAAU,CAAC;EACnC,aAAa;GACX,IAAI,SAAS,QAAQ,IAAI,KAAK,EAAE,MAAM,gBAAgB,SAAS,QAAQ,OAAO,KAAK,EAAE;GACrF,YAAY,YAAY,UAAU,CAAC;EACrC;CACF,GAAG,CAAC,CAAC;CAEL,MAAM,iBAAiB,aAAa,IAAY,YAAmC;EACjF,MAAM,OAAO,SAAS,QAAQ,IAAI,EAAE;EACpC,IAAI,MAAM,KAAK,UAAU;CAC3B,GAAG,CAAC,CAAC;CAEL,MAAM,cAAc,aACjB,OACC,MAAM,MAAM,SAAS,KAAK,aAAa,EAAE,KACzC,QAAQ,MAAM,MAAM,SAAS,KAAK,OAAO,EAAE,CAAC,EAAE,WAAW,GAC3D,CAAC,KAAK,CACR;CACA,MAAM,YAAY,aACf,OAAe;EACd,IAAI,UAAU,MAAM,MAAM,SAAS,KAAK,OAAO,EAAE;EACjD,OAAO,SAAS,UAAU;GACxB,IAAI,CAAC,SAAS,IAAI,QAAQ,QAAQ,GAAG,OAAO;GAC5C,UAAU,MAAM,MAAM,SAAS,KAAK,OAAO,SAAS,QAAQ;EAC9D;EACA,OAAO;CACT,GACA,CAAC,UAAU,KAAK,CAClB;CACA,MAAM,WAAW,aACd,OAAe;EACd,IAAI,QAAQ;EACZ,IAAI,UAAU,MAAM,MAAM,SAAS,KAAK,OAAO,EAAE;EACjD,OAAO,SAAS,UAAU;GACxB,SAAS;GACT,UAAU,MAAM,MAAM,SAAS,KAAK,OAAO,SAAS,QAAQ;EAC9D;EACA,OAAO;CACT,GACA,CAAC,KAAK,CACR;CACA,MAAM,cAAc,aACjB,OAAe;EACd,MAAM,OAAO,MAAM,MAAM,cAAc,UAAU,OAAO,EAAE;EAC1D,OAAO,MAAM,QAAQ,cAAc,UAAU,aAAa,MAAM,QAAQ;CAC1E,GACA,CAAC,KAAK,CACR;CAEA,MAAM,iBAAiB,aACpB,OAAe;EACd,IAAI,YAAY,CAAC,YAAY,EAAE,GAAG;EAClC,MAAM,OAAO,IAAI,IAAI,QAAQ;EAC7B,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,OAAO,EAAE;OAC3B,KAAK,IAAI,EAAE;EAChB,IAAI,uBAAuB,KAAA,GAAW,wBAAwB,IAAI;EAClE,mBAAmB,MAAM,KAAK,IAAI,CAAC;CACrC,GACA;EAAC;EAAoB;EAAU;EAAU;EAAa;CAAgB,CACxE;CAEA,MAAM,aAAa,aAChB,OAAe;EACd,MAAM,OAAO,MAAM,MAAM,cAAc,UAAU,OAAO,EAAE;EAC1D,IAAI,YAAY,CAAC,QAAQ,KAAK,YAAY,CAAC,KAAK,cAAc,kBAAkB,QAC9E;EACF,MAAM,OAAO,IAAI,IAAI,QAAQ;EAC7B,IAAI,kBAAkB,UAAU;GAC9B,KAAK,MAAM;GACX,KAAK,IAAI,EAAE;EACb,OAAO,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,OAAO,EAAE;OAClC,KAAK,IAAI,EAAE;EAChB,IAAI,uBAAuB,KAAA,GAAW,wBAAwB,IAAI;EAClE,mBACE,kBAAkB,aAAa,MAAM,KAAK,IAAI,IAAK,KAAK,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,IACnF;CACF,GACA;EAAC;EAAoB;EAAU;EAAO;EAAkB;EAAU;CAAa,CACjF;CAEA,MAAM,eAAe,MAAM,QAAQ,SAAS,UAAU,KAAK,EAAE,CAAC;CAC9D,MAAM,YAAY,aACf,OAAe;EACd,MAAM,OAAO,MAAM,MAAM,cAAc,UAAU,OAAO,EAAE;EAC1D,IAAI,CAAC,QAAQ,KAAK,YAAY,CAAC,UAAU,EAAE,GAAG;EAC9C,YAAY,EAAE;EACd,KAAK,SAAS,MAAM;CACtB,GACA,CAAC,WAAW,KAAK,CACnB;CAEA,MAAM,gBAAgB,aACnB,IAAY,UAAyC;EACpD,IAAI,UAAU;EACd,MAAM,QAAQ,aAAa,WAAW,SAAS,KAAK,OAAO,EAAE;EAC7D,MAAM,OAAO,MAAM,MAAM,cAAc,UAAU,OAAO,EAAE;EAC1D,IAAI,CAAC,MAAM;EACX,IAAI,MAAM,QAAQ,eAAe,MAAM,QAAQ,WAAW;GACxD,MAAM,eAAe;GAErB,IAAI,YAAY,SADE,MAAM,QAAQ,cAAc,IAAI;GAElD,IAAI,WAAW,aAAa,YAAY,aAAa,UAAU,aAAa;GAC5E,MAAM,WAAW,aAAa;GAC9B,IAAI,aAAa,KAAK,YAAY,aAAa,UAAU,UAAU,UAAU,SAAS,EAAE;EAC1F,OAAO,IAAI,MAAM,QAAQ,UAAU,MAAM,QAAQ,OAAO;GACtD,MAAM,eAAe;GACrB,WAAW,MAAM,QAAQ,SAAS,aAAa,KAAK,aAAa,GAAG,EAAE,EAAA,EAAI,MAAM,EAAE;EACpF,OAAO,IAAI,MAAM,QAAQ,cAAc;GACrC,MAAM,eAAe;GACrB,IAAI,YAAY,EAAE,KAAK,CAAC,SAAS,IAAI,EAAE,GAAG,eAAe,EAAE;QACtD,IAAI,YAAY,EAAE,GACrB,UAAU,MAAM,MAAM,cAAc,UAAU,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE;EAC5E,OAAO,IAAI,MAAM,QAAQ,aAAa;GACpC,MAAM,eAAe;GACrB,IAAI,YAAY,EAAE,KAAK,SAAS,IAAI,EAAE,GAAG,eAAe,EAAE;QACrD,IAAI,KAAK,UAAU,UAAU,KAAK,QAAQ;EACjD,OAAO,IAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;GACrD,MAAM,eAAe;GACrB,WAAW,EAAE;EACf;CACF,GACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CACF;CAEA,MAAM,UAAU,eACP;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,IACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CACF;CAEA,OACE,oBAAC,gBAAgB,UAAjB;EAA0B,OAAO;YAC/B,oBAAC,OAAD;GACE,GAAI;GACC;GACL,wBAAsB,kBAAkB,cAAc,KAAA;GACtD,WAAW,GAAG,OAAO,MAAM,SAAS;GACpC,iBAAe,YAAY,KAAA;GAC3B,uBAAoB;GACpB,aAAU;GACV,MAAK;GAEJ;EACE,CAAA;CACmB,CAAA;AAE9B,CAAC;AAUD,MAAa,eAAe,WAA8C,SAAS,aACjF,EACE,UACA,WACA,WAAW,OACX,aAAa,kBAAkB,OAC/B,UAAU,OACV,SACA,SACA,WACA,OACA,aAAa,MACb,IACA,GAAG,SAEL,KACA;CACA,MAAM,UAAU,mBAAmB;CACnC,MAAM,WAAW,WAAW,iBAAiB;CAC7C,MAAM,SAAS,SAAS;CACxB,gBAEI,QAAQ,aAAa;EACnB;EACA;EACA;EACA,aAAa;EACb;EACA;EACA,OAAO;EACP,SAAS;CACX,CAAC,GACH;EAAC,QAAQ;EAAc;EAAU;EAAiB;EAAI;EAAS;EAAU;CAAU,CACrF;CACA,MAAM,WAAW,QAAQ,YAAY,EAAE;CACvC,MAAM,iBAAiB,QAAQ,MAAM,MAAM,cAAc,UAAU,OAAO,EAAE;CAC5E,MAAM,WAAW,QAAQ,SAAS,IAAI,EAAE;CACxC,MAAM,UAAU,QAAQ,UAAU,EAAE;CACpC,MAAM,eAAe,SAAS,WAAW,cAAc,UAAU,OAAO,EAAE;CAC1E,MAAM,WACJ,QAAQ,aAAa,MAAO,QAAQ,aAAa,QAAQ,QAAQ,MAAM,EAAE,EAAE,OAAO,KAAM,IAAI;CAC9F,MAAM,aAAa,SAAS,QAAQ,QAAQ;CAC5C,MAAM,aAAa,WAAW,QAC3B,UAAU,eAAe,KAAK,KAAK,MAAM,SAAS,aACrD;CACA,MAAM,WAAW,WAAW,QACzB,UAAU,EAAE,eAAe,KAAK,KAAK,MAAM,SAAS,cACvD;CAEA,OACE,oBAAC,kBAAkB,UAAnB;EAA4B,OAAO;YACjC,oBAAC,gBAAgB,UAAjB;GAA0B,OAAO;aAC/B,qBAAC,OAAD;IACE,GAAI;IACJ,MAAM,YAAY;KAChB,QAAQ,eAAe,IAAI,OAAO;KAClC,IAAI,OAAO,QAAQ,YAAY,IAAI,OAAO;UACrC,IAAI,KAAK,IAAI,UAAU;IAC9B;IACA,iBAAe,YAAY,KAAA;IAC3B,iBAAe,QAAQ,YAAY,EAAE,IAAI,QAAQ,SAAS,IAAI,EAAE,IAAI,KAAA;IACpE,aAAW,WAAW,KAAA;IACtB,cAAY,iBAAiB,QAAQ,SAAS,EAAE,IAAI,WAAW,IAAI;IACnE,iBAAe,gBAAgB,IAAI,eAAe,IAAI;IACtD,gBAAc,SAAS,UAAU;IACjC,iBAAe,QAAQ,kBAAkB,SAAS,KAAA,IAAY;IAC9D,WAAW,OAAO;IAClB,iBAAe,YAAY,KAAA;IAC3B,iBAAe,QAAQ,SAAS,IAAI,EAAE,KAAK,KAAA;IAC3C,uBAAoB;IACpB,iBAAe,YAAY,KAAA;IAC3B,gBAAc,WAAW,KAAA;IACzB,aAAU;IACV,UAAU,UAAU;KAClB,MAAM,gBAAgB;KACtB,UAAU,KAAK;KACf,IAAI,CAAC,MAAM,kBAAkB,QAAQ,WAAW,EAAE;IACpD;IACA,UAAU,UAAU;KAClB,QAAQ,YAAY,EAAE;KACtB,UAAU,KAAK;IACjB;IACA,YAAY,UAAU;KACpB,MAAM,gBAAgB;KACtB,QAAQ,cAAc,IAAI,KAAK;KAC/B,YAAY,KAAK;IACnB;IACA,MAAK;IACL,UAAU,UAAU,WAAW;cApCjC,CAsCE,oBAAC,OAAD;KACE,WAAW,GAAG,OAAO,MAAM,SAAS;KACpC,iBAAe,YAAY,KAAA;KAC3B,iBAAe,QAAQ,SAAS,IAAI,EAAE,KAAK,KAAA;KAC3C,iBAAe,YAAY,KAAA;KAC3B,aAAU;KACH;eAEN;IACE,CAAA,GACJ,UACE;;EACmB,CAAA;CACA,CAAA;AAEhC,CAAC;AAGD,MAAa,gBAAgB,WAA+C,SAAS,cACnF,EAAE,UAAU,WAAW,OAAO,GAAG,SACjC,KACA;CACA,MAAM,UAAU,mBAAmB;CACnC,MAAM,WAAW,WAAW,iBAAiB;CAC7C,MAAM,SAAS,SAAS;CACxB,MAAM,UAAU,WAAW,QAAQ,SAAS,IAAI,QAAQ,IAAI;CAC5D,OAEE,oBAAC,OAAD;EACE,GAAI;EACC;EACL,eAAa,CAAC,WAAW,KAAA;EACzB,WAAW,GAAG,OAAO,OAAO,SAAS;EACrC,uBAAoB;EACpB,iBAAe,WAAW,KAAA;EAC1B,aAAU;EACV,QAAQ,CAAC;EACT,MAAK;EACL,OAAO;GAAE,GAAG;GAAO,SAAS,UAAU,OAAO,UAAU;EAAO;EAE7D;CACE,CAAA;AAET,CAAC;AAGD,MAAa,iBAAiB,WAC5B,SAAS,eAAe,EAAE,UAAU,WAAW,SAAS,GAAG,SAAS,KAAK;CACvE,MAAM,UAAU,mBAAmB;CAEnC,MAAM,KADS,WAAW,eACV;CAChB,MAAM,OAAO,KAAK,QAAQ,MAAM,MAAM,cAAc,UAAU,OAAO,EAAE,IAAI,KAAA;CAC3E,MAAM,WAAW,QAAQ,YAAY,QAAQ,MAAM,QAAQ;CAC3D,OACE,oBAAC,UAAD;EACE,GAAI;EACC;EACL,iBAAe,KAAK,QAAQ,SAAS,IAAI,EAAE,IAAI,KAAA;EAC/C,iBAAe,YAAY,KAAA;EAC3B,WAAW,GAAG,SAAS,CAAC,CAAC,QAAQ,SAAS;EAC1C,aAAU;EACV,UAAU,YAAY,MAAM;EAC5B,UAAU,UAAU;GAClB,MAAM,gBAAgB;GACtB,UAAU,KAAK;GACf,IAAI,CAAC,MAAM,oBAAoB,IAAI,QAAQ,eAAe,EAAE;EAC9D;EACA,UAAU;EACV,MAAK;YAEJ,aAAa,MAAM,QAAQ,SAAS,IAAI,EAAE,IAAI,MAAM;CAC/C,CAAA;AAEZ,CACF;AAGA,MAAa,gBAAgB,WAAgD,SAAS,cACpF,EAAE,WAAW,GAAG,SAChB,KACA;CACA,OACE,oBAAC,QAAD;EACE,GAAI;EACC;EACL,WAAW,GAAG,SAAS,CAAC,CAAC,OAAO,SAAS;EACzC,aAAU;CACX,CAAA;AAEL,CAAC;AAMD,MAAa,kBAAkB,WAC7B,SAAS,gBAAgB,EAAE,WAAW,YAAY,WAAW,GAAG,SAAS,KAAK;CAC5E,OACE,oBAAC,OAAD;EACE,GAAI;EACC;EACL,iBAAc;EACd,aAAU;EACV,cAAY;EACZ,WAAW,GAAG,SAAS,CAAC,CAAC,SAAS,SAAS;EAC3C,aAAU;EACV,MAAK;EACL,UAAU;EAET;CACE,CAAA;AAET,CACF;AAEA,MAAa,gBAAgB,WAA+C,SAAS,cACnF,EAAE,WAAW,mBAAmB,WAAW,GAAG,SAC9C,KACA;CACA,OACE,oBAAC,OAAD;EACE,GAAI;EACC;EACL,iBAAc;EACd,cAAY;EACZ,WAAW,GAAG,SAAS,CAAC,CAAC,OAAO,SAAS;EACzC,aAAU;EACV,MAAK;EACL,UAAU;EAET;CACE,CAAA;AAET,CAAC;AAED,MAAa,gBAAgB,WAA+C,SAAS,cACnF,EAAE,WAAW,yBAAyB,WAAW,GAAG,SACpD,KACA;CACA,OACE,oBAAC,OAAD;EACE,GAAI;EACC;EACL,iBAAc;EACd,aAAU;EACV,cAAY;EACZ,WAAW,GAAG,SAAS,CAAC,CAAC,OAAO,SAAS;EACzC,aAAU;EACV,MAAK;EACL,UAAU;EAET;CACE,CAAA;AAET,CAAC;AAED,MAAa,WAAW;CACtB,MAAM;CACN,MAAM;CACN,OAAO;CACP,QAAQ;CACR,OAAO;CACP,SAAS;CACT,OAAO;CACP,OAAO;AACT"}
|