@inf-monkeys-tech/monkeys-design 0.4.36 → 0.4.38

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.
@@ -3,6 +3,9 @@
3
3
  var DropdownMenu3 = require('@radix-ui/react-dropdown-menu');
4
4
  var react = require('react');
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
+ var core = require('@dnd-kit/core');
7
+ var sortable = require('@dnd-kit/sortable');
8
+ var utilities = require('@dnd-kit/utilities');
6
9
 
7
10
  function _interopNamespace(e) {
8
11
  if (e && e.__esModule) return e;
@@ -1690,6 +1693,406 @@ function DataExplorerDetailShell({
1690
1693
  }
1691
1694
  );
1692
1695
  }
1696
+ var treeItemDropTransition = "transform 320ms cubic-bezier(0.22, 1, 0.36, 1)";
1697
+ function resolveTreeItemTransition(transition, dragging) {
1698
+ if (dragging) return transition;
1699
+ if (!transition || transition.includes("0ms")) return treeItemDropTransition;
1700
+ return transition;
1701
+ }
1702
+ function ChevronIcon({ expanded }) {
1703
+ return /* @__PURE__ */ jsxRuntime.jsx(
1704
+ "svg",
1705
+ {
1706
+ "aria-hidden": "true",
1707
+ viewBox: "0 0 24 24",
1708
+ className: cn(
1709
+ "h-4 w-4 transition-transform duration-200 ease-out",
1710
+ expanded ? "rotate-90" : "rotate-0"
1711
+ ),
1712
+ fill: "none",
1713
+ stroke: "currentColor",
1714
+ strokeLinecap: "round",
1715
+ strokeLinejoin: "round",
1716
+ strokeWidth: "2",
1717
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m9 18 6-6-6-6" })
1718
+ }
1719
+ );
1720
+ }
1721
+ function GripIcon() {
1722
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1723
+ "svg",
1724
+ {
1725
+ "aria-hidden": "true",
1726
+ viewBox: "0 0 24 24",
1727
+ className: "h-3.5 w-3.5",
1728
+ fill: "none",
1729
+ stroke: "currentColor",
1730
+ strokeLinecap: "round",
1731
+ strokeLinejoin: "round",
1732
+ strokeWidth: "2",
1733
+ children: [
1734
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "9", cy: "5", r: "1" }),
1735
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "9", cy: "12", r: "1" }),
1736
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "9", cy: "19", r: "1" }),
1737
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "15", cy: "5", r: "1" }),
1738
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "15", cy: "12", r: "1" }),
1739
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "15", cy: "19", r: "1" })
1740
+ ]
1741
+ }
1742
+ );
1743
+ }
1744
+ function collectDefaultExpandedNodeIds(nodes, ids) {
1745
+ for (const node of nodes) {
1746
+ if (node.defaultExpanded) ids.add(node.id);
1747
+ collectDefaultExpandedNodeIds(node.children ?? [], ids);
1748
+ }
1749
+ }
1750
+ function buildDefaultExpandedNodeIds(nodes, defaultExpandedNodeIds) {
1751
+ const ids = new Set(defaultExpandedNodeIds ?? []);
1752
+ collectDefaultExpandedNodeIds(nodes, ids);
1753
+ return ids;
1754
+ }
1755
+ function flattenTree(nodes, expandedNodeIds, parentId, depth, entries) {
1756
+ nodes.forEach((node, index) => {
1757
+ entries.push({ node, parentId, index, depth });
1758
+ const hasChildren = Array.isArray(node.children) && node.children.length > 0;
1759
+ const isExpanded = node.collapsible === false || expandedNodeIds.has(node.id);
1760
+ if (hasChildren && isExpanded) {
1761
+ flattenTree(node.children ?? [], expandedNodeIds, node.id, depth + 1, entries);
1762
+ }
1763
+ });
1764
+ }
1765
+ function buildFlattenedTree(nodes, expandedNodeIds) {
1766
+ const entries = [];
1767
+ flattenTree(nodes, expandedNodeIds, void 0, 0, entries);
1768
+ return entries;
1769
+ }
1770
+ function DraggableTreeItem({
1771
+ entry,
1772
+ selected,
1773
+ expanded,
1774
+ active,
1775
+ over,
1776
+ indentSize,
1777
+ activationMode,
1778
+ dragHandleLabel,
1779
+ expandLabel,
1780
+ collapseLabel,
1781
+ themeSlots,
1782
+ classNames,
1783
+ context,
1784
+ renderNodeActions,
1785
+ renderNodeChildren,
1786
+ onSelect,
1787
+ onToggle
1788
+ }) {
1789
+ const { node, depth } = entry;
1790
+ const hasChildren = Boolean(node.children?.length);
1791
+ const disabled = Boolean(node.disabled);
1792
+ const selectable = node.selectable !== false && !disabled;
1793
+ const draggable = node.draggable !== false && !disabled;
1794
+ const {
1795
+ attributes,
1796
+ listeners,
1797
+ setNodeRef,
1798
+ transform,
1799
+ transition,
1800
+ isDragging
1801
+ } = sortable.useSortable({
1802
+ id: node.id,
1803
+ disabled: !draggable,
1804
+ transition: {
1805
+ duration: 220,
1806
+ easing: "cubic-bezier(0.22,1,0.36,1)"
1807
+ }
1808
+ });
1809
+ const {
1810
+ role: _sortableRole,
1811
+ tabIndex: _sortableTabIndex,
1812
+ "aria-disabled": _sortableAriaDisabled,
1813
+ ...sortableAttributes
1814
+ } = attributes;
1815
+ const sortableListeners = activationMode === "row" ? listeners : void 0;
1816
+ const handleListeners = activationMode === "handle" ? listeners : void 0;
1817
+ const renderContext = {
1818
+ node,
1819
+ depth,
1820
+ expanded,
1821
+ selected,
1822
+ dragging: isDragging || active,
1823
+ disabled,
1824
+ context: node.context ?? context
1825
+ };
1826
+ const style = {
1827
+ transform: utilities.CSS.Transform.toString(transform),
1828
+ transition: resolveTreeItemTransition(transition, isDragging)
1829
+ };
1830
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1831
+ "div",
1832
+ {
1833
+ ref: setNodeRef,
1834
+ style,
1835
+ className: cn(
1836
+ "min-w-0",
1837
+ classNames?.item,
1838
+ node.className,
1839
+ isDragging && "relative z-20"
1840
+ ),
1841
+ children: [
1842
+ /* @__PURE__ */ jsxRuntime.jsxs(
1843
+ "div",
1844
+ {
1845
+ "data-data-explorer-draggable-tree-item": true,
1846
+ className: cn(
1847
+ themeSlots.treeNodeButton,
1848
+ "min-h-8 touch-none border border-transparent bg-background/70 py-0 pl-1 pr-2 font-medium",
1849
+ selectable && "cursor-pointer",
1850
+ draggable && activationMode === "row" && "cursor-grab active:cursor-grabbing",
1851
+ selected && themeSlots.treeNodeSelected,
1852
+ disabled && themeSlots.treeNodeDisabled,
1853
+ (isDragging || active) && themeSlots.treeNodeDragging,
1854
+ over && "border-primary/30 bg-primary/[0.08] ring-1 ring-primary/15",
1855
+ selected && classNames?.itemSelected,
1856
+ disabled && classNames?.itemDisabled,
1857
+ (isDragging || active) && classNames?.itemDragging,
1858
+ over && classNames?.itemOver,
1859
+ classNames?.itemButton,
1860
+ node.itemClassName
1861
+ ),
1862
+ style: { paddingLeft: `${depth * indentSize + 4}px` },
1863
+ role: "treeitem",
1864
+ "aria-selected": selected || void 0,
1865
+ "aria-disabled": disabled || void 0,
1866
+ "aria-expanded": hasChildren ? expanded : void 0,
1867
+ "aria-label": node.ariaLabel,
1868
+ tabIndex: selectable ? 0 : -1,
1869
+ ...sortableAttributes,
1870
+ ...sortableListeners,
1871
+ onClick: () => {
1872
+ if (!selectable) return;
1873
+ onSelect?.(node);
1874
+ },
1875
+ onKeyDown: (event) => {
1876
+ if (!selectable) return;
1877
+ if (event.key !== "Enter" && event.key !== " ") return;
1878
+ event.preventDefault();
1879
+ onSelect?.(node);
1880
+ },
1881
+ children: [
1882
+ draggable ? /* @__PURE__ */ jsxRuntime.jsx(
1883
+ "span",
1884
+ {
1885
+ className: cn(
1886
+ themeSlots.treeNodeDragHandle,
1887
+ "opacity-100",
1888
+ classNames?.dragHandle
1889
+ ),
1890
+ "aria-label": dragHandleLabel,
1891
+ title: dragHandleLabel,
1892
+ ...handleListeners,
1893
+ onClick: (event) => event.stopPropagation(),
1894
+ children: /* @__PURE__ */ jsxRuntime.jsx(GripIcon, {})
1895
+ }
1896
+ ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("h-5 w-5 shrink-0", classNames?.dragHandle) }),
1897
+ hasChildren ? /* @__PURE__ */ jsxRuntime.jsx(
1898
+ "button",
1899
+ {
1900
+ type: "button",
1901
+ className: cn(themeSlots.treeNodeToggle, classNames?.toggle),
1902
+ "aria-label": expanded ? collapseLabel : expandLabel,
1903
+ onClick: (event) => {
1904
+ event.stopPropagation();
1905
+ onToggle(node.id);
1906
+ },
1907
+ children: /* @__PURE__ */ jsxRuntime.jsx(ChevronIcon, { expanded })
1908
+ }
1909
+ ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(themeSlots.treeNodeToggle, classNames?.toggle) }),
1910
+ node.icon ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(themeSlots.treeNodeIcon, classNames?.icon), children: node.icon }) : null,
1911
+ /* @__PURE__ */ jsxRuntime.jsxs(
1912
+ "span",
1913
+ {
1914
+ className: cn(
1915
+ "flex min-w-0 flex-1 flex-col",
1916
+ classNames?.itemContent
1917
+ ),
1918
+ children: [
1919
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(themeSlots.treeNodeLabel, classNames?.label), children: node.label }),
1920
+ node.description ? /* @__PURE__ */ jsxRuntime.jsx(
1921
+ "span",
1922
+ {
1923
+ className: cn(
1924
+ themeSlots.treeNodeDescription,
1925
+ classNames?.description
1926
+ ),
1927
+ children: node.description
1928
+ }
1929
+ ) : null
1930
+ ]
1931
+ }
1932
+ ),
1933
+ node.meta ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(themeSlots.treeNodeMeta, classNames?.meta), children: node.meta }) : null,
1934
+ node.badge ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(themeSlots.treeNodeBadge, classNames?.badge), children: node.badge }) : null,
1935
+ renderNodeActions ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("ml-1 shrink-0", classNames?.actions), children: renderNodeActions(renderContext) }) : null
1936
+ ]
1937
+ }
1938
+ ),
1939
+ renderNodeChildren ? /* @__PURE__ */ jsxRuntime.jsx(
1940
+ "div",
1941
+ {
1942
+ className: cn(
1943
+ "min-w-0",
1944
+ classNames?.children,
1945
+ node.childrenClassName
1946
+ ),
1947
+ children: renderNodeChildren(renderContext)
1948
+ }
1949
+ ) : null
1950
+ ]
1951
+ }
1952
+ );
1953
+ }
1954
+ function DataExplorerDraggableTree({
1955
+ nodes,
1956
+ context,
1957
+ selectedNodeId,
1958
+ expandedNodeIds,
1959
+ defaultExpandedNodeIds,
1960
+ resetExpansionKey,
1961
+ indentSize = 16,
1962
+ activationMode = "row",
1963
+ loading,
1964
+ empty,
1965
+ labels,
1966
+ appearance,
1967
+ className,
1968
+ classNames,
1969
+ renderNodeActions,
1970
+ renderNodeChildren,
1971
+ onSelectNode,
1972
+ onExpandedNodeIdsChange,
1973
+ onDragEnd
1974
+ }) {
1975
+ const theme = resolveDataExplorerAppearance(appearance);
1976
+ const [internalExpandedNodeIds, setInternalExpandedNodeIds] = react.useState(
1977
+ () => buildDefaultExpandedNodeIds(nodes, defaultExpandedNodeIds)
1978
+ );
1979
+ const [activeNodeId, setActiveNodeId] = react.useState();
1980
+ const [overNodeId, setOverNodeId] = react.useState();
1981
+ const sensors = core.useSensors(
1982
+ core.useSensor(core.PointerSensor, { activationConstraint: { distance: 4 } }),
1983
+ core.useSensor(core.KeyboardSensor, { coordinateGetter: sortable.sortableKeyboardCoordinates })
1984
+ );
1985
+ react.useEffect(() => {
1986
+ setInternalExpandedNodeIds(
1987
+ buildDefaultExpandedNodeIds(nodes, defaultExpandedNodeIds)
1988
+ );
1989
+ }, [defaultExpandedNodeIds, resetExpansionKey]);
1990
+ const resolvedExpandedNodeIds = expandedNodeIds !== void 0 ? new Set(expandedNodeIds) : internalExpandedNodeIds;
1991
+ const flattenedNodes = react.useMemo(
1992
+ () => buildFlattenedTree(nodes, resolvedExpandedNodeIds),
1993
+ [nodes, resolvedExpandedNodeIds]
1994
+ );
1995
+ const flattenedNodeMap = react.useMemo(() => {
1996
+ const map = /* @__PURE__ */ new Map();
1997
+ for (const entry of flattenedNodes) map.set(entry.node.id, entry);
1998
+ return map;
1999
+ }, [flattenedNodes]);
2000
+ const sortableIds = flattenedNodes.map((entry) => entry.node.id);
2001
+ const setNodeExpanded = (nodeId, expanded) => {
2002
+ const next = new Set(resolvedExpandedNodeIds);
2003
+ if (expanded) {
2004
+ next.add(nodeId);
2005
+ } else {
2006
+ next.delete(nodeId);
2007
+ }
2008
+ if (expandedNodeIds === void 0) {
2009
+ setInternalExpandedNodeIds(next);
2010
+ }
2011
+ onExpandedNodeIdsChange?.([...next]);
2012
+ };
2013
+ const handleDragEnd = (event) => {
2014
+ const activeId = String(event.active.id || "");
2015
+ const overId = event.over ? String(event.over.id || "") : "";
2016
+ setActiveNodeId(void 0);
2017
+ setOverNodeId(void 0);
2018
+ if (!activeId || !overId || activeId === overId || !onDragEnd) return;
2019
+ const activeEntry = flattenedNodeMap.get(activeId);
2020
+ const overEntry = flattenedNodeMap.get(overId);
2021
+ if (!activeEntry || !overEntry) return;
2022
+ const payload = {
2023
+ activeNode: activeEntry.node,
2024
+ overNode: overEntry.node,
2025
+ activeParentId: activeEntry.parentId,
2026
+ overParentId: overEntry.parentId,
2027
+ activeIndex: activeEntry.index,
2028
+ overIndex: overEntry.index,
2029
+ sameParent: activeEntry.parentId === overEntry.parentId,
2030
+ context
2031
+ };
2032
+ void onDragEnd(payload);
2033
+ };
2034
+ if (loading) {
2035
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(theme.slots.treeRoot, classNames?.root, className), children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(theme.slots.treeLoading, classNames?.loading), children: labels?.loading ?? "Loading..." }) });
2036
+ }
2037
+ if (nodes.length === 0) {
2038
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(theme.slots.treeRoot, classNames?.root, className), children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(theme.slots.treeEmpty, classNames?.empty), children: empty ?? labels?.empty ?? "No data" }) });
2039
+ }
2040
+ return /* @__PURE__ */ jsxRuntime.jsx(
2041
+ core.DndContext,
2042
+ {
2043
+ sensors,
2044
+ collisionDetection: core.closestCenter,
2045
+ onDragStart: (event) => setActiveNodeId(String(event.active.id || "")),
2046
+ onDragOver: (event) => {
2047
+ setOverNodeId(event.over ? String(event.over.id || "") : void 0);
2048
+ },
2049
+ onDragEnd: handleDragEnd,
2050
+ onDragCancel: () => {
2051
+ setActiveNodeId(void 0);
2052
+ setOverNodeId(void 0);
2053
+ },
2054
+ children: /* @__PURE__ */ jsxRuntime.jsx(sortable.SortableContext, { items: sortableIds, strategy: sortable.verticalListSortingStrategy, children: /* @__PURE__ */ jsxRuntime.jsx(
2055
+ "div",
2056
+ {
2057
+ className: cn(
2058
+ theme.slots.treeRoot,
2059
+ "space-y-1 overflow-visible",
2060
+ classNames?.root,
2061
+ className
2062
+ ),
2063
+ role: "tree",
2064
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("min-w-0 space-y-1", classNames?.list), children: flattenedNodes.map((entry) => {
2065
+ const node = entry.node;
2066
+ const expanded = node.collapsible === false || resolvedExpandedNodeIds.has(node.id);
2067
+ return /* @__PURE__ */ jsxRuntime.jsx(
2068
+ DraggableTreeItem,
2069
+ {
2070
+ entry,
2071
+ selected: selectedNodeId === node.id,
2072
+ expanded,
2073
+ active: activeNodeId === node.id,
2074
+ over: overNodeId === node.id && activeNodeId !== node.id,
2075
+ indentSize,
2076
+ activationMode,
2077
+ dragHandleLabel: labels?.dragHandle ?? "Drag",
2078
+ expandLabel: labels?.expand ?? "Expand",
2079
+ collapseLabel: labels?.collapse ?? "Collapse",
2080
+ themeSlots: theme.slots,
2081
+ classNames,
2082
+ context,
2083
+ renderNodeActions,
2084
+ renderNodeChildren,
2085
+ onSelect: (nextNode) => onSelectNode?.(nextNode, context),
2086
+ onToggle: (nodeId) => setNodeExpanded(nodeId, !expanded)
2087
+ },
2088
+ node.id
2089
+ );
2090
+ }) })
2091
+ }
2092
+ ) })
2093
+ }
2094
+ );
2095
+ }
1693
2096
  function MoreIcon() {
1694
2097
  return /* @__PURE__ */ jsxRuntime.jsxs(
1695
2098
  "svg",
@@ -3726,7 +4129,7 @@ function DataExplorerTreeShell({
3726
4129
  }
3727
4130
  );
3728
4131
  }
3729
- function ChevronIcon({ expanded }) {
4132
+ function ChevronIcon2({ expanded }) {
3730
4133
  return /* @__PURE__ */ jsxRuntime.jsx(
3731
4134
  "svg",
3732
4135
  {
@@ -3762,7 +4165,7 @@ function MoreIcon2() {
3762
4165
  }
3763
4166
  );
3764
4167
  }
3765
- function GripIcon() {
4168
+ function GripIcon2() {
3766
4169
  return /* @__PURE__ */ jsxRuntime.jsxs(
3767
4170
  "svg",
3768
4171
  {
@@ -3785,18 +4188,18 @@ function GripIcon() {
3785
4188
  }
3786
4189
  );
3787
4190
  }
3788
- function collectDefaultExpandedNodeIds(nodes, defaults) {
4191
+ function collectDefaultExpandedNodeIds2(nodes, defaults) {
3789
4192
  for (const node of nodes ?? []) {
3790
4193
  if (node.defaultExpanded) {
3791
4194
  defaults.add(node.id);
3792
4195
  }
3793
- collectDefaultExpandedNodeIds(node.children, defaults);
4196
+ collectDefaultExpandedNodeIds2(node.children, defaults);
3794
4197
  }
3795
4198
  }
3796
4199
  function buildDefaultNodeExpandedSet(groups, defaultExpandedNodeIds) {
3797
4200
  const defaults = new Set(defaultExpandedNodeIds ?? []);
3798
4201
  for (const group of groups) {
3799
- collectDefaultExpandedNodeIds(group.nodes, defaults);
4202
+ collectDefaultExpandedNodeIds2(group.nodes, defaults);
3800
4203
  }
3801
4204
  return defaults;
3802
4205
  }
@@ -4126,7 +4529,7 @@ function DataExplorerViewTree({
4126
4529
  setDraggingNodeId(void 0);
4127
4530
  setDragOverNodeId(void 0);
4128
4531
  },
4129
- children: /* @__PURE__ */ jsxRuntime.jsx(GripIcon, {})
4532
+ children: /* @__PURE__ */ jsxRuntime.jsx(GripIcon2, {})
4130
4533
  }
4131
4534
  ) : null,
4132
4535
  hasChildren ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -4139,7 +4542,7 @@ function DataExplorerViewTree({
4139
4542
  event.stopPropagation();
4140
4543
  setNodeExpanded(node.id, !isExpanded);
4141
4544
  },
4142
- children: /* @__PURE__ */ jsxRuntime.jsx(ChevronIcon, { expanded: isExpanded })
4545
+ children: /* @__PURE__ */ jsxRuntime.jsx(ChevronIcon2, { expanded: isExpanded })
4143
4546
  }
4144
4547
  ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(theme.slots.treeNodeToggle, classNames?.nodeToggle) }),
4145
4548
  node.icon ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(theme.slots.treeNodeIcon, classNames?.nodeIcon), children: node.icon }) : null,
@@ -4224,7 +4627,7 @@ function DataExplorerViewTree({
4224
4627
  setGroupExpanded(group.id, !groupExpanded);
4225
4628
  },
4226
4629
  children: [
4227
- group.collapsible === false ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: theme.slots.treeNodeToggle }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: theme.slots.treeNodeToggle, children: /* @__PURE__ */ jsxRuntime.jsx(ChevronIcon, { expanded: groupExpanded }) }),
4630
+ group.collapsible === false ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: theme.slots.treeNodeToggle }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: theme.slots.treeNodeToggle, children: /* @__PURE__ */ jsxRuntime.jsx(ChevronIcon2, { expanded: groupExpanded }) }),
4228
4631
  group.icon ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(theme.slots.treeNodeIcon, classNames?.nodeIcon), children: group.icon }) : null,
4229
4632
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 flex-1 flex-col", children: [
4230
4633
  group.label ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(theme.slots.treeNodeLabel, classNames?.nodeLabel), children: group.label }) : null,
@@ -4461,6 +4864,7 @@ exports.DataExplorerDisplayCard = DataExplorerDisplayCard;
4461
4864
  exports.DataExplorerDisplayCollectionView = DataExplorerDisplayCollectionView;
4462
4865
  exports.DataExplorerDisplayListItem = DataExplorerDisplayListItem;
4463
4866
  exports.DataExplorerDisplayMedia = DataExplorerDisplayMedia;
4867
+ exports.DataExplorerDraggableTree = DataExplorerDraggableTree;
4464
4868
  exports.DataExplorerImagePreview = DataExplorerImagePreview;
4465
4869
  exports.DataExplorerPage = DataExplorerPage;
4466
4870
  exports.DataExplorerRecordCard = DataExplorerRecordCard;