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

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 (34) hide show
  1. package/dist/lib/browser/index.mjs +58 -44
  2. package/dist/lib/browser/index.mjs.map +3 -3
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +58 -44
  5. package/dist/lib/node-esm/index.mjs.map +3 -3
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/components/Accordion/Accordion.stories.d.ts +0 -3
  8. package/dist/types/src/components/Accordion/Accordion.stories.d.ts.map +1 -1
  9. package/dist/types/src/components/List/testing.d.ts +1 -1
  10. package/dist/types/src/components/List/testing.d.ts.map +1 -1
  11. package/dist/types/src/components/Tree/Tree.d.ts +3 -3
  12. package/dist/types/src/components/Tree/Tree.d.ts.map +1 -1
  13. package/dist/types/src/components/Tree/Tree.stories.d.ts +1 -1
  14. package/dist/types/src/components/Tree/TreeContext.d.ts +3 -2
  15. package/dist/types/src/components/Tree/TreeContext.d.ts.map +1 -1
  16. package/dist/types/src/components/Tree/TreeItem.d.ts +6 -2
  17. package/dist/types/src/components/Tree/TreeItem.d.ts.map +1 -1
  18. package/dist/types/src/components/Tree/TreeItemHeading.d.ts +4 -3
  19. package/dist/types/src/components/Tree/TreeItemHeading.d.ts.map +1 -1
  20. package/dist/types/src/components/Tree/TreeItemToggle.d.ts +3 -3
  21. package/dist/types/src/components/Tree/TreeItemToggle.d.ts.map +1 -1
  22. package/dist/types/src/components/Tree/testing.d.ts +2 -2
  23. package/dist/types/src/components/Tree/testing.d.ts.map +1 -1
  24. package/dist/types/tsconfig.tsbuildinfo +1 -1
  25. package/package.json +17 -17
  26. package/src/components/Accordion/Accordion.stories.tsx +2 -5
  27. package/src/components/List/List.stories.tsx +1 -1
  28. package/src/components/List/testing.ts +2 -2
  29. package/src/components/Tree/Tree.tsx +7 -2
  30. package/src/components/Tree/TreeContext.tsx +3 -2
  31. package/src/components/Tree/TreeItem.tsx +35 -29
  32. package/src/components/Tree/TreeItemHeading.tsx +8 -5
  33. package/src/components/Tree/TreeItemToggle.tsx +29 -18
  34. package/src/components/Tree/testing.ts +2 -2
@@ -436,11 +436,11 @@ import { useSignals as _useSignals7 } from "@preact-signals/safe-react/tracking"
436
436
  import { combine as combine2 } from "@atlaskit/pragmatic-drag-and-drop/combine";
437
437
  import { draggable as draggable2, dropTargetForElements as dropTargetForElements2 } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
438
438
  import { attachInstruction, extractInstruction } from "@atlaskit/pragmatic-drag-and-drop-hitbox/tree-item";
439
- import { Schema } from "effect";
439
+ import * as Schema from "effect/Schema";
440
440
  import React7, { memo as memo3, useCallback as useCallback3, useEffect as useEffect3, useMemo, useRef as useRef2, useState as useState3 } from "react";
441
441
  import { invariant as invariant2 } from "@dxos/invariant";
442
442
  import { TreeItem as NaturalTreeItem, Treegrid } from "@dxos/react-ui";
443
- import { ghostHover, hoverableControls, hoverableFocusedKeyboardControls, hoverableFocusedWithinControls } from "@dxos/react-ui-theme";
443
+ import { ghostFocusWithin, ghostHover, hoverableControls, hoverableFocusedKeyboardControls, hoverableFocusedWithinControls } from "@dxos/react-ui-theme";
444
444
 
445
445
  // src/components/Tree/helpers.ts
446
446
  var DEFAULT_INDENTATION = 8;
@@ -453,10 +453,12 @@ import { useSignals as _useSignals5 } from "@preact-signals/safe-react/tracking"
453
453
  import React5, { forwardRef, memo, useCallback as useCallback2 } from "react";
454
454
  import { Button, Icon as Icon2, toLocalizedString, useTranslation as useTranslation2 } from "@dxos/react-ui";
455
455
  import { TextTooltip } from "@dxos/react-ui-text-tooltip";
