@dxos/plugin-navtree 0.8.4-main.4a85c3132b → 0.8.4-main.4f23b4e393

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/dist/lib/{browser/CommandsDialogContent-A27AKTHH.mjs → neutral/CommandsDialogContent-UBGIQ5FI.mjs} +24 -23
  2. package/dist/lib/neutral/CommandsDialogContent-UBGIQ5FI.mjs.map +7 -0
  3. package/dist/lib/{browser/CommandsTrigger-HBZYQCGV.mjs → neutral/CommandsTrigger-BH5WLMHK.mjs} +8 -14
  4. package/dist/lib/neutral/CommandsTrigger-BH5WLMHK.mjs.map +7 -0
  5. package/dist/lib/neutral/NavTreeContainer-6AR4BFDD.mjs +12 -0
  6. package/dist/lib/neutral/NavTreeContainer-6AR4BFDD.mjs.map +7 -0
  7. package/dist/lib/{browser/NavTreeDocumentTitle-GEE3URWH.mjs → neutral/NavTreeDocumentTitle-H3E6ZLYE.mjs} +5 -9
  8. package/dist/lib/neutral/NavTreeDocumentTitle-H3E6ZLYE.mjs.map +7 -0
  9. package/dist/lib/neutral/NavTreePlugin.mjs +56 -0
  10. package/dist/lib/neutral/NavTreePlugin.mjs.map +7 -0
  11. package/dist/lib/neutral/NavTreePlugin.node.mjs +18 -0
  12. package/dist/lib/neutral/NavTreePlugin.node.mjs.map +7 -0
  13. package/dist/lib/{browser/app-graph-builder-XGA4GPGL.mjs → neutral/app-graph-builder-Z347LKSF.mjs} +10 -12
  14. package/dist/lib/neutral/app-graph-builder-Z347LKSF.mjs.map +7 -0
  15. package/dist/lib/neutral/capabilities/index.mjs +17 -0
  16. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  17. package/dist/lib/neutral/chunk-5OPDKH6B.mjs +273 -0
  18. package/dist/lib/neutral/chunk-5OPDKH6B.mjs.map +7 -0
  19. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  20. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
  21. package/dist/lib/neutral/chunk-JOSNCOV4.mjs +79 -0
  22. package/dist/lib/neutral/chunk-JOSNCOV4.mjs.map +7 -0
  23. package/dist/lib/neutral/chunk-T7QS2EFI.mjs +8 -0
  24. package/dist/lib/neutral/chunk-T7QS2EFI.mjs.map +7 -0
  25. package/dist/lib/{browser/chunk-YKTYPINZ.mjs → neutral/chunk-YDE5I3P5.mjs} +7 -4
  26. package/dist/lib/neutral/chunk-YDE5I3P5.mjs.map +7 -0
  27. package/dist/lib/neutral/chunk-ZSWYB7JW.mjs +27 -0
  28. package/dist/lib/neutral/chunk-ZSWYB7JW.mjs.map +7 -0
  29. package/dist/lib/neutral/components/index.mjs +878 -0
  30. package/dist/lib/neutral/components/index.mjs.map +7 -0
  31. package/dist/lib/neutral/containers/index.mjs +20 -0
  32. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  33. package/dist/lib/neutral/expose-26FV4W5D.mjs +38 -0
  34. package/dist/lib/neutral/expose-26FV4W5D.mjs.map +7 -0
  35. package/dist/lib/neutral/hooks/index.mjs +169 -0
  36. package/dist/lib/neutral/hooks/index.mjs.map +7 -0
  37. package/dist/lib/neutral/index.mjs +34 -0
  38. package/dist/lib/neutral/index.mjs.map +7 -0
  39. package/dist/lib/{browser/keyboard-OJZC54PK.mjs → neutral/keyboard-EJ65BVTC.mjs} +8 -6
  40. package/dist/lib/neutral/keyboard-EJ65BVTC.mjs.map +7 -0
  41. package/dist/lib/neutral/meta.json +1 -0
  42. package/dist/lib/neutral/meta.mjs +12 -0
  43. package/dist/lib/neutral/meta.mjs.map +7 -0
  44. package/dist/lib/neutral/operation-handler-ORDOJUL2.mjs +13 -0
  45. package/dist/lib/neutral/operation-handler-ORDOJUL2.mjs.map +7 -0
  46. package/dist/lib/neutral/operations/index.mjs +8 -0
  47. package/dist/lib/neutral/operations/index.mjs.map +7 -0
  48. package/dist/lib/neutral/plugin.mjs +16 -0
  49. package/dist/lib/neutral/plugin.mjs.map +7 -0
  50. package/dist/lib/{browser/react-surface-AYHOAJ4I.mjs → neutral/react-surface-3AJ6BHL4.mjs} +10 -19
  51. package/dist/lib/neutral/react-surface-3AJ6BHL4.mjs.map +7 -0
  52. package/dist/lib/{browser/state-AC3EETN7.mjs → neutral/state-VVITVXWM.mjs} +7 -11
  53. package/dist/lib/neutral/state-VVITVXWM.mjs.map +7 -0
  54. package/dist/lib/neutral/testing/index.mjs +436 -0
  55. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  56. package/dist/lib/neutral/translations.mjs +23 -0
  57. package/dist/lib/neutral/translations.mjs.map +7 -0
  58. package/dist/lib/neutral/types/index.mjs +10 -0
  59. package/dist/lib/neutral/types/index.mjs.map +7 -0
  60. package/dist/types/src/NavTreePlugin.d.ts +1 -0
  61. package/dist/types/src/NavTreePlugin.d.ts.map +1 -1
  62. package/dist/types/src/NavTreePlugin.node.d.ts +4 -0
  63. package/dist/types/src/NavTreePlugin.node.d.ts.map +1 -0
  64. package/dist/types/src/NavTreePlugin.test.d.ts +2 -0
  65. package/dist/types/src/NavTreePlugin.test.d.ts.map +1 -0
  66. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  67. package/dist/types/src/capabilities/index.d.ts +7 -5
  68. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  69. package/dist/types/src/capabilities/keyboard.d.ts.map +1 -0
  70. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  71. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  72. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  73. package/dist/types/src/capabilities/state.d.ts +6 -0
  74. package/dist/types/src/capabilities/state.d.ts.map +1 -0
  75. package/dist/types/src/components/NavTree/NavTree.d.ts.map +1 -1
  76. package/dist/types/src/components/NavTree/NavTree.stories.d.ts +9 -11
  77. package/dist/types/src/components/NavTree/NavTree.stories.d.ts.map +1 -1
  78. package/dist/types/src/components/{NavTreeContext.d.ts → NavTreeContext/NavTreeContext.d.ts} +1 -1
  79. package/dist/types/src/components/NavTreeContext/NavTreeContext.d.ts.map +1 -0
  80. package/dist/types/src/components/NavTreeContext/index.d.ts +2 -0
  81. package/dist/types/src/components/NavTreeContext/index.d.ts.map +1 -0
  82. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts +7 -3
  83. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts.map +1 -1
  84. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.stories.d.ts +1 -1
  85. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.stories.d.ts.map +1 -1
  86. package/dist/types/src/components/NavTreeItem/NavTreeItemColumns.d.ts.map +1 -1
  87. package/dist/types/src/components/Sidebar/L0Menu.d.ts.map +1 -1
  88. package/dist/types/src/components/Sidebar/L1Panel.d.ts.map +1 -1
  89. package/dist/types/src/components/Sidebar/L1Tabs.d.ts.map +1 -1
  90. package/dist/types/src/components/UserAccountAvatar/UserAccountAvatar.d.ts.map +1 -1
  91. package/dist/types/src/components/UserAccountAvatar/UserAccountAvatar.stories.d.ts.map +1 -1
  92. package/dist/types/src/components/types.d.ts +1 -2
  93. package/dist/types/src/components/types.d.ts.map +1 -1
  94. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.d.ts.map +1 -1
  95. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.stories.d.ts +28 -0
  96. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.stories.d.ts.map +1 -0
  97. package/dist/types/src/containers/CommandsDialogContent/index.d.ts +1 -2
  98. package/dist/types/src/containers/CommandsDialogContent/index.d.ts.map +1 -1
  99. package/dist/types/src/containers/CommandsTrigger/CommandsTrigger.d.ts.map +1 -1
  100. package/dist/types/src/containers/CommandsTrigger/index.d.ts +1 -2
  101. package/dist/types/src/containers/CommandsTrigger/index.d.ts.map +1 -1
  102. package/dist/types/src/containers/NavTreeContainer/NavTreeContainer.d.ts.map +1 -1
  103. package/dist/types/src/containers/NavTreeContainer/index.d.ts +2 -2
  104. package/dist/types/src/containers/NavTreeContainer/index.d.ts.map +1 -1
  105. package/dist/types/src/containers/NavTreeDocumentTitle/NavTreeDocumentTitle.d.ts.map +1 -1
  106. package/dist/types/src/containers/NavTreeDocumentTitle/index.d.ts +1 -2
  107. package/dist/types/src/containers/NavTreeDocumentTitle/index.d.ts.map +1 -1
  108. package/dist/types/src/containers/index.d.ts +1 -1
  109. package/dist/types/src/containers/index.d.ts.map +1 -1
  110. package/dist/types/src/experimental/Tree.d.ts +2 -2
  111. package/dist/types/src/experimental/Tree.d.ts.map +1 -1
  112. package/dist/types/src/experimental/Tree.stories.d.ts.map +1 -1
  113. package/dist/types/src/hooks/useActions.d.ts +2 -4
  114. package/dist/types/src/hooks/useActions.d.ts.map +1 -1
  115. package/dist/types/src/hooks/useLoadDescendents.d.ts.map +1 -1
  116. package/dist/types/src/hooks/useNavTreeModel.d.ts +1 -1
  117. package/dist/types/src/hooks/useNavTreeModel.d.ts.map +1 -1
  118. package/dist/types/src/hooks/useNavTreeState.d.ts +2 -6
  119. package/dist/types/src/hooks/useNavTreeState.d.ts.map +1 -1
  120. package/dist/types/src/index.d.ts +1 -2
  121. package/dist/types/src/index.d.ts.map +1 -1
  122. package/dist/types/src/meta.d.ts.map +1 -1
  123. package/dist/types/src/operations/expose.d.ts +5 -0
  124. package/dist/types/src/operations/expose.d.ts.map +1 -0
  125. package/dist/types/src/operations/index.d.ts +3 -0
  126. package/dist/types/src/operations/index.d.ts.map +1 -0
  127. package/dist/types/src/plugin.d.ts +4 -0
  128. package/dist/types/src/plugin.d.ts.map +1 -0
  129. package/dist/types/src/testing/app-graph-builder.d.ts.map +1 -1
  130. package/dist/types/src/testing/generator.d.ts.map +1 -1
  131. package/dist/types/src/testing/update-state.d.ts.map +1 -1
  132. package/dist/types/src/translations.d.ts +8 -11
  133. package/dist/types/src/translations.d.ts.map +1 -1
  134. package/dist/types/src/types/NavTreeCapabilities.d.ts +13 -0
  135. package/dist/types/src/types/NavTreeCapabilities.d.ts.map +1 -0
  136. package/dist/types/src/types/NavTreeEvents.d.ts +3 -0
  137. package/dist/types/src/types/NavTreeEvents.d.ts.map +1 -0
  138. package/dist/types/src/types/index.d.ts +2 -2
  139. package/dist/types/src/types/index.d.ts.map +1 -1
  140. package/dist/types/src/util.d.ts +2 -2
  141. package/dist/types/src/util.d.ts.map +1 -1
  142. package/dist/types/tsconfig.tsbuildinfo +1 -1
  143. package/package.json +107 -47
  144. package/src/NavTreePlugin.node.ts +17 -0
  145. package/src/NavTreePlugin.test.ts +27 -0
  146. package/src/NavTreePlugin.tsx +8 -25
  147. package/src/capabilities/{app-graph-builder/app-graph-builder.ts → app-graph-builder.ts} +7 -7
  148. package/src/capabilities/index.ts +11 -5
  149. package/src/capabilities/{keyboard/keyboard.ts → keyboard.ts} +2 -2
  150. package/src/capabilities/operation-handler.ts +16 -0
  151. package/src/capabilities/{react-surface/react-surface.tsx → react-surface.tsx} +8 -8
  152. package/src/capabilities/{state/state.ts → state.ts} +14 -10
  153. package/src/components/NavTree/NavTree.stories.tsx +18 -17
  154. package/src/components/NavTree/NavTree.tsx +3 -2
  155. package/src/components/{NavTreeContext.tsx → NavTreeContext/NavTreeContext.tsx} +1 -1
  156. package/src/components/NavTreeContext/index.ts +5 -0
  157. package/src/components/NavTreeItem/NavTreeItemAction.stories.tsx +6 -8
  158. package/src/components/NavTreeItem/NavTreeItemAction.tsx +62 -45
  159. package/src/components/NavTreeItem/NavTreeItemColumns.tsx +8 -6
  160. package/src/components/Sidebar/L0Menu.tsx +54 -81
  161. package/src/components/Sidebar/L1Panel.tsx +98 -135
  162. package/src/components/Sidebar/L1Tabs.tsx +0 -1
  163. package/src/components/types.ts +1 -2
  164. package/src/containers/CommandsDialogContent/CommandsDialogContent.stories.tsx +46 -0
  165. package/src/containers/CommandsDialogContent/CommandsDialogContent.tsx +52 -58
  166. package/src/containers/CommandsDialogContent/index.ts +1 -3
  167. package/src/containers/CommandsTrigger/CommandsTrigger.tsx +7 -5
  168. package/src/containers/CommandsTrigger/index.ts +1 -3
  169. package/src/containers/NavTreeContainer/NavTreeContainer.tsx +28 -27
  170. package/src/containers/NavTreeContainer/index.ts +2 -3
  171. package/src/containers/NavTreeDocumentTitle/NavTreeDocumentTitle.tsx +2 -2
  172. package/src/containers/NavTreeDocumentTitle/index.ts +1 -3
  173. package/src/containers/index.ts +1 -1
  174. package/src/experimental/Tree.stories.tsx +27 -27
  175. package/src/experimental/Tree.tsx +2 -2
  176. package/src/hooks/useActions.ts +18 -22
  177. package/src/hooks/useNavTreeModel.ts +11 -5
  178. package/src/hooks/useNavTreeState.ts +2 -9
  179. package/src/index.ts +1 -2
  180. package/src/meta.ts +3 -2
  181. package/src/operations/expose.ts +42 -0
  182. package/src/operations/index.ts +7 -0
  183. package/src/plugin.ts +11 -0
  184. package/src/testing/app-graph-builder.ts +40 -36
  185. package/src/testing/generator.ts +22 -22
  186. package/src/translations.ts +8 -10
  187. package/src/types/NavTreeCapabilities.ts +21 -0
  188. package/src/types/NavTreeEvents.ts +12 -0
  189. package/src/types/index.ts +3 -2
  190. package/src/util.ts +2 -2
  191. package/dist/lib/browser/CommandsDialogContent-A27AKTHH.mjs.map +0 -7
  192. package/dist/lib/browser/CommandsTrigger-HBZYQCGV.mjs.map +0 -7
  193. package/dist/lib/browser/NavTreeContainer-B5K4FUJS.mjs +0 -12
  194. package/dist/lib/browser/NavTreeContainer-B5K4FUJS.mjs.map +0 -7
  195. package/dist/lib/browser/NavTreeDocumentTitle-GEE3URWH.mjs.map +0 -7
  196. package/dist/lib/browser/app-graph-builder-XGA4GPGL.mjs.map +0 -7
  197. package/dist/lib/browser/chunk-DQCYMXEU.mjs +0 -1426
  198. package/dist/lib/browser/chunk-DQCYMXEU.mjs.map +0 -7
  199. package/dist/lib/browser/chunk-H3OJ4WLF.mjs +0 -14
  200. package/dist/lib/browser/chunk-H3OJ4WLF.mjs.map +0 -7
  201. package/dist/lib/browser/chunk-X2HDG62A.mjs +0 -23
  202. package/dist/lib/browser/chunk-X2HDG62A.mjs.map +0 -7
  203. package/dist/lib/browser/chunk-YKTYPINZ.mjs.map +0 -7
  204. package/dist/lib/browser/index.mjs +0 -141
  205. package/dist/lib/browser/index.mjs.map +0 -7
  206. package/dist/lib/browser/keyboard-OJZC54PK.mjs.map +0 -7
  207. package/dist/lib/browser/meta.json +0 -1
  208. package/dist/lib/browser/operation-resolver-BNAMYOHF.mjs +0 -53
  209. package/dist/lib/browser/operation-resolver-BNAMYOHF.mjs.map +0 -7
  210. package/dist/lib/browser/react-surface-AYHOAJ4I.mjs.map +0 -7
  211. package/dist/lib/browser/state-AC3EETN7.mjs.map +0 -7
  212. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +0 -1
  213. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +0 -3
  214. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +0 -1
  215. package/dist/types/src/capabilities/keyboard/index.d.ts +0 -3
  216. package/dist/types/src/capabilities/keyboard/index.d.ts.map +0 -1
  217. package/dist/types/src/capabilities/keyboard/keyboard.d.ts.map +0 -1
  218. package/dist/types/src/capabilities/operation-resolver/index.d.ts +0 -3
  219. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +0 -1
  220. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +0 -5
  221. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +0 -1
  222. package/dist/types/src/capabilities/react-surface/index.d.ts +0 -3
  223. package/dist/types/src/capabilities/react-surface/index.d.ts.map +0 -1
  224. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +0 -1
  225. package/dist/types/src/capabilities/state/index.d.ts +0 -3
  226. package/dist/types/src/capabilities/state/index.d.ts.map +0 -1
  227. package/dist/types/src/capabilities/state/state.d.ts +0 -6
  228. package/dist/types/src/capabilities/state/state.d.ts.map +0 -1
  229. package/dist/types/src/components/NavTreeContext.d.ts.map +0 -1
  230. package/dist/types/src/types/capabilities.d.ts +0 -16
  231. package/dist/types/src/types/capabilities.d.ts.map +0 -1
  232. package/dist/types/src/types/events.d.ts +0 -5
  233. package/dist/types/src/types/events.d.ts.map +0 -1
  234. package/src/capabilities/app-graph-builder/index.ts +0 -7
  235. package/src/capabilities/keyboard/index.ts +0 -7
  236. package/src/capabilities/operation-resolver/index.ts +0 -7
  237. package/src/capabilities/operation-resolver/operation-resolver.ts +0 -44
  238. package/src/capabilities/react-surface/index.ts +0 -7
  239. package/src/capabilities/state/index.ts +0 -7
  240. package/src/types/capabilities.ts +0 -21
  241. package/src/types/events.ts +0 -12
  242. /package/dist/types/src/capabilities/{app-graph-builder/app-graph-builder.d.ts → app-graph-builder.d.ts} +0 -0
  243. /package/dist/types/src/capabilities/{keyboard/keyboard.d.ts → keyboard.d.ts} +0 -0
  244. /package/dist/types/src/capabilities/{react-surface/react-surface.d.ts → react-surface.d.ts} +0 -0
