@dxos/plugin-navtree 0.8.4-main.bc674ce → 0.8.4-main.c351d160a8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/dist/lib/browser/CommandsDialogContent-2DKIOLJL.mjs +113 -0
  2. package/dist/lib/browser/CommandsDialogContent-2DKIOLJL.mjs.map +7 -0
  3. package/dist/lib/browser/CommandsTrigger-ABODVVMP.mjs +33 -0
  4. package/dist/lib/browser/CommandsTrigger-ABODVVMP.mjs.map +7 -0
  5. package/dist/lib/browser/NavTreeContainer-IQZCK4Y4.mjs +12 -0
  6. package/dist/lib/browser/NavTreeContainer-IQZCK4Y4.mjs.map +7 -0
  7. package/dist/lib/browser/NavTreeDocumentTitle-L6NLLWLD.mjs +26 -0
  8. package/dist/lib/browser/NavTreeDocumentTitle-L6NLLWLD.mjs.map +7 -0
  9. package/dist/lib/browser/{app-graph-builder-RSMA6I22.mjs → app-graph-builder-Z43OTNI2.mjs} +6 -5
  10. package/dist/lib/browser/app-graph-builder-Z43OTNI2.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-YKTYPINZ.mjs → chunk-A4VDCIJC.mjs} +3 -3
  12. package/dist/lib/browser/{chunk-YKTYPINZ.mjs.map → chunk-A4VDCIJC.mjs.map} +1 -1
  13. package/dist/lib/browser/chunk-DINDC6HE.mjs +14 -0
  14. package/dist/lib/browser/chunk-DINDC6HE.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-AGQDZBPL.mjs → chunk-KF26WA4O.mjs} +5 -5
  16. package/dist/lib/browser/{chunk-AGQDZBPL.mjs.map → chunk-KF26WA4O.mjs.map} +3 -3
  17. package/dist/lib/browser/chunk-OGUYILOW.mjs +1462 -0
  18. package/dist/lib/browser/chunk-OGUYILOW.mjs.map +7 -0
  19. package/dist/lib/browser/index.mjs +35 -31
  20. package/dist/lib/browser/index.mjs.map +3 -3
  21. package/dist/lib/browser/{keyboard-32EH3N4K.mjs → keyboard-HYGFQO7T.mjs} +11 -6
  22. package/dist/lib/browser/keyboard-HYGFQO7T.mjs.map +7 -0
  23. package/dist/lib/browser/meta.json +1 -1
  24. package/dist/lib/browser/operation-resolver-VDWVUII5.mjs +49 -0
  25. package/dist/lib/browser/operation-resolver-VDWVUII5.mjs.map +7 -0
  26. package/dist/lib/browser/{react-surface-F6CVMS3Y.mjs → react-surface-LFMKIKNY.mjs} +15 -14
  27. package/dist/lib/browser/react-surface-LFMKIKNY.mjs.map +7 -0
  28. package/dist/lib/browser/{state-EVYQOUI3.mjs → state-CWMNNF7K.mjs} +34 -23
  29. package/dist/lib/browser/state-CWMNNF7K.mjs.map +7 -0
  30. package/dist/types/src/NavTreePlugin.d.ts.map +1 -1
  31. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +1 -1
  32. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -1
  33. package/dist/types/src/capabilities/keyboard/keyboard.d.ts +1 -1
  34. package/dist/types/src/capabilities/keyboard/keyboard.d.ts.map +1 -1
  35. package/dist/types/src/capabilities/operation-resolver/index.d.ts +1 -1
  36. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -1
  37. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +2 -2
  38. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -1
  39. package/dist/types/src/capabilities/react-surface/index.d.ts +1 -1
  40. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -1
  41. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +2 -2
  42. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -1
  43. package/dist/types/src/capabilities/state/state.d.ts +1 -1
  44. package/dist/types/src/capabilities/state/state.d.ts.map +1 -1
  45. package/dist/types/src/components/NavTree/NavTree.d.ts +10 -32
  46. package/dist/types/src/components/NavTree/NavTree.d.ts.map +1 -1
  47. package/dist/types/src/components/NavTree/NavTree.stories.d.ts +2 -5
  48. package/dist/types/src/components/NavTree/NavTree.stories.d.ts.map +1 -1
  49. package/dist/types/src/components/{NavTreeContext.d.ts → NavTreeContext/NavTreeContext.d.ts} +1 -1
  50. package/dist/types/src/components/NavTreeContext/NavTreeContext.d.ts.map +1 -0
  51. package/dist/types/src/components/NavTreeContext/index.d.ts +2 -0
  52. package/dist/types/src/components/NavTreeContext/index.d.ts.map +1 -0
  53. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts +4 -2
  54. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts.map +1 -1
  55. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.stories.d.ts +1 -1
  56. package/dist/types/src/components/NavTreeItem/NavTreeItemColumns.d.ts.map +1 -1
  57. package/dist/types/src/components/Sidebar/L0Menu.d.ts +4 -1
  58. package/dist/types/src/components/Sidebar/L0Menu.d.ts.map +1 -1
  59. package/dist/types/src/components/Sidebar/L1Panel.d.ts +3 -6
  60. package/dist/types/src/components/Sidebar/L1Panel.d.ts.map +1 -1
  61. package/dist/types/src/components/Sidebar/L1Tabs.d.ts +3 -2
  62. package/dist/types/src/components/Sidebar/L1Tabs.d.ts.map +1 -1
  63. package/dist/types/src/components/UserAccountAvatar/UserAccountAvatar.stories.d.ts.map +1 -1
  64. package/dist/types/src/components/index.d.ts +0 -3
  65. package/dist/types/src/components/index.d.ts.map +1 -1
  66. package/dist/types/src/components/types.d.ts +5 -13
  67. package/dist/types/src/components/types.d.ts.map +1 -1
  68. package/dist/types/src/{components/CommandsDialog/CommandsDialog.d.ts → containers/CommandsDialogContent/CommandsDialogContent.d.ts} +1 -1
  69. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.d.ts.map +1 -0
  70. package/dist/types/src/containers/CommandsDialogContent/index.d.ts +3 -0
  71. package/dist/types/src/containers/CommandsDialogContent/index.d.ts.map +1 -0
  72. package/dist/types/src/containers/CommandsTrigger/CommandsTrigger.d.ts.map +1 -0
  73. package/dist/types/src/containers/CommandsTrigger/index.d.ts +3 -0
  74. package/dist/types/src/containers/CommandsTrigger/index.d.ts.map +1 -0
  75. package/dist/types/src/containers/NavTreeContainer/NavTreeContainer.d.ts +9 -0
  76. package/dist/types/src/containers/NavTreeContainer/NavTreeContainer.d.ts.map +1 -0
  77. package/dist/types/src/containers/NavTreeContainer/index.d.ts +3 -0
  78. package/dist/types/src/containers/NavTreeContainer/index.d.ts.map +1 -0
  79. package/dist/types/src/containers/NavTreeDocumentTitle/NavTreeDocumentTitle.d.ts.map +1 -0
  80. package/dist/types/src/containers/NavTreeDocumentTitle/index.d.ts +3 -0
  81. package/dist/types/src/containers/NavTreeDocumentTitle/index.d.ts.map +1 -0
  82. package/dist/types/src/containers/index.d.ts +7 -0
  83. package/dist/types/src/containers/index.d.ts.map +1 -0
  84. package/dist/types/src/experimental/Tree.stories.d.ts +18 -4
  85. package/dist/types/src/experimental/Tree.stories.d.ts.map +1 -1
  86. package/dist/types/src/hooks/index.d.ts +5 -0
  87. package/dist/types/src/hooks/index.d.ts.map +1 -0
  88. package/dist/types/src/hooks/useActions.d.ts +5 -0
  89. package/dist/types/src/hooks/useActions.d.ts.map +1 -0
  90. package/dist/types/src/hooks/useLoadDescendents.d.ts +6 -0
  91. package/dist/types/src/hooks/useLoadDescendents.d.ts.map +1 -0
  92. package/dist/types/src/hooks/useNavTreeModel.d.ts +7 -0
  93. package/dist/types/src/hooks/useNavTreeModel.d.ts.map +1 -0
  94. package/dist/types/src/{hooks.d.ts → hooks/useNavTreeState.d.ts} +2 -14
  95. package/dist/types/src/hooks/useNavTreeState.d.ts.map +1 -0
  96. package/dist/types/src/meta.d.ts.map +1 -1
  97. package/dist/types/src/testing/generator.d.ts +3 -3
  98. package/dist/types/src/testing/generator.d.ts.map +1 -1
  99. package/dist/types/src/types/events.d.ts.map +1 -1
  100. package/dist/types/src/util.d.ts +5 -1
  101. package/dist/types/src/util.d.ts.map +1 -1
  102. package/dist/types/tsconfig.tsbuildinfo +1 -1
  103. package/package.json +43 -42
  104. package/src/NavTreePlugin.tsx +22 -24
  105. package/src/capabilities/app-graph-builder/app-graph-builder.ts +4 -3
  106. package/src/capabilities/keyboard/keyboard.ts +6 -5
  107. package/src/capabilities/operation-resolver/operation-resolver.ts +23 -19
  108. package/src/capabilities/react-surface/react-surface.tsx +12 -13
  109. package/src/capabilities/state/state.ts +41 -13
  110. package/src/components/NavTree/NavTree.stories.tsx +20 -18
  111. package/src/components/NavTree/NavTree.tsx +61 -20
  112. package/src/components/{NavTreeContext.tsx → NavTreeContext/NavTreeContext.tsx} +1 -1
  113. package/src/components/NavTreeContext/index.ts +5 -0
  114. package/src/components/NavTreeItem/NavTreeItemAction.stories.tsx +2 -2
  115. package/src/components/NavTreeItem/NavTreeItemAction.tsx +40 -23
  116. package/src/components/NavTreeItem/NavTreeItemColumns.tsx +40 -14
  117. package/src/components/Sidebar/L0Menu.tsx +80 -83
  118. package/src/components/Sidebar/L1Panel.tsx +244 -90
  119. package/src/components/Sidebar/L1Tabs.tsx +13 -3
  120. package/src/components/UserAccountAvatar/UserAccountAvatar.stories.tsx +2 -3
  121. package/src/components/UserAccountAvatar/UserAccountAvatar.tsx +1 -1
  122. package/src/components/index.ts +0 -3
  123. package/src/components/types.ts +12 -17
  124. package/src/{components/CommandsDialog/CommandsDialog.tsx → containers/CommandsDialogContent/CommandsDialogContent.tsx} +19 -13
  125. package/src/containers/CommandsDialogContent/index.ts +7 -0
  126. package/src/{components/CommandsDialog → containers/CommandsTrigger}/CommandsTrigger.tsx +4 -4
  127. package/src/containers/CommandsTrigger/index.ts +7 -0
  128. package/src/{components → containers/NavTreeContainer}/NavTreeContainer.tsx +75 -141
  129. package/src/containers/NavTreeContainer/index.ts +6 -0
  130. package/src/{components → containers/NavTreeDocumentTitle}/NavTreeDocumentTitle.tsx +1 -1
  131. package/src/containers/NavTreeDocumentTitle/index.ts +7 -0
  132. package/src/containers/index.ts +12 -0
  133. package/src/experimental/Tree.stories.tsx +54 -57
  134. package/src/experimental/Tree.tsx +3 -3
  135. package/src/hooks/index.ts +8 -0
  136. package/src/hooks/useActions.ts +34 -0
  137. package/src/hooks/useLoadDescendents.ts +23 -0
  138. package/src/hooks/useNavTreeModel.ts +118 -0
  139. package/src/{hooks.ts → hooks/useNavTreeState.ts} +3 -34
  140. package/src/meta.ts +2 -2
  141. package/src/testing/app-graph-builder.ts +5 -5
  142. package/src/testing/generator.ts +4 -4
  143. package/src/types/capabilities.ts +1 -1
  144. package/src/types/events.ts +3 -2
  145. package/src/util.ts +18 -4
  146. package/dist/lib/browser/app-graph-builder-RSMA6I22.mjs.map +0 -7
  147. package/dist/lib/browser/chunk-6YPQ625I.mjs +0 -1293
  148. package/dist/lib/browser/chunk-6YPQ625I.mjs.map +0 -7
  149. package/dist/lib/browser/keyboard-32EH3N4K.mjs.map +0 -7
  150. package/dist/lib/browser/operation-resolver-IB75DC5O.mjs +0 -52
  151. package/dist/lib/browser/operation-resolver-IB75DC5O.mjs.map +0 -7
  152. package/dist/lib/browser/react-surface-F6CVMS3Y.mjs.map +0 -7
  153. package/dist/lib/browser/state-EVYQOUI3.mjs.map +0 -7
  154. package/dist/types/src/components/CommandsDialog/CommandsDialog.d.ts.map +0 -1
  155. package/dist/types/src/components/CommandsDialog/CommandsTrigger.d.ts.map +0 -1
  156. package/dist/types/src/components/CommandsDialog/index.d.ts +0 -3
  157. package/dist/types/src/components/CommandsDialog/index.d.ts.map +0 -1
  158. package/dist/types/src/components/NavTreeContainer.d.ts +0 -16
  159. package/dist/types/src/components/NavTreeContainer.d.ts.map +0 -1
  160. package/dist/types/src/components/NavTreeContext.d.ts.map +0 -1
  161. package/dist/types/src/components/NavTreeDocumentTitle.d.ts.map +0 -1
  162. package/dist/types/src/hooks.d.ts.map +0 -1
  163. package/src/components/CommandsDialog/index.ts +0 -6
  164. /package/dist/types/src/{components/CommandsDialog → containers/CommandsTrigger}/CommandsTrigger.d.ts +0 -0
  165. /package/dist/types/src/{components → containers/NavTreeDocumentTitle}/NavTreeDocumentTitle.d.ts +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/containers/NavTreeContainer/NavTreeContainer.tsx", "../../../src/components/NavTree/NavTree.tsx", "../../../src/hooks/useActions.ts", "../../../src/hooks/useLoadDescendents.ts", "../../../src/hooks/useNavTreeModel.ts", "../../../src/util.ts", "../../../src/hooks/useNavTreeState.ts", "../../../src/components/NavTreeContext/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"],
