@dxos/react-ui-list 0.8.4-main.422d1c7879 → 0.8.4-main.4f23b4e393

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 (77) hide show
  1. package/dist/lib/browser/index.mjs +744 -98
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +744 -98
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/components/Accordion/Accordion.d.ts +1 -1
  8. package/dist/types/src/components/Accordion/Accordion.d.ts.map +1 -1
  9. package/dist/types/src/components/Accordion/Accordion.stories.d.ts.map +1 -1
  10. package/dist/types/src/components/Accordion/AccordionItem.d.ts.map +1 -1
  11. package/dist/types/src/components/Accordion/AccordionRoot.d.ts +1 -1
  12. package/dist/types/src/components/Accordion/AccordionRoot.d.ts.map +1 -1
  13. package/dist/types/src/components/Combobox/Combobox.d.ts +105 -0
  14. package/dist/types/src/components/Combobox/Combobox.d.ts.map +1 -0
  15. package/dist/types/src/components/Combobox/Combobox.stories.d.ts +12 -0
  16. package/dist/types/src/components/Combobox/Combobox.stories.d.ts.map +1 -0
  17. package/dist/types/src/components/Combobox/index.d.ts +2 -0
  18. package/dist/types/src/components/Combobox/index.d.ts.map +1 -0
  19. package/dist/types/src/components/List/List.d.ts +14 -5
  20. package/dist/types/src/components/List/List.d.ts.map +1 -1
  21. package/dist/types/src/components/List/List.stories.d.ts +2 -2
  22. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  23. package/dist/types/src/components/List/ListItem.d.ts +3 -3
  24. package/dist/types/src/components/List/ListItem.d.ts.map +1 -1
  25. package/dist/types/src/components/List/ListRoot.d.ts.map +1 -1
  26. package/dist/types/src/components/List/testing.d.ts.map +1 -1
  27. package/dist/types/src/components/Listbox/Listbox.d.ts +27 -0
  28. package/dist/types/src/components/Listbox/Listbox.d.ts.map +1 -0
  29. package/dist/types/src/components/Listbox/Listbox.stories.d.ts +12 -0
  30. package/dist/types/src/components/Listbox/Listbox.stories.d.ts.map +1 -0
  31. package/dist/types/src/components/Listbox/index.d.ts +2 -0
  32. package/dist/types/src/components/Listbox/index.d.ts.map +1 -0
  33. package/dist/types/src/components/Picker/Picker.d.ts +49 -0
  34. package/dist/types/src/components/Picker/Picker.d.ts.map +1 -0
  35. package/dist/types/src/components/Picker/Picker.stories.d.ts +28 -0
  36. package/dist/types/src/components/Picker/Picker.stories.d.ts.map +1 -0
  37. package/dist/types/src/components/Picker/context.d.ts +29 -0
  38. package/dist/types/src/components/Picker/context.d.ts.map +1 -0
  39. package/dist/types/src/components/Picker/index.d.ts +3 -0
  40. package/dist/types/src/components/Picker/index.d.ts.map +1 -0
  41. package/dist/types/src/components/RowList/RowList.d.ts +61 -0
  42. package/dist/types/src/components/RowList/RowList.d.ts.map +1 -0
  43. package/dist/types/src/components/RowList/RowList.stories.d.ts +35 -0
  44. package/dist/types/src/components/RowList/RowList.stories.d.ts.map +1 -0
  45. package/dist/types/src/components/RowList/index.d.ts +3 -0
  46. package/dist/types/src/components/RowList/index.d.ts.map +1 -0
  47. package/dist/types/src/components/Tree/Tree.d.ts.map +1 -1
  48. package/dist/types/src/components/Tree/Tree.stories.d.ts.map +1 -1
  49. package/dist/types/src/components/Tree/TreeItem.d.ts.map +1 -1
  50. package/dist/types/src/components/Tree/TreeItemHeading.d.ts.map +1 -1
  51. package/dist/types/src/components/Tree/helpers.d.ts.map +1 -1
  52. package/dist/types/src/components/Tree/testing.d.ts.map +1 -1
  53. package/dist/types/src/components/index.d.ts +4 -0
  54. package/dist/types/src/components/index.d.ts.map +1 -1
  55. package/dist/types/src/util/path.d.ts.map +1 -1
  56. package/dist/types/tsconfig.tsbuildinfo +1 -1
  57. package/package.json +18 -15
  58. package/src/components/Accordion/AccordionItem.tsx +1 -3
  59. package/src/components/Combobox/Combobox.stories.tsx +60 -0
  60. package/src/components/Combobox/Combobox.tsx +387 -0
  61. package/src/components/Combobox/index.ts +5 -0
  62. package/src/components/List/List.stories.tsx +2 -2
  63. package/src/components/List/List.tsx +11 -2
  64. package/src/components/List/ListItem.tsx +2 -4
  65. package/src/components/Listbox/Listbox.stories.tsx +48 -0
  66. package/src/components/Listbox/Listbox.tsx +201 -0
  67. package/src/components/Listbox/index.ts +5 -0
  68. package/src/components/Picker/Picker.stories.tsx +131 -0
  69. package/src/components/Picker/Picker.tsx +368 -0
  70. package/src/components/Picker/context.ts +43 -0
  71. package/src/components/Picker/index.ts +6 -0
  72. package/src/components/RowList/RowList.stories.tsx +163 -0
  73. package/src/components/RowList/RowList.tsx +350 -0
  74. package/src/components/RowList/index.ts +6 -0
  75. package/src/components/Tree/TreeItem.tsx +2 -6
  76. package/src/components/Tree/TreeItemHeading.tsx +3 -1
  77. 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,30 +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
