@dxos/plugin-navtree 0.8.4-main.72ec0f3 → 0.8.4-main.7996785055

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/dist/lib/browser/CommandsDialogContent-U726OBZ2.mjs +117 -0
  2. package/dist/lib/browser/CommandsDialogContent-U726OBZ2.mjs.map +7 -0
  3. package/dist/lib/browser/CommandsTrigger-LCFJL36T.mjs +32 -0
  4. package/dist/lib/browser/CommandsTrigger-LCFJL36T.mjs.map +7 -0
  5. package/dist/lib/browser/NavTreeContainer-35LP3XZM.mjs +12 -0
  6. package/dist/lib/browser/NavTreeContainer-35LP3XZM.mjs.map +7 -0
  7. package/dist/lib/browser/NavTreeDocumentTitle-L6NLLWLD.mjs +26 -0
  8. package/dist/lib/browser/NavTreeDocumentTitle-L6NLLWLD.mjs.map +7 -0
  9. package/dist/lib/browser/app-graph-builder-Z43OTNI2.mjs +44 -0
  10. package/dist/lib/browser/app-graph-builder-Z43OTNI2.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-E6MZBCU5.mjs → chunk-A4VDCIJC.mjs} +3 -3
  12. package/dist/lib/browser/chunk-A4VDCIJC.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-KF26WA4O.mjs +23 -0
  14. package/dist/lib/browser/chunk-KF26WA4O.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-MTTE5C5L.mjs +1452 -0
  16. package/dist/lib/browser/chunk-MTTE5C5L.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-PD6TZ6TP.mjs +14 -0
  18. package/dist/lib/browser/chunk-PD6TZ6TP.mjs.map +7 -0
  19. package/dist/lib/browser/expose-LKZ6QBBD.mjs +43 -0
  20. package/dist/lib/browser/expose-LKZ6QBBD.mjs.map +7 -0
  21. package/dist/lib/browser/index.mjs +86 -91
  22. package/dist/lib/browser/index.mjs.map +4 -4
  23. package/dist/lib/browser/{keyboard-YYTYJW4M.mjs → keyboard-HYGFQO7T.mjs} +25 -19
  24. package/dist/lib/browser/keyboard-HYGFQO7T.mjs.map +7 -0
  25. package/dist/lib/browser/meta.json +1 -1
  26. package/dist/lib/browser/operation-handler-VHOUWGCZ.mjs +16 -0
  27. package/dist/lib/browser/operation-handler-VHOUWGCZ.mjs.map +7 -0
  28. package/dist/lib/browser/react-surface-XWFN75ZB.mjs +59 -0
  29. package/dist/lib/browser/react-surface-XWFN75ZB.mjs.map +7 -0
  30. package/dist/lib/browser/state-CWMNNF7K.mjs +131 -0
  31. package/dist/lib/browser/state-CWMNNF7K.mjs.map +7 -0
  32. package/dist/types/src/NavTreePlugin.d.ts +2 -1
  33. package/dist/types/src/NavTreePlugin.d.ts.map +1 -1
  34. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +6 -0
  35. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
  36. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
  37. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
  38. package/dist/types/src/capabilities/index.d.ts +5 -108
  39. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  40. package/dist/types/src/capabilities/keyboard/index.d.ts +3 -0
  41. package/dist/types/src/capabilities/keyboard/index.d.ts.map +1 -0
  42. package/dist/types/src/capabilities/keyboard/keyboard.d.ts +5 -0
  43. package/dist/types/src/capabilities/keyboard/keyboard.d.ts.map +1 -0
  44. package/dist/types/src/capabilities/operation-handler/index.d.ts +4 -0
  45. package/dist/types/src/capabilities/operation-handler/index.d.ts.map +1 -0
  46. package/dist/types/src/capabilities/operation-handler/operation-handler.d.ts +6 -0
  47. package/dist/types/src/capabilities/operation-handler/operation-handler.d.ts.map +1 -0
  48. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  49. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  50. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  51. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  52. package/dist/types/src/capabilities/state/index.d.ts +3 -0
  53. package/dist/types/src/capabilities/state/index.d.ts.map +1 -0
  54. package/dist/types/src/capabilities/state/state.d.ts +6 -0
  55. package/dist/types/src/capabilities/state/state.d.ts.map +1 -0
  56. package/dist/types/src/components/NavTree/NavTree.d.ts +11 -4
  57. package/dist/types/src/components/NavTree/NavTree.d.ts.map +1 -1
  58. package/dist/types/src/components/NavTree/NavTree.stories.d.ts +2 -2
  59. package/dist/types/src/components/NavTree/NavTree.stories.d.ts.map +1 -1
  60. package/dist/types/src/components/{NavTreeContext.d.ts → NavTreeContext/NavTreeContext.d.ts} +1 -1
  61. package/dist/types/src/components/NavTreeContext/NavTreeContext.d.ts.map +1 -0
  62. package/dist/types/src/components/NavTreeContext/index.d.ts +2 -0
  63. package/dist/types/src/components/NavTreeContext/index.d.ts.map +1 -0
  64. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts +16 -8
  65. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts.map +1 -1
  66. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.stories.d.ts +3 -2
  67. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.stories.d.ts.map +1 -1
  68. package/dist/types/src/components/NavTreeItem/NavTreeItemColumns.d.ts.map +1 -1
  69. package/dist/types/src/components/Sidebar/L0Menu.d.ts +8 -5
  70. package/dist/types/src/components/Sidebar/L0Menu.d.ts.map +1 -1
  71. package/dist/types/src/components/Sidebar/L1Panel.d.ts +4 -7
  72. package/dist/types/src/components/Sidebar/L1Panel.d.ts.map +1 -1
  73. package/dist/types/src/components/Sidebar/L1Tabs.d.ts +5 -4
  74. package/dist/types/src/components/Sidebar/L1Tabs.d.ts.map +1 -1
  75. package/dist/types/src/components/UserAccountAvatar/UserAccountAvatar.stories.d.ts.map +1 -1
  76. package/dist/types/src/components/index.d.ts +0 -3
  77. package/dist/types/src/components/index.d.ts.map +1 -1
  78. package/dist/types/src/components/types.d.ts +8 -16
  79. package/dist/types/src/components/types.d.ts.map +1 -1
  80. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.d.ts +6 -0
  81. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.d.ts.map +1 -0
  82. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.stories.d.ts +30 -0
  83. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.stories.d.ts.map +1 -0
  84. package/dist/types/src/containers/CommandsDialogContent/index.d.ts +3 -0
  85. package/dist/types/src/containers/CommandsDialogContent/index.d.ts.map +1 -0
  86. package/dist/types/src/containers/CommandsTrigger/CommandsTrigger.d.ts.map +1 -0
  87. package/dist/types/src/containers/CommandsTrigger/index.d.ts +3 -0
  88. package/dist/types/src/containers/CommandsTrigger/index.d.ts.map +1 -0
  89. package/dist/types/src/containers/NavTreeContainer/NavTreeContainer.d.ts +9 -0
  90. package/dist/types/src/containers/NavTreeContainer/NavTreeContainer.d.ts.map +1 -0
  91. package/dist/types/src/containers/NavTreeContainer/index.d.ts +3 -0
  92. package/dist/types/src/containers/NavTreeContainer/index.d.ts.map +1 -0
  93. package/dist/types/src/{components → containers/NavTreeDocumentTitle}/NavTreeDocumentTitle.d.ts +1 -1
  94. package/dist/types/src/containers/NavTreeDocumentTitle/NavTreeDocumentTitle.d.ts.map +1 -0
  95. package/dist/types/src/containers/NavTreeDocumentTitle/index.d.ts +3 -0
  96. package/dist/types/src/containers/NavTreeDocumentTitle/index.d.ts.map +1 -0
  97. package/dist/types/src/containers/index.d.ts +7 -0
  98. package/dist/types/src/containers/index.d.ts.map +1 -0
  99. package/dist/types/src/experimental/Tree.stories.d.ts +18 -4
  100. package/dist/types/src/experimental/Tree.stories.d.ts.map +1 -1
  101. package/dist/types/src/hooks/index.d.ts +5 -0
  102. package/dist/types/src/hooks/index.d.ts.map +1 -0
  103. package/dist/types/src/hooks/useActions.d.ts +5 -0
  104. package/dist/types/src/hooks/useActions.d.ts.map +1 -0
  105. package/dist/types/src/hooks/useLoadDescendents.d.ts +6 -0
  106. package/dist/types/src/hooks/useLoadDescendents.d.ts.map +1 -0
  107. package/dist/types/src/hooks/useNavTreeModel.d.ts +7 -0
  108. package/dist/types/src/hooks/useNavTreeModel.d.ts.map +1 -0
  109. package/dist/types/src/hooks/useNavTreeState.d.ts +22 -0
  110. package/dist/types/src/hooks/useNavTreeState.d.ts.map +1 -0
  111. package/dist/types/src/index.d.ts +1 -2
  112. package/dist/types/src/index.d.ts.map +1 -1
  113. package/dist/types/src/meta.d.ts +2 -2
  114. package/dist/types/src/meta.d.ts.map +1 -1
  115. package/dist/types/src/operations/expose.d.ts +5 -0
  116. package/dist/types/src/operations/expose.d.ts.map +1 -0
  117. package/dist/types/src/operations/index.d.ts +3 -0
  118. package/dist/types/src/operations/index.d.ts.map +1 -0
  119. package/dist/types/src/testing/app-graph-builder.d.ts +2 -3
  120. package/dist/types/src/testing/app-graph-builder.d.ts.map +1 -1
  121. package/dist/types/src/testing/generator.d.ts +5 -6
  122. package/dist/types/src/testing/generator.d.ts.map +1 -1
  123. package/dist/types/src/testing/update-state.d.ts +2 -2
  124. package/dist/types/src/testing/update-state.d.ts.map +1 -1
  125. package/dist/types/src/types/capabilities.d.ts +16 -0
  126. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  127. package/dist/types/src/types/events.d.ts +5 -0
  128. package/dist/types/src/types/events.d.ts.map +1 -0
  129. package/dist/types/src/types/index.d.ts +4 -0
  130. package/dist/types/src/types/index.d.ts.map +1 -0
  131. package/dist/types/src/{types.d.ts → types/schema.d.ts} +6 -6
  132. package/dist/types/src/types/schema.d.ts.map +1 -0
  133. package/dist/types/src/util.d.ts +11 -7
  134. package/dist/types/src/util.d.ts.map +1 -1
  135. package/dist/types/tsconfig.tsbuildinfo +1 -1
  136. package/package.json +55 -53
  137. package/src/NavTreePlugin.tsx +54 -73
  138. package/src/capabilities/app-graph-builder/app-graph-builder.ts +42 -0
  139. package/src/capabilities/app-graph-builder/index.ts +7 -0
  140. package/src/capabilities/index.ts +5 -9
  141. package/src/capabilities/keyboard/index.ts +7 -0
  142. package/src/capabilities/keyboard/keyboard.ts +66 -0
  143. package/src/capabilities/operation-handler/index.ts +11 -0
  144. package/src/capabilities/operation-handler/operation-handler.ts +16 -0
  145. package/src/capabilities/react-surface/index.ts +7 -0
  146. package/src/capabilities/react-surface/react-surface.tsx +53 -0
  147. package/src/capabilities/state/index.ts +7 -0
  148. package/src/capabilities/state/state.ts +149 -0
  149. package/src/components/NavTree/NavTree.stories.tsx +44 -51
  150. package/src/components/NavTree/NavTree.tsx +63 -32
  151. package/src/components/{NavTreeContext.tsx → NavTreeContext/NavTreeContext.tsx} +1 -1
  152. package/src/components/NavTreeContext/index.ts +5 -0
  153. package/src/components/NavTreeItem/NavTreeItemAction.stories.tsx +17 -9
  154. package/src/components/NavTreeItem/NavTreeItemAction.tsx +65 -42
  155. package/src/components/NavTreeItem/NavTreeItemColumns.tsx +42 -16
  156. package/src/components/Sidebar/L0Menu.tsx +141 -177
  157. package/src/components/Sidebar/L1Panel.tsx +251 -93
  158. package/src/components/Sidebar/L1Tabs.tsx +18 -33
  159. package/src/components/UserAccountAvatar/UserAccountAvatar.stories.tsx +2 -3
  160. package/src/components/UserAccountAvatar/UserAccountAvatar.tsx +1 -1
  161. package/src/components/index.ts +1 -3
  162. package/src/components/types.ts +14 -19
  163. package/src/containers/CommandsDialogContent/CommandsDialogContent.stories.tsx +46 -0
  164. package/src/containers/CommandsDialogContent/CommandsDialogContent.tsx +131 -0
  165. package/src/containers/CommandsDialogContent/index.ts +7 -0
  166. package/src/containers/CommandsTrigger/CommandsTrigger.tsx +28 -0
  167. package/src/containers/CommandsTrigger/index.ts +7 -0
  168. package/src/containers/NavTreeContainer/NavTreeContainer.tsx +271 -0
  169. package/src/containers/NavTreeContainer/index.ts +6 -0
  170. package/src/{components → containers/NavTreeDocumentTitle}/NavTreeDocumentTitle.tsx +4 -3
  171. package/src/containers/NavTreeDocumentTitle/index.ts +7 -0
  172. package/src/containers/index.ts +12 -0
  173. package/src/experimental/Tree.stories.tsx +55 -58
  174. package/src/experimental/Tree.tsx +4 -4
  175. package/src/hooks/index.ts +8 -0
  176. package/src/hooks/useActions.ts +34 -0
  177. package/src/hooks/useLoadDescendents.ts +23 -0
  178. package/src/hooks/useNavTreeModel.ts +118 -0
  179. package/src/hooks/useNavTreeState.ts +42 -0
  180. package/src/index.ts +1 -2
  181. package/src/meta.ts +4 -4
  182. package/src/operations/expose.ts +42 -0
  183. package/src/operations/index.ts +7 -0
  184. package/src/testing/app-graph-builder.ts +158 -234
  185. package/src/testing/generator.ts +19 -17
  186. package/src/testing/update-state.ts +6 -6
  187. package/src/types/capabilities.ts +21 -0
  188. package/src/types/events.ts +12 -0
  189. package/src/types/index.ts +7 -0
  190. package/src/{types.ts → types/schema.ts} +5 -5
  191. package/src/util.ts +27 -16
  192. package/dist/lib/browser/app-graph-builder-OHSCN3GX.mjs +0 -46
  193. package/dist/lib/browser/app-graph-builder-OHSCN3GX.mjs.map +0 -7
  194. package/dist/lib/browser/chunk-5VLWX4PK.mjs +0 -15
  195. package/dist/lib/browser/chunk-5VLWX4PK.mjs.map +0 -7
  196. package/dist/lib/browser/chunk-7D2MPHXV.mjs +0 -1483
  197. package/dist/lib/browser/chunk-7D2MPHXV.mjs.map +0 -7
  198. package/dist/lib/browser/chunk-E6MZBCU5.mjs.map +0 -7
  199. package/dist/lib/browser/intent-resolver-YUVXVPHG.mjs +0 -47
  200. package/dist/lib/browser/intent-resolver-YUVXVPHG.mjs.map +0 -7
  201. package/dist/lib/browser/keyboard-YYTYJW4M.mjs.map +0 -7
  202. package/dist/lib/browser/react-surface-J7MWWAGD.mjs +0 -51
  203. package/dist/lib/browser/react-surface-J7MWWAGD.mjs.map +0 -7
  204. package/dist/lib/browser/state-EUSVT6BI.mjs +0 -117
  205. package/dist/lib/browser/state-EUSVT6BI.mjs.map +0 -7
  206. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
  207. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  208. package/dist/types/src/capabilities/capabilities.d.ts +0 -21
  209. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  210. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  211. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  212. package/dist/types/src/capabilities/keyboard.d.ts +0 -4
  213. package/dist/types/src/capabilities/keyboard.d.ts.map +0 -1
  214. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  215. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  216. package/dist/types/src/capabilities/state.d.ts +0 -20
  217. package/dist/types/src/capabilities/state.d.ts.map +0 -1
  218. package/dist/types/src/components/CommandsDialog/CommandsDialog.d.ts +0 -5
  219. package/dist/types/src/components/CommandsDialog/CommandsDialog.d.ts.map +0 -1
  220. package/dist/types/src/components/CommandsDialog/CommandsTrigger.d.ts.map +0 -1
  221. package/dist/types/src/components/CommandsDialog/index.d.ts +0 -3
  222. package/dist/types/src/components/CommandsDialog/index.d.ts.map +0 -1
  223. package/dist/types/src/components/NavTreeContainer.d.ts +0 -9
  224. package/dist/types/src/components/NavTreeContainer.d.ts.map +0 -1
  225. package/dist/types/src/components/NavTreeContext.d.ts.map +0 -1
  226. package/dist/types/src/components/NavTreeDocumentTitle.d.ts.map +0 -1
  227. package/dist/types/src/events.d.ts +0 -4
  228. package/dist/types/src/events.d.ts.map +0 -1
  229. package/dist/types/src/hooks.d.ts +0 -3
  230. package/dist/types/src/hooks.d.ts.map +0 -1
  231. package/dist/types/src/types.d.ts.map +0 -1
  232. package/src/capabilities/app-graph-builder.ts +0 -53
  233. package/src/capabilities/capabilities.ts +0 -20
  234. package/src/capabilities/intent-resolver.ts +0 -37
  235. package/src/capabilities/keyboard.ts +0 -59
  236. package/src/capabilities/react-surface.tsx +0 -45
  237. package/src/capabilities/state.ts +0 -105
  238. package/src/components/CommandsDialog/CommandsDialog.tsx +0 -126
  239. package/src/components/CommandsDialog/CommandsTrigger.tsx +0 -36
  240. package/src/components/CommandsDialog/index.ts +0 -6
  241. package/src/components/NavTreeContainer.tsx +0 -369
  242. package/src/events.ts +0 -11
  243. package/src/hooks.ts +0 -21
  244. /package/dist/types/src/{components/CommandsDialog → containers/CommandsTrigger}/CommandsTrigger.d.ts +0 -0
