@dxos/react-ui-list 0.8.4-main.c85a9c8dae → 0.8.4-main.d05539e30a

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.
Files changed (90) hide show
  1. package/LICENSE +102 -5
  2. package/dist/lib/browser/index.mjs +883 -216
  3. package/dist/lib/browser/index.mjs.map +4 -4
  4. package/dist/lib/browser/meta.json +1 -1
  5. package/dist/lib/node-esm/index.mjs +883 -216
  6. package/dist/lib/node-esm/index.mjs.map +4 -4
  7. package/dist/lib/node-esm/meta.json +1 -1
  8. package/dist/types/src/components/Accordion/Accordion.d.ts +1 -1
  9. package/dist/types/src/components/Accordion/Accordion.d.ts.map +1 -1
  10. package/dist/types/src/components/Accordion/Accordion.stories.d.ts.map +1 -1
  11. package/dist/types/src/components/Accordion/AccordionItem.d.ts.map +1 -1
  12. package/dist/types/src/components/Accordion/AccordionRoot.d.ts +1 -1
  13. package/dist/types/src/components/Accordion/AccordionRoot.d.ts.map +1 -1
  14. package/dist/types/src/components/Combobox/Combobox.d.ts +105 -0
  15. package/dist/types/src/components/Combobox/Combobox.d.ts.map +1 -0
  16. package/dist/types/src/components/Combobox/Combobox.stories.d.ts +12 -0
  17. package/dist/types/src/components/Combobox/Combobox.stories.d.ts.map +1 -0
  18. package/dist/types/src/components/Combobox/index.d.ts +2 -0
  19. package/dist/types/src/components/Combobox/index.d.ts.map +1 -0
  20. package/dist/types/src/components/List/List.d.ts +18 -7
  21. package/dist/types/src/components/List/List.d.ts.map +1 -1
  22. package/dist/types/src/components/List/List.stories.d.ts +2 -2
  23. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  24. package/dist/types/src/components/List/ListItem.d.ts +12 -10
  25. package/dist/types/src/components/List/ListItem.d.ts.map +1 -1
  26. package/dist/types/src/components/List/ListRoot.d.ts.map +1 -1
  27. package/dist/types/src/components/List/testing.d.ts.map +1 -1
  28. package/dist/types/src/components/Listbox/Listbox.d.ts +27 -0
  29. package/dist/types/src/components/Listbox/Listbox.d.ts.map +1 -0
  30. package/dist/types/src/components/Listbox/Listbox.stories.d.ts +12 -0
  31. package/dist/types/src/components/Listbox/Listbox.stories.d.ts.map +1 -0
  32. package/dist/types/src/components/Listbox/index.d.ts +2 -0
  33. package/dist/types/src/components/Listbox/index.d.ts.map +1 -0
  34. package/dist/types/src/components/Picker/Picker.d.ts +49 -0
  35. package/dist/types/src/components/Picker/Picker.d.ts.map +1 -0
  36. package/dist/types/src/components/Picker/Picker.stories.d.ts +28 -0
  37. package/dist/types/src/components/Picker/Picker.stories.d.ts.map +1 -0
  38. package/dist/types/src/components/Picker/context.d.ts +29 -0
  39. package/dist/types/src/components/Picker/context.d.ts.map +1 -0
  40. package/dist/types/src/components/Picker/index.d.ts +3 -0
  41. package/dist/types/src/components/Picker/index.d.ts.map +1 -0
  42. package/dist/types/src/components/RowList/RowList.d.ts +61 -0
  43. package/dist/types/src/components/RowList/RowList.d.ts.map +1 -0
  44. package/dist/types/src/components/RowList/RowList.stories.d.ts +35 -0
  45. package/dist/types/src/components/RowList/RowList.stories.d.ts.map +1 -0
  46. package/dist/types/src/components/RowList/index.d.ts +3 -0
  47. package/dist/types/src/components/RowList/index.d.ts.map +1 -0
  48. package/dist/types/src/components/Tree/Tree.d.ts +1 -1
  49. package/dist/types/src/components/Tree/Tree.d.ts.map +1 -1
  50. package/dist/types/src/components/Tree/Tree.stories.d.ts +1 -1
  51. package/dist/types/src/components/Tree/Tree.stories.d.ts.map +1 -1
  52. package/dist/types/src/components/Tree/TreeContext.d.ts +4 -0
  53. package/dist/types/src/components/Tree/TreeContext.d.ts.map +1 -1
  54. package/dist/types/src/components/Tree/TreeItem.d.ts.map +1 -1
  55. package/dist/types/src/components/Tree/TreeItemHeading.d.ts.map +1 -1
  56. package/dist/types/src/components/Tree/helpers.d.ts.map +1 -1
  57. package/dist/types/src/components/Tree/testing.d.ts.map +1 -1
  58. package/dist/types/src/components/index.d.ts +4 -0
  59. package/dist/types/src/components/index.d.ts.map +1 -1
  60. package/dist/types/src/util/path.d.ts.map +1 -1
  61. package/dist/types/tsconfig.tsbuildinfo +1 -1
  62. package/package.json +22 -21
  63. package/src/components/Accordion/Accordion.stories.tsx +3 -3
  64. package/src/components/Accordion/AccordionItem.tsx +1 -4
  65. package/src/components/Combobox/Combobox.stories.tsx +60 -0
  66. package/src/components/Combobox/Combobox.tsx +387 -0
  67. package/src/components/Combobox/index.ts +5 -0
  68. package/src/components/List/List.stories.tsx +7 -7
  69. package/src/components/List/List.tsx +14 -10
  70. package/src/components/List/ListItem.tsx +62 -44
  71. package/src/components/List/ListRoot.tsx +1 -1
  72. package/src/components/List/testing.ts +4 -4
  73. package/src/components/Listbox/Listbox.stories.tsx +48 -0
  74. package/src/components/Listbox/Listbox.tsx +201 -0
  75. package/src/components/Listbox/index.ts +5 -0
  76. package/src/components/Picker/Picker.stories.tsx +131 -0
  77. package/src/components/Picker/Picker.tsx +368 -0
  78. package/src/components/Picker/context.ts +43 -0
  79. package/src/components/Picker/index.ts +6 -0
  80. package/src/components/RowList/RowList.stories.tsx +163 -0
  81. package/src/components/RowList/RowList.tsx +350 -0
  82. package/src/components/RowList/index.ts +6 -0
  83. package/src/components/Tree/Tree.stories.tsx +4 -5
  84. package/src/components/Tree/Tree.tsx +1 -1
  85. package/src/components/Tree/TreeContext.tsx +4 -0
  86. package/src/components/Tree/TreeItem.tsx +96 -70
  87. package/src/components/Tree/TreeItemHeading.tsx +1 -2
  88. package/src/components/Tree/TreeItemToggle.tsx +3 -3
  89. package/src/components/Tree/testing.ts +5 -5
  90. package/src/components/index.ts +4 -0
@@ -55,7 +55,6 @@ var AccordionItemBody = ({ children, classNames }) => {
55
55
  return /* @__PURE__ */ React2.createElement(AccordionPrimitive2.Content, {
56
56
  className: "overflow-hidden data-[state=closed]:animate-slide-up data-[state=open]:animate-slide-down"
57
57
  }, /* @__PURE__ */ React2.createElement("div", {
58
- role: "none",
59
58
  className: mx2("p-2", classNames)
60
59
  }, children));
61
60
  };
@@ -68,29 +67,466 @@ var Accordion = {
68
67
  ItemBody: AccordionItemBody
69
68
  };
70
69
 
