@dxos/plugin-navtree 0.8.4-main.84f28bd → 0.8.4-main.8baae0fced

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 (295) 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-T7QS2EFI.mjs +8 -0
  28. package/dist/lib/neutral/chunk-T7QS2EFI.mjs.map +7 -0
  29. package/dist/lib/neutral/chunk-VRTNKDBX.mjs +23 -0
  30. package/dist/lib/neutral/chunk-VRTNKDBX.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/{node-esm/keyboard-MOZWHFUM.mjs → neutral/keyboard-EJ65BVTC.mjs} +25 -21
  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 +436 -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 -105
  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 +12 -5
  85. package/dist/types/src/components/NavTree/NavTree.d.ts.map +1 -1
  86. package/dist/types/src/components/NavTree/NavTree.stories.d.ts +25 -5
  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 +33 -4
  95. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.stories.d.ts.map +1 -1
  96. package/dist/types/src/components/NavTreeItem/NavTreeItemColumns.d.ts +2 -2
  97. package/dist/types/src/components/NavTreeItem/NavTreeItemColumns.d.ts.map +1 -1
  98. package/dist/types/src/components/Sidebar/L0Menu.d.ts +10 -5
  99. package/dist/types/src/components/Sidebar/L0Menu.d.ts.map +1 -1
  100. package/dist/types/src/components/Sidebar/L1Panel.d.ts +4 -8
  101. package/dist/types/src/components/Sidebar/L1Panel.d.ts.map +1 -1
  102. package/dist/types/src/components/Sidebar/L1Tabs.d.ts +13 -0
  103. package/dist/types/src/components/Sidebar/L1Tabs.d.ts.map +1 -0
  104. package/dist/types/src/components/Sidebar/index.d.ts +1 -0
  105. package/dist/types/src/components/Sidebar/index.d.ts.map +1 -1
  106. package/dist/types/src/components/UserAccountAvatar/UserAccountAvatar.d.ts.map +1 -1
  107. package/dist/types/src/components/UserAccountAvatar/UserAccountAvatar.stories.d.ts +8 -5
  108. package/dist/types/src/components/UserAccountAvatar/UserAccountAvatar.stories.d.ts.map +1 -1
  109. package/dist/types/src/components/index.d.ts +1 -4
  110. package/dist/types/src/components/index.d.ts.map +1 -1
  111. package/dist/types/src/components/types.d.ts +8 -17
  112. package/dist/types/src/components/types.d.ts.map +1 -1
  113. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.d.ts +6 -0
  114. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.d.ts.map +1 -0
  115. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.stories.d.ts +28 -0
  116. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.stories.d.ts.map +1 -0
  117. package/dist/types/src/containers/CommandsDialogContent/index.d.ts +2 -0
  118. package/dist/types/src/containers/CommandsDialogContent/index.d.ts.map +1 -0
  119. package/dist/types/src/containers/CommandsTrigger/CommandsTrigger.d.ts.map +1 -0
  120. package/dist/types/src/containers/CommandsTrigger/index.d.ts +2 -0
  121. package/dist/types/src/containers/CommandsTrigger/index.d.ts.map +1 -0
  122. package/dist/types/src/containers/NavTreeContainer/NavTreeContainer.d.ts +9 -0
  123. package/dist/types/src/containers/NavTreeContainer/NavTreeContainer.d.ts.map +1 -0
  124. package/dist/types/src/containers/NavTreeContainer/index.d.ts +3 -0
  125. package/dist/types/src/containers/NavTreeContainer/index.d.ts.map +1 -0
  126. package/dist/types/src/{components → containers/NavTreeDocumentTitle}/NavTreeDocumentTitle.d.ts +1 -1
  127. package/dist/types/src/containers/NavTreeDocumentTitle/NavTreeDocumentTitle.d.ts.map +1 -0
  128. package/dist/types/src/containers/NavTreeDocumentTitle/index.d.ts +2 -0
  129. package/dist/types/src/containers/NavTreeDocumentTitle/index.d.ts.map +1 -0
  130. package/dist/types/src/containers/index.d.ts +7 -0
  131. package/dist/types/src/containers/index.d.ts.map +1 -0
  132. package/dist/types/src/experimental/Tree.d.ts +5 -6
  133. package/dist/types/src/experimental/Tree.d.ts.map +1 -1
  134. package/dist/types/src/experimental/Tree.stories.d.ts +23 -6
  135. package/dist/types/src/experimental/Tree.stories.d.ts.map +1 -1
  136. package/dist/types/src/hooks/index.d.ts +5 -0
  137. package/dist/types/src/hooks/index.d.ts.map +1 -0
  138. package/dist/types/src/hooks/useActions.d.ts +5 -0
  139. package/dist/types/src/hooks/useActions.d.ts.map +1 -0
  140. package/dist/types/src/hooks/useLoadDescendents.d.ts +6 -0
  141. package/dist/types/src/hooks/useLoadDescendents.d.ts.map +1 -0
  142. package/dist/types/src/hooks/useNavTreeModel.d.ts +7 -0
  143. package/dist/types/src/hooks/useNavTreeModel.d.ts.map +1 -0
  144. package/dist/types/src/hooks/useNavTreeState.d.ts +18 -0
  145. package/dist/types/src/hooks/useNavTreeState.d.ts.map +1 -0
  146. package/dist/types/src/index.d.ts +1 -3
  147. package/dist/types/src/index.d.ts.map +1 -1
  148. package/dist/types/src/meta.d.ts +3 -4
  149. package/dist/types/src/meta.d.ts.map +1 -1
  150. package/dist/types/src/operations/expose.d.ts +5 -0
  151. package/dist/types/src/operations/expose.d.ts.map +1 -0
  152. package/dist/types/src/operations/index.d.ts +3 -0
  153. package/dist/types/src/operations/index.d.ts.map +1 -0
  154. package/dist/types/src/plugin.d.ts +4 -0
  155. package/dist/types/src/plugin.d.ts.map +1 -0
  156. package/dist/types/src/testing/app-graph-builder.d.ts +2 -3
  157. package/dist/types/src/testing/app-graph-builder.d.ts.map +1 -1
  158. package/dist/types/src/testing/generator.d.ts +5 -6
  159. package/dist/types/src/testing/generator.d.ts.map +1 -1
  160. package/dist/types/src/testing/update-state.d.ts +2 -2
  161. package/dist/types/src/testing/update-state.d.ts.map +1 -1
  162. package/dist/types/src/translations.d.ts +8 -10
  163. package/dist/types/src/translations.d.ts.map +1 -1
  164. package/dist/types/src/types/NavTreeCapabilities.d.ts +13 -0
  165. package/dist/types/src/types/NavTreeCapabilities.d.ts.map +1 -0
  166. package/dist/types/src/types/NavTreeEvents.d.ts +3 -0
  167. package/dist/types/src/types/NavTreeEvents.d.ts.map +1 -0
  168. package/dist/types/src/types/index.d.ts +4 -0
  169. package/dist/types/src/types/index.d.ts.map +1 -0
  170. package/dist/types/src/{types.d.ts → types/schema.d.ts} +10 -9
  171. package/dist/types/src/types/schema.d.ts.map +1 -0
  172. package/dist/types/src/util.d.ts +12 -9
  173. package/dist/types/src/util.d.ts.map +1 -1
  174. package/dist/types/tsconfig.tsbuildinfo +1 -1
  175. package/package.json +127 -61
  176. package/src/NavTreePlugin.node.ts +17 -0
  177. package/src/NavTreePlugin.test.ts +27 -0
  178. package/src/NavTreePlugin.tsx +51 -88
  179. package/src/NavTreePlugin.workerd.ts +16 -0
  180. package/src/capabilities/app-graph-builder.ts +34 -44
  181. package/src/capabilities/index.ts +10 -8
  182. package/src/capabilities/keyboard.ts +58 -51
  183. package/src/capabilities/operation-handler.ts +16 -0
  184. package/src/capabilities/react-surface.tsx +46 -38
  185. package/src/capabilities/state.ts +133 -84
  186. package/src/components/NavTree/NavTree.stories.tsx +111 -103
  187. package/src/components/NavTree/NavTree.tsx +71 -35
  188. package/src/components/{NavTreeContext.tsx → NavTreeContext/NavTreeContext.tsx} +1 -1
  189. package/src/components/NavTreeContext/index.ts +5 -0
  190. package/src/components/NavTreeItem/NavTreeItemAction.stories.tsx +25 -19
  191. package/src/components/NavTreeItem/NavTreeItemAction.tsx +73 -50
  192. package/src/components/NavTreeItem/NavTreeItemColumns.tsx +70 -38
  193. package/src/components/Sidebar/L0Menu.tsx +175 -211
  194. package/src/components/Sidebar/L1Panel.tsx +213 -135
  195. package/src/components/Sidebar/L1Tabs.tsx +42 -0
  196. package/src/components/Sidebar/index.ts +1 -0
  197. package/src/components/UserAccountAvatar/UserAccountAvatar.stories.tsx +9 -9
  198. package/src/components/UserAccountAvatar/UserAccountAvatar.tsx +20 -12
  199. package/src/components/index.ts +2 -4
  200. package/src/components/types.ts +14 -19
  201. package/src/containers/CommandsDialogContent/CommandsDialogContent.stories.tsx +46 -0
  202. package/src/containers/CommandsDialogContent/CommandsDialogContent.tsx +127 -0
  203. package/src/containers/CommandsDialogContent/index.ts +5 -0
  204. package/src/containers/CommandsTrigger/CommandsTrigger.tsx +28 -0
  205. package/src/containers/CommandsTrigger/index.ts +5 -0
  206. package/src/containers/NavTreeContainer/NavTreeContainer.tsx +271 -0
  207. package/src/containers/NavTreeContainer/index.ts +6 -0
  208. package/src/{components → containers/NavTreeDocumentTitle}/NavTreeDocumentTitle.tsx +5 -4
  209. package/src/containers/NavTreeDocumentTitle/index.ts +5 -0
  210. package/src/containers/index.ts +12 -0
  211. package/src/experimental/Tree.stories.tsx +110 -115
  212. package/src/experimental/Tree.tsx +17 -35
  213. package/src/hooks/index.ts +8 -0
  214. package/src/hooks/useActions.ts +34 -0
  215. package/src/hooks/useLoadDescendents.ts +23 -0
  216. package/src/hooks/useNavTreeModel.ts +118 -0
  217. package/src/hooks/useNavTreeState.ts +35 -0
  218. package/src/index.ts +1 -3
  219. package/src/meta.ts +13 -8
  220. package/src/operations/expose.ts +42 -0
  221. package/src/operations/index.ts +7 -0
  222. package/src/plugin.ts +11 -0
  223. package/src/testing/app-graph-builder.ts +167 -238
  224. package/src/testing/generator.ts +41 -39
  225. package/src/testing/update-state.ts +6 -6
  226. package/src/translations.ts +8 -9
  227. package/src/types/NavTreeCapabilities.ts +21 -0
  228. package/src/types/NavTreeEvents.ts +12 -0
  229. package/src/types/index.ts +8 -0
  230. package/src/{types.ts → types/schema.ts} +9 -8
  231. package/src/util.ts +26 -33
  232. package/dist/lib/browser/app-graph-builder-5J4LRWDX.mjs +0 -45
  233. package/dist/lib/browser/app-graph-builder-5J4LRWDX.mjs.map +0 -7
  234. package/dist/lib/browser/chunk-ERDGQTH5.mjs +0 -16
  235. package/dist/lib/browser/chunk-ERDGQTH5.mjs.map +0 -7
  236. package/dist/lib/browser/chunk-TZA65AKW.mjs +0 -1428
  237. package/dist/lib/browser/chunk-TZA65AKW.mjs.map +0 -7
  238. package/dist/lib/browser/chunk-WCARAZ7J.mjs +0 -15
  239. package/dist/lib/browser/chunk-WCARAZ7J.mjs.map +0 -7
  240. package/dist/lib/browser/index.mjs +0 -149
  241. package/dist/lib/browser/index.mjs.map +0 -7
  242. package/dist/lib/browser/intent-resolver-3XYN2CBU.mjs +0 -47
  243. package/dist/lib/browser/intent-resolver-3XYN2CBU.mjs.map +0 -7
  244. package/dist/lib/browser/keyboard-QRS6WOQH.mjs +0 -51
  245. package/dist/lib/browser/keyboard-QRS6WOQH.mjs.map +0 -7
  246. package/dist/lib/browser/meta.json +0 -1
  247. package/dist/lib/browser/react-surface-N2HPMYCU.mjs +0 -51
  248. package/dist/lib/browser/react-surface-N2HPMYCU.mjs.map +0 -7
  249. package/dist/lib/browser/state-54DY3DOY.mjs +0 -117
  250. package/dist/lib/browser/state-54DY3DOY.mjs.map +0 -7
  251. package/dist/lib/node-esm/app-graph-builder-GY7GCTGU.mjs +0 -46
  252. package/dist/lib/node-esm/app-graph-builder-GY7GCTGU.mjs.map +0 -7
  253. package/dist/lib/node-esm/chunk-CY7QWR4R.mjs +0 -1429
  254. package/dist/lib/node-esm/chunk-CY7QWR4R.mjs.map +0 -7
  255. package/dist/lib/node-esm/chunk-P2JGW3WR.mjs +0 -18
  256. package/dist/lib/node-esm/chunk-P2JGW3WR.mjs.map +0 -7
  257. package/dist/lib/node-esm/chunk-V3QXFDDP.mjs +0 -16
  258. package/dist/lib/node-esm/chunk-V3QXFDDP.mjs.map +0 -7
  259. package/dist/lib/node-esm/index.mjs +0 -150
  260. package/dist/lib/node-esm/index.mjs.map +0 -7
  261. package/dist/lib/node-esm/intent-resolver-R7UNPSZY.mjs +0 -48
  262. package/dist/lib/node-esm/intent-resolver-R7UNPSZY.mjs.map +0 -7
  263. package/dist/lib/node-esm/keyboard-MOZWHFUM.mjs.map +0 -7
  264. package/dist/lib/node-esm/meta.json +0 -1
  265. package/dist/lib/node-esm/react-surface-EW5FDMW4.mjs +0 -52
  266. package/dist/lib/node-esm/react-surface-EW5FDMW4.mjs.map +0 -7
  267. package/dist/lib/node-esm/state-Z3OTRC2I.mjs +0 -118
  268. package/dist/lib/node-esm/state-Z3OTRC2I.mjs.map +0 -7
  269. package/dist/types/src/capabilities/capabilities.d.ts +0 -21
  270. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  271. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  272. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  273. package/dist/types/src/components/CommandsDialog/CommandsDialog.d.ts +0 -5
  274. package/dist/types/src/components/CommandsDialog/CommandsDialog.d.ts.map +0 -1
  275. package/dist/types/src/components/CommandsDialog/CommandsTrigger.d.ts.map +0 -1
  276. package/dist/types/src/components/CommandsDialog/index.d.ts +0 -3
  277. package/dist/types/src/components/CommandsDialog/index.d.ts.map +0 -1
  278. package/dist/types/src/components/NavTreeContainer.d.ts +0 -9
  279. package/dist/types/src/components/NavTreeContainer.d.ts.map +0 -1
  280. package/dist/types/src/components/NavTreeContext.d.ts.map +0 -1
  281. package/dist/types/src/components/NavTreeDocumentTitle.d.ts.map +0 -1
  282. package/dist/types/src/events.d.ts +0 -4
  283. package/dist/types/src/events.d.ts.map +0 -1
  284. package/dist/types/src/hooks.d.ts +0 -3
  285. package/dist/types/src/hooks.d.ts.map +0 -1
  286. package/dist/types/src/types.d.ts.map +0 -1
  287. package/src/capabilities/capabilities.ts +0 -20
  288. package/src/capabilities/intent-resolver.ts +0 -37
  289. package/src/components/CommandsDialog/CommandsDialog.tsx +0 -118
  290. package/src/components/CommandsDialog/CommandsTrigger.tsx +0 -37
  291. package/src/components/CommandsDialog/index.ts +0 -6
  292. package/src/components/NavTreeContainer.tsx +0 -314
  293. package/src/events.ts +0 -11
  294. package/src/hooks.ts +0 -21
  295. /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
