Skip to content

Commit e7975ea

Browse files
committed
feat: add Always Expanded guide with tree component implementation
1 parent d925607 commit e7975ea

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import type { Meta } from "@storybook/react";
2+
import React, { useState } from "react";
3+
import {
4+
hotkeysCoreFeature,
5+
selectionFeature,
6+
syncDataLoaderFeature,
7+
} from "@headless-tree/core";
8+
import { useTree } from "@headless-tree/react";
9+
import cn from "classnames";
10+
import { DemoItem, createDemoData } from "../utils/data";
11+
12+
const meta = {
13+
title: "React/Guides/Always Expanded",
14+
} satisfies Meta;
15+
16+
export default meta;
17+
18+
// story-start
19+
const { data, syncDataLoader } = createDemoData();
20+
21+
export const AlwaysExpanded = () => {
22+
const [expandedItems] = useState<string[]>(() => Object.keys(data));
23+
const tree = useTree<DemoItem>({
24+
state: { expandedItems },
25+
setExpandedItems: () => {},
26+
rootItemId: "root",
27+
getItemName: (item) => item.getItemData().name,
28+
isItemFolder: (item) => !!item.getItemData().children,
29+
dataLoader: syncDataLoader,
30+
indent: 20,
31+
features: [syncDataLoaderFeature, selectionFeature, hotkeysCoreFeature],
32+
});
33+
34+
return (
35+
<div {...tree.getContainerProps()} className="tree">
36+
{tree.getItems().map((item) => (
37+
<button
38+
{...item.getProps()}
39+
key={item.getId()}
40+
style={{ paddingLeft: `${item.getItemMeta().level * 20}px` }}
41+
>
42+
<div
43+
className={cn("treeitem", {
44+
focused: item.isFocused(),
45+
expanded: item.isExpanded(),
46+
selected: item.isSelected(),
47+
folder: item.isFolder(),
48+
})}
49+
>
50+
{item.getItemName()}
51+
</div>
52+
</button>
53+
))}
54+
</div>
55+
);
56+
};

0 commit comments

Comments
 (0)