@dxos/plugin-navtree 0.8.4-main.fffef41 → 0.8.4-staging.60fe92afc8

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 (273) hide show
  1. package/LICENSE +102 -5
  2. package/PLUGIN.mdl +376 -0
  3. package/README.md +1 -1
  4. package/dist/lib/neutral/CommandsDialogContent-UBGIQ5FI.mjs +112 -0
  5. package/dist/lib/neutral/CommandsDialogContent-UBGIQ5FI.mjs.map +7 -0
  6. package/dist/lib/neutral/CommandsTrigger-BH5WLMHK.mjs +27 -0
  7. package/dist/lib/neutral/CommandsTrigger-BH5WLMHK.mjs.map +7 -0
  8. package/dist/lib/neutral/NavTreeContainer-6AR4BFDD.mjs +12 -0
  9. package/dist/lib/neutral/NavTreeContainer-6AR4BFDD.mjs.map +7 -0
  10. package/dist/lib/neutral/NavTreeDocumentTitle-H3E6ZLYE.mjs +22 -0
  11. package/dist/lib/neutral/NavTreeDocumentTitle-H3E6ZLYE.mjs.map +7 -0
  12. package/dist/lib/neutral/NavTreePlugin.mjs +68 -0
  13. package/dist/lib/neutral/NavTreePlugin.mjs.map +7 -0
  14. package/dist/lib/neutral/NavTreePlugin.node.mjs +18 -0
  15. package/dist/lib/neutral/NavTreePlugin.node.mjs.map +7 -0
  16. package/dist/lib/neutral/NavTreePlugin.workerd.mjs +16 -0
  17. package/dist/lib/neutral/NavTreePlugin.workerd.mjs.map +7 -0
  18. package/dist/lib/neutral/app-graph-builder-Z347LKSF.mjs +42 -0
  19. package/dist/lib/neutral/app-graph-builder-Z347LKSF.mjs.map +7 -0
  20. package/dist/lib/neutral/capabilities/index.mjs +17 -0
  21. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  22. package/dist/lib/neutral/chunk-5OPDKH6B.mjs +273 -0
  23. package/dist/lib/neutral/chunk-5OPDKH6B.mjs.map +7 -0
  24. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  25. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
  26. package/dist/lib/neutral/chunk-JOSNCOV4.mjs +79 -0
  27. package/dist/lib/neutral/chunk-JOSNCOV4.mjs.map +7 -0
  28. package/dist/lib/neutral/chunk-MDGKDQMZ.mjs +37 -0
  29. package/dist/lib/neutral/chunk-MDGKDQMZ.mjs.map +7 -0
  30. package/dist/lib/neutral/chunk-T7QS2EFI.mjs +8 -0
  31. package/dist/lib/neutral/chunk-T7QS2EFI.mjs.map +7 -0
  32. package/dist/lib/neutral/chunk-ZSWYB7JW.mjs +27 -0
  33. package/dist/lib/neutral/chunk-ZSWYB7JW.mjs.map +7 -0
  34. package/dist/lib/neutral/components/index.mjs +805 -0
  35. package/dist/lib/neutral/components/index.mjs.map +7 -0
  36. package/dist/lib/neutral/containers/index.mjs +20 -0
  37. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  38. package/dist/lib/neutral/expose-26FV4W5D.mjs +38 -0
  39. package/dist/lib/neutral/expose-26FV4W5D.mjs.map +7 -0
  40. package/dist/lib/neutral/hooks/index.mjs +178 -0
  41. package/dist/lib/neutral/hooks/index.mjs.map +7 -0
  42. package/dist/lib/neutral/index.mjs +34 -0
  43. package/dist/lib/neutral/index.mjs.map +7 -0
  44. package/dist/lib/{browser/keyboard-YYTYJW4M.mjs → neutral/keyboard-EJ65BVTC.mjs} +25 -20
  45. package/dist/lib/neutral/keyboard-EJ65BVTC.mjs.map +7 -0
  46. package/dist/lib/neutral/meta.json +1 -0
  47. package/dist/lib/neutral/meta.mjs +12 -0
  48. package/dist/lib/neutral/meta.mjs.map +7 -0
  49. package/dist/lib/neutral/operation-handler-ORDOJUL2.mjs +13 -0
  50. package/dist/lib/neutral/operation-handler-ORDOJUL2.mjs.map +7 -0
  51. package/dist/lib/neutral/operations/index.mjs +8 -0
  52. package/dist/lib/neutral/operations/index.mjs.map +7 -0
  53. package/dist/lib/neutral/plugin.mjs +16 -0
  54. package/dist/lib/neutral/plugin.mjs.map +7 -0
  55. package/dist/lib/neutral/react-surface-Q5XMAG7Z.mjs +50 -0
  56. package/dist/lib/neutral/react-surface-Q5XMAG7Z.mjs.map +7 -0
  57. package/dist/lib/neutral/state-VVJEWUHM.mjs +126 -0
  58. package/dist/lib/neutral/state-VVJEWUHM.mjs.map +7 -0
  59. package/dist/lib/neutral/testing/index.mjs +439 -0
  60. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  61. package/dist/lib/neutral/translations.mjs +23 -0
  62. package/dist/lib/neutral/translations.mjs.map +7 -0
  63. package/dist/lib/neutral/types/index.mjs +10 -0
  64. package/dist/lib/neutral/types/index.mjs.map +7 -0
  65. package/dist/types/src/NavTreePlugin.d.ts +3 -1
  66. package/dist/types/src/NavTreePlugin.d.ts.map +1 -1
  67. package/dist/types/src/NavTreePlugin.node.d.ts +4 -0
  68. package/dist/types/src/NavTreePlugin.node.d.ts.map +1 -0
  69. package/dist/types/src/NavTreePlugin.test.d.ts +2 -0
  70. package/dist/types/src/NavTreePlugin.test.d.ts.map +1 -0
  71. package/dist/types/src/NavTreePlugin.workerd.d.ts +4 -0
  72. package/dist/types/src/NavTreePlugin.workerd.d.ts.map +1 -0
  73. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  74. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  75. package/dist/types/src/capabilities/index.d.ts +7 -108
  76. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  77. package/dist/types/src/capabilities/keyboard.d.ts +3 -2
  78. package/dist/types/src/capabilities/keyboard.d.ts.map +1 -1
  79. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  80. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  81. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  82. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  83. package/dist/types/src/capabilities/state.d.ts +4 -18
  84. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  85. package/dist/types/src/components/NavTree/NavTree.d.ts +11 -4
  86. package/dist/types/src/components/NavTree/NavTree.d.ts.map +1 -1
  87. package/dist/types/src/components/NavTree/NavTree.stories.d.ts +10 -12
  88. package/dist/types/src/components/NavTree/NavTree.stories.d.ts.map +1 -1
  89. package/dist/types/src/components/{NavTreeContext.d.ts → NavTreeContext/NavTreeContext.d.ts} +1 -1
  90. package/dist/types/src/components/NavTreeContext/NavTreeContext.d.ts.map +1 -0
  91. package/dist/types/src/components/NavTreeContext/index.d.ts +2 -0
  92. package/dist/types/src/components/NavTreeContext/index.d.ts.map +1 -0
  93. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts +13 -9
  94. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts.map +1 -1
  95. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.stories.d.ts +3 -2
  96. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.stories.d.ts.map +1 -1
  97. package/dist/types/src/components/NavTreeItem/NavTreeItemColumns.d.ts.map +1 -1
  98. package/dist/types/src/components/Sidebar/L0Menu.d.ts +8 -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 -7
  101. package/dist/types/src/components/Sidebar/L1Panel.d.ts.map +1 -1
  102. package/dist/types/src/components/Sidebar/L1Tabs.d.ts +5 -4
  103. package/dist/types/src/components/Sidebar/L1Tabs.d.ts.map +1 -1
  104. package/dist/types/src/components/UserAccountAvatar/UserAccountAvatar.d.ts.map +1 -1
  105. package/dist/types/src/components/UserAccountAvatar/UserAccountAvatar.stories.d.ts.map +1 -1
  106. package/dist/types/src/components/index.d.ts +0 -3
  107. package/dist/types/src/components/index.d.ts.map +1 -1
  108. package/dist/types/src/components/types.d.ts +8 -17
  109. package/dist/types/src/components/types.d.ts.map +1 -1
  110. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.d.ts +6 -0
  111. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.d.ts.map +1 -0
  112. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.stories.d.ts +28 -0
  113. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.stories.d.ts.map +1 -0
  114. package/dist/types/src/containers/CommandsDialogContent/index.d.ts +2 -0
  115. package/dist/types/src/containers/CommandsDialogContent/index.d.ts.map +1 -0
  116. package/dist/types/src/containers/CommandsTrigger/CommandsTrigger.d.ts.map +1 -0
  117. package/dist/types/src/containers/CommandsTrigger/index.d.ts +2 -0
  118. package/dist/types/src/containers/CommandsTrigger/index.d.ts.map +1 -0
  119. package/dist/types/src/containers/NavTreeContainer/NavTreeContainer.d.ts +9 -0
  120. package/dist/types/src/containers/NavTreeContainer/NavTreeContainer.d.ts.map +1 -0
  121. package/dist/types/src/containers/NavTreeContainer/index.d.ts +3 -0
  122. package/dist/types/src/containers/NavTreeContainer/index.d.ts.map +1 -0
  123. package/dist/types/src/{components → containers/NavTreeDocumentTitle}/NavTreeDocumentTitle.d.ts +1 -1
  124. package/dist/types/src/containers/NavTreeDocumentTitle/NavTreeDocumentTitle.d.ts.map +1 -0
  125. package/dist/types/src/containers/NavTreeDocumentTitle/index.d.ts +2 -0
  126. package/dist/types/src/containers/NavTreeDocumentTitle/index.d.ts.map +1 -0
  127. package/dist/types/src/containers/index.d.ts +7 -0
  128. package/dist/types/src/containers/index.d.ts.map +1 -0
  129. package/dist/types/src/experimental/Tree.d.ts +2 -2
  130. package/dist/types/src/experimental/Tree.d.ts.map +1 -1
  131. package/dist/types/src/experimental/Tree.stories.d.ts +18 -4
  132. package/dist/types/src/experimental/Tree.stories.d.ts.map +1 -1
  133. package/dist/types/src/hooks/index.d.ts +5 -0
  134. package/dist/types/src/hooks/index.d.ts.map +1 -0
  135. package/dist/types/src/hooks/useActions.d.ts +11 -0
  136. package/dist/types/src/hooks/useActions.d.ts.map +1 -0
  137. package/dist/types/src/hooks/useLoadDescendents.d.ts +6 -0
  138. package/dist/types/src/hooks/useLoadDescendents.d.ts.map +1 -0
  139. package/dist/types/src/hooks/useNavTreeModel.d.ts +7 -0
  140. package/dist/types/src/hooks/useNavTreeModel.d.ts.map +1 -0
  141. package/dist/types/src/hooks/useNavTreeState.d.ts +18 -0
  142. package/dist/types/src/hooks/useNavTreeState.d.ts.map +1 -0
  143. package/dist/types/src/index.d.ts +1 -3
  144. package/dist/types/src/index.d.ts.map +1 -1
  145. package/dist/types/src/meta.d.ts +4 -3
  146. package/dist/types/src/meta.d.ts.map +1 -1
  147. package/dist/types/src/operations/expose.d.ts +5 -0
  148. package/dist/types/src/operations/expose.d.ts.map +1 -0
  149. package/dist/types/src/operations/index.d.ts +3 -0
  150. package/dist/types/src/operations/index.d.ts.map +1 -0
  151. package/dist/types/src/plugin.d.ts +4 -0
  152. package/dist/types/src/plugin.d.ts.map +1 -0
  153. package/dist/types/src/testing/app-graph-builder.d.ts +2 -3
  154. package/dist/types/src/testing/app-graph-builder.d.ts.map +1 -1
  155. package/dist/types/src/testing/generator.d.ts +5 -6
  156. package/dist/types/src/testing/generator.d.ts.map +1 -1
  157. package/dist/types/src/testing/update-state.d.ts +2 -2
  158. package/dist/types/src/testing/update-state.d.ts.map +1 -1
  159. package/dist/types/src/translations.d.ts +8 -11
  160. package/dist/types/src/translations.d.ts.map +1 -1
  161. package/dist/types/src/types/NavTreeCapabilities.d.ts +13 -0
  162. package/dist/types/src/types/NavTreeCapabilities.d.ts.map +1 -0
  163. package/dist/types/src/types/NavTreeEvents.d.ts +3 -0
  164. package/dist/types/src/types/NavTreeEvents.d.ts.map +1 -0
  165. package/dist/types/src/types/index.d.ts +4 -0
  166. package/dist/types/src/types/index.d.ts.map +1 -0
  167. package/dist/types/src/{types.d.ts → types/schema.d.ts} +10 -6
  168. package/dist/types/src/types/schema.d.ts.map +1 -0
  169. package/dist/types/src/util.d.ts +12 -8
  170. package/dist/types/src/util.d.ts.map +1 -1
  171. package/dist/types/tsconfig.tsbuildinfo +1 -1
  172. package/package.json +124 -62
  173. package/src/NavTreePlugin.node.ts +17 -0
  174. package/src/NavTreePlugin.test.ts +27 -0
  175. package/src/NavTreePlugin.tsx +46 -76
  176. package/src/NavTreePlugin.workerd.ts +16 -0
  177. package/src/capabilities/app-graph-builder.ts +34 -45
  178. package/src/capabilities/index.ts +10 -8
  179. package/src/capabilities/keyboard.ts +58 -51
  180. package/src/capabilities/operation-handler.ts +16 -0
  181. package/src/capabilities/react-surface.tsx +46 -38
  182. package/src/capabilities/state.ts +132 -84
  183. package/src/components/NavTree/NavTree.stories.tsx +55 -63
  184. package/src/components/NavTree/NavTree.tsx +65 -33
  185. package/src/components/{NavTreeContext.tsx → NavTreeContext/NavTreeContext.tsx} +1 -1
  186. package/src/components/NavTreeContext/index.ts +5 -0
  187. package/src/components/NavTreeItem/NavTreeItemAction.stories.tsx +23 -15
  188. package/src/components/NavTreeItem/NavTreeItemAction.tsx +75 -52
  189. package/src/components/NavTreeItem/NavTreeItemColumns.tsx +25 -42
  190. package/src/components/Sidebar/L0Menu.tsx +155 -184
  191. package/src/components/Sidebar/L1Panel.tsx +181 -101
  192. package/src/components/Sidebar/L1Tabs.tsx +18 -34
  193. package/src/components/UserAccountAvatar/UserAccountAvatar.stories.tsx +2 -3
  194. package/src/components/UserAccountAvatar/UserAccountAvatar.tsx +1 -1
  195. package/src/components/index.ts +1 -3
  196. package/src/components/types.ts +13 -19
  197. package/src/containers/CommandsDialogContent/CommandsDialogContent.stories.tsx +46 -0
  198. package/src/containers/CommandsDialogContent/CommandsDialogContent.tsx +127 -0
  199. package/src/containers/CommandsDialogContent/index.ts +5 -0
  200. package/src/containers/CommandsTrigger/CommandsTrigger.tsx +28 -0
  201. package/src/containers/CommandsTrigger/index.ts +5 -0
  202. package/src/containers/NavTreeContainer/NavTreeContainer.tsx +271 -0
  203. package/src/containers/NavTreeContainer/index.ts +6 -0
  204. package/src/{components → containers/NavTreeDocumentTitle}/NavTreeDocumentTitle.tsx +4 -3
  205. package/src/containers/NavTreeDocumentTitle/index.ts +5 -0
  206. package/src/containers/index.ts +12 -0
  207. package/src/experimental/Tree.stories.tsx +82 -85
  208. package/src/experimental/Tree.tsx +5 -5
  209. package/src/hooks/index.ts +8 -0
  210. package/src/hooks/useActions.ts +44 -0
  211. package/src/hooks/useLoadDescendents.ts +23 -0
  212. package/src/hooks/useNavTreeModel.ts +120 -0
  213. package/src/hooks/useNavTreeState.ts +35 -0
  214. package/src/index.ts +1 -3
  215. package/src/meta.ts +22 -7
  216. package/src/operations/expose.ts +42 -0
  217. package/src/operations/index.ts +7 -0
  218. package/src/plugin.ts +11 -0
  219. package/src/testing/app-graph-builder.ts +168 -238
  220. package/src/testing/generator.ts +35 -38
  221. package/src/testing/update-state.ts +6 -6
  222. package/src/translations.ts +8 -10
  223. package/src/types/NavTreeCapabilities.ts +21 -0
  224. package/src/types/NavTreeEvents.ts +12 -0
  225. package/src/types/index.ts +8 -0
  226. package/src/{types.ts → types/schema.ts} +9 -5
  227. package/src/util.ts +28 -17
  228. package/src/vite-env.d.ts +10 -0
  229. package/dist/lib/browser/app-graph-builder-OHSCN3GX.mjs +0 -46
  230. package/dist/lib/browser/app-graph-builder-OHSCN3GX.mjs.map +0 -7
  231. package/dist/lib/browser/chunk-5VLWX4PK.mjs +0 -15
  232. package/dist/lib/browser/chunk-5VLWX4PK.mjs.map +0 -7
  233. package/dist/lib/browser/chunk-7D2MPHXV.mjs +0 -1483
  234. package/dist/lib/browser/chunk-7D2MPHXV.mjs.map +0 -7
  235. package/dist/lib/browser/chunk-E6MZBCU5.mjs +0 -19
  236. package/dist/lib/browser/chunk-E6MZBCU5.mjs.map +0 -7
  237. package/dist/lib/browser/index.mjs +0 -146
  238. package/dist/lib/browser/index.mjs.map +0 -7
  239. package/dist/lib/browser/intent-resolver-YUVXVPHG.mjs +0 -47
  240. package/dist/lib/browser/intent-resolver-YUVXVPHG.mjs.map +0 -7
  241. package/dist/lib/browser/keyboard-YYTYJW4M.mjs.map +0 -7
  242. package/dist/lib/browser/meta.json +0 -1
  243. package/dist/lib/browser/react-surface-J7MWWAGD.mjs +0 -51
  244. package/dist/lib/browser/react-surface-J7MWWAGD.mjs.map +0 -7
  245. package/dist/lib/browser/state-EUSVT6BI.mjs +0 -117
  246. package/dist/lib/browser/state-EUSVT6BI.mjs.map +0 -7
  247. package/dist/types/src/capabilities/capabilities.d.ts +0 -21
  248. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  249. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  250. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  251. package/dist/types/src/components/CommandsDialog/CommandsDialog.d.ts +0 -5
  252. package/dist/types/src/components/CommandsDialog/CommandsDialog.d.ts.map +0 -1
  253. package/dist/types/src/components/CommandsDialog/CommandsTrigger.d.ts.map +0 -1
  254. package/dist/types/src/components/CommandsDialog/index.d.ts +0 -3
  255. package/dist/types/src/components/CommandsDialog/index.d.ts.map +0 -1
  256. package/dist/types/src/components/NavTreeContainer.d.ts +0 -9
  257. package/dist/types/src/components/NavTreeContainer.d.ts.map +0 -1
  258. package/dist/types/src/components/NavTreeContext.d.ts.map +0 -1
  259. package/dist/types/src/components/NavTreeDocumentTitle.d.ts.map +0 -1
  260. package/dist/types/src/events.d.ts +0 -4
  261. package/dist/types/src/events.d.ts.map +0 -1
  262. package/dist/types/src/hooks.d.ts +0 -3
  263. package/dist/types/src/hooks.d.ts.map +0 -1
  264. package/dist/types/src/types.d.ts.map +0 -1
  265. package/src/capabilities/capabilities.ts +0 -20
  266. package/src/capabilities/intent-resolver.ts +0 -37
  267. package/src/components/CommandsDialog/CommandsDialog.tsx +0 -126
  268. package/src/components/CommandsDialog/CommandsTrigger.tsx +0 -36
  269. package/src/components/CommandsDialog/index.ts +0 -6
  270. package/src/components/NavTreeContainer.tsx +0 -369
  271. package/src/events.ts +0 -11
  272. package/src/hooks.ts +0 -21
  273. /package/dist/types/src/{components/CommandsDialog → containers/CommandsTrigger}/CommandsTrigger.d.ts +0 -0
