@dxos/plugin-navtree 0.8.4-main.3c1ae3b → 0.8.4-main.3eb6e50203

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 (163) hide show
  1. package/dist/lib/browser/app-graph-builder-XGA4GPGL.mjs +44 -0
  2. package/dist/lib/browser/app-graph-builder-XGA4GPGL.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-63YLDLLE.mjs +1373 -0
  4. package/dist/lib/browser/chunk-63YLDLLE.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-X2HDG62A.mjs +23 -0
  6. package/dist/lib/browser/chunk-X2HDG62A.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-E6MZBCU5.mjs → chunk-YKTYPINZ.mjs} +1 -1
  8. package/dist/lib/browser/chunk-YKTYPINZ.mjs.map +7 -0
  9. package/dist/lib/browser/index.mjs +83 -91
  10. package/dist/lib/browser/index.mjs.map +4 -4
  11. package/dist/lib/browser/{keyboard-YJEK2HTH.mjs → keyboard-46XQHY2O.mjs} +18 -14
  12. package/dist/lib/browser/keyboard-46XQHY2O.mjs.map +7 -0
  13. package/dist/lib/browser/meta.json +1 -1
  14. package/dist/lib/browser/operation-resolver-NNNDII45.mjs +53 -0
  15. package/dist/lib/browser/operation-resolver-NNNDII45.mjs.map +7 -0
  16. package/dist/lib/browser/{react-surface-RPXGIV45.mjs → react-surface-APSEG23H.mjs} +16 -14
  17. package/dist/lib/browser/react-surface-APSEG23H.mjs.map +7 -0
  18. package/dist/lib/browser/state-M5YUCIQU.mjs +121 -0
  19. package/dist/lib/browser/state-M5YUCIQU.mjs.map +7 -0
  20. package/dist/types/src/NavTreePlugin.d.ts +2 -1
  21. package/dist/types/src/NavTreePlugin.d.ts.map +1 -1
  22. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +6 -0
  23. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
  24. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
  25. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
  26. package/dist/types/src/capabilities/index.d.ts +5 -108
  27. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  28. package/dist/types/src/capabilities/keyboard/index.d.ts +3 -0
  29. package/dist/types/src/capabilities/keyboard/index.d.ts.map +1 -0
  30. package/dist/types/src/capabilities/keyboard/keyboard.d.ts +5 -0
  31. package/dist/types/src/capabilities/keyboard/keyboard.d.ts.map +1 -0
  32. package/dist/types/src/capabilities/operation-resolver/index.d.ts +3 -0
  33. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
  34. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
  35. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
  36. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  37. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  38. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  39. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  40. package/dist/types/src/capabilities/state/index.d.ts +3 -0
  41. package/dist/types/src/capabilities/state/index.d.ts.map +1 -0
  42. package/dist/types/src/capabilities/state/state.d.ts +6 -0
  43. package/dist/types/src/capabilities/state/state.d.ts.map +1 -0
  44. package/dist/types/src/components/CommandsDialog/CommandsDialog.d.ts.map +1 -1
  45. package/dist/types/src/components/CommandsDialog/CommandsTrigger.d.ts.map +1 -1
  46. package/dist/types/src/components/NavTree/NavTree.d.ts +2 -2
  47. package/dist/types/src/components/NavTree/NavTree.d.ts.map +1 -1
  48. package/dist/types/src/components/NavTree/NavTree.stories.d.ts.map +1 -1
  49. package/dist/types/src/components/NavTreeContainer.d.ts.map +1 -1
  50. package/dist/types/src/components/NavTreeDocumentTitle.d.ts +1 -1
  51. package/dist/types/src/components/NavTreeDocumentTitle.d.ts.map +1 -1
  52. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts +6 -6
  53. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts.map +1 -1
  54. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.stories.d.ts +2 -1
  55. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.stories.d.ts.map +1 -1
  56. package/dist/types/src/components/Sidebar/L0Menu.d.ts +4 -4
  57. package/dist/types/src/components/Sidebar/L0Menu.d.ts.map +1 -1
  58. package/dist/types/src/components/Sidebar/L1Panel.d.ts +2 -2
  59. package/dist/types/src/components/Sidebar/L1Panel.d.ts.map +1 -1
  60. package/dist/types/src/components/Sidebar/L1Tabs.d.ts +2 -2
  61. package/dist/types/src/components/Sidebar/L1Tabs.d.ts.map +1 -1
  62. package/dist/types/src/components/types.d.ts +7 -7
  63. package/dist/types/src/components/types.d.ts.map +1 -1
  64. package/dist/types/src/experimental/Tree.stories.d.ts +18 -4
  65. package/dist/types/src/experimental/Tree.stories.d.ts.map +1 -1
  66. package/dist/types/src/hooks.d.ts +32 -1
  67. package/dist/types/src/hooks.d.ts.map +1 -1
  68. package/dist/types/src/index.d.ts +1 -2
  69. package/dist/types/src/index.d.ts.map +1 -1
  70. package/dist/types/src/meta.d.ts +2 -2
  71. package/dist/types/src/meta.d.ts.map +1 -1
  72. package/dist/types/src/testing/app-graph-builder.d.ts +2 -3
  73. package/dist/types/src/testing/app-graph-builder.d.ts.map +1 -1
  74. package/dist/types/src/testing/generator.d.ts +5 -6
  75. package/dist/types/src/testing/generator.d.ts.map +1 -1
  76. package/dist/types/src/testing/update-state.d.ts +2 -2
  77. package/dist/types/src/testing/update-state.d.ts.map +1 -1
  78. package/dist/types/src/types/capabilities.d.ts +16 -0
  79. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  80. package/dist/types/src/types/events.d.ts +5 -0
  81. package/dist/types/src/types/events.d.ts.map +1 -0
  82. package/dist/types/src/types/index.d.ts +4 -0
  83. package/dist/types/src/types/index.d.ts.map +1 -0
  84. package/dist/types/src/{types.d.ts → types/schema.d.ts} +6 -6
  85. package/dist/types/src/types/schema.d.ts.map +1 -0
  86. package/dist/types/src/util.d.ts +7 -7
  87. package/dist/types/src/util.d.ts.map +1 -1
  88. package/dist/types/tsconfig.tsbuildinfo +1 -1
  89. package/package.json +54 -52
  90. package/src/NavTreePlugin.tsx +53 -72
  91. package/src/capabilities/app-graph-builder/app-graph-builder.ts +42 -0
  92. package/src/capabilities/app-graph-builder/index.ts +7 -0
  93. package/src/capabilities/index.ts +5 -9
  94. package/src/capabilities/keyboard/index.ts +7 -0
  95. package/src/capabilities/keyboard/keyboard.ts +66 -0
  96. package/src/capabilities/operation-resolver/index.ts +7 -0
  97. package/src/capabilities/operation-resolver/operation-resolver.ts +42 -0
  98. package/src/capabilities/react-surface/index.ts +7 -0
  99. package/src/capabilities/react-surface/react-surface.tsx +55 -0
  100. package/src/capabilities/state/index.ts +7 -0
  101. package/src/capabilities/state/state.ts +122 -0
  102. package/src/components/CommandsDialog/CommandsDialog.tsx +62 -64
  103. package/src/components/CommandsDialog/CommandsTrigger.tsx +4 -14
  104. package/src/components/NavTree/NavTree.stories.tsx +35 -43
  105. package/src/components/NavTree/NavTree.tsx +1 -11
  106. package/src/components/NavTreeContainer.tsx +70 -114
  107. package/src/components/NavTreeDocumentTitle.tsx +3 -2
  108. package/src/components/NavTreeItem/NavTreeItemAction.stories.tsx +17 -7
  109. package/src/components/NavTreeItem/NavTreeItemAction.tsx +18 -12
  110. package/src/components/NavTreeItem/NavTreeItemColumns.tsx +5 -5
  111. package/src/components/Sidebar/L0Menu.tsx +67 -96
  112. package/src/components/Sidebar/L1Panel.tsx +151 -70
  113. package/src/components/Sidebar/L1Tabs.tsx +6 -31
  114. package/src/components/UserAccountAvatar/UserAccountAvatar.stories.tsx +1 -1
  115. package/src/components/types.ts +7 -7
  116. package/src/experimental/Tree.stories.tsx +44 -50
  117. package/src/experimental/Tree.tsx +1 -1
  118. package/src/hooks.ts +54 -2
  119. package/src/index.ts +1 -2
  120. package/src/meta.ts +2 -2
  121. package/src/testing/app-graph-builder.ts +158 -234
  122. package/src/testing/generator.ts +12 -12
  123. package/src/testing/update-state.ts +6 -6
  124. package/src/types/capabilities.ts +21 -0
  125. package/src/types/events.ts +12 -0
  126. package/src/types/index.ts +7 -0
  127. package/src/{types.ts → types/schema.ts} +5 -5
  128. package/src/util.ts +13 -16
  129. package/dist/lib/browser/app-graph-builder-OHSCN3GX.mjs +0 -46
  130. package/dist/lib/browser/app-graph-builder-OHSCN3GX.mjs.map +0 -7
  131. package/dist/lib/browser/chunk-5DWDYPGQ.mjs +0 -1492
  132. package/dist/lib/browser/chunk-5DWDYPGQ.mjs.map +0 -7
  133. package/dist/lib/browser/chunk-5VLWX4PK.mjs +0 -15
  134. package/dist/lib/browser/chunk-5VLWX4PK.mjs.map +0 -7
  135. package/dist/lib/browser/chunk-E6MZBCU5.mjs.map +0 -7
  136. package/dist/lib/browser/intent-resolver-YUVXVPHG.mjs +0 -47
  137. package/dist/lib/browser/intent-resolver-YUVXVPHG.mjs.map +0 -7
  138. package/dist/lib/browser/keyboard-YJEK2HTH.mjs.map +0 -7
  139. package/dist/lib/browser/react-surface-RPXGIV45.mjs.map +0 -7
  140. package/dist/lib/browser/state-BFD5KJCV.mjs +0 -117
  141. package/dist/lib/browser/state-BFD5KJCV.mjs.map +0 -7
  142. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
  143. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  144. package/dist/types/src/capabilities/capabilities.d.ts +0 -21
  145. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  146. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  147. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  148. package/dist/types/src/capabilities/keyboard.d.ts +0 -4
  149. package/dist/types/src/capabilities/keyboard.d.ts.map +0 -1
  150. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  151. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  152. package/dist/types/src/capabilities/state.d.ts +0 -20
  153. package/dist/types/src/capabilities/state.d.ts.map +0 -1
  154. package/dist/types/src/events.d.ts +0 -4
  155. package/dist/types/src/events.d.ts.map +0 -1
  156. package/dist/types/src/types.d.ts.map +0 -1
  157. package/src/capabilities/app-graph-builder.ts +0 -53
  158. package/src/capabilities/capabilities.ts +0 -20
  159. package/src/capabilities/intent-resolver.ts +0 -37
  160. package/src/capabilities/keyboard.ts +0 -57
  161. package/src/capabilities/react-surface.tsx +0 -48
  162. package/src/capabilities/state.ts +0 -104
  163. package/src/events.ts +0 -11