4
+ "sourcesContent": ["//\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, useRef } from 'react';\n\nimport { Surface, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { 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';\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 role='navtree-item-end' 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 { invokeSync, 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.id);\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 invokeSync(LayoutOperation.UpdateSidebar, {\n state:\n node.id === activeTab\n ? currentSidebarState === 'expanded'\n ? latestIsLg\n ? 'collapsed'\n : 'closed'\n : 'expanded'\n : 'expanded',\n });\n\n invokeSync(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 invokeSync(LayoutOperation.Open, { subject: [item.id] });\n }\n }\n },\n [invokeSync, graph],\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 invokeSync(LayoutOperation.Open, { subject: [node.id], key: node.properties.key });\n } else if (option) {\n invokeSync(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 invokeSync(LayoutOperation.UpdateSidebar, { state: 'closed' });\n }\n },\n [graph, invokeSync, invokePromise, getItem, runAction, isLg],\n );\n\n const handleBack = useCallback(() => invokeSync(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 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 const setAlternateTree = useCallback(\n (path: string[], open: boolean) => {\n setItem(path, 'alternateTree', open);\n },\n [setItem],\n );\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 setAlternateTree,\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 setAlternateTree,\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", "//\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 { Tabs } from '@dxos/react-ui-tabs';\nimport { byPosition } from '@dxos/util';\n\nimport { useLoadDescendents } from '../../hooks';\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' 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 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 topLevelActions,\n l0Items: topLevelWorkspaces,\n pinnedItems,\n userAccountItem,\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 { useMemo } from 'react';\n\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { Graph, Node, useActions as useGraphActions } from '@dxos/plugin-graph';\n\nimport { type FlattenedActions } from '../types';\n\n/** Returns flattened actions and grouped sub-actions for a given graph node. */\nexport const useActions = (node: Node.Node): FlattenedActions => {\n const { graph } = useAppGraph();\n const actions = useGraphActions(graph, node.id);\n\n return useMemo(() => {\n return 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// Copyright 2025 DXOS.org\n//\n\nimport { useEffect } from 'react';\n\nimport { type Node } from '@dxos/app-graph';\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { Graph } from '@dxos/plugin-graph';\n\n/**\n * Expands a root node in the app graph.\n */\nexport const useLoadDescendents = (root?: Node.Node) => {\n const { graph } = useAppGraph();\n useEffect(() => {\n if (!root) {\n return;\n }\n\n Graph.expand(graph, root.id, 'child');\n }, [graph, root]);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom } from '@effect-atom/atom-react';\nimport * as Option from 'effect/Option';\nimport { useMemo } from 'react';\n\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { PLANK_COMPANION_TYPE } from '@dxos/plugin-deck/types';\nimport { type Node } from '@dxos/plugin-graph';\nimport { Path, type TreeModel } from '@dxos/react-ui-list';\nimport { mx } from '@dxos/ui-theme';\n\nimport { type NavTreeItemGraphNode } from '../types';\nimport { filterItems } from '../util';\n\nimport { useNavTreeState } from './useNavTreeState';\n\n// TODO(wittjosiah): Move companion/hidden nodes to their own edge categories so this filter is unnecessary.\nconst isVisibleChild = (node: Node.Node): boolean =>\n node.type !== PLANK_COMPANION_TYPE && node.properties.disposition !== 'hidden';\n\n/** Create an atom family for item display props keyed by path. */\nconst createItemPropsFamily = (graph: ReturnType<typeof useAppGraph>['graph']) =>\n Atom.family((pathKey: string) => {\n const path = Path.parts(pathKey);\n const id = Path.last(pathKey);\n return Atom.make((get) => {\n const nodeOpt = get(graph.node(id));\n const node = Option.getOrElse(nodeOpt, () => undefined);\n if (!node) {\n return { id, label: id };\n }\n const safeChildren = get(graph.connections(node.id, 'child')).filter((child) => !path.includes(child.id));\n const visibleChildren = safeChildren.filter(isVisibleChild);\n const parentOf =\n visibleChildren.length > 0\n ? visibleChildren.map((child) => child.id)\n : node.properties.role === 'branch'\n ? []\n : undefined;\n const parentId = path.length >= 2 ? path[path.length - 2] : undefined;\n const parentNode = parentId ? Option.getOrElse(get(graph.node(parentId)), () => undefined) : undefined;\n const droppable =\n node.properties.droppable === false || parentNode?.properties.childrenDroppable === false ? false : undefined;\n\n return {\n id: node.id,\n parentOf,\n disabled: node.properties.disabled,\n draggable: node.properties.draggable,\n droppable,\n label: node.properties.label ?? node.id,\n className: mx(node.properties.className, node.properties.modified && 'italic'),\n headingClassName: node.properties.headingClassName,\n icon: node.properties.icon,\n iconHue: node.properties.iconHue,\n testId: node.properties.testId,\n };\n }).pipe(Atom.keepAlive);\n });\n\n/** Create an atom family for outbound child IDs keyed by parent ID (pre-sorted by position on write). */\nconst createChildIdsFamily = (graph: ReturnType<typeof useAppGraph>['graph']) =>\n Atom.family((id: string) =>\n Atom.make((get) => get(graph.connections(id, 'child')).map((child) => child.id)).pipe(Atom.keepAlive),\n );\n\n/** Create an atom family for item resolution keyed by ID. */\nconst createItemFamily = (graph: ReturnType<typeof useAppGraph>['graph']) =>\n Atom.family((id: string) =>\n Atom.make((get) => {\n const node = Option.getOrElse(get(graph.node(id)), () => undefined);\n return node && filterItems(node) ? node : undefined;\n }).pipe(Atom.keepAlive),\n );\n\n/** Create an atom family for open state keyed by path. */\nconst createItemOpenFamily = (getItemAtom: ReturnType<typeof useNavTreeState>['getItemAtom']) =>\n Atom.family((pathKey: string) => {\n const path = Path.parts(pathKey);\n const stateAtom = getItemAtom(path);\n return Atom.make((get) => get(stateAtom).open).pipe(Atom.keepAlive);\n });\n\n/** Create an atom family for current (selected) state keyed by path. */\nconst createItemCurrentFamily = (getItemAtom: ReturnType<typeof useNavTreeState>['getItemAtom']) =>\n Atom.family((pathKey: string) => {\n const path = Path.parts(pathKey);\n const stateAtom = getItemAtom(path);\n return Atom.make((get) => get(stateAtom).current).pipe(Atom.keepAlive);\n });\n\n/**\n * Creates a TreeModel backed by the app graph and navtree state.\n */\nexport const useNavTreeModel = (rootId: string): TreeModel<NavTreeItemGraphNode> => {\n const { graph } = useAppGraph();\n const { getItemAtom } = useNavTreeState();\n\n const itemPropsFamily = useMemo(() => createItemPropsFamily(graph), [graph]);\n const childIdsFamily = useMemo(() => createChildIdsFamily(graph), [graph]);\n const itemFamily = useMemo(() => createItemFamily(graph), [graph]);\n const itemOpenFamily = useMemo(() => createItemOpenFamily(getItemAtom), [getItemAtom]);\n const itemCurrentFamily = useMemo(() => createItemCurrentFamily(getItemAtom), [getItemAtom]);\n\n return useMemo(\n () => ({\n item: (id: string) => itemFamily(id),\n itemProps: (path: string[]) => itemPropsFamily(Path.create(...path)),\n itemOpen: (path: string[]) => itemOpenFamily(Path.create(...path)),\n itemCurrent: (path: string[]) => itemCurrentFamily(Path.create(...path)),\n childIds: (parentId?: string) => childIdsFamily(parentId ?? rootId),\n }),\n [itemFamily, itemPropsFamily, itemOpenFamily, itemCurrentFamily, childIdsFamily, rootId],\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, Node.childRelation('inbound')).find(\n (n: Node.Node) => n.id === parentId,\n ) as NavTreeItemGraphNode | 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, 'child')\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\n/**\n * Determines whether a node should be visible based on its disposition.\n */\nexport const 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\nexport const l0ItemType = (item: Node.Node) => {\n if (Node.isActionLike(item)) {\n return 'action';\n } else {\n return 'tab';\n }\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Atom, useAtomValue } from '@effect-atom/atom-react';\nimport { useMemo } from 'react';\n\nimport { useCapability } from '@dxos/app-framework/ui';\n\nimport { NavTreeCapabilities } from '../types';\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 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 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 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 { 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';\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 =\n 'group/l0item flex w-full justify-center items-center relative data[type!=\"collection\"]:cursor-pointer dx-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 = memo(\n forwardRef<HTMLElement, PropsWithChildren<L0ItemRootProps>>(\n ({ item, parent, path, onMouseEnter, children }, forwardedRef) => {\n const { model } = useNavTreeContext();\n const itemPath = useMemo(() => [...path, item.id], [item.id, path]);\n const { id, testId } = useAtomValue(model.itemProps(itemPath));\n const type = l0ItemType(item);\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 onMouseEnter={onMouseEnter}\n >\n {children}\n </Tabs.TabPrimitive>\n </Tooltip.Trigger>\n );\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 start-0 inset-y-2 w-1 bg-accent-surface rounded-ie',\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.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 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 role='none'\n data-frame={true}\n {...(hue && { style: { background: `var(--color-${hue}-surface)` } })}\n className={mx(\n l0ItemContent,\n pinned\n ? 'p-2 group-hover/l0item:bg-active-surface'\n : 'w-(--dx-l0-avatar-size) h-(--dx-l0-avatar-size) bg-active-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.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(--color-${hue}-surface-text)` } };\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 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.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-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-toolbar-surface border-e border-subdued-separator dx-app-drag pb-[env(safe-area-inset-bottom)]',\n ]}\n >\n {/* TODO(wittjosiah): Use L0Item trigger. */}\n <Menu.Root onAction={handleAction}>\n <Menu.Trigger asChild data-testid='spacePlugin.addSpace'>\n <div role='none' className='grid place-items-center'>\n <IconButton variant='ghost' icon='ph--list--regular' iconOnly label={t('app menu label')} size={5} />\n </div>\n </Menu.Trigger>\n <Menu.Content group={parent} items={menuActions} />\n </Menu.Root>\n\n {/* Space list. */}\n <ScrollArea.Root thin orientation='vertical'>\n <ScrollArea.Viewport>\n <div\n role='none'\n className={mx([\n 'flex flex-col gap-2 pt-1',\n '[body[data-platform=\"macos\"]_&]:py-[30px]',\n '[body[data-platform=\"ios\"]_&]:py-[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 onItemHover={onItemHover}\n {...(hasRearrangeableItems && { onRearrange: handleRearrange })}\n />\n ))}\n </div>\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n\n {/* Actions. */}\n <div role='none' 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 role='none' 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 Effect from 'effect/Effect';\nimport * as Option from 'effect/Option';\nimport React, { memo, useCallback, useMemo } from 'react';\n\nimport { Node } from '@dxos/app-graph';\nimport { isPinnedWorkspace } from '@dxos/app-toolkit';\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { Graph, useActionRunner, useConnections, useEdges } from '@dxos/plugin-graph';\nimport { DensityProvider, IconButton, ScrollArea, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { useAttended } from '@dxos/react-ui-attention';\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 { useActions, useIsAlternateTree, useLoadDescendents } from '../../hooks';\nimport { meta } from '../../meta';\nimport { NAV_TREE_ITEM } from '../NavTree';\nimport { useNavTreeContext } from '../NavTreeContext';\nimport { NavTreeItemAction, NavTreeItemColumns } from '../NavTreeItem';\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.id);\n const title = toLocalizedString(item.properties.label, t);\n const isActivated = useIsActivatedWorkspace(item);\n const shouldRenderContent = isCurrent || isActivated;\n\n return (\n <Tabs.Tabpanel\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.Tabpanel>\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 const alternateTree = useAlternateTreeItem(item);\n const alternatePath = useMemo(() => [...path, item.id], [item.id, path]);\n const isAlternate = useIsAlternateTree(alternatePath, item);\n\n return (\n <DensityProvider density='fine'>\n <L1PanelHeader path={path} item={item} onBack={onBack} />\n <ScrollArea.Root thin orientation='vertical'>\n <ScrollArea.Viewport>\n {isAlternate && alternateTree ? (\n <Tree\n model={navTreeContext.model}\n id={alternateTree.id}\n rootId={alternateTree.id}\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 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 ) : (\n <Tree\n model={navTreeContext.model}\n id={item.id}\n rootId={item.id}\n path={path}\n levelOffset={5}\n gridTemplateColumns='[tree-row-start] 1fr min-content min-content min-content [tree-row-end]'\n draggable\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 )}\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.id);\n const { renderItemEnd: ItemEnd } = useNavTreeContext();\n const title = toLocalizedString(item.properties.label, t);\n const backCapableWorkspace = isPinnedWorkspace(item.id);\n\n const { primaryAction, groupedActions, menuActions, onAction } = useL1MenuActions({ item, path });\n useLoadDescendents(item);\n\n // TODO(wittjosiah): Hack to only show containsAttended when attended item is within alternate tree (e.g. settings).\n // Since every object in the space is a descendant of the space node, we'd otherwise always show containsAttended.\n const alternateTree = useAlternateTreeItem(item);\n const attended = useAttended();\n const alternateTreeOpen = useMemo(() => {\n if (!alternateTree) {\n return true;\n }\n const hasAlternateAttended = attended.some(\n (attendedId) => attendedId === alternateTree.id || attendedId.startsWith(alternateTree.id + '/'),\n );\n return !hasAlternateAttended;\n }, [alternateTree, attended]);\n\n return (\n <div className='flex w-full items-center border-b border-subdued-separator dx-app-drag dx-density-coarse pe-1'>\n {backCapableWorkspace ? (\n <IconButton\n size={5}\n density='coarse'\n classNames={['shrink-0 px-2 pointer-fine:px-1', hoverableControlItem, hoverableOpenControlItem]}\n variant='ghost'\n icon='ph--caret-left--regular'\n iconOnly\n label={t('button back')}\n data-testid='treeView.primaryTreeButton'\n onClick={() => onBack?.()}\n />\n ) : (\n <div className='w-6' />\n )}\n <h2 className='flex-1 truncate min-w-0'>{title}</h2>\n {/* TODO(wittjosiah): Reconcile with NavTreeItemColumns. */}\n <div role='none' className='contents dx-app-no-drag'>\n {primaryAction?.properties?.disposition === 'list-item-primary' && !primaryAction?.properties?.disabled && (\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 path={path}\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 )}\n {menuActions.length === 1 && (\n <IconButton\n size={5}\n density='coarse'\n classNames={['shrink-0 px-2 pointer-fine:px-1', hoverableControlItem, hoverableOpenControlItem]}\n variant='ghost'\n icon={menuActions[0].properties?.icon ?? 'ph--placeholder--regular'}\n iconOnly\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 {menuActions.length > 1 && (\n <Menu.Root caller={NAV_TREE_ITEM} onAction={onAction}>\n <Menu.Trigger asChild>\n <IconButton\n size={5}\n density='coarse'\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 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 {ItemEnd && <ItemEnd node={item} open={alternateTreeOpen} />}\n </div>\n </div>\n );\n};\n\n/**\n * Builds the menu actions for the L1 panel header, combining graph actions with a synthetic settings/back action.\n */\nconst useL1MenuActions = ({ item, path }: Pick<L1PanelProps, 'item' | 'path'>) => {\n const { t } = useTranslation(meta.id);\n const { setAlternateTree } = useNavTreeContext();\n const { graph } = useAppGraph();\n const runAction = useActionRunner();\n\n const alternateTree = useAlternateTreeItem(item);\n const alternatePath = useMemo(() => [...path, item.id], [item.id, path]);\n const isAlternate = useIsAlternateTree(alternatePath, item);\n\n // Graph actions.\n const { actions: actionsProp, groupedActions } = useActions(item);\n const [primaryAction, ...secondaryActions] = actionsProp.toSorted((a, _b) =>\n a.properties?.disposition === 'list-item-primary' ? -1 : 1,\n );\n\n const graphMenuActions = (\n primaryAction?.properties?.disposition === 'list-item-primary' ? secondaryActions : actionsProp\n )\n .flatMap((action) => (Node.isAction(action) ? [action] : []))\n .filter((a) => ['list-item', 'list-item-primary'].includes(a.properties?.disposition));\n\n // Synthetic settings/back action.\n const settingsActionId = `${item.id}~settings`;\n const settingsAction = useMemo((): Node.Action | undefined => {\n if (!alternateTree) {\n return undefined;\n }\n return {\n id: settingsActionId,\n type: Node.ActionType,\n data: () => Effect.void,\n properties: {\n label: isAlternate ? ['button back', { ns: meta.id }] : (alternateTree.properties.label ?? alternateTree.id),\n icon: isAlternate\n ? 'ph--arrow-u-down-left--regular'\n : (alternateTree.properties.icon ?? 'ph--placeholder--regular'),\n disposition: 'list-item',\n testId: isAlternate ? 'navtree.backToSpace' : 'navtree.spaceSettings',\n },\n } as Node.Action;\n }, [alternateTree, isAlternate, settingsActionId, t]);\n\n const menuActions = useMemo(\n () => [...graphMenuActions, ...(settingsAction ? [settingsAction] : [])],\n [graphMenuActions, settingsAction],\n );\n\n const onAction = useCallback(\n (action: Node.Action, params?: Node.InvokeProps) => {\n if (action.id === settingsActionId) {\n if (alternateTree && !isAlternate) {\n Graph.expand(graph, alternateTree.id, 'child');\n }\n setAlternateTree?.(alternatePath, !isAlternate);\n } else {\n void runAction(action, { ...params, path });\n }\n },\n [settingsActionId, setAlternateTree, alternatePath, isAlternate, runAction, graph, alternateTree, path],\n );\n\n return { primaryAction, groupedActions, menuActions, onAction };\n};\n\n/** Finds the first child with disposition 'alternate-tree' using graph connections directly. */\nconst useAlternateTreeItem = (item: Node.Node): Node.Node | undefined => {\n const { graph } = useAppGraph();\n const connections = useConnections(graph, item.id, 'child');\n return connections.find((node) => node.properties.disposition === 'alternate-tree');\n};\n\nexport const L1Panel = memo(L1Panel$);\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 { 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\nexport type NavTreeItemActionMenuProps = ActionProperties & {\n parent: Node.Node;\n path?: string[];\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 path,\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 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 === 'coarse' ? coarseActionButtonProps : fineActionButtonProps)}\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 />\n </Menu.Trigger>\n <Menu.Content group={parent} items={menuActions as MenuItem[]} />\n </Menu.Root>\n );\n};\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 === 'coarse' ? coarseActionButtonProps : fineActionButtonProps)}\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 parent: node,\n path,\n ...props\n}: 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} path={path} {...menuActions[0]} />\n ) : (\n <NavTreeItemActionDropdownMenu {...props} label={baseLabel} parent={node} path={path} menuActions={menuActions} />\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { Fragment, memo, useMemo } from 'react';\n\nimport { Node } from '@dxos/app-graph';\nimport { Popover, Treegrid, toLocalizedString, useTranslation } from '@dxos/react-ui';\n\nimport { useActions } 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 { renderItemEnd: ItemEnd, popoverAnchorId } = useNavTreeContext();\n\n const level = path.length - 2;\n const { actions: actionsProp, groupedActions } = useActions(item);\n const sortedActions = useMemo(\n () =>\n actionsProp.toSorted((actionA, actionB) => {\n const primaryA = actionA.properties?.disposition === 'list-item-primary';\n const primaryB = actionB.properties?.disposition === 'list-item-primary';\n if (primaryA && !primaryB) {\n return -1;\n }\n if (primaryB && !primaryA) {\n return 1;\n }\n return 0;\n }),\n [actionsProp],\n );\n const [primaryAction, ...secondaryActions] = sortedActions;\n\n const actions = useMemo(\n () =>\n (primaryAction?.properties?.disposition === 'list-item-primary' ? secondaryActions : sortedActions)\n .flatMap((action) => (Node.isAction(action) ? [action] : []))\n .filter((a) => ['list-item', 'list-item-primary'].includes(a.properties?.disposition)),\n [sortedActions, primaryAction],\n );\n\n const primaryMenuActions = useMemo(\n () =>\n primaryAction\n ? Node.isAction(primaryAction)\n ? [primaryAction]\n : groupedActions[primaryAction?.id ?? '']\n : undefined,\n [primaryAction, groupedActions],\n );\n\n const ActionRoot = popoverAnchorId === `${NAV_TREE_ITEM}:${item.id}` ? Popover.Anchor : Fragment;\n\n return (\n <div role='none' className='contents dx-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 path={path}\n monolithic={Node.isAction(primaryAction)}\n menuActions={primaryMenuActions}\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 path={path}\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' | '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": ["monitorForElements", "extractInstruction", "React", "forwardRef", "memo", "useCallback", "useEffect", "useMemo", "useRef", "Surface", "useOperationInvoker", "LayoutOperation", "useAppGraph", "useLayout", "Graph", "Node", "useActionRunner", "useMediaQuery", "useSidebars", "isTreeData", "arrayMove", "React", "forwardRef", "useMemo", "useAppGraph", "Node", "useConnections", "useActions", "useGraphActions", "Tabs", "byPosition", "useMemo", "useAppGraph", "Graph", "Node", "useActions", "useGraphActions", "useActions", "node", "graph", "useAppGraph", "actions", "useGraphActions", "id", "useMemo", "reduce", "acc", "arg", "properties", "disposition", "push", "Node", "isAction", "actionGroup", "Graph", "getActions", "groupedActions", "useEffect", "useAppGraph", "Graph", "useLoadDescendents", "root", "graph", "useAppGraph", "useEffect", "Graph", "expand", "id", "Atom", "Option", "useMemo", "useAppGraph", "PLANK_COMPANION_TYPE", "Path", "mx", "Graph", "Node", "isNonNullable", "getParent", "graph", "node", "path", "parentId", "length", "Graph", "getConnections", "id", "Node", "childRelation", "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", "filterItems", "action", "isAction", "l0ItemType", "item", "isActionLike", "useAtomValue", "useMemo", "useCapability", "useNavTreeState", "useCapability", "NavTreeCapabilities", "State", "useNavTreeItemState", "path", "getItemAtom", "pathKey", "useMemo", "join", "atom", "useAtomValue", "useIsAlternateTree", "_item", "alternateTree", "isVisibleChild", "node", "type", "PLANK_COMPANION_TYPE", "properties", "disposition", "createItemPropsFamily", "graph", "Atom", "family", "pathKey", "path", "Path", "parts", "id", "last", "make", "get", "nodeOpt", "getOrElse", "undefined", "label", "safeChildren", "connections", "filter", "child", "includes", "visibleChildren", "parentOf", "length", "map", "role", "parentId", "parentNode", "droppable", "childrenDroppable", "disabled", "draggable", "className", "mx", "modified", "headingClassName", "icon", "iconHue", "testId", "pipe", "keepAlive", "createChildIdsFamily", "createItemFamily", "filterItems", "createItemOpenFamily", "getItemAtom", "stateAtom", "open", "createItemCurrentFamily", "current", "useNavTreeModel", "rootId", "useAppGraph", "useNavTreeState", "itemPropsFamily", "useMemo", "childIdsFamily", "itemFamily", "itemOpenFamily", "itemCurrentFamily", "item", "itemProps", "create", "itemOpen", "itemCurrent", "childIds", "createContext", "useContext", "raise", "NavTreeContext", "createContext", "useNavTreeContext", "useContext", "raise", "Error", "combine", "draggable", "dropTargetForElements", "preserveOffsetOnSource", "scrollJustEnoughIntoView", "attachClosestEdge", "extractClosestEdge", "useAtomValue", "React", "forwardRef", "memo", "useCallback", "useLayoutEffect", "useMemo", "useRef", "useState", "DxAvatar", "useActionRunner", "Icon", "IconButton", "ListItem", "ScrollArea", "Tooltip", "toLocalizedString", "useMediaQuery", "useTranslation", "Menu", "Tabs", "mx", "arrayMove", "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", "l0ItemContent", "L0ItemRoot", "memo", "forwardRef", "onMouseEnter", "children", "forwardedRef", "model", "itemPath", "useMemo", "id", "testId", "useAtomValue", "itemProps", "l0ItemType", "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", "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", "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", "Menu", "Root", "onAction", "data-testid", "IconButton", "iconOnly", "Content", "group", "items", "ScrollArea", "thin", "orientation", "Viewport", "key", "UserAccountAvatar", "userId", "emoji", "status", "Effect", "Option", "React", "memo", "useCallback", "useMemo", "Node", "isPinnedWorkspace", "useAppGraph", "Graph", "useActionRunner", "useConnections", "useEdges", "DensityProvider", "IconButton", "ScrollArea", "toLocalizedString", "useTranslation", "useAttended", "Tree", "Menu", "Tabs", "hoverableControlItem", "hoverableOpenControlItem", "React", "useCallback", "useActionRunner", "IconButton", "toLocalizedString", "useDensityContext", "useTranslation", "Menu", "hoverableControlItem", "hoverableOpenControlItem", "fallbackIcon", "fineActionButtonProps", "size", "density", "coarseActionButtonProps", "NavTreeItemActionDropdownMenu", "parent", "path", "label", "icon", "testId", "menuActions", "caller", "t", "useTranslation", "meta", "id", "useDensityContext", "runAction", "useActionRunner", "handleAction", "useCallback", "action", "params", "React", "Menu", "Root", "onAction", "Trigger", "asChild", "IconButton", "classNames", "hoverableControlItem", "hoverableOpenControlItem", "variant", "iconOnly", "toLocalizedString", "data-testid", "Content", "group", "items", "NavTreeItemMonolithicAction", "props", "properties", "disabled", "baseLabel", "onClick", "event", "stopPropagation", "NavTreeItemAction", "monolithic", "node", "monolithicAction", "length", "React", "Fragment", "memo", "useMemo", "Node", "Popover", "Treegrid", "toLocalizedString", "useTranslation", "NavTreeItemColumns", "memo", "path", "item", "open", "t", "useTranslation", "meta", "id", "renderItemEnd", "ItemEnd", "popoverAnchorId", "useNavTreeContext", "level", "length", "actions", "actionsProp", "groupedActions", "useActions", "sortedActions", "useMemo", "toSorted", "actionA", "actionB", "primaryA", "properties", "disposition", "primaryB", "primaryAction", "secondaryActions", "flatMap", "action", "Node", "isAction", "filter", "a", "includes", "primaryMenuActions", "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", "isCurrent", "onBack", "t", "useTranslation", "meta", "id", "title", "toLocalizedString", "properties", "label", "isActivated", "useIsActivatedWorkspace", "shouldRenderContent", "React", "Tabs", "Tabpanel", "key", "value", "classNames", "tabIndex", "aria-label", "inert", "L1PanelContent", "graph", "useAppGraph", "edges", "useEdges", "useMemo", "childIds", "Graph", "relationKey", "some", "childId", "child", "getNode", "isNone", "disposition", "undefined", "navTreeContext", "useNavTreeContext", "alternateTree", "useAlternateTreeItem", "alternatePath", "isAlternate", "useIsAlternateTree", "DensityProvider", "density", "L1PanelHeader", "ScrollArea", "Root", "thin", "orientation", "Viewport", "Tree", "model", "rootId", "levelOffset", "gridTemplateColumns", "renderColumns", "NavTreeItemColumns", "blockInstruction", "canDrop", "canSelect", "onOpenChange", "onSelect", "onItemHover", "draggable", "renderItemEnd", "ItemEnd", "backCapableWorkspace", "isPinnedWorkspace", "primaryAction", "groupedActions", "menuActions", "onAction", "useL1MenuActions", "useLoadDescendents", "attended", "useAttended", "alternateTreeOpen", "hasAlternateAttended", "attendedId", "startsWith", "div", "className", "IconButton", "size", "hoverableControlItem", "hoverableOpenControlItem", "variant", "icon", "iconOnly", "data-testid", "onClick", "h2", "role", "disabled", "NavTreeItemAction", "testId", "parent", "monolithic", "Node", "isAction", "menuType", "caller", "NAV_TREE_ITEM", "length", "Menu", "Trigger", "asChild", "Content", "group", "items", "node", "setAlternateTree", "runAction", "useActionRunner", "actions", "actionsProp", "useActions", "secondaryActions", "toSorted", "a", "_b", "graphMenuActions", "flatMap", "action", "filter", "includes", "settingsActionId", "settingsAction", "type", "ActionType", "data", "void", "ns", "useCallback", "params", "expand", "connections", "useConnections", "find", "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", "verticalVariant", "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", "byPosition", "NODE_TYPE", "NavTreeItemEnd", "node", "open", "data", "useMemo", "id", "subject", "React", "Surface", "role", "limit", "getItems", "graph", "disposition", "Graph", "getConnections", "Node", "RootId", "filter", "filterItems", "NavTreeContainer$", "forwardRef", "tab", "popoverAnchorId", "forwardedRef", "isLg", "useMediaQuery", "invokeSync", "invokePromise", "useOperationInvoker", "runAction", "useActionRunner", "useAppGraph", "getItem", "setItem", "useNavTreeState", "layout", "useLayout", "model", "useNavTreeModel", "navigationSidebarState", "useSidebars", "meta", "latestRef", "useRef", "activeItems", "active", "useEffect", "current", "handleOpenChange", "useCallback", "item", "path", "expand", "handleTabChange", "activeTab", "currentSidebarState", "latestIsLg", "LayoutOperation", "UpdateSidebar", "state", "SwitchWorkspace", "length", "isActionLike", "Open", "blockInstruction", "instruction", "source", "target", "properties", "canDrop", "canSelect", "selectable", "handleSelect", "option", "isAction", "parent", "childRelation", "caller", "NAV_TREE_ITEM", "key", "Close", "ScrollIntoView", "defaultAction", "getActions", "find", "action", "handleBack", "RevertWorkspace", "monitorForElements", "canMonitor", "isTreeData", "onDrop", "location", "dropTargets", "extractInstruction", "type", "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", "setAlternateTree", "onItemHover", "navTreeContextValue", "renderItemEnd", "onBack", "onOpenChange", "onSelect", "onTabChange", "NavTreeContext", "Provider", "value", "NavTree", "root", "getRoot", "sidebarOpen", "ref", "NavTreeContainer", "memo"]
7
+ }
@@ -1,46 +1,49 @@
1
+ import "./chunk-DINDC6HE.mjs";
1
2
  import {
2
3
  NODE_TYPE,
4
+ filterItems,
3
5
  getChildren,
4
6
  getParent,
5
7
  getPersistenceParent,
6
8
  l0ItemType,
7
9
  resolveMigrationOperation,
8
10
  sortActions
9
- } from "./chunk-6YPQ625I.mjs";
11
+ } from "./chunk-OGUYILOW.mjs";
10
12
  import {
11
13
  NavTreeCapabilities,
12
14
  NavTreeEvents
13
- } from "./chunk-AGQDZBPL.mjs";
15
+ } from "./chunk-KF26WA4O.mjs";
14
16
  import {
15
17
  COMMANDS_DIALOG,
16
18
  KEY_BINDING,
17
19
  meta
18
- } from "./chunk-YKTYPINZ.mjs";
20
+ } from "./chunk-A4VDCIJC.mjs";
19
21
 