@@ -2,61 +2,49 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ import { Atom, type Registry } from '@effect-atom/atom-react';
5
6
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
- import * as Schema from 'effect/Schema';
7
+ import * as Effect from 'effect/Effect';
7
8
  import React, { type KeyboardEvent, useCallback, useRef } from 'react';
8
9
  import { expect, userEvent, within } from 'storybook/test';
9
10
 
10
- import {
11
- Capabilities,
12
- IntentPlugin,
13
- LayoutAction,
14
- SettingsPlugin,
15
- contributes,
16
- createResolver,
17
- defineCapability,
18
- } from '@dxos/app-framework';
19
- import { useCapability } from '@dxos/app-framework/react';
11
+ import { Capabilities, Capability } from '@dxos/app-framework';
20
12
  import { withPluginManager } from '@dxos/app-framework/testing';
21
- import { live } from '@dxos/live-object';
22
- import { AttentionPlugin } from '@dxos/plugin-attention';
23
- import { GraphPlugin } from '@dxos/plugin-graph';
24
- import { StorybookLayoutPlugin } from '@dxos/plugin-storybook-layout';
25
- import { ThemePlugin } from '@dxos/plugin-theme';
26
- import { faker } from '@dxos/random';
13
+ import { useAtomCapability } from '@dxos/app-framework/ui';
14
+ import { AppCapabilities, LayoutOperation } from '@dxos/app-toolkit';
15
+ import { Operation, OperationHandlerSet } from '@dxos/compute';
16
+ import { StorybookPlugin, corePlugins } from '@dxos/plugin-testing';
17
+ import { random } from '@dxos/random';
27
18
  import { IconButton, Input, Main, Toolbar } from '@dxos/react-ui';