70
+ // src/components/Combobox/Combobox.tsx
71
+ import { createContext as createContext4 } from "@radix-ui/react-context";
72
+ import { useControllableState } from "@radix-ui/react-use-controllable-state";
73
+ import React4, { forwardRef as forwardRef2, useCallback as useCallback2 } from "react";
74
+ import { Button, Icon as Icon2, Popover, ScrollArea, useId } from "@dxos/react-ui";
75
+ import { composable, composableProps, mx as mx4 } from "@dxos/ui-theme";
76
+
77
+ // src/components/Picker/Picker.tsx
78
+ import { Slot } from "@radix-ui/react-slot";
79
+ import React3, { forwardRef, useCallback, useEffect, useMemo, useRef, useState } from "react";
80
+ import { Input, useThemeContext } from "@dxos/react-ui";
81
+ import { mx as mx3 } from "@dxos/ui-theme";
82
+
83
+ // src/components/Picker/context.ts
84
+ import { createContext as createContext3 } from "@radix-ui/react-context";
85
+ var [PickerItemContextProvider, usePickerItemContext] = createContext3("PickerItem");
86
+ var [PickerInputContextProvider, usePickerInputContext] = createContext3("PickerInput");
87
+
88
+ // src/components/Picker/Picker.tsx
89
+ var PickerRoot = ({ children }) => {
90
+ const [selectedValue, setSelectedValue] = useState(void 0);
91
+ const itemsRef = useRef(/* @__PURE__ */ new Map());
92
+ const [itemVersion, setItemVersion] = useState(0);
93
+ useEffect(() => {
94
+ const current = selectedValue !== void 0 ? itemsRef.current.get(selectedValue) : void 0;
95
+ const isValid = current !== void 0 && !current.disabled;
96
+ if (!isValid && itemsRef.current.size > 0) {
97
+ const entries = Array.from(itemsRef.current.entries()).filter(([, data]) => !data.disabled);
98
+ if (entries.length > 0) {
99
+ entries.sort(([, a], [, b]) => {
100
+ const position = a.element.compareDocumentPosition(b.element);
101
+ if (position & Node.DOCUMENT_POSITION_FOLLOWING) {
102
+ return -1;
103
+ }
104
+ if (position & Node.DOCUMENT_POSITION_PRECEDING) {
105
+ return 1;
106
+ }
107
+ return 0;
108
+ });
109
+ const firstValue = entries[0]?.[0];
110
+ if (firstValue !== void 0 && firstValue !== selectedValue) {
111
+ setSelectedValue(firstValue);
112
+ }
113
+ } else if (selectedValue !== void 0) {
114
+ setSelectedValue(void 0);
115
+ }
116
+ }
117
+ }, [
118
+ itemVersion,
119
+ selectedValue
120
+ ]);
121
+ const registerItem = useCallback((value, element, onSelect, disabled) => {
122
+ if (element) {
123
+ itemsRef.current.set(value, {
124
+ element,
125
+ onSelect,
126
+ disabled
127
+ });
128
+ setItemVersion((v) => v + 1);
129
+ }
130
+ }, []);
131
+ const unregisterItem = useCallback((value) => {
132
+ itemsRef.current.delete(value);
133
+ setItemVersion((v) => v + 1);
134
+ }, []);
135
+ const getItemValues = useCallback(() => {
136
+ return Array.from(itemsRef.current.entries()).filter(([, data]) => !data.disabled).sort(([, a], [, b]) => {
137
+ const position = a.element.compareDocumentPosition(b.element);
138
+ return position & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : position & Node.DOCUMENT_POSITION_PRECEDING ? 1 : 0;
139
+ }).map(([value]) => value);
140
+ }, []);
141
+ const triggerSelect = useCallback(() => {
142
+ if (selectedValue !== void 0) {
143
+ const item = itemsRef.current.get(selectedValue);
144
+ item?.onSelect?.();
145
+ }
146
+ }, [
147
+ selectedValue
148
+ ]);
149
+ const itemContextValue = useMemo(() => ({
150
+ selectedValue,
151
+ onSelectedValueChange: setSelectedValue,
152
+ registerItem,
153
+ unregisterItem
154
+ }), [
155
+ selectedValue,
156
+ registerItem,
157
+ unregisterItem
158
+ ]);
159
+ const inputContextValue = useMemo(() => ({
160
+ selectedValue,
161
+ onSelectedValueChange: setSelectedValue,
162
+ getItemValues,
163
+ triggerSelect
164
+ }), [
165
+ selectedValue,
166
+ getItemValues,
167
+ triggerSelect
168
+ ]);
169
+ return /* @__PURE__ */ React3.createElement(PickerInputContextProvider, inputContextValue, /* @__PURE__ */ React3.createElement(PickerItemContextProvider, itemContextValue, children));
170
+ };
171
+ PickerRoot.displayName = "Picker.Root";
172
+ var PickerInput = /* @__PURE__ */ forwardRef(({ value, onValueChange, onChange, onKeyDown, autoFocus, ...props }, forwardedRef) => {
173
+ const { hasIosKeyboard } = useThemeContext();
174
+ const { selectedValue, onSelectedValueChange, getItemValues, triggerSelect } = usePickerInputContext("Picker.Input");
175
+ const handleChange = useCallback((event) => {
176
+ onValueChange?.(event.target.value);
177
+ onChange?.(event);
178
+ }, [
179
+ onValueChange,
180
+ onChange
181
+ ]);
182
+ const handleKeyDown = useCallback((event) => {
183
+ onKeyDown?.(event);
184
+ if (event.defaultPrevented) {
185
+ return;
186
+ }
187
+ const values = getItemValues();
188
+ if (values.length === 0) {
189
+ if (event.key === "Escape") {
190
+ onValueChange?.("");
191
+ }
192
+ return;
193
+ }
194
+ const currentIndex = selectedValue !== void 0 ? values.indexOf(selectedValue) : -1;
195
+ switch (event.key) {
196
+ case "ArrowDown": {
197
+ event.preventDefault();
198
+ const nextIndex = currentIndex === -1 ? 0 : Math.min(currentIndex + 1, values.length - 1);
199
+ const nextValue = values[nextIndex];
200
+ if (nextValue !== void 0) {
201
+ onSelectedValueChange(nextValue);
202
+ }
203
+ break;
204
+ }
205
+ case "ArrowUp": {
206
+ event.preventDefault();
207
+ const prevIndex = currentIndex === -1 ? values.length - 1 : Math.max(currentIndex - 1, 0);
208
+ const prevValue = values[prevIndex];
209
+ if (prevValue !== void 0) {
210
+ onSelectedValueChange(prevValue);
211
+ }
212
+ break;
213
+ }
214
+ case "Enter": {
215
+ if (selectedValue !== void 0) {
216
+ event.preventDefault();
217
+ triggerSelect();
218
+ }
219
+ break;
220
+ }
221
+ case "Home": {
222
+ event.preventDefault();
223
+ const firstValue = values[0];
224
+ if (firstValue !== void 0) {
225
+ onSelectedValueChange(firstValue);
226
+ }
227
+ break;
228
+ }
229
+ case "End": {
230
+ event.preventDefault();
231
+ const lastValue = values[values.length - 1];
232
+ if (lastValue !== void 0) {
233
+ onSelectedValueChange(lastValue);
234
+ }
235
+ break;
236
+ }
237
+ case "Escape": {
238
+ event.preventDefault();
239
+ if (selectedValue !== void 0) {
240
+ onSelectedValueChange(void 0);
241
+ } else {
242
+ onValueChange?.("");
243
+ }
244
+ break;
245
+ }
246
+ }
247
+ }, [
248
+ selectedValue,
249
+ onSelectedValueChange,
250
+ getItemValues,
251
+ triggerSelect,
252
+ onValueChange,
253
+ onKeyDown
254
+ ]);
255
+ return /* @__PURE__ */ React3.createElement(Input.Root, null, /* @__PURE__ */ React3.createElement(Input.TextInput, {
256
+ ...props,
257
+ autoFocus: autoFocus && !hasIosKeyboard,
258
+ ...value !== void 0 && {
259
+ value
260
+ },
261
+ onChange: handleChange,
262
+ onKeyDown: handleKeyDown,
263
+ ref: forwardedRef
264
+ }));
265
+ });
266
+ PickerInput.displayName = "Picker.Input";
267
+ var PickerItem = /* @__PURE__ */ forwardRef(({ classNames, value, onSelect, disabled, asChild, children, ...props }, forwardedRef) => {
268
+ const { selectedValue, onSelectedValueChange, registerItem, unregisterItem } = usePickerItemContext("Picker.Item");
269
+ const internalRef = useRef(null);
270
+ const isSelected = selectedValue === value && !disabled;
271
+ useEffect(() => {
272
+ const element = internalRef.current;
273
+ if (element) {
274
+ registerItem(value, element, onSelect, disabled);
275
+ }
276
+ return () => unregisterItem(value);
277
+ }, [
278
+ value,
279
+ onSelect,
280
+ disabled,
281
+ registerItem,
282
+ unregisterItem
283
+ ]);
284
+ useEffect(() => {
285
+ if (isSelected && internalRef.current) {
286
+ internalRef.current.scrollIntoView({
287
+ block: "nearest",
288
+ behavior: "smooth"
289
+ });
290
+ }
291
+ }, [
292
+ isSelected
293
+ ]);
294
+ const handleClick = useCallback(() => {
295
+ if (disabled) {
296
+ return;
297
+ }
298
+ onSelectedValueChange(value);
299
+ onSelect?.();
300
+ }, [
301
+ disabled,
302
+ value,
303
+ onSelectedValueChange,
304
+ onSelect
305
+ ]);
306
+ const handleMouseDown = useCallback((event) => {
307
+ event.preventDefault();
308
+ }, []);
309
+ const Comp = asChild ? Slot : "div";
310
+ return /* @__PURE__ */ React3.createElement(Comp, {
311
+ ...props,
312
+ ref: (node) => {
313
+ internalRef.current = node;
314
+ if (typeof forwardedRef === "function") {
315
+ forwardedRef(node);
316
+ } else if (forwardedRef) {
317
+ forwardedRef.current = node;
318
+ }
319
+ },
320
+ role: "option",
321
+ "aria-selected": isSelected,
322
+ "aria-disabled": disabled,
323
+ "data-selected": isSelected,
324
+ "data-disabled": disabled,
325
+ "data-value": value,
326
+ // Browser focus stays on the input; highlight is via `aria-selected`.
327
+ tabIndex: -1,
328
+ className: mx3("dx-hover dx-selected px-[var(--gutter,0.75rem)] py-1 cursor-pointer select-none", disabled && "opacity-50 cursor-not-allowed", classNames),
329
+ onMouseDown: handleMouseDown,
330
+ onClick: handleClick
331
+ }, children);
332
+ });
333
+ PickerItem.displayName = "Picker.Item";
334
+ var Picker = {
335
+ Root: PickerRoot,
336
+ Input: PickerInput,
337
+ Item: PickerItem
338
+ };
339
+
340
+ // src/components/Combobox/Combobox.tsx
341
+ var COMBOBOX_NAME = "Combobox";
342
+ var COMBOBOX_CONTENT_NAME = "ComboboxContent";
343
+ var COMBOBOX_ITEM_NAME = "ComboboxItem";
344
+ var COMBOBOX_TRIGGER_NAME = "ComboboxTrigger";
345
+ var [ComboboxProvider, useComboboxContext] = createContext4(COMBOBOX_NAME, {});
346
+ var ComboboxRoot = ({ children, modal, modalId: modalIdProp, open: openProp, defaultOpen, onOpenChange: propsOnOpenChange, value: valueProp, defaultValue, onValueChange: propsOnValueChange, placeholder }) => {
347
+ const modalId = useId(COMBOBOX_NAME, modalIdProp);
348
+ const [open = false, onOpenChange] = useControllableState({
349
+ prop: openProp,
350
+ defaultProp: defaultOpen,
351
+ onChange: propsOnOpenChange
352
+ });
353
+ const [value = "", onValueChange] = useControllableState({
354
+ prop: valueProp,
355
+ defaultProp: defaultValue,
356
+ onChange: propsOnValueChange
357
+ });
358
+ return /* @__PURE__ */ React4.createElement(Popover.Root, {
359
+ open,
360
+ onOpenChange,
361
+ modal
362
+ }, /* @__PURE__ */ React4.createElement(ComboboxProvider, {
363
+ isCombobox: true,
364
+ modalId,
365
+ placeholder,
366
+ open,
367
+ onOpenChange,
368
+ value,
369
+ onValueChange
370
+ }, children));
371
+ };
372
+ var ComboboxContent = composable(({ children, ...props }, forwardedRef) => {
373
+ const { modalId } = useComboboxContext(COMBOBOX_CONTENT_NAME);
374
+ return /* @__PURE__ */ React4.createElement(Popover.Content, {
375
+ ...composableProps(props, {
376
+ id: modalId
377
+ }),
378
+ ref: forwardedRef
379
+ }, /* @__PURE__ */ React4.createElement(Popover.Viewport, {
380
+ classNames: "w-(--radix-popover-trigger-width)"
381
+ }, /* @__PURE__ */ React4.createElement(Picker.Root, null, children)));
382
+ });
383
+ ComboboxContent.displayName = COMBOBOX_CONTENT_NAME;
384
+ var ComboboxTrigger = /* @__PURE__ */ forwardRef2(({ children, onClick, ...props }, forwardedRef) => {
385
+ const { modalId, open, onOpenChange, placeholder, value } = useComboboxContext(COMBOBOX_TRIGGER_NAME);
386
+ const handleClick = useCallback2((event) => {
387
+ onClick?.(event);
388
+ onOpenChange?.(true);
389
+ }, [
390
+ onClick,
391
+ onOpenChange
392
+ ]);
393
+ return /* @__PURE__ */ React4.createElement(Popover.Trigger, {
394
+ asChild: true
395
+ }, /* @__PURE__ */ React4.createElement(Button, {
396
+ ...props,
397
+ role: "combobox",
398
+ "aria-expanded": open,
399
+ "aria-controls": modalId,
400
+ "aria-haspopup": "dialog",
401
+ onClick: handleClick,
402
+ ref: forwardedRef
403
+ }, children ?? /* @__PURE__ */ React4.createElement(React4.Fragment, null, /* @__PURE__ */ React4.createElement("span", {
404
+ className: mx4("font-normal text-start flex-1 min-w-0 truncate me-2", !value && "text-subdued")
405
+ }, value || placeholder), /* @__PURE__ */ React4.createElement(Icon2, {
406
+ icon: "ph--caret-down--bold",
407
+ size: 3
408
+ }))));
409
+ });
410
+ ComboboxTrigger.displayName = COMBOBOX_TRIGGER_NAME;
411
+ var ComboboxVirtualTrigger = Popover.VirtualTrigger;
412
+ var ComboboxInput = /* @__PURE__ */ forwardRef2(({ classNames, ...props }, forwardedRef) => {
413
+ return /* @__PURE__ */ React4.createElement(Picker.Input, {
414
+ ...props,
415
+ classNames: [
416
+ "m-form-chrome mb-0 w-[calc(100%-2*var(--spacing-form-chrome))]",
417
+ classNames
418
+ ],
419
+ ref: forwardedRef
420
+ });
421
+ });
422
+ ComboboxInput.displayName = "Combobox.Input";
423
+ var ComboboxList = /* @__PURE__ */ forwardRef2(({ classNames, children, ...props }, forwardedRef) => {
424
+ return /* @__PURE__ */ React4.createElement(ScrollArea.Root, {
425
+ ...composableProps(props, {
426
+ classNames: [
427
+ "py-form-chrome",
428
+ classNames
429
+ ]
430
+ }),
431
+ role: "listbox",
432
+ centered: true,
433
+ padding: true,
434
+ thin: true,
435
+ ref: forwardedRef
436
+ }, /* @__PURE__ */ React4.createElement(ScrollArea.Viewport, null, children));
437
+ });
438
+ ComboboxList.displayName = "Combobox.List";
439
+ var ComboboxItem = /* @__PURE__ */ forwardRef2(({ classNames, onSelect, value, label, icon, iconClassNames, checked, suffix, disabled, closeOnSelect = true, children }, forwardedRef) => {
440
+ const { onValueChange, onOpenChange } = useComboboxContext(COMBOBOX_ITEM_NAME);
441
+ const handleSelect = useCallback2(() => {
442
+ onSelect?.();
443
+ if (value !== void 0) {
444
+ onValueChange?.(value);
445
+ }
446
+ if (closeOnSelect) {
447
+ onOpenChange?.(false);
448
+ }
449
+ }, [
450
+ onSelect,
451
+ onValueChange,
452
+ onOpenChange,
453
+ value,
454
+ closeOnSelect
455
+ ]);
456
+ return /* @__PURE__ */ React4.createElement(Picker.Item, {
457
+ value,
458
+ disabled,
459
+ onSelect: handleSelect,
460
+ ref: forwardedRef,
461
+ classNames: [
462
+ // Full width inside the viewport (no horizontal margin).
463
+ // `px-3 py-1`, `cursor-pointer`, `select-none` and the
464
+ // `dx-hover` / `dx-selected` pairing come from `Picker.Item`'s
465
+ // defaults; we only add the row-shape (flex / icons + label)
466
+ // and the disabled overrides on top.
467
+ "flex w-full gap-2 items-center",
468
+ disabled && "hover:bg-transparent data-[selected=true]:bg-transparent",
469
+ classNames
470
+ ]
471
+ }, children ?? /* @__PURE__ */ React4.createElement(React4.Fragment, null, icon && /* @__PURE__ */ React4.createElement(Icon2, {
472
+ icon,
473
+ classNames: iconClassNames
474
+ }), /* @__PURE__ */ React4.createElement("span", {
475
+ className: "w-0 grow truncate"
476
+ }, label), suffix && /* @__PURE__ */ React4.createElement("span", {
477
+ className: "shrink-0 text-description"
478
+ }, suffix), checked && /* @__PURE__ */ React4.createElement(Icon2, {
479
+ icon: "ph--check--regular"
480
+ })));
481
+ });
482
+ ComboboxItem.displayName = COMBOBOX_ITEM_NAME;
483
+ var ComboboxArrow = Popover.Arrow;
484
+ var ComboboxEmpty = /* @__PURE__ */ forwardRef2(({ classNames, children }, forwardedRef) => {
485
+ return /* @__PURE__ */ React4.createElement("div", {
486
+ ref: forwardedRef,
487
+ role: "status",
488
+ className: mx4(classNames)
489
+ }, children);
490
+ });
491
+ ComboboxEmpty.displayName = "Combobox.Empty";
492
+ var ComboboxPortal = Popover.Portal;
493
+ var Combobox = {
494
+ Root: ComboboxRoot,
495
+ Portal: ComboboxPortal,
496
+ Content: ComboboxContent,
497
+ Trigger: ComboboxTrigger,
498
+ VirtualTrigger: ComboboxVirtualTrigger,
499
+ Input: ComboboxInput,
500
+ List: ComboboxList,
501
+ Item: ComboboxItem,
502
+ Arrow: ComboboxArrow,
503
+ Empty: ComboboxEmpty
504
+ };
505
+
71
506
  // src/components/List/ListItem.tsx