@@ -9,33 +9,32 @@ import { RuntimePlugin } from '@dxos/app-framework';
9
9
  import { withPluginManager } from '@dxos/app-framework/testing';
10
10
  import { type Node } from '@dxos/app-graph';
11
11
  import { corePlugins } from '@dxos/plugin-testing';
12
- import { faker } from '@dxos/random';
13
- import { withTheme } from '@dxos/react-ui/testing';
12
+ import { random } from '@dxos/random';
14
13
 
15
14
  import { NavTreeItemAction, type NavTreeItemActionMenuProps } from './NavTreeItemAction';
16
15
 
17
16
  const parent = {
18
- id: faker.string.uuid(),
17
+ id: random.string.uuid(),
19
18
  type: 'node',
20
19
  data: null,
21
20
  properties: {
22
- label: faker.lorem.words(2),
21
+ label: random.lorem.words(2),
23
22
  icon: 'ph--circle--regular',
24
23
  },
25
24
  } satisfies Node.NodeArg<any>;
26
25
 
27
26
  // TODO(burdon): Factor out across tests.
28
- const menuActions = faker.helpers.multiple(
27
+ const menuActions = random.helpers.multiple(
29
28
  () =>
30
29
  ({
31
- id: faker.string.uuid(),
30
+ id: random.string.uuid(),
32
31
  type: 'action',
33
32
  data: () =>
34
33
  Effect.sync(() => {
35
34
  console.log('invoke');
36
35
  }),
37
36
  properties: {
38
- label: faker.lorem.words(2),
37
+ label: random.lorem.words(2),
39
38
  icon: 'ph--circle--regular',
40
39
  },
41
40
  }) satisfies Node.NodeArg<any>,
@@ -52,7 +51,6 @@ const meta = {
52
51
  label: 'Select action',
53
52
  } satisfies Partial<NavTreeItemActionMenuProps>,
54
53
  decorators: [
55
- withTheme(),
56
54
  withPluginManager({
57
55
  plugins: [...corePlugins(), RuntimePlugin()],
58
56
  }),
@@ -2,23 +2,16 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import React from 'react';
5
+ import React, { useCallback } from 'react';
6
6
 
7
7
  import { type Node } from '@dxos/app-graph';
8
8
  import { useActionRunner } from '@dxos/plugin-graph';
9
9
  import { IconButton, toLocalizedString, useDensityContext, useTranslation } from '@dxos/react-ui';
10
10
  import { Menu, type MenuItem } from '@dxos/react-ui-menu';
11
- import { hoverableControlItem, hoverableOpenControlItem } from '@dxos/ui-theme';
11
+ import { composable, composableProps, hoverableControlItem, hoverableOpenControlItem } from '@dxos/ui-theme';
12
12
 
13
- import { meta } from '../../meta';
14
- import { type ActionProperties } from '../../types';
15
-
16
- export type NavTreeItemActionMenuProps = ActionProperties & {
17
- parent: Node.Node;
18
- caller?: string;
19
- monolithic?: boolean;
20
- menuActions?: Node.Action[];
21
- };
13
+ import { meta } from '#meta';
14
+ import { type ActionProperties } from '#types';
22
15
 
23
16
  const fallbackIcon = 'ph--placeholder--regular';
24
17
 
@@ -26,46 +19,64 @@ const fineActionButtonProps = {
26
19
  size: 4 as const,
27
20
  density: 'fine' as const,
28
21
  };
22
+
29
23
  const coarseActionButtonProps = {
30
24
  size: 5 as const,
31
25
  density: 'coarse' as const,
32
26
  };
33
27
 
34
- export const NavTreeItemActionDropdownMenu = ({
35
- parent,
36
- label,
37
- icon,
38
- testId,
39
- menuActions,
40
- caller,
41
- }: NavTreeItemActionMenuProps) => {
42
- const { t } = useTranslation(meta.id);
43
- const density = useDensityContext();
44
- const runAction = useActionRunner();
45
-
46
- return (
47
- <Menu.Root caller={caller} onAction={runAction}>
48
- <Menu.Trigger asChild>
49
- <IconButton
50
- {...(density === 'coarse' ? coarseActionButtonProps : fineActionButtonProps)}
51
- classNames={['shrink-0 px-2 pointer-fine:px-1', hoverableControlItem, hoverableOpenControlItem]}
52
- variant='ghost'
53
- icon={icon ?? fallbackIcon}
54
- iconOnly
55
- label={toLocalizedString(label, t)}
56
- data-testid={testId}
57
- />
58
- </Menu.Trigger>
59
- <Menu.Content group={parent} items={menuActions as MenuItem[]} />
60
- </Menu.Root>
61
- );
28
+ export type NavTreeItemActionMenuProps = ActionProperties & {
29
+ parent: Node.Node;
30
+ path?: string[];
31
+ caller?: string;
32
+ monolithic?: boolean;
33
+ menuActions?: Node.Action[];
62
34
  };
63
35
 
36
+ export const NavTreeItemActionDropdownMenu = composable<HTMLButtonElement, NavTreeItemActionMenuProps>(
37
+ ({ parent, path, label, icon, testId, menuActions, caller, ...props }, forwardedRef) => {
38
+ const { t } = useTranslation(meta.id);
39
+ const density = useDensityContext();
40
+ const runAction = useActionRunner();
41
+ const handleAction = useCallback(
42
+ (action: Node.Action, params: Node.InvokeProps = {}) => runAction(action, { ...params, path }),
43
+ [runAction, path],
44
+ );
45
+
46
+ return (
47
+ <Menu.Root caller={caller} onAction={handleAction}>
48
+ <Menu.Trigger asChild>
49
+ <IconButton
50
+ {...(density === 'coarse' ? coarseActionButtonProps : fineActionButtonProps)}
51
+ {...composableProps(props)}
52
+ classNames={['shrink-0 px-2 pointer-fine:px-1', hoverableControlItem, hoverableOpenControlItem]}
53
+ variant='ghost'
54
+ icon={icon ?? fallbackIcon}
55
+ iconOnly
56
+ label={toLocalizedString(label, t)}
57
+ data-testid={testId}
58
+ ref={forwardedRef}
59
+ />
60
+ </Menu.Trigger>
61
+ <Menu.Content group={parent} items={menuActions as MenuItem[]} />
62
+ </Menu.Root>
63
+ );
64
+ },
65
+ );
66
+
67
+ NavTreeItemActionDropdownMenu.displayName = 'NavTreeItemActionDropdownMenu';
68
+
64
69
  export const NavTreeItemMonolithicAction = (
65
- props: Node.Action & { parent: Node.Node; onAction?: (action: Node.Action) => void; baseLabel: string },
70
+ props: Node.Action & {
71
+ parent: Node.Node;
72
+ path?: string[];
73
+ onAction?: (action: Node.Action) => void;
74
+ baseLabel: string;
75
+ },
66
76
  ) => {
67
77
  const {
68
78
  parent,
79
+ path,
69
80
  properties: { disabled, caller, testId, icon, variant = 'ghost', iconOnly = true } = { label: 'never' },
70
81
  baseLabel,
71
82
  } = props;
@@ -91,22 +102,28 @@ export const NavTreeItemMonolithicAction = (
91
102
  return;
92
103
  }
93
104
 
94
- void runAction(props, caller ? { parent, caller } : { parent });
105
+ void runAction(props, caller ? { parent, caller, path } : { parent, path });
95
106
  }}
96
107
  data-testid={testId}
97
108
  />
98
109
  );
99
110
  };
100
111
 
101
- export const NavTreeItemAction = ({ monolithic, menuActions, parent: node, ...props }: NavTreeItemActionMenuProps) => {
112
+ export const NavTreeItemAction = ({
113
+ monolithic,
114
+ menuActions,
115
+ menuType,
116
+ parent,
117
+ path,
118
+ ...props
119
+ }: NavTreeItemActionMenuProps) => {
102
120
  const { t } = useTranslation(meta.id);
103
121
 
104
122
  const monolithicAction = menuActions?.length === 1 && menuActions[0];
105
123
  const baseLabel = toLocalizedString(monolithicAction ? monolithicAction.properties!.label : props.label, t);
106
-
107
124
  return monolithic && menuActions?.length === 1 ? (
108
- <NavTreeItemMonolithicAction baseLabel={baseLabel} parent={node} {...menuActions[0]} />
125
+ <NavTreeItemMonolithicAction baseLabel={baseLabel} parent={parent} path={path} {...menuActions[0]} />
109
126
  ) : (
110
- <NavTreeItemActionDropdownMenu {...props} label={baseLabel} parent={node} menuActions={menuActions} />
127
+ <NavTreeItemActionDropdownMenu {...props} label={baseLabel} parent={parent} path={path} menuActions={menuActions} />
111
128
  );
112
129
  };
@@ -7,12 +7,12 @@ import React, { Fragment, memo, useMemo } from 'react';
7
7
  import { Node } from '@dxos/app-graph';
8
8
  import { Popover, Treegrid, toLocalizedString, useTranslation } from '@dxos/react-ui';
9
9
 
10
- import { useActions } from '../../hooks';
11
- import { meta } from '../../meta';
10
+ import { useActions } from '#hooks';
11
+ import { meta } from '#meta';
12
+
12
13
  import { NAV_TREE_ITEM } from '../NavTree';
13
14
  import { useNavTreeContext } from '../NavTreeContext';
14
15
  import { type NavTreeItemColumnsProps } from '../types';
15
-
16
16
  import { NavTreeItemAction } from './NavTreeItemAction';
17
17
 
18
18
  export const NavTreeItemColumns = memo(({ path, item, open }: NavTreeItemColumnsProps) => {
@@ -56,10 +56,10 @@ export const NavTreeItemColumns = memo(({ path, item, open }: NavTreeItemColumns
56
56
  [primaryAction, groupedActions],
57
57
  );
58
58
 
59
- const ActionRoot = popoverAnchorId === `dxos.org/ui/${NAV_TREE_ITEM}/${item.id}` ? Popover.Anchor : Fragment;
59
+ const ActionRoot = popoverAnchorId === `${NAV_TREE_ITEM}:${item.id}` ? Popover.Anchor : Fragment;
60
60
 
61
61
  return (
62
- <div role='none' className='contents dx-app-no-drag'>
62
+ <div className='contents dx-app-no-drag'>
63
63
  {primaryAction?.properties?.disposition === 'list-item-primary' && !primaryAction?.properties?.disabled ? (
64
64
  <Treegrid.Cell classNames='contents'>
65
65
  <NavTreeItemAction
@@ -67,6 +67,7 @@ export const NavTreeItemColumns = memo(({ path, item, open }: NavTreeItemColumns
67
67
  label={toLocalizedString(primaryAction.properties?.label, t)}
68
68
  icon={primaryAction.properties?.icon ?? 'ph--placeholder--regular'}
69
69
  parent={item}
70
+ path={path}
70
71
  monolithic={Node.isAction(primaryAction)}
71
72
  menuActions={primaryMenuActions}
72
73
  menuType={primaryAction.properties?.menuType}
@@ -81,9 +82,10 @@ export const NavTreeItemColumns = memo(({ path, item, open }: NavTreeItemColumns
81
82
  <Treegrid.Cell classNames='contents'>
82
83
  <NavTreeItemAction
83
84
  testId={`navtree.treeItem.actionsLevel${level}`}
84
- label={t('tree item actions label')}
85
+ label={t('tree-item-actions.label')}
85
86
  icon='ph--dots-three-vertical--regular'
86
87
  parent={item}
88
+ path={path}
87
89
  menuActions={actions}
88
90
  menuType='dropdown'
89
91
  caller={NAV_TREE_ITEM}
@@ -2,15 +2,15 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { combine } from '@atlaskit/pragmatic-drag-and-drop/combine';
6
- import { draggable, dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';
7
- import { preserveOffsetOnSource } from '@atlaskit/pragmatic-drag-and-drop/element/preserve-offset-on-source';
8
- import { scrollJustEnoughIntoView } from '@atlaskit/pragmatic-drag-and-drop/element/scroll-just-enough-into-view';
9
5
  import {
10
6
  type Edge,
11
7
  attachClosestEdge,
12
8
  extractClosestEdge,
13
9
  } from '@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge';
10
+ import { combine } from '@atlaskit/pragmatic-drag-and-drop/combine';
11
+ import { draggable, dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';
12
+ import { preserveOffsetOnSource } from '@atlaskit/pragmatic-drag-and-drop/element/preserve-offset-on-source';
13
+ import { scrollJustEnoughIntoView } from '@atlaskit/pragmatic-drag-and-drop/element/scroll-just-enough-into-view';
14
14
  import { useAtomValue } from '@effect-atom/atom-react';
15
15
  import React, {
16
16
  type MouseEvent,
@@ -29,6 +29,7 @@ import { DxAvatar } from '@dxos/lit-ui/react';
29
29
  import { useActionRunner } from '@dxos/plugin-graph';
30
30
  import {
31
31
  Icon,
32
+ IconButton,
32
33
  ListItem,
33
34
  ScrollArea,
34
35
  type ThemedClassName,
@@ -43,8 +44,9 @@ import { Tabs } from '@dxos/react-ui-tabs';
43
44
  import { mx } from '@dxos/ui-theme';
44
45
  import { arrayMove } from '@dxos/util';
45
46
 
46
- import { useNavTreeState } from '../../hooks';
47
- import { meta } from '../../meta';
47
+ import { useNavTreeState } from '#hooks';
48
+ import { meta } from '#meta';
49
+
48
50
  import { l0ItemType } from '../../util';
49
51
  import { useNavTreeContext } from '../NavTreeContext';
50
52
  import { UserAccountAvatar } from '../UserAccountAvatar';
@@ -85,12 +87,10 @@ const useL0ItemClick = ({ item, parent, path }: L0ItemProps, type: string) => {
85
87
  switch (type) {
86
88
  case 'action': {
87
89
  const { properties: { caller } = {} } = item;
88
- return void runAction(item as Node.Action, caller ? { parent, caller } : { parent });
90
+ return void runAction(item as Node.Action, caller ? { parent, path, caller } : { parent, path });
89
91
  }
90
-
91
92
  case 'tab':
92
93
  return onTabChange?.(item);
93
-
94
94
  case 'link':
95
95
  return onSelect?.({ item, path, current: !getItem(path).current, option: event.altKey });
96
96
  }
@@ -103,36 +103,34 @@ const l0Breakpoints: Record<string, string> = {
103
103
  lg: 'hidden lg:grid',
104
104
  };
105
105
 
106
- const l0ItemRoot =
107
- 'group/l0item flex w-full justify-center items-center relative data[type!="collection"]:cursor-pointer dx-app-no-drag dx-focus-ring-group';
108
-
109
- const l0ItemContent = 'flex justify-center items-center dx-focus-ring-group-indicator transition-colors rounded-sm';
110
-
111
106
  const L0ItemRoot = memo(
112
- forwardRef<HTMLElement, PropsWithChildren<L0ItemRootProps>>(
107
+ forwardRef<HTMLButtonElement, PropsWithChildren<L0ItemRootProps>>(
113
108
  ({ item, parent, path, onMouseEnter, children }, forwardedRef) => {
109
+ const { t } = useTranslation(meta.id);
114
110
  const { model } = useNavTreeContext();
115
111
  const itemPath = useMemo(() => [...path, item.id], [item.id, path]);
116
112
  const { id, testId } = useAtomValue(model.itemProps(itemPath));
117
- const type = l0ItemType(item);
118
-
119
- const { t } = useTranslation(meta.id);
120
113
  const localizedString = toLocalizedString(item.properties.label, t);
121
114
 
115
+ const type = l0ItemType(item);
122
116
  const handleClick = useL0ItemClick({ item, parent, path: itemPath }, type);
123
- const rootProps =
124
- type === 'tab'
125
- ? { value: item.id, tabIndex: 0, onClick: handleClick, 'data-testid': testId, 'data-object-id': id }
126
- : { onClick: handleClick, 'data-testid': testId, 'data-object-id': id };
127
117
 
128
118
  return (
129
119
  <Tooltip.Trigger asChild delayDuration={0} side='right' content={localizedString}>
130
120
  <Tabs.TabPrimitive
131
- {...(rootProps as any)}
121
+ className={mx(
122
+ 'group/l0item flex w-full justify-center items-center relative',
123
+ 'dx-app-no-drag dx-focus-ring-group data[type!="collection"]:cursor-pointer',
124
+ l0Breakpoints[item.properties.l0Breakpoint],
125
+ )}
126
+ tabIndex={type === 'tab' ? 0 : undefined}
132
127
  data-type={type}
133
- className={mx(l0ItemRoot, l0Breakpoints[item.properties.l0Breakpoint])}
134
- ref={forwardedRef}
128
+ data-testid={testId}
129
+ data-object-id={id}
130
+ value={item.id}
131
+ onClick={handleClick}
135
132
  onMouseEnter={onMouseEnter}
133
+ ref={forwardedRef}
136
134
  >
137
135
  {children}
138
136
  </Tabs.TabPrimitive>
@@ -144,9 +142,8 @@ const L0ItemRoot = memo(
144
142
 
145
143
  export const L0ItemActiveTabIndicator = ({ classNames }: ThemedClassName<{}>) => (
146
144
  <div
147
- role='none'
148
145
  className={mx(
149
- 'hidden group-aria-selected/l0item:block absolute start-0 inset-y-2 w-1 bg-accent-surface rounded-ie',
146
+ 'hidden group-aria-selected/l0item:block absolute start-0 h-6 w-1.5 bg-accent-surface rounded-sm',
150
147
  classNames,
151
148
  )}
152
149
  />
@@ -155,13 +152,12 @@ export const L0ItemActiveTabIndicator = ({ classNames }: ThemedClassName<{}>) =>
155
152
  // TODO(burdon): Factor out pinned (non-draggable) items.
156
153
  const L0Item = memo(({ item, parent, path, pinned, onRearrange, onItemHover }: L0ItemProps) => {
157
154
  const { t } = useTranslation(meta.id);
158
- const itemElement = useRef<HTMLElement | null>(null);
155
+ const itemElement = useRef<HTMLButtonElement | null>(null);
159
156
  const [closestEdge, setEdge] = useState<Edge | null>(null);
160
157
  const localizedString = toLocalizedString(item.properties.label, t);
161
158
  const hue = item.properties.hue ?? null;
162
159
 
163
160
  useLayoutEffect(() => {
164
- // NOTE(thure): This is copied from StackItem, perhaps this should be DRYed out.
165
161
  if (!itemElement.current || !onRearrange) {
166
162
  return;
167
163
  }
@@ -221,14 +217,13 @@ const L0Item = memo(({ item, parent, path, pinned, onRearrange, onItemHover }: L
221
217
  return (
222
218
  <L0ItemRoot ref={itemElement} item={item} parent={parent} path={path} onMouseEnter={handleMouseEnter}>
223
219
  <div
224
- role='none'
225
220
  data-frame={true}
226
221
  {...(hue && { style: { background: `var(--color-${hue}-surface)` } })}
227
222
  className={mx(
228
- l0ItemContent,
223
+ 'flex justify-center items-center dx-focus-ring-group-indicator transition-colors rounded-sm',
229
224
  pinned
230
- ? 'p-2 group-hover/l0item:bg-active-surface'
231
- : 'w-(--dx-l0-avatar-size) h-(--dx-l0-avatar-size) bg-active-surface',
225
+ ? 'p-2 group-hover/l0item:bg-current-surface'
226
+ : 'w-(--dx-l0-avatar-size) h-(--dx-l0-avatar-size) bg-current-surface',
232
227
  )}
233
228
  >
234
229
  <ItemAvatar item={item} />
@@ -244,13 +239,15 @@ const L0Item = memo(({ item, parent, path, pinned, onRearrange, onItemHover }: L
244
239
 
245
240
  const ItemAvatar = ({ item }: Pick<L0ItemProps, 'item'>) => {
246
241
  const { t } = useTranslation(meta.id);
247
- const type = l0ItemType(item);
242
+
243
+ // Actions.
248
244
  if (item.properties.icon) {
249
245
  const hue = item.properties.hue ?? null;
250
- const hueFgStyle = hue && { style: { color: `var(--color-${hue}-surface-text)` } };
246
+ const hueFgStyle = hue && { style: { color: `var(--color-${hue}-foreground)` } };
251
247
  return <Icon icon={item.properties.icon} size={6} {...hueFgStyle} />;
252
248
  }
253
249
 
250
+ const type = l0ItemType(item);
254
251
  if (type === 'tab' && item.properties.disposition !== 'pin-end') {
255
252
  const hue = item.properties.hue ?? null;
256
253
  const localizedString = toLocalizedString(item.properties.label, t);
@@ -317,74 +314,50 @@ export const L0Menu = ({
317
314
 
318
315
  return (
319
316
  <Tabs.Tablist
317
+ data-tauri-drag-region
320
318
  classNames={[
321
319
  'group/l0 absolute z-[1] inset-y-0 start-0 rounded-is',
322
320
  'grid grid-cols-[var(--dx-l0-size)] grid-rows-[var(--dx-rail-size)_1fr_min-content_var(--dx-l0-size)] dx-contain-layout',
323
- '!w-(--dx-l0-size) bg-toolbar-surface border-e border-subdued-separator dx-app-drag pb-[env(safe-area-inset-bottom)]',
321
+ 'w-(--dx-l0-size) bg-toolbar-surface dx-app-drag pb-[env(safe-area-inset-bottom)]',
322
+ '[body[data-platform="macos"]_&]:pt-[30px]',
323
+ '[body[data-platform="ios"]_&]:pt-[max(env(safe-area-inset-top),0.25rem)]',
324
324
  ]}
325
325
  >
326
326
  {/* TODO(wittjosiah): Use L0Item trigger. */}
327
327
  <Menu.Root onAction={handleAction}>
328
- <Menu.Trigger
329
- asChild
330
- data-testid='spacePlugin.addSpace'
331
- className={mx(
332
- l0ItemRoot,
333
- 'grid place-items-center dx-focus-ring-group',
334
- '[body[data-platform="macos"]_&]:mt-[30px]',
335
- )}
336
- >
337
- <Tooltip.Trigger content={t('app menu label')} side='right' asChild>
338
- <Tabs.TabPrimitive value='options' asChild role='button'>
339
- <div
340
- role='none'
341
- className={mx(
342
- l0ItemContent,
343
- 'h-(--dx-rail-action) w-(--dx-rail-action) group-hover/l0item:bg-hover-surface',
344
- )}
345
- >
346
- <Icon icon='ph--list--regular' size={5} />
347
- </div>
348
- </Tabs.TabPrimitive>
349
- </Tooltip.Trigger>
328
+ <Menu.Trigger asChild data-testid='spacePlugin.addSpace'>
329
+ <div className='grid place-items-center'>
330
+ <IconButton variant='ghost' icon='ph--list--regular' iconOnly label={t('app-menu.label')} />
331
+ </div>
350
332
  </Menu.Trigger>
351
333
  <Menu.Content group={parent} items={menuActions} />
352
334
  </Menu.Root>
353
335
 
354
336
  {/* Space list. */}
355
- <ScrollArea.Root thin orientation='vertical'>
356
- <ScrollArea.Viewport>
357
- <div
358
- role='none'
359
- className={mx([
360
- 'flex flex-col gap-1 pt-1',
361
- '[body[data-platform="macos"]_&]:py-[30px]',
362
- '[body[data-platform="ios"]_&]:py-[max(env(safe-area-inset-top),0.25rem)]',
363
- ])}
364
- >
365
- {topLevelItems.map((item) => (
366
- <L0Item
367
- key={item.id}
368
- item={item}
369
- parent={parent}
370
- path={path}
371
- onItemHover={onItemHover}
372
- {...(hasRearrangeableItems && { onRearrange: handleRearrange })}
373
- />
374
- ))}
375
- </div>
337
+ <ScrollArea.Root centered thin orientation='vertical'>
338
+ <ScrollArea.Viewport classNames='flex flex-col gap-2 py-1'>
339
+ {topLevelItems.map((item) => (
340
+ <L0Item
341
+ key={item.id}
342
+ item={item}
343
+ parent={parent}
344
+ path={path}
345
+ onItemHover={onItemHover}
346
+ {...(hasRearrangeableItems && { onRearrange: handleRearrange })}
347
+ />
348
+ ))}
376
349
  </ScrollArea.Viewport>
377
350
  </ScrollArea.Root>
378
351
 
379
352
  {/* Actions. */}
380
- <div role='none' className='grid grid-cols-1 auto-rows-(--dx-rail-action) pt-2'>
353
+ <div className='grid grid-cols-1 auto-rows-(--dx-rail-action) pt-2'>
381
354
  {pinnedItems.map((item) => (
382
355
  <L0Item key={item.id} item={item} parent={parent} path={path} pinned />
383
356
  ))}
384
357
  </div>
385
358
 
386
359
  {userAccountItem && (
387
- <div role='none' className='grid dx-app-no-drag'>
360
+ <div className='grid dx-app-no-drag'>
388
361
  <L0ItemRoot key={userAccountItem.id} item={userAccountItem} parent={parent} path={path}>
389
362
  <UserAccountAvatar
390
363
  userId={userAccountItem.properties.userId}