@dxos/plugin-navtree 0.8.4-main.70d3990 → 0.8.4-main.7996785055

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 (244) hide show
  1. package/dist/lib/browser/CommandsDialogContent-U726OBZ2.mjs +117 -0
  2. package/dist/lib/browser/CommandsDialogContent-U726OBZ2.mjs.map +7 -0
  3. package/dist/lib/browser/CommandsTrigger-LCFJL36T.mjs +32 -0
  4. package/dist/lib/browser/CommandsTrigger-LCFJL36T.mjs.map +7 -0
  5. package/dist/lib/browser/NavTreeContainer-35LP3XZM.mjs +12 -0
  6. package/dist/lib/browser/NavTreeContainer-35LP3XZM.mjs.map +7 -0
  7. package/dist/lib/browser/NavTreeDocumentTitle-L6NLLWLD.mjs +26 -0
  8. package/dist/lib/browser/NavTreeDocumentTitle-L6NLLWLD.mjs.map +7 -0
  9. package/dist/lib/browser/app-graph-builder-Z43OTNI2.mjs +44 -0
  10. package/dist/lib/browser/app-graph-builder-Z43OTNI2.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-E6MZBCU5.mjs → chunk-A4VDCIJC.mjs} +3 -3
  12. package/dist/lib/browser/chunk-A4VDCIJC.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-KF26WA4O.mjs +23 -0
  14. package/dist/lib/browser/chunk-KF26WA4O.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-MTTE5C5L.mjs +1452 -0
  16. package/dist/lib/browser/chunk-MTTE5C5L.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-PD6TZ6TP.mjs +14 -0
  18. package/dist/lib/browser/chunk-PD6TZ6TP.mjs.map +7 -0
  19. package/dist/lib/browser/expose-LKZ6QBBD.mjs +43 -0
  20. package/dist/lib/browser/expose-LKZ6QBBD.mjs.map +7 -0
  21. package/dist/lib/browser/index.mjs +86 -91
  22. package/dist/lib/browser/index.mjs.map +4 -4
  23. package/dist/lib/browser/{keyboard-YJEK2HTH.mjs → keyboard-HYGFQO7T.mjs} +22 -14
  24. package/dist/lib/browser/keyboard-HYGFQO7T.mjs.map +7 -0
  25. package/dist/lib/browser/meta.json +1 -1
  26. package/dist/lib/browser/operation-handler-VHOUWGCZ.mjs +16 -0
  27. package/dist/lib/browser/operation-handler-VHOUWGCZ.mjs.map +7 -0
  28. package/dist/lib/browser/react-surface-XWFN75ZB.mjs +59 -0
  29. package/dist/lib/browser/react-surface-XWFN75ZB.mjs.map +7 -0
  30. package/dist/lib/browser/state-CWMNNF7K.mjs +131 -0
  31. package/dist/lib/browser/state-CWMNNF7K.mjs.map +7 -0
  32. package/dist/types/src/NavTreePlugin.d.ts +2 -1
  33. package/dist/types/src/NavTreePlugin.d.ts.map +1 -1
  34. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +6 -0
  35. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
  36. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
  37. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
  38. package/dist/types/src/capabilities/index.d.ts +5 -108
  39. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  40. package/dist/types/src/capabilities/keyboard/index.d.ts +3 -0
  41. package/dist/types/src/capabilities/keyboard/index.d.ts.map +1 -0
  42. package/dist/types/src/capabilities/keyboard/keyboard.d.ts +5 -0
  43. package/dist/types/src/capabilities/keyboard/keyboard.d.ts.map +1 -0
  44. package/dist/types/src/capabilities/operation-handler/index.d.ts +4 -0
  45. package/dist/types/src/capabilities/operation-handler/index.d.ts.map +1 -0
  46. package/dist/types/src/capabilities/operation-handler/operation-handler.d.ts +6 -0
  47. package/dist/types/src/capabilities/operation-handler/operation-handler.d.ts.map +1 -0
  48. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  49. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  50. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  51. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  52. package/dist/types/src/capabilities/state/index.d.ts +3 -0
  53. package/dist/types/src/capabilities/state/index.d.ts.map +1 -0
  54. package/dist/types/src/capabilities/state/state.d.ts +6 -0
  55. package/dist/types/src/capabilities/state/state.d.ts.map +1 -0
  56. package/dist/types/src/components/NavTree/NavTree.d.ts +11 -4
  57. package/dist/types/src/components/NavTree/NavTree.d.ts.map +1 -1
  58. package/dist/types/src/components/NavTree/NavTree.stories.d.ts +2 -2
  59. package/dist/types/src/components/NavTree/NavTree.stories.d.ts.map +1 -1
  60. package/dist/types/src/components/{NavTreeContext.d.ts → NavTreeContext/NavTreeContext.d.ts} +1 -1
  61. package/dist/types/src/components/NavTreeContext/NavTreeContext.d.ts.map +1 -0
  62. package/dist/types/src/components/NavTreeContext/index.d.ts +2 -0
  63. package/dist/types/src/components/NavTreeContext/index.d.ts.map +1 -0
  64. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts +16 -8
  65. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts.map +1 -1
  66. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.stories.d.ts +3 -2
  67. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.stories.d.ts.map +1 -1
  68. package/dist/types/src/components/NavTreeItem/NavTreeItemColumns.d.ts.map +1 -1
  69. package/dist/types/src/components/Sidebar/L0Menu.d.ts +8 -5
  70. package/dist/types/src/components/Sidebar/L0Menu.d.ts.map +1 -1
  71. package/dist/types/src/components/Sidebar/L1Panel.d.ts +4 -7
  72. package/dist/types/src/components/Sidebar/L1Panel.d.ts.map +1 -1
  73. package/dist/types/src/components/Sidebar/L1Tabs.d.ts +5 -4
  74. package/dist/types/src/components/Sidebar/L1Tabs.d.ts.map +1 -1
  75. package/dist/types/src/components/UserAccountAvatar/UserAccountAvatar.stories.d.ts.map +1 -1
  76. package/dist/types/src/components/index.d.ts +0 -3
  77. package/dist/types/src/components/index.d.ts.map +1 -1
  78. package/dist/types/src/components/types.d.ts +8 -16
  79. package/dist/types/src/components/types.d.ts.map +1 -1
  80. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.d.ts +6 -0
  81. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.d.ts.map +1 -0
  82. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.stories.d.ts +30 -0
  83. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.stories.d.ts.map +1 -0
  84. package/dist/types/src/containers/CommandsDialogContent/index.d.ts +3 -0
  85. package/dist/types/src/containers/CommandsDialogContent/index.d.ts.map +1 -0
  86. package/dist/types/src/containers/CommandsTrigger/CommandsTrigger.d.ts.map +1 -0
  87. package/dist/types/src/containers/CommandsTrigger/index.d.ts +3 -0
  88. package/dist/types/src/containers/CommandsTrigger/index.d.ts.map +1 -0
  89. package/dist/types/src/containers/NavTreeContainer/NavTreeContainer.d.ts +9 -0
  90. package/dist/types/src/containers/NavTreeContainer/NavTreeContainer.d.ts.map +1 -0
  91. package/dist/types/src/containers/NavTreeContainer/index.d.ts +3 -0
  92. package/dist/types/src/containers/NavTreeContainer/index.d.ts.map +1 -0
  93. package/dist/types/src/{components → containers/NavTreeDocumentTitle}/NavTreeDocumentTitle.d.ts +1 -1
  94. package/dist/types/src/containers/NavTreeDocumentTitle/NavTreeDocumentTitle.d.ts.map +1 -0
  95. package/dist/types/src/containers/NavTreeDocumentTitle/index.d.ts +3 -0
  96. package/dist/types/src/containers/NavTreeDocumentTitle/index.d.ts.map +1 -0
  97. package/dist/types/src/containers/index.d.ts +7 -0
  98. package/dist/types/src/containers/index.d.ts.map +1 -0
  99. package/dist/types/src/experimental/Tree.stories.d.ts +18 -4
  100. package/dist/types/src/experimental/Tree.stories.d.ts.map +1 -1
  101. package/dist/types/src/hooks/index.d.ts +5 -0
  102. package/dist/types/src/hooks/index.d.ts.map +1 -0
  103. package/dist/types/src/hooks/useActions.d.ts +5 -0
  104. package/dist/types/src/hooks/useActions.d.ts.map +1 -0
  105. package/dist/types/src/hooks/useLoadDescendents.d.ts +6 -0
  106. package/dist/types/src/hooks/useLoadDescendents.d.ts.map +1 -0
  107. package/dist/types/src/hooks/useNavTreeModel.d.ts +7 -0
  108. package/dist/types/src/hooks/useNavTreeModel.d.ts.map +1 -0
  109. package/dist/types/src/hooks/useNavTreeState.d.ts +22 -0
  110. package/dist/types/src/hooks/useNavTreeState.d.ts.map +1 -0
  111. package/dist/types/src/index.d.ts +1 -2
  112. package/dist/types/src/index.d.ts.map +1 -1
  113. package/dist/types/src/meta.d.ts +2 -2
  114. package/dist/types/src/meta.d.ts.map +1 -1
  115. package/dist/types/src/operations/expose.d.ts +5 -0
  116. package/dist/types/src/operations/expose.d.ts.map +1 -0
  117. package/dist/types/src/operations/index.d.ts +3 -0
  118. package/dist/types/src/operations/index.d.ts.map +1 -0
  119. package/dist/types/src/testing/app-graph-builder.d.ts +2 -3
  120. package/dist/types/src/testing/app-graph-builder.d.ts.map +1 -1
  121. package/dist/types/src/testing/generator.d.ts +5 -6
  122. package/dist/types/src/testing/generator.d.ts.map +1 -1
  123. package/dist/types/src/testing/update-state.d.ts +2 -2
  124. package/dist/types/src/testing/update-state.d.ts.map +1 -1
  125. package/dist/types/src/types/capabilities.d.ts +16 -0
  126. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  127. package/dist/types/src/types/events.d.ts +5 -0
  128. package/dist/types/src/types/events.d.ts.map +1 -0
  129. package/dist/types/src/types/index.d.ts +4 -0
  130. package/dist/types/src/types/index.d.ts.map +1 -0
  131. package/dist/types/src/{types.d.ts → types/schema.d.ts} +6 -6
  132. package/dist/types/src/types/schema.d.ts.map +1 -0
  133. package/dist/types/src/util.d.ts +11 -7
  134. package/dist/types/src/util.d.ts.map +1 -1
  135. package/dist/types/tsconfig.tsbuildinfo +1 -1
  136. package/package.json +55 -53
  137. package/src/NavTreePlugin.tsx +54 -73
  138. package/src/capabilities/app-graph-builder/app-graph-builder.ts +42 -0
  139. package/src/capabilities/app-graph-builder/index.ts +7 -0
  140. package/src/capabilities/index.ts +5 -9
  141. package/src/capabilities/keyboard/index.ts +7 -0
  142. package/src/capabilities/keyboard/keyboard.ts +66 -0
  143. package/src/capabilities/operation-handler/index.ts +11 -0
  144. package/src/capabilities/operation-handler/operation-handler.ts +16 -0
  145. package/src/capabilities/react-surface/index.ts +7 -0
  146. package/src/capabilities/react-surface/react-surface.tsx +53 -0
  147. package/src/capabilities/state/index.ts +7 -0
  148. package/src/capabilities/state/state.ts +149 -0
  149. package/src/components/NavTree/NavTree.stories.tsx +44 -51
  150. package/src/components/NavTree/NavTree.tsx +63 -32
  151. package/src/components/{NavTreeContext.tsx → NavTreeContext/NavTreeContext.tsx} +1 -1
  152. package/src/components/NavTreeContext/index.ts +5 -0
  153. package/src/components/NavTreeItem/NavTreeItemAction.stories.tsx +17 -9
  154. package/src/components/NavTreeItem/NavTreeItemAction.tsx +65 -42
  155. package/src/components/NavTreeItem/NavTreeItemColumns.tsx +42 -16
  156. package/src/components/Sidebar/L0Menu.tsx +141 -177
  157. package/src/components/Sidebar/L1Panel.tsx +251 -93
  158. package/src/components/Sidebar/L1Tabs.tsx +18 -33
  159. package/src/components/UserAccountAvatar/UserAccountAvatar.stories.tsx +2 -3
  160. package/src/components/UserAccountAvatar/UserAccountAvatar.tsx +1 -1
  161. package/src/components/index.ts +1 -3
  162. package/src/components/types.ts +14 -19
  163. package/src/containers/CommandsDialogContent/CommandsDialogContent.stories.tsx +46 -0
  164. package/src/containers/CommandsDialogContent/CommandsDialogContent.tsx +131 -0
  165. package/src/containers/CommandsDialogContent/index.ts +7 -0
  166. package/src/containers/CommandsTrigger/CommandsTrigger.tsx +28 -0
  167. package/src/containers/CommandsTrigger/index.ts +7 -0
  168. package/src/containers/NavTreeContainer/NavTreeContainer.tsx +271 -0
  169. package/src/containers/NavTreeContainer/index.ts +6 -0
  170. package/src/{components → containers/NavTreeDocumentTitle}/NavTreeDocumentTitle.tsx +4 -3
  171. package/src/containers/NavTreeDocumentTitle/index.ts +7 -0
  172. package/src/containers/index.ts +12 -0
  173. package/src/experimental/Tree.stories.tsx +55 -58
  174. package/src/experimental/Tree.tsx +4 -4
  175. package/src/hooks/index.ts +8 -0
  176. package/src/hooks/useActions.ts +34 -0
  177. package/src/hooks/useLoadDescendents.ts +23 -0
  178. package/src/hooks/useNavTreeModel.ts +118 -0
  179. package/src/hooks/useNavTreeState.ts +42 -0
  180. package/src/index.ts +1 -2
  181. package/src/meta.ts +4 -4
  182. package/src/operations/expose.ts +42 -0
  183. package/src/operations/index.ts +7 -0
  184. package/src/testing/app-graph-builder.ts +158 -234
  185. package/src/testing/generator.ts +13 -13
  186. package/src/testing/update-state.ts +6 -6
  187. package/src/types/capabilities.ts +21 -0
  188. package/src/types/events.ts +12 -0
  189. package/src/types/index.ts +7 -0
  190. package/src/{types.ts → types/schema.ts} +5 -5
  191. package/src/util.ts +27 -16
  192. package/dist/lib/browser/app-graph-builder-OHSCN3GX.mjs +0 -46
  193. package/dist/lib/browser/app-graph-builder-OHSCN3GX.mjs.map +0 -7
  194. package/dist/lib/browser/chunk-5VLWX4PK.mjs +0 -15
  195. package/dist/lib/browser/chunk-5VLWX4PK.mjs.map +0 -7
  196. package/dist/lib/browser/chunk-E6MZBCU5.mjs.map +0 -7
  197. package/dist/lib/browser/chunk-UDAINHB6.mjs +0 -1488
  198. package/dist/lib/browser/chunk-UDAINHB6.mjs.map +0 -7
  199. package/dist/lib/browser/intent-resolver-YUVXVPHG.mjs +0 -47
  200. package/dist/lib/browser/intent-resolver-YUVXVPHG.mjs.map +0 -7
  201. package/dist/lib/browser/keyboard-YJEK2HTH.mjs.map +0 -7
  202. package/dist/lib/browser/react-surface-V6LS3R4L.mjs +0 -51
  203. package/dist/lib/browser/react-surface-V6LS3R4L.mjs.map +0 -7
  204. package/dist/lib/browser/state-BFD5KJCV.mjs +0 -117
  205. package/dist/lib/browser/state-BFD5KJCV.mjs.map +0 -7
  206. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
  207. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  208. package/dist/types/src/capabilities/capabilities.d.ts +0 -21
  209. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  210. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  211. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  212. package/dist/types/src/capabilities/keyboard.d.ts +0 -4
  213. package/dist/types/src/capabilities/keyboard.d.ts.map +0 -1
  214. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  215. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  216. package/dist/types/src/capabilities/state.d.ts +0 -20
  217. package/dist/types/src/capabilities/state.d.ts.map +0 -1
  218. package/dist/types/src/components/CommandsDialog/CommandsDialog.d.ts +0 -5
  219. package/dist/types/src/components/CommandsDialog/CommandsDialog.d.ts.map +0 -1
  220. package/dist/types/src/components/CommandsDialog/CommandsTrigger.d.ts.map +0 -1
  221. package/dist/types/src/components/CommandsDialog/index.d.ts +0 -3
  222. package/dist/types/src/components/CommandsDialog/index.d.ts.map +0 -1
  223. package/dist/types/src/components/NavTreeContainer.d.ts +0 -9
  224. package/dist/types/src/components/NavTreeContainer.d.ts.map +0 -1
  225. package/dist/types/src/components/NavTreeContext.d.ts.map +0 -1
  226. package/dist/types/src/components/NavTreeDocumentTitle.d.ts.map +0 -1
  227. package/dist/types/src/events.d.ts +0 -4
  228. package/dist/types/src/events.d.ts.map +0 -1
  229. package/dist/types/src/hooks.d.ts +0 -3
  230. package/dist/types/src/hooks.d.ts.map +0 -1
  231. package/dist/types/src/types.d.ts.map +0 -1
  232. package/src/capabilities/app-graph-builder.ts +0 -53
  233. package/src/capabilities/capabilities.ts +0 -20
  234. package/src/capabilities/intent-resolver.ts +0 -37
  235. package/src/capabilities/keyboard.ts +0 -57
  236. package/src/capabilities/react-surface.tsx +0 -45
  237. package/src/capabilities/state.ts +0 -104
  238. package/src/components/CommandsDialog/CommandsDialog.tsx +0 -126
  239. package/src/components/CommandsDialog/CommandsTrigger.tsx +0 -36
  240. package/src/components/CommandsDialog/index.ts +0 -6
  241. package/src/components/NavTreeContainer.tsx +0 -378
  242. package/src/events.ts +0 -11
  243. package/src/hooks.ts +0 -21
  244. /package/dist/types/src/{components/CommandsDialog → containers/CommandsTrigger}/CommandsTrigger.d.ts +0 -0