28
- import { withTheme } from '@dxos/react-ui/testing';
29
19
  import { useAttention, useAttentionAttributes } from '@dxos/react-ui-attention';
30
20
  import { Stack, StackItem } from '@dxos/react-ui-stack';
31
- import { defaultTx, mx } from '@dxos/react-ui-theme';
21
+ import { withLayout } from '@dxos/react-ui/testing';
22
+ import { mx } from '@dxos/ui-theme';
32
23
 
33
- import { NavTreePlugin } from '../../NavTreePlugin';
34
- import { storybookGraphBuilders } from '../../testing';
35
- import { translations } from '../../translations';
36
- import { NavTreeContainer } from '../NavTreeContainer';
24
+ import { NavTreeContainer } from '#containers';
25
+ import { storybookGraphBuilders } from '#testing';
26
+ import { translations } from '#translations';
37
27
 
38
- faker.seed(1234);
28
+ import { NavTreePlugin } from '../../NavTreePlugin';
39
29
 
40
- const StoryState = defineCapability<{ tab: string }>('story-state');
30
+ random.seed(1234);
41
31
 
42
- // TODO(burdon): Fix outline (e.g., button in sidebar nav is clipped when focused).
43
- // TODO(burdon): Consider similar containment of: Table, Sheet, Kanban Column, Form, etc.
32
+ const StoryState = Capability.make<Atom.Atom<{ tab: string }>>('story-state');
44
33
 
