Skip to content

Commit d3aa9e6

Browse files
committed
Tree folded preview
1 parent 23ce52b commit d3aa9e6

File tree

2 files changed

+49
-25
lines changed

2 files changed

+49
-25
lines changed

src/Tree.css

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
.Tree {
2+
margin-left: 10px;
3+
}
4+
15
.toggable {
26
position: relative;
37
}
@@ -14,15 +18,15 @@
1418
color: pink;
1519
}
1620

17-
.nc {
18-
color: lightblue;
19-
}
20-
21-
.nc:hover {
21+
.toggable:hover {
2222
text-decoration: underline;
2323
cursor: pointer;
2424
}
2525

26+
.nc {
27+
color: lightblue;
28+
}
29+
2630
.nb {
2731
color: orange;
2832
}

src/Tree.tsx

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import './Tree.css';
55

66
const Tree: FC<{ node: Node }> = ({ node }) => {
77
return (
8-
<pre>
8+
<pre className="Tree">
99
<TreeNode node={node} level={0} />
1010
</pre>
1111
);
@@ -16,30 +16,41 @@ export default Tree;
1616
const TreeNode: FC<{ node: Node; level: number }> = ({ node, level }) => {
1717
const [open, setOpen] = useState(false);
1818
const handleClick = useCallback(() => setOpen((open) => !open), []);
19+
if (!open) {
20+
return (
21+
<span onClick={handleClick} className={classNames('toggable', { open })}>
22+
<span className="nc">{SyntaxKind[node.kind]}</span>{' '}
23+
<span className="p">
24+
{'{'}
25+
{Object.keys(node).slice(0, 5).join(', ')}
26+
{')'}
27+
</span>
28+
</span>
29+
);
30+
}
1931
return (
2032
<>
2133
<span onClick={handleClick} className={classNames('toggable', { open })}>
2234
<span className="nc">{SyntaxKind[node.kind]}</span> <span className="p">{'{'}</span>
2335
</span>
24-
{open &&
25-
Object.entries(node).map(([key, value]) => {
26-
if (key === 'parent') {
27-
return null;
28-
}
29-
return (
30-
<div key={key}>
31-
{'\t'.repeat(level + 1)}
32-
<PropertyName name={key} />:{' '}
33-
{isNode(value) ? (
34-
<TreeNode node={value} level={level + 1} />
35-
) : Array.isArray(value) ? (
36-
<TreeNodeArray array={value} level={level + 1} />
37-
) : (
38-
<PrimitiveValue value={value} />
39-
)}
40-
</div>
41-
);
42-
})}
36+
{Object.entries(node).map(([key, value]) => {
37+
if (key === 'parent') {
38+
return null;
39+
}
40+
return (
41+
<div key={key}>
42+
{'\t'.repeat(level + 1)}
43+
<PropertyName name={key} />:{' '}
44+
{isNode(value) ? (
45+
<TreeNode node={value} level={level + 1} />
46+
) : Array.isArray(value) ? (
47+
<TreeNodeArray array={value} level={level + 1} />
48+
) : (
49+
<PrimitiveValue value={value} />
50+
)}
51+
</div>
52+
);
53+
})}
4354
<span>
4455
{open && '\t'.repeat(level)}
4556
<span className="p">{'}'}</span>
@@ -54,6 +65,15 @@ const TreeNodeArray: FC<{ array: unknown[]; level: number }> = ({ array, level }
5465
if (!array.length) {
5566
return <span className="p">[]</span>;
5667
}
68+
if (!open) {
69+
return (
70+
<span onClick={handleClick} className={classNames('toggable', { open })}>
71+
<span className="p">
72+
[ {array.length} {array.length > 1 ? 'elements' : 'element'} ]
73+
</span>
74+
</span>
75+
);
76+
}
5777
return (
5878
<>
5979
<span onClick={handleClick} className={classNames('toggable', { open })}>

0 commit comments

Comments
 (0)