@dxos/plugin-navtree 0.8.4-main.bc674ce → 0.8.4-main.c351d160a8

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 (165) hide show
  1. package/dist/lib/browser/CommandsDialogContent-2DKIOLJL.mjs +113 -0
  2. package/dist/lib/browser/CommandsDialogContent-2DKIOLJL.mjs.map +7 -0
  3. package/dist/lib/browser/CommandsTrigger-ABODVVMP.mjs +33 -0
  4. package/dist/lib/browser/CommandsTrigger-ABODVVMP.mjs.map +7 -0
  5. package/dist/lib/browser/NavTreeContainer-IQZCK4Y4.mjs +12 -0
  6. package/dist/lib/browser/NavTreeContainer-IQZCK4Y4.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-RSMA6I22.mjs → app-graph-builder-Z43OTNI2.mjs} +6 -5
  10. package/dist/lib/browser/app-graph-builder-Z43OTNI2.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-YKTYPINZ.mjs → chunk-A4VDCIJC.mjs} +3 -3
  12. package/dist/lib/browser/{chunk-YKTYPINZ.mjs.map → chunk-A4VDCIJC.mjs.map} +1 -1
  13. package/dist/lib/browser/chunk-DINDC6HE.mjs +14 -0
  14. package/dist/lib/browser/chunk-DINDC6HE.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-AGQDZBPL.mjs → chunk-KF26WA4O.mjs} +5 -5
  16. package/dist/lib/browser/{chunk-AGQDZBPL.mjs.map → chunk-KF26WA4O.mjs.map} +3 -3
  17. package/dist/lib/browser/chunk-OGUYILOW.mjs +1462 -0
  18. package/dist/lib/browser/chunk-OGUYILOW.mjs.map +7 -0
  19. package/dist/lib/browser/index.mjs +35 -31
  20. package/dist/lib/browser/index.mjs.map +3 -3
  21. package/dist/lib/browser/{keyboard-32EH3N4K.mjs → keyboard-HYGFQO7T.mjs} +11 -6
  22. package/dist/lib/browser/keyboard-HYGFQO7T.mjs.map +7 -0
  23. package/dist/lib/browser/meta.json +1 -1
  24. package/dist/lib/browser/operation-resolver-VDWVUII5.mjs +49 -0
  25. package/dist/lib/browser/operation-resolver-VDWVUII5.mjs.map +7 -0
  26. package/dist/lib/browser/{react-surface-F6CVMS3Y.mjs → react-surface-LFMKIKNY.mjs} +15 -14
  27. package/dist/lib/browser/react-surface-LFMKIKNY.mjs.map +7 -0
  28. package/dist/lib/browser/{state-EVYQOUI3.mjs → state-CWMNNF7K.mjs} +34 -23
  29. package/dist/lib/browser/state-CWMNNF7K.mjs.map +7 -0
  30. package/dist/types/src/NavTreePlugin.d.ts.map +1 -1
  31. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +1 -1
  32. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -1
  33. package/dist/types/src/capabilities/keyboard/keyboard.d.ts +1 -1
  34. package/dist/types/src/capabilities/keyboard/keyboard.d.ts.map +1 -1
  35. package/dist/types/src/capabilities/operation-resolver/index.d.ts +1 -1
  36. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -1
  37. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +2 -2
  38. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -1
  39. package/dist/types/src/capabilities/react-surface/index.d.ts +1 -1
  40. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -1
  41. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +2 -2
  42. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -1
  43. package/dist/types/src/capabilities/state/state.d.ts +1 -1
  44. package/dist/types/src/capabilities/state/state.d.ts.map +1 -1
  45. package/dist/types/src/components/NavTree/NavTree.d.ts +10 -32
  46. package/dist/types/src/components/NavTree/NavTree.d.ts.map +1 -1
  47. package/dist/types/src/components/NavTree/NavTree.stories.d.ts +2 -5
  48. package/dist/types/src/components/NavTree/NavTree.stories.d.ts.map +1 -1
  49. package/dist/types/src/components/{NavTreeContext.d.ts → NavTreeContext/NavTreeContext.d.ts} +1 -1
  50. package/dist/types/src/components/NavTreeContext/NavTreeContext.d.ts.map +1 -0
  51. package/dist/types/src/components/NavTreeContext/index.d.ts +2 -0
  52. package/dist/types/src/components/NavTreeContext/index.d.ts.map +1 -0
  53. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts +4 -2
  54. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts.map +1 -1
  55. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.stories.d.ts +1 -1
  56. package/dist/types/src/components/NavTreeItem/NavTreeItemColumns.d.ts.map +1 -1
  57. package/dist/types/src/components/Sidebar/L0Menu.d.ts +4 -1
  58. package/dist/types/src/components/Sidebar/L0Menu.d.ts.map +1 -1
  59. package/dist/types/src/components/Sidebar/L1Panel.d.ts +3 -6
  60. package/dist/types/src/components/Sidebar/L1Panel.d.ts.map +1 -1
  61. package/dist/types/src/components/Sidebar/L1Tabs.d.ts +3 -2
  62. package/dist/types/src/components/Sidebar/L1Tabs.d.ts.map +1 -1
  63. package/dist/types/src/components/UserAccountAvatar/UserAccountAvatar.stories.d.ts.map +1 -1
  64. package/dist/types/src/components/index.d.ts +0 -3
  65. package/dist/types/src/components/index.d.ts.map +1 -1
  66. package/dist/types/src/components/types.d.ts +5 -13
  67. package/dist/types/src/components/types.d.ts.map +1 -1
  68. package/dist/types/src/{components/CommandsDialog/CommandsDialog.d.ts → containers/CommandsDialogContent/CommandsDialogContent.d.ts} +1 -1
  69. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.d.ts.map +1 -0
  70. package/dist/types/src/containers/CommandsDialogContent/index.d.ts +3 -0
  71. package/dist/types/src/containers/CommandsDialogContent/index.d.ts.map +1 -0
  72. package/dist/types/src/containers/CommandsTrigger/CommandsTrigger.d.ts.map +1 -0
  73. package/dist/types/src/containers/CommandsTrigger/index.d.ts +3 -0
  74. package/dist/types/src/containers/CommandsTrigger/index.d.ts.map +1 -0
  75. package/dist/types/src/containers/NavTreeContainer/NavTreeContainer.d.ts +9 -0
  76. package/dist/types/src/containers/NavTreeContainer/NavTreeContainer.d.ts.map +1 -0
  77. package/dist/types/src/containers/NavTreeContainer/index.d.ts +3 -0
  78. package/dist/types/src/containers/NavTreeContainer/index.d.ts.map +1 -0
  79. package/dist/types/src/containers/NavTreeDocumentTitle/NavTreeDocumentTitle.d.ts.map +1 -0
  80. package/dist/types/src/containers/NavTreeDocumentTitle/index.d.ts +3 -0
  81. package/dist/types/src/containers/NavTreeDocumentTitle/index.d.ts.map +1 -0
  82. package/dist/types/src/containers/index.d.ts +7 -0
  83. package/dist/types/src/containers/index.d.ts.map +1 -0
  84. package/dist/types/src/experimental/Tree.stories.d.ts +18 -4
  85. package/dist/types/src/experimental/Tree.stories.d.ts.map +1 -1
  86. package/dist/types/src/hooks/index.d.ts +5 -0
  87. package/dist/types/src/hooks/index.d.ts.map +1 -0
  88. package/dist/types/src/hooks/useActions.d.ts +5 -0
  89. package/dist/types/src/hooks/useActions.d.ts.map +1 -0
  90. package/dist/types/src/hooks/useLoadDescendents.d.ts +6 -0
  91. package/dist/types/src/hooks/useLoadDescendents.d.ts.map +1 -0
  92. package/dist/types/src/hooks/useNavTreeModel.d.ts +7 -0
  93. package/dist/types/src/hooks/useNavTreeModel.d.ts.map +1 -0
  94. package/dist/types/src/{hooks.d.ts → hooks/useNavTreeState.d.ts} +2 -14
  95. package/dist/types/src/hooks/useNavTreeState.d.ts.map +1 -0
  96. package/dist/types/src/meta.d.ts.map +1 -1
  97. package/dist/types/src/testing/generator.d.ts +3 -3
  98. package/dist/types/src/testing/generator.d.ts.map +1 -1
  99. package/dist/types/src/types/events.d.ts.map +1 -1
  100. package/dist/types/src/util.d.ts +5 -1
  101. package/dist/types/src/util.d.ts.map +1 -1
  102. package/dist/types/tsconfig.tsbuildinfo +1 -1
  103. package/package.json +43 -42
  104. package/src/NavTreePlugin.tsx +22 -24
  105. package/src/capabilities/app-graph-builder/app-graph-builder.ts +4 -3
  106. package/src/capabilities/keyboard/keyboard.ts +6 -5
  107. package/src/capabilities/operation-resolver/operation-resolver.ts +23 -19
  108. package/src/capabilities/react-surface/react-surface.tsx +12 -13
  109. package/src/capabilities/state/state.ts +41 -13
  110. package/src/components/NavTree/NavTree.stories.tsx +20 -18
  111. package/src/components/NavTree/NavTree.tsx +61 -20
  112. package/src/components/{NavTreeContext.tsx → NavTreeContext/NavTreeContext.tsx} +1 -1
  113. package/src/components/NavTreeContext/index.ts +5 -0
  114. package/src/components/NavTreeItem/NavTreeItemAction.stories.tsx +2 -2
  115. package/src/components/NavTreeItem/NavTreeItemAction.tsx +40 -23
  116. package/src/components/NavTreeItem/NavTreeItemColumns.tsx +40 -14
  117. package/src/components/Sidebar/L0Menu.tsx +80 -83
  118. package/src/components/Sidebar/L1Panel.tsx +244 -90
  119. package/src/components/Sidebar/L1Tabs.tsx +13 -3
  120. package/src/components/UserAccountAvatar/UserAccountAvatar.stories.tsx +2 -3
  121. package/src/components/UserAccountAvatar/UserAccountAvatar.tsx +1 -1
  122. package/src/components/index.ts +0 -3
  123. package/src/components/types.ts +12 -17
  124. package/src/{components/CommandsDialog/CommandsDialog.tsx → containers/CommandsDialogContent/CommandsDialogContent.tsx} +19 -13
  125. package/src/containers/CommandsDialogContent/index.ts +7 -0
  126. package/src/{components/CommandsDialog → containers/CommandsTrigger}/CommandsTrigger.tsx +4 -4
  127. package/src/containers/CommandsTrigger/index.ts +7 -0
  128. package/src/{components → containers/NavTreeContainer}/NavTreeContainer.tsx +75 -141
  129. package/src/containers/NavTreeContainer/index.ts +6 -0
  130. package/src/{components → containers/NavTreeDocumentTitle}/NavTreeDocumentTitle.tsx +1 -1
  131. package/src/containers/NavTreeDocumentTitle/index.ts +7 -0
  132. package/src/containers/index.ts +12 -0
  133. package/src/experimental/Tree.stories.tsx +54 -57
  134. package/src/experimental/Tree.tsx +3 -3
  135. package/src/hooks/index.ts +8 -0
  136. package/src/hooks/useActions.ts +34 -0
  137. package/src/hooks/useLoadDescendents.ts +23 -0
  138. package/src/hooks/useNavTreeModel.ts +118 -0
  139. package/src/{hooks.ts → hooks/useNavTreeState.ts} +3 -34
  140. package/src/meta.ts +2 -2
  141. package/src/testing/app-graph-builder.ts +5 -5
  142. package/src/testing/generator.ts +4 -4
  143. package/src/types/capabilities.ts +1 -1
  144. package/src/types/events.ts +3 -2
  145. package/src/util.ts +18 -4
  146. package/dist/lib/browser/app-graph-builder-RSMA6I22.mjs.map +0 -7
  147. package/dist/lib/browser/chunk-6YPQ625I.mjs +0 -1293
  148. package/dist/lib/browser/chunk-6YPQ625I.mjs.map +0 -7
  149. package/dist/lib/browser/keyboard-32EH3N4K.mjs.map +0 -7
  150. package/dist/lib/browser/operation-resolver-IB75DC5O.mjs +0 -52
  151. package/dist/lib/browser/operation-resolver-IB75DC5O.mjs.map +0 -7
  152. package/dist/lib/browser/react-surface-F6CVMS3Y.mjs.map +0 -7
  153. package/dist/lib/browser/state-EVYQOUI3.mjs.map +0 -7
  154. package/dist/types/src/components/CommandsDialog/CommandsDialog.d.ts.map +0 -1
  155. package/dist/types/src/components/CommandsDialog/CommandsTrigger.d.ts.map +0 -1
  156. package/dist/types/src/components/CommandsDialog/index.d.ts +0 -3
  157. package/dist/types/src/components/CommandsDialog/index.d.ts.map +0 -1
  158. package/dist/types/src/components/NavTreeContainer.d.ts +0 -16
  159. package/dist/types/src/components/NavTreeContainer.d.ts.map +0 -1
  160. package/dist/types/src/components/NavTreeContext.d.ts.map +0 -1
  161. package/dist/types/src/components/NavTreeDocumentTitle.d.ts.map +0 -1
  162. package/dist/types/src/hooks.d.ts.map +0 -1
  163. package/src/components/CommandsDialog/index.ts +0 -6
  164. /package/dist/types/src/{components/CommandsDialog → containers/CommandsTrigger}/CommandsTrigger.d.ts +0 -0
  165. /package/dist/types/src/{components → containers/NavTreeDocumentTitle}/NavTreeDocumentTitle.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,
