@dxos/plugin-navtree 0.10.0 → 0.11.1

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 (187) hide show
  1. package/PLUGIN.mdl +8 -6
  2. package/dist/lib/NavTreePlugin.mjs +40 -0
  3. package/dist/lib/NavTreePlugin.mjs.map +1 -0
  4. package/dist/lib/capabilities.mjs +11 -0
  5. package/dist/lib/capabilities.mjs.map +1 -0
  6. package/dist/lib/chunk-CommandsDialogContent.mjs +100 -0
  7. package/dist/lib/chunk-CommandsDialogContent.mjs.map +1 -0
  8. package/dist/lib/chunk-CommandsTrigger.mjs +27 -0
  9. package/dist/lib/chunk-CommandsTrigger.mjs.map +1 -0
  10. package/dist/lib/chunk-NavTreeDocumentTitle.mjs +17 -0
  11. package/dist/lib/chunk-NavTreeDocumentTitle.mjs.map +1 -0
  12. package/dist/lib/chunk-app-graph-builder.mjs +33 -0
  13. package/dist/lib/chunk-app-graph-builder.mjs.map +1 -0
  14. package/dist/lib/chunk-expose.mjs +31 -0
  15. package/dist/lib/chunk-expose.mjs.map +1 -0
  16. package/dist/lib/chunk-keyboard.mjs +49 -0
  17. package/dist/lib/chunk-keyboard.mjs.map +1 -0
  18. package/dist/lib/{neutral/chunk-IRQMJLRY.mjs → chunk-meta.mjs} +14 -23
  19. package/dist/lib/chunk-meta.mjs.map +1 -0
  20. package/dist/lib/chunk-operation-handler.mjs +11 -0
  21. package/dist/lib/chunk-operation-handler.mjs.map +1 -0
  22. package/dist/lib/chunk-react-surface.mjs +46 -0
  23. package/dist/lib/chunk-react-surface.mjs.map +1 -0
  24. package/dist/lib/chunk-state.mjs +106 -0
  25. package/dist/lib/chunk-state.mjs.map +1 -0
  26. package/dist/lib/chunk-types.mjs +26 -0
  27. package/dist/lib/chunk-types.mjs.map +1 -0
  28. package/dist/lib/chunk-util.mjs +51 -0
  29. package/dist/lib/chunk-util.mjs.map +1 -0
  30. package/dist/lib/components.mjs +723 -0
  31. package/dist/lib/components.mjs.map +1 -0
  32. package/dist/lib/containers.mjs +231 -0
  33. package/dist/lib/containers.mjs.map +1 -0
  34. package/dist/lib/hooks.mjs +162 -0
  35. package/dist/lib/hooks.mjs.map +1 -0
  36. package/dist/lib/index.mjs +4 -0
  37. package/dist/lib/meta.mjs +2 -0
  38. package/dist/lib/operations.mjs +7 -0
  39. package/dist/lib/operations.mjs.map +1 -0
  40. package/dist/lib/plugin.mjs +9 -0
  41. package/dist/lib/plugin.mjs.map +1 -0
  42. package/dist/lib/testing.mjs +397 -0
  43. package/dist/lib/testing.mjs.map +1 -0
  44. package/dist/lib/translations.mjs +17 -0
  45. package/dist/lib/translations.mjs.map +1 -0
  46. package/dist/lib/types.mjs +2 -0
  47. package/dist/types/src/NavTreePlugin.d.ts.map +1 -1
  48. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  49. package/dist/types/src/capabilities/keyboard.d.ts +1 -1
  50. package/dist/types/src/capabilities/nav-tree-view-state.d.ts +12 -0
  51. package/dist/types/src/capabilities/nav-tree-view-state.d.ts.map +1 -0
  52. package/dist/types/src/capabilities/nav-tree-view-state.test.d.ts +2 -0
  53. package/dist/types/src/capabilities/nav-tree-view-state.test.d.ts.map +1 -0
  54. package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
  55. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  56. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  57. package/dist/types/src/capabilities/state.d.ts +1 -1
  58. package/dist/types/src/components/NavTree/NavTree.d.ts.map +1 -1
  59. package/dist/types/src/components/NavTree/NavTree.stories.d.ts +3 -0
  60. package/dist/types/src/components/NavTree/NavTree.stories.d.ts.map +1 -1
  61. package/dist/types/src/components/NavTreeContext/NavTreeContext.d.ts.map +1 -1
  62. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts +1 -1
  63. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts.map +1 -1
  64. package/dist/types/src/components/Sidebar/L0Menu.d.ts.map +1 -1
  65. package/dist/types/src/components/Sidebar/L1Panel.d.ts +5 -2
  66. package/dist/types/src/components/Sidebar/L1Panel.d.ts.map +1 -1
  67. package/dist/types/src/components/Sidebar/L1Tabs.d.ts.map +1 -1
  68. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.d.ts.map +1 -1
  69. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.stories.d.ts +2 -0
  70. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.stories.d.ts.map +1 -1
  71. package/dist/types/src/containers/CommandsTrigger/CommandsTrigger.d.ts +4 -1
  72. package/dist/types/src/containers/CommandsTrigger/CommandsTrigger.d.ts.map +1 -1
  73. package/dist/types/src/containers/NavTreeContainer/NavTreeContainer.d.ts.map +1 -1
  74. package/dist/types/src/containers/NavTreeDocumentTitle/NavTreeDocumentTitle.d.ts +5 -2
  75. package/dist/types/src/containers/NavTreeDocumentTitle/NavTreeDocumentTitle.d.ts.map +1 -1
  76. package/dist/types/src/experimental/Tree.d.ts +0 -1
  77. package/dist/types/src/experimental/Tree.d.ts.map +1 -1
  78. package/dist/types/src/experimental/Tree.stories.d.ts.map +1 -1
  79. package/dist/types/src/experimental/visit-nodes.d.ts +3 -0
  80. package/dist/types/src/experimental/visit-nodes.d.ts.map +1 -0
  81. package/dist/types/src/hooks/useActions.d.ts +3 -1
  82. package/dist/types/src/hooks/useActions.d.ts.map +1 -1
  83. package/dist/types/src/translations.d.ts +2 -0
  84. package/dist/types/src/translations.d.ts.map +1 -1
  85. package/dist/types/src/types/NavTreeCapabilities.d.ts +1 -1
  86. package/dist/types/src/types/NavTreeCapabilities.d.ts.map +1 -1
  87. package/dist/types/src/types/schema.d.ts +1 -1
  88. package/dist/types/src/types/schema.d.ts.map +1 -1
  89. package/dist/types/src/util.d.ts.map +1 -1
  90. package/dist/types/tsconfig.tsbuildinfo +1 -1
  91. package/package.json +47 -52
  92. package/src/NavTreePlugin.tsx +3 -1
  93. package/src/capabilities/nav-tree-view-state.test.ts +55 -0
  94. package/src/capabilities/nav-tree-view-state.ts +19 -0
  95. package/src/capabilities/{react-surface.tsx → react-surface.ts} +8 -9
  96. package/src/capabilities/state.ts +47 -38
  97. package/src/components/NavTree/NavTree.stories.tsx +26 -5
  98. package/src/components/NavTree/NavTree.tsx +10 -13
  99. package/src/components/NavTreeItem/NavTreeItemAction.tsx +1 -1
  100. package/src/components/Sidebar/L0Menu.tsx +9 -3
  101. package/src/components/Sidebar/L1Panel.tsx +52 -20
  102. package/src/components/Sidebar/L1Tabs.tsx +6 -0
  103. package/src/containers/CommandsDialogContent/CommandsDialogContent.tsx +49 -44
  104. package/src/containers/CommandsTrigger/CommandsTrigger.tsx +2 -0
  105. package/src/containers/NavTreeContainer/NavTreeContainer.tsx +17 -18
  106. package/src/containers/NavTreeDocumentTitle/NavTreeDocumentTitle.tsx +2 -0
  107. package/src/experimental/Tree.stories.tsx +2 -1
  108. package/src/experimental/Tree.tsx +2 -18
  109. package/src/experimental/visit-nodes.ts +27 -0
  110. package/src/hooks/useActions.ts +15 -4
  111. package/src/hooks/useNavTreeModel.ts +1 -1
  112. package/src/operations/expose.ts +2 -2
  113. package/src/testing/app-graph-builder.ts +1 -1
  114. package/src/translations.ts +3 -0
  115. package/src/types/NavTreeCapabilities.ts +1 -1
  116. package/src/types/schema.ts +1 -1
  117. package/src/util.ts +7 -9
  118. package/dist/lib/neutral/CommandsDialogContent-TEKBCQ3U.mjs +0 -112
  119. package/dist/lib/neutral/CommandsDialogContent-TEKBCQ3U.mjs.map +0 -7
  120. package/dist/lib/neutral/CommandsTrigger-HGCI22SP.mjs +0 -27
  121. package/dist/lib/neutral/CommandsTrigger-HGCI22SP.mjs.map +0 -7
  122. package/dist/lib/neutral/NavTreeContainer-ICDKC2GI.mjs +0 -12
  123. package/dist/lib/neutral/NavTreeContainer-ICDKC2GI.mjs.map +0 -7
  124. package/dist/lib/neutral/NavTreeDocumentTitle-RMERXZGK.mjs +0 -22
  125. package/dist/lib/neutral/NavTreeDocumentTitle-RMERXZGK.mjs.map +0 -7
  126. package/dist/lib/neutral/NavTreePlugin.mjs +0 -68
  127. package/dist/lib/neutral/NavTreePlugin.mjs.map +0 -7
  128. package/dist/lib/neutral/NavTreePlugin.node.mjs +0 -18
  129. package/dist/lib/neutral/NavTreePlugin.node.mjs.map +0 -7
  130. package/dist/lib/neutral/NavTreePlugin.workerd.mjs +0 -16
  131. package/dist/lib/neutral/NavTreePlugin.workerd.mjs.map +0 -7
  132. package/dist/lib/neutral/app-graph-builder-2DYAIROU.mjs +0 -42
  133. package/dist/lib/neutral/app-graph-builder-2DYAIROU.mjs.map +0 -7
  134. package/dist/lib/neutral/capabilities/index.mjs +0 -17
  135. package/dist/lib/neutral/capabilities/index.mjs.map +0 -7
  136. package/dist/lib/neutral/chunk-4RN6TH36.mjs +0 -292
  137. package/dist/lib/neutral/chunk-4RN6TH36.mjs.map +0 -7
  138. package/dist/lib/neutral/chunk-BAVI2K7A.mjs +0 -27
  139. package/dist/lib/neutral/chunk-BAVI2K7A.mjs.map +0 -7
  140. package/dist/lib/neutral/chunk-EAN4K6OL.mjs +0 -8
  141. package/dist/lib/neutral/chunk-EAN4K6OL.mjs.map +0 -7
  142. package/dist/lib/neutral/chunk-IRQMJLRY.mjs.map +0 -7
  143. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
  144. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
  145. package/dist/lib/neutral/chunk-JOSNCOV4.mjs +0 -79
  146. package/dist/lib/neutral/chunk-JOSNCOV4.mjs.map +0 -7
  147. package/dist/lib/neutral/components/index.mjs +0 -814
  148. package/dist/lib/neutral/components/index.mjs.map +0 -7
  149. package/dist/lib/neutral/containers/index.mjs +0 -20
  150. package/dist/lib/neutral/containers/index.mjs.map +0 -7
  151. package/dist/lib/neutral/expose-HIBA2NQG.mjs +0 -38
  152. package/dist/lib/neutral/expose-HIBA2NQG.mjs.map +0 -7
  153. package/dist/lib/neutral/hooks/index.mjs +0 -181
  154. package/dist/lib/neutral/hooks/index.mjs.map +0 -7
  155. package/dist/lib/neutral/index.mjs +0 -34
  156. package/dist/lib/neutral/index.mjs.map +0 -7
  157. package/dist/lib/neutral/keyboard-JM2HCF5N.mjs +0 -58
  158. package/dist/lib/neutral/keyboard-JM2HCF5N.mjs.map +0 -7
  159. package/dist/lib/neutral/meta.json +0 -1
  160. package/dist/lib/neutral/meta.mjs +0 -12
  161. package/dist/lib/neutral/meta.mjs.map +0 -7
  162. package/dist/lib/neutral/operation-handler-ORDOJUL2.mjs +0 -13
  163. package/dist/lib/neutral/operation-handler-ORDOJUL2.mjs.map +0 -7
  164. package/dist/lib/neutral/operations/index.mjs +0 -8
  165. package/dist/lib/neutral/operations/index.mjs.map +0 -7
  166. package/dist/lib/neutral/plugin.mjs +0 -16
  167. package/dist/lib/neutral/plugin.mjs.map +0 -7
  168. package/dist/lib/neutral/react-surface-QPMUEDZX.mjs +0 -48
  169. package/dist/lib/neutral/react-surface-QPMUEDZX.mjs.map +0 -7
  170. package/dist/lib/neutral/state-PDZU4PIP.mjs +0 -126
  171. package/dist/lib/neutral/state-PDZU4PIP.mjs.map +0 -7
  172. package/dist/lib/neutral/testing/index.mjs +0 -439
  173. package/dist/lib/neutral/testing/index.mjs.map +0 -7
  174. package/dist/lib/neutral/translations.mjs +0 -23
  175. package/dist/lib/neutral/translations.mjs.map +0 -7
  176. package/dist/lib/neutral/types/index.mjs +0 -10
  177. package/dist/lib/neutral/types/index.mjs.map +0 -7
  178. package/dist/types/src/NavTreePlugin.node.d.ts +0 -4
  179. package/dist/types/src/NavTreePlugin.node.d.ts.map +0 -1
  180. package/dist/types/src/NavTreePlugin.test.d.ts +0 -2
  181. package/dist/types/src/NavTreePlugin.test.d.ts.map +0 -1
  182. package/dist/types/src/NavTreePlugin.workerd.d.ts +0 -4
  183. package/dist/types/src/NavTreePlugin.workerd.d.ts.map +0 -1
  184. package/src/NavTreePlugin.node.ts +0 -17
  185. package/src/NavTreePlugin.test.ts +0 -27
  186. package/src/NavTreePlugin.workerd.ts +0 -16
  187. /package/src/components/NavTreeContext/{NavTreeContext.tsx → NavTreeContext.ts} +0 -0
