-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Expand file tree
/
Copy pathTree.tsx
More file actions
83 lines (76 loc) · 2.17 KB
/
Tree.tsx
File metadata and controls
83 lines (76 loc) · 2.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
'use client';
import {
Button,
Tree as AriaTree,
TreeItem as AriaTreeItem,
TreeItemContent as AriaTreeItemContent,
TreeItemContentProps,
TreeItemContentRenderProps,
TreeItemProps as AriaTreeItemProps,
TreeProps,
TreeLoadMoreItem as AriaTreeLoadMoreItem,
TreeLoadMoreItemProps,
TreeSection as AriaTreeSection,
TreeHeader as AriaTreeHeader
} from 'react-aria-components';
import {ChevronRight, GripVertical} from 'lucide-react';
import {Checkbox} from './Checkbox';
import {ProgressCircle} from './ProgressCircle';
import './Tree.css';
export function Tree<T extends object>(props: TreeProps<T>) {
return <AriaTree {...props} />;
}
export function TreeItemContent(
props: Omit<TreeItemContentProps, 'children'> & { children?: React.ReactNode }
) {
return (
<AriaTreeItemContent>
{(
{ selectionBehavior, selectionMode, allowsDragging }:
TreeItemContentRenderProps
) => (
<>
{allowsDragging && <Button slot="drag"><GripVertical size={16} /></Button>}
{selectionBehavior === 'toggle' && selectionMode !== 'none' && (
<Checkbox slot="selection" />
)}
<Button slot="chevron">
<ChevronRight />
</Button>
{props.children}
</>
)}
</AriaTreeItemContent>
);
}
export interface TreeItemProps extends Partial<AriaTreeItemProps> {
title: React.ReactNode;
}
export function TreeItem(props: TreeItemProps) {
let textValue = typeof props.title === 'string' ? props.title : '';
return (
<AriaTreeItem textValue={textValue} {...props}>
<TreeItemContent>
{props.title}
</TreeItemContent>
{props.children}
</AriaTreeItem>
);
}
export function TreeLoadMoreItem(props: TreeLoadMoreItemProps) {
return (
<AriaTreeLoadMoreItem {...props}>
<ProgressCircle isIndeterminate aria-label="Loading more..." />
</AriaTreeLoadMoreItem>
);
}
export function TreeSection<T extends object>(
props: React.ComponentProps<typeof AriaTreeSection>
) {
return <AriaTreeSection {...props} />;
}
export function TreeHeader(
props: React.ComponentProps<typeof AriaTreeHeader>
) {
return <AriaTreeHeader {...props} />;
}