45
34
  const container = 'flex flex-col grow gap-2 p-4 rounded-md';
46
35
 
47
- // TODO(burdon): Factor out PlankHeader.
48
36
  const StoryPlankHeading = ({ attendableId }: { attendableId: string }) => {
49
37
  const { hasAttention } = useAttention(attendableId);
50
38
  console.log('hasAttention', hasAttention);
51
39
  return (
52
40
  <div className='flex p-1 items-center border-b border-separator'>
53
41
  <IconButton
54
- density='coarse'
55
- icon='ph--atom--regular'
42
+ density='lg'
43
+ icon='ph--circle--regular'
56
44
  label='Test'
57
45
  iconOnly
58
46
  variant={hasAttention ? 'primary' : 'ghost'}
59
- classNames='is-[--rail-action] bs-[--rail-action]'
47
+ classNames='w-(--dx-rail-action) h-(--dx-rail-action)'
60
48
  />
61
49
  <StackItem.ResizeHandle />
62
50
  </div>
@@ -79,22 +67,22 @@ const StoryPlank = ({ attendableId }: { attendableId: string }) => {
79
67
  <StackItem.Root
80
68
  item={{ id: attendableId }}
81
69
  {...attentionAttrs}
82
- classNames='bg-baseSurface border-ie border-separator'
70
+ classNames='bg-base-surface border-e border-separator'
83
71
  size={30}
84
72
  onKeyDown={handleKeyDown}
85
73
  ref={rootElement}
86
74
  >
87
75
  <StoryPlankHeading attendableId={attendableId} />
88
76
  <StackItem.Content toolbar>
89
- <Toolbar.Root classNames='border-be border-subduedSeparator'>
77
+ <Toolbar.Root classNames='border-b border-subdued-separator'>
90
78
  <Toolbar.Button>Test</Toolbar.Button>
91
79
  </Toolbar.Root>
92
80
 
93
- <div className={mx(container, 'm-2 bg-activeSurface')}>
81
+ <div className={mx(container, 'm-2 bg-current-surface')}>
94
82
  <Input.Root>
95
83
  <Input.Label>Level 1 (group)</Input.Label>
96
84
  </Input.Root>
97
- <div className={mx(container, 'bg-baseSurface')}>
85
+ <div className={mx(container, 'bg-base-surface')}>
98
86
  <Input.Root>
99
87
  <Input.Label>Level 2 (base)</Input.Label>
100
88
  <Input.TextArea placeholder='Enter text' />
@@ -107,10 +95,10 @@ const StoryPlank = ({ attendableId }: { attendableId: string }) => {
107
95
  };
108
96
 
109
97
  const DefaultStory = () => {
110
- const state = useCapability(StoryState);
98
+ const state = useAtomCapability(StoryState);
111
99
 
112
100
  return (
113
- <Main.Root complementarySidebarState='closed'>
101
+ <Main.Root navigationSidebarState='expanded'>
114
102
  <Main.NavigationSidebar label='Navigation' classNames='grid'>
115
103
  <NavTreeContainer tab={state.tab} />
116
104
  </Main.NavigationSidebar>
@@ -125,36 +113,38 @@ const DefaultStory = () => {
125
113
  };
126
114
 
127
115
  const meta = {
128
- title: 'plugins/plugin-navtree/NavTree',
116
+ title: 'plugins/plugin-navtree/components/NavTree',
129
117
  component: NavTreeContainer,
130
118
  render: DefaultStory,
131
119
  decorators: [
132
- withTheme,
120
+ withLayout({ layout: 'fullscreen' }),
133
121
  withPluginManager({
134
122
  plugins: [
135
- ThemePlugin({ tx: defaultTx }),
136
- GraphPlugin(),
137
- IntentPlugin(),
138
- SettingsPlugin(),
139
- AttentionPlugin(),
123
+ ...corePlugins(),
124
+ StorybookPlugin({
125
+ initialState: { sidebarState: 'expanded' },
126
+ }),
127
+
140
128
  NavTreePlugin(),
141
- StorybookLayoutPlugin({ initialState: { sidebarState: 'expanded' } }),
142
- ],
143
- capabilities: (context) => [
144
- contributes(StoryState, live({ tab: 'space-0' })),
145
- contributes(Capabilities.AppGraphBuilder, storybookGraphBuilders(context)),
146
- contributes(Capabilities.IntentResolver, [
147
- createResolver({
148
- intent: LayoutAction.UpdateLayout,
149
- filter: (data): data is Schema.Schema.Type<typeof LayoutAction.SwitchWorkspace.fields.input> =>
150
- Schema.is(LayoutAction.SwitchWorkspace.fields.input)(data),
151
- resolve: ({ subject }) => {
152
- const state = context.getCapability(StoryState);
153
- state.tab = subject;
154
- },
155
- }),
156
- ]),
157
129
  ],
130
+ capabilities: () => {
131
+ const storyStateAtom = Atom.make({ tab: 'root/space-0' }).pipe(Atom.keepAlive);
132
+ return [
133
+ Capability.contributes(StoryState, storyStateAtom),
134
+ Capability.contributes(AppCapabilities.AppGraphBuilder, storybookGraphBuilders()),
135
+ Capability.contributes(
136
+ Capabilities.OperationHandler,
137
+ OperationHandlerSet.make(
138
+ Operation.withHandler(LayoutOperation.SwitchWorkspace, ({ subject }) =>
139
+ Effect.gen(function* () {
140
+ const registry: Registry.Registry = yield* Capability.get(Capabilities.AtomRegistry);
141
+ registry.set(storyStateAtom, { tab: subject });
142
+ }),
143
+ ),
144
+ ),
145
+ ),
146
+ ];
147
+ },
158
148
  }),
159
149
  ],
160
150
  parameters: {
@@ -168,11 +158,13 @@ export default meta;
168
158
  type Story = StoryObj<typeof NavTreeContainer>;
169
159
 
170
160
  export const Default: Story = {
171
- play: async ({ canvasElement }) => {
161
+ play: async ({ canvasElement }: { canvasElement: HTMLElement }) => {
172
162
  const canvas = within(canvasElement);
173
163
 
174
- // Find the element with treegrid role and click on its parent
175
- const treegridElement = await canvas.findByRole('treegrid');
164
+ // Plugin startup is async; the treegrid only appears after the Startup event
165
+ // fires and the graph is built. Use a generous timeout so slower CI runners
166
+ // don't race the default 1 s limit.
167
+ const treegridElement = await canvas.findByRole('treegrid', {}, { timeout: 10000 });
176
168
  const treegridParent = treegridElement.parentElement;
177
169
  if (treegridParent) {
178
170
  await userEvent.click(treegridParent);
@@ -2,56 +2,36 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import React, { useMemo } from 'react';
5
+ import React, { forwardRef, useMemo } from 'react';
6
6
 
7
- import { type TreeProps } from '@dxos/react-ui-list';
7
+ import { useAppGraph } from '@dxos/app-toolkit/ui';
8
+ import { Node, useConnections, useActions as useGraphActions } from '@dxos/plugin-graph';
8
9
  import { Tabs } from '@dxos/react-ui-tabs';
10
+ import { byPosition } from '@dxos/util';
11
+
12
+ import { useLoadDescendents } from '#hooks';
9
13
 
10
- import { useLoadDescendents } from '../../hooks';
11
- import { type NavTreeItemGraphNode } from '../../types';
12
14
  import { useNavTreeContext } from '../NavTreeContext';
13
15
  import { L0Menu, L1Tabs, type L1TabsProps } from '../Sidebar';
14
16
 
15
17
  export const NAV_TREE_ITEM = 'NavTreeItem';
16
18
 
17
- export type NavTreeProps = Pick<TreeProps<NavTreeItemGraphNode>, 'id' | 'root'> & Pick<L1TabsProps, 'open'>;
19
+ export type NavTreeProps = { id: string; root?: Node.Node; tab: string } & Pick<L1TabsProps, 'open'>;
18
20
 
19
- export const NavTree = ({ id, root, ...props }: NavTreeProps) => {
20
- const { tab, useItems, onBack } = useNavTreeContext();
21
- const topLevelActions = useItems(root, { disposition: 'menu', sort: true });
22
- const topLevelCollections = useItems(root, { disposition: 'collection' });
23
- const topLevelWorkspaces = useItems(root, { disposition: 'workspace' });
24
- const topLevelNavigation = useItems(root, { disposition: 'navigation' });
25
- const l0Items = useMemo(
26
- () => [
27
- // prettier-ignore
28
- ...topLevelCollections,
29
- ...topLevelWorkspaces,
30
- ...topLevelNavigation,
31
- ],
32
- [topLevelCollections, topLevelWorkspaces, topLevelNavigation],
33
- );
34
- const pinnedItems = useItems(root, { disposition: 'pin-end', sort: true });
35
- const userAccountItem = useItems(root, { disposition: 'user-account' })[0];
36
- const topLevelItems = useMemo(
37
- () => [
38
- // prettier-ignore
39
- ...l0Items,
40
- ...pinnedItems,
41
- ...(userAccountItem ? [userAccountItem] : []),
42
- ],
43
- [l0Items, pinnedItems, userAccountItem],
44
- );
21
+ // TODO(wittjosiah): Refactor to Radix-style.
22
+ export const NavTree = forwardRef<HTMLDivElement, NavTreeProps>(({ id, root, tab, ...props }, forwardedRef) => {
23
+ const { onBack, onItemHover } = useNavTreeContext();
24
+ const { topLevelActions, l0Items, pinnedItems, userAccountItem, topLevelItems } = useTopLevelNavItems(root);
45
25
 
46
26
  useLoadDescendents(root);
47
27
  const path = useMemo(() => [id], [id]);
48
28
 
49
29
  return (
50
30
  // TODO(thure): `Tabs.Root` forces all items that should be able to receive focus to use `Tabs.Tab(Primitive)` since
51
- // it uses RovingFocus and doesn’t support moving focus to an item that is not a tab. Assess whether this situation
31
+ // it uses RovingFocus and doesn't support moving focus to an item that is not a tab. Assess whether this situation
52
32
  // should change including whether it should motivate a change in the design/taxonomy, or if this means this should
53
33
  // not use `react-ui-tabs` at all.
54
- <Tabs.Root value={tab} orientation='vertical' verticalVariant='stateless' classNames='relative'>
34
+ <Tabs.Root value={tab} orientation='vertical' classNames='relative' ref={forwardedRef}>
55
35
  <L0Menu
56
36
  menuActions={topLevelActions}
57
37
  topLevelItems={l0Items}
@@ -59,8 +39,60 @@ export const NavTree = ({ id, root, ...props }: NavTreeProps) => {
59
39
  userAccountItem={userAccountItem}
60
40
  path={path}
61
41
  parent={root}
42
+ onItemHover={onItemHover}
62
43
  />
63
44
  <L1Tabs topLevelItems={topLevelItems} path={path} currentItemId={tab} onBack={onBack} {...props} />
64
45
  </Tabs.Root>
65
46
  );
47
+ });
48
+
49
+ /**
50
+ * Partitions root children into workspaces, pinned items, user-account, and top-level actions.
51
+ */
52
+ const useTopLevelNavItems = (root?: Node.Node) => {
53
+ const { graph } = useAppGraph();
54
+ const rootId = root?.id ?? Node.RootId;
55
+ const rootOutboundItems = useConnections(graph, rootId, 'child');
56
+ const rootActions = useGraphActions(graph, rootId);
57
+
58
+ const { topLevelActions, l0Items, pinnedItems, userAccountItem } = useMemo(() => {
59
+ const topLevelWorkspaces: Node.Node[] = [];
60
+ const outboundPinnedItems: Node.Node[] = [];
61
+ let userAccountItem: Node.Node | undefined;
62
+ for (const node of rootOutboundItems) {
63
+ switch (node.properties.disposition) {
64
+ case 'workspace':
65
+ topLevelWorkspaces.push(node);
66
+ break;
67
+ case 'pin-end':
68
+ outboundPinnedItems.push(node);
69
+ break;
70
+ case 'user-account':
71
+ userAccountItem ??= node;
72
+ break;
73
+ }
74
+ }
75
+
76
+ const topLevelActions = rootActions
77
+ .filter((action) => action.properties.disposition === 'menu')
78
+ .toSorted((a, b) => byPosition(a.properties, b.properties));
79
+ const pinnedItems = [
80
+ ...outboundPinnedItems,
81
+ ...rootActions.filter((action) => action.properties.disposition === 'pin-end'),
82
+ ].toSorted((a, b) => byPosition(a.properties, b.properties));
83
+
84
+ return {
85
+ pinnedItems,
86
+ topLevelActions,
87
+ userAccountItem,
88
+ l0Items: topLevelWorkspaces,
89
+ };
90
+ }, [rootActions, rootOutboundItems]);
91
+
92
+ const topLevelItems = useMemo(
93
+ () => [...l0Items, ...pinnedItems, ...(userAccountItem ? [userAccountItem] : [])],
94
+ [l0Items, pinnedItems, userAccountItem],
95
+ );
96
+
97
+ return { topLevelActions, l0Items, pinnedItems, userAccountItem, topLevelItems };
66
98
  };
@@ -6,7 +6,7 @@ import { createContext, useContext } from 'react';
6
6
 
7
7
  import { raise } from '@dxos/debug';
8
8
 
9
- import { type NavTreeContextValue } from './types';
9
+ import { type NavTreeContextValue } from '../types';
10
10
 
11
11
  export const NavTreeContext = createContext<NavTreeContextValue | null>(null);
12
12
 
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './NavTreeContext';
@@ -3,42 +3,46 @@
3
3
  //
4
4
 
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import * as Effect from 'effect/Effect';
6
7
 
7
- import { type NodeArg } from '@dxos/app-graph';
8
- import { faker } from '@dxos/random';
9
- import { withTheme } from '@dxos/react-ui/testing';
8
+ import { ProcessManagerPlugin } from '@dxos/app-framework';
9
+ import { withPluginManager } from '@dxos/app-framework/testing';
10
+ import { type Node } from '@dxos/app-graph';
11
+ import { corePlugins } from '@dxos/plugin-testing';
12
+ import { random } from '@dxos/random';
10
13
 
11
14
  import { NavTreeItemAction, type NavTreeItemActionMenuProps } from './NavTreeItemAction';
12
15
 
13
16
  const parent = {
14
- id: faker.string.uuid(),
17
+ id: random.string.uuid(),
15
18
  type: 'node',
16
19
  data: null,
17
20
  properties: {
18
- label: faker.lorem.words(2),
21
+ label: random.lorem.words(2),
19
22
  icon: 'ph--circle--regular',
20
23
  },
21
- } satisfies NodeArg<any>;
24
+ } satisfies Node.NodeArg<any>;
22
25
 
23
26
  // TODO(burdon): Factor out across tests.
24
- const menuActions = faker.helpers.multiple(
27
+ const menuActions = random.helpers.multiple(
25
28
  () =>
26
29
  ({
27
- id: faker.string.uuid(),
30
+ id: random.string.uuid(),
28
31
  type: 'action',
29
- data: () => {
30
- console.log('invoke');
31
- },
32
+ data: () =>
33
+ Effect.sync(() => {
34
+ console.log('invoke');
35
+ }),
32
36
  properties: {
33
- label: faker.lorem.words(2),
37
+ label: random.lorem.words(2),
34
38
  icon: 'ph--circle--regular',
35
39
  },
36
- }) satisfies NodeArg<any>,
40
+ }) satisfies Node.NodeArg<any>,
37
41
  { count: 20 },
38
42
  );
39
43
 
40
44
  const meta = {
41
- title: 'plugins/plugin-navtree/NavTreeItemAction',
45
+ title: 'plugins/plugin-navtree/components/NavTreeItemAction',
42
46
  component: NavTreeItemAction,
43
47
  args: {
44
48
  icon: 'ph--list--regular',
@@ -46,7 +50,11 @@ const meta = {
46
50
  menuActions,
47
51
  label: 'Select action',
48
52
  } satisfies Partial<NavTreeItemActionMenuProps>,
49
- decorators: [withTheme],
53
+ decorators: [
54
+ withPluginManager({
55
+ plugins: [...corePlugins(), ProcessManagerPlugin()],
56
+ }),
57
+ ],
50
58
  parameters: {
51
59
  layout: 'centered',
52
60
  },
@@ -2,79 +2,96 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import React from 'react';
5
+ import React, { useCallback } from 'react';
6
6
 
7
- import { type Action, type Node } from '@dxos/app-graph';
7
+ import { type Node } from '@dxos/app-graph';
8
+ import { useActionRunner } from '@dxos/plugin-graph';
8
9
  import { IconButton, toLocalizedString, useDensityContext, useTranslation } from '@dxos/react-ui';
9
- import { DropdownMenu, type MenuItem, MenuProvider } from '@dxos/react-ui-menu';
10
- import { hoverableControlItem, hoverableOpenControlItem } from '@dxos/react-ui-theme';
10
+ import { composable, composableProps } from '@dxos/react-ui';
11
+ import { Menu, type MenuItem } from '@dxos/react-ui-menu';
12
+ import { hoverableControlItem, hoverableOpenControlItem } from '@dxos/ui-theme';
11
13
 
12
- import { meta } from '../../meta';
13
- import { type ActionProperties } from '../../types';
14
+ import { meta } from '#meta';
15
+ import { type ActionProperties } from '#types';
14
16
 
15
- export type NavTreeItemActionMenuProps = ActionProperties & {
16
- parent: Node;
17
- caller?: string;
18
- monolithic?: boolean;
19
- menuActions?: Action[];
20
- };
17
+ const fallbackIcon = 'ph--circle-dashed--regular';
21
18
 
22
- const fallbackIcon = 'ph--placeholder--regular';
23
-
24
- const fineActionButtonProps = {
19
+ const mdActionButtonProps = {
25
20
  size: 4 as const,
26
- density: 'fine' as const,
21
+ density: 'md' as const,
27
22
  };
28
- const coarseActionButtonProps = {
23
+
24
+ const lgActionButtonProps = {
29
25
  size: 5 as const,
30
- density: 'coarse' as const,
26
+ density: 'lg' as const,
31
27
  };
32
28
 
33
- export const NavTreeItemActionDropdownMenu = ({
34
- parent,
35
- label,
36
- icon,
37
- testId,
38
- menuActions,
39
- caller,
40
- }: NavTreeItemActionMenuProps) => {
41
- const { t } = useTranslation(meta.id);
42
- const density = useDensityContext();
43
- return (
44
- <MenuProvider>
45
- <DropdownMenu.Root group={parent} items={menuActions as MenuItem[]} caller={caller}>
46
- <DropdownMenu.Trigger asChild>
29
+ export type NavTreeItemActionMenuProps = ActionProperties & {
30
+ parent: Node.Node;
31
+ path?: string[];
32
+ caller?: string;
33
+ monolithic?: boolean;
34
+ menuActions?: Node.Action[];
35
+ };
36
+
37
+ export const NavTreeItemActionDropdownMenu = composable<HTMLButtonElement, NavTreeItemActionMenuProps>(
38
+ ({ parent, path, label, icon, testId, menuActions, caller, ...props }, forwardedRef) => {
39
+ const { t } = useTranslation(meta.id);
40
+ const density = useDensityContext();
41
+ const runAction = useActionRunner();
42
+ const handleAction = useCallback(
43
+ (action: Node.Action, params: Node.InvokeProps = {}) => runAction(action, { ...params, path }),
44
+ [runAction, path],
45
+ );
46
+
47
+ return (
48
+ <Menu.Root caller={caller} onAction={handleAction}>
49
+ <Menu.Trigger asChild>
47
50
  <IconButton
48
- {...(density === 'coarse' ? coarseActionButtonProps : fineActionButtonProps)}
49
- classNames={['shrink-0 pli-2 pointer-fine:pli-1', hoverableControlItem, hoverableOpenControlItem]}
51
+ {...(density === 'lg' ? lgActionButtonProps : mdActionButtonProps)}
52
+ {...composableProps(props)}
53
+ classNames={['shrink-0 px-2 pointer-fine:px-1', hoverableControlItem, hoverableOpenControlItem]}
50
54
  variant='ghost'
51
55
  icon={icon ?? fallbackIcon}
52
56
  iconOnly
53
57
  label={toLocalizedString(label, t)}
54
58
  data-testid={testId}
59
+ ref={forwardedRef}
55
60
  />
56
- </DropdownMenu.Trigger>
57
- </DropdownMenu.Root>
58
- </MenuProvider>
59
- );
60
- };
61
+ </Menu.Trigger>
62
+ <Menu.Content group={parent} items={menuActions as MenuItem[]} />
63
+ </Menu.Root>
64
+ );
65
+ },
66
+ );
61
67
 
62
- export const NavTreeItemMonolithicAction = ({
63
- parent,
64
- properties: { disabled, caller, testId, icon, variant = 'ghost', iconOnly = true } = { label: 'never' },
65
- data: invoke,
66
- baseLabel,
67
- }: Action & { parent: Node; onAction?: (action: Action) => void; baseLabel: string }) => {
68
+ NavTreeItemActionDropdownMenu.displayName = 'NavTreeItemActionDropdownMenu';
69
+
70
+ export const NavTreeItemMonolithicAction = (
71
+ props: Node.Action & {
72
+ parent: Node.Node;
73
+ path?: string[];
74
+ onAction?: (action: Node.Action) => void;
75
+ baseLabel: string;
76
+ },
77
+ ) => {
78
+ const {
79
+ parent,
80
+ path,
81
+ properties: { disabled, caller, testId, icon, variant = 'ghost', iconOnly = true } = { label: 'never' },
82
+ baseLabel,
83
+ } = props;
68
84
  const density = useDensityContext();
85
+ const runAction = useActionRunner();
69
86
  return (
70
87
  <IconButton
71
- {...(density === 'coarse' ? coarseActionButtonProps : fineActionButtonProps)}
88
+ {...(density === 'lg' ? lgActionButtonProps : mdActionButtonProps)}
72
89
  variant={variant}
73
90
  classNames={[
74
91
  'shrink-0',
75
92
  hoverableControlItem,
76
93
  hoverableOpenControlItem,
77
- iconOnly ? 'pli-2 pointer-fine:pli-1' : 'p-2 pointer-fine:p-2 mie-1',
94
+ iconOnly ? 'px-2 pointer-fine:px-1' : 'p-2 pointer-fine:p-2 me-1',
78
95
  ]}
79
96
  icon={icon ?? fallbackIcon}
80
97
  iconOnly={iconOnly}
@@ -86,22 +103,28 @@ export const NavTreeItemMonolithicAction = ({
86
103
  return;
87
104
  }
88
105
 
89
- void invoke?.(caller ? { parent, caller } : { parent });
106
+ void runAction(props, caller ? { parent, caller, path } : { parent, path });
90
107
  }}
91
108
  data-testid={testId}
92
109
  />
93
110
  );
94
111
  };
95
112
 
96
- export const NavTreeItemAction = ({ monolithic, menuActions, parent: node, ...props }: NavTreeItemActionMenuProps) => {
113
+ export const NavTreeItemAction = ({
114
+ monolithic,
115
+ menuActions,
116
+ menuType,
117
+ parent,
118
+ path,
119
+ ...props
120
+ }: NavTreeItemActionMenuProps) => {
97
121
  const { t } = useTranslation(meta.id);
98
122
 
99
123
  const monolithicAction = menuActions?.length === 1 && menuActions[0];
100
124
  const baseLabel = toLocalizedString(monolithicAction ? monolithicAction.properties!.label : props.label, t);
101
-
102
125
  return monolithic && menuActions?.length === 1 ? (
103
- <NavTreeItemMonolithicAction baseLabel={baseLabel} parent={node} {...menuActions[0]} />
126
+ <NavTreeItemMonolithicAction baseLabel={baseLabel} parent={parent} path={path} {...menuActions[0]} />
104
127
  ) : (
105
- <NavTreeItemActionDropdownMenu {...props} label={baseLabel} parent={node} menuActions={menuActions} />
128
+ <NavTreeItemActionDropdownMenu {...props} label={baseLabel} parent={parent} path={path} menuActions={menuActions} />
106
129
  );
107
130
  };