72
507
  import { attachClosestEdge, extractClosestEdge as extractClosestEdge2 } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge";
73
508
  import { combine } from "@atlaskit/pragmatic-drag-and-drop/combine";
74
509
  import { draggable, dropTargetForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
75
510
  import { setCustomNativeDragPreview } from "@atlaskit/pragmatic-drag-and-drop/element/set-custom-native-drag-preview";
76
- import { createContext as createContext4 } from "@radix-ui/react-context";
77
- import { Slot } from "@radix-ui/react-slot";
78
- 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";
79
514
  import { createPortal } from "react-dom";
80
515
  import { invariant } from "@dxos/invariant";
81
516
  import { IconButton, ListItem as NaturalListItem, useTranslation } from "@dxos/react-ui";
82
- import { mx as mx3, osTranslations } from "@dxos/ui-theme";
517
+ import { mx as mx5, osTranslations } from "@dxos/ui-theme";
83
518
 
84
519
  // src/components/List/ListRoot.tsx
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
522
  import { monitorForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
88
- import { createContext as createContext3 } from "@radix-ui/react-context";
89
- import React3, { useCallback, useEffect, useState } from "react";
523
+ import { createContext as createContext5 } from "@radix-ui/react-context";
524
+ import React5, { useCallback as useCallback3, useEffect as useEffect2, useState as useState2 } from "react";
90
525
  var LIST_NAME = "List";
91
- var [ListProvider, useListContext] = createContext3(LIST_NAME);
526
+ var [ListProvider, useListContext] = createContext5(LIST_NAME);
92
527
  var defaultGetId2 = (item) => item?.id;
93
528
  var ListRoot = ({ children, items, isItem, getId = defaultGetId2, onMove, ...props }) => {
94
- const isEqual = useCallback((a, b) => {
529
+ const isEqual = useCallback3((a, b) => {
95
530
  const idA = getId?.(a);
96
531
  const idB = getId?.(b);
97
532
  if (idA !== void 0 && idB !== void 0) {
@@ -102,8 +537,8 @@ var ListRoot = ({ children, items, isItem, getId = defaultGetId2, onMove, ...pro
102
537
  }, [
103
538
  getId
104
539
  ]);
105
- const [state, setState] = useState(idle);
106
- useEffect(() => {
540
+ const [state, setState] = useState2(idle);
541
+ useEffect2(() => {
107
542
  if (!items) {
108
543
  return;
109
544
  }
@@ -139,7 +574,7 @@ var ListRoot = ({ children, items, isItem, getId = defaultGetId2, onMove, ...pro
139
574
  isEqual,
140
575
  onMove
141
576
  ]);
142
- return /* @__PURE__ */ React3.createElement(ListProvider, {
577
+ return /* @__PURE__ */ React5.createElement(ListProvider, {
143
578
  state,
144
579
  setState,
145
580
  isItem,
@@ -160,24 +595,16 @@ var stateStyles = {
160
595
  };
161
596
  var defaultContext = {};
162
597
  var LIST_ITEM_NAME = "ListItem";
163
- var [ListItemProvider, useListItemContext] = createContext4(LIST_ITEM_NAME, defaultContext);
598
+ var [ListItemProvider, useListItemContext] = createContext6(LIST_ITEM_NAME, defaultContext);
164
599
  var ListItem = ({ children, classNames, item, asChild, selected, ...props }) => {
165
- const Comp = asChild ? Slot : "div";
600
+ const Comp = asChild ? Slot2 : "div";
166
601
  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(() => {
602
+ const rootRef = useRef2(null);
603
+ const dragHandleRef = useRef2(null);
604
+ const [state, setState] = useState3(idle);
605
+ useEffect3(() => {
171
606
  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
- });
607
+ invariant(element, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 37, S: void 0, A: ["element", ""] });
181
608
  return combine(
182
609
  //
183
610
  // https://atlassian.design/components/pragmatic-drag-and-drop/core-package/adapters/element/about#draggable
@@ -277,23 +704,23 @@ var ListItem = ({ children, classNames, item, asChild, selected, ...props }) =>
277
704
  }, [
278
705
  item
279
706
  ]);
280
- return /* @__PURE__ */ React4.createElement(ListItemProvider, {
707
+ return /* @__PURE__ */ React6.createElement(ListItemProvider, {
281
708
  item,
282
709
  dragHandleRef
283
- }, /* @__PURE__ */ React4.createElement(Comp, {
710
+ }, /* @__PURE__ */ React6.createElement(Comp, {
284
711
  ...props,
285
712
  role: "listitem",
286
713
  "aria-selected": selected,
287
- className: mx3("relative p-1 dx-selected dx-hover", classNames, stateStyles[state.type]),
714
+ className: mx5("relative p-1 dx-selected dx-hover", classNames, stateStyles[state.type]),
288
715
  ref: rootRef
289
- }, children), state.type === "is-dragging-over" && state.closestEdge && /* @__PURE__ */ React4.createElement(NaturalListItem.DropIndicator, {
716
+ }, children), state.type === "is-dragging-over" && state.closestEdge && /* @__PURE__ */ React6.createElement(NaturalListItem.DropIndicator, {
290
717
  edge: state.closestEdge
291
718
  }));
292
719
  };
293
720
  var ListItemIconButton = ({ autoHide = true, iconOnly = true, variant = "ghost", classNames, disabled, ...props }) => {
294
721
  const { state } = useListContext("ITEM_BUTTON");
295
722
  const isDisabled = state.type !== "idle" || disabled;
296
- return /* @__PURE__ */ React4.createElement(IconButton, {
723
+ return /* @__PURE__ */ React6.createElement(IconButton, {
297
724
  ...props,
298
725
  disabled: isDisabled,
299
726
  iconOnly,
@@ -308,7 +735,7 @@ var ListItemDeleteButton = ({ autoHide = true, classNames, disabled, icon = "ph-
308
735
  const { state } = useListContext("DELETE_BUTTON");
309
736
  const isDisabled = state.type !== "idle" || disabled;
310
737
  const { t } = useTranslation(osTranslations);
311
- return /* @__PURE__ */ React4.createElement(IconButton, {
738
+ return /* @__PURE__ */ React6.createElement(IconButton, {
312
739
  ...props,
313
740
  variant: "ghost",
314
741
  disabled: isDisabled,
@@ -324,7 +751,7 @@ var ListItemDeleteButton = ({ autoHide = true, classNames, disabled, icon = "ph-
324
751
  var ListItemDragHandle = ({ disabled }) => {
325
752
  const { dragHandleRef } = useListItemContext("DRAG_HANDLE");
326
753
  const { t } = useTranslation(osTranslations);
327
- return /* @__PURE__ */ React4.createElement(IconButton, {
754
+ return /* @__PURE__ */ React6.createElement(IconButton, {
328
755
  variant: "ghost",
329
756
  disabled,
330
757
  icon: "ph--dots-six-vertical--regular",
@@ -339,13 +766,11 @@ var ListItemDragPreview = ({ children }) => {
339
766
  item: state.item
340
767
  }), state.container) : null;
341
768
  };
342
- var ListItemWrapper = ({ classNames, children }) => /* @__PURE__ */ React4.createElement("div", {
343
- role: "none",
344
- 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)
345
771
  }, children);
346
- var ListItemTitle = ({ classNames, children, ...props }) => /* @__PURE__ */ React4.createElement("div", {
347
- role: "none",
348
- 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),
349
774
  ...props
350
775
  }, children);
351
776
 
@@ -361,15 +786,234 @@ var List = {
361
786
  ItemTitle: ListItemTitle
362
787
  };
363
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
+
364
1008
  // src/components/Tree/Tree.tsx
365
1009
  import { useAtomValue as useAtomValue2 } from "@effect-atom/atom-react";
366
- import React8, { useMemo as useMemo2 } from "react";
1010
+ import React12, { useMemo as useMemo3 } from "react";
367
1011
  import { Treegrid as Treegrid2 } from "@dxos/react-ui";
368
1012
 
369
1013
  // src/components/Tree/TreeContext.tsx
370
- import { createContext as createContext5, useContext } from "react";
1014
+ import { createContext as createContext7, useContext } from "react";
371
1015
  import { raise } from "@dxos/debug";
372
- var TreeContext = /* @__PURE__ */ createContext5(null);
1016
+ var TreeContext = /* @__PURE__ */ createContext7(null);
373
1017
  var TreeProvider = TreeContext.Provider;
374
1018
  var useTree = () => useContext(TreeContext) ?? raise(new Error("TreeContext not found"));
375
1019
 
@@ -379,10 +1023,10 @@ import { combine as combine2 } from "@atlaskit/pragmatic-drag-and-drop/combine";
379
1023
  import { draggable as draggable2, dropTargetForElements as dropTargetForElements2 } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
380
1024
  import { useAtomValue } from "@effect-atom/atom-react";
381
1025
  import * as Schema from "effect/Schema";
382
- 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";
383
1027
  import { invariant as invariant2 } from "@dxos/invariant";
384
1028
  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";
1029
+ import { ghostFocusWithin, ghostHover, hoverableControls, hoverableFocusedKeyboardControls, hoverableFocusedWithinControls, mx as mx7 } from "@dxos/ui-theme";
386
1030
 
387
1031
  // src/components/Tree/helpers.ts
388
1032
  var DEFAULT_INDENTATION = 8;
@@ -391,19 +1035,19 @@ var paddingIndentation = (level, indentation = DEFAULT_INDENTATION) => ({
391
1035
  });
392
1036
 
393
1037
  // src/components/Tree/TreeItemHeading.tsx
394
- import React5, { forwardRef, memo, useCallback as useCallback2 } from "react";
395
- 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";
396
1040
  import { TextTooltip } from "@dxos/react-ui-text-tooltip";
397
1041
  import { getStyles } from "@dxos/ui-theme";
398
- 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) => {
399
1043
  const { t } = useTranslation2();
400
1044
  const styles = iconHue ? getStyles(iconHue) : void 0;
401
- const handleSelect = useCallback2((event) => {
1045
+ const handleSelect = useCallback5((event) => {
402
1046
  onSelect?.(event.altKey);
403
1047
  }, [
404
1048
  onSelect
405
1049
  ]);
406
- const handleButtonKeydown = useCallback2((event) => {
1050
+ const handleButtonKeydown = useCallback5((event) => {
407
1051
  if (event.key === " " || event.key === "Enter") {
408
1052
  event.preventDefault();
409
1053
  event.stopPropagation();
@@ -412,14 +1056,14 @@ var TreeItemHeading = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef(({ label,
412
1056
  }, [
413
1057
  onSelect
414
1058
  ]);
415
- return /* @__PURE__ */ React5.createElement(TextTooltip, {
1059
+ return /* @__PURE__ */ React9.createElement(TextTooltip, {
416
1060
  text: toLocalizedString(label, t),
417
1061
  side: "bottom",
418
1062
  truncateQuery: "span[data-tooltip]",
419
1063
  onlyWhenTruncating: true,
420
1064
  asChild: true,
421
1065
  ref: forwardedRef
422
- }, /* @__PURE__ */ React5.createElement(Button, {
1066
+ }, /* @__PURE__ */ React9.createElement(Button2, {
423
1067
  "data-testid": "treeItem.heading",
424
1068
  variant: "ghost",
425
1069
  classNames: [
@@ -433,23 +1077,24 @@ var TreeItemHeading = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef(({ label,
433
1077
  ...current && {
434
1078
  "aria-current": "location"
435
1079
  }
436
- }, icon && /* @__PURE__ */ React5.createElement(Icon2, {
1080
+ }, icon && /* @__PURE__ */ React9.createElement(Icon4, {
1081
+ size: 5,
437
1082
  icon: icon ?? "ph--placeholder--regular",
438
1083
  classNames: [
439
1084
  "my-1",
440
- styles?.surfaceText
1085
+ styles?.foreground
441
1086
  ]
442
- }), /* @__PURE__ */ React5.createElement("span", {
1087
+ }), /* @__PURE__ */ React9.createElement("span", {
443
1088
  className: "flex-1 w-0 truncate text-start font-normal",
444
1089
  "data-tooltip": true
445
1090
  }, toLocalizedString(label, t))));
446
1091
  }));
447
1092
 
448
1093
  // src/components/Tree/TreeItemToggle.tsx
449
- import React6, { forwardRef as forwardRef2, memo as memo2 } from "react";
1094
+ import React10, { forwardRef as forwardRef5, memo as memo2 } from "react";
450
1095
  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, {
1096
+ var TreeItemToggle = /* @__PURE__ */ memo2(/* @__PURE__ */ forwardRef5(({ classNames, open, isBranch, hidden, ...props }, forwardedRef) => {
1097
+ return /* @__PURE__ */ React10.createElement(IconButton2, {
453
1098
  ref: forwardedRef,
454
1099
  "data-testid": "treeItem.toggle",
455
1100
  "aria-expanded": open,
@@ -482,15 +1127,15 @@ var TreeDataSchema = Schema.Struct({
482
1127
  });
483
1128
  var isTreeData = (data) => Schema.is(TreeDataSchema)(data);
484
1129
  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);
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);
492
1137
  const { itemProps: itemPropsAtom, childIds: childIdsAtom, itemOpen: itemOpenAtom, itemCurrent: itemCurrentAtom } = useTree();
493
- const path = useMemo(() => [
1138
+ const path = useMemo2(() => [
494
1139
  ...pathProp,
495
1140
  item.id
496
1141
  ], [
@@ -514,7 +1159,7 @@ var RawTreeItem = ({ item, path: pathProp, levelOffset = 2, last, draggable: dra
514
1159
  item
515
1160
  };
516
1161
  const shouldSeedNativeDragData = typeof document !== "undefined" && document.body.hasAttribute("data-platform");
517
- const cancelExpand = useCallback3(() => {
1162
+ const cancelExpand = useCallback6(() => {
518
1163
  if (cancelExpandRef.current) {
519
1164
  clearTimeout(cancelExpandRef.current);
520
1165
  cancelExpandRef.current = null;
@@ -523,19 +1168,11 @@ var RawTreeItem = ({ item, path: pathProp, levelOffset = 2, last, draggable: dra
523
1168
  const isItemDraggable = draggableProp && itemDraggable !== false;
524
1169
  const isItemDroppable = itemDroppable !== false;
525
1170
  const nativeDragText = id;
526
- useEffect3(() => {
1171
+ useEffect4(() => {
527
1172
  if (!draggableProp) {
528
1173
  return;
529
1174
  }
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
- });
1175
+ invariant2(buttonRef.current, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 70, S: void 0, A: ["buttonRef.current", ""] });
539
1176
  const makeDraggable = () => draggable2({
540
1177
  element: buttonRef.current,
541
1178
  getInitialData: () => data,
@@ -650,10 +1287,10 @@ var RawTreeItem = ({ item, path: pathProp, levelOffset = 2, last, draggable: dra
650
1287
  blockInstruction,
651
1288
  canDrop
652
1289
  ]);
653
- useEffect3(() => () => cancelExpand(), [
1290
+ useEffect4(() => () => cancelExpand(), [
654
1291
  cancelExpand
655
1292
  ]);
656
- const handleOpenToggle = useCallback3(() => onOpenChange?.({
1293
+ const handleOpenToggle = useCallback6(() => onOpenChange?.({
657
1294
  item,
658
1295
  path,
659
1296
  open: !open
@@ -663,7 +1300,7 @@ var RawTreeItem = ({ item, path: pathProp, levelOffset = 2, last, draggable: dra
663
1300
  path,
664
1301
  open
665
1302
  ]);
666
- const handleSelect = useCallback3((option = false) => {
1303
+ const handleSelect = useCallback6((option = false) => {
667
1304
  if (isBranch && (option || current)) {
668
1305
  handleOpenToggle();
669
1306
  } else if (canSelectItem) {
@@ -688,7 +1325,7 @@ var RawTreeItem = ({ item, path: pathProp, levelOffset = 2, last, draggable: dra
688
1325
  handleOpenToggle,
689
1326
  onSelect
690
1327
  ]);
691
- const handleKeyDown = useCallback3((event) => {
1328
+ const handleKeyDown = useCallback6((event) => {
692
1329
  switch (event.key) {
693
1330
  case "ArrowRight":
694
1331
  case "ArrowLeft":
@@ -701,7 +1338,7 @@ var RawTreeItem = ({ item, path: pathProp, levelOffset = 2, last, draggable: dra
701
1338
  handleOpenToggle,
702
1339
  handleSelect
703
1340
  ]);
704
- const handleItemHover = useCallback3(() => {
1341
+ const handleItemHover = useCallback6(() => {
705
1342
  onItemHover?.({
706
1343
  item
707
1344
  });
@@ -709,7 +1346,7 @@ var RawTreeItem = ({ item, path: pathProp, levelOffset = 2, last, draggable: dra
709
1346
  onItemHover,
710
1347
  item
711
1348
  ]);
712
- const handleContextMenu = useCallback3((event) => {
1349
+ const handleContextMenu = useCallback6((event) => {
713
1350
  event.preventDefault();
714
1351
  setMenuOpen(true);
715
1352
  }, [
@@ -725,7 +1362,7 @@ var RawTreeItem = ({ item, path: pathProp, levelOffset = 2, last, draggable: dra
725
1362
  onOpenChange,
726
1363
  onSelect
727
1364
  };
728
- 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, {
729
1366
  ref: rowRef,
730
1367
  key: id,
731
1368
  id,
@@ -737,21 +1374,20 @@ var RawTreeItem = ({ item, path: pathProp, levelOffset = 2, last, draggable: dra
737
1374
  // without alerting the user (except for in the correct link element). See also:
738
1375
  // https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-current#description
739
1376
  "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),
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),
741
1378
  onKeyDown: handleKeyDown,
742
1379
  onMouseEnter: handleItemHover,
743
1380
  onContextMenu: handleContextMenu
744
- }, /* @__PURE__ */ React7.createElement("div", {
745
- role: "none",
1381
+ }, /* @__PURE__ */ React11.createElement("div", {
746
1382
  className: "indent relative grid grid-cols-subgrid col-[tree-row]",
747
1383
  style: paddingIndentation(level)
748
- }, /* @__PURE__ */ React7.createElement(Treegrid.Cell, {
1384
+ }, /* @__PURE__ */ React11.createElement(Treegrid.Cell, {
749
1385
  classNames: "flex items-center"
750
- }, /* @__PURE__ */ React7.createElement(TreeItemToggle, {
1386
+ }, /* @__PURE__ */ React11.createElement(TreeItemToggle, {
751
1387
  isBranch,
752
1388
  open,
753
1389
  onClick: handleOpenToggle
754
- }), /* @__PURE__ */ React7.createElement(TreeItemHeading, {
1390
+ }), /* @__PURE__ */ React11.createElement(TreeItemHeading, {
755
1391
  disabled,
756
1392
  current,
757
1393
  label,
@@ -760,16 +1396,16 @@ var RawTreeItem = ({ item, path: pathProp, levelOffset = 2, last, draggable: dra
760
1396
  iconHue,
761
1397
  onSelect: handleSelect,
762
1398
  ref: buttonRef
763
- })), Columns && /* @__PURE__ */ React7.createElement(Columns, {
1399
+ })), Columns && /* @__PURE__ */ React11.createElement(Columns, {
764
1400
  item,
765
1401
  path,
766
1402
  open,
767
1403
  menuOpen,
768
1404
  setMenuOpen
769
- }), instruction && /* @__PURE__ */ React7.createElement(NaturalTreeItem.DropIndicator, {
1405
+ }), instruction && /* @__PURE__ */ React11.createElement(NaturalTreeItem.DropIndicator, {
770
1406
  instruction,
771
1407
  gap: 2
772
- }))), open && childIds.map((childId, index) => /* @__PURE__ */ React7.createElement(TreeItemById, {
1408
+ }))), open && childIds.map((childId, index) => /* @__PURE__ */ React11.createElement(TreeItemById, {
773
1409
  key: childId,
774
1410
  id: childId,
775
1411
  path,
@@ -784,7 +1420,7 @@ var RawTreeItemById = ({ id, ...props }) => {
784
1420
  if (!item) {
785
1421
  return null;
786
1422
  }
787
- return /* @__PURE__ */ React7.createElement(TreeItem, {
1423
+ return /* @__PURE__ */ React11.createElement(TreeItem, {
788
1424
  item,
789
1425
  ...props
790
1426
  });
@@ -794,7 +1430,7 @@ var TreeItemById = /* @__PURE__ */ memo3(RawTreeItemById);
794
1430
  // src/components/Tree/Tree.tsx
795
1431
  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
1432
  const childIds = useAtomValue2(model.childIds(rootId));
797
- const treePath = useMemo2(() => path ? [
1433
+ const treePath = useMemo3(() => path ? [
798
1434
  ...path,
799
1435
  id
800
1436
  ] : [
@@ -815,12 +1451,12 @@ var Tree = ({ model, rootId, path, id, draggable: draggable3 = false, gridTempla
815
1451
  onSelect,
816
1452
  onItemHover
817
1453
  };
818
- return /* @__PURE__ */ React8.createElement(Treegrid2.Root, {
1454
+ return /* @__PURE__ */ React12.createElement(Treegrid2.Root, {
819
1455
  gridTemplateColumns,
820
1456
  classNames
821
- }, /* @__PURE__ */ React8.createElement(TreeProvider, {
1457
+ }, /* @__PURE__ */ React12.createElement(TreeProvider, {
822
1458
  value: model
823
- }, childIds.map((childId, index) => /* @__PURE__ */ React8.createElement(TreeItemById, {
1459
+ }, childIds.map((childId, index) => /* @__PURE__ */ React12.createElement(TreeItemById, {
824
1460
  key: childId,
825
1461
  id: childId,
826
1462
  last: index === childIds.length - 1,
@@ -845,17 +1481,27 @@ var Path = {
845
1481
  };
846
1482
  export {
847
1483
  Accordion,
1484
+ Combobox,
848
1485
  DEFAULT_INDENTATION,
849
1486
  List,
1487
+ Listbox,
850
1488
  Path,
1489
+ Picker,
1490
+ Row,
1491
+ RowList,
851
1492
  Tree,
852
1493
  TreeDataSchema,
853
1494
  TreeItem,
854
1495
  TreeItemById,
855
1496
  TreeItemToggle,
856
1497
  TreeProvider,
1498
+ createListboxScope,
1499
+ createRowListScope,
857
1500
  isTreeData,
858
1501
  paddingIndentation,
1502
+ usePickerInputContext,
1503
+ usePickerItemContext,
1504
+ useRowListSelection,
859
1505
  useTree
860
1506
  };
861
1507
  //# sourceMappingURL=index.mjs.map