@dxos/plugin-navtree 0.8.4-main.72ec0f3 → 0.8.4-main.74a063c4e0
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.
- package/dist/lib/browser/index.mjs +168 -112
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/types/src/NavTreePlugin.d.ts +2 -1
- package/dist/types/src/NavTreePlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +7 -108
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/keyboard.d.ts +3 -2
- package/dist/types/src/capabilities/keyboard.d.ts.map +1 -1
- package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
- package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-surface.d.ts +3 -2
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/state.d.ts +4 -18
- package/dist/types/src/capabilities/state.d.ts.map +1 -1
- package/dist/types/src/components/NavTree/NavTree.d.ts +11 -4
- package/dist/types/src/components/NavTree/NavTree.d.ts.map +1 -1
- package/dist/types/src/components/NavTree/NavTree.stories.d.ts +10 -11
- package/dist/types/src/components/NavTree/NavTree.stories.d.ts.map +1 -1
- package/dist/types/src/components/{NavTreeContext.d.ts → NavTreeContext/NavTreeContext.d.ts} +1 -1
- package/dist/types/src/components/NavTreeContext/NavTreeContext.d.ts.map +1 -0
- package/dist/types/src/components/NavTreeContext/index.d.ts +2 -0
- package/dist/types/src/components/NavTreeContext/index.d.ts.map +1 -0
- package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts +17 -9
- package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts.map +1 -1
- package/dist/types/src/components/NavTreeItem/NavTreeItemAction.stories.d.ts +3 -2
- package/dist/types/src/components/NavTreeItem/NavTreeItemAction.stories.d.ts.map +1 -1
- package/dist/types/src/components/NavTreeItem/NavTreeItemColumns.d.ts.map +1 -1
- package/dist/types/src/components/Sidebar/L0Menu.d.ts +8 -5
- package/dist/types/src/components/Sidebar/L0Menu.d.ts.map +1 -1
- package/dist/types/src/components/Sidebar/L1Panel.d.ts +4 -7
- package/dist/types/src/components/Sidebar/L1Panel.d.ts.map +1 -1
- package/dist/types/src/components/Sidebar/L1Tabs.d.ts +5 -4
- package/dist/types/src/components/Sidebar/L1Tabs.d.ts.map +1 -1
- package/dist/types/src/components/UserAccountAvatar/UserAccountAvatar.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +0 -3
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/components/types.d.ts +8 -16
- package/dist/types/src/components/types.d.ts.map +1 -1
- package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.d.ts +6 -0
- package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.d.ts.map +1 -0
- package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.stories.d.ts +29 -0
- package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.stories.d.ts.map +1 -0
- package/dist/types/src/containers/CommandsDialogContent/index.d.ts +2 -0
- package/dist/types/src/containers/CommandsDialogContent/index.d.ts.map +1 -0
- package/dist/types/src/containers/CommandsTrigger/CommandsTrigger.d.ts.map +1 -0
- package/dist/types/src/containers/CommandsTrigger/index.d.ts +2 -0
- package/dist/types/src/containers/CommandsTrigger/index.d.ts.map +1 -0
- package/dist/types/src/containers/NavTreeContainer/NavTreeContainer.d.ts +9 -0
- package/dist/types/src/containers/NavTreeContainer/NavTreeContainer.d.ts.map +1 -0
- package/dist/types/src/containers/NavTreeContainer/index.d.ts +3 -0
- package/dist/types/src/containers/NavTreeContainer/index.d.ts.map +1 -0
- package/dist/types/src/{components → containers/NavTreeDocumentTitle}/NavTreeDocumentTitle.d.ts +1 -1
- package/dist/types/src/containers/NavTreeDocumentTitle/NavTreeDocumentTitle.d.ts.map +1 -0
- package/dist/types/src/containers/NavTreeDocumentTitle/index.d.ts +2 -0
- package/dist/types/src/containers/NavTreeDocumentTitle/index.d.ts.map +1 -0
- package/dist/types/src/containers/index.d.ts +7 -0
- package/dist/types/src/containers/index.d.ts.map +1 -0
- package/dist/types/src/experimental/Tree.stories.d.ts +18 -4
- package/dist/types/src/experimental/Tree.stories.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +5 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -0
- package/dist/types/src/hooks/useActions.d.ts +5 -0
- package/dist/types/src/hooks/useActions.d.ts.map +1 -0
- package/dist/types/src/hooks/useLoadDescendents.d.ts +6 -0
- package/dist/types/src/hooks/useLoadDescendents.d.ts.map +1 -0
- package/dist/types/src/hooks/useNavTreeModel.d.ts +7 -0
- package/dist/types/src/hooks/useNavTreeModel.d.ts.map +1 -0
- package/dist/types/src/hooks/useNavTreeState.d.ts +22 -0
- package/dist/types/src/hooks/useNavTreeState.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +1 -2
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +2 -2
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/operations/expose.d.ts +5 -0
- package/dist/types/src/operations/expose.d.ts.map +1 -0
- package/dist/types/src/operations/index.d.ts +3 -0
- package/dist/types/src/operations/index.d.ts.map +1 -0
- package/dist/types/src/testing/app-graph-builder.d.ts +2 -3
- package/dist/types/src/testing/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/testing/generator.d.ts +5 -6
- package/dist/types/src/testing/generator.d.ts.map +1 -1
- package/dist/types/src/testing/update-state.d.ts +2 -2
- package/dist/types/src/testing/update-state.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +9 -10
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/capabilities.d.ts +16 -0
- package/dist/types/src/types/capabilities.d.ts.map +1 -0
- package/dist/types/src/types/events.d.ts +5 -0
- package/dist/types/src/types/events.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +4 -0
- package/dist/types/src/types/index.d.ts.map +1 -0
- package/dist/types/src/{types.d.ts → types/schema.d.ts} +6 -6
- package/dist/types/src/types/schema.d.ts.map +1 -0
- package/dist/types/src/util.d.ts +12 -8
- package/dist/types/src/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +66 -54
- package/src/NavTreePlugin.tsx +56 -74
- package/src/capabilities/app-graph-builder.ts +34 -45
- package/src/capabilities/index.ts +10 -8
- package/src/capabilities/keyboard.ts +58 -51
- package/src/capabilities/operation-handler.ts +16 -0
- package/src/capabilities/react-surface.tsx +46 -37
- package/src/capabilities/state.ts +128 -84
- package/src/components/NavTree/NavTree.stories.tsx +48 -54
- package/src/components/NavTree/NavTree.tsx +65 -33
- package/src/components/{NavTreeContext.tsx → NavTreeContext/NavTreeContext.tsx} +1 -1
- package/src/components/NavTreeContext/index.ts +5 -0
- package/src/components/NavTreeItem/NavTreeItemAction.stories.tsx +23 -15
- package/src/components/NavTreeItem/NavTreeItemAction.tsx +67 -44
- package/src/components/NavTreeItem/NavTreeItemColumns.tsx +45 -19
- package/src/components/Sidebar/L0Menu.tsx +147 -182
- package/src/components/Sidebar/L1Panel.tsx +256 -95
- package/src/components/Sidebar/L1Tabs.tsx +18 -34
- package/src/components/UserAccountAvatar/UserAccountAvatar.stories.tsx +2 -3
- package/src/components/UserAccountAvatar/UserAccountAvatar.tsx +1 -1
- package/src/components/index.ts +1 -3
- package/src/components/types.ts +14 -19
- package/src/containers/CommandsDialogContent/CommandsDialogContent.stories.tsx +45 -0
- package/src/containers/CommandsDialogContent/CommandsDialogContent.tsx +131 -0
- package/src/containers/CommandsDialogContent/index.ts +5 -0
- package/src/containers/CommandsTrigger/CommandsTrigger.tsx +28 -0
- package/src/containers/CommandsTrigger/index.ts +5 -0
- package/src/containers/NavTreeContainer/NavTreeContainer.tsx +280 -0
- package/src/containers/NavTreeContainer/index.ts +6 -0
- package/src/{components → containers/NavTreeDocumentTitle}/NavTreeDocumentTitle.tsx +4 -3
- package/src/containers/NavTreeDocumentTitle/index.ts +5 -0
- package/src/containers/index.ts +12 -0
- package/src/experimental/Tree.stories.tsx +82 -85
- package/src/experimental/Tree.tsx +4 -4
- package/src/hooks/index.ts +8 -0
- package/src/hooks/useActions.ts +34 -0
- package/src/hooks/useLoadDescendents.ts +23 -0
- package/src/hooks/useNavTreeModel.ts +118 -0
- package/src/hooks/useNavTreeState.ts +42 -0
- package/src/index.ts +1 -2
- package/src/meta.ts +4 -4
- package/src/operations/expose.ts +42 -0
- package/src/operations/index.ts +7 -0
- package/src/testing/app-graph-builder.ts +166 -238
- package/src/testing/generator.ts +40 -38
- package/src/testing/update-state.ts +6 -6
- package/src/translations.ts +9 -10
- package/src/types/capabilities.ts +21 -0
- package/src/types/events.ts +12 -0
- package/src/types/index.ts +7 -0
- package/src/{types.ts → types/schema.ts} +5 -5
- package/src/util.ts +28 -17
- package/dist/lib/browser/app-graph-builder-OHSCN3GX.mjs +0 -46
- package/dist/lib/browser/app-graph-builder-OHSCN3GX.mjs.map +0 -7
- package/dist/lib/browser/chunk-5VLWX4PK.mjs +0 -15
- package/dist/lib/browser/chunk-5VLWX4PK.mjs.map +0 -7
- package/dist/lib/browser/chunk-7D2MPHXV.mjs +0 -1483
- package/dist/lib/browser/chunk-7D2MPHXV.mjs.map +0 -7
- package/dist/lib/browser/chunk-E6MZBCU5.mjs +0 -19
- package/dist/lib/browser/chunk-E6MZBCU5.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-YUVXVPHG.mjs +0 -47
- package/dist/lib/browser/intent-resolver-YUVXVPHG.mjs.map +0 -7
- package/dist/lib/browser/keyboard-YYTYJW4M.mjs +0 -51
- package/dist/lib/browser/keyboard-YYTYJW4M.mjs.map +0 -7
- package/dist/lib/browser/react-surface-J7MWWAGD.mjs +0 -51
- package/dist/lib/browser/react-surface-J7MWWAGD.mjs.map +0 -7
- package/dist/lib/browser/state-EUSVT6BI.mjs +0 -117
- package/dist/lib/browser/state-EUSVT6BI.mjs.map +0 -7
- package/dist/types/src/capabilities/capabilities.d.ts +0 -21
- package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
- package/dist/types/src/components/CommandsDialog/CommandsDialog.d.ts +0 -5
- package/dist/types/src/components/CommandsDialog/CommandsDialog.d.ts.map +0 -1
- package/dist/types/src/components/CommandsDialog/CommandsTrigger.d.ts.map +0 -1
- package/dist/types/src/components/CommandsDialog/index.d.ts +0 -3
- package/dist/types/src/components/CommandsDialog/index.d.ts.map +0 -1
- package/dist/types/src/components/NavTreeContainer.d.ts +0 -9
- package/dist/types/src/components/NavTreeContainer.d.ts.map +0 -1
- package/dist/types/src/components/NavTreeContext.d.ts.map +0 -1
- package/dist/types/src/components/NavTreeDocumentTitle.d.ts.map +0 -1
- package/dist/types/src/events.d.ts +0 -4
- package/dist/types/src/events.d.ts.map +0 -1
- package/dist/types/src/hooks.d.ts +0 -3
- package/dist/types/src/hooks.d.ts.map +0 -1
- package/dist/types/src/types.d.ts.map +0 -1
- package/src/capabilities/capabilities.ts +0 -20
- package/src/capabilities/intent-resolver.ts +0 -37
- package/src/components/CommandsDialog/CommandsDialog.tsx +0 -126
- package/src/components/CommandsDialog/CommandsTrigger.tsx +0 -36
- package/src/components/CommandsDialog/index.ts +0 -6
- package/src/components/NavTreeContainer.tsx +0 -369
- package/src/events.ts +0 -11
- package/src/hooks.ts +0 -21
- /package/dist/types/src/{components/CommandsDialog → containers/CommandsTrigger}/CommandsTrigger.d.ts +0 -0
|
@@ -2,19 +2,21 @@
|
|
|
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
|
+
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,14 +38,15 @@ import {
|
|
|
35
38
|
useMediaQuery,
|
|
36
39
|
useTranslation,
|
|
37
40
|
} from '@dxos/react-ui';
|
|
38
|
-
import {
|
|
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/
|
|
44
|
+
import { mx } from '@dxos/ui-theme';
|
|
42
45
|
import { arrayMove } from '@dxos/util';
|
|
43
46
|
|
|
44
|
-
import {
|
|
45
|
-
import { meta } from '
|
|
47
|
+
import { useNavTreeState } from '#hooks';
|
|
48
|
+
import { meta } from '#meta';
|
|
49
|
+
|
|
46
50
|
import { l0ItemType } from '../../util';
|
|
47
51
|
import { useNavTreeContext } from '../NavTreeContext';
|
|
48
52
|
import { UserAccountAvatar } from '../UserAccountAvatar';
|
|
@@ -57,43 +61,41 @@ type L0ItemData = {
|
|
|
57
61
|
};
|
|
58
62
|
|
|
59
63
|
type L0ItemRootProps = {
|
|
60
|
-
item: Node
|
|
61
|
-
parent?: Node
|
|
64
|
+
item: Node.Node;
|
|
65
|
+
parent?: Node.Node;
|
|
62
66
|
path: string[];
|
|
67
|
+
onMouseEnter?: () => void;
|
|
63
68
|
};
|
|
64
69
|
|
|
65
70
|
type L0ItemProps = L0ItemRootProps & {
|
|
66
|
-
item: Node
|
|
67
|
-
parent?: Node
|
|
71
|
+
item: Node.Node;
|
|
72
|
+
parent?: Node.Node;
|
|
68
73
|
path: string[];
|
|
69
74
|
pinned?: boolean;
|
|
70
75
|
onRearrange?: StackItemRearrangeHandler<L0ItemData>;
|
|
76
|
+
onItemHover?: (params: { item: Node.Node }) => void;
|
|
71
77
|
};
|
|
72
78
|
|
|
73
79
|
const useL0ItemClick = ({ item, parent, path }: L0ItemProps, type: string) => {
|
|
74
|
-
const {
|
|
80
|
+
const { onSelect, onTabChange } = useNavTreeContext();
|
|
81
|
+
const { getItem } = useNavTreeState();
|
|
75
82
|
const [isLg] = useMediaQuery('lg');
|
|
83
|
+
const runAction = useActionRunner();
|
|
76
84
|
|
|
77
85
|
return useCallback(
|
|
78
86
|
(event: MouseEvent) => {
|
|
79
87
|
switch (type) {
|
|
80
88
|
case 'action': {
|
|
81
|
-
const {
|
|
82
|
-
|
|
83
|
-
properties: { caller },
|
|
84
|
-
} = item;
|
|
85
|
-
|
|
86
|
-
return invoke?.(caller ? { node: parent, caller } : { node: parent });
|
|
89
|
+
const { properties: { caller } = {} } = item;
|
|
90
|
+
return void runAction(item as Node.Action, caller ? { parent, path, caller } : { parent, path });
|
|
87
91
|
}
|
|
88
|
-
|
|
89
92
|
case 'tab':
|
|
90
93
|
return onTabChange?.(item);
|
|
91
|
-
|
|
92
94
|
case 'link':
|
|
93
|
-
return onSelect?.({ item, path, current: !
|
|
95
|
+
return onSelect?.({ item, path, current: !getItem(path).current, option: event.altKey });
|
|
94
96
|
}
|
|
95
97
|
},
|
|
96
|
-
[item, parent, type,
|
|
98
|
+
[item, parent, type, getItem, onSelect, onTabChange, isLg, runAction],
|
|
97
99
|
);
|
|
98
100
|
};
|
|
99
101
|
|
|
@@ -101,64 +103,62 @@ const l0Breakpoints: Record<string, string> = {
|
|
|
101
103
|
lg: 'hidden lg:grid',
|
|
102
104
|
};
|
|
103
105
|
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
},
|
|
106
|
+
const L0ItemRoot = memo(
|
|
107
|
+
forwardRef<HTMLButtonElement, PropsWithChildren<L0ItemRootProps>>(
|
|
108
|
+
({ item, parent, path, onMouseEnter, children }, forwardedRef) => {
|
|
109
|
+
const { t } = useTranslation(meta.id);
|
|
110
|
+
const { model } = useNavTreeContext();
|
|
111
|
+
const itemPath = useMemo(() => [...path, item.id], [item.id, path]);
|
|
112
|
+
const { id, testId } = useAtomValue(model.itemProps(itemPath));
|
|
113
|
+
const localizedString = toLocalizedString(item.properties.label, t);
|
|
114
|
+
|
|
115
|
+
const type = l0ItemType(item);
|
|
116
|
+
const handleClick = useL0ItemClick({ item, parent, path: itemPath }, type);
|
|
117
|
+
|
|
118
|
+
return (
|
|
119
|
+
<Tooltip.Trigger asChild delayDuration={0} side='right' content={localizedString}>
|
|
120
|
+
<Tabs.TabPrimitive
|
|
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}
|
|
127
|
+
data-type={type}
|
|
128
|
+
data-testid={testId}
|
|
129
|
+
data-object-id={id}
|
|
130
|
+
value={item.id}
|
|
131
|
+
onClick={handleClick}
|
|
132
|
+
onMouseEnter={onMouseEnter}
|
|
133
|
+
ref={forwardedRef}
|
|
134
|
+
>
|
|
135
|
+
{children}
|
|
136
|
+
</Tabs.TabPrimitive>
|
|
137
|
+
</Tooltip.Trigger>
|
|
138
|
+
);
|
|
139
|
+
},
|
|
140
|
+
),
|
|
140
141
|
);
|
|
141
142
|
|
|
142
143
|
export const L0ItemActiveTabIndicator = ({ classNames }: ThemedClassName<{}>) => (
|
|
143
144
|
<div
|
|
144
145
|
role='none'
|
|
145
146
|
className={mx(
|
|
146
|
-
'hidden group-aria-selected/l0item:block absolute
|
|
147
|
+
'hidden group-aria-selected/l0item:block absolute start-0 h-6 w-1.5 bg-accent-surface rounded-sm',
|
|
147
148
|
classNames,
|
|
148
149
|
)}
|
|
149
150
|
/>
|
|
150
151
|
);
|
|
151
152
|
|
|
152
153
|
// TODO(burdon): Factor out pinned (non-draggable) items.
|
|
153
|
-
const L0Item = ({ item, parent, path, pinned, onRearrange }: L0ItemProps) => {
|
|
154
|
+
const L0Item = memo(({ item, parent, path, pinned, onRearrange, onItemHover }: L0ItemProps) => {
|
|
154
155
|
const { t } = useTranslation(meta.id);
|
|
155
|
-
const itemElement = useRef<
|
|
156
|
+
const itemElement = useRef<HTMLButtonElement | null>(null);
|
|
156
157
|
const [closestEdge, setEdge] = useState<Edge | null>(null);
|
|
157
158
|
const localizedString = toLocalizedString(item.properties.label, t);
|
|
158
159
|
const hue = item.properties.hue ?? null;
|
|
159
160
|
|
|
160
161
|
useLayoutEffect(() => {
|
|
161
|
-
// NOTE(thure): This is copied from StackItem, perhaps this should be DRYed out.
|
|
162
162
|
if (!itemElement.current || !onRearrange) {
|
|
163
163
|
return;
|
|
164
164
|
}
|
|
@@ -213,17 +213,19 @@ const L0Item = ({ item, parent, path, pinned, onRearrange }: L0ItemProps) => {
|
|
|
213
213
|
);
|
|
214
214
|
}, [item, onRearrange]);
|
|
215
215
|
|
|
216
|
+
const handleMouseEnter = useCallback(() => onItemHover?.({ item }), [item, onItemHover]);
|
|
217
|
+
|
|
216
218
|
return (
|
|
217
|
-
<L0ItemRoot ref={itemElement} item={item} parent={parent} path={path}>
|
|
219
|
+
<L0ItemRoot ref={itemElement} item={item} parent={parent} path={path} onMouseEnter={handleMouseEnter}>
|
|
218
220
|
<div
|
|
219
221
|
role='none'
|
|
220
222
|
data-frame={true}
|
|
221
|
-
{...(hue && { style: { background: `var(--
|
|
223
|
+
{...(hue && { style: { background: `var(--color-${hue}-surface)` } })}
|
|
222
224
|
className={mx(
|
|
223
|
-
|
|
225
|
+
'flex justify-center items-center dx-focus-ring-group-indicator transition-colors rounded-sm',
|
|
224
226
|
pinned
|
|
225
|
-
? 'p-2 group-hover/l0item:bg-
|
|
226
|
-
: '
|
|
227
|
+
? 'p-2 group-hover/l0item:bg-active-surface'
|
|
228
|
+
: 'w-(--dx-l0-avatar-size) h-(--dx-l0-avatar-size) bg-active-surface',
|
|
227
229
|
)}
|
|
228
230
|
>
|
|
229
231
|
<ItemAvatar item={item} />
|
|
@@ -235,17 +237,19 @@ const L0Item = ({ item, parent, path, pinned, onRearrange }: L0ItemProps) => {
|
|
|
235
237
|
{closestEdge && <ListItem.DropIndicator edge={closestEdge} />}
|
|
236
238
|
</L0ItemRoot>
|
|
237
239
|
);
|
|
238
|
-
};
|
|
240
|
+
});
|
|
239
241
|
|
|
240
242
|
const ItemAvatar = ({ item }: Pick<L0ItemProps, 'item'>) => {
|
|
241
243
|
const { t } = useTranslation(meta.id);
|
|
242
|
-
|
|
244
|
+
|
|
245
|
+
// Actions.
|
|
243
246
|
if (item.properties.icon) {
|
|
244
247
|
const hue = item.properties.hue ?? null;
|
|
245
|
-
const hueFgStyle = hue && { style: { color: `var(--
|
|
248
|
+
const hueFgStyle = hue && { style: { color: `var(--color-${hue}-surface-text)` } };
|
|
246
249
|
return <Icon icon={item.properties.icon} size={6} {...hueFgStyle} />;
|
|
247
250
|
}
|
|
248
251
|
|
|
252
|
+
const type = l0ItemType(item);
|
|
249
253
|
if (type === 'tab' && item.properties.disposition !== 'pin-end') {
|
|
250
254
|
const hue = item.properties.hue ?? null;
|
|
251
255
|
const localizedString = toLocalizedString(item.properties.label, t);
|
|
@@ -256,137 +260,106 @@ const ItemAvatar = ({ item }: Pick<L0ItemProps, 'item'>) => {
|
|
|
256
260
|
};
|
|
257
261
|
|
|
258
262
|
//
|
|
259
|
-
//
|
|
263
|
+
// L0Menu
|
|
260
264
|
//
|
|
261
265
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
266
|
+
export type L0MenuProps = {
|
|
267
|
+
menuActions: MenuItem[];
|
|
268
|
+
topLevelItems: Node.Node[];
|
|
269
|
+
pinnedItems: Node.Node[];
|
|
270
|
+
userAccountItem?: Node.Node;
|
|
271
|
+
parent?: Node.Node;
|
|
272
|
+
path: string[];
|
|
273
|
+
onItemHover?: (params: { item: Node.Node }) => void;
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
export const L0Menu = ({
|
|
277
|
+
menuActions,
|
|
278
|
+
topLevelItems,
|
|
279
|
+
pinnedItems,
|
|
280
|
+
userAccountItem,
|
|
281
|
+
parent,
|
|
282
|
+
path,
|
|
283
|
+
onItemHover,
|
|
284
|
+
}: L0MenuProps) => {
|
|
285
|
+
const { t } = useTranslation(meta.id);
|
|
286
|
+
const runAction = useActionRunner();
|
|
287
|
+
const handleAction = useCallback(
|
|
288
|
+
(action: Node.Action, params: Node.InvokeProps) => {
|
|
289
|
+
void runAction(action, params);
|
|
290
|
+
},
|
|
291
|
+
[runAction],
|
|
292
|
+
);
|
|
268
293
|
|
|
269
294
|
const handleRearrange = useCallback<StackItemRearrangeHandler<L0ItemData>>(
|
|
270
295
|
(source, target, closestEdge) => {
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
296
|
+
const sourceItem = topLevelItems.find((i) => i.id === source.id);
|
|
297
|
+
if (!sourceItem?.properties.onRearrange) {
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
const sourceIndex = topLevelItems.findIndex((i) => i.id === source.id);
|
|
302
|
+
const targetIndex = topLevelItems.findIndex((i) => i.id === target.id);
|
|
274
303
|
const insertIndex =
|
|
275
304
|
source.id === target.id
|
|
276
305
|
? sourceIndex
|
|
277
306
|
: targetIndex +
|
|
278
307
|
(sourceIndex < targetIndex ? (closestEdge === 'top' ? -1 : 0) : closestEdge === 'bottom' ? 1 : 0);
|
|
279
|
-
const nextOrder = arrayMove([...
|
|
280
|
-
return
|
|
308
|
+
const nextOrder = arrayMove([...topLevelItems], sourceIndex, insertIndex);
|
|
309
|
+
return sourceItem.properties.onRearrange(nextOrder.map((item) => item.data));
|
|
281
310
|
},
|
|
282
|
-
[
|
|
311
|
+
[topLevelItems],
|
|
283
312
|
);
|
|
284
313
|
|
|
285
|
-
|
|
286
|
-
|
|
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);
|
|
314
|
+
// Check if any items have onRearrange to enable drag-and-drop.
|
|
315
|
+
const hasRearrangeableItems = topLevelItems.some((item) => item.properties.onRearrange);
|
|
321
316
|
|
|
322
317
|
return (
|
|
323
318
|
<Tabs.Tablist
|
|
319
|
+
data-tauri-drag-region
|
|
324
320
|
classNames={[
|
|
325
|
-
'group/l0 absolute z-[1] inset-
|
|
326
|
-
'grid grid-cols-[var(--l0-size)] grid-rows-[var(--rail-size)_1fr_min-content_var(--l0-size)] contain-layout',
|
|
327
|
-
'
|
|
321
|
+
'group/l0 absolute z-[1] inset-y-0 start-0 rounded-is',
|
|
322
|
+
'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 dx-app-drag pb-[env(safe-area-inset-bottom)]',
|
|
324
|
+
'[body[data-platform="macos"]_&]:pt-[30px]',
|
|
325
|
+
'[body[data-platform="ios"]_&]:pt-[max(env(safe-area-inset-top),0.25rem)]',
|
|
328
326
|
]}
|
|
329
327
|
>
|
|
330
328
|
{/* TODO(wittjosiah): Use L0Item trigger. */}
|
|
331
|
-
<
|
|
332
|
-
<
|
|
333
|
-
<
|
|
334
|
-
<
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
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>
|
|
329
|
+
<Menu.Root onAction={handleAction}>
|
|
330
|
+
<Menu.Trigger asChild data-testid='spacePlugin.addSpace'>
|
|
331
|
+
<div role='none' className='grid place-items-center'>
|
|
332
|
+
<IconButton variant='ghost' icon='ph--list--regular' iconOnly label={t('app-menu.label')} />
|
|
333
|
+
</div>
|
|
334
|
+
</Menu.Trigger>
|
|
335
|
+
<Menu.Content group={parent} items={menuActions} />
|
|
336
|
+
</Menu.Root>
|
|
353
337
|
|
|
354
338
|
{/* Space list. */}
|
|
355
|
-
<ScrollArea.Root>
|
|
356
|
-
<ScrollArea.Viewport>
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
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>
|
|
339
|
+
<ScrollArea.Root centered thin orientation='vertical'>
|
|
340
|
+
<ScrollArea.Viewport classNames='flex flex-col gap-2 py-1'>
|
|
341
|
+
{topLevelItems.map((item) => (
|
|
342
|
+
<L0Item
|
|
343
|
+
key={item.id}
|
|
344
|
+
item={item}
|
|
345
|
+
parent={parent}
|
|
346
|
+
path={path}
|
|
347
|
+
onItemHover={onItemHover}
|
|
348
|
+
{...(hasRearrangeableItems && { onRearrange: handleRearrange })}
|
|
349
|
+
/>
|
|
350
|
+
))}
|
|
376
351
|
</ScrollArea.Viewport>
|
|
377
352
|
</ScrollArea.Root>
|
|
378
353
|
|
|
379
354
|
{/* Actions. */}
|
|
380
|
-
<div role='none' className='grid grid-cols-1 auto-rows-
|
|
381
|
-
{pinnedItems
|
|
382
|
-
.
|
|
383
|
-
|
|
384
|
-
<L0Item key={item.id} item={item} parent={parent} path={path} pinned />
|
|
385
|
-
))}
|
|
355
|
+
<div role='none' className='grid grid-cols-1 auto-rows-(--dx-rail-action) pt-2'>
|
|
356
|
+
{pinnedItems.map((item) => (
|
|
357
|
+
<L0Item key={item.id} item={item} parent={parent} path={path} pinned />
|
|
358
|
+
))}
|
|
386
359
|
</div>
|
|
387
360
|
|
|
388
361
|
{userAccountItem && (
|
|
389
|
-
<div role='none' className='grid app-no-drag'>
|
|
362
|
+
<div role='none' className='grid dx-app-no-drag'>
|
|
390
363
|
<L0ItemRoot key={userAccountItem.id} item={userAccountItem} parent={parent} path={path}>
|
|
391
364
|
<UserAccountAvatar
|
|
392
365
|
userId={userAccountItem.properties.userId}
|
|
@@ -398,14 +371,6 @@ export const L0Menu = ({ menuActions, topLevelItems, pinnedItems, userAccountIte
|
|
|
398
371
|
</L0ItemRoot>
|
|
399
372
|
</div>
|
|
400
373
|
)}
|
|
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
374
|
</Tabs.Tablist>
|
|
410
375
|
);
|
|
411
376
|
};
|