@@ -0,0 +1,723 @@
1
+ import { a as l0ItemType } from "./chunk-util.mjs";
2
+ import { Position, arrayMove, hexToFallback } from "@dxos/util";
3
+ import { meta } from "#meta";
4
+ import { GraphPath } from "@dxos/app-toolkit";
5
+ import { Graph, Node } from "@dxos/plugin-graph";
6
+ import { Fragment, createContext, forwardRef, memo, useCallback, useContext, useLayoutEffect, useMemo, useRef, useState } from "react";
7
+ import { useAppGraph } from "@dxos/app-toolkit/ui";
8
+ import { useActionRunner, useActions, useConnections, useEdges } from "@dxos/plugin-graph/hooks";
9
+ import { Tabs } from "@dxos/react-ui-tabs";
10
+ import { getListActions, useActions as useActions$1, useLoadDescendents, useNavTreeState } from "#hooks";
11
+ import { raise } from "@dxos/debug";
12
+ import { attachClosestEdge, extractClosestEdge } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge";
13
+ import { combine } from "@atlaskit/pragmatic-drag-and-drop/combine";
14
+ import { draggable, dropTargetForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
15
+ import { preserveOffsetOnSource } from "@atlaskit/pragmatic-drag-and-drop/element/preserve-offset-on-source";
16
+ import { scrollJustEnoughIntoView } from "@atlaskit/pragmatic-drag-and-drop/element/scroll-just-enough-into-view";
17
+ import { useAtomValue } from "@effect-atom/atom-react";
18
+ import { DxAvatar } from "@dxos/lit-ui/react";
19
+ import { Avatar, DensityProvider, Icon, IconButton, Popover, ScrollArea, Tooltip, composable, composableProps, toLocalizedString, useDensityContext, useMediaQuery, useTranslation } from "@dxos/react-ui";
20
+ import { DropIndicator, Empty, Tree, Treegrid } from "@dxos/react-ui-list";
21
+ import { Menu } from "@dxos/react-ui-menu";
22
+ import { hoverableControlItem, hoverableOpenControlItem, mx } from "@dxos/ui-theme";
23
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
24
+ import * as Option from "effect/Option";
25
+ //#region src/components/NavTreeContext/NavTreeContext.ts
26
+ var NavTreeContext = createContext(null);
27
+ var useNavTreeContext = () => useContext(NavTreeContext) ?? raise(/* @__PURE__ */ new Error("Missing NavTreeContext"));
28
+ //#endregion
29
+ //#region src/components/UserAccountAvatar/UserAccountAvatar.tsx
30
+ var UserAccountAvatar = ({ size, userId, hue, emoji, status }) => {
31
+ const fallbackValue = hexToFallback(userId ?? "0");
32
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(L0ItemActiveTabIndicator, { classNames: "inset-y-6" }), /* @__PURE__ */ jsx("div", {
33
+ className: "grid place-items-center dx-focus-ring-group-indicator rounded-full",
34
+ "data-joyride": "welcome/account",
35
+ children: /* @__PURE__ */ jsx(Avatar.Root, { children: /* @__PURE__ */ jsx(Avatar.Content, {
36
+ variant: "circle",
37
+ size: size ?? 12,
38
+ status: status ?? "active",
39
+ hue: hue || fallbackValue.hue,
40
+ fallback: emoji || fallbackValue.emoji,
41
+ "data-testid": "treeView.userAccount"
42
+ }) })
43
+ })] });
44
+ };
45
+ //#endregion
46
+ //#region src/components/Sidebar/L0Menu.tsx
47
+ var useL0ItemClick = ({ item, parent, path }, type) => {
48
+ const { onSelect, onTabChange } = useNavTreeContext();
49
+ const { getItem } = useNavTreeState();
50
+ const [isLg] = useMediaQuery("lg");
51
+ const runAction = useActionRunner();
52
+ return useCallback((event) => {
53
+ switch (type) {
54
+ case "action": {
55
+ const { properties: { caller } = {} } = item;
56
+ runAction(item, caller ? {
57
+ parent,
58
+ path,
59
+ caller
60
+ } : {
61
+ parent,
62
+ path
63
+ });
64
+ return;
65
+ }
66
+ case "tab": return onTabChange?.(item);
67
+ case "link": return onSelect?.({
68
+ item,
69
+ path,
70
+ current: !getItem(path).current,
71
+ option: event.altKey,
72
+ shift: event.shiftKey
73
+ });
74
+ }
75
+ }, [
76
+ item,
77
+ parent,
78
+ type,
79
+ getItem,
80
+ onSelect,
81
+ onTabChange,
82
+ isLg,
83
+ runAction
84
+ ]);
85
+ };
86
+ var l0Breakpoints = { lg: "hidden lg:grid" };
87
+ var L0ItemRoot = memo(forwardRef(({ item, parent, path, onMouseEnter, children }, forwardedRef) => {
88
+ const { t } = useTranslation(meta.profile.key);
89
+ const { model } = useNavTreeContext();
90
+ const itemPath = useMemo(() => [...path, item.id], [item.id, path]);
91
+ const { id, testId } = useAtomValue(model.itemProps(itemPath));
92
+ const localizedString = toLocalizedString(item.properties.label, t);
93
+ const type = l0ItemType(item);
94
+ const handleClick = useL0ItemClick({
95
+ item,
96
+ parent,
97
+ path: itemPath
98
+ }, type);
99
+ return /* @__PURE__ */ jsx(Tooltip.Trigger, {
100
+ asChild: true,
101
+ delayDuration: 0,
102
+ side: "right",
103
+ content: localizedString,
104
+ children: /* @__PURE__ */ jsx(Tabs.TabPrimitive, {
105
+ className: mx("group/l0item flex w-full justify-center items-center relative", "dx-app-no-drag dx-focus-ring-group data[type!=\"collection\"]:cursor-pointer", l0Breakpoints[item.properties.l0Breakpoint]),
106
+ tabIndex: type === "tab" ? 0 : void 0,
107
+ "data-type": type,
108
+ "data-testid": testId,
109
+ "data-object-id": id,
110
+ value: item.id,
111
+ onClick: handleClick,
112
+ onMouseEnter,
113
+ ref: forwardedRef,
114
+ children
115
+ })
116
+ });
117
+ }));
118
+ var L0ItemActiveTabIndicator = ({ classNames }) => /* @__PURE__ */ jsx("div", { className: mx("hidden group-aria-selected/l0item:block absolute start-0 h-6 w-1.5 bg-accent-bg rounded-sm", classNames) });
119
+ var L0Item = memo(({ item, parent, path, pinned, onRearrange, onItemHover }) => {
120
+ const { t } = useTranslation(meta.profile.key);
121
+ const itemElement = useRef(null);
122
+ const [closestEdge, setEdge] = useState(null);
123
+ const localizedString = toLocalizedString(item.properties.label, t);
124
+ const hue = item.properties.hue ?? null;
125
+ useLayoutEffect(() => {
126
+ if (!itemElement.current || !onRearrange) return;
127
+ return combine(draggable({
128
+ element: itemElement.current,
129
+ getInitialData: () => ({
130
+ id: item.id,
131
+ type: "l0Item"
132
+ }),
133
+ onGenerateDragPreview: ({ nativeSetDragImage, source, location }) => {
134
+ document.body.setAttribute("data-drag-preview", "true");
135
+ const element = source.element.querySelector("[data-frame]");
136
+ scrollJustEnoughIntoView({ element });
137
+ const { x, y } = preserveOffsetOnSource({
138
+ element,
139
+ input: location.current.input
140
+ })({ container: element.offsetParent ?? document.body });
141
+ nativeSetDragImage?.(element, x, y);
142
+ },
143
+ onDragStart: () => {
144
+ document.body.removeAttribute("data-drag-preview");
145
+ itemElement.current.closest("[data-drag-autoscroll]")?.setAttribute("data-drag-autoscroll", "active");
146
+ },
147
+ onDrop: () => {
148
+ itemElement.current.closest("[data-drag-autoscroll]")?.setAttribute("data-drag-autoscroll", "idle");
149
+ }
150
+ }), dropTargetForElements({
151
+ element: itemElement.current,
152
+ getData: ({ input, element }) => {
153
+ return attachClosestEdge({
154
+ id: item.id,
155
+ type: "l0Item"
156
+ }, {
157
+ input,
158
+ element,
159
+ allowedEdges: ["top", "bottom"]
160
+ });
161
+ },
162
+ onDragEnter: ({ self, source }) => {
163
+ if (source.data.type === self.data.type) setEdge(extractClosestEdge(self.data));
164
+ },
165
+ onDrag: ({ self, source }) => {
166
+ if (source.data.type === self.data.type) setEdge(extractClosestEdge(self.data));
167
+ },
168
+ onDragLeave: () => setEdge(null),
169
+ onDrop: ({ self, source }) => {
170
+ setEdge(null);
171
+ if (source.data.type === self.data.type) onRearrange(source.data, self.data, extractClosestEdge(self.data));
172
+ }
173
+ }));
174
+ }, [item, onRearrange]);
175
+ return /* @__PURE__ */ jsxs(L0ItemRoot, {
176
+ ref: itemElement,
177
+ item,
178
+ parent,
179
+ path,
180
+ onMouseEnter: useCallback(() => onItemHover?.({ item }), [item, onItemHover]),
181
+ children: [
182
+ /* @__PURE__ */ jsx("div", {
183
+ "data-frame": true,
184
+ ...hue && { style: { background: `var(--color-${hue}-surface)` } },
185
+ className: mx("flex justify-center items-center dx-focus-ring-group-indicator transition-colors rounded-sm", pinned ? "p-2 group-hover/l0item:bg-current-surface" : "w-(--dx-l0-avatar-size) h-(--dx-l0-avatar-size) bg-current-surface"),
186
+ children: /* @__PURE__ */ jsx(ItemAvatar, { item })
187
+ }),
188
+ /* @__PURE__ */ jsx(L0ItemActiveTabIndicator, {}),
189
+ /* @__PURE__ */ jsx("span", {
190
+ id: `${item.id}__label`,
191
+ className: "sr-only",
192
+ children: localizedString
193
+ }),
194
+ closestEdge && /* @__PURE__ */ jsx(DropIndicator, { edge: closestEdge })
195
+ ]
196
+ });
197
+ });
198
+ var ItemAvatar = ({ item }) => {
199
+ const { t } = useTranslation(meta.profile.key);
200
+ if (item.properties.icon) {
201
+ const hue = item.properties.hue ?? null;
202
+ const hueFgStyle = hue && { style: { color: `var(--color-${hue}-fg)` } };
203
+ return /* @__PURE__ */ jsx(Icon, {
204
+ icon: item.properties.icon,
205
+ size: 6,
206
+ ...hueFgStyle
207
+ });
208
+ }
209
+ if (l0ItemType(item) === "tab" && item.properties.disposition !== "pin-end") return /* @__PURE__ */ jsx(DxAvatar, {
210
+ hue: item.properties.hue ?? null,
211
+ hueVariant: "surface",
212
+ variant: "square",
213
+ size: 12,
214
+ fallback: toLocalizedString(item.properties.label, t)
215
+ });
216
+ return null;
217
+ };
218
+ var L0Menu = ({ menuActions, topLevelItems, pinnedItems, userAccountItem, parent, path, onItemHover }) => {
219
+ const { t } = useTranslation(meta.profile.key);
220
+ const runAction = useActionRunner();
221
+ const handleAction = useCallback((action, params) => {
222
+ runAction(action, params);
223
+ }, [runAction]);
224
+ const handleRearrange = useCallback((source, target, closestEdge) => {
225
+ const sourceItem = topLevelItems.find((i) => i.id === source.id);
226
+ if (!sourceItem?.properties.onRearrange) return;
227
+ const sourceIndex = topLevelItems.findIndex((i) => i.id === source.id);
228
+ const targetIndex = topLevelItems.findIndex((i) => i.id === target.id);
229
+ const insertIndex = source.id === target.id ? sourceIndex : targetIndex + (sourceIndex < targetIndex ? closestEdge === "top" ? -1 : 0 : closestEdge === "bottom" ? 1 : 0);
230
+ const nextOrder = arrayMove([...topLevelItems], sourceIndex, insertIndex);
231
+ return sourceItem.properties.onRearrange(nextOrder.map((item) => item.data));
232
+ }, [topLevelItems]);
233
+ const hasRearrangeableItems = topLevelItems.some((item) => item.properties.onRearrange);
234
+ return /* @__PURE__ */ jsxs(Tabs.Tablist, {
235
+ "data-tauri-drag-region": true,
236
+ classNames: [
237
+ "group/l0 absolute z-[1] inset-y-0 start-0 rounded-is",
238
+ "grid grid-cols-[var(--dx-l0-size)] grid-rows-[var(--dx-rail-size)_1fr_min-content_var(--dx-l0-size)] dx-contain-layout",
239
+ "w-(--dx-l0-size) dx-l0-surface dx-app-drag pb-[env(safe-area-inset-bottom)]",
240
+ "[body[data-platform=\"macos\"]_&]:pt-[30px]",
241
+ "[body[data-platform=\"ios\"]_&]:pt-[max(env(safe-area-inset-top),0.25rem)]"
242
+ ],
243
+ children: [
244
+ /* @__PURE__ */ jsxs(Menu.Root, {
245
+ onAction: handleAction,
246
+ children: [/* @__PURE__ */ jsx(Menu.Trigger, {
247
+ asChild: true,
248
+ "data-testid": "spacePlugin.addSpace",
249
+ children: /* @__PURE__ */ jsx("div", {
250
+ className: "grid place-items-center",
251
+ children: /* @__PURE__ */ jsx(IconButton, {
252
+ density: "lg",
253
+ variant: "ghost",
254
+ size: 5,
255
+ icon: "ph--list--regular",
256
+ iconOnly: true,
257
+ square: true,
258
+ label: t("app-menu.label")
259
+ })
260
+ })
261
+ }), /* @__PURE__ */ jsx(Menu.Content, {
262
+ group: parent,
263
+ items: menuActions
264
+ })]
265
+ }),
266
+ /* @__PURE__ */ jsx(ScrollArea.Root, {
267
+ centered: true,
268
+ thin: true,
269
+ orientation: "vertical",
270
+ children: /* @__PURE__ */ jsx(ScrollArea.Viewport, {
271
+ classNames: "flex flex-col gap-2 py-1",
272
+ children: topLevelItems.map((item) => /* @__PURE__ */ jsx(L0Item, {
273
+ item,
274
+ parent,
275
+ path,
276
+ onItemHover,
277
+ ...hasRearrangeableItems && { onRearrange: handleRearrange }
278
+ }, item.id))
279
+ })
280
+ }),
281
+ /* @__PURE__ */ jsx("div", {
282
+ className: "grid grid-cols-1 auto-rows-(--dx-rail-action) pt-2",
283
+ children: pinnedItems.map((item) => /* @__PURE__ */ jsx(L0Item, {
284
+ item,
285
+ parent,
286
+ path,
287
+ pinned: true
288
+ }, item.id))
289
+ }),
290
+ userAccountItem && /* @__PURE__ */ jsx("div", {
291
+ className: "grid dx-app-no-drag",
292
+ children: /* @__PURE__ */ jsx(L0ItemRoot, {
293
+ item: userAccountItem,
294
+ parent,
295
+ path,
296
+ children: /* @__PURE__ */ jsx(UserAccountAvatar, {
297
+ userId: userAccountItem.properties.userId,
298
+ hue: userAccountItem.properties.hue,
299
+ emoji: userAccountItem.properties.emoji,
300
+ status: userAccountItem.properties.status,
301
+ size: 10
302
+ })
303
+ }, userAccountItem.id)
304
+ })
305
+ ]
306
+ });
307
+ };
308
+ //#endregion
309
+ //#region src/components/NavTreeItem/NavTreeItemAction.tsx
310
+ var fallbackIcon = "ph--circle-dashed--regular";
311
+ var mdActionButtonProps = {
312
+ size: 4,
313
+ density: "md"
314
+ };
315
+ var lgActionButtonProps = {
316
+ size: 5,
317
+ density: "lg"
318
+ };
319
+ var NavTreeItemActionDropdownMenu = composable(({ parent, path, label, icon, testId, menuActions, caller, ...props }, forwardedRef) => {
320
+ const { t } = useTranslation(meta.profile.key);
321
+ const density = useDensityContext();
322
+ const runAction = useActionRunner();
323
+ const handleAction = useCallback((action, params = {}) => runAction(action, {
324
+ ...params,
325
+ path
326
+ }), [runAction, path]);
327
+ return /* @__PURE__ */ jsxs(Menu.Root, {
328
+ caller,
329
+ onAction: handleAction,
330
+ children: [/* @__PURE__ */ jsx(Menu.Trigger, {
331
+ asChild: true,
332
+ children: /* @__PURE__ */ jsx(IconButton, {
333
+ ...density === "lg" ? lgActionButtonProps : mdActionButtonProps,
334
+ ...composableProps(props),
335
+ classNames: [
336
+ "shrink-0 px-2 pointer-fine:px-1",
337
+ hoverableControlItem,
338
+ hoverableOpenControlItem
339
+ ],
340
+ variant: "ghost",
341
+ icon: icon ?? fallbackIcon,
342
+ iconOnly: true,
343
+ label: toLocalizedString(label, t),
344
+ "data-testid": testId,
345
+ ref: forwardedRef
346
+ })
347
+ }), /* @__PURE__ */ jsx(Menu.Content, {
348
+ group: parent,
349
+ items: menuActions
350
+ })]
351
+ });
352
+ });
353
+ NavTreeItemActionDropdownMenu.displayName = "NavTreeItemActionDropdownMenu";
354
+ var NavTreeItemMonolithicAction = (props) => {
355
+ const { parent, path, properties: { disabled, caller, testId, icon, variant = "ghost", iconOnly = true } = { label: "never" }, baseLabel } = props;
356
+ const density = useDensityContext();
357
+ const runAction = useActionRunner();
358
+ return /* @__PURE__ */ jsx(IconButton, {
359
+ ...density === "lg" ? lgActionButtonProps : mdActionButtonProps,
360
+ variant,
361
+ classNames: [
362
+ "shrink-0",
363
+ hoverableControlItem,
364
+ hoverableOpenControlItem,
365
+ iconOnly ? "px-2 pointer-fine:px-1" : "p-2 pointer-fine:p-2 me-1"
366
+ ],
367
+ icon: icon ?? fallbackIcon,
368
+ iconOnly,
369
+ label: baseLabel,
370
+ disabled,
371
+ onClick: (event) => {
372
+ event.stopPropagation();
373
+ if (disabled) return;
374
+ runAction(props, caller ? {
375
+ parent,
376
+ caller,
377
+ path
378
+ } : {
379
+ parent,
380
+ path
381
+ });
382
+ },
383
+ "data-testid": testId
384
+ });
385
+ };
386
+ //#endregion
387
+ //#region src/components/NavTreeItem/NavTreeItemColumns.tsx
388
+ var NavTreeItemColumns = memo(({ path, item, open }) => {
389
+ const { t } = useTranslation(meta.profile.key);
390
+ const { renderItemEnd: ItemEnd, popoverAnchorId } = useNavTreeContext();
391
+ const level = path.length - 2;
392
+ const flattenedActions = useActions$1(item);
393
+ const allActions = useMemo(() => getListActions(flattenedActions), [flattenedActions]);
394
+ const anchored = popoverAnchorId === `${NAV_TREE_ITEM}:${item.id}`;
395
+ const ActionRoot = anchored ? Popover.Anchor : Fragment;
396
+ return /* @__PURE__ */ jsxs("div", {
397
+ className: "contents dx-app-no-drag",
398
+ ...anchored && { "data-popover-anchor": "" },
399
+ children: [/* @__PURE__ */ jsx(ActionRoot, { children: allActions.length === 1 ? /* @__PURE__ */ jsx(Treegrid.Cell, {
400
+ classNames: "contents",
401
+ children: /* @__PURE__ */ jsx(NavTreeItemMonolithicAction, {
402
+ baseLabel: toLocalizedString(allActions[0].properties?.label, t),
403
+ parent: item,
404
+ path,
405
+ ...allActions[0]
406
+ })
407
+ }) : allActions.length > 1 ? /* @__PURE__ */ jsx(Treegrid.Cell, {
408
+ classNames: "contents",
409
+ children: /* @__PURE__ */ jsx(NavTreeItemActionDropdownMenu, {
410
+ testId: `navtree.treeItem.actionsLevel${level}`,
411
+ label: t("tree-item-actions.label"),
412
+ icon: "ph--dots-three-vertical--regular",
413
+ parent: item,
414
+ path,
415
+ menuActions: allActions,
416
+ caller: NAV_TREE_ITEM
417
+ })
418
+ }) : /* @__PURE__ */ jsx(Treegrid.Cell, {}) }), ItemEnd && /* @__PURE__ */ jsx(Treegrid.Cell, {
419
+ classNames: "contents",
420
+ children: /* @__PURE__ */ jsx(ItemEnd, {
421
+ node: item,
422
+ open
423
+ })
424
+ })]
425
+ });
426
+ });
427
+ //#endregion
428
+ //#region src/components/Sidebar/L1Panel.tsx
429
+ /**
430
+ * Delay before the unavailable-workspace message appears: a workspace whose space is still loading has
431
+ * no graph node yet and materializes into a real panel on its own, so it must not flash during that window.
432
+ */
433
+ var RENDER_DELAY = "1s";
434
+ /**
435
+ * Space or settings panel. Without an `item` — a link to a workspace this identity never had or which no
436
+ * longer exists, or persisted deck state pointing at one after a profile switch — the panel body is the
437
+ * unavailable-workspace message, so the sidebar is never blank.
438
+ */
439
+ var L1PanelInner = ({ open, path, id, item, isCurrent, onBack }) => {
440
+ const { t } = useTranslation(meta.profile.key);
441
+ const title = item ? toLocalizedString(item.properties.label, t) : t("workspace-unavailable.heading");
442
+ const isActivated = useIsActivatedWorkspace(id);
443
+ const shouldRenderContent = isCurrent || isActivated;
444
+ return /* @__PURE__ */ jsx(Tabs.Panel, {
445
+ value: id,
446
+ classNames: [
447
+ "absolute inset-y-0 end-0",
448
+ "w-[calc(100%-var(--dx-l0-size))] lg:w-(--dx-l1-size) grid-cols-1 grid-rows-[var(--dx-rail-size)_1fr]",
449
+ "py-[env(safe-area-inset-top)]",
450
+ isCurrent && "grid"
451
+ ],
452
+ tabIndex: -1,
453
+ "aria-label": title,
454
+ ...!item && { "aria-labelledby": void 0 },
455
+ ...isCurrent && { "data-testid": item ? "navtree.workspace.visible" : "navtree.workspace.unavailable" },
456
+ ...!open && { inert: true },
457
+ children: shouldRenderContent && (item ? /* @__PURE__ */ jsx(L1PanelContent, {
458
+ open,
459
+ path,
460
+ item,
461
+ onBack
462
+ }) : /* @__PURE__ */ jsx(Empty, {
463
+ label: t("workspace-unavailable.description"),
464
+ classNames: "row-start-2 self-start animate-fade-in",
465
+ style: {
466
+ animationDelay: RENDER_DELAY,
467
+ animationFillMode: "backwards"
468
+ }
469
+ }))
470
+ }, id);
471
+ };
472
+ /** Determines whether a workspace tab has been populated with real child content (i.e. expanded at least once). */
473
+ var useIsActivatedWorkspace = (id) => {
474
+ const { graph } = useAppGraph();
475
+ const edges = useEdges(graph, id);
476
+ return useMemo(() => {
477
+ return (edges[Graph.relationKey("child")] ?? []).some((childId) => {
478
+ const child = Graph.getNode(graph, childId);
479
+ if (Option.isNone(child)) return false;
480
+ return child.value.properties.disposition === void 0;
481
+ });
482
+ }, [edges, graph]);
483
+ };
484
+ /**
485
+ * Mounted panel content for active or previously-visited tabs.
486
+ */
487
+ var L1PanelContent = ({ path, item, onBack }) => {
488
+ const navTreeContext = useNavTreeContext();
489
+ return /* @__PURE__ */ jsxs(DensityProvider, {
490
+ density: "md",
491
+ children: [/* @__PURE__ */ jsx(L1PanelHeader, {
492
+ path,
493
+ item,
494
+ onBack
495
+ }), /* @__PURE__ */ jsx(ScrollArea.Root, {
496
+ centered: true,
497
+ thin: true,
498
+ orientation: "vertical",
499
+ children: /* @__PURE__ */ jsx(ScrollArea.Viewport, { children: /* @__PURE__ */ jsx(Tree, {
500
+ classNames: "pt-[2px]",
501
+ model: navTreeContext.model,
502
+ id: item.id,
503
+ rootId: item.id,
504
+ path,
505
+ levelOffset: 5,
506
+ draggable: true,
507
+ gridTemplateColumns: "[tree-row-start] minmax(0, 1fr) min-content min-content [tree-row-end]",
508
+ renderColumns: NavTreeItemColumns,
509
+ blockInstruction: navTreeContext.blockInstruction,
510
+ canDrop: navTreeContext.canDrop,
511
+ canSelect: navTreeContext.canSelect,
512
+ onOpenChange: navTreeContext.onOpenChange,
513
+ onSelect: navTreeContext.onSelect,
514
+ onItemHover: navTreeContext.onItemHover
515
+ }) })
516
+ })]
517
+ });
518
+ };
519
+ /**
520
+ * Header row.
521
+ */
522
+ var L1PanelHeader = ({ item, path, onBack }) => {
523
+ const { t } = useTranslation(meta.profile.key);
524
+ const { renderItemEnd: ItemEnd } = useNavTreeContext();
525
+ const title = toLocalizedString(item.properties.label, t);
526
+ const backCapableWorkspace = GraphPath.isPinnedWorkspace(item.id);
527
+ const { menuActions, onAction } = useL1MenuActions({
528
+ item,
529
+ path
530
+ });
531
+ useLoadDescendents(item);
532
+ return /* @__PURE__ */ jsxs("div", {
533
+ "data-tauri-drag-region": true,
534
+ className: "grid grid-cols-[28px_1fr_min-content_min-content] w-full items-center dx-app-drag dx-density-lg",
535
+ children: [
536
+ backCapableWorkspace ? /* @__PURE__ */ jsx(IconButton, {
537
+ classNames: [hoverableControlItem, hoverableOpenControlItem],
538
+ variant: "ghost",
539
+ icon: "ph--caret-left--regular",
540
+ iconOnly: true,
541
+ size: 4,
542
+ label: t("button-back.button"),
543
+ "data-testid": "treeView.primaryTreeButton",
544
+ onClick: () => onBack?.()
545
+ }) : /* @__PURE__ */ jsx("div", {}),
546
+ /* @__PURE__ */ jsx("h2", {
547
+ "data-tauri-drag-region": true,
548
+ className: "flex-1 truncate min-w-0",
549
+ children: title
550
+ }),
551
+ /* @__PURE__ */ jsxs("div", {
552
+ className: "contents dx-app-no-drag",
553
+ children: [/* @__PURE__ */ jsx(MenuActions, {
554
+ item,
555
+ menuActions,
556
+ onAction
557
+ }), ItemEnd && /* @__PURE__ */ jsx(ItemEnd, {
558
+ node: item,
559
+ open: true
560
+ })]
561
+ })
562
+ ]
563
+ });
564
+ };
565
+ /**
566
+ * Header menu actions for an L1 workspace tab. Renders nothing for an empty
567
+ * `menuActions`, a single inline icon button for one action, and a
568
+ * `…`-menu trigger for multiple.
569
+ */
570
+ var MenuActions = ({ item, menuActions, onAction }) => {
571
+ const { t } = useTranslation(meta.profile.key);
572
+ if (menuActions.length === 0) return null;
573
+ if (menuActions.length === 1) return /* @__PURE__ */ jsx(IconButton, {
574
+ classNames: [
575
+ "shrink-0 px-2 pointer-fine:px-1",
576
+ hoverableControlItem,
577
+ hoverableOpenControlItem
578
+ ],
579
+ variant: "ghost",
580
+ icon: menuActions[0].properties?.icon ?? "ph--circle-dashed--regular",
581
+ iconOnly: true,
582
+ size: 4,
583
+ label: toLocalizedString(menuActions[0].properties?.label, t),
584
+ "data-testid": menuActions[0].properties?.testId,
585
+ onClick: () => onAction(menuActions[0])
586
+ });
587
+ return /* @__PURE__ */ jsxs(Menu.Root, {
588
+ caller: NAV_TREE_ITEM,
589
+ onAction,
590
+ children: [/* @__PURE__ */ jsx(Menu.Trigger, {
591
+ asChild: true,
592
+ children: /* @__PURE__ */ jsx(IconButton, {
593
+ classNames: [
594
+ "shrink-0 px-2 pointer-fine:px-1",
595
+ hoverableControlItem,
596
+ hoverableOpenControlItem
597
+ ],
598
+ variant: "ghost",
599
+ icon: "ph--dots-three-vertical--regular",
600
+ iconOnly: true,
601
+ size: 4,
602
+ label: t("tree-item-actions.label"),
603
+ "data-testid": "navtree.treeItem.actionsLevel0"
604
+ })
605
+ }), /* @__PURE__ */ jsx(Menu.Content, {
606
+ group: item,
607
+ items: menuActions
608
+ })]
609
+ });
610
+ };
611
+ /**
612
+ * Builds the menu actions for the L1 panel header.
613
+ */
614
+ var useL1MenuActions = ({ item, path }) => {
615
+ const runAction = useActionRunner();
616
+ return {
617
+ menuActions: getListActions(useActions$1(item)),
618
+ onAction: useCallback((action, params) => {
619
+ runAction(action, {
620
+ ...params,
621
+ path
622
+ });
623
+ }, [runAction, path])
624
+ };
625
+ };
626
+ var L1Panel = memo(L1PanelInner);
627
+ //#endregion
628
+ //#region src/components/Sidebar/L1Tabs.tsx
629
+ /**
630
+ * Each workspace is an L1 tab.
631
+ */
632
+ var L1Tabs = ({ topLevelItems, currentItemId, onBack, open, path }) => {
633
+ const hasCurrentPanel = topLevelItems.some((item) => item.id === currentItemId && l0ItemType(item) === "tab");
634
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [topLevelItems.map((item) => {
635
+ if (l0ItemType(item) === "tab") return /* @__PURE__ */ jsx(L1Panel, {
636
+ id: item.id,
637
+ item,
638
+ path,
639
+ open,
640
+ onBack,
641
+ isCurrent: item.id === currentItemId
642
+ }, item.id);
643
+ return null;
644
+ }), !hasCurrentPanel && /* @__PURE__ */ jsx(L1Panel, {
645
+ id: currentItemId,
646
+ path,
647
+ open,
648
+ isCurrent: true
649
+ }, currentItemId)] });
650
+ };
651
+ //#endregion
652
+ //#region src/components/NavTree/NavTree.tsx
653
+ var NAV_TREE_ITEM = "NavTreeItem";
654
+ var NavTree = forwardRef(({ id, root, tab, ...props }, forwardedRef) => {
655
+ const { onBack, onItemHover } = useNavTreeContext();
656
+ const { topLevelActions, l0Items, pinnedItems, userAccountItem, topLevelItems } = useTopLevelNavItems(root);
657
+ useLoadDescendents(root);
658
+ const path = useMemo(() => [id], [id]);
659
+ return /* @__PURE__ */ jsxs(Tabs.Root, {
660
+ value: tab,
661
+ orientation: "vertical",
662
+ classNames: "relative",
663
+ ref: forwardedRef,
664
+ children: [/* @__PURE__ */ jsx(L0Menu, {
665
+ menuActions: topLevelActions,
666
+ topLevelItems: l0Items,
667
+ pinnedItems,
668
+ userAccountItem,
669
+ path,
670
+ parent: root,
671
+ onItemHover
672
+ }), /* @__PURE__ */ jsx(L1Tabs, {
673
+ topLevelItems,
674
+ path,
675
+ currentItemId: tab,
676
+ onBack,
677
+ ...props
678
+ })]
679
+ });
680
+ });
681
+ /**
682
+ * Partitions root children into workspaces, pinned items, user-account, and top-level actions.
683
+ */
684
+ var useTopLevelNavItems = (root) => {
685
+ const { graph } = useAppGraph();
686
+ const rootId = root?.id ?? Node.RootId;
687
+ const rootOutboundItems = useConnections(graph, rootId, "child");
688
+ const rootActions = useActions(graph, rootId);
689
+ const { topLevelActions, l0Items, pinnedItems, userAccountItem } = useMemo(() => {
690
+ const topLevelWorkspaces = [];
691
+ const outboundPinnedItems = [];
692
+ let userAccountItem;
693
+ for (const node of rootOutboundItems) if (Node.hasDisposition(node, "workspace")) topLevelWorkspaces.push(node);
694
+ else if (Node.hasDisposition(node, "pin-end")) outboundPinnedItems.push(node);
695
+ else if (Node.hasDisposition(node, "user-account")) userAccountItem ??= node;
696
+ const topLevelActions = rootActions.filter((action) => Node.hasDisposition(action, "menu")).toSorted((a, b) => Position.compare(a.properties, b.properties));
697
+ return {
698
+ pinnedItems: [...outboundPinnedItems, ...rootActions.filter((action) => Node.hasDisposition(action, "pin-end"))].toSorted((a, b) => Position.compare(a.properties, b.properties)),
699
+ topLevelActions,
700
+ userAccountItem,
701
+ l0Items: topLevelWorkspaces
702
+ };
703
+ }, [rootActions, rootOutboundItems]);
704
+ return {
705
+ topLevelActions,
706
+ l0Items,
707
+ pinnedItems,
708
+ userAccountItem,
709
+ topLevelItems: useMemo(() => [
710
+ ...l0Items,
711
+ ...pinnedItems,
712
+ ...userAccountItem ? [userAccountItem] : []
713
+ ], [
714
+ l0Items,
715
+ pinnedItems,
716
+ userAccountItem
717
+ ])
718
+ };
719
+ };
720
+ //#endregion
721
+ export { NAV_TREE_ITEM, NavTree, NavTreeContext, useNavTreeContext };
722
+
723
+ //# sourceMappingURL=components.mjs.map