@@ -1,1492 +0,0 @@
1
- import {
2
- NavTreeCapabilities
3
- } from "./chunk-5VLWX4PK.mjs";
4
- import {
5
- COMMANDS_DIALOG,
6
- KEY_BINDING,
7
- meta
8
- } from "./chunk-E6MZBCU5.mjs";
9
-
10
- // src/components/CommandsDialog/CommandsDialog.tsx
11
- import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
12
- import React, { forwardRef, useMemo, useState } from "react";
13
- import { LayoutAction, createIntent } from "@dxos/app-framework";
14
- import { useAppGraph, useIntentDispatcher } from "@dxos/app-framework/react";
15
- import { isAction, isActionGroup } from "@dxos/app-graph";
16
- import { Keyboard, keySymbols } from "@dxos/keyboard";
17
- import { useActions } from "@dxos/plugin-graph";
18
- import { Button, Dialog, Icon, toLocalizedString, useTranslation } from "@dxos/react-ui";
19
- import { SearchList } from "@dxos/react-ui-searchlist";
20
- import { cardDialogContent, cardDialogHeader, cardDialogPaddedOverflow, cardDialogSearchListRoot } from "@dxos/react-ui-stack";
21
- import { descriptionText, mx } from "@dxos/react-ui-theme";
22
- import { getHostPlatform } from "@dxos/util";
23
- var CommandsDialogContent = /* @__PURE__ */ forwardRef(({ selected: initial }, forwardedRef) => {
24
- var _effect = _useSignals();
25
- try {
26
- const { t } = useTranslation(meta.id);
27
- const { dispatchPromise: dispatch } = useIntentDispatcher();
28
- const { graph } = useAppGraph();
29
- const [selected, setSelected] = useState(initial);
30
- const allActions = useMemo(() => {
31
- const current = Keyboard.singleton.getCurrentContext();
32
- const actionMap = /* @__PURE__ */ new Set();
33
- const actions2 = [];
34
- graph.traverse({
35
- visitor: (node, path) => {
36
- if ((isAction(node) || isActionGroup(node)) && !actionMap.has(node.id) && current.startsWith(path.slice(0, -1).join("/"))) {
37
- actionMap.add(node.id);
38
- actions2.push(node);
39
- }
40
- }
41
- });
42
- actions2.sort((a, b) => {
43
- return toLocalizedString(a.properties.label, t)?.toLowerCase().localeCompare(toLocalizedString(b.properties.label, t)?.toLowerCase());
44
- });
45
- return actions2;
46
- }, [
47
- graph
48
- ]);
49
- const group = allActions.find(({ id }) => id === selected);
50
- const groupActions = useActions(graph, group?.id);
51
- const actions = isActionGroup(group) ? groupActions : allActions;
52
- return /* @__PURE__ */ React.createElement(Dialog.Content, {
53
- classNames: cardDialogContent,
54
- ref: forwardedRef
55
- }, /* @__PURE__ */ React.createElement(Dialog.Title, {
56
- classNames: cardDialogHeader
57
- }, t("commands dialog title", {
58
- ns: meta.id
59
- })), /* @__PURE__ */ React.createElement(SearchList.Root, {
60
- label: t("command list input placeholder"),
61
- classNames: cardDialogSearchListRoot
62
- }, /* @__PURE__ */ React.createElement(SearchList.Input, {
63
- placeholder: t("command list input placeholder")
64
- }), /* @__PURE__ */ React.createElement(SearchList.Content, {
65
- classNames: cardDialogPaddedOverflow
66
- }, actions?.map((action) => {
67
- const label = toLocalizedString(action.properties.label, t);
68
- const shortcut = typeof action.properties.keyBinding === "string" ? action.properties.keyBinding : action.properties.keyBinding?.[getHostPlatform()];
69
- return /* @__PURE__ */ React.createElement(SearchList.Item, {
70
- value: label,
71
- key: action.id,
72
- onSelect: () => {
73
- if (action.properties.disabled) {
74
- return;
75
- }
76
- if (isActionGroup(action)) {
77
- setSelected(action.id);
78
- return;
79
- }
80
- void dispatch(createIntent(LayoutAction.UpdateDialog, {
81
- part: "dialog",
82
- options: {
83
- state: false
84
- }
85
- }));
86
- setTimeout(() => {
87
- const node = graph.getConnections(group?.id ?? action.id, "inbound")[0];
88
- void (node && isAction(action) && action.data({
89
- parent: node,
90
- caller: KEY_BINDING
91
- }));
92
- });
93
- },
94
- classNames: "flex items-center gap-2",
95
- disabled: action.properties.disabled,
96
- ...action.properties?.testId && {
97
- "data-testid": action.properties.testId
98
- }
99
- }, /* @__PURE__ */ React.createElement(Icon, {
100
- icon: action.properties.icon,
101
- size: 4
102
- }), /* @__PURE__ */ React.createElement("span", {
103
- className: "grow truncate"
104
- }, label), shortcut && /* @__PURE__ */ React.createElement("span", {
105
- className: mx("shrink-0", descriptionText)
106
- }, keySymbols(shortcut).join("")));
107
- }))), /* @__PURE__ */ React.createElement("div", {
108
- role: "none",
109
- className: "pli-cardSpacingInline pbe-cardSpacingBlock"
110
- }, /* @__PURE__ */ React.createElement(Dialog.Close, {
111
- asChild: true
112
- }, /* @__PURE__ */ React.createElement(Button, {
113
- classNames: "is-full"
114
- }, t("close label", {
115
- ns: "os"
116
- })))));
117
- } finally {
118
- _effect.f();
119
- }
120
- });
121
-
122
- // src/components/CommandsDialog/CommandsTrigger.tsx
123
- import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
124
- import React2 from "react";
125
- import { LayoutAction as LayoutAction2, createIntent as createIntent2 } from "@dxos/app-framework";
126
- import { useIntentDispatcher as useIntentDispatcher2 } from "@dxos/app-framework/react";
127
- import { Button as Button2, Icon as Icon2, useTranslation as useTranslation2 } from "@dxos/react-ui";
128
- var CommandsTrigger = () => {
129
- var _effect = _useSignals2();
130
- try {
131
- const { dispatchPromise: dispatch } = useIntentDispatcher2();
132
- const { t } = useTranslation2(meta.id);
133
- return /* @__PURE__ */ React2.createElement(Button2, {
134
- classNames: "m-1 pli-1 lg:pli-2",
135
- onClick: () => dispatch(createIntent2(LayoutAction2.UpdateDialog, {
136
- part: "dialog",
137
- subject: COMMANDS_DIALOG,
138
- options: {
139
- blockAlign: "start"
140
- }
141
- }))
142
- }, /* @__PURE__ */ React2.createElement("span", {
143
- className: "text-description font-normal grow text-start"
144
- }, t("command list input placeholder")), /* @__PURE__ */ React2.createElement(Icon2, {
145
- icon: "ph--magnifying-glass--regular",
146
- size: 5
147
- }));
148
- } finally {
149
- _effect.f();
150
- }
151
- };
152
-
153
- // src/util.ts
154
- import { isActionLike } from "@dxos/app-graph";
155
- import { isNonNullable } from "@dxos/util";
156
- var getParent = (graph, node, path) => {
157
- const parentId = path[path.length - 2];
158
- return graph.getConnections(node.id, "inbound").find((n) => n.id === parentId);
159
- };
160
- var getPersistenceParent = (graph, node, path, persistenceClass) => {
161
- if (node.properties.acceptPersistenceClass?.has(persistenceClass)) {
162
- return node;
163
- } else {
164
- const parent = getParent(graph, node, path);
165
- return parent ? getPersistenceParent(graph, parent, path.slice(0, path.length - 1), persistenceClass) : null;
166
- }
167
- };
168
- var resolveMigrationOperation = (graph, activeNode, destinationPath, destinationRelatedNode) => {
169
- const activeClass = activeNode.properties.persistenceClass;
170
- if (destinationRelatedNode && activeClass) {
171
- const persistenceParent = getPersistenceParent(graph, destinationRelatedNode, destinationPath, activeClass);
172
- if (persistenceParent) {
173
- const activeKey = activeNode.properties.persistenceKey;
174
- if (activeKey && persistenceParent?.properties.acceptPersistenceKey) {
175
- return persistenceParent.properties.acceptPersistenceKey.has(activeKey) && persistenceParent.properties.onTransferStart ? "transfer" : persistenceParent.properties.onCopy ? "copy" : "reject";
176
- } else {
177
- return "reject";
178
- }
179
- } else {
180
- return "reject";
181
- }
182
- } else {
183
- return "reject";
184
- }
185
- };
186
- var sortActions = (actions) => actions.sort((a, b) => {
187
- if (a.properties.disposition === b.properties.disposition) {
188
- return 0;
189
- }
190
- if (a.properties.disposition === "list-item-primary") {
191
- return -1;
192
- }
193
- return 1;
194
- });
195
- var getChildren = (graph, node, path = []) => {
196
- return graph.getConnections(node.id, "outbound").map((n) => {
197
- const nextPath = [
198
- ...path,
199
- node.id
200
- ];
201
- return nextPath.includes(n.id) ? void 0 : n;
202
- }).filter(isNonNullable);
203
- };
204
- var l0ItemType = (item) => {
205
- if (item.properties.disposition === "collection") {
206
- return "collection";
207
- } else if (isActionLike(item)) {
208
- return "action";
209
- } else if (item.properties.disposition === "navigation") {
210
- return "link";
211
- } else {
212
- return "tab";
213
- }
214
- };
215
-
216
- // src/components/NavTreeContainer.tsx
217
- import { useSignals as _useSignals10 } from "@preact-signals/safe-react/tracking";
218
- import { monitorForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
219
- import { extractInstruction } from "@atlaskit/pragmatic-drag-and-drop-hitbox/tree-item";
220
- import { untracked } from "@preact/signals-core";
221
- import React10, { forwardRef as forwardRef4, memo as memo2, useCallback as useCallback3, useEffect as useEffect3, useMemo as useMemo6 } from "react";
222
- import { LayoutAction as LayoutAction3, createIntent as createIntent3 } from "@dxos/app-framework";
223
- import { Surface, useAppGraph as useAppGraph2, useCapability, useIntentDispatcher as useIntentDispatcher3, useLayout } from "@dxos/app-framework/react";
224
- import { ROOT_ID, isAction as isAction3, isActionLike as isActionLike2 } from "@dxos/app-graph";
225
- import { PLANK_COMPANION_TYPE } from "@dxos/plugin-deck/types";
226
- import { useConnections, useActions as useGraphActions } from "@dxos/plugin-graph";
227
- import { useMediaQuery as useMediaQuery2, useSidebars } from "@dxos/react-ui";
228
- import { isTreeData } from "@dxos/react-ui-list";
229
- import { mx as mx3 } from "@dxos/react-ui-theme";
230
- import { arrayMove as arrayMove2, byPosition } from "@dxos/util";
231
-
232
- // src/capabilities/index.ts
233
- import { lazy } from "@dxos/app-framework";
234
- var AppGraphBuilder = lazy(() => import("./app-graph-builder-OHSCN3GX.mjs"));
235
- var IntentResolver = lazy(() => import("./intent-resolver-YUVXVPHG.mjs"));
236
- var Keyboard2 = lazy(() => import("./keyboard-YJEK2HTH.mjs"));
237
- var ReactSurface = lazy(() => import("./react-surface-RPXGIV45.mjs"));
238
- var State = lazy(() => import("./state-BFD5KJCV.mjs"));
239
-
240
- // src/components/NavTree/NavTree.tsx
241
- import { useSignals as _useSignals9 } from "@preact-signals/safe-react/tracking";
242
- import React9, { forwardRef as forwardRef3, useMemo as useMemo5 } from "react";
243
- import { Tabs as Tabs3 } from "@dxos/react-ui-tabs";
244
-
245
- // src/hooks.ts
246
- import { useEffect as useEffect2 } from "react";
247
-
248
- // src/components/NavTreeContext.tsx
249
- import { createContext, useContext } from "react";
250
- import { raise } from "@dxos/debug";
251
- var NavTreeContext = /* @__PURE__ */ createContext(null);
252
- var useNavTreeContext = () => useContext(NavTreeContext) ?? raise(new Error("Missing NavTreeContext"));
253
-
254
- // src/components/NavTreeDocumentTitle.tsx
255
- import { useEffect } from "react";
256
- import { toLocalizedString as toLocalizedString2, useTranslation as useTranslation3 } from "@dxos/react-ui";
257
- var NavTreeDocumentTitle = ({ node }) => {
258
- const { t } = useTranslation3(meta.id);
259
- useEffect(() => {
260
- document.title = node ? toLocalizedString2(node.properties.label, t) : t("current app name", {
261
- ns: "appkit"
262
- });
263
- }, [
264
- node?.properties?.label
265
- ]);
266
- return null;
267
- };
268
-
269
- // src/hooks.ts
270
- var useLoadDescendents = (root) => {
271
- const { loadDescendents } = useNavTreeContext();
272
- useEffect2(() => {
273
- const frame = requestAnimationFrame(() => {
274
- if (root) {
275
- void loadDescendents?.(root);
276
- }
277
- });
278
- return () => cancelAnimationFrame(frame);
279
- }, [
280
- root
281
- ]);
282
- };
283
-
284
- // src/components/Sidebar/L0Menu.tsx
285
- import { useSignals as _useSignals4 } from "@preact-signals/safe-react/tracking";
286
- import { combine } from "@atlaskit/pragmatic-drag-and-drop/combine";
287
- import { draggable, dropTargetForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
288
- import { preserveOffsetOnSource } from "@atlaskit/pragmatic-drag-and-drop/element/preserve-offset-on-source";
289
- import { scrollJustEnoughIntoView } from "@atlaskit/pragmatic-drag-and-drop/element/scroll-just-enough-into-view";
290
- import { attachClosestEdge, extractClosestEdge } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge";
291
- import React4, { forwardRef as forwardRef2, useCallback, useLayoutEffect, useMemo as useMemo2, useRef, useState as useState2 } from "react";
292
- import { invariant } from "@dxos/invariant";
293
- import { DxAvatar } from "@dxos/lit-ui/react";
294
- import { Icon as Icon3, ListItem, ScrollArea, Tooltip, toLocalizedString as toLocalizedString3, useMediaQuery, useTranslation as useTranslation4 } from "@dxos/react-ui";
295
- import { DropdownMenu, MenuProvider } from "@dxos/react-ui-menu";
296
- import { Tabs } from "@dxos/react-ui-tabs";
297
- import { mx as mx2 } from "@dxos/react-ui-theme";
298
- import { arrayMove } from "@dxos/util";
299
-
300
- // src/components/UserAccountAvatar/UserAccountAvatar.tsx
301
- import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
302
- import React3 from "react";
303
- import { Avatar } from "@dxos/react-ui";
304
- import { hexToFallback } from "@dxos/util";
305
- var UserAccountAvatar = ({ size, userId, hue, emoji, status }) => {
306
- var _effect = _useSignals3();
307
- try {
308
- const fallbackValue = hexToFallback(userId ?? "0");
309
- return /* @__PURE__ */ React3.createElement(React3.Fragment, null, /* @__PURE__ */ React3.createElement(L0ItemActiveTabIndicator, {
310
- classNames: "inset-block-6"
311
- }), /* @__PURE__ */ React3.createElement("div", {
312
- className: "grid place-items-center dx-focus-ring-group-indicator rounded-full",
313
- "data-joyride": "welcome/account"
314
- }, /* @__PURE__ */ React3.createElement(Avatar.Root, null, /* @__PURE__ */ React3.createElement(Avatar.Content, {
315
- variant: "circle",
316
- size: size ?? 12,
317
- status: status ?? "active",
318
- hue: hue || fallbackValue.hue,
319
- fallback: emoji || fallbackValue.emoji,
320
- "data-testid": "treeView.userAccount"
321
- }))));
322
- } finally {
323
- _effect.f();
324
- }
325
- };
326
-
327
- // src/components/Sidebar/L0Menu.tsx
328
- var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-navtree/src/components/Sidebar/L0Menu.tsx";
329
- var useL0ItemClick = ({ item, parent, path }, type) => {
330
- const { tab, isCurrent, onSelect, onTabChange } = useNavTreeContext();
331
- const [isLg] = useMediaQuery("lg");
332
- return useCallback((event) => {
333
- switch (type) {
334
- case "action": {
335
- const { data: invoke, properties: { caller } } = item;
336
- return invoke?.(caller ? {
337
- node: parent,
338
- caller
339
- } : {
340
- node: parent
341
- });
342
- }
343
- case "tab":
344
- return onTabChange?.(item);
345
- case "link":
346
- return onSelect?.({
347
- item,
348
- path,
349
- current: !isCurrent(path, item),
350
- option: event.altKey
351
- });
352
- }
353
- }, [
354
- item,
355
- parent,
356
- type,
357
- tab,
358
- isCurrent,
359
- onSelect,
360
- onTabChange,
361
- isLg
362
- ]);
363
- };
364
- var l0Breakpoints = {
365
- lg: "hidden lg:grid"
366
- };
367
- var l0ItemRoot = 'group/l0item flex is-full justify-center items-center relative data[type!="collection"]:cursor-pointer app-no-drag dx-focus-ring-group';
368
- var l0ItemContent = "flex justify-center items-center dx-focus-ring-group-indicator transition-colors rounded-sm";
369
- var L0ItemRoot = /* @__PURE__ */ forwardRef2(({ item, parent, path, children }, forwardedRef) => {
370
- var _effect = _useSignals4();
371
- try {
372
- const { getProps } = useNavTreeContext();
373
- const { id, testId } = getProps?.(item, path) ?? {};
374
- const type = l0ItemType(item);
375
- const itemPath = useMemo2(() => [
376
- ...path,
377
- item.id
378
- ], [
379
- item.id,
380
- path
381
- ]);
382
- const { t } = useTranslation4(meta.id);
383
- const localizedString = toLocalizedString3(item.properties.label, t);
384
- const handleClick = useL0ItemClick({
385
- item,
386
- parent,
387
- path: itemPath
388
- }, type);
389
- const rootProps = type === "tab" ? {
390
- value: item.id,
391
- tabIndex: 0,
392
- onClick: handleClick,
393
- "data-testid": testId,
394
- "data-object-id": id
395
- } : type !== "collection" ? {
396
- onClick: handleClick,
397
- "data-testid": testId,
398
- "data-object-id": id
399
- } : {
400
- onClick: handleClick,
401
- role: "button"
402
- };
403
- return /* @__PURE__ */ React4.createElement(Tooltip.Trigger, {
404
- asChild: true,
405
- delayDuration: 0,
406
- side: "right",
407
- content: localizedString
408
- }, /* @__PURE__ */ React4.createElement(Tabs.TabPrimitive, {
409
- ...rootProps,
410
- "data-type": type,
411
- className: mx2(l0ItemRoot, l0Breakpoints[item.properties.l0Breakpoint]),
412
- ref: forwardedRef
413
- }, children));
414
- } finally {
415
- _effect.f();
416
- }
417
- });
418
- var L0ItemActiveTabIndicator = ({ classNames }) => {
419
- var _effect = _useSignals4();
420
- try {
421
- return /* @__PURE__ */ React4.createElement("div", {
422
- role: "none",
423
- className: mx2("hidden group-aria-selected/l0item:block absolute inline-start-0 inset-block-2 is-1 bg-accentSurface rounded-ie", classNames)
424
- });
425
- } finally {
426
- _effect.f();
427
- }
428
- };
429
- var L0Item = ({ item, parent, path, pinned, onRearrange }) => {
430
- var _effect = _useSignals4();
431
- try {
432
- const { t } = useTranslation4(meta.id);
433
- const itemElement = useRef(null);
434
- const [closestEdge, setEdge] = useState2(null);
435
- const localizedString = toLocalizedString3(item.properties.label, t);
436
- const hue = item.properties.hue ?? null;
437
- useLayoutEffect(() => {
438
- if (!itemElement.current || !onRearrange) {
439
- return;
440
- }
441
- return combine(draggable({
442
- element: itemElement.current,
443
- getInitialData: () => ({
444
- id: item.id,
445
- type: "l0Item"
446
- }),
447
- onGenerateDragPreview: ({ nativeSetDragImage, source, location }) => {
448
- document.body.setAttribute("data-drag-preview", "true");
449
- const element = source.element.querySelector("[data-frame]");
450
- scrollJustEnoughIntoView({
451
- element
452
- });
453
- const { x, y } = preserveOffsetOnSource({
454
- element,
455
- input: location.current.input
456
- })({
457
- container: element.offsetParent ?? document.body
458
- });
459
- nativeSetDragImage?.(element, x, y);
460
- },
461
- onDragStart: () => {
462
- document.body.removeAttribute("data-drag-preview");
463
- itemElement.current.closest("[data-drag-autoscroll]")?.setAttribute("data-drag-autoscroll", "active");
464
- },
465
- onDrop: () => {
466
- itemElement.current.closest("[data-drag-autoscroll]")?.setAttribute("data-drag-autoscroll", "idle");
467
- }
468
- }), dropTargetForElements({
469
- element: itemElement.current,
470
- getData: ({ input, element }) => {
471
- return attachClosestEdge({
472
- id: item.id,
473
- type: "l0Item"
474
- }, {
475
- input,
476
- element,
477
- allowedEdges: [
478
- "top",
479
- "bottom"
480
- ]
481
- });
482
- },
483
- onDragEnter: ({ self, source }) => {
484
- if (source.data.type === self.data.type) {
485
- setEdge(extractClosestEdge(self.data));
486
- }
487
- },
488
- onDrag: ({ self, source }) => {
489
- if (source.data.type === self.data.type) {
490
- setEdge(extractClosestEdge(self.data));
491
- }
492
- },
493
- onDragLeave: () => setEdge(null),
494
- onDrop: ({ self, source }) => {
495
- setEdge(null);
496
- if (source.data.type === self.data.type) {
497
- onRearrange(source.data, self.data, extractClosestEdge(self.data));
498
- }
499
- }
500
- }));
501
- }, [
502
- item,
503
- onRearrange
504
- ]);
505
- return /* @__PURE__ */ React4.createElement(L0ItemRoot, {
506
- ref: itemElement,
507
- item,
508
- parent,
509
- path
510
- }, /* @__PURE__ */ React4.createElement("div", {
511
- role: "none",
512
- "data-frame": true,
513
- ...hue && {
514
- style: {
515
- background: `var(--dx-${hue}Surface)`
516
- }
517
- },
518
- className: mx2(l0ItemContent, pinned ? "p-2 group-hover/l0item:bg-activeSurface" : "is-[--l0-avatar-size] bs-[--l0-avatar-size] bg-activeSurface")
519
- }, /* @__PURE__ */ React4.createElement(ItemAvatar, {
520
- item
521
- })), /* @__PURE__ */ React4.createElement(L0ItemActiveTabIndicator, null), /* @__PURE__ */ React4.createElement("span", {
522
- id: `${item.id}__label`,
523
- className: "sr-only"
524
- }, localizedString), closestEdge && /* @__PURE__ */ React4.createElement(ListItem.DropIndicator, {
525
- edge: closestEdge
526
- }));
527
- } finally {
528
- _effect.f();
529
- }
530
- };
531
- var ItemAvatar = ({ item }) => {
532
- var _effect = _useSignals4();
533
- try {
534
- const { t } = useTranslation4(meta.id);
535
- const type = l0ItemType(item);
536
- if (item.properties.icon) {
537
- const hue = item.properties.hue ?? null;
538
- const hueFgStyle = hue && {
539
- style: {
540
- color: `var(--dx-${hue}SurfaceText)`
541
- }
542
- };
543
- return /* @__PURE__ */ React4.createElement(Icon3, {
544
- icon: item.properties.icon,
545
- size: 6,
546
- ...hueFgStyle
547
- });
548
- }
549
- if (type === "tab" && item.properties.disposition !== "pin-end") {
550
- const hue = item.properties.hue ?? null;
551
- const localizedString = toLocalizedString3(item.properties.label, t);
552
- return /* @__PURE__ */ React4.createElement(DxAvatar, {
553
- hue,
554
- hueVariant: "surface",
555
- variant: "square",
556
- size: 12,
557
- fallback: localizedString
558
- });
559
- }
560
- return null;
561
- } finally {
562
- _effect.f();
563
- }
564
- };
565
- var L0Collection = ({ item, path }) => {
566
- var _effect = _useSignals4();
567
- try {
568
- const navTreeContext = useNavTreeContext();
569
- useLoadDescendents(item);
570
- const collectionItems = navTreeContext.useItems(item);
571
- const groupPath = useMemo2(() => [
572
- ...path,
573
- item.id
574
- ], [
575
- item.id,
576
- path
577
- ]);
578
- const { id, testId } = navTreeContext.getProps?.(item, path) ?? {};
579
- const handleRearrange = useCallback((source, target, closestEdge) => {
580
- invariant(item.properties.onRearrangeChildren, void 0, {
581
- F: __dxlog_file,
582
- L: 271,
583
- S: void 0,
584
- A: [
585
- "item.properties.onRearrangeChildren",
586
- ""
587
- ]
588
- });
589
- const sourceIndex = collectionItems.findIndex((i) => i.id === source.id);
590
- const targetIndex = collectionItems.findIndex((i) => i.id === target.id);
591
- const insertIndex = source.id === target.id ? sourceIndex : targetIndex + (sourceIndex < targetIndex ? closestEdge === "top" ? -1 : 0 : closestEdge === "bottom" ? 1 : 0);
592
- const nextOrder = arrayMove([
593
- ...collectionItems
594
- ], sourceIndex, insertIndex);
595
- return item.properties.onRearrangeChildren(nextOrder);
596
- }, [
597
- collectionItems,
598
- item.properties.onRearrangeChildren
599
- ]);
600
- return /* @__PURE__ */ React4.createElement("div", {
601
- role: "group",
602
- className: "contents group/l0c",
603
- "aria-labelledby": `${item.id}__label`,
604
- "data-object-id": id,
605
- "data-testid": testId
606
- }, collectionItems.map((collectionItem) => /* @__PURE__ */ React4.createElement(L0Item, {
607
- key: collectionItem.id,
608
- item: collectionItem,
609
- parent: item,
610
- path: groupPath,
611
- ...item.properties.onRearrangeChildren && {
612
- onRearrange: handleRearrange
613
- }
614
- })));
615
- } finally {
616
- _effect.f();
617
- }
618
- };
619
- var L0Menu = ({ menuActions, topLevelItems, pinnedItems, userAccountItem, parent, path }) => {
620
- var _effect = _useSignals4();
621
- try {
622
- const { t } = useTranslation4(meta.id);
623
- return /* @__PURE__ */ React4.createElement(Tabs.Tablist, {
624
- classNames: [
625
- "group/l0 absolute z-[1] inset-block-0 inline-start-0 rounded-is",
626
- "grid grid-cols-[var(--l0-size)] grid-rows-[var(--rail-size)_1fr_min-content_var(--l0-size)] contain-layout",
627
- "!is-[--l0-size] bg-baseSurface border-ie border-subduedSeparator app-drag pbe-[env(safe-area-inset-bottom)]"
628
- ]
629
- }, /* @__PURE__ */ React4.createElement(MenuProvider, null, /* @__PURE__ */ React4.createElement(DropdownMenu.Root, {
630
- group: parent,
631
- items: menuActions
632
- }, /* @__PURE__ */ React4.createElement(Tooltip.Trigger, {
633
- content: t("app menu label"),
634
- side: "right",
635
- asChild: true
636
- }, /* @__PURE__ */ React4.createElement(Tabs.TabPrimitive, {
637
- value: "options",
638
- asChild: true,
639
- role: "button"
640
- }, /* @__PURE__ */ React4.createElement(DropdownMenu.Trigger, {
641
- "data-testid": "spacePlugin.addSpace",
642
- className: mx2(l0ItemRoot, "grid place-items-center dx-focus-ring-group")
643
- }, /* @__PURE__ */ React4.createElement("div", {
644
- role: "none",
645
- className: mx2(l0ItemContent, "is-[--rail-action] bs-[--rail-action] group-hover/l0item:bg-hoverSurface")
646
- }, /* @__PURE__ */ React4.createElement(Icon3, {
647
- icon: "ph--list--regular",
648
- size: 5
649
- }))))))), /* @__PURE__ */ React4.createElement(ScrollArea.Root, null, /* @__PURE__ */ React4.createElement(ScrollArea.Viewport, null, /* @__PURE__ */ React4.createElement("div", {
650
- role: "none",
651
- className: mx2([
652
- "flex flex-col gap-1 pbs-1",
653
- '[body[data-platform="darwin"]_&]:pbs-[calc(30px+0.25rem)]',
654
- '[body[data-platform="ios"]_&]:pbs-[max(env(safe-area-inset-top),0.25rem)]'
655
- ])
656
- }, topLevelItems.map((item) => {
657
- if (l0ItemType(item) === "collection") {
658
- return /* @__PURE__ */ React4.createElement(L0Collection, {
659
- key: item.id,
660
- item,
661
- parent,
662
- path
663
- });
664
- } else {
665
- return /* @__PURE__ */ React4.createElement(L0Item, {
666
- key: item.id,
667
- item,
668
- parent,
669
- path
670
- });
671
- }
672
- })), /* @__PURE__ */ React4.createElement(ScrollArea.Scrollbar, {
673
- orientation: "vertical"
674
- }, /* @__PURE__ */ React4.createElement(ScrollArea.Thumb, null)))), /* @__PURE__ */ React4.createElement("div", {
675
- role: "none",
676
- className: "grid grid-cols-1 auto-rows-[--rail-action] pbs-2"
677
- }, pinnedItems.filter((item) => l0ItemType(item) !== "collection").map((item) => /* @__PURE__ */ React4.createElement(L0Item, {
678
- key: item.id,
679
- item,
680
- parent,
681
- path,
682
- pinned: true
683
- }))), userAccountItem && /* @__PURE__ */ React4.createElement("div", {
684
- role: "none",
685
- className: "grid app-no-drag"
686
- }, /* @__PURE__ */ React4.createElement(L0ItemRoot, {
687
- key: userAccountItem.id,
688
- item: userAccountItem,
689
- parent,
690
- path
691
- }, /* @__PURE__ */ React4.createElement(UserAccountAvatar, {
692
- userId: userAccountItem.properties.userId,
693
- hue: userAccountItem.properties.hue,
694
- emoji: userAccountItem.properties.emoji,
695
- status: userAccountItem.properties.status,
696
- size: 10
697
- }))), /* @__PURE__ */ React4.createElement("div", {
698
- role: "none",
699
- className: 'hidden [body[data-platform="darwin"]_&]:block absolute block-start-0 is-[calc(var(--l0-size)-1px)] bs-[calc(40px+0.25rem)]',
700
- style: {
701
- background: "linear-gradient(to bottom, var(--dx-sidebarSurface) 0%, var(--dx-sidebarSurface) 70%, transparent 100%)"
702
- }
703
- }));
704
- } finally {
705
- _effect.f();
706
- }
707
- };
708
-
709
- // src/components/Sidebar/L1Panel.tsx
710
- import { useSignals as _useSignals7 } from "@preact-signals/safe-react/tracking";
711
- import React7, { useCallback as useCallback2, useMemo as useMemo3 } from "react";
712
- import { DensityProvider, IconButton as IconButton2, toLocalizedString as toLocalizedString6, useTranslation as useTranslation7 } from "@dxos/react-ui";
713
- import { Tree } from "@dxos/react-ui-list";
714
- import { Tabs as Tabs2 } from "@dxos/react-ui-tabs";
715
- import { hoverableControlItem as hoverableControlItem2, hoverableOpenControlItem as hoverableOpenControlItem2 } from "@dxos/react-ui-theme";
716
-
717
- // src/components/NavTreeItem/NavTreeItemAction.tsx
718
- import { useSignals as _useSignals5 } from "@preact-signals/safe-react/tracking";
719
- import React5 from "react";
720
- import { IconButton, toLocalizedString as toLocalizedString4, useDensityContext, useTranslation as useTranslation5 } from "@dxos/react-ui";
721
- import { DropdownMenu as DropdownMenu2, MenuProvider as MenuProvider2 } from "@dxos/react-ui-menu";
722
- import { hoverableControlItem, hoverableOpenControlItem } from "@dxos/react-ui-theme";
723
- var fallbackIcon = "ph--placeholder--regular";
724
- var fineActionButtonProps = {
725
- size: 4,
726
- density: "fine"
727
- };
728
- var coarseActionButtonProps = {
729
- size: 5,
730
- density: "coarse"
731
- };
732
- var NavTreeItemActionDropdownMenu = ({ parent, label, icon, testId, menuActions, caller }) => {
733
- var _effect = _useSignals5();
734
- try {
735
- const { t } = useTranslation5(meta.id);
736
- const density = useDensityContext();
737
- return /* @__PURE__ */ React5.createElement(MenuProvider2, null, /* @__PURE__ */ React5.createElement(DropdownMenu2.Root, {
738
- group: parent,
739
- items: menuActions,
740
- caller
741
- }, /* @__PURE__ */ React5.createElement(DropdownMenu2.Trigger, {
742
- asChild: true
743
- }, /* @__PURE__ */ React5.createElement(IconButton, {
744
- ...density === "coarse" ? coarseActionButtonProps : fineActionButtonProps,
745
- classNames: [
746
- "shrink-0 pli-2 pointer-fine:pli-1",
747
- hoverableControlItem,
748
- hoverableOpenControlItem
749
- ],
750
- variant: "ghost",
751
- icon: icon ?? fallbackIcon,
752
- iconOnly: true,
753
- label: toLocalizedString4(label, t),
754
- "data-testid": testId
755
- }))));
756
- } finally {
757
- _effect.f();
758
- }
759
- };
760
- var NavTreeItemMonolithicAction = ({ parent, properties: { disabled, caller, testId, icon, variant = "ghost", iconOnly = true } = {
761
- label: "never"
762
- }, data: invoke, baseLabel }) => {
763
- var _effect = _useSignals5();
764
- try {
765
- const density = useDensityContext();
766
- return /* @__PURE__ */ React5.createElement(IconButton, {
767
- ...density === "coarse" ? coarseActionButtonProps : fineActionButtonProps,
768
- variant,
769
- classNames: [
770
- "shrink-0",
771
- hoverableControlItem,
772
- hoverableOpenControlItem,
773
- iconOnly ? "pli-2 pointer-fine:pli-1" : "p-2 pointer-fine:p-2 mie-1"
774
- ],
775
- icon: icon ?? fallbackIcon,
776
- iconOnly,
777
- label: baseLabel,
778
- disabled,
779
- onClick: (event) => {
780
- event.stopPropagation();
781
- if (disabled) {
782
- return;
783
- }
784
- void invoke?.(caller ? {
785
- parent,
786
- caller
787
- } : {
788
- parent
789
- });
790
- },
791
- "data-testid": testId
792
- });
793
- } finally {
794
- _effect.f();
795
- }
796
- };
797
- var NavTreeItemAction = ({ monolithic, menuActions, parent: node, ...props }) => {
798
- var _effect = _useSignals5();
799
- try {
800
- const { t } = useTranslation5(meta.id);
801
- const monolithicAction = menuActions?.length === 1 && menuActions[0];
802
- const baseLabel = toLocalizedString4(monolithicAction ? monolithicAction.properties.label : props.label, t);
803
- return monolithic && menuActions?.length === 1 ? /* @__PURE__ */ React5.createElement(NavTreeItemMonolithicAction, {
804
- baseLabel,
805
- parent: node,
806
- ...menuActions[0]
807
- }) : /* @__PURE__ */ React5.createElement(NavTreeItemActionDropdownMenu, {
808
- ...props,
809
- label: baseLabel,
810
- parent: node,
811
- menuActions
812
- });
813
- } finally {
814
- _effect.f();
815
- }
816
- };
817
-
818
- // src/components/NavTreeItem/NavTreeItemColumns.tsx
819
- import { useSignals as _useSignals6 } from "@preact-signals/safe-react/tracking";
820
- import React6, { Fragment, memo } from "react";
821
- import { isAction as isAction2 } from "@dxos/app-graph";
822
- import { Popover, Treegrid, toLocalizedString as toLocalizedString5, useTranslation as useTranslation6 } from "@dxos/react-ui";
823
- var NavTreeItemColumns = /* @__PURE__ */ memo(({ path, item, open }) => {
824
- var _effect = _useSignals6();
825
- try {
826
- const { t } = useTranslation6(meta.id);
827
- const { useActions: useActions3, renderItemEnd: ItemEnd, popoverAnchorId } = useNavTreeContext();
828
- const level = path.length - 2;
829
- const { actions: _actions, groupedActions } = useActions3(item);
830
- const [primaryAction, ...secondaryActions] = _actions.toSorted((a, _b) => a.properties?.disposition === "list-item-primary" ? -1 : 1);
831
- const actions = (primaryAction?.properties?.disposition === "list-item-primary" ? secondaryActions : _actions).flatMap((action) => isAction2(action) ? [
832
- action
833
- ] : []).filter((a) => [
834
- "list-item",
835
- "list-item-primary"
836
- ].includes(a.properties?.disposition));
837
- useLoadDescendents(item);
838
- useLoadDescendents(primaryAction && !isAction2(primaryAction) ? primaryAction : void 0);
839
- const ActionRoot = popoverAnchorId === `dxos.org/ui/${NAV_TREE_ITEM}/${item.id}` ? Popover.Anchor : Fragment;
840
- return /* @__PURE__ */ React6.createElement("div", {
841
- role: "none",
842
- className: "contents app-no-drag"
843
- }, primaryAction?.properties?.disposition === "list-item-primary" && !primaryAction?.properties?.disabled ? /* @__PURE__ */ React6.createElement(Treegrid.Cell, {
844
- classNames: "contents"
845
- }, /* @__PURE__ */ React6.createElement(NavTreeItemAction, {
846
- testId: primaryAction.properties?.testId,
847
- label: toLocalizedString5(primaryAction.properties?.label, t),
848
- icon: primaryAction.properties?.icon ?? "ph--placeholder--regular",
849
- parent: item,
850
- monolithic: isAction2(primaryAction),
851
- menuActions: isAction2(primaryAction) ? [
852
- primaryAction
853
- ] : groupedActions[primaryAction.id],
854
- menuType: primaryAction.properties?.menuType,
855
- caller: NAV_TREE_ITEM
856
- })) : /* @__PURE__ */ React6.createElement(Treegrid.Cell, {
857
- role: "none"
858
- }), /* @__PURE__ */ React6.createElement(ActionRoot, null, actions.length > 0 ? /* @__PURE__ */ React6.createElement(Treegrid.Cell, {
859
- classNames: "contents"
860
- }, /* @__PURE__ */ React6.createElement(NavTreeItemAction, {
861
- testId: `navtree.treeItem.actionsLevel${level}`,
862
- label: t("tree item actions label"),
863
- icon: "ph--dots-three-vertical--regular",
864
- parent: item,
865
- menuActions: actions,
866
- menuType: "dropdown",
867
- caller: NAV_TREE_ITEM
868
- })) : /* @__PURE__ */ React6.createElement(Treegrid.Cell, {
869
- role: "none"
870
- })), ItemEnd && /* @__PURE__ */ React6.createElement(Treegrid.Cell, {
871
- classNames: "contents"
872
- }, /* @__PURE__ */ React6.createElement(ItemEnd, {
873
- node: item,
874
- open
875
- })));
876
- } finally {
877
- _effect.f();
878
- }
879
- });
880
-
881
- // src/components/Sidebar/L1Panel.tsx
882
- var L1Panel = ({ open, path, item, currentItemId, onBack }) => {
883
- var _effect = _useSignals7();
884
- try {
885
- const { t } = useTranslation7(meta.id);
886
- const { isAlternateTree, ...navTreeContext } = useNavTreeContext();
887
- const title = toLocalizedString6(item.properties.label, t);
888
- const { useItems: useItems2 } = navTreeContext;
889
- const alternateTree = useItems2(item, {
890
- disposition: "alternate-tree"
891
- })[0];
892
- const alternatePath = useMemo3(() => [
893
- ...path,
894
- item.id
895
- ], [
896
- item.id,
897
- path
898
- ]);
899
- const isAlternate = isAlternateTree?.(alternatePath, item) ?? false;
900
- const useAlternateItems = useCallback2((node, { disposition } = {}) => {
901
- return useItems2(node, {
902
- disposition,
903
- sort: node?.id === alternateTree.id
904
- });
905
- }, [
906
- alternateTree,
907
- useItems2
908
- ]);
909
- return /* @__PURE__ */ React7.createElement(Tabs2.Tabpanel, {
910
- key: item.id,
911
- value: item.id,
912
- classNames: [
913
- "absolute inset-block-0 inline-end-0",
914
- "is-[calc(100%-var(--l0-size))] lg:is-[--l1-size] grid-cols-1 grid-rows-[var(--rail-size)_1fr]",
915
- "pbs-[env(safe-area-inset-top)]",
916
- item.id === currentItemId && "grid"
917
- ],
918
- tabIndex: -1,
919
- "aria-label": title,
920
- ...!open && {
921
- inert: true
922
- }
923
- }, item.id === currentItemId && /* @__PURE__ */ React7.createElement(DensityProvider, {
924
- density: "fine"
925
- }, /* @__PURE__ */ React7.createElement(L1PanelHeader, {
926
- path,
927
- item,
928
- currentItemId,
929
- onBack
930
- }), /* @__PURE__ */ React7.createElement("div", {
931
- role: "none",
932
- className: "overflow-y-auto"
933
- }, isAlternate ? /* @__PURE__ */ React7.createElement(Tree, {
934
- ...navTreeContext,
935
- id: alternateTree.id,
936
- root: alternateTree,
937
- path: alternatePath,
938
- levelOffset: 5,
939
- gridTemplateColumns: "[tree-row-start] 1fr min-content min-content min-content [tree-row-end]",
940
- renderColumns: NavTreeItemColumns,
941
- useItems: useAlternateItems
942
- }) : /* @__PURE__ */ React7.createElement(Tree, {
943
- ...navTreeContext,
944
- id: item.id,
945
- root: item,
946
- path,
947
- levelOffset: 5,
948
- gridTemplateColumns: "[tree-row-start] 1fr min-content min-content min-content [tree-row-end]",
949
- renderColumns: NavTreeItemColumns,
950
- draggable: true
951
- }))));
952
- } finally {
953
- _effect.f();
954
- }
955
- };
956
- var L1PanelHeader = ({ item, path, onBack }) => {
957
- var _effect = _useSignals7();
958
- try {
959
- const { t } = useTranslation7(meta.id);
960
- const { isAlternateTree, setAlternateTree, ...navTreeContext } = useNavTreeContext();
961
- const title = toLocalizedString6(item.properties.label, t);
962
- const alternateTree = navTreeContext.useItems(item, {
963
- disposition: "alternate-tree"
964
- })[0];
965
- const alternatePath = useMemo3(() => [
966
- ...path,
967
- item.id
968
- ], [
969
- item.id,
970
- path
971
- ]);
972
- const isAlternate = isAlternateTree?.(alternatePath, item) ?? false;
973
- const backCapable = item.id.startsWith("!") || isAlternate;
974
- const handleOpen = useCallback2(() => {
975
- setAlternateTree?.(alternatePath, true);
976
- }, [
977
- alternatePath,
978
- setAlternateTree
979
- ]);
980
- const handleBack = useCallback2(() => {
981
- if (isAlternate) {
982
- setAlternateTree?.(alternatePath, false);
983
- } else {
984
- onBack?.();
985
- }
986
- }, [
987
- isAlternate,
988
- alternatePath,
989
- setAlternateTree,
990
- onBack
991
- ]);
992
- return /* @__PURE__ */ React7.createElement("div", {
993
- className: "flex is-full items-center border-be border-subduedSeparator app-drag density-coarse"
994
- }, /* @__PURE__ */ React7.createElement("div", {
995
- className: "is-6"
996
- }), /* @__PURE__ */ React7.createElement("h2", {
997
- className: "flex-1 truncate min-is-0"
998
- }, title), backCapable && /* @__PURE__ */ React7.createElement(IconButton2, {
999
- variant: "ghost",
1000
- icon: "ph--arrow-u-down-left--regular",
1001
- iconOnly: true,
1002
- label: t("button back"),
1003
- classNames: [
1004
- hoverableControlItem2,
1005
- hoverableOpenControlItem2,
1006
- "pointer-fine:pli-1"
1007
- ],
1008
- onClick: handleBack
1009
- }) || alternateTree && !isAlternate && /* @__PURE__ */ React7.createElement(IconButton2, {
1010
- "data-testid": "treeView.alternateTreeButton",
1011
- variant: "ghost",
1012
- icon: alternateTree.properties.icon ?? "ph--placeholder--regular",
1013
- iconOnly: true,
1014
- label: toLocalizedString6(alternateTree.properties.label ?? alternateTree.id, t),
1015
- classNames: [
1016
- hoverableControlItem2,
1017
- hoverableOpenControlItem2,
1018
- "pointer-fine:pli-1"
1019
- ],
1020
- onClick: handleOpen
1021
- }), /* @__PURE__ */ React7.createElement(NavTreeItemColumns, {
1022
- open: true,
1023
- path,
1024
- item,
1025
- density: "coarse"
1026
- }));
1027
- } finally {
1028
- _effect.f();
1029
- }
1030
- };
1031
-
1032
- // src/components/Sidebar/L1Tabs.tsx
1033
- import { useSignals as _useSignals8 } from "@preact-signals/safe-react/tracking";
1034
- import React8, { useMemo as useMemo4 } from "react";
1035
- var L1Tabs = ({ topLevelItems, onBack, ...props }) => {
1036
- var _effect = _useSignals8();
1037
- try {
1038
- return /* @__PURE__ */ React8.createElement(React8.Fragment, null, topLevelItems.map((item) => {
1039
- const type = l0ItemType(item);
1040
- switch (type) {
1041
- case "tab":
1042
- return /* @__PURE__ */ React8.createElement(L1Panel, {
1043
- key: item.id,
1044
- item,
1045
- ...props,
1046
- onBack
1047
- });
1048
- case "collection":
1049
- return /* @__PURE__ */ React8.createElement(L1PanelCollection, {
1050
- key: item.id,
1051
- item,
1052
- ...props
1053
- });
1054
- default:
1055
- return null;
1056
- }
1057
- }));
1058
- } finally {
1059
- _effect.f();
1060
- }
1061
- };
1062
- var L1PanelCollection = ({ item, path, ...props }) => {
1063
- var _effect = _useSignals8();
1064
- try {
1065
- const { useItems: useItems2 } = useNavTreeContext();
1066
- useLoadDescendents(item);
1067
- const collectionItems = useItems2(item);
1068
- const groupPath = useMemo4(() => [
1069
- ...path,
1070
- item.id
1071
- ], [
1072
- item.id,
1073
- path
1074
- ]);
1075
- return /* @__PURE__ */ React8.createElement(React8.Fragment, null, collectionItems.filter((item2) => l0ItemType(item2) === "tab").map((item2) => /* @__PURE__ */ React8.createElement(L1Panel, {
1076
- key: item2.id,
1077
- item: item2,
1078
- path: groupPath,
1079
- ...props
1080
- })));
1081
- } finally {
1082
- _effect.f();
1083
- }
1084
- };
1085
-
1086
- // src/components/NavTree/NavTree.tsx
1087
- var NAV_TREE_ITEM = "NavTreeItem";
1088
- var NavTree = /* @__PURE__ */ forwardRef3(({ id, root, ...props }, forwardedRef) => {
1089
- var _effect = _useSignals9();
1090
- try {
1091
- const { tab, useItems: useItems2, onBack } = useNavTreeContext();
1092
- const topLevelActions = useItems2(root, {
1093
- disposition: "menu",
1094
- sort: true
1095
- });
1096
- const topLevelCollections = useItems2(root, {
1097
- disposition: "collection"
1098
- });
1099
- const topLevelWorkspaces = useItems2(root, {
1100
- disposition: "workspace"
1101
- });
1102
- const topLevelNavigation = useItems2(root, {
1103
- disposition: "navigation"
1104
- });
1105
- const l0Items = useMemo5(() => [
1106
- // prettier-ignore
1107
- ...topLevelCollections,
1108
- ...topLevelWorkspaces,
1109
- ...topLevelNavigation
1110
- ], [
1111
- topLevelCollections,
1112
- topLevelWorkspaces,
1113
- topLevelNavigation
1114
- ]);
1115
- const pinnedItems = useItems2(root, {
1116
- disposition: "pin-end",
1117
- sort: true
1118
- });
1119
- const userAccountItem = useItems2(root, {
1120
- disposition: "user-account"
1121
- })[0];
1122
- const topLevelItems = useMemo5(() => [
1123
- // prettier-ignore
1124
- ...l0Items,
1125
- ...pinnedItems,
1126
- ...userAccountItem ? [
1127
- userAccountItem
1128
- ] : []
1129
- ], [
1130
- l0Items,
1131
- pinnedItems,
1132
- userAccountItem
1133
- ]);
1134
- useLoadDescendents(root);
1135
- const path = useMemo5(() => [
1136
- id
1137
- ], [
1138
- id
1139
- ]);
1140
- return (
1141
- // TODO(thure): `Tabs.Root` forces all items that should be able to receive focus to use `Tabs.Tab(Primitive)` since
1142
- // it uses RovingFocus and doesn’t support moving focus to an item that is not a tab. Assess whether this situation
1143
- // should change including whether it should motivate a change in the design/taxonomy, or if this means this should
1144
- // not use `react-ui-tabs` at all.
1145
- /* @__PURE__ */ React9.createElement(Tabs3.Root, {
1146
- value: tab,
1147
- orientation: "vertical",
1148
- verticalVariant: "stateless",
1149
- classNames: "relative",
1150
- ref: forwardedRef
1151
- }, /* @__PURE__ */ React9.createElement(L0Menu, {
1152
- menuActions: topLevelActions,
1153
- topLevelItems: l0Items,
1154
- pinnedItems,
1155
- userAccountItem,
1156
- path,
1157
- parent: root
1158
- }), /* @__PURE__ */ React9.createElement(L1Tabs, {
1159
- topLevelItems,
1160
- path,
1161
- currentItemId: tab,
1162
- onBack,
1163
- ...props
1164
- }))
1165
- );
1166
- } finally {
1167
- _effect.f();
1168
- }
1169
- });
1170
-
1171
- // src/components/NavTreeContainer.tsx
1172
- var NODE_TYPE = "dxos/app-graph/node";
1173
- var renderItemEnd = ({ node, open }) => /* @__PURE__ */ React10.createElement(Surface, {
1174
- role: "navtree-item-end",
1175
- data: {
1176
- id: node.id,
1177
- subject: node.data,
1178
- open
1179
- },
1180
- limit: 1
1181
- });
1182
- var getChildrenFilter = (node) => untracked(() => !isActionLike2(node) && node.type !== PLANK_COMPANION_TYPE && node.properties.disposition !== "hidden");
1183
- var filterItems = (node, disposition) => {
1184
- if (!disposition && (node.properties.disposition === "hidden" || node.properties.disposition === "alternate-tree")) {
1185
- return false;
1186
- } else if (!disposition) {
1187
- const action = isAction3(node);
1188
- return !action || node.properties.disposition === "item";
1189
- } else {
1190
- return node.properties.disposition === disposition;
1191
- }
1192
- };
1193
- var getItems = (graph, node, disposition) => {
1194
- return graph.getConnections(node?.id ?? ROOT_ID, "outbound").filter((node2) => filterItems(node2, disposition));
1195
- };
1196
- var useItems = (node, options) => {
1197
- const { graph } = useAppGraph2();
1198
- const connections = useConnections(graph, node?.id ?? ROOT_ID);
1199
- const filtered = connections.filter((node2) => filterItems(node2, options?.disposition));
1200
- return options?.sort ? filtered.toSorted((a, b) => byPosition(a.properties, b.properties)) : filtered;
1201
- };
1202
- var useActions2 = (node) => {
1203
- const { graph } = useAppGraph2();
1204
- const actions = useGraphActions(graph, node.id);
1205
- return useMemo6(() => actions.reduce((acc, arg) => {
1206
- if (arg.properties.disposition === "item") {
1207
- return acc;
1208
- }
1209
- acc.actions.push(arg);
1210
- if (!isAction3(arg)) {
1211
- const actionGroup = graph.getActions(arg.id);
1212
- acc.groupedActions[arg.id] = actionGroup;
1213
- }
1214
- return acc;
1215
- }, {
1216
- actions: [],
1217
- groupedActions: {}
1218
- }), [
1219
- actions
1220
- ]);
1221
- };
1222
- var NavTreeContainer$ = /* @__PURE__ */ forwardRef4(({ tab, popoverAnchorId, topbar }, forwardedRef) => {
1223
- var _effect = _useSignals10();
1224
- try {
1225
- const [isLg] = useMediaQuery2("lg");
1226
- const { dispatchPromise: dispatch } = useIntentDispatcher3();
1227
- const { graph } = useAppGraph2();
1228
- const { isOpen, isCurrent, isAlternateTree, setItem } = useCapability(NavTreeCapabilities.State);
1229
- const layout = useLayout();
1230
- const { navigationSidebarState } = useSidebars(meta.id);
1231
- const getProps = useCallback3((node, path) => {
1232
- const children = getChildren(graph, node, path).filter(getChildrenFilter);
1233
- const parentOf = children.length > 0 ? children.map(({ id }) => id) : node.properties.role === "branch" ? [] : void 0;
1234
- return {
1235
- id: node.id,
1236
- parentOf,
1237
- disabled: node.properties.disabled,
1238
- label: node.properties.label ?? node.id,
1239
- className: mx3(node.properties.className, node.properties.modified && "italic"),
1240
- headingClassName: node.properties.headingClassName,
1241
- icon: node.properties.icon,
1242
- iconHue: node.properties.iconHue,
1243
- testId: node.properties.testId
1244
- };
1245
- }, [
1246
- graph
1247
- ]);
1248
- const loadDescendents = useCallback3((node) => {
1249
- graph.expand(node.id, "outbound");
1250
- graph.getConnections(node.id, "outbound").forEach((child) => {
1251
- graph.expand(child.id, "outbound");
1252
- });
1253
- }, [
1254
- graph
1255
- ]);
1256
- const handleOpenChange = useCallback3(({ item: { id }, path, open }) => {
1257
- setItem(path, "open", open);
1258
- graph.expand(id, "outbound");
1259
- }, [
1260
- graph
1261
- ]);
1262
- const handleTabChange = useCallback3(async (node) => {
1263
- await dispatch(createIntent3(LayoutAction3.UpdateSidebar, {
1264
- part: "sidebar",
1265
- options: {
1266
- state: node.id === tab ? navigationSidebarState === "expanded" ? isLg ? "collapsed" : "closed" : "expanded" : "expanded"
1267
- }
1268
- }));
1269
- await dispatch(createIntent3(LayoutAction3.SwitchWorkspace, {
1270
- part: "workspace",
1271
- subject: node.id
1272
- }));
1273
- if (layout.active.length === 0) {
1274
- const [item] = getItems(graph, node).filter((node2) => !isActionLike2(node2));
1275
- if (item && item.data) {
1276
- await dispatch(createIntent3(LayoutAction3.Open, {
1277
- part: "main",
1278
- subject: [
1279
- item.id
1280
- ]
1281
- }));
1282
- }
1283
- }
1284
- }, [
1285
- dispatch,
1286
- layout.active,
1287
- tab,
1288
- navigationSidebarState,
1289
- isLg
1290
- ]);
1291
- const blockInstruction = useCallback3(({ instruction, source, target }) => {
1292
- return target.item.properties.blockInstruction?.(source, instruction) ?? false;
1293
- }, []);
1294
- const canDrop = useCallback3(({ source, target }) => {
1295
- return target.item.properties.canDrop?.(source) ?? false;
1296
- }, []);
1297
- const canSelect = useCallback3(({ item }) => {
1298
- return item.properties.selectable ?? true;
1299
- }, []);
1300
- const handleSelect = useCallback3(({ item: node, path, option }) => {
1301
- if (!node.data) {
1302
- return;
1303
- }
1304
- if (isAction3(node)) {
1305
- const [parent] = graph.getConnections(node.id, "inbound");
1306
- void (parent && node.data({
1307
- parent,
1308
- caller: NAV_TREE_ITEM
1309
- }));
1310
- return;
1311
- }
1312
- const current = isCurrent(path, node);
1313
- if (!current) {
1314
- void dispatch(createIntent3(LayoutAction3.Open, {
1315
- part: "main",
1316
- subject: [
1317
- node.id
1318
- ],
1319
- options: {
1320
- key: node.properties.key
1321
- }
1322
- }));
1323
- } else if (option) {
1324
- void dispatch(createIntent3(LayoutAction3.Close, {
1325
- part: "main",
1326
- subject: [
1327
- node.id
1328
- ],
1329
- options: {
1330
- state: false
1331
- }
1332
- }));
1333
- } else {
1334
- void dispatch(createIntent3(LayoutAction3.ScrollIntoView, {
1335
- part: "current",
1336
- subject: node.id
1337
- }));
1338
- }
1339
- const defaultAction = graph.getActions(node.id).find((action) => action.properties?.disposition === "default");
1340
- if (isAction3(defaultAction)) {
1341
- void defaultAction.data();
1342
- }
1343
- if (!isLg) {
1344
- void dispatch(createIntent3(LayoutAction3.UpdateSidebar, {
1345
- part: "sidebar",
1346
- options: {
1347
- state: "closed"
1348
- }
1349
- }));
1350
- }
1351
- }, [
1352
- graph,
1353
- dispatch,
1354
- isCurrent,
1355
- isLg
1356
- ]);
1357
- const handleBack = useCallback3(() => dispatch(createIntent3(LayoutAction3.RevertWorkspace, {
1358
- part: "workspace",
1359
- options: {
1360
- revert: true
1361
- }
1362
- })), [
1363
- dispatch
1364
- ]);
1365
- useEffect3(() => {
1366
- return monitorForElements({
1367
- canMonitor: ({ source }) => isTreeData(source.data),
1368
- onDrop: ({ location, source }) => {
1369
- if (!location.current.dropTargets.length) {
1370
- return;
1371
- }
1372
- const target = location.current.dropTargets[0];
1373
- const instruction = extractInstruction(target.data);
1374
- if (instruction !== null && instruction.type !== "instruction-blocked") {
1375
- const sourceNode = source.data.item;
1376
- const targetNode = target.data.item;
1377
- const sourcePath = source.data.path;
1378
- const targetPath = target.data.path;
1379
- const operation = sourcePath.slice(0, -1).join() === targetPath.slice(0, -1).join() && instruction.type !== "make-child" ? "rearrange" : resolveMigrationOperation(graph, sourceNode, targetPath, targetNode);
1380
- const sourceParent = getParent(graph, sourceNode, sourcePath);
1381
- const targetParent = getParent(graph, targetNode, targetPath);
1382
- const sourceItems = getItems(graph, sourceParent);
1383
- const targetItems = getItems(graph, targetParent);
1384
- const sourceIndex = sourceItems.findIndex(({ id }) => id === sourceNode.id);
1385
- const targetIndex = targetItems.findIndex(({ id }) => id === targetNode.id);
1386
- const migrationIndex = instruction.type === "make-child" ? void 0 : instruction.type === "reorder-below" ? targetIndex + 1 : targetIndex;
1387
- switch (operation) {
1388
- case "rearrange": {
1389
- const nextItems = sourceItems.map(({ data }) => data);
1390
- arrayMove2(nextItems, sourceIndex, targetIndex);
1391
- void sourceParent?.properties.onRearrangeChildren?.(nextItems);
1392
- break;
1393
- }
1394
- case "copy": {
1395
- const target2 = instruction.type === "make-child" ? targetNode : targetParent;
1396
- void target2?.properties.onCopy?.(sourceNode, migrationIndex);
1397
- break;
1398
- }
1399
- case "transfer": {
1400
- const target2 = instruction.type === "make-child" ? targetNode : targetParent;
1401
- if (!target2?.properties.onTransferStart || !sourceParent?.properties.onTransferEnd) {
1402
- break;
1403
- }
1404
- void target2?.properties.onTransferStart(sourceNode, migrationIndex);
1405
- void sourceParent?.properties.onTransferEnd?.(sourceNode, target2);
1406
- break;
1407
- }
1408
- }
1409
- }
1410
- }
1411
- });
1412
- }, [
1413
- graph
1414
- ]);
1415
- const setAlternateTree = useCallback3((path, open) => {
1416
- setItem(path, "alternateTree", open);
1417
- }, [
1418
- setItem
1419
- ]);
1420
- const navTreeContextValue = useMemo6(() => ({
1421
- blockInstruction,
1422
- canDrop,
1423
- canSelect,
1424
- getProps,
1425
- isAlternateTree,
1426
- isCurrent,
1427
- isOpen,
1428
- loadDescendents,
1429
- onBack: handleBack,
1430
- onOpenChange: handleOpenChange,
1431
- onSelect: handleSelect,
1432
- onTabChange: handleTabChange,
1433
- popoverAnchorId,
1434
- renderItemEnd,
1435
- setAlternateTree,
1436
- tab,
1437
- topbar,
1438
- useActions: useActions2,
1439
- useItems
1440
- }), [
1441
- blockInstruction,
1442
- canDrop,
1443
- canSelect,
1444
- getProps,
1445
- handleBack,
1446
- handleOpenChange,
1447
- handleSelect,
1448
- handleTabChange,
1449
- isAlternateTree,
1450
- isCurrent,
1451
- isOpen,
1452
- loadDescendents,
1453
- popoverAnchorId,
1454
- renderItemEnd,
1455
- setAlternateTree,
1456
- tab,
1457
- topbar,
1458
- useActions2
1459
- ]);
1460
- return /* @__PURE__ */ React10.createElement(NavTreeContext.Provider, {
1461
- value: navTreeContextValue
1462
- }, /* @__PURE__ */ React10.createElement(NavTree, {
1463
- id: ROOT_ID,
1464
- root: graph.root,
1465
- open: layout.sidebarOpen,
1466
- ref: forwardedRef
1467
- }));
1468
- } finally {
1469
- _effect.f();
1470
- }
1471
- });
1472
- var NavTreeContainer = /* @__PURE__ */ memo2(NavTreeContainer$);
1473
-
1474
- export {
1475
- CommandsDialogContent,
1476
- CommandsTrigger,
1477
- getParent,
1478
- getPersistenceParent,
1479
- resolveMigrationOperation,
1480
- sortActions,
1481
- getChildren,
1482
- l0ItemType,
1483
- NODE_TYPE,
1484
- NavTreeContainer,
1485
- NavTreeDocumentTitle,
1486
- AppGraphBuilder,
1487
- IntentResolver,
1488
- Keyboard2 as Keyboard,
1489
- ReactSurface,
1490
- State
1491
- };
1492
- //# sourceMappingURL=chunk-5DWDYPGQ.mjs.map