@@ -11,10 +11,12 @@ import {
11
11
  attachClosestEdge,
12
12
  extractClosestEdge,
13
13
  } from '@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge';
14
+ import { useAtomValue } from '@effect-atom/atom-react';
14
15
  import React, {
15
16
  type MouseEvent,
16
17
  type PropsWithChildren,
17
18
  forwardRef,
19
+ memo,
18
20
  useCallback,
19
21
  useLayoutEffect,
20
22
  useMemo,
@@ -23,10 +25,11 @@ import React, {
23
25
  } from 'react';
24
26
 
25
27
  import { type Node } from '@dxos/app-graph';
26
- import { invariant } from '@dxos/invariant';
27
28
  import { DxAvatar } from '@dxos/lit-ui/react';
29
+ import { useActionRunner } from '@dxos/plugin-graph';
28
30
  import {
29
31
  Icon,
32
+ IconButton,
30
33
  ListItem,
31
34
  ScrollArea,
32
35
  type ThemedClassName,
@@ -35,13 +38,13 @@ import {
35
38
  useMediaQuery,
36
39
  useTranslation,
37
40
  } from '@dxos/react-ui';
38
- import { DropdownMenu, type MenuItem, MenuProvider } from '@dxos/react-ui-menu';
41
+ import { Menu, type MenuItem } from '@dxos/react-ui-menu';
39
42
  import type { StackItemRearrangeHandler } from '@dxos/react-ui-stack';
40
43
  import { Tabs } from '@dxos/react-ui-tabs';
41
- import { mx } from '@dxos/react-ui-theme';
44
+ import { mx } from '@dxos/ui-theme';
42
45
  import { arrayMove } from '@dxos/util';
43
46
 
44
- import { useLoadDescendents } from '../../hooks';
47
+ import { useNavTreeState } from '../../hooks';
45
48
  import { meta } from '../../meta';
46
49
  import { l0ItemType } from '../../util';
47
50
  import { useNavTreeContext } from '../NavTreeContext';
@@ -57,43 +60,41 @@ type L0ItemData = {
57
60
  };
58
61
 
59
62
  type L0ItemRootProps = {
60
- item: Node<any>;
61
- parent?: Node<any>;
63
+ item: Node.Node;
64
+ parent?: Node.Node;
62
65
  path: string[];
66
+ onMouseEnter?: () => void;
63
67
  };
64
68
 
65
69
  type L0ItemProps = L0ItemRootProps & {
66
- item: Node<any>;
67
- parent?: Node<any>;
70
+ item: Node.Node;
71
+ parent?: Node.Node;
68
72
  path: string[];
69
73
  pinned?: boolean;
70
74
  onRearrange?: StackItemRearrangeHandler<L0ItemData>;
75
+ onItemHover?: (params: { item: Node.Node }) => void;
71
76
  };
72
77
 
73
78
  const useL0ItemClick = ({ item, parent, path }: L0ItemProps, type: string) => {
74
- const { tab, isCurrent, onSelect, onTabChange } = useNavTreeContext();
79
+ const { onSelect, onTabChange } = useNavTreeContext();
80
+ const { getItem } = useNavTreeState();
75
81
  const [isLg] = useMediaQuery('lg');
82
+ const runAction = useActionRunner();
76
83
 
77
84
  return useCallback(
78
85
  (event: MouseEvent) => {
79
86
  switch (type) {
80
87
  case 'action': {
81
- const {
82
- data: invoke,
83
- properties: { caller },
84
- } = item;
85
-
86
- return invoke?.(caller ? { node: parent, caller } : { node: parent });
88
+ const { properties: { caller } = {} } = item;
89
+ return void runAction(item as Node.Action, caller ? { parent, path, caller } : { parent, path });
87
90
  }
88
-
89
91
  case 'tab':
90
92
  return onTabChange?.(item);
91
-
92
93
  case 'link':
93
- return onSelect?.({ item, path, current: !isCurrent(path, item), option: event.altKey });
94
+ return onSelect?.({ item, path, current: !getItem(path).current, option: event.altKey });
94
95
  }
95
96
  },
96
- [item, parent, type, tab, isCurrent, onSelect, onTabChange, isLg],
97
+ [item, parent, type, getItem, onSelect, onTabChange, isLg, runAction],
97
98
  );
98
99
  };
99
100
 
@@ -101,64 +102,62 @@ const l0Breakpoints: Record<string, string> = {
101
102
  lg: 'hidden lg:grid',
102
103
  };
103
104
 
104
- const l0ItemRoot =
105
- 'group/l0item flex is-full justify-center items-center relative data[type!="collection"]:cursor-pointer app-no-drag dx-focus-ring-group';
106
-
107
- const l0ItemContent = 'flex justify-center items-center dx-focus-ring-group-indicator transition-colors rounded-sm';
108
-
109
- const L0ItemRoot = forwardRef<HTMLElement, PropsWithChildren<L0ItemRootProps>>(
110
- ({ item, parent, path, children }, forwardedRef) => {
111
- const { getProps } = useNavTreeContext();
112
- const { id, testId } = getProps?.(item, path) ?? {};
113
- const type = l0ItemType(item);
114
- const itemPath = useMemo(() => [...path, item.id], [item.id, path]);
115
-
116
- const { t } = useTranslation(meta.id);
117
- const localizedString = toLocalizedString(item.properties.label, t);
118
-
119
- const handleClick = useL0ItemClick({ item, parent, path: itemPath }, type);
120
- const rootProps =
121
- type === 'tab'
122
- ? { value: item.id, tabIndex: 0, onClick: handleClick, 'data-testid': testId, 'data-object-id': id }
123
- : type !== 'collection'
124
- ? { onClick: handleClick, 'data-testid': testId, 'data-object-id': id }
125
- : { onClick: handleClick, role: 'button' };
126
-
127
- return (
128
- <Tooltip.Trigger asChild delayDuration={0} side='right' content={localizedString}>
129
- <Tabs.TabPrimitive
130
- {...(rootProps as any)}
131
- data-type={type}
132
- className={mx(l0ItemRoot, l0Breakpoints[item.properties.l0Breakpoint])}
133
- ref={forwardedRef}
134
- >
135
- {children}
136
- </Tabs.TabPrimitive>
137
- </Tooltip.Trigger>
138
- );
139
- },
105
+ const L0ItemRoot = memo(
106
+ forwardRef<HTMLButtonElement, PropsWithChildren<L0ItemRootProps>>(
107
+ ({ item, parent, path, onMouseEnter, children }, forwardedRef) => {
108
+ const { t } = useTranslation(meta.id);
109
+ const { model } = useNavTreeContext();
110
+ const itemPath = useMemo(() => [...path, item.id], [item.id, path]);
111
+ const { id, testId } = useAtomValue(model.itemProps(itemPath));
112
+ const localizedString = toLocalizedString(item.properties.label, t);
113
+
114
+ const type = l0ItemType(item);
115
+ const handleClick = useL0ItemClick({ item, parent, path: itemPath }, type);
116
+
117
+ return (
118
+ <Tooltip.Trigger asChild delayDuration={0} side='right' content={localizedString}>
119
+ <Tabs.TabPrimitive
120
+ className={mx(
121
+ 'group/l0item flex w-full justify-center items-center relative',
122
+ 'dx-app-no-drag dx-focus-ring-group data[type!="collection"]:cursor-pointer',
123
+ l0Breakpoints[item.properties.l0Breakpoint],
124
+ )}
125
+ tabIndex={type === 'tab' ? 0 : undefined}
126
+ data-type={type}
127
+ data-testid={testId}
128
+ data-object-id={id}
129
+ value={item.id}
130
+ onClick={handleClick}
131
+ onMouseEnter={onMouseEnter}
132
+ ref={forwardedRef}
133
+ >
134
+ {children}
135
+ </Tabs.TabPrimitive>
136
+ </Tooltip.Trigger>
137
+ );
138
+ },
139
+ ),
140
140
  );
141
141
 
142
142
  export const L0ItemActiveTabIndicator = ({ classNames }: ThemedClassName<{}>) => (
143
143
  <div
144
144
  role='none'
145
145
  className={mx(
146
- 'hidden group-aria-selected/l0item:block absolute inline-start-0 inset-block-2 is-1 bg-accentSurface rounded-ie',
146
+ 'hidden group-aria-selected/l0item:block absolute start-0 h-6 w-1.5 bg-accent-surface rounded-sm',
147
147
  classNames,
148
148
  )}
149
149
  />
150
150
  );
151
151
 
152
152
  // TODO(burdon): Factor out pinned (non-draggable) items.
153
- const L0Item = ({ item, parent, path, pinned, onRearrange }: L0ItemProps) => {
153
+ const L0Item = memo(({ item, parent, path, pinned, onRearrange, onItemHover }: L0ItemProps) => {
154
154
  const { t } = useTranslation(meta.id);
155
- const itemElement = useRef<HTMLElement | null>(null);
155
+ const itemElement = useRef<HTMLButtonElement | null>(null);
156
156
  const [closestEdge, setEdge] = useState<Edge | null>(null);
157
157
  const localizedString = toLocalizedString(item.properties.label, t);
158
158
  const hue = item.properties.hue ?? null;
159
159
 
160
160
  useLayoutEffect(() => {
161
- // NOTE(thure): This is copied from StackItem, perhaps this should be DRYed out.
162
161
  if (!itemElement.current || !onRearrange) {
163
162
  return;
164
163
  }
@@ -213,17 +212,19 @@ const L0Item = ({ item, parent, path, pinned, onRearrange }: L0ItemProps) => {
213
212
  );
214
213
  }, [item, onRearrange]);
215
214
 
215
+ const handleMouseEnter = useCallback(() => onItemHover?.({ item }), [item, onItemHover]);
216
+
216
217
  return (
217
- <L0ItemRoot ref={itemElement} item={item} parent={parent} path={path}>
218
+ <L0ItemRoot ref={itemElement} item={item} parent={parent} path={path} onMouseEnter={handleMouseEnter}>
218
219
  <div
219
220
  role='none'
220
221
  data-frame={true}
221
- {...(hue && { style: { background: `var(--dx-${hue}Surface)` } })}
222
+ {...(hue && { style: { background: `var(--color-${hue}-surface)` } })}
222
223
  className={mx(
223
- l0ItemContent,
224
+ 'flex justify-center items-center dx-focus-ring-group-indicator transition-colors rounded-sm',
224
225
  pinned
225
- ? 'p-2 group-hover/l0item:bg-activeSurface'
226
- : 'is-[--l0-avatar-size] bs-[--l0-avatar-size] bg-activeSurface',
226
+ ? 'p-2 group-hover/l0item:bg-active-surface'
227
+ : 'w-(--dx-l0-avatar-size) h-(--dx-l0-avatar-size) bg-active-surface',
227
228
  )}
228
229
  >
229
230
  <ItemAvatar item={item} />
@@ -235,17 +236,19 @@ const L0Item = ({ item, parent, path, pinned, onRearrange }: L0ItemProps) => {
235
236
  {closestEdge && <ListItem.DropIndicator edge={closestEdge} />}
236
237
  </L0ItemRoot>
237
238
  );
238
- };
239
+ });
239
240
 
240
241
  const ItemAvatar = ({ item }: Pick<L0ItemProps, 'item'>) => {
241
242
  const { t } = useTranslation(meta.id);
242
- const type = l0ItemType(item);
243
+
244
+ // Actions.
243
245
  if (item.properties.icon) {
244
246
  const hue = item.properties.hue ?? null;
245
- const hueFgStyle = hue && { style: { color: `var(--dx-${hue}SurfaceText)` } };
247
+ const hueFgStyle = hue && { style: { color: `var(--color-${hue}-surface-text)` } };
246
248
  return <Icon icon={item.properties.icon} size={6} {...hueFgStyle} />;
247
249
  }
248
250
 
251
+ const type = l0ItemType(item);
249
252
  if (type === 'tab' && item.properties.disposition !== 'pin-end') {
250
253
  const hue = item.properties.hue ?? null;
251
254
  const localizedString = toLocalizedString(item.properties.label, t);
@@ -256,137 +259,106 @@ const ItemAvatar = ({ item }: Pick<L0ItemProps, 'item'>) => {
256
259
  };
257
260
 
258
261
  //
259
- // L0Collection
262
+ // L0Menu
260
263
  //
261
264
 
262
- const L0Collection = ({ item, path }: L0ItemProps) => {
263
- const navTreeContext = useNavTreeContext();
264
- useLoadDescendents(item);
265
- const collectionItems = navTreeContext.useItems(item);
266
- const groupPath = useMemo(() => [...path, item.id], [item.id, path]);
267
- const { id, testId } = navTreeContext.getProps?.(item, path) ?? {};
265
+ export type L0MenuProps = {
266
+ menuActions: MenuItem[];
267
+ topLevelItems: Node.Node[];
268
+ pinnedItems: Node.Node[];
269
+ userAccountItem?: Node.Node;
270
+ parent?: Node.Node;
271
+ path: string[];
272
+ onItemHover?: (params: { item: Node.Node }) => void;
273
+ };
274
+
275
+ export const L0Menu = ({
276
+ menuActions,
277
+ topLevelItems,
278
+ pinnedItems,
279
+ userAccountItem,
280
+ parent,
281
+ path,
282
+ onItemHover,
283
+ }: L0MenuProps) => {
284
+ const { t } = useTranslation(meta.id);
285
+ const runAction = useActionRunner();
286
+ const handleAction = useCallback(
287
+ (action: Node.Action, params: Node.InvokeProps) => {
288
+ void runAction(action, params);
289
+ },
290
+ [runAction],
291
+ );
268
292
 
269
293
  const handleRearrange = useCallback<StackItemRearrangeHandler<L0ItemData>>(
270
294
  (source, target, closestEdge) => {
271
- invariant(item.properties.onRearrangeChildren);
272
- const sourceIndex = collectionItems.findIndex((i) => i.id === source.id);
273
- const targetIndex = collectionItems.findIndex((i) => i.id === target.id);
295
+ const sourceItem = topLevelItems.find((i) => i.id === source.id);
296
+ if (!sourceItem?.properties.onRearrange) {
297
+ return;
298
+ }
299
+
300
+ const sourceIndex = topLevelItems.findIndex((i) => i.id === source.id);
301
+ const targetIndex = topLevelItems.findIndex((i) => i.id === target.id);
274
302
  const insertIndex =
275
303
  source.id === target.id
276
304
  ? sourceIndex
277
305
  : targetIndex +
278
306
  (sourceIndex < targetIndex ? (closestEdge === 'top' ? -1 : 0) : closestEdge === 'bottom' ? 1 : 0);
279
- const nextOrder = arrayMove([...collectionItems], sourceIndex, insertIndex);
280
- return item.properties.onRearrangeChildren(nextOrder);
307
+ const nextOrder = arrayMove([...topLevelItems], sourceIndex, insertIndex);
308
+ return sourceItem.properties.onRearrange(nextOrder.map((item) => item.data));
281
309
  },
282
- [collectionItems, item.properties.onRearrangeChildren],
310
+ [topLevelItems],
283
311
  );
284
312
 
285
- return (
286
- <div
287
- role='group'
288
- className='contents group/l0c'
289
- aria-labelledby={`${item.id}__label`}
290
- data-object-id={id}
291
- data-testid={testId}
292
- >
293
- {collectionItems.map((collectionItem) => (
294
- <L0Item
295
- key={collectionItem.id}
296
- item={collectionItem}
297
- parent={item}
298
- path={groupPath}
299
- {...(item.properties.onRearrangeChildren && { onRearrange: handleRearrange })}
300
- />
301
- ))}
302
- </div>
303
- );
304
- };
305
-
306
- //
307
- // L0Menu
308
- //
309
-
310
- export type L0MenuProps = {
311
- menuActions: MenuItem[];
312
- topLevelItems: Node<any>[];
313
- pinnedItems: Node<any>[];
314
- userAccountItem?: Node<any>;
315
- parent?: Node<any>;
316
- path: string[];
317
- };
318
-
319
- export const L0Menu = ({ menuActions, topLevelItems, pinnedItems, userAccountItem, parent, path }: L0MenuProps) => {
320
- const { t } = useTranslation(meta.id);
313
+ // Check if any items have onRearrange to enable drag-and-drop.
314
+ const hasRearrangeableItems = topLevelItems.some((item) => item.properties.onRearrange);
321
315
 
322
316
  return (
323
317
  <Tabs.Tablist
318
+ data-tauri-drag-region
324
319
  classNames={[
325
- 'group/l0 absolute z-[1] inset-block-0 inline-start-0 rounded-is',
326
- 'grid grid-cols-[var(--l0-size)] grid-rows-[var(--rail-size)_1fr_min-content_var(--l0-size)] contain-layout',
327
- '!is-[--l0-size] bg-baseSurface border-ie border-subduedSeparator app-drag pbe-[env(safe-area-inset-bottom)]',
320
+ 'group/l0 absolute z-[1] inset-y-0 start-0 rounded-is',
321
+ 'grid grid-cols-[var(--dx-l0-size)] grid-rows-[var(--dx-rail-size)_1fr_min-content_var(--dx-l0-size)] dx-contain-layout',
322
+ 'w-(--dx-l0-size) bg-toolbar-surface dx-app-drag pb-[env(safe-area-inset-bottom)]',
323
+ '[body[data-platform="macos"]_&]:pt-[30px]',
324
+ '[body[data-platform="ios"]_&]:pt-[max(env(safe-area-inset-top),0.25rem)]',
328
325
  ]}
329
326
  >
330
327
  {/* TODO(wittjosiah): Use L0Item trigger. */}
331
- <MenuProvider>
332
- <DropdownMenu.Root group={parent} items={menuActions}>
333
- <Tooltip.Trigger content={t('app menu label')} side='right' asChild>
334
- <Tabs.TabPrimitive value='options' asChild role='button'>
335
- <DropdownMenu.Trigger
336
- data-testid='spacePlugin.addSpace'
337
- className={mx(l0ItemRoot, 'grid place-items-center dx-focus-ring-group')}
338
- >
339
- <div
340
- role='none'
341
- className={mx(
342
- l0ItemContent,
343
- 'is-[--rail-action] bs-[--rail-action] group-hover/l0item:bg-hoverSurface',
344
- )}
345
- >
346
- <Icon icon='ph--list--regular' size={5} />
347
- </div>
348
- </DropdownMenu.Trigger>
349
- </Tabs.TabPrimitive>
350
- </Tooltip.Trigger>
351
- </DropdownMenu.Root>
352
- </MenuProvider>
328
+ <Menu.Root onAction={handleAction}>
329
+ <Menu.Trigger asChild data-testid='spacePlugin.addSpace'>
330
+ <div role='none' className='grid place-items-center'>
331
+ <IconButton variant='ghost' icon='ph--list--regular' iconOnly label={t('app menu label')} />
332
+ </div>
333
+ </Menu.Trigger>
334
+ <Menu.Content group={parent} items={menuActions} />
335
+ </Menu.Root>
353
336
 
354
337
  {/* Space list. */}
355
- <ScrollArea.Root>
356
- <ScrollArea.Viewport>
357
- <div
358
- role='none'
359
- className={mx([
360
- 'flex flex-col gap-1 pbs-1',
361
- '[body[data-platform="darwin"]_&]:pbs-[calc(30px+0.25rem)]',
362
- '[body[data-platform="ios"]_&]:pbs-[max(env(safe-area-inset-top),0.25rem)]',
363
- ])}
364
- >
365
- {topLevelItems.map((item) => {
366
- if (l0ItemType(item) === 'collection') {
367
- return <L0Collection key={item.id} item={item} parent={parent} path={path} />;
368
- } else {
369
- return <L0Item key={item.id} item={item} parent={parent} path={path} />;
370
- }
371
- })}
372
- </div>
373
- <ScrollArea.Scrollbar orientation='vertical'>
374
- <ScrollArea.Thumb />
375
- </ScrollArea.Scrollbar>
338
+ <ScrollArea.Root centered thin orientation='vertical'>
339
+ <ScrollArea.Viewport classNames='flex flex-col gap-2 py-1'>
340
+ {topLevelItems.map((item) => (
341
+ <L0Item
342
+ key={item.id}
343
+ item={item}
344
+ parent={parent}
345
+ path={path}
346
+ onItemHover={onItemHover}
347
+ {...(hasRearrangeableItems && { onRearrange: handleRearrange })}
348
+ />
349
+ ))}
376
350
  </ScrollArea.Viewport>
377
351
  </ScrollArea.Root>
378
352
 
379
353
  {/* Actions. */}
380
- <div role='none' className='grid grid-cols-1 auto-rows-[--rail-action] pbs-2'>
381
- {pinnedItems
382
- .filter((item) => l0ItemType(item) !== 'collection')
383
- .map((item) => (
384
- <L0Item key={item.id} item={item} parent={parent} path={path} pinned />
385
- ))}
354
+ <div role='none' className='grid grid-cols-1 auto-rows-(--dx-rail-action) pt-2'>
355
+ {pinnedItems.map((item) => (
356
+ <L0Item key={item.id} item={item} parent={parent} path={path} pinned />
357
+ ))}
386
358
  </div>
387
359
 
388
360
  {userAccountItem && (
389
- <div role='none' className='grid app-no-drag'>
361
+ <div role='none' className='grid dx-app-no-drag'>
390
362
  <L0ItemRoot key={userAccountItem.id} item={userAccountItem} parent={parent} path={path}>
391
363
  <UserAccountAvatar
392
364
  userId={userAccountItem.properties.userId}
@@ -398,14 +370,6 @@ export const L0Menu = ({ menuActions, topLevelItems, pinnedItems, userAccountIte
398
370
  </L0ItemRoot>
399
371
  </div>
400
372
  )}
401
- <div
402
- role='none'
403
- className='hidden [body[data-platform="darwin"]_&]:block absolute block-start-0 is-[calc(var(--l0-size)-1px)] bs-[calc(40px+0.25rem)]'
404
- style={{
405
- background:
406
- 'linear-gradient(to bottom, var(--dx-sidebarSurface) 0%, var(--dx-sidebarSurface) 70%, transparent 100%)',
407
- }}
408
- />
409
373
  </Tabs.Tablist>
410
374
  );
411
375
  };