@dxos/plugin-navtree 0.8.4-main.21d9917 → 0.8.4-main.2244d791bb
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/{app-graph-builder-RSMA6I22.mjs → app-graph-builder-XGA4GPGL.mjs} +5 -4
- package/dist/lib/browser/app-graph-builder-XGA4GPGL.mjs.map +7 -0
- package/dist/lib/browser/{chunk-6YPQ625I.mjs → chunk-63YLDLLE.mjs} +178 -98
- package/dist/lib/browser/chunk-63YLDLLE.mjs.map +7 -0
- package/dist/lib/browser/{chunk-AGQDZBPL.mjs → chunk-X2HDG62A.mjs} +3 -3
- package/dist/lib/browser/{chunk-AGQDZBPL.mjs.map → chunk-X2HDG62A.mjs.map} +3 -3
- package/dist/lib/browser/index.mjs +31 -30
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{keyboard-32EH3N4K.mjs → keyboard-46XQHY2O.mjs} +6 -5
- package/dist/lib/browser/keyboard-46XQHY2O.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{operation-resolver-IB75DC5O.mjs → operation-resolver-NNNDII45.mjs} +8 -7
- package/dist/lib/browser/operation-resolver-NNNDII45.mjs.map +7 -0
- package/dist/lib/browser/{react-surface-F6CVMS3Y.mjs → react-surface-APSEG23H.mjs} +10 -9
- package/dist/lib/browser/react-surface-APSEG23H.mjs.map +7 -0
- package/dist/lib/browser/{state-EVYQOUI3.mjs → state-M5YUCIQU.mjs} +6 -5
- package/dist/lib/browser/state-M5YUCIQU.mjs.map +7 -0
- package/dist/types/src/NavTreePlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/keyboard/keyboard.d.ts.map +1 -1
- package/dist/types/src/capabilities/operation-resolver/index.d.ts +1 -1
- package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +2 -2
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface/index.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts +2 -2
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/state/state.d.ts.map +1 -1
- package/dist/types/src/components/CommandsDialog/CommandsDialog.d.ts.map +1 -1
- package/dist/types/src/components/NavTree/NavTree.stories.d.ts.map +1 -1
- package/dist/types/src/components/NavTreeContainer.d.ts.map +1 -1
- package/dist/types/src/components/Sidebar/L0Menu.d.ts.map +1 -1
- package/dist/types/src/components/Sidebar/L1Panel.d.ts +1 -1
- package/dist/types/src/components/Sidebar/L1Panel.d.ts.map +1 -1
- package/dist/types/src/experimental/Tree.stories.d.ts +18 -4
- package/dist/types/src/experimental/Tree.stories.d.ts.map +1 -1
- package/dist/types/src/types/events.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +42 -41
- package/src/NavTreePlugin.tsx +21 -23
- package/src/capabilities/app-graph-builder/app-graph-builder.ts +4 -3
- package/src/capabilities/keyboard/keyboard.ts +5 -4
- package/src/capabilities/operation-resolver/operation-resolver.ts +5 -4
- package/src/capabilities/react-surface/react-surface.tsx +7 -6
- package/src/capabilities/state/state.ts +4 -3
- package/src/components/CommandsDialog/CommandsDialog.tsx +43 -44
- package/src/components/CommandsDialog/CommandsTrigger.tsx +3 -3
- package/src/components/NavTree/NavTree.stories.tsx +9 -8
- package/src/components/NavTreeContainer.tsx +12 -11
- package/src/components/NavTreeItem/NavTreeItemAction.stories.tsx +1 -1
- package/src/components/Sidebar/L0Menu.tsx +2 -5
- package/src/components/Sidebar/L1Panel.tsx +146 -67
- package/src/components/UserAccountAvatar/UserAccountAvatar.stories.tsx +1 -1
- package/src/experimental/Tree.stories.tsx +43 -49
- package/src/hooks.ts +1 -1
- package/src/types/events.ts +3 -2
- package/dist/lib/browser/app-graph-builder-RSMA6I22.mjs.map +0 -7
- package/dist/lib/browser/chunk-6YPQ625I.mjs.map +0 -7
- package/dist/lib/browser/keyboard-32EH3N4K.mjs.map +0 -7
- package/dist/lib/browser/operation-resolver-IB75DC5O.mjs.map +0 -7
- package/dist/lib/browser/react-surface-F6CVMS3Y.mjs.map +0 -7
- package/dist/lib/browser/state-EVYQOUI3.mjs.map +0 -7
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/components/CommandsDialog/CommandsDialog.tsx", "../../../src/components/CommandsDialog/CommandsTrigger.tsx", "../../../src/util.ts", "../../../src/components/NavTreeContainer.tsx", "../../../src/hooks.ts", "../../../src/components/NavTree/NavTree.tsx", "../../../src/components/NavTreeContext.tsx", "../../../src/components/Sidebar/L0Menu.tsx", "../../../src/components/UserAccountAvatar/UserAccountAvatar.tsx", "../../../src/components/Sidebar/L1Panel.tsx", "../../../src/components/NavTreeItem/NavTreeItemAction.tsx", "../../../src/components/NavTreeItem/NavTreeItemColumns.tsx", "../../../src/components/Sidebar/L1Tabs.tsx", "../../../src/components/NavTreeDocumentTitle.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { forwardRef, useMemo, useState } from 'react';\n\nimport { Common } from '@dxos/app-framework';\nimport { useAppGraph, useOperationInvoker } from '@dxos/app-framework/react';\nimport { Keyboard, keySymbols } from '@dxos/keyboard';\nimport { Graph, Node, useActionRunner } from '@dxos/plugin-graph';\nimport { useActions } from '@dxos/plugin-graph';\nimport { Button, Dialog, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { SearchList, useSearchListResults } from '@dxos/react-ui-searchlist';\nimport { osTranslations } from '@dxos/ui-theme';\nimport { getHostPlatform } from '@dxos/util';\n\nimport { KEY_BINDING, meta } from '../../meta';\n\nexport type CommandsDialogContentProps = {\n selected?: string;\n};\n\n// TODO(wittjosiah): This probably deserves its own plugin but for now it lives here w/ other navigation UI.\nexport const CommandsDialogContent = forwardRef<HTMLDivElement, CommandsDialogContentProps>(\n ({ selected: initial }, forwardedRef) => {\n const { t } = useTranslation(meta.id);\n const { invokeSync } = useOperationInvoker();\n const runAction = useActionRunner();\n const { graph } = useAppGraph();\n const [selected, setSelected] = useState<string | undefined>(initial);\n\n // Traverse graph.\n // TODO(burdon): Factor out commonality with shortcut dialog.\n const allActions = useMemo(() => {\n // TODO(burdon): Get from navtree (not keyboard).\n const current = Keyboard.singleton.getCurrentContext();\n const actionMap = new Set<string>();\n const actions: Node.ActionLike[] = [];\n Graph.traverse(graph, {\n visitor: (node, path) => {\n if (\n (Node.isAction(node) || Node.isActionGroup(node)) &&\n !actionMap.has(node.id) &&\n current.startsWith(path.slice(0, -1).join('/'))\n ) {\n actionMap.add(node.id);\n actions.push(node);\n }\n },\n });\n\n actions.sort((a, b) => {\n return toLocalizedString(a.properties.label, t)\n ?.toLowerCase()\n .localeCompare(toLocalizedString(b.properties.label, t)?.toLowerCase());\n });\n\n return actions;\n }, [graph]);\n\n const group = allActions.find(({ id }) => id === selected);\n const groupActions = useActions(graph, group?.id);\n const actions = Node.isActionGroup(group) ? groupActions : allActions;\n\n const { results, handleSearch } = useSearchListResults({\n items: actions,\n extract: (action) => toLocalizedString(action.properties.label, t),\n });\n\n return (\n <Dialog.Content ref={forwardedRef}>\n <Dialog.Title>{t('commands dialog title', { ns: meta.id })}</Dialog.Title>\n <SearchList.Root onSearch={handleSearch}>\n <div aria-label={t('command list input placeholder')} role='combobox' aria-expanded='true'>\n <SearchList.Input placeholder={t('command list input placeholder')} />\n <SearchList.Content>\n <SearchList.Viewport>\n {results.map((action) => {\n const shortcut =\n typeof action.properties.keyBinding === 'string'\n ? action.properties.keyBinding\n : action.properties.keyBinding?.[getHostPlatform()];\n\n return (\n <SearchList.Item\n value={action.id}\n key={action.id}\n label={toLocalizedString(action.properties.label, t)}\n icon={action.properties.icon}\n suffix={shortcut ? keySymbols(shortcut).join('') : undefined}\n onSelect={() => {\n if (action.properties.disabled) {\n return;\n }\n\n if (Node.isActionGroup(action)) {\n setSelected(action.id);\n return;\n }\n\n invokeSync(Common.LayoutOperation.UpdateDialog, { state: false });\n setTimeout(() => {\n const node = Graph.getConnections(graph, group?.id ?? action.id, 'inbound')[0];\n if (node && Node.isAction(action)) {\n void runAction(action, { parent: node, caller: KEY_BINDING });\n }\n });\n }}\n classNames='flex items-center gap-2'\n disabled={action.properties.disabled}\n {...(action.properties?.testId && {\n 'data-testid': action.properties.testId,\n })}\n />\n );\n })}\n </SearchList.Viewport>\n </SearchList.Content>\n </div>\n </SearchList.Root>\n <div role='none' className='pli-cardSpacingInline pbe-cardSpacingBlock'>\n <Dialog.Close asChild>\n <Button classNames='is-full'>{t('close label', { ns: osTranslations })}</Button>\n </Dialog.Close>\n </div>\n </Dialog.Content>\n );\n },\n);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Common } from '@dxos/app-framework';\nimport { useOperationInvoker } from '@dxos/app-framework/react';\nimport { Button, Icon, useTranslation } from '@dxos/react-ui';\n\nimport { COMMANDS_DIALOG, meta } from '../../meta';\n\n// TODO(thure): Refactor to be handled by a more appropriate plugin.\nexport const CommandsTrigger = () => {\n const { invokeSync } = useOperationInvoker();\n const { t } = useTranslation(meta.id);\n return (\n <Button\n classNames='m-1 pli-1 lg:pli-2'\n onClick={() => invokeSync(Common.LayoutOperation.UpdateDialog, { subject: COMMANDS_DIALOG, blockAlign: 'start' })}\n >\n <span className='text-description font-normal grow text-start'>{t('command list input placeholder')}</span>\n <Icon icon='ph--magnifying-glass--regular' size={5} />\n </Button>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Graph, Node } from '@dxos/plugin-graph';\nimport { isNonNullable } from '@dxos/util';\n\nimport { type NavTreeItemGraphNode } from './types';\n\nexport const getParent = (\n graph: Graph.ReadableGraph,\n node: NavTreeItemGraphNode,\n path: string[],\n): NavTreeItemGraphNode | undefined => {\n const parentId = path[path.length - 2];\n return Graph.getConnections(graph, node.id, 'inbound').find((n: Node.Node) => n.id === parentId) as\n | NavTreeItemGraphNode\n | undefined;\n};\n\nexport const getPersistenceParent = (\n graph: Graph.ReadableGraph,\n node: NavTreeItemGraphNode,\n path: string[],\n persistenceClass: string,\n): NavTreeItemGraphNode | null => {\n if (node.properties.acceptPersistenceClass?.has(persistenceClass)) {\n return node;\n } else {\n const parent = getParent(graph, node, path);\n return parent ? getPersistenceParent(graph, parent, path.slice(0, path.length - 1), persistenceClass) : null;\n }\n};\n\nexport const resolveMigrationOperation = (\n graph: Graph.ReadableGraph,\n activeNode: NavTreeItemGraphNode,\n destinationPath: string[],\n destinationRelatedNode?: NavTreeItemGraphNode,\n): 'transfer' | 'copy' | 'reject' => {\n const activeClass = activeNode.properties.persistenceClass;\n if (destinationRelatedNode && activeClass) {\n const persistenceParent = getPersistenceParent(graph, destinationRelatedNode, destinationPath, activeClass);\n if (persistenceParent) {\n const activeKey = activeNode.properties.persistenceKey;\n if (activeKey && persistenceParent?.properties.acceptPersistenceKey) {\n return persistenceParent.properties.acceptPersistenceKey.has(activeKey) &&\n persistenceParent.properties.onTransferStart\n ? 'transfer'\n : persistenceParent.properties.onCopy\n ? 'copy'\n : 'reject';\n } else {\n return 'reject';\n }\n } else {\n return 'reject';\n }\n } else {\n return 'reject';\n }\n};\n\n// TODO(wittjosiah): Move into node implementation?\nexport const sortActions = (actions: Node.Action[]): Node.Action[] =>\n actions.sort((a, b) => {\n if (a.properties.disposition === b.properties.disposition) {\n return 0;\n }\n\n if (a.properties.disposition === 'list-item-primary') {\n return -1;\n }\n\n return 1;\n });\n\nexport const getChildren = (\n graph: Graph.ReadableGraph,\n node: NavTreeItemGraphNode,\n path: readonly string[] = [],\n): NavTreeItemGraphNode[] => {\n return Graph.getConnections(graph, node.id, 'outbound')\n .map((n: Node.Node) => {\n // Break cycles.\n const nextPath = [...path, node.id];\n return nextPath.includes(n.id) ? undefined : (n as NavTreeItemGraphNode);\n })\n .filter(isNonNullable) as NavTreeItemGraphNode[];\n};\n\nexport const l0ItemType = (item: Node.Node) => {\n if (Node.isActionLike(item)) {\n return 'action';\n } else {\n return 'tab';\n }\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { monitorForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';\nimport { type Instruction, extractInstruction } from '@atlaskit/pragmatic-drag-and-drop-hitbox/tree-item';\nimport React, { forwardRef, memo, useCallback, useEffect, useMemo } from 'react';\n\nimport { Common } from '@dxos/app-framework';\nimport { Surface, useAppGraph, useLayout, useOperationInvoker } from '@dxos/app-framework/react';\nimport { PLANK_COMPANION_TYPE } from '@dxos/plugin-deck/types';\nimport { Graph, Node, useActionRunner } from '@dxos/plugin-graph';\nimport { useConnections, useActions as useGraphActions } from '@dxos/plugin-graph';\nimport { useMediaQuery, useSidebars } from '@dxos/react-ui';\nimport { type TreeData, type TreeItemDataProps, isTreeData } from '@dxos/react-ui-list';\nimport { mx } from '@dxos/ui-theme';\nimport { arrayMove, byPosition } from '@dxos/util';\n\nimport { useIsAlternateTree, useIsCurrent, useIsOpen, useNavTreeState } from '../hooks';\nimport { meta } from '../meta';\nimport { type FlattenedActions, type NavTreeItemGraphNode } from '../types';\nimport { getChildren, getParent, resolveMigrationOperation } from '../util';\n\nimport { NAV_TREE_ITEM, NavTree } from './NavTree';\nimport { NavTreeContext } from './NavTreeContext';\nimport { type NavTreeContextValue } from './types';\n\n// TODO(thure): Is NavTree truly authoritative in this regard?\nexport const NODE_TYPE = 'dxos/app-graph/node';\n\nconst renderItemEnd = ({ node, open }: { node: Node.Node; open: boolean }) => (\n <Surface role='navtree-item-end' data={{ id: node.id, subject: node.data, open }} limit={1} />\n);\n\nconst getChildrenFilter = (node: Node.Node): node is Node.Node =>\n !Node.isActionLike(node) && node.type !== PLANK_COMPANION_TYPE && node.properties.disposition !== 'hidden';\n\nconst filterItems = (node: Node.Node, disposition?: string) => {\n if (!disposition && (node.properties.disposition === 'hidden' || node.properties.disposition === 'alternate-tree')) {\n return false;\n } else if (!disposition) {\n const action = Node.isAction(node);\n return !action || node.properties.disposition === 'item';\n } else {\n return node.properties.disposition === disposition;\n }\n};\n\nconst getItems = (graph: Graph.ReadableGraph, node?: Node.Node, disposition?: string) => {\n return Graph.getConnections(graph, node?.id ?? Node.RootId, 'outbound').filter((node) =>\n filterItems(node, disposition),\n );\n};\n\nconst useItems = (node?: Node.Node, options?: { disposition?: string; sort?: boolean }) => {\n const { graph } = useAppGraph();\n const connections = useConnections(graph, node?.id ?? Node.RootId);\n const filtered = connections.filter((node) => filterItems(node, options?.disposition));\n return options?.sort ? filtered.toSorted((a, b) => byPosition(a.properties, b.properties)) : filtered;\n};\n\nconst useActions = (node: Node.Node): FlattenedActions => {\n const { graph } = useAppGraph();\n const actions = useGraphActions(graph, node.id);\n\n return useMemo(\n () =>\n actions.reduce(\n (acc: FlattenedActions, arg) => {\n if (arg.properties.disposition === 'item') {\n return acc;\n }\n\n acc.actions.push(arg);\n if (!Node.isAction(arg)) {\n const actionGroup = Graph.getActions(graph, arg.id);\n acc.groupedActions[arg.id] = actionGroup;\n }\n return acc;\n },\n { actions: [], groupedActions: {} },\n ),\n [actions],\n );\n};\n\nexport type NavTreeContainerProps = {\n popoverAnchorId?: string;\n topbar?: boolean;\n} & Pick<NavTreeContextValue, 'tab'>;\n\nexport const NavTreeContainer$ = forwardRef<HTMLDivElement, NavTreeContainerProps>(\n ({ tab, popoverAnchorId, topbar }, forwardedRef) => {\n const [isLg] = useMediaQuery('lg');\n const { invokeSync, invokePromise } = useOperationInvoker();\n const runAction = useActionRunner();\n const { graph } = useAppGraph();\n const { getItem, setItem } = useNavTreeState();\n const layout = useLayout();\n const { navigationSidebarState } = useSidebars(meta.id);\n\n const getProps = useCallback(\n (node: Node.Node, path: string[]): TreeItemDataProps => {\n const children = getChildren(graph, node, path).filter(getChildrenFilter);\n const parentOf =\n children.length > 0 ? children.map(({ id }) => id) : node.properties.role === 'branch' ? [] : undefined;\n return {\n id: node.id,\n parentOf,\n disabled: node.properties.disabled,\n label: node.properties.label ?? node.id,\n className: mx(node.properties.className, node.properties.modified && 'italic'), // TODO(burdon): Italic?\n headingClassName: node.properties.headingClassName,\n icon: node.properties.icon,\n iconHue: node.properties.iconHue,\n testId: node.properties.testId,\n };\n },\n [graph],\n );\n\n const loadDescendents = useCallback(\n (node: Node.Node) => {\n Graph.expand(graph, node.id, 'outbound');\n // Load one level deeper, which resolves some juddering observed on open/close.\n Graph.getConnections(graph, node.id, 'outbound').forEach((child) => {\n Graph.expand(graph, child.id, 'outbound');\n });\n },\n [graph],\n );\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, 'outbound');\n },\n [graph],\n );\n\n const handleTabChange = useCallback(\n (node: NavTreeItemGraphNode) => {\n invokeSync(Common.LayoutOperation.UpdateSidebar, {\n state:\n node.id === tab\n ? navigationSidebarState === 'expanded'\n ? isLg\n ? 'collapsed'\n : 'closed'\n : 'expanded'\n : 'expanded',\n });\n\n invokeSync(Common.LayoutOperation.SwitchWorkspace, { subject: node.id });\n\n // Open the first item if the workspace is empty.\n if (layout.active.length === 0) {\n const [item] = getItems(graph, node).filter((node) => !Node.isActionLike(node));\n if (item && item.data) {\n invokeSync(Common.LayoutOperation.Open, { subject: [item.id] });\n }\n }\n },\n [invokeSync, layout.active, tab, navigationSidebarState, isLg],\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, 'inbound');\n if (parent) {\n void runAction(node, { parent, caller: NAV_TREE_ITEM });\n }\n return;\n }\n\n const current = getItem(path).current;\n if (!current) {\n invokeSync(Common.LayoutOperation.Open, { subject: [node.id], key: node.properties.key });\n } else if (option) {\n invokeSync(Common.LayoutOperation.Close, { subject: [node.id] });\n } else {\n void invokePromise(Common.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 invokeSync(Common.LayoutOperation.UpdateSidebar, { state: 'closed' });\n }\n },\n [graph, invokeSync, invokePromise, getItem, isLg, runAction],\n );\n\n const handleBack = useCallback(() => invokeSync(Common.LayoutOperation.RevertWorkspace), [invokeSync]);\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 operation =\n sourcePath.slice(0, -1).join() === targetPath.slice(0, -1).join() && 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 || !sourceParent?.properties.onTransferEnd) {\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 const setAlternateTree = useCallback(\n (path: string[], open: boolean) => {\n setItem(path, 'alternateTree', open);\n },\n [setItem],\n );\n\n const navTreeContextValue = useMemo(\n () => ({\n blockInstruction,\n canDrop,\n canSelect,\n getProps,\n useIsAlternateTree,\n useIsCurrent,\n useIsOpen,\n loadDescendents,\n onBack: handleBack,\n onOpenChange: handleOpenChange,\n onSelect: handleSelect,\n onTabChange: handleTabChange,\n popoverAnchorId,\n renderItemEnd,\n setAlternateTree,\n tab,\n topbar,\n useActions,\n useItems,\n }),\n [\n blockInstruction,\n canDrop,\n canSelect,\n getProps,\n handleBack,\n handleOpenChange,\n handleSelect,\n handleTabChange,\n loadDescendents,\n popoverAnchorId,\n renderItemEnd,\n setAlternateTree,\n tab,\n topbar,\n useActions,\n ],\n );\n\n return (\n <NavTreeContext.Provider value={navTreeContextValue}>\n <NavTree id={Node.RootId} root={Graph.getRoot(graph)} open={layout.sidebarOpen} ref={forwardedRef} />\n </NavTreeContext.Provider>\n );\n },\n);\n\nexport const NavTreeContainer = memo(NavTreeContainer$);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Atom, useAtomValue } from '@effect-atom/atom-react';\nimport { useEffect, useMemo } from 'react';\n\nimport { useCapability } from '@dxos/app-framework/react';\nimport { type Node } from '@dxos/app-graph';\n\nimport { useNavTreeContext } from './components';\nimport { NavTreeCapabilities } from './types';\n\nexport const useLoadDescendents = (root?: Node.Node) => {\n const { loadDescendents } = useNavTreeContext();\n useEffect(() => {\n const frame = requestAnimationFrame(() => {\n if (root) {\n void loadDescendents?.(root);\n }\n });\n return () => cancelAnimationFrame(frame);\n }, [root]);\n};\n\nexport type UseNavTreeStateResult = {\n getItem: (path: string[]) => NavTreeCapabilities.NavTreeItemState;\n getItemAtom: (path: string[]) => Atom.Atom<NavTreeCapabilities.NavTreeItemState>;\n setItem: (path: string[], key: 'open' | 'current' | 'alternateTree', next: boolean) => void;\n};\n\n/**\n * Hook that provides access to navtree state functions.\n * For reactive subscriptions, use `useNavTreeItemState` or `useAtomValue(getItemAtom(path))`.\n */\nexport const useNavTreeState = (): UseNavTreeStateResult => {\n return useCapability(NavTreeCapabilities.State);\n};\n\n/**\n * Hook that subscribes to a single navtree item's state.\n * Use this for fine-grained reactivity.\n */\nexport const useNavTreeItemState = (path: string[]): NavTreeCapabilities.NavTreeItemState => {\n const { getItemAtom } = useCapability(NavTreeCapabilities.State);\n // Memoize the path to avoid creating new atoms on every render.\n const pathKey = useMemo(() => path.join('~'), [path]);\n const atom = useMemo(() => getItemAtom(path), [getItemAtom, pathKey]);\n return useAtomValue(atom);\n};\n\n/**\n * Hook that subscribes to the open state for a tree item.\n * Designed to be passed to Tree component as useIsOpen prop.\n */\nexport const useIsOpen = (path: string[], _item?: any): boolean => {\n return useNavTreeItemState(path).open;\n};\n\n/**\n * Hook that subscribes to the current state for a tree item.\n * Designed to be passed to Tree component as useIsCurrent prop.\n */\nexport const useIsCurrent = (path: string[], _item?: any): boolean => {\n return useNavTreeItemState(path).current;\n};\n\n/**\n * Hook that subscribes to the alternateTree state for a tree item.\n */\nexport const useIsAlternateTree = (path: string[], _item?: any): boolean => {\n return useNavTreeItemState(path).alternateTree ?? false;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { forwardRef, useMemo } from 'react';\n\nimport { type TreeProps } from '@dxos/react-ui-list';\nimport { Tabs } from '@dxos/react-ui-tabs';\n\nimport { useLoadDescendents } from '../../hooks';\nimport { type NavTreeItemGraphNode } from '../../types';\nimport { useNavTreeContext } from '../NavTreeContext';\nimport { L0Menu, L1Tabs, type L1TabsProps } from '../Sidebar';\n\nexport const NAV_TREE_ITEM = 'NavTreeItem';\n\nexport type NavTreeProps = Pick<TreeProps<NavTreeItemGraphNode>, 'id' | 'root'> & Pick<L1TabsProps, 'open'>;\n\nexport const NavTree = forwardRef<HTMLDivElement, NavTreeProps>(({ id, root, ...props }, forwardedRef) => {\n const { tab, useItems, onBack } = useNavTreeContext();\n const topLevelActions = useItems(root, { disposition: 'menu', sort: true });\n const topLevelWorkspaces = useItems(root, { disposition: 'workspace' });\n const l0Items = topLevelWorkspaces;\n const pinnedItems = useItems(root, { disposition: 'pin-end', sort: true });\n const userAccountItem = useItems(root, { disposition: 'user-account' })[0];\n const topLevelItems = useMemo(\n () => [\n // prettier-ignore\n ...l0Items,\n ...pinnedItems,\n ...(userAccountItem ? [userAccountItem] : []),\n ],\n [l0Items, pinnedItems, userAccountItem],\n );\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' verticalVariant='stateless' classNames='relative' ref={forwardedRef}>\n <L0Menu\n menuActions={topLevelActions}\n topLevelItems={l0Items}\n pinnedItems={pinnedItems}\n userAccountItem={userAccountItem}\n path={path}\n parent={root}\n />\n <L1Tabs topLevelItems={topLevelItems} path={path} currentItemId={tab} onBack={onBack} {...props} />\n </Tabs.Root>\n );\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 { 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 {\n type Edge,\n attachClosestEdge,\n extractClosestEdge,\n} from '@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge';\nimport React, {\n type MouseEvent,\n type PropsWithChildren,\n forwardRef,\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 ListItem,\n ScrollArea,\n type ThemedClassName,\n Tooltip,\n toLocalizedString,\n useMediaQuery,\n useTranslation,\n} from '@dxos/react-ui';\nimport { DropdownMenu, type MenuItem, MenuProvider } 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';\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};\n\ntype L0ItemProps = L0ItemRootProps & {\n item: Node.Node;\n parent?: Node.Node;\n path: string[];\n pinned?: boolean;\n onRearrange?: StackItemRearrangeHandler<L0ItemData>;\n};\n\nconst useL0ItemClick = ({ item, parent, path }: L0ItemProps, type: string) => {\n const { tab, 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, caller } : { parent });\n }\n\n case 'tab':\n return onTabChange?.(item);\n\n case 'link':\n return onSelect?.({ item, path, current: !getItem(path).current, option: event.altKey });\n }\n },\n [item, parent, type, tab, getItem, onSelect, onTabChange, isLg, runAction],\n );\n};\n\nconst l0Breakpoints: Record<string, string> = {\n lg: 'hidden lg:grid',\n};\n\nconst l0ItemRoot =\n 'group/l0item flex is-full justify-center items-center relative data[type!=\"collection\"]:cursor-pointer app-no-drag dx-focus-ring-group';\n\nconst l0ItemContent = 'flex justify-center items-center dx-focus-ring-group-indicator transition-colors rounded-sm';\n\nconst L0ItemRoot = forwardRef<HTMLElement, PropsWithChildren<L0ItemRootProps>>(\n ({ item, parent, path, children }, forwardedRef) => {\n const { getProps } = useNavTreeContext();\n const { id, testId } = getProps?.(item, path) ?? {};\n const type = l0ItemType(item);\n const itemPath = useMemo(() => [...path, item.id], [item.id, path]);\n\n const { t } = useTranslation(meta.id);\n const localizedString = toLocalizedString(item.properties.label, t);\n\n const handleClick = useL0ItemClick({ item, parent, path: itemPath }, type);\n const rootProps =\n type === 'tab'\n ? { value: item.id, tabIndex: 0, onClick: handleClick, 'data-testid': testId, 'data-object-id': id }\n : { onClick: handleClick, 'data-testid': testId, 'data-object-id': id };\n\n return (\n <Tooltip.Trigger asChild delayDuration={0} side='right' content={localizedString}>\n <Tabs.TabPrimitive\n {...(rootProps as any)}\n data-type={type}\n className={mx(l0ItemRoot, l0Breakpoints[item.properties.l0Breakpoint])}\n ref={forwardedRef}\n >\n {children}\n </Tabs.TabPrimitive>\n </Tooltip.Trigger>\n );\n },\n);\n\nexport const L0ItemActiveTabIndicator = ({ classNames }: ThemedClassName<{}>) => (\n <div\n role='none'\n className={mx(\n 'hidden group-aria-selected/l0item:block absolute inline-start-0 inset-block-2 is-1 bg-accentSurface rounded-ie',\n classNames,\n )}\n />\n);\n\n// TODO(burdon): Factor out pinned (non-draggable) items.\nconst L0Item = ({ item, parent, path, pinned, onRearrange }: L0ItemProps) => {\n const { t } = useTranslation(meta.id);\n const itemElement = useRef<HTMLElement | 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 // NOTE(thure): This is copied from StackItem, perhaps this should be DRYed out.\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 return (\n <L0ItemRoot ref={itemElement} item={item} parent={parent} path={path}>\n <div\n role='none'\n data-frame={true}\n {...(hue && { style: { background: `var(--dx-${hue}Surface)` } })}\n className={mx(\n l0ItemContent,\n pinned\n ? 'p-2 group-hover/l0item:bg-activeSurface'\n : 'is-[--l0-avatar-size] bs-[--l0-avatar-size] bg-activeSurface',\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.id);\n const type = l0ItemType(item);\n if (item.properties.icon) {\n const hue = item.properties.hue ?? null;\n const hueFgStyle = hue && { style: { color: `var(--dx-${hue}SurfaceText)` } };\n return <Icon icon={item.properties.icon} size={6} {...hueFgStyle} />;\n }\n\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};\n\nexport const L0Menu = ({ menuActions, topLevelItems, pinnedItems, userAccountItem, parent, path }: L0MenuProps) => {\n const { t } = useTranslation(meta.id);\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 classNames={[\n 'group/l0 absolute z-[1] inset-block-0 inline-start-0 rounded-is',\n 'grid grid-cols-[var(--l0-size)] grid-rows-[var(--rail-size)_1fr_min-content_var(--l0-size)] contain-layout',\n '!is-[--l0-size] bg-baseSurface border-ie border-subduedSeparator app-drag pbe-[env(safe-area-inset-bottom)]',\n ]}\n >\n {/* TODO(wittjosiah): Use L0Item trigger. */}\n <MenuProvider onAction={handleAction}>\n <DropdownMenu.Root group={parent} items={menuActions}>\n <Tooltip.Trigger content={t('app menu label')} side='right' asChild>\n <Tabs.TabPrimitive value='options' asChild role='button'>\n <DropdownMenu.Trigger\n data-testid='spacePlugin.addSpace'\n className={mx(\n l0ItemRoot,\n 'grid place-items-center dx-focus-ring-group',\n '[body[data-platform=\"macos\"]_&]:mt-[30px]',\n )}\n >\n <div\n role='none'\n className={mx(\n l0ItemContent,\n 'is-[--rail-action] bs-[--rail-action] group-hover/l0item:bg-hoverSurface',\n )}\n >\n <Icon icon='ph--list--regular' size={5} />\n </div>\n </DropdownMenu.Trigger>\n </Tabs.TabPrimitive>\n </Tooltip.Trigger>\n </DropdownMenu.Root>\n </MenuProvider>\n\n {/* Space list. */}\n <ScrollArea.Root>\n <ScrollArea.Viewport>\n <div\n role='none'\n className={mx([\n 'flex flex-col gap-1 pbs-1',\n '[body[data-platform=\"macos\"]_&]:pbs-[30px]',\n '[body[data-platform=\"ios\"]_&]:pbs-[max(env(safe-area-inset-top),0.25rem)]',\n ])}\n >\n {topLevelItems.map((item) => (\n <L0Item\n key={item.id}\n item={item}\n parent={parent}\n path={path}\n {...(hasRearrangeableItems && { onRearrange: handleRearrange })}\n />\n ))}\n </div>\n <ScrollArea.Scrollbar orientation='vertical'>\n <ScrollArea.Thumb />\n </ScrollArea.Scrollbar>\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n\n {/* Actions. */}\n <div role='none' className='grid grid-cols-1 auto-rows-[--rail-action] pbs-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 role='none' className='grid 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-block-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 React, { useCallback, useMemo } from 'react';\n\nimport { type Node } from '@dxos/app-graph';\nimport { DensityProvider, IconButton, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { Tree } from '@dxos/react-ui-list';\nimport { Tabs } from '@dxos/react-ui-tabs';\nimport { hoverableControlItem, hoverableOpenControlItem } from '@dxos/ui-theme';\n\nimport { useIsAlternateTree } from '../../hooks';\nimport { meta } from '../../meta';\nimport { useNavTreeContext } from '../NavTreeContext';\nimport { NavTreeItemColumns } from '../NavTreeItem';\n\nexport type L1PanelProps = {\n open?: boolean;\n path: string[];\n item: Node.Node;\n currentItemId: string;\n onBack?: () => void;\n};\n\n/**\n * Space or settings panel.\n */\nexport const L1Panel = ({ open, path, item, currentItemId, onBack }: L1PanelProps) => {\n const { t } = useTranslation(meta.id);\n const navTreeContext = useNavTreeContext();\n const title = toLocalizedString(item.properties.label, t);\n\n // TODO(wittjosiah): Support multiple alternate trees.\n const { useItems } = navTreeContext;\n const alternateTree = useItems(item, { disposition: 'alternate-tree' })[0];\n const alternatePath = useMemo(() => [...path, item.id], [item.id, path]);\n const isAlternate = useIsAlternateTree(alternatePath, item);\n const useAlternateItems = useCallback(\n (node?: Node.Node, { disposition }: { disposition?: string } = {}) => {\n // TODO(wittjosiah): Sorting is expensive, limit to necessary items for now.\n return useItems(node, { disposition, sort: node?.id === alternateTree.id });\n },\n [alternateTree, useItems],\n );\n\n return (\n <Tabs.Tabpanel\n key={item.id}\n value={item.id}\n classNames={[\n 'absolute inset-block-0 inline-end-0',\n 'is-[calc(100%-var(--l0-size))] lg:is-[--l1-size] grid-cols-1 grid-rows-[var(--rail-size)_1fr]',\n 'pbs-[env(safe-area-inset-top)]',\n item.id === currentItemId && 'grid',\n ]}\n tabIndex={-1}\n aria-label={title}\n {...(!open && { inert: true })}\n >\n {item.id === currentItemId && (\n <DensityProvider density='fine'>\n <L1PanelHeader path={path} item={item} currentItemId={currentItemId} onBack={onBack} />\n <div role='none' className='overflow-y-auto'>\n {isAlternate ? (\n <Tree\n {...navTreeContext}\n id={alternateTree.id}\n root={alternateTree}\n path={alternatePath}\n levelOffset={5}\n gridTemplateColumns='[tree-row-start] 1fr min-content min-content min-content [tree-row-end]'\n renderColumns={NavTreeItemColumns}\n useItems={useAlternateItems}\n />\n ) : (\n <Tree\n {...navTreeContext}\n id={item.id}\n root={item}\n path={path}\n levelOffset={5}\n gridTemplateColumns='[tree-row-start] 1fr min-content min-content min-content [tree-row-end]'\n renderColumns={NavTreeItemColumns}\n draggable\n />\n )}\n </div>\n </DensityProvider>\n )}\n </Tabs.Tabpanel>\n );\n};\n\n/**\n * Header row.\n */\nconst L1PanelHeader = ({ item, path, onBack }: L1PanelProps) => {\n const { t } = useTranslation(meta.id);\n const { setAlternateTree, ...navTreeContext } = useNavTreeContext();\n const title = toLocalizedString(item.properties.label, t);\n\n // TODO(wittjosiah): Support multiple alternate trees.\n const alternateTree = navTreeContext.useItems(item, { disposition: 'alternate-tree' })[0];\n const alternatePath = useMemo(() => [...path, item.id], [item.id, path]);\n const isAlternate = useIsAlternateTree(alternatePath, item);\n const backCapable = item.id.startsWith('!') || isAlternate;\n\n const handleOpen = useCallback(() => {\n setAlternateTree?.(alternatePath, true);\n }, [alternatePath, setAlternateTree]);\n\n const handleBack = useCallback(() => {\n if (isAlternate) {\n setAlternateTree?.(alternatePath, false);\n } else {\n onBack?.();\n }\n }, [isAlternate, alternatePath, setAlternateTree, onBack]);\n\n // TODO(burdon): Reuse same grid as tree?\n return (\n <div className='flex is-full items-center border-be border-subduedSeparator app-drag density-coarse'>\n <div className='is-6' />\n <h2 className='flex-1 truncate min-is-0'>{title}</h2>\n {(backCapable && (\n <IconButton\n data-testid='treeView.primaryTreeButton'\n variant='ghost'\n icon='ph--arrow-u-down-left--regular'\n iconOnly\n label={t('button back')}\n classNames={[hoverableControlItem, hoverableOpenControlItem, 'pointer-fine:pli-1']}\n onClick={handleBack}\n />\n )) ||\n (alternateTree && !isAlternate && (\n <IconButton\n data-testid='treeView.alternateTreeButton'\n variant='ghost'\n icon={alternateTree.properties.icon ?? 'ph--placeholder--regular'}\n iconOnly\n label={toLocalizedString(alternateTree.properties.label ?? alternateTree.id, t)}\n classNames={[hoverableControlItem, hoverableOpenControlItem, 'pointer-fine:pli-1']}\n onClick={handleOpen}\n />\n ))}\n <NavTreeItemColumns open path={path} item={item} density='coarse' />\n </div>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React 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 { DropdownMenu, type MenuItem, MenuProvider } from '@dxos/react-ui-menu';\nimport { hoverableControlItem, hoverableOpenControlItem } from '@dxos/ui-theme';\n\nimport { meta } from '../../meta';\nimport { type ActionProperties } from '../../types';\n\nexport type NavTreeItemActionMenuProps = ActionProperties & {\n parent: Node.Node;\n caller?: string;\n monolithic?: boolean;\n menuActions?: Node.Action[];\n};\n\nconst fallbackIcon = 'ph--placeholder--regular';\n\nconst fineActionButtonProps = {\n size: 4 as const,\n density: 'fine' as const,\n};\nconst coarseActionButtonProps = {\n size: 5 as const,\n density: 'coarse' as const,\n};\n\nexport const NavTreeItemActionDropdownMenu = ({\n parent,\n label,\n icon,\n testId,\n menuActions,\n caller,\n}: NavTreeItemActionMenuProps) => {\n const { t } = useTranslation(meta.id);\n const density = useDensityContext();\n const runAction = useActionRunner();\n\n return (\n <MenuProvider onAction={runAction}>\n <DropdownMenu.Root group={parent} items={menuActions as MenuItem[]} caller={caller}>\n <DropdownMenu.Trigger asChild>\n <IconButton\n {...(density === 'coarse' ? coarseActionButtonProps : fineActionButtonProps)}\n classNames={['shrink-0 pli-2 pointer-fine:pli-1', hoverableControlItem, hoverableOpenControlItem]}\n variant='ghost'\n icon={icon ?? fallbackIcon}\n iconOnly\n label={toLocalizedString(label, t)}\n data-testid={testId}\n />\n </DropdownMenu.Trigger>\n </DropdownMenu.Root>\n </MenuProvider>\n );\n};\n\nexport const NavTreeItemMonolithicAction = (\n props: Node.Action & { parent: Node.Node; onAction?: (action: Node.Action) => void; baseLabel: string },\n) => {\n const {\n parent,\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 === 'coarse' ? coarseActionButtonProps : fineActionButtonProps)}\n variant={variant}\n classNames={[\n 'shrink-0',\n hoverableControlItem,\n hoverableOpenControlItem,\n iconOnly ? 'pli-2 pointer-fine:pli-1' : 'p-2 pointer-fine:p-2 mie-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 } : { parent });\n }}\n data-testid={testId}\n />\n );\n};\n\nexport const NavTreeItemAction = ({ monolithic, menuActions, parent: node, ...props }: NavTreeItemActionMenuProps) => {\n const { t } = useTranslation(meta.id);\n\n const monolithicAction = menuActions?.length === 1 && menuActions[0];\n const baseLabel = toLocalizedString(monolithicAction ? monolithicAction.properties!.label : props.label, t);\n\n return monolithic && menuActions?.length === 1 ? (\n <NavTreeItemMonolithicAction baseLabel={baseLabel} parent={node} {...menuActions[0]} />\n ) : (\n <NavTreeItemActionDropdownMenu {...props} label={baseLabel} parent={node} menuActions={menuActions} />\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { Fragment, memo } from 'react';\n\nimport { Node } from '@dxos/app-graph';\nimport { Popover, Treegrid, toLocalizedString, useTranslation } from '@dxos/react-ui';\n\nimport { useLoadDescendents } from '../../hooks';\nimport { meta } from '../../meta';\nimport { NAV_TREE_ITEM } from '../NavTree';\nimport { useNavTreeContext } from '../NavTreeContext';\nimport { type NavTreeItemColumnsProps } from '../types';\n\nimport { NavTreeItemAction } from './NavTreeItemAction';\n\nexport const NavTreeItemColumns = memo(({ path, item, open }: NavTreeItemColumnsProps) => {\n const { t } = useTranslation(meta.id);\n const { useActions, renderItemEnd: ItemEnd, popoverAnchorId } = useNavTreeContext();\n\n const level = path.length - 2;\n const { actions: _actions, groupedActions } = useActions(item);\n const [primaryAction, ...secondaryActions] = _actions.toSorted((a, _b) =>\n a.properties?.disposition === 'list-item-primary' ? -1 : 1,\n );\n\n const actions = (primaryAction?.properties?.disposition === 'list-item-primary' ? secondaryActions : _actions)\n .flatMap((action) => (Node.isAction(action) ? [action] : []))\n .filter((a) => ['list-item', 'list-item-primary'].includes(a.properties?.disposition));\n\n useLoadDescendents(item);\n useLoadDescendents(primaryAction && !Node.isAction(primaryAction) ? (primaryAction as Node.Node) : undefined);\n\n const ActionRoot = popoverAnchorId === `dxos.org/ui/${NAV_TREE_ITEM}/${item.id}` ? Popover.Anchor : Fragment;\n\n return (\n <div role='none' className='contents app-no-drag'>\n {primaryAction?.properties?.disposition === 'list-item-primary' && !primaryAction?.properties?.disabled ? (\n <Treegrid.Cell classNames='contents'>\n <NavTreeItemAction\n testId={primaryAction.properties?.testId}\n label={toLocalizedString(primaryAction.properties?.label, t)}\n icon={primaryAction.properties?.icon ?? 'ph--placeholder--regular'}\n parent={item}\n monolithic={Node.isAction(primaryAction)}\n menuActions={Node.isAction(primaryAction) ? [primaryAction] : groupedActions[primaryAction?.id ?? '']}\n menuType={primaryAction.properties?.menuType}\n caller={NAV_TREE_ITEM}\n />\n </Treegrid.Cell>\n ) : (\n <Treegrid.Cell role='none' />\n )}\n <ActionRoot>\n {actions.length > 0 ? (\n <Treegrid.Cell classNames='contents'>\n <NavTreeItemAction\n testId={`navtree.treeItem.actionsLevel${level}`}\n label={t('tree item actions label')}\n icon='ph--dots-three-vertical--regular'\n parent={item}\n menuActions={actions}\n menuType='dropdown'\n caller={NAV_TREE_ITEM}\n />\n </Treegrid.Cell>\n ) : (\n <Treegrid.Cell role='none' />\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 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type Node } from '@dxos/app-graph';\n\nimport { l0ItemType } from '../../util';\n\nimport { L1Panel, type L1PanelProps } from './L1Panel';\n\nexport type L1TabsProps = Pick<L1PanelProps, 'open' | 'currentItemId' | 'onBack'> & {\n path: string[];\n topLevelItems: Node.Node[];\n};\n\n/**\n * Each workspace is an L1 tab.\n */\nexport const L1Tabs = ({ topLevelItems, onBack, ...props }: L1TabsProps) => {\n return (\n <>\n {topLevelItems.map((item) => {\n const type = l0ItemType(item);\n if (type === 'tab') {\n return <L1Panel key={item.id} item={item} {...props} onBack={onBack} />;\n }\n return null;\n })}\n </>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\nimport { useEffect } from 'react';\n\nimport { type Node } from '@dxos/app-graph';\nimport { toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { osTranslations } from '@dxos/ui-theme';\n\nimport { meta } from '../meta';\n\nexport const NavTreeDocumentTitle = ({ node }: { node?: Node.Node }) => {\n const { t } = useTranslation(meta.id);\n useEffect(() => {\n document.title = node ? toLocalizedString(node.properties.label, t) : t('current app name', { ns: osTranslations });\n }, [node?.properties?.label]);\n return null;\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["React", "forwardRef", "useMemo", "useState", "Common", "useAppGraph", "useOperationInvoker", "Keyboard", "keySymbols", "Graph", "Node", "useActionRunner", "useActions", "Button", "Dialog", "toLocalizedString", "useTranslation", "SearchList", "useSearchListResults", "osTranslations", "getHostPlatform", "CommandsDialogContent", "forwardRef", "selected", "initial", "forwardedRef", "t", "useTranslation", "meta", "id", "invokeSync", "useOperationInvoker", "runAction", "useActionRunner", "graph", "useAppGraph", "setSelected", "useState", "allActions", "useMemo", "current", "Keyboard", "singleton", "getCurrentContext", "actionMap", "Set", "actions", "Graph", "traverse", "visitor", "node", "path", "Node", "isAction", "isActionGroup", "has", "startsWith", "slice", "join", "add", "push", "sort", "a", "b", "toLocalizedString", "properties", "label", "toLowerCase", "localeCompare", "group", "find", "groupActions", "useActions", "results", "handleSearch", "useSearchListResults", "items", "extract", "action", "Dialog", "Content", "ref", "Title", "ns", "SearchList", "Root", "onSearch", "div", "aria-label", "role", "aria-expanded", "Input", "placeholder", "Viewport", "map", "shortcut", "keyBinding", "getHostPlatform", "Item", "value", "key", "icon", "suffix", "keySymbols", "undefined", "onSelect", "disabled", "Common", "LayoutOperation", "UpdateDialog", "state", "setTimeout", "getConnections", "parent", "caller", "KEY_BINDING", "classNames", "testId", "className", "Close", "asChild", "Button", "osTranslations", "React", "Common", "useOperationInvoker", "Button", "Icon", "useTranslation", "CommandsTrigger", "invokeSync", "useOperationInvoker", "t", "useTranslation", "meta", "id", "React", "Button", "classNames", "onClick", "Common", "LayoutOperation", "UpdateDialog", "subject", "COMMANDS_DIALOG", "blockAlign", "span", "className", "Icon", "icon", "size", "Graph", "Node", "isNonNullable", "getParent", "graph", "node", "path", "parentId", "length", "Graph", "getConnections", "id", "find", "n", "getPersistenceParent", "persistenceClass", "properties", "acceptPersistenceClass", "has", "parent", "slice", "resolveMigrationOperation", "activeNode", "destinationPath", "destinationRelatedNode", "activeClass", "persistenceParent", "activeKey", "persistenceKey", "acceptPersistenceKey", "onTransferStart", "onCopy", "sortActions", "actions", "sort", "a", "b", "disposition", "getChildren", "map", "nextPath", "includes", "undefined", "filter", "isNonNullable", "l0ItemType", "item", "Node", "isActionLike", "monitorForElements", "extractInstruction", "React", "forwardRef", "memo", "useCallback", "useEffect", "useMemo", "Common", "Surface", "useAppGraph", "useLayout", "useOperationInvoker", "PLANK_COMPANION_TYPE", "Graph", "Node", "useActionRunner", "useConnections", "useActions", "useGraphActions", "useMediaQuery", "useSidebars", "isTreeData", "mx", "arrayMove", "byPosition", "useAtomValue", "useEffect", "useMemo", "useCapability", "React", "forwardRef", "useMemo", "Tabs", "createContext", "useContext", "raise", "NavTreeContext", "createContext", "useNavTreeContext", "useContext", "raise", "Error", "combine", "draggable", "dropTargetForElements", "preserveOffsetOnSource", "scrollJustEnoughIntoView", "attachClosestEdge", "extractClosestEdge", "React", "forwardRef", "useCallback", "useLayoutEffect", "useMemo", "useRef", "useState", "DxAvatar", "useActionRunner", "Icon", "ListItem", "ScrollArea", "Tooltip", "toLocalizedString", "useMediaQuery", "useTranslation", "DropdownMenu", "MenuProvider", "Tabs", "mx", "arrayMove", "React", "Avatar", "hexToFallback", "UserAccountAvatar", "size", "userId", "hue", "emoji", "status", "fallbackValue", "hexToFallback", "React", "L0ItemActiveTabIndicator", "classNames", "div", "className", "data-joyride", "Avatar", "Root", "Content", "variant", "fallback", "data-testid", "useL0ItemClick", "item", "parent", "path", "type", "tab", "onSelect", "onTabChange", "useNavTreeContext", "getItem", "useNavTreeState", "isLg", "useMediaQuery", "runAction", "useActionRunner", "useCallback", "event", "properties", "caller", "current", "option", "altKey", "l0Breakpoints", "lg", "l0ItemRoot", "l0ItemContent", "L0ItemRoot", "forwardRef", "children", "forwardedRef", "getProps", "id", "testId", "l0ItemType", "itemPath", "useMemo", "t", "useTranslation", "meta", "localizedString", "toLocalizedString", "label", "handleClick", "rootProps", "value", "tabIndex", "onClick", "React", "Tooltip", "Trigger", "asChild", "delayDuration", "side", "content", "Tabs", "TabPrimitive", "data-type", "className", "mx", "l0Breakpoint", "ref", "L0ItemActiveTabIndicator", "classNames", "div", "role", "L0Item", "pinned", "onRearrange", "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", "data-frame", "style", "background", "ItemAvatar", "span", "ListItem", "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", "MenuProvider", "onAction", "DropdownMenu", "Root", "group", "items", "data-testid", "ScrollArea", "Viewport", "key", "Scrollbar", "orientation", "Thumb", "UserAccountAvatar", "userId", "emoji", "status", "React", "useCallback", "useMemo", "DensityProvider", "IconButton", "toLocalizedString", "useTranslation", "Tree", "Tabs", "hoverableControlItem", "hoverableOpenControlItem", "React", "useActionRunner", "IconButton", "toLocalizedString", "useDensityContext", "useTranslation", "DropdownMenu", "MenuProvider", "hoverableControlItem", "hoverableOpenControlItem", "fallbackIcon", "fineActionButtonProps", "size", "density", "coarseActionButtonProps", "NavTreeItemActionDropdownMenu", "parent", "label", "icon", "testId", "menuActions", "caller", "t", "useTranslation", "meta", "id", "useDensityContext", "runAction", "useActionRunner", "React", "MenuProvider", "onAction", "DropdownMenu", "Root", "group", "items", "Trigger", "asChild", "IconButton", "classNames", "hoverableControlItem", "hoverableOpenControlItem", "variant", "iconOnly", "toLocalizedString", "data-testid", "NavTreeItemMonolithicAction", "props", "properties", "disabled", "baseLabel", "onClick", "event", "stopPropagation", "NavTreeItemAction", "monolithic", "node", "monolithicAction", "length", "React", "Fragment", "memo", "Node", "Popover", "Treegrid", "toLocalizedString", "useTranslation", "NavTreeItemColumns", "memo", "path", "item", "open", "t", "useTranslation", "meta", "id", "useActions", "renderItemEnd", "ItemEnd", "popoverAnchorId", "useNavTreeContext", "level", "length", "actions", "_actions", "groupedActions", "primaryAction", "secondaryActions", "toSorted", "a", "_b", "properties", "disposition", "flatMap", "action", "Node", "isAction", "filter", "includes", "useLoadDescendents", "undefined", "ActionRoot", "NAV_TREE_ITEM", "Popover", "Anchor", "Fragment", "React", "div", "role", "className", "disabled", "Treegrid", "Cell", "classNames", "NavTreeItemAction", "testId", "label", "toLocalizedString", "icon", "parent", "monolithic", "menuActions", "menuType", "caller", "node", "L1Panel", "open", "path", "item", "currentItemId", "onBack", "t", "useTranslation", "meta", "id", "navTreeContext", "useNavTreeContext", "title", "toLocalizedString", "properties", "label", "useItems", "alternateTree", "disposition", "alternatePath", "useMemo", "isAlternate", "useIsAlternateTree", "useAlternateItems", "useCallback", "node", "sort", "React", "Tabs", "Tabpanel", "key", "value", "classNames", "tabIndex", "aria-label", "inert", "DensityProvider", "density", "L1PanelHeader", "div", "role", "className", "Tree", "root", "levelOffset", "gridTemplateColumns", "renderColumns", "NavTreeItemColumns", "draggable", "setAlternateTree", "backCapable", "startsWith", "handleOpen", "handleBack", "h2", "IconButton", "data-testid", "variant", "icon", "iconOnly", "hoverableControlItem", "hoverableOpenControlItem", "onClick", "React", "L1Tabs", "topLevelItems", "onBack", "props", "React", "map", "item", "type", "l0ItemType", "L1Panel", "key", "id", "NAV_TREE_ITEM", "NavTree", "forwardRef", "id", "root", "props", "forwardedRef", "tab", "useItems", "onBack", "useNavTreeContext", "topLevelActions", "disposition", "sort", "topLevelWorkspaces", "l0Items", "pinnedItems", "userAccountItem", "topLevelItems", "useMemo", "useLoadDescendents", "path", "React", "Tabs", "Root", "value", "orientation", "verticalVariant", "classNames", "ref", "L0Menu", "menuActions", "parent", "L1Tabs", "currentItemId", "useEffect", "toLocalizedString", "useTranslation", "osTranslations", "NavTreeDocumentTitle", "node", "t", "useTranslation", "meta", "id", "useEffect", "document", "title", "toLocalizedString", "properties", "label", "ns", "osTranslations", "useLoadDescendents", "root", "loadDescendents", "useNavTreeContext", "useEffect", "frame", "requestAnimationFrame", "cancelAnimationFrame", "useNavTreeState", "useCapability", "NavTreeCapabilities", "State", "useNavTreeItemState", "path", "getItemAtom", "pathKey", "useMemo", "join", "atom", "useAtomValue", "useIsOpen", "_item", "open", "useIsCurrent", "current", "useIsAlternateTree", "alternateTree", "NODE_TYPE", "renderItemEnd", "node", "open", "React", "Surface", "role", "data", "id", "subject", "limit", "getChildrenFilter", "Node", "isActionLike", "type", "PLANK_COMPANION_TYPE", "properties", "disposition", "filterItems", "action", "isAction", "getItems", "graph", "Graph", "getConnections", "RootId", "filter", "useItems", "options", "useAppGraph", "connections", "useConnections", "filtered", "sort", "toSorted", "a", "b", "byPosition", "useActions", "actions", "useGraphActions", "useMemo", "reduce", "acc", "arg", "push", "actionGroup", "getActions", "groupedActions", "NavTreeContainer$", "forwardRef", "tab", "popoverAnchorId", "topbar", "forwardedRef", "isLg", "useMediaQuery", "invokeSync", "invokePromise", "useOperationInvoker", "runAction", "useActionRunner", "getItem", "setItem", "useNavTreeState", "layout", "useLayout", "navigationSidebarState", "useSidebars", "meta", "getProps", "useCallback", "path", "children", "getChildren", "parentOf", "length", "map", "undefined", "disabled", "label", "className", "mx", "modified", "headingClassName", "icon", "iconHue", "testId", "loadDescendents", "expand", "forEach", "child", "handleOpenChange", "item", "handleTabChange", "Common", "LayoutOperation", "UpdateSidebar", "state", "SwitchWorkspace", "active", "Open", "blockInstruction", "instruction", "source", "target", "canDrop", "canSelect", "selectable", "handleSelect", "option", "parent", "caller", "NAV_TREE_ITEM", "current", "key", "Close", "ScrollIntoView", "defaultAction", "find", "handleBack", "RevertWorkspace", "useEffect", "monitorForElements", "canMonitor", "isTreeData", "onDrop", "location", "dropTargets", "extractInstruction", "sourceNode", "targetNode", "sourcePath", "targetPath", "operation", "slice", "join", "resolveMigrationOperation", "sourceParent", "getParent", "targetParent", "sourceItems", "targetItems", "sourceIndex", "findIndex", "targetIndex", "migrationIndex", "nextItems", "arrayMove", "onRearrange", "onCopy", "onTransferStart", "onTransferEnd", "setAlternateTree", "navTreeContextValue", "useIsAlternateTree", "useIsCurrent", "useIsOpen", "onBack", "onOpenChange", "onSelect", "onTabChange", "NavTreeContext", "Provider", "value", "NavTree", "root", "getRoot", "sidebarOpen", "ref", "NavTreeContainer", "memo"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/keyboard/keyboard.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability, Common } from '@dxos/app-framework';\nimport { debounce } from '@dxos/async';\nimport { Keyboard } from '@dxos/keyboard';\nimport { Graph, Node, runAction } from '@dxos/plugin-graph';\nimport { getHostPlatform } from '@dxos/util';\n\nimport { KEY_BINDING } from '../../meta';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const { graph } = yield* Capability.get(Common.Capability.AppGraph);\n const invoker = yield* Capability.get(Common.Capability.OperationInvoker);\n const pluginContext = yield* Capability.Service;\n\n // TODO(wittjosiah): Factor out.\n // TODO(wittjosiah): Handle removal of actions.\n const visitor = (node: Node.Node, path: string[]) => {\n let shortcut: string | undefined;\n if (typeof node.properties.keyBinding === 'object') {\n const availablePlatforms = Object.keys(node.properties.keyBinding);\n const platform = getHostPlatform();\n shortcut = availablePlatforms.includes(platform)\n ? node.properties.keyBinding[platform]\n : platform === 'ios'\n ? node.properties.keyBinding.macos // Fallback to macos if ios-specific bindings not provided.\n : platform === 'linux' || platform === 'unknown'\n ? node.properties.keyBinding.windows // Fallback to windows if platform-specific bindings not provided.\n : undefined;\n } else {\n shortcut = node.properties.keyBinding;\n }\n\n if (shortcut && Node.isAction(node)) {\n Keyboard.singleton.getContext(path.slice(0, -1).join('/')).bind({\n shortcut,\n handler: () => void runAction(invoker, pluginContext, node, { parent: node, caller: KEY_BINDING }),\n data: node.properties.label,\n });\n }\n };\n\n const eventHandler = debounce(() => {\n Graph.traverse(graph, { visitor });\n }, 500);\n\n const unsubscribe = graph.onNodeChanged.on(eventHandler);\n\n // TODO(burdon): Create context and plugin.\n Keyboard.singleton.initialize();\n Keyboard.singleton.setCurrentContext(Node.RootId);\n\n return Capability.contributes(Common.Capability.Null, null, () =>\n Effect.sync(() => {\n unsubscribe();\n Keyboard.singleton.destroy();\n }),\n );\n }),\n);\n"],
|
|
5
|
-
"mappings": ";;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,YAAYC,cAAc;AACnC,SAASC,gBAAgB;AACzB,SAASC,gBAAgB;AACzB,SAASC,OAAOC,MAAMC,iBAAiB;AACvC,SAASC,uBAAuB;AAIhC,IAAA,mBAAeC,WAAWC,WACjBC,kBAAW,aAAA;AAChB,QAAM,EAAEC,MAAK,IAAK,OAAOH,WAAWI,IAAIC,OAAOL,WAAWM,QAAQ;AAClE,QAAMC,UAAU,OAAOP,WAAWI,IAAIC,OAAOL,WAAWQ,gBAAgB;AACxE,QAAMC,gBAAgB,OAAOT,WAAWU;AAIxC,QAAMC,UAAU,CAACC,MAAiBC,SAAAA;AAChC,QAAIC;AACJ,QAAI,OAAOF,KAAKG,WAAWC,eAAe,UAAU;AAClD,YAAMC,qBAAqBC,OAAOC,KAAKP,KAAKG,WAAWC,UAAU;AACjE,YAAMI,WAAWC,gBAAAA;AACjBP,iBAAWG,mBAAmBK,SAASF,QAAAA,IACnCR,KAAKG,WAAWC,WAAWI,QAAAA,IAC3BA,aAAa,QACXR,KAAKG,WAAWC,WAAWO,QAC3BH,aAAa,WAAWA,aAAa,YACnCR,KAAKG,WAAWC,WAAWQ,UAC3BC;IACV,OAAO;AACLX,iBAAWF,KAAKG,WAAWC;IAC7B;AAEA,QAAIF,YAAYY,KAAKC,SAASf,IAAAA,GAAO;AACnCgB,eAASC,UAAUC,WAAWjB,KAAKkB,MAAM,GAAG,EAAC,EAAGC,KAAK,GAAA,CAAA,EAAMC,KAAK;QAC9DnB;QACAoB,SAAS,MAAM,KAAKC,UAAU5B,SAASE,eAAeG,MAAM;UAAEwB,QAAQxB;UAAMyB,QAAQC;QAAY,CAAA;QAChGC,MAAM3B,KAAKG,WAAWyB;MACxB,CAAA;IACF;EACF;AAEA,QAAMC,eAAeC,SAAS,MAAA;AAC5BC,UAAMC,SAASzC,OAAO;MAAEQ;IAAQ,CAAA;EAClC,GAAG,GAAA;AAEH,QAAMkC,cAAc1C,MAAM2C,cAAcC,GAAGN,YAAAA;AAG3Cb,WAASC,UAAUmB,WAAU;AAC7BpB,WAASC,UAAUoB,kBAAkBvB,KAAKwB,MAAM;AAEhD,SAAOlD,WAAWmD,YAAY9C,OAAOL,WAAWoD,MAAM,MAAM,MACnDC,YAAK,MAAA;AACVR,gBAAAA;AACAjB,aAASC,UAAUyB,QAAO;EAC5B,CAAA,CAAA;AAEJ,CAAA,CAAA;",
|
|
6
|
-
"names": ["Effect", "Capability", "Common", "debounce", "Keyboard", "Graph", "Node", "runAction", "getHostPlatform", "Capability", "makeModule", "fnUntraced", "graph", "get", "Common", "AppGraph", "invoker", "OperationInvoker", "pluginContext", "Service", "visitor", "node", "path", "shortcut", "properties", "keyBinding", "availablePlatforms", "Object", "keys", "platform", "getHostPlatform", "includes", "macos", "windows", "undefined", "Node", "isAction", "Keyboard", "singleton", "getContext", "slice", "join", "bind", "handler", "runAction", "parent", "caller", "KEY_BINDING", "data", "label", "eventHandler", "debounce", "Graph", "traverse", "unsubscribe", "onNodeChanged", "on", "initialize", "setCurrentContext", "RootId", "contributes", "Null", "sync", "destroy"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/operation-resolver/operation-resolver.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability, Common } from '@dxos/app-framework';\nimport { log } from '@dxos/log';\nimport { OperationResolver } from '@dxos/operation';\nimport { Graph } from '@dxos/plugin-graph';\n\nimport { NavTreeCapabilities } from '../../types';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n return Capability.contributes(Common.Capability.OperationResolver, [\n OperationResolver.make({\n operation: Common.LayoutOperation.Expose,\n handler: Effect.fnUntraced(function* ({ subject }) {\n const { graph } = yield* Capability.get(Common.Capability.AppGraph);\n const { getItem, setItem } = yield* Capability.get(NavTreeCapabilities.State);\n yield* Effect.tryPromise(() => Graph.waitForPath(graph, { target: subject }, { timeout: 1_000 })).pipe(\n Effect.andThen((path) => {\n [...Array(path.length)].forEach((_, index) => {\n const subpath = path.slice(0, index);\n const value = getItem(subpath);\n if (!value.open) {\n setItem(subpath, 'open', true);\n }\n });\n }),\n Effect.catchAll(() => {\n log('Path to node not found', { subject });\n return Effect.void;\n }),\n );\n }),\n }),\n ]);\n }),\n);\n"],
|
|
5
|
-
"mappings": ";;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,YAAYC,cAAc;AACnC,SAASC,WAAW;AACpB,SAASC,yBAAyB;AAClC,SAASC,aAAa;;AAItB,IAAA,6BAAeC,WAAWC,WACjBC,kBAAW,aAAA;AAChB,SAAOF,WAAWG,YAAYC,OAAOJ,WAAWK,mBAAmB;IACjEA,kBAAkBC,KAAK;MACrBC,WAAWH,OAAOI,gBAAgBC;MAClCC,SAAgBR,kBAAW,WAAW,EAAES,QAAO,GAAE;AAC/C,cAAM,EAAEC,MAAK,IAAK,OAAOZ,WAAWa,IAAIT,OAAOJ,WAAWc,QAAQ;AAClE,cAAM,EAAEC,SAASC,QAAO,IAAK,OAAOhB,WAAWa,IAAII,oBAAoBC,KAAK;AAC5E,eAAcC,kBAAW,MAAMC,MAAMC,YAAYT,OAAO;UAAEU,QAAQX;QAAQ,GAAG;UAAEY,SAAS;QAAM,CAAA,CAAA,EAAIC,KACzFC,eAAQ,CAACC,SAAAA;AACd;eAAIC,MAAMD,KAAKE,MAAM;YAAGC,QAAQ,CAACC,GAAGC,UAAAA;AAClC,kBAAMC,UAAUN,KAAKO,MAAM,GAAGF,KAAAA;AAC9B,kBAAMG,QAAQnB,QAAQiB,OAAAA;AACtB,gBAAI,CAACE,MAAMC,MAAM;AACfnB,sBAAQgB,SAAS,QAAQ,IAAA;YAC3B;UACF,CAAA;QACF,CAAA,GACOI,gBAAS,MAAA;AACdC,cAAI,0BAA0B;YAAE1B;UAAQ,GAAA;;;;;;AACxC,iBAAc2B;QAChB,CAAA,CAAA;MAEJ,CAAA;IACF,CAAA;GACD;AACH,CAAA,CAAA;",
|
|
6
|
-
"names": ["Effect", "Capability", "Common", "log", "OperationResolver", "Graph", "Capability", "makeModule", "fnUntraced", "contributes", "Common", "OperationResolver", "make", "operation", "LayoutOperation", "Expose", "handler", "subject", "graph", "get", "AppGraph", "getItem", "setItem", "NavTreeCapabilities", "State", "tryPromise", "Graph", "waitForPath", "target", "timeout", "pipe", "andThen", "path", "Array", "length", "forEach", "_", "index", "subpath", "slice", "value", "open", "catchAll", "log", "void"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/react-surface/react-surface.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport React from 'react';\n\nimport { Capability, Common } from '@dxos/app-framework';\nimport { Node } from '@dxos/plugin-graph';\n\nimport { CommandsDialogContent, CommandsTrigger, NavTreeContainer, NavTreeDocumentTitle } from '../../components';\nimport { COMMANDS_DIALOG, meta } from '../../meta';\n\nexport default Capability.makeModule(() =>\n Effect.succeed(\n Capability.contributes(Common.Capability.ReactSurface, [\n Common.createSurface({\n id: COMMANDS_DIALOG,\n role: 'dialog',\n filter: (data): data is { props: { selected?: string } } => data.component === COMMANDS_DIALOG,\n component: ({ data, ref }) => <CommandsDialogContent {...data.props} ref={ref} />,\n }),\n Common.createSurface({\n id: `${meta.id}/navigation`,\n role: 'navigation',\n filter: (data): data is { popoverAnchorId?: string; topbar: boolean; current: string } =>\n typeof data.current === 'string',\n component: ({ data, ref }) => {\n return (\n <NavTreeContainer\n tab={data.current}\n popoverAnchorId={data.popoverAnchorId as string | undefined}\n topbar={data.topbar as boolean}\n ref={ref}\n />\n );\n },\n }),\n Common.createSurface({\n id: `${meta.id}/document-title`,\n role: 'document-title',\n component: ({ data }) => (\n <NavTreeDocumentTitle node={Node.isGraphNode(data.subject) ? data.subject : undefined} />\n ),\n }),\n Common.createSurface({\n id: `${meta.id}/search-input`,\n role: 'search-input',\n position: 'fallback',\n component: () => <CommandsTrigger />,\n }),\n ]),\n ),\n);\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;AAIA,YAAYA,YAAY;AACxB,OAAOC,WAAW;AAElB,SAASC,YAAYC,cAAc;AACnC,SAASC,YAAY;AAKrB,IAAA,wBAAeC,WAAWC,WAAW,MAC5BC,eACLF,WAAWG,YAAYC,OAAOJ,WAAWK,cAAc;EACrDD,OAAOE,cAAc;IACnBC,IAAIC;IACJC,MAAM;IACNC,QAAQ,CAACC,SAAmDA,KAAKC,cAAcJ;IAC/EI,WAAW,CAAC,EAAED,MAAME,IAAG,MAAO,sBAAA,cAACC,uBAAAA;MAAuB,GAAGH,KAAKI;MAAOF;;EACvE,CAAA;EACAT,OAAOE,cAAc;IACnBC,IAAI,GAAGS,KAAKT,EAAE;IACdE,MAAM;IACNC,QAAQ,CAACC,SACP,OAAOA,KAAKM,YAAY;IAC1BL,WAAW,CAAC,EAAED,MAAME,IAAG,MAAE;AACvB,aACE,sBAAA,cAACK,kBAAAA;QACCC,KAAKR,KAAKM;QACVG,iBAAiBT,KAAKS;QACtBC,QAAQV,KAAKU;QACbR;;IAGN;EACF,CAAA;EACAT,OAAOE,cAAc;IACnBC,IAAI,GAAGS,KAAKT,EAAE;IACdE,MAAM;IACNG,WAAW,CAAC,EAAED,KAAI,MAChB,sBAAA,cAACW,sBAAAA;MAAqBC,MAAMC,KAAKC,YAAYd,KAAKe,OAAO,IAAIf,KAAKe,UAAUC;;EAEhF,CAAA;EACAvB,OAAOE,cAAc;IACnBC,IAAI,GAAGS,KAAKT,EAAE;IACdE,MAAM;IACNmB,UAAU;IACVhB,WAAW,MAAM,sBAAA,cAACiB,iBAAAA,IAAAA;EACpB,CAAA;CACD,CAAA,CAAA;",
|
|
6
|
-
"names": ["Effect", "React", "Capability", "Common", "Node", "Capability", "makeModule", "succeed", "contributes", "Common", "ReactSurface", "createSurface", "id", "COMMANDS_DIALOG", "role", "filter", "data", "component", "ref", "CommandsDialogContent", "props", "meta", "current", "NavTreeContainer", "tab", "popoverAnchorId", "topbar", "NavTreeDocumentTitle", "node", "Node", "isGraphNode", "subject", "undefined", "position", "CommandsTrigger"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/state/state.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom } from '@effect-atom/atom-react';\nimport * as Effect from 'effect/Effect';\n\nimport { Capability, Common } from '@dxos/app-framework';\nimport { Path } from '@dxos/react-ui-list';\n\nimport { meta } from '../../meta';\nimport { type NavTreeCapabilities as NC, NavTreeCapabilities } from '../../types';\n\nconst KEY = `${meta.id}/state/v1`;\n\n/** Default item state for new entries. */\nconst defaultItemState: NC.NavTreeItemState = { open: false, current: false, alternateTree: false };\n\n/** Default state entries for initial tree structure. */\n// TODO(thure): Initialize these dynamically.\nconst defaultStateEntries: [string, NC.NavTreeItemState][] = [\n ['root', { open: true, current: false }],\n ['root~dxos.org/plugin/space-spaces', { open: true, current: false }],\n ['root~dxos.org/plugin/files', { open: true, current: false }],\n];\n\nconst getInitialState = (): Map<string, NC.NavTreeItemState> => {\n const stringified = localStorage.getItem(KEY);\n if (!stringified) {\n return new Map(defaultStateEntries);\n }\n\n try {\n const cached: [string, { open: boolean; current: boolean }][] = JSON.parse(stringified);\n return new Map(cached.map(([key, value]) => [key, { open: value.open, current: false }]));\n } catch {\n return new Map(defaultStateEntries);\n }\n};\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const registry = yield* Capability.get(Common.Capability.AtomRegistry);\n const layoutAtom = yield* Capability.get(Common.Capability.Layout);\n\n // Backing state for persistence (not reactive).\n const backingState = getInitialState();\n\n // Per-path atom family for fine-grained reactivity.\n // keepAlive prevents atoms from being garbage collected when components unmount,\n // ensuring state is preserved across deletion/restoration cycles.\n const itemAtomFamily = Atom.family((pathString: string) =>\n Atom.make<NC.NavTreeItemState>(backingState.get(pathString) ?? { ...defaultItemState }).pipe(Atom.keepAlive),\n );\n\n const getItemAtom = (path: string[]): Atom.Atom<NC.NavTreeItemState> => {\n const pathString = Path.create(...path);\n return itemAtomFamily(pathString);\n };\n\n const getItem = (path: string[]): NC.NavTreeItemState => {\n return registry.get(getItemAtom(path));\n };\n\n const setItem = (path: string[], key: 'open' | 'current' | 'alternateTree', next: boolean) => {\n const pathString = Path.create(...path);\n const atom = itemAtomFamily(pathString);\n const currentValue = registry.get(atom);\n const newValue = { ...currentValue, [key]: next };\n\n // Update the atom.\n registry.set(atom, newValue);\n\n // Update backing state and persist to localStorage.\n backingState.set(pathString, newValue);\n localStorage.setItem(KEY, JSON.stringify(Array.from(backingState.entries())));\n };\n\n // Subscribe to layout changes to update current state.\n let previous: string[] = [];\n const unsubscribe = registry.subscribe(layoutAtom, (layout) => {\n const removed = previous.filter((id) => !layout.active.includes(id));\n previous = layout.active;\n\n const handleUpdate = () => {\n // Mark removed items as not current.\n removed.forEach((id) => {\n const keys = Array.from(backingState.keys()).filter((key) => Path.last(key) === id);\n keys.forEach((key) => {\n setItem(Path.parts(key), 'current', false);\n });\n });\n\n // Mark active items as current.\n layout.active.forEach((id: string) => {\n const keys = Array.from(new Set([...backingState.keys(), id])).filter((key) => Path.last(key) === id);\n keys.forEach((key) => {\n setItem(Path.parts(key), 'current', true);\n });\n });\n };\n\n // TODO(wittjosiah): This is setTimeout because there's a race between the keys being initialized.\n // Keys are initialized on the first render of an item in the navtree.\n // This could be avoided if the location was a path as well and not just an id.\n const timeout = setTimeout(handleUpdate, 500);\n handleUpdate();\n return () => clearTimeout(timeout);\n });\n\n return Capability.contributes(\n NavTreeCapabilities.State,\n {\n getItem,\n getItemAtom,\n setItem,\n },\n () => Effect.sync(() => unsubscribe()),\n );\n }),\n);\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Atom", "Effect", "Capability", "Common", "Path", "KEY", "meta", "id", "defaultItemState", "open", "current", "alternateTree", "defaultStateEntries", "getInitialState", "stringified", "localStorage", "getItem", "Map", "cached", "JSON", "parse", "map", "key", "value", "Capability", "makeModule", "fnUntraced", "registry", "get", "Common", "AtomRegistry", "layoutAtom", "Layout", "backingState", "itemAtomFamily", "Atom", "family", "pathString", "make", "pipe", "keepAlive", "getItemAtom", "path", "Path", "create", "setItem", "next", "atom", "currentValue", "newValue", "set", "stringify", "Array", "from", "entries", "previous", "unsubscribe", "subscribe", "layout", "removed", "filter", "active", "includes", "handleUpdate", "forEach", "keys", "last", "parts", "Set", "timeout", "setTimeout", "clearTimeout", "contributes", "NavTreeCapabilities", "State", "sync"]
|
|
7
|
-
}
|