+ variant: "ghost",
314
+ icon: "ph--list--regular",
315
+ iconOnly: true,
316
+ label: t("app-menu.label")
317
+ }))), /* @__PURE__ */ React2.createElement(Menu.Content, {
318
+ group: parent,
319
+ items: menuActions
320
+ })), /* @__PURE__ */ React2.createElement(ScrollArea.Root, {
321
+ centered: true,
322
+ thin: true,
323
+ orientation: "vertical"
324
+ }, /* @__PURE__ */ React2.createElement(ScrollArea.Viewport, {
325
+ classNames: "flex flex-col gap-2 py-1"
326
+ }, topLevelItems.map((item) => /* @__PURE__ */ React2.createElement(L0Item, {
327
+ key: item.id,
328
+ item,
329
+ parent,
330
+ path,
331
+ onItemHover,
332
+ ...hasRearrangeableItems && {
333
+ onRearrange: handleRearrange
334
+ }
335
+ })))), /* @__PURE__ */ React2.createElement("div", {
336
+ className: "grid grid-cols-1 auto-rows-(--dx-rail-action) pt-2"
337
+ }, pinnedItems.map((item) => /* @__PURE__ */ React2.createElement(L0Item, {
338
+ key: item.id,
339
+ item,
340
+ parent,
341
+ path,
342
+ pinned: true
343
+ }))), userAccountItem && /* @__PURE__ */ React2.createElement("div", {
344
+ className: "grid dx-app-no-drag"
345
+ }, /* @__PURE__ */ React2.createElement(L0ItemRoot, {
346
+ key: userAccountItem.id,
347
+ item: userAccountItem,
348
+ parent,
349
+ path
350
+ }, /* @__PURE__ */ React2.createElement(UserAccountAvatar, {
351
+ userId: userAccountItem.properties.userId,
352
+ hue: userAccountItem.properties.hue,
353
+ emoji: userAccountItem.properties.emoji,
354
+ status: userAccountItem.properties.status,
355
+ size: 10
356
+ }))));
357
+ };
358
+
359
+ // src/components/Sidebar/L1Panel.tsx
360
+ import * as Option from "effect/Option";
361
+ import React5, { memo as memo3, useCallback as useCallback3, useMemo as useMemo3 } from "react";
362
+ import { Node as Node2 } from "@dxos/app-graph";
363
+ import { isPinnedWorkspace } from "@dxos/app-toolkit";
364
+ import { useAppGraph } from "@dxos/app-toolkit/ui";
365
+ import { Graph, useActionRunner as useActionRunner3, useEdges } from "@dxos/plugin-graph";
366
+ import { DensityProvider, IconButton as IconButton3, ScrollArea as ScrollArea2, toLocalizedString as toLocalizedString4, useTranslation as useTranslation4 } from "@dxos/react-ui";
367
+ import { Tree } from "@dxos/react-ui-list";
368
+ import { Menu as Menu3 } from "@dxos/react-ui-menu";
369
+ import { Tabs as Tabs2 } from "@dxos/react-ui-tabs";
370
+ import { hoverableControlItem as hoverableControlItem2, hoverableOpenControlItem as hoverableOpenControlItem2 } from "@dxos/ui-theme";
371
+ import { useActions as useActions2, useLoadDescendents } from "#hooks";
372
+ import { meta as meta4 } from "#meta";
373
+
374
+ // src/components/NavTreeItem/NavTreeItemAction.tsx
375
+ import React3, { useCallback as useCallback2 } from "react";
376
+ import { useActionRunner as useActionRunner2 } from "@dxos/plugin-graph";
377
+ import { IconButton as IconButton2, toLocalizedString as toLocalizedString2, useDensityContext, useTranslation as useTranslation2 } from "@dxos/react-ui";
378
+ import { Menu as Menu2 } from "@dxos/react-ui-menu";
379
+ import { composable, composableProps, hoverableControlItem, hoverableOpenControlItem } from "@dxos/ui-theme";
380
+ import { meta as meta2 } from "#meta";
381
+ var fallbackIcon = "ph--placeholder--regular";
382
+ var fineActionButtonProps = {
383
+ size: 4,
384
+ density: "fine"
385
+ };
386
+ var coarseActionButtonProps = {
387
+ size: 5,
388
+ density: "coarse"
389
+ };
390
+ var NavTreeItemActionDropdownMenu = composable(({ parent, path, label, icon, testId, menuActions, caller, ...props }, forwardedRef) => {
391
+ const { t } = useTranslation2(meta2.id);
392
+ const density = useDensityContext();
393
+ const runAction = useActionRunner2();
394
+ const handleAction = useCallback2((action, params = {}) => runAction(action, {
395
+ ...params,
396
+ path
397
+ }), [
398
+ runAction,
399
+ path
400
+ ]);
401
+ return /* @__PURE__ */ React3.createElement(Menu2.Root, {
402
+ caller,
403
+ onAction: handleAction
404
+ }, /* @__PURE__ */ React3.createElement(Menu2.Trigger, {
405
+ asChild: true
406
+ }, /* @__PURE__ */ React3.createElement(IconButton2, {
407
+ ...density === "coarse" ? coarseActionButtonProps : fineActionButtonProps,
408
+ ...composableProps(props),
409
+ classNames: [
410
+ "shrink-0 px-2 pointer-fine:px-1",
411
+ hoverableControlItem,
412
+ hoverableOpenControlItem
413
+ ],
414
+ variant: "ghost",
415
+ icon: icon ?? fallbackIcon,
416
+ iconOnly: true,
417
+ label: toLocalizedString2(label, t),
418
+ "data-testid": testId,
419
+ ref: forwardedRef
420
+ })), /* @__PURE__ */ React3.createElement(Menu2.Content, {
421
+ group: parent,
422
+ items: menuActions
423
+ }));
424
+ });
425
+ NavTreeItemActionDropdownMenu.displayName = "NavTreeItemActionDropdownMenu";
426
+ var NavTreeItemMonolithicAction = (props) => {
427
+ const { parent, path, properties: { disabled, caller, testId, icon, variant = "ghost", iconOnly = true } = {
428
+ label: "never"
429
+ }, baseLabel } = props;
430
+ const density = useDensityContext();
431
+ const runAction = useActionRunner2();
432
+ return /* @__PURE__ */ React3.createElement(IconButton2, {
433
+ ...density === "coarse" ? coarseActionButtonProps : fineActionButtonProps,
434
+ variant,
435
+ classNames: [
436
+ "shrink-0",
437
+ hoverableControlItem,
438
+ hoverableOpenControlItem,
439
+ iconOnly ? "px-2 pointer-fine:px-1" : "p-2 pointer-fine:p-2 me-1"
440
+ ],
441
+ icon: icon ?? fallbackIcon,
442
+ iconOnly,
443
+ label: baseLabel,
444
+ disabled,
445
+ onClick: (event) => {
446
+ event.stopPropagation();
447
+ if (disabled) {
448
+ return;
449
+ }
450
+ void runAction(props, caller ? {
451
+ parent,
452
+ caller,
453
+ path
454
+ } : {
455
+ parent,
456
+ path
457
+ });
458
+ },
459
+ "data-testid": testId
460
+ });
461
+ };
462
+ var NavTreeItemAction = ({ monolithic, menuActions, menuType, parent, path, ...props }) => {
463
+ const { t } = useTranslation2(meta2.id);
464
+ const monolithicAction = menuActions?.length === 1 && menuActions[0];
465
+ const baseLabel = toLocalizedString2(monolithicAction ? monolithicAction.properties.label : props.label, t);
466
+ return monolithic && menuActions?.length === 1 ? /* @__PURE__ */ React3.createElement(NavTreeItemMonolithicAction, {
467
+ baseLabel,
468
+ parent,
469
+ path,
470
+ ...menuActions[0]
471
+ }) : /* @__PURE__ */ React3.createElement(NavTreeItemActionDropdownMenu, {
472
+ ...props,
473
+ label: baseLabel,
474
+ parent,
475
+ path,
476
+ menuActions
477
+ });
478
+ };
479
+
480
+ // src/components/NavTreeItem/NavTreeItemColumns.tsx
481
+ import React4, { Fragment, memo as memo2, useMemo as useMemo2 } from "react";
482
+ import { Node } from "@dxos/app-graph";
483
+ import { Popover, Treegrid, toLocalizedString as toLocalizedString3, useTranslation as useTranslation3 } from "@dxos/react-ui";
484
+ import { useActions } from "#hooks";
485
+ import { meta as meta3 } from "#meta";
486
+ var NavTreeItemColumns = /* @__PURE__ */ memo2(({ path, item, open }) => {
487
+ const { t } = useTranslation3(meta3.id);
488
+ const { renderItemEnd: ItemEnd, popoverAnchorId } = useNavTreeContext();
489
+ const level = path.length - 2;
490
+ const { actions: actionsProp, groupedActions } = useActions(item);
491
+ const sortedActions = useMemo2(() => actionsProp.toSorted((actionA, actionB) => {
492
+ const primaryA = actionA.properties?.disposition === "list-item-primary";
493
+ const primaryB = actionB.properties?.disposition === "list-item-primary";
494
+ if (primaryA && !primaryB) {
495
+ return -1;
496
+ }
497
+ if (primaryB && !primaryA) {
498
+ return 1;
499
+ }
500
+ return 0;
501
+ }), [
502
+ actionsProp
503
+ ]);
504
+ const [primaryAction, ...secondaryActions] = sortedActions;
505
+ const actions = useMemo2(() => (primaryAction?.properties?.disposition === "list-item-primary" ? secondaryActions : sortedActions).flatMap((action) => Node.isAction(action) ? [
506
+ action
507
+ ] : []).filter((a) => [
508
+ "list-item",
509
+ "list-item-primary"
510
+ ].includes(a.properties?.disposition)), [
511
+ sortedActions,
512
+ primaryAction
513
+ ]);
514
+ const primaryMenuActions = useMemo2(() => primaryAction ? Node.isAction(primaryAction) ? [
515
+ primaryAction
516
+ ] : groupedActions[primaryAction?.id ?? ""] : void 0, [
517
+ primaryAction,
518
+ groupedActions
519
+ ]);
520
+ const ActionRoot = popoverAnchorId === `${NAV_TREE_ITEM}:${item.id}` ? Popover.Anchor : Fragment;
521
+ return /* @__PURE__ */ React4.createElement("div", {
522
+ className: "contents dx-app-no-drag"
523
+ }, primaryAction?.properties?.disposition === "list-item-primary" && !primaryAction?.properties?.disabled ? /* @__PURE__ */ React4.createElement(Treegrid.Cell, {
524
+ classNames: "contents"
525
+ }, /* @__PURE__ */ React4.createElement(NavTreeItemAction, {
526
+ testId: primaryAction.properties?.testId,
527
+ label: toLocalizedString3(primaryAction.properties?.label, t),
528
+ icon: primaryAction.properties?.icon ?? "ph--placeholder--regular",
529
+ parent: item,
530
+ path,
531
+ monolithic: Node.isAction(primaryAction),
532
+ menuActions: primaryMenuActions,
533
+ menuType: primaryAction.properties?.menuType,
534
+ caller: NAV_TREE_ITEM
535
+ })) : /* @__PURE__ */ React4.createElement(Treegrid.Cell, {
536
+ role: "none"
537
+ }), /* @__PURE__ */ React4.createElement(ActionRoot, null, actions.length > 0 ? /* @__PURE__ */ React4.createElement(Treegrid.Cell, {
538
+ classNames: "contents"
539
+ }, /* @__PURE__ */ React4.createElement(NavTreeItemAction, {
540
+ testId: `navtree.treeItem.actionsLevel${level}`,
541
+ label: t("tree-item-actions.label"),
542
+ icon: "ph--dots-three-vertical--regular",
543
+ parent: item,
544
+ path,
545
+ menuActions: actions,
546
+ menuType: "dropdown",
547
+ caller: NAV_TREE_ITEM
548
+ })) : /* @__PURE__ */ React4.createElement(Treegrid.Cell, {
549
+ role: "none"
550
+ })), ItemEnd && /* @__PURE__ */ React4.createElement(Treegrid.Cell, {
551
+ classNames: "contents"
552
+ }, /* @__PURE__ */ React4.createElement(ItemEnd, {
553
+ node: item,
554
+ open
555
+ })));
556
+ });
557
+
558
+ // src/components/Sidebar/L1Panel.tsx
559
+ var L1Panel$ = ({ open, path, item, isCurrent, onBack }) => {
560
+ const { t } = useTranslation4(meta4.id);
561
+ const title = toLocalizedString4(item.properties.label, t);
562
+ const isActivated = useIsActivatedWorkspace(item);
563
+ const shouldRenderContent = isCurrent || isActivated;
564
+ return /* @__PURE__ */ React5.createElement(Tabs2.Panel, {
565
+ key: item.id,
566
+ value: item.id,
567
+ classNames: [
568
+ "absolute inset-y-0 end-0",
569
+ "w-[calc(100%-var(--dx-l0-size))] lg:w-(--dx-l1-size) grid-cols-1 grid-rows-[var(--dx-rail-size)_1fr]",
570
+ "py-[env(safe-area-inset-top)]",
571
+ isCurrent && "grid"
572
+ ],
573
+ tabIndex: -1,
574
+ "aria-label": title,
575
+ ...isCurrent && {
576
+ "data-testid": "navtree.workspace.visible"
577
+ },
578
+ ...!open && {
579
+ inert: true
580
+ }
581
+ }, shouldRenderContent && /* @__PURE__ */ React5.createElement(L1PanelContent, {
582
+ open,
583
+ path,
584
+ item,
585
+ onBack
586
+ }));
587
+ };
588
+ var useIsActivatedWorkspace = (item) => {
589
+ const { graph } = useAppGraph();
590
+ const edges = useEdges(graph, item.id);
591
+ return useMemo3(() => {
592
+ const childIds = edges[Graph.relationKey("child")] ?? [];
593
+ return childIds.some((childId) => {
594
+ const child = Graph.getNode(graph, childId);
595
+ if (Option.isNone(child)) {
596
+ return false;
597
+ }
598
+ return child.value.properties.disposition === void 0;
599
+ });
600
+ }, [
601
+ edges,
602
+ graph
603
+ ]);
604
+ };
605
+ var L1PanelContent = ({ path, item, onBack }) => {
606
+ const navTreeContext = useNavTreeContext();
607
+ return /* @__PURE__ */ React5.createElement(DensityProvider, {
608
+ density: "fine"
609
+ }, /* @__PURE__ */ React5.createElement(L1PanelHeader, {
610
+ path,
611
+ item,
612
+ onBack
613
+ }), /* @__PURE__ */ React5.createElement(ScrollArea2.Root, {
614
+ thin: true,
615
+ orientation: "vertical"
616
+ }, /* @__PURE__ */ React5.createElement(ScrollArea2.Viewport, null, /* @__PURE__ */ React5.createElement(Tree, {
617
+ classNames: "pt-[2px]",
618
+ model: navTreeContext.model,
619
+ id: item.id,
620
+ rootId: item.id,
621
+ path,
622
+ levelOffset: 5,
623
+ draggable: true,
624
+ gridTemplateColumns: "[tree-row-start] 1fr min-content min-content min-content [tree-row-end]",
625
+ renderColumns: NavTreeItemColumns,
626
+ blockInstruction: navTreeContext.blockInstruction,
627
+ canDrop: navTreeContext.canDrop,
628
+ canSelect: navTreeContext.canSelect,
629
+ onOpenChange: navTreeContext.onOpenChange,
630
+ onSelect: navTreeContext.onSelect,
631
+ onItemHover: navTreeContext.onItemHover
632
+ }))));
633
+ };
634
+ var L1PanelHeader = ({ item, path, onBack }) => {
635
+ const { t } = useTranslation4(meta4.id);
636
+ const { renderItemEnd: ItemEnd } = useNavTreeContext();
637
+ const title = toLocalizedString4(item.properties.label, t);
638
+ const backCapableWorkspace = isPinnedWorkspace(item.id);
639
+ const { primaryAction, groupedActions, menuActions, onAction } = useL1MenuActions({
640
+ item,
641
+ path
642
+ });
643
+ useLoadDescendents(item);
644
+ return /* @__PURE__ */ React5.createElement("div", {
645
+ "data-tauri-drag-region": true,
646
+ className: "flex w-full items-center border-b border-subdued-separator dx-app-drag dx-density-coarse pe-1"
647
+ }, backCapableWorkspace ? /* @__PURE__ */ React5.createElement(IconButton3, {
648
+ density: "coarse",
649
+ classNames: [
650
+ "shrink-0 px-2 pointer-fine:px-1",
651
+ hoverableControlItem2,
652
+ hoverableOpenControlItem2
653
+ ],
654
+ variant: "ghost",
655
+ icon: "ph--caret-left--regular",
656
+ iconOnly: true,
657
+ label: t("button-back.button"),
658
+ "data-testid": "treeView.primaryTreeButton",
659
+ onClick: () => onBack?.()
660
+ }) : /* @__PURE__ */ React5.createElement("div", {
661
+ "data-tauri-drag-region": true,
662
+ className: "w-6"
663
+ }), /* @__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--placeholder--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
+ density: "coarse",
697
+ classNames: [
698
+ "shrink-0 px-2 pointer-fine:px-1",
699
+ hoverableControlItem2,
700
+ hoverableOpenControlItem2
701
+ ],
702
+ variant: "ghost",
703
+ icon: menuActions[0].properties?.icon ?? "ph--placeholder--regular",
704
+ iconOnly: true,
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
+ density: "coarse",
717
+ classNames: [
718
+ "shrink-0 px-2 pointer-fine:px-1",
719
+ hoverableControlItem2,
720
+ hoverableOpenControlItem2
721
+ ],
722
+ variant: "ghost",
723
+ icon: "ph--dots-three-vertical--regular",
724
+ iconOnly: true,
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