@@ -27,6 +29,7 @@ import { DxAvatar } from '@dxos/lit-ui/react';
27
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,7 +38,7 @@ 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
44
  import { mx } from '@dxos/ui-theme';
@@ -60,6 +63,7 @@ type L0ItemRootProps = {
60
63
  item: Node.Node;
61
64
  parent?: Node.Node;
62
65
  path: string[];
66
+ onMouseEnter?: () => void;
63
67
  };
64
68
 
65
69
  type L0ItemProps = L0ItemRootProps & {
@@ -68,10 +72,11 @@ type L0ItemProps = L0ItemRootProps & {
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, onSelect, onTabChange } = useNavTreeContext();
79
+ const { onSelect, onTabChange } = useNavTreeContext();
75
80
  const { getItem } = useNavTreeState();
76
81
  const [isLg] = useMediaQuery('lg');
77
82
  const runAction = useActionRunner();
@@ -81,17 +86,15 @@ const useL0ItemClick = ({ item, parent, path }: L0ItemProps, type: string) => {
81
86
  switch (type) {
82
87
  case 'action': {
83
88
  const { properties: { caller } = {} } = item;
84
- return void runAction(item as Node.Action, caller ? { parent, caller } : { parent });
89
+ return void runAction(item as Node.Action, caller ? { parent, path, caller } : { parent, path });
85
90
  }
86
-
87
91
  case 'tab':
88
92
  return onTabChange?.(item);
89
-
90
93
  case 'link':
91
94
  return onSelect?.({ item, path, current: !getItem(path).current, option: event.altKey });
92
95
  }
93
96
  },
94
- [item, parent, type, tab, getItem, onSelect, onTabChange, isLg, runAction],
97
+ [item, parent, type, getItem, onSelect, onTabChange, isLg, runAction],
95
98
  );
