@dxos/plugin-navtree 0.8.4-main.e8ec1fe → 0.8.4-main.effb148878

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 (271) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/neutral/CommandsDialogContent-UBGIQ5FI.mjs +112 -0
  4. package/dist/lib/neutral/CommandsDialogContent-UBGIQ5FI.mjs.map +7 -0
  5. package/dist/lib/neutral/CommandsTrigger-BH5WLMHK.mjs +27 -0
  6. package/dist/lib/neutral/CommandsTrigger-BH5WLMHK.mjs.map +7 -0
  7. package/dist/lib/neutral/NavTreeContainer-6AR4BFDD.mjs +12 -0
  8. package/dist/lib/neutral/NavTreeContainer-6AR4BFDD.mjs.map +7 -0
  9. package/dist/lib/neutral/NavTreeDocumentTitle-H3E6ZLYE.mjs +22 -0
  10. package/dist/lib/neutral/NavTreeDocumentTitle-H3E6ZLYE.mjs.map +7 -0
  11. package/dist/lib/neutral/NavTreePlugin.mjs +56 -0
  12. package/dist/lib/neutral/NavTreePlugin.mjs.map +7 -0
  13. package/dist/lib/neutral/NavTreePlugin.node.mjs +18 -0
  14. package/dist/lib/neutral/NavTreePlugin.node.mjs.map +7 -0
  15. package/dist/lib/neutral/NavTreePlugin.workerd.mjs +16 -0
  16. package/dist/lib/neutral/NavTreePlugin.workerd.mjs.map +7 -0
  17. package/dist/lib/neutral/app-graph-builder-Z347LKSF.mjs +42 -0
  18. package/dist/lib/neutral/app-graph-builder-Z347LKSF.mjs.map +7 -0
  19. package/dist/lib/neutral/capabilities/index.mjs +17 -0
  20. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  21. package/dist/lib/neutral/chunk-5OPDKH6B.mjs +273 -0
  22. package/dist/lib/neutral/chunk-5OPDKH6B.mjs.map +7 -0
  23. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  24. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
  25. package/dist/lib/neutral/chunk-JOSNCOV4.mjs +79 -0
  26. package/dist/lib/neutral/chunk-JOSNCOV4.mjs.map +7 -0
  27. package/dist/lib/neutral/chunk-RWLAJYUL.mjs +35 -0
  28. package/dist/lib/neutral/chunk-RWLAJYUL.mjs.map +7 -0
  29. package/dist/lib/neutral/chunk-T7QS2EFI.mjs +8 -0
  30. package/dist/lib/neutral/chunk-T7QS2EFI.mjs.map +7 -0
  31. package/dist/lib/neutral/chunk-ZSWYB7JW.mjs +27 -0
  32. package/dist/lib/neutral/chunk-ZSWYB7JW.mjs.map +7 -0
  33. package/dist/lib/neutral/components/index.mjs +879 -0
  34. package/dist/lib/neutral/components/index.mjs.map +7 -0
  35. package/dist/lib/neutral/containers/index.mjs +20 -0
  36. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  37. package/dist/lib/neutral/expose-26FV4W5D.mjs +38 -0
  38. package/dist/lib/neutral/expose-26FV4W5D.mjs.map +7 -0
  39. package/dist/lib/neutral/hooks/index.mjs +169 -0
  40. package/dist/lib/neutral/hooks/index.mjs.map +7 -0
  41. package/dist/lib/neutral/index.mjs +34 -0
  42. package/dist/lib/neutral/index.mjs.map +7 -0
  43. package/dist/lib/{browser/keyboard-YYTYJW4M.mjs → neutral/keyboard-EJ65BVTC.mjs} +25 -20
  44. package/dist/lib/neutral/keyboard-EJ65BVTC.mjs.map +7 -0
  45. package/dist/lib/neutral/meta.json +1 -0
  46. package/dist/lib/neutral/meta.mjs +12 -0
  47. package/dist/lib/neutral/meta.mjs.map +7 -0
  48. package/dist/lib/neutral/operation-handler-ORDOJUL2.mjs +13 -0
  49. package/dist/lib/neutral/operation-handler-ORDOJUL2.mjs.map +7 -0
  50. package/dist/lib/neutral/operations/index.mjs +8 -0
  51. package/dist/lib/neutral/operations/index.mjs.map +7 -0
  52. package/dist/lib/neutral/plugin.mjs +16 -0
  53. package/dist/lib/neutral/plugin.mjs.map +7 -0
  54. package/dist/lib/neutral/react-surface-EWCZMKVX.mjs +50 -0
  55. package/dist/lib/neutral/react-surface-EWCZMKVX.mjs.map +7 -0
  56. package/dist/lib/neutral/state-VVITVXWM.mjs +127 -0
  57. package/dist/lib/neutral/state-VVITVXWM.mjs.map +7 -0
  58. package/dist/lib/neutral/testing/index.mjs +433 -0
  59. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  60. package/dist/lib/neutral/translations.mjs +23 -0
  61. package/dist/lib/neutral/translations.mjs.map +7 -0
  62. package/dist/lib/neutral/types/index.mjs +10 -0
  63. package/dist/lib/neutral/types/index.mjs.map +7 -0
  64. package/dist/types/src/NavTreePlugin.d.ts +3 -1
  65. package/dist/types/src/NavTreePlugin.d.ts.map +1 -1
  66. package/dist/types/src/NavTreePlugin.node.d.ts +4 -0
  67. package/dist/types/src/NavTreePlugin.node.d.ts.map +1 -0
  68. package/dist/types/src/NavTreePlugin.test.d.ts +2 -0
  69. package/dist/types/src/NavTreePlugin.test.d.ts.map +1 -0
  70. package/dist/types/src/NavTreePlugin.workerd.d.ts +4 -0
  71. package/dist/types/src/NavTreePlugin.workerd.d.ts.map +1 -0
  72. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  73. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  74. package/dist/types/src/capabilities/index.d.ts +7 -108
  75. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  76. package/dist/types/src/capabilities/keyboard.d.ts +3 -2
  77. package/dist/types/src/capabilities/keyboard.d.ts.map +1 -1
  78. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  79. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  80. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  81. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  82. package/dist/types/src/capabilities/state.d.ts +4 -18
  83. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  84. package/dist/types/src/components/NavTree/NavTree.d.ts +11 -4
  85. package/dist/types/src/components/NavTree/NavTree.d.ts.map +1 -1
  86. package/dist/types/src/components/NavTree/NavTree.stories.d.ts +10 -12
  87. package/dist/types/src/components/NavTree/NavTree.stories.d.ts.map +1 -1
  88. package/dist/types/src/components/{NavTreeContext.d.ts → NavTreeContext/NavTreeContext.d.ts} +1 -1
  89. package/dist/types/src/components/NavTreeContext/NavTreeContext.d.ts.map +1 -0
  90. package/dist/types/src/components/NavTreeContext/index.d.ts +2 -0
  91. package/dist/types/src/components/NavTreeContext/index.d.ts.map +1 -0
  92. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts +13 -9
  93. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts.map +1 -1
  94. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.stories.d.ts +3 -2
  95. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.stories.d.ts.map +1 -1
  96. package/dist/types/src/components/NavTreeItem/NavTreeItemColumns.d.ts.map +1 -1
  97. package/dist/types/src/components/Sidebar/L0Menu.d.ts +8 -5
  98. package/dist/types/src/components/Sidebar/L0Menu.d.ts.map +1 -1
  99. package/dist/types/src/components/Sidebar/L1Panel.d.ts +4 -7
  100. package/dist/types/src/components/Sidebar/L1Panel.d.ts.map +1 -1
  101. package/dist/types/src/components/Sidebar/L1Tabs.d.ts +5 -4
  102. package/dist/types/src/components/Sidebar/L1Tabs.d.ts.map +1 -1
  103. package/dist/types/src/components/UserAccountAvatar/UserAccountAvatar.d.ts.map +1 -1
  104. package/dist/types/src/components/UserAccountAvatar/UserAccountAvatar.stories.d.ts.map +1 -1
  105. package/dist/types/src/components/index.d.ts +0 -3
  106. package/dist/types/src/components/index.d.ts.map +1 -1
  107. package/dist/types/src/components/types.d.ts +8 -17
  108. package/dist/types/src/components/types.d.ts.map +1 -1
  109. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.d.ts +6 -0
  110. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.d.ts.map +1 -0
  111. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.stories.d.ts +28 -0
  112. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.stories.d.ts.map +1 -0
  113. package/dist/types/src/containers/CommandsDialogContent/index.d.ts +2 -0
  114. package/dist/types/src/containers/CommandsDialogContent/index.d.ts.map +1 -0
  115. package/dist/types/src/containers/CommandsTrigger/CommandsTrigger.d.ts.map +1 -0
  116. package/dist/types/src/containers/CommandsTrigger/index.d.ts +2 -0
  117. package/dist/types/src/containers/CommandsTrigger/index.d.ts.map +1 -0
  118. package/dist/types/src/containers/NavTreeContainer/NavTreeContainer.d.ts +9 -0
  119. package/dist/types/src/containers/NavTreeContainer/NavTreeContainer.d.ts.map +1 -0
  120. package/dist/types/src/containers/NavTreeContainer/index.d.ts +3 -0
  121. package/dist/types/src/containers/NavTreeContainer/index.d.ts.map +1 -0
  122. package/dist/types/src/{components → containers/NavTreeDocumentTitle}/NavTreeDocumentTitle.d.ts +1 -1
  123. package/dist/types/src/containers/NavTreeDocumentTitle/NavTreeDocumentTitle.d.ts.map +1 -0
  124. package/dist/types/src/containers/NavTreeDocumentTitle/index.d.ts +2 -0
  125. package/dist/types/src/containers/NavTreeDocumentTitle/index.d.ts.map +1 -0
  126. package/dist/types/src/containers/index.d.ts +7 -0
  127. package/dist/types/src/containers/index.d.ts.map +1 -0
  128. package/dist/types/src/experimental/Tree.d.ts +2 -2
  129. package/dist/types/src/experimental/Tree.d.ts.map +1 -1
  130. package/dist/types/src/experimental/Tree.stories.d.ts +18 -4
  131. package/dist/types/src/experimental/Tree.stories.d.ts.map +1 -1
  132. package/dist/types/src/hooks/index.d.ts +5 -0
  133. package/dist/types/src/hooks/index.d.ts.map +1 -0
  134. package/dist/types/src/hooks/useActions.d.ts +5 -0
  135. package/dist/types/src/hooks/useActions.d.ts.map +1 -0
  136. package/dist/types/src/hooks/useLoadDescendents.d.ts +6 -0
  137. package/dist/types/src/hooks/useLoadDescendents.d.ts.map +1 -0
  138. package/dist/types/src/hooks/useNavTreeModel.d.ts +7 -0
  139. package/dist/types/src/hooks/useNavTreeModel.d.ts.map +1 -0
  140. package/dist/types/src/hooks/useNavTreeState.d.ts +18 -0
  141. package/dist/types/src/hooks/useNavTreeState.d.ts.map +1 -0
  142. package/dist/types/src/index.d.ts +1 -3
  143. package/dist/types/src/index.d.ts.map +1 -1
  144. package/dist/types/src/meta.d.ts +2 -2
  145. package/dist/types/src/meta.d.ts.map +1 -1
  146. package/dist/types/src/operations/expose.d.ts +5 -0
  147. package/dist/types/src/operations/expose.d.ts.map +1 -0
  148. package/dist/types/src/operations/index.d.ts +3 -0
  149. package/dist/types/src/operations/index.d.ts.map +1 -0
  150. package/dist/types/src/plugin.d.ts +4 -0
  151. package/dist/types/src/plugin.d.ts.map +1 -0
  152. package/dist/types/src/testing/app-graph-builder.d.ts +2 -3
  153. package/dist/types/src/testing/app-graph-builder.d.ts.map +1 -1
  154. package/dist/types/src/testing/generator.d.ts +5 -6
  155. package/dist/types/src/testing/generator.d.ts.map +1 -1
  156. package/dist/types/src/testing/update-state.d.ts +2 -2
  157. package/dist/types/src/testing/update-state.d.ts.map +1 -1
  158. package/dist/types/src/translations.d.ts +8 -11
  159. package/dist/types/src/translations.d.ts.map +1 -1
  160. package/dist/types/src/types/NavTreeCapabilities.d.ts +13 -0
  161. package/dist/types/src/types/NavTreeCapabilities.d.ts.map +1 -0
  162. package/dist/types/src/types/NavTreeEvents.d.ts +3 -0
  163. package/dist/types/src/types/NavTreeEvents.d.ts.map +1 -0
  164. package/dist/types/src/types/index.d.ts +4 -0
  165. package/dist/types/src/types/index.d.ts.map +1 -0
  166. package/dist/types/src/{types.d.ts → types/schema.d.ts} +6 -6
  167. package/dist/types/src/types/schema.d.ts.map +1 -0
  168. package/dist/types/src/util.d.ts +12 -8
  169. package/dist/types/src/util.d.ts.map +1 -1
  170. package/dist/types/tsconfig.tsbuildinfo +1 -1
  171. package/package.json +126 -59
  172. package/src/NavTreePlugin.node.ts +17 -0
  173. package/src/NavTreePlugin.test.ts +27 -0
  174. package/src/NavTreePlugin.tsx +41 -77
  175. package/src/NavTreePlugin.workerd.ts +16 -0
  176. package/src/capabilities/app-graph-builder.ts +34 -45
  177. package/src/capabilities/index.ts +10 -8
  178. package/src/capabilities/keyboard.ts +58 -51
  179. package/src/capabilities/operation-handler.ts +16 -0
  180. package/src/capabilities/react-surface.tsx +46 -38
  181. package/src/capabilities/state.ts +132 -84
  182. package/src/components/NavTree/NavTree.stories.tsx +51 -57
  183. package/src/components/NavTree/NavTree.tsx +65 -33
  184. package/src/components/{NavTreeContext.tsx → NavTreeContext/NavTreeContext.tsx} +1 -1
  185. package/src/components/NavTreeContext/index.ts +5 -0
  186. package/src/components/NavTreeItem/NavTreeItemAction.stories.tsx +23 -15
  187. package/src/components/NavTreeItem/NavTreeItemAction.tsx +75 -52
  188. package/src/components/NavTreeItem/NavTreeItemColumns.tsx +46 -20
  189. package/src/components/Sidebar/L0Menu.tsx +155 -184
  190. package/src/components/Sidebar/L1Panel.tsx +203 -100
  191. package/src/components/Sidebar/L1Tabs.tsx +18 -34
  192. package/src/components/UserAccountAvatar/UserAccountAvatar.stories.tsx +2 -3
  193. package/src/components/UserAccountAvatar/UserAccountAvatar.tsx +1 -1
  194. package/src/components/index.ts +1 -3
  195. package/src/components/types.ts +13 -19
  196. package/src/containers/CommandsDialogContent/CommandsDialogContent.stories.tsx +46 -0
  197. package/src/containers/CommandsDialogContent/CommandsDialogContent.tsx +127 -0
  198. package/src/containers/CommandsDialogContent/index.ts +5 -0
  199. package/src/containers/CommandsTrigger/CommandsTrigger.tsx +28 -0
  200. package/src/containers/CommandsTrigger/index.ts +5 -0
  201. package/src/containers/NavTreeContainer/NavTreeContainer.tsx +271 -0
  202. package/src/containers/NavTreeContainer/index.ts +6 -0
  203. package/src/{components → containers/NavTreeDocumentTitle}/NavTreeDocumentTitle.tsx +4 -3
  204. package/src/containers/NavTreeDocumentTitle/index.ts +5 -0
  205. package/src/containers/index.ts +12 -0
  206. package/src/experimental/Tree.stories.tsx +82 -85
  207. package/src/experimental/Tree.tsx +5 -5
  208. package/src/hooks/index.ts +8 -0
  209. package/src/hooks/useActions.ts +34 -0
  210. package/src/hooks/useLoadDescendents.ts +23 -0
  211. package/src/hooks/useNavTreeModel.ts +118 -0
  212. package/src/hooks/useNavTreeState.ts +35 -0
  213. package/src/index.ts +1 -3
  214. package/src/meta.ts +20 -6
  215. package/src/operations/expose.ts +42 -0
  216. package/src/operations/index.ts +7 -0
  217. package/src/plugin.ts +11 -0
  218. package/src/testing/app-graph-builder.ts +166 -238
  219. package/src/testing/generator.ts +35 -38
  220. package/src/testing/update-state.ts +6 -6
  221. package/src/translations.ts +8 -10
  222. package/src/types/NavTreeCapabilities.ts +21 -0
  223. package/src/types/NavTreeEvents.ts +12 -0
  224. package/src/types/index.ts +8 -0
  225. package/src/{types.ts → types/schema.ts} +5 -5
  226. package/src/util.ts +28 -17
  227. package/dist/lib/browser/app-graph-builder-OHSCN3GX.mjs +0 -46
  228. package/dist/lib/browser/app-graph-builder-OHSCN3GX.mjs.map +0 -7
  229. package/dist/lib/browser/chunk-5VLWX4PK.mjs +0 -15
  230. package/dist/lib/browser/chunk-5VLWX4PK.mjs.map +0 -7
  231. package/dist/lib/browser/chunk-7D2MPHXV.mjs +0 -1483
  232. package/dist/lib/browser/chunk-7D2MPHXV.mjs.map +0 -7
  233. package/dist/lib/browser/chunk-E6MZBCU5.mjs +0 -19
  234. package/dist/lib/browser/chunk-E6MZBCU5.mjs.map +0 -7
  235. package/dist/lib/browser/index.mjs +0 -146
  236. package/dist/lib/browser/index.mjs.map +0 -7
  237. package/dist/lib/browser/intent-resolver-YUVXVPHG.mjs +0 -47
  238. package/dist/lib/browser/intent-resolver-YUVXVPHG.mjs.map +0 -7
  239. package/dist/lib/browser/keyboard-YYTYJW4M.mjs.map +0 -7
  240. package/dist/lib/browser/meta.json +0 -1
  241. package/dist/lib/browser/react-surface-J7MWWAGD.mjs +0 -51
  242. package/dist/lib/browser/react-surface-J7MWWAGD.mjs.map +0 -7
  243. package/dist/lib/browser/state-EUSVT6BI.mjs +0 -117
  244. package/dist/lib/browser/state-EUSVT6BI.mjs.map +0 -7
  245. package/dist/types/src/capabilities/capabilities.d.ts +0 -21
  246. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  247. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  248. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  249. package/dist/types/src/components/CommandsDialog/CommandsDialog.d.ts +0 -5
  250. package/dist/types/src/components/CommandsDialog/CommandsDialog.d.ts.map +0 -1
  251. package/dist/types/src/components/CommandsDialog/CommandsTrigger.d.ts.map +0 -1
  252. package/dist/types/src/components/CommandsDialog/index.d.ts +0 -3
  253. package/dist/types/src/components/CommandsDialog/index.d.ts.map +0 -1
  254. package/dist/types/src/components/NavTreeContainer.d.ts +0 -9
  255. package/dist/types/src/components/NavTreeContainer.d.ts.map +0 -1
  256. package/dist/types/src/components/NavTreeContext.d.ts.map +0 -1
  257. package/dist/types/src/components/NavTreeDocumentTitle.d.ts.map +0 -1
  258. package/dist/types/src/events.d.ts +0 -4
  259. package/dist/types/src/events.d.ts.map +0 -1
  260. package/dist/types/src/hooks.d.ts +0 -3
  261. package/dist/types/src/hooks.d.ts.map +0 -1
  262. package/dist/types/src/types.d.ts.map +0 -1
  263. package/src/capabilities/capabilities.ts +0 -20
  264. package/src/capabilities/intent-resolver.ts +0 -37
  265. package/src/components/CommandsDialog/CommandsDialog.tsx +0 -126
  266. package/src/components/CommandsDialog/CommandsTrigger.tsx +0 -36
  267. package/src/components/CommandsDialog/index.ts +0 -6
  268. package/src/components/NavTreeContainer.tsx +0 -369
  269. package/src/events.ts +0 -11
  270. package/src/hooks.ts +0 -21
  271. /package/dist/types/src/{components/CommandsDialog → containers/CommandsTrigger}/CommandsTrigger.d.ts +0 -0
