@dxos/react-ui-list 0.8.4-main.84f28bd → 0.8.4-main.a4bbb77

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 (38) hide show
  1. package/dist/lib/browser/index.mjs +62 -56
  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 +62 -56
  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.stories.d.ts +10 -4
  8. package/dist/types/src/components/Accordion/Accordion.stories.d.ts.map +1 -1
  9. package/dist/types/src/components/Accordion/AccordionItem.d.ts +1 -1
  10. package/dist/types/src/components/Accordion/AccordionItem.d.ts.map +1 -1
  11. package/dist/types/src/components/List/List.d.ts +6 -6
  12. package/dist/types/src/components/List/List.d.ts.map +1 -1
  13. package/dist/types/src/components/List/List.stories.d.ts +14 -5
  14. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  15. package/dist/types/src/components/List/ListItem.d.ts +4 -7
  16. package/dist/types/src/components/List/ListItem.d.ts.map +1 -1
  17. package/dist/types/src/components/List/ListRoot.d.ts.map +1 -1
  18. package/dist/types/src/components/Tree/Tree.stories.d.ts +36 -6
  19. package/dist/types/src/components/Tree/Tree.stories.d.ts.map +1 -1
  20. package/dist/types/src/components/Tree/TreeItem.d.ts +8 -7
  21. package/dist/types/src/components/Tree/TreeItem.d.ts.map +1 -1
  22. package/dist/types/src/components/Tree/TreeItemHeading.d.ts +1 -1
  23. package/dist/types/src/components/Tree/TreeItemHeading.d.ts.map +1 -1
  24. package/dist/types/src/components/Tree/TreeItemToggle.d.ts +1 -1
  25. package/dist/types/src/components/Tree/TreeItemToggle.d.ts.map +1 -1
  26. package/dist/types/tsconfig.tsbuildinfo +1 -1
  27. package/package.json +25 -24
  28. package/src/components/Accordion/Accordion.stories.tsx +8 -7
  29. package/src/components/Accordion/Accordion.tsx +1 -1
  30. package/src/components/Accordion/AccordionItem.tsx +5 -2
  31. package/src/components/List/List.stories.tsx +15 -13
  32. package/src/components/List/List.tsx +2 -5
  33. package/src/components/List/ListItem.tsx +39 -27
  34. package/src/components/List/ListRoot.tsx +1 -1
  35. package/src/components/Tree/Tree.stories.tsx +51 -48
  36. package/src/components/Tree/TreeItem.tsx +16 -16
  37. package/src/components/Tree/TreeItemHeading.tsx +3 -4
  38. package/src/components/Tree/TreeItemToggle.tsx +2 -3