96
99
  };
97
100
 
@@ -100,53 +103,56 @@ const l0Breakpoints: Record<string, string> = {
100
103
  };
101
104
 
102
105
  const l0ItemRoot =
103
- 'group/l0item flex is-full justify-center items-center relative data[type!="collection"]:cursor-pointer app-no-drag dx-focus-ring-group';
106
+ 'group/l0item flex w-full justify-center items-center relative data[type!="collection"]:cursor-pointer dx-app-no-drag dx-focus-ring-group';
104
107
 
105
108
  const l0ItemContent = 'flex justify-center items-center dx-focus-ring-group-indicator transition-colors rounded-sm';
106
109
 
107
- const L0ItemRoot = forwardRef<HTMLElement, PropsWithChildren<L0ItemRootProps>>(
108
- ({ item, parent, path, children }, forwardedRef) => {
109
- const { getProps } = useNavTreeContext();
110
- const { id, testId } = getProps?.(item, path) ?? {};
111
- const type = l0ItemType(item);
112
- const itemPath = useMemo(() => [...path, item.id], [item.id, path]);
113
-
114
- const { t } = useTranslation(meta.id);
115
- const localizedString = toLocalizedString(item.properties.label, t);
116
-
117
- const handleClick = useL0ItemClick({ item, parent, path: itemPath }, type);
118
- const rootProps =
119
- type === 'tab'
120
- ? { value: item.id, tabIndex: 0, onClick: handleClick, 'data-testid': testId, 'data-object-id': id }
121
- : { onClick: handleClick, 'data-testid': testId, 'data-object-id': id };
122
-
123
- return (
124
- <Tooltip.Trigger asChild delayDuration={0} side='right' content={localizedString}>
125
- <Tabs.TabPrimitive
126
- {...(rootProps as any)}
127
- data-type={type}
128
- className={mx(l0ItemRoot, l0Breakpoints[item.properties.l0Breakpoint])}
129
- ref={forwardedRef}
130
- >
131
- {children}
132
- </Tabs.TabPrimitive>
133
- </Tooltip.Trigger>
134
- );
135
- },
110
+ const L0ItemRoot = memo(
111
+ forwardRef<HTMLElement, PropsWithChildren<L0ItemRootProps>>(
112
+ ({ item, parent, path, onMouseEnter, children }, forwardedRef) => {
113
+ const { model } = useNavTreeContext();
114
+ const itemPath = useMemo(() => [...path, item.id], [item.id, path]);
115
+ const { id, testId } = useAtomValue(model.itemProps(itemPath));
116
+ const type = l0ItemType(item);
117
+
118
+ const { t } = useTranslation(meta.id);
119
+ const localizedString = toLocalizedString(item.properties.label, t);
120
+
121
+ const handleClick = useL0ItemClick({ item, parent, path: itemPath }, type);
122
+ const rootProps =
123
+ type === 'tab'
124
+ ? { value: item.id, tabIndex: 0, onClick: handleClick, 'data-testid': testId, 'data-object-id': id }
125
+ : { onClick: handleClick, 'data-testid': testId, 'data-object-id': id };
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
+ onMouseEnter={onMouseEnter}
135
+ >
136
+ {children}
137
+ </Tabs.TabPrimitive>
138
+ </Tooltip.Trigger>
139
+ );
140
+ },
141
+ ),
136
142
  );