507
+ import { attachClosestEdge, extractClosestEdge as extractClosestEdge2 } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge";
72
508
  import { combine } from "@atlaskit/pragmatic-drag-and-drop/combine";
73
509
  import { draggable, dropTargetForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
74
510
  import { setCustomNativeDragPreview } from "@atlaskit/pragmatic-drag-and-drop/element/set-custom-native-drag-preview";
75
- import { attachClosestEdge, extractClosestEdge as extractClosestEdge2 } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge";
76
- import { createContext as createContext4 } from "@radix-ui/react-context";
77
- import React4, { useEffect as useEffect2, useRef, useState as useState2 } from "react";
511
+ import { createContext as createContext6 } from "@radix-ui/react-context";
512
+ import { Slot as Slot2 } from "@radix-ui/react-slot";
513
+ import React6, { useEffect as useEffect3, useRef as useRef2, useState as useState3 } from "react";
78
514
  import { createPortal } from "react-dom";
79
515
  import { invariant } from "@dxos/invariant";
80
516
  import { IconButton, ListItem as NaturalListItem, useTranslation } from "@dxos/react-ui";
81
- import { mx as mx3, osTranslations } from "@dxos/ui-theme";
517
+ import { mx as mx5, osTranslations } from "@dxos/ui-theme";
82
518
 
83
519
  // src/components/List/ListRoot.tsx
84
- import { monitorForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
85
520
  import { extractClosestEdge } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge";
86
521
  import { getReorderDestinationIndex } from "@atlaskit/pragmatic-drag-and-drop-hitbox/util/get-reorder-destination-index";
87
- import { createContext as createContext3 } from "@radix-ui/react-context";
88
- import React3, { useCallback, useEffect, useState } from "react";
522
+ import { monitorForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
523
+ import { createContext as createContext5 } from "@radix-ui/react-context";
524
+ import React5, { useCallback as useCallback3, useEffect as useEffect2, useState as useState2 } from "react";
89
525
  var LIST_NAME = "List";
90
- var [ListProvider, useListContext] = createContext3(LIST_NAME);
526
+ var [ListProvider, useListContext] = createContext5(LIST_NAME);
91
527
  var defaultGetId2 = (item) => item?.id;
92
528
  var ListRoot = ({ children, items, isItem, getId = defaultGetId2, onMove, ...props }) => {
93
- const isEqual = useCallback((a, b) => {
529
+ const isEqual = useCallback3((a, b) => {
94
530
  const idA = getId?.(a);
95
531
  const idB = getId?.(b);
96
532
  if (idA !== void 0 && idB !== void 0) {
@@ -101,8 +537,8 @@ var ListRoot = ({ children, items, isItem, getId = defaultGetId2, onMove, ...pro
101
537
  }, [
102
538
  getId
103
539
  ]);
104
- const [state, setState] = useState(idle);
105
- useEffect(() => {
540
+ const [state, setState] = useState2(idle);
541
+ useEffect2(() => {
106
542
  if (!items) {
107
543
  return;
108
544
  }
@@ -138,7 +574,7 @@ var ListRoot = ({ children, items, isItem, getId = defaultGetId2, onMove, ...pro
138
574
  isEqual,
139
575
  onMove
140
576
  ]);
141
- return /* @__PURE__ */ React3.createElement(ListProvider, {
577
+ return /* @__PURE__ */ React5.createElement(ListProvider, {
142
578
  state,
143
579
  setState,
144
580
  isItem,
@@ -155,27 +591,20 @@ var idle = {
155
591
  type: "idle"
156
592
  };
157
593
  var stateStyles = {
158
- "w-dragging": "opacity-50"
594
+ "is-dragging": "opacity-50"
159
595
  };
160
596
  var defaultContext = {};
161
597
  var LIST_ITEM_NAME = "ListItem";
162
- var [ListItemProvider, useListItemContext] = createContext4(LIST_ITEM_NAME, defaultContext);
163
- var ListItem = ({ children, classNames, item, ...props }) => {
598
+ var [ListItemProvider, useListItemContext] = createContext6(LIST_ITEM_NAME, defaultContext);
599
+ var ListItem = ({ children, classNames, item, asChild, selected, ...props }) => {
600
+ const Comp = asChild ? Slot2 : "div";
164
601
  const { isItem, readonly, dragPreview, setState: setRootState } = useListContext(LIST_ITEM_NAME);
165
- const ref = useRef(null);
166
- const dragHandleRef = useRef(null);
167
- const [state, setState] = useState2(idle);
168
- useEffect2(() => {
169
- const element = ref.current;
170
- invariant(element, void 0, {
171
- F: __dxlog_file,
172
- L: 98,
173
- S: void 0,
174
- A: [
175
- "element",
176
- ""
177
- ]
178
- });
602
+ const rootRef = useRef2(null);
603
+ const dragHandleRef = useRef2(null);
604
+ const [state, setState] = useState3(idle);
605
+ useEffect3(() => {
606
+ const element = rootRef.current;
607
+ invariant(element, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 37, S: void 0, A: ["element", ""] });
179
608
  return combine(
180
609
  //
181
610
  // https://atlassian.design/components/pragmatic-drag-and-drop/core-package/adapters/element/about#draggable
@@ -214,10 +643,10 @@ var ListItem = ({ children, classNames, item, ...props }) => {
214
643
  } : void 0,
215
644
  onDragStart: () => {
216
645
  setState({
217
- type: "w-dragging"
646
+ type: "is-dragging"
218
647
  });
219
648
  setRootState({
220
- type: "w-dragging",
649
+ type: "is-dragging",
221
650
  item
222
651
  });
223
652
  },
@@ -248,7 +677,7 @@ var ListItem = ({ children, classNames, item, ...props }) => {
248
677
  onDragEnter: ({ self }) => {
249
678
  const closestEdge = extractClosestEdge2(self.data);
250
679
  setState({
251
- type: "w-dragging-over",
680
+ type: "is-dragging-over",
252
681
  closestEdge
253
682
  });
254
683
  },
@@ -258,11 +687,11 @@ var ListItem = ({ children, classNames, item, ...props }) => {
258
687
  onDrag: ({ self }) => {
259
688
  const closestEdge = extractClosestEdge2(self.data);
260
689
  setState((current) => {
261
- if (current.type === "w-dragging-over" && current.closestEdge === closestEdge) {
690
+ if (current.type === "is-dragging-over" && current.closestEdge === closestEdge) {
262
691
  return current;
263
692
  }
264
693
  return {
265
- type: "w-dragging-over",
694
+ type: "is-dragging-over",
266
695
  closestEdge
267
696
  };
268
697
  });
@@ -275,43 +704,44 @@ var ListItem = ({ children, classNames, item, ...props }) => {
275
704
  }, [
276
705
  item
277
706
  ]);
278
- return /* @__PURE__ */ React4.createElement(ListItemProvider, {
707
+ return /* @__PURE__ */ React6.createElement(ListItemProvider, {
279
708
  item,
280
709
  dragHandleRef
281
- }, /* @__PURE__ */ React4.createElement("div", {
282
- ref,
710
+ }, /* @__PURE__ */ React6.createElement(Comp, {
711
+ ...props,
283
712
  role: "listitem",
284
- className: mx3("flex relative", classNames, stateStyles[state.type]),
285
- ...props
286
- }, children, state.type === "w-dragging-over" && state.closestEdge && /* @__PURE__ */ React4.createElement(NaturalListItem.DropIndicator, {
713
+ "aria-selected": selected,
714
+ className: mx5("relative p-1 dx-selected dx-hover", classNames, stateStyles[state.type]),
715
+ ref: rootRef
716
+ }, children), state.type === "is-dragging-over" && state.closestEdge && /* @__PURE__ */ React6.createElement(NaturalListItem.DropIndicator, {
287
717
  edge: state.closestEdge
288
- })));
718
+ }));
289
719
  };
290
- var ListItemDeleteButton = ({ autoHide = true, classNames, disabled, icon = "ph--x--regular", label, ...props }) => {
291
- const { state } = useListContext("DELETE_BUTTON");
720
+ var ListItemIconButton = ({ autoHide = true, iconOnly = true, variant = "ghost", classNames, disabled, ...props }) => {
721
+ const { state } = useListContext("ITEM_BUTTON");
292
722
  const isDisabled = state.type !== "idle" || disabled;
293
- const { t } = useTranslation(osTranslations);
294
- return /* @__PURE__ */ React4.createElement(IconButton, {
295
- iconOnly: true,
296
- variant: "ghost",
723
+ return /* @__PURE__ */ React6.createElement(IconButton, {
297
724
  ...props,
298
- icon,
299
725
  disabled: isDisabled,
300
- label: label ?? t("delete label"),
726
+ iconOnly,
727
+ variant,
301
728
  classNames: [
302
729
  classNames,
303
730
  autoHide && disabled && "hidden"
304
731
  ]
305
732
  });
306
733
  };
307
- var ListItemButton = ({ autoHide = true, iconOnly = true, variant = "ghost", classNames, disabled, ...props }) => {
308
- const { state } = useListContext("ITEM_BUTTON");
734
+ var ListItemDeleteButton = ({ autoHide = true, classNames, disabled, icon = "ph--x--regular", label, ...props }) => {
735
+ const { state } = useListContext("DELETE_BUTTON");
309
736
  const isDisabled = state.type !== "idle" || disabled;
310
- return /* @__PURE__ */ React4.createElement(IconButton, {
737
+ const { t } = useTranslation(osTranslations);
738
+ return /* @__PURE__ */ React6.createElement(IconButton, {
311
739
  ...props,
740
+ variant: "ghost",
312
741
  disabled: isDisabled,
313
- iconOnly,
314
- variant,
742
+ icon,
743
+ iconOnly: true,
744
+ label: label ?? t("delete.label"),
315
745
  classNames: [
316
746
  classNames,
317
747
  autoHide && disabled && "hidden"
@@ -321,13 +751,13 @@ var ListItemButton = ({ autoHide = true, iconOnly = true, variant = "ghost", cla
321
751
  var ListItemDragHandle = ({ disabled }) => {
322
752
  const { dragHandleRef } = useListItemContext("DRAG_HANDLE");
323
753
  const { t } = useTranslation(osTranslations);
324
- return /* @__PURE__ */ React4.createElement(IconButton, {
325
- iconOnly: true,
754
+ return /* @__PURE__ */ React6.createElement(IconButton, {
326
755
  variant: "ghost",
327
- label: t("drag handle label"),
328
- ref: dragHandleRef,
756
+ disabled,
329
757
  icon: "ph--dots-six-vertical--regular",
330
- disabled
758
+ iconOnly: true,
759
+ label: t("drag-handle.label"),
760
+ ref: dragHandleRef
331
761
  });
332
762
  };
333
763
  var ListItemDragPreview = ({ children }) => {
@@ -336,11 +766,11 @@ var ListItemDragPreview = ({ children }) => {
336
766
  item: state.item
337
767
  }), state.container) : null;
338
768
  };
339
- var ListItemWrapper = ({ classNames, children }) => /* @__PURE__ */ React4.createElement("div", {
340
- className: mx3("flex w-full gap-2", classNames)
769
+ var ListItemWrapper = ({ classNames, children }) => /* @__PURE__ */ React6.createElement("div", {
770
+ className: mx5("flex w-full gap-2", classNames)
341
771
  }, children);
342
- var ListItemTitle = ({ classNames, children, ...props }) => /* @__PURE__ */ React4.createElement("div", {
343
- className: mx3("flex grow items-center truncate", classNames),
772
+ var ListItemTitle = ({ classNames, children, ...props }) => /* @__PURE__ */ React6.createElement("div", {
773
+ className: mx5("flex grow items-center truncate", classNames),
344
774
  ...props
345
775
  }, children);
346
776
 
@@ -351,33 +781,252 @@ var List = {
351
781
  ItemDragPreview: ListItemDragPreview,
352
782
  ItemWrapper: ListItemWrapper,
353
783
  ItemDragHandle: ListItemDragHandle,
784
+ ItemIconButton: ListItemIconButton,
354
785
  ItemDeleteButton: ListItemDeleteButton,
355
- ItemButton: ListItemButton,
356
786
  ItemTitle: ListItemTitle
357
787
  };
358
788
 
789
+ // src/components/Listbox/Listbox.tsx
790
+ import { createContextScope as createContextScope2 } from "@radix-ui/react-context";
791
+ import React8, { forwardRef as forwardRef3 } from "react";
792
+ import { Icon as Icon3 } from "@dxos/react-ui";
793
+ import { mx as mx6 } from "@dxos/ui-theme";
794
+
795
+ // src/components/RowList/RowList.tsx
796
+ import { useArrowNavigationGroup } from "@fluentui/react-tabster";
797
+ import { createContextScope } from "@radix-ui/react-context";
798
+ import { useControllableState as useControllableState2 } from "@radix-ui/react-use-controllable-state";
799
+ import React7, { useCallback as useCallback4 } from "react";
800
+ import { List as List2, ListItem as ListItem2 } from "@dxos/react-list";
801
+ import { ScrollArea as ScrollArea2 } from "@dxos/react-ui";
802
+ import { composable as composable2, composableProps as composableProps2 } from "@dxos/ui-theme";
803
+ var ROW_LIST_NAME = "RowList";
804
+ var ROW_LIST_ROOT_NAME = "RowList.Root";
805
+ var ROW_LIST_VIEWPORT_NAME = "RowList.Viewport";
806
+ var ROW_LIST_CONTENT_NAME = "RowList.Content";
807
+ var ROW_NAME = "List.Row";
808
+ var [createRowListContext, createRowListScope] = createContextScope(ROW_LIST_NAME, []);
809
+ var [RowListProvider, useRowListContext] = createRowListContext(ROW_LIST_NAME);
810
+ var Root2 = ({ selectedId, defaultSelectedId, onSelectChange, children }) => {
811
+ const [resolved, setResolved] = useControllableState2({
812
+ prop: selectedId,
813
+ defaultProp: defaultSelectedId,
814
+ onChange: (next) => {
815
+ if (next !== void 0) {
816
+ onSelectChange?.(next);
817
+ }
818
+ }
819
+ });
820
+ const setSelected = useCallback4((id) => setResolved(id), [
821
+ setResolved
822
+ ]);
823
+ return /* @__PURE__ */ React7.createElement(RowListProvider, {
824
+ scope: void 0,
825
+ selectedId: resolved,
826
+ setSelected
827
+ }, children);
828
+ };
829
+ Root2.displayName = ROW_LIST_ROOT_NAME;
830
+ var Viewport = composable2((props, forwardedRef) => {
831
+ const { thin, padding, centered, children, ...rest } = props;
832
+ return /* @__PURE__ */ React7.createElement(ScrollArea2.Root, {
833
+ ...composableProps2(rest, {
834
+ classNames: "dx-container"
835
+ }),
836
+ thin,
837
+ padding,
838
+ centered,
839
+ orientation: "vertical",
840
+ ref: forwardedRef
841
+ }, /* @__PURE__ */ React7.createElement(ScrollArea2.Viewport, null, children));
842
+ });
843
+ Viewport.displayName = ROW_LIST_VIEWPORT_NAME;
844
+ var firstEnabledOption = (ul) => {
845
+ if (!ul) {
846
+ return null;
847
+ }
848
+ return ul.querySelector('[role="option"]:not([aria-disabled="true"])');
849
+ };
850
+ var Content2 = composable2((props, forwardedRef) => {
851
+ useRowListContext(ROW_LIST_CONTENT_NAME, void 0);
852
+ const arrowGroup = useArrowNavigationGroup({
853
+ axis: "vertical",
854
+ memorizeCurrent: true
855
+ });
856
+ const { children, ...rest } = props;
857
+ const handleFocus = useCallback4((event) => {
858
+ if (event.target !== event.currentTarget) {
859
+ return;
860
+ }
861
+ const ul = event.currentTarget;
862
+ const selected = ul.querySelector('[role="option"][aria-selected="true"]:not([aria-disabled="true"])');
863
+ const target = selected ?? firstEnabledOption(ul);
864
+ target?.focus();
865
+ }, []);
866
+ const composed = composableProps2(rest, {
867
+ classNames: "flex flex-col"
868
+ });
869
+ return /* @__PURE__ */ React7.createElement(List2, {
870
+ variant: "unordered",
871
+ ...composed,
872
+ ...arrowGroup,
873
+ role: "listbox",
874
+ onFocus: handleFocus,
875
+ ref: forwardedRef
876
+ }, children);
877
+ });
878
+ Content2.displayName = ROW_LIST_CONTENT_NAME;
879
+ var ROW_BASE = "dx-hover dx-selected px-3 py-2 cursor-pointer outline-none";
880
+ var Row = composable2((props, forwardedRef) => {
881
+ const { id, disabled, onClick, onFocus, children, ...rest } = props;
882
+ const { selectedId, setSelected } = useRowListContext(ROW_NAME, void 0);
883
+ const isSelected = selectedId === id;
884
+ const handleClick = useCallback4((event) => {
885
+ if (disabled) {
886
+ return;
887
+ }
888
+ setSelected(id);
889
+ onClick?.(event);
890
+ }, [
891
+ disabled,
892
+ id,
893
+ setSelected,
894
+ onClick
895
+ ]);
896
+ const handleFocus = useCallback4((event) => {
897
+ if (!disabled && selectedId !== id) {
898
+ setSelected(id);
899
+ }
900
+ onFocus?.(event);
901
+ }, [
902
+ disabled,
903
+ selectedId,
904
+ id,
905
+ setSelected,
906
+ onFocus
907
+ ]);
908
+ const composed = composableProps2(rest, {
909
+ classNames: [
910
+ ROW_BASE,
911
+ disabled && "opacity-50 cursor-not-allowed"
912
+ ]
913
+ });
914
+ return /* @__PURE__ */ React7.createElement(ListItem2, {
915
+ ...composed,
916
+ role: "option",
917
+ tabIndex: 0,
918
+ "aria-selected": isSelected,
919
+ "aria-disabled": disabled || void 0,
920
+ onClick: handleClick,
921
+ onFocus: handleFocus,
922
+ ref: forwardedRef
923
+ }, children);
924
+ });
925
+ Row.displayName = ROW_NAME;
926
+ var useRowListSelection = (id) => {
927
+ const { selectedId } = useRowListContext("useRowListSelection", void 0);
928
+ return selectedId === id;
929
+ };
930
+ var RowList = {
931
+ Root: Root2,
932
+ Viewport,
933
+ Content: Content2
934
+ };
935
+
936
+ // src/components/Listbox/Listbox.tsx
937
+ var commandItem = "flex items-center overflow-hidden";
938
+ var LISTBOX_NAME = "Listbox";
939
+ var LISTBOX_OPTION_NAME = "ListboxOption";
940
+ var LISTBOX_OPTION_LABEL_NAME = "ListboxOptionLabel";
941
+ var LISTBOX_OPTION_INDICATOR_NAME = "ListboxOptionIndicator";
942
+ var [createListboxContext, createListboxScope] = createContextScope2(LISTBOX_NAME, [
943
+ createRowListScope
944
+ ]);
945
+ var [createListboxOptionContext, createListboxOptionScope] = createContextScope2(LISTBOX_OPTION_NAME, [
946
+ createListboxScope
947
+ ]);
948
+ var [ListboxOptionProvider, useListboxOptionContext] = createListboxOptionContext(LISTBOX_OPTION_NAME);
949
+ var ListboxRoot = /* @__PURE__ */ forwardRef3((props, forwardedRef) => {
950
+ const { __listboxScope: _scope, children, classNames, value, defaultValue, onValueChange, autoFocus: _autoFocus, ...rootProps } = props;
951
+ return /* @__PURE__ */ React8.createElement(RowList.Root, {
952
+ selectedId: value,
953
+ defaultSelectedId: defaultValue,
954
+ onSelectChange: onValueChange
955
+ }, /* @__PURE__ */ React8.createElement(RowList.Content, {
956
+ ...rootProps,
957
+ classNames: mx6("w-full", classNames),
958
+ ref: forwardedRef
959
+ }, children));
960
+ });
961
+ ListboxRoot.displayName = LISTBOX_NAME;
962
+ var ListboxOption = /* @__PURE__ */ forwardRef3((props, forwardedRef) => {
963
+ const { __listboxScope, children, classNames, value, ...rootProps } = props;
964
+ return /* @__PURE__ */ React8.createElement(Row, {
965
+ id: value,
966
+ ...rootProps,
967
+ classNames: mx6("dx-focus-ring rounded-xs", commandItem, classNames),
968
+ ref: forwardedRef
969
+ }, /* @__PURE__ */ React8.createElement(ListboxOptionProviderHost, {
970
+ value
971
+ }, children));
972
+ });
973
+ ListboxOption.displayName = LISTBOX_OPTION_NAME;
974
+ var ListboxOptionProviderHost = ({ value, children }) => {
975
+ const isSelected = useRowListSelection(value);
976
+ return /* @__PURE__ */ React8.createElement(ListboxOptionProvider, {
977
+ scope: void 0,
978
+ value,
979
+ isSelected
980
+ }, children);
981
+ };
982
+ var ListboxOptionLabel = /* @__PURE__ */ forwardRef3(({ children, classNames, ...rootProps }, forwardedRef) => {
983
+ return /* @__PURE__ */ React8.createElement("span", {
984
+ ...rootProps,
985
+ className: mx6("grow truncate", classNames),
986
+ ref: forwardedRef
987
+ }, children);
988
+ });
989
+ ListboxOptionLabel.displayName = LISTBOX_OPTION_LABEL_NAME;
990
+ var ListboxOptionIndicator = /* @__PURE__ */ forwardRef3((props, forwardedRef) => {
991
+ const { __listboxOptionScope, classNames, ...rootProps } = props;
992
+ const { isSelected } = useListboxOptionContext(LISTBOX_OPTION_INDICATOR_NAME, __listboxOptionScope);
993
+ return /* @__PURE__ */ React8.createElement(Icon3, {
994
+ icon: "ph--check--regular",
995
+ ...rootProps,
996
+ classNames: mx6(!isSelected && "invisible", classNames),
997
+ ref: forwardedRef
998
+ });
999
+ });
1000
+ ListboxOptionIndicator.displayName = LISTBOX_OPTION_INDICATOR_NAME;
1001
+ var Listbox = {
1002
+ Root: ListboxRoot,
1003
+ Option: ListboxOption,
1004
+ OptionLabel: ListboxOptionLabel,
1005
+ OptionIndicator: ListboxOptionIndicator
1006
+ };
1007
+
359
1008
  // src/components/Tree/Tree.tsx
360
1009
  import { useAtomValue as useAtomValue2 } from "@effect-atom/atom-react";
361
- import React8, { useMemo as useMemo2 } from "react";
1010
+ import React12, { useMemo as useMemo3 } from "react";
362
1011
  import { Treegrid as Treegrid2 } from "@dxos/react-ui";
363
1012
 
364
1013
  // src/components/Tree/TreeContext.tsx
365
- import { createContext as createContext5, useContext } from "react";
1014
+ import { createContext as createContext7, useContext } from "react";
366
1015
  import { raise } from "@dxos/debug";
367
- var TreeContext = /* @__PURE__ */ createContext5(null);
1016
+ var TreeContext = /* @__PURE__ */ createContext7(null);
368
1017
  var TreeProvider = TreeContext.Provider;
369
1018
  var useTree = () => useContext(TreeContext) ?? raise(new Error("TreeContext not found"));
370
1019
 
371
1020
  // src/components/Tree/TreeItem.tsx
1021
+ import { attachInstruction, extractInstruction } from "@atlaskit/pragmatic-drag-and-drop-hitbox/tree-item";
372
1022
  import { combine as combine2 } from "@atlaskit/pragmatic-drag-and-drop/combine";
373
1023
  import { draggable as draggable2, dropTargetForElements as dropTargetForElements2 } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
374
- import { attachInstruction, extractInstruction } from "@atlaskit/pragmatic-drag-and-drop-hitbox/tree-item";
375
1024
  import { useAtomValue } from "@effect-atom/atom-react";
376
1025
  import * as Schema from "effect/Schema";
377
- import React7, { memo as memo3, useCallback as useCallback3, useEffect as useEffect3, useMemo, useRef as useRef2, useState as useState3 } from "react";
1026
+ import React11, { memo as memo3, useCallback as useCallback6, useEffect as useEffect4, useMemo as useMemo2, useRef as useRef3, useState as useState4 } from "react";
378
1027
  import { invariant as invariant2 } from "@dxos/invariant";
379
- import { TreeItem as NaturalTreeItem, Treegrid } from "@dxos/react-ui";
380
- import { ghostFocusWithin, ghostHover, hoverableControls, hoverableFocusedKeyboardControls, hoverableFocusedWithinControls, mx as mx4 } from "@dxos/ui-theme";
1028
+ import { TreeItem as NaturalTreeItem, Treegrid, TREEGRID_PARENT_OF_SEPARATOR } from "@dxos/react-ui";
1029
+ import { ghostFocusWithin, ghostHover, hoverableControls, hoverableFocusedKeyboardControls, hoverableFocusedWithinControls, mx as mx7 } from "@dxos/ui-theme";
381
1030
 
382
1031
  // src/components/Tree/helpers.ts
383
1032
  var DEFAULT_INDENTATION = 8;
@@ -386,19 +1035,19 @@ var paddingIndentation = (level, indentation = DEFAULT_INDENTATION) => ({
386
1035
  });
387
1036
 
388
1037
  // src/components/Tree/TreeItemHeading.tsx
389
- import React5, { forwardRef, memo, useCallback as useCallback2 } from "react";
390
- import { Button, Icon as Icon2, toLocalizedString, useTranslation as useTranslation2 } from "@dxos/react-ui";
1038
+ import React9, { forwardRef as forwardRef4, memo, useCallback as useCallback5 } from "react";
1039
+ import { Button as Button2, Icon as Icon4, toLocalizedString, useTranslation as useTranslation2 } from "@dxos/react-ui";
391
1040
  import { TextTooltip } from "@dxos/react-ui-text-tooltip";
392
1041
  import { getStyles } from "@dxos/ui-theme";
393
- var TreeItemHeading = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef(({ label, className, icon, iconHue, disabled, current, onSelect }, forwardedRef) => {
1042
+ var TreeItemHeading = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef4(({ label, className, icon, iconHue, disabled, current, onSelect }, forwardedRef) => {
394
1043
  const { t } = useTranslation2();
395
1044
  const styles = iconHue ? getStyles(iconHue) : void 0;
396
- const handleSelect = useCallback2((event) => {
1045
+ const handleSelect = useCallback5((event) => {
397
1046
  onSelect?.(event.altKey);
398
1047
  }, [
399
1048
  onSelect
400
1049
  ]);
401
- const handleButtonKeydown = useCallback2((event) => {
1050
+ const handleButtonKeydown = useCallback5((event) => {
402
1051
  if (event.key === " " || event.key === "Enter") {
403
1052
  event.preventDefault();
404
1053
  event.stopPropagation();
@@ -407,17 +1056,16 @@ var TreeItemHeading = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef(({ label,
407
1056
  }, [
408
1057
  onSelect
409
1058
  ]);
410
- return /* @__PURE__ */ React5.createElement(TextTooltip, {
1059
+ return /* @__PURE__ */ React9.createElement(TextTooltip, {
411
1060
  text: toLocalizedString(label, t),
412
1061
  side: "bottom",
413
1062
  truncateQuery: "span[data-tooltip]",
414
1063
  onlyWhenTruncating: true,
415
1064
  asChild: true,
416
1065
  ref: forwardedRef
417
- }, /* @__PURE__ */ React5.createElement(Button, {
1066
+ }, /* @__PURE__ */ React9.createElement(Button2, {
418
1067
  "data-testid": "treeItem.heading",
419
1068
  variant: "ghost",
420
- density: "fine",
421
1069
  classNames: [
422
1070
  "grow gap-2 ps-0.5 hover:bg-transparent dark:hover:bg-transparent",
423
1071
  "disabled:cursor-default disabled:opacity-100",
@@ -429,24 +1077,24 @@ var TreeItemHeading = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef(({ label,
429
1077
  ...current && {
430
1078
  "aria-current": "location"
431
1079
  }
432
- }, icon && /* @__PURE__ */ React5.createElement(Icon2, {
433
- icon: icon ?? "ph--placeholder--regular",
1080
+ }, icon && /* @__PURE__ */ React9.createElement(Icon4, {
434
1081
  size: 5,
1082
+ icon: icon ?? "ph--placeholder--regular",
435
1083
  classNames: [
436
1084
  "my-1",
437
- styles?.surfaceText
1085
+ styles?.foreground
438
1086
  ]
439
- }), /* @__PURE__ */ React5.createElement("span", {
1087
+ }), /* @__PURE__ */ React9.createElement("span", {
440
1088
  className: "flex-1 w-0 truncate text-start font-normal",
441
1089
  "data-tooltip": true
442
1090
  }, toLocalizedString(label, t))));
443
1091
  }));
444
1092
 
445
1093
  // src/components/Tree/TreeItemToggle.tsx
446
- import React6, { forwardRef as forwardRef2, memo as memo2 } from "react";
1094
+ import React10, { forwardRef as forwardRef5, memo as memo2 } from "react";
447
1095
  import { IconButton as IconButton2 } from "@dxos/react-ui";
448
- var TreeItemToggle = /* @__PURE__ */ memo2(/* @__PURE__ */ forwardRef2(({ open, isBranch, hidden, classNames, ...props }, forwardedRef) => {
449
- return /* @__PURE__ */ React6.createElement(IconButton2, {
1096
+ var TreeItemToggle = /* @__PURE__ */ memo2(/* @__PURE__ */ forwardRef5(({ classNames, open, isBranch, hidden, ...props }, forwardedRef) => {
1097
+ return /* @__PURE__ */ React10.createElement(IconButton2, {
450
1098
  ref: forwardedRef,
451
1099
  "data-testid": "treeItem.toggle",
452
1100
  "aria-expanded": open,
@@ -454,8 +1102,8 @@ var TreeItemToggle = /* @__PURE__ */ memo2(/* @__PURE__ */ forwardRef2(({ open,
454
1102
  density: "fine",
455
1103
  classNames: [
456
1104
  "h-full w-6 px-0",
457
- "[&_svg]:transition-[transform] [&_svg]:duration-200",
458
- open && "[&_svg]:rotate-90",
1105
+ "[&_svg]:transition-transform [&_svg]:duration-200",
1106
+ open ? "[&_svg]:rotate-90" : "[&_svg]:rotate-0",
459
1107
  hidden ? "hidden" : !isBranch && "invisible",
460
1108
  classNames
461
1109
  ],
@@ -479,22 +1127,22 @@ var TreeDataSchema = Schema.Struct({
479
1127
  });
480
1128
  var isTreeData = (data) => Schema.is(TreeDataSchema)(data);
481
1129
  var RawTreeItem = ({ item, path: pathProp, levelOffset = 2, last, draggable: draggableProp, renderColumns: Columns, blockInstruction, canDrop, canSelect, onOpenChange, onSelect, onItemHover }) => {
482
- const rowRef = useRef2(null);
483
- const buttonRef = useRef2(null);
484
- const openRef = useRef2(false);
485
- const cancelExpandRef = useRef2(null);
486
- const [_state, setState] = useState3("idle");
487
- const [instruction, setInstruction] = useState3(null);
488
- const [menuOpen, setMenuOpen] = useState3(false);
1130
+ const rowRef = useRef3(null);
1131
+ const buttonRef = useRef3(null);
1132
+ const openRef = useRef3(false);
1133
+ const cancelExpandRef = useRef3(null);
1134
+ const [_state, setState] = useState4("idle");
1135
+ const [instruction, setInstruction] = useState4(null);
1136
+ const [menuOpen, setMenuOpen] = useState4(false);
489
1137
  const { itemProps: itemPropsAtom, childIds: childIdsAtom, itemOpen: itemOpenAtom, itemCurrent: itemCurrentAtom } = useTree();
490
- const path = useMemo(() => [
1138
+ const path = useMemo2(() => [
491
1139
  ...pathProp,
492
1140
  item.id
493
1141
  ], [
494
1142
  pathProp,
495
1143
  item.id
496
1144
  ]);
497
- const { id, parentOf, label, className, headingClassName, icon, iconHue, disabled, testId } = useAtomValue(itemPropsAtom(path));
1145
+ const { id, parentOf, draggable: itemDraggable, droppable: itemDroppable, label, className, headingClassName, icon, iconHue, disabled, testId } = useAtomValue(itemPropsAtom(path));
498
1146
  const childIds = useAtomValue(childIdsAtom(item.id));
499
1147
  const open = useAtomValue(itemOpenAtom(path));
500
1148
  const current = useAtomValue(itemCurrentAtom(path));
@@ -510,117 +1158,127 @@ var RawTreeItem = ({ item, path: pathProp, levelOffset = 2, last, draggable: dra
510
1158
  path,
511
1159
  item
512
1160
  };
513
- const cancelExpand = useCallback3(() => {
1161
+ const shouldSeedNativeDragData = typeof document !== "undefined" && document.body.hasAttribute("data-platform");
1162
+ const cancelExpand = useCallback6(() => {
514
1163
  if (cancelExpandRef.current) {
515
1164
  clearTimeout(cancelExpandRef.current);
516
1165
  cancelExpandRef.current = null;
517
1166
  }
518
1167
  }, []);
519
- useEffect3(() => {
1168
+ const isItemDraggable = draggableProp && itemDraggable !== false;
1169
+ const isItemDroppable = itemDroppable !== false;
1170
+ const nativeDragText = id;
1171
+ useEffect4(() => {
520
1172
  if (!draggableProp) {
521
1173
  return;
522
1174
  }
523
- invariant2(buttonRef.current, void 0, {
524
- F: __dxlog_file2,
525
- L: 135,
526
- S: void 0,
527
- A: [
528
- "buttonRef.current",
529
- ""
530
- ]
531
- });
532
- return combine2(
533
- draggable2({
534
- element: buttonRef.current,
535
- getInitialData: () => data,
536
- onDragStart: () => {
537
- setState("dragging");
538
- if (open) {
539
- openRef.current = true;
540
- onOpenChange?.({
541
- item,
542
- path,
543
- open: false
544
- });
545
- }
546
- },
547
- onDrop: () => {
548
- setState("idle");
549
- if (openRef.current) {
550
- onOpenChange?.({
551
- item,
552
- path,
553
- open: true
554
- });
555
- }
1175
+ invariant2(buttonRef.current, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 70, S: void 0, A: ["buttonRef.current", ""] });
1176
+ const makeDraggable = () => draggable2({
1177
+ element: buttonRef.current,
1178
+ getInitialData: () => data,
1179
+ getInitialDataForExternal: () => {
1180
+ if (!shouldSeedNativeDragData) {
1181
+ return {};
556
1182
  }
557
- }),
558
- // https://github.com/atlassian/pragmatic-drag-and-drop/blob/main/packages/hitbox/constellation/index/about.mdx
559
- dropTargetForElements2({
560
- element: buttonRef.current,
561
- getData: ({ input, element }) => {
562
- return attachInstruction(data, {
563
- input,
564
- element,
565
- indentPerLevel: DEFAULT_INDENTATION,
566
- currentLevel: level,
567
- mode,
568
- block: isBranch ? [] : [
569
- "make-child"
570
- ]
1183
+ return {
1184
+ "text/plain": nativeDragText
1185
+ };
1186
+ },
1187
+ onDragStart: () => {
1188
+ setState("dragging");
1189
+ if (open) {
1190
+ openRef.current = true;
1191
+ onOpenChange?.({
1192
+ item,
1193
+ path,
1194
+ open: false
571
1195
  });
572
- },
573
- canDrop: ({ source }) => {
574
- const _canDrop = canDrop ?? (() => true);
575
- return source.element !== buttonRef.current && _canDrop({
576
- source: source.data,
577
- target: data
578
- });
579
- },
580
- getIsSticky: () => true,
581
- onDrag: ({ self, source }) => {
582
- const desired = extractInstruction(self.data);
583
- const block = desired && blockInstruction?.({
584
- instruction: desired,
585
- source: source.data,
586
- target: data
1196
+ }
1197
+ },
1198
+ onDrop: () => {
1199
+ setState("idle");
1200
+ if (openRef.current) {
1201
+ onOpenChange?.({
1202
+ item,
1203
+ path,
1204
+ open: true
587
1205
  });
588
- const instruction2 = block && desired.type !== "instruction-blocked" ? {
589
- type: "instruction-blocked",
590
- desired
591
- } : desired;
592
- if (source.data.id !== id) {
593
- if (instruction2?.type === "make-child" && isBranch && !open && !cancelExpandRef.current) {
594
- cancelExpandRef.current = setTimeout(() => {
595
- onOpenChange?.({
596
- item,
597
- path,
598
- open: true
599
- });
600
- }, 500);
601
- }
602
- if (instruction2?.type !== "make-child") {
603
- cancelExpand();
604
- }
605
- setInstruction(instruction2);
606
- } else if (instruction2?.type === "reparent") {
607
- setInstruction(instruction2);
608
- } else {
609
- setInstruction(null);
1206
+ }
1207
+ }
1208
+ });
1209
+ if (!isItemDroppable) {
1210
+ return isItemDraggable ? makeDraggable() : void 0;
1211
+ }
1212
+ const dropTarget = dropTargetForElements2({
1213
+ element: buttonRef.current,
1214
+ getData: ({ input, element }) => {
1215
+ return attachInstruction(data, {
1216
+ input,
1217
+ element,
1218
+ indentPerLevel: DEFAULT_INDENTATION,
1219
+ currentLevel: level,
1220
+ mode,
1221
+ block: isBranch ? [] : [
1222
+ "make-child"
1223
+ ]
1224
+ });
1225
+ },
1226
+ canDrop: ({ source }) => {
1227
+ const _canDrop = canDrop ?? (() => true);
1228
+ return source.element !== buttonRef.current && _canDrop({
1229
+ source: source.data,
1230
+ target: data
1231
+ });
1232
+ },
1233
+ getIsSticky: () => true,
1234
+ onDrag: ({ self, source }) => {
1235
+ const desired = extractInstruction(self.data);
1236
+ const block = desired && blockInstruction?.({
1237
+ instruction: desired,
1238
+ source: source.data,
1239
+ target: data
1240
+ });
1241
+ const instruction2 = block && desired.type !== "instruction-blocked" ? {
1242
+ type: "instruction-blocked",
1243
+ desired
1244
+ } : desired;
1245
+ if (source.data.id !== id) {
1246
+ if (instruction2?.type === "make-child" && isBranch && !open && !cancelExpandRef.current) {
1247
+ cancelExpandRef.current = setTimeout(() => {
1248
+ onOpenChange?.({
1249
+ item,
1250
+ path,
1251
+ open: true
1252
+ });
1253
+ }, 500);
610
1254
  }
611
- },
612
- onDragLeave: () => {
613
- cancelExpand();
614
- setInstruction(null);
615
- },
616
- onDrop: () => {
617
- cancelExpand();
1255
+ if (instruction2?.type !== "make-child") {
1256
+ cancelExpand();
1257
+ }
1258
+ setInstruction(instruction2);
1259
+ } else if (instruction2?.type === "reparent") {
1260
+ setInstruction(instruction2);
1261
+ } else {
618
1262
  setInstruction(null);
619
1263
  }
620
- })
621
- );
1264
+ },
1265
+ onDragLeave: () => {
1266
+ cancelExpand();
1267
+ setInstruction(null);
1268
+ },
1269
+ onDrop: () => {
1270
+ cancelExpand();
1271
+ setInstruction(null);
1272
+ }
1273
+ });
1274
+ if (!isItemDraggable) {
1275
+ return dropTarget;
1276
+ }
1277
+ return combine2(makeDraggable(), dropTarget);
622
1278
  }, [
623
1279
  draggableProp,
1280
+ isItemDraggable,
1281
+ isItemDroppable,
624
1282
  item,
625
1283
  id,
626
1284
  mode,
@@ -629,10 +1287,10 @@ var RawTreeItem = ({ item, path: pathProp, levelOffset = 2, last, draggable: dra
629
1287
  blockInstruction,
630
1288
  canDrop
631
1289
  ]);
632
- useEffect3(() => () => cancelExpand(), [
1290
+ useEffect4(() => () => cancelExpand(), [
633
1291
  cancelExpand
634
1292
  ]);
635
- const handleOpenToggle = useCallback3(() => onOpenChange?.({
1293
+ const handleOpenToggle = useCallback6(() => onOpenChange?.({
636
1294
  item,
637
1295
  path,
638
1296
  open: !open
@@ -642,7 +1300,7 @@ var RawTreeItem = ({ item, path: pathProp, levelOffset = 2, last, draggable: dra
642
1300
  path,
643
1301
  open
644
1302
  ]);
645
- const handleSelect = useCallback3((option = false) => {
1303
+ const handleSelect = useCallback6((option = false) => {
646
1304
  if (isBranch && (option || current)) {
647
1305
  handleOpenToggle();
648
1306
  } else if (canSelectItem) {
@@ -667,7 +1325,7 @@ var RawTreeItem = ({ item, path: pathProp, levelOffset = 2, last, draggable: dra
667
1325
  handleOpenToggle,
668
1326
  onSelect
669
1327
  ]);
670
- const handleKeyDown = useCallback3((event) => {
1328
+ const handleKeyDown = useCallback6((event) => {
671
1329
  switch (event.key) {
672
1330
  case "ArrowRight":
673
1331
  case "ArrowLeft":
@@ -680,7 +1338,7 @@ var RawTreeItem = ({ item, path: pathProp, levelOffset = 2, last, draggable: dra
680
1338
  handleOpenToggle,
681
1339
  handleSelect
682
1340
  ]);
683
- const handleItemHover = useCallback3(() => {
1341
+ const handleItemHover = useCallback6(() => {
684
1342
  onItemHover?.({
685
1343
  item
686
1344
  });
@@ -688,7 +1346,7 @@ var RawTreeItem = ({ item, path: pathProp, levelOffset = 2, last, draggable: dra
688
1346
  onItemHover,
689
1347
  item
690
1348
  ]);
691
- const handleContextMenu = useCallback3((event) => {
1349
+ const handleContextMenu = useCallback6((event) => {
692
1350
  event.preventDefault();
693
1351
  setMenuOpen(true);
694
1352
  }, [
@@ -704,33 +1362,32 @@ var RawTreeItem = ({ item, path: pathProp, levelOffset = 2, last, draggable: dra
704
1362
  onOpenChange,
705
1363
  onSelect
706
1364
  };
707
- return /* @__PURE__ */ React7.createElement(React7.Fragment, null, /* @__PURE__ */ React7.createElement(Treegrid.Row, {
1365
+ return /* @__PURE__ */ React11.createElement(React11.Fragment, null, /* @__PURE__ */ React11.createElement(Treegrid.Row, {
708
1366
  ref: rowRef,
709
1367
  key: id,
710
1368
  id,
711
1369
  "aria-labelledby": `${id}__label`,
712
- parentOf: parentOf?.join(Treegrid.PARENT_OF_SEPARATOR),
1370
+ parentOf: parentOf?.join(TREEGRID_PARENT_OF_SEPARATOR),
713
1371
  "data-object-id": id,
714
1372
  "data-testid": testId,
715
1373
  // NOTE(thure): This is intentionally an empty string to for descendents to select by in the CSS
716
1374
  // without alerting the user (except for in the correct link element). See also:
717
1375
  // https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-current#description
718
1376
  "aria-current": current ? "" : void 0,
719
- classNames: mx4("grid grid-cols-subgrid col-[tree-row] mt-0.5 is-current:bg-active-surface", hoverableControls, hoverableFocusedKeyboardControls, hoverableFocusedWithinControls, hoverableDescriptionIcons, ghostFocusWithin, ghostHover, className),
1377
+ classNames: mx7("grid grid-cols-subgrid col-[tree-row] mt-0.5 is-current:bg-current-surface", hoverableControls, hoverableFocusedKeyboardControls, hoverableFocusedWithinControls, hoverableDescriptionIcons, ghostFocusWithin, ghostHover, className),
720
1378
  onKeyDown: handleKeyDown,
721
1379
  onMouseEnter: handleItemHover,
722
1380
  onContextMenu: handleContextMenu
723
- }, /* @__PURE__ */ React7.createElement("div", {
724
- role: "none",
1381
+ }, /* @__PURE__ */ React11.createElement("div", {
725
1382
  className: "indent relative grid grid-cols-subgrid col-[tree-row]",
726
1383
  style: paddingIndentation(level)
727
- }, /* @__PURE__ */ React7.createElement(Treegrid.Cell, {
1384
+ }, /* @__PURE__ */ React11.createElement(Treegrid.Cell, {
728
1385
  classNames: "flex items-center"
729
- }, /* @__PURE__ */ React7.createElement(TreeItemToggle, {
1386
+ }, /* @__PURE__ */ React11.createElement(TreeItemToggle, {
730
1387
  isBranch,
731
1388
  open,
732
1389
  onClick: handleOpenToggle
733
- }), /* @__PURE__ */ React7.createElement(TreeItemHeading, {
1390
+ }), /* @__PURE__ */ React11.createElement(TreeItemHeading, {
734
1391
  disabled,
735
1392
  current,
736
1393
  label,
@@ -739,16 +1396,16 @@ var RawTreeItem = ({ item, path: pathProp, levelOffset = 2, last, draggable: dra
739
1396
  iconHue,
740
1397
  onSelect: handleSelect,
741
1398
  ref: buttonRef
742
- })), Columns && /* @__PURE__ */ React7.createElement(Columns, {
1399
+ })), Columns && /* @__PURE__ */ React11.createElement(Columns, {
743
1400
  item,
744
1401
  path,
745
1402
  open,
746
1403
  menuOpen,
747
1404
  setMenuOpen
748
- }), instruction && /* @__PURE__ */ React7.createElement(NaturalTreeItem.DropIndicator, {
1405
+ }), instruction && /* @__PURE__ */ React11.createElement(NaturalTreeItem.DropIndicator, {
749
1406
  instruction,
750
1407
  gap: 2
751
- }))), open && childIds.map((childId, index) => /* @__PURE__ */ React7.createElement(TreeItemById, {
1408
+ }))), open && childIds.map((childId, index) => /* @__PURE__ */ React11.createElement(TreeItemById, {
752
1409
  key: childId,
753
1410
  id: childId,
754
1411
  path,
@@ -763,7 +1420,7 @@ var RawTreeItemById = ({ id, ...props }) => {
763
1420
  if (!item) {
764
1421
  return null;
765
1422
  }
766
- return /* @__PURE__ */ React7.createElement(TreeItem, {
1423
+ return /* @__PURE__ */ React11.createElement(TreeItem, {
767
1424
  item,
768
1425
  ...props
769
1426
  });
@@ -771,9 +1428,9 @@ var RawTreeItemById = ({ id, ...props }) => {
771
1428
  var TreeItemById = /* @__PURE__ */ memo3(RawTreeItemById);
772
1429
 
773
1430
  // src/components/Tree/Tree.tsx
774
- 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 }) => {
1431
+ var Tree = ({ classNames, model, rootId, path, id, draggable: draggable3 = false, gridTemplateColumns = "[tree-row-start] 1fr min-content [tree-row-end]", levelOffset, renderColumns, blockInstruction, canDrop, canSelect, onOpenChange, onSelect, onItemHover }) => {
775
1432
  const childIds = useAtomValue2(model.childIds(rootId));
776
- const treePath = useMemo2(() => path ? [
1433
+ const treePath = useMemo3(() => path ? [
777
1434
  ...path,
778
1435
  id
779
1436
  ] : [
@@ -794,12 +1451,12 @@ var Tree = ({ model, rootId, path, id, draggable: draggable3 = false, gridTempla
794
1451
  onSelect,
795
1452
  onItemHover
796
1453
  };
797
- return /* @__PURE__ */ React8.createElement(Treegrid2.Root, {
1454
+ return /* @__PURE__ */ React12.createElement(Treegrid2.Root, {
798
1455
  gridTemplateColumns,
799
1456
  classNames
800
- }, /* @__PURE__ */ React8.createElement(TreeProvider, {
1457
+ }, /* @__PURE__ */ React12.createElement(TreeProvider, {
801
1458
  value: model
802
- }, childIds.map((childId, index) => /* @__PURE__ */ React8.createElement(TreeItemById, {
1459
+ }, childIds.map((childId, index) => /* @__PURE__ */ React12.createElement(TreeItemById, {
803
1460
  key: childId,
804
1461
  id: childId,
805
1462
  last: index === childIds.length - 1,
@@ -824,17 +1481,27 @@ var Path = {
824
1481
  };
825
1482
  export {
826
1483
  Accordion,
1484
+ Combobox,
827
1485
  DEFAULT_INDENTATION,
828
1486
  List,
1487
+ Listbox,
829
1488
  Path,
1489
+ Picker,
1490
+ Row,
1491
+ RowList,
830
1492
  Tree,
831
1493
  TreeDataSchema,
832
1494
  TreeItem,
833
1495
  TreeItemById,
834
1496
  TreeItemToggle,
835
1497
  TreeProvider,
1498
+ createListboxScope,
1499
+ createRowListScope,
836
1500
  isTreeData,
837
1501
  paddingIndentation,
1502
+ usePickerInputContext,
1503
+ usePickerItemContext,
1504
+ useRowListSelection,
838
1505
  useTree
839
1506
  };
840
1507
  //# sourceMappingURL=index.mjs.map