@@ -36,7 +36,7 @@ var AccordionRoot = ({ classNames, items, getId = defaultGetId, children, value,
36
36
 
37
37
  // src/components/Accordion/AccordionItem.tsx
38
38
  var ACCORDION_ITEM_NAME = "AccordionItem";
39
- var [AccordionItemProvider, useAccordionItemContext] = createContext2(ACCORDION_ITEM_NAME);
39
+ var [AccordionItemProvider, useDxAccordionItemContext] = createContext2(ACCORDION_ITEM_NAME);
40
40
  var AccordionItem = ({ children, classNames, item }) => {
41
41
  var _effect = _useSignals2();
42
42
  try {
@@ -97,10 +97,10 @@ import { draggable, dropTargetForElements } from "@atlaskit/pragmatic-drag-and-d
97
97
  import { setCustomNativeDragPreview } from "@atlaskit/pragmatic-drag-and-drop/element/set-custom-native-drag-preview";
98
98
  import { attachClosestEdge, extractClosestEdge as extractClosestEdge2 } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge";
99
99
  import { createContext as createContext4 } from "@radix-ui/react-context";
100
- import React4, { forwardRef, useEffect as useEffect2, useRef, useState as useState2 } from "react";
100
+ import React4, { useEffect as useEffect2, useRef, useState as useState2 } from "react";
101
101
  import { createPortal } from "react-dom";
102
102
  import { invariant } from "@dxos/invariant";
103
- import { Icon as Icon2, ListItem as NaturalListItem } from "@dxos/react-ui";
103
+ import { IconButton, ListItem as NaturalListItem, useTranslation } from "@dxos/react-ui";
104
104
  import { mx as mx3 } from "@dxos/react-ui-theme";
105
105
 
106
106
  // src/components/List/ListRoot.tsx
@@ -200,7 +200,7 @@ var ListItem = ({ children, classNames, item, ...props }) => {
200
200
  const element = ref.current;
201
201
  invariant(element, void 0, {
202
202
  F: __dxlog_file,
203
- L: 93,
203
+ L: 98,
204
204
  S: void 0,
205
205
  A: [
206
206
  "element",
@@ -309,67 +309,54 @@ var ListItem = ({ children, classNames, item, ...props }) => {
309
309
  return /* @__PURE__ */ React4.createElement(ListItemProvider, {
310
310
  item,
311
311
  dragHandleRef
312
- }, /* @__PURE__ */ React4.createElement("div", {
313
- role: "none",
314
- className: "relative"
315
312
  }, /* @__PURE__ */ React4.createElement("div", {
316
313
  ref,
317
314
  role: "listitem",
318
- className: mx3("flex overflow-hidden", classNames, stateStyles[state.type]),
315
+ className: mx3("flex relative", classNames, stateStyles[state.type]),
319
316
  ...props
320
- }, children), state.type === "is-dragging-over" && state.closestEdge && /* @__PURE__ */ React4.createElement(NaturalListItem.DropIndicator, {
317
+ }, children, state.type === "is-dragging-over" && state.closestEdge && /* @__PURE__ */ React4.createElement(NaturalListItem.DropIndicator, {
321
318
  edge: state.closestEdge
322
319
  })));
323
320
  } finally {
324
321
  _effect.f();
325
322
  }
326
323
  };
327
- var IconButton = /* @__PURE__ */ forwardRef(({ classNames, icon, ...props }, forwardedRef) => {
328
- var _effect = _useSignals4();
329
- try {
330
- return /* @__PURE__ */ React4.createElement("button", {
331
- ref: forwardedRef,
332
- className: mx3("flex items-center justify-center", classNames),
333
- ...props
334
- }, /* @__PURE__ */ React4.createElement(Icon2, {
335
- icon,
336
- classNames: "cursor-pointer",
337
- size: 4
338
- }));
339
- } finally {
340
- _effect.f();
341
- }
342
- });
343
- var ListItemDeleteButton = ({ autoHide = true, classNames, disabled, icon = "ph--x--regular", ...props }) => {
324
+ var ListItemDeleteButton = ({ autoHide = true, classNames, disabled, icon = "ph--x--regular", label, ...props }) => {
344
325
  var _effect = _useSignals4();
345
326
  try {
346
327
  const { state } = useListContext("DELETE_BUTTON");
347
328
  const isDisabled = state.type !== "idle" || disabled;
329
+ const { t } = useTranslation("os");
348
330
  return /* @__PURE__ */ React4.createElement(IconButton, {
331
+ iconOnly: true,
332
+ variant: "ghost",
333
+ ...props,
349
334
  icon,
350
335
  disabled: isDisabled,
336
+ label: label ?? t("delete label"),
351
337
  classNames: [
352
338
  classNames,
353
339
  autoHide && disabled && "hidden"
354
- ],
355
- ...props
340
+ ]
356
341
  });
357
342
  } finally {
358
343
  _effect.f();
359
344
  }
360
345
  };
361
- var ListItemButton = ({ autoHide = true, classNames, disabled, ...props }) => {
346
+ var ListItemButton = ({ autoHide = true, iconOnly = true, variant = "ghost", classNames, disabled, ...props }) => {
362
347
  var _effect = _useSignals4();
363
348
  try {
364
349
  const { state } = useListContext("ITEM_BUTTON");
365
350
  const isDisabled = state.type !== "idle" || disabled;
366
351
  return /* @__PURE__ */ React4.createElement(IconButton, {
352
+ ...props,
367
353
  disabled: isDisabled,
354
+ iconOnly,
355
+ variant,
368
356
  classNames: [
369
357
  classNames,
370
358
  autoHide && disabled && "hidden"
371
- ],
372
- ...props
359
+ ]
373
360
  });
374
361
  } finally {
375
362
  _effect.f();
@@ -379,7 +366,11 @@ var ListItemDragHandle = ({ disabled }) => {
379
366
  var _effect = _useSignals4();
380
367
  try {
381
368
  const { dragHandleRef } = useListItemContext("DRAG_HANDLE");
369
+ const { t } = useTranslation("os");
382
370
  return /* @__PURE__ */ React4.createElement(IconButton, {
371
+ iconOnly: true,
372
+ variant: "ghost",
373
+ label: t("drag handle label"),
383
374
  ref: dragHandleRef,
384
375
  icon: "ph--dots-six-vertical--regular",
385
376
  disabled
@@ -425,8 +416,7 @@ var List = {
425
416
  ItemDragHandle: ListItemDragHandle,
426
417
  ItemDeleteButton: ListItemDeleteButton,
427
418
  ItemButton: ListItemButton,
428
- ItemTitle: ListItemTitle,
429
- IconButton
419
+ ItemTitle: ListItemTitle
430
420
  };
431
421
 
432
422
  // src/components/Tree/Tree.tsx
@@ -449,19 +439,24 @@ import { attachInstruction, extractInstruction } from "@atlaskit/pragmatic-drag-
449
439
  import { Schema } from "effect";
450
440
  import React7, { memo as memo3, useCallback as useCallback3, useEffect as useEffect3, useMemo, useRef as useRef2, useState as useState3 } from "react";
451
441
  import { invariant as invariant2 } from "@dxos/invariant";
452
- import { Treegrid, TreeItem as NaturalTreeItem } from "@dxos/react-ui";
453
- import { ghostHover, hoverableControls, hoverableFocusedKeyboardControls, hoverableFocusedWithinControls, mx as mx6 } from "@dxos/react-ui-theme";
442
+ import { TreeItem as NaturalTreeItem, Treegrid } from "@dxos/react-ui";
443
+ import { ghostHover, hoverableControls, hoverableFocusedKeyboardControls, hoverableFocusedWithinControls } from "@dxos/react-ui-theme";
444
+
445
+ // src/components/Tree/helpers.ts
446
+ var DEFAULT_INDENTATION = 8;
447
+ var paddingIndentation = (level, indentation = DEFAULT_INDENTATION) => ({
448
+ paddingInlineStart: `${(level - 1) * indentation}px`
449
+ });
454
450
 
455
451
  // src/components/Tree/TreeItemHeading.tsx
456
452
  import { useSignals as _useSignals5 } from "@preact-signals/safe-react/tracking";
457
- import React5, { forwardRef as forwardRef2, memo, useCallback as useCallback2 } from "react";
458
- import { Button, Icon as Icon3, toLocalizedString, useTranslation } from "@dxos/react-ui";
453
+ import React5, { forwardRef, memo, useCallback as useCallback2 } from "react";
454
+ import { Button, Icon as Icon2, toLocalizedString, useTranslation as useTranslation2 } from "@dxos/react-ui";
459
455
  import { TextTooltip } from "@dxos/react-ui-text-tooltip";
460
- import { mx as mx4 } from "@dxos/react-ui-theme";
461
- var TreeItemHeading = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef2(({ label, icon, className, disabled, current, onSelect }, forwardedRef) => {
456
+ var TreeItemHeading = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef(({ label, icon, className, disabled, current, onSelect }, forwardedRef) => {
462
457
  var _effect = _useSignals5();
463
458
  try {
464
- const { t } = useTranslation();
459
+ const { t } = useTranslation2();
465
460
  const handleSelect = useCallback2((event) => {
466
461
  onSelect?.(event.altKey);
467
462
  }, [
@@ -487,14 +482,18 @@ var TreeItemHeading = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef2(({ label,
487
482
  "data-testid": "treeItem.heading",
488
483
  variant: "ghost",
489
484
  density: "fine",
490
- classNames: mx4("grow gap-2 pis-0.5 hover:bg-transparent dark:hover:bg-transparent", "disabled:cursor-default disabled:opacity-100", className),
485
+ classNames: [
486
+ "grow gap-2 pis-0.5 hover:bg-transparent dark:hover:bg-transparent",
487
+ "disabled:cursor-default disabled:opacity-100",
488
+ className
489
+ ],
491
490
  disabled,
492
491
  onClick: handleSelect,
493
492
  onKeyDown: handleButtonKeydown,
494
493
  ...current && {
495
494
  "aria-current": "location"
496
495
  }
497
- }, icon && /* @__PURE__ */ React5.createElement(Icon3, {
496
+ }, icon && /* @__PURE__ */ React5.createElement(Icon2, {
498
497
  icon: icon ?? "ph--placeholder--regular",
499
498
  size: 5,
500
499
  classNames: "mlb-1"
@@ -509,10 +508,9 @@ var TreeItemHeading = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef2(({ label,
509
508
 
510
509
  // src/components/Tree/TreeItemToggle.tsx
511
510
  import { useSignals as _useSignals6 } from "@preact-signals/safe-react/tracking";
512
- import React6, { forwardRef as forwardRef3, memo as memo2 } from "react";
513
- import { Button as Button2, Icon as Icon4 } from "@dxos/react-ui";
514
- import { mx as mx5 } from "@dxos/react-ui-theme";
515
- var TreeItemToggle = /* @__PURE__ */ memo2(/* @__PURE__ */ forwardRef3(({ open, isBranch, hidden, onToggle }, forwardedRef) => {
511
+ import React6, { forwardRef as forwardRef2, memo as memo2 } from "react";
512
+ import { Button as Button2, Icon as Icon3 } from "@dxos/react-ui";
513
+ var TreeItemToggle = /* @__PURE__ */ memo2(/* @__PURE__ */ forwardRef2(({ open, isBranch, hidden, onToggle }, forwardedRef) => {
516
514
  var _effect = _useSignals6();
517
515
  try {
518
516
  return /* @__PURE__ */ React6.createElement(Button2, {
@@ -521,24 +519,24 @@ var TreeItemToggle = /* @__PURE__ */ memo2(/* @__PURE__ */ forwardRef3(({ open,
521
519
  "aria-expanded": open,
522
520
  variant: "ghost",
523
521
  density: "fine",
524
- classNames: mx5("is-6 pli-0 dx-focus-ring-inset", hidden ? "hidden" : !isBranch && "invisible"),
522
+ classNames: [
523
+ "is-6 pli-0 dx-focus-ring-inset",
524
+ hidden ? "hidden" : !isBranch && "invisible"
525
+ ],
525
526
  onClick: onToggle
526
- }, /* @__PURE__ */ React6.createElement(Icon4, {
527
+ }, /* @__PURE__ */ React6.createElement(Icon3, {
527
528
  icon: "ph--caret-right--bold",
528
529
  size: 3,
529
- classNames: mx5("transition duration-200", open && "rotate-90")
530
+ classNames: [
531
+ "transition duration-200",
532
+ open && "rotate-90"
533
+ ]
530
534
  }));
531
535
  } finally {
532
536
  _effect.f();
533
537
  }
534
538
  }));
535
539
 
536
- // src/components/Tree/helpers.ts
537
- var DEFAULT_INDENTATION = 8;
538
- var paddingIndentation = (level, indentation = DEFAULT_INDENTATION) => ({
539
- paddingInlineStart: `${(level - 1) * indentation}px`
540
- });
541
-
542
540
  // src/components/Tree/TreeItem.tsx
543
541
  var __dxlog_file2 = "/__w/dxos/dxos/packages/ui/react-ui-list/src/components/Tree/TreeItem.tsx";
544
542
  var hoverableDescriptionIcons = "[--icons-color:inherit] hover-hover:[--icons-color:var(--description-text)] hover-hover:hover:[--icons-color:inherit] focus-within:[--icons-color:inherit]";
@@ -744,7 +742,15 @@ var RawTreeItem = ({ item, path: _path, last, draggable: _draggable, renderColum
744
742
  id,
745
743
  "aria-labelledby": `${id}__label`,
746
744
  parentOf: parentOf?.join(Treegrid.PARENT_OF_SEPARATOR),
747
- classNames: mx6("grid grid-cols-subgrid col-[tree-row] mbs-0.5 aria-[current]:bg-activeSurface", hoverableControls, hoverableFocusedKeyboardControls, hoverableFocusedWithinControls, hoverableDescriptionIcons, ghostHover, className),
745
+ classNames: [
746
+ "grid grid-cols-subgrid col-[tree-row] mbs-0.5 aria-[current]:bg-activeSurface",
747
+ hoverableControls,
748
+ hoverableFocusedKeyboardControls,
749
+ hoverableFocusedWithinControls,
750
+ hoverableDescriptionIcons,
751
+ ghostHover,
752
+ className
753
+ ],
748
754
  "data-itemid": id,
749
755
  "data-testid": testId,
750
756
  // NOTE(thure): This is intentionally an empty string to for descendents to select by in the CSS
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../src/components/Accordion/AccordionItem.tsx", "../../../src/components/Accordion/AccordionRoot.tsx", "../../../src/components/Accordion/Accordion.tsx", "../../../src/components/List/ListItem.tsx", "../../../src/components/List/ListRoot.tsx", "../../../src/components/List/List.tsx", "../../../src/components/Tree/Tree.tsx", "../../../src/components/Tree/TreeContext.tsx", "../../../src/components/Tree/TreeItem.tsx", "../../../src/components/Tree/TreeItemHeading.tsx", "../../../src/components/Tree/TreeItemToggle.tsx", "../../../src/components/Tree/helpers.ts", "../../../src/util/path.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as AccordionPrimitive from '@radix-ui/react-accordion';\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren } from 'react';\n\nimport { Icon, type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { useAccordionContext } from './AccordionRoot';\nimport { type ListItemRecord } from '../List';\n\nconst ACCORDION_ITEM_NAME = 'AccordionItem';\n\ntype AccordionItemContext<T extends ListItemRecord> = {\n item: T;\n};\n\nexport const [AccordionItemProvider, useAccordionItemContext] =\n createContext<AccordionItemContext<any>>(ACCORDION_ITEM_NAME);\n\nexport type AccordionItemProps<T extends ListItemRecord> = ThemedClassName<PropsWithChildren<{ item: T }>>;\n\nexport const AccordionItem = <T extends ListItemRecord>({ children, classNames, item }: AccordionItemProps<T>) => {\n const { getId } = useAccordionContext(ACCORDION_ITEM_NAME);\n\n return (\n <AccordionItemProvider {...{ item }}>\n <AccordionPrimitive.Item value={getId(item)} className={mx('overflow-hidden', classNames)}>\n {children}\n </AccordionPrimitive.Item>\n </AccordionItemProvider>\n );\n};\n\nexport type AccordionItemHeaderProps = ThemedClassName<AccordionPrimitive.AccordionHeaderProps>;\n\nexport const AccordionItemHeader = ({ classNames, children, ...props }: AccordionItemHeaderProps) => {\n return (\n <AccordionPrimitive.Header {...props} className={mx(classNames)}>\n <AccordionPrimitive.Trigger className='group flex items-center p-2 dx-focus-ring-inset is-full text-start'>\n {children}\n <Icon\n icon='ph--caret-right--regular'\n size={4}\n classNames='transition-transform duration-200 group-data-[state=open]:rotate-90'\n />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n );\n};\n\nexport type AccordionItemBodyProps = ThemedClassName<PropsWithChildren>;\n\nexport const AccordionItemBody = ({ children, classNames }: AccordionItemBodyProps) => {\n return (\n <AccordionPrimitive.Content className='overflow-hidden data-[state=closed]:animate-slideUp data-[state=open]:animate-slideDown'>\n <div role='none' className={mx('p-2', classNames)}>\n {children}\n </div>\n </AccordionPrimitive.Content>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as AccordionPrimitive from '@radix-ui/react-accordion';\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type ReactNode } from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { type ListItemRecord } from '../List';\n\ntype AccordionContext<T extends ListItemRecord> = {\n getId: (item: T) => string;\n};\n\nconst ACCORDION_NAME = 'Accordion';\n\nexport const [AccordionProvider, useAccordionContext] = createContext<AccordionContext<any>>(ACCORDION_NAME);\n\nexport type AccordionRendererProps<T extends ListItemRecord> = {\n items: T[];\n};\n\nconst defaultGetId = <T extends ListItemRecord>(item: T) => (item as any)?.id;\n\nexport type AccordionRootProps<T extends ListItemRecord> = ThemedClassName<\n {\n children?: (props: AccordionRendererProps<T>) => ReactNode;\n items?: T[];\n } & Partial<Pick<AccordionContext<T>, 'getId'>>\n>;\n\nexport const AccordionRoot = <T extends ListItemRecord>({\n classNames,\n items,\n getId = defaultGetId,\n children,\n value,\n defaultValue,\n onValueChange,\n}: AccordionRootProps<T> &\n Pick<AccordionPrimitive.AccordionMultipleProps, 'value' | 'defaultValue' | 'onValueChange'>) => {\n return (\n <AccordionProvider {...{ getId }}>\n <AccordionPrimitive.Root\n type='multiple'\n value={value}\n defaultValue={defaultValue}\n onValueChange={onValueChange}\n className={mx(classNames)}\n >\n {children?.({ items: items ?? [] })}\n </AccordionPrimitive.Root>\n </AccordionProvider>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { AccordionItem, AccordionItemHeader, AccordionItemBody } from './AccordionItem';\nimport { AccordionRoot } from './AccordionRoot';\n\n// TODO(burdon): Next iteration should be based on Radix UI Accordion:\n// https://www.radix-ui.com/primitives/docs/components/accordion\n// TODO(burdon): Support key navigation.\n\nexport const Accordion = {\n Root: AccordionRoot,\n Item: AccordionItem,\n ItemHeader: AccordionItemHeader,\n ItemBody: AccordionItemBody,\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { combine } from '@atlaskit/pragmatic-drag-and-drop/combine';\nimport { draggable, dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';\nimport { setCustomNativeDragPreview } from '@atlaskit/pragmatic-drag-and-drop/element/set-custom-native-drag-preview';\nimport {\n type Edge,\n attachClosestEdge,\n extractClosestEdge,\n} from '@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge';\nimport { createContext } from '@radix-ui/react-context';\nimport React, {\n type ComponentProps,\n type HTMLAttributes,\n type MutableRefObject,\n type PropsWithChildren,\n type ReactNode,\n forwardRef,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { invariant } from '@dxos/invariant';\nimport { Icon, type ThemedClassName, ListItem as NaturalListItem } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { useListContext } from './ListRoot';\n\nexport type ListItemRecord = any;\n\nexport type ItemDragState =\n | {\n type: 'idle';\n }\n | {\n type: 'preview';\n container: HTMLElement;\n }\n | {\n type: 'is-dragging';\n }\n | {\n type: 'is-dragging-over';\n closestEdge: Edge | null;\n };\n\nexport const idle: ItemDragState = { type: 'idle' };\n\nconst stateStyles: { [Key in ItemDragState['type']]?: HTMLAttributes<HTMLDivElement>['className'] } = {\n 'is-dragging': 'opacity-50',\n};\n\ntype ListItemContext<T extends ListItemRecord> = {\n item: T;\n dragHandleRef: MutableRefObject<HTMLElement | null>;\n};\n\n/**\n * Default context defined for ListItemDragPreview, which is defined outside of ListItem.\n */\nconst defaultContext: ListItemContext<any> = {} as any;\n\nconst LIST_ITEM_NAME = 'ListItem';\n\nexport const [ListItemProvider, useListItemContext] = createContext<ListItemContext<any>>(\n LIST_ITEM_NAME,\n defaultContext,\n);\n\nexport type ListItemProps<T extends ListItemRecord> = ThemedClassName<\n PropsWithChildren<\n {\n item: T;\n } & HTMLAttributes<HTMLDivElement>\n >\n>;\n\n/**\n * Draggable list item.\n */\nexport const ListItem = <T extends ListItemRecord>({ children, classNames, item, ...props }: ListItemProps<T>) => {\n const { isItem, readonly, dragPreview, setState: setRootState } = useListContext(LIST_ITEM_NAME);\n const ref = useRef<HTMLDivElement | null>(null);\n const dragHandleRef = useRef<HTMLElement | null>(null);\n const [state, setState] = useState<ItemDragState>(idle);\n\n useEffect(() => {\n const element = ref.current;\n invariant(element);\n return combine(\n //\n // https://atlassian.design/components/pragmatic-drag-and-drop/core-package/adapters/element/about#draggable\n //\n draggable({\n element,\n dragHandle: dragHandleRef.current!,\n canDrag: () => !readonly,\n getInitialData: () => item as any,\n onGenerateDragPreview: dragPreview\n ? ({ nativeSetDragImage, source }) => {\n const rect = source.element.getBoundingClientRect();\n setCustomNativeDragPreview({\n nativeSetDragImage,\n getOffset: ({ container }) => {\n const { height } = container.getBoundingClientRect();\n return { x: 20, y: height / 2 };\n },\n render: ({ container }) => {\n container.style.width = rect.width + 'px';\n setState({ type: 'preview', container });\n setRootState({ type: 'preview', container, item });\n return () => {}; // TODO(burdon): Cleanup.\n },\n });\n }\n : undefined,\n onDragStart: () => {\n setState({ type: 'is-dragging' });\n setRootState({ type: 'is-dragging', item });\n },\n onDrop: () => {\n setState(idle);\n setRootState(idle);\n },\n }),\n\n //\n // https://atlassian.design/components/pragmatic-drag-and-drop/core-package/adapters/element/about#drop-target-for-elements\n //\n dropTargetForElements({\n element,\n canDrop: ({ source }) => {\n return (source.element !== element && isItem?.(source.data)) ?? false;\n },\n getData: ({ input }) => {\n return attachClosestEdge(item as any, { element, input, allowedEdges: ['top', 'bottom'] });\n },\n getIsSticky: () => true,\n onDragEnter: ({ self }) => {\n const closestEdge = extractClosestEdge(self.data);\n setState({ type: 'is-dragging-over', closestEdge });\n },\n onDragLeave: () => {\n setState(idle);\n },\n onDrag: ({ self }) => {\n const closestEdge = extractClosestEdge(self.data);\n setState((current) => {\n if (current.type === 'is-dragging-over' && current.closestEdge === closestEdge) {\n return current;\n }\n return { type: 'is-dragging-over', closestEdge };\n });\n },\n onDrop: () => {\n setState(idle);\n },\n }),\n );\n }, [item]);\n\n return (\n <ListItemProvider item={item} dragHandleRef={dragHandleRef}>\n <div role='none' className='relative'>\n <div\n ref={ref}\n role='listitem'\n className={mx('flex overflow-hidden', classNames, stateStyles[state.type])}\n {...props}\n >\n {children}\n </div>\n {state.type === 'is-dragging-over' && state.closestEdge && (\n <NaturalListItem.DropIndicator edge={state.closestEdge} />\n )}\n </div>\n </ListItemProvider>\n );\n};\n\n//\n// List item components\n//\n\nexport type IconButtonProps = ThemedClassName<ComponentProps<'button'>> & { icon: string };\n\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n ({ classNames, icon, ...props }, forwardedRef) => {\n return (\n <button ref={forwardedRef} className={mx('flex items-center justify-center', classNames)} {...props}>\n <Icon icon={icon} classNames='cursor-pointer' size={4} />\n </button>\n );\n },\n);\n\nexport const ListItemDeleteButton = ({\n autoHide = true,\n classNames,\n disabled,\n icon = 'ph--x--regular',\n ...props\n}: Partial<Pick<IconButtonProps, 'icon'>> & Omit<IconButtonProps, 'icon'> & { autoHide?: boolean }) => {\n const { state } = useListContext('DELETE_BUTTON');\n const isDisabled = state.type !== 'idle' || disabled;\n return (\n <IconButton\n icon={icon}\n disabled={isDisabled}\n classNames={[classNames, autoHide && disabled && 'hidden']}\n {...props}\n />\n );\n};\n\nexport const ListItemButton = ({\n autoHide = true,\n classNames,\n disabled,\n ...props\n}: IconButtonProps & { autoHide?: boolean }) => {\n const { state } = useListContext('ITEM_BUTTON');\n const isDisabled = state.type !== 'idle' || disabled;\n return <IconButton disabled={isDisabled} classNames={[classNames, autoHide && disabled && 'hidden']} {...props} />;\n};\n\nexport const ListItemDragHandle = ({ disabled }: Pick<IconButtonProps, 'disabled'>) => {\n const { dragHandleRef } = useListItemContext('DRAG_HANDLE');\n return <IconButton ref={dragHandleRef as any} icon='ph--dots-six-vertical--regular' disabled={disabled} />;\n};\n\nexport const ListItemDragPreview = <T extends ListItemRecord>({\n children,\n}: {\n children: ({ item }: { item: T }) => ReactNode;\n}) => {\n const { state } = useListContext('DRAG_PREVIEW');\n return state?.type === 'preview' ? createPortal(children({ item: state.item }), state.container) : null;\n};\n\nexport const ListItemWrapper = ({ classNames, children }: ThemedClassName<PropsWithChildren>) => (\n <div className={mx('flex is-full gap-2', classNames)}>{children}</div>\n);\n\nexport const ListItemTitle = ({\n classNames,\n children,\n ...props\n}: ThemedClassName<PropsWithChildren<ComponentProps<'div'>>>) => (\n <div className={mx('flex grow items-center truncate', classNames)} {...props}>\n {children}\n </div>\n);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { monitorForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';\nimport { extractClosestEdge } from '@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge';\nimport { getReorderDestinationIndex } from '@atlaskit/pragmatic-drag-and-drop-hitbox/util/get-reorder-destination-index';\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type ReactNode, useCallback, useEffect, useState } from 'react';\n\nimport { idle, type ItemDragState, type ListItemRecord } from './ListItem';\n\ntype ListContext<T extends ListItemRecord> = {\n // TODO(burdon): Rename drag state.\n state: ItemDragState & { item?: T };\n setState: (state: ItemDragState & { item?: T }) => void;\n readonly?: boolean;\n dragPreview?: boolean;\n isItem?: (item: any) => boolean;\n getId?: (item: T) => string; // TODO(burdon): Require if T doesn't conform to type.\n};\n\nconst LIST_NAME = 'List';\n\nexport const [ListProvider, useListContext] = createContext<ListContext<any>>(LIST_NAME);\n\nexport type ListRendererProps<T extends ListItemRecord> = {\n state: ListContext<T>['state'];\n items: T[];\n};\n\nconst defaultGetId = <T extends ListItemRecord>(item: T) => (item as any)?.id;\n\nexport type ListRootProps<T extends ListItemRecord> = {\n children?: (props: ListRendererProps<T>) => ReactNode;\n items?: T[];\n onMove?: (fromIndex: number, toIndex: number) => void;\n} & Pick<ListContext<T>, 'isItem' | 'getId' | 'readonly' | 'dragPreview'>;\n\nexport const ListRoot = <T extends ListItemRecord>({\n children,\n items,\n isItem,\n getId = defaultGetId,\n onMove,\n ...props\n}: ListRootProps<T>) => {\n const isEqual = useCallback(\n (a: T, b: T) => {\n const idA = getId?.(a);\n const idB = getId?.(b);\n\n if (idA !== undefined && idB !== undefined) {\n return idA === idB;\n } else {\n // Fallback for primitive values or when getId fails.\n // NOTE(ZaymonFC): After drag and drop, pragmatic internally serializes drop targets which breaks reference equality.\n // You must provide an `getId` function that returns a stable identifier for your items.\n return a === b;\n }\n },\n [getId],\n );\n\n const [state, setState] = useState<ListContext<T>['state']>(idle);\n useEffect(() => {\n if (!items) {\n return;\n }\n\n return monitorForElements({\n canMonitor: ({ source }) => isItem?.(source.data) ?? false,\n onDrop: ({ location, source }) => {\n const target = location.current.dropTargets[0];\n if (!target) {\n return;\n }\n\n const sourceData = source.data;\n const targetData = target.data;\n if (!isItem?.(sourceData) || !isItem?.(targetData)) {\n return;\n }\n\n const sourceIdx = items.findIndex((item) => isEqual(item, sourceData as T));\n const targetIdx = items.findIndex((item) => isEqual(item, targetData as T));\n if (targetIdx < 0 || sourceIdx < 0) {\n return;\n }\n const closestEdgeOfTarget = extractClosestEdge(targetData);\n const destinationIndex = getReorderDestinationIndex({\n closestEdgeOfTarget,\n startIndex: sourceIdx,\n indexOfTarget: targetIdx,\n axis: 'vertical',\n });\n\n onMove?.(sourceIdx, destinationIndex);\n },\n });\n }, [items, isEqual, onMove]);\n\n return (\n <ListProvider {...{ state, setState, isItem, ...props }}>{children?.({ state, items: items ?? [] })}</ListProvider>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport {\n IconButton,\n type IconButtonProps,\n ListItem,\n ListItemDeleteButton,\n ListItemButton,\n ListItemDragHandle,\n ListItemDragPreview,\n type ListItemProps,\n type ListItemRecord,\n ListItemTitle,\n ListItemWrapper,\n} from './ListItem';\nimport { ListRoot, type ListRootProps } from './ListRoot';\n\n// TODO(burdon): Multi-select model.\n// TODO(burdon): Key nav.\n// TODO(burdon): Animation.\n// TODO(burdon): Constrain axis.\n// TODO(burdon): Tree view.\n// TODO(burdon): Fix autoscroll while dragging.\n\n/**\n * Draggable list.\n * Ref: https://github.com/atlassian/pragmatic-drag-and-drop\n * Ref: https://github.com/alexreardon/pdnd-react-tailwind/blob/main/src/task.tsx\n */\nexport const List = {\n Root: ListRoot,\n Item: ListItem,\n ItemDragPreview: ListItemDragPreview,\n ItemWrapper: ListItemWrapper,\n ItemDragHandle: ListItemDragHandle,\n ItemDeleteButton: ListItemDeleteButton,\n ItemButton: ListItemButton,\n ItemTitle: ListItemTitle,\n IconButton,\n};\n\ntype ListItem = ListItemRecord;\n\nexport type { ListRootProps, ListItemProps, IconButtonProps, ListItem, ListItemRecord };\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useMemo } from 'react';\n\nimport { type HasId } from '@dxos/echo-schema';\nimport { Treegrid, type TreegridRootProps } from '@dxos/react-ui';\n\nimport { type TreeContextType, TreeProvider } from './TreeContext';\nimport { TreeItem, type TreeItemProps } from './TreeItem';\n\nexport type TreeProps<T extends HasId = any, O = any> = {\n root?: T;\n path?: string[];\n id: string;\n} & TreeContextType<T, O> &\n Partial<Pick<TreegridRootProps, 'gridTemplateColumns' | 'classNames'>> &\n Pick<TreeItemProps<T>, 'draggable' | 'renderColumns' | 'canDrop' | 'onOpenChange' | 'onSelect' | 'levelOffset'>;\n\nexport const Tree = <T extends HasId = any, O = any>({\n root,\n path,\n id,\n useItems,\n getProps,\n isOpen,\n isCurrent,\n draggable = false,\n gridTemplateColumns = '[tree-row-start] 1fr min-content [tree-row-end]',\n classNames,\n levelOffset,\n renderColumns,\n canDrop,\n onOpenChange,\n onSelect,\n}: TreeProps<T, O>) => {\n const context = useMemo(\n () => ({\n useItems,\n getProps,\n isOpen,\n isCurrent,\n }),\n [useItems, getProps, isOpen, isCurrent],\n );\n const items = useItems(root);\n const treePath = useMemo(() => (path ? [...path, id] : [id]), [id, path]);\n\n return (\n <Treegrid.Root gridTemplateColumns={gridTemplateColumns} classNames={classNames}>\n <TreeProvider value={context}>\n {items.map((item, index) => (\n <TreeItem\n key={item.id}\n item={item}\n last={index === items.length - 1}\n path={treePath}\n levelOffset={levelOffset}\n draggable={draggable}\n renderColumns={renderColumns}\n canDrop={canDrop}\n onOpenChange={onOpenChange}\n onSelect={onSelect}\n />\n ))}\n </TreeProvider>\n </Treegrid.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { createContext, useContext } from 'react';\n\nimport { raise } from '@dxos/debug';\nimport { type Label } from '@dxos/react-ui';\n\nexport type TreeItemDataProps = {\n id: string;\n label: Label;\n parentOf?: string[];\n icon?: string;\n disabled?: boolean;\n className?: string;\n headingClassName?: string;\n testId?: string;\n};\n\nexport type TreeContextType<T = any, O = any> = {\n useItems: (parent?: T, options?: O) => T[];\n getProps: (item: T, parent: string[]) => TreeItemDataProps;\n isOpen: (path: string[], item: T) => boolean;\n isCurrent: (path: string[], item: T) => boolean;\n};\n\nconst TreeContext = createContext<null | TreeContextType>(null);\n\nexport const TreeProvider = TreeContext.Provider;\n\nexport const useTree = () => useContext(TreeContext) ?? raise(new Error('TreeContext not found'));\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { combine } from '@atlaskit/pragmatic-drag-and-drop/combine';\nimport { draggable, dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';\nimport {\n attachInstruction,\n extractInstruction,\n type Instruction,\n type ItemMode,\n} from '@atlaskit/pragmatic-drag-and-drop-hitbox/tree-item';\nimport { Schema } from 'effect';\nimport React, { memo, useCallback, useEffect, useMemo, useRef, useState, type FC, type KeyboardEvent } from 'react';\n\nimport { type HasId } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { Treegrid, TreeItem as NaturalTreeItem } from '@dxos/react-ui';\nimport {\n ghostHover,\n hoverableControls,\n hoverableFocusedKeyboardControls,\n hoverableFocusedWithinControls,\n mx,\n} from '@dxos/react-ui-theme';\n\nimport { useTree } from './TreeContext';\nimport { TreeItemHeading } from './TreeItemHeading';\nimport { TreeItemToggle } from './TreeItemToggle';\nimport { DEFAULT_INDENTATION, paddingIndentation } from './helpers';\n\ntype TreeItemState = 'idle' | 'dragging' | 'preview' | 'parent-of-instruction';\n\nconst hoverableDescriptionIcons =\n '[--icons-color:inherit] hover-hover:[--icons-color:var(--description-text)] hover-hover:hover:[--icons-color:inherit] focus-within:[--icons-color:inherit]';\n\nexport const TreeDataSchema = Schema.Struct({\n id: Schema.String,\n path: Schema.Array(Schema.String),\n item: Schema.Any,\n});\n\nexport type TreeData = Schema.Schema.Type<typeof TreeDataSchema>;\n\nexport const isTreeData = (data: unknown): data is TreeData => Schema.is(TreeDataSchema)(data);\n\nexport type TreeItemProps<T extends HasId = any> = {\n item: T;\n path: string[];\n levelOffset?: number;\n last: boolean;\n draggable?: boolean;\n renderColumns?: FC<{\n item: T;\n path: string[];\n open: boolean;\n menuOpen: boolean;\n setMenuOpen: (open: boolean) => void;\n }>;\n canDrop?: (params: { source: TreeData; target: TreeData }) => boolean;\n onOpenChange?: (params: { item: T; path: string[]; open: boolean }) => void;\n onSelect?: (params: { item: T; path: string[]; current: boolean; option: boolean }) => void;\n};\n\nconst RawTreeItem = <T extends HasId = any>({\n item,\n path: _path,\n last,\n draggable: _draggable,\n renderColumns: Columns,\n canDrop,\n onOpenChange,\n onSelect,\n levelOffset = 2,\n}: TreeItemProps<T>) => {\n const rowRef = useRef<HTMLDivElement | null>(null);\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n const openRef = useRef(false);\n const cancelExpandRef = useRef<NodeJS.Timeout | null>(null);\n const [_state, setState] = useState<TreeItemState>('idle');\n const [instruction, setInstruction] = useState<Instruction | null>(null);\n const [menuOpen, setMenuOpen] = useState(false);\n\n const { useItems, getProps, isOpen, isCurrent } = useTree();\n const items = useItems(item);\n const { id, label, parentOf, icon, disabled, className, headingClassName, testId } = getProps(item, _path);\n const path = useMemo(() => [..._path, id], [_path, id]);\n const open = isOpen(path, item);\n const current = isCurrent(path, item);\n const level = path.length - levelOffset;\n const isBranch = !!parentOf;\n const mode: ItemMode = last ? 'last-in-group' : open ? 'expanded' : 'standard';\n\n const cancelExpand = useCallback(() => {\n if (cancelExpandRef.current) {\n clearTimeout(cancelExpandRef.current);\n cancelExpandRef.current = null;\n }\n }, []);\n\n useEffect(() => {\n if (!_draggable) {\n return;\n }\n\n invariant(buttonRef.current);\n\n const data = { id, path, item } satisfies TreeData;\n\n // https://atlassian.design/components/pragmatic-drag-and-drop/core-package/adapters/element/about\n return combine(\n draggable({\n element: buttonRef.current,\n getInitialData: () => data,\n onDragStart: () => {\n setState('dragging');\n if (open) {\n openRef.current = true;\n onOpenChange?.({ item, path, open: false });\n }\n },\n onDrop: () => {\n setState('idle');\n if (openRef.current) {\n onOpenChange?.({ item, path, open: true });\n }\n },\n }),\n // https://github.com/atlassian/pragmatic-drag-and-drop/blob/main/packages/hitbox/constellation/index/about.mdx\n dropTargetForElements({\n element: buttonRef.current,\n getData: ({ input, element }) => {\n return attachInstruction(data, {\n input,\n element,\n indentPerLevel: DEFAULT_INDENTATION,\n currentLevel: level,\n mode,\n block: isBranch ? [] : ['make-child'],\n });\n },\n canDrop: ({ source }) => {\n const _canDrop = canDrop ?? (() => true);\n return source.element !== buttonRef.current && _canDrop({ source: source.data as TreeData, target: data });\n },\n getIsSticky: () => true,\n onDrag: ({ self, source }) => {\n const instruction = extractInstruction(self.data);\n\n if (source.data.id !== id) {\n if (instruction?.type === 'make-child' && isBranch && !open && !cancelExpandRef.current) {\n cancelExpandRef.current = setTimeout(() => {\n onOpenChange?.({ item, path, open: true });\n }, 500);\n }\n\n if (instruction?.type !== 'make-child') {\n cancelExpand();\n }\n\n setInstruction(instruction);\n } else if (instruction?.type === 'reparent') {\n // TODO(wittjosiah): This is not occurring in the current implementation.\n setInstruction(instruction);\n } else {\n setInstruction(null);\n }\n },\n onDragLeave: () => {\n cancelExpand();\n setInstruction(null);\n },\n onDrop: () => {\n cancelExpand();\n setInstruction(null);\n },\n }),\n );\n }, [_draggable, item, id, mode, path, open, canDrop]);\n\n // Cancel expand on unmount.\n useEffect(() => () => cancelExpand(), [cancelExpand]);\n\n const handleOpenChange = useCallback(\n () => onOpenChange?.({ item, path, open: !open }),\n [onOpenChange, item, path, open],\n );\n\n const handleSelect = useCallback(\n (option = false) => {\n if (isBranch) {\n handleOpenChange();\n } else {\n rowRef.current?.focus();\n onSelect?.({ item, path, current: !current, option });\n }\n },\n [item, path, current, isBranch, handleOpenChange, onSelect],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowRight':\n isBranch && !open && handleOpenChange();\n break;\n case 'ArrowLeft':\n isBranch && open && handleOpenChange();\n break;\n case ' ':\n handleSelect(event.altKey);\n break;\n }\n },\n [isBranch, open, handleOpenChange, handleSelect],\n );\n\n return (\n <>\n <Treegrid.Row\n ref={rowRef}\n key={id}\n id={id}\n aria-labelledby={`${id}__label`}\n parentOf={parentOf?.join(Treegrid.PARENT_OF_SEPARATOR)}\n classNames={mx(\n 'grid grid-cols-subgrid col-[tree-row] mbs-0.5 aria-[current]:bg-activeSurface',\n hoverableControls,\n hoverableFocusedKeyboardControls,\n hoverableFocusedWithinControls,\n hoverableDescriptionIcons,\n ghostHover,\n className,\n )}\n data-itemid={id}\n data-testid={testId}\n // NOTE(thure): This is intentionally an empty string to for descendents to select by in the CSS\n // without alerting the user (except for in the correct link element). See also:\n // https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-current#description\n aria-current={current ? ('' as 'page') : undefined}\n onKeyDown={handleKeyDown}\n onContextMenu={(event) => {\n event.preventDefault();\n setMenuOpen(true);\n }}\n >\n <Treegrid.Cell\n indent\n classNames='relative grid grid-cols-subgrid col-[tree-row]'\n style={paddingIndentation(level)}\n >\n <div role='none' className='flex items-center'>\n <TreeItemToggle isBranch={isBranch} open={open} onToggle={handleOpenChange} />\n <TreeItemHeading\n ref={buttonRef}\n label={label}\n icon={icon}\n className={headingClassName}\n disabled={disabled}\n current={current}\n onSelect={handleSelect}\n />\n </div>\n {Columns && <Columns item={item} path={path} open={open} menuOpen={menuOpen} setMenuOpen={setMenuOpen} />}\n {instruction && <NaturalTreeItem.DropIndicator instruction={instruction} gap={2} />}\n </Treegrid.Cell>\n </Treegrid.Row>\n {open &&\n items.map((item, index) => (\n <TreeItem\n key={item.id}\n item={item}\n path={path}\n last={index === items.length - 1}\n draggable={_draggable}\n renderColumns={Columns}\n canDrop={canDrop}\n onOpenChange={onOpenChange}\n onSelect={onSelect}\n />\n ))}\n </>\n );\n};\n\nexport const TreeItem = memo(RawTreeItem) as FC<TreeItemProps>;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type KeyboardEvent, type MouseEvent, forwardRef, memo, useCallback } from 'react';\n\nimport { Button, Icon, toLocalizedString, useTranslation, type Label } from '@dxos/react-ui';\nimport { TextTooltip } from '@dxos/react-ui-text-tooltip';\nimport { mx } from '@dxos/react-ui-theme';\n\n// TODO(wittjosiah): Consider whether there should be a separate disabled prop which was visually distinct\n// rather than just making the item unselectable.\nexport type NavTreeItemHeadingProps = {\n label: Label;\n icon?: string;\n className?: string;\n disabled?: boolean;\n current?: boolean;\n onSelect?: (option: boolean) => void;\n};\n\nexport const TreeItemHeading = memo(\n forwardRef<HTMLButtonElement, NavTreeItemHeadingProps>(\n ({ label, icon, className, disabled, current, onSelect }, forwardedRef) => {\n const { t } = useTranslation();\n\n const handleSelect = useCallback(\n (event: MouseEvent) => {\n onSelect?.(event.altKey);\n },\n [onSelect],\n );\n\n const handleButtonKeydown = useCallback(\n (event: KeyboardEvent) => {\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n event.stopPropagation();\n onSelect?.(event.altKey);\n }\n },\n [onSelect],\n );\n\n return (\n <TextTooltip\n text={toLocalizedString(label, t)}\n side='bottom'\n truncateQuery='span[data-tooltip]'\n onlyWhenTruncating\n asChild\n ref={forwardedRef}\n >\n <Button\n data-testid='treeItem.heading'\n variant='ghost'\n density='fine'\n classNames={mx(\n 'grow gap-2 pis-0.5 hover:bg-transparent dark:hover:bg-transparent',\n 'disabled:cursor-default disabled:opacity-100',\n className,\n )}\n disabled={disabled}\n onClick={handleSelect}\n onKeyDown={handleButtonKeydown}\n {...(current && { 'aria-current': 'location' })}\n >\n {icon && <Icon icon={icon ?? 'ph--placeholder--regular'} size={5} classNames='mlb-1' />}\n <span className='flex-1 is-0 truncate text-start text-sm font-normal' data-tooltip>\n {toLocalizedString(label, t)}\n </span>\n </Button>\n </TextTooltip>\n );\n },\n ),\n);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { forwardRef, memo } from 'react';\n\nimport { Button, Icon } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nexport type TreeItemToggleProps = {\n open?: boolean;\n isBranch?: boolean;\n onToggle?: () => void;\n hidden?: boolean;\n};\n\nexport const TreeItemToggle = memo(\n forwardRef<HTMLButtonElement, TreeItemToggleProps>(({ open, isBranch, hidden, onToggle }, forwardedRef) => {\n return (\n <Button\n ref={forwardedRef}\n data-testid='treeItem.toggle'\n aria-expanded={open}\n variant='ghost'\n density='fine'\n classNames={mx('is-6 pli-0 dx-focus-ring-inset', hidden ? 'hidden' : !isBranch && 'invisible')}\n onClick={onToggle}\n >\n <Icon icon='ph--caret-right--bold' size={3} classNames={mx('transition duration-200', open && 'rotate-90')} />\n </Button>\n );\n }),\n);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nexport const DEFAULT_INDENTATION = 8;\n\nexport const paddingIndentation = (level: number, indentation = DEFAULT_INDENTATION) => ({\n paddingInlineStart: `${(level - 1) * indentation}px`,\n});\n", "//\n// Copyright 2023 DXOS.org\n//\n\nconst SEPARATOR = '+';\n\nexport const Path = {\n create: (...args: string[]) => args.join(SEPARATOR),\n\n parts: (path: string) => path.split(SEPARATOR),\n length: (path: string) => path.split(SEPARATOR).length,\n first: (path: string) => path.split(SEPARATOR)[0] ?? path,\n last: (path: string) => path.split(SEPARATOR).at(-1) ?? path,\n parent: (path: string) => path.split(SEPARATOR).slice(0, -1).join(SEPARATOR),\n\n hasRoot: (path: string, id: string) => Path.first(path) === id,\n hasChild: (path: string, compare: string) => Path.parent(compare) === path,\n hasDescendent: (path: string, compare: string) => compare !== path && compare.startsWith(path),\n siblings: (path: string, compare: string) => Path.parent(path) === Path.parent(compare),\n onPath: (path: string, id: string) => Path.parts(path).includes(id),\n};\n"],
5
- "mappings": "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",
6
- "names": ["AccordionPrimitive", "createContext", "React", "Icon", "mx", "AccordionPrimitive", "createContext", "React", "mx", "ACCORDION_NAME", "AccordionProvider", "useAccordionContext", "createContext", "defaultGetId", "item", "id", "AccordionRoot", "classNames", "items", "getId", "children", "value", "defaultValue", "onValueChange", "Root", "type", "className", "mx", "ACCORDION_ITEM_NAME", "AccordionItemProvider", "useAccordionItemContext", "createContext", "AccordionItem", "children", "classNames", "item", "getId", "useAccordionContext", "React", "Item", "value", "className", "mx", "AccordionItemHeader", "props", "Header", "Trigger", "Icon", "icon", "size", "AccordionItemBody", "Content", "div", "role", "Accordion", "Root", "AccordionRoot", "Item", "AccordionItem", "ItemHeader", "AccordionItemHeader", "ItemBody", "AccordionItemBody", "combine", "draggable", "dropTargetForElements", "setCustomNativeDragPreview", "attachClosestEdge", "extractClosestEdge", "createContext", "React", "forwardRef", "useEffect", "useRef", "useState", "createPortal", "invariant", "Icon", "ListItem", "NaturalListItem", "mx", "monitorForElements", "extractClosestEdge", "getReorderDestinationIndex", "createContext", "React", "useCallback", "useEffect", "useState", "LIST_NAME", "ListProvider", "useListContext", "createContext", "defaultGetId", "item", "id", "ListRoot", "children", "items", "isItem", "getId", "onMove", "props", "isEqual", "useCallback", "a", "b", "idA", "idB", "undefined", "state", "setState", "useState", "idle", "useEffect", "monitorForElements", "canMonitor", "source", "data", "onDrop", "location", "target", "current", "dropTargets", "sourceData", "targetData", "sourceIdx", "findIndex", "targetIdx", "closestEdgeOfTarget", "extractClosestEdge", "destinationIndex", "getReorderDestinationIndex", "startIndex", "indexOfTarget", "axis", "React", "idle", "type", "stateStyles", "defaultContext", "LIST_ITEM_NAME", "ListItemProvider", "useListItemContext", "createContext", "ListItem", "children", "classNames", "item", "props", "isItem", "readonly", "dragPreview", "setState", "setRootState", "useListContext", "ref", "useRef", "dragHandleRef", "state", "useState", "useEffect", "element", "current", "invariant", "combine", "draggable", "dragHandle", "canDrag", "getInitialData", "onGenerateDragPreview", "nativeSetDragImage", "source", "rect", "getBoundingClientRect", "setCustomNativeDragPreview", "getOffset", "container", "height", "x", "y", "render", "style", "width", "undefined", "onDragStart", "onDrop", "dropTargetForElements", "canDrop", "data", "getData", "input", "attachClosestEdge", "allowedEdges", "getIsSticky", "onDragEnter", "self", "closestEdge", "extractClosestEdge", "onDragLeave", "onDrag", "React", "div", "role", "className", "mx", "NaturalListItem", "DropIndicator", "edge", "IconButton", "forwardRef", "icon", "forwardedRef", "button", "Icon", "size", "ListItemDeleteButton", "autoHide", "disabled", "isDisabled", "ListItemButton", "ListItemDragHandle", "ListItemDragPreview", "createPortal", "ListItemWrapper", "ListItemTitle", "List", "Root", "ListRoot", "Item", "ListItem", "ItemDragPreview", "ListItemDragPreview", "ItemWrapper", "ListItemWrapper", "ItemDragHandle", "ListItemDragHandle", "ItemDeleteButton", "ListItemDeleteButton", "ItemButton", "ListItemButton", "ItemTitle", "ListItemTitle", "IconButton", "React", "useMemo", "Treegrid", "createContext", "useContext", "raise", "TreeContext", "createContext", "TreeProvider", "Provider", "useTree", "useContext", "raise", "Error", "combine", "draggable", "dropTargetForElements", "attachInstruction", "extractInstruction", "Schema", "React", "memo", "useCallback", "useEffect", "useMemo", "useRef", "useState", "invariant", "Treegrid", "TreeItem", "NaturalTreeItem", "ghostHover", "hoverableControls", "hoverableFocusedKeyboardControls", "hoverableFocusedWithinControls", "mx", "React", "forwardRef", "memo", "useCallback", "Button", "Icon", "toLocalizedString", "useTranslation", "TextTooltip", "mx", "TreeItemHeading", "memo", "forwardRef", "label", "icon", "className", "disabled", "current", "onSelect", "forwardedRef", "t", "useTranslation", "handleSelect", "useCallback", "event", "altKey", "handleButtonKeydown", "key", "preventDefault", "stopPropagation", "React", "TextTooltip", "text", "toLocalizedString", "side", "truncateQuery", "onlyWhenTruncating", "asChild", "ref", "Button", "data-testid", "variant", "density", "classNames", "mx", "onClick", "onKeyDown", "Icon", "size", "span", "data-tooltip", "React", "forwardRef", "memo", "Button", "Icon", "mx", "TreeItemToggle", "memo", "forwardRef", "open", "isBranch", "hidden", "onToggle", "forwardedRef", "React", "Button", "ref", "data-testid", "aria-expanded", "variant", "density", "classNames", "mx", "onClick", "Icon", "icon", "size", "DEFAULT_INDENTATION", "paddingIndentation", "level", "indentation", "paddingInlineStart", "hoverableDescriptionIcons", "TreeDataSchema", "Schema", "Struct", "id", "String", "path", "Array", "item", "Any", "isTreeData", "data", "is", "RawTreeItem", "_path", "last", "draggable", "_draggable", "renderColumns", "Columns", "canDrop", "onOpenChange", "onSelect", "levelOffset", "rowRef", "useRef", "buttonRef", "openRef", "cancelExpandRef", "_state", "setState", "useState", "instruction", "setInstruction", "menuOpen", "setMenuOpen", "useItems", "getProps", "isOpen", "isCurrent", "useTree", "items", "label", "parentOf", "icon", "disabled", "className", "headingClassName", "testId", "useMemo", "open", "current", "level", "length", "isBranch", "mode", "cancelExpand", "useCallback", "clearTimeout", "useEffect", "invariant", "combine", "element", "getInitialData", "onDragStart", "onDrop", "dropTargetForElements", "getData", "input", "attachInstruction", "indentPerLevel", "DEFAULT_INDENTATION", "currentLevel", "block", "source", "_canDrop", "target", "getIsSticky", "onDrag", "self", "extractInstruction", "type", "setTimeout", "onDragLeave", "handleOpenChange", "handleSelect", "option", "focus", "handleKeyDown", "event", "key", "altKey", "React", "Treegrid", "Row", "ref", "aria-labelledby", "join", "PARENT_OF_SEPARATOR", "classNames", "mx", "hoverableControls", "hoverableFocusedKeyboardControls", "hoverableFocusedWithinControls", "ghostHover", "data-itemid", "data-testid", "aria-current", "undefined", "onKeyDown", "onContextMenu", "preventDefault", "Cell", "indent", "style", "paddingIndentation", "div", "role", "TreeItemToggle", "onToggle", "TreeItemHeading", "NaturalTreeItem", "DropIndicator", "gap", "map", "index", "TreeItem", "memo", "Tree", "root", "path", "id", "useItems", "getProps", "isOpen", "isCurrent", "draggable", "gridTemplateColumns", "classNames", "levelOffset", "renderColumns", "canDrop", "onOpenChange", "onSelect", "context", "useMemo", "items", "treePath", "React", "Treegrid", "Root", "TreeProvider", "value", "map", "item", "index", "TreeItem", "key", "last", "length", "SEPARATOR", "Path", "create", "args", "join", "parts", "path", "split", "length", "first", "last", "at", "parent", "slice", "hasRoot", "id", "hasChild", "compare", "hasDescendent", "startsWith", "siblings", "onPath", "includes"]
3
+ "sources": ["../../../src/components/Accordion/AccordionItem.tsx", "../../../src/components/Accordion/AccordionRoot.tsx", "../../../src/components/Accordion/Accordion.tsx", "../../../src/components/List/ListItem.tsx", "../../../src/components/List/ListRoot.tsx", "../../../src/components/List/List.tsx", "../../../src/components/Tree/Tree.tsx", "../../../src/components/Tree/TreeContext.tsx", "../../../src/components/Tree/TreeItem.tsx", "../../../src/components/Tree/helpers.ts", "../../../src/components/Tree/TreeItemHeading.tsx", "../../../src/components/Tree/TreeItemToggle.tsx", "../../../src/util/path.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as AccordionPrimitive from '@radix-ui/react-accordion';\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren } from 'react';\n\nimport { Icon, type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { type ListItemRecord } from '../List';\n\nimport { useAccordionContext } from './AccordionRoot';\n\nconst ACCORDION_ITEM_NAME = 'AccordionItem';\n\ntype AccordionItemContext<T extends ListItemRecord> = {\n item: T;\n};\n\n// TODO(wittjosiah): This seems to be conflicting with something in the bundle.\n// Perhaps @radix-ui/react-accordion?\nexport const [AccordionItemProvider, useDxAccordionItemContext] =\n createContext<AccordionItemContext<any>>(ACCORDION_ITEM_NAME);\n\nexport type AccordionItemProps<T extends ListItemRecord> = ThemedClassName<PropsWithChildren<{ item: T }>>;\n\nexport const AccordionItem = <T extends ListItemRecord>({ children, classNames, item }: AccordionItemProps<T>) => {\n const { getId } = useAccordionContext(ACCORDION_ITEM_NAME);\n\n return (\n <AccordionItemProvider {...{ item }}>\n <AccordionPrimitive.Item value={getId(item)} className={mx('overflow-hidden', classNames)}>\n {children}\n </AccordionPrimitive.Item>\n </AccordionItemProvider>\n );\n};\n\nexport type AccordionItemHeaderProps = ThemedClassName<AccordionPrimitive.AccordionHeaderProps>;\n\nexport const AccordionItemHeader = ({ classNames, children, ...props }: AccordionItemHeaderProps) => {\n return (\n <AccordionPrimitive.Header {...props} className={mx(classNames)}>\n <AccordionPrimitive.Trigger className='group flex items-center p-2 dx-focus-ring-inset is-full text-start'>\n {children}\n <Icon\n icon='ph--caret-right--regular'\n size={4}\n classNames='transition-transform duration-200 group-data-[state=open]:rotate-90'\n />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n );\n};\n\nexport type AccordionItemBodyProps = ThemedClassName<PropsWithChildren>;\n\nexport const AccordionItemBody = ({ children, classNames }: AccordionItemBodyProps) => {\n return (\n <AccordionPrimitive.Content className='overflow-hidden data-[state=closed]:animate-slideUp data-[state=open]:animate-slideDown'>\n <div role='none' className={mx('p-2', classNames)}>\n {children}\n </div>\n </AccordionPrimitive.Content>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as AccordionPrimitive from '@radix-ui/react-accordion';\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type ReactNode } from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { type ListItemRecord } from '../List';\n\ntype AccordionContext<T extends ListItemRecord> = {\n getId: (item: T) => string;\n};\n\nconst ACCORDION_NAME = 'Accordion';\n\nexport const [AccordionProvider, useAccordionContext] = createContext<AccordionContext<any>>(ACCORDION_NAME);\n\nexport type AccordionRendererProps<T extends ListItemRecord> = {\n items: T[];\n};\n\nconst defaultGetId = <T extends ListItemRecord>(item: T) => (item as any)?.id;\n\nexport type AccordionRootProps<T extends ListItemRecord> = ThemedClassName<\n {\n children?: (props: AccordionRendererProps<T>) => ReactNode;\n items?: T[];\n } & Partial<Pick<AccordionContext<T>, 'getId'>>\n>;\n\nexport const AccordionRoot = <T extends ListItemRecord>({\n classNames,\n items,\n getId = defaultGetId,\n children,\n value,\n defaultValue,\n onValueChange,\n}: AccordionRootProps<T> &\n Pick<AccordionPrimitive.AccordionMultipleProps, 'value' | 'defaultValue' | 'onValueChange'>) => {\n return (\n <AccordionProvider {...{ getId }}>\n <AccordionPrimitive.Root\n type='multiple'\n value={value}\n defaultValue={defaultValue}\n onValueChange={onValueChange}\n className={mx(classNames)}\n >\n {children?.({ items: items ?? [] })}\n </AccordionPrimitive.Root>\n </AccordionProvider>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { AccordionItem, AccordionItemBody, AccordionItemHeader } from './AccordionItem';\nimport { AccordionRoot } from './AccordionRoot';\n\n// TODO(burdon): Next iteration should be based on Radix UI Accordion:\n// https://www.radix-ui.com/primitives/docs/components/accordion\n// TODO(burdon): Support key navigation.\n\nexport const Accordion = {\n Root: AccordionRoot,\n Item: AccordionItem,\n ItemHeader: AccordionItemHeader,\n ItemBody: AccordionItemBody,\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { combine } from '@atlaskit/pragmatic-drag-and-drop/combine';\nimport { draggable, dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';\nimport { setCustomNativeDragPreview } from '@atlaskit/pragmatic-drag-and-drop/element/set-custom-native-drag-preview';\nimport {\n type Edge,\n attachClosestEdge,\n extractClosestEdge,\n} from '@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge';\nimport { createContext } from '@radix-ui/react-context';\nimport React, {\n type ComponentProps,\n type HTMLAttributes,\n type MutableRefObject,\n type PropsWithChildren,\n type ReactNode,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { invariant } from '@dxos/invariant';\nimport {\n IconButton,\n type IconButtonProps,\n ListItem as NaturalListItem,\n type ThemedClassName,\n useTranslation,\n} from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { useListContext } from './ListRoot';\n\nexport type ListItemRecord = any;\n\nexport type ItemDragState =\n | {\n type: 'idle';\n }\n | {\n type: 'preview';\n container: HTMLElement;\n }\n | {\n type: 'is-dragging';\n }\n | {\n type: 'is-dragging-over';\n closestEdge: Edge | null;\n };\n\nexport const idle: ItemDragState = { type: 'idle' };\n\nconst stateStyles: { [Key in ItemDragState['type']]?: HTMLAttributes<HTMLDivElement>['className'] } = {\n 'is-dragging': 'opacity-50',\n};\n\ntype ListItemContext<T extends ListItemRecord> = {\n item: T;\n dragHandleRef: MutableRefObject<HTMLElement | null>;\n};\n\n/**\n * Default context defined for ListItemDragPreview, which is defined outside of ListItem.\n */\nconst defaultContext: ListItemContext<any> = {} as any;\n\nconst LIST_ITEM_NAME = 'ListItem';\n\nexport const [ListItemProvider, useListItemContext] = createContext<ListItemContext<any>>(\n LIST_ITEM_NAME,\n defaultContext,\n);\n\nexport type ListItemProps<T extends ListItemRecord> = ThemedClassName<\n PropsWithChildren<\n {\n item: T;\n } & HTMLAttributes<HTMLDivElement>\n >\n>;\n\n/**\n * Draggable list item.\n */\nexport const ListItem = <T extends ListItemRecord>({ children, classNames, item, ...props }: ListItemProps<T>) => {\n const { isItem, readonly, dragPreview, setState: setRootState } = useListContext(LIST_ITEM_NAME);\n const ref = useRef<HTMLDivElement | null>(null);\n const dragHandleRef = useRef<HTMLElement | null>(null);\n const [state, setState] = useState<ItemDragState>(idle);\n\n useEffect(() => {\n const element = ref.current;\n invariant(element);\n return combine(\n //\n // https://atlassian.design/components/pragmatic-drag-and-drop/core-package/adapters/element/about#draggable\n //\n draggable({\n element,\n dragHandle: dragHandleRef.current!,\n canDrag: () => !readonly,\n getInitialData: () => item as any,\n onGenerateDragPreview: dragPreview\n ? ({ nativeSetDragImage, source }) => {\n const rect = source.element.getBoundingClientRect();\n setCustomNativeDragPreview({\n nativeSetDragImage,\n getOffset: ({ container }) => {\n const { height } = container.getBoundingClientRect();\n return { x: 20, y: height / 2 };\n },\n render: ({ container }) => {\n container.style.width = rect.width + 'px';\n setState({ type: 'preview', container });\n setRootState({ type: 'preview', container, item });\n return () => {}; // TODO(burdon): Cleanup.\n },\n });\n }\n : undefined,\n onDragStart: () => {\n setState({ type: 'is-dragging' });\n setRootState({ type: 'is-dragging', item });\n },\n onDrop: () => {\n setState(idle);\n setRootState(idle);\n },\n }),\n\n //\n // https://atlassian.design/components/pragmatic-drag-and-drop/core-package/adapters/element/about#drop-target-for-elements\n //\n dropTargetForElements({\n element,\n canDrop: ({ source }) => {\n return (source.element !== element && isItem?.(source.data)) ?? false;\n },\n getData: ({ input }) => {\n return attachClosestEdge(item as any, { element, input, allowedEdges: ['top', 'bottom'] });\n },\n getIsSticky: () => true,\n onDragEnter: ({ self }) => {\n const closestEdge = extractClosestEdge(self.data);\n setState({ type: 'is-dragging-over', closestEdge });\n },\n onDragLeave: () => {\n setState(idle);\n },\n onDrag: ({ self }) => {\n const closestEdge = extractClosestEdge(self.data);\n setState((current) => {\n if (current.type === 'is-dragging-over' && current.closestEdge === closestEdge) {\n return current;\n }\n return { type: 'is-dragging-over', closestEdge };\n });\n },\n onDrop: () => {\n setState(idle);\n },\n }),\n );\n }, [item]);\n\n return (\n <ListItemProvider item={item} dragHandleRef={dragHandleRef}>\n <div ref={ref} role='listitem' className={mx('flex relative', classNames, stateStyles[state.type])} {...props}>\n {children}\n {state.type === 'is-dragging-over' && state.closestEdge && (\n <NaturalListItem.DropIndicator edge={state.closestEdge} />\n )}\n </div>\n </ListItemProvider>\n );\n};\n\n//\n// List item components\n//\n\nexport const ListItemDeleteButton = ({\n autoHide = true,\n classNames,\n disabled,\n icon = 'ph--x--regular',\n label,\n ...props\n}: Partial<Pick<IconButtonProps, 'icon'>> &\n Omit<IconButtonProps, 'icon' | 'label'> & { autoHide?: boolean; label?: string }) => {\n const { state } = useListContext('DELETE_BUTTON');\n const isDisabled = state.type !== 'idle' || disabled;\n const { t } = useTranslation('os');\n return (\n <IconButton\n iconOnly\n variant='ghost'\n {...props}\n icon={icon}\n disabled={isDisabled}\n label={label ?? t('delete label')}\n classNames={[classNames, autoHide && disabled && 'hidden']}\n />\n );\n};\n\nexport const ListItemButton = ({\n autoHide = true,\n iconOnly = true,\n variant = 'ghost',\n classNames,\n disabled,\n ...props\n}: IconButtonProps & { autoHide?: boolean }) => {\n const { state } = useListContext('ITEM_BUTTON');\n const isDisabled = state.type !== 'idle' || disabled;\n return (\n <IconButton\n {...props}\n disabled={isDisabled}\n iconOnly={iconOnly}\n variant={variant}\n classNames={[classNames, autoHide && disabled && 'hidden']}\n />\n );\n};\n\nexport const ListItemDragHandle = ({ disabled }: Pick<IconButtonProps, 'disabled'>) => {\n const { dragHandleRef } = useListItemContext('DRAG_HANDLE');\n const { t } = useTranslation('os');\n return (\n <IconButton\n iconOnly\n variant='ghost'\n label={t('drag handle label')}\n ref={dragHandleRef as any}\n icon='ph--dots-six-vertical--regular'\n disabled={disabled}\n />\n );\n};\n\nexport const ListItemDragPreview = <T extends ListItemRecord>({\n children,\n}: {\n children: ({ item }: { item: T }) => ReactNode;\n}) => {\n const { state } = useListContext('DRAG_PREVIEW');\n return state?.type === 'preview' ? createPortal(children({ item: state.item }), state.container) : null;\n};\n\nexport const ListItemWrapper = ({ classNames, children }: ThemedClassName<PropsWithChildren>) => (\n <div className={mx('flex is-full gap-2', classNames)}>{children}</div>\n);\n\nexport const ListItemTitle = ({\n classNames,\n children,\n ...props\n}: ThemedClassName<PropsWithChildren<ComponentProps<'div'>>>) => (\n <div className={mx('flex grow items-center truncate', classNames)} {...props}>\n {children}\n </div>\n);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { monitorForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';\nimport { extractClosestEdge } from '@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge';\nimport { getReorderDestinationIndex } from '@atlaskit/pragmatic-drag-and-drop-hitbox/util/get-reorder-destination-index';\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type ReactNode, useCallback, useEffect, useState } from 'react';\n\nimport { type ItemDragState, type ListItemRecord, idle } from './ListItem';\n\ntype ListContext<T extends ListItemRecord> = {\n // TODO(burdon): Rename drag state.\n state: ItemDragState & { item?: T };\n setState: (state: ItemDragState & { item?: T }) => void;\n readonly?: boolean;\n dragPreview?: boolean;\n isItem?: (item: any) => boolean;\n getId?: (item: T) => string; // TODO(burdon): Require if T doesn't conform to type.\n};\n\nconst LIST_NAME = 'List';\n\nexport const [ListProvider, useListContext] = createContext<ListContext<any>>(LIST_NAME);\n\nexport type ListRendererProps<T extends ListItemRecord> = {\n state: ListContext<T>['state'];\n items: T[];\n};\n\nconst defaultGetId = <T extends ListItemRecord>(item: T) => (item as any)?.id;\n\nexport type ListRootProps<T extends ListItemRecord> = {\n children?: (props: ListRendererProps<T>) => ReactNode;\n items?: T[];\n onMove?: (fromIndex: number, toIndex: number) => void;\n} & Pick<ListContext<T>, 'isItem' | 'getId' | 'readonly' | 'dragPreview'>;\n\nexport const ListRoot = <T extends ListItemRecord>({\n children,\n items,\n isItem,\n getId = defaultGetId,\n onMove,\n ...props\n}: ListRootProps<T>) => {\n const isEqual = useCallback(\n (a: T, b: T) => {\n const idA = getId?.(a);\n const idB = getId?.(b);\n\n if (idA !== undefined && idB !== undefined) {\n return idA === idB;\n } else {\n // Fallback for primitive values or when getId fails.\n // NOTE(ZaymonFC): After drag and drop, pragmatic internally serializes drop targets which breaks reference equality.\n // You must provide an `getId` function that returns a stable identifier for your items.\n return a === b;\n }\n },\n [getId],\n );\n\n const [state, setState] = useState<ListContext<T>['state']>(idle);\n useEffect(() => {\n if (!items) {\n return;\n }\n\n return monitorForElements({\n canMonitor: ({ source }) => isItem?.(source.data) ?? false,\n onDrop: ({ location, source }) => {\n const target = location.current.dropTargets[0];\n if (!target) {\n return;\n }\n\n const sourceData = source.data;\n const targetData = target.data;\n if (!isItem?.(sourceData) || !isItem?.(targetData)) {\n return;\n }\n\n const sourceIdx = items.findIndex((item) => isEqual(item, sourceData as T));\n const targetIdx = items.findIndex((item) => isEqual(item, targetData as T));\n if (targetIdx < 0 || sourceIdx < 0) {\n return;\n }\n const closestEdgeOfTarget = extractClosestEdge(targetData);\n const destinationIndex = getReorderDestinationIndex({\n closestEdgeOfTarget,\n startIndex: sourceIdx,\n indexOfTarget: targetIdx,\n axis: 'vertical',\n });\n\n onMove?.(sourceIdx, destinationIndex);\n },\n });\n }, [items, isEqual, onMove]);\n\n return (\n <ListProvider {...{ state, setState, isItem, ...props }}>{children?.({ state, items: items ?? [] })}</ListProvider>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport {\n ListItem,\n ListItemButton,\n ListItemDeleteButton,\n ListItemDragHandle,\n ListItemDragPreview,\n type ListItemProps,\n type ListItemRecord,\n ListItemTitle,\n ListItemWrapper,\n} from './ListItem';\nimport { ListRoot, type ListRootProps } from './ListRoot';\n\n// TODO(burdon): Multi-select model.\n// TODO(burdon): Key nav.\n// TODO(burdon): Animation.\n// TODO(burdon): Constrain axis.\n// TODO(burdon): Tree view.\n// TODO(burdon): Fix autoscroll while dragging.\n\n/**\n * Draggable list.\n * Ref: https://github.com/atlassian/pragmatic-drag-and-drop\n * Ref: https://github.com/alexreardon/pdnd-react-tailwind/blob/main/src/task.tsx\n */\nexport const List = {\n Root: ListRoot,\n Item: ListItem,\n ItemDragPreview: ListItemDragPreview,\n ItemWrapper: ListItemWrapper,\n ItemDragHandle: ListItemDragHandle,\n ItemDeleteButton: ListItemDeleteButton,\n ItemButton: ListItemButton,\n ItemTitle: ListItemTitle,\n};\n\ntype ListItem = ListItemRecord;\n\nexport type { ListRootProps, ListItemProps, ListItem, ListItemRecord };\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useMemo } from 'react';\n\nimport { type HasId } from '@dxos/echo-schema';\nimport { Treegrid, type TreegridRootProps } from '@dxos/react-ui';\n\nimport { type TreeContextType, TreeProvider } from './TreeContext';\nimport { TreeItem, type TreeItemProps } from './TreeItem';\n\nexport type TreeProps<T extends HasId = any, O = any> = {\n root?: T;\n path?: string[];\n id: string;\n} & TreeContextType<T, O> &\n Partial<Pick<TreegridRootProps, 'gridTemplateColumns' | 'classNames'>> &\n Pick<TreeItemProps<T>, 'draggable' | 'renderColumns' | 'canDrop' | 'onOpenChange' | 'onSelect' | 'levelOffset'>;\n\nexport const Tree = <T extends HasId = any, O = any>({\n root,\n path,\n id,\n useItems,\n getProps,\n isOpen,\n isCurrent,\n draggable = false,\n gridTemplateColumns = '[tree-row-start] 1fr min-content [tree-row-end]',\n classNames,\n levelOffset,\n renderColumns,\n canDrop,\n onOpenChange,\n onSelect,\n}: TreeProps<T, O>) => {\n const context = useMemo(\n () => ({\n useItems,\n getProps,\n isOpen,\n isCurrent,\n }),\n [useItems, getProps, isOpen, isCurrent],\n );\n const items = useItems(root);\n const treePath = useMemo(() => (path ? [...path, id] : [id]), [id, path]);\n\n return (\n <Treegrid.Root gridTemplateColumns={gridTemplateColumns} classNames={classNames}>\n <TreeProvider value={context}>\n {items.map((item, index) => (\n <TreeItem\n key={item.id}\n item={item}\n last={index === items.length - 1}\n path={treePath}\n levelOffset={levelOffset}\n draggable={draggable}\n renderColumns={renderColumns}\n canDrop={canDrop}\n onOpenChange={onOpenChange}\n onSelect={onSelect}\n />\n ))}\n </TreeProvider>\n </Treegrid.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { createContext, useContext } from 'react';\n\nimport { raise } from '@dxos/debug';\nimport { type Label } from '@dxos/react-ui';\n\nexport type TreeItemDataProps = {\n id: string;\n label: Label;\n parentOf?: string[];\n icon?: string;\n disabled?: boolean;\n className?: string;\n headingClassName?: string;\n testId?: string;\n};\n\nexport type TreeContextType<T = any, O = any> = {\n useItems: (parent?: T, options?: O) => T[];\n getProps: (item: T, parent: string[]) => TreeItemDataProps;\n isOpen: (path: string[], item: T) => boolean;\n isCurrent: (path: string[], item: T) => boolean;\n};\n\nconst TreeContext = createContext<null | TreeContextType>(null);\n\nexport const TreeProvider = TreeContext.Provider;\n\nexport const useTree = () => useContext(TreeContext) ?? raise(new Error('TreeContext not found'));\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { combine } from '@atlaskit/pragmatic-drag-and-drop/combine';\nimport { draggable, dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';\nimport {\n type Instruction,\n type ItemMode,\n attachInstruction,\n extractInstruction,\n} from '@atlaskit/pragmatic-drag-and-drop-hitbox/tree-item';\nimport { Schema } from 'effect';\nimport React, { type FC, type KeyboardEvent, memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { type HasId } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { TreeItem as NaturalTreeItem, Treegrid } from '@dxos/react-ui';\nimport {\n ghostHover,\n hoverableControls,\n hoverableFocusedKeyboardControls,\n hoverableFocusedWithinControls,\n} from '@dxos/react-ui-theme';\n\nimport { DEFAULT_INDENTATION, paddingIndentation } from './helpers';\nimport { useTree } from './TreeContext';\nimport { TreeItemHeading } from './TreeItemHeading';\nimport { TreeItemToggle } from './TreeItemToggle';\n\ntype TreeItemState = 'idle' | 'dragging' | 'preview' | 'parent-of-instruction';\n\nconst hoverableDescriptionIcons =\n '[--icons-color:inherit] hover-hover:[--icons-color:var(--description-text)] hover-hover:hover:[--icons-color:inherit] focus-within:[--icons-color:inherit]';\n\nexport const TreeDataSchema = Schema.Struct({\n id: Schema.String,\n path: Schema.Array(Schema.String),\n item: Schema.Any,\n});\n\nexport type TreeData = Schema.Schema.Type<typeof TreeDataSchema>;\nexport const isTreeData = (data: unknown): data is TreeData => Schema.is(TreeDataSchema)(data);\n\nexport type ColumnRenderer<T extends HasId = any> = FC<{\n item: T;\n path: string[];\n open: boolean;\n menuOpen: boolean;\n setMenuOpen: (open: boolean) => void;\n}>;\n\nexport type TreeItemProps<T extends HasId = any> = {\n item: T;\n path: string[];\n levelOffset?: number;\n last: boolean;\n draggable?: boolean;\n renderColumns?: ColumnRenderer<T>;\n canDrop?: (params: { source: TreeData; target: TreeData }) => boolean;\n onOpenChange?: (params: { item: T; path: string[]; open: boolean }) => void;\n onSelect?: (params: { item: T; path: string[]; current: boolean; option: boolean }) => void;\n};\n\nconst RawTreeItem = <T extends HasId = any>({\n item,\n path: _path,\n last,\n draggable: _draggable,\n renderColumns: Columns,\n canDrop,\n onOpenChange,\n onSelect,\n levelOffset = 2,\n}: TreeItemProps<T>) => {\n const rowRef = useRef<HTMLDivElement | null>(null);\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n const openRef = useRef(false);\n const cancelExpandRef = useRef<NodeJS.Timeout | null>(null);\n const [_state, setState] = useState<TreeItemState>('idle');\n const [instruction, setInstruction] = useState<Instruction | null>(null);\n const [menuOpen, setMenuOpen] = useState(false);\n\n const { useItems, getProps, isOpen, isCurrent } = useTree();\n const items = useItems(item);\n const { id, label, parentOf, icon, disabled, className, headingClassName, testId } = getProps(item, _path);\n const path = useMemo(() => [..._path, id], [_path, id]);\n const open = isOpen(path, item);\n const current = isCurrent(path, item);\n const level = path.length - levelOffset;\n const isBranch = !!parentOf;\n const mode: ItemMode = last ? 'last-in-group' : open ? 'expanded' : 'standard';\n\n const cancelExpand = useCallback(() => {\n if (cancelExpandRef.current) {\n clearTimeout(cancelExpandRef.current);\n cancelExpandRef.current = null;\n }\n }, []);\n\n useEffect(() => {\n if (!_draggable) {\n return;\n }\n\n invariant(buttonRef.current);\n\n const data = { id, path, item } satisfies TreeData;\n\n // https://atlassian.design/components/pragmatic-drag-and-drop/core-package/adapters/element/about\n return combine(\n draggable({\n element: buttonRef.current,\n getInitialData: () => data,\n onDragStart: () => {\n setState('dragging');\n if (open) {\n openRef.current = true;\n onOpenChange?.({ item, path, open: false });\n }\n },\n onDrop: () => {\n setState('idle');\n if (openRef.current) {\n onOpenChange?.({ item, path, open: true });\n }\n },\n }),\n // https://github.com/atlassian/pragmatic-drag-and-drop/blob/main/packages/hitbox/constellation/index/about.mdx\n dropTargetForElements({\n element: buttonRef.current,\n getData: ({ input, element }) => {\n return attachInstruction(data, {\n input,\n element,\n indentPerLevel: DEFAULT_INDENTATION,\n currentLevel: level,\n mode,\n block: isBranch ? [] : ['make-child'],\n });\n },\n canDrop: ({ source }) => {\n const _canDrop = canDrop ?? (() => true);\n return source.element !== buttonRef.current && _canDrop({ source: source.data as TreeData, target: data });\n },\n getIsSticky: () => true,\n onDrag: ({ self, source }) => {\n const instruction = extractInstruction(self.data);\n\n if (source.data.id !== id) {\n if (instruction?.type === 'make-child' && isBranch && !open && !cancelExpandRef.current) {\n cancelExpandRef.current = setTimeout(() => {\n onOpenChange?.({ item, path, open: true });\n }, 500);\n }\n\n if (instruction?.type !== 'make-child') {\n cancelExpand();\n }\n\n setInstruction(instruction);\n } else if (instruction?.type === 'reparent') {\n // TODO(wittjosiah): This is not occurring in the current implementation.\n setInstruction(instruction);\n } else {\n setInstruction(null);\n }\n },\n onDragLeave: () => {\n cancelExpand();\n setInstruction(null);\n },\n onDrop: () => {\n cancelExpand();\n setInstruction(null);\n },\n }),\n );\n }, [_draggable, item, id, mode, path, open, canDrop]);\n\n // Cancel expand on unmount.\n useEffect(() => () => cancelExpand(), [cancelExpand]);\n\n const handleOpenChange = useCallback(\n () => onOpenChange?.({ item, path, open: !open }),\n [onOpenChange, item, path, open],\n );\n\n const handleSelect = useCallback(\n (option = false) => {\n if (isBranch) {\n handleOpenChange();\n } else {\n rowRef.current?.focus();\n onSelect?.({ item, path, current: !current, option });\n }\n },\n [item, path, current, isBranch, handleOpenChange, onSelect],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowRight':\n isBranch && !open && handleOpenChange();\n break;\n case 'ArrowLeft':\n isBranch && open && handleOpenChange();\n break;\n case ' ':\n handleSelect(event.altKey);\n break;\n }\n },\n [isBranch, open, handleOpenChange, handleSelect],\n );\n\n return (\n <>\n <Treegrid.Row\n ref={rowRef}\n key={id}\n id={id}\n aria-labelledby={`${id}__label`}\n parentOf={parentOf?.join(Treegrid.PARENT_OF_SEPARATOR)}\n classNames={[\n 'grid grid-cols-subgrid col-[tree-row] mbs-0.5 aria-[current]:bg-activeSurface',\n hoverableControls,\n hoverableFocusedKeyboardControls,\n hoverableFocusedWithinControls,\n hoverableDescriptionIcons,\n ghostHover,\n className,\n ]}\n data-itemid={id}\n data-testid={testId}\n // NOTE(thure): This is intentionally an empty string to for descendents to select by in the CSS\n // without alerting the user (except for in the correct link element). See also:\n // https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-current#description\n aria-current={current ? ('' as 'page') : undefined}\n onKeyDown={handleKeyDown}\n onContextMenu={(event) => {\n event.preventDefault();\n setMenuOpen(true);\n }}\n >\n <Treegrid.Cell\n indent\n classNames='relative grid grid-cols-subgrid col-[tree-row]'\n style={paddingIndentation(level)}\n >\n <div role='none' className='flex items-center'>\n <TreeItemToggle isBranch={isBranch} open={open} onToggle={handleOpenChange} />\n <TreeItemHeading\n ref={buttonRef}\n label={label}\n icon={icon}\n className={headingClassName}\n disabled={disabled}\n current={current}\n onSelect={handleSelect}\n />\n </div>\n {Columns && <Columns item={item} path={path} open={open} menuOpen={menuOpen} setMenuOpen={setMenuOpen} />}\n {instruction && <NaturalTreeItem.DropIndicator instruction={instruction} gap={2} />}\n </Treegrid.Cell>\n </Treegrid.Row>\n {open &&\n items.map((item, index) => (\n <TreeItem\n key={item.id}\n item={item}\n path={path}\n last={index === items.length - 1}\n draggable={_draggable}\n renderColumns={Columns}\n canDrop={canDrop}\n onOpenChange={onOpenChange}\n onSelect={onSelect}\n />\n ))}\n </>\n );\n};\n\nexport const TreeItem = memo(RawTreeItem) as FC<TreeItemProps>;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nexport const DEFAULT_INDENTATION = 8;\n\nexport const paddingIndentation = (level: number, indentation = DEFAULT_INDENTATION) => ({\n paddingInlineStart: `${(level - 1) * indentation}px`,\n});\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type KeyboardEvent, type MouseEvent, forwardRef, memo, useCallback } from 'react';\n\nimport { Button, Icon, type Label, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { TextTooltip } from '@dxos/react-ui-text-tooltip';\n\n// TODO(wittjosiah): Consider whether there should be a separate disabled prop which was visually distinct\n// rather than just making the item unselectable.\nexport type NavTreeItemHeadingProps = {\n label: Label;\n icon?: string;\n className?: string;\n disabled?: boolean;\n current?: boolean;\n onSelect?: (option: boolean) => void;\n};\n\nexport const TreeItemHeading = memo(\n forwardRef<HTMLButtonElement, NavTreeItemHeadingProps>(\n ({ label, icon, className, disabled, current, onSelect }, forwardedRef) => {\n const { t } = useTranslation();\n\n const handleSelect = useCallback(\n (event: MouseEvent) => {\n onSelect?.(event.altKey);\n },\n [onSelect],\n );\n\n const handleButtonKeydown = useCallback(\n (event: KeyboardEvent) => {\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n event.stopPropagation();\n onSelect?.(event.altKey);\n }\n },\n [onSelect],\n );\n\n return (\n <TextTooltip\n text={toLocalizedString(label, t)}\n side='bottom'\n truncateQuery='span[data-tooltip]'\n onlyWhenTruncating\n asChild\n ref={forwardedRef}\n >\n <Button\n data-testid='treeItem.heading'\n variant='ghost'\n density='fine'\n classNames={[\n 'grow gap-2 pis-0.5 hover:bg-transparent dark:hover:bg-transparent',\n 'disabled:cursor-default disabled:opacity-100',\n className,\n ]}\n disabled={disabled}\n onClick={handleSelect}\n onKeyDown={handleButtonKeydown}\n {...(current && { 'aria-current': 'location' })}\n >\n {icon && <Icon icon={icon ?? 'ph--placeholder--regular'} size={5} classNames='mlb-1' />}\n <span className='flex-1 is-0 truncate text-start text-sm font-normal' data-tooltip>\n {toLocalizedString(label, t)}\n </span>\n </Button>\n </TextTooltip>\n );\n },\n ),\n);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { forwardRef, memo } from 'react';\n\nimport { Button, Icon } from '@dxos/react-ui';\n\nexport type TreeItemToggleProps = {\n open?: boolean;\n isBranch?: boolean;\n onToggle?: () => void;\n hidden?: boolean;\n};\n\nexport const TreeItemToggle = memo(\n forwardRef<HTMLButtonElement, TreeItemToggleProps>(({ open, isBranch, hidden, onToggle }, forwardedRef) => {\n return (\n <Button\n ref={forwardedRef}\n data-testid='treeItem.toggle'\n aria-expanded={open}\n variant='ghost'\n density='fine'\n classNames={['is-6 pli-0 dx-focus-ring-inset', hidden ? 'hidden' : !isBranch && 'invisible']}\n onClick={onToggle}\n >\n <Icon icon='ph--caret-right--bold' size={3} classNames={['transition duration-200', open && 'rotate-90']} />\n </Button>\n );\n }),\n);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nconst SEPARATOR = '+';\n\nexport const Path = {\n create: (...args: string[]) => args.join(SEPARATOR),\n\n parts: (path: string) => path.split(SEPARATOR),\n length: (path: string) => path.split(SEPARATOR).length,\n first: (path: string) => path.split(SEPARATOR)[0] ?? path,\n last: (path: string) => path.split(SEPARATOR).at(-1) ?? path,\n parent: (path: string) => path.split(SEPARATOR).slice(0, -1).join(SEPARATOR),\n\n hasRoot: (path: string, id: string) => Path.first(path) === id,\n hasChild: (path: string, compare: string) => Path.parent(compare) === path,\n hasDescendent: (path: string, compare: string) => compare !== path && compare.startsWith(path),\n siblings: (path: string, compare: string) => Path.parent(path) === Path.parent(compare),\n onPath: (path: string, id: string) => Path.parts(path).includes(id),\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["AccordionPrimitive", "createContext", "React", "Icon", "mx", "AccordionPrimitive", "createContext", "React", "mx", "ACCORDION_NAME", "AccordionProvider", "useAccordionContext", "createContext", "defaultGetId", "item", "id", "AccordionRoot", "classNames", "items", "getId", "children", "value", "defaultValue", "onValueChange", "Root", "type", "className", "mx", "ACCORDION_ITEM_NAME", "AccordionItemProvider", "useDxAccordionItemContext", "createContext", "AccordionItem", "children", "classNames", "item", "getId", "useAccordionContext", "React", "Item", "value", "className", "mx", "AccordionItemHeader", "props", "Header", "Trigger", "Icon", "icon", "size", "AccordionItemBody", "Content", "div", "role", "Accordion", "Root", "AccordionRoot", "Item", "AccordionItem", "ItemHeader", "AccordionItemHeader", "ItemBody", "AccordionItemBody", "combine", "draggable", "dropTargetForElements", "setCustomNativeDragPreview", "attachClosestEdge", "extractClosestEdge", "createContext", "React", "useEffect", "useRef", "useState", "createPortal", "invariant", "IconButton", "ListItem", "NaturalListItem", "useTranslation", "mx", "monitorForElements", "extractClosestEdge", "getReorderDestinationIndex", "createContext", "React", "useCallback", "useEffect", "useState", "LIST_NAME", "ListProvider", "useListContext", "createContext", "defaultGetId", "item", "id", "ListRoot", "children", "items", "isItem", "getId", "onMove", "props", "isEqual", "useCallback", "a", "b", "idA", "idB", "undefined", "state", "setState", "useState", "idle", "useEffect", "monitorForElements", "canMonitor", "source", "data", "onDrop", "location", "target", "current", "dropTargets", "sourceData", "targetData", "sourceIdx", "findIndex", "targetIdx", "closestEdgeOfTarget", "extractClosestEdge", "destinationIndex", "getReorderDestinationIndex", "startIndex", "indexOfTarget", "axis", "React", "idle", "type", "stateStyles", "defaultContext", "LIST_ITEM_NAME", "ListItemProvider", "useListItemContext", "createContext", "ListItem", "children", "classNames", "item", "props", "isItem", "readonly", "dragPreview", "setState", "setRootState", "useListContext", "ref", "useRef", "dragHandleRef", "state", "useState", "useEffect", "element", "current", "invariant", "combine", "draggable", "dragHandle", "canDrag", "getInitialData", "onGenerateDragPreview", "nativeSetDragImage", "source", "rect", "getBoundingClientRect", "setCustomNativeDragPreview", "getOffset", "container", "height", "x", "y", "render", "style", "width", "undefined", "onDragStart", "onDrop", "dropTargetForElements", "canDrop", "data", "getData", "input", "attachClosestEdge", "allowedEdges", "getIsSticky", "onDragEnter", "self", "closestEdge", "extractClosestEdge", "onDragLeave", "onDrag", "React", "div", "role", "className", "mx", "NaturalListItem", "DropIndicator", "edge", "ListItemDeleteButton", "autoHide", "disabled", "icon", "label", "isDisabled", "t", "useTranslation", "IconButton", "iconOnly", "variant", "ListItemButton", "ListItemDragHandle", "ListItemDragPreview", "createPortal", "ListItemWrapper", "ListItemTitle", "List", "Root", "ListRoot", "Item", "ListItem", "ItemDragPreview", "ListItemDragPreview", "ItemWrapper", "ListItemWrapper", "ItemDragHandle", "ListItemDragHandle", "ItemDeleteButton", "ListItemDeleteButton", "ItemButton", "ListItemButton", "ItemTitle", "ListItemTitle", "React", "useMemo", "Treegrid", "createContext", "useContext", "raise", "TreeContext", "createContext", "TreeProvider", "Provider", "useTree", "useContext", "raise", "Error", "combine", "draggable", "dropTargetForElements", "attachInstruction", "extractInstruction", "Schema", "React", "memo", "useCallback", "useEffect", "useMemo", "useRef", "useState", "invariant", "TreeItem", "NaturalTreeItem", "Treegrid", "ghostHover", "hoverableControls", "hoverableFocusedKeyboardControls", "hoverableFocusedWithinControls", "DEFAULT_INDENTATION", "paddingIndentation", "level", "indentation", "paddingInlineStart", "React", "forwardRef", "memo", "useCallback", "Button", "Icon", "toLocalizedString", "useTranslation", "TextTooltip", "TreeItemHeading", "memo", "forwardRef", "label", "icon", "className", "disabled", "current", "onSelect", "forwardedRef", "t", "useTranslation", "handleSelect", "useCallback", "event", "altKey", "handleButtonKeydown", "key", "preventDefault", "stopPropagation", "React", "TextTooltip", "text", "toLocalizedString", "side", "truncateQuery", "onlyWhenTruncating", "asChild", "ref", "Button", "data-testid", "variant", "density", "classNames", "onClick", "onKeyDown", "Icon", "size", "span", "data-tooltip", "React", "forwardRef", "memo", "Button", "Icon", "TreeItemToggle", "memo", "forwardRef", "open", "isBranch", "hidden", "onToggle", "forwardedRef", "React", "Button", "ref", "data-testid", "aria-expanded", "variant", "density", "classNames", "onClick", "Icon", "icon", "size", "hoverableDescriptionIcons", "TreeDataSchema", "Schema", "Struct", "id", "String", "path", "Array", "item", "Any", "isTreeData", "data", "is", "RawTreeItem", "_path", "last", "draggable", "_draggable", "renderColumns", "Columns", "canDrop", "onOpenChange", "onSelect", "levelOffset", "rowRef", "useRef", "buttonRef", "openRef", "cancelExpandRef", "_state", "setState", "useState", "instruction", "setInstruction", "menuOpen", "setMenuOpen", "useItems", "getProps", "isOpen", "isCurrent", "useTree", "items", "label", "parentOf", "icon", "disabled", "className", "headingClassName", "testId", "useMemo", "open", "current", "level", "length", "isBranch", "mode", "cancelExpand", "useCallback", "clearTimeout", "useEffect", "invariant", "combine", "element", "getInitialData", "onDragStart", "onDrop", "dropTargetForElements", "getData", "input", "attachInstruction", "indentPerLevel", "DEFAULT_INDENTATION", "currentLevel", "block", "source", "_canDrop", "target", "getIsSticky", "onDrag", "self", "extractInstruction", "type", "setTimeout", "onDragLeave", "handleOpenChange", "handleSelect", "option", "focus", "handleKeyDown", "event", "key", "altKey", "React", "Treegrid", "Row", "ref", "aria-labelledby", "join", "PARENT_OF_SEPARATOR", "classNames", "hoverableControls", "hoverableFocusedKeyboardControls", "hoverableFocusedWithinControls", "ghostHover", "data-itemid", "data-testid", "aria-current", "undefined", "onKeyDown", "onContextMenu", "preventDefault", "Cell", "indent", "style", "paddingIndentation", "div", "role", "TreeItemToggle", "onToggle", "TreeItemHeading", "NaturalTreeItem", "DropIndicator", "gap", "map", "index", "TreeItem", "memo", "Tree", "root", "path", "id", "useItems", "getProps", "isOpen", "isCurrent", "draggable", "gridTemplateColumns", "classNames", "levelOffset", "renderColumns", "canDrop", "onOpenChange", "onSelect", "context", "useMemo", "items", "treePath", "React", "Treegrid", "Root", "TreeProvider", "value", "map", "item", "index", "TreeItem", "key", "last", "length", "SEPARATOR", "Path", "create", "args", "join", "parts", "path", "split", "length", "first", "last", "at", "parent", "slice", "hasRoot", "id", "hasChild", "compare", "hasDescendent", "startsWith", "siblings", "onPath", "includes"]
7
7
  }