20
22
  // src/NavTreePlugin.tsx
21
23
  import * as Effect from "effect/Effect";
22
- import { ActivationEvent, Capability as Capability6, Common, Plugin } from "@dxos/app-framework";
24
+ import { ActivationEvent, ActivationEvents, Capabilities, Capability as Capability6, Plugin } from "@dxos/app-framework";
25
+ import { AppActivationEvents, AppCapabilities, AppPlugin, LayoutOperation } from "@dxos/app-toolkit";
23
26
  import { Graph } from "@dxos/plugin-graph";
24
27
 
25
28
  // src/capabilities/app-graph-builder/index.ts
26
29
  import { Capability } from "@dxos/app-framework";
27
- var AppGraphBuilder = Capability.lazy("AppGraphBuilder", () => import("./app-graph-builder-RSMA6I22.mjs"));
30
+ var AppGraphBuilder = Capability.lazy("AppGraphBuilder", () => import("./app-graph-builder-Z43OTNI2.mjs"));
28
31
 
29
32
  // src/capabilities/keyboard/index.ts
30
33
  import { Capability as Capability2 } from "@dxos/app-framework";
31
- var Keyboard = Capability2.lazy("Keyboard", () => import("./keyboard-32EH3N4K.mjs"));
34
+ var Keyboard = Capability2.lazy("Keyboard", () => import("./keyboard-HYGFQO7T.mjs"));
32
35
 
