@dxos/plugin-navtree 0.9.1-main.c7dcc2e112 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/neutral/{NavTreeContainer-QIWROTCL.mjs → NavTreeContainer-ICDKC2GI.mjs} +2 -2
- package/dist/lib/neutral/capabilities/index.mjs +2 -2
- package/dist/lib/neutral/{chunk-UBVNITFG.mjs → chunk-4RN6TH36.mjs} +20 -1
- package/dist/lib/neutral/chunk-4RN6TH36.mjs.map +7 -0
- package/dist/lib/neutral/components/index.mjs +8 -6
- package/dist/lib/neutral/components/index.mjs.map +3 -3
- package/dist/lib/neutral/containers/index.mjs +2 -2
- package/dist/lib/neutral/hooks/index.mjs +7 -4
- package/dist/lib/neutral/hooks/index.mjs.map +3 -3
- package/dist/lib/neutral/{keyboard-EJ65BVTC.mjs → keyboard-JM2HCF5N.mjs} +5 -3
- package/dist/lib/neutral/{keyboard-EJ65BVTC.mjs.map → keyboard-JM2HCF5N.mjs.map} +3 -3
- package/dist/lib/neutral/meta.json +1 -1
- package/dist/lib/neutral/{react-surface-N4EESW3L.mjs → react-surface-QPMUEDZX.mjs} +3 -2
- package/dist/lib/neutral/react-surface-QPMUEDZX.mjs.map +7 -0
- package/dist/lib/neutral/testing/index.mjs +2 -2
- package/dist/lib/neutral/testing/index.mjs.map +3 -3
- package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -2
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/keyboard.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +1 -1
- package/dist/types/src/capabilities/state.d.ts +1 -2
- package/dist/types/src/capabilities/state.d.ts.map +1 -1
- package/dist/types/src/components/NavTree/NavTree.stories.d.ts.map +1 -1
- package/dist/types/src/components/NavTreeItem/NavTreeItemColumns.d.ts.map +1 -1
- package/dist/types/src/components/Sidebar/L0Menu.d.ts.map +1 -1
- package/dist/types/src/containers/NavTreeContainer/NavTreeContainer.d.ts.map +1 -1
- package/dist/types/src/hooks/useNavTreeModel.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +4 -0
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/testing/generator.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +1 -1
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +40 -41
- package/src/capabilities/keyboard.ts +5 -2
- package/src/capabilities/react-surface.tsx +2 -1
- package/src/components/NavTree/NavTree.stories.tsx +43 -36
- package/src/components/NavTree/NavTree.tsx +3 -3
- package/src/components/NavTreeItem/NavTreeItemColumns.tsx +2 -1
- package/src/components/Sidebar/L0Menu.tsx +10 -3
- package/src/containers/NavTreeContainer/NavTreeContainer.tsx +14 -0
- package/src/hooks/useNavTreeModel.ts +8 -4
- package/src/testing/generator.ts +8 -6
- package/src/types/schema.ts +2 -2
- package/dist/lib/neutral/chunk-UBVNITFG.mjs.map +0 -7
- package/dist/lib/neutral/react-surface-N4EESW3L.mjs.map +0 -7
- /package/dist/lib/neutral/{NavTreeContainer-QIWROTCL.mjs.map → NavTreeContainer-ICDKC2GI.mjs.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
NODE_TYPE,
|
|
3
3
|
NavTreeContainer
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-4RN6TH36.mjs";
|
|
5
5
|
import "./chunk-JOSNCOV4.mjs";
|
|
6
6
|
import "./chunk-J5LGTIGS.mjs";
|
|
7
7
|
export {
|
|
@@ -9,4 +9,4 @@ export {
|
|
|
9
9
|
NavTreeContainer,
|
|
10
10
|
NavTreeContainer as default
|
|
11
11
|
};
|
|
12
|
-
//# sourceMappingURL=NavTreeContainer-
|
|
12
|
+
//# sourceMappingURL=NavTreeContainer-ICDKC2GI.mjs.map
|
|
@@ -3,9 +3,9 @@ import "../chunk-J5LGTIGS.mjs";
|
|
|
3
3
|
// src/capabilities/index.ts
|
|
4
4
|
import { Capability } from "@dxos/app-framework";
|
|
5
5
|
var AppGraphBuilder = Capability.lazy("AppGraphBuilder", () => import("../app-graph-builder-2DYAIROU.mjs"));
|
|
6
|
-
var Keyboard = Capability.lazy("Keyboard", () => import("../keyboard-
|
|
6
|
+
var Keyboard = Capability.lazy("Keyboard", () => import("../keyboard-JM2HCF5N.mjs"));
|
|
7
7
|
var OperationHandler = Capability.lazy("OperationHandler", () => import("../operation-handler-ORDOJUL2.mjs"));
|
|
8
|
-
var ReactSurface = Capability.lazy("ReactSurface", () => import("../react-surface-
|
|
8
|
+
var ReactSurface = Capability.lazy("ReactSurface", () => import("../react-surface-QPMUEDZX.mjs"));
|
|
9
9
|
var State = Capability.lazy("State", () => import("../state-PDZU4PIP.mjs"));
|
|
10
10
|
export {
|
|
11
11
|
AppGraphBuilder,
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
// src/containers/NavTreeContainer/NavTreeContainer.tsx
|
|
8
8
|
import { extractInstruction } from "@atlaskit/pragmatic-drag-and-drop-hitbox/tree-item";
|
|
9
9
|
import { monitorForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
|
|
10
|
+
import { useAtomValue } from "@effect-atom/atom-react";
|
|
10
11
|
import React, { forwardRef, memo, useCallback, useEffect, useMemo, useRef } from "react";
|
|
11
12
|
import { Surface, useOperationInvoker } from "@dxos/app-framework/ui";
|
|
12
13
|
import { LayoutOperation } from "@dxos/app-toolkit";
|
|
@@ -227,6 +228,24 @@ var NavTreeContainer$ = /* @__PURE__ */ forwardRef(({ tab, popoverAnchorId }, fo
|
|
|
227
228
|
}, [
|
|
228
229
|
graph
|
|
229
230
|
]);
|
|
231
|
+
const workspaceChildren = useAtomValue(graph.connections(tab, "child"));
|
|
232
|
+
useEffect(() => {
|
|
233
|
+
for (const child of workspaceChildren) {
|
|
234
|
+
if (child.properties.disposition === "group") {
|
|
235
|
+
setItem([
|
|
236
|
+
Node.RootId,
|
|
237
|
+
tab,
|
|
238
|
+
child.id
|
|
239
|
+
], "open", true);
|
|
240
|
+
Graph.expand(graph, child.id, "child");
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}, [
|
|
244
|
+
workspaceChildren,
|
|
245
|
+
tab,
|
|
246
|
+
setItem,
|
|
247
|
+
graph
|
|
248
|
+
]);
|
|
230
249
|
const onItemHover = useCallback(({ item }) => Graph.expand(graph, item.id, "child"), [
|
|
231
250
|
graph
|
|
232
251
|
]);
|
|
@@ -270,4 +289,4 @@ export {
|
|
|
270
289
|
NODE_TYPE,
|
|
271
290
|
NavTreeContainer
|
|
272
291
|
};
|
|
273
|
-
//# sourceMappingURL=chunk-
|
|
292
|
+
//# sourceMappingURL=chunk-4RN6TH36.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/containers/NavTreeContainer/NavTreeContainer.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Instruction, extractInstruction } from '@atlaskit/pragmatic-drag-and-drop-hitbox/tree-item';\nimport { monitorForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React, { forwardRef, memo, useCallback, useEffect, useMemo, useRef } from 'react';\n\nimport { Surface, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { AppSurface, useAppGraph, useLayout } from '@dxos/app-toolkit/ui';\nimport { Graph, Node, useActionRunner } from '@dxos/plugin-graph';\nimport { useMediaQuery, useSidebars } from '@dxos/react-ui';\nimport { type TreeData, isTreeData } from '@dxos/react-ui-list';\nimport { arrayMove } from '@dxos/util';\n\nimport { NAV_TREE_ITEM, NavTree, NavTreeContext } from '#components';\nimport { useNavTreeModel, useNavTreeState } from '#hooks';\nimport { meta } from '#meta';\nimport { type NavTreeItemGraphNode } from '#types';\n\nimport { filterItems, getParent, resolveMigrationOperation } from '../../util';\n\n// TODO(thure): Is NavTree truly authoritative in this regard?\nexport const NODE_TYPE = 'dxos/app-graph/node';\n\n// TODO(wittjosiah): Avoid using Surface within the navtree, prefer declarative data flow.\nconst NavTreeItemEnd = ({ node, open }: { node: Node.Node; open: boolean }) => {\n const data = useMemo(() => ({ id: node.id, subject: node.data, open }), [node.id, node.data, open]);\n return <Surface.Surface type={AppSurface.NavtreeItemEnd} data={data} limit={1} />;\n};\n\nconst getItems = (graph: Graph.ReadableGraph, node?: Node.Node, disposition?: string) => {\n return Graph.getConnections(graph, node?.id ?? Node.RootId, 'child').filter((node) => filterItems(node, disposition));\n};\n\nexport type NavTreeContainerProps = {\n popoverAnchorId?: string;\n tab: string;\n};\n\nexport const NavTreeContainer$ = forwardRef<HTMLDivElement, NavTreeContainerProps>(\n ({ tab, popoverAnchorId }, forwardedRef) => {\n const [isLg] = useMediaQuery('lg');\n const { invokePromise } = useOperationInvoker();\n const runAction = useActionRunner();\n const { graph } = useAppGraph();\n const { getItem, setItem } = useNavTreeState();\n const layout = useLayout();\n const model = useNavTreeModel(Node.RootId);\n const { navigationSidebarState } = useSidebars(meta.profile.key);\n const latestRef = useRef({\n tab,\n activeItems: layout.active,\n navigationSidebarState,\n isLg,\n });\n\n useEffect(() => {\n latestRef.current = {\n tab,\n activeItems: layout.active,\n navigationSidebarState,\n isLg,\n };\n }, [tab, layout.active, navigationSidebarState, isLg]);\n\n const handleOpenChange = useCallback(\n ({ item: { id }, path, open }: { item: Node.Node; path: string[]; open: boolean }) => {\n // TODO(thure): This might become a localstorage leak; openItemIds that no longer exist should be removed from this map.\n setItem(path, 'open', open);\n Graph.expand(graph, id, 'child');\n },\n [graph, setItem],\n );\n\n const handleTabChange = useCallback(\n (node: NavTreeItemGraphNode) => {\n Graph.expand(graph, node.id, 'child');\n\n const {\n tab: activeTab,\n activeItems,\n navigationSidebarState: currentSidebarState,\n isLg: latestIsLg,\n } = latestRef.current;\n void invokePromise(LayoutOperation.UpdateSidebar, {\n state:\n node.id === activeTab\n ? currentSidebarState === 'expanded'\n ? latestIsLg\n ? 'collapsed'\n : 'closed'\n : 'expanded'\n : 'expanded',\n });\n\n void invokePromise(LayoutOperation.SwitchWorkspace, { subject: node.id });\n\n // Open the first item if the workspace is empty.\n if (activeItems.length === 0) {\n const [item] = getItems(graph, node).filter((node) => !Node.isActionLike(node));\n if (item && item.data) {\n if (layout.mode === 'multi') {\n void invokePromise(LayoutOperation.Set, { subject: [item.id] });\n } else {\n void invokePromise(LayoutOperation.Open, { subject: [item.id] });\n }\n }\n }\n },\n [invokePromise, graph, layout.mode],\n );\n\n const blockInstruction = useCallback(\n ({ instruction, source, target }: { instruction: Instruction; source: TreeData; target: TreeData }) => {\n return target.item.properties.blockInstruction?.(source, instruction) ?? false;\n },\n [],\n );\n\n const canDrop = useCallback(({ source, target }: { source: TreeData; target: TreeData }) => {\n return target.item.properties.canDrop?.(source) ?? false;\n }, []);\n\n const canSelect = useCallback(({ item }: { item: Node.Node }) => {\n return item.properties.selectable ?? true;\n }, []);\n\n const handleSelect = useCallback(\n ({ item: node, path, option }: { item: Node.Node; path: string[]; option: boolean }) => {\n if (!node.data) {\n return;\n }\n\n if (Node.isAction(node)) {\n const [parent] = Graph.getConnections(graph, node.id, Node.childRelation('inbound'));\n if (parent) {\n void runAction(node, { parent, path, caller: NAV_TREE_ITEM });\n }\n return;\n }\n\n const current = getItem(path).current;\n if (!current) {\n if (layout.mode === 'multi') {\n void invokePromise(LayoutOperation.Set, { subject: [node.id] });\n } else {\n void invokePromise(LayoutOperation.Open, { subject: [node.id], key: node.properties.key });\n }\n } else if (option) {\n void invokePromise(LayoutOperation.Close, { subject: [node.id] });\n } else {\n void invokePromise(LayoutOperation.ScrollIntoView, { subject: node.id });\n }\n\n const defaultAction = Graph.getActions(graph, node.id).find(\n (action) => action.properties?.disposition === 'default',\n );\n if (Node.isAction(defaultAction)) {\n void runAction(defaultAction);\n }\n\n if (!isLg) {\n void invokePromise(LayoutOperation.UpdateSidebar, { state: 'closed' });\n }\n },\n [graph, invokePromise, getItem, runAction, isLg, layout.mode],\n );\n\n const handleBack = useCallback(() => void invokePromise(LayoutOperation.RevertWorkspace), [invokePromise]);\n\n // TODO(wittjosiah): Factor out hook.\n useEffect(() => {\n return monitorForElements({\n canMonitor: ({ source }) => isTreeData(source.data),\n onDrop: ({ location, source }) => {\n // Didn't drop on anything.\n if (!location.current.dropTargets.length) {\n return;\n }\n const target = location.current.dropTargets[0];\n const instruction: Instruction | null = extractInstruction(target.data);\n if (instruction !== null && instruction.type !== 'instruction-blocked') {\n const sourceNode = source.data.item as NavTreeItemGraphNode;\n const targetNode = target.data.item as NavTreeItemGraphNode;\n const sourcePath = source.data.path as string[];\n const targetPath = target.data.path as string[];\n const sameParent = sourcePath.slice(0, -1).join() === targetPath.slice(0, -1).join();\n const operation =\n sameParent && instruction.type !== 'make-child'\n ? 'rearrange'\n : resolveMigrationOperation(graph, sourceNode, targetPath, targetNode);\n const sourceParent = getParent(graph, sourceNode, sourcePath);\n const targetParent = getParent(graph, targetNode, targetPath);\n const sourceItems = getItems(graph, sourceParent);\n const targetItems = getItems(graph, targetParent);\n const sourceIndex = sourceItems.findIndex(({ id }) => id === sourceNode.id);\n const targetIndex = targetItems.findIndex(({ id }) => id === targetNode.id);\n const migrationIndex =\n instruction.type === 'make-child'\n ? undefined\n : instruction.type === 'reorder-below'\n ? targetIndex + 1\n : targetIndex;\n switch (operation) {\n case 'rearrange': {\n const nextItems = sourceItems.map(({ data }) => data);\n arrayMove(nextItems, sourceIndex, targetIndex);\n void sourceNode.properties.onRearrange?.(nextItems);\n break;\n }\n case 'copy': {\n const target = instruction.type === 'make-child' ? targetNode : targetParent;\n void target?.properties.onCopy?.(sourceNode, migrationIndex);\n break;\n }\n case 'transfer': {\n const target = instruction.type === 'make-child' ? targetNode : targetParent;\n if (!target?.properties.onTransferStart || target?.id === sourceParent?.id) {\n break;\n }\n void target?.properties.onTransferStart(sourceNode, migrationIndex);\n void sourceParent?.properties.onTransferEnd?.(sourceNode, target);\n break;\n }\n }\n }\n },\n });\n }, [graph]);\n\n // Group nodes are always expanded and have no toggle, so they never trigger Graph.expand through\n // user interaction. Watch the workspace's children reactively and mark any group nodes as open\n // so the state machinery treats them consistently with regular open nodes (including on next load).\n const workspaceChildren = useAtomValue(graph.connections(tab, 'child'));\n useEffect(() => {\n for (const child of workspaceChildren) {\n if (child.properties.disposition === 'group') {\n setItem([Node.RootId, tab, child.id], 'open', true);\n Graph.expand(graph, child.id, 'child');\n }\n }\n }, [workspaceChildren, tab, setItem, graph]);\n\n const onItemHover = useCallback(({ item }: { item: Node.Node }) => Graph.expand(graph, item.id, 'child'), [graph]);\n\n const navTreeContextValue = useMemo(\n () => ({\n model,\n popoverAnchorId,\n renderItemEnd: NavTreeItemEnd,\n blockInstruction,\n canDrop,\n canSelect,\n onBack: handleBack,\n onOpenChange: handleOpenChange,\n onSelect: handleSelect,\n onTabChange: handleTabChange,\n onItemHover,\n }),\n [\n model,\n popoverAnchorId,\n blockInstruction,\n canDrop,\n canSelect,\n handleBack,\n handleOpenChange,\n handleSelect,\n handleTabChange,\n onItemHover,\n ],\n );\n\n return (\n <NavTreeContext.Provider value={navTreeContextValue}>\n <NavTree id={Node.RootId} root={Graph.getRoot(graph)} tab={tab} open={layout.sidebarOpen} ref={forwardedRef} />\n </NavTreeContext.Provider>\n );\n },\n);\n\nexport const NavTreeContainer = memo(NavTreeContainer$);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["extractInstruction", "monitorForElements", "useAtomValue", "React", "forwardRef", "memo", "useCallback", "useEffect", "useMemo", "useRef", "Surface", "useOperationInvoker", "LayoutOperation", "AppSurface", "useAppGraph", "useLayout", "Graph", "Node", "useActionRunner", "useMediaQuery", "useSidebars", "isTreeData", "arrayMove", "NAV_TREE_ITEM", "NavTree", "NavTreeContext", "useNavTreeModel", "useNavTreeState", "meta", "NODE_TYPE", "NavTreeItemEnd", "node", "open", "data", "useMemo", "id", "subject", "Surface", "type", "AppSurface", "NavtreeItemEnd", "limit", "getItems", "graph", "disposition", "Graph", "getConnections", "Node", "RootId", "filter", "filterItems", "NavTreeContainer$", "forwardRef", "tab", "popoverAnchorId", "forwardedRef", "isLg", "useMediaQuery", "invokePromise", "useOperationInvoker", "runAction", "useActionRunner", "useAppGraph", "getItem", "setItem", "useNavTreeState", "layout", "useLayout", "model", "useNavTreeModel", "navigationSidebarState", "useSidebars", "meta", "profile", "key", "latestRef", "useRef", "activeItems", "active", "useEffect", "current", "handleOpenChange", "useCallback", "item", "path", "expand", "handleTabChange", "activeTab", "currentSidebarState", "latestIsLg", "LayoutOperation", "UpdateSidebar", "state", "SwitchWorkspace", "length", "isActionLike", "mode", "Set", "Open", "blockInstruction", "instruction", "source", "target", "properties", "canDrop", "canSelect", "selectable", "handleSelect", "option", "isAction", "parent", "childRelation", "caller", "NAV_TREE_ITEM", "Close", "ScrollIntoView", "defaultAction", "getActions", "find", "action", "handleBack", "RevertWorkspace", "monitorForElements", "canMonitor", "isTreeData", "onDrop", "location", "dropTargets", "extractInstruction", "sourceNode", "targetNode", "sourcePath", "targetPath", "sameParent", "slice", "join", "operation", "resolveMigrationOperation", "sourceParent", "getParent", "targetParent", "sourceItems", "targetItems", "sourceIndex", "findIndex", "targetIndex", "migrationIndex", "undefined", "nextItems", "map", "arrayMove", "onRearrange", "onCopy", "onTransferStart", "onTransferEnd", "workspaceChildren", "useAtomValue", "connections", "child", "onItemHover", "navTreeContextValue", "renderItemEnd", "onBack", "onOpenChange", "onSelect", "onTabChange", "NavTreeContext", "Provider", "value", "NavTree", "root", "getRoot", "sidebarOpen", "ref", "NavTreeContainer", "memo"]
|
|
7
|
+
}
|
|
@@ -8,7 +8,7 @@ import React7, { forwardRef as forwardRef2, useMemo as useMemo4 } from "react";
|
|
|
8
8
|
import { useAppGraph as useAppGraph2 } from "@dxos/app-toolkit/ui";
|
|
9
9
|
import { Node, useConnections, useActions as useGraphActions } from "@dxos/plugin-graph";
|
|
10
10
|
import { Tabs as Tabs3 } from "@dxos/react-ui-tabs";
|
|
11
|
-
import {
|
|
11
|
+
import { Position } from "@dxos/util";
|
|
12
12
|
import { useLoadDescendents as useLoadDescendents2 } from "#hooks";
|
|
13
13
|
|
|
14
14
|
// src/components/NavTreeContext/NavTreeContext.tsx
|
|
@@ -27,7 +27,8 @@ import { useAtomValue } from "@effect-atom/atom-react";
|
|
|
27
27
|
import React2, { forwardRef, memo, useCallback, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
28
28
|
import { DxAvatar } from "@dxos/lit-ui/react";
|
|
29
29
|
import { useActionRunner } from "@dxos/plugin-graph";
|
|
30
|
-
import { Icon, IconButton,
|
|
30
|
+
import { Icon, IconButton, ScrollArea, Tooltip, toLocalizedString, useMediaQuery, useTranslation } from "@dxos/react-ui";
|
|
31
|
+
import { DropIndicator } from "@dxos/react-ui-list";
|
|
31
32
|
import { Menu } from "@dxos/react-ui-menu";
|
|
32
33
|
import { Tabs } from "@dxos/react-ui-tabs";
|
|
33
34
|
import { mx } from "@dxos/ui-theme";
|
|
@@ -236,7 +237,7 @@ var L0Item = /* @__PURE__ */ memo(({ item, parent, path, pinned, onRearrange, on
|
|
|
236
237
|
})), /* @__PURE__ */ React2.createElement(L0ItemActiveTabIndicator, null), /* @__PURE__ */ React2.createElement("span", {
|
|
237
238
|
id: `${item.id}__label`,
|
|
238
239
|
className: "sr-only"
|
|
239
|
-
}, localizedString), closestEdge && /* @__PURE__ */ React2.createElement(
|
|
240
|
+
}, localizedString), closestEdge && /* @__PURE__ */ React2.createElement(DropIndicator, {
|
|
240
241
|
edge: closestEdge
|
|
241
242
|
}));
|
|
242
243
|
});
|
|
@@ -375,7 +376,8 @@ import { meta as meta4 } from "#meta";
|
|
|
375
376
|
|
|
376
377
|
// src/components/NavTreeItem/NavTreeItemColumns.tsx
|
|
377
378
|
import React4, { Fragment, memo as memo2, useMemo as useMemo2 } from "react";
|
|
378
|
-
import { Popover,
|
|
379
|
+
import { Popover, toLocalizedString as toLocalizedString3, useTranslation as useTranslation3 } from "@dxos/react-ui";
|
|
380
|
+
import { Treegrid } from "@dxos/react-ui-list";
|
|
379
381
|
import { getListActions, useActions } from "#hooks";
|
|
380
382
|
import { meta as meta3 } from "#meta";
|
|
381
383
|
|
|
@@ -769,11 +771,11 @@ var useTopLevelNavItems = (root) => {
|
|
|
769
771
|
break;
|
|
770
772
|
}
|
|
771
773
|
}
|
|
772
|
-
const topLevelActions2 = rootActions.filter((action) => action.properties.disposition === "menu").toSorted((a, b) =>
|
|
774
|
+
const topLevelActions2 = rootActions.filter((action) => action.properties.disposition === "menu").toSorted((a, b) => Position.compare(a.properties, b.properties));
|
|
773
775
|
const pinnedItems2 = [
|
|
774
776
|
...outboundPinnedItems,
|
|
775
777
|
...rootActions.filter((action) => action.properties.disposition === "pin-end")
|
|
776
|
-
].toSorted((a, b) =>
|
|
778
|
+
].toSorted((a, b) => Position.compare(a.properties, b.properties));
|
|
777
779
|
return {
|
|
778
780
|
pinnedItems: pinnedItems2,
|
|
779
781
|
topLevelActions: topLevelActions2,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/NavTree/NavTree.tsx", "../../../../src/components/NavTreeContext/NavTreeContext.tsx", "../../../../src/components/Sidebar/L0Menu.tsx", "../../../../src/components/UserAccountAvatar/UserAccountAvatar.tsx", "../../../../src/components/Sidebar/L1Panel.tsx", "../../../../src/components/NavTreeItem/NavTreeItemColumns.tsx", "../../../../src/components/NavTreeItem/NavTreeItemAction.tsx", "../../../../src/components/Sidebar/L1Tabs.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { forwardRef, useMemo } from 'react';\n\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { Node, useConnections, useActions as useGraphActions } from '@dxos/plugin-graph';\nimport { type MenuItem } from '@dxos/react-ui-menu';\nimport { Tabs } from '@dxos/react-ui-tabs';\nimport { byPosition } from '@dxos/util';\n\nimport { useLoadDescendents } from '#hooks';\n\nimport { useNavTreeContext } from '../NavTreeContext';\nimport { L0Menu, L1Tabs, type L1TabsProps } from '../Sidebar';\n\nexport const NAV_TREE_ITEM = 'NavTreeItem';\n\nexport type NavTreeProps = { id: string; root?: Node.Node; tab: string } & Pick<L1TabsProps, 'open'>;\n\n// TODO(wittjosiah): Refactor to Radix-style.\nexport const NavTree = forwardRef<HTMLDivElement, NavTreeProps>(({ id, root, tab, ...props }, forwardedRef) => {\n const { onBack, onItemHover } = useNavTreeContext();\n const { topLevelActions, l0Items, pinnedItems, userAccountItem, topLevelItems } = useTopLevelNavItems(root);\n\n useLoadDescendents(root);\n const path = useMemo(() => [id], [id]);\n\n return (\n // TODO(thure): `Tabs.Root` forces all items that should be able to receive focus to use `Tabs.Tab(Primitive)` since\n // it uses RovingFocus and doesn't support moving focus to an item that is not a tab. Assess whether this situation\n // should change including whether it should motivate a change in the design/taxonomy, or if this means this should\n // not use `react-ui-tabs` at all.\n <Tabs.Root value={tab} orientation='vertical' classNames='relative' ref={forwardedRef}>\n <L0Menu\n menuActions={topLevelActions as MenuItem[]}\n topLevelItems={l0Items}\n pinnedItems={pinnedItems}\n userAccountItem={userAccountItem}\n path={path}\n parent={root}\n onItemHover={onItemHover}\n />\n <L1Tabs topLevelItems={topLevelItems} path={path} currentItemId={tab} onBack={onBack} {...props} />\n </Tabs.Root>\n );\n});\n\n/**\n * Partitions root children into workspaces, pinned items, user-account, and top-level actions.\n */\nconst useTopLevelNavItems = (root?: Node.Node) => {\n const { graph } = useAppGraph();\n const rootId = root?.id ?? Node.RootId;\n const rootOutboundItems = useConnections(graph, rootId, 'child');\n const rootActions = useGraphActions(graph, rootId);\n\n const { topLevelActions, l0Items, pinnedItems, userAccountItem } = useMemo(() => {\n const topLevelWorkspaces: Node.Node[] = [];\n const outboundPinnedItems: Node.Node[] = [];\n let userAccountItem: Node.Node | undefined;\n for (const node of rootOutboundItems) {\n switch (node.properties.disposition) {\n case 'workspace':\n topLevelWorkspaces.push(node);\n break;\n case 'pin-end':\n outboundPinnedItems.push(node);\n break;\n case 'user-account':\n userAccountItem ??= node;\n break;\n }\n }\n\n const topLevelActions = rootActions\n .filter((action) => action.properties.disposition === 'menu')\n .toSorted((a, b) => byPosition(a.properties, b.properties));\n const pinnedItems = [\n ...outboundPinnedItems,\n ...rootActions.filter((action) => action.properties.disposition === 'pin-end'),\n ].toSorted((a, b) => byPosition(a.properties, b.properties));\n\n return {\n pinnedItems,\n topLevelActions,\n userAccountItem,\n l0Items: topLevelWorkspaces,\n };\n }, [rootActions, rootOutboundItems]);\n\n const topLevelItems = useMemo(\n () => [...l0Items, ...pinnedItems, ...(userAccountItem ? [userAccountItem] : [])],\n [l0Items, pinnedItems, userAccountItem],\n );\n\n return { topLevelActions, l0Items, pinnedItems, userAccountItem, topLevelItems };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext, useContext } from 'react';\n\nimport { raise } from '@dxos/debug';\n\nimport { type NavTreeContextValue } from '../types';\n\nexport const NavTreeContext = createContext<NavTreeContextValue | null>(null);\n\nexport const useNavTreeContext = () => useContext(NavTreeContext) ?? raise(new Error('Missing NavTreeContext'));\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport {\n type Edge,\n attachClosestEdge,\n extractClosestEdge,\n} from '@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge';\nimport { combine } from '@atlaskit/pragmatic-drag-and-drop/combine';\nimport { draggable, dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';\nimport { preserveOffsetOnSource } from '@atlaskit/pragmatic-drag-and-drop/element/preserve-offset-on-source';\nimport { scrollJustEnoughIntoView } from '@atlaskit/pragmatic-drag-and-drop/element/scroll-just-enough-into-view';\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React, {\n type MouseEvent,\n type PropsWithChildren,\n forwardRef,\n memo,\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { type Node } from '@dxos/app-graph';\nimport { DxAvatar } from '@dxos/lit-ui/react';\nimport { useActionRunner } from '@dxos/plugin-graph';\nimport {\n Icon,\n IconButton,\n ListItem,\n ScrollArea,\n type ThemedClassName,\n Tooltip,\n toLocalizedString,\n useMediaQuery,\n useTranslation,\n} from '@dxos/react-ui';\nimport { Menu, type MenuItem } from '@dxos/react-ui-menu';\nimport type { StackItemRearrangeHandler } from '@dxos/react-ui-stack';\nimport { Tabs } from '@dxos/react-ui-tabs';\nimport { mx } from '@dxos/ui-theme';\nimport { arrayMove } from '@dxos/util';\n\nimport { useNavTreeState } from '#hooks';\nimport { meta } from '#meta';\n\nimport { l0ItemType } from '../../util';\nimport { useNavTreeContext } from '../NavTreeContext';\nimport { UserAccountAvatar } from '../UserAccountAvatar';\n\n//\n// L0Item\n//\n\ntype L0ItemData = {\n id: L0ItemProps['item']['id'];\n type: 'l0Item';\n};\n\ntype L0ItemRootProps = {\n item: Node.Node;\n parent?: Node.Node;\n path: string[];\n onMouseEnter?: () => void;\n};\n\ntype L0ItemProps = L0ItemRootProps & {\n item: Node.Node;\n parent?: Node.Node;\n path: string[];\n pinned?: boolean;\n onRearrange?: StackItemRearrangeHandler<L0ItemData>;\n onItemHover?: (params: { item: Node.Node }) => void;\n};\n\nconst useL0ItemClick = ({ item, parent, path }: L0ItemProps, type: string) => {\n const { onSelect, onTabChange } = useNavTreeContext();\n const { getItem } = useNavTreeState();\n const [isLg] = useMediaQuery('lg');\n const runAction = useActionRunner();\n\n return useCallback(\n (event: MouseEvent) => {\n switch (type) {\n case 'action': {\n const { properties: { caller } = {} } = item;\n return void runAction(item as Node.Action, caller ? { parent, path, caller } : { parent, path });\n }\n case 'tab':\n return onTabChange?.(item);\n case 'link':\n return onSelect?.({ item, path, current: !getItem(path).current, option: event.altKey });\n }\n },\n [item, parent, type, getItem, onSelect, onTabChange, isLg, runAction],\n );\n};\n\nconst l0Breakpoints: Record<string, string> = {\n lg: 'hidden lg:grid',\n};\n\nconst L0ItemRoot = memo(\n forwardRef<HTMLButtonElement, PropsWithChildren<L0ItemRootProps>>(\n ({ item, parent, path, onMouseEnter, children }, forwardedRef) => {\n const { t } = useTranslation(meta.profile.key);\n const { model } = useNavTreeContext();\n const itemPath = useMemo(() => [...path, item.id], [item.id, path]);\n const { id, testId } = useAtomValue(model.itemProps(itemPath));\n const localizedString = toLocalizedString(item.properties.label, t);\n\n const type = l0ItemType(item);\n const handleClick = useL0ItemClick({ item, parent, path: itemPath }, type);\n\n return (\n <Tooltip.Trigger asChild delayDuration={0} side='right' content={localizedString}>\n <Tabs.TabPrimitive\n className={mx(\n 'group/l0item flex w-full justify-center items-center relative',\n 'dx-app-no-drag dx-focus-ring-group data[type!=\"collection\"]:cursor-pointer',\n l0Breakpoints[item.properties.l0Breakpoint],\n )}\n tabIndex={type === 'tab' ? 0 : undefined}\n data-type={type}\n data-testid={testId}\n data-object-id={id}\n value={item.id}\n onClick={handleClick}\n onMouseEnter={onMouseEnter}\n ref={forwardedRef}\n >\n {children}\n </Tabs.TabPrimitive>\n </Tooltip.Trigger>\n );\n },\n ),\n);\n\nexport const L0ItemActiveTabIndicator = ({ classNames }: ThemedClassName<{}>) => (\n <div\n className={mx(\n 'hidden group-aria-selected/l0item:block absolute start-0 h-6 w-1.5 bg-accent-bg rounded-sm',\n classNames,\n )}\n />\n);\n\n// TODO(burdon): Factor out pinned (non-draggable) items.\nconst L0Item = memo(({ item, parent, path, pinned, onRearrange, onItemHover }: L0ItemProps) => {\n const { t } = useTranslation(meta.profile.key);\n const itemElement = useRef<HTMLButtonElement | null>(null);\n const [closestEdge, setEdge] = useState<Edge | null>(null);\n const localizedString = toLocalizedString(item.properties.label, t);\n const hue = item.properties.hue ?? null;\n\n useLayoutEffect(() => {\n if (!itemElement.current || !onRearrange) {\n return;\n }\n\n return combine(\n draggable({\n element: itemElement.current,\n getInitialData: () => ({ id: item.id, type: 'l0Item' }) satisfies L0ItemData,\n onGenerateDragPreview: ({ nativeSetDragImage, source, location }) => {\n document.body.setAttribute('data-drag-preview', 'true');\n const element = source.element.querySelector('[data-frame]') as HTMLElement;\n scrollJustEnoughIntoView({ element });\n const { x, y } = preserveOffsetOnSource({ element, input: location.current.input })({\n container: (element.offsetParent ?? document.body) as HTMLElement,\n });\n nativeSetDragImage?.(element, x, y);\n },\n onDragStart: () => {\n document.body.removeAttribute('data-drag-preview');\n itemElement.current!.closest('[data-drag-autoscroll]')?.setAttribute('data-drag-autoscroll', 'active');\n },\n onDrop: () => {\n itemElement.current!.closest('[data-drag-autoscroll]')?.setAttribute('data-drag-autoscroll', 'idle');\n },\n }),\n dropTargetForElements({\n element: itemElement.current,\n getData: ({ input, element }) => {\n return attachClosestEdge(\n { id: item.id, type: 'l0Item' },\n { input, element, allowedEdges: ['top', 'bottom'] },\n );\n },\n onDragEnter: ({ self, source }) => {\n if (source.data.type === self.data.type) {\n setEdge(extractClosestEdge(self.data));\n }\n },\n onDrag: ({ self, source }) => {\n if (source.data.type === self.data.type) {\n setEdge(extractClosestEdge(self.data));\n }\n },\n onDragLeave: () => setEdge(null),\n onDrop: ({ self, source }) => {\n setEdge(null);\n if (source.data.type === self.data.type) {\n onRearrange(source.data as L0ItemData, self.data as L0ItemData, extractClosestEdge(self.data));\n }\n },\n }),\n );\n }, [item, onRearrange]);\n\n const handleMouseEnter = useCallback(() => onItemHover?.({ item }), [item, onItemHover]);\n\n return (\n <L0ItemRoot ref={itemElement} item={item} parent={parent} path={path} onMouseEnter={handleMouseEnter}>\n <div\n data-frame={true}\n {...(hue && { style: { background: `var(--color-${hue}-surface)` } })}\n className={mx(\n 'flex justify-center items-center dx-focus-ring-group-indicator transition-colors rounded-sm',\n pinned\n ? 'p-2 group-hover/l0item:bg-current-surface'\n : 'w-(--dx-l0-avatar-size) h-(--dx-l0-avatar-size) bg-current-surface',\n )}\n >\n <ItemAvatar item={item} />\n </div>\n <L0ItemActiveTabIndicator />\n <span id={`${item.id}__label`} className='sr-only'>\n {localizedString}\n </span>\n {closestEdge && <ListItem.DropIndicator edge={closestEdge} />}\n </L0ItemRoot>\n );\n});\n\nconst ItemAvatar = ({ item }: Pick<L0ItemProps, 'item'>) => {\n const { t } = useTranslation(meta.profile.key);\n\n // Actions.\n if (item.properties.icon) {\n const hue = item.properties.hue ?? null;\n const hueFgStyle = hue && { style: { color: `var(--color-${hue}-fg)` } };\n return <Icon icon={item.properties.icon} size={6} {...hueFgStyle} />;\n }\n\n const type = l0ItemType(item);\n if (type === 'tab' && item.properties.disposition !== 'pin-end') {\n const hue = item.properties.hue ?? null;\n const localizedString = toLocalizedString(item.properties.label, t);\n return <DxAvatar hue={hue} hueVariant='surface' variant='square' size={12} fallback={localizedString} />;\n }\n\n return null;\n};\n\n//\n// L0Menu\n//\n\nexport type L0MenuProps = {\n menuActions: MenuItem[];\n topLevelItems: Node.Node[];\n pinnedItems: Node.Node[];\n userAccountItem?: Node.Node;\n parent?: Node.Node;\n path: string[];\n onItemHover?: (params: { item: Node.Node }) => void;\n};\n\nexport const L0Menu = ({\n menuActions,\n topLevelItems,\n pinnedItems,\n userAccountItem,\n parent,\n path,\n onItemHover,\n}: L0MenuProps) => {\n const { t } = useTranslation(meta.profile.key);\n const runAction = useActionRunner();\n const handleAction = useCallback(\n (action: Node.Action, params: Node.InvokeProps) => {\n void runAction(action, params);\n },\n [runAction],\n );\n\n const handleRearrange = useCallback<StackItemRearrangeHandler<L0ItemData>>(\n (source, target, closestEdge) => {\n const sourceItem = topLevelItems.find((i) => i.id === source.id);\n if (!sourceItem?.properties.onRearrange) {\n return;\n }\n\n const sourceIndex = topLevelItems.findIndex((i) => i.id === source.id);\n const targetIndex = topLevelItems.findIndex((i) => i.id === target.id);\n const insertIndex =\n source.id === target.id\n ? sourceIndex\n : targetIndex +\n (sourceIndex < targetIndex ? (closestEdge === 'top' ? -1 : 0) : closestEdge === 'bottom' ? 1 : 0);\n const nextOrder = arrayMove([...topLevelItems], sourceIndex, insertIndex);\n return sourceItem.properties.onRearrange(nextOrder.map((item) => item.data));\n },\n [topLevelItems],\n );\n\n // Check if any items have onRearrange to enable drag-and-drop.\n const hasRearrangeableItems = topLevelItems.some((item) => item.properties.onRearrange);\n\n return (\n <Tabs.Tablist\n data-tauri-drag-region\n classNames={[\n 'group/l0 absolute z-[1] inset-y-0 start-0 rounded-is',\n 'grid grid-cols-[var(--dx-l0-size)] grid-rows-[var(--dx-rail-size)_1fr_min-content_var(--dx-l0-size)] dx-contain-layout',\n 'w-(--dx-l0-size) bg-l0-surface dx-app-drag pb-[env(safe-area-inset-bottom)]',\n '[body[data-platform=\"macos\"]_&]:pt-[30px]',\n '[body[data-platform=\"ios\"]_&]:pt-[max(env(safe-area-inset-top),0.25rem)]',\n ]}\n >\n {/* TODO(wittjosiah): Use L0Item trigger. */}\n <Menu.Root onAction={handleAction}>\n <Menu.Trigger asChild data-testid='spacePlugin.addSpace'>\n <div className='grid place-items-center'>\n <IconButton\n density='lg'\n variant='ghost'\n size={5}\n icon='ph--list--regular'\n iconOnly\n square\n label={t('app-menu.label')}\n />\n </div>\n </Menu.Trigger>\n <Menu.Content group={parent} items={menuActions} />\n </Menu.Root>\n\n {/* Space list. */}\n <ScrollArea.Root centered thin orientation='vertical'>\n <ScrollArea.Viewport classNames='flex flex-col gap-2 py-1'>\n {topLevelItems.map((item) => (\n <L0Item\n key={item.id}\n item={item}\n parent={parent}\n path={path}\n onItemHover={onItemHover}\n {...(hasRearrangeableItems && { onRearrange: handleRearrange })}\n />\n ))}\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n\n {/* Actions. */}\n <div className='grid grid-cols-1 auto-rows-(--dx-rail-action) pt-2'>\n {pinnedItems.map((item) => (\n <L0Item key={item.id} item={item} parent={parent} path={path} pinned />\n ))}\n </div>\n\n {userAccountItem && (\n <div className='grid dx-app-no-drag'>\n <L0ItemRoot key={userAccountItem.id} item={userAccountItem} parent={parent} path={path}>\n <UserAccountAvatar\n userId={userAccountItem.properties.userId}\n hue={userAccountItem.properties.hue}\n emoji={userAccountItem.properties.emoji}\n status={userAccountItem.properties.status}\n size={10}\n />\n </L0ItemRoot>\n </div>\n )}\n </Tabs.Tablist>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Avatar, type AvatarStatus, type Size } from '@dxos/react-ui';\nimport { hexToFallback } from '@dxos/util';\n\nimport { L0ItemActiveTabIndicator } from '../Sidebar';\n\nexport type UserAccountAvatarProps = {\n size?: Size;\n userId?: string;\n hue?: string;\n emoji?: string;\n status?: AvatarStatus;\n};\n\nexport const UserAccountAvatar = ({ size, userId, hue, emoji, status }: UserAccountAvatarProps) => {\n const fallbackValue = hexToFallback(userId ?? '0');\n\n return (\n <>\n <L0ItemActiveTabIndicator classNames='inset-y-6' />\n <div\n className='grid place-items-center dx-focus-ring-group-indicator rounded-full'\n data-joyride='welcome/account'\n >\n <Avatar.Root>\n <Avatar.Content\n variant='circle'\n size={size ?? 12}\n status={status ?? 'active'}\n hue={hue || fallbackValue.hue}\n fallback={emoji || fallbackValue.emoji}\n data-testid='treeView.userAccount'\n />\n </Avatar.Root>\n </div>\n </>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Option from 'effect/Option';\nimport React, { memo, useCallback, useMemo } from 'react';\n\nimport { Node } from '@dxos/app-graph';\nimport { Paths } from '@dxos/app-toolkit';\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { Graph, useActionRunner, useEdges } from '@dxos/plugin-graph';\nimport { DensityProvider, IconButton, ScrollArea, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { Tree } from '@dxos/react-ui-list';\nimport { Menu, type MenuItem } from '@dxos/react-ui-menu';\nimport { Tabs } from '@dxos/react-ui-tabs';\nimport { hoverableControlItem, hoverableOpenControlItem } from '@dxos/ui-theme';\n\nimport { getListActions, useActions, useLoadDescendents } from '#hooks';\nimport { meta } from '#meta';\n\nimport { NAV_TREE_ITEM } from '../NavTree';\nimport { useNavTreeContext } from '../NavTreeContext';\nimport { NavTreeItemColumns } from '../NavTreeItem/NavTreeItemColumns';\n\nexport type L1PanelProps = {\n open?: boolean;\n path: string[];\n item: Node.Node;\n isCurrent: boolean;\n onBack?: () => void;\n};\n\n/**\n * Space or settings panel.\n */\nconst L1Panel$ = ({ open, path, item, isCurrent, onBack }: L1PanelProps) => {\n const { t } = useTranslation(meta.profile.key);\n const title = toLocalizedString(item.properties.label, t);\n const isActivated = useIsActivatedWorkspace(item);\n const shouldRenderContent = isCurrent || isActivated;\n\n return (\n <Tabs.Panel\n key={item.id}\n value={item.id}\n classNames={[\n 'absolute inset-y-0 end-0',\n 'w-[calc(100%-var(--dx-l0-size))] lg:w-(--dx-l1-size) grid-cols-1 grid-rows-[var(--dx-rail-size)_1fr]',\n 'py-[env(safe-area-inset-top)]',\n isCurrent && 'grid',\n ]}\n tabIndex={-1}\n aria-label={title}\n {...(isCurrent && { 'data-testid': 'navtree.workspace.visible' })}\n {...(!open && { inert: true })}\n >\n {shouldRenderContent && <L1PanelContent open={open} path={path} item={item} onBack={onBack} />}\n </Tabs.Panel>\n );\n};\n\n/** Determines whether a workspace tab has been populated with real child content (i.e. expanded at least once). */\nconst useIsActivatedWorkspace = (item: Node.Node): boolean => {\n const { graph } = useAppGraph();\n const edges = useEdges(graph, item.id);\n\n return useMemo(() => {\n const childIds = edges[Graph.relationKey('child')] ?? [];\n return childIds.some((childId) => {\n const child = Graph.getNode(graph, childId);\n if (Option.isNone(child)) {\n return false;\n }\n return child.value.properties.disposition === undefined;\n });\n }, [edges, graph]);\n};\n\n/**\n * Mounted panel content for active or previously-visited tabs.\n */\nconst L1PanelContent = ({ path, item, onBack }: Pick<L1PanelProps, 'open' | 'path' | 'item' | 'onBack'>) => {\n const navTreeContext = useNavTreeContext();\n\n return (\n <DensityProvider density='md'>\n <L1PanelHeader path={path} item={item} onBack={onBack} />\n <ScrollArea.Root thin orientation='vertical'>\n <ScrollArea.Viewport>\n <Tree\n classNames='pt-[2px]'\n model={navTreeContext.model}\n id={item.id}\n rootId={item.id}\n path={path}\n levelOffset={5}\n draggable\n gridTemplateColumns='[tree-row-start] minmax(0, 1fr) min-content min-content [tree-row-end]'\n renderColumns={NavTreeItemColumns}\n blockInstruction={navTreeContext.blockInstruction}\n canDrop={navTreeContext.canDrop}\n canSelect={navTreeContext.canSelect}\n onOpenChange={navTreeContext.onOpenChange}\n onSelect={navTreeContext.onSelect}\n onItemHover={navTreeContext.onItemHover}\n />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n </DensityProvider>\n );\n};\n\n/**\n * Header row.\n */\nconst L1PanelHeader = ({ item, path, onBack }: Pick<L1PanelProps, 'item' | 'path' | 'onBack'>) => {\n const { t } = useTranslation(meta.profile.key);\n const { renderItemEnd: ItemEnd } = useNavTreeContext();\n const title = toLocalizedString(item.properties.label, t);\n const backCapableWorkspace = Paths.isPinnedWorkspace(item.id);\n\n const { menuActions, onAction } = useL1MenuActions({ item, path });\n useLoadDescendents(item);\n\n return (\n <div\n data-tauri-drag-region\n className='grid grid-cols-[28px_1fr_min-content_min-content] w-full items-center dx-app-drag dx-density-lg'\n >\n {backCapableWorkspace ? (\n <IconButton\n classNames={[hoverableControlItem, hoverableOpenControlItem]}\n variant='ghost'\n icon='ph--caret-left--regular'\n iconOnly\n size={4}\n label={t('button-back.button')}\n data-testid='treeView.primaryTreeButton'\n onClick={() => onBack?.()}\n />\n ) : (\n <div />\n )}\n <h2 data-tauri-drag-region className='flex-1 truncate min-w-0'>\n {title}\n </h2>\n <div className='contents dx-app-no-drag'>\n <MenuActions item={item} menuActions={menuActions} onAction={onAction} />\n {ItemEnd && <ItemEnd node={item} open />}\n </div>\n </div>\n );\n};\n\ntype L1MenuActions = {\n menuActions: Node.Action[];\n onAction: (action: Node.Action, params?: Node.InvokeProps) => void;\n};\n\n/**\n * Header menu actions for an L1 workspace tab. Renders nothing for an empty\n * `menuActions`, a single inline icon button for one action, and a\n * `…`-menu trigger for multiple.\n */\nconst MenuActions = ({\n item,\n menuActions,\n onAction,\n}: {\n item: Node.Node;\n} & Pick<L1MenuActions, 'menuActions' | 'onAction'>) => {\n const { t } = useTranslation(meta.profile.key);\n\n if (menuActions.length === 0) {\n return null;\n }\n\n if (menuActions.length === 1) {\n return (\n <IconButton\n classNames={['shrink-0 px-2 pointer-fine:px-1', hoverableControlItem, hoverableOpenControlItem]}\n variant='ghost'\n icon={menuActions[0].properties?.icon ?? 'ph--circle-dashed--regular'}\n iconOnly\n size={4}\n label={toLocalizedString(menuActions[0].properties?.label, t)}\n data-testid={menuActions[0].properties?.testId}\n onClick={() => onAction(menuActions[0] as Node.Action)}\n />\n );\n }\n\n return (\n <Menu.Root caller={NAV_TREE_ITEM} onAction={onAction}>\n <Menu.Trigger asChild>\n <IconButton\n classNames={['shrink-0 px-2 pointer-fine:px-1', hoverableControlItem, hoverableOpenControlItem]}\n variant='ghost'\n icon='ph--dots-three-vertical--regular'\n iconOnly\n size={4}\n label={t('tree-item-actions.label')}\n data-testid='navtree.treeItem.actionsLevel0'\n />\n </Menu.Trigger>\n <Menu.Content group={item} items={menuActions as MenuItem[]} />\n </Menu.Root>\n );\n};\n\n/**\n * Builds the menu actions for the L1 panel header.\n */\nconst useL1MenuActions = ({ item, path }: Pick<L1PanelProps, 'item' | 'path'>): L1MenuActions => {\n const runAction = useActionRunner();\n\n const menuActions = getListActions(useActions(item));\n\n const onAction = useCallback(\n (action: Node.Action, params?: Node.InvokeProps) => {\n void runAction(action, { ...params, path });\n },\n [runAction, path],\n );\n\n return { menuActions, onAction };\n};\n\nexport const L1Panel = memo(L1Panel$);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { Fragment, memo, useMemo } from 'react';\n\nimport { Popover, Treegrid, toLocalizedString, useTranslation } from '@dxos/react-ui';\n\nimport { getListActions, useActions } from '#hooks';\nimport { meta } from '#meta';\n\nimport { NAV_TREE_ITEM } from '../NavTree';\nimport { useNavTreeContext } from '../NavTreeContext';\nimport { type NavTreeItemColumnsProps } from '../types';\nimport { NavTreeItemActionDropdownMenu, NavTreeItemMonolithicAction } from './NavTreeItemAction';\n\nexport const NavTreeItemColumns = memo(({ path, item, open }: NavTreeItemColumnsProps) => {\n const { t } = useTranslation(meta.profile.key);\n const { renderItemEnd: ItemEnd, popoverAnchorId } = useNavTreeContext();\n\n const level = path.length - 2;\n const flattenedActions = useActions(item);\n const allActions = useMemo(() => getListActions(flattenedActions), [flattenedActions]);\n\n const anchored = popoverAnchorId === `${NAV_TREE_ITEM}:${item.id}`;\n const ActionRoot = anchored ? Popover.Anchor : Fragment;\n\n return (\n // `data-popover-anchor` lets the enclosing row highlight itself while a popover (e.g. rename) is open on it.\n <div className='contents dx-app-no-drag' {...(anchored && { 'data-popover-anchor': '' })}>\n <ActionRoot>\n {allActions.length === 1 ? (\n <Treegrid.Cell classNames='contents'>\n <NavTreeItemMonolithicAction\n baseLabel={toLocalizedString(allActions[0].properties?.label, t)}\n parent={item}\n path={path}\n {...allActions[0]}\n />\n </Treegrid.Cell>\n ) : allActions.length > 1 ? (\n <Treegrid.Cell classNames='contents'>\n <NavTreeItemActionDropdownMenu\n testId={`navtree.treeItem.actionsLevel${level}`}\n label={t('tree-item-actions.label')}\n icon='ph--dots-three-vertical--regular'\n parent={item}\n path={path}\n menuActions={allActions}\n caller={NAV_TREE_ITEM}\n />\n </Treegrid.Cell>\n ) : (\n <Treegrid.Cell />\n )}\n </ActionRoot>\n {ItemEnd && (\n <Treegrid.Cell classNames='contents'>\n <ItemEnd node={item} open={open} />\n </Treegrid.Cell>\n )}\n </div>\n );\n});\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { type Node } from '@dxos/app-graph';\nimport { useActionRunner } from '@dxos/plugin-graph';\nimport { IconButton, toLocalizedString, useDensityContext, useTranslation } from '@dxos/react-ui';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport { Menu, type MenuItem } from '@dxos/react-ui-menu';\nimport { hoverableControlItem, hoverableOpenControlItem } from '@dxos/ui-theme';\n\nimport { meta } from '#meta';\nimport { type ActionProperties } from '#types';\n\nconst fallbackIcon = 'ph--circle-dashed--regular';\n\nconst mdActionButtonProps = {\n size: 4 as const,\n density: 'md' as const,\n};\n\nconst lgActionButtonProps = {\n size: 5 as const,\n density: 'lg' as const,\n};\n\nexport type NavTreeItemActionMenuProps = ActionProperties & {\n parent: Node.Node;\n path?: string[];\n caller?: string;\n monolithic?: boolean;\n menuActions?: Node.Action[];\n};\n\nexport const NavTreeItemActionDropdownMenu = composable<HTMLButtonElement, NavTreeItemActionMenuProps>(\n ({ parent, path, label, icon, testId, menuActions, caller, ...props }, forwardedRef) => {\n const { t } = useTranslation(meta.profile.key);\n const density = useDensityContext();\n const runAction = useActionRunner();\n const handleAction = useCallback(\n (action: Node.Action, params: Node.InvokeProps = {}) => runAction(action, { ...params, path }),\n [runAction, path],\n );\n\n return (\n <Menu.Root caller={caller} onAction={handleAction}>\n <Menu.Trigger asChild>\n <IconButton\n {...(density === 'lg' ? lgActionButtonProps : mdActionButtonProps)}\n {...composableProps(props)}\n classNames={['shrink-0 px-2 pointer-fine:px-1', hoverableControlItem, hoverableOpenControlItem]}\n variant='ghost'\n icon={icon ?? fallbackIcon}\n iconOnly\n label={toLocalizedString(label, t)}\n data-testid={testId}\n ref={forwardedRef}\n />\n </Menu.Trigger>\n <Menu.Content group={parent} items={menuActions as MenuItem[]} />\n </Menu.Root>\n );\n },\n);\n\nNavTreeItemActionDropdownMenu.displayName = 'NavTreeItemActionDropdownMenu';\n\nexport const NavTreeItemMonolithicAction = (\n props: Node.Action & {\n parent: Node.Node;\n path?: string[];\n onAction?: (action: Node.Action) => void;\n baseLabel: string;\n },\n) => {\n const {\n parent,\n path,\n properties: { disabled, caller, testId, icon, variant = 'ghost', iconOnly = true } = { label: 'never' },\n baseLabel,\n } = props;\n const density = useDensityContext();\n const runAction = useActionRunner();\n return (\n <IconButton\n {...(density === 'lg' ? lgActionButtonProps : mdActionButtonProps)}\n variant={variant}\n classNames={[\n 'shrink-0',\n hoverableControlItem,\n hoverableOpenControlItem,\n iconOnly ? 'px-2 pointer-fine:px-1' : 'p-2 pointer-fine:p-2 me-1',\n ]}\n icon={icon ?? fallbackIcon}\n iconOnly={iconOnly}\n label={baseLabel}\n disabled={disabled}\n onClick={(event) => {\n event.stopPropagation();\n if (disabled) {\n return;\n }\n\n void runAction(props, caller ? { parent, caller, path } : { parent, path });\n }}\n data-testid={testId}\n />\n );\n};\n\nexport const NavTreeItemAction = ({\n monolithic,\n menuActions,\n menuType,\n parent,\n path,\n ...props\n}: NavTreeItemActionMenuProps) => {\n const { t } = useTranslation(meta.profile.key);\n\n const monolithicAction = menuActions?.length === 1 && menuActions[0];\n const baseLabel = toLocalizedString(monolithicAction ? monolithicAction.properties!.label : props.label, t);\n return monolithic && menuActions?.length === 1 ? (\n <NavTreeItemMonolithicAction baseLabel={baseLabel} parent={parent} path={path} {...menuActions[0]} />\n ) : (\n <NavTreeItemActionDropdownMenu {...props} label={baseLabel} parent={parent} path={path} menuActions={menuActions} />\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type Node } from '@dxos/app-graph';\n\nimport { l0ItemType } from '../../util';\nimport { L1Panel, type L1PanelProps } from './L1Panel';\n\nexport type L1TabsProps = Pick<L1PanelProps, 'open' | 'onBack'> & {\n currentItemId: string;\n path: string[];\n topLevelItems: Node.Node[];\n};\n\n/**\n * Each workspace is an L1 tab.\n */\nexport const L1Tabs = ({ topLevelItems, currentItemId, onBack, open, path }: L1TabsProps) => {\n return (\n <>\n {topLevelItems.map((item) => {\n const type = l0ItemType(item);\n if (type === 'tab') {\n return (\n <L1Panel\n key={item.id}\n item={item}\n path={path}\n open={open}\n onBack={onBack}\n isCurrent={item.id === currentItemId}\n />\n );\n }\n return null;\n })}\n </>\n );\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["React", "forwardRef", "useMemo", "useAppGraph", "Node", "useConnections", "useActions", "useGraphActions", "Tabs", "
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { forwardRef, useMemo } from 'react';\n\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { Node, useConnections, useActions as useGraphActions } from '@dxos/plugin-graph';\nimport { type MenuItem } from '@dxos/react-ui-menu';\nimport { Tabs } from '@dxos/react-ui-tabs';\nimport { Position } from '@dxos/util';\n\nimport { useLoadDescendents } from '#hooks';\n\nimport { useNavTreeContext } from '../NavTreeContext';\nimport { L0Menu, L1Tabs, type L1TabsProps } from '../Sidebar';\n\nexport const NAV_TREE_ITEM = 'NavTreeItem';\n\nexport type NavTreeProps = { id: string; root?: Node.Node; tab: string } & Pick<L1TabsProps, 'open'>;\n\n// TODO(wittjosiah): Refactor to Radix-style.\nexport const NavTree = forwardRef<HTMLDivElement, NavTreeProps>(({ id, root, tab, ...props }, forwardedRef) => {\n const { onBack, onItemHover } = useNavTreeContext();\n const { topLevelActions, l0Items, pinnedItems, userAccountItem, topLevelItems } = useTopLevelNavItems(root);\n\n useLoadDescendents(root);\n const path = useMemo(() => [id], [id]);\n\n return (\n // TODO(thure): `Tabs.Root` forces all items that should be able to receive focus to use `Tabs.Tab(Primitive)` since\n // it uses RovingFocus and doesn't support moving focus to an item that is not a tab. Assess whether this situation\n // should change including whether it should motivate a change in the design/taxonomy, or if this means this should\n // not use `react-ui-tabs` at all.\n <Tabs.Root value={tab} orientation='vertical' classNames='relative' ref={forwardedRef}>\n <L0Menu\n menuActions={topLevelActions as MenuItem[]}\n topLevelItems={l0Items}\n pinnedItems={pinnedItems}\n userAccountItem={userAccountItem}\n path={path}\n parent={root}\n onItemHover={onItemHover}\n />\n <L1Tabs topLevelItems={topLevelItems} path={path} currentItemId={tab} onBack={onBack} {...props} />\n </Tabs.Root>\n );\n});\n\n/**\n * Partitions root children into workspaces, pinned items, user-account, and top-level actions.\n */\nconst useTopLevelNavItems = (root?: Node.Node) => {\n const { graph } = useAppGraph();\n const rootId = root?.id ?? Node.RootId;\n const rootOutboundItems = useConnections(graph, rootId, 'child');\n const rootActions = useGraphActions(graph, rootId);\n\n const { topLevelActions, l0Items, pinnedItems, userAccountItem } = useMemo(() => {\n const topLevelWorkspaces: Node.Node[] = [];\n const outboundPinnedItems: Node.Node[] = [];\n let userAccountItem: Node.Node | undefined;\n for (const node of rootOutboundItems) {\n switch (node.properties.disposition) {\n case 'workspace':\n topLevelWorkspaces.push(node);\n break;\n case 'pin-end':\n outboundPinnedItems.push(node);\n break;\n case 'user-account':\n userAccountItem ??= node;\n break;\n }\n }\n\n const topLevelActions = rootActions\n .filter((action) => action.properties.disposition === 'menu')\n .toSorted((a, b) => Position.compare(a.properties, b.properties));\n const pinnedItems = [\n ...outboundPinnedItems,\n ...rootActions.filter((action) => action.properties.disposition === 'pin-end'),\n ].toSorted((a, b) => Position.compare(a.properties, b.properties));\n\n return {\n pinnedItems,\n topLevelActions,\n userAccountItem,\n l0Items: topLevelWorkspaces,\n };\n }, [rootActions, rootOutboundItems]);\n\n const topLevelItems = useMemo(\n () => [...l0Items, ...pinnedItems, ...(userAccountItem ? [userAccountItem] : [])],\n [l0Items, pinnedItems, userAccountItem],\n );\n\n return { topLevelActions, l0Items, pinnedItems, userAccountItem, topLevelItems };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext, useContext } from 'react';\n\nimport { raise } from '@dxos/debug';\n\nimport { type NavTreeContextValue } from '../types';\n\nexport const NavTreeContext = createContext<NavTreeContextValue | null>(null);\n\nexport const useNavTreeContext = () => useContext(NavTreeContext) ?? raise(new Error('Missing NavTreeContext'));\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport {\n type Edge,\n attachClosestEdge,\n extractClosestEdge,\n} from '@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge';\nimport { combine } from '@atlaskit/pragmatic-drag-and-drop/combine';\nimport { draggable, dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';\nimport { preserveOffsetOnSource } from '@atlaskit/pragmatic-drag-and-drop/element/preserve-offset-on-source';\nimport { scrollJustEnoughIntoView } from '@atlaskit/pragmatic-drag-and-drop/element/scroll-just-enough-into-view';\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React, {\n type MouseEvent,\n type PropsWithChildren,\n forwardRef,\n memo,\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { type Node } from '@dxos/app-graph';\nimport { DxAvatar } from '@dxos/lit-ui/react';\nimport { useActionRunner } from '@dxos/plugin-graph';\nimport {\n Icon,\n IconButton,\n ScrollArea,\n type ThemedClassName,\n Tooltip,\n toLocalizedString,\n useMediaQuery,\n useTranslation,\n} from '@dxos/react-ui';\nimport { DropIndicator } from '@dxos/react-ui-list';\nimport { Menu, type MenuItem } from '@dxos/react-ui-menu';\nimport { Tabs } from '@dxos/react-ui-tabs';\nimport { mx } from '@dxos/ui-theme';\nimport { arrayMove } from '@dxos/util';\n\nimport { useNavTreeState } from '#hooks';\nimport { meta } from '#meta';\n\nimport { l0ItemType } from '../../util';\nimport { useNavTreeContext } from '../NavTreeContext';\nimport { UserAccountAvatar } from '../UserAccountAvatar';\n\n//\n// L0Item\n//\n\ntype L0ItemData = {\n id: L0ItemProps['item']['id'];\n type: 'l0Item';\n};\n\n// Local rearrange-handler callback shape; drag-and-drop is wired directly via pragmatic-dnd in `L0Item`,\n// so only the callback signature is needed here.\ntype StackItemRearrangeHandler<Data extends { id: string } = { id: string }> = (\n source: Data,\n target: Data,\n closestEdge: Edge | null,\n) => void;\n\ntype L0ItemRootProps = {\n item: Node.Node;\n parent?: Node.Node;\n path: string[];\n onMouseEnter?: () => void;\n};\n\ntype L0ItemProps = L0ItemRootProps & {\n item: Node.Node;\n parent?: Node.Node;\n path: string[];\n pinned?: boolean;\n onRearrange?: StackItemRearrangeHandler<L0ItemData>;\n onItemHover?: (params: { item: Node.Node }) => void;\n};\n\nconst useL0ItemClick = ({ item, parent, path }: L0ItemProps, type: string) => {\n const { onSelect, onTabChange } = useNavTreeContext();\n const { getItem } = useNavTreeState();\n const [isLg] = useMediaQuery('lg');\n const runAction = useActionRunner();\n\n return useCallback(\n (event: MouseEvent) => {\n switch (type) {\n case 'action': {\n const { properties: { caller } = {} } = item;\n return void runAction(item as Node.Action, caller ? { parent, path, caller } : { parent, path });\n }\n case 'tab':\n return onTabChange?.(item);\n case 'link':\n return onSelect?.({ item, path, current: !getItem(path).current, option: event.altKey });\n }\n },\n [item, parent, type, getItem, onSelect, onTabChange, isLg, runAction],\n );\n};\n\nconst l0Breakpoints: Record<string, string> = {\n lg: 'hidden lg:grid',\n};\n\nconst L0ItemRoot = memo(\n forwardRef<HTMLButtonElement, PropsWithChildren<L0ItemRootProps>>(\n ({ item, parent, path, onMouseEnter, children }, forwardedRef) => {\n const { t } = useTranslation(meta.profile.key);\n const { model } = useNavTreeContext();\n const itemPath = useMemo(() => [...path, item.id], [item.id, path]);\n const { id, testId } = useAtomValue(model.itemProps(itemPath));\n const localizedString = toLocalizedString(item.properties.label, t);\n\n const type = l0ItemType(item);\n const handleClick = useL0ItemClick({ item, parent, path: itemPath }, type);\n\n return (\n <Tooltip.Trigger asChild delayDuration={0} side='right' content={localizedString}>\n <Tabs.TabPrimitive\n className={mx(\n 'group/l0item flex w-full justify-center items-center relative',\n 'dx-app-no-drag dx-focus-ring-group data[type!=\"collection\"]:cursor-pointer',\n l0Breakpoints[item.properties.l0Breakpoint],\n )}\n tabIndex={type === 'tab' ? 0 : undefined}\n data-type={type}\n data-testid={testId}\n data-object-id={id}\n value={item.id}\n onClick={handleClick}\n onMouseEnter={onMouseEnter}\n ref={forwardedRef}\n >\n {children}\n </Tabs.TabPrimitive>\n </Tooltip.Trigger>\n );\n },\n ),\n);\n\nexport const L0ItemActiveTabIndicator = ({ classNames }: ThemedClassName<{}>) => (\n <div\n className={mx(\n 'hidden group-aria-selected/l0item:block absolute start-0 h-6 w-1.5 bg-accent-bg rounded-sm',\n classNames,\n )}\n />\n);\n\n// TODO(burdon): Factor out pinned (non-draggable) items.\nconst L0Item = memo(({ item, parent, path, pinned, onRearrange, onItemHover }: L0ItemProps) => {\n const { t } = useTranslation(meta.profile.key);\n const itemElement = useRef<HTMLButtonElement | null>(null);\n const [closestEdge, setEdge] = useState<Edge | null>(null);\n const localizedString = toLocalizedString(item.properties.label, t);\n const hue = item.properties.hue ?? null;\n\n useLayoutEffect(() => {\n if (!itemElement.current || !onRearrange) {\n return;\n }\n\n return combine(\n draggable({\n element: itemElement.current,\n getInitialData: () => ({ id: item.id, type: 'l0Item' }) satisfies L0ItemData,\n onGenerateDragPreview: ({ nativeSetDragImage, source, location }) => {\n document.body.setAttribute('data-drag-preview', 'true');\n const element = source.element.querySelector('[data-frame]') as HTMLElement;\n scrollJustEnoughIntoView({ element });\n const { x, y } = preserveOffsetOnSource({ element, input: location.current.input })({\n container: (element.offsetParent ?? document.body) as HTMLElement,\n });\n nativeSetDragImage?.(element, x, y);\n },\n onDragStart: () => {\n document.body.removeAttribute('data-drag-preview');\n itemElement.current!.closest('[data-drag-autoscroll]')?.setAttribute('data-drag-autoscroll', 'active');\n },\n onDrop: () => {\n itemElement.current!.closest('[data-drag-autoscroll]')?.setAttribute('data-drag-autoscroll', 'idle');\n },\n }),\n dropTargetForElements({\n element: itemElement.current,\n getData: ({ input, element }) => {\n return attachClosestEdge(\n { id: item.id, type: 'l0Item' },\n { input, element, allowedEdges: ['top', 'bottom'] },\n );\n },\n onDragEnter: ({ self, source }) => {\n if (source.data.type === self.data.type) {\n setEdge(extractClosestEdge(self.data));\n }\n },\n onDrag: ({ self, source }) => {\n if (source.data.type === self.data.type) {\n setEdge(extractClosestEdge(self.data));\n }\n },\n onDragLeave: () => setEdge(null),\n onDrop: ({ self, source }) => {\n setEdge(null);\n if (source.data.type === self.data.type) {\n onRearrange(source.data as L0ItemData, self.data as L0ItemData, extractClosestEdge(self.data));\n }\n },\n }),\n );\n }, [item, onRearrange]);\n\n const handleMouseEnter = useCallback(() => onItemHover?.({ item }), [item, onItemHover]);\n\n return (\n <L0ItemRoot ref={itemElement} item={item} parent={parent} path={path} onMouseEnter={handleMouseEnter}>\n <div\n data-frame={true}\n {...(hue && { style: { background: `var(--color-${hue}-surface)` } })}\n className={mx(\n 'flex justify-center items-center dx-focus-ring-group-indicator transition-colors rounded-sm',\n pinned\n ? 'p-2 group-hover/l0item:bg-current-surface'\n : 'w-(--dx-l0-avatar-size) h-(--dx-l0-avatar-size) bg-current-surface',\n )}\n >\n <ItemAvatar item={item} />\n </div>\n <L0ItemActiveTabIndicator />\n <span id={`${item.id}__label`} className='sr-only'>\n {localizedString}\n </span>\n {closestEdge && <DropIndicator edge={closestEdge} />}\n </L0ItemRoot>\n );\n});\n\nconst ItemAvatar = ({ item }: Pick<L0ItemProps, 'item'>) => {\n const { t } = useTranslation(meta.profile.key);\n\n // Actions.\n if (item.properties.icon) {\n const hue = item.properties.hue ?? null;\n const hueFgStyle = hue && { style: { color: `var(--color-${hue}-fg)` } };\n return <Icon icon={item.properties.icon} size={6} {...hueFgStyle} />;\n }\n\n const type = l0ItemType(item);\n if (type === 'tab' && item.properties.disposition !== 'pin-end') {\n const hue = item.properties.hue ?? null;\n const localizedString = toLocalizedString(item.properties.label, t);\n return <DxAvatar hue={hue} hueVariant='surface' variant='square' size={12} fallback={localizedString} />;\n }\n\n return null;\n};\n\n//\n// L0Menu\n//\n\nexport type L0MenuProps = {\n menuActions: MenuItem[];\n topLevelItems: Node.Node[];\n pinnedItems: Node.Node[];\n userAccountItem?: Node.Node;\n parent?: Node.Node;\n path: string[];\n onItemHover?: (params: { item: Node.Node }) => void;\n};\n\nexport const L0Menu = ({\n menuActions,\n topLevelItems,\n pinnedItems,\n userAccountItem,\n parent,\n path,\n onItemHover,\n}: L0MenuProps) => {\n const { t } = useTranslation(meta.profile.key);\n const runAction = useActionRunner();\n const handleAction = useCallback(\n (action: Node.Action, params: Node.InvokeProps) => {\n void runAction(action, params);\n },\n [runAction],\n );\n\n const handleRearrange = useCallback<StackItemRearrangeHandler<L0ItemData>>(\n (source, target, closestEdge) => {\n const sourceItem = topLevelItems.find((i) => i.id === source.id);\n if (!sourceItem?.properties.onRearrange) {\n return;\n }\n\n const sourceIndex = topLevelItems.findIndex((i) => i.id === source.id);\n const targetIndex = topLevelItems.findIndex((i) => i.id === target.id);\n const insertIndex =\n source.id === target.id\n ? sourceIndex\n : targetIndex +\n (sourceIndex < targetIndex ? (closestEdge === 'top' ? -1 : 0) : closestEdge === 'bottom' ? 1 : 0);\n const nextOrder = arrayMove([...topLevelItems], sourceIndex, insertIndex);\n return sourceItem.properties.onRearrange(nextOrder.map((item) => item.data));\n },\n [topLevelItems],\n );\n\n // Check if any items have onRearrange to enable drag-and-drop.\n const hasRearrangeableItems = topLevelItems.some((item) => item.properties.onRearrange);\n\n return (\n <Tabs.Tablist\n data-tauri-drag-region\n classNames={[\n 'group/l0 absolute z-[1] inset-y-0 start-0 rounded-is',\n 'grid grid-cols-[var(--dx-l0-size)] grid-rows-[var(--dx-rail-size)_1fr_min-content_var(--dx-l0-size)] dx-contain-layout',\n 'w-(--dx-l0-size) bg-l0-surface dx-app-drag pb-[env(safe-area-inset-bottom)]',\n '[body[data-platform=\"macos\"]_&]:pt-[30px]',\n '[body[data-platform=\"ios\"]_&]:pt-[max(env(safe-area-inset-top),0.25rem)]',\n ]}\n >\n {/* TODO(wittjosiah): Use L0Item trigger. */}\n <Menu.Root onAction={handleAction}>\n <Menu.Trigger asChild data-testid='spacePlugin.addSpace'>\n <div className='grid place-items-center'>\n <IconButton\n density='lg'\n variant='ghost'\n size={5}\n icon='ph--list--regular'\n iconOnly\n square\n label={t('app-menu.label')}\n />\n </div>\n </Menu.Trigger>\n <Menu.Content group={parent} items={menuActions} />\n </Menu.Root>\n\n {/* Space list. */}\n <ScrollArea.Root centered thin orientation='vertical'>\n <ScrollArea.Viewport classNames='flex flex-col gap-2 py-1'>\n {topLevelItems.map((item) => (\n <L0Item\n key={item.id}\n item={item}\n parent={parent}\n path={path}\n onItemHover={onItemHover}\n {...(hasRearrangeableItems && { onRearrange: handleRearrange })}\n />\n ))}\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n\n {/* Actions. */}\n <div className='grid grid-cols-1 auto-rows-(--dx-rail-action) pt-2'>\n {pinnedItems.map((item) => (\n <L0Item key={item.id} item={item} parent={parent} path={path} pinned />\n ))}\n </div>\n\n {userAccountItem && (\n <div className='grid dx-app-no-drag'>\n <L0ItemRoot key={userAccountItem.id} item={userAccountItem} parent={parent} path={path}>\n <UserAccountAvatar\n userId={userAccountItem.properties.userId}\n hue={userAccountItem.properties.hue}\n emoji={userAccountItem.properties.emoji}\n status={userAccountItem.properties.status}\n size={10}\n />\n </L0ItemRoot>\n </div>\n )}\n </Tabs.Tablist>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Avatar, type AvatarStatus, type Size } from '@dxos/react-ui';\nimport { hexToFallback } from '@dxos/util';\n\nimport { L0ItemActiveTabIndicator } from '../Sidebar';\n\nexport type UserAccountAvatarProps = {\n size?: Size;\n userId?: string;\n hue?: string;\n emoji?: string;\n status?: AvatarStatus;\n};\n\nexport const UserAccountAvatar = ({ size, userId, hue, emoji, status }: UserAccountAvatarProps) => {\n const fallbackValue = hexToFallback(userId ?? '0');\n\n return (\n <>\n <L0ItemActiveTabIndicator classNames='inset-y-6' />\n <div\n className='grid place-items-center dx-focus-ring-group-indicator rounded-full'\n data-joyride='welcome/account'\n >\n <Avatar.Root>\n <Avatar.Content\n variant='circle'\n size={size ?? 12}\n status={status ?? 'active'}\n hue={hue || fallbackValue.hue}\n fallback={emoji || fallbackValue.emoji}\n data-testid='treeView.userAccount'\n />\n </Avatar.Root>\n </div>\n </>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Option from 'effect/Option';\nimport React, { memo, useCallback, useMemo } from 'react';\n\nimport { Node } from '@dxos/app-graph';\nimport { Paths } from '@dxos/app-toolkit';\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { Graph, useActionRunner, useEdges } from '@dxos/plugin-graph';\nimport { DensityProvider, IconButton, ScrollArea, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { Tree } from '@dxos/react-ui-list';\nimport { Menu, type MenuItem } from '@dxos/react-ui-menu';\nimport { Tabs } from '@dxos/react-ui-tabs';\nimport { hoverableControlItem, hoverableOpenControlItem } from '@dxos/ui-theme';\n\nimport { getListActions, useActions, useLoadDescendents } from '#hooks';\nimport { meta } from '#meta';\n\nimport { NAV_TREE_ITEM } from '../NavTree';\nimport { useNavTreeContext } from '../NavTreeContext';\nimport { NavTreeItemColumns } from '../NavTreeItem/NavTreeItemColumns';\n\nexport type L1PanelProps = {\n open?: boolean;\n path: string[];\n item: Node.Node;\n isCurrent: boolean;\n onBack?: () => void;\n};\n\n/**\n * Space or settings panel.\n */\nconst L1Panel$ = ({ open, path, item, isCurrent, onBack }: L1PanelProps) => {\n const { t } = useTranslation(meta.profile.key);\n const title = toLocalizedString(item.properties.label, t);\n const isActivated = useIsActivatedWorkspace(item);\n const shouldRenderContent = isCurrent || isActivated;\n\n return (\n <Tabs.Panel\n key={item.id}\n value={item.id}\n classNames={[\n 'absolute inset-y-0 end-0',\n 'w-[calc(100%-var(--dx-l0-size))] lg:w-(--dx-l1-size) grid-cols-1 grid-rows-[var(--dx-rail-size)_1fr]',\n 'py-[env(safe-area-inset-top)]',\n isCurrent && 'grid',\n ]}\n tabIndex={-1}\n aria-label={title}\n {...(isCurrent && { 'data-testid': 'navtree.workspace.visible' })}\n {...(!open && { inert: true })}\n >\n {shouldRenderContent && <L1PanelContent open={open} path={path} item={item} onBack={onBack} />}\n </Tabs.Panel>\n );\n};\n\n/** Determines whether a workspace tab has been populated with real child content (i.e. expanded at least once). */\nconst useIsActivatedWorkspace = (item: Node.Node): boolean => {\n const { graph } = useAppGraph();\n const edges = useEdges(graph, item.id);\n\n return useMemo(() => {\n const childIds = edges[Graph.relationKey('child')] ?? [];\n return childIds.some((childId) => {\n const child = Graph.getNode(graph, childId);\n if (Option.isNone(child)) {\n return false;\n }\n return child.value.properties.disposition === undefined;\n });\n }, [edges, graph]);\n};\n\n/**\n * Mounted panel content for active or previously-visited tabs.\n */\nconst L1PanelContent = ({ path, item, onBack }: Pick<L1PanelProps, 'open' | 'path' | 'item' | 'onBack'>) => {\n const navTreeContext = useNavTreeContext();\n\n return (\n <DensityProvider density='md'>\n <L1PanelHeader path={path} item={item} onBack={onBack} />\n <ScrollArea.Root thin orientation='vertical'>\n <ScrollArea.Viewport>\n <Tree\n classNames='pt-[2px]'\n model={navTreeContext.model}\n id={item.id}\n rootId={item.id}\n path={path}\n levelOffset={5}\n draggable\n gridTemplateColumns='[tree-row-start] minmax(0, 1fr) min-content min-content [tree-row-end]'\n renderColumns={NavTreeItemColumns}\n blockInstruction={navTreeContext.blockInstruction}\n canDrop={navTreeContext.canDrop}\n canSelect={navTreeContext.canSelect}\n onOpenChange={navTreeContext.onOpenChange}\n onSelect={navTreeContext.onSelect}\n onItemHover={navTreeContext.onItemHover}\n />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n </DensityProvider>\n );\n};\n\n/**\n * Header row.\n */\nconst L1PanelHeader = ({ item, path, onBack }: Pick<L1PanelProps, 'item' | 'path' | 'onBack'>) => {\n const { t } = useTranslation(meta.profile.key);\n const { renderItemEnd: ItemEnd } = useNavTreeContext();\n const title = toLocalizedString(item.properties.label, t);\n const backCapableWorkspace = Paths.isPinnedWorkspace(item.id);\n\n const { menuActions, onAction } = useL1MenuActions({ item, path });\n useLoadDescendents(item);\n\n return (\n <div\n data-tauri-drag-region\n className='grid grid-cols-[28px_1fr_min-content_min-content] w-full items-center dx-app-drag dx-density-lg'\n >\n {backCapableWorkspace ? (\n <IconButton\n classNames={[hoverableControlItem, hoverableOpenControlItem]}\n variant='ghost'\n icon='ph--caret-left--regular'\n iconOnly\n size={4}\n label={t('button-back.button')}\n data-testid='treeView.primaryTreeButton'\n onClick={() => onBack?.()}\n />\n ) : (\n <div />\n )}\n <h2 data-tauri-drag-region className='flex-1 truncate min-w-0'>\n {title}\n </h2>\n <div className='contents dx-app-no-drag'>\n <MenuActions item={item} menuActions={menuActions} onAction={onAction} />\n {ItemEnd && <ItemEnd node={item} open />}\n </div>\n </div>\n );\n};\n\ntype L1MenuActions = {\n menuActions: Node.Action[];\n onAction: (action: Node.Action, params?: Node.InvokeProps) => void;\n};\n\n/**\n * Header menu actions for an L1 workspace tab. Renders nothing for an empty\n * `menuActions`, a single inline icon button for one action, and a\n * `…`-menu trigger for multiple.\n */\nconst MenuActions = ({\n item,\n menuActions,\n onAction,\n}: {\n item: Node.Node;\n} & Pick<L1MenuActions, 'menuActions' | 'onAction'>) => {\n const { t } = useTranslation(meta.profile.key);\n\n if (menuActions.length === 0) {\n return null;\n }\n\n if (menuActions.length === 1) {\n return (\n <IconButton\n classNames={['shrink-0 px-2 pointer-fine:px-1', hoverableControlItem, hoverableOpenControlItem]}\n variant='ghost'\n icon={menuActions[0].properties?.icon ?? 'ph--circle-dashed--regular'}\n iconOnly\n size={4}\n label={toLocalizedString(menuActions[0].properties?.label, t)}\n data-testid={menuActions[0].properties?.testId}\n onClick={() => onAction(menuActions[0] as Node.Action)}\n />\n );\n }\n\n return (\n <Menu.Root caller={NAV_TREE_ITEM} onAction={onAction}>\n <Menu.Trigger asChild>\n <IconButton\n classNames={['shrink-0 px-2 pointer-fine:px-1', hoverableControlItem, hoverableOpenControlItem]}\n variant='ghost'\n icon='ph--dots-three-vertical--regular'\n iconOnly\n size={4}\n label={t('tree-item-actions.label')}\n data-testid='navtree.treeItem.actionsLevel0'\n />\n </Menu.Trigger>\n <Menu.Content group={item} items={menuActions as MenuItem[]} />\n </Menu.Root>\n );\n};\n\n/**\n * Builds the menu actions for the L1 panel header.\n */\nconst useL1MenuActions = ({ item, path }: Pick<L1PanelProps, 'item' | 'path'>): L1MenuActions => {\n const runAction = useActionRunner();\n\n const menuActions = getListActions(useActions(item));\n\n const onAction = useCallback(\n (action: Node.Action, params?: Node.InvokeProps) => {\n void runAction(action, { ...params, path });\n },\n [runAction, path],\n );\n\n return { menuActions, onAction };\n};\n\nexport const L1Panel = memo(L1Panel$);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { Fragment, memo, useMemo } from 'react';\n\nimport { Popover, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { Treegrid } from '@dxos/react-ui-list';\n\nimport { getListActions, useActions } from '#hooks';\nimport { meta } from '#meta';\n\nimport { NAV_TREE_ITEM } from '../NavTree';\nimport { useNavTreeContext } from '../NavTreeContext';\nimport { type NavTreeItemColumnsProps } from '../types';\nimport { NavTreeItemActionDropdownMenu, NavTreeItemMonolithicAction } from './NavTreeItemAction';\n\nexport const NavTreeItemColumns = memo(({ path, item, open }: NavTreeItemColumnsProps) => {\n const { t } = useTranslation(meta.profile.key);\n const { renderItemEnd: ItemEnd, popoverAnchorId } = useNavTreeContext();\n\n const level = path.length - 2;\n const flattenedActions = useActions(item);\n const allActions = useMemo(() => getListActions(flattenedActions), [flattenedActions]);\n\n const anchored = popoverAnchorId === `${NAV_TREE_ITEM}:${item.id}`;\n const ActionRoot = anchored ? Popover.Anchor : Fragment;\n\n return (\n // `data-popover-anchor` lets the enclosing row highlight itself while a popover (e.g. rename) is open on it.\n <div className='contents dx-app-no-drag' {...(anchored && { 'data-popover-anchor': '' })}>\n <ActionRoot>\n {allActions.length === 1 ? (\n <Treegrid.Cell classNames='contents'>\n <NavTreeItemMonolithicAction\n baseLabel={toLocalizedString(allActions[0].properties?.label, t)}\n parent={item}\n path={path}\n {...allActions[0]}\n />\n </Treegrid.Cell>\n ) : allActions.length > 1 ? (\n <Treegrid.Cell classNames='contents'>\n <NavTreeItemActionDropdownMenu\n testId={`navtree.treeItem.actionsLevel${level}`}\n label={t('tree-item-actions.label')}\n icon='ph--dots-three-vertical--regular'\n parent={item}\n path={path}\n menuActions={allActions}\n caller={NAV_TREE_ITEM}\n />\n </Treegrid.Cell>\n ) : (\n <Treegrid.Cell />\n )}\n </ActionRoot>\n {ItemEnd && (\n <Treegrid.Cell classNames='contents'>\n <ItemEnd node={item} open={open} />\n </Treegrid.Cell>\n )}\n </div>\n );\n});\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { type Node } from '@dxos/app-graph';\nimport { useActionRunner } from '@dxos/plugin-graph';\nimport { IconButton, toLocalizedString, useDensityContext, useTranslation } from '@dxos/react-ui';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport { Menu, type MenuItem } from '@dxos/react-ui-menu';\nimport { hoverableControlItem, hoverableOpenControlItem } from '@dxos/ui-theme';\n\nimport { meta } from '#meta';\nimport { type ActionProperties } from '#types';\n\nconst fallbackIcon = 'ph--circle-dashed--regular';\n\nconst mdActionButtonProps = {\n size: 4 as const,\n density: 'md' as const,\n};\n\nconst lgActionButtonProps = {\n size: 5 as const,\n density: 'lg' as const,\n};\n\nexport type NavTreeItemActionMenuProps = ActionProperties & {\n parent: Node.Node;\n path?: string[];\n caller?: string;\n monolithic?: boolean;\n menuActions?: Node.Action[];\n};\n\nexport const NavTreeItemActionDropdownMenu = composable<HTMLButtonElement, NavTreeItemActionMenuProps>(\n ({ parent, path, label, icon, testId, menuActions, caller, ...props }, forwardedRef) => {\n const { t } = useTranslation(meta.profile.key);\n const density = useDensityContext();\n const runAction = useActionRunner();\n const handleAction = useCallback(\n (action: Node.Action, params: Node.InvokeProps = {}) => runAction(action, { ...params, path }),\n [runAction, path],\n );\n\n return (\n <Menu.Root caller={caller} onAction={handleAction}>\n <Menu.Trigger asChild>\n <IconButton\n {...(density === 'lg' ? lgActionButtonProps : mdActionButtonProps)}\n {...composableProps(props)}\n classNames={['shrink-0 px-2 pointer-fine:px-1', hoverableControlItem, hoverableOpenControlItem]}\n variant='ghost'\n icon={icon ?? fallbackIcon}\n iconOnly\n label={toLocalizedString(label, t)}\n data-testid={testId}\n ref={forwardedRef}\n />\n </Menu.Trigger>\n <Menu.Content group={parent} items={menuActions as MenuItem[]} />\n </Menu.Root>\n );\n },\n);\n\nNavTreeItemActionDropdownMenu.displayName = 'NavTreeItemActionDropdownMenu';\n\nexport const NavTreeItemMonolithicAction = (\n props: Node.Action & {\n parent: Node.Node;\n path?: string[];\n onAction?: (action: Node.Action) => void;\n baseLabel: string;\n },\n) => {\n const {\n parent,\n path,\n properties: { disabled, caller, testId, icon, variant = 'ghost', iconOnly = true } = { label: 'never' },\n baseLabel,\n } = props;\n const density = useDensityContext();\n const runAction = useActionRunner();\n return (\n <IconButton\n {...(density === 'lg' ? lgActionButtonProps : mdActionButtonProps)}\n variant={variant}\n classNames={[\n 'shrink-0',\n hoverableControlItem,\n hoverableOpenControlItem,\n iconOnly ? 'px-2 pointer-fine:px-1' : 'p-2 pointer-fine:p-2 me-1',\n ]}\n icon={icon ?? fallbackIcon}\n iconOnly={iconOnly}\n label={baseLabel}\n disabled={disabled}\n onClick={(event) => {\n event.stopPropagation();\n if (disabled) {\n return;\n }\n\n void runAction(props, caller ? { parent, caller, path } : { parent, path });\n }}\n data-testid={testId}\n />\n );\n};\n\nexport const NavTreeItemAction = ({\n monolithic,\n menuActions,\n menuType,\n parent,\n path,\n ...props\n}: NavTreeItemActionMenuProps) => {\n const { t } = useTranslation(meta.profile.key);\n\n const monolithicAction = menuActions?.length === 1 && menuActions[0];\n const baseLabel = toLocalizedString(monolithicAction ? monolithicAction.properties!.label : props.label, t);\n return monolithic && menuActions?.length === 1 ? (\n <NavTreeItemMonolithicAction baseLabel={baseLabel} parent={parent} path={path} {...menuActions[0]} />\n ) : (\n <NavTreeItemActionDropdownMenu {...props} label={baseLabel} parent={parent} path={path} menuActions={menuActions} />\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type Node } from '@dxos/app-graph';\n\nimport { l0ItemType } from '../../util';\nimport { L1Panel, type L1PanelProps } from './L1Panel';\n\nexport type L1TabsProps = Pick<L1PanelProps, 'open' | 'onBack'> & {\n currentItemId: string;\n path: string[];\n topLevelItems: Node.Node[];\n};\n\n/**\n * Each workspace is an L1 tab.\n */\nexport const L1Tabs = ({ topLevelItems, currentItemId, onBack, open, path }: L1TabsProps) => {\n return (\n <>\n {topLevelItems.map((item) => {\n const type = l0ItemType(item);\n if (type === 'tab') {\n return (\n <L1Panel\n key={item.id}\n item={item}\n path={path}\n open={open}\n onBack={onBack}\n isCurrent={item.id === currentItemId}\n />\n );\n }\n return null;\n })}\n </>\n );\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;AAIA,OAAOA,UAASC,cAAAA,aAAYC,WAAAA,gBAAe;AAE3C,SAASC,eAAAA,oBAAmB;AAC5B,SAASC,MAAMC,gBAAgBC,cAAcC,uBAAuB;AAEpE,SAASC,QAAAA,aAAY;AACrB,SAASC,gBAAgB;AAEzB,SAASC,sBAAAA,2BAA0B;;;ACRnC,SAASC,eAAeC,kBAAkB;AAE1C,SAASC,aAAa;AAIf,IAAMC,iBAAiBH,8BAA0C,IAAA;AAEjE,IAAMI,oBAAoB,MAAMH,WAAWE,cAAAA,KAAmBD,MAAM,IAAIG,MAAM,wBAAA,CAAA;;;ACRrF,SAEEC,mBACAC,0BACK;AACP,SAASC,eAAe;AACxB,SAASC,WAAWC,6BAA6B;AACjD,SAASC,8BAA8B;AACvC,SAASC,gCAAgC;AACzC,SAASC,oBAAoB;AAC7B,OAAOC,UAGLC,YACAC,MACAC,aACAC,iBACAC,SACAC,QACAC,gBACK;AAGP,SAASC,gBAAgB;AACzB,SAASC,uBAAuB;AAChC,SACEC,MACAC,YACAC,YAEAC,SACAC,mBACAC,eACAC,sBACK;AACP,SAASC,qBAAqB;AAC9B,SAASC,YAA2B;AACpC,SAASC,YAAY;AACrB,SAASC,UAAU;AACnB,SAASC,iBAAiB;AAE1B,SAASC,uBAAuB;AAChC,SAASC,YAAY;;;AC1CrB,OAAOC,WAAW;AAElB,SAASC,cAA4C;AACrD,SAASC,qBAAqB;AAYvB,IAAMC,oBAAoB,CAAC,EAAEC,MAAMC,QAAQC,KAAKC,OAAOC,OAAM,MAA0B;AAC5F,QAAMC,gBAAgBC,cAAcL,UAAU,GAAA;AAE9C,SACE,sBAAA,cAAA,MAAA,UAAA,MACE,sBAAA,cAACM,0BAAAA;IAAyBC,YAAW;MACrC,sBAAA,cAACC,OAAAA;IACCC,WAAU;IACVC,gBAAa;KAEb,sBAAA,cAACC,OAAOC,MAAI,MACV,sBAAA,cAACD,OAAOE,SAAO;IACbC,SAAQ;IACRf,MAAMA,QAAQ;IACdI,QAAQA,UAAU;IAClBF,KAAKA,OAAOG,cAAcH;IAC1Bc,UAAUb,SAASE,cAAcF;IACjCc,eAAY;;AAMxB;;;AD2CA,IAAMC,iBAAiB,CAAC,EAAEC,MAAMC,QAAQC,KAAI,GAAiBC,SAAAA;AAC3D,QAAM,EAAEC,UAAUC,YAAW,IAAKC,kBAAAA;AAClC,QAAM,EAAEC,QAAO,IAAKC,gBAAAA;AACpB,QAAM,CAACC,IAAAA,IAAQC,cAAc,IAAA;AAC7B,QAAMC,YAAYC,gBAAAA;AAElB,SAAOC,YACL,CAACC,UAAAA;AACC,YAAQX,MAAAA;MACN,KAAK,UAAU;AACb,cAAM,EAAEY,YAAY,EAAEC,OAAM,IAAK,CAAC,EAAC,IAAKhB;AACxC,eAAO,KAAKW,UAAUX,MAAqBgB,SAAS;UAAEf;UAAQC;UAAMc;QAAO,IAAI;UAAEf;UAAQC;QAAK,CAAA;MAChG;MACA,KAAK;AACH,eAAOG,cAAcL,IAAAA;MACvB,KAAK;AACH,eAAOI,WAAW;UAAEJ;UAAME;UAAMe,SAAS,CAACV,QAAQL,IAAAA,EAAMe;UAASC,QAAQJ,MAAMK;QAAO,CAAA;IAC1F;EACF,GACA;IAACnB;IAAMC;IAAQE;IAAMI;IAASH;IAAUC;IAAaI;IAAME;GAAU;AAEzE;AAEA,IAAMS,gBAAwC;EAC5CC,IAAI;AACN;AAEA,IAAMC,aAAaC,qBACjBC,2BACE,CAAC,EAAExB,MAAMC,QAAQC,MAAMuB,cAAcC,SAAQ,GAAIC,iBAAAA;AAC/C,QAAM,EAAEC,EAAC,IAAKC,eAAeC,KAAKC,QAAQC,GAAG;AAC7C,QAAM,EAAEC,MAAK,IAAK3B,kBAAAA;AAClB,QAAM4B,WAAWC,QAAQ,MAAM;OAAIjC;IAAMF,KAAKoC;KAAK;IAACpC,KAAKoC;IAAIlC;GAAK;AAClE,QAAM,EAAEkC,IAAIC,OAAM,IAAKC,aAAaL,MAAMM,UAAUL,QAAAA,CAAAA;AACpD,QAAMM,kBAAkBC,kBAAkBzC,KAAKe,WAAW2B,OAAOd,CAAAA;AAEjE,QAAMzB,OAAOwC,WAAW3C,IAAAA;AACxB,QAAM4C,cAAc7C,eAAe;IAAEC;IAAMC;IAAQC,MAAMgC;EAAS,GAAG/B,IAAAA;AAErE,SACE,gBAAA0C,OAAA,cAACC,QAAQC,SAAO;IAACC,SAAAA;IAAQC,eAAe;IAAGC,MAAK;IAAQC,SAASX;KAC/D,gBAAAK,OAAA,cAACO,KAAKC,cAAY;IAChBC,WAAWC,GACT,iEACA,8EACAnC,cAAcpB,KAAKe,WAAWyC,YAAY,CAAC;IAE7CC,UAAUtD,SAAS,QAAQ,IAAIuD;IAC/BC,aAAWxD;IACXyD,eAAavB;IACbwB,kBAAgBzB;IAChB0B,OAAO9D,KAAKoC;IACZ2B,SAASnB;IACTnB;IACAuC,KAAKrC;KAEJD,QAAAA,CAAAA;AAIT,CAAA,CAAA;AAIG,IAAMuC,2BAA2B,CAAC,EAAEC,WAAU,MACnD,gBAAArB,OAAA,cAACsB,OAAAA;EACCb,WAAWC,GACT,8FACAW,UAAAA;;AAMN,IAAME,SAAS7C,qBAAK,CAAC,EAAEvB,MAAMC,QAAQC,MAAMmE,QAAQC,aAAaC,YAAW,MAAe;AACxF,QAAM,EAAE3C,EAAC,IAAKC,eAAeC,KAAKC,QAAQC,GAAG;AAC7C,QAAMwC,cAAcC,OAAiC,IAAA;AACrD,QAAM,CAACC,aAAaC,OAAAA,IAAWC,SAAsB,IAAA;AACrD,QAAMpC,kBAAkBC,kBAAkBzC,KAAKe,WAAW2B,OAAOd,CAAAA;AACjE,QAAMiD,MAAM7E,KAAKe,WAAW8D,OAAO;AAEnCC,kBAAgB,MAAA;AACd,QAAI,CAACN,YAAYvD,WAAW,CAACqD,aAAa;AACxC;IACF;AAEA,WAAOS,QACLC,UAAU;MACRC,SAAST,YAAYvD;MACrBiE,gBAAgB,OAAO;QAAE9C,IAAIpC,KAAKoC;QAAIjC,MAAM;MAAS;MACrDgF,uBAAuB,CAAC,EAAEC,oBAAoBC,QAAQC,SAAQ,MAAE;AAC9DC,iBAASC,KAAKC,aAAa,qBAAqB,MAAA;AAChD,cAAMR,UAAUI,OAAOJ,QAAQS,cAAc,cAAA;AAC7CC,iCAAyB;UAAEV;QAAQ,CAAA;AACnC,cAAM,EAAEW,GAAGC,EAAC,IAAKC,uBAAuB;UAAEb;UAASc,OAAOT,SAASrE,QAAQ8E;QAAM,CAAA,EAAG;UAClFC,WAAYf,QAAQgB,gBAAgBV,SAASC;QAC/C,CAAA;AACAJ,6BAAqBH,SAASW,GAAGC,CAAAA;MACnC;MACAK,aAAa,MAAA;AACXX,iBAASC,KAAKW,gBAAgB,mBAAA;AAC9B3B,oBAAYvD,QAASmF,QAAQ,wBAAA,GAA2BX,aAAa,wBAAwB,QAAA;MAC/F;MACAY,QAAQ,MAAA;AACN7B,oBAAYvD,QAASmF,QAAQ,wBAAA,GAA2BX,aAAa,wBAAwB,MAAA;MAC/F;IACF,CAAA,GACAa,sBAAsB;MACpBrB,SAAST,YAAYvD;MACrBsF,SAAS,CAAC,EAAER,OAAOd,QAAO,MAAE;AAC1B,eAAOuB,kBACL;UAAEpE,IAAIpC,KAAKoC;UAAIjC,MAAM;QAAS,GAC9B;UAAE4F;UAAOd;UAASwB,cAAc;YAAC;YAAO;;QAAU,CAAA;MAEtD;MACAC,aAAa,CAAC,EAAEC,MAAMtB,OAAM,MAAE;AAC5B,YAAIA,OAAOuB,KAAKzG,SAASwG,KAAKC,KAAKzG,MAAM;AACvCwE,kBAAQkC,mBAAmBF,KAAKC,IAAI,CAAA;QACtC;MACF;MACAE,QAAQ,CAAC,EAAEH,MAAMtB,OAAM,MAAE;AACvB,YAAIA,OAAOuB,KAAKzG,SAASwG,KAAKC,KAAKzG,MAAM;AACvCwE,kBAAQkC,mBAAmBF,KAAKC,IAAI,CAAA;QACtC;MACF;MACAG,aAAa,MAAMpC,QAAQ,IAAA;MAC3B0B,QAAQ,CAAC,EAAEM,MAAMtB,OAAM,MAAE;AACvBV,gBAAQ,IAAA;AACR,YAAIU,OAAOuB,KAAKzG,SAASwG,KAAKC,KAAKzG,MAAM;AACvCmE,sBAAYe,OAAOuB,MAAoBD,KAAKC,MAAoBC,mBAAmBF,KAAKC,IAAI,CAAA;QAC9F;MACF;IACF,CAAA,CAAA;EAEJ,GAAG;IAAC5G;IAAMsE;GAAY;AAEtB,QAAM0C,mBAAmBnG,YAAY,MAAM0D,cAAc;IAAEvE;EAAK,CAAA,GAAI;IAACA;IAAMuE;GAAY;AAEvF,SACE,gBAAA1B,OAAA,cAACvB,YAAAA;IAAW0C,KAAKQ;IAAaxE;IAAYC;IAAgBC;IAAYuB,cAAcuF;KAClF,gBAAAnE,OAAA,cAACsB,OAAAA;IACC8C,cAAY;IACX,GAAIpC,OAAO;MAAEqC,OAAO;QAAEC,YAAY,eAAetC,GAAAA;MAAe;IAAE;IACnEvB,WAAWC,GACT,+FACAc,SACI,8CACA,oEAAA;KAGN,gBAAAxB,OAAA,cAACuE,YAAAA;IAAWpH;OAEd,gBAAA6C,OAAA,cAACoB,0BAAAA,IAAAA,GACD,gBAAApB,OAAA,cAACwE,QAAAA;IAAKjF,IAAI,GAAGpC,KAAKoC,EAAE;IAAWkB,WAAU;KACtCd,eAAAA,GAEFkC,eAAe,gBAAA7B,OAAA,cAACyE,eAAAA;IAAcC,MAAM7C;;AAG3C,CAAA;AAEA,IAAM0C,aAAa,CAAC,EAAEpH,KAAI,MAA6B;AACrD,QAAM,EAAE4B,EAAC,IAAKC,eAAeC,KAAKC,QAAQC,GAAG;AAG7C,MAAIhC,KAAKe,WAAWyG,MAAM;AACxB,UAAM3C,MAAM7E,KAAKe,WAAW8D,OAAO;AACnC,UAAM4C,aAAa5C,OAAO;MAAEqC,OAAO;QAAEQ,OAAO,eAAe7C,GAAAA;MAAU;IAAE;AACvE,WAAO,gBAAAhC,OAAA,cAAC8E,MAAAA;MAAKH,MAAMxH,KAAKe,WAAWyG;MAAMI,MAAM;MAAI,GAAGH;;EACxD;AAEA,QAAMtH,OAAOwC,WAAW3C,IAAAA;AACxB,MAAIG,SAAS,SAASH,KAAKe,WAAW8G,gBAAgB,WAAW;AAC/D,UAAMhD,MAAM7E,KAAKe,WAAW8D,OAAO;AACnC,UAAMrC,kBAAkBC,kBAAkBzC,KAAKe,WAAW2B,OAAOd,CAAAA;AACjE,WAAO,gBAAAiB,OAAA,cAACiF,UAAAA;MAASjD;MAAUkD,YAAW;MAAUC,SAAQ;MAASJ,MAAM;MAAIK,UAAUzF;;EACvF;AAEA,SAAO;AACT;AAgBO,IAAM0F,SAAS,CAAC,EACrBC,aACAC,eACAC,aACAC,iBACArI,QACAC,MACAqE,YAAW,MACC;AACZ,QAAM,EAAE3C,EAAC,IAAKC,eAAeC,KAAKC,QAAQC,GAAG;AAC7C,QAAMrB,YAAYC,gBAAAA;AAClB,QAAM2H,eAAe1H,YACnB,CAAC2H,QAAqBC,WAAAA;AACpB,SAAK9H,UAAU6H,QAAQC,MAAAA;EACzB,GACA;IAAC9H;GAAU;AAGb,QAAM+H,kBAAkB7H,YACtB,CAACwE,QAAQsD,QAAQjE,gBAAAA;AACf,UAAMkE,aAAaR,cAAcS,KAAK,CAACC,MAAMA,EAAE1G,OAAOiD,OAAOjD,EAAE;AAC/D,QAAI,CAACwG,YAAY7H,WAAWuD,aAAa;AACvC;IACF;AAEA,UAAMyE,cAAcX,cAAcY,UAAU,CAACF,MAAMA,EAAE1G,OAAOiD,OAAOjD,EAAE;AACrE,UAAM6G,cAAcb,cAAcY,UAAU,CAACF,MAAMA,EAAE1G,OAAOuG,OAAOvG,EAAE;AACrE,UAAM8G,cACJ7D,OAAOjD,OAAOuG,OAAOvG,KACjB2G,cACAE,eACCF,cAAcE,cAAevE,gBAAgB,QAAQ,KAAK,IAAKA,gBAAgB,WAAW,IAAI;AACrG,UAAMyE,YAAYC,UAAU;SAAIhB;OAAgBW,aAAaG,WAAAA;AAC7D,WAAON,WAAW7H,WAAWuD,YAAY6E,UAAUE,IAAI,CAACrJ,SAASA,KAAK4G,IAAI,CAAA;EAC5E,GACA;IAACwB;GAAc;AAIjB,QAAMkB,wBAAwBlB,cAAcmB,KAAK,CAACvJ,SAASA,KAAKe,WAAWuD,WAAW;AAEtF,SACE,gBAAAzB,OAAA,cAACO,KAAKoG,SAAO;IACXC,0BAAAA;IACAvF,YAAY;MACV;MACA;MACA;MACA;MACA;;KAIF,gBAAArB,OAAA,cAAC6G,KAAKC,MAAI;IAACC,UAAUrB;KACnB,gBAAA1F,OAAA,cAAC6G,KAAK3G,SAAO;IAACC,SAAAA;IAAQY,eAAY;KAChC,gBAAAf,OAAA,cAACsB,OAAAA;IAAIb,WAAU;KACb,gBAAAT,OAAA,cAACgH,YAAAA;IACCC,SAAQ;IACR9B,SAAQ;IACRJ,MAAM;IACNJ,MAAK;IACLuC,UAAAA;IACAC,QAAAA;IACAtH,OAAOd,EAAE,gBAAA;QAIf,gBAAAiB,OAAA,cAAC6G,KAAKO,SAAO;IAACC,OAAOjK;IAAQkK,OAAOhC;OAItC,gBAAAtF,OAAA,cAACuH,WAAWT,MAAI;IAACU,UAAAA;IAASC,MAAAA;IAAKC,aAAY;KACzC,gBAAA1H,OAAA,cAACuH,WAAWI,UAAQ;IAACtG,YAAW;KAC7BkE,cAAciB,IAAI,CAACrJ,SAClB,gBAAA6C,OAAA,cAACuB,QAAAA;IACCpC,KAAKhC,KAAKoC;IACVpC;IACAC;IACAC;IACAqE;IACC,GAAI+E,yBAAyB;MAAEhF,aAAaoE;IAAgB;SAOrE,gBAAA7F,OAAA,cAACsB,OAAAA;IAAIb,WAAU;KACZ+E,YAAYgB,IAAI,CAACrJ,SAChB,gBAAA6C,OAAA,cAACuB,QAAAA;IAAOpC,KAAKhC,KAAKoC;IAAIpC;IAAYC;IAAgBC;IAAYmE,QAAAA;QAIjEiE,mBACC,gBAAAzF,OAAA,cAACsB,OAAAA;IAAIb,WAAU;KACb,gBAAAT,OAAA,cAACvB,YAAAA;IAAWU,KAAKsG,gBAAgBlG;IAAIpC,MAAMsI;IAAiBrI;IAAgBC;KAC1E,gBAAA2C,OAAA,cAAC4H,mBAAAA;IACCC,QAAQpC,gBAAgBvH,WAAW2J;IACnC7F,KAAKyD,gBAAgBvH,WAAW8D;IAChC8F,OAAOrC,gBAAgBvH,WAAW4J;IAClCC,QAAQtC,gBAAgBvH,WAAW6J;IACnChD,MAAM;;AAOpB;;;AEhYA,YAAYiD,YAAY;AACxB,OAAOC,UAASC,QAAAA,OAAMC,eAAAA,cAAaC,WAAAA,gBAAe;AAGlD,SAASC,aAAa;AACtB,SAASC,mBAAmB;AAC5B,SAASC,OAAOC,mBAAAA,kBAAiBC,gBAAgB;AACjD,SAASC,iBAAiBC,cAAAA,aAAYC,cAAAA,aAAYC,qBAAAA,oBAAmBC,kBAAAA,uBAAsB;AAC3F,SAASC,YAAY;AACrB,SAASC,QAAAA,aAA2B;AACpC,SAASC,QAAAA,aAAY;AACrB,SAASC,wBAAAA,uBAAsBC,4BAAAA,iCAAgC;AAE/D,SAASC,kBAAAA,iBAAgBC,cAAAA,aAAYC,0BAA0B;AAC/D,SAASC,QAAAA,aAAY;;;ACdrB,OAAOC,UAASC,UAAUC,QAAAA,OAAMC,WAAAA,gBAAe;AAE/C,SAASC,SAASC,qBAAAA,oBAAmBC,kBAAAA,uBAAsB;AAC3D,SAASC,gBAAgB;AAEzB,SAASC,gBAAgBC,kBAAkB;AAC3C,SAASC,QAAAA,aAAY;;;ACNrB,OAAOC,UAASC,eAAAA,oBAAmB;AAGnC,SAASC,mBAAAA,wBAAuB;AAChC,SAASC,cAAAA,aAAYC,qBAAAA,oBAAmBC,mBAAmBC,kBAAAA,uBAAsB;AACjF,SAASC,YAAYC,uBAAuB;AAC5C,SAASC,QAAAA,aAA2B;AACpC,SAASC,sBAAsBC,gCAAgC;AAE/D,SAASC,QAAAA,aAAY;AAGrB,IAAMC,eAAe;AAErB,IAAMC,sBAAsB;EAC1BC,MAAM;EACNC,SAAS;AACX;AAEA,IAAMC,sBAAsB;EAC1BF,MAAM;EACNC,SAAS;AACX;AAUO,IAAME,gCAAgCX,WAC3C,CAAC,EAAEY,QAAQC,MAAMC,OAAOC,MAAMC,QAAQC,aAAaC,QAAQ,GAAGC,MAAAA,GAASC,iBAAAA;AACrE,QAAM,EAAEC,EAAC,IAAKtB,gBAAeM,MAAKiB,QAAQC,GAAG;AAC7C,QAAMd,UAAUX,kBAAAA;AAChB,QAAM0B,YAAY7B,iBAAAA;AAClB,QAAM8B,eAAe/B,aACnB,CAACgC,QAAqBC,SAA2B,CAAC,MAAMH,UAAUE,QAAQ;IAAE,GAAGC;IAAQd;EAAK,CAAA,GAC5F;IAACW;IAAWX;GAAK;AAGnB,SACE,gBAAApB,OAAA,cAACS,MAAK0B,MAAI;IAACV;IAAgBW,UAAUJ;KACnC,gBAAAhC,OAAA,cAACS,MAAK4B,SAAO;IAACC,SAAAA;KACZ,gBAAAtC,OAAA,cAACG,aAAAA;IACE,GAAIa,YAAY,OAAOC,sBAAsBH;IAC7C,GAAGN,gBAAgBkB,KAAAA;IACpBa,YAAY;MAAC;MAAmC7B;MAAsBC;;IACtE6B,SAAQ;IACRlB,MAAMA,QAAQT;IACd4B,UAAAA;IACApB,OAAOjB,mBAAkBiB,OAAOO,CAAAA;IAChCc,eAAanB;IACboB,KAAKhB;OAGT,gBAAA3B,OAAA,cAACS,MAAKmC,SAAO;IAACC,OAAO1B;IAAQ2B,OAAOtB;;AAG1C,CAAA;AAGFN,8BAA8B6B,cAAc;AAErC,IAAMC,8BAA8B,CACzCtB,UAAAA;AAOA,QAAM,EACJP,QACAC,MACA6B,YAAY,EAAEC,UAAUzB,QAAQF,QAAQD,MAAMkB,UAAU,SAASC,WAAW,KAAI,IAAK;IAAEpB,OAAO;EAAQ,GACtG8B,UAAS,IACPzB;AACJ,QAAMV,UAAUX,kBAAAA;AAChB,QAAM0B,YAAY7B,iBAAAA;AAClB,SACE,gBAAAF,OAAA,cAACG,aAAAA;IACE,GAAIa,YAAY,OAAOC,sBAAsBH;IAC9C0B;IACAD,YAAY;MACV;MACA7B;MACAC;MACA8B,WAAW,2BAA2B;;IAExCnB,MAAMA,QAAQT;IACd4B;IACApB,OAAO8B;IACPD;IACAE,SAAS,CAACC,UAAAA;AACRA,YAAMC,gBAAe;AACrB,UAAIJ,UAAU;AACZ;MACF;AAEA,WAAKnB,UAAUL,OAAOD,SAAS;QAAEN;QAAQM;QAAQL;MAAK,IAAI;QAAED;QAAQC;MAAK,CAAA;IAC3E;IACAsB,eAAanB;;AAGnB;;;AD7FO,IAAMgC,qBAAqBC,gBAAAA,MAAK,CAAC,EAAEC,MAAMC,MAAMC,KAAI,MAA2B;AACnF,QAAM,EAAEC,EAAC,IAAKC,gBAAeC,MAAKC,QAAQC,GAAG;AAC7C,QAAM,EAAEC,eAAeC,SAASC,gBAAe,IAAKC,kBAAAA;AAEpD,QAAMC,QAAQZ,KAAKa,SAAS;AAC5B,QAAMC,mBAAmBC,WAAWd,IAAAA;AACpC,QAAMe,aAAaC,SAAQ,MAAMC,eAAeJ,gBAAAA,GAAmB;IAACA;GAAiB;AAErF,QAAMK,WAAWT,oBAAoB,GAAGU,aAAAA,IAAiBnB,KAAKoB,EAAE;AAChE,QAAMC,aAAaH,WAAWI,QAAQC,SAASC;AAE/C;;IAEE,gBAAAC,OAAA,cAACC,OAAAA;MAAIC,WAAU;MAA2B,GAAIT,YAAY;QAAE,uBAAuB;MAAG;OACpF,gBAAAO,OAAA,cAACJ,YAAAA,MACEN,WAAWH,WAAW,IACrB,gBAAAa,OAAA,cAACG,SAASC,MAAI;MAACC,YAAW;OACxB,gBAAAL,OAAA,cAACM,6BAAAA;MACCC,WAAWC,mBAAkBlB,WAAW,CAAA,EAAGmB,YAAYC,OAAOjC,CAAAA;MAC9DkC,QAAQpC;MACRD;MACC,GAAGgB,WAAW,CAAA;UAGjBA,WAAWH,SAAS,IACtB,gBAAAa,OAAA,cAACG,SAASC,MAAI;MAACC,YAAW;OACxB,gBAAAL,OAAA,cAACY,+BAAAA;MACCC,QAAQ,gCAAgC3B,KAAAA;MACxCwB,OAAOjC,EAAE,yBAAA;MACTqC,MAAK;MACLH,QAAQpC;MACRD;MACAyC,aAAazB;MACb0B,QAAQtB;UAIZ,gBAAAM,OAAA,cAACG,SAASC,MAAI,IAAA,CAAA,GAGjBrB,WACC,gBAAAiB,OAAA,cAACG,SAASC,MAAI;MAACC,YAAW;OACxB,gBAAAL,OAAA,cAACjB,SAAAA;MAAQkC,MAAM1C;MAAMC;;;AAK/B,CAAA;;;AD7BA,IAAM0C,WAAW,CAAC,EAAEC,MAAMC,MAAMC,MAAMC,WAAWC,OAAM,MAAgB;AACrE,QAAM,EAAEC,EAAC,IAAKC,gBAAeC,MAAKC,QAAQC,GAAG;AAC7C,QAAMC,QAAQC,mBAAkBT,KAAKU,WAAWC,OAAOR,CAAAA;AACvD,QAAMS,cAAcC,wBAAwBb,IAAAA;AAC5C,QAAMc,sBAAsBb,aAAaW;AAEzC,SACE,gBAAAG,OAAA,cAACC,MAAKC,OAAK;IACTV,KAAKP,KAAKkB;IACVC,OAAOnB,KAAKkB;IACZE,YAAY;MACV;MACA;MACA;MACAnB,aAAa;;IAEfoB,UAAU;IACVC,cAAYd;IACX,GAAIP,aAAa;MAAE,eAAe;IAA4B;IAC9D,GAAI,CAACH,QAAQ;MAAEyB,OAAO;IAAK;KAE3BT,uBAAuB,gBAAAC,OAAA,cAACS,gBAAAA;IAAe1B;IAAYC;IAAYC;IAAYE;;AAGlF;AAGA,IAAMW,0BAA0B,CAACb,SAAAA;AAC/B,QAAM,EAAEyB,MAAK,IAAKC,YAAAA;AAClB,QAAMC,QAAQC,SAASH,OAAOzB,KAAKkB,EAAE;AAErC,SAAOW,SAAQ,MAAA;AACb,UAAMC,WAAWH,MAAMI,MAAMC,YAAY,OAAA,CAAA,KAAa,CAAA;AACtD,WAAOF,SAASG,KAAK,CAACC,YAAAA;AACpB,YAAMC,QAAQJ,MAAMK,QAAQX,OAAOS,OAAAA;AACnC,UAAWG,cAAOF,KAAAA,GAAQ;AACxB,eAAO;MACT;AACA,aAAOA,MAAMhB,MAAMT,WAAW4B,gBAAgBC;IAChD,CAAA;EACF,GAAG;IAACZ;IAAOF;GAAM;AACnB;AAKA,IAAMD,iBAAiB,CAAC,EAAEzB,MAAMC,MAAME,OAAM,MAA2D;AACrG,QAAMsC,iBAAiBC,kBAAAA;AAEvB,SACE,gBAAA1B,OAAA,cAAC2B,iBAAAA;IAAgBC,SAAQ;KACvB,gBAAA5B,OAAA,cAAC6B,eAAAA;IAAc7C;IAAYC;IAAYE;MACvC,gBAAAa,OAAA,cAAC8B,YAAWC,MAAI;IAACC,MAAAA;IAAKC,aAAY;KAChC,gBAAAjC,OAAA,cAAC8B,YAAWI,UAAQ,MAClB,gBAAAlC,OAAA,cAACmC,MAAAA;IACC9B,YAAW;IACX+B,OAAOX,eAAeW;IACtBjC,IAAIlB,KAAKkB;IACTkC,QAAQpD,KAAKkB;IACbnB;IACAsD,aAAa;IACbC,WAAAA;IACAC,qBAAoB;IACpBC,eAAeC;IACfC,kBAAkBlB,eAAekB;IACjCC,SAASnB,eAAemB;IACxBC,WAAWpB,eAAeoB;IAC1BC,cAAcrB,eAAeqB;IAC7BC,UAAUtB,eAAesB;IACzBC,aAAavB,eAAeuB;;AAMxC;AAKA,IAAMnB,gBAAgB,CAAC,EAAE5C,MAAMD,MAAMG,OAAM,MAAkD;AAC3F,QAAM,EAAEC,EAAC,IAAKC,gBAAeC,MAAKC,QAAQC,GAAG;AAC7C,QAAM,EAAEyD,eAAeC,QAAO,IAAKxB,kBAAAA;AACnC,QAAMjC,QAAQC,mBAAkBT,KAAKU,WAAWC,OAAOR,CAAAA;AACvD,QAAM+D,uBAAuBC,MAAMC,kBAAkBpE,KAAKkB,EAAE;AAE5D,QAAM,EAAEmD,aAAaC,SAAQ,IAAKC,iBAAiB;IAAEvE;IAAMD;EAAK,CAAA;AAChEyE,qBAAmBxE,IAAAA;AAEnB,SACE,gBAAAe,OAAA,cAAC0D,OAAAA;IACCC,0BAAAA;IACAC,WAAU;KAETT,uBACC,gBAAAnD,OAAA,cAAC6D,aAAAA;IACCxD,YAAY;MAACyD;MAAsBC;;IACnCC,SAAQ;IACRC,MAAK;IACLC,UAAAA;IACAC,MAAM;IACNvE,OAAOR,EAAE,oBAAA;IACTgF,eAAY;IACZC,SAAS,MAAMlF,SAAAA;OAGjB,gBAAAa,OAAA,cAAC0D,OAAAA,IAAAA,GAEH,gBAAA1D,OAAA,cAACsE,MAAAA;IAAGX,0BAAAA;IAAuBC,WAAU;KAClCnE,KAAAA,GAEH,gBAAAO,OAAA,cAAC0D,OAAAA;IAAIE,WAAU;KACb,gBAAA5D,OAAA,cAACuE,aAAAA;IAAYtF;IAAYqE;IAA0BC;MAClDL,WAAW,gBAAAlD,OAAA,cAACkD,SAAAA;IAAQsB,MAAMvF;IAAMF,MAAAA;;AAIzC;AAYA,IAAMwF,cAAc,CAAC,EACnBtF,MACAqE,aACAC,SAAQ,MAGyC;AACjD,QAAM,EAAEnE,EAAC,IAAKC,gBAAeC,MAAKC,QAAQC,GAAG;AAE7C,MAAI8D,YAAYmB,WAAW,GAAG;AAC5B,WAAO;EACT;AAEA,MAAInB,YAAYmB,WAAW,GAAG;AAC5B,WACE,gBAAAzE,OAAA,cAAC6D,aAAAA;MACCxD,YAAY;QAAC;QAAmCyD;QAAsBC;;MACtEC,SAAQ;MACRC,MAAMX,YAAY,CAAA,EAAG3D,YAAYsE,QAAQ;MACzCC,UAAAA;MACAC,MAAM;MACNvE,OAAOF,mBAAkB4D,YAAY,CAAA,EAAG3D,YAAYC,OAAOR,CAAAA;MAC3DgF,eAAad,YAAY,CAAA,EAAG3D,YAAY+E;MACxCL,SAAS,MAAMd,SAASD,YAAY,CAAA,CAAE;;EAG5C;AAEA,SACE,gBAAAtD,OAAA,cAAC2E,MAAK5C,MAAI;IAAC6C,QAAQC;IAAetB;KAChC,gBAAAvD,OAAA,cAAC2E,MAAKG,SAAO;IAACC,SAAAA;KACZ,gBAAA/E,OAAA,cAAC6D,aAAAA;IACCxD,YAAY;MAAC;MAAmCyD;MAAsBC;;IACtEC,SAAQ;IACRC,MAAK;IACLC,UAAAA;IACAC,MAAM;IACNvE,OAAOR,EAAE,yBAAA;IACTgF,eAAY;OAGhB,gBAAApE,OAAA,cAAC2E,MAAKK,SAAO;IAACC,OAAOhG;IAAMiG,OAAO5B;;AAGxC;AAKA,IAAME,mBAAmB,CAAC,EAAEvE,MAAMD,KAAI,MAAuC;AAC3E,QAAMmG,YAAYC,iBAAAA;AAElB,QAAM9B,cAAc+B,gBAAeC,YAAWrG,IAAAA,CAAAA;AAE9C,QAAMsE,WAAWgC,aACf,CAACC,QAAqBC,WAAAA;AACpB,SAAKN,UAAUK,QAAQ;MAAE,GAAGC;MAAQzG;IAAK,CAAA;EAC3C,GACA;IAACmG;IAAWnG;GAAK;AAGnB,SAAO;IAAEsE;IAAaC;EAAS;AACjC;AAEO,IAAMmC,UAAUC,gBAAAA,MAAK7G,QAAAA;;;AGhO5B,OAAO8G,YAAW;AAgBX,IAAMC,SAAS,CAAC,EAAEC,eAAeC,eAAeC,QAAQC,MAAMC,KAAI,MAAe;AACtF,SACE,gBAAAC,OAAA,cAAAA,OAAA,UAAA,MACGL,cAAcM,IAAI,CAACC,SAAAA;AAClB,UAAMC,OAAOC,WAAWF,IAAAA;AACxB,QAAIC,SAAS,OAAO;AAClB,aACE,gBAAAH,OAAA,cAACK,SAAAA;QACCC,KAAKJ,KAAKK;QACVL;QACAH;QACAD;QACAD;QACAW,WAAWN,KAAKK,OAAOX;;IAG7B;AACA,WAAO;EACT,CAAA,CAAA;AAGN;;;APxBO,IAAMa,gBAAgB;AAKtB,IAAMC,UAAUC,gBAAAA,YAAyC,CAAC,EAAEC,IAAIC,MAAMC,KAAK,GAAGC,MAAAA,GAASC,iBAAAA;AAC5F,QAAM,EAAEC,QAAQC,YAAW,IAAKC,kBAAAA;AAChC,QAAM,EAAEC,iBAAiBC,SAASC,aAAaC,iBAAiBC,cAAa,IAAKC,oBAAoBZ,IAAAA;AAEtGa,EAAAA,oBAAmBb,IAAAA;AACnB,QAAMc,OAAOC,SAAQ,MAAM;IAAChB;KAAK;IAACA;GAAG;AAErC;;;;;IAKE,gBAAAiB,OAAA,cAACC,MAAKC,MAAI;MAACC,OAAOlB;MAAKmB,aAAY;MAAWC,YAAW;MAAWC,KAAKnB;OACvE,gBAAAa,OAAA,cAACO,QAAAA;MACCC,aAAajB;MACbI,eAAeH;MACfC;MACAC;MACAI;MACAW,QAAQzB;MACRK;QAEF,gBAAAW,OAAA,cAACU,QAAAA;MAAOf;MAA8BG;MAAYa,eAAe1B;MAAKG;MAAiB,GAAGF;;;AAGhG,CAAA;AAKA,IAAMU,sBAAsB,CAACZ,SAAAA;AAC3B,QAAM,EAAE4B,MAAK,IAAKC,aAAAA;AAClB,QAAMC,SAAS9B,MAAMD,MAAMgC,KAAKC;AAChC,QAAMC,oBAAoBC,eAAeN,OAAOE,QAAQ,OAAA;AACxD,QAAMK,cAAcC,gBAAgBR,OAAOE,MAAAA;AAE3C,QAAM,EAAEvB,iBAAiBC,SAASC,aAAaC,gBAAe,IAAKK,SAAQ,MAAA;AACzE,UAAMsB,qBAAkC,CAAA;AACxC,UAAMC,sBAAmC,CAAA;AACzC,QAAI5B;AACJ,eAAW6B,QAAQN,mBAAmB;AACpC,cAAQM,KAAKC,WAAWC,aAAW;QACjC,KAAK;AACHJ,6BAAmBK,KAAKH,IAAAA;AACxB;QACF,KAAK;AACHD,8BAAoBI,KAAKH,IAAAA;AACzB;QACF,KAAK;AACH7B,UAAAA,qBAAoB6B;AACpB;MACJ;IACF;AAEA,UAAMhC,mBAAkB4B,YACrBQ,OAAO,CAACC,WAAWA,OAAOJ,WAAWC,gBAAgB,MAAA,EACrDI,SAAS,CAACC,GAAGC,MAAMC,SAASC,QAAQH,EAAEN,YAAYO,EAAEP,UAAU,CAAA;AACjE,UAAM/B,eAAc;SACf6B;SACAH,YAAYQ,OAAO,CAACC,WAAWA,OAAOJ,WAAWC,gBAAgB,SAAA;MACpEI,SAAS,CAACC,GAAGC,MAAMC,SAASC,QAAQH,EAAEN,YAAYO,EAAEP,UAAU,CAAA;AAEhE,WAAO;MACL/B,aAAAA;MACAF,iBAAAA;MACAG,iBAAAA;MACAF,SAAS6B;IACX;EACF,GAAG;IAACF;IAAaF;GAAkB;AAEnC,QAAMtB,gBAAgBI,SACpB,MAAM;OAAIP;OAAYC;OAAiBC,kBAAkB;MAACA;QAAmB,CAAA;KAC7E;IAACF;IAASC;IAAaC;GAAgB;AAGzC,SAAO;IAAEH;IAAiBC;IAASC;IAAaC;IAAiBC;EAAc;AACjF;",
|
|
6
|
+
"names": ["React", "forwardRef", "useMemo", "useAppGraph", "Node", "useConnections", "useActions", "useGraphActions", "Tabs", "Position", "useLoadDescendents", "createContext", "useContext", "raise", "NavTreeContext", "useNavTreeContext", "Error", "attachClosestEdge", "extractClosestEdge", "combine", "draggable", "dropTargetForElements", "preserveOffsetOnSource", "scrollJustEnoughIntoView", "useAtomValue", "React", "forwardRef", "memo", "useCallback", "useLayoutEffect", "useMemo", "useRef", "useState", "DxAvatar", "useActionRunner", "Icon", "IconButton", "ScrollArea", "Tooltip", "toLocalizedString", "useMediaQuery", "useTranslation", "DropIndicator", "Menu", "Tabs", "mx", "arrayMove", "useNavTreeState", "meta", "React", "Avatar", "hexToFallback", "UserAccountAvatar", "size", "userId", "hue", "emoji", "status", "fallbackValue", "hexToFallback", "L0ItemActiveTabIndicator", "classNames", "div", "className", "data-joyride", "Avatar", "Root", "Content", "variant", "fallback", "data-testid", "useL0ItemClick", "item", "parent", "path", "type", "onSelect", "onTabChange", "useNavTreeContext", "getItem", "useNavTreeState", "isLg", "useMediaQuery", "runAction", "useActionRunner", "useCallback", "event", "properties", "caller", "current", "option", "altKey", "l0Breakpoints", "lg", "L0ItemRoot", "memo", "forwardRef", "onMouseEnter", "children", "forwardedRef", "t", "useTranslation", "meta", "profile", "key", "model", "itemPath", "useMemo", "id", "testId", "useAtomValue", "itemProps", "localizedString", "toLocalizedString", "label", "l0ItemType", "handleClick", "React", "Tooltip", "Trigger", "asChild", "delayDuration", "side", "content", "Tabs", "TabPrimitive", "className", "mx", "l0Breakpoint", "tabIndex", "undefined", "data-type", "data-testid", "data-object-id", "value", "onClick", "ref", "L0ItemActiveTabIndicator", "classNames", "div", "L0Item", "pinned", "onRearrange", "onItemHover", "itemElement", "useRef", "closestEdge", "setEdge", "useState", "hue", "useLayoutEffect", "combine", "draggable", "element", "getInitialData", "onGenerateDragPreview", "nativeSetDragImage", "source", "location", "document", "body", "setAttribute", "querySelector", "scrollJustEnoughIntoView", "x", "y", "preserveOffsetOnSource", "input", "container", "offsetParent", "onDragStart", "removeAttribute", "closest", "onDrop", "dropTargetForElements", "getData", "attachClosestEdge", "allowedEdges", "onDragEnter", "self", "data", "extractClosestEdge", "onDrag", "onDragLeave", "handleMouseEnter", "data-frame", "style", "background", "ItemAvatar", "span", "DropIndicator", "edge", "icon", "hueFgStyle", "color", "Icon", "size", "disposition", "DxAvatar", "hueVariant", "variant", "fallback", "L0Menu", "menuActions", "topLevelItems", "pinnedItems", "userAccountItem", "handleAction", "action", "params", "handleRearrange", "target", "sourceItem", "find", "i", "sourceIndex", "findIndex", "targetIndex", "insertIndex", "nextOrder", "arrayMove", "map", "hasRearrangeableItems", "some", "Tablist", "data-tauri-drag-region", "Menu", "Root", "onAction", "IconButton", "density", "iconOnly", "square", "Content", "group", "items", "ScrollArea", "centered", "thin", "orientation", "Viewport", "UserAccountAvatar", "userId", "emoji", "status", "Option", "React", "memo", "useCallback", "useMemo", "Paths", "useAppGraph", "Graph", "useActionRunner", "useEdges", "DensityProvider", "IconButton", "ScrollArea", "toLocalizedString", "useTranslation", "Tree", "Menu", "Tabs", "hoverableControlItem", "hoverableOpenControlItem", "getListActions", "useActions", "useLoadDescendents", "meta", "React", "Fragment", "memo", "useMemo", "Popover", "toLocalizedString", "useTranslation", "Treegrid", "getListActions", "useActions", "meta", "React", "useCallback", "useActionRunner", "IconButton", "toLocalizedString", "useDensityContext", "useTranslation", "composable", "composableProps", "Menu", "hoverableControlItem", "hoverableOpenControlItem", "meta", "fallbackIcon", "mdActionButtonProps", "size", "density", "lgActionButtonProps", "NavTreeItemActionDropdownMenu", "parent", "path", "label", "icon", "testId", "menuActions", "caller", "props", "forwardedRef", "t", "profile", "key", "runAction", "handleAction", "action", "params", "Root", "onAction", "Trigger", "asChild", "classNames", "variant", "iconOnly", "data-testid", "ref", "Content", "group", "items", "displayName", "NavTreeItemMonolithicAction", "properties", "disabled", "baseLabel", "onClick", "event", "stopPropagation", "NavTreeItemColumns", "memo", "path", "item", "open", "t", "useTranslation", "meta", "profile", "key", "renderItemEnd", "ItemEnd", "popoverAnchorId", "useNavTreeContext", "level", "length", "flattenedActions", "useActions", "allActions", "useMemo", "getListActions", "anchored", "NAV_TREE_ITEM", "id", "ActionRoot", "Popover", "Anchor", "Fragment", "React", "div", "className", "Treegrid", "Cell", "classNames", "NavTreeItemMonolithicAction", "baseLabel", "toLocalizedString", "properties", "label", "parent", "NavTreeItemActionDropdownMenu", "testId", "icon", "menuActions", "caller", "node", "L1Panel$", "open", "path", "item", "isCurrent", "onBack", "t", "useTranslation", "meta", "profile", "key", "title", "toLocalizedString", "properties", "label", "isActivated", "useIsActivatedWorkspace", "shouldRenderContent", "React", "Tabs", "Panel", "id", "value", "classNames", "tabIndex", "aria-label", "inert", "L1PanelContent", "graph", "useAppGraph", "edges", "useEdges", "useMemo", "childIds", "Graph", "relationKey", "some", "childId", "child", "getNode", "isNone", "disposition", "undefined", "navTreeContext", "useNavTreeContext", "DensityProvider", "density", "L1PanelHeader", "ScrollArea", "Root", "thin", "orientation", "Viewport", "Tree", "model", "rootId", "levelOffset", "draggable", "gridTemplateColumns", "renderColumns", "NavTreeItemColumns", "blockInstruction", "canDrop", "canSelect", "onOpenChange", "onSelect", "onItemHover", "renderItemEnd", "ItemEnd", "backCapableWorkspace", "Paths", "isPinnedWorkspace", "menuActions", "onAction", "useL1MenuActions", "useLoadDescendents", "div", "data-tauri-drag-region", "className", "IconButton", "hoverableControlItem", "hoverableOpenControlItem", "variant", "icon", "iconOnly", "size", "data-testid", "onClick", "h2", "MenuActions", "node", "length", "testId", "Menu", "caller", "NAV_TREE_ITEM", "Trigger", "asChild", "Content", "group", "items", "runAction", "useActionRunner", "getListActions", "useActions", "useCallback", "action", "params", "L1Panel", "memo", "React", "L1Tabs", "topLevelItems", "currentItemId", "onBack", "open", "path", "React", "map", "item", "type", "l0ItemType", "L1Panel", "key", "id", "isCurrent", "NAV_TREE_ITEM", "NavTree", "forwardRef", "id", "root", "tab", "props", "forwardedRef", "onBack", "onItemHover", "useNavTreeContext", "topLevelActions", "l0Items", "pinnedItems", "userAccountItem", "topLevelItems", "useTopLevelNavItems", "useLoadDescendents", "path", "useMemo", "React", "Tabs", "Root", "value", "orientation", "classNames", "ref", "L0Menu", "menuActions", "parent", "L1Tabs", "currentItemId", "graph", "useAppGraph", "rootId", "Node", "RootId", "rootOutboundItems", "useConnections", "rootActions", "useGraphActions", "topLevelWorkspaces", "outboundPinnedItems", "node", "properties", "disposition", "push", "filter", "action", "toSorted", "a", "b", "Position", "compare"]
|
|
7
7
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
NODE_TYPE
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-4RN6TH36.mjs";
|
|
4
4
|
import "../chunk-JOSNCOV4.mjs";
|
|
5
5
|
import "../chunk-J5LGTIGS.mjs";
|
|
6
6
|
|
|
@@ -8,7 +8,7 @@ import "../chunk-J5LGTIGS.mjs";
|
|
|
8
8
|
import { lazy } from "react";
|
|
9
9
|
var CommandsDialogContent = lazy(() => import("../CommandsDialogContent-TEKBCQ3U.mjs"));
|
|
10
10
|
var CommandsTrigger = lazy(() => import("../CommandsTrigger-HGCI22SP.mjs"));
|
|
11
|
-
var NavTreeContainer = lazy(() => import("../NavTreeContainer-
|
|
11
|
+
var NavTreeContainer = lazy(() => import("../NavTreeContainer-ICDKC2GI.mjs"));
|
|
12
12
|
var NavTreeDocumentTitle = lazy(() => import("../NavTreeDocumentTitle-RMERXZGK.mjs"));
|
|
13
13
|
export {
|
|
14
14
|
CommandsDialogContent,
|
|
@@ -102,12 +102,15 @@ var createItemPropsFamily = (graph) => Atom.family((pathKey) => {
|
|
|
102
102
|
const parentId = path.length >= 2 ? path[path.length - 2] : void 0;
|
|
103
103
|
const parentNode = parentId ? Option.getOrElse(get(graph.node(parentId)), () => void 0) : void 0;
|
|
104
104
|
const droppable = node.properties.droppable === false || parentNode?.properties.childrenDroppable === false ? false : void 0;
|
|
105
|
+
const disposition = node.properties.disposition;
|
|
106
|
+
const isGroup = disposition === "group";
|
|
105
107
|
return {
|
|
106
108
|
id: node.id,
|
|
107
|
-
parentOf,
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
109
|
+
parentOf: isGroup ? void 0 : parentOf,
|
|
110
|
+
disposition,
|
|
111
|
+
disabled: isGroup || node.properties.disabled,
|
|
112
|
+
draggable: isGroup ? false : node.properties.draggable,
|
|
113
|
+
droppable: isGroup ? false : droppable,
|
|
111
114
|
label: node.properties.label ?? node.id,
|
|
112
115
|
className: mx(node.properties.className, node.properties.modified && "italic"),
|
|
113
116
|
headingClassName: node.properties.headingClassName,
|