@dxos/plugin-simple-layout 0.8.4-main.c85a9c8dae → 0.8.4-main.d05673bc65

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 (88) hide show
  1. package/dist/lib/browser/{chunk-TMZNLVT2.mjs → chunk-MDPEKLKR.mjs} +55 -62
  2. package/dist/lib/browser/chunk-MDPEKLKR.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-7VLT3S46.mjs → chunk-MRR7PXSM.mjs} +3 -3
  4. package/dist/lib/browser/{chunk-7VLT3S46.mjs.map → chunk-MRR7PXSM.mjs.map} +1 -1
  5. package/dist/lib/browser/index.mjs +6 -6
  6. package/dist/lib/browser/meta.json +1 -1
  7. package/dist/lib/browser/{operation-resolver-BYRIQOQT.mjs → operation-resolver-VTZ6HZ4B.mjs} +24 -35
  8. package/dist/lib/browser/operation-resolver-VTZ6HZ4B.mjs.map +7 -0
  9. package/dist/lib/browser/{react-root-MMB575WY.mjs → react-root-WVQYY2JA.mjs} +3 -3
  10. package/dist/lib/browser/{react-surface-M6CURANW.mjs → react-surface-VLBR37ED.mjs} +11 -8
  11. package/dist/lib/browser/{react-surface-M6CURANW.mjs.map → react-surface-VLBR37ED.mjs.map} +3 -3
  12. package/dist/lib/browser/{state-A3PGDWWZ.mjs → state-TXSMUWYI.mjs} +2 -2
  13. package/dist/lib/browser/{url-handler-HTIUY6WL.mjs → url-handler-RBRONH7S.mjs} +18 -19
  14. package/dist/lib/browser/url-handler-RBRONH7S.mjs.map +7 -0
  15. package/dist/lib/node-esm/{chunk-FLOYBAHE.mjs → chunk-DCKASLMP.mjs} +55 -62
  16. package/dist/lib/node-esm/chunk-DCKASLMP.mjs.map +7 -0
  17. package/dist/lib/node-esm/{chunk-VIDE5UMB.mjs → chunk-WMNTJ2MK.mjs} +3 -3
  18. package/dist/lib/node-esm/{chunk-VIDE5UMB.mjs.map → chunk-WMNTJ2MK.mjs.map} +1 -1
  19. package/dist/lib/node-esm/index.mjs +6 -6
  20. package/dist/lib/node-esm/meta.json +1 -1
  21. package/dist/lib/node-esm/{operation-resolver-BDTFNCS2.mjs → operation-resolver-R7CQ6ERU.mjs} +24 -35
  22. package/dist/lib/node-esm/operation-resolver-R7CQ6ERU.mjs.map +7 -0
  23. package/dist/lib/node-esm/{react-root-ENZKVSY4.mjs → react-root-XBNDM7BE.mjs} +3 -3
  24. package/dist/lib/node-esm/{react-surface-ITVNQYLG.mjs → react-surface-U5NHA367.mjs} +11 -8
  25. package/dist/lib/node-esm/{react-surface-ITVNQYLG.mjs.map → react-surface-U5NHA367.mjs.map} +3 -3
  26. package/dist/lib/node-esm/{state-ZCFZTTPL.mjs → state-JMX6FAG4.mjs} +2 -2
  27. package/dist/lib/node-esm/{url-handler-WBVVKVPC.mjs → url-handler-QSMCH3JB.mjs} +18 -19
  28. package/dist/lib/node-esm/url-handler-QSMCH3JB.mjs.map +7 -0
  29. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -1
  30. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -1
  31. package/dist/types/src/capabilities/url-handler/url-handler.d.ts +2 -2
  32. package/dist/types/src/capabilities/url-handler/url-handler.d.ts.map +1 -1
  33. package/dist/types/src/components/ContentLoading/ContentLoading.d.ts.map +1 -0
  34. package/dist/types/src/components/ContentLoading/ContentLoading.stories.d.ts.map +1 -0
  35. package/dist/types/src/components/ContentLoading/index.d.ts +2 -0
  36. package/dist/types/src/components/ContentLoading/index.d.ts.map +1 -0
  37. package/dist/types/src/components/NavBranch/NavBranch.d.ts +11 -0
  38. package/dist/types/src/components/NavBranch/NavBranch.d.ts.map +1 -0
  39. package/dist/types/src/components/NavBranch/index.d.ts +2 -0
  40. package/dist/types/src/components/NavBranch/index.d.ts.map +1 -0
  41. package/dist/types/src/components/SimpleLayout/Main.d.ts.map +1 -1
  42. package/dist/types/src/components/hooks.d.ts +4 -2
  43. package/dist/types/src/components/hooks.d.ts.map +1 -1
  44. package/dist/types/src/components/index.d.ts +1 -1
  45. package/dist/types/src/hooks/actions.d.ts +3 -4
  46. package/dist/types/src/hooks/actions.d.ts.map +1 -1
  47. package/dist/types/src/hooks/useAppBarProps.d.ts.map +1 -1
  48. package/dist/types/src/hooks/useDrawerActions.d.ts.map +1 -1
  49. package/dist/types/src/hooks/useNavbarActions.d.ts.map +1 -1
  50. package/dist/types/tsconfig.tsbuildinfo +1 -1
  51. package/package.json +27 -27
  52. package/src/capabilities/operation-resolver/operation-resolver.ts +19 -34
  53. package/src/capabilities/react-surface/react-surface.tsx +8 -6
  54. package/src/capabilities/url-handler/url-handler.ts +11 -35
  55. package/src/components/ContentLoading/index.ts +5 -0
  56. package/src/components/Home/Home.tsx +3 -3
  57. package/src/components/{Workspace/Workspace.tsx → NavBranch/NavBranch.tsx} +18 -13
  58. package/src/components/{Workspace → NavBranch}/index.ts +1 -1
  59. package/src/components/SimpleLayout/Drawer.tsx +3 -12
  60. package/src/components/SimpleLayout/Main.tsx +3 -4
  61. package/src/components/hooks.ts +8 -8
  62. package/src/components/index.ts +1 -1
  63. package/src/hooks/actions.ts +13 -15
  64. package/src/hooks/useAppBarProps.ts +1 -2
  65. package/src/hooks/useDrawerActions.ts +7 -5
  66. package/src/hooks/useNavbarActions.ts +5 -4
  67. package/src/meta.ts +1 -1
  68. package/src/types/capabilities.ts +1 -1
  69. package/dist/lib/browser/chunk-TMZNLVT2.mjs.map +0 -7
  70. package/dist/lib/browser/operation-resolver-BYRIQOQT.mjs.map +0 -7
  71. package/dist/lib/browser/url-handler-HTIUY6WL.mjs.map +0 -7
  72. package/dist/lib/node-esm/chunk-FLOYBAHE.mjs.map +0 -7
  73. package/dist/lib/node-esm/operation-resolver-BDTFNCS2.mjs.map +0 -7
  74. package/dist/lib/node-esm/url-handler-WBVVKVPC.mjs.map +0 -7
  75. package/dist/types/src/components/ContentLoading.d.ts.map +0 -1
  76. package/dist/types/src/components/ContentLoading.stories.d.ts.map +0 -1
  77. package/dist/types/src/components/Workspace/Workspace.d.ts +0 -11
  78. package/dist/types/src/components/Workspace/Workspace.d.ts.map +0 -1
  79. package/dist/types/src/components/Workspace/index.d.ts +0 -2
  80. package/dist/types/src/components/Workspace/index.d.ts.map +0 -1
  81. /package/dist/lib/browser/{react-root-MMB575WY.mjs.map → react-root-WVQYY2JA.mjs.map} +0 -0
  82. /package/dist/lib/browser/{state-A3PGDWWZ.mjs.map → state-TXSMUWYI.mjs.map} +0 -0
  83. /package/dist/lib/node-esm/{react-root-ENZKVSY4.mjs.map → react-root-XBNDM7BE.mjs.map} +0 -0
  84. /package/dist/lib/node-esm/{state-ZCFZTTPL.mjs.map → state-JMX6FAG4.mjs.map} +0 -0
  85. /package/dist/types/src/components/{ContentLoading.d.ts → ContentLoading/ContentLoading.d.ts} +0 -0
  86. /package/dist/types/src/components/{ContentLoading.stories.d.ts → ContentLoading/ContentLoading.stories.d.ts} +0 -0
  87. /package/src/components/{ContentLoading.stories.tsx → ContentLoading/ContentLoading.stories.tsx} +0 -0
  88. /package/src/components/{ContentLoading.tsx → ContentLoading/ContentLoading.tsx} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/Home/Home.tsx", "../../../src/components/hooks.ts", "../../../src/components/SimpleLayout/SimpleLayout.tsx", "../../../src/hooks/useAppBarProps.ts", "../../../src/hooks/useCompanions.ts", "../../../src/hooks/actions.ts", "../../../src/hooks/useDrawerActions.ts", "../../../src/components/ContentLoading.tsx", "../../../src/components/MobileLayout/MobileLayout.tsx", "../../../src/components/Popover/Popover.tsx", "../../../src/components/SimpleLayout/AppBar.tsx", "../../../src/components/SimpleLayout/Main.tsx", "../../../src/components/SimpleLayout/NavBar.tsx", "../../../src/components/Workspace/Workspace.tsx", "../../../src/hooks/useSimpleLayoutState.ts", "../../../src/hooks/useNavbarActions.ts", "../../../src/components/Dialog/Dialog.tsx", "../../../src/components/SimpleLayout/Drawer.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useMemo, useRef } from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { Node, useConnections } from '@dxos/plugin-graph';\nimport { Avatar, Icon, Panel, ScrollArea, Toolbar, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { Card } from '@dxos/react-ui';\nimport { Mosaic, type MosaicStackTileComponent } from '@dxos/react-ui-mosaic';\nimport { SearchList, useSearchListItem, useSearchListResults } from '@dxos/react-ui-searchlist';\nimport { mx } from '@dxos/ui-theme';\nimport { byPosition } from '@dxos/util';\n\nimport { meta } from '../../meta';\nimport { useLoadDescendents } from '../hooks';\n\nexport type HomeProps = {};\n\n/**\n * Home screen.\n */\nexport const Home = (_: HomeProps) => {\n const { t } = useTranslation(meta.id);\n const userAccountItem = useItemsByDisposition('user-account')[0];\n const pinnedItems = useItemsByDisposition('pin-end', true);\n const workspaceItems = useItemsByDisposition('workspace');\n useLoadDescendents(Node.RootId);\n\n const items = useMemo(\n () => [...(userAccountItem ? [userAccountItem] : []), ...pinnedItems, ...workspaceItems],\n [userAccountItem, pinnedItems, workspaceItems],\n );\n\n const { results, handleSearch } = useSearchListResults({\n items,\n extract: (node) => toLocalizedString(node.properties.label, t),\n });\n\n return (\n <SearchList.Root onSearch={handleSearch}>\n <Panel.Root>\n <Panel.Toolbar asChild>\n <Toolbar.Root>\n <SearchList.Input placeholder={t('search placeholder')} autoFocus />\n </Toolbar.Root>\n </Panel.Toolbar>\n <Panel.Content asChild>\n <SearchList.Content>\n <Mosaic.Container asChild>\n <ScrollArea.Root orientation='vertical'>\n <ScrollArea.Viewport classNames='p-2'>\n <Mosaic.Stack items={results} getId={(node) => node.id} Tile={WorkspaceTile} />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n </Mosaic.Container>\n </SearchList.Content>\n </Panel.Content>\n </Panel.Root>\n </SearchList.Root>\n );\n};\n\nconst WorkspaceTile: MosaicStackTileComponent<Node.Node> = (props) => {\n const data = props.data;\n const { t } = useTranslation(meta.id);\n const { invokePromise } = useOperationInvoker();\n const { selectedValue, registerItem, unregisterItem } = useSearchListItem();\n const name = toLocalizedString(data.properties.label, t);\n const isSelected = selectedValue === data.id;\n const cardRef = useRef<HTMLDivElement>(null);\n\n useLoadDescendents(data.id);\n\n const handleSelect = useCallback(\n () => invokePromise(LayoutOperation.SwitchWorkspace, { subject: data.id }),\n [invokePromise, data.id],\n );\n\n // Register this workspace with the search context.\n useEffect(() => {\n if (cardRef.current) {\n registerItem(data.id, cardRef.current, handleSelect);\n }\n\n return () => unregisterItem(data.id);\n }, [data.id, handleSelect, registerItem, unregisterItem]);\n\n // Scroll into view when selected.\n useEffect(() => {\n if (isSelected && cardRef.current) {\n cardRef.current.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }, [isSelected]);\n\n return (\n <Card.Root\n role='button'\n fullWidth\n tabIndex={-1} // TODO(burdon): Use Mosaic.Focus.\n data-selected={isSelected}\n classNames={mx('dx-focus-ring', isSelected && 'bg-hover-overlay')}\n onClick={handleSelect}\n ref={cardRef}\n >\n <Card.Toolbar density='coarse'>\n <Avatar.Root>\n <Avatar.Content\n icon={data.properties.icon}\n hue={data.properties.hue}\n hueVariant='transparent'\n variant='square'\n size={12}\n fallback={name}\n />\n <Avatar.Label>{name}</Avatar.Label>\n <Icon icon='ph--caret-right--regular' />\n </Avatar.Root>\n </Card.Toolbar>\n </Card.Root>\n );\n};\n\n/** Filters nodes by disposition. */\nconst filterItems = (node: Node.Node, disposition: string) => {\n return node.properties.disposition === disposition;\n};\n\n/** Returns root-level items filtered by disposition. */\nconst useItemsByDisposition = (disposition: string, sort = false) => {\n const { graph } = useAppGraph();\n const connections = useConnections(graph, Node.RootId, 'child');\n const filtered = connections.filter((node) => filterItems(node, disposition));\n return sort ? filtered.toSorted((a, b) => byPosition(a.properties, b.properties)) : filtered;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect } from 'react';\n\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { Graph } from '@dxos/plugin-graph';\n\n/**\n * Hook to expand graph nodes two levels deep when directly linked to.\n */\nexport const useLoadDescendents = (nodeId?: string) => {\n const { graph } = useAppGraph();\n\n useEffect(() => {\n if (nodeId) {\n // First level: expand the node itself.\n Graph.expand(graph, nodeId, 'child');\n // Second level: expand each child.\n Graph.getConnections(graph, nodeId, 'child').forEach((child) => {\n Graph.expand(graph, child.id, 'child');\n });\n }\n }, [nodeId, graph]);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { Splitter, type SplitterMode } from '@dxos/react-ui';\nimport { Mosaic } from '@dxos/react-ui-mosaic';\n\nimport { useSimpleLayoutState } from '../../hooks';\nimport { Dialog } from '../Dialog';\nimport { MobileLayout } from '../MobileLayout';\nimport { PopoverContent, PopoverRoot } from '../Popover';\n\nimport { Drawer } from './Drawer';\nimport { Main } from './Main';\n\n// TODO(burdon): Mobile/Desktop variance?\nexport const SimpleLayout = () => {\n const { state } = useSimpleLayoutState();\n const [keyboardOpen, setKeyboardOpen] = useState(false);\n const [splitterMode, setSplitterMode] = useState<SplitterMode>('upper');\n\n const drawerRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (keyboardOpen) {\n // Determine which panel has focus and expand that one.\n const activeElement = document.activeElement;\n const drawerHasFocus = drawerRef.current?.contains(activeElement);\n setSplitterMode(drawerHasFocus ? 'lower' : 'upper');\n } else {\n setSplitterMode(state.drawerState === 'closed' ? 'upper' : state.drawerState === 'open' ? 'both' : 'lower');\n }\n }, [state.drawerState, keyboardOpen]);\n\n return (\n <Mosaic.Root classNames='contents'>\n <MobileLayout.Root\n classNames='bg-toolbar-surface'\n onKeyboardOpenChange={(keyboardOpen: boolean) => setKeyboardOpen(keyboardOpen)}\n >\n <MobileLayout.Panel safe={{ top: true, bottom: splitterMode === 'upper' }}>\n <PopoverRoot>\n <Splitter.Root mode={splitterMode} ratio={0.55}>\n <Splitter.Panel position='upper'>\n <Main />\n </Splitter.Panel>\n <Splitter.Panel position='lower' ref={drawerRef}>\n <Drawer />\n </Splitter.Panel>\n </Splitter.Root>\n <Dialog />\n <PopoverContent />\n </PopoverRoot>\n </MobileLayout.Panel>\n </MobileLayout.Root>\n </Mosaic.Root>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom, useAtomValue } from '@effect-atom/atom-react';\nimport * as Effect from 'effect/Effect';\nimport * as Option from 'effect/Option';\nimport { useCallback, useMemo } from 'react';\n\nimport { useCapability, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { Graph, Node, useActionRunner, useNode } from '@dxos/plugin-graph';\nimport { toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { type ActionGraphProps } from '@dxos/react-ui-menu';\n\nimport { type AppBarProps } from '../components';\nimport { meta } from '../meta';\nimport { SimpleLayoutState as SimpleLayoutStateCapability } from '../types';\n\n/**\n * Hook that computes all AppBar props from the app graph.\n * Derives activeId from state atom. Returns props ready to spread into the AppBar component.\n */\nexport const useAppBarProps = (): Omit<AppBarProps, 'classNames'> => {\n const { t } = useTranslation(meta.id);\n const stateAtom = useCapability(SimpleLayoutStateCapability);\n const state = useAtomValue(stateAtom);\n const { graph } = useAppGraph();\n const { invokeSync } = useOperationInvoker();\n const runAction = useActionRunner();\n\n // Derive activeId from state.\n const activeId = state.active ?? state.workspace;\n const node = useNode(graph, activeId);\n\n // Compute title from node label.\n const title = node ? toLocalizedString(node.properties.label, t) : undefined;\n\n // Build actions atom filtering by disposition.\n // Derive activeId from state atom so we don't need to recreate this atom when it changes.\n const actionsAtom = useMemo(\n () =>\n Atom.make((get): ActionGraphProps => {\n const state = get(stateAtom);\n const activeId = state.active ?? state.workspace;\n const allActions = activeId ? get(graph.actions(activeId)) : [];\n const filtered = allActions.filter((action) =>\n ['list-item', 'list-item-primary', 'heading-list-item'].includes(action.properties.disposition),\n );\n const nodes: ActionGraphProps['nodes'] = filtered as ActionGraphProps['nodes'];\n const edges: ActionGraphProps['edges'] = filtered.map((action) => ({\n source: 'root',\n target: action.id,\n relation: 'child',\n }));\n\n // Add alternate-tree action (e.g. Settings) from the workspace node.\n const workspaceConnections = state.workspace ? get(graph.connections(state.workspace, 'child')) : [];\n const alternateTreeNode = workspaceConnections.find(\n (node: Node.Node) => node.properties.disposition === 'alternate-tree',\n );\n if (alternateTreeNode && activeId !== alternateTreeNode.id) {\n const settingsAction = {\n id: `appbar-settings-${alternateTreeNode.id}`,\n type: Node.ActionType,\n data: () => Effect.sync(() => invokeSync(LayoutOperation.Open, { subject: [alternateTreeNode.id] })),\n properties: {\n label: alternateTreeNode.properties.label ?? alternateTreeNode.id,\n icon: alternateTreeNode.properties.icon ?? 'ph--placeholder--regular',\n },\n };\n nodes.push(settingsAction);\n edges.push({ source: 'root', target: settingsAction.id, relation: 'child' });\n }\n\n return { nodes, edges };\n }),\n [graph, stateAtom],\n );\n\n // Back button logic.\n const showBackButton = activeId !== undefined && activeId !== Node.RootId;\n\n const onBack = useCallback(() => {\n if (state.active) {\n const isWorkspace = Graph.getNode(graph, state.active).pipe(\n Option.map((node) => node.properties.disposition === 'workspace'),\n Option.getOrElse(() => false),\n );\n\n // If history is empty and this is a workspace, go to home.\n if (state.history.length === 0 && isWorkspace) {\n invokeSync(LayoutOperation.SwitchWorkspace, { subject: Node.RootId });\n } else {\n // Otherwise, close (which will pop from history or clear active).\n invokeSync(LayoutOperation.Close, { subject: [state.active] });\n }\n } else {\n invokeSync(LayoutOperation.SwitchWorkspace, { subject: Node.RootId });\n }\n }, [graph, invokeSync, state.active, state.history.length]);\n\n // Compute popover anchor ID.\n const popoverAnchorId =\n node && state.popoverAnchorId === `dxos.org/ui/${meta.id}/${node.id}` ? state.popoverAnchorId : undefined;\n\n return {\n title,\n actions: actionsAtom,\n showBackButton,\n popoverAnchorId,\n onBack: onBack,\n onAction: runAction,\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useMemo } from 'react';\n\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { useConnections } from '@dxos/plugin-graph';\nimport { byPosition } from '@dxos/util';\n\nimport { PLANK_COMPANION_TYPE } from './actions';\n\n/**\n * @deprecated Adopt the pattern from useNavbarActions (deriving from graph atoms)\n * or merge the Drawer companion display into the NavBar component.\n */\nexport const useCompanions = (nodeId?: string) => {\n const { graph } = useAppGraph();\n const nodes = useConnections(graph, nodeId, 'child');\n const companions = nodes.filter((node) => node.type === PLANK_COMPANION_TYPE);\n return useMemo(() => companions.toSorted((a, b) => byPosition(a.properties, b.properties)), [companions]);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Atom } from '@effect-atom/atom-react';\nimport * as Effect from 'effect/Effect';\n\nimport { type Capabilities } from '@dxos/app-framework';\nimport { type AppCapabilities, LayoutOperation } from '@dxos/app-toolkit';\nimport { Node } from '@dxos/plugin-graph';\nimport { ATTENDABLE_PATH_SEPARATOR } from '@dxos/react-ui-attention';\nimport { type ActionGraphProps } from '@dxos/react-ui-menu';\nimport { byPosition } from '@dxos/util';\n\nimport { type SimpleLayoutState } from '../types';\n\n// TODO(wittjosiah): Factor out to shared location with plugin-deck.\nexport const PLANK_COMPANION_TYPE = 'dxos.org/plugin/deck/plank-companion';\n\nexport type CompanionActionsConfig = {\n /** Prefix for companion action IDs (e.g. 'navbar' or 'drawer') */\n idPrefix: string;\n /** Optional: highlight companion with this variant */\n selectedVariant?: string;\n /** invokeSync function for dispatching operations */\n invokeSync: Capabilities.OperationInvoker['invokeSync'];\n};\n\n/**\n * Creates action graph nodes and edges for companion actions.\n * Shared logic between useNavbarActions and useDrawerActions.\n */\n// TODO(burdon): Use builder pattern.\nexport const createCompanionActions = (\n graph: AppCapabilities.AppGraph['graph'],\n stateAtom: Atom.Atom<SimpleLayoutState>,\n get: (atom: Atom.Atom<any>) => any,\n config: CompanionActionsConfig,\n): Pick<ActionGraphProps, 'nodes' | 'edges'> => {\n const { idPrefix, selectedVariant, invokeSync } = config;\n\n // Derive activeId from state atom.\n const state = get(stateAtom);\n const activeId = state.active ?? state.workspace;\n\n // Get companions from graph connections for activeId.\n const activeConnections = activeId ? get(graph.connections(activeId, 'child')) : [];\n const companions = activeConnections\n .filter((node: Node.Node) => node.type === PLANK_COMPANION_TYPE)\n .toSorted((a: Node.Node, b: Node.Node) => byPosition(a.properties, b.properties));\n\n const nodes: ActionGraphProps['nodes'] = [];\n const edges: ActionGraphProps['edges'] = [];\n\n // Add companion actions.\n // TODO(burdon): Cap at 6 items.\n companions.forEach((companion: Node.Node) => {\n // Extract variant for highlighting if needed.\n const [, companionVariant] = companion.id.split(ATTENDABLE_PATH_SEPARATOR);\n\n const companionAction = {\n id: `${idPrefix}-companion-${companion.id}`,\n type: Node.ActionType,\n properties: {\n icon: companion.properties.icon ?? 'ph--placeholder--regular',\n label: companion.properties.label,\n iconOnly: true,\n // Conditionally add variant highlighting.\n ...(selectedVariant !== undefined && {\n variant: selectedVariant === companionVariant ? 'primary' : 'ghost',\n }),\n },\n data: () =>\n Effect.sync(() =>\n invokeSync(LayoutOperation.Open, {\n subject: [companion.id],\n }),\n ),\n };\n nodes.push(companionAction);\n edges.push({ source: 'root', target: companionAction.id, relation: 'child' });\n });\n\n return { nodes, edges };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom } from '@effect-atom/atom-react';\nimport * as Effect from 'effect/Effect';\nimport { useMemo } from 'react';\n\nimport { useCapability, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { Node, useActionRunner } from '@dxos/plugin-graph';\nimport { useTranslation } from '@dxos/react-ui';\nimport { type ActionExecutor, type ActionGraphProps, createGapSeparator } from '@dxos/react-ui-menu';\n\nimport { useMobileLayout } from '../components';\nimport { meta } from '../meta';\nimport { SimpleLayoutState as SimpleLayoutStateCapability } from '../types';\n\nimport { createCompanionActions } from './actions';\nimport { useSimpleLayoutState } from './useSimpleLayoutState';\n\nexport type DrawerActions = {\n /** Action graph atom for the drawer. */\n actions: Atom.Atom<ActionGraphProps>;\n /** Action executor callback. */\n onAction: ActionExecutor;\n};\n\n/**\n * Builds the drawer actions including companion tabs and toolbar buttons.\n */\nexport const useDrawerActions = (consumerName: string): DrawerActions => {\n const { t } = useTranslation(meta.id);\n const stateAtom = useCapability(SimpleLayoutStateCapability);\n const { graph } = useAppGraph();\n const runAction = useActionRunner();\n const { invokeSync } = useOperationInvoker();\n const { updateState } = useSimpleLayoutState();\n const { keyboardOpen } = useMobileLayout(consumerName);\n\n // Create a computed atom that derives everything from graph connections and state.\n const actionsAtom = useMemo(\n () =>\n Atom.make((get): ActionGraphProps => {\n // Derive drawer state from state atom.\n const state = get(stateAtom);\n\n // Add companion tab actions.\n const { nodes, edges } = createCompanionActions(graph, stateAtom, get, {\n idPrefix: 'drawer',\n selectedVariant: state.companionVariant,\n invokeSync,\n });\n\n // Add gap separator before toolbar buttons.\n const gapSeparator = createGapSeparator('drawer-gap');\n nodes.push(...gapSeparator.nodes);\n edges.push(...gapSeparator.edges);\n\n // Add expand/collapse toggle button (hidden when keyboard is open).\n if (!keyboardOpen) {\n const isExpanded = state.drawerState === 'expanded';\n const toggleExpandAction = {\n id: 'drawer-toggle-expand',\n type: Node.ActionType,\n properties: {\n icon: isExpanded ? 'ph--arrow-down--regular' : 'ph--arrow-up--regular',\n label: isExpanded ? t('collapse drawer label') : t('expand drawer label'),\n iconOnly: true,\n },\n data: () =>\n Effect.sync(() => updateState((state) => ({ ...state, drawerState: isExpanded ? 'open' : 'expanded' }))),\n };\n nodes.push(toggleExpandAction);\n edges.push({ source: 'root', target: toggleExpandAction.id, relation: 'child' });\n }\n\n // Add close button.\n const closeAction = {\n id: 'drawer-close',\n type: Node.ActionType,\n properties: {\n icon: 'ph--x--regular',\n label: t('close drawer label'),\n iconOnly: true,\n },\n data: () => Effect.sync(() => updateState((state) => ({ ...state, drawerState: 'closed' }))),\n };\n nodes.push(closeAction);\n edges.push({ source: 'root', target: closeAction.id, relation: 'child' });\n\n return { nodes, edges };\n }),\n [graph, stateAtom, invokeSync, updateState, keyboardOpen, t],\n );\n\n return { actions: actionsAtom, onAction: runAction };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\n// TODO(burdon): Show skeleton: https://github.com/dxos/dxos/issues/8259\nexport const ContentLoading = () => {\n return <div role='none' className='grid place-items-center dx-attention-surface' />;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren, forwardRef, useEffect, useState } from 'react';\n\nimport { addEventListener, combine } from '@dxos/async';\nimport { log } from '@dxos/log';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\n\n// TODO(burdon): Move into @dxos/react-ui?\n\nconst MOBILE_LAYOUT_NAME = 'MobileLayout';\nconst MOBILE_LAYOUT_ROOT_NAME = 'MobileLayout.Root';\nconst MOBILE_LAYOUT_PANEL_NAME = 'MobileLayout.Panel';\n\n//\n// Context\n//\n\ntype MobileLayoutContextValue = {\n keyboardOpen: boolean;\n};\n\nconst [MobileLayoutProvider, useMobileLayout] = createContext<MobileLayoutContextValue>(MOBILE_LAYOUT_NAME);\n\n//\n// Root\n//\n\ntype MobileLayoutRootProps = ThemedClassName<\n PropsWithChildren<{\n transition?: number;\n onKeyboardOpenChange?: (nextState: boolean) => void;\n }>\n>;\n\n/**\n * Mobile layout root container that handles iOS keyboard detection.\n */\n// TODO(burdon): Should this be ios-only?\nconst MobileLayoutRoot = forwardRef<HTMLDivElement, MobileLayoutRootProps>(\n ({ classNames, children, transition = 250, onKeyboardOpenChange, ...props }, forwardedRef) => {\n const { open: keyboardOpen } = useIOSKeyboard();\n useAutoScroll();\n useEffect(() => onKeyboardOpenChange?.(keyboardOpen), [onKeyboardOpenChange, keyboardOpen]);\n useLockBodyScroll(keyboardOpen);\n\n return (\n <MobileLayoutProvider keyboardOpen={keyboardOpen}>\n <div\n {...props}\n role='none'\n style={{\n transition: `h-size ${transition}ms ease-out`,\n blockSize: 'calc(100vh - var(--kb-height, 0px))',\n }}\n className={mx('absolute top-0 left-0 right-0 flex flex-col', classNames)}\n ref={forwardedRef}\n >\n {children}\n </div>\n </MobileLayoutProvider>\n );\n },\n);\n\nMobileLayoutRoot.displayName = MOBILE_LAYOUT_ROOT_NAME;\n\n//\n// Panel\n//\n\ntype MobileLayoutPanelProps = ThemedClassName<\n PropsWithChildren<{\n safe?: {\n top: boolean;\n bottom: boolean;\n };\n }>\n>;\n\n/**\n * Mobile layout panel that applies safe area insets.\n */\nconst MobileLayoutPanel = forwardRef<HTMLDivElement, MobileLayoutPanelProps>(\n ({ classNames, children, safe, ...props }, forwardedRef) => {\n return (\n <div\n {...props}\n role='none'\n style={{\n paddingTop: safe?.top ? 'env(safe-area-inset-top)' : undefined,\n paddingBottom: safe?.bottom ? `calc((1 - var(--kb-open, 0)) * env(safe-area-inset-bottom))` : undefined,\n }}\n className={mx('relative h-full flex flex-col overflow-hidden', classNames)}\n ref={forwardedRef}\n >\n {children}\n </div>\n );\n },\n);\n\nMobileLayoutPanel.displayName = MOBILE_LAYOUT_PANEL_NAME;\n\n//\n// Exports\n//\n\nexport const MobileLayout = {\n Root: MobileLayoutRoot,\n Panel: MobileLayoutPanel,\n};\n\nexport { useMobileLayout };\n\nexport type { MobileLayoutRootProps, MobileLayoutPanelProps };\n\n/**\n * Prevent auto-scroll when input is focused.\n */\nconst useAutoScroll = () => {\n useEffect(() => {\n // Prevent auto-scroll when input is focused.\n return addEventListener(\n document,\n 'focus',\n (event: FocusEvent) => {\n const target = event.target as HTMLElement;\n if (\n target.tagName === 'INPUT' ||\n target.tagName === 'TEXTAREA' ||\n (target.tagName === 'DIV' && target.isContentEditable)\n ) {\n // Prevent default focus behavior.\n event.preventDefault();\n\n // Manually focus without scroll.\n target.focus({ preventScroll: true });\n\n // Lock current scroll position.\n const scrollX = window.scrollX;\n const scrollY = window.scrollY;\n requestAnimationFrame(() => {\n window.scrollTo(scrollX, scrollY);\n });\n\n // TODO(burdon): Scroll to position in parent; this may need to be via an intent,\n // since it may be plugin-specific (e.g., codemirror document.)\n }\n },\n // Important: focus events don't bubble, so capture phase is required.\n { capture: true },\n );\n }, []);\n};\n\n/**\n * Prevent iOS Safari viewport scroll when enabled.\n * Setting overflow:hidden doesn't work on iOS, so we must preventDefault on touchmove events.\n * Only allows scrolling if the target is within a scrollable container.\n */\nconst useLockBodyScroll = (enabled: boolean) => {\n useEffect(() => {\n if (!enabled) {\n return;\n }\n\n const isScrollable = (el: HTMLElement | null, axis: 'x' | 'y'): boolean => {\n while (el && el !== document.body) {\n const style = getComputedStyle(el);\n if (axis === 'y') {\n const overflow = style.overflowY;\n if ((overflow === 'auto' || overflow === 'scroll') && el.scrollHeight > el.clientHeight) {\n return true;\n }\n } else {\n const overflow = style.overflowX;\n if ((overflow === 'auto' || overflow === 'scroll') && el.scrollWidth > el.clientWidth) {\n return true;\n }\n }\n\n el = el.parentElement;\n }\n\n return false;\n };\n\n let touchStartX = 0;\n let touchStartY = 0;\n\n return combine(\n // Record initial touch position.\n addEventListener(\n document,\n 'touchstart',\n (event: TouchEvent) => {\n const touch = event.touches[0];\n touchStartX = touch.clientX;\n touchStartY = touch.clientY;\n },\n { passive: true },\n ),\n\n // Prevent scrolling the viewport.\n addEventListener(\n document,\n 'touchmove',\n (event: TouchEvent) => {\n const touch = event.touches[0];\n const dx = Math.abs(touch.clientX - touchStartX);\n const dy = Math.abs(touch.clientY - touchStartY);\n if (!isScrollable(event.target as HTMLElement, dx > dy ? 'x' : 'y')) {\n event.preventDefault();\n }\n },\n { passive: false },\n ),\n );\n }, [enabled]);\n};\n\n//\n// Hooks\n//\n\ntype IOSKeyboard = {\n open: boolean;\n height: number;\n};\n\n/**\n * Mobile container that handles iOS keyboard layout adjustments.\n *\n * Uses two strategies for keyboard detection:\n * 1. Tauri iOS: Native keyboard plugin for reliable height/animation events.\n * 2. Web/PWA: visualViewport API as fallback.\n *\n * iPhone (portrait, points)\n * - Without predictive bar: ~291 pt\n * - With predictive bar: ~335 pt\n * - With accessory view: ~380–420 pt\n *\n * Example:\n * - Viewport: 874 (entire screen)\n * - SafeArea: 96 (62+34)\n * - Main: 778\n * - Keyboard: 318; 413 (incl. Input Accessory View)\n *\n * CSS Variables set on document.documentElement:\n * --vvh: Visual viewport height (use as container height).\n * --kb-height: Keyboard height in pixels.\n * --kb-open: 1 when keyboard is open, 0 when closed.\n *\n * NOTE: By default when an input is selected on iOS the Input Accessory View is shown above the keyboard.\n * This can be disabled by setting the `inputAccessoryView` property to `false`.\n *\n * On iOS (Tauri), listens for 'keyboard' CustomEvents dispatched by the native KeyboardObserver.swift.\n * Falls back to VisualViewport API on other platforms.\n */\nconst useIOSKeyboard = (): IOSKeyboard => {\n const [open, setOpen] = useState(false);\n const [height, setHeight] = useState(0);\n\n // Detect keybaord state.\n useEffect(() => {\n const viewport = window.visualViewport;\n if (!viewport) {\n return;\n }\n\n // Handler for VisualViewport resize (fallback for non-iOS).\n const initialHeight = viewport.height ?? window.innerHeight;\n\n const updateState = (keyboardHeight: number, keyboardOpen: boolean) => {\n setOpen(keyboardOpen);\n setHeight(keyboardHeight);\n\n const vvh = initialHeight - keyboardHeight;\n document.documentElement.style.setProperty('--vvh', `${vvh}px`);\n document.documentElement.style.setProperty('--kb-height', `${keyboardHeight}px`);\n document.documentElement.style.setProperty('--kb-open', keyboardOpen ? '1' : '0');\n log.info('viewport size', { initialHeight, vvh, keyboardHeight, keyboardOpen });\n };\n\n return combine(\n // Handler for native iOS keyboard events (from KeyboardObserver.swift).\n addEventListener(\n window,\n 'keyboard' as any,\n (event: CustomEvent<{ type: 'show' | 'hide'; height: number; duration: number }>) => {\n const { type, height } = event.detail;\n log.info('keyboard event', { type, height });\n updateState(height, type === 'show');\n },\n ),\n );\n }, []);\n\n return { open, height };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { useObjectNavigate } from '@dxos/app-toolkit/ui';\nimport { Popover, type PopoverContentInteractOutsideEvent, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { Card } from '@dxos/react-ui';\n\nimport { useSimpleLayoutState } from '../../hooks';\nimport { meta } from '../../meta';\n\nconst DEBOUNCE_DELAY = 40;\n\ntype LayoutPopoverContextValue = {\n setOpen: (open: boolean) => void;\n};\n\nconst [LayoutPopoverProvider, useLayoutPopoverContext] = createContext<LayoutPopoverContextValue>('LayoutPopover');\n\nexport const PopoverRoot = ({ children }: PropsWithChildren) => {\n const { state } = useSimpleLayoutState();\n const [open, setOpen] = useState(false);\n const virtualRef = useRef<HTMLButtonElement | null>(null);\n const [virtualIter, setVirtualIter] = useState(0);\n const debounceRef = useRef<NodeJS.Timeout | null>(null);\n\n // TODO(thure): This is a workaround for the race condition between displaying a Popover and either rendering\n // the anchor further down the tree or measuring the virtual trigger's client rect.\n useEffect(() => {\n setOpen(false);\n if (state.popoverOpen) {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n if (state.popoverAnchor && virtualRef.current !== state.popoverAnchor) {\n virtualRef.current = state.popoverAnchor ?? null;\n setVirtualIter((iter) => iter + 1);\n }\n debounceRef.current = setTimeout(() => setOpen(true), DEBOUNCE_DELAY);\n }\n }, [state.popoverOpen, state.popoverAnchorId, state.popoverAnchor, state.popoverContent]);\n\n return (\n <LayoutPopoverProvider setOpen={setOpen}>\n <Popover.Root modal={false} open={open}>\n {state.popoverAnchor && <Popover.VirtualTrigger key={virtualIter} virtualRef={virtualRef} />}\n {children}\n </Popover.Root>\n </LayoutPopoverProvider>\n );\n};\n\n// Extracts the subject from popover content if it has one, otherwise returns the content as-is.\nconst getPopoverSubject = (content: unknown): unknown =>\n content && typeof content === 'object' && 'subject' in content ? (content as { subject: unknown }).subject : content;\n\nexport const PopoverContent = () => {\n const { t } = useTranslation(meta.id);\n const { state, updateState } = useSimpleLayoutState();\n const { setOpen } = useLayoutPopoverContext('PopoverContent');\n const handleNavigate = useObjectNavigate(getPopoverSubject(state.popoverContent));\n\n const handleClose = useCallback(() => {\n setOpen(false);\n updateState((s) => ({\n ...s,\n popoverOpen: false,\n popoverAnchor: undefined,\n popoverAnchorId: undefined,\n popoverSide: undefined,\n }));\n }, [setOpen, updateState]);\n\n const handleInteractOutside = useCallback(\n (event: KeyboardEvent | PopoverContentInteractOutsideEvent) => {\n if (\n // TODO(thure): CodeMirror should not focus itself when it updates.\n event.type === 'dismissableLayer.focusOutside' &&\n (event.currentTarget as HTMLElement | undefined)?.classList.contains('cm-content')\n ) {\n event.preventDefault();\n } else {\n handleClose();\n }\n },\n [handleClose],\n );\n\n const collisionBoundaries: HTMLElement[] = useMemo(() => {\n const closest = state.popoverAnchor?.closest('[data-popover-collision-boundary]') as HTMLElement | null | undefined;\n return closest ? [closest] : [];\n }, [state.popoverAnchor]);\n\n return (\n <Popover.Portal>\n <Popover.Content\n side={state.popoverSide}\n sticky='always'\n hideWhenDetached\n collisionBoundary={collisionBoundaries}\n onInteractOutside={handleInteractOutside}\n onEscapeKeyDown={handleInteractOutside}\n >\n <Popover.Viewport>\n {state.popoverKind === 'base' && <Surface.Surface role='popover' data={state.popoverContent} limit={1} />}\n {state.popoverKind === 'card' && (\n <Card.Root border={false} classNames='dx-card-popover'>\n <Card.Toolbar>\n {/* TODO(wittjosiah): Cleaner way to handle no drag handle in toolbar? */}\n <span />\n {state.popoverTitle ? (\n <Card.Title onClick={handleNavigate}>{toLocalizedString(state.popoverTitle, t)}</Card.Title>\n ) : (\n <span />\n )}\n <Card.CloseIconButton onClick={handleClose} />\n </Card.Toolbar>\n <Surface.Surface role='card--content' data={state.popoverContent} limit={1} />\n </Card.Root>\n )}\n </Popover.Viewport>\n <Popover.Arrow />\n </Popover.Content>\n </Popover.Portal>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Atom, useAtomValue } from '@effect-atom/atom-react';\nimport React, { Fragment } from 'react';\n\nimport { IconButton, Popover, type ThemedClassName, Toolbar, useTranslation } from '@dxos/react-ui';\nimport { type ActionExecutor, type ActionGraphProps, Menu, useMenuActions } from '@dxos/react-ui-menu';\nimport { mx, osTranslations } from '@dxos/ui-theme';\n\nimport { meta } from '../../meta';\nimport { useMobileLayout } from '../MobileLayout';\n\nconst APP_BAR_NAME = 'SimpleLayout.AppBar';\n\nexport type AppBarProps = ThemedClassName<{\n /** Title/label to display in the banner. */\n title?: string;\n /** Action graph atom for the dropdown menu. */\n actions: Atom.Atom<ActionGraphProps>;\n /** Whether to show the back button. */\n showBackButton?: boolean;\n /** Popover anchor ID for the dropdown trigger. */\n popoverAnchorId?: string;\n /** Action executor callback. */\n onAction?: ActionExecutor;\n /** Callback when back button is clicked. */\n onBack?: () => void;\n}>;\n\n/**\n * AppBar component that renders a title, optional back button, and actions dropdown.\n */\nexport const AppBar = ({\n classNames,\n title,\n actions,\n showBackButton,\n popoverAnchorId,\n onAction,\n onBack,\n}: AppBarProps) => {\n const { t } = useTranslation(meta.id);\n const menu = useMenuActions(actions);\n const actionsValue = useAtomValue(actions);\n const hasActions = actionsValue.nodes.length > 0;\n const { keyboardOpen } = useMobileLayout(APP_BAR_NAME);\n\n // Fall back to app name if no title provided.\n const displayTitle = title ?? t('current app name', { ns: osTranslations });\n\n // Wrap the menu trigger with Popover.Anchor when the popoverAnchorId is set.\n const AnchorRoot = popoverAnchorId ? Popover.Anchor : Fragment;\n\n return (\n <Toolbar.Root\n role='banner'\n classNames={mx(\n 'grid grid-cols-[var(--dx-rail-size)_1fr_var(--dx-rail-size)] items-center',\n 'dx-density-fine',\n classNames,\n )}\n >\n {keyboardOpen ? (\n <IconButton variant='ghost' icon='ph--x--regular' iconOnly label={t('done label')} />\n ) : showBackButton ? (\n <IconButton variant='ghost' icon='ph--caret-left--regular' iconOnly label={t('back label')} onClick={onBack} />\n ) : (\n <div />\n )}\n <h1 className='text-center truncate font-thin uppercase'>{displayTitle}</h1>\n {hasActions ? (\n <AnchorRoot>\n <Menu.Root {...menu} caller={meta.id} onAction={onAction}>\n <Menu.Trigger asChild>\n <IconButton\n variant='ghost'\n icon='ph--dots-three-vertical--regular'\n iconOnly\n label={t('actions menu label')}\n />\n </Menu.Trigger>\n <Menu.Content />\n </Menu.Root>\n </AnchorRoot>\n ) : (\n <span />\n )}\n </Toolbar.Root>\n );\n};\n\nAppBar.displayName = APP_BAR_NAME;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useMemo } from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { useNode } from '@dxos/plugin-graph';\nimport { ErrorFallback } from '@dxos/react-ui';\nimport { useAttentionAttributes } from '@dxos/react-ui-attention';\nimport { mx } from '@dxos/ui-theme';\n\nimport { useAppBarProps, useNavbarActions, useSimpleLayoutState } from '../../hooks';\nimport { ContentLoading } from '../ContentLoading';\nimport { useLoadDescendents } from '../hooks';\nimport { useMobileLayout } from '../MobileLayout/MobileLayout';\n\nimport { AppBar } from './AppBar';\nimport { NavBar } from './NavBar';\n\nconst MAIN_NAME = 'SimpleLayout.Main';\n\n/**\n * Main content component.\n */\nexport const Main = () => {\n const { state } = useSimpleLayoutState();\n const id = state.active ?? state.workspace;\n const attentionAttrs = useAttentionAttributes(id);\n const { keyboardOpen } = useMobileLayout(MAIN_NAME);\n const { actions, onAction } = useNavbarActions();\n const appBarProps = useAppBarProps();\n\n const placeholder = useMemo(() => <ContentLoading />, []);\n\n const { graph } = useAppGraph();\n const node = useNode(graph, id);\n const data = useMemo(() => {\n return (\n node && {\n attendableId: id,\n subject: node.data,\n properties: node.properties,\n popoverAnchorId: state.popoverAnchorId,\n }\n );\n }, [id, node, node?.data, node?.properties, state.popoverAnchorId]);\n\n // Ensures that children are loaded so that they are available to navigate to.\n useLoadDescendents(id);\n\n // TODO(burdon): BUG: When showing ANY statusbar the size progressively shrinks when the keyboard opens/closes.\n const showNavBar = !keyboardOpen && !state.isPopover && state.drawerState === 'closed';\n\n return (\n <div\n role='none'\n className={mx(\n 'h-full grid overflow-hidden bg-toolbar-surface',\n showNavBar\n ? 'grid-rows-[var(--dx-rail-action)_1fr_var(--dx-toolbar-size)]'\n : 'grid-rows-[var(--dx-rail-action)_1fr]',\n )}\n {...attentionAttrs}\n >\n <AppBar {...appBarProps} />\n <article className='h-full overflow-hidden bg-base-surface'>\n <Surface.Surface\n key={id}\n role='article'\n data={data}\n limit={1}\n fallback={ErrorFallback}\n placeholder={placeholder}\n />\n </article>\n {showNavBar && <NavBar classNames='border-y border-subdued-separator' actions={actions} onAction={onAction} />}\n </div>\n );\n};\n\nMain.displayName = MAIN_NAME;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Atom } from '@effect-atom/atom-react';\nimport React from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { type ActionExecutor, type ActionGraphProps, Menu, useMenuActions } from '@dxos/react-ui-menu';\nimport { mx } from '@dxos/ui-theme';\n\nconst NAVBAR_NAME = 'SimpleLayout.NavBar';\n\nexport type NavBarProps = ThemedClassName<{\n /** Action graph atom for the toolbar. */\n actions: Atom.Atom<ActionGraphProps>;\n /** Action executor callback. */\n onAction?: ActionExecutor;\n}>;\n\n/**\n * Presentational navbar component that renders a toolbar from an action graph.\n */\nexport const NavBar = ({ classNames, actions, onAction }: NavBarProps) => {\n const menu = useMenuActions(actions);\n\n return (\n <Menu.Root {...menu} alwaysActive onAction={onAction}>\n <Menu.Toolbar density='coarse' classNames={mx(classNames)} />\n </Menu.Root>\n );\n};\n\nNavBar.displayName = NAVBAR_NAME;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useRef } from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { type Node, useConnections } from '@dxos/plugin-graph';\nimport { Avatar, Icon, Panel, ScrollArea, Toolbar, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { Card } from '@dxos/react-ui';\nimport { Mosaic, type MosaicStackTileComponent } from '@dxos/react-ui-mosaic';\nimport { SearchList, useSearchListItem, useSearchListResults } from '@dxos/react-ui-searchlist';\nimport { mx } from '@dxos/ui-theme';\n\nimport { meta } from '../../meta';\nimport { useLoadDescendents } from '../hooks';\n\nexport type WorkspaceProps = {\n id: string;\n};\n\n/**\n * Displays the contents of a workspace disposition graph node as a searchable list.\n * Shows direct children of the workspace with icons and labels,\n * allowing users to filter via search and navigate by selecting an item.\n */\nexport const Workspace = ({ id }: WorkspaceProps) => {\n const { t } = useTranslation(meta.id);\n const { graph } = useAppGraph();\n\n // Expand the workspace node to load its children.\n useLoadDescendents(id);\n\n // Get direct children of the workspace node.\n const children = useConnections(graph, id, 'child');\n\n const { results, handleSearch } = useSearchListResults({\n items: children,\n extract: (child) => toLocalizedString(child.properties.label, t),\n });\n\n return (\n <SearchList.Root onSearch={handleSearch}>\n <Panel.Root>\n <Panel.Toolbar asChild>\n <Toolbar.Root>\n <SearchList.Input placeholder={t('search placeholder')} autoFocus />\n </Toolbar.Root>\n </Panel.Toolbar>\n <Panel.Content asChild>\n <SearchList.Content>\n <Mosaic.Container asChild>\n <ScrollArea.Root orientation='vertical'>\n <ScrollArea.Viewport classNames='p-2'>\n <Mosaic.Stack items={results} getId={(child) => child.id} Tile={WorkspaceChildTile} />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n </Mosaic.Container>\n </SearchList.Content>\n </Panel.Content>\n </Panel.Root>\n </SearchList.Root>\n );\n};\n\nconst WorkspaceChildTile: MosaicStackTileComponent<Node.Node> = (props) => {\n const data = props.data;\n const { t } = useTranslation(meta.id);\n const { invokeSync } = useOperationInvoker();\n const ref = useRef<HTMLDivElement>(null);\n const { selectedValue, registerItem, unregisterItem } = useSearchListItem();\n const isSelected = selectedValue === data.id;\n\n const name = toLocalizedString(data.properties.label, t);\n\n const handleSelect = useCallback(\n () => invokeSync(LayoutOperation.Open, { subject: [data.id] }),\n [invokeSync, data.id],\n );\n\n // Register this item with the search context.\n useEffect(() => {\n if (ref.current) {\n registerItem(data.id, ref.current, handleSelect);\n }\n\n return () => unregisterItem(data.id);\n }, [data.id, handleSelect, registerItem, unregisterItem]);\n\n // Scroll into view when selected.\n useEffect(() => {\n if (isSelected && ref.current) {\n ref.current.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }, [isSelected]);\n\n return (\n <Card.Root\n ref={ref}\n role='button'\n fullWidth\n tabIndex={-1} // TODO(burdon): Use Mosaic.Focus.\n data-selected={isSelected}\n classNames={mx('dx-focus-ring', isSelected && 'bg-hover-overlay')}\n onClick={handleSelect}\n >\n <Card.Toolbar density='coarse'>\n <Avatar.Root>\n <Avatar.Content\n hue={data.properties.hue}\n icon={data.properties.icon}\n hueVariant='transparent'\n variant='square'\n size={12}\n fallback={name}\n />\n <Avatar.Label>{name}</Avatar.Label>\n <Icon icon='ph--caret-right--regular' />\n </Avatar.Root>\n </Card.Toolbar>\n </Card.Root>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { RegistryContext, useAtomValue } from '@effect-atom/atom-react';\nimport { useCallback, useContext } from 'react';\n\nimport { useCapability } from '@dxos/app-framework/ui';\n\nimport { SimpleLayoutState } from '../types';\n\nexport type UseSimpleLayoutState = {\n state: SimpleLayoutState;\n updateState: (fn: (current: SimpleLayoutState) => SimpleLayoutState) => void;\n};\n\nexport const useSimpleLayoutState = (): UseSimpleLayoutState => {\n const registry = useContext(RegistryContext);\n const stateAtom = useCapability(SimpleLayoutState);\n const state = useAtomValue(stateAtom);\n\n const updateState = useCallback(\n (fn: (current: SimpleLayoutState) => SimpleLayoutState) => {\n registry.set(stateAtom, fn(registry.get(stateAtom)));\n },\n [registry, stateAtom],\n );\n\n return { state, updateState };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom } from '@effect-atom/atom-react';\nimport { useMemo } from 'react';\n\nimport { useCapability, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { Node, useActionRunner } from '@dxos/plugin-graph';\nimport { useTranslation } from '@dxos/react-ui';\nimport {\n type ActionExecutor,\n type ActionGraphProps,\n createGapSeparator,\n createMenuItemGroup,\n} from '@dxos/react-ui-menu';\n\nimport { meta } from '../meta';\nimport { SimpleLayoutState } from '../types';\n\nimport { createCompanionActions } from './actions';\n\nconst MAIN_MENU_GROUP_ID = 'navbar-main-menu';\n\nexport type NavbarActions = {\n /** Action graph atom for the navbar. */\n actions: Atom.Atom<ActionGraphProps>;\n /** Action executor callback. */\n onAction: ActionExecutor;\n};\n\n/**\n * Builds the navbar actions including companion icons, separator, and main menu dropdown.\n * Derives everything from graph connection atoms for proper reactivity.\n */\nexport const useNavbarActions = (): NavbarActions => {\n const { t } = useTranslation(meta.id);\n const { graph } = useAppGraph();\n const runAction = useActionRunner();\n const { invokeSync } = useOperationInvoker();\n const stateAtom = useCapability(SimpleLayoutState);\n\n // Create a computed atom that derives everything from graph connections and state.\n const actionsAtom = useMemo(\n () =>\n Atom.make((get): ActionGraphProps => {\n // Add companion actions.\n const { nodes, edges } = createCompanionActions(graph, stateAtom, get, {\n idPrefix: 'navbar',\n invokeSync,\n });\n\n // Add gap separator.\n const gapSeparator = createGapSeparator('navbar-gap');\n nodes.push(...gapSeparator.nodes);\n edges.push(...gapSeparator.edges);\n\n // Add main menu dropdown group.\n const mainMenuGroup = createMenuItemGroup(MAIN_MENU_GROUP_ID, {\n variant: 'dropdownMenu',\n icon: 'ph--list--regular',\n iconOnly: true,\n label: t('main menu label'),\n testId: 'simpleLayoutPlugin.addSpace',\n });\n nodes.push(mainMenuGroup);\n edges.push({ source: 'root', target: mainMenuGroup.id, relation: 'child' });\n\n // Get menu actions from root actions (on 'action' edge relation).\n const rootActions = get(graph.actions(Node.RootId));\n const menuActions = rootActions.filter((node) => node.properties.disposition === 'menu');\n\n // Add menu actions as children of the dropdown group.\n menuActions.forEach((menuAction) => {\n nodes.push(menuAction as ActionGraphProps['nodes'][number]);\n edges.push({ source: MAIN_MENU_GROUP_ID, target: menuAction.id, relation: 'child' });\n });\n\n return { nodes, edges };\n }),\n [graph, stateAtom, invokeSync, t],\n );\n\n return { actions: actionsAtom, onAction: runAction };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { AlertDialog, Dialog as NaturalDialog } from '@dxos/react-ui';\nimport { ErrorFallback } from '@dxos/react-ui';\n\nimport { useSimpleLayoutState } from '../../hooks';\n\nexport const Dialog = () => {\n const { state, updateState } = useSimpleLayoutState();\n\n const DialogRoot = state.dialogType === 'alert' ? AlertDialog.Root : NaturalDialog.Root;\n const DialogOverlay = state.dialogType === 'alert' ? AlertDialog.Overlay : NaturalDialog.Overlay;\n\n return (\n <DialogRoot\n modal={state.dialogBlockAlign !== 'end'}\n open={state.dialogOpen}\n onOpenChange={(nextOpen) => updateState((state) => ({ ...state, dialogOpen: nextOpen }))}\n >\n {state.dialogBlockAlign === 'end' ? (\n <Surface.Surface role='dialog' data={state.dialogContent} limit={1} fallback={ErrorFallback} />\n ) : (\n <DialogOverlay\n blockAlign={state.dialogBlockAlign}\n classNames={state.dialogOverlayClasses}\n style={state.dialogOverlayStyle}\n >\n <Surface.Surface role='dialog' data={state.dialogContent} limit={1} fallback={ErrorFallback} />\n </DialogOverlay>\n )}\n </DialogRoot>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useMemo } from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { type Node, useNode } from '@dxos/plugin-graph';\nimport { ErrorFallback, Panel } from '@dxos/react-ui';\nimport { ATTENDABLE_PATH_SEPARATOR } from '@dxos/react-ui-attention';\nimport { Menu, useMenuActions } from '@dxos/react-ui-menu';\n\nimport { useCompanions, useDrawerActions, useSimpleLayoutState } from '../../hooks';\nimport { ContentLoading } from '../ContentLoading';\n\nconst DRAWER_NAME = 'SimpleLayout.Drawer';\n\n/**\n * Companion drawer component.\n */\nexport const Drawer = () => {\n const { graph } = useAppGraph();\n const { state: layoutState } = useSimpleLayoutState();\n\n const placeholder = useMemo(() => <ContentLoading />, []);\n\n // Get all companions for the current active (primary) item.\n const activeId = layoutState.active ?? layoutState.workspace;\n const companions = useCompanions(activeId);\n const { companionId, variant } = useSelectedCompanion(companions, layoutState.companionVariant);\n\n // Get node for the selected companion.\n const node = useNode(graph, companionId);\n const parentNode = useNode(graph, activeId);\n\n // Build Surface data for the companion content.\n const data = useMemo(() => {\n return (\n node && {\n attendableId: companionId,\n subject: node.data,\n companionTo: parentNode?.data,\n properties: node.properties,\n variant,\n }\n );\n }, [companionId, node, parentNode, variant]);\n\n // Get drawer actions (tabs + toolbar buttons).\n const { actions, onAction } = useDrawerActions(DRAWER_NAME);\n const menu = useMenuActions(actions);\n\n return (\n <Panel.Root>\n <Panel.Toolbar>\n <Menu.Root {...menu} alwaysActive onAction={onAction}>\n <Menu.Toolbar density='coarse' />\n </Menu.Root>\n </Panel.Toolbar>\n <Panel.Content asChild>\n <Surface.Surface role='article' data={data} limit={1} fallback={ErrorFallback} placeholder={placeholder} />\n </Panel.Content>\n </Panel.Root>\n );\n};\n\nDrawer.displayName = DRAWER_NAME;\n\n/** Parse entry ID to extract primary ID and variant. */\nconst parseEntryId = (entryId: string) => {\n const [id, variant] = entryId.split(ATTENDABLE_PATH_SEPARATOR);\n return { id, variant };\n};\n\n/**\n * Resolves which companion to show based on variant preference.\n * Falls back to first available if preferred variant not available.\n */\nconst useSelectedCompanion = (companions: Node.Node[], preferredVariant?: string) => {\n const selectedCompanion = useMemo(() => {\n if (companions.length === 0) {\n return undefined;\n }\n\n // Try to find companion matching the preferred variant.\n if (preferredVariant) {\n const preferred = companions.find((c) => {\n const { variant } = parseEntryId(c.id);\n return variant === preferredVariant;\n });\n if (preferred) {\n return preferred;\n }\n }\n\n // Fallback to first companion.\n return companions[0];\n }, [companions, preferredVariant]);\n\n const companionId = selectedCompanion?.id;\n const { variant } = parseEntryId(companionId ?? '');\n\n return { selectedCompanion, companionId, variant };\n};\n"],
5
- "mappings": "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",
6
- "names": ["React", "useCallback", "useEffect", "useMemo", "useRef", "useOperationInvoker", "LayoutOperation", "useAppGraph", "Node", "useConnections", "Avatar", "Icon", "Panel", "ScrollArea", "Toolbar", "toLocalizedString", "useTranslation", "Card", "Mosaic", "SearchList", "useSearchListItem", "useSearchListResults", "mx", "byPosition", "useEffect", "useAppGraph", "Graph", "useLoadDescendents", "nodeId", "graph", "useAppGraph", "useEffect", "Graph", "expand", "getConnections", "forEach", "child", "id", "Home", "_", "t", "useTranslation", "meta", "id", "userAccountItem", "useItemsByDisposition", "pinnedItems", "workspaceItems", "useLoadDescendents", "Node", "RootId", "items", "useMemo", "results", "handleSearch", "useSearchListResults", "extract", "node", "toLocalizedString", "properties", "label", "SearchList", "Root", "onSearch", "Panel", "Toolbar", "asChild", "Input", "placeholder", "autoFocus", "Content", "Mosaic", "Container", "ScrollArea", "orientation", "Viewport", "classNames", "Stack", "getId", "Tile", "WorkspaceTile", "props", "data", "invokePromise", "useOperationInvoker", "selectedValue", "registerItem", "unregisterItem", "useSearchListItem", "name", "isSelected", "cardRef", "useRef", "handleSelect", "useCallback", "LayoutOperation", "SwitchWorkspace", "subject", "useEffect", "current", "scrollIntoView", "block", "behavior", "Card", "role", "fullWidth", "tabIndex", "data-selected", "mx", "onClick", "ref", "density", "Avatar", "icon", "hue", "hueVariant", "variant", "size", "fallback", "Label", "Icon", "filterItems", "disposition", "sort", "graph", "useAppGraph", "connections", "useConnections", "filtered", "filter", "toSorted", "a", "b", "byPosition", "React", "useEffect", "useRef", "useState", "Splitter", "Mosaic", "Atom", "useAtomValue", "Effect", "Option", "useCallback", "useMemo", "useCapability", "useOperationInvoker", "LayoutOperation", "useAppGraph", "Graph", "Node", "useActionRunner", "useNode", "toLocalizedString", "useTranslation", "useAppBarProps", "t", "useTranslation", "meta", "id", "stateAtom", "useCapability", "SimpleLayoutStateCapability", "state", "useAtomValue", "graph", "useAppGraph", "invokeSync", "useOperationInvoker", "runAction", "useActionRunner", "activeId", "active", "workspace", "node", "useNode", "title", "toLocalizedString", "properties", "label", "undefined", "actionsAtom", "useMemo", "Atom", "make", "get", "allActions", "actions", "filtered", "filter", "action", "includes", "disposition", "nodes", "edges", "map", "source", "target", "relation", "workspaceConnections", "connections", "alternateTreeNode", "find", "settingsAction", "type", "Node", "ActionType", "data", "sync", "LayoutOperation", "Open", "subject", "icon", "push", "showBackButton", "RootId", "onBack", "useCallback", "isWorkspace", "Graph", "getNode", "pipe", "getOrElse", "history", "length", "SwitchWorkspace", "Close", "popoverAnchorId", "onAction", "useMemo", "useAppGraph", "useConnections", "byPosition", "Effect", "LayoutOperation", "Node", "ATTENDABLE_PATH_SEPARATOR", "byPosition", "PLANK_COMPANION_TYPE", "createCompanionActions", "graph", "stateAtom", "get", "config", "idPrefix", "selectedVariant", "invokeSync", "state", "activeId", "active", "workspace", "activeConnections", "connections", "companions", "filter", "node", "type", "toSorted", "a", "b", "byPosition", "properties", "nodes", "edges", "forEach", "companion", "companionVariant", "id", "split", "ATTENDABLE_PATH_SEPARATOR", "companionAction", "Node", "ActionType", "icon", "label", "iconOnly", "undefined", "variant", "data", "sync", "LayoutOperation", "Open", "subject", "push", "source", "target", "relation", "useCompanions", "nodeId", "graph", "useAppGraph", "nodes", "useConnections", "companions", "filter", "node", "type", "PLANK_COMPANION_TYPE", "useMemo", "toSorted", "a", "b", "byPosition", "properties", "Atom", "Effect", "useMemo", "useCapability", "useOperationInvoker", "useAppGraph", "Node", "useActionRunner", "useTranslation", "createGapSeparator", "React", "ContentLoading", "React", "div", "role", "className", "createContext", "React", "forwardRef", "useEffect", "useState", "addEventListener", "combine", "log", "mx", "MOBILE_LAYOUT_NAME", "MOBILE_LAYOUT_ROOT_NAME", "MOBILE_LAYOUT_PANEL_NAME", "MobileLayoutProvider", "useMobileLayout", "MobileLayoutRoot", "classNames", "children", "transition", "onKeyboardOpenChange", "props", "forwardedRef", "open", "keyboardOpen", "useIOSKeyboard", "useAutoScroll", "useLockBodyScroll", "div", "role", "style", "blockSize", "className", "ref", "displayName", "MobileLayoutPanel", "safe", "paddingTop", "top", "undefined", "paddingBottom", "bottom", "MobileLayout", "Root", "Panel", "useAutoScroll", "useEffect", "addEventListener", "document", "event", "target", "tagName", "isContentEditable", "preventDefault", "focus", "preventScroll", "scrollX", "window", "scrollY", "requestAnimationFrame", "scrollTo", "capture", "useLockBodyScroll", "enabled", "isScrollable", "el", "axis", "body", "style", "getComputedStyle", "overflow", "overflowY", "scrollHeight", "clientHeight", "overflowX", "scrollWidth", "clientWidth", "parentElement", "touchStartX", "touchStartY", "combine", "touch", "touches", "clientX", "clientY", "passive", "dx", "Math", "abs", "dy", "useIOSKeyboard", "open", "setOpen", "useState", "height", "setHeight", "viewport", "visualViewport", "initialHeight", "innerHeight", "updateState", "keyboardHeight", "keyboardOpen", "vvh", "documentElement", "setProperty", "log", "info", "type", "detail", "createContext", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "Surface", "useObjectNavigate", "Popover", "toLocalizedString", "useTranslation", "Card", "DEBOUNCE_DELAY", "LayoutPopoverProvider", "useLayoutPopoverContext", "createContext", "PopoverRoot", "children", "state", "useSimpleLayoutState", "open", "setOpen", "useState", "virtualRef", "useRef", "virtualIter", "setVirtualIter", "debounceRef", "useEffect", "popoverOpen", "current", "clearTimeout", "popoverAnchor", "iter", "setTimeout", "popoverAnchorId", "popoverContent", "React", "Popover", "Root", "modal", "VirtualTrigger", "key", "getPopoverSubject", "content", "subject", "PopoverContent", "t", "useTranslation", "meta", "id", "updateState", "handleNavigate", "useObjectNavigate", "handleClose", "useCallback", "s", "undefined", "popoverSide", "handleInteractOutside", "event", "type", "currentTarget", "classList", "contains", "preventDefault", "collisionBoundaries", "useMemo", "closest", "Portal", "Content", "side", "sticky", "hideWhenDetached", "collisionBoundary", "onInteractOutside", "onEscapeKeyDown", "Viewport", "popoverKind", "Surface", "role", "data", "limit", "Card", "border", "classNames", "Toolbar", "span", "popoverTitle", "Title", "onClick", "toLocalizedString", "CloseIconButton", "Arrow", "useAtomValue", "React", "Fragment", "IconButton", "Popover", "Toolbar", "useTranslation", "Menu", "useMenuActions", "mx", "osTranslations", "APP_BAR_NAME", "AppBar", "classNames", "title", "actions", "showBackButton", "popoverAnchorId", "onAction", "onBack", "t", "useTranslation", "meta", "id", "menu", "useMenuActions", "actionsValue", "useAtomValue", "hasActions", "nodes", "length", "keyboardOpen", "useMobileLayout", "displayTitle", "ns", "osTranslations", "AnchorRoot", "Popover", "Anchor", "Fragment", "React", "Toolbar", "Root", "role", "mx", "IconButton", "variant", "icon", "iconOnly", "label", "onClick", "div", "h1", "className", "Menu", "caller", "Trigger", "asChild", "Content", "span", "displayName", "React", "useMemo", "Surface", "useAppGraph", "useNode", "ErrorFallback", "useAttentionAttributes", "mx", "React", "Menu", "useMenuActions", "mx", "NAVBAR_NAME", "NavBar", "classNames", "actions", "onAction", "menu", "useMenuActions", "React", "Menu", "Root", "alwaysActive", "Toolbar", "density", "mx", "displayName", "MAIN_NAME", "Main", "state", "useSimpleLayoutState", "id", "active", "workspace", "attentionAttrs", "useAttentionAttributes", "keyboardOpen", "useMobileLayout", "actions", "onAction", "useNavbarActions", "appBarProps", "useAppBarProps", "placeholder", "useMemo", "React", "ContentLoading", "graph", "useAppGraph", "node", "useNode", "data", "attendableId", "subject", "properties", "popoverAnchorId", "useLoadDescendents", "showNavBar", "isPopover", "drawerState", "div", "role", "className", "mx", "AppBar", "article", "Surface", "key", "limit", "fallback", "ErrorFallback", "NavBar", "classNames", "displayName", "React", "useCallback", "useEffect", "useRef", "useOperationInvoker", "LayoutOperation", "useAppGraph", "useConnections", "Avatar", "Icon", "Panel", "ScrollArea", "Toolbar", "toLocalizedString", "useTranslation", "Card", "Mosaic", "SearchList", "useSearchListItem", "useSearchListResults", "mx", "Workspace", "id", "t", "useTranslation", "meta", "graph", "useAppGraph", "useLoadDescendents", "children", "useConnections", "results", "handleSearch", "useSearchListResults", "items", "extract", "child", "toLocalizedString", "properties", "label", "React", "SearchList", "Root", "onSearch", "Panel", "Toolbar", "asChild", "Input", "placeholder", "autoFocus", "Content", "Mosaic", "Container", "ScrollArea", "orientation", "Viewport", "classNames", "Stack", "getId", "Tile", "WorkspaceChildTile", "props", "data", "invokeSync", "useOperationInvoker", "ref", "useRef", "selectedValue", "registerItem", "unregisterItem", "useSearchListItem", "isSelected", "name", "handleSelect", "useCallback", "LayoutOperation", "Open", "subject", "useEffect", "current", "scrollIntoView", "block", "behavior", "Card", "role", "fullWidth", "tabIndex", "data-selected", "mx", "onClick", "density", "Avatar", "hue", "icon", "hueVariant", "variant", "size", "fallback", "Label", "Icon", "RegistryContext", "useAtomValue", "useCallback", "useContext", "useCapability", "useSimpleLayoutState", "registry", "useContext", "RegistryContext", "stateAtom", "useCapability", "SimpleLayoutState", "state", "useAtomValue", "updateState", "useCallback", "fn", "set", "get", "useDrawerActions", "consumerName", "t", "useTranslation", "meta", "id", "stateAtom", "useCapability", "SimpleLayoutStateCapability", "graph", "useAppGraph", "runAction", "useActionRunner", "invokeSync", "useOperationInvoker", "updateState", "useSimpleLayoutState", "keyboardOpen", "useMobileLayout", "actionsAtom", "useMemo", "Atom", "make", "get", "state", "nodes", "edges", "createCompanionActions", "idPrefix", "selectedVariant", "companionVariant", "gapSeparator", "createGapSeparator", "push", "isExpanded", "drawerState", "toggleExpandAction", "type", "Node", "ActionType", "properties", "icon", "label", "iconOnly", "data", "sync", "source", "target", "relation", "closeAction", "actions", "onAction", "Atom", "useMemo", "useCapability", "useOperationInvoker", "useAppGraph", "Node", "useActionRunner", "useTranslation", "createGapSeparator", "createMenuItemGroup", "MAIN_MENU_GROUP_ID", "useNavbarActions", "t", "useTranslation", "meta", "id", "graph", "useAppGraph", "runAction", "useActionRunner", "invokeSync", "useOperationInvoker", "stateAtom", "useCapability", "SimpleLayoutState", "actionsAtom", "useMemo", "Atom", "make", "get", "nodes", "edges", "createCompanionActions", "idPrefix", "gapSeparator", "createGapSeparator", "push", "mainMenuGroup", "createMenuItemGroup", "variant", "icon", "iconOnly", "label", "testId", "source", "target", "relation", "rootActions", "actions", "Node", "RootId", "menuActions", "filter", "node", "properties", "disposition", "forEach", "menuAction", "onAction", "React", "Surface", "AlertDialog", "Dialog", "NaturalDialog", "ErrorFallback", "Dialog", "state", "updateState", "useSimpleLayoutState", "DialogRoot", "dialogType", "AlertDialog", "Root", "NaturalDialog", "DialogOverlay", "Overlay", "React", "modal", "dialogBlockAlign", "open", "dialogOpen", "onOpenChange", "nextOpen", "Surface", "role", "data", "dialogContent", "limit", "fallback", "ErrorFallback", "blockAlign", "classNames", "dialogOverlayClasses", "style", "dialogOverlayStyle", "React", "useMemo", "Surface", "useAppGraph", "useNode", "ErrorFallback", "Panel", "ATTENDABLE_PATH_SEPARATOR", "Menu", "useMenuActions", "DRAWER_NAME", "Drawer", "graph", "useAppGraph", "state", "layoutState", "useSimpleLayoutState", "placeholder", "useMemo", "React", "ContentLoading", "activeId", "active", "workspace", "companions", "useCompanions", "companionId", "variant", "useSelectedCompanion", "companionVariant", "node", "useNode", "parentNode", "data", "attendableId", "subject", "companionTo", "properties", "actions", "onAction", "useDrawerActions", "menu", "useMenuActions", "Panel", "Root", "Toolbar", "Menu", "alwaysActive", "density", "Content", "asChild", "Surface", "role", "limit", "fallback", "ErrorFallback", "displayName", "parseEntryId", "entryId", "id", "split", "ATTENDABLE_PATH_SEPARATOR", "preferredVariant", "selectedCompanion", "length", "undefined", "preferred", "find", "c", "SimpleLayout", "state", "useSimpleLayoutState", "keyboardOpen", "setKeyboardOpen", "useState", "splitterMode", "setSplitterMode", "drawerRef", "useRef", "useEffect", "activeElement", "document", "drawerHasFocus", "current", "contains", "drawerState", "React", "Mosaic", "Root", "classNames", "MobileLayout", "onKeyboardOpenChange", "Panel", "safe", "top", "bottom", "PopoverRoot", "Splitter", "mode", "ratio", "position", "Main", "ref", "Drawer", "Dialog", "PopoverContent"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/operation-resolver/operation-resolver.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { Operation, OperationResolver } from '@dxos/operation';\nimport { ATTENDABLE_PATH_SEPARATOR } from '@dxos/react-ui-attention';\n\nimport { type SimpleLayoutState, SimpleLayoutState as SimpleLayoutStateCapability } from '../../types';\n\n/** Maximum number of items to keep in navigation history. */\nconst MAX_HISTORY_LENGTH = 50;\n\n/** Parse entry ID to extract primary ID and variant. */\nconst parseEntryId = (entryId: string) => {\n const [id, variant] = entryId.split(ATTENDABLE_PATH_SEPARATOR);\n return { id, variant };\n};\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const registry = yield* Capability.get(Capabilities.AtomRegistry);\n const stateAtom = yield* Capability.get(SimpleLayoutStateCapability);\n\n const getState = () => registry.get(stateAtom);\n const updateState = (fn: (current: SimpleLayoutState) => SimpleLayoutState) => {\n registry.set(stateAtom, fn(getState()));\n };\n\n return Capability.contributes(Capabilities.OperationResolver, [\n //\n // SetLayoutMode\n //\n // TODO(burdon): No-op for to fix startup bug?\n OperationResolver.make({\n operation: LayoutOperation.SetLayoutMode,\n handler: Effect.fnUntraced(function* () {}),\n }),\n\n //\n // UpdateSidebar - No-op for simple layout.\n //\n OperationResolver.make({\n operation: LayoutOperation.UpdateSidebar,\n handler: () => Effect.void,\n }),\n\n //\n // UpdateComplementary - Controls companion drawer.\n //\n OperationResolver.make({\n operation: LayoutOperation.UpdateComplementary,\n handler: Effect.fnUntraced(function* (input) {\n if (input.state === 'closed') {\n updateState((state) => ({\n ...state,\n drawerState: 'closed',\n }));\n }\n }),\n }),\n\n //\n // UpdateDialog\n //\n OperationResolver.make({\n operation: LayoutOperation.UpdateDialog,\n handler: Effect.fnUntraced(function* (input) {\n updateState((state) => ({\n ...state,\n dialogOpen: input.state ?? Boolean(input.subject),\n dialogType: input.type ?? 'default',\n dialogBlockAlign: input.blockAlign ?? 'center',\n dialogOverlayClasses: input.overlayClasses,\n dialogOverlayStyle: input.overlayStyle,\n dialogContent: input.subject ? { component: input.subject, props: input.props } : undefined,\n }));\n }),\n }),\n\n //\n // UpdatePopover\n //\n OperationResolver.make({\n operation: LayoutOperation.UpdatePopover,\n handler: Effect.fnUntraced(function* (input) {\n updateState((state) => ({\n ...state,\n popoverOpen: input.state ?? Boolean(input.subject),\n popoverKind: input.kind ?? 'base',\n popoverTitle: input.kind === 'card' ? input.title : undefined,\n popoverContent:\n typeof input.subject === 'string'\n ? { component: input.subject, props: input.props }\n : input.subject\n ? { subject: input.subject }\n : undefined,\n popoverSide: input.side,\n popoverVariant: input.variant,\n popoverAnchor: input.variant === 'virtual' ? input.anchor : state.popoverAnchor,\n popoverAnchorId: input.variant !== 'virtual' ? input.anchorId : state.popoverAnchorId,\n }));\n }),\n }),\n\n //\n // SwitchWorkspace\n //\n OperationResolver.make({\n operation: LayoutOperation.SwitchWorkspace,\n handler: Effect.fnUntraced(function* (input) {\n updateState((state) => ({\n ...state,\n // TODO(wittjosiah): This is a hack to prevent the previous deck from being set for pinned items.\n // Ideally this should be worked into the data model in a generic way.\n previousWorkspace: !state.workspace.startsWith('!') ? state.workspace : state.previousWorkspace,\n workspace: input.subject,\n active: undefined,\n // Clear history when switching workspaces.\n history: [],\n }));\n }),\n }),\n\n //\n // RevertWorkspace\n //\n OperationResolver.make({\n operation: LayoutOperation.RevertWorkspace,\n handler: Effect.fnUntraced(function* () {\n const state = getState();\n yield* Operation.invoke(LayoutOperation.SwitchWorkspace, {\n subject: state.previousWorkspace,\n });\n }),\n }),\n\n //\n // Open\n //\n OperationResolver.make({\n operation: LayoutOperation.Open,\n handler: Effect.fnUntraced(function* (input) {\n const id = input.subject[0];\n const { id: primaryId, variant } = parseEntryId(id);\n const state = getState();\n\n // Only treat as companion when opening a variant of the current workspace/active (e.g. object~comments).\n // IDs like settings~spaceId are alternate-tree nodes and should navigate main content, not open the drawer.\n // TODO(wittjosiah): Factor out the change-companion operation from deck to a common layout operation.\n const isCompanionOfCurrent = variant && (primaryId === state.workspace || primaryId === state.active);\n if (isCompanionOfCurrent) {\n updateState((state) => ({\n ...state,\n companionVariant: variant,\n drawerState: state.drawerState === 'closed' || !state.drawerState ? 'open' : state.drawerState,\n }));\n } else {\n // Regular navigation - update active and history (use full id for alternate-tree nodes).\n updateState((state) => {\n const newHistory = state.active ? [...state.history, state.active] : state.history;\n const trimmedHistory =\n newHistory.length > MAX_HISTORY_LENGTH ? newHistory.slice(-MAX_HISTORY_LENGTH) : newHistory;\n return {\n ...state,\n active: id,\n history: trimmedHistory,\n };\n });\n }\n }),\n }),\n\n //\n // Close\n //\n OperationResolver.make({\n operation: LayoutOperation.Close,\n handler: Effect.fnUntraced(function* () {\n updateState((state) => {\n // Pop from history if available.\n if (state.history.length > 0) {\n const newHistory = [...state.history];\n const previousActive = newHistory.pop();\n return {\n ...state,\n active: previousActive,\n history: newHistory,\n };\n }\n // No history, just clear active.\n return {\n ...state,\n active: undefined,\n };\n });\n }),\n }),\n\n //\n // Set\n //\n OperationResolver.make({\n operation: LayoutOperation.Set,\n handler: Effect.fnUntraced(function* (input) {\n updateState((state) => ({\n ...state,\n active: input.subject[0],\n }));\n }),\n }),\n ]);\n }),\n);\n"],
5
- "mappings": "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",
6
- "names": ["Effect", "Capabilities", "Capability", "LayoutOperation", "Operation", "OperationResolver", "ATTENDABLE_PATH_SEPARATOR", "MAX_HISTORY_LENGTH", "parseEntryId", "entryId", "id", "variant", "split", "ATTENDABLE_PATH_SEPARATOR", "Capability", "makeModule", "fnUntraced", "registry", "get", "Capabilities", "AtomRegistry", "stateAtom", "SimpleLayoutStateCapability", "getState", "updateState", "fn", "set", "contributes", "OperationResolver", "make", "operation", "LayoutOperation", "SetLayoutMode", "handler", "UpdateSidebar", "void", "UpdateComplementary", "input", "state", "drawerState", "UpdateDialog", "dialogOpen", "Boolean", "subject", "dialogType", "type", "dialogBlockAlign", "blockAlign", "dialogOverlayClasses", "overlayClasses", "dialogOverlayStyle", "overlayStyle", "dialogContent", "component", "props", "undefined", "UpdatePopover", "popoverOpen", "popoverKind", "kind", "popoverTitle", "title", "popoverContent", "popoverSide", "side", "popoverVariant", "popoverAnchor", "anchor", "popoverAnchorId", "anchorId", "SwitchWorkspace", "previousWorkspace", "workspace", "startsWith", "active", "history", "RevertWorkspace", "Operation", "invoke", "Open", "primaryId", "isCompanionOfCurrent", "companionVariant", "newHistory", "trimmedHistory", "length", "slice", "Close", "previousActive", "pop", "Set"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/url-handler/url-handler.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 { LayoutOperation } from '@dxos/app-toolkit';\nimport { log } from '@dxos/log';\nimport { Node } from '@dxos/plugin-graph';\nimport { isTauri } from '@dxos/util';\n\nimport { type SimpleLayoutState, SimpleLayoutState as SimpleLayoutStateCapability } from '../../types';\n\n/**\n * URL handler for simple layout that syncs browser URL with layout state.\n * URL format: /{workspace} or /{workspace}/{active}\n * Root is represented as / or /root.\n *\n * On mobile Tauri, also listens for deep links via the deep-link plugin.\n */\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const { invokeSync } = yield* Capability.get(Capabilities.OperationInvoker);\n\n /**\n * Handle navigation from a pathname.\n * Parses path and updates state accordingly.\n */\n const handlePathNavigation = (pathname: string) => {\n log.info('[UrlHandler] Navigating to path', { pathname });\n\n // Parse URL segments: /{workspace}/{active}\n const [_, nextWorkspace, nextActive] = pathname.split('/');\n\n // Determine target workspace (empty or 'root' means Node.RootId).\n const targetWorkspace = !nextWorkspace || nextWorkspace === 'root' ? Node.RootId : nextWorkspace;\n\n // Navigate via operations (they will update state accordingly).\n invokeSync(LayoutOperation.SwitchWorkspace, { subject: targetWorkspace });\n if (nextActive) {\n invokeSync(LayoutOperation.Open, { subject: [nextActive] });\n }\n };\n\n const onNavigation = handleNavigation(handlePathNavigation);\n\n // Handle initial URL and listen for browser navigation.\n yield* Effect.sync(() => onNavigation());\n window.addEventListener('popstate', onNavigation);\n\n // Set up deep link listener for mobile Tauri.\n let unlistenDeepLink: (() => void) | undefined;\n if (isTauri()) {\n yield* Effect.tryPromise({\n try: async () => {\n const { getCurrent, onOpenUrl } = await import('@tauri-apps/plugin-deep-link');\n\n // Check if app was launched via deep link (cold start).\n const launchUrls = await getCurrent();\n if (launchUrls && launchUrls.length > 0) {\n log.info('[UrlHandler] App launched with deep links', { urls: launchUrls });\n for (const url of launchUrls) {\n handleDeepLink(url, handlePathNavigation);\n }\n }\n\n // Listen for deep links while app is running.\n unlistenDeepLink = await onOpenUrl((urls) => {\n log.info('[UrlHandler] Deep links received', { urls });\n for (const url of urls) {\n handleDeepLink(url, handlePathNavigation);\n }\n });\n\n log.info('[UrlHandler] Deep link listener initialized');\n },\n catch: (error) => {\n log.warn('[UrlHandler] Failed to initialize deep link listener', { error });\n return error;\n },\n }).pipe(Effect.catchAll(() => Effect.void));\n }\n\n // Subscribe to state changes to update the URL.\n let lastWorkspace: string | undefined;\n let lastActive: string | undefined;\n const unsubscribe = yield* Capabilities.subscribeAtom(SimpleLayoutStateCapability, (state: SimpleLayoutState) => {\n const { workspace, active } = state;\n\n // Only update URL if relevant state changed.\n if (workspace !== lastWorkspace || active !== lastActive) {\n lastWorkspace = workspace;\n lastActive = active;\n\n const path = pathFromState(workspace, active);\n if (window.location.pathname !== path) {\n history.pushState(null, '', `${path}${window.location.search}`);\n }\n }\n });\n\n return Capability.contributes(Capabilities.Null, null, () =>\n Effect.sync(() => {\n window.removeEventListener('popstate', onNavigation);\n unsubscribe();\n unlistenDeepLink?.();\n }),\n );\n }),\n);\n\n// TODO(wittjosiah): Instead of hardcoding redirect paths, we should either:\n// 1. Validate that the workspace exists in the graph before navigating.\n// 2. Implement more structured routing with explicit route definitions.\n/**\n * Check if a path is a special redirect path that shouldn't be navigated to.\n * These paths are handled by other systems (e.g., OAuth).\n */\nconst isRedirectPath = (pathname: string): boolean => pathname.startsWith('/redirect/');\n\n/**\n * Build pathname from layout state. Root workspace is / or /root/{active}.\n */\nconst pathFromState = (workspace: string, active: string | undefined): string =>\n workspace === Node.RootId\n ? active\n ? `/${Node.RootId}/${active}`\n : '/'\n : active\n ? `/${workspace}/${active}`\n : `/${workspace}`;\n\n/**\n * Returns a handler for navigation events (initial load and popstate) that navigates to current pathname.\n */\nconst handleNavigation =\n (navigate: (pathname: string) => void): (() => void) =>\n () =>\n navigate(window.location.pathname);\n\n/**\n * Handle deep link URL from Tauri. Parses the URL and calls navigate unless it's a redirect path.\n */\nconst handleDeepLink = (urlString: string, navigate: (pathname: string) => void): void => {\n log.info('[UrlHandler] Deep link received', { url: urlString });\n try {\n const url = new URL(urlString);\n if (isRedirectPath(url.pathname)) {\n log.info('[UrlHandler] Skipping redirect path (handled elsewhere)', { pathname: url.pathname });\n return;\n }\n navigate(url.pathname);\n } catch (error) {\n log.warn('[UrlHandler] Failed to parse deep link URL', { urlString, error });\n }\n};\n"],
5
- "mappings": "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",
6
- "names": ["Effect", "Capabilities", "Capability", "LayoutOperation", "log", "Node", "isTauri", "Capability", "makeModule", "fnUntraced", "invokeSync", "get", "Capabilities", "OperationInvoker", "handlePathNavigation", "pathname", "log", "info", "_", "nextWorkspace", "nextActive", "split", "targetWorkspace", "Node", "RootId", "LayoutOperation", "SwitchWorkspace", "subject", "Open", "onNavigation", "handleNavigation", "sync", "window", "addEventListener", "unlistenDeepLink", "isTauri", "tryPromise", "try", "getCurrent", "onOpenUrl", "launchUrls", "length", "urls", "url", "handleDeepLink", "catch", "error", "warn", "pipe", "catchAll", "void", "lastWorkspace", "lastActive", "unsubscribe", "subscribeAtom", "SimpleLayoutStateCapability", "state", "workspace", "active", "path", "pathFromState", "location", "history", "pushState", "search", "contributes", "Null", "removeEventListener", "isRedirectPath", "startsWith", "navigate", "urlString", "URL"]
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"ContentLoading.d.ts","sourceRoot":"","sources":["../../../../src/components/ContentLoading.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,eAAO,MAAM,cAAc,yBAE1B,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ContentLoading.stories.d.ts","sourceRoot":"","sources":["../../../../src/components/ContentLoading.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAMjE,QAAA,MAAM,IAAI;;;;;;;CAO6B,CAAC;AAExC,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC"}
@@ -1,11 +0,0 @@
1
- import React from 'react';
2
- export type WorkspaceProps = {
3
- id: string;
4
- };
5
- /**
6
- * Displays the contents of a workspace disposition graph node as a searchable list.
7
- * Shows direct children of the workspace with icons and labels,
8
- * allowing users to filter via search and navigate by selecting an item.
9
- */
10
- export declare const Workspace: ({ id }: WorkspaceProps) => React.JSX.Element;
11
- //# sourceMappingURL=Workspace.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Workspace.d.ts","sourceRoot":"","sources":["../../../../../src/components/Workspace/Workspace.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAe9D,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,SAAS,GAAI,QAAQ,cAAc,sBAqC/C,CAAC"}
@@ -1,2 +0,0 @@
1
- export * from './Workspace';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/Workspace/index.ts"],"names":[],"mappings":"AAIA,cAAc,aAAa,CAAC"}