456
- var TreeItemHeading = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef(({ label, icon, className, disabled, current, onSelect }, forwardedRef) => {
456
+ import { getStyles } from "@dxos/react-ui-theme";
457
+ var TreeItemHeading = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef(({ label, className, icon, iconHue, disabled, current, onSelect }, forwardedRef) => {
457
458
  var _effect = _useSignals5();
458
459
  try {
459
460
  const { t } = useTranslation2();
461
+ const styles = iconHue ? getStyles(iconHue) : void 0;
460
462
  const handleSelect = useCallback2((event) => {
461
463
  onSelect?.(event.altKey);
462
464
  }, [
@@ -496,7 +498,10 @@ var TreeItemHeading = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef(({ label,
496
498
  }, icon && /* @__PURE__ */ React5.createElement(Icon2, {
497
499
  icon: icon ?? "ph--placeholder--regular",
498
500
  size: 5,
499
- classNames: "mlb-1"
501
+ classNames: [
502
+ "mlb-1",
503
+ styles?.icon
504
+ ]
500
505
  }), /* @__PURE__ */ React5.createElement("span", {
501
506
  className: "flex-1 is-0 truncate text-start text-sm font-normal",
502
507
  "data-tooltip": true
@@ -509,29 +514,31 @@ var TreeItemHeading = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef(({ label,
509
514
  // src/components/Tree/TreeItemToggle.tsx
510
515
  import { useSignals as _useSignals6 } from "@preact-signals/safe-react/tracking";
511
516
  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) => {
517
+ import { IconButton as IconButton2 } from "@dxos/react-ui";
518
+ var TreeItemToggle = /* @__PURE__ */ memo2(/* @__PURE__ */ forwardRef2(({ open, isBranch, hidden, classNames, ...props }, forwardedRef) => {
514
519
  var _effect = _useSignals6();
515
520
  try {
516
- return /* @__PURE__ */ React6.createElement(Button2, {
521
+ return /* @__PURE__ */ React6.createElement(IconButton2, {
517
522
  ref: forwardedRef,
518
523
  "data-testid": "treeItem.toggle",
519
524
  "aria-expanded": open,
520
525
  variant: "ghost",
521
526
  density: "fine",
522
527
  classNames: [
523
- "is-6 pli-0 dx-focus-ring-inset",
524
- hidden ? "hidden" : !isBranch && "invisible"
528
+ "bs-full is-6 pli-0",
529
+ "[&_svg]:transition-[transform] [&_svg]:duration-200",
530
+ open && "[&_svg]:rotate-90",
531
+ hidden ? "hidden" : !isBranch && "invisible",
532
+ classNames
525
533
  ],
526
- onClick: onToggle
527
- }, /* @__PURE__ */ React6.createElement(Icon3, {
528
- icon: "ph--caret-right--bold",
529
534
  size: 3,
530
- classNames: [
531
- "transition duration-200",
532
- open && "rotate-90"
533
- ]
534
- }));
535
+ icon: "ph--caret-right--bold",
536
+ iconOnly: true,
537
+ noTooltip: true,
538
+ label: open ? "Click to close" : "Click to open",
539
+ tabIndex: -1,
540
+ ...props
541
+ });
535
542
  } finally {
536
543
  _effect.f();
537
544
  }
@@ -546,7 +553,7 @@ var TreeDataSchema = Schema.Struct({
546
553
  item: Schema.Any
547
554
  });
548
555
  var isTreeData = (data) => Schema.is(TreeDataSchema)(data);
549
- var RawTreeItem = ({ item, path: _path, last, draggable: _draggable, renderColumns: Columns, canDrop, onOpenChange, onSelect, levelOffset = 2 }) => {
556
+ var RawTreeItem = ({ item, path: _path, levelOffset = 2, last, draggable: _draggable, renderColumns: Columns, canDrop, canSelect, onOpenChange, onSelect }) => {
550
557
  var _effect = _useSignals7();
551
558
  try {
552
559
  const rowRef = useRef2(null);
@@ -558,7 +565,7 @@ var RawTreeItem = ({ item, path: _path, last, draggable: _draggable, renderColum
558
565
  const [menuOpen, setMenuOpen] = useState3(false);
559
566
  const { useItems, getProps, isOpen, isCurrent } = useTree();
560
567
  const items = useItems(item);
561
- const { id, label, parentOf, icon, disabled, className, headingClassName, testId } = getProps(item, _path);
568
+ const { id, parentOf, label, className, headingClassName, icon, iconHue, disabled, testId } = getProps(item, _path);
562
569
  const path = useMemo(() => [
563
570
  ..._path,
564
571
  id
@@ -571,6 +578,10 @@ var RawTreeItem = ({ item, path: _path, last, draggable: _draggable, renderColum
571
578
  const level = path.length - levelOffset;
572
579
  const isBranch = !!parentOf;
573
580
  const mode = last ? "last-in-group" : open ? "expanded" : "standard";
581
+ const canSelectItem = canSelect?.({
582
+ item,
583
+ path
584
+ }) ?? true;
574
585
  const cancelExpand = useCallback3(() => {
575
586
  if (cancelExpandRef.current) {
576
587
  clearTimeout(cancelExpandRef.current);
@@ -583,7 +594,7 @@ var RawTreeItem = ({ item, path: _path, last, draggable: _draggable, renderColum
583
594
  }
584
595
  invariant2(buttonRef.current, void 0, {
585
596
  F: __dxlog_file2,
586
- L: 106,
597
+ L: 110,
587
598
  S: void 0,
588
599
  A: [
589
600
  "buttonRef.current",
@@ -688,7 +699,7 @@ var RawTreeItem = ({ item, path: _path, last, draggable: _draggable, renderColum
688
699
  useEffect3(() => () => cancelExpand(), [
689
700
  cancelExpand
690
701
  ]);
691
- const handleOpenChange = useCallback3(() => onOpenChange?.({
702
+ const handleOpenToggle = useCallback3(() => onOpenChange?.({
692
703
  item,
693
704
  path,
694
705
  open: !open
@@ -699,9 +710,13 @@ var RawTreeItem = ({ item, path: _path, last, draggable: _draggable, renderColum
699
710
  open
700
711
  ]);
701
712
  const handleSelect = useCallback3((option = false) => {
702
- if (isBranch) {
703
- handleOpenChange();
704
- } else {
713
+ if (isBranch && (option || current)) {
714
+ handleOpenToggle();
715
+ } else if (canSelectItem) {
716
+ canSelect?.({
717
+ item,
718
+ path
719
+ });
705
720
  rowRef.current?.focus();
706
721
  onSelect?.({
707
722
  item,
@@ -715,25 +730,21 @@ var RawTreeItem = ({ item, path: _path, last, draggable: _draggable, renderColum
715
730
  path,
716
731
  current,
717
732
  isBranch,
718
- handleOpenChange,
733
+ canSelectItem,
734
+ handleOpenToggle,
719
735
  onSelect
720
736
  ]);
721
737
  const handleKeyDown = useCallback3((event) => {
722
738
  switch (event.key) {
723
739
  case "ArrowRight":
724
- isBranch && !open && handleOpenChange();
725
- break;
726
740
  case "ArrowLeft":
727
- isBranch && open && handleOpenChange();
728
- break;
729
- case " ":
730
- handleSelect(event.altKey);
741
+ isBranch && handleOpenToggle();
731
742
  break;
732
743
  }
733
744
  }, [
734
745
  isBranch,
735
746
  open,
736
- handleOpenChange,
747
+ handleOpenToggle,
737
748
  handleSelect
738
749
  ]);
739
750
  return /* @__PURE__ */ React7.createElement(React7.Fragment, null, /* @__PURE__ */ React7.createElement(Treegrid.Row, {
@@ -749,6 +760,7 @@ var RawTreeItem = ({ item, path: _path, last, draggable: _draggable, renderColum
749
760
  hoverableFocusedWithinControls,
750
761
  hoverableDescriptionIcons,
751
762
  ghostHover,
763
+ ghostFocusWithin,
752
764
  className
753
765
  ],
754
766
  "data-itemid": id,
@@ -762,25 +774,25 @@ var RawTreeItem = ({ item, path: _path, last, draggable: _draggable, renderColum
762
774
  event.preventDefault();
763
775
  setMenuOpen(true);
764
776
  }
765
- }, /* @__PURE__ */ React7.createElement(Treegrid.Cell, {
766
- indent: true,
767
- classNames: "relative grid grid-cols-subgrid col-[tree-row]",
768
- style: paddingIndentation(level)
769
777
  }, /* @__PURE__ */ React7.createElement("div", {
770
778
  role: "none",
771
- className: "flex items-center"
779
+ className: "indent relative grid grid-cols-subgrid col-[tree-row]",
780
+ style: paddingIndentation(level)
781
+ }, /* @__PURE__ */ React7.createElement(Treegrid.Cell, {
782
+ classNames: "flex items-center"
772
783
  }, /* @__PURE__ */ React7.createElement(TreeItemToggle, {
773
784
  isBranch,
774
785
  open,
775
- onToggle: handleOpenChange
786
+ onClick: handleOpenToggle
776
787
  }), /* @__PURE__ */ React7.createElement(TreeItemHeading, {
777
- ref: buttonRef,
778
- label,
779
- icon,
780
- className: headingClassName,
781
788
  disabled,
782
789
  current,
783
- onSelect: handleSelect
790
+ label,
791
+ className: headingClassName,
792
+ icon,
793
+ iconHue,
794
+ onSelect: handleSelect,
795
+ ref: buttonRef
784
796
  })), Columns && /* @__PURE__ */ React7.createElement(Columns, {
785
797
  item,
786
798
  path,
@@ -798,6 +810,7 @@ var RawTreeItem = ({ item, path: _path, last, draggable: _draggable, renderColum
798
810
  draggable: _draggable,
799
811
  renderColumns: Columns,
800
812
  canDrop,
813
+ canSelect,
801
814
  onOpenChange,
802
815
  onSelect
803
816
  })));
@@ -808,7 +821,7 @@ var RawTreeItem = ({ item, path: _path, last, draggable: _draggable, renderColum
808
821
  var TreeItem = /* @__PURE__ */ memo3(RawTreeItem);
809
822
 
810
823
  // src/components/Tree/Tree.tsx
811
- var Tree = ({ root, path, id, useItems, getProps, isOpen, isCurrent, draggable: draggable3 = false, gridTemplateColumns = "[tree-row-start] 1fr min-content [tree-row-end]", classNames, levelOffset, renderColumns, canDrop, onOpenChange, onSelect }) => {
824
+ var Tree = ({ root, path, id, useItems, getProps, isOpen, isCurrent, draggable: draggable3 = false, gridTemplateColumns = "[tree-row-start] 1fr min-content [tree-row-end]", classNames, levelOffset, renderColumns, canDrop, canSelect, onOpenChange, onSelect }) => {
812
825
  var _effect = _useSignals8();
813
826
  try {
814
827
  const context = useMemo2(() => ({
@@ -846,6 +859,7 @@ var Tree = ({ root, path, id, useItems, getProps, isOpen, isCurrent, draggable:
846
859
  draggable: draggable3,
847
860
  renderColumns,
848
861
  canDrop,
862
+ canSelect,
849
863
  onOpenChange,
850
864
  onSelect
851
865
  }))));
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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/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": ";;AAIA,YAAYA,yBAAwB;AACpC,SAASC,iBAAAA,sBAAqB;AAC9B,OAAOC,YAAuC;AAE9C,SAASC,YAAkC;AAC3C,SAASC,MAAAA,WAAU;;;;ACLnB,YAAYC,wBAAwB;AACpC,SAASC,qBAAqB;AAC9B,OAAOC,WAA+B;AAGtC,SAASC,UAAU;AAQnB,IAAMC,iBAAiB;AAEhB,IAAM,CAACC,mBAAmBC,mBAAAA,IAAuBC,cAAqCH,cAAAA;AAM7F,IAAMI,eAAe,CAA2BC,SAAaA,MAAcC;AASpE,IAAMC,gBAAgB,CAA2B,EACtDC,YACAC,OACAC,QAAQN,cACRO,UACAC,OACAC,cACAC,cAAa,MAE8E;;;AAC3F,WACE,sBAAA,cAACb,mBAAsB;MAAES;IAAM,GAC7B,sBAAA,cAAoBK,yBAAI;MACtBC,MAAK;MACLJ;MACAC;MACAC;MACAG,WAAWC,GAAGV,UAAAA;OAEbG,WAAW;MAAEF,OAAOA,SAAS,CAAA;IAAG,CAAA,CAAA,CAAA;;;;AAIzC;;;AD1CA,IAAMU,sBAAsB;AAQrB,IAAM,CAACC,uBAAuBC,yBAAAA,IACnCC,eAAyCH,mBAAAA;AAIpC,IAAMI,gBAAgB,CAA2B,EAAEC,UAAUC,YAAYC,KAAI,MAAyB;;;AAC3G,UAAM,EAAEC,MAAK,IAAKC,oBAAoBT,mBAAAA;AAEtC,WACE,gBAAAU,OAAA,cAACT,uBAA0B;MAAEM;IAAK,GAChC,gBAAAG,OAAA,cAAoBC,0BAAI;MAACC,OAAOJ,MAAMD,IAAAA;MAAOM,WAAWC,IAAG,mBAAmBR,UAAAA;OAC3ED,QAAAA,CAAAA;;;;AAIT;AAIO,IAAMU,sBAAsB,CAAC,EAAET,YAAYD,UAAU,GAAGW,MAAAA,MAAiC;;;AAC9F,WACE,gBAAAN,OAAA,cAAoBO,4BAAM;MAAE,GAAGD;MAAOH,WAAWC,IAAGR,UAAAA;OAClD,gBAAAI,OAAA,cAAoBQ,6BAAO;MAACL,WAAU;OACnCR,UACD,gBAAAK,OAAA,cAACS,MAAAA;MACCC,MAAK;MACLC,MAAM;MACNf,YAAW;;;;;AAKrB;AAIO,IAAMgB,oBAAoB,CAAC,EAAEjB,UAAUC,WAAU,MAA0B;;;AAChF,WACE,gBAAAI,OAAA,cAAoBa,6BAAO;MAACV,WAAU;OACpC,gBAAAH,OAAA,cAACc,OAAAA;MAAIC,MAAK;MAAOZ,WAAWC,IAAG,OAAOR,UAAAA;OACnCD,QAAAA,CAAAA;;;;AAIT;;;AExDO,IAAMqB,YAAY;EACvBC,MAAMC;EACNC,MAAMC;EACNC,YAAYC;EACZC,UAAUC;AACZ;;;;ACZA,SAASC,eAAe;AACxB,SAASC,WAAWC,6BAA6B;AACjD,SAASC,kCAAkC;AAC3C,SAEEC,mBACAC,sBAAAA,2BACK;AACP,SAASC,iBAAAA,sBAAqB;AAC9B,OAAOC,UAMLC,aAAAA,YACAC,QACAC,YAAAA,iBACK;AACP,SAASC,oBAAoB;AAE7B,SAASC,iBAAiB;AAC1B,SACEC,YAEAC,YAAYC,iBAEZC,sBACK;AACP,SAASC,MAAAA,WAAU;;;;AC7BnB,SAASC,0BAA0B;AACnC,SAASC,0BAA0B;AACnC,SAASC,kCAAkC;AAC3C,SAASC,iBAAAA,sBAAqB;AAC9B,OAAOC,UAAyBC,aAAaC,WAAWC,gBAAgB;AAcxE,IAAMC,YAAY;AAEX,IAAM,CAACC,cAAcC,cAAAA,IAAkBC,eAAgCH,SAAAA;AAO9E,IAAMI,gBAAe,CAA2BC,SAAaA,MAAcC;AAQpE,IAAMC,WAAW,CAA2B,EACjDC,UACAC,OACAC,QACAC,QAAQP,eACRQ,QACA,GAAGC,MAAAA,MACc;;;AACjB,UAAMC,UAAUC,YACd,CAACC,GAAMC,MAAAA;AACL,YAAMC,MAAMP,QAAQK,CAAAA;AACpB,YAAMG,MAAMR,QAAQM,CAAAA;AAEpB,UAAIC,QAAQE,UAAaD,QAAQC,QAAW;AAC1C,eAAOF,QAAQC;MACjB,OAAO;AAIL,eAAOH,MAAMC;MACf;IACF,GACA;MAACN;KAAM;AAGT,UAAM,CAACU,OAAOC,QAAAA,IAAYC,SAAkCC,IAAAA;AAC5DC,cAAU,MAAA;AACR,UAAI,CAAChB,OAAO;AACV;MACF;AAEA,aAAOiB,mBAAmB;QACxBC,YAAY,CAAC,EAAEC,OAAM,MAAOlB,SAASkB,OAAOC,IAAI,KAAK;QACrDC,QAAQ,CAAC,EAAEC,UAAUH,OAAM,MAAE;AAC3B,gBAAMI,SAASD,SAASE,QAAQC,YAAY,CAAA;AAC5C,cAAI,CAACF,QAAQ;AACX;UACF;AAEA,gBAAMG,aAAaP,OAAOC;AAC1B,gBAAMO,aAAaJ,OAAOH;AAC1B,cAAI,CAACnB,SAASyB,UAAAA,KAAe,CAACzB,SAAS0B,UAAAA,GAAa;AAClD;UACF;AAEA,gBAAMC,YAAY5B,MAAM6B,UAAU,CAACjC,SAASS,QAAQT,MAAM8B,UAAAA,CAAAA;AAC1D,gBAAMI,YAAY9B,MAAM6B,UAAU,CAACjC,SAASS,QAAQT,MAAM+B,UAAAA,CAAAA;AAC1D,cAAIG,YAAY,KAAKF,YAAY,GAAG;AAClC;UACF;AACA,gBAAMG,sBAAsBC,mBAAmBL,UAAAA;AAC/C,gBAAMM,mBAAmBC,2BAA2B;YAClDH;YACAI,YAAYP;YACZQ,eAAeN;YACfO,MAAM;UACR,CAAA;AAEAlC,mBAASyB,WAAWK,gBAAAA;QACtB;MACF,CAAA;IACF,GAAG;MAACjC;MAAOK;MAASF;KAAO;AAE3B,WACE,gBAAAmC,OAAA,cAAC9C,cAAiB;MAAEoB;MAAOC;MAAUZ;MAAQ,GAAGG;IAAM,GAAIL,WAAW;MAAEa;MAAOZ,OAAOA,SAAS,CAAA;IAAG,CAAA,CAAA;;;;AAErG;;;;ADlDO,IAAMuC,OAAsB;EAAEC,MAAM;AAAO;AAElD,IAAMC,cAAgG;EACpG,eAAe;AACjB;AAUA,IAAMC,iBAAuC,CAAC;AAE9C,IAAMC,iBAAiB;AAEhB,IAAM,CAACC,kBAAkBC,kBAAAA,IAAsBC,eACpDH,gBACAD,cAAAA;AAcK,IAAMK,WAAW,CAA2B,EAAEC,UAAUC,YAAYC,MAAM,GAAGC,MAAAA,MAAyB;;;AAC3G,UAAM,EAAEC,QAAQC,UAAUC,aAAaC,UAAUC,aAAY,IAAKC,eAAed,cAAAA;AACjF,UAAMe,MAAMC,OAA8B,IAAA;AAC1C,UAAMC,gBAAgBD,OAA2B,IAAA;AACjD,UAAM,CAACE,OAAON,QAAAA,IAAYO,UAAwBvB,IAAAA;AAElDwB,IAAAA,WAAU,MAAA;AACR,YAAMC,UAAUN,IAAIO;AACpBC,gBAAUF,SAAAA,QAAAA;;;;;;;;;AACV,aAAOG;;;;QAILC,UAAU;UACRJ;UACAK,YAAYT,cAAcK;UAC1BK,SAAS,MAAM,CAACjB;UAChBkB,gBAAgB,MAAMrB;UACtBsB,uBAAuBlB,cACnB,CAAC,EAAEmB,oBAAoBC,OAAM,MAAE;AAC7B,kBAAMC,OAAOD,OAAOV,QAAQY,sBAAqB;AACjDC,uCAA2B;cACzBJ;cACAK,WAAW,CAAC,EAAEC,UAAS,MAAE;AACvB,sBAAM,EAAEC,OAAM,IAAKD,UAAUH,sBAAqB;AAClD,uBAAO;kBAAEK,GAAG;kBAAIC,GAAGF,SAAS;gBAAE;cAChC;cACAG,QAAQ,CAAC,EAAEJ,UAAS,MAAE;AACpBA,0BAAUK,MAAMC,QAAQV,KAAKU,QAAQ;AACrC9B,yBAAS;kBAAEf,MAAM;kBAAWuC;gBAAU,CAAA;AACtCvB,6BAAa;kBAAEhB,MAAM;kBAAWuC;kBAAW7B;gBAAK,CAAA;AAChD,uBAAO,MAAA;gBAAO;cAChB;YACF,CAAA;UACF,IACAoC;UACJC,aAAa,MAAA;AACXhC,qBAAS;cAAEf,MAAM;YAAc,CAAA;AAC/BgB,yBAAa;cAAEhB,MAAM;cAAeU;YAAK,CAAA;UAC3C;UACAsC,QAAQ,MAAA;AACNjC,qBAAShB,IAAAA;AACTiB,yBAAajB,IAAAA;UACf;QACF,CAAA;;;;QAKAkD,sBAAsB;UACpBzB;UACA0B,SAAS,CAAC,EAAEhB,OAAM,MAAE;AAClB,oBAAQA,OAAOV,YAAYA,WAAWZ,SAASsB,OAAOiB,IAAI,MAAM;UAClE;UACAC,SAAS,CAAC,EAAEC,MAAK,MAAE;AACjB,mBAAOC,kBAAkB5C,MAAa;cAAEc;cAAS6B;cAAOE,cAAc;gBAAC;gBAAO;;YAAU,CAAA;UAC1F;UACAC,aAAa,MAAM;UACnBC,aAAa,CAAC,EAAEC,KAAI,MAAE;AACpB,kBAAMC,cAAcC,oBAAmBF,KAAKP,IAAI;AAChDpC,qBAAS;cAAEf,MAAM;cAAoB2D;YAAY,CAAA;UACnD;UACAE,aAAa,MAAA;AACX9C,qBAAShB,IAAAA;UACX;UACA+D,QAAQ,CAAC,EAAEJ,KAAI,MAAE;AACf,kBAAMC,cAAcC,oBAAmBF,KAAKP,IAAI;AAChDpC,qBAAS,CAACU,YAAAA;AACR,kBAAIA,QAAQzB,SAAS,sBAAsByB,QAAQkC,gBAAgBA,aAAa;AAC9E,uBAAOlC;cACT;AACA,qBAAO;gBAAEzB,MAAM;gBAAoB2D;cAAY;YACjD,CAAA;UACF;UACAX,QAAQ,MAAA;AACNjC,qBAAShB,IAAAA;UACX;QACF,CAAA;MAAA;IAEJ,GAAG;MAACW;KAAK;AAET,WACE,gBAAAqD,OAAA,cAAC3D,kBAAAA;MAAiBM;MAAYU;OAC5B,gBAAA2C,OAAA,cAACC,OAAAA;MAAI9C;MAAU+C,MAAK;MAAWC,WAAWC,IAAG,iBAAiB1D,YAAYR,YAAYoB,MAAMrB,IAAI,CAAC;MAAI,GAAGW;OACrGH,UACAa,MAAMrB,SAAS,sBAAsBqB,MAAMsC,eAC1C,gBAAAI,OAAA,cAACK,gBAAgBC,eAAa;MAACC,MAAMjD,MAAMsC;;;;;AAKrD;AAMO,IAAMY,uBAAuB,CAAC,EACnCC,WAAW,MACX/D,YACAgE,UACAC,OAAO,kBACPC,OACA,GAAGhE,MAAAA,MAE6E;;;AAChF,UAAM,EAAEU,MAAK,IAAKJ,eAAe,eAAA;AACjC,UAAM2D,aAAavD,MAAMrB,SAAS,UAAUyE;AAC5C,UAAM,EAAEI,EAAC,IAAKC,eAAe,IAAA;AAC7B,WACE,gBAAAf,OAAA,cAACgB,YAAAA;MACCC,UAAAA;MACAC,SAAQ;MACP,GAAGtE;MACJ+D;MACAD,UAAUG;MACVD,OAAOA,SAASE,EAAE,cAAA;MAClBpE,YAAY;QAACA;QAAY+D,YAAYC,YAAY;;;;;;AAGvD;AAEO,IAAMS,iBAAiB,CAAC,EAC7BV,WAAW,MACXQ,WAAW,MACXC,UAAU,SACVxE,YACAgE,UACA,GAAG9D,MAAAA,MACsC;;;AACzC,UAAM,EAAEU,MAAK,IAAKJ,eAAe,aAAA;AACjC,UAAM2D,aAAavD,MAAMrB,SAAS,UAAUyE;AAC5C,WACE,gBAAAV,OAAA,cAACgB,YAAAA;MACE,GAAGpE;MACJ8D,UAAUG;MACVI;MACAC;MACAxE,YAAY;QAACA;QAAY+D,YAAYC,YAAY;;;;;;AAGvD;AAEO,IAAMU,qBAAqB,CAAC,EAAEV,SAAQ,MAAqC;;;AAChF,UAAM,EAAErD,cAAa,IAAKf,mBAAmB,aAAA;AAC7C,UAAM,EAAEwE,EAAC,IAAKC,eAAe,IAAA;AAC7B,WACE,gBAAAf,OAAA,cAACgB,YAAAA;MACCC,UAAAA;MACAC,SAAQ;MACRN,OAAOE,EAAE,mBAAA;MACT3D,KAAKE;MACLsD,MAAK;MACLD;;;;;AAGN;AAEO,IAAMW,sBAAsB,CAA2B,EAC5D5E,SAAQ,MAGT;AACC,QAAM,EAAEa,MAAK,IAAKJ,eAAe,cAAA;AACjC,SAAOI,OAAOrB,SAAS,YAAYqF,6BAAa7E,SAAS;IAAEE,MAAMW,MAAMX;EAAK,CAAA,GAAIW,MAAMkB,SAAS,IAAI;AACrG;AAEO,IAAM+C,kBAAkB,CAAC,EAAE7E,YAAYD,SAAQ,MAAsC;;;WAC1F,gBAAAuD,OAAA,cAACC,OAAAA;MAAIE,WAAWC,IAAG,sBAAsB1D,UAAAA;OAAcD,QAAAA;;;;;AAGlD,IAAM+E,gBAAgB,CAAC,EAC5B9E,YACAD,UACA,GAAGG,MAAAA,MACuD;;;WAC1D,gBAAAoD,OAAA,cAACC,OAAAA;MAAIE,WAAWC,IAAG,mCAAmC1D,UAAAA;MAAc,GAAGE;OACpEH,QAAAA;;;;;;;AE7OE,IAAMgF,OAAO;EAClBC,MAAMC;EACNC,MAAMC;EACNC,iBAAiBC;EACjBC,aAAaC;EACbC,gBAAgBC;EAChBC,kBAAkBC;EAClBC,YAAYC;EACZC,WAAWC;AACb;;;;AClCA,OAAOC,UAASC,WAAAA,gBAAe;AAG/B,SAASC,YAAAA,iBAAwC;;;ACHjD,SAASC,iBAAAA,gBAAeC,kBAAkB;AAE1C,SAASC,aAAa;AAqBtB,IAAMC,cAAcC,gBAAAA,eAAsC,IAAA;AAEnD,IAAMC,eAAeF,YAAYG;AAEjC,IAAMC,UAAU,MAAMC,WAAWL,WAAAA,KAAgBM,MAAM,IAAIC,MAAM,uBAAA,CAAA;;;;AC3BxE,SAASC,WAAAA,gBAAe;AACxB,SAASC,aAAAA,YAAWC,yBAAAA,8BAA6B;AACjD,SAGEC,mBACAC,0BACK;AACP,SAASC,cAAc;AACvB,OAAOC,UAAsCC,QAAAA,OAAMC,eAAAA,cAAaC,aAAAA,YAAWC,SAASC,UAAAA,SAAQC,YAAAA,iBAAgB;AAG5G,SAASC,aAAAA,kBAAiB;AAC1B,SAASC,YAAYC,iBAAiBC,gBAAgB;AACtD,SACEC,YACAC,mBACAC,kCACAC,sCACK;;;ACnBA,IAAMC,sBAAsB;AAE5B,IAAMC,qBAAqB,CAACC,OAAeC,cAAcH,yBAAyB;EACvFI,oBAAoB,IAAIF,QAAQ,KAAKC,WAAAA;AACvC;;;;ACJA,OAAOE,UAA8CC,YAAYC,MAAMC,eAAAA,oBAAmB;AAE1F,SAASC,QAAQC,QAAAA,OAAkBC,mBAAmBC,kBAAAA,uBAAsB;AAC5E,SAASC,mBAAmB;AAarB,IAAMC,kBAAkBC,qBAC7BC,2BACE,CAAC,EAAEC,OAAOC,MAAMC,WAAWC,UAAUC,SAASC,SAAQ,GAAIC,iBAAAA;;;AACxD,UAAM,EAAEC,EAAC,IAAKC,gBAAAA;AAEd,UAAMC,eAAeC,aACnB,CAACC,UAAAA;AACCN,iBAAWM,MAAMC,MAAM;IACzB,GACA;MAACP;KAAS;AAGZ,UAAMQ,sBAAsBH,aAC1B,CAACC,UAAAA;AACC,UAAIA,MAAMG,QAAQ,OAAOH,MAAMG,QAAQ,SAAS;AAC9CH,cAAMI,eAAc;AACpBJ,cAAMK,gBAAe;AACrBX,mBAAWM,MAAMC,MAAM;MACzB;IACF,GACA;MAACP;KAAS;AAGZ,WACE,gBAAAY,OAAA,cAACC,aAAAA;MACCC,MAAMC,kBAAkBpB,OAAOO,CAAAA;MAC/Bc,MAAK;MACLC,eAAc;MACdC,oBAAAA;MACAC,SAAAA;MACAC,KAAKnB;OAEL,gBAAAW,OAAA,cAACS,QAAAA;MACCC,eAAY;MACZC,SAAQ;MACRC,SAAQ;MACRC,YAAY;QACV;QACA;QACA5B;;MAEFC;MACA4B,SAAStB;MACTuB,WAAWnB;MACV,GAAIT,WAAW;QAAE,gBAAgB;MAAW;OAE5CH,QAAQ,gBAAAgB,OAAA,cAACgB,OAAAA;MAAKhC,MAAMA,QAAQ;MAA4BiC,MAAM;MAAGJ,YAAW;QAC7E,gBAAAb,OAAA,cAACkB,QAAAA;MAAKjC,WAAU;MAAsDkC,gBAAAA;OACnEhB,kBAAkBpB,OAAOO,CAAAA,CAAAA,CAAAA,CAAAA;;;;AAKpC,CAAA,CAAA;;;;ACrEJ,OAAO8B,UAASC,cAAAA,aAAYC,QAAAA,aAAY;AAExC,SAASC,UAAAA,SAAQC,QAAAA,aAAY;AAStB,IAAMC,iBAAiBC,gBAAAA,MAC5BC,gBAAAA,YAAmD,CAAC,EAAEC,MAAMC,UAAUC,QAAQC,SAAQ,GAAIC,iBAAAA;;;AACxF,WACE,gBAAAC,OAAA,cAACC,SAAAA;MACCC,KAAKH;MACLI,eAAY;MACZC,iBAAeT;MACfU,SAAQ;MACRC,SAAQ;MACRC,YAAY;QAAC;QAAkCV,SAAS,WAAW,CAACD,YAAY;;MAChFY,SAASV;OAET,gBAAAE,OAAA,cAACS,OAAAA;MAAKC,MAAK;MAAwBC,MAAM;MAAGJ,YAAY;QAAC;QAA2BZ,QAAQ;;;;;;AAGlG,CAAA,CAAA;;;;AHEF,IAAMiB,4BACJ;AAEK,IAAMC,iBAAiBC,OAAOC,OAAO;EAC1CC,IAAIF,OAAOG;EACXC,MAAMJ,OAAOK,MAAML,OAAOG,MAAM;EAChCG,MAAMN,OAAOO;AACf,CAAA;AAGO,IAAMC,aAAa,CAACC,SAAoCT,OAAOU,GAAGX,cAAAA,EAAgBU,IAAAA;AAsBzF,IAAME,cAAc,CAAwB,EAC1CL,MACAF,MAAMQ,OACNC,MACAC,WAAWC,YACXC,eAAeC,SACfC,SACAC,cACAC,UACAC,cAAc,EAAC,MACE;;;AACjB,UAAMC,SAASC,QAA8B,IAAA;AAC7C,UAAMC,YAAYD,QAAiC,IAAA;AACnD,UAAME,UAAUF,QAAO,KAAA;AACvB,UAAMG,kBAAkBH,QAA8B,IAAA;AACtD,UAAM,CAACI,QAAQC,QAAAA,IAAYC,UAAwB,MAAA;AACnD,UAAM,CAACC,aAAaC,cAAAA,IAAkBF,UAA6B,IAAA;AACnE,UAAM,CAACG,UAAUC,WAAAA,IAAeJ,UAAS,KAAA;AAEzC,UAAM,EAAEK,UAAUC,UAAUC,QAAQC,UAAS,IAAKC,QAAAA;AAClD,UAAMC,QAAQL,SAAS5B,IAAAA;AACvB,UAAM,EAAEJ,IAAIsC,OAAOC,UAAUC,MAAMC,UAAUC,WAAWC,kBAAkBC,OAAM,IAAKX,SAAS7B,MAAMM,KAAAA;AACpG,UAAMR,OAAO2C,QAAQ,MAAM;SAAInC;MAAOV;OAAK;MAACU;MAAOV;KAAG;AACtD,UAAM8C,OAAOZ,OAAOhC,MAAME,IAAAA;AAC1B,UAAM2C,UAAUZ,UAAUjC,MAAME,IAAAA;AAChC,UAAM4C,QAAQ9C,KAAK+C,SAAS9B;AAC5B,UAAM+B,WAAW,CAAC,CAACX;AACnB,UAAMY,OAAiBxC,OAAO,kBAAkBmC,OAAO,aAAa;AAEpE,UAAMM,eAAeC,aAAY,MAAA;AAC/B,UAAI7B,gBAAgBuB,SAAS;AAC3BO,qBAAa9B,gBAAgBuB,OAAO;AACpCvB,wBAAgBuB,UAAU;MAC5B;IACF,GAAG,CAAA,CAAE;AAELQ,IAAAA,WAAU,MAAA;AACR,UAAI,CAAC1C,YAAY;AACf;MACF;AAEA2C,MAAAA,WAAUlC,UAAUyB,SAAO,QAAA;;;;;;;;;AAE3B,YAAMxC,OAAO;QAAEP;QAAIE;QAAME;MAAK;AAG9B,aAAOqD;QACL7C,WAAU;UACR8C,SAASpC,UAAUyB;UACnBY,gBAAgB,MAAMpD;UACtBqD,aAAa,MAAA;AACXlC,qBAAS,UAAA;AACT,gBAAIoB,MAAM;AACRvB,sBAAQwB,UAAU;AAClB9B,6BAAe;gBAAEb;gBAAMF;gBAAM4C,MAAM;cAAM,CAAA;YAC3C;UACF;UACAe,QAAQ,MAAA;AACNnC,qBAAS,MAAA;AACT,gBAAIH,QAAQwB,SAAS;AACnB9B,6BAAe;gBAAEb;gBAAMF;gBAAM4C,MAAM;cAAK,CAAA;YAC1C;UACF;QACF,CAAA;;QAEAgB,uBAAsB;UACpBJ,SAASpC,UAAUyB;UACnBgB,SAAS,CAAC,EAAEC,OAAON,QAAO,MAAE;AAC1B,mBAAOO,kBAAkB1D,MAAM;cAC7ByD;cACAN;cACAQ,gBAAgBC;cAChBC,cAAcpB;cACdG;cACAkB,OAAOnB,WAAW,CAAA,IAAK;gBAAC;;YAC1B,CAAA;UACF;UACAlC,SAAS,CAAC,EAAEsD,OAAM,MAAE;AAClB,kBAAMC,WAAWvD,YAAY,MAAM;AACnC,mBAAOsD,OAAOZ,YAAYpC,UAAUyB,WAAWwB,SAAS;cAAED,QAAQA,OAAO/D;cAAkBiE,QAAQjE;YAAK,CAAA;UAC1G;UACAkE,aAAa,MAAM;UACnBC,QAAQ,CAAC,EAAEC,MAAML,OAAM,MAAE;AACvB,kBAAM1C,eAAcgD,mBAAmBD,KAAKpE,IAAI;AAEhD,gBAAI+D,OAAO/D,KAAKP,OAAOA,IAAI;AACzB,kBAAI4B,cAAaiD,SAAS,gBAAgB3B,YAAY,CAACJ,QAAQ,CAACtB,gBAAgBuB,SAAS;AACvFvB,gCAAgBuB,UAAU+B,WAAW,MAAA;AACnC7D,iCAAe;oBAAEb;oBAAMF;oBAAM4C,MAAM;kBAAK,CAAA;gBAC1C,GAAG,GAAA;cACL;AAEA,kBAAIlB,cAAaiD,SAAS,cAAc;AACtCzB,6BAAAA;cACF;AAEAvB,6BAAeD,YAAAA;YACjB,WAAWA,cAAaiD,SAAS,YAAY;AAE3ChD,6BAAeD,YAAAA;YACjB,OAAO;AACLC,6BAAe,IAAA;YACjB;UACF;UACAkD,aAAa,MAAA;AACX3B,yBAAAA;AACAvB,2BAAe,IAAA;UACjB;UACAgC,QAAQ,MAAA;AACNT,yBAAAA;AACAvB,2BAAe,IAAA;UACjB;QACF,CAAA;MAAA;IAEJ,GAAG;MAAChB;MAAYT;MAAMJ;MAAImD;MAAMjD;MAAM4C;MAAM9B;KAAQ;AAGpDuC,IAAAA,WAAU,MAAM,MAAMH,aAAAA,GAAgB;MAACA;KAAa;AAEpD,UAAM4B,mBAAmB3B,aACvB,MAAMpC,eAAe;MAAEb;MAAMF;MAAM4C,MAAM,CAACA;IAAK,CAAA,GAC/C;MAAC7B;MAAcb;MAAMF;MAAM4C;KAAK;AAGlC,UAAMmC,eAAe5B,aACnB,CAAC6B,SAAS,UAAK;AACb,UAAIhC,UAAU;AACZ8B,yBAAAA;MACF,OAAO;AACL5D,eAAO2B,SAASoC,MAAAA;AAChBjE,mBAAW;UAAEd;UAAMF;UAAM6C,SAAS,CAACA;UAASmC;QAAO,CAAA;MACrD;IACF,GACA;MAAC9E;MAAMF;MAAM6C;MAASG;MAAU8B;MAAkB9D;KAAS;AAG7D,UAAMkE,gBAAgB/B,aACpB,CAACgC,UAAAA;AACC,cAAQA,MAAMC,KAAG;QACf,KAAK;AACHpC,sBAAY,CAACJ,QAAQkC,iBAAAA;AACrB;QACF,KAAK;AACH9B,sBAAYJ,QAAQkC,iBAAAA;AACpB;QACF,KAAK;AACHC,uBAAaI,MAAME,MAAM;AACzB;MACJ;IACF,GACA;MAACrC;MAAUJ;MAAMkC;MAAkBC;KAAa;AAGlD,WACE,gBAAAO,OAAA,cAAAA,OAAA,UAAA,MACE,gBAAAA,OAAA,cAACC,SAASC,KAAG;MACXC,KAAKvE;MACLkE,KAAKtF;MACLA;MACA4F,mBAAiB,GAAG5F,EAAAA;MACpBuC,UAAUA,UAAUsD,KAAKJ,SAASK,mBAAmB;MACrDC,YAAY;QACV;QACAC;QACAC;QACAC;QACAtG;QACAuG;QACAzD;;MAEF0D,eAAapG;MACbqG,eAAazD;;;;MAIb0D,gBAAcvD,UAAW,KAAgBwD;MACzCC,WAAWpB;MACXqB,eAAe,CAACpB,UAAAA;AACdA,cAAMqB,eAAc;AACpB3E,oBAAY,IAAA;MACd;OAEA,gBAAAyD,OAAA,cAACC,SAASkB,MAAI;MACZC,QAAAA;MACAb,YAAW;MACXc,OAAOC,mBAAmB9D,KAAAA;OAE1B,gBAAAwC,OAAA,cAACuB,OAAAA;MAAIC,MAAK;MAAOtE,WAAU;OACzB,gBAAA8C,OAAA,cAACyB,gBAAAA;MAAe/D;MAAoBJ;MAAYoE,UAAUlC;QAC1D,gBAAAQ,OAAA,cAAC2B,iBAAAA;MACCxB,KAAKrE;MACLgB;MACAE;MACAE,WAAWC;MACXF;MACAM;MACA7B,UAAU+D;SAGblE,WAAW,gBAAAyE,OAAA,cAACzE,SAAAA;MAAQX;MAAYF;MAAY4C;MAAYhB;MAAoBC;QAC5EH,eAAe,gBAAA4D,OAAA,cAAC4B,gBAAgBC,eAAa;MAACzF;MAA0B0F,KAAK;UAGjFxE,QACCT,MAAMkF,IAAI,CAACnH,OAAMoH,UACf,gBAAAhC,OAAA,cAACiC,UAAAA;MACCnC,KAAKlF,MAAKJ;MACVI,MAAMA;MACNF;MACAS,MAAM6G,UAAUnF,MAAMY,SAAS;MAC/BrC,WAAWC;MACXC,eAAeC;MACfC;MACAC;MACAC;;;;;AAKZ;AAEO,IAAMuG,WAAWC,gBAAAA,MAAKjH,WAAAA;;;AFzQtB,IAAMkH,OAAO,CAAiC,EACnDC,MACAC,MACAC,IACAC,UACAC,UACAC,QACAC,WACAC,WAAAA,aAAY,OACZC,sBAAsB,mDACtBC,YACAC,aACAC,eACAC,SACAC,cACAC,SAAQ,MACQ;;;AAChB,UAAMC,UAAUC,SACd,OAAO;MACLb;MACAC;MACAC;MACAC;IACF,IACA;MAACH;MAAUC;MAAUC;MAAQC;KAAU;AAEzC,UAAMW,QAAQd,SAASH,IAAAA;AACvB,UAAMkB,WAAWF,SAAQ,MAAOf,OAAO;SAAIA;MAAMC;QAAM;MAACA;OAAM;MAACA;MAAID;KAAK;AAExE,WACE,gBAAAkB,OAAA,cAACC,UAASC,MAAI;MAACb;MAA0CC;OACvD,gBAAAU,OAAA,cAACG,cAAAA;MAAaC,OAAOR;OAClBE,MAAMO,IAAI,CAACC,MAAMC,UAChB,gBAAAP,OAAA,cAACQ,UAAAA;MACCC,KAAKH,KAAKvB;MACVuB;MACAI,MAAMH,UAAUT,MAAMa,SAAS;MAC/B7B,MAAMiB;MACNR;MACAH,WAAWA;MACXI;MACAC;MACAC;MACAC;;;;;AAMZ;;;AMjEA,IAAMiB,YAAY;AAEX,IAAMC,OAAO;EAClBC,QAAQ,IAAIC,SAAmBA,KAAKC,KAAKJ,SAAAA;EAEzCK,OAAO,CAACC,SAAiBA,KAAKC,MAAMP,SAAAA;EACpCQ,QAAQ,CAACF,SAAiBA,KAAKC,MAAMP,SAAAA,EAAWQ;EAChDC,OAAO,CAACH,SAAiBA,KAAKC,MAAMP,SAAAA,EAAW,CAAA,KAAMM;EACrDI,MAAM,CAACJ,SAAiBA,KAAKC,MAAMP,SAAAA,EAAWW,GAAG,EAAC,KAAML;EACxDM,QAAQ,CAACN,SAAiBA,KAAKC,MAAMP,SAAAA,EAAWa,MAAM,GAAG,EAAC,EAAGT,KAAKJ,SAAAA;EAElEc,SAAS,CAACR,MAAcS,OAAed,KAAKQ,MAAMH,IAAAA,MAAUS;EAC5DC,UAAU,CAACV,MAAcW,YAAoBhB,KAAKW,OAAOK,OAAAA,MAAaX;EACtEY,eAAe,CAACZ,MAAcW,YAAoBA,YAAYX,QAAQW,QAAQE,WAAWb,IAAAA;EACzFc,UAAU,CAACd,MAAcW,YAAoBhB,KAAKW,OAAON,IAAAA,MAAUL,KAAKW,OAAOK,OAAAA;EAC/EI,QAAQ,CAACf,MAAcS,OAAed,KAAKI,MAAMC,IAAAA,EAAMgB,SAASP,EAAAA;AAClE;",
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"]
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/internal';\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<\n TreeItemProps<T>,\n 'draggable' | 'renderColumns' | 'canDrop' | 'canSelect' | 'onOpenChange' | 'onSelect' | 'levelOffset'\n >;\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 canSelect,\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 canSelect={canSelect}\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 className?: string;\n headingClassName?: string;\n icon?: string;\n iconHue?: string;\n disabled?: boolean;\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 * as Schema from 'effect/Schema';\nimport React, { type FC, type KeyboardEvent, memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { type HasId } from '@dxos/echo/internal';\nimport { invariant } from '@dxos/invariant';\nimport { TreeItem as NaturalTreeItem, Treegrid } from '@dxos/react-ui';\nimport {\n ghostFocusWithin,\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\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\ntype TreeItemState = 'idle' | 'dragging' | 'preview' | 'parent-of-instruction';\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 canSelect?: (params: { item: T; path: string[] }) => 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 levelOffset = 2,\n last,\n draggable: _draggable,\n renderColumns: Columns,\n canDrop,\n canSelect,\n onOpenChange,\n onSelect,\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, parentOf, label, className, headingClassName, icon, iconHue, disabled, 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 const canSelectItem = canSelect?.({ item, path }) ?? true;\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 handleOpenToggle = useCallback(\n () => onOpenChange?.({ item, path, open: !open }),\n [onOpenChange, item, path, open],\n );\n\n const handleSelect = useCallback(\n (option = false) => {\n // If the item is a branch, toggle it if:\n // - also holding down the option key\n // - or the item is currently selected\n if (isBranch && (option || current)) {\n handleOpenToggle();\n } else if (canSelectItem) {\n canSelect?.({ item, path });\n rowRef.current?.focus();\n onSelect?.({ item, path, current: !current, option });\n }\n },\n [item, path, current, isBranch, canSelectItem, handleOpenToggle, onSelect],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowLeft':\n isBranch && handleOpenToggle();\n break;\n }\n },\n [isBranch, open, handleOpenToggle, 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 ghostFocusWithin,\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 <div\n role='none'\n className='indent relative grid grid-cols-subgrid col-[tree-row]'\n style={paddingIndentation(level)}\n >\n <Treegrid.Cell classNames='flex items-center'>\n <TreeItemToggle isBranch={isBranch} open={open} onClick={handleOpenToggle} />\n <TreeItemHeading\n disabled={disabled}\n current={current}\n label={label}\n className={headingClassName}\n icon={icon}\n iconHue={iconHue}\n onSelect={handleSelect}\n ref={buttonRef}\n />\n </Treegrid.Cell>\n {Columns && <Columns item={item} path={path} open={open} menuOpen={menuOpen} setMenuOpen={setMenuOpen} />}\n {instruction && <NaturalTreeItem.DropIndicator instruction={instruction} gap={2} />}\n </div>\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 canSelect={canSelect}\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';\nimport { getStyles } 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 TreeItemHeadingProps = {\n label: Label;\n className?: string;\n icon?: string;\n iconHue?: string;\n disabled?: boolean;\n current?: boolean;\n onSelect?: (option: boolean) => void;\n};\n\nexport const TreeItemHeading = memo(\n forwardRef<HTMLButtonElement, TreeItemHeadingProps>(\n ({ label, className, icon, iconHue, disabled, current, onSelect }, forwardedRef) => {\n const { t } = useTranslation();\n const styles = iconHue ? getStyles(iconHue) : undefined;\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', styles?.icon]} />}\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 { IconButton, type IconButtonProps } from '@dxos/react-ui';\n\nexport type TreeItemToggleProps = Omit<IconButtonProps, 'icon' | 'size' | 'label'> & {\n open?: boolean;\n isBranch?: boolean;\n hidden?: boolean;\n};\n\nexport const TreeItemToggle = memo(\n forwardRef<HTMLButtonElement, TreeItemToggleProps>(\n ({ open, isBranch, hidden, classNames, ...props }, forwardedRef) => {\n return (\n <IconButton\n ref={forwardedRef}\n data-testid='treeItem.toggle'\n aria-expanded={open}\n variant='ghost'\n density='fine'\n classNames={[\n 'bs-full is-6 pli-0',\n '[&_svg]:transition-[transform] [&_svg]:duration-200',\n open && '[&_svg]:rotate-90',\n hidden ? 'hidden' : !isBranch && 'invisible',\n classNames,\n ]}\n size={3}\n icon='ph--caret-right--bold'\n iconOnly\n noTooltip\n label={open ? 'Click to close' : 'Click to open'}\n tabIndex={-1}\n {...props}\n />\n );\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", "ghostFocusWithin", "ghostHover", "hoverableControls", "hoverableFocusedKeyboardControls", "hoverableFocusedWithinControls", "DEFAULT_INDENTATION", "paddingIndentation", "level", "indentation", "paddingInlineStart", "React", "forwardRef", "memo", "useCallback", "Button", "Icon", "toLocalizedString", "useTranslation", "TextTooltip", "getStyles", "TreeItemHeading", "memo", "forwardRef", "label", "className", "icon", "iconHue", "disabled", "current", "onSelect", "forwardedRef", "t", "useTranslation", "styles", "getStyles", "undefined", "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", "IconButton", "TreeItemToggle", "memo", "forwardRef", "open", "isBranch", "hidden", "classNames", "props", "forwardedRef", "React", "IconButton", "ref", "data-testid", "aria-expanded", "variant", "density", "size", "icon", "iconOnly", "noTooltip", "label", "tabIndex", "hoverableDescriptionIcons", "TreeDataSchema", "Struct", "id", "String", "path", "Array", "item", "Any", "isTreeData", "data", "is", "RawTreeItem", "_path", "levelOffset", "last", "draggable", "_draggable", "renderColumns", "Columns", "canDrop", "canSelect", "onOpenChange", "onSelect", "rowRef", "useRef", "buttonRef", "openRef", "cancelExpandRef", "_state", "setState", "useState", "instruction", "setInstruction", "menuOpen", "setMenuOpen", "useItems", "getProps", "isOpen", "isCurrent", "useTree", "items", "parentOf", "label", "className", "headingClassName", "icon", "iconHue", "disabled", "testId", "useMemo", "open", "current", "level", "length", "isBranch", "mode", "canSelectItem", "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", "handleOpenToggle", "handleSelect", "option", "focus", "handleKeyDown", "event", "key", "React", "Treegrid", "Row", "ref", "aria-labelledby", "join", "PARENT_OF_SEPARATOR", "classNames", "hoverableControls", "hoverableFocusedKeyboardControls", "hoverableFocusedWithinControls", "ghostHover", "ghostFocusWithin", "data-itemid", "data-testid", "aria-current", "undefined", "onKeyDown", "onContextMenu", "preventDefault", "div", "role", "style", "paddingIndentation", "Cell", "TreeItemToggle", "onClick", "TreeItemHeading", "NaturalTreeItem", "DropIndicator", "gap", "map", "index", "TreeItem", "memo", "Tree", "root", "path", "id", "useItems", "getProps", "isOpen", "isCurrent", "draggable", "gridTemplateColumns", "classNames", "levelOffset", "renderColumns", "canDrop", "canSelect", "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
  }