@@ -0,0 +1,1452 @@
1
+ import {
2
+ NavTreeCapabilities
3
+ } from "./chunk-KF26WA4O.mjs";
4
+ import {
5
+ meta
6
+ } from "./chunk-A4VDCIJC.mjs";
7
+
8
+ // src/containers/NavTreeContainer/NavTreeContainer.tsx
9
+ import { monitorForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
10
+ import { extractInstruction } from "@atlaskit/pragmatic-drag-and-drop-hitbox/tree-item";
11
+ import React8, { forwardRef as forwardRef3, memo as memo4, useCallback as useCallback4, useEffect as useEffect2, useMemo as useMemo8, useRef as useRef2 } from "react";
12
+ import { Surface, useOperationInvoker } from "@dxos/app-framework/ui";
13
+ import { LayoutOperation } from "@dxos/app-toolkit";
14
+ import { useAppGraph as useAppGraph6, useLayout } from "@dxos/app-toolkit/ui";
15
+ import { Graph as Graph5, Node as Node6, useActionRunner as useActionRunner4 } from "@dxos/plugin-graph";
16
+ import { useMediaQuery as useMediaQuery2, useSidebars } from "@dxos/react-ui";
17
+ import { isTreeData } from "@dxos/react-ui-list";
18
+ import { arrayMove as arrayMove2 } from "@dxos/util";
19
+
20
+ // src/components/NavTree/NavTree.tsx
21
+ import React7, { forwardRef as forwardRef2, useMemo as useMemo7 } from "react";
22
+ import { useAppGraph as useAppGraph5 } from "@dxos/app-toolkit/ui";
23
+ import { Node as Node5, useConnections as useConnections2, useActions as useGraphActions2 } from "@dxos/plugin-graph";
24
+ import { Tabs as Tabs3 } from "@dxos/react-ui-tabs";
25
+ import { byPosition } from "@dxos/util";
26
+
27
+ // src/hooks/useActions.ts
28
+ import { useMemo } from "react";
29
+ import { useAppGraph } from "@dxos/app-toolkit/ui";
30
+ import { Graph, Node, useActions as useGraphActions } from "@dxos/plugin-graph";
31
+ var useActions = (node) => {
32
+ const { graph } = useAppGraph();
33
+ const actions = useGraphActions(graph, node.id);
34
+ return useMemo(() => {
35
+ return actions.reduce((acc, arg) => {
36
+ if (arg.properties.disposition === "item") {
37
+ return acc;
38
+ }
39
+ acc.actions.push(arg);
40
+ if (!Node.isAction(arg)) {
41
+ const actionGroup = Graph.getActions(graph, arg.id);
42
+ acc.groupedActions[arg.id] = actionGroup;
43
+ }
44
+ return acc;
45
+ }, {
46
+ actions: [],
47
+ groupedActions: {}
48
+ });
49
+ }, [
50
+ actions
51
+ ]);
52
+ };
53
+
54
+ // src/hooks/useLoadDescendents.ts
55
+ import { useEffect } from "react";
56
+ import { useAppGraph as useAppGraph2 } from "@dxos/app-toolkit/ui";
57
+ import { Graph as Graph2 } from "@dxos/plugin-graph";
58
+ var useLoadDescendents = (root) => {
59
+ const { graph } = useAppGraph2();
60
+ useEffect(() => {
61
+ if (!root) {
62
+ return;
63
+ }
64
+ Graph2.expand(graph, root.id, "child");
65
+ }, [
66
+ graph,
67
+ root
68
+ ]);
69
+ };
70
+
71
+ // src/hooks/useNavTreeModel.ts
72
+ import { Atom } from "@effect-atom/atom-react";
73
+ import * as Option from "effect/Option";
74
+ import { useMemo as useMemo3 } from "react";
75
+ import { useAppGraph as useAppGraph3 } from "@dxos/app-toolkit/ui";
76
+ import { PLANK_COMPANION_TYPE } from "@dxos/plugin-deck/types";
77
+ import { Path } from "@dxos/react-ui-list";
78
+ import { mx } from "@dxos/ui-theme";
79
+
80
+ // src/util.ts
81
+ import { Graph as Graph3, Node as Node2 } from "@dxos/plugin-graph";
82
+ import { isNonNullable } from "@dxos/util";
83
+ var getParent = (graph, node, path) => {
84
+ const parentId = path[path.length - 2];
85
+ return Graph3.getConnections(graph, node.id, Node2.childRelation("inbound")).find((n) => n.id === parentId);
86
+ };
87
+ var getPersistenceParent = (graph, node, path, persistenceClass) => {
88
+ if (node.properties.acceptPersistenceClass?.has(persistenceClass)) {
89
+ return node;
90
+ } else {
91
+ const parent = getParent(graph, node, path);
92
+ return parent ? getPersistenceParent(graph, parent, path.slice(0, path.length - 1), persistenceClass) : null;
93
+ }
94
+ };
95
+ var resolveMigrationOperation = (graph, activeNode, destinationPath, destinationRelatedNode) => {
96
+ const activeClass = activeNode.properties.persistenceClass;
97
+ if (destinationRelatedNode && activeClass) {
98
+ const persistenceParent = getPersistenceParent(graph, destinationRelatedNode, destinationPath, activeClass);
99
+ if (persistenceParent) {
100
+ const activeKey = activeNode.properties.persistenceKey;
101
+ if (activeKey && persistenceParent?.properties.acceptPersistenceKey) {
102
+ return persistenceParent.properties.acceptPersistenceKey.has(activeKey) && persistenceParent.properties.onTransferStart ? "transfer" : persistenceParent.properties.onCopy ? "copy" : "reject";
103
+ } else {
104
+ return "reject";
105
+ }
106
+ } else {
107
+ return "reject";
108
+ }
109
+ } else {
110
+ return "reject";
111
+ }
112
+ };
113
+ var sortActions = (actions) => actions.sort((a, b) => {
114
+ if (a.properties.disposition === b.properties.disposition) {
115
+ return 0;
116
+ }
117
+ if (a.properties.disposition === "list-item-primary") {
118
+ return -1;
119
+ }
120
+ return 1;
121
+ });
122
+ var getChildren = (graph, node, path = []) => {
123
+ return Graph3.getConnections(graph, node.id, "child").map((n) => {
124
+ const nextPath = [
125
+ ...path,
126
+ node.id
127
+ ];
128
+ return nextPath.includes(n.id) ? void 0 : n;
129
+ }).filter(isNonNullable);
130
+ };
131
+ var filterItems = (node, disposition) => {
132
+ if (!disposition && (node.properties.disposition === "hidden" || node.properties.disposition === "alternate-tree")) {
133
+ return false;
134
+ } else if (!disposition) {
135
+ const action = Node2.isAction(node);
136
+ return !action || node.properties.disposition === "item";
137
+ } else {
138
+ return node.properties.disposition === disposition;
139
+ }
140
+ };
141
+ var l0ItemType = (item) => {
142
+ if (Node2.isActionLike(item)) {
143
+ return "action";
144
+ } else {
145
+ return "tab";
146
+ }
147
+ };
148
+
149
+ // src/hooks/useNavTreeState.ts
150
+ import { useAtomValue } from "@effect-atom/atom-react";
151
+ import { useMemo as useMemo2 } from "react";
152
+ import { useCapability } from "@dxos/app-framework/ui";
153
+ var useNavTreeState = () => {
154
+ return useCapability(NavTreeCapabilities.State);
155
+ };
156
+ var useNavTreeItemState = (path) => {
157
+ const { getItemAtom } = useCapability(NavTreeCapabilities.State);
158
+ const pathKey = useMemo2(() => path.join("~"), [
159
+ path
160
+ ]);
161
+ const atom = useMemo2(() => getItemAtom(path), [
162
+ getItemAtom,
163
+ pathKey
164
+ ]);
165
+ return useAtomValue(atom);
166
+ };
167
+ var useIsAlternateTree = (path, _item) => {
168
+ return useNavTreeItemState(path).alternateTree ?? false;
169
+ };
170
+
171
+ // src/hooks/useNavTreeModel.ts
172
+ var isVisibleChild = (node) => node.type !== PLANK_COMPANION_TYPE && node.properties.disposition !== "hidden";
173
+ var createItemPropsFamily = (graph) => Atom.family((pathKey) => {
174
+ const path = Path.parts(pathKey);
175
+ const id = Path.last(pathKey);
176
+ return Atom.make((get) => {
177
+ const nodeOpt = get(graph.node(id));
178
+ const node = Option.getOrElse(nodeOpt, () => void 0);
179
+ if (!node) {
180
+ return {
181
+ id,
182
+ label: id
183
+ };
184
+ }
185
+ const safeChildren = get(graph.connections(node.id, "child")).filter((child) => !path.includes(child.id));
186
+ const visibleChildren = safeChildren.filter(isVisibleChild);
187
+ const parentOf = visibleChildren.length > 0 ? visibleChildren.map((child) => child.id) : node.properties.role === "branch" ? [] : void 0;
188
+ const parentId = path.length >= 2 ? path[path.length - 2] : void 0;
189
+ const parentNode = parentId ? Option.getOrElse(get(graph.node(parentId)), () => void 0) : void 0;
190
+ const droppable = node.properties.droppable === false || parentNode?.properties.childrenDroppable === false ? false : void 0;
191
+ return {
192
+ id: node.id,
193
+ parentOf,
194
+ disabled: node.properties.disabled,
195
+ draggable: node.properties.draggable,
196
+ droppable,
197
+ label: node.properties.label ?? node.id,
198
+ className: mx(node.properties.className, node.properties.modified && "italic"),
199
+ headingClassName: node.properties.headingClassName,
200
+ icon: node.properties.icon,
201
+ iconHue: node.properties.iconHue,
202
+ testId: node.properties.testId
203
+ };
204
+ }).pipe(Atom.keepAlive);
205
+ });
206
+ var createChildIdsFamily = (graph) => Atom.family((id) => Atom.make((get) => get(graph.connections(id, "child")).map((child) => child.id)).pipe(Atom.keepAlive));
207
+ var createItemFamily = (graph) => Atom.family((id) => Atom.make((get) => {
208
+ const node = Option.getOrElse(get(graph.node(id)), () => void 0);
209
+ return node && filterItems(node) ? node : void 0;
210
+ }).pipe(Atom.keepAlive));
211
+ var createItemOpenFamily = (getItemAtom) => Atom.family((pathKey) => {
212
+ const path = Path.parts(pathKey);
213
+ const stateAtom = getItemAtom(path);
214
+ return Atom.make((get) => get(stateAtom).open).pipe(Atom.keepAlive);
215
+ });
216
+ var createItemCurrentFamily = (getItemAtom) => Atom.family((pathKey) => {
217
+ const path = Path.parts(pathKey);
218
+ const stateAtom = getItemAtom(path);
219
+ return Atom.make((get) => get(stateAtom).current).pipe(Atom.keepAlive);
220
+ });
221
+ var useNavTreeModel = (rootId) => {
222
+ const { graph } = useAppGraph3();
223
+ const { getItemAtom } = useNavTreeState();
224
+ const itemPropsFamily = useMemo3(() => createItemPropsFamily(graph), [
225
+ graph
226
+ ]);
227
+ const childIdsFamily = useMemo3(() => createChildIdsFamily(graph), [
228
+ graph
229
+ ]);
230
+ const itemFamily = useMemo3(() => createItemFamily(graph), [
231
+ graph
232
+ ]);
233
+ const itemOpenFamily = useMemo3(() => createItemOpenFamily(getItemAtom), [
234
+ getItemAtom
235
+ ]);
236
+ const itemCurrentFamily = useMemo3(() => createItemCurrentFamily(getItemAtom), [
237
+ getItemAtom
238
+ ]);
239
+ return useMemo3(() => ({
240
+ item: (id) => itemFamily(id),
241
+ itemProps: (path) => itemPropsFamily(Path.create(...path)),
242
+ itemOpen: (path) => itemOpenFamily(Path.create(...path)),
243
+ itemCurrent: (path) => itemCurrentFamily(Path.create(...path)),
244
+ childIds: (parentId) => childIdsFamily(parentId ?? rootId)
245
+ }), [
246
+ itemFamily,
247
+ itemPropsFamily,
248
+ itemOpenFamily,
249
+ itemCurrentFamily,
250
+ childIdsFamily,
251
+ rootId
252
+ ]);
253
+ };
254
+
255
+ // src/components/NavTreeContext/NavTreeContext.tsx
256
+ import { createContext, useContext } from "react";
257
+ import { raise } from "@dxos/debug";
258
+ var NavTreeContext = /* @__PURE__ */ createContext(null);
259
+ var useNavTreeContext = () => useContext(NavTreeContext) ?? raise(new Error("Missing NavTreeContext"));
260
+
261
+ // src/components/Sidebar/L0Menu.tsx
262
+ import { combine } from "@atlaskit/pragmatic-drag-and-drop/combine";
263
+ import { draggable, dropTargetForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
264
+ import { preserveOffsetOnSource } from "@atlaskit/pragmatic-drag-and-drop/element/preserve-offset-on-source";
265
+ import { scrollJustEnoughIntoView } from "@atlaskit/pragmatic-drag-and-drop/element/scroll-just-enough-into-view";
266
+ import { attachClosestEdge, extractClosestEdge } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge";
267
+ import { useAtomValue as useAtomValue2 } from "@effect-atom/atom-react";
268
+ import React2, { forwardRef, memo, useCallback, useLayoutEffect, useMemo as useMemo4, useRef, useState } from "react";
269
+ import { DxAvatar } from "@dxos/lit-ui/react";
270
+ import { useActionRunner } from "@dxos/plugin-graph";
271
+ import { Icon, IconButton, ListItem, ScrollArea, Tooltip, toLocalizedString, useMediaQuery, useTranslation } from "@dxos/react-ui";
272
+ import { Menu } from "@dxos/react-ui-menu";
273
+ import { Tabs } from "@dxos/react-ui-tabs";
274
+ import { mx as mx2 } from "@dxos/ui-theme";
275
+ import { arrayMove } from "@dxos/util";
276
+
277
+ // src/components/UserAccountAvatar/UserAccountAvatar.tsx
278
+ import React from "react";
279
+ import { Avatar } from "@dxos/react-ui";
280
+ import { hexToFallback } from "@dxos/util";
281
+ var UserAccountAvatar = ({ size, userId, hue, emoji, status }) => {
282
+ const fallbackValue = hexToFallback(userId ?? "0");
283
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(L0ItemActiveTabIndicator, {
284
+ classNames: "inset-y-6"
285
+ }), /* @__PURE__ */ React.createElement("div", {
286
+ className: "grid place-items-center dx-focus-ring-group-indicator rounded-full",
287
+ "data-joyride": "welcome/account"
288
+ }, /* @__PURE__ */ React.createElement(Avatar.Root, null, /* @__PURE__ */ React.createElement(Avatar.Content, {
289
+ variant: "circle",
290
+ size: size ?? 12,
291
+ status: status ?? "active",
292
+ hue: hue || fallbackValue.hue,
293
+ fallback: emoji || fallbackValue.emoji,
294
+ "data-testid": "treeView.userAccount"
295
+ }))));
296
+ };
297
+
298
+ // src/components/Sidebar/L0Menu.tsx
299
+ var useL0ItemClick = ({ item, parent, path }, type) => {
300
+ const { onSelect, onTabChange } = useNavTreeContext();
301
+ const { getItem } = useNavTreeState();
302
+ const [isLg] = useMediaQuery("lg");
303
+ const runAction = useActionRunner();
304
+ return useCallback((event) => {
305
+ switch (type) {
306
+ case "action": {
307
+ const { properties: { caller } = {} } = item;
308
+ return void runAction(item, caller ? {
309
+ parent,
310
+ path,
311
+ caller
312
+ } : {
313
+ parent,
314
+ path
315
+ });
316
+ }
317
+ case "tab":
318
+ return onTabChange?.(item);
319
+ case "link":
320
+ return onSelect?.({
321
+ item,
322
+ path,
323
+ current: !getItem(path).current,
324
+ option: event.altKey
325
+ });
326
+ }
327
+ }, [
328
+ item,
329
+ parent,
330
+ type,
331
+ getItem,
332
+ onSelect,
333
+ onTabChange,
334
+ isLg,
335
+ runAction
336
+ ]);
337
+ };
338
+ var l0Breakpoints = {
339
+ lg: "hidden lg:grid"
340
+ };
341
+ var L0ItemRoot = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef(({ item, parent, path, onMouseEnter, children }, forwardedRef) => {
342
+ const { t } = useTranslation(meta.id);
343
+ const { model } = useNavTreeContext();
344
+ const itemPath = useMemo4(() => [
345
+ ...path,
346
+ item.id
347
+ ], [
348
+ item.id,
349
+ path
350
+ ]);
351
+ const { id, testId } = useAtomValue2(model.itemProps(itemPath));
352
+ const localizedString = toLocalizedString(item.properties.label, t);
353
+ const type = l0ItemType(item);
354
+ const handleClick = useL0ItemClick({
355
+ item,
356
+ parent,
357
+ path: itemPath
358
+ }, type);
359
+ return /* @__PURE__ */ React2.createElement(Tooltip.Trigger, {
360
+ asChild: true,
361
+ delayDuration: 0,
362
+ side: "right",
363
+ content: localizedString
364
+ }, /* @__PURE__ */ React2.createElement(Tabs.TabPrimitive, {
365
+ className: mx2("group/l0item flex w-full justify-center items-center relative", 'dx-app-no-drag dx-focus-ring-group data[type!="collection"]:cursor-pointer', l0Breakpoints[item.properties.l0Breakpoint]),
366
+ tabIndex: type === "tab" ? 0 : void 0,
367
+ "data-type": type,
368
+ "data-testid": testId,
369
+ "data-object-id": id,
370
+ value: item.id,
371
+ onClick: handleClick,
372
+ onMouseEnter,
373
+ ref: forwardedRef
374
+ }, children));
375
+ }));
376
+ var L0ItemActiveTabIndicator = ({ classNames }) => /* @__PURE__ */ React2.createElement("div", {
377
+ role: "none",
378
+ className: mx2("hidden group-aria-selected/l0item:block absolute start-0 h-6 w-1.5 bg-accent-surface rounded-sm", classNames)
379
+ });
380
+ var L0Item = /* @__PURE__ */ memo(({ item, parent, path, pinned, onRearrange, onItemHover }) => {
381
+ const { t } = useTranslation(meta.id);
382
+ const itemElement = useRef(null);
383
+ const [closestEdge, setEdge] = useState(null);
384
+ const localizedString = toLocalizedString(item.properties.label, t);
385
+ const hue = item.properties.hue ?? null;
386
+ useLayoutEffect(() => {
387
+ if (!itemElement.current || !onRearrange) {
388
+ return;
389
+ }
390
+ return combine(draggable({
391
+ element: itemElement.current,
392
+ getInitialData: () => ({
393
+ id: item.id,
394
+ type: "l0Item"
395
+ }),
396
+ onGenerateDragPreview: ({ nativeSetDragImage, source, location }) => {
397
+ document.body.setAttribute("data-drag-preview", "true");
398
+ const element = source.element.querySelector("[data-frame]");
399
+ scrollJustEnoughIntoView({
400
+ element
401
+ });
402
+ const { x, y } = preserveOffsetOnSource({
403
+ element,
404
+ input: location.current.input
405
+ })({
406
+ container: element.offsetParent ?? document.body
407
+ });
408
+ nativeSetDragImage?.(element, x, y);
409
+ },
410
+ onDragStart: () => {
411
+ document.body.removeAttribute("data-drag-preview");
412
+ itemElement.current.closest("[data-drag-autoscroll]")?.setAttribute("data-drag-autoscroll", "active");
413
+ },
414
+ onDrop: () => {
415
+ itemElement.current.closest("[data-drag-autoscroll]")?.setAttribute("data-drag-autoscroll", "idle");
416
+ }
417
+ }), dropTargetForElements({
418
+ element: itemElement.current,
419
+ getData: ({ input, element }) => {
420
+ return attachClosestEdge({
421
+ id: item.id,
422
+ type: "l0Item"
423
+ }, {
424
+ input,
425
+ element,
426
+ allowedEdges: [
427
+ "top",
428
+ "bottom"
429
+ ]
430
+ });
431
+ },
432
+ onDragEnter: ({ self, source }) => {
433
+ if (source.data.type === self.data.type) {
434
+ setEdge(extractClosestEdge(self.data));
435
+ }
436
+ },
437
+ onDrag: ({ self, source }) => {
438
+ if (source.data.type === self.data.type) {
439
+ setEdge(extractClosestEdge(self.data));
440
+ }
441
+ },
442
+ onDragLeave: () => setEdge(null),
443
+ onDrop: ({ self, source }) => {
444
+ setEdge(null);
445
+ if (source.data.type === self.data.type) {
446
+ onRearrange(source.data, self.data, extractClosestEdge(self.data));
447
+ }
448
+ }
449
+ }));
450
+ }, [
451
+ item,
452
+ onRearrange
453
+ ]);
454
+ const handleMouseEnter = useCallback(() => onItemHover?.({
455
+ item
456
+ }), [
457
+ item,
458
+ onItemHover
459
+ ]);
460
+ return /* @__PURE__ */ React2.createElement(L0ItemRoot, {
461
+ ref: itemElement,
462
+ item,
463
+ parent,
464
+ path,
465
+ onMouseEnter: handleMouseEnter
466
+ }, /* @__PURE__ */ React2.createElement("div", {
467
+ role: "none",
468
+ "data-frame": true,
469
+ ...hue && {
470
+ style: {
471
+ background: `var(--color-${hue}-surface)`
472
+ }
473
+ },
474
+ className: mx2("flex justify-center items-center dx-focus-ring-group-indicator transition-colors rounded-sm", pinned ? "p-2 group-hover/l0item:bg-active-surface" : "w-(--dx-l0-avatar-size) h-(--dx-l0-avatar-size) bg-active-surface")
475
+ }, /* @__PURE__ */ React2.createElement(ItemAvatar, {
476
+ item
477
+ })), /* @__PURE__ */ React2.createElement(L0ItemActiveTabIndicator, null), /* @__PURE__ */ React2.createElement("span", {
478
+ id: `${item.id}__label`,
479
+ className: "sr-only"
480
+ }, localizedString), closestEdge && /* @__PURE__ */ React2.createElement(ListItem.DropIndicator, {
481
+ edge: closestEdge
482
+ }));
483
+ });
484
+ var ItemAvatar = ({ item }) => {
485
+ const { t } = useTranslation(meta.id);
486
+ if (item.properties.icon) {
487
+ const hue = item.properties.hue ?? null;
488
+ const hueFgStyle = hue && {
489
+ style: {
490
+ color: `var(--color-${hue}-surface-text)`
491
+ }
492
+ };
493
+ return /* @__PURE__ */ React2.createElement(Icon, {
494
+ icon: item.properties.icon,
495
+ size: 6,
496
+ ...hueFgStyle
497
+ });
498
+ }
499
+ const type = l0ItemType(item);
500
+ if (type === "tab" && item.properties.disposition !== "pin-end") {
501
+ const hue = item.properties.hue ?? null;
502
+ const localizedString = toLocalizedString(item.properties.label, t);
503
+ return /* @__PURE__ */ React2.createElement(DxAvatar, {
504
+ hue,
505
+ hueVariant: "surface",
506
+ variant: "square",
507
+ size: 12,
508
+ fallback: localizedString
509
+ });
510
+ }
511
+ return null;
512
+ };
513
+ var L0Menu = ({ menuActions, topLevelItems, pinnedItems, userAccountItem, parent, path, onItemHover }) => {
514
+ const { t } = useTranslation(meta.id);
515
+ const runAction = useActionRunner();
516
+ const handleAction = useCallback((action, params) => {
517
+ void runAction(action, params);
518
+ }, [
519
+ runAction
520
+ ]);
521
+ const handleRearrange = useCallback((source, target, closestEdge) => {
522
+ const sourceItem = topLevelItems.find((i) => i.id === source.id);
523
+ if (!sourceItem?.properties.onRearrange) {
524
+ return;
525
+ }
526
+ const sourceIndex = topLevelItems.findIndex((i) => i.id === source.id);
527
+ const targetIndex = topLevelItems.findIndex((i) => i.id === target.id);
528
+ const insertIndex = source.id === target.id ? sourceIndex : targetIndex + (sourceIndex < targetIndex ? closestEdge === "top" ? -1 : 0 : closestEdge === "bottom" ? 1 : 0);
529
+ const nextOrder = arrayMove([
530
+ ...topLevelItems
531
+ ], sourceIndex, insertIndex);
532
+ return sourceItem.properties.onRearrange(nextOrder.map((item) => item.data));
533
+ }, [
534
+ topLevelItems
535
+ ]);
536
+ const hasRearrangeableItems = topLevelItems.some((item) => item.properties.onRearrange);
537
+ return /* @__PURE__ */ React2.createElement(Tabs.Tablist, {
538
+ "data-tauri-drag-region": true,
539
+ classNames: [
540
+ "group/l0 absolute z-[1] inset-y-0 start-0 rounded-is",
541
+ "grid grid-cols-[var(--dx-l0-size)] grid-rows-[var(--dx-rail-size)_1fr_min-content_var(--dx-l0-size)] dx-contain-layout",
542
+ "w-(--dx-l0-size) bg-toolbar-surface dx-app-drag pb-[env(safe-area-inset-bottom)]",
543
+ '[body[data-platform="macos"]_&]:pt-[30px]',
544
+ '[body[data-platform="ios"]_&]:pt-[max(env(safe-area-inset-top),0.25rem)]'
545
+ ]
546
+ }, /* @__PURE__ */ React2.createElement(Menu.Root, {
547
+ onAction: handleAction
548
+ }, /* @__PURE__ */ React2.createElement(Menu.Trigger, {
549
+ asChild: true,
550
+ "data-testid": "spacePlugin.addSpace"
551
+ }, /* @__PURE__ */ React2.createElement("div", {
552
+ role: "none",
553
+ className: "grid place-items-center"
554
+ }, /* @__PURE__ */ React2.createElement(IconButton, {
555
+ variant: "ghost",
556
+ icon: "ph--list--regular",
557
+ iconOnly: true,
558
+ label: t("app menu label")
559
+ }))), /* @__PURE__ */ React2.createElement(Menu.Content, {
560
+ group: parent,
561
+ items: menuActions
562
+ })), /* @__PURE__ */ React2.createElement(ScrollArea.Root, {
563
+ centered: true,
564
+ thin: true,
565
+ orientation: "vertical"
566
+ }, /* @__PURE__ */ React2.createElement(ScrollArea.Viewport, {
567
+ classNames: "flex flex-col gap-2 py-1"
568
+ }, topLevelItems.map((item) => /* @__PURE__ */ React2.createElement(L0Item, {
569
+ key: item.id,
570
+ item,
571
+ parent,
572
+ path,
573
+ onItemHover,
574
+ ...hasRearrangeableItems && {
575
+ onRearrange: handleRearrange
576
+ }
577
+ })))), /* @__PURE__ */ React2.createElement("div", {
578
+ role: "none",
579
+ className: "grid grid-cols-1 auto-rows-(--dx-rail-action) pt-2"
580
+ }, pinnedItems.map((item) => /* @__PURE__ */ React2.createElement(L0Item, {
581
+ key: item.id,
582
+ item,
583
+ parent,
584
+ path,
585
+ pinned: true
586
+ }))), userAccountItem && /* @__PURE__ */ React2.createElement("div", {
587
+ role: "none",
588
+ className: "grid dx-app-no-drag"
589
+ }, /* @__PURE__ */ React2.createElement(L0ItemRoot, {
590
+ key: userAccountItem.id,
591
+ item: userAccountItem,
592
+ parent,
593
+ path
594
+ }, /* @__PURE__ */ React2.createElement(UserAccountAvatar, {
595
+ userId: userAccountItem.properties.userId,
596
+ hue: userAccountItem.properties.hue,
597
+ emoji: userAccountItem.properties.emoji,
598
+ status: userAccountItem.properties.status,
599
+ size: 10
600
+ }))));
601
+ };
602
+
603
+ // src/components/Sidebar/L1Panel.tsx
604
+ import * as Effect from "effect/Effect";
605
+ import * as Option2 from "effect/Option";
606
+ import React5, { memo as memo3, useCallback as useCallback3, useMemo as useMemo6 } from "react";
607
+ import { Node as Node4 } from "@dxos/app-graph";
608
+ import { isPinnedWorkspace } from "@dxos/app-toolkit";
609
+ import { useAppGraph as useAppGraph4 } from "@dxos/app-toolkit/ui";
610
+ import { Graph as Graph4, useActionRunner as useActionRunner3, useConnections, useEdges } from "@dxos/plugin-graph";
611
+ import { DensityProvider, IconButton as IconButton3, ScrollArea as ScrollArea2, toLocalizedString as toLocalizedString4, useTranslation as useTranslation4 } from "@dxos/react-ui";
612
+ import { useAttended } from "@dxos/react-ui-attention";
613
+ import { Tree } from "@dxos/react-ui-list";
614
+ import { Menu as Menu3 } from "@dxos/react-ui-menu";
615
+ import { Tabs as Tabs2 } from "@dxos/react-ui-tabs";
616
+ import { hoverableControlItem as hoverableControlItem2, hoverableOpenControlItem as hoverableOpenControlItem2 } from "@dxos/ui-theme";
617
+
618
+ // src/components/NavTreeItem/NavTreeItemAction.tsx
619
+ import React3, { useCallback as useCallback2 } from "react";
620
+ import { useActionRunner as useActionRunner2 } from "@dxos/plugin-graph";
621
+ import { IconButton as IconButton2, toLocalizedString as toLocalizedString2, useDensityContext, useTranslation as useTranslation2 } from "@dxos/react-ui";
622
+ import { Menu as Menu2 } from "@dxos/react-ui-menu";
623
+ import { composable, composableProps, hoverableControlItem, hoverableOpenControlItem } from "@dxos/ui-theme";
624
+ var fallbackIcon = "ph--placeholder--regular";
625
+ var fineActionButtonProps = {
626
+ size: 4,
627
+ density: "fine"
628
+ };
629
+ var coarseActionButtonProps = {
630
+ size: 5,
631
+ density: "coarse"
632
+ };
633
+ var NavTreeItemActionDropdownMenu = composable(({ parent, path, label, icon, testId, menuActions, caller, ...props }, forwardedRef) => {
634
+ const { t } = useTranslation2(meta.id);
635
+ const density = useDensityContext();
636
+ const runAction = useActionRunner2();
637
+ const handleAction = useCallback2((action, params = {}) => runAction(action, {
638
+ ...params,
639
+ path
640
+ }), [
641
+ runAction,
642
+ path
643
+ ]);
644
+ return /* @__PURE__ */ React3.createElement(Menu2.Root, {
645
+ caller,
646
+ onAction: handleAction
647
+ }, /* @__PURE__ */ React3.createElement(Menu2.Trigger, {
648
+ asChild: true
649
+ }, /* @__PURE__ */ React3.createElement(IconButton2, {
650
+ ...density === "coarse" ? coarseActionButtonProps : fineActionButtonProps,
651
+ ...composableProps(props),
652
+ classNames: [
653
+ "shrink-0 px-2 pointer-fine:px-1",
654
+ hoverableControlItem,
655
+ hoverableOpenControlItem
656
+ ],
657
+ variant: "ghost",
658
+ icon: icon ?? fallbackIcon,
659
+ iconOnly: true,
660
+ label: toLocalizedString2(label, t),
661
+ "data-testid": testId,
662
+ ref: forwardedRef
663
+ })), /* @__PURE__ */ React3.createElement(Menu2.Content, {
664
+ group: parent,
665
+ items: menuActions
666
+ }));
667
+ });
668
+ NavTreeItemActionDropdownMenu.displayName = "NavTreeItemActionDropdownMenu";
669
+ var NavTreeItemMonolithicAction = (props) => {
670
+ const { parent, path, properties: { disabled, caller, testId, icon, variant = "ghost", iconOnly = true } = {
671
+ label: "never"
672
+ }, baseLabel } = props;
673
+ const density = useDensityContext();
674
+ const runAction = useActionRunner2();
675
+ return /* @__PURE__ */ React3.createElement(IconButton2, {
676
+ ...density === "coarse" ? coarseActionButtonProps : fineActionButtonProps,
677
+ variant,
678
+ classNames: [
679
+ "shrink-0",
680
+ hoverableControlItem,
681
+ hoverableOpenControlItem,
682
+ iconOnly ? "px-2 pointer-fine:px-1" : "p-2 pointer-fine:p-2 me-1"
683
+ ],
684
+ icon: icon ?? fallbackIcon,
685
+ iconOnly,
686
+ label: baseLabel,
687
+ disabled,
688
+ onClick: (event) => {
689
+ event.stopPropagation();
690
+ if (disabled) {
691
+ return;
692
+ }
693
+ void runAction(props, caller ? {
694
+ parent,
695
+ caller,
696
+ path
697
+ } : {
698
+ parent,
699
+ path
700
+ });
701
+ },
702
+ "data-testid": testId
703
+ });
704
+ };
705
+ var NavTreeItemAction = ({ monolithic, menuActions, menuType, parent: node, path, ...props }) => {
706
+ const { t } = useTranslation2(meta.id);
707
+ const monolithicAction = menuActions?.length === 1 && menuActions[0];
708
+ const baseLabel = toLocalizedString2(monolithicAction ? monolithicAction.properties.label : props.label, t);
709
+ return monolithic && menuActions?.length === 1 ? /* @__PURE__ */ React3.createElement(NavTreeItemMonolithicAction, {
710
+ baseLabel,
711
+ parent: node,
712
+ path,
713
+ ...menuActions[0]
714
+ }) : /* @__PURE__ */ React3.createElement(NavTreeItemActionDropdownMenu, {
715
+ ...props,
716
+ label: baseLabel,
717
+ parent: node,
718
+ path,
719
+ menuActions
720
+ });
721
+ };
722
+
723
+ // src/components/NavTreeItem/NavTreeItemColumns.tsx
724
+ import React4, { Fragment, memo as memo2, useMemo as useMemo5 } from "react";
725
+ import { Node as Node3 } from "@dxos/app-graph";
726
+ import { Popover, Treegrid, toLocalizedString as toLocalizedString3, useTranslation as useTranslation3 } from "@dxos/react-ui";
727
+ var NavTreeItemColumns = /* @__PURE__ */ memo2(({ path, item, open }) => {
728
+ const { t } = useTranslation3(meta.id);
729
+ const { renderItemEnd: ItemEnd, popoverAnchorId } = useNavTreeContext();
730
+ const level = path.length - 2;
731
+ const { actions: actionsProp, groupedActions } = useActions(item);
732
+ const sortedActions = useMemo5(() => actionsProp.toSorted((actionA, actionB) => {
733
+ const primaryA = actionA.properties?.disposition === "list-item-primary";
734
+ const primaryB = actionB.properties?.disposition === "list-item-primary";
735
+ if (primaryA && !primaryB) {
736
+ return -1;
737
+ }
738
+ if (primaryB && !primaryA) {
739
+ return 1;
740
+ }
741
+ return 0;
742
+ }), [
743
+ actionsProp
744
+ ]);
745
+ const [primaryAction, ...secondaryActions] = sortedActions;
746
+ const actions = useMemo5(() => (primaryAction?.properties?.disposition === "list-item-primary" ? secondaryActions : sortedActions).flatMap((action) => Node3.isAction(action) ? [
747
+ action
748
+ ] : []).filter((a) => [
749
+ "list-item",
750
+ "list-item-primary"
751
+ ].includes(a.properties?.disposition)), [
752
+ sortedActions,
753
+ primaryAction
754
+ ]);
755
+ const primaryMenuActions = useMemo5(() => primaryAction ? Node3.isAction(primaryAction) ? [
756
+ primaryAction
757
+ ] : groupedActions[primaryAction?.id ?? ""] : void 0, [
758
+ primaryAction,
759
+ groupedActions
760
+ ]);
761
+ const ActionRoot = popoverAnchorId === `${NAV_TREE_ITEM}:${item.id}` ? Popover.Anchor : Fragment;
762
+ return /* @__PURE__ */ React4.createElement("div", {
763
+ role: "none",
764
+ className: "contents dx-app-no-drag"
765
+ }, primaryAction?.properties?.disposition === "list-item-primary" && !primaryAction?.properties?.disabled ? /* @__PURE__ */ React4.createElement(Treegrid.Cell, {
766
+ classNames: "contents"
767
+ }, /* @__PURE__ */ React4.createElement(NavTreeItemAction, {
768
+ testId: primaryAction.properties?.testId,
769
+ label: toLocalizedString3(primaryAction.properties?.label, t),
770
+ icon: primaryAction.properties?.icon ?? "ph--placeholder--regular",
771
+ parent: item,
772
+ path,
773
+ monolithic: Node3.isAction(primaryAction),
774
+ menuActions: primaryMenuActions,
775
+ menuType: primaryAction.properties?.menuType,
776
+ caller: NAV_TREE_ITEM
777
+ })) : /* @__PURE__ */ React4.createElement(Treegrid.Cell, {
778
+ role: "none"
779
+ }), /* @__PURE__ */ React4.createElement(ActionRoot, null, actions.length > 0 ? /* @__PURE__ */ React4.createElement(Treegrid.Cell, {
780
+ classNames: "contents"
781
+ }, /* @__PURE__ */ React4.createElement(NavTreeItemAction, {
782
+ testId: `navtree.treeItem.actionsLevel${level}`,
783
+ label: t("tree item actions label"),
784
+ icon: "ph--dots-three-vertical--regular",
785
+ parent: item,
786
+ path,
787
+ menuActions: actions,
788
+ menuType: "dropdown",
789
+ caller: NAV_TREE_ITEM
790
+ })) : /* @__PURE__ */ React4.createElement(Treegrid.Cell, {
791
+ role: "none"
792
+ })), ItemEnd && /* @__PURE__ */ React4.createElement(Treegrid.Cell, {
793
+ classNames: "contents"
794
+ }, /* @__PURE__ */ React4.createElement(ItemEnd, {
795
+ node: item,
796
+ open
797
+ })));
798
+ });
799
+
800
+ // src/components/Sidebar/L1Panel.tsx
801
+ var L1Panel$ = ({ open, path, item, isCurrent, onBack }) => {
802
+ const { t } = useTranslation4(meta.id);
803
+ const title = toLocalizedString4(item.properties.label, t);
804
+ const isActivated = useIsActivatedWorkspace(item);
805
+ const shouldRenderContent = isCurrent || isActivated;
806
+ return /* @__PURE__ */ React5.createElement(Tabs2.Panel, {
807
+ key: item.id,
808
+ value: item.id,
809
+ classNames: [
810
+ "absolute inset-y-0 end-0",
811
+ "w-[calc(100%-var(--dx-l0-size))] lg:w-(--dx-l1-size) grid-cols-1 grid-rows-[var(--dx-rail-size)_1fr]",
812
+ "py-[env(safe-area-inset-top)]",
813
+ isCurrent && "grid"
814
+ ],
815
+ tabIndex: -1,
816
+ "aria-label": title,
817
+ ...isCurrent && {
818
+ "data-testid": "navtree.workspace.visible"
819
+ },
820
+ ...!open && {
821
+ inert: true
822
+ }
823
+ }, shouldRenderContent && /* @__PURE__ */ React5.createElement(L1PanelContent, {
824
+ open,
825
+ path,
826
+ item,
827
+ onBack
828
+ }));
829
+ };
830
+ var useIsActivatedWorkspace = (item) => {
831
+ const { graph } = useAppGraph4();
832
+ const edges = useEdges(graph, item.id);
833
+ return useMemo6(() => {
834
+ const childIds = edges[Graph4.relationKey("child")] ?? [];
835
+ return childIds.some((childId) => {
836
+ const child = Graph4.getNode(graph, childId);
837
+ if (Option2.isNone(child)) {
838
+ return false;
839
+ }
840
+ return child.value.properties.disposition === void 0;
841
+ });
842
+ }, [
843
+ edges,
844
+ graph
845
+ ]);
846
+ };
847
+ var L1PanelContent = ({ path, item, onBack }) => {
848
+ const navTreeContext = useNavTreeContext();
849
+ const alternateTree = useAlternateTreeItem(item);
850
+ const alternatePath = useMemo6(() => [
851
+ ...path,
852
+ item.id
853
+ ], [
854
+ item.id,
855
+ path
856
+ ]);
857
+ const isAlternate = useIsAlternateTree(alternatePath, item);
858
+ return /* @__PURE__ */ React5.createElement(DensityProvider, {
859
+ density: "fine"
860
+ }, /* @__PURE__ */ React5.createElement(L1PanelHeader, {
861
+ path,
862
+ item,
863
+ onBack
864
+ }), /* @__PURE__ */ React5.createElement(ScrollArea2.Root, {
865
+ thin: true,
866
+ orientation: "vertical"
867
+ }, /* @__PURE__ */ React5.createElement(ScrollArea2.Viewport, null, isAlternate && alternateTree ? /* @__PURE__ */ React5.createElement(Tree, {
868
+ model: navTreeContext.model,
869
+ id: alternateTree.id,
870
+ rootId: alternateTree.id,
871
+ path: alternatePath,
872
+ levelOffset: 5,
873
+ gridTemplateColumns: "[tree-row-start] 1fr min-content min-content min-content [tree-row-end]",
874
+ renderColumns: NavTreeItemColumns,
875
+ blockInstruction: navTreeContext.blockInstruction,
876
+ canDrop: navTreeContext.canDrop,
877
+ canSelect: navTreeContext.canSelect,
878
+ onOpenChange: navTreeContext.onOpenChange,
879
+ onSelect: navTreeContext.onSelect,
880
+ onItemHover: navTreeContext.onItemHover
881
+ }) : /* @__PURE__ */ React5.createElement(Tree, {
882
+ model: navTreeContext.model,
883
+ id: item.id,
884
+ rootId: item.id,
885
+ path,
886
+ levelOffset: 5,
887
+ gridTemplateColumns: "[tree-row-start] 1fr min-content min-content min-content [tree-row-end]",
888
+ draggable: true,
889
+ renderColumns: NavTreeItemColumns,
890
+ blockInstruction: navTreeContext.blockInstruction,
891
+ canDrop: navTreeContext.canDrop,
892
+ canSelect: navTreeContext.canSelect,
893
+ onOpenChange: navTreeContext.onOpenChange,
894
+ onSelect: navTreeContext.onSelect,
895
+ onItemHover: navTreeContext.onItemHover
896
+ }))));
897
+ };
898
+ var L1PanelHeader = ({ item, path, onBack }) => {
899
+ const { t } = useTranslation4(meta.id);
900
+ const { renderItemEnd: ItemEnd } = useNavTreeContext();
901
+ const title = toLocalizedString4(item.properties.label, t);
902
+ const backCapableWorkspace = isPinnedWorkspace(item.id);
903
+ const { primaryAction, groupedActions, menuActions, onAction } = useL1MenuActions({
904
+ item,
905
+ path
906
+ });
907
+ useLoadDescendents(item);
908
+ const alternateTree = useAlternateTreeItem(item);
909
+ const attended = useAttended();
910
+ const alternateTreeOpen = useMemo6(() => {
911
+ if (!alternateTree) {
912
+ return true;
913
+ }
914
+ const hasAlternateAttended = attended.some((attendedId) => attendedId === alternateTree.id || attendedId.startsWith(alternateTree.id + "/"));
915
+ return !hasAlternateAttended;
916
+ }, [
917
+ alternateTree,
918
+ attended
919
+ ]);
920
+ return /* @__PURE__ */ React5.createElement("div", {
921
+ "data-tauri-drag-region": true,
922
+ className: "flex w-full items-center border-b border-subdued-separator dx-app-drag dx-density-coarse pe-1"
923
+ }, backCapableWorkspace ? /* @__PURE__ */ React5.createElement(IconButton3, {
924
+ density: "coarse",
925
+ classNames: [
926
+ "shrink-0 px-2 pointer-fine:px-1",
927
+ hoverableControlItem2,
928
+ hoverableOpenControlItem2
929
+ ],
930
+ variant: "ghost",
931
+ icon: "ph--caret-left--regular",
932
+ iconOnly: true,
933
+ label: t("button back"),
934
+ "data-testid": "treeView.primaryTreeButton",
935
+ onClick: () => onBack?.()
936
+ }) : /* @__PURE__ */ React5.createElement("div", {
937
+ "data-tauri-drag-region": true,
938
+ className: "w-6"
939
+ }), /* @__PURE__ */ React5.createElement("h2", {
940
+ "data-tauri-drag-region": true,
941
+ className: "flex-1 truncate min-w-0"
942
+ }, title), /* @__PURE__ */ React5.createElement("div", {
943
+ role: "none",
944
+ className: "contents dx-app-no-drag"
945
+ }, primaryAction?.properties?.disposition === "list-item-primary" && !primaryAction?.properties?.disabled && /* @__PURE__ */ React5.createElement(NavTreeItemAction, {
946
+ testId: primaryAction.properties?.testId,
947
+ label: toLocalizedString4(primaryAction.properties?.label, t),
948
+ icon: primaryAction.properties?.icon ?? "ph--placeholder--regular",
949
+ parent: item,
950
+ path,
951
+ monolithic: Node4.isAction(primaryAction),
952
+ menuActions: Node4.isAction(primaryAction) ? [
953
+ primaryAction
954
+ ] : groupedActions[primaryAction?.id ?? ""],
955
+ menuType: primaryAction.properties?.menuType,
956
+ caller: NAV_TREE_ITEM
957
+ }), menuActions.length === 1 && /* @__PURE__ */ React5.createElement(IconButton3, {
958
+ density: "coarse",
959
+ classNames: [
960
+ "shrink-0 px-2 pointer-fine:px-1",
961
+ hoverableControlItem2,
962
+ hoverableOpenControlItem2
963
+ ],
964
+ variant: "ghost",
965
+ icon: menuActions[0].properties?.icon ?? "ph--placeholder--regular",
966
+ iconOnly: true,
967
+ label: toLocalizedString4(menuActions[0].properties?.label, t),
968
+ "data-testid": menuActions[0].properties?.testId,
969
+ onClick: () => onAction(menuActions[0])
970
+ }), menuActions.length > 1 && /* @__PURE__ */ React5.createElement(Menu3.Root, {
971
+ caller: NAV_TREE_ITEM,
972
+ onAction
973
+ }, /* @__PURE__ */ React5.createElement(Menu3.Trigger, {
974
+ asChild: true
975
+ }, /* @__PURE__ */ React5.createElement(IconButton3, {
976
+ density: "coarse",
977
+ classNames: [
978
+ "shrink-0 px-2 pointer-fine:px-1",
979
+ hoverableControlItem2,
980
+ hoverableOpenControlItem2
981
+ ],
982
+ variant: "ghost",
983
+ icon: "ph--dots-three-vertical--regular",
984
+ iconOnly: true,
985
+ label: t("tree item actions label"),
986
+ "data-testid": "navtree.treeItem.actionsLevel0"
987
+ })), /* @__PURE__ */ React5.createElement(Menu3.Content, {
988
+ group: item,
989
+ items: menuActions
990
+ })), ItemEnd && /* @__PURE__ */ React5.createElement(ItemEnd, {
991
+ node: item,
992
+ open: alternateTreeOpen
993
+ })));
994
+ };
995
+ var useL1MenuActions = ({ item, path }) => {
996
+ const { t } = useTranslation4(meta.id);
997
+ const { setAlternateTree } = useNavTreeContext();
998
+ const { graph } = useAppGraph4();
999
+ const runAction = useActionRunner3();
1000
+ const alternateTree = useAlternateTreeItem(item);
1001
+ const alternatePath = useMemo6(() => [
1002
+ ...path,
1003
+ item.id
1004
+ ], [
1005
+ item.id,
1006
+ path
1007
+ ]);
1008
+ const isAlternate = useIsAlternateTree(alternatePath, item);
1009
+ const { actions: actionsProp, groupedActions } = useActions(item);
1010
+ const [primaryAction, ...secondaryActions] = actionsProp.toSorted((a, _b) => a.properties?.disposition === "list-item-primary" ? -1 : 1);
1011
+ const graphMenuActions = (primaryAction?.properties?.disposition === "list-item-primary" ? secondaryActions : actionsProp).flatMap((action) => Node4.isAction(action) ? [
1012
+ action
1013
+ ] : []).filter((a) => [
1014
+ "list-item",
1015
+ "list-item-primary"
1016
+ ].includes(a.properties?.disposition));
1017
+ const settingsActionId = `${item.id}~settings`;
1018
+ const settingsAction = useMemo6(() => {
1019
+ if (!alternateTree) {
1020
+ return void 0;
1021
+ }
1022
+ return {
1023
+ id: settingsActionId,
1024
+ type: Node4.ActionType,
1025
+ data: () => Effect.void,
1026
+ properties: {
1027
+ label: isAlternate ? [
1028
+ "button back",
1029
+ {
1030
+ ns: meta.id
1031
+ }
1032
+ ] : alternateTree.properties.label ?? alternateTree.id,
1033
+ icon: isAlternate ? "ph--arrow-u-down-left--regular" : alternateTree.properties.icon ?? "ph--placeholder--regular",
1034
+ disposition: "list-item",
1035
+ testId: isAlternate ? "navtree.backToSpace" : "navtree.spaceSettings"
1036
+ }
1037
+ };
1038
+ }, [
1039
+ alternateTree,
1040
+ isAlternate,
1041
+ settingsActionId,
1042
+ t
1043
+ ]);
1044
+ const menuActions = useMemo6(() => [
1045
+ ...graphMenuActions,
1046
+ ...settingsAction ? [
1047
+ settingsAction
1048
+ ] : []
1049
+ ], [
1050
+ graphMenuActions,
1051
+ settingsAction
1052
+ ]);
1053
+ const onAction = useCallback3((action, params) => {
1054
+ if (action.id === settingsActionId) {
1055
+ if (alternateTree && !isAlternate) {
1056
+ Graph4.expand(graph, alternateTree.id, "child");
1057
+ }
1058
+ setAlternateTree?.(alternatePath, !isAlternate);
1059
+ } else {
1060
+ void runAction(action, {
1061
+ ...params,
1062
+ path
1063
+ });
1064
+ }
1065
+ }, [
1066
+ settingsActionId,
1067
+ setAlternateTree,
1068
+ alternatePath,
1069
+ isAlternate,
1070
+ runAction,
1071
+ graph,
1072
+ alternateTree,
1073
+ path
1074
+ ]);
1075
+ return {
1076
+ primaryAction,
1077
+ groupedActions,
1078
+ menuActions,
1079
+ onAction
1080
+ };
1081
+ };
1082
+ var useAlternateTreeItem = (item) => {
1083
+ const { graph } = useAppGraph4();
1084
+ const connections = useConnections(graph, item.id, "child");
1085
+ return connections.find((node) => node.properties.disposition === "alternate-tree");
1086
+ };
1087
+ var L1Panel = /* @__PURE__ */ memo3(L1Panel$);
1088
+
1089
+ // src/components/Sidebar/L1Tabs.tsx
1090
+ import React6 from "react";
1091
+ var L1Tabs = ({ topLevelItems, currentItemId, onBack, open, path }) => {
1092
+ return /* @__PURE__ */ React6.createElement(React6.Fragment, null, topLevelItems.map((item) => {
1093
+ const type = l0ItemType(item);
1094
+ if (type === "tab") {
1095
+ return /* @__PURE__ */ React6.createElement(L1Panel, {
1096
+ key: item.id,
1097
+ item,
1098
+ path,
1099
+ open,
1100
+ onBack,
1101
+ isCurrent: item.id === currentItemId
1102
+ });
1103
+ }
1104
+ return null;
1105
+ }));
1106
+ };
1107
+
1108
+ // src/components/NavTree/NavTree.tsx
1109
+ var NAV_TREE_ITEM = "NavTreeItem";
1110
+ var NavTree = /* @__PURE__ */ forwardRef2(({ id, root, tab, ...props }, forwardedRef) => {
1111
+ const { onBack, onItemHover } = useNavTreeContext();
1112
+ const { topLevelActions, l0Items, pinnedItems, userAccountItem, topLevelItems } = useTopLevelNavItems(root);
1113
+ useLoadDescendents(root);
1114
+ const path = useMemo7(() => [
1115
+ id
1116
+ ], [
1117
+ id
1118
+ ]);
1119
+ return (
1120
+ // TODO(thure): `Tabs.Root` forces all items that should be able to receive focus to use `Tabs.Tab(Primitive)` since
1121
+ // it uses RovingFocus and doesn't support moving focus to an item that is not a tab. Assess whether this situation
1122
+ // should change including whether it should motivate a change in the design/taxonomy, or if this means this should
1123
+ // not use `react-ui-tabs` at all.
1124
+ /* @__PURE__ */ React7.createElement(Tabs3.Root, {
1125
+ value: tab,
1126
+ orientation: "vertical",
1127
+ classNames: "relative",
1128
+ ref: forwardedRef
1129
+ }, /* @__PURE__ */ React7.createElement(L0Menu, {
1130
+ menuActions: topLevelActions,
1131
+ topLevelItems: l0Items,
1132
+ pinnedItems,
1133
+ userAccountItem,
1134
+ path,
1135
+ parent: root,
1136
+ onItemHover
1137
+ }), /* @__PURE__ */ React7.createElement(L1Tabs, {
1138
+ topLevelItems,
1139
+ path,
1140
+ currentItemId: tab,
1141
+ onBack,
1142
+ ...props
1143
+ }))
1144
+ );
1145
+ });
1146
+ var useTopLevelNavItems = (root) => {
1147
+ const { graph } = useAppGraph5();
1148
+ const rootId = root?.id ?? Node5.RootId;
1149
+ const rootOutboundItems = useConnections2(graph, rootId, "child");
1150
+ const rootActions = useGraphActions2(graph, rootId);
1151
+ const { topLevelActions, l0Items, pinnedItems, userAccountItem } = useMemo7(() => {
1152
+ const topLevelWorkspaces = [];
1153
+ const outboundPinnedItems = [];
1154
+ let userAccountItem2;
1155
+ for (const node of rootOutboundItems) {
1156
+ switch (node.properties.disposition) {
1157
+ case "workspace":
1158
+ topLevelWorkspaces.push(node);
1159
+ break;
1160
+ case "pin-end":
1161
+ outboundPinnedItems.push(node);
1162
+ break;
1163
+ case "user-account":
1164
+ userAccountItem2 ??= node;
1165
+ break;
1166
+ }
1167
+ }
1168
+ const topLevelActions2 = rootActions.filter((action) => action.properties.disposition === "menu").toSorted((a, b) => byPosition(a.properties, b.properties));
1169
+ const pinnedItems2 = [
1170
+ ...outboundPinnedItems,
1171
+ ...rootActions.filter((action) => action.properties.disposition === "pin-end")
1172
+ ].toSorted((a, b) => byPosition(a.properties, b.properties));
1173
+ return {
1174
+ topLevelActions: topLevelActions2,
1175
+ l0Items: topLevelWorkspaces,
1176
+ pinnedItems: pinnedItems2,
1177
+ userAccountItem: userAccountItem2
1178
+ };
1179
+ }, [
1180
+ rootActions,
1181
+ rootOutboundItems
1182
+ ]);
1183
+ const topLevelItems = useMemo7(() => [
1184
+ ...l0Items,
1185
+ ...pinnedItems,
1186
+ ...userAccountItem ? [
1187
+ userAccountItem
1188
+ ] : []
1189
+ ], [
1190
+ l0Items,
1191
+ pinnedItems,
1192
+ userAccountItem
1193
+ ]);
1194
+ return {
1195
+ topLevelActions,
1196
+ l0Items,
1197
+ pinnedItems,
1198
+ userAccountItem,
1199
+ topLevelItems
1200
+ };
1201
+ };
1202
+
1203
+ // src/containers/NavTreeContainer/NavTreeContainer.tsx
1204
+ var NODE_TYPE = "dxos/app-graph/node";
1205
+ var NavTreeItemEnd = ({ node, open }) => {
1206
+ const data = useMemo8(() => ({
1207
+ id: node.id,
1208
+ subject: node.data,
1209
+ open
1210
+ }), [
1211
+ node.id,
1212
+ node.data,
1213
+ open
1214
+ ]);
1215
+ return /* @__PURE__ */ React8.createElement(Surface.Surface, {
1216
+ role: "navtree-item-end",
1217
+ data,
1218
+ limit: 1
1219
+ });
1220
+ };
1221
+ var getItems = (graph, node, disposition) => {
1222
+ return Graph5.getConnections(graph, node?.id ?? Node6.RootId, "child").filter((node2) => filterItems(node2, disposition));
1223
+ };
1224
+ var NavTreeContainer$ = /* @__PURE__ */ forwardRef3(({ tab, popoverAnchorId }, forwardedRef) => {
1225
+ const [isLg] = useMediaQuery2("lg");
1226
+ const { invokePromise } = useOperationInvoker();
1227
+ const runAction = useActionRunner4();
1228
+ const { graph } = useAppGraph6();
1229
+ const { getItem, setItem } = useNavTreeState();
1230
+ const layout = useLayout();
1231
+ const model = useNavTreeModel(Node6.RootId);
1232
+ const { navigationSidebarState } = useSidebars(meta.id);
1233
+ const latestRef = useRef2({
1234
+ tab,
1235
+ activeItems: layout.active,
1236
+ navigationSidebarState,
1237
+ isLg
1238
+ });
1239
+ useEffect2(() => {
1240
+ latestRef.current = {
1241
+ tab,
1242
+ activeItems: layout.active,
1243
+ navigationSidebarState,
1244
+ isLg
1245
+ };
1246
+ }, [
1247
+ tab,
1248
+ layout.active,
1249
+ navigationSidebarState,
1250
+ isLg
1251
+ ]);
1252
+ const handleOpenChange = useCallback4(({ item: { id }, path, open }) => {
1253
+ setItem(path, "open", open);
1254
+ Graph5.expand(graph, id, "child");
1255
+ }, [
1256
+ graph,
1257
+ setItem
1258
+ ]);
1259
+ const handleTabChange = useCallback4((node) => {
1260
+ Graph5.expand(graph, node.id, "child");
1261
+ const { tab: activeTab, activeItems, navigationSidebarState: currentSidebarState, isLg: latestIsLg } = latestRef.current;
1262
+ void invokePromise(LayoutOperation.UpdateSidebar, {
1263
+ state: node.id === activeTab ? currentSidebarState === "expanded" ? latestIsLg ? "collapsed" : "closed" : "expanded" : "expanded"
1264
+ });
1265
+ void invokePromise(LayoutOperation.SwitchWorkspace, {
1266
+ subject: node.id
1267
+ });
1268
+ if (activeItems.length === 0) {
1269
+ const [item] = getItems(graph, node).filter((node2) => !Node6.isActionLike(node2));
1270
+ if (item && item.data) {
1271
+ void invokePromise(LayoutOperation.Open, {
1272
+ subject: [
1273
+ item.id
1274
+ ]
1275
+ });
1276
+ }
1277
+ }
1278
+ }, [
1279
+ invokePromise,
1280
+ graph
1281
+ ]);
1282
+ const blockInstruction = useCallback4(({ instruction, source, target }) => {
1283
+ return target.item.properties.blockInstruction?.(source, instruction) ?? false;
1284
+ }, []);
1285
+ const canDrop = useCallback4(({ source, target }) => {
1286
+ return target.item.properties.canDrop?.(source) ?? false;
1287
+ }, []);
1288
+ const canSelect = useCallback4(({ item }) => {
1289
+ return item.properties.selectable ?? true;
1290
+ }, []);
1291
+ const handleSelect = useCallback4(({ item: node, path, option }) => {
1292
+ if (!node.data) {
1293
+ return;
1294
+ }
1295
+ if (Node6.isAction(node)) {
1296
+ const [parent] = Graph5.getConnections(graph, node.id, Node6.childRelation("inbound"));
1297
+ if (parent) {
1298
+ void runAction(node, {
1299
+ parent,
1300
+ path,
1301
+ caller: NAV_TREE_ITEM
1302
+ });
1303
+ }
1304
+ return;
1305
+ }
1306
+ const current = getItem(path).current;
1307
+ if (!current) {
1308
+ void invokePromise(LayoutOperation.Open, {
1309
+ subject: [
1310
+ node.id
1311
+ ],
1312
+ key: node.properties.key
1313
+ });
1314
+ } else if (option) {
1315
+ void invokePromise(LayoutOperation.Close, {
1316
+ subject: [
1317
+ node.id
1318
+ ]
1319
+ });
1320
+ } else {
1321
+ void invokePromise(LayoutOperation.ScrollIntoView, {
1322
+ subject: node.id
1323
+ });
1324
+ }
1325
+ const defaultAction = Graph5.getActions(graph, node.id).find((action) => action.properties?.disposition === "default");
1326
+ if (Node6.isAction(defaultAction)) {
1327
+ void runAction(defaultAction);
1328
+ }
1329
+ if (!isLg) {
1330
+ void invokePromise(LayoutOperation.UpdateSidebar, {
1331
+ state: "closed"
1332
+ });
1333
+ }
1334
+ }, [
1335
+ graph,
1336
+ invokePromise,
1337
+ getItem,
1338
+ runAction,
1339
+ isLg
1340
+ ]);
1341
+ const handleBack = useCallback4(() => void invokePromise(LayoutOperation.RevertWorkspace), [
1342
+ invokePromise
1343
+ ]);
1344
+ useEffect2(() => {
1345
+ return monitorForElements({
1346
+ canMonitor: ({ source }) => isTreeData(source.data),
1347
+ onDrop: ({ location, source }) => {
1348
+ if (!location.current.dropTargets.length) {
1349
+ return;
1350
+ }
1351
+ const target = location.current.dropTargets[0];
1352
+ const instruction = extractInstruction(target.data);
1353
+ if (instruction !== null && instruction.type !== "instruction-blocked") {
1354
+ const sourceNode = source.data.item;
1355
+ const targetNode = target.data.item;
1356
+ const sourcePath = source.data.path;
1357
+ const targetPath = target.data.path;
1358
+ const sameParent = sourcePath.slice(0, -1).join() === targetPath.slice(0, -1).join();
1359
+ const operation = sameParent && instruction.type !== "make-child" ? "rearrange" : resolveMigrationOperation(graph, sourceNode, targetPath, targetNode);
1360
+ const sourceParent = getParent(graph, sourceNode, sourcePath);
1361
+ const targetParent = getParent(graph, targetNode, targetPath);
1362
+ const sourceItems = getItems(graph, sourceParent);
1363
+ const targetItems = getItems(graph, targetParent);
1364
+ const sourceIndex = sourceItems.findIndex(({ id }) => id === sourceNode.id);
1365
+ const targetIndex = targetItems.findIndex(({ id }) => id === targetNode.id);
1366
+ const migrationIndex = instruction.type === "make-child" ? void 0 : instruction.type === "reorder-below" ? targetIndex + 1 : targetIndex;
1367
+ switch (operation) {
1368
+ case "rearrange": {
1369
+ const nextItems = sourceItems.map(({ data }) => data);
1370
+ arrayMove2(nextItems, sourceIndex, targetIndex);
1371
+ void sourceNode.properties.onRearrange?.(nextItems);
1372
+ break;
1373
+ }
1374
+ case "copy": {
1375
+ const target2 = instruction.type === "make-child" ? targetNode : targetParent;
1376
+ void target2?.properties.onCopy?.(sourceNode, migrationIndex);
1377
+ break;
1378
+ }
1379
+ case "transfer": {
1380
+ const target2 = instruction.type === "make-child" ? targetNode : targetParent;
1381
+ if (!target2?.properties.onTransferStart || target2?.id === sourceParent?.id) {
1382
+ break;
1383
+ }
1384
+ void target2?.properties.onTransferStart(sourceNode, migrationIndex);
1385
+ void sourceParent?.properties.onTransferEnd?.(sourceNode, target2);
1386
+ break;
1387
+ }
1388
+ }
1389
+ }
1390
+ }
1391
+ });
1392
+ }, [
1393
+ graph
1394
+ ]);
1395
+ const setAlternateTree = useCallback4((path, open) => {
1396
+ setItem(path, "alternateTree", open);
1397
+ }, [
1398
+ setItem
1399
+ ]);
1400
+ const onItemHover = useCallback4(({ item }) => Graph5.expand(graph, item.id, "child"), [
1401
+ graph
1402
+ ]);
1403
+ const navTreeContextValue = useMemo8(() => ({
1404
+ model,
1405
+ popoverAnchorId,
1406
+ renderItemEnd: NavTreeItemEnd,
1407
+ blockInstruction,
1408
+ canDrop,
1409
+ canSelect,
1410
+ setAlternateTree,
1411
+ onBack: handleBack,
1412
+ onOpenChange: handleOpenChange,
1413
+ onSelect: handleSelect,
1414
+ onTabChange: handleTabChange,
1415
+ onItemHover
1416
+ }), [
1417
+ model,
1418
+ popoverAnchorId,
1419
+ blockInstruction,
1420
+ canDrop,
1421
+ canSelect,
1422
+ setAlternateTree,
1423
+ handleBack,
1424
+ handleOpenChange,
1425
+ handleSelect,
1426
+ handleTabChange,
1427
+ onItemHover
1428
+ ]);
1429
+ return /* @__PURE__ */ React8.createElement(NavTreeContext.Provider, {
1430
+ value: navTreeContextValue
1431
+ }, /* @__PURE__ */ React8.createElement(NavTree, {
1432
+ id: Node6.RootId,
1433
+ root: Graph5.getRoot(graph),
1434
+ tab,
1435
+ open: layout.sidebarOpen,
1436
+ ref: forwardedRef
1437
+ }));
1438
+ });
1439
+ var NavTreeContainer = /* @__PURE__ */ memo4(NavTreeContainer$);
1440
+
1441
+ export {
1442
+ getParent,
1443
+ getPersistenceParent,
1444
+ resolveMigrationOperation,
1445
+ sortActions,
1446
+ getChildren,
1447
+ filterItems,
1448
+ l0ItemType,
1449
+ NODE_TYPE,
1450
+ NavTreeContainer
1451
+ };
1452
+ //# sourceMappingURL=chunk-MTTE5C5L.mjs.map