137
143
 
138
144
  export const L0ItemActiveTabIndicator = ({ classNames }: ThemedClassName<{}>) => (
139
145
  <div
140
146
  role='none'
141
147
  className={mx(
142
- 'hidden group-aria-selected/l0item:block absolute inline-start-0 inset-block-2 is-1 bg-accentSurface rounded-ie',
148
+ 'hidden group-aria-selected/l0item:block absolute start-0 inset-y-2 w-1 bg-accent-surface rounded-ie',
143
149
  classNames,
144
150
  )}
145
151
  />
146
152
  );
147
153
 
148
154
  // TODO(burdon): Factor out pinned (non-draggable) items.
149
- const L0Item = ({ item, parent, path, pinned, onRearrange }: L0ItemProps) => {
155
+ const L0Item = memo(({ item, parent, path, pinned, onRearrange, onItemHover }: L0ItemProps) => {
150
156
  const { t } = useTranslation(meta.id);
151
157
  const itemElement = useRef<HTMLElement | null>(null);
152
158
  const [closestEdge, setEdge] = useState<Edge | null>(null);
@@ -209,17 +215,19 @@ const L0Item = ({ item, parent, path, pinned, onRearrange }: L0ItemProps) => {
209
215
  );
210
216
  }, [item, onRearrange]);
211
217
 
218
+ const handleMouseEnter = useCallback(() => onItemHover?.({ item }), [item, onItemHover]);
219
+
212
220
  return (
213
- <L0ItemRoot ref={itemElement} item={item} parent={parent} path={path}>
221
+ <L0ItemRoot ref={itemElement} item={item} parent={parent} path={path} onMouseEnter={handleMouseEnter}>
214
222
  <div
215
223
  role='none'
216
224
  data-frame={true}
217
- {...(hue && { style: { background: `var(--dx-${hue}Surface)` } })}
225
+ {...(hue && { style: { background: `var(--color-${hue}-surface)` } })}
218
226
  className={mx(
219
227
  l0ItemContent,
220
228
  pinned
221
- ? 'p-2 group-hover/l0item:bg-activeSurface'
222
- : 'is-[--l0-avatar-size] bs-[--l0-avatar-size] bg-activeSurface',
229
+ ? 'p-2 group-hover/l0item:bg-active-surface'
230
+ : 'w-(--dx-l0-avatar-size) h-(--dx-l0-avatar-size) bg-active-surface',
223
231
  )}
224
232
  >
225
233
  <ItemAvatar item={item} />
@@ -231,14 +239,14 @@ const L0Item = ({ item, parent, path, pinned, onRearrange }: L0ItemProps) => {
231
239
  {closestEdge && <ListItem.DropIndicator edge={closestEdge} />}
232
240
  </L0ItemRoot>
233
241
  );
234
- };
242
+ });
235
243
 
