@dxos/react-ui-list 0.8.4-main.f5c0578 → 0.8.4-main.fcfe5033a5
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/dist/lib/browser/index.mjs +684 -706
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +684 -706
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/components/Accordion/Accordion.stories.d.ts +7 -4
- package/dist/types/src/components/Accordion/Accordion.stories.d.ts.map +1 -1
- package/dist/types/src/components/Accordion/AccordionItem.d.ts +1 -1
- package/dist/types/src/components/Accordion/AccordionItem.d.ts.map +1 -1
- package/dist/types/src/components/List/List.d.ts +8 -6
- package/dist/types/src/components/List/List.d.ts.map +1 -1
- package/dist/types/src/components/List/List.stories.d.ts +14 -5
- package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
- package/dist/types/src/components/List/ListItem.d.ts +8 -6
- package/dist/types/src/components/List/ListItem.d.ts.map +1 -1
- package/dist/types/src/components/List/ListRoot.d.ts +2 -2
- package/dist/types/src/components/List/ListRoot.d.ts.map +1 -1
- package/dist/types/src/components/List/testing.d.ts +1 -1
- package/dist/types/src/components/List/testing.d.ts.map +1 -1
- package/dist/types/src/components/Tree/Tree.d.ts +10 -6
- package/dist/types/src/components/Tree/Tree.d.ts.map +1 -1
- package/dist/types/src/components/Tree/Tree.stories.d.ts +18 -7
- package/dist/types/src/components/Tree/Tree.stories.d.ts.map +1 -1
- package/dist/types/src/components/Tree/TreeContext.d.ts +24 -10
- package/dist/types/src/components/Tree/TreeContext.d.ts.map +1 -1
- package/dist/types/src/components/Tree/TreeItem.d.ts +25 -4
- package/dist/types/src/components/Tree/TreeItem.d.ts.map +1 -1
- package/dist/types/src/components/Tree/TreeItemHeading.d.ts +4 -3
- package/dist/types/src/components/Tree/TreeItemHeading.d.ts.map +1 -1
- package/dist/types/src/components/Tree/TreeItemToggle.d.ts +3 -3
- package/dist/types/src/components/Tree/TreeItemToggle.d.ts.map +1 -1
- package/dist/types/src/components/Tree/index.d.ts +2 -0
- package/dist/types/src/components/Tree/index.d.ts.map +1 -1
- package/dist/types/src/components/Tree/testing.d.ts +3 -3
- package/dist/types/src/components/Tree/testing.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +31 -28
- package/src/components/Accordion/Accordion.stories.tsx +7 -9
- package/src/components/Accordion/AccordionItem.tsx +6 -5
- package/src/components/Accordion/AccordionRoot.tsx +1 -1
- package/src/components/List/List.stories.tsx +44 -30
- package/src/components/List/List.tsx +4 -9
- package/src/components/List/ListItem.tsx +58 -43
- package/src/components/List/ListRoot.tsx +3 -3
- package/src/components/List/testing.ts +7 -7
- package/src/components/Tree/Tree.stories.tsx +179 -88
- package/src/components/Tree/Tree.tsx +43 -40
- package/src/components/Tree/TreeContext.tsx +21 -9
- package/src/components/Tree/TreeItem.tsx +214 -127
- package/src/components/Tree/TreeItemHeading.tsx +10 -8
- package/src/components/Tree/TreeItemToggle.tsx +29 -18
- package/src/components/Tree/index.ts +2 -0
- package/src/components/Tree/testing.ts +10 -9
|
@@ -1,85 +1,63 @@
|
|
|
1
1
|
// src/components/Accordion/AccordionItem.tsx
|
|
2
|
-
import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
|
|
3
2
|
import * as AccordionPrimitive2 from "@radix-ui/react-accordion";
|
|
4
3
|
import { createContext as createContext2 } from "@radix-ui/react-context";
|
|
5
4
|
import React2 from "react";
|
|
6
5
|
import { Icon } from "@dxos/react-ui";
|
|
7
|
-
import { mx as mx2 } from "@dxos/
|
|
6
|
+
import { mx as mx2 } from "@dxos/ui-theme";
|
|
8
7
|
|
|
9
8
|
// src/components/Accordion/AccordionRoot.tsx
|
|
10
|
-
import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
|
|
11
9
|
import * as AccordionPrimitive from "@radix-ui/react-accordion";
|
|
12
10
|
import { createContext } from "@radix-ui/react-context";
|
|
13
11
|
import React from "react";
|
|
14
|
-
import { mx } from "@dxos/
|
|
12
|
+
import { mx } from "@dxos/ui-theme";
|
|
15
13
|
var ACCORDION_NAME = "Accordion";
|
|
16
14
|
var [AccordionProvider, useAccordionContext] = createContext(ACCORDION_NAME);
|
|
17
15
|
var defaultGetId = (item) => item?.id;
|
|
18
16
|
var AccordionRoot = ({ classNames, items, getId = defaultGetId, children, value, defaultValue, onValueChange }) => {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
items: items ?? []
|
|
31
|
-
})));
|
|
32
|
-
} finally {
|
|
33
|
-
_effect.f();
|
|
34
|
-
}
|
|
17
|
+
return /* @__PURE__ */ React.createElement(AccordionProvider, {
|
|
18
|
+
getId
|
|
19
|
+
}, /* @__PURE__ */ React.createElement(AccordionPrimitive.Root, {
|
|
20
|
+
type: "multiple",
|
|
21
|
+
value,
|
|
22
|
+
defaultValue,
|
|
23
|
+
onValueChange,
|
|
24
|
+
className: mx(classNames)
|
|
25
|
+
}, children?.({
|
|
26
|
+
items: items ?? []
|
|
27
|
+
})));
|
|
35
28
|
};
|
|
36
29
|
|
|
37
30
|
// src/components/Accordion/AccordionItem.tsx
|
|
38
31
|
var ACCORDION_ITEM_NAME = "AccordionItem";
|
|
39
|
-
var [AccordionItemProvider,
|
|
32
|
+
var [AccordionItemProvider, useDxAccordionItemContext] = createContext2(ACCORDION_ITEM_NAME);
|
|
40
33
|
var AccordionItem = ({ children, classNames, item }) => {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
className: mx2("overflow-hidden", classNames)
|
|
49
|
-
}, children));
|
|
50
|
-
} finally {
|
|
51
|
-
_effect.f();
|
|
52
|
-
}
|
|
34
|
+
const { getId } = useAccordionContext(ACCORDION_ITEM_NAME);
|
|
35
|
+
return /* @__PURE__ */ React2.createElement(AccordionItemProvider, {
|
|
36
|
+
item
|
|
37
|
+
}, /* @__PURE__ */ React2.createElement(AccordionPrimitive2.Item, {
|
|
38
|
+
value: getId(item),
|
|
39
|
+
className: mx2("overflow-hidden", classNames)
|
|
40
|
+
}, children));
|
|
53
41
|
};
|
|
54
42
|
var AccordionItemHeader = ({ classNames, children, ...props }) => {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
classNames: "transition-transform duration-200 group-data-[state=open]:rotate-90"
|
|
66
|
-
})));
|
|
67
|
-
} finally {
|
|
68
|
-
_effect.f();
|
|
69
|
-
}
|
|
43
|
+
return /* @__PURE__ */ React2.createElement(AccordionPrimitive2.Header, {
|
|
44
|
+
...props,
|
|
45
|
+
className: mx2(classNames)
|
|
46
|
+
}, /* @__PURE__ */ React2.createElement(AccordionPrimitive2.Trigger, {
|
|
47
|
+
className: "group flex items-center p-2 dx-focus-ring-inset w-full text-start"
|
|
48
|
+
}, children, /* @__PURE__ */ React2.createElement(Icon, {
|
|
49
|
+
icon: "ph--caret-right--regular",
|
|
50
|
+
size: 4,
|
|
51
|
+
classNames: "transition-transform duration-200 group-data-[state=open]:rotate-90"
|
|
52
|
+
})));
|
|
70
53
|
};
|
|
71
54
|
var AccordionItemBody = ({ children, classNames }) => {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
className: mx2("p-2", classNames)
|
|
79
|
-
}, children));
|
|
80
|
-
} finally {
|
|
81
|
-
_effect.f();
|
|
82
|
-
}
|
|
55
|
+
return /* @__PURE__ */ React2.createElement(AccordionPrimitive2.Content, {
|
|
56
|
+
className: "overflow-hidden data-[state=closed]:animate-slide-up data-[state=open]:animate-slide-down"
|
|
57
|
+
}, /* @__PURE__ */ React2.createElement("div", {
|
|
58
|
+
role: "none",
|
|
59
|
+
className: mx2("p-2", classNames)
|
|
60
|
+
}, children));
|
|
83
61
|
};
|
|
84
62
|
|
|
85
63
|
// src/components/Accordion/Accordion.tsx
|
|
@@ -91,91 +69,85 @@ var Accordion = {
|
|
|
91
69
|
};
|
|
92
70
|
|
|
93
71
|
// src/components/List/ListItem.tsx
|
|
94
|
-
import {
|
|
72
|
+
import { attachClosestEdge, extractClosestEdge as extractClosestEdge2 } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge";
|
|
95
73
|
import { combine } from "@atlaskit/pragmatic-drag-and-drop/combine";
|
|
96
74
|
import { draggable, dropTargetForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
|
|
97
75
|
import { setCustomNativeDragPreview } from "@atlaskit/pragmatic-drag-and-drop/element/set-custom-native-drag-preview";
|
|
98
|
-
import { attachClosestEdge, extractClosestEdge as extractClosestEdge2 } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge";
|
|
99
76
|
import { createContext as createContext4 } from "@radix-ui/react-context";
|
|
77
|
+
import { Slot } from "@radix-ui/react-slot";
|
|
100
78
|
import React4, { useEffect as useEffect2, useRef, useState as useState2 } from "react";
|
|
101
79
|
import { createPortal } from "react-dom";
|
|
102
80
|
import { invariant } from "@dxos/invariant";
|
|
103
81
|
import { IconButton, ListItem as NaturalListItem, useTranslation } from "@dxos/react-ui";
|
|
104
|
-
import { mx as mx3 } from "@dxos/
|
|
82
|
+
import { mx as mx3, osTranslations } from "@dxos/ui-theme";
|
|
105
83
|
|
|
106
84
|
// src/components/List/ListRoot.tsx
|
|
107
|
-
import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
|
|
108
|
-
import { monitorForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
|
|
109
85
|
import { extractClosestEdge } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge";
|
|
110
86
|
import { getReorderDestinationIndex } from "@atlaskit/pragmatic-drag-and-drop-hitbox/util/get-reorder-destination-index";
|
|
87
|
+
import { monitorForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
|
|
111
88
|
import { createContext as createContext3 } from "@radix-ui/react-context";
|
|
112
89
|
import React3, { useCallback, useEffect, useState } from "react";
|
|
113
90
|
var LIST_NAME = "List";
|
|
114
91
|
var [ListProvider, useListContext] = createContext3(LIST_NAME);
|
|
115
92
|
var defaultGetId2 = (item) => item?.id;
|
|
116
93
|
var ListRoot = ({ children, items, isItem, getId = defaultGetId2, onMove, ...props }) => {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
if (!target) {
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
const sourceData = source.data;
|
|
143
|
-
const targetData = target.data;
|
|
144
|
-
if (!isItem?.(sourceData) || !isItem?.(targetData)) {
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
const sourceIdx = items.findIndex((item) => isEqual(item, sourceData));
|
|
148
|
-
const targetIdx = items.findIndex((item) => isEqual(item, targetData));
|
|
149
|
-
if (targetIdx < 0 || sourceIdx < 0) {
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
const closestEdgeOfTarget = extractClosestEdge(targetData);
|
|
153
|
-
const destinationIndex = getReorderDestinationIndex({
|
|
154
|
-
closestEdgeOfTarget,
|
|
155
|
-
startIndex: sourceIdx,
|
|
156
|
-
indexOfTarget: targetIdx,
|
|
157
|
-
axis: "vertical"
|
|
158
|
-
});
|
|
159
|
-
onMove?.(sourceIdx, destinationIndex);
|
|
94
|
+
const isEqual = useCallback((a, b) => {
|
|
95
|
+
const idA = getId?.(a);
|
|
96
|
+
const idB = getId?.(b);
|
|
97
|
+
if (idA !== void 0 && idB !== void 0) {
|
|
98
|
+
return idA === idB;
|
|
99
|
+
} else {
|
|
100
|
+
return a === b;
|
|
101
|
+
}
|
|
102
|
+
}, [
|
|
103
|
+
getId
|
|
104
|
+
]);
|
|
105
|
+
const [state, setState] = useState(idle);
|
|
106
|
+
useEffect(() => {
|
|
107
|
+
if (!items) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
return monitorForElements({
|
|
111
|
+
canMonitor: ({ source }) => isItem?.(source.data) ?? false,
|
|
112
|
+
onDrop: ({ location, source }) => {
|
|
113
|
+
const target = location.current.dropTargets[0];
|
|
114
|
+
if (!target) {
|
|
115
|
+
return;
|
|
160
116
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
117
|
+
const sourceData = source.data;
|
|
118
|
+
const targetData = target.data;
|
|
119
|
+
if (!isItem?.(sourceData) || !isItem?.(targetData)) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const sourceIdx = items.findIndex((item) => isEqual(item, sourceData));
|
|
123
|
+
const targetIdx = items.findIndex((item) => isEqual(item, targetData));
|
|
124
|
+
if (targetIdx < 0 || sourceIdx < 0) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const closestEdgeOfTarget = extractClosestEdge(targetData);
|
|
128
|
+
const destinationIndex = getReorderDestinationIndex({
|
|
129
|
+
closestEdgeOfTarget,
|
|
130
|
+
startIndex: sourceIdx,
|
|
131
|
+
indexOfTarget: targetIdx,
|
|
132
|
+
axis: "vertical"
|
|
133
|
+
});
|
|
134
|
+
onMove?.(sourceIdx, destinationIndex);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}, [
|
|
138
|
+
items,
|
|
139
|
+
isEqual,
|
|
140
|
+
onMove
|
|
141
|
+
]);
|
|
142
|
+
return /* @__PURE__ */ React3.createElement(ListProvider, {
|
|
143
|
+
state,
|
|
144
|
+
setState,
|
|
145
|
+
isItem,
|
|
146
|
+
...props
|
|
147
|
+
}, children?.({
|
|
148
|
+
state,
|
|
149
|
+
items: items ?? []
|
|
150
|
+
}));
|
|
179
151
|
};
|
|
180
152
|
|
|
181
153
|
// src/components/List/ListItem.tsx
|
|
@@ -189,195 +161,177 @@ var stateStyles = {
|
|
|
189
161
|
var defaultContext = {};
|
|
190
162
|
var LIST_ITEM_NAME = "ListItem";
|
|
191
163
|
var [ListItemProvider, useListItemContext] = createContext4(LIST_ITEM_NAME, defaultContext);
|
|
192
|
-
var ListItem = ({ children, classNames, item, ...props }) => {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
const { height } = container.getBoundingClientRect();
|
|
225
|
-
return {
|
|
226
|
-
x: 20,
|
|
227
|
-
y: height / 2
|
|
228
|
-
};
|
|
229
|
-
},
|
|
230
|
-
render: ({ container }) => {
|
|
231
|
-
container.style.width = rect.width + "px";
|
|
232
|
-
setState({
|
|
233
|
-
type: "preview",
|
|
234
|
-
container
|
|
235
|
-
});
|
|
236
|
-
setRootState({
|
|
237
|
-
type: "preview",
|
|
238
|
-
container,
|
|
239
|
-
item
|
|
240
|
-
});
|
|
241
|
-
return () => {
|
|
242
|
-
};
|
|
243
|
-
}
|
|
244
|
-
});
|
|
245
|
-
} : void 0,
|
|
246
|
-
onDragStart: () => {
|
|
247
|
-
setState({
|
|
248
|
-
type: "is-dragging"
|
|
249
|
-
});
|
|
250
|
-
setRootState({
|
|
251
|
-
type: "is-dragging",
|
|
252
|
-
item
|
|
253
|
-
});
|
|
254
|
-
},
|
|
255
|
-
onDrop: () => {
|
|
256
|
-
setState(idle);
|
|
257
|
-
setRootState(idle);
|
|
258
|
-
}
|
|
259
|
-
}),
|
|
260
|
-
//
|
|
261
|
-
// https://atlassian.design/components/pragmatic-drag-and-drop/core-package/adapters/element/about#drop-target-for-elements
|
|
262
|
-
//
|
|
263
|
-
dropTargetForElements({
|
|
264
|
-
element,
|
|
265
|
-
canDrop: ({ source }) => {
|
|
266
|
-
return (source.element !== element && isItem?.(source.data)) ?? false;
|
|
267
|
-
},
|
|
268
|
-
getData: ({ input }) => {
|
|
269
|
-
return attachClosestEdge(item, {
|
|
270
|
-
element,
|
|
271
|
-
input,
|
|
272
|
-
allowedEdges: [
|
|
273
|
-
"top",
|
|
274
|
-
"bottom"
|
|
275
|
-
]
|
|
276
|
-
});
|
|
277
|
-
},
|
|
278
|
-
getIsSticky: () => true,
|
|
279
|
-
onDragEnter: ({ self }) => {
|
|
280
|
-
const closestEdge = extractClosestEdge2(self.data);
|
|
281
|
-
setState({
|
|
282
|
-
type: "is-dragging-over",
|
|
283
|
-
closestEdge
|
|
284
|
-
});
|
|
285
|
-
},
|
|
286
|
-
onDragLeave: () => {
|
|
287
|
-
setState(idle);
|
|
288
|
-
},
|
|
289
|
-
onDrag: ({ self }) => {
|
|
290
|
-
const closestEdge = extractClosestEdge2(self.data);
|
|
291
|
-
setState((current) => {
|
|
292
|
-
if (current.type === "is-dragging-over" && current.closestEdge === closestEdge) {
|
|
293
|
-
return current;
|
|
294
|
-
}
|
|
164
|
+
var ListItem = ({ children, classNames, item, asChild, selected, ...props }) => {
|
|
165
|
+
const Comp = asChild ? Slot : "div";
|
|
166
|
+
const { isItem, readonly, dragPreview, setState: setRootState } = useListContext(LIST_ITEM_NAME);
|
|
167
|
+
const rootRef = useRef(null);
|
|
168
|
+
const dragHandleRef = useRef(null);
|
|
169
|
+
const [state, setState] = useState2(idle);
|
|
170
|
+
useEffect2(() => {
|
|
171
|
+
const element = rootRef.current;
|
|
172
|
+
invariant(element, void 0, {
|
|
173
|
+
F: __dxlog_file,
|
|
174
|
+
L: 109,
|
|
175
|
+
S: void 0,
|
|
176
|
+
A: [
|
|
177
|
+
"element",
|
|
178
|
+
""
|
|
179
|
+
]
|
|
180
|
+
});
|
|
181
|
+
return combine(
|
|
182
|
+
//
|
|
183
|
+
// https://atlassian.design/components/pragmatic-drag-and-drop/core-package/adapters/element/about#draggable
|
|
184
|
+
//
|
|
185
|
+
draggable({
|
|
186
|
+
element,
|
|
187
|
+
dragHandle: dragHandleRef.current,
|
|
188
|
+
canDrag: () => !readonly,
|
|
189
|
+
getInitialData: () => item,
|
|
190
|
+
onGenerateDragPreview: dragPreview ? ({ nativeSetDragImage, source }) => {
|
|
191
|
+
const rect = source.element.getBoundingClientRect();
|
|
192
|
+
setCustomNativeDragPreview({
|
|
193
|
+
nativeSetDragImage,
|
|
194
|
+
getOffset: ({ container }) => {
|
|
195
|
+
const { height } = container.getBoundingClientRect();
|
|
295
196
|
return {
|
|
296
|
-
|
|
297
|
-
|
|
197
|
+
x: 20,
|
|
198
|
+
y: height / 2
|
|
298
199
|
};
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
200
|
+
},
|
|
201
|
+
render: ({ container }) => {
|
|
202
|
+
container.style.width = rect.width + "px";
|
|
203
|
+
setState({
|
|
204
|
+
type: "preview",
|
|
205
|
+
container
|
|
206
|
+
});
|
|
207
|
+
setRootState({
|
|
208
|
+
type: "preview",
|
|
209
|
+
container,
|
|
210
|
+
item
|
|
211
|
+
});
|
|
212
|
+
return () => {
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
} : void 0,
|
|
217
|
+
onDragStart: () => {
|
|
218
|
+
setState({
|
|
219
|
+
type: "is-dragging"
|
|
220
|
+
});
|
|
221
|
+
setRootState({
|
|
222
|
+
type: "is-dragging",
|
|
223
|
+
item
|
|
224
|
+
});
|
|
225
|
+
},
|
|
226
|
+
onDrop: () => {
|
|
227
|
+
setState(idle);
|
|
228
|
+
setRootState(idle);
|
|
229
|
+
}
|
|
230
|
+
}),
|
|
231
|
+
//
|
|
232
|
+
// https://atlassian.design/components/pragmatic-drag-and-drop/core-package/adapters/element/about#drop-target-for-elements
|
|
233
|
+
//
|
|
234
|
+
dropTargetForElements({
|
|
235
|
+
element,
|
|
236
|
+
canDrop: ({ source }) => {
|
|
237
|
+
return (source.element !== element && isItem?.(source.data)) ?? false;
|
|
238
|
+
},
|
|
239
|
+
getData: ({ input }) => {
|
|
240
|
+
return attachClosestEdge(item, {
|
|
241
|
+
element,
|
|
242
|
+
input,
|
|
243
|
+
allowedEdges: [
|
|
244
|
+
"top",
|
|
245
|
+
"bottom"
|
|
246
|
+
]
|
|
247
|
+
});
|
|
248
|
+
},
|
|
249
|
+
getIsSticky: () => true,
|
|
250
|
+
onDragEnter: ({ self }) => {
|
|
251
|
+
const closestEdge = extractClosestEdge2(self.data);
|
|
252
|
+
setState({
|
|
253
|
+
type: "is-dragging-over",
|
|
254
|
+
closestEdge
|
|
255
|
+
});
|
|
256
|
+
},
|
|
257
|
+
onDragLeave: () => {
|
|
258
|
+
setState(idle);
|
|
259
|
+
},
|
|
260
|
+
onDrag: ({ self }) => {
|
|
261
|
+
const closestEdge = extractClosestEdge2(self.data);
|
|
262
|
+
setState((current) => {
|
|
263
|
+
if (current.type === "is-dragging-over" && current.closestEdge === closestEdge) {
|
|
264
|
+
return current;
|
|
265
|
+
}
|
|
266
|
+
return {
|
|
267
|
+
type: "is-dragging-over",
|
|
268
|
+
closestEdge
|
|
269
|
+
};
|
|
270
|
+
});
|
|
271
|
+
},
|
|
272
|
+
onDrop: () => {
|
|
273
|
+
setState(idle);
|
|
274
|
+
}
|
|
275
|
+
})
|
|
276
|
+
);
|
|
277
|
+
}, [
|
|
278
|
+
item
|
|
279
|
+
]);
|
|
280
|
+
return /* @__PURE__ */ React4.createElement(ListItemProvider, {
|
|
281
|
+
item,
|
|
282
|
+
dragHandleRef
|
|
283
|
+
}, /* @__PURE__ */ React4.createElement(Comp, {
|
|
284
|
+
...props,
|
|
285
|
+
role: "listitem",
|
|
286
|
+
"aria-selected": selected,
|
|
287
|
+
className: mx3("relative p-1 dx-selected dx-hover", classNames, stateStyles[state.type]),
|
|
288
|
+
ref: rootRef
|
|
289
|
+
}, children), state.type === "is-dragging-over" && state.closestEdge && /* @__PURE__ */ React4.createElement(NaturalListItem.DropIndicator, {
|
|
290
|
+
edge: state.closestEdge
|
|
291
|
+
}));
|
|
323
292
|
};
|
|
324
|
-
var
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
classNames: [
|
|
338
|
-
classNames,
|
|
339
|
-
autoHide && disabled && "hidden"
|
|
340
|
-
]
|
|
341
|
-
});
|
|
342
|
-
} finally {
|
|
343
|
-
_effect.f();
|
|
344
|
-
}
|
|
293
|
+
var ListItemIconButton = ({ autoHide = true, iconOnly = true, variant = "ghost", classNames, disabled, ...props }) => {
|
|
294
|
+
const { state } = useListContext("ITEM_BUTTON");
|
|
295
|
+
const isDisabled = state.type !== "idle" || disabled;
|
|
296
|
+
return /* @__PURE__ */ React4.createElement(IconButton, {
|
|
297
|
+
...props,
|
|
298
|
+
disabled: isDisabled,
|
|
299
|
+
iconOnly,
|
|
300
|
+
variant,
|
|
301
|
+
classNames: [
|
|
302
|
+
classNames,
|
|
303
|
+
autoHide && disabled && "hidden"
|
|
304
|
+
]
|
|
305
|
+
});
|
|
345
306
|
};
|
|
346
|
-
var
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
}
|
|
362
|
-
_effect.f();
|
|
363
|
-
}
|
|
307
|
+
var ListItemDeleteButton = ({ autoHide = true, classNames, disabled, icon = "ph--x--regular", label, ...props }) => {
|
|
308
|
+
const { state } = useListContext("DELETE_BUTTON");
|
|
309
|
+
const isDisabled = state.type !== "idle" || disabled;
|
|
310
|
+
const { t } = useTranslation(osTranslations);
|
|
311
|
+
return /* @__PURE__ */ React4.createElement(IconButton, {
|
|
312
|
+
...props,
|
|
313
|
+
variant: "ghost",
|
|
314
|
+
disabled: isDisabled,
|
|
315
|
+
icon,
|
|
316
|
+
iconOnly: true,
|
|
317
|
+
label: label ?? t("delete.label"),
|
|
318
|
+
classNames: [
|
|
319
|
+
classNames,
|
|
320
|
+
autoHide && disabled && "hidden"
|
|
321
|
+
]
|
|
322
|
+
});
|
|
364
323
|
};
|
|
365
324
|
var ListItemDragHandle = ({ disabled }) => {
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
disabled
|
|
377
|
-
});
|
|
378
|
-
} finally {
|
|
379
|
-
_effect.f();
|
|
380
|
-
}
|
|
325
|
+
const { dragHandleRef } = useListItemContext("DRAG_HANDLE");
|
|
326
|
+
const { t } = useTranslation(osTranslations);
|
|
327
|
+
return /* @__PURE__ */ React4.createElement(IconButton, {
|
|
328
|
+
variant: "ghost",
|
|
329
|
+
disabled,
|
|
330
|
+
icon: "ph--dots-six-vertical--regular",
|
|
331
|
+
iconOnly: true,
|
|
332
|
+
label: t("drag-handle.label"),
|
|
333
|
+
ref: dragHandleRef
|
|
334
|
+
});
|
|
381
335
|
};
|
|
382
336
|
var ListItemDragPreview = ({ children }) => {
|
|
383
337
|
const { state } = useListContext("DRAG_PREVIEW");
|
|
@@ -385,27 +339,15 @@ var ListItemDragPreview = ({ children }) => {
|
|
|
385
339
|
item: state.item
|
|
386
340
|
}), state.container) : null;
|
|
387
341
|
};
|
|
388
|
-
var ListItemWrapper = ({ classNames, children }) => {
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
};
|
|
398
|
-
var ListItemTitle = ({ classNames, children, ...props }) => {
|
|
399
|
-
var _effect = _useSignals4();
|
|
400
|
-
try {
|
|
401
|
-
return /* @__PURE__ */ React4.createElement("div", {
|
|
402
|
-
className: mx3("flex grow items-center truncate", classNames),
|
|
403
|
-
...props
|
|
404
|
-
}, children);
|
|
405
|
-
} finally {
|
|
406
|
-
_effect.f();
|
|
407
|
-
}
|
|
408
|
-
};
|
|
342
|
+
var ListItemWrapper = ({ classNames, children }) => /* @__PURE__ */ React4.createElement("div", {
|
|
343
|
+
role: "none",
|
|
344
|
+
className: mx3("flex w-full gap-2", classNames)
|
|
345
|
+
}, children);
|
|
346
|
+
var ListItemTitle = ({ classNames, children, ...props }) => /* @__PURE__ */ React4.createElement("div", {
|
|
347
|
+
role: "none",
|
|
348
|
+
className: mx3("flex grow items-center truncate", classNames),
|
|
349
|
+
...props
|
|
350
|
+
}, children);
|
|
409
351
|
|
|
410
352
|
// src/components/List/List.tsx
|
|
411
353
|
var List = {
|
|
@@ -414,13 +356,13 @@ var List = {
|
|
|
414
356
|
ItemDragPreview: ListItemDragPreview,
|
|
415
357
|
ItemWrapper: ListItemWrapper,
|
|
416
358
|
ItemDragHandle: ListItemDragHandle,
|
|
359
|
+
ItemIconButton: ListItemIconButton,
|
|
417
360
|
ItemDeleteButton: ListItemDeleteButton,
|
|
418
|
-
ItemButton: ListItemButton,
|
|
419
361
|
ItemTitle: ListItemTitle
|
|
420
362
|
};
|
|
421
363
|
|
|
422
364
|
// src/components/Tree/Tree.tsx
|
|
423
|
-
import {
|
|
365
|
+
import { useAtomValue as useAtomValue2 } from "@effect-atom/atom-react";
|
|
424
366
|
import React8, { useMemo as useMemo2 } from "react";
|
|
425
367
|
import { Treegrid as Treegrid2 } from "@dxos/react-ui";
|
|
426
368
|
|
|
@@ -432,15 +374,15 @@ var TreeProvider = TreeContext.Provider;
|
|
|
432
374
|
var useTree = () => useContext(TreeContext) ?? raise(new Error("TreeContext not found"));
|
|
433
375
|
|
|
434
376
|
// src/components/Tree/TreeItem.tsx
|
|
435
|
-
import {
|
|
377
|
+
import { attachInstruction, extractInstruction } from "@atlaskit/pragmatic-drag-and-drop-hitbox/tree-item";
|
|
436
378
|
import { combine as combine2 } from "@atlaskit/pragmatic-drag-and-drop/combine";
|
|
437
379
|
import { draggable as draggable2, dropTargetForElements as dropTargetForElements2 } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
|
|
438
|
-
import {
|
|
439
|
-
import
|
|
380
|
+
import { useAtomValue } from "@effect-atom/atom-react";
|
|
381
|
+
import * as Schema from "effect/Schema";
|
|
440
382
|
import React7, { memo as memo3, useCallback as useCallback3, useEffect as useEffect3, useMemo, useRef as useRef2, useState as useState3 } from "react";
|
|
441
383
|
import { invariant as invariant2 } from "@dxos/invariant";
|
|
442
|
-
import { TreeItem as NaturalTreeItem, Treegrid } from "@dxos/react-ui";
|
|
443
|
-
import { ghostHover, hoverableControls, hoverableFocusedKeyboardControls, hoverableFocusedWithinControls } from "@dxos/
|
|
384
|
+
import { TreeItem as NaturalTreeItem, Treegrid, TREEGRID_PARENT_OF_SEPARATOR } from "@dxos/react-ui";
|
|
385
|
+
import { ghostFocusWithin, ghostHover, hoverableControls, hoverableFocusedKeyboardControls, hoverableFocusedWithinControls, mx as mx4 } from "@dxos/ui-theme";
|
|
444
386
|
|
|
445
387
|
// src/components/Tree/helpers.ts
|
|
446
388
|
var DEFAULT_INDENTATION = 8;
|
|
@@ -449,92 +391,85 @@ var paddingIndentation = (level, indentation = DEFAULT_INDENTATION) => ({
|
|
|
449
391
|
});
|
|
450
392
|
|
|
451
393
|
// src/components/Tree/TreeItemHeading.tsx
|
|
452
|
-
import { useSignals as _useSignals5 } from "@preact-signals/safe-react/tracking";
|
|
453
394
|
import React5, { forwardRef, memo, useCallback as useCallback2 } from "react";
|
|
454
395
|
import { Button, Icon as Icon2, toLocalizedString, useTranslation as useTranslation2 } from "@dxos/react-ui";
|
|
455
396
|
import { TextTooltip } from "@dxos/react-ui-text-tooltip";
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
397
|
+
import { getStyles } from "@dxos/ui-theme";
|
|
398
|
+
var TreeItemHeading = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef(({ label, className, icon, iconHue, disabled, current, onSelect }, forwardedRef) => {
|
|
399
|
+
const { t } = useTranslation2();
|
|
400
|
+
const styles = iconHue ? getStyles(iconHue) : void 0;
|
|
401
|
+
const handleSelect = useCallback2((event) => {
|
|
402
|
+
onSelect?.(event.altKey);
|
|
403
|
+
}, [
|
|
404
|
+
onSelect
|
|
405
|
+
]);
|
|
406
|
+
const handleButtonKeydown = useCallback2((event) => {
|
|
407
|
+
if (event.key === " " || event.key === "Enter") {
|
|
408
|
+
event.preventDefault();
|
|
409
|
+
event.stopPropagation();
|
|
461
410
|
onSelect?.(event.altKey);
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
icon: icon ?? "ph--placeholder--regular",
|
|
498
|
-
size: 5,
|
|
499
|
-
classNames: "mlb-1"
|
|
500
|
-
}), /* @__PURE__ */ React5.createElement("span", {
|
|
501
|
-
className: "flex-1 is-0 truncate text-start text-sm font-normal",
|
|
502
|
-
"data-tooltip": true
|
|
503
|
-
}, toLocalizedString(label, t))));
|
|
504
|
-
} finally {
|
|
505
|
-
_effect.f();
|
|
506
|
-
}
|
|
411
|
+
}
|
|
412
|
+
}, [
|
|
413
|
+
onSelect
|
|
414
|
+
]);
|
|
415
|
+
return /* @__PURE__ */ React5.createElement(TextTooltip, {
|
|
416
|
+
text: toLocalizedString(label, t),
|
|
417
|
+
side: "bottom",
|
|
418
|
+
truncateQuery: "span[data-tooltip]",
|
|
419
|
+
onlyWhenTruncating: true,
|
|
420
|
+
asChild: true,
|
|
421
|
+
ref: forwardedRef
|
|
422
|
+
}, /* @__PURE__ */ React5.createElement(Button, {
|
|
423
|
+
"data-testid": "treeItem.heading",
|
|
424
|
+
variant: "ghost",
|
|
425
|
+
classNames: [
|
|
426
|
+
"grow gap-2 ps-0.5 hover:bg-transparent dark:hover:bg-transparent",
|
|
427
|
+
"disabled:cursor-default disabled:opacity-100",
|
|
428
|
+
className
|
|
429
|
+
],
|
|
430
|
+
disabled,
|
|
431
|
+
onClick: handleSelect,
|
|
432
|
+
onKeyDown: handleButtonKeydown,
|
|
433
|
+
...current && {
|
|
434
|
+
"aria-current": "location"
|
|
435
|
+
}
|
|
436
|
+
}, icon && /* @__PURE__ */ React5.createElement(Icon2, {
|
|
437
|
+
icon: icon ?? "ph--placeholder--regular",
|
|
438
|
+
classNames: [
|
|
439
|
+
"my-1",
|
|
440
|
+
styles?.surfaceText
|
|
441
|
+
]
|
|
442
|
+
}), /* @__PURE__ */ React5.createElement("span", {
|
|
443
|
+
className: "flex-1 w-0 truncate text-start font-normal",
|
|
444
|
+
"data-tooltip": true
|
|
445
|
+
}, toLocalizedString(label, t))));
|
|
507
446
|
}));
|
|
508
447
|
|
|
509
448
|
// src/components/Tree/TreeItemToggle.tsx
|
|
510
|
-
import { useSignals as _useSignals6 } from "@preact-signals/safe-react/tracking";
|
|
511
449
|
import React6, { forwardRef as forwardRef2, memo as memo2 } from "react";
|
|
512
|
-
import {
|
|
513
|
-
var TreeItemToggle = /* @__PURE__ */ memo2(/* @__PURE__ */ forwardRef2(({ open, isBranch, hidden,
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
} finally {
|
|
536
|
-
_effect.f();
|
|
537
|
-
}
|
|
450
|
+
import { IconButton as IconButton2 } from "@dxos/react-ui";
|
|
451
|
+
var TreeItemToggle = /* @__PURE__ */ memo2(/* @__PURE__ */ forwardRef2(({ classNames, open, isBranch, hidden, ...props }, forwardedRef) => {
|
|
452
|
+
return /* @__PURE__ */ React6.createElement(IconButton2, {
|
|
453
|
+
ref: forwardedRef,
|
|
454
|
+
"data-testid": "treeItem.toggle",
|
|
455
|
+
"aria-expanded": open,
|
|
456
|
+
variant: "ghost",
|
|
457
|
+
density: "fine",
|
|
458
|
+
classNames: [
|
|
459
|
+
"h-full w-6 px-0",
|
|
460
|
+
"[&_svg]:transition-transform [&_svg]:duration-200",
|
|
461
|
+
open ? "[&_svg]:rotate-90" : "[&_svg]:rotate-0",
|
|
462
|
+
hidden ? "hidden" : !isBranch && "invisible",
|
|
463
|
+
classNames
|
|
464
|
+
],
|
|
465
|
+
size: 3,
|
|
466
|
+
icon: "ph--caret-right--bold",
|
|
467
|
+
iconOnly: true,
|
|
468
|
+
noTooltip: true,
|
|
469
|
+
label: open ? "Click to close" : "Click to open",
|
|
470
|
+
tabIndex: -1,
|
|
471
|
+
...props
|
|
472
|
+
});
|
|
538
473
|
}));
|
|
539
474
|
|
|
540
475
|
// src/components/Tree/TreeItem.tsx
|
|
@@ -546,312 +481,351 @@ var TreeDataSchema = Schema.Struct({
|
|
|
546
481
|
item: Schema.Any
|
|
547
482
|
});
|
|
548
483
|
var isTreeData = (data) => Schema.is(TreeDataSchema)(data);
|
|
549
|
-
var RawTreeItem = ({ item, path:
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
484
|
+
var RawTreeItem = ({ item, path: pathProp, levelOffset = 2, last, draggable: draggableProp, renderColumns: Columns, blockInstruction, canDrop, canSelect, onOpenChange, onSelect, onItemHover }) => {
|
|
485
|
+
const rowRef = useRef2(null);
|
|
486
|
+
const buttonRef = useRef2(null);
|
|
487
|
+
const openRef = useRef2(false);
|
|
488
|
+
const cancelExpandRef = useRef2(null);
|
|
489
|
+
const [_state, setState] = useState3("idle");
|
|
490
|
+
const [instruction, setInstruction] = useState3(null);
|
|
491
|
+
const [menuOpen, setMenuOpen] = useState3(false);
|
|
492
|
+
const { itemProps: itemPropsAtom, childIds: childIdsAtom, itemOpen: itemOpenAtom, itemCurrent: itemCurrentAtom } = useTree();
|
|
493
|
+
const path = useMemo(() => [
|
|
494
|
+
...pathProp,
|
|
495
|
+
item.id
|
|
496
|
+
], [
|
|
497
|
+
pathProp,
|
|
498
|
+
item.id
|
|
499
|
+
]);
|
|
500
|
+
const { id, parentOf, draggable: itemDraggable, droppable: itemDroppable, label, className, headingClassName, icon, iconHue, disabled, testId } = useAtomValue(itemPropsAtom(path));
|
|
501
|
+
const childIds = useAtomValue(childIdsAtom(item.id));
|
|
502
|
+
const open = useAtomValue(itemOpenAtom(path));
|
|
503
|
+
const current = useAtomValue(itemCurrentAtom(path));
|
|
504
|
+
const level = path.length - levelOffset;
|
|
505
|
+
const isBranch = !!parentOf;
|
|
506
|
+
const mode = last ? "last-in-group" : open ? "expanded" : "standard";
|
|
507
|
+
const canSelectItem = canSelect?.({
|
|
508
|
+
item,
|
|
509
|
+
path
|
|
510
|
+
}) ?? true;
|
|
511
|
+
const data = {
|
|
512
|
+
id,
|
|
513
|
+
path,
|
|
514
|
+
item
|
|
515
|
+
};
|
|
516
|
+
const shouldSeedNativeDragData = typeof document !== "undefined" && document.body.hasAttribute("data-platform");
|
|
517
|
+
const cancelExpand = useCallback3(() => {
|
|
518
|
+
if (cancelExpandRef.current) {
|
|
519
|
+
clearTimeout(cancelExpandRef.current);
|
|
520
|
+
cancelExpandRef.current = null;
|
|
521
|
+
}
|
|
522
|
+
}, []);
|
|
523
|
+
const isItemDraggable = draggableProp && itemDraggable !== false;
|
|
524
|
+
const isItemDroppable = itemDroppable !== false;
|
|
525
|
+
const nativeDragText = id;
|
|
526
|
+
useEffect3(() => {
|
|
527
|
+
if (!draggableProp) {
|
|
528
|
+
return;
|
|
529
|
+
}
|
|
530
|
+
invariant2(buttonRef.current, void 0, {
|
|
531
|
+
F: __dxlog_file2,
|
|
532
|
+
L: 150,
|
|
533
|
+
S: void 0,
|
|
534
|
+
A: [
|
|
535
|
+
"buttonRef.current",
|
|
536
|
+
""
|
|
537
|
+
]
|
|
538
|
+
});
|
|
539
|
+
const makeDraggable = () => draggable2({
|
|
540
|
+
element: buttonRef.current,
|
|
541
|
+
getInitialData: () => data,
|
|
542
|
+
getInitialDataForExternal: () => {
|
|
543
|
+
if (!shouldSeedNativeDragData) {
|
|
544
|
+
return {};
|
|
545
|
+
}
|
|
546
|
+
return {
|
|
547
|
+
"text/plain": nativeDragText
|
|
548
|
+
};
|
|
549
|
+
},
|
|
550
|
+
onDragStart: () => {
|
|
551
|
+
setState("dragging");
|
|
552
|
+
if (open) {
|
|
553
|
+
openRef.current = true;
|
|
554
|
+
onOpenChange?.({
|
|
555
|
+
item,
|
|
556
|
+
path,
|
|
557
|
+
open: false
|
|
558
|
+
});
|
|
559
|
+
}
|
|
560
|
+
},
|
|
561
|
+
onDrop: () => {
|
|
562
|
+
setState("idle");
|
|
563
|
+
if (openRef.current) {
|
|
564
|
+
onOpenChange?.({
|
|
565
|
+
item,
|
|
566
|
+
path,
|
|
567
|
+
open: true
|
|
568
|
+
});
|
|
569
|
+
}
|
|
583
570
|
}
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
571
|
+
});
|
|
572
|
+
if (!isItemDroppable) {
|
|
573
|
+
return isItemDraggable ? makeDraggable() : void 0;
|
|
574
|
+
}
|
|
575
|
+
const dropTarget = dropTargetForElements2({
|
|
576
|
+
element: buttonRef.current,
|
|
577
|
+
getData: ({ input, element }) => {
|
|
578
|
+
return attachInstruction(data, {
|
|
579
|
+
input,
|
|
580
|
+
element,
|
|
581
|
+
indentPerLevel: DEFAULT_INDENTATION,
|
|
582
|
+
currentLevel: level,
|
|
583
|
+
mode,
|
|
584
|
+
block: isBranch ? [] : [
|
|
585
|
+
"make-child"
|
|
586
|
+
]
|
|
587
|
+
});
|
|
588
|
+
},
|
|
589
|
+
canDrop: ({ source }) => {
|
|
590
|
+
const _canDrop = canDrop ?? (() => true);
|
|
591
|
+
return source.element !== buttonRef.current && _canDrop({
|
|
592
|
+
source: source.data,
|
|
593
|
+
target: data
|
|
594
|
+
});
|
|
595
|
+
},
|
|
596
|
+
getIsSticky: () => true,
|
|
597
|
+
onDrag: ({ self, source }) => {
|
|
598
|
+
const desired = extractInstruction(self.data);
|
|
599
|
+
const block = desired && blockInstruction?.({
|
|
600
|
+
instruction: desired,
|
|
601
|
+
source: source.data,
|
|
602
|
+
target: data
|
|
603
|
+
});
|
|
604
|
+
const instruction2 = block && desired.type !== "instruction-blocked" ? {
|
|
605
|
+
type: "instruction-blocked",
|
|
606
|
+
desired
|
|
607
|
+
} : desired;
|
|
608
|
+
if (source.data.id !== id) {
|
|
609
|
+
if (instruction2?.type === "make-child" && isBranch && !open && !cancelExpandRef.current) {
|
|
610
|
+
cancelExpandRef.current = setTimeout(() => {
|
|
616
611
|
onOpenChange?.({
|
|
617
612
|
item,
|
|
618
613
|
path,
|
|
619
614
|
open: true
|
|
620
615
|
});
|
|
621
|
-
}
|
|
616
|
+
}, 500);
|
|
622
617
|
}
|
|
623
|
-
|
|
624
|
-
// https://github.com/atlassian/pragmatic-drag-and-drop/blob/main/packages/hitbox/constellation/index/about.mdx
|
|
625
|
-
dropTargetForElements2({
|
|
626
|
-
element: buttonRef.current,
|
|
627
|
-
getData: ({ input, element }) => {
|
|
628
|
-
return attachInstruction(data, {
|
|
629
|
-
input,
|
|
630
|
-
element,
|
|
631
|
-
indentPerLevel: DEFAULT_INDENTATION,
|
|
632
|
-
currentLevel: level,
|
|
633
|
-
mode,
|
|
634
|
-
block: isBranch ? [] : [
|
|
635
|
-
"make-child"
|
|
636
|
-
]
|
|
637
|
-
});
|
|
638
|
-
},
|
|
639
|
-
canDrop: ({ source }) => {
|
|
640
|
-
const _canDrop = canDrop ?? (() => true);
|
|
641
|
-
return source.element !== buttonRef.current && _canDrop({
|
|
642
|
-
source: source.data,
|
|
643
|
-
target: data
|
|
644
|
-
});
|
|
645
|
-
},
|
|
646
|
-
getIsSticky: () => true,
|
|
647
|
-
onDrag: ({ self, source }) => {
|
|
648
|
-
const instruction2 = extractInstruction(self.data);
|
|
649
|
-
if (source.data.id !== id) {
|
|
650
|
-
if (instruction2?.type === "make-child" && isBranch && !open && !cancelExpandRef.current) {
|
|
651
|
-
cancelExpandRef.current = setTimeout(() => {
|
|
652
|
-
onOpenChange?.({
|
|
653
|
-
item,
|
|
654
|
-
path,
|
|
655
|
-
open: true
|
|
656
|
-
});
|
|
657
|
-
}, 500);
|
|
658
|
-
}
|
|
659
|
-
if (instruction2?.type !== "make-child") {
|
|
660
|
-
cancelExpand();
|
|
661
|
-
}
|
|
662
|
-
setInstruction(instruction2);
|
|
663
|
-
} else if (instruction2?.type === "reparent") {
|
|
664
|
-
setInstruction(instruction2);
|
|
665
|
-
} else {
|
|
666
|
-
setInstruction(null);
|
|
667
|
-
}
|
|
668
|
-
},
|
|
669
|
-
onDragLeave: () => {
|
|
618
|
+
if (instruction2?.type !== "make-child") {
|
|
670
619
|
cancelExpand();
|
|
671
|
-
setInstruction(null);
|
|
672
|
-
},
|
|
673
|
-
onDrop: () => {
|
|
674
|
-
cancelExpand();
|
|
675
|
-
setInstruction(null);
|
|
676
620
|
}
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
const handleOpenChange = useCallback3(() => onOpenChange?.({
|
|
692
|
-
item,
|
|
693
|
-
path,
|
|
694
|
-
open: !open
|
|
695
|
-
}), [
|
|
696
|
-
onOpenChange,
|
|
697
|
-
item,
|
|
698
|
-
path,
|
|
699
|
-
open
|
|
700
|
-
]);
|
|
701
|
-
const handleSelect = useCallback3((option = false) => {
|
|
702
|
-
if (isBranch) {
|
|
703
|
-
handleOpenChange();
|
|
704
|
-
} else {
|
|
705
|
-
rowRef.current?.focus();
|
|
706
|
-
onSelect?.({
|
|
707
|
-
item,
|
|
708
|
-
path,
|
|
709
|
-
current: !current,
|
|
710
|
-
option
|
|
711
|
-
});
|
|
712
|
-
}
|
|
713
|
-
}, [
|
|
714
|
-
item,
|
|
715
|
-
path,
|
|
716
|
-
current,
|
|
717
|
-
isBranch,
|
|
718
|
-
handleOpenChange,
|
|
719
|
-
onSelect
|
|
720
|
-
]);
|
|
721
|
-
const handleKeyDown = useCallback3((event) => {
|
|
722
|
-
switch (event.key) {
|
|
723
|
-
case "ArrowRight":
|
|
724
|
-
isBranch && !open && handleOpenChange();
|
|
725
|
-
break;
|
|
726
|
-
case "ArrowLeft":
|
|
727
|
-
isBranch && open && handleOpenChange();
|
|
728
|
-
break;
|
|
729
|
-
case " ":
|
|
730
|
-
handleSelect(event.altKey);
|
|
731
|
-
break;
|
|
732
|
-
}
|
|
733
|
-
}, [
|
|
734
|
-
isBranch,
|
|
735
|
-
open,
|
|
736
|
-
handleOpenChange,
|
|
737
|
-
handleSelect
|
|
738
|
-
]);
|
|
739
|
-
return /* @__PURE__ */ React7.createElement(React7.Fragment, null, /* @__PURE__ */ React7.createElement(Treegrid.Row, {
|
|
740
|
-
ref: rowRef,
|
|
741
|
-
key: id,
|
|
742
|
-
id,
|
|
743
|
-
"aria-labelledby": `${id}__label`,
|
|
744
|
-
parentOf: parentOf?.join(Treegrid.PARENT_OF_SEPARATOR),
|
|
745
|
-
classNames: [
|
|
746
|
-
"grid grid-cols-subgrid col-[tree-row] mbs-0.5 aria-[current]:bg-activeSurface",
|
|
747
|
-
hoverableControls,
|
|
748
|
-
hoverableFocusedKeyboardControls,
|
|
749
|
-
hoverableFocusedWithinControls,
|
|
750
|
-
hoverableDescriptionIcons,
|
|
751
|
-
ghostHover,
|
|
752
|
-
className
|
|
753
|
-
],
|
|
754
|
-
"data-itemid": id,
|
|
755
|
-
"data-testid": testId,
|
|
756
|
-
// NOTE(thure): This is intentionally an empty string to for descendents to select by in the CSS
|
|
757
|
-
// without alerting the user (except for in the correct link element). See also:
|
|
758
|
-
// https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-current#description
|
|
759
|
-
"aria-current": current ? "" : void 0,
|
|
760
|
-
onKeyDown: handleKeyDown,
|
|
761
|
-
onContextMenu: (event) => {
|
|
762
|
-
event.preventDefault();
|
|
763
|
-
setMenuOpen(true);
|
|
621
|
+
setInstruction(instruction2);
|
|
622
|
+
} else if (instruction2?.type === "reparent") {
|
|
623
|
+
setInstruction(instruction2);
|
|
624
|
+
} else {
|
|
625
|
+
setInstruction(null);
|
|
626
|
+
}
|
|
627
|
+
},
|
|
628
|
+
onDragLeave: () => {
|
|
629
|
+
cancelExpand();
|
|
630
|
+
setInstruction(null);
|
|
631
|
+
},
|
|
632
|
+
onDrop: () => {
|
|
633
|
+
cancelExpand();
|
|
634
|
+
setInstruction(null);
|
|
764
635
|
}
|
|
765
|
-
}
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
636
|
+
});
|
|
637
|
+
if (!isItemDraggable) {
|
|
638
|
+
return dropTarget;
|
|
639
|
+
}
|
|
640
|
+
return combine2(makeDraggable(), dropTarget);
|
|
641
|
+
}, [
|
|
642
|
+
draggableProp,
|
|
643
|
+
isItemDraggable,
|
|
644
|
+
isItemDroppable,
|
|
645
|
+
item,
|
|
646
|
+
id,
|
|
647
|
+
mode,
|
|
648
|
+
path,
|
|
649
|
+
open,
|
|
650
|
+
blockInstruction,
|
|
651
|
+
canDrop
|
|
652
|
+
]);
|
|
653
|
+
useEffect3(() => () => cancelExpand(), [
|
|
654
|
+
cancelExpand
|
|
655
|
+
]);
|
|
656
|
+
const handleOpenToggle = useCallback3(() => onOpenChange?.({
|
|
657
|
+
item,
|
|
658
|
+
path,
|
|
659
|
+
open: !open
|
|
660
|
+
}), [
|
|
661
|
+
onOpenChange,
|
|
662
|
+
item,
|
|
663
|
+
path,
|
|
664
|
+
open
|
|
665
|
+
]);
|
|
666
|
+
const handleSelect = useCallback3((option = false) => {
|
|
667
|
+
if (isBranch && (option || current)) {
|
|
668
|
+
handleOpenToggle();
|
|
669
|
+
} else if (canSelectItem) {
|
|
670
|
+
canSelect?.({
|
|
671
|
+
item,
|
|
672
|
+
path
|
|
673
|
+
});
|
|
674
|
+
rowRef.current?.focus();
|
|
675
|
+
onSelect?.({
|
|
676
|
+
item,
|
|
677
|
+
path,
|
|
678
|
+
current: !current,
|
|
679
|
+
option
|
|
680
|
+
});
|
|
681
|
+
}
|
|
682
|
+
}, [
|
|
683
|
+
item,
|
|
684
|
+
path,
|
|
685
|
+
current,
|
|
686
|
+
isBranch,
|
|
687
|
+
canSelectItem,
|
|
688
|
+
handleOpenToggle,
|
|
689
|
+
onSelect
|
|
690
|
+
]);
|
|
691
|
+
const handleKeyDown = useCallback3((event) => {
|
|
692
|
+
switch (event.key) {
|
|
693
|
+
case "ArrowRight":
|
|
694
|
+
case "ArrowLeft":
|
|
695
|
+
isBranch && handleOpenToggle();
|
|
696
|
+
break;
|
|
697
|
+
}
|
|
698
|
+
}, [
|
|
699
|
+
isBranch,
|
|
700
|
+
open,
|
|
701
|
+
handleOpenToggle,
|
|
702
|
+
handleSelect
|
|
703
|
+
]);
|
|
704
|
+
const handleItemHover = useCallback3(() => {
|
|
705
|
+
onItemHover?.({
|
|
706
|
+
item
|
|
707
|
+
});
|
|
708
|
+
}, [
|
|
709
|
+
onItemHover,
|
|
710
|
+
item
|
|
711
|
+
]);
|
|
712
|
+
const handleContextMenu = useCallback3((event) => {
|
|
713
|
+
event.preventDefault();
|
|
714
|
+
setMenuOpen(true);
|
|
715
|
+
}, [
|
|
716
|
+
setMenuOpen
|
|
717
|
+
]);
|
|
718
|
+
const childProps = {
|
|
719
|
+
draggable: draggableProp,
|
|
720
|
+
renderColumns: Columns,
|
|
721
|
+
blockInstruction,
|
|
722
|
+
canDrop,
|
|
723
|
+
canSelect,
|
|
724
|
+
onItemHover,
|
|
725
|
+
onOpenChange,
|
|
726
|
+
onSelect
|
|
727
|
+
};
|
|
728
|
+
return /* @__PURE__ */ React7.createElement(React7.Fragment, null, /* @__PURE__ */ React7.createElement(Treegrid.Row, {
|
|
729
|
+
ref: rowRef,
|
|
730
|
+
key: id,
|
|
731
|
+
id,
|
|
732
|
+
"aria-labelledby": `${id}__label`,
|
|
733
|
+
parentOf: parentOf?.join(TREEGRID_PARENT_OF_SEPARATOR),
|
|
734
|
+
"data-object-id": id,
|
|
735
|
+
"data-testid": testId,
|
|
736
|
+
// NOTE(thure): This is intentionally an empty string to for descendents to select by in the CSS
|
|
737
|
+
// without alerting the user (except for in the correct link element). See also:
|
|
738
|
+
// https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-current#description
|
|
739
|
+
"aria-current": current ? "" : void 0,
|
|
740
|
+
classNames: mx4("grid grid-cols-subgrid col-[tree-row] mt-0.5 is-current:bg-active-surface", hoverableControls, hoverableFocusedKeyboardControls, hoverableFocusedWithinControls, hoverableDescriptionIcons, ghostFocusWithin, ghostHover, className),
|
|
741
|
+
onKeyDown: handleKeyDown,
|
|
742
|
+
onMouseEnter: handleItemHover,
|
|
743
|
+
onContextMenu: handleContextMenu
|
|
744
|
+
}, /* @__PURE__ */ React7.createElement("div", {
|
|
745
|
+
role: "none",
|
|
746
|
+
className: "indent relative grid grid-cols-subgrid col-[tree-row]",
|
|
747
|
+
style: paddingIndentation(level)
|
|
748
|
+
}, /* @__PURE__ */ React7.createElement(Treegrid.Cell, {
|
|
749
|
+
classNames: "flex items-center"
|
|
750
|
+
}, /* @__PURE__ */ React7.createElement(TreeItemToggle, {
|
|
751
|
+
isBranch,
|
|
752
|
+
open,
|
|
753
|
+
onClick: handleOpenToggle
|
|
754
|
+
}), /* @__PURE__ */ React7.createElement(TreeItemHeading, {
|
|
755
|
+
disabled,
|
|
756
|
+
current,
|
|
757
|
+
label,
|
|
758
|
+
className: headingClassName,
|
|
759
|
+
icon,
|
|
760
|
+
iconHue,
|
|
761
|
+
onSelect: handleSelect,
|
|
762
|
+
ref: buttonRef
|
|
763
|
+
})), Columns && /* @__PURE__ */ React7.createElement(Columns, {
|
|
764
|
+
item,
|
|
765
|
+
path,
|
|
766
|
+
open,
|
|
767
|
+
menuOpen,
|
|
768
|
+
setMenuOpen
|
|
769
|
+
}), instruction && /* @__PURE__ */ React7.createElement(NaturalTreeItem.DropIndicator, {
|
|
770
|
+
instruction,
|
|
771
|
+
gap: 2
|
|
772
|
+
}))), open && childIds.map((childId, index) => /* @__PURE__ */ React7.createElement(TreeItemById, {
|
|
773
|
+
key: childId,
|
|
774
|
+
id: childId,
|
|
775
|
+
path,
|
|
776
|
+
last: index === childIds.length - 1,
|
|
777
|
+
...childProps
|
|
778
|
+
})));
|
|
807
779
|
};
|
|
808
780
|
var TreeItem = /* @__PURE__ */ memo3(RawTreeItem);
|
|
781
|
+
var RawTreeItemById = ({ id, ...props }) => {
|
|
782
|
+
const { item: itemAtom } = useTree();
|
|
783
|
+
const item = useAtomValue(itemAtom(id));
|
|
784
|
+
if (!item) {
|
|
785
|
+
return null;
|
|
786
|
+
}
|
|
787
|
+
return /* @__PURE__ */ React7.createElement(TreeItem, {
|
|
788
|
+
item,
|
|
789
|
+
...props
|
|
790
|
+
});
|
|
791
|
+
};
|
|
792
|
+
var TreeItemById = /* @__PURE__ */ memo3(RawTreeItemById);
|
|
809
793
|
|
|
810
794
|
// src/components/Tree/Tree.tsx
|
|
811
|
-
var Tree = ({
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
levelOffset,
|
|
846
|
-
draggable: draggable3,
|
|
847
|
-
renderColumns,
|
|
848
|
-
canDrop,
|
|
849
|
-
onOpenChange,
|
|
850
|
-
onSelect
|
|
851
|
-
}))));
|
|
852
|
-
} finally {
|
|
853
|
-
_effect.f();
|
|
854
|
-
}
|
|
795
|
+
var Tree = ({ model, rootId, path, id, draggable: draggable3 = false, gridTemplateColumns = "[tree-row-start] 1fr min-content [tree-row-end]", classNames, levelOffset, renderColumns, blockInstruction, canDrop, canSelect, onOpenChange, onSelect, onItemHover }) => {
|
|
796
|
+
const childIds = useAtomValue2(model.childIds(rootId));
|
|
797
|
+
const treePath = useMemo2(() => path ? [
|
|
798
|
+
...path,
|
|
799
|
+
id
|
|
800
|
+
] : [
|
|
801
|
+
id
|
|
802
|
+
], [
|
|
803
|
+
id,
|
|
804
|
+
path
|
|
805
|
+
]);
|
|
806
|
+
const childProps = {
|
|
807
|
+
path: treePath,
|
|
808
|
+
levelOffset,
|
|
809
|
+
draggable: draggable3,
|
|
810
|
+
renderColumns,
|
|
811
|
+
blockInstruction,
|
|
812
|
+
canDrop,
|
|
813
|
+
canSelect,
|
|
814
|
+
onOpenChange,
|
|
815
|
+
onSelect,
|
|
816
|
+
onItemHover
|
|
817
|
+
};
|
|
818
|
+
return /* @__PURE__ */ React8.createElement(Treegrid2.Root, {
|
|
819
|
+
gridTemplateColumns,
|
|
820
|
+
classNames
|
|
821
|
+
}, /* @__PURE__ */ React8.createElement(TreeProvider, {
|
|
822
|
+
value: model
|
|
823
|
+
}, childIds.map((childId, index) => /* @__PURE__ */ React8.createElement(TreeItemById, {
|
|
824
|
+
key: childId,
|
|
825
|
+
id: childId,
|
|
826
|
+
last: index === childIds.length - 1,
|
|
827
|
+
...childProps
|
|
828
|
+
}))));
|
|
855
829
|
};
|
|
856
830
|
|
|
857
831
|
// src/util/path.ts
|
|
@@ -871,13 +845,17 @@ var Path = {
|
|
|
871
845
|
};
|
|
872
846
|
export {
|
|
873
847
|
Accordion,
|
|
848
|
+
DEFAULT_INDENTATION,
|
|
874
849
|
List,
|
|
875
850
|
Path,
|
|
876
851
|
Tree,
|
|
877
852
|
TreeDataSchema,
|
|
878
853
|
TreeItem,
|
|
854
|
+
TreeItemById,
|
|
855
|
+
TreeItemToggle,
|
|
879
856
|
TreeProvider,
|
|
880
857
|
isTreeData,
|
|
858
|
+
paddingIndentation,
|
|
881
859
|
useTree
|
|
882
860
|
};
|
|
883
861
|
//# sourceMappingURL=index.mjs.map
|