33
36
  // src/capabilities/operation-resolver/index.ts
34
37
  import { Capability as Capability3 } from "@dxos/app-framework";
35
- var OperationResolver = Capability3.lazy("OperationResolver", () => import("./operation-resolver-IB75DC5O.mjs"));
38
+ var OperationResolver = Capability3.lazy("OperationResolver", () => import("./operation-resolver-VDWVUII5.mjs"));
36
39
 
37
40
  // src/capabilities/react-surface/index.ts
38
41
  import { Capability as Capability4 } from "@dxos/app-framework";
39
- var ReactSurface = Capability4.lazy("ReactSurface", () => import("./react-surface-F6CVMS3Y.mjs"));
42
+ var ReactSurface = Capability4.lazy("ReactSurface", () => import("./react-surface-LFMKIKNY.mjs"));
40
43
 
41
44
  // src/capabilities/state/index.ts
42
45
  import { Capability as Capability5 } from "@dxos/app-framework";
43
- var State = Capability5.lazy("State", () => import("./state-EVYQOUI3.mjs"));
46
+ var State = Capability5.lazy("State", () => import("./state-CWMNNF7K.mjs"));
44
47
 
45
48
  // src/translations.ts
46
49
  var translations = [
@@ -62,16 +65,9 @@ var translations = [
62
65
  ];
63
66
 
64
67
  // src/NavTreePlugin.tsx
65
- var NavTreePlugin = Plugin.define(meta).pipe(Plugin.addModule({
66
- id: "state",
67
- activatesOn: Common.ActivationEvent.LayoutReady,
68
- activatesAfter: [
69
- NavTreeEvents.StateReady
70
- ],
71
- activate: State
72
- }), Common.Plugin.addTranslationsModule({
73
- translations
74
- }), Common.Plugin.addMetadataModule({
68
+ var NavTreePlugin = Plugin.define(meta).pipe(AppPlugin.addAppGraphModule({
69
+ activate: AppGraphBuilder
70
+ }), AppPlugin.addMetadataModule({
75
71
  metadata: {
76
72
  id: NODE_TYPE,
77
73
  metadata: {
@@ -90,19 +86,32 @@ var NavTreePlugin = Plugin.define(meta).pipe(Plugin.addModule({
90
86
  }
91
87
  }
92
88
  }
89
+ }), AppPlugin.addOperationResolverModule({
90
+ activate: OperationResolver
91
+ }), AppPlugin.addSurfaceModule({
92
+ activate: ReactSurface
93
+ }), AppPlugin.addTranslationsModule({
94
+ translations
95
+ }), Plugin.addModule({
96
+ id: "state",
97
+ activatesOn: AppActivationEvents.LayoutReady,
98
+ activatesAfter: [
99
+ NavTreeEvents.StateReady
100
+ ],
101
+ activate: State
93
102
  }), Plugin.addModule({
94
103
  id: "expose",
95
- activatesOn: ActivationEvent.allOf(Common.ActivationEvent.OperationInvokerReady, Common.ActivationEvent.AppGraphReady, Common.ActivationEvent.LayoutReady, NavTreeEvents.StateReady),
104
+ activatesOn: ActivationEvent.allOf(ActivationEvents.OperationInvokerReady, AppActivationEvents.AppGraphReady, AppActivationEvents.LayoutReady, NavTreeEvents.StateReady),
96
105
  activate: Effect.fnUntraced(function* () {
97
- const layout = yield* Common.Capability.getAtomValue(Common.Capability.Layout);
98
- const { invokePromise } = yield* Capability6.get(Common.Capability.OperationInvoker);
99
- const { graph } = yield* Capability6.get(Common.Capability.AppGraph);
106
+ const layout = yield* Capabilities.getAtomValue(AppCapabilities.Layout);
107
+ const { invokePromise } = yield* Capability6.get(Capabilities.OperationInvoker);
108
+ const { graph } = yield* Capability6.get(AppCapabilities.AppGraph);
100
109
  if (invokePromise && layout.active.length === 1) {
101
110
  void Graph.waitForPath(graph, {
102
111
  target: layout.active[0]
103
112
  }, {
104
113
  timeout: 3e4
105
- }).then(() => invokePromise(Common.LayoutOperation.Expose, {
114
+ }).then(() => invokePromise(LayoutOperation.Expose, {
106
115
  subject: layout.active[0]
107
116
  })).catch(() => {
108
117
  });
@@ -111,14 +120,8 @@ var NavTreePlugin = Plugin.define(meta).pipe(Plugin.addModule({
111
120
  })
112
121
  }), Plugin.addModule({
113
122
  id: "keyboard",
114
- activatesOn: ActivationEvent.allOf(Common.ActivationEvent.AppGraphReady, Common.ActivationEvent.OperationInvokerReady),
123
+ activatesOn: ActivationEvent.allOf(AppActivationEvents.AppGraphReady, ActivationEvents.OperationInvokerReady),
115
124
  activate: Keyboard
116
- }), Common.Plugin.addSurfaceModule({
117
- activate: ReactSurface
118
- }), Common.Plugin.addOperationResolverModule({
119
- activate: OperationResolver
120
- }), Common.Plugin.addAppGraphModule({
121
- activate: AppGraphBuilder
122
125
  }), Plugin.make);
123
126
  export {
124
127
  COMMANDS_DIALOG,
@@ -126,6 +129,7 @@ export {
126
129
  NavTreeCapabilities,
127
130
  NavTreeEvents,
128
131
  NavTreePlugin,
132
+ filterItems,
129
133
  getChildren,
130
134
  getParent,
131
135
  getPersistenceParent,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/NavTreePlugin.tsx", "../../../src/capabilities/app-graph-builder/index.ts", "../../../src/capabilities/keyboard/index.ts", "../../../src/capabilities/operation-resolver/index.ts", "../../../src/capabilities/react-surface/index.ts", "../../../src/capabilities/state/index.ts", "../../../src/translations.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { ActivationEvent, Capability, Common, Plugin } from '@dxos/app-framework';\nimport { Graph } from '@dxos/plugin-graph';\nimport { type TreeData } from '@dxos/react-ui-list';\n\nimport { AppGraphBuilder, Keyboard, OperationResolver, ReactSurface, State } from './capabilities';\nimport { NODE_TYPE } from './components';\nimport { meta } from './meta';\nimport { translations } from './translations';\nimport { NavTreeEvents } from './types';\n\nexport const NavTreePlugin = Plugin.define(meta).pipe(\n Plugin.addModule({\n id: 'state',\n activatesOn: Common.ActivationEvent.LayoutReady,\n activatesAfter: [NavTreeEvents.StateReady],\n activate: State,\n }),\n Common.Plugin.addTranslationsModule({ translations }),\n Common.Plugin.addMetadataModule({\n metadata: {\n id: NODE_TYPE,\n metadata: {\n parse: ({ item }: TreeData, type: string) => {\n switch (type) {\n case 'node':\n return item;\n case 'object':\n return item.data;\n case 'view-object':\n return { id: `${item.id}-view`, object: item.data };\n }\n },\n },\n },\n }),\n Plugin.addModule({\n id: 'expose',\n activatesOn: ActivationEvent.allOf(\n Common.ActivationEvent.OperationInvokerReady,\n Common.ActivationEvent.AppGraphReady,\n Common.ActivationEvent.LayoutReady,\n NavTreeEvents.StateReady,\n ),\n activate: Effect.fnUntraced(function* () {\n const layout = yield* Common.Capability.getAtomValue(Common.Capability.Layout);\n const { invokePromise } = yield* Capability.get(Common.Capability.OperationInvoker);\n const { graph } = yield* Capability.get(Common.Capability.AppGraph);\n if (invokePromise && layout.active.length === 1) {\n // TODO(wittjosiah): This should really be fired once the navtree renders for the first time.\n // That is the point at which the graph is expanded and the path should be available.\n void Graph.waitForPath(graph, { target: layout.active[0] }, { timeout: 30_000 })\n .then(() => invokePromise(Common.LayoutOperation.Expose, { subject: layout.active[0] }))\n .catch(() => {});\n }\n\n return [];\n }),\n }),\n Plugin.addModule({\n id: 'keyboard',\n activatesOn: ActivationEvent.allOf(\n Common.ActivationEvent.AppGraphReady,\n Common.ActivationEvent.OperationInvokerReady,\n ),\n activate: Keyboard,\n }),\n Common.Plugin.addSurfaceModule({ activate: ReactSurface }),\n Common.Plugin.addOperationResolverModule({ activate: OperationResolver }),\n Common.Plugin.addAppGraphModule({ activate: AppGraphBuilder }),\n Plugin.make,\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capability } from '@dxos/app-framework';\n\nexport const AppGraphBuilder = Capability.lazy('AppGraphBuilder', () => import('./app-graph-builder'));\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capability } from '@dxos/app-framework';\n\nexport const Keyboard = Capability.lazy('Keyboard', () => import('./keyboard'));\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capability } from '@dxos/app-framework';\n\nexport const OperationResolver = Capability.lazy('OperationResolver', () => import('./operation-resolver'));\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capability } from '@dxos/app-framework';\n\nexport const ReactSurface = Capability.lazy('ReactSurface', () => import('./react-surface'));\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capability } from '@dxos/app-framework';\n\nexport const State = Capability.lazy('State', () => import('./state'));\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Resource } from '@dxos/react-ui';\n\nimport { meta } from './meta';\n\nexport const translations = [\n {\n 'en-US': {\n [meta.id]: {\n 'app menu label': 'App menu',\n 'open settings label': 'Settings',\n 'open commands label': 'Search commands',\n 'commands dialog title': 'Commands',\n 'command list input placeholder': 'Search for commands…',\n 'node actions menu invoker label': 'More options',\n 'tree item actions label': 'More actions',\n 'empty branch message': ' ',\n 'button back': 'Back to Space',\n },\n },\n },\n] as const satisfies Resource[];\n"],
5
- "mappings": "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",
6
- "names": ["Effect", "ActivationEvent", "Capability", "Common", "Plugin", "Graph", "Capability", "AppGraphBuilder", "Capability", "lazy", "Capability", "Keyboard", "Capability", "lazy", "Capability", "OperationResolver", "Capability", "lazy", "Capability", "ReactSurface", "Capability", "lazy", "Capability", "State", "Capability", "lazy", "translations", "meta", "id", "NavTreePlugin", "Plugin", "define", "meta", "pipe", "addModule", "id", "activatesOn", "Common", "ActivationEvent", "LayoutReady", "activatesAfter", "NavTreeEvents", "StateReady", "activate", "State", "addTranslationsModule", "translations", "addMetadataModule", "metadata", "NODE_TYPE", "parse", "item", "type", "data", "object", "allOf", "OperationInvokerReady", "AppGraphReady", "fnUntraced", "layout", "Capability", "getAtomValue", "Layout", "invokePromise", "get", "OperationInvoker", "graph", "AppGraph", "active", "length", "Graph", "waitForPath", "target", "timeout", "then", "LayoutOperation", "Expose", "subject", "catch", "Keyboard", "addSurfaceModule", "ReactSurface", "addOperationResolverModule", "OperationResolver", "addAppGraphModule", "AppGraphBuilder", "make"]
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { ActivationEvent, ActivationEvents, Capabilities, Capability, Plugin } from '@dxos/app-framework';\nimport { AppActivationEvents, AppCapabilities, AppPlugin, LayoutOperation } from '@dxos/app-toolkit';\nimport { Graph } from '@dxos/plugin-graph';\nimport { type TreeData } from '@dxos/react-ui-list';\n\nimport { AppGraphBuilder, Keyboard, OperationResolver, ReactSurface, State } from './capabilities';\nimport { NODE_TYPE } from './containers';\nimport { meta } from './meta';\nimport { translations } from './translations';\nimport { NavTreeEvents } from './types';\n\nexport const NavTreePlugin = Plugin.define(meta).pipe(\n AppPlugin.addAppGraphModule({ activate: AppGraphBuilder }),\n AppPlugin.addMetadataModule({\n metadata: {\n id: NODE_TYPE,\n metadata: {\n parse: ({ item }: TreeData, type: string) => {\n switch (type) {\n case 'node':\n return item;\n case 'object':\n return item.data;\n case 'view-object':\n return { id: `${item.id}-view`, object: item.data };\n }\n },\n },\n },\n }),\n AppPlugin.addOperationResolverModule({ activate: OperationResolver }),\n AppPlugin.addSurfaceModule({ activate: ReactSurface }),\n AppPlugin.addTranslationsModule({ translations }),\n Plugin.addModule({\n id: 'state',\n activatesOn: AppActivationEvents.LayoutReady,\n activatesAfter: [NavTreeEvents.StateReady],\n activate: State,\n }),\n Plugin.addModule({\n id: 'expose',\n activatesOn: ActivationEvent.allOf(\n ActivationEvents.OperationInvokerReady,\n AppActivationEvents.AppGraphReady,\n AppActivationEvents.LayoutReady,\n NavTreeEvents.StateReady,\n ),\n activate: Effect.fnUntraced(function* () {\n const layout = yield* Capabilities.getAtomValue(AppCapabilities.Layout);\n const { invokePromise } = yield* Capability.get(Capabilities.OperationInvoker);\n const { graph } = yield* Capability.get(AppCapabilities.AppGraph);\n if (invokePromise && layout.active.length === 1) {\n // TODO(wittjosiah): This should really be fired once the navtree renders for the first time.\n // That is the point at which the graph is expanded and the path should be available.\n void Graph.waitForPath(graph, { target: layout.active[0] }, { timeout: 30_000 })\n .then(() => invokePromise(LayoutOperation.Expose, { subject: layout.active[0] }))\n .catch(() => {});\n }\n\n return [];\n }),\n }),\n Plugin.addModule({\n id: 'keyboard',\n activatesOn: ActivationEvent.allOf(AppActivationEvents.AppGraphReady, ActivationEvents.OperationInvokerReady),\n activate: Keyboard,\n }),\n Plugin.make,\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capability } from '@dxos/app-framework';\n\nexport const AppGraphBuilder = Capability.lazy('AppGraphBuilder', () => import('./app-graph-builder'));\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capability } from '@dxos/app-framework';\n\nexport const Keyboard = Capability.lazy('Keyboard', () => import('./keyboard'));\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capability } from '@dxos/app-framework';\n\nexport const OperationResolver = Capability.lazy('OperationResolver', () => import('./operation-resolver'));\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capability } from '@dxos/app-framework';\n\nexport const ReactSurface = Capability.lazy('ReactSurface', () => import('./react-surface'));\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capability } from '@dxos/app-framework';\n\nexport const State = Capability.lazy('State', () => import('./state'));\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Resource } from '@dxos/react-ui';\n\nimport { meta } from './meta';\n\nexport const translations = [\n {\n 'en-US': {\n [meta.id]: {\n 'app menu label': 'App menu',\n 'open settings label': 'Settings',\n 'open commands label': 'Search commands',\n 'commands dialog title': 'Commands',\n 'command list input placeholder': 'Search for commands…',\n 'node actions menu invoker label': 'More options',\n 'tree item actions label': 'More actions',\n 'empty branch message': ' ',\n 'button back': 'Back to Space',\n },\n },\n },\n] as const satisfies Resource[];\n"],
5
+ "mappings": "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",
6
+ "names": ["Effect", "ActivationEvent", "ActivationEvents", "Capabilities", "Capability", "Plugin", "AppActivationEvents", "AppCapabilities", "AppPlugin", "LayoutOperation", "Graph", "Capability", "AppGraphBuilder", "Capability", "lazy", "Capability", "Keyboard", "Capability", "lazy", "Capability", "OperationResolver", "Capability", "lazy", "Capability", "ReactSurface", "Capability", "lazy", "Capability", "State", "Capability", "lazy", "translations", "meta", "id", "NavTreePlugin", "Plugin", "define", "meta", "pipe", "AppPlugin", "addAppGraphModule", "activate", "AppGraphBuilder", "addMetadataModule", "metadata", "id", "NODE_TYPE", "parse", "item", "type", "data", "object", "addOperationResolverModule", "OperationResolver", "addSurfaceModule", "ReactSurface", "addTranslationsModule", "translations", "addModule", "activatesOn", "AppActivationEvents", "LayoutReady", "activatesAfter", "NavTreeEvents", "StateReady", "State", "ActivationEvent", "allOf", "ActivationEvents", "OperationInvokerReady", "AppGraphReady", "fnUntraced", "layout", "Capabilities", "getAtomValue", "AppCapabilities", "Layout", "invokePromise", "Capability", "get", "OperationInvoker", "graph", "AppGraph", "active", "length", "Graph", "waitForPath", "target", "timeout", "then", "LayoutOperation", "Expose", "subject", "catch", "Keyboard", "make"]
7
7
  }
@@ -1,17 +1,18 @@
1
1
  import {
2
2
  KEY_BINDING
3
- } from "./chunk-YKTYPINZ.mjs";
3
+ } from "./chunk-A4VDCIJC.mjs";
4
4
 
5
5
  // src/capabilities/keyboard/keyboard.ts
6
6
  import * as Effect from "effect/Effect";
7
- import { Capability, Common } from "@dxos/app-framework";
7
+ import { Capabilities, Capability } from "@dxos/app-framework";
8
+ import { AppCapabilities } from "@dxos/app-toolkit";
8
9
  import { debounce } from "@dxos/async";
9
10
  import { Keyboard } from "@dxos/keyboard";
10
11
  import { Graph, Node, runAction } from "@dxos/plugin-graph";
11
12
  import { getHostPlatform } from "@dxos/util";
12
13
  var keyboard_default = Capability.makeModule(Effect.fnUntraced(function* () {
13
- const { graph } = yield* Capability.get(Common.Capability.AppGraph);
14
- const invoker = yield* Capability.get(Common.Capability.OperationInvoker);
14
+ const { graph } = yield* Capability.get(AppCapabilities.AppGraph);
15
+ const invoker = yield* Capability.get(Capabilities.OperationInvoker);
15
16
  const pluginContext = yield* Capability.Service;
16
17
  const visitor = (node, path) => {
17
18
  let shortcut;
@@ -35,13 +36,17 @@ var keyboard_default = Capability.makeModule(Effect.fnUntraced(function* () {
35
36
  };
36
37
  const eventHandler = debounce(() => {
37
38
  Graph.traverse(graph, {
39
+ relation: [
40
+ "child",
41
+ "action"
42
+ ],
38
43
  visitor
39
44
  });
40
45
  }, 500);
41
46
  const unsubscribe = graph.onNodeChanged.on(eventHandler);
42
47
  Keyboard.singleton.initialize();
43
48
  Keyboard.singleton.setCurrentContext(Node.RootId);
44
- return Capability.contributes(Common.Capability.Null, null, () => Effect.sync(() => {
49
+ return Capability.contributes(Capabilities.Null, null, () => Effect.sync(() => {
45
50
  unsubscribe();
46
51
  Keyboard.singleton.destroy();
47
52
  }));
@@ -49,4 +54,4 @@ var keyboard_default = Capability.makeModule(Effect.fnUntraced(function* () {
49
54
  export {
50
55
  keyboard_default as default
51
56
  };
52
- //# sourceMappingURL=keyboard-32EH3N4K.mjs.map
57
+ //# sourceMappingURL=keyboard-HYGFQO7T.mjs.map
@@ -0,0 +1,7 @@
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 { Capabilities, Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\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(AppCapabilities.AppGraph);\n const invoker = yield* Capability.get(Capabilities.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, { relation: ['child', 'action'], 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(Capabilities.Null, null, () =>\n Effect.sync(() => {\n unsubscribe();\n Keyboard.singleton.destroy();\n }),\n );\n }),\n);\n"],
5
+ "mappings": ";;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,cAAcC,kBAAkB;AACzC,SAASC,uBAAuB;AAChC,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,gBAAgBC,QAAQ;AAChE,QAAMC,UAAU,OAAOP,WAAWI,IAAII,aAAaC,gBAAgB;AACnE,QAAMC,gBAAgB,OAAOV,WAAWW;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,UAAU7B,SAASG,eAAeG,MAAM;UAAEwB,QAAQxB;UAAMyB,QAAQC;QAAY,CAAA;QAChGC,MAAM3B,KAAKG,WAAWyB;MACxB,CAAA;IACF;EACF;AAEA,QAAMC,eAAeC,SAAS,MAAA;AAC5BC,UAAMC,SAAS1C,OAAO;MAAE2C,UAAU;QAAC;QAAS;;MAAWlC;IAAQ,CAAA;EACjE,GAAG,GAAA;AAEH,QAAMmC,cAAc5C,MAAM6C,cAAcC,GAAGP,YAAAA;AAG3Cb,WAASC,UAAUoB,WAAU;AAC7BrB,WAASC,UAAUqB,kBAAkBxB,KAAKyB,MAAM;AAEhD,SAAOpD,WAAWqD,YAAY7C,aAAa8C,MAAM,MAAM,MAC9CC,YAAK,MAAA;AACVR,gBAAAA;AACAlB,aAASC,UAAU0B,QAAO;EAC5B,CAAA,CAAA;AAEJ,CAAA,CAAA;",
6
+ "names": ["Effect", "Capabilities", "Capability", "AppCapabilities", "debounce", "Keyboard", "Graph", "Node", "runAction", "getHostPlatform", "Capability", "makeModule", "fnUntraced", "graph", "get", "AppCapabilities", "AppGraph", "invoker", "Capabilities", "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", "relation", "unsubscribe", "onNodeChanged", "on", "initialize", "setCurrentContext", "RootId", "contributes", "Null", "sync", "destroy"]
7
+ }