236
244
  const ItemAvatar = ({ item }: Pick<L0ItemProps, 'item'>) => {
237
245
  const { t } = useTranslation(meta.id);
238
246
  const type = l0ItemType(item);
239
247
  if (item.properties.icon) {
240
248
  const hue = item.properties.hue ?? null;
241
- const hueFgStyle = hue && { style: { color: `var(--dx-${hue}SurfaceText)` } };
249
+ const hueFgStyle = hue && { style: { color: `var(--color-${hue}-surface-text)` } };
242
250
  return <Icon icon={item.properties.icon} size={6} {...hueFgStyle} />;
243
251
  }
244
252
 
@@ -262,9 +270,18 @@ export type L0MenuProps = {
262
270
  userAccountItem?: Node.Node;
263
271
  parent?: Node.Node;
264
272
  path: string[];
273
+ onItemHover?: (params: { item: Node.Node }) => void;
265
274
  };
266
275
 
267
- export const L0Menu = ({ menuActions, topLevelItems, pinnedItems, userAccountItem, parent, path }: L0MenuProps) => {
276
+ export const L0Menu = ({
277
+ menuActions,
278
+ topLevelItems,
279
+ pinnedItems,
280
+ userAccountItem,
281
+ parent,
282
+ path,
283
+ onItemHover,
284
+ }: L0MenuProps) => {
268
285
  const { t } = useTranslation(meta.id);
269
286
  const runAction = useActionRunner();
270
287
  const handleAction = useCallback(
@@ -300,48 +317,30 @@ export const L0Menu = ({ menuActions, topLevelItems, pinnedItems, userAccountIte
300
317
  return (
301
318
  <Tabs.Tablist
302
319
  classNames={[
303
- 'group/l0 absolute z-[1] inset-block-0 inline-start-0 rounded-is',
304
- 'grid grid-cols-[var(--l0-size)] grid-rows-[var(--rail-size)_1fr_min-content_var(--l0-size)] contain-layout',
305
- '!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 border-e border-subdued-separator dx-app-drag pb-[env(safe-area-inset-bottom)]',
306
323
  ]}
307
324
  >
308
325
  {/* TODO(wittjosiah): Use L0Item trigger. */}
309
- <MenuProvider onAction={handleAction}>
310
- <DropdownMenu.Root group={parent} items={menuActions}>
311
- <Tooltip.Trigger content={t('app menu label')} side='right' asChild>
312
- <Tabs.TabPrimitive value='options' asChild role='button'>
313
- <DropdownMenu.Trigger
314
- data-testid='spacePlugin.addSpace'
315
- className={mx(
316
- l0ItemRoot,
317
- 'grid place-items-center dx-focus-ring-group',
318
- '[body[data-platform="macos"]_&]:mt-[30px]',
319
- )}
320
- >
321
- <div
322
- role='none'
323
- className={mx(
324
- l0ItemContent,
325
- 'is-[--rail-action] bs-[--rail-action] group-hover/l0item:bg-hoverSurface',
326
- )}
327
- >
328
- <Icon icon='ph--list--regular' size={5} />
329
- </div>
330
- </DropdownMenu.Trigger>
331
- </Tabs.TabPrimitive>
332
- </Tooltip.Trigger>
333
- </DropdownMenu.Root>
334
- </MenuProvider>
326
+ <Menu.Root onAction={handleAction}>
327
+ <Menu.Trigger asChild data-testid='spacePlugin.addSpace'>
328
+ <div role='none' className='grid place-items-center'>
329
+ <IconButton variant='ghost' icon='ph--list--regular' iconOnly label={t('app menu label')} size={5} />
330
+ </div>
331
+ </Menu.Trigger>
332
+ <Menu.Content group={parent} items={menuActions} />
333
+ </Menu.Root>
335
334
 
336
335
  {/* Space list. */}
337
- <ScrollArea.Root>
336
+ <ScrollArea.Root thin orientation='vertical'>
338
337
  <ScrollArea.Viewport>
339
338
  <div
340
339
  role='none'
341
340
  className={mx([
342
- 'flex flex-col gap-1 pbs-1',
343
- '[body[data-platform="macos"]_&]:pbs-[30px]',
344
- '[body[data-platform="ios"]_&]:pbs-[max(env(safe-area-inset-top),0.25rem)]',
341
+ 'flex flex-col gap-2 pt-1',
342
+ '[body[data-platform="macos"]_&]:py-[30px]',
343
+ '[body[data-platform="ios"]_&]:py-[max(env(safe-area-inset-top),0.25rem)]',
345
344
  ])}
346
345
  >
347
346
  {topLevelItems.map((item) => (
@@ -350,25 +349,23 @@ export const L0Menu = ({ menuActions, topLevelItems, pinnedItems, userAccountIte
350
349
  item={item}
351
350
  parent={parent}
352
351
  path={path}
352
+ onItemHover={onItemHover}
353
353
  {...(hasRearrangeableItems && { onRearrange: handleRearrange })}
354
354
  />
355
355
  ))}
356
356
  </div>
357
- <ScrollArea.Scrollbar orientation='vertical'>
358
- <ScrollArea.Thumb />
359
- </ScrollArea.Scrollbar>
360
357
  </ScrollArea.Viewport>
361
358
  </ScrollArea.Root>
362
359
 
363
360
  {/* Actions. */}
364
- <div role='none' className='grid grid-cols-1 auto-rows-[--rail-action] pbs-2'>
361
+ <div role='none' className='grid grid-cols-1 auto-rows-(--dx-rail-action) pt-2'>
365
362
  {pinnedItems.map((item) => (
366
363
  <L0Item key={item.id} item={item} parent={parent} path={path} pinned />
367
364
  ))}
368
365
  </div>
369
366
 
370
367
  {userAccountItem && (
371
- <div role='none' className='grid app-no-drag'>
368
+ <div role='none' className='grid dx-app-no-drag'>
372
369
  <L0ItemRoot key={userAccountItem.id} item={userAccountItem} parent={parent} path={path}>
373
370
  <UserAccountAvatar
374
371
  userId={userAccountItem.properties.userId}