@dxos/plugin-simple-layout 0.8.4-main.937b3ca → 0.8.4-main.bc674ce
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/{chunk-FK4M7GJV.mjs → chunk-LR3EE3VB.mjs} +298 -122
- package/dist/lib/browser/chunk-LR3EE3VB.mjs.map +7 -0
- package/dist/lib/browser/{chunk-CLPGTNWJ.mjs → chunk-P77G4YTR.mjs} +1 -1
- package/dist/lib/browser/chunk-P77G4YTR.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +13 -7
- package/dist/lib/browser/index.mjs.map +2 -2
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{operation-resolver-LTB63NKP.mjs → operation-resolver-775UYAC2.mjs} +50 -15
- package/dist/lib/browser/operation-resolver-775UYAC2.mjs.map +7 -0
- package/dist/lib/browser/{react-root-6ARAPH3O.mjs → react-root-KM55OMGJ.mjs} +3 -3
- package/dist/lib/browser/{react-surface-SO7B23GS.mjs → react-surface-BABGAWGY.mjs} +3 -3
- package/dist/lib/browser/{state-H4IGICBB.mjs → state-OUFTC2KV.mjs} +5 -3
- package/dist/lib/browser/state-OUFTC2KV.mjs.map +7 -0
- package/dist/lib/browser/{url-handler-7CFGTLNG.mjs → url-handler-DOUFQIAC.mjs} +2 -2
- package/dist/lib/node-esm/{chunk-MUVVYBUE.mjs → chunk-F5TEKVJG.mjs} +1 -1
- package/dist/lib/node-esm/chunk-F5TEKVJG.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-EGFZAVBD.mjs → chunk-HB2B3LLG.mjs} +298 -122
- package/dist/lib/node-esm/chunk-HB2B3LLG.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +13 -7
- package/dist/lib/node-esm/index.mjs.map +2 -2
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{operation-resolver-7O6O7T4Q.mjs → operation-resolver-LDNYS3DI.mjs} +50 -15
- package/dist/lib/node-esm/operation-resolver-LDNYS3DI.mjs.map +7 -0
- package/dist/lib/node-esm/{react-root-2CPA2ZUS.mjs → react-root-36UYFEEB.mjs} +3 -3
- package/dist/lib/node-esm/{react-surface-FKAV56MO.mjs → react-surface-CGHFVWU3.mjs} +3 -3
- package/dist/lib/node-esm/{state-QIU2LMLT.mjs → state-Q2ZA26W5.mjs} +5 -3
- package/dist/lib/node-esm/state-Q2ZA26W5.mjs.map +7 -0
- package/dist/lib/node-esm/{url-handler-4LYP3JM7.mjs → url-handler-DVAZZEUO.mjs} +2 -2
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/state/state.d.ts.map +1 -1
- package/dist/types/src/components/ContentError.stories.d.ts +6 -0
- package/dist/types/src/components/ContentError.stories.d.ts.map +1 -1
- package/dist/types/src/components/SimpleLayout/Banner.d.ts.map +1 -1
- package/dist/types/src/components/SimpleLayout/Drawer.d.ts +9 -0
- package/dist/types/src/components/SimpleLayout/Drawer.d.ts.map +1 -0
- package/dist/types/src/components/SimpleLayout/Main.d.ts +1 -1
- package/dist/types/src/components/SimpleLayout/Main.d.ts.map +1 -1
- package/dist/types/src/components/SimpleLayout/NavBar.d.ts +5 -2
- package/dist/types/src/components/SimpleLayout/NavBar.d.ts.map +1 -1
- package/dist/types/src/components/SimpleLayout/NavBar.stories.d.ts +10 -6
- package/dist/types/src/components/SimpleLayout/NavBar.stories.d.ts.map +1 -1
- package/dist/types/src/components/SimpleLayout/SimpleLayout.d.ts.map +1 -1
- package/dist/types/src/components/SimpleLayout/SimpleLayout.stories.d.ts +10 -0
- package/dist/types/src/components/SimpleLayout/SimpleLayout.stories.d.ts.map +1 -1
- package/dist/types/src/components/hooks.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +1 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useCompanions.d.ts +8 -0
- package/dist/types/src/hooks/useCompanions.d.ts.map +1 -0
- package/dist/types/src/translations.d.ts +6 -0
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/capabilities.d.ts +5 -1
- package/dist/types/src/types/capabilities.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +23 -23
- package/src/capabilities/operation-resolver/operation-resolver.ts +50 -13
- package/src/capabilities/state/state.tsx +2 -0
- package/src/components/SimpleLayout/Banner.tsx +35 -4
- package/src/components/SimpleLayout/Drawer.tsx +151 -0
- package/src/components/SimpleLayout/Main.tsx +31 -40
- package/src/components/SimpleLayout/NavBar.stories.tsx +0 -3
- package/src/components/SimpleLayout/NavBar.tsx +29 -37
- package/src/components/SimpleLayout/SimpleLayout.stories.tsx +4 -0
- package/src/components/SimpleLayout/SimpleLayout.tsx +26 -6
- package/src/components/hooks.ts +8 -12
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useCompanions.ts +19 -0
- package/src/translations.ts +6 -0
- package/src/types/capabilities.ts +6 -1
- package/dist/lib/browser/chunk-CLPGTNWJ.mjs.map +0 -7
- package/dist/lib/browser/chunk-FK4M7GJV.mjs.map +0 -7
- package/dist/lib/browser/operation-resolver-LTB63NKP.mjs.map +0 -7
- package/dist/lib/browser/state-H4IGICBB.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-EGFZAVBD.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-MUVVYBUE.mjs.map +0 -7
- package/dist/lib/node-esm/operation-resolver-7O6O7T4Q.mjs.map +0 -7
- package/dist/lib/node-esm/state-QIU2LMLT.mjs.map +0 -7
- /package/dist/lib/browser/{react-root-6ARAPH3O.mjs.map → react-root-KM55OMGJ.mjs.map} +0 -0
- /package/dist/lib/browser/{react-surface-SO7B23GS.mjs.map → react-surface-BABGAWGY.mjs.map} +0 -0
- /package/dist/lib/browser/{url-handler-7CFGTLNG.mjs.map → url-handler-DOUFQIAC.mjs.map} +0 -0
- /package/dist/lib/node-esm/{react-root-2CPA2ZUS.mjs.map → react-root-36UYFEEB.mjs.map} +0 -0
- /package/dist/lib/node-esm/{react-surface-FKAV56MO.mjs.map → react-surface-CGHFVWU3.mjs.map} +0 -0
- /package/dist/lib/node-esm/{url-handler-4LYP3JM7.mjs.map → url-handler-DVAZZEUO.mjs.map} +0 -0
|
@@ -2,19 +2,39 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import React from 'react';
|
|
5
|
+
import React, { useCallback } from 'react';
|
|
6
6
|
|
|
7
|
+
import { type DrawerState, Main as NaturalMain } from '@dxos/react-ui';
|
|
8
|
+
import { Mosaic } from '@dxos/react-ui-mosaic';
|
|
9
|
+
|
|
10
|
+
import { useSimpleLayoutState } from '../../hooks';
|
|
7
11
|
import { Dialog } from '../Dialog';
|
|
8
12
|
import { PopoverContent, PopoverRoot } from '../Popover';
|
|
9
13
|
|
|
14
|
+
import { Drawer } from './Drawer';
|
|
10
15
|
import { Main } from './Main';
|
|
11
16
|
|
|
12
17
|
export const SimpleLayout = () => {
|
|
18
|
+
const { state, updateState } = useSimpleLayoutState();
|
|
19
|
+
|
|
20
|
+
const handleDrawerStateChange = useCallback(
|
|
21
|
+
(nextState: DrawerState) => {
|
|
22
|
+
// Sync all drawer state changes to state.
|
|
23
|
+
updateState((s) => ({ ...s, drawerState: nextState }));
|
|
24
|
+
},
|
|
25
|
+
[updateState],
|
|
26
|
+
);
|
|
27
|
+
|
|
13
28
|
return (
|
|
14
|
-
<
|
|
15
|
-
<
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
29
|
+
<Mosaic.Root>
|
|
30
|
+
<NaturalMain.Root drawerState={state.drawerState ?? 'closed'} onDrawerStateChange={handleDrawerStateChange}>
|
|
31
|
+
<PopoverRoot>
|
|
32
|
+
<Main />
|
|
33
|
+
<Drawer />
|
|
34
|
+
<Dialog />
|
|
35
|
+
<PopoverContent />
|
|
36
|
+
</PopoverRoot>
|
|
37
|
+
</NaturalMain.Root>
|
|
38
|
+
</Mosaic.Root>
|
|
19
39
|
);
|
|
20
40
|
};
|
package/src/components/hooks.ts
CHANGED
|
@@ -14,17 +14,13 @@ export const useLoadDescendents = (nodeId?: string) => {
|
|
|
14
14
|
const { graph } = useAppGraph();
|
|
15
15
|
|
|
16
16
|
useEffect(() => {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
Graph.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
return () => cancelAnimationFrame(frame);
|
|
17
|
+
if (nodeId) {
|
|
18
|
+
// First level: expand the node itself.
|
|
19
|
+
Graph.expand(graph, nodeId, 'outbound');
|
|
20
|
+
// Second level: expand each child.
|
|
21
|
+
Graph.getConnections(graph, nodeId, 'outbound').forEach((child) => {
|
|
22
|
+
Graph.expand(graph, child.id, 'outbound');
|
|
23
|
+
});
|
|
24
|
+
}
|
|
29
25
|
}, [nodeId, graph]);
|
|
30
26
|
};
|
package/src/hooks/index.ts
CHANGED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { useMemo } from 'react';
|
|
6
|
+
|
|
7
|
+
import { useAppGraph } from '@dxos/app-framework/react';
|
|
8
|
+
import { useConnections } from '@dxos/plugin-graph';
|
|
9
|
+
import { byPosition } from '@dxos/util';
|
|
10
|
+
|
|
11
|
+
// TODO(wittjosiah): Factor out to shared location with plugin-deck.
|
|
12
|
+
const PLANK_COMPANION_TYPE = 'dxos.org/plugin/deck/plank-companion';
|
|
13
|
+
|
|
14
|
+
export const useCompanions = (id?: string) => {
|
|
15
|
+
const { graph } = useAppGraph();
|
|
16
|
+
const nodes = useConnections(graph, id);
|
|
17
|
+
const companions = nodes.filter((node) => node.type === PLANK_COMPANION_TYPE);
|
|
18
|
+
return useMemo(() => companions.toSorted((a, b) => byPosition(a.properties, b.properties)), [companions]);
|
|
19
|
+
};
|
package/src/translations.ts
CHANGED
|
@@ -20,8 +20,14 @@ export const translations = [
|
|
|
20
20
|
'profile label': 'Profile',
|
|
21
21
|
'app menu label': 'App menu',
|
|
22
22
|
'main menu label': 'Main menu',
|
|
23
|
+
'companions menu label': 'Companions',
|
|
23
24
|
'error fallback message': 'An error occurred',
|
|
24
25
|
'search placeholder': 'Search...',
|
|
26
|
+
'drawer label': 'Drawer',
|
|
27
|
+
'close drawer label': 'Close drawer',
|
|
28
|
+
'expand drawer label': 'Expand drawer',
|
|
29
|
+
'collapse drawer label': 'Collapse drawer',
|
|
30
|
+
'actions menu label': 'Actions',
|
|
25
31
|
},
|
|
26
32
|
},
|
|
27
33
|
},
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { type Atom } from '@effect-atom/atom-react';
|
|
6
6
|
|
|
7
7
|
import { Capability } from '@dxos/app-framework';
|
|
8
|
-
import { type Label } from '@dxos/react-ui';
|
|
8
|
+
import { type DrawerState, type Label } from '@dxos/react-ui';
|
|
9
9
|
|
|
10
10
|
import { meta } from '../meta';
|
|
11
11
|
|
|
@@ -39,6 +39,11 @@ export type SimpleLayoutState = {
|
|
|
39
39
|
|
|
40
40
|
/** Whether running in popover window context (hides mobile-specific UI). */
|
|
41
41
|
isPopover?: boolean;
|
|
42
|
+
|
|
43
|
+
/** Variant of the companion to display in the drawer (e.g., "comments", "assistant-chat"). */
|
|
44
|
+
companionVariant?: string;
|
|
45
|
+
/** State of the companion drawer. */
|
|
46
|
+
drawerState?: DrawerState;
|
|
42
47
|
};
|
|
43
48
|
|
|
44
49
|
export const SimpleLayoutState = Capability.make<Atom.Writable<SimpleLayoutState>>(`${meta.id}/state`);
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/meta.ts", "../../../src/types/capabilities.ts", "../../../src/types/events.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Plugin } from '@dxos/app-framework';\nimport { trim } from '@dxos/util';\n\nexport const meta: Plugin.Meta = {\n id: 'dxos.org/plugin/simple-layout',\n name: 'Simple Layout',\n description: trim`\n Minimal layout plugin for simplified UI contexts like popover windows.\n Provides basic content rendering without sidebars or complex navigation.\n `,\n icon: 'ph--layout--regular',\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Atom } from '@effect-atom/atom-react';\n\nimport { Capability } from '@dxos/app-framework';\nimport { type Label } from '@dxos/react-ui';\n\nimport { meta } from '../meta';\n\n// TODO(wittjosiah): Handle toasts.\nexport type SimpleLayoutState = {\n /** Data to be passed to the main content Surface. */\n content?: any;\n\n dialogOpen: boolean;\n dialogType?: 'default' | 'alert';\n dialogBlockAlign?: 'start' | 'center' | 'end';\n dialogOverlayClasses?: string;\n dialogOverlayStyle?: Record<string, any>;\n /** Data to be passed to the dialog Surface. */\n dialogContent?: any;\n\n popoverOpen?: boolean;\n popoverSide?: 'top' | 'right' | 'bottom' | 'left';\n popoverVariant?: 'virtual' | 'react';\n popoverAnchor?: HTMLButtonElement;\n popoverAnchorId?: string;\n popoverKind?: 'base' | 'card';\n popoverTitle?: Label;\n popoverContent?: any;\n\n workspace: string;\n previousWorkspace: string;\n active?: string;\n /** Stack of previously active item IDs for back navigation. */\n history: string[];\n\n /** Whether running in popover window context (hides mobile-specific UI). */\n isPopover?: boolean;\n};\n\nexport const SimpleLayoutState = Capability.make<Atom.Writable<SimpleLayoutState>>(`${meta.id}/state`);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ActivationEvent, Common } from '@dxos/app-framework';\n\nimport { SimpleLayoutState } from './capabilities';\n\nexport namespace SimpleLayoutEvents {\n /** Fired when SimpleLayoutState capability is ready. */\n export const StateReady: ActivationEvent.ActivationEvent = Common.ActivationEvent.createStateEvent(\n SimpleLayoutState.identifier,\n );\n}\n"],
|
|
5
|
-
"mappings": ";AAKA,SAASA,YAAY;AAEd,IAAMC,OAAoB;EAC/BC,IAAI;EACJC,MAAM;EACNC,aAAaC;;;;EAIbC,MAAM;AACR;;;ACTA,SAASC,kBAAkB;AAqCpB,IAAMC,oBAAoBC,WAAWC,KAAuC,GAAGC,KAAKC,EAAE,QAAQ;;;ACvCrG,SAA+BC,cAAc;UAI5BC,qBAAAA;sBAEFC,aAA8CC,OAAOC,gBAAgBC,iBAChFC,kBAAkBC,UAAU;AAEhC,GALiBN,uBAAAA,qBAAAA,CAAAA,EAAAA;;",
|
|
6
|
-
"names": ["trim", "meta", "id", "name", "description", "trim", "icon", "Capability", "SimpleLayoutState", "Capability", "make", "meta", "id", "Common", "SimpleLayoutEvents", "StateReady", "Common", "ActivationEvent", "createStateEvent", "SimpleLayoutState", "identifier"]
|
|
7
|
-
}
|
|
@@ -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/components/Dialog/Dialog.tsx", "../../../src/hooks/useSimpleLayoutState.ts", "../../../src/components/ContentError.tsx", "../../../src/components/Popover/Popover.tsx", "../../../src/components/SimpleLayout/Main.tsx", "../../../src/components/ContentLoading.tsx", "../../../src/components/SimpleLayout/Banner.tsx", "../../../src/components/SimpleLayout/NavBar.tsx", "../../../src/components/Workspace/Workspace.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useMemo, useRef } from 'react';\n\nimport { Common } from '@dxos/app-framework';\nimport { useAppGraph, useOperationInvoker } from '@dxos/app-framework/react';\nimport { Node, useConnections } from '@dxos/plugin-graph';\nimport { Avatar, Icon, Toolbar, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { Card, Layout, Mosaic, type StackTileComponent } 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 <Layout.Main toolbar>\n <SearchList.Root onSearch={handleSearch}>\n <Toolbar.Root>\n <SearchList.Input placeholder={t('search placeholder')} autoFocus />\n </Toolbar.Root>\n <SearchList.Content>\n <Mosaic.Container asChild>\n <Mosaic.Viewport padding>\n <Mosaic.Stack items={results} getId={(node) => node.id} Tile={WorkspaceTile} />\n </Mosaic.Viewport>\n </Mosaic.Container>\n </SearchList.Content>\n </SearchList.Root>\n </Layout.Main>\n );\n};\n\nconst WorkspaceTile: StackTileComponent<Node.Node> = ({ data }) => {\n const { t } = useTranslation(meta.id);\n const { invokePromise } = useOperationInvoker();\n const { selectedValue, registerItem, unregisterItem } = useSearchListItem();\n const ref = useRef<HTMLDivElement>(null);\n\n const handleSelect = useCallback(\n () => invokePromise(Common.LayoutOperation.SwitchWorkspace, { subject: data.id }),\n [invokePromise, data.id],\n );\n\n useLoadDescendents(data.id);\n\n const name = toLocalizedString(data.properties.label, t);\n const isSelected = selectedValue === data.id;\n\n // Register this workspace 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-hoverOverlay')}\n onClick={handleSelect}\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);\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-framework/react';\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 const frame = requestAnimationFrame(() => {\n if (nodeId) {\n // First level: expand the node itself.\n Graph.expand(graph, nodeId, 'outbound');\n // Second level: expand each child.\n Graph.getConnections(graph, nodeId, 'outbound').forEach((child) => {\n Graph.expand(graph, child.id, 'outbound');\n });\n }\n });\n\n return () => cancelAnimationFrame(frame);\n }, [nodeId, graph]);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Dialog } from '../Dialog';\nimport { PopoverContent, PopoverRoot } from '../Popover';\n\nimport { Main } from './Main';\n\nexport const SimpleLayout = () => {\n return (\n <PopoverRoot>\n <Main />\n <Dialog />\n <PopoverContent />\n </PopoverRoot>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Surface } from '@dxos/app-framework/react';\nimport { AlertDialog, Dialog as NaturalDialog } from '@dxos/react-ui';\n\nimport { useSimpleLayoutState } from '../../hooks';\nimport { ContentError } from '../ContentError';\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((s) => ({ ...s, dialogOpen: nextOpen }))}\n >\n {state.dialogBlockAlign === 'end' ? (\n <Surface role='dialog' data={state.dialogContent} limit={1} fallback={ContentError} />\n ) : (\n <DialogOverlay\n blockAlign={state.dialogBlockAlign}\n classNames={state.dialogOverlayClasses}\n style={state.dialogOverlayStyle}\n >\n <Surface role='dialog' data={state.dialogContent} limit={1} fallback={ContentError} />\n </DialogOverlay>\n )}\n </DialogRoot>\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/react';\n\nimport { type SimpleLayoutState, SimpleLayoutState as SimpleLayoutStateCapability } from '../types';\n\nexport type SimpleLayoutStateHook = {\n state: SimpleLayoutState;\n updateState: (fn: (current: SimpleLayoutState) => SimpleLayoutState) => void;\n};\n\nexport const useSimpleLayoutState = (): SimpleLayoutStateHook => {\n const registry = useContext(RegistryContext);\n const stateAtom = useCapability(SimpleLayoutStateCapability);\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 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { useTranslation } from '@dxos/react-ui';\nimport { descriptionMessage, mx } from '@dxos/ui-theme';\n\nimport { meta } from '../meta';\n\n// TODO(burdon): Factor out.\nexport const ContentError = ({ error }: { error?: Error }) => {\n const { t } = useTranslation(meta.id);\n const errorString = error?.toString() ?? '';\n return (\n <div role='none' className='grid place-items-center overflow-y-auto attention-surface'>\n <p role='alert' className={mx(descriptionMessage, 'p-2 break-all rounded-sm')}>\n {error ? errorString : t('error fallback message')}\n </p>\n </div>\n );\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/react';\nimport { Popover, type PopoverContentInteractOutsideEvent, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { Card } from '@dxos/react-ui-mosaic';\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\nexport const PopoverContent = () => {\n const { t } = useTranslation(meta.id);\n const { state, updateState } = useSimpleLayoutState();\n const { setOpen } = useLayoutPopoverContext('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 === 'card' && (\n <Card.Root>\n <Card.Toolbar>\n {/* TODO(wittjosiah): Cleaner way to handle no drag handle in toolbar? */}\n <span />\n {state.popoverTitle ? <Card.Title>{toLocalizedString(state.popoverTitle, t)}</Card.Title> : <span />}\n <Card.Close onClick={handleClose} />\n </Card.Toolbar>\n <Surface role='card--content' data={state.popoverContent} limit={1} />\n </Card.Root>\n )}\n {state.popoverKind === 'base' && <Surface role='popover' data={state.popoverContent} limit={1} />}\n </Popover.Viewport>\n <Popover.Arrow />\n </Popover.Content>\n </Popover.Portal>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport { Surface, useAppGraph } from '@dxos/app-framework/react';\nimport { log } from '@dxos/log';\nimport { useNode } from '@dxos/plugin-graph';\nimport { Main as NaturalMain } from '@dxos/react-ui';\nimport { ATTENDABLE_PATH_SEPARATOR } from '@dxos/react-ui-attention';\nimport { Mosaic } from '@dxos/react-ui-mosaic';\nimport { mx } from '@dxos/ui-theme';\n\nimport { useSimpleLayoutState } from '../../hooks';\nimport { ContentError } from '../ContentError';\nimport { ContentLoading } from '../ContentLoading';\n\nimport { Banner } from './Banner';\nimport { NavBar } from './NavBar';\n\n/**\n * Main root component.\n */\nexport const Main = () => {\n const { state } = useSimpleLayoutState();\n const id = state.active ?? state.workspace;\n const showNavBar = !state.isPopover;\n const { graph } = useAppGraph();\n const node = useNode(graph, id);\n\n const placeholder = useMemo(() => <ContentLoading />, []);\n\n const data = useMemo(() => {\n const { variant } = parseEntryId(id);\n return (\n node && {\n attendableId: id,\n subject: node.data,\n properties: node.properties,\n popoverAnchorId: state.popoverAnchorId,\n variant,\n }\n );\n }, [id, node, node?.data, node?.properties, state.popoverAnchorId]);\n\n const handleActiveIdChange = useCallback((nextActiveId: string | null) => {\n log.info('navigate', { nextActiveId });\n }, []);\n\n return (\n <Mosaic.Root>\n <NaturalMain.Root complementarySidebarState='closed' navigationSidebarState='closed'>\n <NaturalMain.Content\n bounce\n classNames={mx(\n 'dx-mobile-main dx-mobile-main-scroll-area--flush',\n 'grid bs-full overflow-hidden',\n showNavBar ? 'grid-rows-[min-content_1fr_min-content]' : 'grid-rows-[min-content_1fr]',\n )}\n >\n <Banner classNames='border-be border-separator' node={node} />\n <article className='contents'>\n <Surface key={id} role='article' data={data} limit={1} fallback={ContentError} placeholder={placeholder} />\n </article>\n {showNavBar && (\n <NavBar classNames='border-bs border-separator' activeId={id} onActiveIdChange={handleActiveIdChange} />\n )}\n </NaturalMain.Content>\n </NaturalMain.Root>\n </Mosaic.Root>\n );\n};\n\n// TODO(wittjosiah): Factor out. Copied from deck plugin.\nconst parseEntryId = (entryId: string) => {\n const [id, variant] = entryId.split(ATTENDABLE_PATH_SEPARATOR);\n return { id, variant };\n};\n\nMain.displayName = 'SimpleLayout.Main';\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 attention-surface' />;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport { Common } from '@dxos/app-framework';\nimport { useAppGraph, useOperationInvoker } from '@dxos/app-framework/react';\nimport { Graph, Node } from '@dxos/plugin-graph';\nimport { IconButton, type ThemedClassName, Toolbar, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { mx, osTranslations } from '@dxos/ui-theme';\n\nimport { useSimpleLayoutState } from '../../hooks';\nimport { meta } from '../../meta';\n\n/**\n * Check if an item is a direct child of a workspace or collection.\n * Returns true if any parent node has disposition 'workspace' or 'collection'.\n */\nconst isWorkspaceOrCollectionChild = (graph: Graph.ReadableGraph, itemId: string): boolean => {\n const parents = Graph.getConnections(graph, itemId, 'inbound');\n return parents.some(\n (node) => node.properties.disposition === 'workspace' || node.properties.disposition === 'collection',\n );\n};\n\nexport type BannerProps = ThemedClassName<{\n node?: Node.Node;\n}>;\n\nexport const Banner = ({ node, classNames }: BannerProps) => {\n const { t } = useTranslation(meta.id);\n const { state } = useSimpleLayoutState();\n const { invokePromise } = useOperationInvoker();\n const { graph } = useAppGraph();\n\n const label = (node && toLocalizedString(node.properties.label, t)) ?? t('current app name', { ns: osTranslations });\n\n // Check if current active item is a top-level workspace/collection child.\n const isTopLevelItem = useMemo(() => {\n if (!state.active) {\n return false;\n }\n return isWorkspaceOrCollectionChild(graph, state.active);\n }, [graph, state.active]);\n\n const handleClick = useCallback(async () => {\n if (state.active) {\n // If history is empty and this is a top-level item, go to home.\n if (state.history.length === 0 && isTopLevelItem) {\n await invokePromise(Common.LayoutOperation.SwitchWorkspace, { subject: Node.RootId });\n } else {\n // Otherwise, close (which will pop from history or clear active).\n await invokePromise(Common.LayoutOperation.Close, { subject: [state.active] });\n }\n } else {\n await invokePromise(Common.LayoutOperation.SwitchWorkspace, { subject: Node.RootId });\n }\n }, [invokePromise, state.active, state.history.length, isTopLevelItem]);\n\n if (!node) {\n return null;\n }\n\n return (\n <Toolbar.Root role='banner' classNames={mx('grid grid-cols-[var(--rail-size)_1fr_var(--rail-size)]', classNames)}>\n {node.id !== Node.RootId ? (\n <IconButton\n iconOnly\n variant='ghost'\n icon='ph--caret-left--regular'\n label={t('back label')}\n onClick={handleClick}\n />\n ) : (\n <div />\n )}\n <h1 className={'grow text-center truncate font-medium'}>{label}</h1>\n <IconButton iconOnly variant='ghost' icon='ph--dots-three-vertical--regular' label={t('menu label')} />\n </Toolbar.Root>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { useAppGraph } from '@dxos/app-framework/react';\nimport { Node, useActionRunner, useConnections } from '@dxos/plugin-graph';\nimport { IconButton, type ThemedClassName, Toolbar, Tooltip, useTranslation } from '@dxos/react-ui';\nimport { DropdownMenu, MenuProvider } from '@dxos/react-ui-menu';\nimport { mx } from '@dxos/ui-theme';\n\nimport { meta } from '../../meta';\n\nexport type NavBarProps = ThemedClassName<{\n activeId?: string;\n onActiveIdChange?: (nextActiveId: string | null) => void;\n}>;\n\nexport const NavBar = ({ classNames, activeId, onActiveIdChange }: NavBarProps) => {\n const { t } = useTranslation(meta.id);\n const { graph } = useAppGraph();\n const runAction = useActionRunner();\n\n const connections = useConnections(graph, Node.RootId);\n const menuActions = connections.filter((node) => node.properties.disposition === 'menu');\n\n const isBrowseActive = activeId !== 'notifications' && activeId !== 'profile';\n\n return (\n <Toolbar.Root classNames={mx('justify-center', classNames)}>\n <MenuProvider onAction={runAction}>\n <DropdownMenu.Root items={menuActions}>\n <Tooltip.Trigger asChild content={t('app menu label')}>\n <DropdownMenu.Trigger asChild data-testid='spacePlugin.addSpace'>\n <IconButton icon='ph--plus--regular' iconOnly label={t('main menu label')} />\n </DropdownMenu.Trigger>\n </Tooltip.Trigger>\n </DropdownMenu.Root>\n </MenuProvider>\n {/*\n <ButtonGroup>\n <IconButton\n {...buttonProps}\n label={t('browse label')}\n icon='ph--squares-four--regular'\n onClick={() => onActiveIdChange?.(null)}\n variant={isBrowseActive ? 'primary' : 'default'}\n {...(isBrowseActive && { 'aria-current': 'location' })}\n />\n <IconButton\n {...buttonProps}\n label={t('notifications label')}\n icon='ph--bell-simple--regular'\n onClick={() => onActiveIdChange?.('notifications')}\n variant={activeId === 'notifications' ? 'primary' : 'default'}\n {...(activeId === 'notifications' && { 'aria-current': 'location' })}\n />\n <Button\n variant={activeId === 'profile' ? 'primary' : 'default'}\n onClick={() => onActiveIdChange?.('profile')}\n classNames={buttonProps.classNames}\n >\n <span className='sr-only'>{t('profile label')}</span>\n <Avatar.Root>\n <Avatar.Label classNames='sr-only'>Profile display name</Avatar.Label>\n <Avatar.Content size={8} status='active' hue='cyan' fallback='🗿' />\n </Avatar.Root>\n </Button>\n </ButtonGroup>\n */}\n </Toolbar.Root>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useRef } from 'react';\n\nimport { Common } from '@dxos/app-framework';\nimport { useAppGraph, useOperationInvoker } from '@dxos/app-framework/react';\nimport { type Node, useConnections } from '@dxos/plugin-graph';\nimport { Avatar, Icon, Toolbar, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { Card, Layout, Mosaic, type StackTileComponent } 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 *\n */\n// TODO(burdon): Rename or motivate name in comment.\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, 'outbound');\n\n const { results, handleSearch } = useSearchListResults({\n items: children,\n extract: (child) => toLocalizedString(child.properties.label, t),\n });\n\n return (\n <Layout.Main toolbar>\n <SearchList.Root onSearch={handleSearch}>\n <Toolbar.Root>\n <SearchList.Input placeholder={t('search placeholder')} autoFocus />\n </Toolbar.Root>\n <SearchList.Content>\n <Mosaic.Container asChild>\n <Mosaic.Viewport padding>\n <Mosaic.Stack items={results} getId={(child) => child.id} Tile={WorkspaceChildTile} />\n </Mosaic.Viewport>\n </Mosaic.Container>\n </SearchList.Content>\n </SearchList.Root>\n </Layout.Main>\n );\n};\n\nconst WorkspaceChildTile: StackTileComponent<Node.Node> = ({ 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(Common.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-hoverOverlay')}\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"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["React", "useCallback", "useEffect", "useMemo", "useRef", "Common", "useAppGraph", "useOperationInvoker", "Node", "useConnections", "Avatar", "Icon", "Toolbar", "toLocalizedString", "useTranslation", "Card", "Layout", "Mosaic", "SearchList", "useSearchListItem", "useSearchListResults", "mx", "byPosition", "useEffect", "useAppGraph", "Graph", "useLoadDescendents", "nodeId", "graph", "useAppGraph", "useEffect", "frame", "requestAnimationFrame", "Graph", "expand", "getConnections", "forEach", "child", "id", "cancelAnimationFrame", "Home", "_", "t", "useTranslation", "meta", "id", "userAccountItem", "useItemsByDisposition", "pinnedItems", "workspaceItems", "useLoadDescendents", "Node", "RootId", "items", "useMemo", "results", "handleSearch", "useSearchListResults", "extract", "node", "toLocalizedString", "properties", "label", "Layout", "Main", "toolbar", "SearchList", "Root", "onSearch", "Toolbar", "Input", "placeholder", "autoFocus", "Content", "Mosaic", "Container", "asChild", "Viewport", "padding", "Stack", "getId", "Tile", "WorkspaceTile", "data", "invokePromise", "useOperationInvoker", "selectedValue", "registerItem", "unregisterItem", "useSearchListItem", "ref", "useRef", "handleSelect", "useCallback", "Common", "LayoutOperation", "SwitchWorkspace", "subject", "name", "isSelected", "useEffect", "current", "scrollIntoView", "block", "behavior", "Card", "role", "fullWidth", "tabIndex", "data-selected", "classNames", "mx", "onClick", "density", "Avatar", "icon", "hue", "hueVariant", "variant", "size", "fallback", "Label", "Icon", "filterItems", "disposition", "sort", "graph", "useAppGraph", "connections", "useConnections", "filtered", "filter", "toSorted", "a", "b", "byPosition", "React", "React", "Surface", "AlertDialog", "Dialog", "NaturalDialog", "RegistryContext", "useAtomValue", "useCallback", "useContext", "useCapability", "useSimpleLayoutState", "registry", "useContext", "RegistryContext", "stateAtom", "useCapability", "SimpleLayoutStateCapability", "state", "useAtomValue", "updateState", "useCallback", "fn", "set", "get", "React", "useTranslation", "descriptionMessage", "mx", "ContentError", "error", "t", "useTranslation", "meta", "id", "errorString", "toString", "React", "div", "role", "className", "p", "mx", "descriptionMessage", "Dialog", "state", "updateState", "useSimpleLayoutState", "DialogRoot", "dialogType", "AlertDialog", "Root", "NaturalDialog", "DialogOverlay", "Overlay", "React", "modal", "dialogBlockAlign", "open", "dialogOpen", "onOpenChange", "nextOpen", "s", "Surface", "role", "data", "dialogContent", "limit", "fallback", "ContentError", "blockAlign", "classNames", "dialogOverlayClasses", "style", "dialogOverlayStyle", "createContext", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "Surface", "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", "PopoverContent", "t", "useTranslation", "meta", "id", "updateState", "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", "Card", "Toolbar", "span", "popoverTitle", "Title", "toLocalizedString", "Close", "onClick", "Surface", "role", "data", "limit", "Arrow", "React", "useCallback", "useMemo", "Surface", "useAppGraph", "log", "useNode", "Main", "NaturalMain", "ATTENDABLE_PATH_SEPARATOR", "Mosaic", "mx", "React", "ContentLoading", "React", "div", "role", "className", "React", "useCallback", "useMemo", "Common", "useAppGraph", "useOperationInvoker", "Graph", "Node", "IconButton", "Toolbar", "toLocalizedString", "useTranslation", "mx", "osTranslations", "isWorkspaceOrCollectionChild", "graph", "itemId", "parents", "Graph", "getConnections", "some", "node", "properties", "disposition", "Banner", "classNames", "t", "useTranslation", "meta", "id", "state", "useSimpleLayoutState", "invokePromise", "useOperationInvoker", "useAppGraph", "label", "toLocalizedString", "ns", "osTranslations", "isTopLevelItem", "useMemo", "active", "handleClick", "useCallback", "history", "length", "Common", "LayoutOperation", "SwitchWorkspace", "subject", "Node", "RootId", "Close", "React", "Toolbar", "Root", "role", "mx", "IconButton", "iconOnly", "variant", "icon", "onClick", "div", "h1", "className", "React", "useAppGraph", "Node", "useActionRunner", "useConnections", "IconButton", "Toolbar", "Tooltip", "useTranslation", "DropdownMenu", "MenuProvider", "mx", "NavBar", "classNames", "activeId", "onActiveIdChange", "t", "useTranslation", "meta", "id", "graph", "useAppGraph", "runAction", "useActionRunner", "connections", "useConnections", "Node", "RootId", "menuActions", "filter", "node", "properties", "disposition", "isBrowseActive", "React", "Toolbar", "Root", "mx", "MenuProvider", "onAction", "DropdownMenu", "items", "Tooltip", "Trigger", "asChild", "content", "data-testid", "IconButton", "icon", "iconOnly", "label", "Main", "state", "useSimpleLayoutState", "id", "active", "workspace", "showNavBar", "isPopover", "graph", "useAppGraph", "node", "useNode", "placeholder", "useMemo", "React", "ContentLoading", "data", "variant", "parseEntryId", "attendableId", "subject", "properties", "popoverAnchorId", "handleActiveIdChange", "useCallback", "nextActiveId", "log", "info", "Mosaic", "Root", "NaturalMain", "complementarySidebarState", "navigationSidebarState", "Content", "bounce", "classNames", "mx", "Banner", "article", "className", "Surface", "key", "role", "limit", "fallback", "ContentError", "NavBar", "activeId", "onActiveIdChange", "entryId", "split", "ATTENDABLE_PATH_SEPARATOR", "displayName", "SimpleLayout", "React", "PopoverRoot", "Main", "Dialog", "PopoverContent", "React", "useCallback", "useEffect", "useRef", "Common", "useAppGraph", "useOperationInvoker", "useConnections", "Avatar", "Icon", "Toolbar", "toLocalizedString", "useTranslation", "Card", "Layout", "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", "Layout", "Main", "toolbar", "SearchList", "Root", "onSearch", "Toolbar", "Input", "placeholder", "autoFocus", "Content", "Mosaic", "Container", "asChild", "Viewport", "padding", "Stack", "getId", "Tile", "WorkspaceChildTile", "data", "invokeSync", "useOperationInvoker", "ref", "useRef", "selectedValue", "registerItem", "unregisterItem", "useSearchListItem", "isSelected", "name", "handleSelect", "useCallback", "Common", "LayoutOperation", "Open", "subject", "useEffect", "current", "scrollIntoView", "block", "behavior", "Card", "role", "fullWidth", "tabIndex", "data-selected", "classNames", "mx", "onClick", "density", "Avatar", "hue", "icon", "hueVariant", "variant", "size", "fallback", "Label", "Icon"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/operation-resolver/operation-resolver.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability, Common } from '@dxos/app-framework';\nimport { Operation, OperationResolver } from '@dxos/operation';\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\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const registry = yield* Capability.get(Common.Capability.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(Common.Capability.OperationResolver, [\n //\n // UpdateSidebar - No-op for simple layout.\n //\n OperationResolver.make({\n operation: Common.LayoutOperation.UpdateSidebar,\n handler: () => Effect.void,\n }),\n\n //\n // UpdateComplementary - No-op for simple layout.\n //\n OperationResolver.make({\n operation: Common.LayoutOperation.UpdateComplementary,\n handler: () => Effect.void,\n }),\n\n //\n // UpdateDialog\n //\n OperationResolver.make({\n operation: Common.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: Common.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: Common.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: Common.LayoutOperation.RevertWorkspace,\n handler: Effect.fnUntraced(function* () {\n const state = getState();\n yield* Operation.invoke(Common.LayoutOperation.SwitchWorkspace, {\n subject: state.previousWorkspace,\n });\n }),\n }),\n\n //\n // Open\n //\n OperationResolver.make({\n operation: Common.LayoutOperation.Open,\n handler: Effect.fnUntraced(function* (input) {\n updateState((state) => {\n // Push current active to history if it exists.\n const newHistory = state.active ? [...state.history, state.active] : state.history;\n // Limit history length to prevent memory issues.\n const trimmedHistory =\n newHistory.length > MAX_HISTORY_LENGTH ? newHistory.slice(-MAX_HISTORY_LENGTH) : newHistory;\n return {\n ...state,\n active: input.subject[0],\n history: trimmedHistory,\n };\n });\n }),\n }),\n\n //\n // Close\n //\n OperationResolver.make({\n operation: Common.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: Common.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", "Capability", "Common", "Operation", "OperationResolver", "MAX_HISTORY_LENGTH", "Capability", "makeModule", "fnUntraced", "registry", "get", "Common", "AtomRegistry", "stateAtom", "SimpleLayoutStateCapability", "getState", "updateState", "fn", "set", "contributes", "OperationResolver", "make", "operation", "LayoutOperation", "UpdateSidebar", "handler", "void", "UpdateComplementary", "UpdateDialog", "input", "state", "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", "variant", "popoverAnchor", "anchor", "popoverAnchorId", "anchorId", "SwitchWorkspace", "previousWorkspace", "workspace", "startsWith", "active", "history", "RevertWorkspace", "Operation", "invoke", "Open", "newHistory", "trimmedHistory", "length", "slice", "Close", "previousActive", "pop", "Set"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/state/state.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom } from '@effect-atom/atom-react';\nimport * as Effect from 'effect/Effect';\n\nimport { Capability, Common } from '@dxos/app-framework';\nimport { Node } from '@dxos/plugin-graph';\n\nimport { type SimpleLayoutState } from '../../types';\nimport { SimpleLayoutState as SimpleLayoutStateCapability } from '../../types';\n\nconst defaultState: SimpleLayoutState = {\n dialogOpen: false,\n workspace: Node.RootId,\n previousWorkspace: Node.RootId,\n history: [],\n isPopover: false,\n};\n\nexport type SimpleLayoutStateOptions = {\n initialState?: Partial<SimpleLayoutState>;\n};\n\nexport default Capability.makeModule(({ initialState }: SimpleLayoutStateOptions = {}) =>\n Effect.sync(() => {\n const stateAtom = Atom.make<SimpleLayoutState>({ ...defaultState, ...initialState });\n\n const layoutAtom = Atom.make((get): Common.Capability.Layout => {\n const state = get(stateAtom);\n return {\n mode: 'simple',\n dialogOpen: state.dialogOpen,\n sidebarOpen: false,\n complementarySidebarOpen: false,\n workspace: state.workspace,\n active: state.active ? [state.active] : [],\n inactive: [],\n scrollIntoView: undefined,\n };\n });\n\n return [\n Capability.contributes(SimpleLayoutStateCapability, stateAtom),\n Capability.contributes(Common.Capability.Layout, layoutAtom),\n ];\n }),\n);\n"],
|
|
5
|
-
"mappings": ";;;;;AAIA,SAASA,YAAY;AACrB,YAAYC,YAAY;AAExB,SAASC,YAAYC,cAAc;AACnC,SAASC,YAAY;AAKrB,IAAMC,eAAkC;EACtCC,YAAY;EACZC,WAAWC,KAAKC;EAChBC,mBAAmBF,KAAKC;EACxBE,SAAS,CAAA;EACTC,WAAW;AACb;AAMA,IAAA,gBAAeC,WAAWC,WAAW,CAAC,EAAEC,aAAY,IAA+B,CAAC,MAC3EC,YAAK,MAAA;AACV,QAAMC,YAAYC,KAAKC,KAAwB;IAAE,GAAGd;IAAc,GAAGU;EAAa,CAAA;AAElF,QAAMK,aAAaF,KAAKC,KAAK,CAACE,QAAAA;AAC5B,UAAMC,QAAQD,IAAIJ,SAAAA;AAClB,WAAO;MACLM,MAAM;MACNjB,YAAYgB,MAAMhB;MAClBkB,aAAa;MACbC,0BAA0B;MAC1BlB,WAAWe,MAAMf;MACjBmB,QAAQJ,MAAMI,SAAS;QAACJ,MAAMI;UAAU,CAAA;MACxCC,UAAU,CAAA;MACVC,gBAAgBC;IAClB;EACF,CAAA;AAEA,SAAO;IACLhB,WAAWiB,YAAYC,mBAA6Bd,SAAAA;IACpDJ,WAAWiB,YAAYE,OAAOnB,WAAWoB,QAAQb,UAAAA;;AAErD,CAAA,CAAA;",
|
|
6
|
-
"names": ["Atom", "Effect", "Capability", "Common", "Node", "defaultState", "dialogOpen", "workspace", "Node", "RootId", "previousWorkspace", "history", "isPopover", "Capability", "makeModule", "initialState", "sync", "stateAtom", "Atom", "make", "layoutAtom", "get", "state", "mode", "sidebarOpen", "complementarySidebarOpen", "active", "inactive", "scrollIntoView", "undefined", "contributes", "SimpleLayoutStateCapability", "Common", "Layout"]
|
|
7
|
-
}
|
|
@@ -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/components/Dialog/Dialog.tsx", "../../../src/hooks/useSimpleLayoutState.ts", "../../../src/components/ContentError.tsx", "../../../src/components/Popover/Popover.tsx", "../../../src/components/SimpleLayout/Main.tsx", "../../../src/components/ContentLoading.tsx", "../../../src/components/SimpleLayout/Banner.tsx", "../../../src/components/SimpleLayout/NavBar.tsx", "../../../src/components/Workspace/Workspace.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useMemo, useRef } from 'react';\n\nimport { Common } from '@dxos/app-framework';\nimport { useAppGraph, useOperationInvoker } from '@dxos/app-framework/react';\nimport { Node, useConnections } from '@dxos/plugin-graph';\nimport { Avatar, Icon, Toolbar, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { Card, Layout, Mosaic, type StackTileComponent } 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 <Layout.Main toolbar>\n <SearchList.Root onSearch={handleSearch}>\n <Toolbar.Root>\n <SearchList.Input placeholder={t('search placeholder')} autoFocus />\n </Toolbar.Root>\n <SearchList.Content>\n <Mosaic.Container asChild>\n <Mosaic.Viewport padding>\n <Mosaic.Stack items={results} getId={(node) => node.id} Tile={WorkspaceTile} />\n </Mosaic.Viewport>\n </Mosaic.Container>\n </SearchList.Content>\n </SearchList.Root>\n </Layout.Main>\n );\n};\n\nconst WorkspaceTile: StackTileComponent<Node.Node> = ({ data }) => {\n const { t } = useTranslation(meta.id);\n const { invokePromise } = useOperationInvoker();\n const { selectedValue, registerItem, unregisterItem } = useSearchListItem();\n const ref = useRef<HTMLDivElement>(null);\n\n const handleSelect = useCallback(\n () => invokePromise(Common.LayoutOperation.SwitchWorkspace, { subject: data.id }),\n [invokePromise, data.id],\n );\n\n useLoadDescendents(data.id);\n\n const name = toLocalizedString(data.properties.label, t);\n const isSelected = selectedValue === data.id;\n\n // Register this workspace 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-hoverOverlay')}\n onClick={handleSelect}\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);\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-framework/react';\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 const frame = requestAnimationFrame(() => {\n if (nodeId) {\n // First level: expand the node itself.\n Graph.expand(graph, nodeId, 'outbound');\n // Second level: expand each child.\n Graph.getConnections(graph, nodeId, 'outbound').forEach((child) => {\n Graph.expand(graph, child.id, 'outbound');\n });\n }\n });\n\n return () => cancelAnimationFrame(frame);\n }, [nodeId, graph]);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Dialog } from '../Dialog';\nimport { PopoverContent, PopoverRoot } from '../Popover';\n\nimport { Main } from './Main';\n\nexport const SimpleLayout = () => {\n return (\n <PopoverRoot>\n <Main />\n <Dialog />\n <PopoverContent />\n </PopoverRoot>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Surface } from '@dxos/app-framework/react';\nimport { AlertDialog, Dialog as NaturalDialog } from '@dxos/react-ui';\n\nimport { useSimpleLayoutState } from '../../hooks';\nimport { ContentError } from '../ContentError';\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((s) => ({ ...s, dialogOpen: nextOpen }))}\n >\n {state.dialogBlockAlign === 'end' ? (\n <Surface role='dialog' data={state.dialogContent} limit={1} fallback={ContentError} />\n ) : (\n <DialogOverlay\n blockAlign={state.dialogBlockAlign}\n classNames={state.dialogOverlayClasses}\n style={state.dialogOverlayStyle}\n >\n <Surface role='dialog' data={state.dialogContent} limit={1} fallback={ContentError} />\n </DialogOverlay>\n )}\n </DialogRoot>\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/react';\n\nimport { type SimpleLayoutState, SimpleLayoutState as SimpleLayoutStateCapability } from '../types';\n\nexport type SimpleLayoutStateHook = {\n state: SimpleLayoutState;\n updateState: (fn: (current: SimpleLayoutState) => SimpleLayoutState) => void;\n};\n\nexport const useSimpleLayoutState = (): SimpleLayoutStateHook => {\n const registry = useContext(RegistryContext);\n const stateAtom = useCapability(SimpleLayoutStateCapability);\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 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { useTranslation } from '@dxos/react-ui';\nimport { descriptionMessage, mx } from '@dxos/ui-theme';\n\nimport { meta } from '../meta';\n\n// TODO(burdon): Factor out.\nexport const ContentError = ({ error }: { error?: Error }) => {\n const { t } = useTranslation(meta.id);\n const errorString = error?.toString() ?? '';\n return (\n <div role='none' className='grid place-items-center overflow-y-auto attention-surface'>\n <p role='alert' className={mx(descriptionMessage, 'p-2 break-all rounded-sm')}>\n {error ? errorString : t('error fallback message')}\n </p>\n </div>\n );\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/react';\nimport { Popover, type PopoverContentInteractOutsideEvent, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { Card } from '@dxos/react-ui-mosaic';\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\nexport const PopoverContent = () => {\n const { t } = useTranslation(meta.id);\n const { state, updateState } = useSimpleLayoutState();\n const { setOpen } = useLayoutPopoverContext('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 === 'card' && (\n <Card.Root>\n <Card.Toolbar>\n {/* TODO(wittjosiah): Cleaner way to handle no drag handle in toolbar? */}\n <span />\n {state.popoverTitle ? <Card.Title>{toLocalizedString(state.popoverTitle, t)}</Card.Title> : <span />}\n <Card.Close onClick={handleClose} />\n </Card.Toolbar>\n <Surface role='card--content' data={state.popoverContent} limit={1} />\n </Card.Root>\n )}\n {state.popoverKind === 'base' && <Surface role='popover' data={state.popoverContent} limit={1} />}\n </Popover.Viewport>\n <Popover.Arrow />\n </Popover.Content>\n </Popover.Portal>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport { Surface, useAppGraph } from '@dxos/app-framework/react';\nimport { log } from '@dxos/log';\nimport { useNode } from '@dxos/plugin-graph';\nimport { Main as NaturalMain } from '@dxos/react-ui';\nimport { ATTENDABLE_PATH_SEPARATOR } from '@dxos/react-ui-attention';\nimport { Mosaic } from '@dxos/react-ui-mosaic';\nimport { mx } from '@dxos/ui-theme';\n\nimport { useSimpleLayoutState } from '../../hooks';\nimport { ContentError } from '../ContentError';\nimport { ContentLoading } from '../ContentLoading';\n\nimport { Banner } from './Banner';\nimport { NavBar } from './NavBar';\n\n/**\n * Main root component.\n */\nexport const Main = () => {\n const { state } = useSimpleLayoutState();\n const id = state.active ?? state.workspace;\n const showNavBar = !state.isPopover;\n const { graph } = useAppGraph();\n const node = useNode(graph, id);\n\n const placeholder = useMemo(() => <ContentLoading />, []);\n\n const data = useMemo(() => {\n const { variant } = parseEntryId(id);\n return (\n node && {\n attendableId: id,\n subject: node.data,\n properties: node.properties,\n popoverAnchorId: state.popoverAnchorId,\n variant,\n }\n );\n }, [id, node, node?.data, node?.properties, state.popoverAnchorId]);\n\n const handleActiveIdChange = useCallback((nextActiveId: string | null) => {\n log.info('navigate', { nextActiveId });\n }, []);\n\n return (\n <Mosaic.Root>\n <NaturalMain.Root complementarySidebarState='closed' navigationSidebarState='closed'>\n <NaturalMain.Content\n bounce\n classNames={mx(\n 'dx-mobile-main dx-mobile-main-scroll-area--flush',\n 'grid bs-full overflow-hidden',\n showNavBar ? 'grid-rows-[min-content_1fr_min-content]' : 'grid-rows-[min-content_1fr]',\n )}\n >\n <Banner classNames='border-be border-separator' node={node} />\n <article className='contents'>\n <Surface key={id} role='article' data={data} limit={1} fallback={ContentError} placeholder={placeholder} />\n </article>\n {showNavBar && (\n <NavBar classNames='border-bs border-separator' activeId={id} onActiveIdChange={handleActiveIdChange} />\n )}\n </NaturalMain.Content>\n </NaturalMain.Root>\n </Mosaic.Root>\n );\n};\n\n// TODO(wittjosiah): Factor out. Copied from deck plugin.\nconst parseEntryId = (entryId: string) => {\n const [id, variant] = entryId.split(ATTENDABLE_PATH_SEPARATOR);\n return { id, variant };\n};\n\nMain.displayName = 'SimpleLayout.Main';\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 attention-surface' />;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport { Common } from '@dxos/app-framework';\nimport { useAppGraph, useOperationInvoker } from '@dxos/app-framework/react';\nimport { Graph, Node } from '@dxos/plugin-graph';\nimport { IconButton, type ThemedClassName, Toolbar, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { mx, osTranslations } from '@dxos/ui-theme';\n\nimport { useSimpleLayoutState } from '../../hooks';\nimport { meta } from '../../meta';\n\n/**\n * Check if an item is a direct child of a workspace or collection.\n * Returns true if any parent node has disposition 'workspace' or 'collection'.\n */\nconst isWorkspaceOrCollectionChild = (graph: Graph.ReadableGraph, itemId: string): boolean => {\n const parents = Graph.getConnections(graph, itemId, 'inbound');\n return parents.some(\n (node) => node.properties.disposition === 'workspace' || node.properties.disposition === 'collection',\n );\n};\n\nexport type BannerProps = ThemedClassName<{\n node?: Node.Node;\n}>;\n\nexport const Banner = ({ node, classNames }: BannerProps) => {\n const { t } = useTranslation(meta.id);\n const { state } = useSimpleLayoutState();\n const { invokePromise } = useOperationInvoker();\n const { graph } = useAppGraph();\n\n const label = (node && toLocalizedString(node.properties.label, t)) ?? t('current app name', { ns: osTranslations });\n\n // Check if current active item is a top-level workspace/collection child.\n const isTopLevelItem = useMemo(() => {\n if (!state.active) {\n return false;\n }\n return isWorkspaceOrCollectionChild(graph, state.active);\n }, [graph, state.active]);\n\n const handleClick = useCallback(async () => {\n if (state.active) {\n // If history is empty and this is a top-level item, go to home.\n if (state.history.length === 0 && isTopLevelItem) {\n await invokePromise(Common.LayoutOperation.SwitchWorkspace, { subject: Node.RootId });\n } else {\n // Otherwise, close (which will pop from history or clear active).\n await invokePromise(Common.LayoutOperation.Close, { subject: [state.active] });\n }\n } else {\n await invokePromise(Common.LayoutOperation.SwitchWorkspace, { subject: Node.RootId });\n }\n }, [invokePromise, state.active, state.history.length, isTopLevelItem]);\n\n if (!node) {\n return null;\n }\n\n return (\n <Toolbar.Root role='banner' classNames={mx('grid grid-cols-[var(--rail-size)_1fr_var(--rail-size)]', classNames)}>\n {node.id !== Node.RootId ? (\n <IconButton\n iconOnly\n variant='ghost'\n icon='ph--caret-left--regular'\n label={t('back label')}\n onClick={handleClick}\n />\n ) : (\n <div />\n )}\n <h1 className={'grow text-center truncate font-medium'}>{label}</h1>\n <IconButton iconOnly variant='ghost' icon='ph--dots-three-vertical--regular' label={t('menu label')} />\n </Toolbar.Root>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { useAppGraph } from '@dxos/app-framework/react';\nimport { Node, useActionRunner, useConnections } from '@dxos/plugin-graph';\nimport { IconButton, type ThemedClassName, Toolbar, Tooltip, useTranslation } from '@dxos/react-ui';\nimport { DropdownMenu, MenuProvider } from '@dxos/react-ui-menu';\nimport { mx } from '@dxos/ui-theme';\n\nimport { meta } from '../../meta';\n\nexport type NavBarProps = ThemedClassName<{\n activeId?: string;\n onActiveIdChange?: (nextActiveId: string | null) => void;\n}>;\n\nexport const NavBar = ({ classNames, activeId, onActiveIdChange }: NavBarProps) => {\n const { t } = useTranslation(meta.id);\n const { graph } = useAppGraph();\n const runAction = useActionRunner();\n\n const connections = useConnections(graph, Node.RootId);\n const menuActions = connections.filter((node) => node.properties.disposition === 'menu');\n\n const isBrowseActive = activeId !== 'notifications' && activeId !== 'profile';\n\n return (\n <Toolbar.Root classNames={mx('justify-center', classNames)}>\n <MenuProvider onAction={runAction}>\n <DropdownMenu.Root items={menuActions}>\n <Tooltip.Trigger asChild content={t('app menu label')}>\n <DropdownMenu.Trigger asChild data-testid='spacePlugin.addSpace'>\n <IconButton icon='ph--plus--regular' iconOnly label={t('main menu label')} />\n </DropdownMenu.Trigger>\n </Tooltip.Trigger>\n </DropdownMenu.Root>\n </MenuProvider>\n {/*\n <ButtonGroup>\n <IconButton\n {...buttonProps}\n label={t('browse label')}\n icon='ph--squares-four--regular'\n onClick={() => onActiveIdChange?.(null)}\n variant={isBrowseActive ? 'primary' : 'default'}\n {...(isBrowseActive && { 'aria-current': 'location' })}\n />\n <IconButton\n {...buttonProps}\n label={t('notifications label')}\n icon='ph--bell-simple--regular'\n onClick={() => onActiveIdChange?.('notifications')}\n variant={activeId === 'notifications' ? 'primary' : 'default'}\n {...(activeId === 'notifications' && { 'aria-current': 'location' })}\n />\n <Button\n variant={activeId === 'profile' ? 'primary' : 'default'}\n onClick={() => onActiveIdChange?.('profile')}\n classNames={buttonProps.classNames}\n >\n <span className='sr-only'>{t('profile label')}</span>\n <Avatar.Root>\n <Avatar.Label classNames='sr-only'>Profile display name</Avatar.Label>\n <Avatar.Content size={8} status='active' hue='cyan' fallback='🗿' />\n </Avatar.Root>\n </Button>\n </ButtonGroup>\n */}\n </Toolbar.Root>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useRef } from 'react';\n\nimport { Common } from '@dxos/app-framework';\nimport { useAppGraph, useOperationInvoker } from '@dxos/app-framework/react';\nimport { type Node, useConnections } from '@dxos/plugin-graph';\nimport { Avatar, Icon, Toolbar, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { Card, Layout, Mosaic, type StackTileComponent } 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 *\n */\n// TODO(burdon): Rename or motivate name in comment.\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, 'outbound');\n\n const { results, handleSearch } = useSearchListResults({\n items: children,\n extract: (child) => toLocalizedString(child.properties.label, t),\n });\n\n return (\n <Layout.Main toolbar>\n <SearchList.Root onSearch={handleSearch}>\n <Toolbar.Root>\n <SearchList.Input placeholder={t('search placeholder')} autoFocus />\n </Toolbar.Root>\n <SearchList.Content>\n <Mosaic.Container asChild>\n <Mosaic.Viewport padding>\n <Mosaic.Stack items={results} getId={(child) => child.id} Tile={WorkspaceChildTile} />\n </Mosaic.Viewport>\n </Mosaic.Container>\n </SearchList.Content>\n </SearchList.Root>\n </Layout.Main>\n );\n};\n\nconst WorkspaceChildTile: StackTileComponent<Node.Node> = ({ 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(Common.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-hoverOverlay')}\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"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["React", "useCallback", "useEffect", "useMemo", "useRef", "Common", "useAppGraph", "useOperationInvoker", "Node", "useConnections", "Avatar", "Icon", "Toolbar", "toLocalizedString", "useTranslation", "Card", "Layout", "Mosaic", "SearchList", "useSearchListItem", "useSearchListResults", "mx", "byPosition", "useEffect", "useAppGraph", "Graph", "useLoadDescendents", "nodeId", "graph", "useAppGraph", "useEffect", "frame", "requestAnimationFrame", "Graph", "expand", "getConnections", "forEach", "child", "id", "cancelAnimationFrame", "Home", "_", "t", "useTranslation", "meta", "id", "userAccountItem", "useItemsByDisposition", "pinnedItems", "workspaceItems", "useLoadDescendents", "Node", "RootId", "items", "useMemo", "results", "handleSearch", "useSearchListResults", "extract", "node", "toLocalizedString", "properties", "label", "Layout", "Main", "toolbar", "SearchList", "Root", "onSearch", "Toolbar", "Input", "placeholder", "autoFocus", "Content", "Mosaic", "Container", "asChild", "Viewport", "padding", "Stack", "getId", "Tile", "WorkspaceTile", "data", "invokePromise", "useOperationInvoker", "selectedValue", "registerItem", "unregisterItem", "useSearchListItem", "ref", "useRef", "handleSelect", "useCallback", "Common", "LayoutOperation", "SwitchWorkspace", "subject", "name", "isSelected", "useEffect", "current", "scrollIntoView", "block", "behavior", "Card", "role", "fullWidth", "tabIndex", "data-selected", "classNames", "mx", "onClick", "density", "Avatar", "icon", "hue", "hueVariant", "variant", "size", "fallback", "Label", "Icon", "filterItems", "disposition", "sort", "graph", "useAppGraph", "connections", "useConnections", "filtered", "filter", "toSorted", "a", "b", "byPosition", "React", "React", "Surface", "AlertDialog", "Dialog", "NaturalDialog", "RegistryContext", "useAtomValue", "useCallback", "useContext", "useCapability", "useSimpleLayoutState", "registry", "useContext", "RegistryContext", "stateAtom", "useCapability", "SimpleLayoutStateCapability", "state", "useAtomValue", "updateState", "useCallback", "fn", "set", "get", "React", "useTranslation", "descriptionMessage", "mx", "ContentError", "error", "t", "useTranslation", "meta", "id", "errorString", "toString", "React", "div", "role", "className", "p", "mx", "descriptionMessage", "Dialog", "state", "updateState", "useSimpleLayoutState", "DialogRoot", "dialogType", "AlertDialog", "Root", "NaturalDialog", "DialogOverlay", "Overlay", "React", "modal", "dialogBlockAlign", "open", "dialogOpen", "onOpenChange", "nextOpen", "s", "Surface", "role", "data", "dialogContent", "limit", "fallback", "ContentError", "blockAlign", "classNames", "dialogOverlayClasses", "style", "dialogOverlayStyle", "createContext", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "Surface", "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", "PopoverContent", "t", "useTranslation", "meta", "id", "updateState", "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", "Card", "Toolbar", "span", "popoverTitle", "Title", "toLocalizedString", "Close", "onClick", "Surface", "role", "data", "limit", "Arrow", "React", "useCallback", "useMemo", "Surface", "useAppGraph", "log", "useNode", "Main", "NaturalMain", "ATTENDABLE_PATH_SEPARATOR", "Mosaic", "mx", "React", "ContentLoading", "React", "div", "role", "className", "React", "useCallback", "useMemo", "Common", "useAppGraph", "useOperationInvoker", "Graph", "Node", "IconButton", "Toolbar", "toLocalizedString", "useTranslation", "mx", "osTranslations", "isWorkspaceOrCollectionChild", "graph", "itemId", "parents", "Graph", "getConnections", "some", "node", "properties", "disposition", "Banner", "classNames", "t", "useTranslation", "meta", "id", "state", "useSimpleLayoutState", "invokePromise", "useOperationInvoker", "useAppGraph", "label", "toLocalizedString", "ns", "osTranslations", "isTopLevelItem", "useMemo", "active", "handleClick", "useCallback", "history", "length", "Common", "LayoutOperation", "SwitchWorkspace", "subject", "Node", "RootId", "Close", "React", "Toolbar", "Root", "role", "mx", "IconButton", "iconOnly", "variant", "icon", "onClick", "div", "h1", "className", "React", "useAppGraph", "Node", "useActionRunner", "useConnections", "IconButton", "Toolbar", "Tooltip", "useTranslation", "DropdownMenu", "MenuProvider", "mx", "NavBar", "classNames", "activeId", "onActiveIdChange", "t", "useTranslation", "meta", "id", "graph", "useAppGraph", "runAction", "useActionRunner", "connections", "useConnections", "Node", "RootId", "menuActions", "filter", "node", "properties", "disposition", "isBrowseActive", "React", "Toolbar", "Root", "mx", "MenuProvider", "onAction", "DropdownMenu", "items", "Tooltip", "Trigger", "asChild", "content", "data-testid", "IconButton", "icon", "iconOnly", "label", "Main", "state", "useSimpleLayoutState", "id", "active", "workspace", "showNavBar", "isPopover", "graph", "useAppGraph", "node", "useNode", "placeholder", "useMemo", "React", "ContentLoading", "data", "variant", "parseEntryId", "attendableId", "subject", "properties", "popoverAnchorId", "handleActiveIdChange", "useCallback", "nextActiveId", "log", "info", "Mosaic", "Root", "NaturalMain", "complementarySidebarState", "navigationSidebarState", "Content", "bounce", "classNames", "mx", "Banner", "article", "className", "Surface", "key", "role", "limit", "fallback", "ContentError", "NavBar", "activeId", "onActiveIdChange", "entryId", "split", "ATTENDABLE_PATH_SEPARATOR", "displayName", "SimpleLayout", "React", "PopoverRoot", "Main", "Dialog", "PopoverContent", "React", "useCallback", "useEffect", "useRef", "Common", "useAppGraph", "useOperationInvoker", "useConnections", "Avatar", "Icon", "Toolbar", "toLocalizedString", "useTranslation", "Card", "Layout", "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", "Layout", "Main", "toolbar", "SearchList", "Root", "onSearch", "Toolbar", "Input", "placeholder", "autoFocus", "Content", "Mosaic", "Container", "asChild", "Viewport", "padding", "Stack", "getId", "Tile", "WorkspaceChildTile", "data", "invokeSync", "useOperationInvoker", "ref", "useRef", "selectedValue", "registerItem", "unregisterItem", "useSearchListItem", "isSelected", "name", "handleSelect", "useCallback", "Common", "LayoutOperation", "Open", "subject", "useEffect", "current", "scrollIntoView", "block", "behavior", "Card", "role", "fullWidth", "tabIndex", "data-selected", "classNames", "mx", "onClick", "density", "Avatar", "hue", "icon", "hueVariant", "variant", "size", "fallback", "Label", "Icon"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/meta.ts", "../../../src/types/capabilities.ts", "../../../src/types/events.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Plugin } from '@dxos/app-framework';\nimport { trim } from '@dxos/util';\n\nexport const meta: Plugin.Meta = {\n id: 'dxos.org/plugin/simple-layout',\n name: 'Simple Layout',\n description: trim`\n Minimal layout plugin for simplified UI contexts like popover windows.\n Provides basic content rendering without sidebars or complex navigation.\n `,\n icon: 'ph--layout--regular',\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Atom } from '@effect-atom/atom-react';\n\nimport { Capability } from '@dxos/app-framework';\nimport { type Label } from '@dxos/react-ui';\n\nimport { meta } from '../meta';\n\n// TODO(wittjosiah): Handle toasts.\nexport type SimpleLayoutState = {\n /** Data to be passed to the main content Surface. */\n content?: any;\n\n dialogOpen: boolean;\n dialogType?: 'default' | 'alert';\n dialogBlockAlign?: 'start' | 'center' | 'end';\n dialogOverlayClasses?: string;\n dialogOverlayStyle?: Record<string, any>;\n /** Data to be passed to the dialog Surface. */\n dialogContent?: any;\n\n popoverOpen?: boolean;\n popoverSide?: 'top' | 'right' | 'bottom' | 'left';\n popoverVariant?: 'virtual' | 'react';\n popoverAnchor?: HTMLButtonElement;\n popoverAnchorId?: string;\n popoverKind?: 'base' | 'card';\n popoverTitle?: Label;\n popoverContent?: any;\n\n workspace: string;\n previousWorkspace: string;\n active?: string;\n /** Stack of previously active item IDs for back navigation. */\n history: string[];\n\n /** Whether running in popover window context (hides mobile-specific UI). */\n isPopover?: boolean;\n};\n\nexport const SimpleLayoutState = Capability.make<Atom.Writable<SimpleLayoutState>>(`${meta.id}/state`);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ActivationEvent, Common } from '@dxos/app-framework';\n\nimport { SimpleLayoutState } from './capabilities';\n\nexport namespace SimpleLayoutEvents {\n /** Fired when SimpleLayoutState capability is ready. */\n export const StateReady: ActivationEvent.ActivationEvent = Common.ActivationEvent.createStateEvent(\n SimpleLayoutState.identifier,\n );\n}\n"],
|
|
5
|
-
"mappings": ";;;AAKA,SAASA,YAAY;AAEd,IAAMC,OAAoB;EAC/BC,IAAI;EACJC,MAAM;EACNC,aAAaC;;;;EAIbC,MAAM;AACR;;;ACTA,SAASC,kBAAkB;AAqCpB,IAAMC,oBAAoBC,WAAWC,KAAuC,GAAGC,KAAKC,EAAE,QAAQ;;;ACvCrG,SAA+BC,cAAc;UAI5BC,qBAAAA;sBAEFC,aAA8CC,OAAOC,gBAAgBC,iBAChFC,kBAAkBC,UAAU;AAEhC,GALiBN,uBAAAA,qBAAAA,CAAAA,EAAAA;;",
|
|
6
|
-
"names": ["trim", "meta", "id", "name", "description", "trim", "icon", "Capability", "SimpleLayoutState", "Capability", "make", "meta", "id", "Common", "SimpleLayoutEvents", "StateReady", "Common", "ActivationEvent", "createStateEvent", "SimpleLayoutState", "identifier"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/operation-resolver/operation-resolver.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability, Common } from '@dxos/app-framework';\nimport { Operation, OperationResolver } from '@dxos/operation';\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\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const registry = yield* Capability.get(Common.Capability.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(Common.Capability.OperationResolver, [\n //\n // UpdateSidebar - No-op for simple layout.\n //\n OperationResolver.make({\n operation: Common.LayoutOperation.UpdateSidebar,\n handler: () => Effect.void,\n }),\n\n //\n // UpdateComplementary - No-op for simple layout.\n //\n OperationResolver.make({\n operation: Common.LayoutOperation.UpdateComplementary,\n handler: () => Effect.void,\n }),\n\n //\n // UpdateDialog\n //\n OperationResolver.make({\n operation: Common.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: Common.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: Common.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: Common.LayoutOperation.RevertWorkspace,\n handler: Effect.fnUntraced(function* () {\n const state = getState();\n yield* Operation.invoke(Common.LayoutOperation.SwitchWorkspace, {\n subject: state.previousWorkspace,\n });\n }),\n }),\n\n //\n // Open\n //\n OperationResolver.make({\n operation: Common.LayoutOperation.Open,\n handler: Effect.fnUntraced(function* (input) {\n updateState((state) => {\n // Push current active to history if it exists.\n const newHistory = state.active ? [...state.history, state.active] : state.history;\n // Limit history length to prevent memory issues.\n const trimmedHistory =\n newHistory.length > MAX_HISTORY_LENGTH ? newHistory.slice(-MAX_HISTORY_LENGTH) : newHistory;\n return {\n ...state,\n active: input.subject[0],\n history: trimmedHistory,\n };\n });\n }),\n }),\n\n //\n // Close\n //\n OperationResolver.make({\n operation: Common.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: Common.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", "Capability", "Common", "Operation", "OperationResolver", "MAX_HISTORY_LENGTH", "Capability", "makeModule", "fnUntraced", "registry", "get", "Common", "AtomRegistry", "stateAtom", "SimpleLayoutStateCapability", "getState", "updateState", "fn", "set", "contributes", "OperationResolver", "make", "operation", "LayoutOperation", "UpdateSidebar", "handler", "void", "UpdateComplementary", "UpdateDialog", "input", "state", "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", "variant", "popoverAnchor", "anchor", "popoverAnchorId", "anchorId", "SwitchWorkspace", "previousWorkspace", "workspace", "startsWith", "active", "history", "RevertWorkspace", "Operation", "invoke", "Open", "newHistory", "trimmedHistory", "length", "slice", "Close", "previousActive", "pop", "Set"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/state/state.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom } from '@effect-atom/atom-react';\nimport * as Effect from 'effect/Effect';\n\nimport { Capability, Common } from '@dxos/app-framework';\nimport { Node } from '@dxos/plugin-graph';\n\nimport { type SimpleLayoutState } from '../../types';\nimport { SimpleLayoutState as SimpleLayoutStateCapability } from '../../types';\n\nconst defaultState: SimpleLayoutState = {\n dialogOpen: false,\n workspace: Node.RootId,\n previousWorkspace: Node.RootId,\n history: [],\n isPopover: false,\n};\n\nexport type SimpleLayoutStateOptions = {\n initialState?: Partial<SimpleLayoutState>;\n};\n\nexport default Capability.makeModule(({ initialState }: SimpleLayoutStateOptions = {}) =>\n Effect.sync(() => {\n const stateAtom = Atom.make<SimpleLayoutState>({ ...defaultState, ...initialState });\n\n const layoutAtom = Atom.make((get): Common.Capability.Layout => {\n const state = get(stateAtom);\n return {\n mode: 'simple',\n dialogOpen: state.dialogOpen,\n sidebarOpen: false,\n complementarySidebarOpen: false,\n workspace: state.workspace,\n active: state.active ? [state.active] : [],\n inactive: [],\n scrollIntoView: undefined,\n };\n });\n\n return [\n Capability.contributes(SimpleLayoutStateCapability, stateAtom),\n Capability.contributes(Common.Capability.Layout, layoutAtom),\n ];\n }),\n);\n"],
|
|
5
|
-
"mappings": ";;;;;;AAIA,SAASA,YAAY;AACrB,YAAYC,YAAY;AAExB,SAASC,YAAYC,cAAc;AACnC,SAASC,YAAY;AAKrB,IAAMC,eAAkC;EACtCC,YAAY;EACZC,WAAWC,KAAKC;EAChBC,mBAAmBF,KAAKC;EACxBE,SAAS,CAAA;EACTC,WAAW;AACb;AAMA,IAAA,gBAAeC,WAAWC,WAAW,CAAC,EAAEC,aAAY,IAA+B,CAAC,MAC3EC,YAAK,MAAA;AACV,QAAMC,YAAYC,KAAKC,KAAwB;IAAE,GAAGd;IAAc,GAAGU;EAAa,CAAA;AAElF,QAAMK,aAAaF,KAAKC,KAAK,CAACE,QAAAA;AAC5B,UAAMC,QAAQD,IAAIJ,SAAAA;AAClB,WAAO;MACLM,MAAM;MACNjB,YAAYgB,MAAMhB;MAClBkB,aAAa;MACbC,0BAA0B;MAC1BlB,WAAWe,MAAMf;MACjBmB,QAAQJ,MAAMI,SAAS;QAACJ,MAAMI;UAAU,CAAA;MACxCC,UAAU,CAAA;MACVC,gBAAgBC;IAClB;EACF,CAAA;AAEA,SAAO;IACLhB,WAAWiB,YAAYC,mBAA6Bd,SAAAA;IACpDJ,WAAWiB,YAAYE,OAAOnB,WAAWoB,QAAQb,UAAAA;;AAErD,CAAA,CAAA;",
|
|
6
|
-
"names": ["Atom", "Effect", "Capability", "Common", "Node", "defaultState", "dialogOpen", "workspace", "Node", "RootId", "previousWorkspace", "history", "isPopover", "Capability", "makeModule", "initialState", "sync", "stateAtom", "Atom", "make", "layoutAtom", "get", "state", "mode", "sidebarOpen", "complementarySidebarOpen", "active", "inactive", "scrollIntoView", "undefined", "contributes", "SimpleLayoutStateCapability", "Common", "Layout"]
|
|
7
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/lib/node-esm/{react-surface-FKAV56MO.mjs.map → react-surface-CGHFVWU3.mjs.map}
RENAMED
|
File without changes
|
|
File without changes
|