@@ -0,0 +1,879 @@
1
+ import {
2
+ l0ItemType
3
+ } from "../chunk-JOSNCOV4.mjs";
4
+ import "../chunk-J5LGTIGS.mjs";
5
+
6
+ // src/components/NavTree/NavTree.tsx
7
+ import React7, { forwardRef as forwardRef2, useMemo as useMemo4 } from "react";
8
+ import { useAppGraph as useAppGraph2 } from "@dxos/app-toolkit/ui";
9
+ import { Node as Node3, useConnections, useActions as useGraphActions } from "@dxos/plugin-graph";
10
+ import { Tabs as Tabs3 } from "@dxos/react-ui-tabs";
11
+ import { byPosition } from "@dxos/util";
12
+ import { useLoadDescendents as useLoadDescendents2 } from "#hooks";
13
+
14
+ // src/components/NavTreeContext/NavTreeContext.tsx
15
+ import { createContext, useContext } from "react";
16
+ import { raise } from "@dxos/debug";
17
+ var NavTreeContext = /* @__PURE__ */ createContext(null);
18
+ var useNavTreeContext = () => useContext(NavTreeContext) ?? raise(new Error("Missing NavTreeContext"));
19
+
20
+ // src/components/Sidebar/L0Menu.tsx
21
+ import { attachClosestEdge, extractClosestEdge } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge";
22
+ import { combine } from "@atlaskit/pragmatic-drag-and-drop/combine";
23
+ import { draggable, dropTargetForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
24
+ import { preserveOffsetOnSource } from "@atlaskit/pragmatic-drag-and-drop/element/preserve-offset-on-source";
25
+ import { scrollJustEnoughIntoView } from "@atlaskit/pragmatic-drag-and-drop/element/scroll-just-enough-into-view";
26
+ import { useAtomValue } from "@effect-atom/atom-react";
27
+ import React2, { forwardRef, memo, useCallback, useLayoutEffect, useMemo, useRef, useState } from "react";
28
+ import { DxAvatar } from "@dxos/lit-ui/react";
29
+ import { useActionRunner } from "@dxos/plugin-graph";
30
+ import { Icon, IconButton, ListItem, ScrollArea, Tooltip, toLocalizedString, useMediaQuery, useTranslation } from "@dxos/react-ui";
31
+ import { Menu } from "@dxos/react-ui-menu";
32
+ import { Tabs } from "@dxos/react-ui-tabs";
33
+ import { mx } from "@dxos/ui-theme";
34
+ import { arrayMove } from "@dxos/util";
35
+ import { useNavTreeState } from "#hooks";
36
+ import { meta } from "#meta";
37
+
38
+ // src/components/UserAccountAvatar/UserAccountAvatar.tsx
39
+ import React from "react";
40
+ import { Avatar } from "@dxos/react-ui";
41
+ import { hexToFallback } from "@dxos/util";
42
+ var UserAccountAvatar = ({ size, userId, hue, emoji, status }) => {
43
+ const fallbackValue = hexToFallback(userId ?? "0");
44
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(L0ItemActiveTabIndicator, {
45
+ classNames: "inset-y-6"
46
+ }), /* @__PURE__ */ React.createElement("div", {
47
+ className: "grid place-items-center dx-focus-ring-group-indicator rounded-full",
48
+ "data-joyride": "welcome/account"
49
+ }, /* @__PURE__ */ React.createElement(Avatar.Root, null, /* @__PURE__ */ React.createElement(Avatar.Content, {
50
+ variant: "circle",
51
+ size: size ?? 12,
52
+ status: status ?? "active",
53
+ hue: hue || fallbackValue.hue,
54
+ fallback: emoji || fallbackValue.emoji,
55
+ "data-testid": "treeView.userAccount"
56
+ }))));
57
+ };
58
+
59
+ // src/components/Sidebar/L0Menu.tsx
60
+ var useL0ItemClick = ({ item, parent, path }, type) => {
61
+ const { onSelect, onTabChange } = useNavTreeContext();
62
+ const { getItem } = useNavTreeState();
63
+ const [isLg] = useMediaQuery("lg");
64
+ const runAction = useActionRunner();
65
+ return useCallback((event) => {
66
+ switch (type) {
67
+ case "action": {
68
+ const { properties: { caller } = {} } = item;
69
+ return void runAction(item, caller ? {
70
+ parent,
71
+ path,
72
+ caller
73
+ } : {
74
+ parent,
75
+ path
76
+ });
77
+ }
78
+ case "tab":
79
+ return onTabChange?.(item);
80
+ case "link":
81
+ return onSelect?.({
82
+ item,
83
+ path,
84
+ current: !getItem(path).current,
85
+ option: event.altKey
86
+ });
87
+ }
88
+ }, [
89
+ item,
90
+ parent,
91
+ type,
92
+ getItem,
93
+ onSelect,
94
+ onTabChange,
95
+ isLg,
96
+ runAction
97
+ ]);
98
+ };
99
+ var l0Breakpoints = {
100
+ lg: "hidden lg:grid"
101
+ };
102
+ var L0ItemRoot = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef(({ item, parent, path, onMouseEnter, children }, forwardedRef) => {
103
+ const { t } = useTranslation(meta.id);
104
+ const { model } = useNavTreeContext();
105
+ const itemPath = useMemo(() => [
106
+ ...path,
107
+ item.id
108
+ ], [
109
+ item.id,
110
+ path
111
+ ]);
112
+ const { id, testId } = useAtomValue(model.itemProps(itemPath));
113
+ const localizedString = toLocalizedString(item.properties.label, t);
114
+ const type = l0ItemType(item);
115
+ const handleClick = useL0ItemClick({
116
+ item,
117
+ parent,
118
+ path: itemPath
119
+ }, type);
120
+ return /* @__PURE__ */ React2.createElement(Tooltip.Trigger, {
121
+ asChild: true,
122
+ delayDuration: 0,
123
+ side: "right",
124
+ content: localizedString
125
+ }, /* @__PURE__ */ React2.createElement(Tabs.TabPrimitive, {
126
+ className: mx("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]),
127
+ tabIndex: type === "tab" ? 0 : void 0,
128
+ "data-type": type,
129
+ "data-testid": testId,
130
+ "data-object-id": id,
131
+ value: item.id,
132
+ onClick: handleClick,
133
+ onMouseEnter,
134
+ ref: forwardedRef
135
+ }, children));
136
+ }));
137
+ var L0ItemActiveTabIndicator = ({ classNames }) => /* @__PURE__ */ React2.createElement("div", {
138
+ className: mx("hidden group-aria-selected/l0item:block absolute start-0 h-6 w-1.5 bg-accent-surface rounded-sm", classNames)
139
+ });
140
+ var L0Item = /* @__PURE__ */ memo(({ item, parent, path, pinned, onRearrange, onItemHover }) => {
141
+ const { t } = useTranslation(meta.id);
142
+ const itemElement = useRef(null);
143
+ const [closestEdge, setEdge] = useState(null);
144
+ const localizedString = toLocalizedString(item.properties.label, t);
145
+ const hue = item.properties.hue ?? null;
146
+ useLayoutEffect(() => {
147
+ if (!itemElement.current || !onRearrange) {
148
+ return;
149
+ }
150
+ return combine(draggable({
151
+ element: itemElement.current,
152
+ getInitialData: () => ({
153
+ id: item.id,
154
+ type: "l0Item"
155
+ }),
156
+ onGenerateDragPreview: ({ nativeSetDragImage, source, location }) => {
157
+ document.body.setAttribute("data-drag-preview", "true");
158
+ const element = source.element.querySelector("[data-frame]");
159
+ scrollJustEnoughIntoView({
160
+ element
161
+ });
162
+ const { x, y } = preserveOffsetOnSource({
163
+ element,
164
+ input: location.current.input
165
+ })({
166
+ container: element.offsetParent ?? document.body
167
+ });
168
+ nativeSetDragImage?.(element, x, y);
169
+ },
170
+ onDragStart: () => {
171
+ document.body.removeAttribute("data-drag-preview");
172
+ itemElement.current.closest("[data-drag-autoscroll]")?.setAttribute("data-drag-autoscroll", "active");
173
+ },
174
+ onDrop: () => {
175
+ itemElement.current.closest("[data-drag-autoscroll]")?.setAttribute("data-drag-autoscroll", "idle");
176
+ }
177
+ }), dropTargetForElements({
178
+ element: itemElement.current,
179
+ getData: ({ input, element }) => {
180
+ return attachClosestEdge({
181
+ id: item.id,
182
+ type: "l0Item"
183
+ }, {
184
+ input,
185
+ element,
186
+ allowedEdges: [
187
+ "top",
188
+ "bottom"
189
+ ]
190
+ });
191
+ },
192
+ onDragEnter: ({ self, source }) => {
193
+ if (source.data.type === self.data.type) {
194
+ setEdge(extractClosestEdge(self.data));
195
+ }
196
+ },
197
+ onDrag: ({ self, source }) => {
198
+ if (source.data.type === self.data.type) {
199
+ setEdge(extractClosestEdge(self.data));
200
+ }
201
+ },
202
+ onDragLeave: () => setEdge(null),
203
+ onDrop: ({ self, source }) => {
204
+ setEdge(null);
205
+ if (source.data.type === self.data.type) {
206
+ onRearrange(source.data, self.data, extractClosestEdge(self.data));
207
+ }
208
+ }
209
+ }));
210
+ }, [
211
+ item,
212
+ onRearrange
213
+ ]);
214
+ const handleMouseEnter = useCallback(() => onItemHover?.({
215
+ item
216
+ }), [
217
+ item,
218
+ onItemHover
219
+ ]);
220
+ return /* @__PURE__ */ React2.createElement(L0ItemRoot, {
221
+ ref: itemElement,
222
+ item,
223
+ parent,
224
+ path,
225
+ onMouseEnter: handleMouseEnter
226
+ }, /* @__PURE__ */ React2.createElement("div", {
227
+ "data-frame": true,
228
+ ...hue && {
229
+ style: {
230
+ background: `var(--color-${hue}-surface)`
231
+ }
232
+ },
233
+ className: mx("flex justify-center items-center dx-focus-ring-group-indicator transition-colors rounded-sm", pinned ? "p-2 group-hover/l0item:bg-current-surface" : "w-(--dx-l0-avatar-size) h-(--dx-l0-avatar-size) bg-current-surface")
234
+ }, /* @__PURE__ */ React2.createElement(ItemAvatar, {
235
+ item
236
+ })), /* @__PURE__ */ React2.createElement(L0ItemActiveTabIndicator, null), /* @__PURE__ */ React2.createElement("span", {
237
+ id: `${item.id}__label`,
238
+ className: "sr-only"
239
+ }, localizedString), closestEdge && /* @__PURE__ */ React2.createElement(ListItem.DropIndicator, {
240
+ edge: closestEdge
241
+ }));
242
+ });
243
+ var ItemAvatar = ({ item }) => {
244
+ const { t } = useTranslation(meta.id);
245
+ if (item.properties.icon) {
246
+ const hue = item.properties.hue ?? null;
247
+ const hueFgStyle = hue && {
248
+ style: {
249
+ color: `var(--color-${hue}-foreground)`
250
+ }
251
+ };
252
+ return /* @__PURE__ */ React2.createElement(Icon, {
253
+ icon: item.properties.icon,
254
+ size: 6,
255
+ ...hueFgStyle
256
+ });
257
+ }
258
+ const type = l0ItemType(item);
259
+ if (type === "tab" && item.properties.disposition !== "pin-end") {
260
+ const hue = item.properties.hue ?? null;
261
+ const localizedString = toLocalizedString(item.properties.label, t);
262
+ return /* @__PURE__ */ React2.createElement(DxAvatar, {
263
+ hue,
264
+ hueVariant: "surface",
265
+ variant: "square",
266
+ size: 12,
267
+ fallback: localizedString
268
+ });
269
+ }
270
+ return null;
271
+ };
272
+ var L0Menu = ({ menuActions, topLevelItems, pinnedItems, userAccountItem, parent, path, onItemHover }) => {
273
+ const { t } = useTranslation(meta.id);
274
+ const runAction = useActionRunner();
275
+ const handleAction = useCallback((action, params) => {
276
+ void runAction(action, params);
277
+ }, [
278
+ runAction
279
+ ]);
280
+ const handleRearrange = useCallback((source, target, closestEdge) => {
281
+ const sourceItem = topLevelItems.find((i) => i.id === source.id);
282
+ if (!sourceItem?.properties.onRearrange) {
283
+ return;
284
+ }
285
+ const sourceIndex = topLevelItems.findIndex((i) => i.id === source.id);
286
+ const targetIndex = topLevelItems.findIndex((i) => i.id === target.id);
287
+ const insertIndex = source.id === target.id ? sourceIndex : targetIndex + (sourceIndex < targetIndex ? closestEdge === "top" ? -1 : 0 : closestEdge === "bottom" ? 1 : 0);
288
+ const nextOrder = arrayMove([
289
+ ...topLevelItems
290
+ ], sourceIndex, insertIndex);
291
+ return sourceItem.properties.onRearrange(nextOrder.map((item) => item.data));
292
+ }, [
293
+ topLevelItems
294
+ ]);
295
+ const hasRearrangeableItems = topLevelItems.some((item) => item.properties.onRearrange);
296
+ return /* @__PURE__ */ React2.createElement(Tabs.Tablist, {
297
+ "data-tauri-drag-region": true,
298
+ classNames: [
299
+ "group/l0 absolute z-[1] inset-y-0 start-0 rounded-is",
300
+ "grid grid-cols-[var(--dx-l0-size)] grid-rows-[var(--dx-rail-size)_1fr_min-content_var(--dx-l0-size)] dx-contain-layout",
301
+ "w-(--dx-l0-size) bg-toolbar-surface dx-app-drag pb-[env(safe-area-inset-bottom)]",
302
+ '[body[data-platform="macos"]_&]:pt-[30px]',
303
+ '[body[data-platform="ios"]_&]:pt-[max(env(safe-area-inset-top),0.25rem)]'
304
+ ]
305
+ }, /* @__PURE__ */ React2.createElement(Menu.Root, {
306
+ onAction: handleAction
307
+ }, /* @__PURE__ */ React2.createElement(Menu.Trigger, {
308
+ asChild: true,
309
+ "data-testid": "spacePlugin.addSpace"
310
+ }, /* @__PURE__ */ React2.createElement("div", {
311
+ className: "grid place-items-center"
312
+ }, /* @__PURE__ */ React2.createElement(IconButton, {
313
+ density: "lg",
314
+ variant: "ghost",
315
+ size: 5,
316
+ icon: "ph--list--regular",
317
+ iconOnly: true,
318
+ square: true,
319
+ label: t("app-menu.label")
320
+ }))), /* @__PURE__ */ React2.createElement(Menu.Content, {
321
+ group: parent,
322
+ items: menuActions
323
+ })), /* @__PURE__ */ React2.createElement(ScrollArea.Root, {
324
+ centered: true,
325
+ thin: true,
326
+ orientation: "vertical"
327
+ }, /* @__PURE__ */ React2.createElement(ScrollArea.Viewport, {
328
+ classNames: "flex flex-col gap-2 py-1"
329
+ }, topLevelItems.map((item) => /* @__PURE__ */ React2.createElement(L0Item, {
330
+ key: item.id,
331
+ item,
332
+ parent,
333
+ path,
334
+ onItemHover,
335
+ ...hasRearrangeableItems && {
336
+ onRearrange: handleRearrange
337
+ }
338
+ })))), /* @__PURE__ */ React2.createElement("div", {
339
+ className: "grid grid-cols-1 auto-rows-(--dx-rail-action) pt-2"
340
+ }, pinnedItems.map((item) => /* @__PURE__ */ React2.createElement(L0Item, {
341
+ key: item.id,
342
+ item,
343
+ parent,
344
+ path,
345
+ pinned: true
346
+ }))), userAccountItem && /* @__PURE__ */ React2.createElement("div", {
347
+ className: "grid dx-app-no-drag"
348
+ }, /* @__PURE__ */ React2.createElement(L0ItemRoot, {
349
+ key: userAccountItem.id,
350
+ item: userAccountItem,
351
+ parent,
352
+ path
353
+ }, /* @__PURE__ */ React2.createElement(UserAccountAvatar, {
354
+ userId: userAccountItem.properties.userId,
355
+ hue: userAccountItem.properties.hue,
356
+ emoji: userAccountItem.properties.emoji,
357
+ status: userAccountItem.properties.status,
358
+ size: 10
359
+ }))));
360
+ };
361
+
362
+ // src/components/Sidebar/L1Panel.tsx
363
+ import * as Option from "effect/Option";
364
+ import React5, { memo as memo3, useCallback as useCallback3, useMemo as useMemo3 } from "react";
365
+ import { Node as Node2 } from "@dxos/app-graph";
366
+ import { isPinnedWorkspace } from "@dxos/app-toolkit";
367
+ import { useAppGraph } from "@dxos/app-toolkit/ui";
368
+ import { Graph, useActionRunner as useActionRunner3, useEdges } from "@dxos/plugin-graph";
369
+ import { DensityProvider, IconButton as IconButton3, ScrollArea as ScrollArea2, toLocalizedString as toLocalizedString4, useTranslation as useTranslation4 } from "@dxos/react-ui";
370
+ import { Tree } from "@dxos/react-ui-list";
371
+ import { Menu as Menu3 } from "@dxos/react-ui-menu";
372
+ import { Tabs as Tabs2 } from "@dxos/react-ui-tabs";
373
+ import { hoverableControlItem as hoverableControlItem2, hoverableOpenControlItem as hoverableOpenControlItem2 } from "@dxos/ui-theme";
374
+ import { useActions as useActions2, useLoadDescendents } from "#hooks";
375
+ import { meta as meta4 } from "#meta";
376
+
377
+ // src/components/NavTreeItem/NavTreeItemAction.tsx
378
+ import React3, { useCallback as useCallback2 } from "react";
379
+ import { useActionRunner as useActionRunner2 } from "@dxos/plugin-graph";
380
+ import { IconButton as IconButton2, toLocalizedString as toLocalizedString2, useDensityContext, useTranslation as useTranslation2 } from "@dxos/react-ui";
381
+ import { composable, composableProps } from "@dxos/react-ui";
382
+ import { Menu as Menu2 } from "@dxos/react-ui-menu";
383
+ import { hoverableControlItem, hoverableOpenControlItem } from "@dxos/ui-theme";
384
+ import { meta as meta2 } from "#meta";
385
+ var fallbackIcon = "ph--circle-dashed--regular";
386
+ var mdActionButtonProps = {
387
+ size: 4,
388
+ density: "md"
389
+ };
390
+ var lgActionButtonProps = {
391
+ size: 5,
392
+ density: "lg"
393
+ };
394
+ var NavTreeItemActionDropdownMenu = composable(({ parent, path, label, icon, testId, menuActions, caller, ...props }, forwardedRef) => {
395
+ const { t } = useTranslation2(meta2.id);
396
+ const density = useDensityContext();
397
+ const runAction = useActionRunner2();
398
+ const handleAction = useCallback2((action, params = {}) => runAction(action, {
399
+ ...params,
400
+ path
401
+ }), [
402
+ runAction,
403
+ path
404
+ ]);
405
+ return /* @__PURE__ */ React3.createElement(Menu2.Root, {
406
+ caller,
407
+ onAction: handleAction
408
+ }, /* @__PURE__ */ React3.createElement(Menu2.Trigger, {
409
+ asChild: true
410
+ }, /* @__PURE__ */ React3.createElement(IconButton2, {
411
+ ...density === "lg" ? lgActionButtonProps : mdActionButtonProps,
412
+ ...composableProps(props),
413
+ classNames: [
414
+ "shrink-0 px-2 pointer-fine:px-1",
415
+ hoverableControlItem,
416
+ hoverableOpenControlItem
417
+ ],
418
+ variant: "ghost",
419
+ icon: icon ?? fallbackIcon,
420
+ iconOnly: true,
421
+ label: toLocalizedString2(label, t),
422
+ "data-testid": testId,
423
+ ref: forwardedRef
424
+ })), /* @__PURE__ */ React3.createElement(Menu2.Content, {
425
+ group: parent,
426
+ items: menuActions
427
+ }));
428
+ });
429
+ NavTreeItemActionDropdownMenu.displayName = "NavTreeItemActionDropdownMenu";
430
+ var NavTreeItemMonolithicAction = (props) => {
431
+ const { parent, path, properties: { disabled, caller, testId, icon, variant = "ghost", iconOnly = true } = {
432
+ label: "never"
433
+ }, baseLabel } = props;
434
+ const density = useDensityContext();
435
+ const runAction = useActionRunner2();
436
+ return /* @__PURE__ */ React3.createElement(IconButton2, {
437
+ ...density === "lg" ? lgActionButtonProps : mdActionButtonProps,
438
+ variant,
439
+ classNames: [
440
+ "shrink-0",
441
+ hoverableControlItem,
442
+ hoverableOpenControlItem,
443
+ iconOnly ? "px-2 pointer-fine:px-1" : "p-2 pointer-fine:p-2 me-1"
444
+ ],
445
+ icon: icon ?? fallbackIcon,
446
+ iconOnly,
447
+ label: baseLabel,
448
+ disabled,
449
+ onClick: (event) => {
450
+ event.stopPropagation();
451
+ if (disabled) {
452
+ return;
453
+ }
454
+ void runAction(props, caller ? {
455
+ parent,
456
+ caller,
457
+ path
458
+ } : {
459
+ parent,
460
+ path
461
+ });
462
+ },
463
+ "data-testid": testId
464
+ });
465
+ };
466
+ var NavTreeItemAction = ({ monolithic, menuActions, menuType, parent, path, ...props }) => {
467
+ const { t } = useTranslation2(meta2.id);
468
+ const monolithicAction = menuActions?.length === 1 && menuActions[0];
469
+ const baseLabel = toLocalizedString2(monolithicAction ? monolithicAction.properties.label : props.label, t);
470
+ return monolithic && menuActions?.length === 1 ? /* @__PURE__ */ React3.createElement(NavTreeItemMonolithicAction, {
471
+ baseLabel,
472
+ parent,
473
+ path,
474
+ ...menuActions[0]
475
+ }) : /* @__PURE__ */ React3.createElement(NavTreeItemActionDropdownMenu, {
476
+ ...props,
477
+ label: baseLabel,
478
+ parent,
479
+ path,
480
+ menuActions
481
+ });
482
+ };
483
+
484
+ // src/components/NavTreeItem/NavTreeItemColumns.tsx
485
+ import React4, { Fragment, memo as memo2, useMemo as useMemo2 } from "react";
486
+ import { Node } from "@dxos/app-graph";
487
+ import { Popover, Treegrid, toLocalizedString as toLocalizedString3, useTranslation as useTranslation3 } from "@dxos/react-ui";
488
+ import { useActions } from "#hooks";
489
+ import { meta as meta3 } from "#meta";
490
+ var NavTreeItemColumns = /* @__PURE__ */ memo2(({ path, item, open }) => {
491
+ const { t } = useTranslation3(meta3.id);
492
+ const { renderItemEnd: ItemEnd, popoverAnchorId } = useNavTreeContext();
493
+ const level = path.length - 2;
494
+ const { actions: actionsProp, groupedActions } = useActions(item);
495
+ const sortedActions = useMemo2(() => actionsProp.toSorted((actionA, actionB) => {
496
+ const primaryA = actionA.properties?.disposition === "list-item-primary";
497
+ const primaryB = actionB.properties?.disposition === "list-item-primary";
498
+ if (primaryA && !primaryB) {
499
+ return -1;
500
+ }
501
+ if (primaryB && !primaryA) {
502
+ return 1;
503
+ }
504
+ return 0;
505
+ }), [
506
+ actionsProp
507
+ ]);
508
+ const [primaryAction, ...secondaryActions] = sortedActions;
509
+ const actions = useMemo2(() => (primaryAction?.properties?.disposition === "list-item-primary" ? secondaryActions : sortedActions).flatMap((action) => Node.isAction(action) ? [
510
+ action
511
+ ] : []).filter((a) => [
512
+ "list-item",
513
+ "list-item-primary"
514
+ ].includes(a.properties?.disposition)), [
515
+ sortedActions,
516
+ primaryAction
517
+ ]);
518
+ const primaryMenuActions = useMemo2(() => primaryAction ? Node.isAction(primaryAction) ? [
519
+ primaryAction
520
+ ] : groupedActions[primaryAction?.id ?? ""] : void 0, [
521
+ primaryAction,
522
+ groupedActions
523
+ ]);
524
+ const ActionRoot = popoverAnchorId === `${NAV_TREE_ITEM}:${item.id}` ? Popover.Anchor : Fragment;
525
+ return /* @__PURE__ */ React4.createElement("div", {
526
+ className: "contents dx-app-no-drag"
527
+ }, primaryAction?.properties?.disposition === "list-item-primary" && !primaryAction?.properties?.disabled ? /* @__PURE__ */ React4.createElement(Treegrid.Cell, {
528
+ classNames: "contents"
529
+ }, /* @__PURE__ */ React4.createElement(NavTreeItemAction, {
530
+ testId: primaryAction.properties?.testId,
531
+ label: toLocalizedString3(primaryAction.properties?.label, t),
532
+ icon: primaryAction.properties?.icon ?? "ph--circle-dashed--regular",
533
+ parent: item,
534
+ path,
535
+ monolithic: Node.isAction(primaryAction),
536
+ menuActions: primaryMenuActions,
537
+ menuType: primaryAction.properties?.menuType,
538
+ caller: NAV_TREE_ITEM
539
+ })) : /* @__PURE__ */ React4.createElement(Treegrid.Cell, {
540
+ role: "none"
541
+ }), /* @__PURE__ */ React4.createElement(ActionRoot, null, actions.length > 0 ? /* @__PURE__ */ React4.createElement(Treegrid.Cell, {
542
+ classNames: "contents"
543
+ }, /* @__PURE__ */ React4.createElement(NavTreeItemAction, {
544
+ testId: `navtree.treeItem.actionsLevel${level}`,
545
+ label: t("tree-item-actions.label"),
546
+ icon: "ph--dots-three-vertical--regular",
547
+ parent: item,
548
+ path,
549
+ menuActions: actions,
550
+ menuType: "dropdown",
551
+ caller: NAV_TREE_ITEM
552
+ })) : /* @__PURE__ */ React4.createElement(Treegrid.Cell, {
553
+ role: "none"
554
+ })), ItemEnd && /* @__PURE__ */ React4.createElement(Treegrid.Cell, {
555
+ classNames: "contents"
556
+ }, /* @__PURE__ */ React4.createElement(ItemEnd, {
557
+ node: item,
558
+ open
559
+ })));
560
+ });
561
+
562
+ // src/components/Sidebar/L1Panel.tsx
563
+ var L1Panel$ = ({ open, path, item, isCurrent, onBack }) => {
564
+ const { t } = useTranslation4(meta4.id);
565
+ const title = toLocalizedString4(item.properties.label, t);
566
+ const isActivated = useIsActivatedWorkspace(item);
567
+ const shouldRenderContent = isCurrent || isActivated;
568
+ return /* @__PURE__ */ React5.createElement(Tabs2.Panel, {
569
+ key: item.id,
570
+ value: item.id,
571
+ classNames: [
572
+ "absolute inset-y-0 end-0",
573
+ "w-[calc(100%-var(--dx-l0-size))] lg:w-(--dx-l1-size) grid-cols-1 grid-rows-[var(--dx-rail-size)_1fr]",
574
+ "py-[env(safe-area-inset-top)]",
575
+ isCurrent && "grid"
576
+ ],
577
+ tabIndex: -1,
578
+ "aria-label": title,
579
+ ...isCurrent && {
580
+ "data-testid": "navtree.workspace.visible"
581
+ },
582
+ ...!open && {
583
+ inert: true
584
+ }
585
+ }, shouldRenderContent && /* @__PURE__ */ React5.createElement(L1PanelContent, {
586
+ open,
587
+ path,
588
+ item,
589
+ onBack
590
+ }));
591
+ };
592
+ var useIsActivatedWorkspace = (item) => {
593
+ const { graph } = useAppGraph();
594
+ const edges = useEdges(graph, item.id);
595
+ return useMemo3(() => {
596
+ const childIds = edges[Graph.relationKey("child")] ?? [];
597
+ return childIds.some((childId) => {
598
+ const child = Graph.getNode(graph, childId);
599
+ if (Option.isNone(child)) {
600
+ return false;
601
+ }
602
+ return child.value.properties.disposition === void 0;
603
+ });
604
+ }, [
605
+ edges,
606
+ graph
607
+ ]);
608
+ };
609
+ var L1PanelContent = ({ path, item, onBack }) => {
610
+ const navTreeContext = useNavTreeContext();
611
+ return /* @__PURE__ */ React5.createElement(DensityProvider, {
612
+ density: "md"
613
+ }, /* @__PURE__ */ React5.createElement(L1PanelHeader, {
614
+ path,
615
+ item,
616
+ onBack
617
+ }), /* @__PURE__ */ React5.createElement(ScrollArea2.Root, {
618
+ thin: true,
619
+ orientation: "vertical"
620
+ }, /* @__PURE__ */ React5.createElement(ScrollArea2.Viewport, null, /* @__PURE__ */ React5.createElement(Tree, {
621
+ classNames: "pt-[2px]",
622
+ model: navTreeContext.model,
623
+ id: item.id,
624
+ rootId: item.id,
625
+ path,
626
+ levelOffset: 5,
627
+ draggable: true,
628
+ gridTemplateColumns: "[tree-row-start] 1fr min-content min-content min-content [tree-row-end]",
629
+ renderColumns: NavTreeItemColumns,
630
+ blockInstruction: navTreeContext.blockInstruction,
631
+ canDrop: navTreeContext.canDrop,
632
+ canSelect: navTreeContext.canSelect,
633
+ onOpenChange: navTreeContext.onOpenChange,
634
+ onSelect: navTreeContext.onSelect,
635
+ onItemHover: navTreeContext.onItemHover
636
+ }))));
637
+ };
638
+ var L1PanelHeader = ({ item, path, onBack }) => {
639
+ const { t } = useTranslation4(meta4.id);
640
+ const { renderItemEnd: ItemEnd } = useNavTreeContext();
641
+ const title = toLocalizedString4(item.properties.label, t);
642
+ const backCapableWorkspace = isPinnedWorkspace(item.id);
643
+ const { primaryAction, groupedActions, menuActions, onAction } = useL1MenuActions({
644
+ item,
645
+ path
646
+ });
647
+ useLoadDescendents(item);
648
+ return /* @__PURE__ */ React5.createElement("div", {
649
+ "data-tauri-drag-region": true,
650
+ className: "grid grid-cols-[28px_1fr_28px_28px] w-full items-center border-b border-subdued-separator dx-app-drag dx-density-lg pe-1"
651
+ }, backCapableWorkspace ? /* @__PURE__ */ React5.createElement(IconButton3, {
652
+ classNames: [
653
+ hoverableControlItem2,
654
+ hoverableOpenControlItem2
655
+ ],
656
+ variant: "ghost",
657
+ icon: "ph--caret-left--regular",
658
+ iconOnly: true,
659
+ size: 4,
660
+ label: t("button-back.button"),
661
+ "data-testid": "treeView.primaryTreeButton",
662
+ onClick: () => onBack?.()
663
+ }) : /* @__PURE__ */ React5.createElement("div", null), /* @__PURE__ */ React5.createElement("h2", {
664
+ "data-tauri-drag-region": true,
665
+ className: "flex-1 truncate min-w-0"
666
+ }, title), /* @__PURE__ */ React5.createElement("div", {
667
+ className: "contents dx-app-no-drag"
668
+ }, primaryAction?.properties?.disposition === "list-item-primary" && !primaryAction?.properties?.disabled && /* @__PURE__ */ React5.createElement(NavTreeItemAction, {
669
+ testId: primaryAction.properties?.testId,
670
+ label: toLocalizedString4(primaryAction.properties?.label, t),
671
+ icon: primaryAction.properties?.icon ?? "ph--circle-dashed--regular",
672
+ parent: item,
673
+ path,
674
+ monolithic: Node2.isAction(primaryAction),
675
+ menuActions: Node2.isAction(primaryAction) ? [
676
+ primaryAction
677
+ ] : groupedActions[primaryAction?.id ?? ""],
678
+ menuType: primaryAction.properties?.menuType,
679
+ caller: NAV_TREE_ITEM
680
+ }), /* @__PURE__ */ React5.createElement(MenuActions, {
681
+ item,
682
+ menuActions,
683
+ onAction
684
+ }), ItemEnd && /* @__PURE__ */ React5.createElement(ItemEnd, {
685
+ node: item,
686
+ open: true
687
+ })));
688
+ };
689
+ var MenuActions = ({ item, menuActions, onAction }) => {
690
+ const { t } = useTranslation4(meta4.id);
691
+ if (menuActions.length === 0) {
692
+ return null;
693
+ }
694
+ if (menuActions.length === 1) {
695
+ return /* @__PURE__ */ React5.createElement(IconButton3, {
696
+ classNames: [
697
+ "shrink-0 px-2 pointer-fine:px-1",
698
+ hoverableControlItem2,
699
+ hoverableOpenControlItem2
700
+ ],
701
+ variant: "ghost",
702
+ icon: menuActions[0].properties?.icon ?? "ph--circle-dashed--regular",
703
+ iconOnly: true,
704
+ size: 4,
705
+ label: toLocalizedString4(menuActions[0].properties?.label, t),
706
+ "data-testid": menuActions[0].properties?.testId,
707
+ onClick: () => onAction(menuActions[0])
708
+ });
709
+ }
710
+ return /* @__PURE__ */ React5.createElement(Menu3.Root, {
711
+ caller: NAV_TREE_ITEM,
712
+ onAction
713
+ }, /* @__PURE__ */ React5.createElement(Menu3.Trigger, {
714
+ asChild: true
715
+ }, /* @__PURE__ */ React5.createElement(IconButton3, {
716
+ classNames: [
717
+ "shrink-0 px-2 pointer-fine:px-1",
718
+ hoverableControlItem2,
719
+ hoverableOpenControlItem2
720
+ ],
721
+ variant: "ghost",
722
+ icon: "ph--dots-three-vertical--regular",
723
+ iconOnly: true,
724
+ size: 4,
725
+ label: t("tree-item-actions.label"),
726
+ "data-testid": "navtree.treeItem.actionsLevel0"
727
+ })), /* @__PURE__ */ React5.createElement(Menu3.Content, {
728
+ group: item,
729
+ items: menuActions
730
+ }));
731
+ };
732
+ var useL1MenuActions = ({ item, path }) => {
733
+ const runAction = useActionRunner3();
734
+ const { actions: actionsProp, groupedActions } = useActions2(item);
735
+ const [primaryAction, ...secondaryActions] = actionsProp.toSorted((a, _b) => a.properties?.disposition === "list-item-primary" ? -1 : 1);
736
+ const menuActions = (primaryAction?.properties?.disposition === "list-item-primary" ? secondaryActions : actionsProp).flatMap((action) => Node2.isAction(action) ? [
737
+ action
738
+ ] : []).filter((a) => [
739
+ "list-item",
740
+ "list-item-primary"
741
+ ].includes(a.properties?.disposition));
742
+ const onAction = useCallback3((action, params) => {
743
+ void runAction(action, {
744
+ ...params,
745
+ path
746
+ });
747
+ }, [
748
+ runAction,
749
+ path
750
+ ]);
751
+ return {
752
+ primaryAction,
753
+ groupedActions,
754
+ menuActions,
755
+ onAction
756
+ };
757
+ };
758
+ var L1Panel = /* @__PURE__ */ memo3(L1Panel$);
759
+
760
+ // src/components/Sidebar/L1Tabs.tsx
761
+ import React6 from "react";
762
+ var L1Tabs = ({ topLevelItems, currentItemId, onBack, open, path }) => {
763
+ return /* @__PURE__ */ React6.createElement(React6.Fragment, null, topLevelItems.map((item) => {
764
+ const type = l0ItemType(item);
765
+ if (type === "tab") {
766
+ return /* @__PURE__ */ React6.createElement(L1Panel, {
767
+ key: item.id,
768
+ item,
769
+ path,
770
+ open,
771
+ onBack,
772
+ isCurrent: item.id === currentItemId
773
+ });
774
+ }
775
+ return null;
776
+ }));
777
+ };
778
+
779
+ // src/components/NavTree/NavTree.tsx
780
+ var NAV_TREE_ITEM = "NavTreeItem";
781
+ var NavTree = /* @__PURE__ */ forwardRef2(({ id, root, tab, ...props }, forwardedRef) => {
782
+ const { onBack, onItemHover } = useNavTreeContext();
783
+ const { topLevelActions, l0Items, pinnedItems, userAccountItem, topLevelItems } = useTopLevelNavItems(root);
784
+ useLoadDescendents2(root);
785
+ const path = useMemo4(() => [
786
+ id
787
+ ], [
788
+ id
789
+ ]);
790
+ return (
791
+ // TODO(thure): `Tabs.Root` forces all items that should be able to receive focus to use `Tabs.Tab(Primitive)` since
792
+ // it uses RovingFocus and doesn't support moving focus to an item that is not a tab. Assess whether this situation
793
+ // should change including whether it should motivate a change in the design/taxonomy, or if this means this should
794
+ // not use `react-ui-tabs` at all.
795
+ /* @__PURE__ */ React7.createElement(Tabs3.Root, {
796
+ value: tab,
797
+ orientation: "vertical",
798
+ classNames: "relative",
799
+ ref: forwardedRef
800
+ }, /* @__PURE__ */ React7.createElement(L0Menu, {
801
+ menuActions: topLevelActions,
802
+ topLevelItems: l0Items,
803
+ pinnedItems,
804
+ userAccountItem,
805
+ path,
806
+ parent: root,
807
+ onItemHover
808
+ }), /* @__PURE__ */ React7.createElement(L1Tabs, {
809
+ topLevelItems,
810
+ path,
811
+ currentItemId: tab,
812
+ onBack,
813
+ ...props
814
+ }))
815
+ );
816
+ });
817
+ var useTopLevelNavItems = (root) => {
818
+ const { graph } = useAppGraph2();
819
+ const rootId = root?.id ?? Node3.RootId;
820
+ const rootOutboundItems = useConnections(graph, rootId, "child");
821
+ const rootActions = useGraphActions(graph, rootId);
822
+ const { topLevelActions, l0Items, pinnedItems, userAccountItem } = useMemo4(() => {
823
+ const topLevelWorkspaces = [];
824
+ const outboundPinnedItems = [];
825
+ let userAccountItem2;
826
+ for (const node of rootOutboundItems) {
827
+ switch (node.properties.disposition) {
828
+ case "workspace":
829
+ topLevelWorkspaces.push(node);
830
+ break;
831
+ case "pin-end":
832
+ outboundPinnedItems.push(node);
833
+ break;
834
+ case "user-account":
835
+ userAccountItem2 ??= node;
836
+ break;
837
+ }
838
+ }
839
+ const topLevelActions2 = rootActions.filter((action) => action.properties.disposition === "menu").toSorted((a, b) => byPosition(a.properties, b.properties));
840
+ const pinnedItems2 = [
841
+ ...outboundPinnedItems,
842
+ ...rootActions.filter((action) => action.properties.disposition === "pin-end")
843
+ ].toSorted((a, b) => byPosition(a.properties, b.properties));
844
+ return {
845
+ pinnedItems: pinnedItems2,
846
+ topLevelActions: topLevelActions2,
847
+ userAccountItem: userAccountItem2,
848
+ l0Items: topLevelWorkspaces
849
+ };
850
+ }, [
851
+ rootActions,
852
+ rootOutboundItems
853
+ ]);
854
+ const topLevelItems = useMemo4(() => [
855
+ ...l0Items,
856
+ ...pinnedItems,
857
+ ...userAccountItem ? [
858
+ userAccountItem
859
+ ] : []
860
+ ], [
861
+ l0Items,
862
+ pinnedItems,
863
+ userAccountItem
864
+ ]);
865
+ return {
866
+ topLevelActions,
867
+ l0Items,
868
+ pinnedItems,
869
+ userAccountItem,
870
+ topLevelItems
871
+ };
872
+ };
873
+ export {
874
+ NAV_TREE_ITEM,
875
+ NavTree,
876
+ NavTreeContext,
877
+ useNavTreeContext
878
+ };
879
+ //# sourceMappingURL=index.mjs.map