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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/dist/lib/browser/{chunk-TMZNLVT2.mjs → chunk-MDPEKLKR.mjs} +55 -62
  2. package/dist/lib/browser/chunk-MDPEKLKR.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-7VLT3S46.mjs → chunk-MRR7PXSM.mjs} +3 -3
  4. package/dist/lib/browser/{chunk-7VLT3S46.mjs.map → chunk-MRR7PXSM.mjs.map} +1 -1
  5. package/dist/lib/browser/index.mjs +6 -6
  6. package/dist/lib/browser/meta.json +1 -1
  7. package/dist/lib/browser/{operation-resolver-BYRIQOQT.mjs → operation-resolver-VTZ6HZ4B.mjs} +24 -35
  8. package/dist/lib/browser/operation-resolver-VTZ6HZ4B.mjs.map +7 -0
  9. package/dist/lib/browser/{react-root-MMB575WY.mjs → react-root-WVQYY2JA.mjs} +3 -3
  10. package/dist/lib/browser/{react-surface-M6CURANW.mjs → react-surface-VLBR37ED.mjs} +11 -8
  11. package/dist/lib/browser/{react-surface-M6CURANW.mjs.map → react-surface-VLBR37ED.mjs.map} +3 -3
  12. package/dist/lib/browser/{state-A3PGDWWZ.mjs → state-TXSMUWYI.mjs} +2 -2
  13. package/dist/lib/browser/{url-handler-HTIUY6WL.mjs → url-handler-RBRONH7S.mjs} +18 -19
  14. package/dist/lib/browser/url-handler-RBRONH7S.mjs.map +7 -0
  15. package/dist/lib/node-esm/{chunk-FLOYBAHE.mjs → chunk-DCKASLMP.mjs} +55 -62
  16. package/dist/lib/node-esm/chunk-DCKASLMP.mjs.map +7 -0
  17. package/dist/lib/node-esm/{chunk-VIDE5UMB.mjs → chunk-WMNTJ2MK.mjs} +3 -3
  18. package/dist/lib/node-esm/{chunk-VIDE5UMB.mjs.map → chunk-WMNTJ2MK.mjs.map} +1 -1
  19. package/dist/lib/node-esm/index.mjs +6 -6
  20. package/dist/lib/node-esm/meta.json +1 -1
  21. package/dist/lib/node-esm/{operation-resolver-BDTFNCS2.mjs → operation-resolver-R7CQ6ERU.mjs} +24 -35
  22. package/dist/lib/node-esm/operation-resolver-R7CQ6ERU.mjs.map +7 -0
  23. package/dist/lib/node-esm/{react-root-ENZKVSY4.mjs → react-root-XBNDM7BE.mjs} +3 -3
  24. package/dist/lib/node-esm/{react-surface-ITVNQYLG.mjs → react-surface-U5NHA367.mjs} +11 -8
  25. package/dist/lib/node-esm/{react-surface-ITVNQYLG.mjs.map → react-surface-U5NHA367.mjs.map} +3 -3
  26. package/dist/lib/node-esm/{state-ZCFZTTPL.mjs → state-JMX6FAG4.mjs} +2 -2
  27. package/dist/lib/node-esm/{url-handler-WBVVKVPC.mjs → url-handler-QSMCH3JB.mjs} +18 -19
  28. package/dist/lib/node-esm/url-handler-QSMCH3JB.mjs.map +7 -0
  29. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -1
  30. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -1
  31. package/dist/types/src/capabilities/url-handler/url-handler.d.ts +2 -2
  32. package/dist/types/src/capabilities/url-handler/url-handler.d.ts.map +1 -1
  33. package/dist/types/src/components/ContentLoading/ContentLoading.d.ts.map +1 -0
  34. package/dist/types/src/components/ContentLoading/ContentLoading.stories.d.ts.map +1 -0
  35. package/dist/types/src/components/ContentLoading/index.d.ts +2 -0
  36. package/dist/types/src/components/ContentLoading/index.d.ts.map +1 -0
  37. package/dist/types/src/components/NavBranch/NavBranch.d.ts +11 -0
  38. package/dist/types/src/components/NavBranch/NavBranch.d.ts.map +1 -0
  39. package/dist/types/src/components/NavBranch/index.d.ts +2 -0
  40. package/dist/types/src/components/NavBranch/index.d.ts.map +1 -0
  41. package/dist/types/src/components/SimpleLayout/Main.d.ts.map +1 -1
  42. package/dist/types/src/components/hooks.d.ts +4 -2
  43. package/dist/types/src/components/hooks.d.ts.map +1 -1
  44. package/dist/types/src/components/index.d.ts +1 -1
  45. package/dist/types/src/hooks/actions.d.ts +3 -4
  46. package/dist/types/src/hooks/actions.d.ts.map +1 -1
  47. package/dist/types/src/hooks/useAppBarProps.d.ts.map +1 -1
  48. package/dist/types/src/hooks/useDrawerActions.d.ts.map +1 -1
  49. package/dist/types/src/hooks/useNavbarActions.d.ts.map +1 -1
  50. package/dist/types/tsconfig.tsbuildinfo +1 -1
  51. package/package.json +27 -27
  52. package/src/capabilities/operation-resolver/operation-resolver.ts +19 -34
  53. package/src/capabilities/react-surface/react-surface.tsx +8 -6
  54. package/src/capabilities/url-handler/url-handler.ts +11 -35
  55. package/src/components/ContentLoading/index.ts +5 -0
  56. package/src/components/Home/Home.tsx +3 -3
  57. package/src/components/{Workspace/Workspace.tsx → NavBranch/NavBranch.tsx} +18 -13
  58. package/src/components/{Workspace → NavBranch}/index.ts +1 -1
  59. package/src/components/SimpleLayout/Drawer.tsx +3 -12
  60. package/src/components/SimpleLayout/Main.tsx +3 -4
  61. package/src/components/hooks.ts +8 -8
  62. package/src/components/index.ts +1 -1
  63. package/src/hooks/actions.ts +13 -15
  64. package/src/hooks/useAppBarProps.ts +1 -2
  65. package/src/hooks/useDrawerActions.ts +7 -5
  66. package/src/hooks/useNavbarActions.ts +5 -4
  67. package/src/meta.ts +1 -1
  68. package/src/types/capabilities.ts +1 -1
  69. package/dist/lib/browser/chunk-TMZNLVT2.mjs.map +0 -7
  70. package/dist/lib/browser/operation-resolver-BYRIQOQT.mjs.map +0 -7
  71. package/dist/lib/browser/url-handler-HTIUY6WL.mjs.map +0 -7
  72. package/dist/lib/node-esm/chunk-FLOYBAHE.mjs.map +0 -7
  73. package/dist/lib/node-esm/operation-resolver-BDTFNCS2.mjs.map +0 -7
  74. package/dist/lib/node-esm/url-handler-WBVVKVPC.mjs.map +0 -7
  75. package/dist/types/src/components/ContentLoading.d.ts.map +0 -1
  76. package/dist/types/src/components/ContentLoading.stories.d.ts.map +0 -1
  77. package/dist/types/src/components/Workspace/Workspace.d.ts +0 -11
  78. package/dist/types/src/components/Workspace/Workspace.d.ts.map +0 -1
  79. package/dist/types/src/components/Workspace/index.d.ts +0 -2
  80. package/dist/types/src/components/Workspace/index.d.ts.map +0 -1
  81. /package/dist/lib/browser/{react-root-MMB575WY.mjs.map → react-root-WVQYY2JA.mjs.map} +0 -0
  82. /package/dist/lib/browser/{state-A3PGDWWZ.mjs.map → state-TXSMUWYI.mjs.map} +0 -0
  83. /package/dist/lib/node-esm/{react-root-ENZKVSY4.mjs.map → react-root-XBNDM7BE.mjs.map} +0 -0
  84. /package/dist/lib/node-esm/{state-ZCFZTTPL.mjs.map → state-JMX6FAG4.mjs.map} +0 -0
  85. /package/dist/types/src/components/{ContentLoading.d.ts → ContentLoading/ContentLoading.d.ts} +0 -0
  86. /package/dist/types/src/components/{ContentLoading.stories.d.ts → ContentLoading/ContentLoading.stories.d.ts} +0 -0
  87. /package/src/components/{ContentLoading.stories.tsx → ContentLoading/ContentLoading.stories.tsx} +0 -0
  88. /package/src/components/{ContentLoading.tsx → ContentLoading/ContentLoading.tsx} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  SimpleLayoutState,
3
3
  meta
4
- } from "./chunk-7VLT3S46.mjs";
4
+ } from "./chunk-MRR7PXSM.mjs";
5
5
 
6
6
  // src/components/Home/Home.tsx
7
7
  import React, { useCallback, useEffect as useEffect2, useMemo, useRef } from "react";
@@ -18,16 +18,16 @@ import { byPosition } from "@dxos/util";
18
18
 
19
19
  // src/components/hooks.ts
20
20
  import { useEffect } from "react";
21
+ import { expandAttendableId } from "@dxos/react-ui-attention";
21
22
  import { useAppGraph } from "@dxos/app-toolkit/ui";
22
23
  import { Graph } from "@dxos/plugin-graph";
23
- var useLoadDescendents = (nodeId) => {
24
+ var useExpandPath = (nodeId) => {
24
25
  const { graph } = useAppGraph();
25
26
  useEffect(() => {
26
27
  if (nodeId) {
27
- Graph.expand(graph, nodeId, "child");
28
- Graph.getConnections(graph, nodeId, "child").forEach((child) => {
29
- Graph.expand(graph, child.id, "child");
30
- });
28
+ for (const prefix of expandAttendableId(nodeId)) {
29
+ Graph.expand(graph, prefix, "child");
30
+ }
31
31
  }
32
32
  }, [
33
33
  nodeId,
@@ -41,7 +41,7 @@ var Home = (_) => {
41
41
  const userAccountItem = useItemsByDisposition("user-account")[0];
42
42
  const pinnedItems = useItemsByDisposition("pin-end", true);
43
43
  const workspaceItems = useItemsByDisposition("workspace");
44
- useLoadDescendents(Node.RootId);
44
+ useExpandPath(Node.RootId);
45
45
  const items = useMemo(() => [
46
46
  ...userAccountItem ? [
47
47
  userAccountItem
@@ -86,7 +86,7 @@ var WorkspaceTile = (props) => {
86
86
  const name = toLocalizedString(data.properties.label, t);
87
87
  const isSelected = selectedValue === data.id;
88
88
  const cardRef = useRef(null);
89
- useLoadDescendents(data.id);
89
+ useExpandPath(data.id);
90
90
  const handleSelect = useCallback(() => invokePromise(LayoutOperation.SwitchWorkspace, {
91
91
  subject: data.id
92
92
  }), [
@@ -242,7 +242,7 @@ var useAppBarProps = () => {
242
242
  state.active,
243
243
  state.history.length
244
244
  ]);
245
- const popoverAnchorId = node && state.popoverAnchorId === `dxos.org/ui/${meta.id}/${node.id}` ? state.popoverAnchorId : void 0;
245
+ const popoverAnchorId = node && state.popoverAnchorId === `${meta.id}:${node.id}` ? state.popoverAnchorId : void 0;
246
246
  return {
247
247
  title,
248
248
  actions: actionsAtom,
@@ -261,13 +261,12 @@ import { byPosition as byPosition3 } from "@dxos/util";
261
261
 
262
262
  // src/hooks/actions.ts
263
263
  import * as Effect2 from "effect/Effect";
264
- import { LayoutOperation as LayoutOperation3 } from "@dxos/app-toolkit";
264
+ import { getCompanionVariant } from "@dxos/app-toolkit";
265
265
  import { Node as Node3 } from "@dxos/plugin-graph";
266
- import { ATTENDABLE_PATH_SEPARATOR } from "@dxos/react-ui-attention";
267
266
  import { byPosition as byPosition2 } from "@dxos/util";
268
- var PLANK_COMPANION_TYPE = "dxos.org/plugin/deck/plank-companion";
267
+ var PLANK_COMPANION_TYPE = "org.dxos.plugin.deck.plank-companion";
269
268
  var createCompanionActions = (graph, stateAtom, get, config) => {
270
- const { idPrefix, selectedVariant, invokeSync } = config;
269
+ const { idPrefix, selectedVariant, updateState } = config;
271
270
  const state = get(stateAtom);
272
271
  const activeId = state.active ?? state.workspace;
273
272
  const activeConnections = activeId ? get(graph.connections(activeId, "child")) : [];
@@ -275,7 +274,7 @@ var createCompanionActions = (graph, stateAtom, get, config) => {
275
274
  const nodes = [];
276
275
  const edges = [];
277
276
  companions.forEach((companion) => {
278
- const [, companionVariant] = companion.id.split(ATTENDABLE_PATH_SEPARATOR);
277
+ const companionVariant = getCompanionVariant(companion.id);
279
278
  const companionAction = {
280
279
  id: `${idPrefix}-companion-${companion.id}`,
281
280
  type: Node3.ActionType,
@@ -283,15 +282,17 @@ var createCompanionActions = (graph, stateAtom, get, config) => {
283
282
  icon: companion.properties.icon ?? "ph--placeholder--regular",
284
283
  label: companion.properties.label,
285
284
  iconOnly: true,
286
- // Conditionally add variant highlighting.
287
285
  ...selectedVariant !== void 0 && {
288
286
  variant: selectedVariant === companionVariant ? "primary" : "ghost"
289
287
  }
290
288
  },
291
- data: () => Effect2.sync(() => invokeSync(LayoutOperation3.Open, {
292
- subject: [
293
- companion.id
294
- ]
289
+ data: () => Effect2.sync(() => updateState((current) => {
290
+ const closing = current.companionVariant === companionVariant && current.drawerState !== "closed";
291
+ return {
292
+ ...current,
293
+ companionVariant: closing ? void 0 : companionVariant,
294
+ drawerState: closing ? "closed" : "open"
295
+ };
295
296
  }))
296
297
  };
297
298
  nodes.push(companionAction);
@@ -320,14 +321,14 @@ var useCompanions = (nodeId) => {
320
321
  // src/hooks/useDrawerActions.ts
321
322
  import { Atom as Atom2 } from "@effect-atom/atom-react";
322
323
  import * as Effect3 from "effect/Effect";
323
- import { useMemo as useMemo6 } from "react";
324
- import { useCapability as useCapability3, useOperationInvoker as useOperationInvoker4 } from "@dxos/app-framework/ui";
324
+ import { useMemo as useMemo7 } from "react";
325
+ import { useCapability as useCapability3 } from "@dxos/app-framework/ui";
325
326
  import { useAppGraph as useAppGraph7 } from "@dxos/app-toolkit/ui";
326
327
  import { Node as Node4, useActionRunner as useActionRunner2 } from "@dxos/plugin-graph";
327
328
  import { useTranslation as useTranslation6 } from "@dxos/react-ui";
328
329
  import { createGapSeparator } from "@dxos/react-ui-menu";
329
330
 
330
- // src/components/ContentLoading.tsx
331
+ // src/components/ContentLoading/ContentLoading.tsx
331
332
  import React2 from "react";
332
333
  var ContentLoading = () => {
333
334
  return /* @__PURE__ */ React2.createElement("div", {
@@ -721,7 +722,7 @@ var Main = () => {
721
722
  node?.properties,
722
723
  state.popoverAnchorId
723
724
  ]);
724
- useLoadDescendents(id);
725
+ useExpandPath(id);
725
726
  const showNavBar = !keyboardOpen && !state.isPopover && state.drawerState === "closed";
726
727
  return /* @__PURE__ */ React7.createElement("div", {
727
728
  role: "none",
@@ -744,10 +745,10 @@ var Main = () => {
744
745
  };
745
746
  Main.displayName = MAIN_NAME;
746
747
 
747
- // src/components/Workspace/Workspace.tsx
748
- import React8, { useCallback as useCallback4, useEffect as useEffect5, useRef as useRef3 } from "react";
748
+ // src/components/NavBranch/NavBranch.tsx
749
+ import React8, { useCallback as useCallback4, useEffect as useEffect5, useMemo as useMemo6, useRef as useRef3 } from "react";
749
750
  import { useOperationInvoker as useOperationInvoker3 } from "@dxos/app-framework/ui";
750
- import { LayoutOperation as LayoutOperation4 } from "@dxos/app-toolkit";
751
+ import { LayoutOperation as LayoutOperation3 } from "@dxos/app-toolkit";
751
752
  import { useAppGraph as useAppGraph6 } from "@dxos/app-toolkit/ui";
752
753
  import { useConnections as useConnections3 } from "@dxos/plugin-graph";
753
754
  import { Avatar as Avatar2, Icon as Icon2, Panel as Panel2, ScrollArea as ScrollArea2, Toolbar as Toolbar3, toLocalizedString as toLocalizedString4, useTranslation as useTranslation5 } from "@dxos/react-ui";
@@ -755,13 +756,16 @@ import { Card as Card3 } from "@dxos/react-ui";
755
756
  import { Mosaic as Mosaic2 } from "@dxos/react-ui-mosaic";
756
757
  import { SearchList as SearchList2, useSearchListItem as useSearchListItem2, useSearchListResults as useSearchListResults2 } from "@dxos/react-ui-searchlist";
757
758
  import { mx as mx6 } from "@dxos/ui-theme";
758
- var Workspace = ({ id }) => {
759
+ var NavBranch = ({ id }) => {
759
760
  const { t } = useTranslation5(meta.id);
760
761
  const { graph } = useAppGraph6();
761
- useLoadDescendents(id);
762
+ useExpandPath(id);
762
763
  const children = useConnections3(graph, id, "child");
764
+ const visibleChildren = useMemo6(() => children.filter((node) => node.properties.disposition !== "alternate-tree"), [
765
+ children
766
+ ]);
763
767
  const { results, handleSearch } = useSearchListResults2({
764
- items: children,
768
+ items: visibleChildren,
765
769
  extract: (child) => toLocalizedString4(child.properties.label, t)
766
770
  });
767
771
  return /* @__PURE__ */ React8.createElement(SearchList2.Root, {
@@ -782,10 +786,10 @@ var Workspace = ({ id }) => {
782
786
  }, /* @__PURE__ */ React8.createElement(Mosaic2.Stack, {
783
787
  items: results,
784
788
  getId: (child) => child.id,
785
- Tile: WorkspaceChildTile
789
+ Tile: NavBranchTile
786
790
  }))))))));
787
791
  };
788
- var WorkspaceChildTile = (props) => {
792
+ var NavBranchTile = (props) => {
789
793
  const data = props.data;
790
794
  const { t } = useTranslation5(meta.id);
791
795
  const { invokeSync } = useOperationInvoker3();
@@ -793,7 +797,7 @@ var WorkspaceChildTile = (props) => {
793
797
  const { selectedValue, registerItem, unregisterItem } = useSearchListItem2();
794
798
  const isSelected = selectedValue === data.id;
795
799
  const name = toLocalizedString4(data.properties.label, t);
796
- const handleSelect = useCallback4(() => invokeSync(LayoutOperation4.Open, {
800
+ const handleSelect = useCallback4(() => invokeSync(LayoutOperation3.Open, {
797
801
  subject: [
798
802
  data.id
799
803
  ]
@@ -870,15 +874,14 @@ var useDrawerActions = (consumerName) => {
870
874
  const stateAtom = useCapability3(SimpleLayoutState);
871
875
  const { graph } = useAppGraph7();
872
876
  const runAction = useActionRunner2();
873
- const { invokeSync } = useOperationInvoker4();
874
877
  const { updateState } = useSimpleLayoutState();
875
878
  const { keyboardOpen } = useMobileLayout(consumerName);
876
- const actionsAtom = useMemo6(() => Atom2.make((get) => {
879
+ const actionsAtom = useMemo7(() => Atom2.make((get) => {
877
880
  const state = get(stateAtom);
878
881
  const { nodes, edges } = createCompanionActions(graph, stateAtom, get, {
879
882
  idPrefix: "drawer",
880
883
  selectedVariant: state.companionVariant,
881
- invokeSync
884
+ updateState
882
885
  });
883
886
  const gapSeparator = createGapSeparator("drawer-gap");
884
887
  nodes.push(...gapSeparator.nodes);
@@ -915,7 +918,8 @@ var useDrawerActions = (consumerName) => {
915
918
  },
916
919
  data: () => Effect3.sync(() => updateState((state2) => ({
917
920
  ...state2,
918
- drawerState: "closed"
921
+ drawerState: "closed",
922
+ companionVariant: void 0
919
923
  })))
920
924
  };
921
925
  nodes.push(closeAction);
@@ -931,7 +935,6 @@ var useDrawerActions = (consumerName) => {
931
935
  }), [
932
936
  graph,
933
937
  stateAtom,
934
- invokeSync,
935
938
  updateState,
936
939
  keyboardOpen,
937
940
  t
@@ -944,8 +947,8 @@ var useDrawerActions = (consumerName) => {
944
947
 
945
948
  // src/hooks/useNavbarActions.ts
946
949
  import { Atom as Atom3 } from "@effect-atom/atom-react";
947
- import { useMemo as useMemo7 } from "react";
948
- import { useCapability as useCapability4, useOperationInvoker as useOperationInvoker5 } from "@dxos/app-framework/ui";
950
+ import { useMemo as useMemo8 } from "react";
951
+ import { useCapability as useCapability4 } from "@dxos/app-framework/ui";
949
952
  import { useAppGraph as useAppGraph8 } from "@dxos/app-toolkit/ui";
950
953
  import { Node as Node5, useActionRunner as useActionRunner3 } from "@dxos/plugin-graph";
951
954
  import { useTranslation as useTranslation7 } from "@dxos/react-ui";
@@ -955,12 +958,12 @@ var useNavbarActions = () => {
955
958
  const { t } = useTranslation7(meta.id);
956
959
  const { graph } = useAppGraph8();
957
960
  const runAction = useActionRunner3();
958
- const { invokeSync } = useOperationInvoker5();
959
961
  const stateAtom = useCapability4(SimpleLayoutState);
960
- const actionsAtom = useMemo7(() => Atom3.make((get) => {
962
+ const { updateState } = useSimpleLayoutState();
963
+ const actionsAtom = useMemo8(() => Atom3.make((get) => {
961
964
  const { nodes, edges } = createCompanionActions(graph, stateAtom, get, {
962
965
  idPrefix: "navbar",
963
- invokeSync
966
+ updateState
964
967
  });
965
968
  const gapSeparator = createGapSeparator2("navbar-gap");
966
969
  nodes.push(...gapSeparator.nodes);
@@ -995,7 +998,7 @@ var useNavbarActions = () => {
995
998
  }), [
996
999
  graph,
997
1000
  stateAtom,
998
- invokeSync,
1001
+ updateState,
999
1002
  t
1000
1003
  ]);
1001
1004
  return {
@@ -1038,24 +1041,24 @@ var Dialog = () => {
1038
1041
  };
1039
1042
 
1040
1043
  // src/components/SimpleLayout/Drawer.tsx
1041
- import React10, { useMemo as useMemo8 } from "react";
1044
+ import React10, { useMemo as useMemo9 } from "react";
1042
1045
  import { Surface as Surface4 } from "@dxos/app-framework/ui";
1046
+ import { getCompanionVariant as getCompanionVariant2 } from "@dxos/app-toolkit";
1043
1047
  import { useAppGraph as useAppGraph9 } from "@dxos/app-toolkit/ui";
1044
1048
  import { useNode as useNode3 } from "@dxos/plugin-graph";
1045
1049
  import { ErrorFallback as ErrorFallback3, Panel as Panel3 } from "@dxos/react-ui";
1046
- import { ATTENDABLE_PATH_SEPARATOR as ATTENDABLE_PATH_SEPARATOR2 } from "@dxos/react-ui-attention";
1047
1050
  import { Menu as Menu3, useMenuActions as useMenuActions3 } from "@dxos/react-ui-menu";
1048
1051
  var DRAWER_NAME = "SimpleLayout.Drawer";
1049
1052
  var Drawer = () => {
1050
1053
  const { graph } = useAppGraph9();
1051
1054
  const { state: layoutState } = useSimpleLayoutState();
1052
- const placeholder = useMemo8(() => /* @__PURE__ */ React10.createElement(ContentLoading, null), []);
1055
+ const placeholder = useMemo9(() => /* @__PURE__ */ React10.createElement(ContentLoading, null), []);
1053
1056
  const activeId = layoutState.active ?? layoutState.workspace;
1054
1057
  const companions = useCompanions(activeId);
1055
1058
  const { companionId, variant } = useSelectedCompanion(companions, layoutState.companionVariant);
1056
1059
  const node = useNode3(graph, companionId);
1057
1060
  const parentNode = useNode3(graph, activeId);
1058
- const data = useMemo8(() => {
1061
+ const data = useMemo9(() => {
1059
1062
  return node && {
1060
1063
  attendableId: companionId,
1061
1064
  subject: node.data,
@@ -1088,23 +1091,13 @@ var Drawer = () => {
1088
1091
  })));
1089
1092
  };
1090
1093
  Drawer.displayName = DRAWER_NAME;
1091
- var parseEntryId = (entryId) => {
1092
- const [id, variant] = entryId.split(ATTENDABLE_PATH_SEPARATOR2);
1093
- return {
1094
- id,
1095
- variant
1096
- };
1097
- };
1098
1094
  var useSelectedCompanion = (companions, preferredVariant) => {
1099
- const selectedCompanion = useMemo8(() => {
1095
+ const selectedCompanion = useMemo9(() => {
1100
1096
  if (companions.length === 0) {
1101
1097
  return void 0;
1102
1098
  }
1103
1099
  if (preferredVariant) {
1104
- const preferred = companions.find((c) => {
1105
- const { variant: variant2 } = parseEntryId(c.id);
1106
- return variant2 === preferredVariant;
1107
- });
1100
+ const preferred = companions.find((c) => getCompanionVariant2(c.id) === preferredVariant);
1108
1101
  if (preferred) {
1109
1102
  return preferred;
1110
1103
  }
@@ -1115,7 +1108,7 @@ var useSelectedCompanion = (companions, preferredVariant) => {
1115
1108
  preferredVariant
1116
1109
  ]);
1117
1110
  const companionId = selectedCompanion?.id;
1118
- const { variant } = parseEntryId(companionId ?? "");
1111
+ const variant = companionId ? getCompanionVariant2(companionId) : void 0;
1119
1112
  return {
1120
1113
  selectedCompanion,
1121
1114
  companionId,
@@ -1165,6 +1158,6 @@ var SimpleLayout = () => {
1165
1158
  export {
1166
1159
  Home,
1167
1160
  SimpleLayout,
1168
- Workspace
1161
+ NavBranch
1169
1162
  };
1170
- //# sourceMappingURL=chunk-TMZNLVT2.mjs.map
1163
+ //# sourceMappingURL=chunk-MDPEKLKR.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/Home/Home.tsx", "../../../src/components/hooks.ts", "../../../src/components/SimpleLayout/SimpleLayout.tsx", "../../../src/hooks/useAppBarProps.ts", "../../../src/hooks/useCompanions.ts", "../../../src/hooks/actions.ts", "../../../src/hooks/useDrawerActions.ts", "../../../src/components/ContentLoading/ContentLoading.tsx", "../../../src/components/MobileLayout/MobileLayout.tsx", "../../../src/components/Popover/Popover.tsx", "../../../src/components/SimpleLayout/AppBar.tsx", "../../../src/components/SimpleLayout/Main.tsx", "../../../src/components/SimpleLayout/NavBar.tsx", "../../../src/components/NavBranch/NavBranch.tsx", "../../../src/hooks/useSimpleLayoutState.ts", "../../../src/hooks/useNavbarActions.ts", "../../../src/components/Dialog/Dialog.tsx", "../../../src/components/SimpleLayout/Drawer.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useMemo, useRef } from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { Node, useConnections } from '@dxos/plugin-graph';\nimport { Avatar, Icon, Panel, ScrollArea, Toolbar, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { Card } from '@dxos/react-ui';\nimport { Mosaic, type MosaicStackTileComponent } from '@dxos/react-ui-mosaic';\nimport { SearchList, useSearchListItem, useSearchListResults } from '@dxos/react-ui-searchlist';\nimport { mx } from '@dxos/ui-theme';\nimport { byPosition } from '@dxos/util';\n\nimport { meta } from '../../meta';\nimport { useExpandPath } 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 useExpandPath(Node.RootId);\n\n const items = useMemo(\n () => [...(userAccountItem ? [userAccountItem] : []), ...pinnedItems, ...workspaceItems],\n [userAccountItem, pinnedItems, workspaceItems],\n );\n\n const { results, handleSearch } = useSearchListResults({\n items,\n extract: (node) => toLocalizedString(node.properties.label, t),\n });\n\n return (\n <SearchList.Root onSearch={handleSearch}>\n <Panel.Root>\n <Panel.Toolbar asChild>\n <Toolbar.Root>\n <SearchList.Input placeholder={t('search placeholder')} autoFocus />\n </Toolbar.Root>\n </Panel.Toolbar>\n <Panel.Content asChild>\n <SearchList.Content>\n <Mosaic.Container asChild>\n <ScrollArea.Root orientation='vertical'>\n <ScrollArea.Viewport classNames='p-2'>\n <Mosaic.Stack items={results} getId={(node) => node.id} Tile={WorkspaceTile} />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n </Mosaic.Container>\n </SearchList.Content>\n </Panel.Content>\n </Panel.Root>\n </SearchList.Root>\n );\n};\n\nconst WorkspaceTile: MosaicStackTileComponent<Node.Node> = (props) => {\n const data = props.data;\n const { t } = useTranslation(meta.id);\n const { invokePromise } = useOperationInvoker();\n const { selectedValue, registerItem, unregisterItem } = useSearchListItem();\n const name = toLocalizedString(data.properties.label, t);\n const isSelected = selectedValue === data.id;\n const cardRef = useRef<HTMLDivElement>(null);\n\n useExpandPath(data.id);\n\n const handleSelect = useCallback(\n () => invokePromise(LayoutOperation.SwitchWorkspace, { subject: data.id }),\n [invokePromise, data.id],\n );\n\n // Register this workspace with the search context.\n useEffect(() => {\n if (cardRef.current) {\n registerItem(data.id, cardRef.current, handleSelect);\n }\n\n return () => unregisterItem(data.id);\n }, [data.id, handleSelect, registerItem, unregisterItem]);\n\n // Scroll into view when selected.\n useEffect(() => {\n if (isSelected && cardRef.current) {\n cardRef.current.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }, [isSelected]);\n\n return (\n <Card.Root\n role='button'\n fullWidth\n tabIndex={-1} // TODO(burdon): Use Mosaic.Focus.\n data-selected={isSelected}\n classNames={mx('dx-focus-ring', isSelected && 'bg-hover-overlay')}\n onClick={handleSelect}\n ref={cardRef}\n >\n <Card.Toolbar density='coarse'>\n <Avatar.Root>\n <Avatar.Content\n icon={data.properties.icon}\n hue={data.properties.hue}\n hueVariant='transparent'\n variant='square'\n size={12}\n fallback={name}\n />\n <Avatar.Label>{name}</Avatar.Label>\n <Icon icon='ph--caret-right--regular' />\n </Avatar.Root>\n </Card.Toolbar>\n </Card.Root>\n );\n};\n\n/** Filters nodes by disposition. */\nconst filterItems = (node: Node.Node, disposition: string) => {\n return node.properties.disposition === disposition;\n};\n\n/** Returns root-level items filtered by disposition. */\nconst useItemsByDisposition = (disposition: string, sort = false) => {\n const { graph } = useAppGraph();\n const connections = useConnections(graph, Node.RootId, 'child');\n const filtered = connections.filter((node) => filterItems(node, disposition));\n return sort ? filtered.toSorted((a, b) => byPosition(a.properties, b.properties)) : filtered;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect } from 'react';\n\nimport { expandAttendableId } from '@dxos/react-ui-attention';\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { Graph } from '@dxos/plugin-graph';\n\n/**\n * Expand graph nodes along the full path from root to the given node ID.\n * Walks each progressive prefix, ensuring ancestor nodes are materialized\n * before attempting to access their children.\n */\nexport const useExpandPath = (nodeId?: string) => {\n const { graph } = useAppGraph();\n\n useEffect(() => {\n if (nodeId) {\n for (const prefix of expandAttendableId(nodeId)) {\n Graph.expand(graph, prefix, 'child');\n }\n }\n }, [nodeId, graph]);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { Splitter, type SplitterMode } from '@dxos/react-ui';\nimport { Mosaic } from '@dxos/react-ui-mosaic';\n\nimport { useSimpleLayoutState } from '../../hooks';\nimport { Dialog } from '../Dialog';\nimport { MobileLayout } from '../MobileLayout';\nimport { PopoverContent, PopoverRoot } from '../Popover';\n\nimport { Drawer } from './Drawer';\nimport { Main } from './Main';\n\n// TODO(burdon): Mobile/Desktop variance?\nexport const SimpleLayout = () => {\n const { state } = useSimpleLayoutState();\n const [keyboardOpen, setKeyboardOpen] = useState(false);\n const [splitterMode, setSplitterMode] = useState<SplitterMode>('upper');\n\n const drawerRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (keyboardOpen) {\n // Determine which panel has focus and expand that one.\n const activeElement = document.activeElement;\n const drawerHasFocus = drawerRef.current?.contains(activeElement);\n setSplitterMode(drawerHasFocus ? 'lower' : 'upper');\n } else {\n setSplitterMode(state.drawerState === 'closed' ? 'upper' : state.drawerState === 'open' ? 'both' : 'lower');\n }\n }, [state.drawerState, keyboardOpen]);\n\n return (\n <Mosaic.Root classNames='contents'>\n <MobileLayout.Root\n classNames='bg-toolbar-surface'\n onKeyboardOpenChange={(keyboardOpen: boolean) => setKeyboardOpen(keyboardOpen)}\n >\n <MobileLayout.Panel safe={{ top: true, bottom: splitterMode === 'upper' }}>\n <PopoverRoot>\n <Splitter.Root mode={splitterMode} ratio={0.55}>\n <Splitter.Panel position='upper'>\n <Main />\n </Splitter.Panel>\n <Splitter.Panel position='lower' ref={drawerRef}>\n <Drawer />\n </Splitter.Panel>\n </Splitter.Root>\n <Dialog />\n <PopoverContent />\n </PopoverRoot>\n </MobileLayout.Panel>\n </MobileLayout.Root>\n </Mosaic.Root>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom, useAtomValue } from '@effect-atom/atom-react';\nimport * as Effect from 'effect/Effect';\nimport * as Option from 'effect/Option';\nimport { useCallback, useMemo } from 'react';\n\nimport { useCapability, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { Graph, Node, useActionRunner, useNode } from '@dxos/plugin-graph';\nimport { toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { type ActionGraphProps } from '@dxos/react-ui-menu';\n\nimport { type AppBarProps } from '../components';\nimport { meta } from '../meta';\nimport { SimpleLayoutState as SimpleLayoutStateCapability } from '../types';\n\n/**\n * Hook that computes all AppBar props from the app graph.\n * Derives activeId from state atom. Returns props ready to spread into the AppBar component.\n */\nexport const useAppBarProps = (): Omit<AppBarProps, 'classNames'> => {\n const { t } = useTranslation(meta.id);\n const stateAtom = useCapability(SimpleLayoutStateCapability);\n const state = useAtomValue(stateAtom);\n const { graph } = useAppGraph();\n const { invokeSync } = useOperationInvoker();\n const runAction = useActionRunner();\n\n // Derive activeId from state.\n const activeId = state.active ?? state.workspace;\n const node = useNode(graph, activeId);\n\n // Compute title from node label.\n const title = node ? toLocalizedString(node.properties.label, t) : undefined;\n\n // Build actions atom filtering by disposition.\n // Derive activeId from state atom so we don't need to recreate this atom when it changes.\n const actionsAtom = useMemo(\n () =>\n Atom.make((get): ActionGraphProps => {\n const state = get(stateAtom);\n const activeId = state.active ?? state.workspace;\n const allActions = activeId ? get(graph.actions(activeId)) : [];\n const filtered = allActions.filter((action) =>\n ['list-item', 'list-item-primary', 'heading-list-item'].includes(action.properties.disposition),\n );\n const nodes: ActionGraphProps['nodes'] = filtered as ActionGraphProps['nodes'];\n const edges: ActionGraphProps['edges'] = filtered.map((action) => ({\n source: 'root',\n target: action.id,\n relation: 'child',\n }));\n\n // Add alternate-tree action (e.g. Settings) from the workspace node.\n const workspaceConnections = state.workspace ? get(graph.connections(state.workspace, 'child')) : [];\n const alternateTreeNode = workspaceConnections.find(\n (node: Node.Node) => node.properties.disposition === 'alternate-tree',\n );\n if (alternateTreeNode && activeId !== alternateTreeNode.id) {\n const settingsAction = {\n id: `appbar-settings-${alternateTreeNode.id}`,\n type: Node.ActionType,\n data: () => Effect.sync(() => invokeSync(LayoutOperation.Open, { subject: [alternateTreeNode.id] })),\n properties: {\n label: alternateTreeNode.properties.label ?? alternateTreeNode.id,\n icon: alternateTreeNode.properties.icon ?? 'ph--placeholder--regular',\n },\n };\n nodes.push(settingsAction);\n edges.push({ source: 'root', target: settingsAction.id, relation: 'child' });\n }\n\n return { nodes, edges };\n }),\n [graph, stateAtom],\n );\n\n // Back button logic.\n const showBackButton = activeId !== undefined && activeId !== Node.RootId;\n\n const onBack = useCallback(() => {\n if (state.active) {\n const isWorkspace = Graph.getNode(graph, state.active).pipe(\n Option.map((node) => node.properties.disposition === 'workspace'),\n Option.getOrElse(() => false),\n );\n\n // If history is empty and this is a workspace, go to home.\n if (state.history.length === 0 && isWorkspace) {\n invokeSync(LayoutOperation.SwitchWorkspace, { subject: Node.RootId });\n } else {\n // Otherwise, close (which will pop from history or clear active).\n invokeSync(LayoutOperation.Close, { subject: [state.active] });\n }\n } else {\n invokeSync(LayoutOperation.SwitchWorkspace, { subject: Node.RootId });\n }\n }, [graph, invokeSync, state.active, state.history.length]);\n\n // Compute popover anchor ID.\n const popoverAnchorId = node && state.popoverAnchorId === `${meta.id}:${node.id}` ? state.popoverAnchorId : undefined;\n\n return {\n title,\n actions: actionsAtom,\n showBackButton,\n popoverAnchorId,\n onBack: onBack,\n onAction: runAction,\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useMemo } from 'react';\n\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { useConnections } from '@dxos/plugin-graph';\nimport { byPosition } from '@dxos/util';\n\nimport { PLANK_COMPANION_TYPE } from './actions';\n\n/**\n * @deprecated Adopt the pattern from useNavbarActions (deriving from graph atoms)\n * or merge the Drawer companion display into the NavBar component.\n */\nexport const useCompanions = (nodeId?: string) => {\n const { graph } = useAppGraph();\n const nodes = useConnections(graph, nodeId, 'child');\n const companions = nodes.filter((node) => node.type === PLANK_COMPANION_TYPE);\n return useMemo(() => companions.toSorted((a, b) => byPosition(a.properties, b.properties)), [companions]);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Atom } from '@effect-atom/atom-react';\nimport * as Effect from 'effect/Effect';\n\nimport { type AppCapabilities, getCompanionVariant } from '@dxos/app-toolkit';\nimport { Node } from '@dxos/plugin-graph';\nimport { type ActionGraphProps } from '@dxos/react-ui-menu';\nimport { byPosition } from '@dxos/util';\n\nimport { type SimpleLayoutState } from '../types';\n\n// TODO(wittjosiah): Factor out to shared location with plugin-deck.\nexport const PLANK_COMPANION_TYPE = 'org.dxos.plugin.deck.plank-companion';\n\nexport type CompanionActionsConfig = {\n /** Prefix for companion action IDs (e.g. 'navbar' or 'drawer') */\n idPrefix: string;\n /** Optional: highlight companion with this variant */\n selectedVariant?: string;\n /** State updater for toggling the drawer. */\n updateState: (fn: (state: SimpleLayoutState) => SimpleLayoutState) => void;\n};\n\n/**\n * Creates action graph nodes and edges for companion actions.\n * Shared logic between useNavbarActions and useDrawerActions.\n */\n// TODO(burdon): Use builder pattern.\nexport const createCompanionActions = (\n graph: AppCapabilities.AppGraph['graph'],\n stateAtom: Atom.Atom<SimpleLayoutState>,\n get: (atom: Atom.Atom<any>) => any,\n config: CompanionActionsConfig,\n): Pick<ActionGraphProps, 'nodes' | 'edges'> => {\n const { idPrefix, selectedVariant, updateState } = config;\n\n // Derive activeId from state atom.\n const state = get(stateAtom);\n const activeId = state.active ?? state.workspace;\n\n // Get companions from graph connections for activeId.\n const activeConnections = activeId ? get(graph.connections(activeId, 'child')) : [];\n const companions = activeConnections\n .filter((node: Node.Node) => node.type === PLANK_COMPANION_TYPE)\n .toSorted((a: Node.Node, b: Node.Node) => byPosition(a.properties, b.properties));\n\n const nodes: ActionGraphProps['nodes'] = [];\n const edges: ActionGraphProps['edges'] = [];\n\n companions.forEach((companion: Node.Node) => {\n const companionVariant = getCompanionVariant(companion.id);\n const companionAction = {\n id: `${idPrefix}-companion-${companion.id}`,\n type: Node.ActionType,\n properties: {\n icon: companion.properties.icon ?? 'ph--placeholder--regular',\n label: companion.properties.label,\n iconOnly: true,\n ...(selectedVariant !== undefined && {\n variant: selectedVariant === companionVariant ? 'primary' : 'ghost',\n }),\n },\n data: () =>\n Effect.sync(() =>\n updateState((current) => {\n const closing = current.companionVariant === companionVariant && current.drawerState !== 'closed';\n return {\n ...current,\n companionVariant: closing ? undefined : companionVariant,\n drawerState: closing ? 'closed' : 'open',\n };\n }),\n ),\n };\n nodes.push(companionAction);\n edges.push({ source: 'root', target: companionAction.id, relation: 'child' });\n });\n\n return { nodes, edges };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom } from '@effect-atom/atom-react';\nimport * as Effect from 'effect/Effect';\nimport { useMemo } from 'react';\n\nimport { useCapability } from '@dxos/app-framework/ui';\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { Node, useActionRunner } from '@dxos/plugin-graph';\nimport { useTranslation } from '@dxos/react-ui';\nimport { type ActionExecutor, type ActionGraphProps, createGapSeparator } from '@dxos/react-ui-menu';\n\nimport { useMobileLayout } from '../components';\nimport { meta } from '../meta';\nimport { SimpleLayoutState as SimpleLayoutStateCapability } from '../types';\n\nimport { createCompanionActions } from './actions';\nimport { useSimpleLayoutState } from './useSimpleLayoutState';\n\nexport type DrawerActions = {\n /** Action graph atom for the drawer. */\n actions: Atom.Atom<ActionGraphProps>;\n /** Action executor callback. */\n onAction: ActionExecutor;\n};\n\n/**\n * Builds the drawer actions including companion tabs and toolbar buttons.\n */\nexport const useDrawerActions = (consumerName: string): DrawerActions => {\n const { t } = useTranslation(meta.id);\n const stateAtom = useCapability(SimpleLayoutStateCapability);\n const { graph } = useAppGraph();\n const runAction = useActionRunner();\n const { updateState } = useSimpleLayoutState();\n const { keyboardOpen } = useMobileLayout(consumerName);\n\n // Create a computed atom that derives everything from graph connections and state.\n const actionsAtom = useMemo(\n () =>\n Atom.make((get): ActionGraphProps => {\n // Derive drawer state from state atom.\n const state = get(stateAtom);\n\n // Add companion tab actions.\n const { nodes, edges } = createCompanionActions(graph, stateAtom, get, {\n idPrefix: 'drawer',\n selectedVariant: state.companionVariant,\n updateState,\n });\n\n // Add gap separator before toolbar buttons.\n const gapSeparator = createGapSeparator('drawer-gap');\n nodes.push(...gapSeparator.nodes);\n edges.push(...gapSeparator.edges);\n\n // Add expand/collapse toggle button (hidden when keyboard is open).\n if (!keyboardOpen) {\n const isExpanded = state.drawerState === 'expanded';\n const toggleExpandAction = {\n id: 'drawer-toggle-expand',\n type: Node.ActionType,\n properties: {\n icon: isExpanded ? 'ph--arrow-down--regular' : 'ph--arrow-up--regular',\n label: isExpanded ? t('collapse drawer label') : t('expand drawer label'),\n iconOnly: true,\n },\n data: () =>\n Effect.sync(() => updateState((state) => ({ ...state, drawerState: isExpanded ? 'open' : 'expanded' }))),\n };\n nodes.push(toggleExpandAction);\n edges.push({ source: 'root', target: toggleExpandAction.id, relation: 'child' });\n }\n\n // Add close button.\n const closeAction = {\n id: 'drawer-close',\n type: Node.ActionType,\n properties: {\n icon: 'ph--x--regular',\n label: t('close drawer label'),\n iconOnly: true,\n },\n data: () =>\n Effect.sync(() =>\n updateState((state) => ({ ...state, drawerState: 'closed', companionVariant: undefined })),\n ),\n };\n nodes.push(closeAction);\n edges.push({ source: 'root', target: closeAction.id, relation: 'child' });\n\n return { nodes, edges };\n }),\n [graph, stateAtom, updateState, keyboardOpen, t],\n );\n\n return { actions: actionsAtom, onAction: runAction };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\n// TODO(burdon): Show skeleton: https://github.com/dxos/dxos/issues/8259\nexport const ContentLoading = () => {\n return <div role='none' className='grid place-items-center dx-attention-surface' />;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren, forwardRef, useEffect, useState } from 'react';\n\nimport { addEventListener, combine } from '@dxos/async';\nimport { log } from '@dxos/log';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\n\n// TODO(burdon): Move into @dxos/react-ui?\n\nconst MOBILE_LAYOUT_NAME = 'MobileLayout';\nconst MOBILE_LAYOUT_ROOT_NAME = 'MobileLayout.Root';\nconst MOBILE_LAYOUT_PANEL_NAME = 'MobileLayout.Panel';\n\n//\n// Context\n//\n\ntype MobileLayoutContextValue = {\n keyboardOpen: boolean;\n};\n\nconst [MobileLayoutProvider, useMobileLayout] = createContext<MobileLayoutContextValue>(MOBILE_LAYOUT_NAME);\n\n//\n// Root\n//\n\ntype MobileLayoutRootProps = ThemedClassName<\n PropsWithChildren<{\n transition?: number;\n onKeyboardOpenChange?: (nextState: boolean) => void;\n }>\n>;\n\n/**\n * Mobile layout root container that handles iOS keyboard detection.\n */\n// TODO(burdon): Should this be ios-only?\nconst MobileLayoutRoot = forwardRef<HTMLDivElement, MobileLayoutRootProps>(\n ({ classNames, children, transition = 250, onKeyboardOpenChange, ...props }, forwardedRef) => {\n const { open: keyboardOpen } = useIOSKeyboard();\n useAutoScroll();\n useEffect(() => onKeyboardOpenChange?.(keyboardOpen), [onKeyboardOpenChange, keyboardOpen]);\n useLockBodyScroll(keyboardOpen);\n\n return (\n <MobileLayoutProvider keyboardOpen={keyboardOpen}>\n <div\n {...props}\n role='none'\n style={{\n transition: `h-size ${transition}ms ease-out`,\n blockSize: 'calc(100vh - var(--kb-height, 0px))',\n }}\n className={mx('absolute top-0 left-0 right-0 flex flex-col', classNames)}\n ref={forwardedRef}\n >\n {children}\n </div>\n </MobileLayoutProvider>\n );\n },\n);\n\nMobileLayoutRoot.displayName = MOBILE_LAYOUT_ROOT_NAME;\n\n//\n// Panel\n//\n\ntype MobileLayoutPanelProps = ThemedClassName<\n PropsWithChildren<{\n safe?: {\n top: boolean;\n bottom: boolean;\n };\n }>\n>;\n\n/**\n * Mobile layout panel that applies safe area insets.\n */\nconst MobileLayoutPanel = forwardRef<HTMLDivElement, MobileLayoutPanelProps>(\n ({ classNames, children, safe, ...props }, forwardedRef) => {\n return (\n <div\n {...props}\n role='none'\n style={{\n paddingTop: safe?.top ? 'env(safe-area-inset-top)' : undefined,\n paddingBottom: safe?.bottom ? `calc((1 - var(--kb-open, 0)) * env(safe-area-inset-bottom))` : undefined,\n }}\n className={mx('relative h-full flex flex-col overflow-hidden', classNames)}\n ref={forwardedRef}\n >\n {children}\n </div>\n );\n },\n);\n\nMobileLayoutPanel.displayName = MOBILE_LAYOUT_PANEL_NAME;\n\n//\n// Exports\n//\n\nexport const MobileLayout = {\n Root: MobileLayoutRoot,\n Panel: MobileLayoutPanel,\n};\n\nexport { useMobileLayout };\n\nexport type { MobileLayoutRootProps, MobileLayoutPanelProps };\n\n/**\n * Prevent auto-scroll when input is focused.\n */\nconst useAutoScroll = () => {\n useEffect(() => {\n // Prevent auto-scroll when input is focused.\n return addEventListener(\n document,\n 'focus',\n (event: FocusEvent) => {\n const target = event.target as HTMLElement;\n if (\n target.tagName === 'INPUT' ||\n target.tagName === 'TEXTAREA' ||\n (target.tagName === 'DIV' && target.isContentEditable)\n ) {\n // Prevent default focus behavior.\n event.preventDefault();\n\n // Manually focus without scroll.\n target.focus({ preventScroll: true });\n\n // Lock current scroll position.\n const scrollX = window.scrollX;\n const scrollY = window.scrollY;\n requestAnimationFrame(() => {\n window.scrollTo(scrollX, scrollY);\n });\n\n // TODO(burdon): Scroll to position in parent; this may need to be via an intent,\n // since it may be plugin-specific (e.g., codemirror document.)\n }\n },\n // Important: focus events don't bubble, so capture phase is required.\n { capture: true },\n );\n }, []);\n};\n\n/**\n * Prevent iOS Safari viewport scroll when enabled.\n * Setting overflow:hidden doesn't work on iOS, so we must preventDefault on touchmove events.\n * Only allows scrolling if the target is within a scrollable container.\n */\nconst useLockBodyScroll = (enabled: boolean) => {\n useEffect(() => {\n if (!enabled) {\n return;\n }\n\n const isScrollable = (el: HTMLElement | null, axis: 'x' | 'y'): boolean => {\n while (el && el !== document.body) {\n const style = getComputedStyle(el);\n if (axis === 'y') {\n const overflow = style.overflowY;\n if ((overflow === 'auto' || overflow === 'scroll') && el.scrollHeight > el.clientHeight) {\n return true;\n }\n } else {\n const overflow = style.overflowX;\n if ((overflow === 'auto' || overflow === 'scroll') && el.scrollWidth > el.clientWidth) {\n return true;\n }\n }\n\n el = el.parentElement;\n }\n\n return false;\n };\n\n let touchStartX = 0;\n let touchStartY = 0;\n\n return combine(\n // Record initial touch position.\n addEventListener(\n document,\n 'touchstart',\n (event: TouchEvent) => {\n const touch = event.touches[0];\n touchStartX = touch.clientX;\n touchStartY = touch.clientY;\n },\n { passive: true },\n ),\n\n // Prevent scrolling the viewport.\n addEventListener(\n document,\n 'touchmove',\n (event: TouchEvent) => {\n const touch = event.touches[0];\n const dx = Math.abs(touch.clientX - touchStartX);\n const dy = Math.abs(touch.clientY - touchStartY);\n if (!isScrollable(event.target as HTMLElement, dx > dy ? 'x' : 'y')) {\n event.preventDefault();\n }\n },\n { passive: false },\n ),\n );\n }, [enabled]);\n};\n\n//\n// Hooks\n//\n\ntype IOSKeyboard = {\n open: boolean;\n height: number;\n};\n\n/**\n * Mobile container that handles iOS keyboard layout adjustments.\n *\n * Uses two strategies for keyboard detection:\n * 1. Tauri iOS: Native keyboard plugin for reliable height/animation events.\n * 2. Web/PWA: visualViewport API as fallback.\n *\n * iPhone (portrait, points)\n * - Without predictive bar: ~291 pt\n * - With predictive bar: ~335 pt\n * - With accessory view: ~380–420 pt\n *\n * Example:\n * - Viewport: 874 (entire screen)\n * - SafeArea: 96 (62+34)\n * - Main: 778\n * - Keyboard: 318; 413 (incl. Input Accessory View)\n *\n * CSS Variables set on document.documentElement:\n * --vvh: Visual viewport height (use as container height).\n * --kb-height: Keyboard height in pixels.\n * --kb-open: 1 when keyboard is open, 0 when closed.\n *\n * NOTE: By default when an input is selected on iOS the Input Accessory View is shown above the keyboard.\n * This can be disabled by setting the `inputAccessoryView` property to `false`.\n *\n * On iOS (Tauri), listens for 'keyboard' CustomEvents dispatched by the native KeyboardObserver.swift.\n * Falls back to VisualViewport API on other platforms.\n */\nconst useIOSKeyboard = (): IOSKeyboard => {\n const [open, setOpen] = useState(false);\n const [height, setHeight] = useState(0);\n\n // Detect keybaord state.\n useEffect(() => {\n const viewport = window.visualViewport;\n if (!viewport) {\n return;\n }\n\n // Handler for VisualViewport resize (fallback for non-iOS).\n const initialHeight = viewport.height ?? window.innerHeight;\n\n const updateState = (keyboardHeight: number, keyboardOpen: boolean) => {\n setOpen(keyboardOpen);\n setHeight(keyboardHeight);\n\n const vvh = initialHeight - keyboardHeight;\n document.documentElement.style.setProperty('--vvh', `${vvh}px`);\n document.documentElement.style.setProperty('--kb-height', `${keyboardHeight}px`);\n document.documentElement.style.setProperty('--kb-open', keyboardOpen ? '1' : '0');\n log.info('viewport size', { initialHeight, vvh, keyboardHeight, keyboardOpen });\n };\n\n return combine(\n // Handler for native iOS keyboard events (from KeyboardObserver.swift).\n addEventListener(\n window,\n 'keyboard' as any,\n (event: CustomEvent<{ type: 'show' | 'hide'; height: number; duration: number }>) => {\n const { type, height } = event.detail;\n log.info('keyboard event', { type, height });\n updateState(height, type === 'show');\n },\n ),\n );\n }, []);\n\n return { open, height };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { useObjectNavigate } from '@dxos/app-toolkit/ui';\nimport { Popover, type PopoverContentInteractOutsideEvent, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { Card } from '@dxos/react-ui';\n\nimport { useSimpleLayoutState } from '../../hooks';\nimport { meta } from '../../meta';\n\nconst DEBOUNCE_DELAY = 40;\n\ntype LayoutPopoverContextValue = {\n setOpen: (open: boolean) => void;\n};\n\nconst [LayoutPopoverProvider, useLayoutPopoverContext] = createContext<LayoutPopoverContextValue>('LayoutPopover');\n\nexport const PopoverRoot = ({ children }: PropsWithChildren) => {\n const { state } = useSimpleLayoutState();\n const [open, setOpen] = useState(false);\n const virtualRef = useRef<HTMLButtonElement | null>(null);\n const [virtualIter, setVirtualIter] = useState(0);\n const debounceRef = useRef<NodeJS.Timeout | null>(null);\n\n // TODO(thure): This is a workaround for the race condition between displaying a Popover and either rendering\n // the anchor further down the tree or measuring the virtual trigger's client rect.\n useEffect(() => {\n setOpen(false);\n if (state.popoverOpen) {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n if (state.popoverAnchor && virtualRef.current !== state.popoverAnchor) {\n virtualRef.current = state.popoverAnchor ?? null;\n setVirtualIter((iter) => iter + 1);\n }\n debounceRef.current = setTimeout(() => setOpen(true), DEBOUNCE_DELAY);\n }\n }, [state.popoverOpen, state.popoverAnchorId, state.popoverAnchor, state.popoverContent]);\n\n return (\n <LayoutPopoverProvider setOpen={setOpen}>\n <Popover.Root modal={false} open={open}>\n {state.popoverAnchor && <Popover.VirtualTrigger key={virtualIter} virtualRef={virtualRef} />}\n {children}\n </Popover.Root>\n </LayoutPopoverProvider>\n );\n};\n\n// Extracts the subject from popover content if it has one, otherwise returns the content as-is.\nconst getPopoverSubject = (content: unknown): unknown =>\n content && typeof content === 'object' && 'subject' in content ? (content as { subject: unknown }).subject : content;\n\nexport const PopoverContent = () => {\n const { t } = useTranslation(meta.id);\n const { state, updateState } = useSimpleLayoutState();\n const { setOpen } = useLayoutPopoverContext('PopoverContent');\n const handleNavigate = useObjectNavigate(getPopoverSubject(state.popoverContent));\n\n const handleClose = useCallback(() => {\n setOpen(false);\n updateState((s) => ({\n ...s,\n popoverOpen: false,\n popoverAnchor: undefined,\n popoverAnchorId: undefined,\n popoverSide: undefined,\n }));\n }, [setOpen, updateState]);\n\n const handleInteractOutside = useCallback(\n (event: KeyboardEvent | PopoverContentInteractOutsideEvent) => {\n if (\n // TODO(thure): CodeMirror should not focus itself when it updates.\n event.type === 'dismissableLayer.focusOutside' &&\n (event.currentTarget as HTMLElement | undefined)?.classList.contains('cm-content')\n ) {\n event.preventDefault();\n } else {\n handleClose();\n }\n },\n [handleClose],\n );\n\n const collisionBoundaries: HTMLElement[] = useMemo(() => {\n const closest = state.popoverAnchor?.closest('[data-popover-collision-boundary]') as HTMLElement | null | undefined;\n return closest ? [closest] : [];\n }, [state.popoverAnchor]);\n\n return (\n <Popover.Portal>\n <Popover.Content\n side={state.popoverSide}\n sticky='always'\n hideWhenDetached\n collisionBoundary={collisionBoundaries}\n onInteractOutside={handleInteractOutside}\n onEscapeKeyDown={handleInteractOutside}\n >\n <Popover.Viewport>\n {state.popoverKind === 'base' && <Surface.Surface role='popover' data={state.popoverContent} limit={1} />}\n {state.popoverKind === 'card' && (\n <Card.Root border={false} classNames='dx-card-popover'>\n <Card.Toolbar>\n {/* TODO(wittjosiah): Cleaner way to handle no drag handle in toolbar? */}\n <span />\n {state.popoverTitle ? (\n <Card.Title onClick={handleNavigate}>{toLocalizedString(state.popoverTitle, t)}</Card.Title>\n ) : (\n <span />\n )}\n <Card.CloseIconButton onClick={handleClose} />\n </Card.Toolbar>\n <Surface.Surface role='card--content' data={state.popoverContent} limit={1} />\n </Card.Root>\n )}\n </Popover.Viewport>\n <Popover.Arrow />\n </Popover.Content>\n </Popover.Portal>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Atom, useAtomValue } from '@effect-atom/atom-react';\nimport React, { Fragment } from 'react';\n\nimport { IconButton, Popover, type ThemedClassName, Toolbar, useTranslation } from '@dxos/react-ui';\nimport { type ActionExecutor, type ActionGraphProps, Menu, useMenuActions } from '@dxos/react-ui-menu';\nimport { mx, osTranslations } from '@dxos/ui-theme';\n\nimport { meta } from '../../meta';\nimport { useMobileLayout } from '../MobileLayout';\n\nconst APP_BAR_NAME = 'SimpleLayout.AppBar';\n\nexport type AppBarProps = ThemedClassName<{\n /** Title/label to display in the banner. */\n title?: string;\n /** Action graph atom for the dropdown menu. */\n actions: Atom.Atom<ActionGraphProps>;\n /** Whether to show the back button. */\n showBackButton?: boolean;\n /** Popover anchor ID for the dropdown trigger. */\n popoverAnchorId?: string;\n /** Action executor callback. */\n onAction?: ActionExecutor;\n /** Callback when back button is clicked. */\n onBack?: () => void;\n}>;\n\n/**\n * AppBar component that renders a title, optional back button, and actions dropdown.\n */\nexport const AppBar = ({\n classNames,\n title,\n actions,\n showBackButton,\n popoverAnchorId,\n onAction,\n onBack,\n}: AppBarProps) => {\n const { t } = useTranslation(meta.id);\n const menu = useMenuActions(actions);\n const actionsValue = useAtomValue(actions);\n const hasActions = actionsValue.nodes.length > 0;\n const { keyboardOpen } = useMobileLayout(APP_BAR_NAME);\n\n // Fall back to app name if no title provided.\n const displayTitle = title ?? t('current app name', { ns: osTranslations });\n\n // Wrap the menu trigger with Popover.Anchor when the popoverAnchorId is set.\n const AnchorRoot = popoverAnchorId ? Popover.Anchor : Fragment;\n\n return (\n <Toolbar.Root\n role='banner'\n classNames={mx(\n 'grid grid-cols-[var(--dx-rail-size)_1fr_var(--dx-rail-size)] items-center',\n 'dx-density-fine',\n classNames,\n )}\n >\n {keyboardOpen ? (\n <IconButton variant='ghost' icon='ph--x--regular' iconOnly label={t('done label')} />\n ) : showBackButton ? (\n <IconButton variant='ghost' icon='ph--caret-left--regular' iconOnly label={t('back label')} onClick={onBack} />\n ) : (\n <div />\n )}\n <h1 className='text-center truncate font-thin uppercase'>{displayTitle}</h1>\n {hasActions ? (\n <AnchorRoot>\n <Menu.Root {...menu} caller={meta.id} onAction={onAction}>\n <Menu.Trigger asChild>\n <IconButton\n variant='ghost'\n icon='ph--dots-three-vertical--regular'\n iconOnly\n label={t('actions menu label')}\n />\n </Menu.Trigger>\n <Menu.Content />\n </Menu.Root>\n </AnchorRoot>\n ) : (\n <span />\n )}\n </Toolbar.Root>\n );\n};\n\nAppBar.displayName = APP_BAR_NAME;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useMemo } from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { useNode } from '@dxos/plugin-graph';\nimport { ErrorFallback } from '@dxos/react-ui';\nimport { useAttentionAttributes } from '@dxos/react-ui-attention';\nimport { mx } from '@dxos/ui-theme';\n\nimport { useAppBarProps, useNavbarActions, useSimpleLayoutState } from '../../hooks';\nimport { ContentLoading } from '../ContentLoading';\nimport { useExpandPath } from '../hooks';\nimport { useMobileLayout } from '../MobileLayout';\n\nimport { AppBar } from './AppBar';\nimport { NavBar } from './NavBar';\n\nconst MAIN_NAME = 'SimpleLayout.Main';\n\n/**\n * Main content component.\n */\nexport const Main = () => {\n const { state } = useSimpleLayoutState();\n const id = state.active ?? state.workspace;\n const attentionAttrs = useAttentionAttributes(id);\n const { keyboardOpen } = useMobileLayout(MAIN_NAME);\n const { actions, onAction } = useNavbarActions();\n const appBarProps = useAppBarProps();\n\n const placeholder = useMemo(() => <ContentLoading />, []);\n\n const { graph } = useAppGraph();\n const node = useNode(graph, id);\n const data = useMemo(() => {\n return (\n node && {\n attendableId: id,\n subject: node.data,\n properties: node.properties,\n popoverAnchorId: state.popoverAnchorId,\n }\n );\n }, [id, node, node?.data, node?.properties, state.popoverAnchorId]);\n\n useExpandPath(id);\n\n // TODO(burdon): BUG: When showing ANY statusbar the size progressively shrinks when the keyboard opens/closes.\n const showNavBar = !keyboardOpen && !state.isPopover && state.drawerState === 'closed';\n\n return (\n <div\n role='none'\n className={mx(\n 'h-full grid overflow-hidden bg-toolbar-surface',\n showNavBar\n ? 'grid-rows-[var(--dx-rail-action)_1fr_var(--dx-toolbar-size)]'\n : 'grid-rows-[var(--dx-rail-action)_1fr]',\n )}\n {...attentionAttrs}\n >\n <AppBar {...appBarProps} />\n <article className='h-full overflow-hidden bg-base-surface'>\n <Surface.Surface\n key={id}\n role='article'\n data={data}\n limit={1}\n fallback={ErrorFallback}\n placeholder={placeholder}\n />\n </article>\n {showNavBar && <NavBar classNames='border-y border-subdued-separator' actions={actions} onAction={onAction} />}\n </div>\n );\n};\n\nMain.displayName = MAIN_NAME;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Atom } from '@effect-atom/atom-react';\nimport React from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { type ActionExecutor, type ActionGraphProps, Menu, useMenuActions } from '@dxos/react-ui-menu';\nimport { mx } from '@dxos/ui-theme';\n\nconst NAVBAR_NAME = 'SimpleLayout.NavBar';\n\nexport type NavBarProps = ThemedClassName<{\n /** Action graph atom for the toolbar. */\n actions: Atom.Atom<ActionGraphProps>;\n /** Action executor callback. */\n onAction?: ActionExecutor;\n}>;\n\n/**\n * Presentational navbar component that renders a toolbar from an action graph.\n */\nexport const NavBar = ({ classNames, actions, onAction }: NavBarProps) => {\n const menu = useMenuActions(actions);\n\n return (\n <Menu.Root {...menu} alwaysActive onAction={onAction}>\n <Menu.Toolbar density='coarse' classNames={mx(classNames)} />\n </Menu.Root>\n );\n};\n\nNavBar.displayName = NAVBAR_NAME;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useMemo, useRef } from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { type Node, useConnections } from '@dxos/plugin-graph';\nimport { Avatar, Icon, Panel, ScrollArea, Toolbar, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { Card } from '@dxos/react-ui';\nimport { Mosaic, type MosaicStackTileComponent } from '@dxos/react-ui-mosaic';\nimport { SearchList, useSearchListItem, useSearchListResults } from '@dxos/react-ui-searchlist';\nimport { mx } from '@dxos/ui-theme';\n\nimport { meta } from '../../meta';\nimport { useExpandPath } from '../hooks';\n\nexport type NavBranchProps = {\n id: string;\n};\n\n/**\n * Renders the children of a graph branch node as a searchable mosaic list.\n * Used for any node with `role: 'branch'` or a workspace disposition, including\n * spaces, collection sections, type sections, and schema nodes.\n */\nexport const NavBranch = ({ id }: NavBranchProps) => {\n const { t } = useTranslation(meta.id);\n const { graph } = useAppGraph();\n\n useExpandPath(id);\n\n const children = useConnections(graph, id, 'child');\n\n // TODO(wittjosiah): Move alternate-tree nodes to a non-child relation so they don't need filtering.\n const visibleChildren = useMemo(\n () => children.filter((node) => node.properties.disposition !== 'alternate-tree'),\n [children],\n );\n\n const { results, handleSearch } = useSearchListResults({\n items: visibleChildren,\n extract: (child) => toLocalizedString(child.properties.label, t),\n });\n\n return (\n <SearchList.Root onSearch={handleSearch}>\n <Panel.Root>\n <Panel.Toolbar asChild>\n <Toolbar.Root>\n {/* TODO(wittjosiah): Search should be pluggable. Must support searching via ECHO query inside a space. */}\n <SearchList.Input placeholder={t('search placeholder')} autoFocus />\n </Toolbar.Root>\n </Panel.Toolbar>\n <Panel.Content asChild>\n <SearchList.Content>\n <Mosaic.Container asChild>\n <ScrollArea.Root orientation='vertical'>\n <ScrollArea.Viewport classNames='p-2'>\n <Mosaic.Stack items={results} getId={(child) => child.id} Tile={NavBranchTile} />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n </Mosaic.Container>\n </SearchList.Content>\n </Panel.Content>\n </Panel.Root>\n </SearchList.Root>\n );\n};\n\nconst NavBranchTile: MosaicStackTileComponent<Node.Node> = (props) => {\n const data = props.data;\n const { t } = useTranslation(meta.id);\n const { invokeSync } = useOperationInvoker();\n const ref = useRef<HTMLDivElement>(null);\n const { selectedValue, registerItem, unregisterItem } = useSearchListItem();\n const isSelected = selectedValue === data.id;\n\n const name = toLocalizedString(data.properties.label, t);\n\n const handleSelect = useCallback(\n () => invokeSync(LayoutOperation.Open, { subject: [data.id] }),\n [invokeSync, data.id],\n );\n\n // Register this item with the search context.\n useEffect(() => {\n if (ref.current) {\n registerItem(data.id, ref.current, handleSelect);\n }\n\n return () => unregisterItem(data.id);\n }, [data.id, handleSelect, registerItem, unregisterItem]);\n\n // Scroll into view when selected.\n useEffect(() => {\n if (isSelected && ref.current) {\n ref.current.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }, [isSelected]);\n\n return (\n <Card.Root\n ref={ref}\n role='button'\n fullWidth\n tabIndex={-1} // TODO(burdon): Use Mosaic.Focus.\n data-selected={isSelected}\n classNames={mx('dx-focus-ring', isSelected && 'bg-hover-overlay')}\n onClick={handleSelect}\n >\n <Card.Toolbar density='coarse'>\n <Avatar.Root>\n <Avatar.Content\n hue={data.properties.hue}\n icon={data.properties.icon}\n hueVariant='transparent'\n variant='square'\n size={12}\n fallback={name}\n />\n <Avatar.Label>{name}</Avatar.Label>\n <Icon icon='ph--caret-right--regular' />\n </Avatar.Root>\n </Card.Toolbar>\n </Card.Root>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { RegistryContext, useAtomValue } from '@effect-atom/atom-react';\nimport { useCallback, useContext } from 'react';\n\nimport { useCapability } from '@dxos/app-framework/ui';\n\nimport { SimpleLayoutState } from '../types';\n\nexport type UseSimpleLayoutState = {\n state: SimpleLayoutState;\n updateState: (fn: (current: SimpleLayoutState) => SimpleLayoutState) => void;\n};\n\nexport const useSimpleLayoutState = (): UseSimpleLayoutState => {\n const registry = useContext(RegistryContext);\n const stateAtom = useCapability(SimpleLayoutState);\n const state = useAtomValue(stateAtom);\n\n const updateState = useCallback(\n (fn: (current: SimpleLayoutState) => SimpleLayoutState) => {\n registry.set(stateAtom, fn(registry.get(stateAtom)));\n },\n [registry, stateAtom],\n );\n\n return { state, updateState };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom } from '@effect-atom/atom-react';\nimport { useMemo } from 'react';\n\nimport { useCapability } from '@dxos/app-framework/ui';\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { Node, useActionRunner } from '@dxos/plugin-graph';\nimport { useTranslation } from '@dxos/react-ui';\nimport {\n type ActionExecutor,\n type ActionGraphProps,\n createGapSeparator,\n createMenuItemGroup,\n} from '@dxos/react-ui-menu';\n\nimport { meta } from '../meta';\nimport { SimpleLayoutState } from '../types';\n\nimport { createCompanionActions } from './actions';\nimport { useSimpleLayoutState } from './useSimpleLayoutState';\n\nconst MAIN_MENU_GROUP_ID = 'navbar-main-menu';\n\nexport type NavbarActions = {\n /** Action graph atom for the navbar. */\n actions: Atom.Atom<ActionGraphProps>;\n /** Action executor callback. */\n onAction: ActionExecutor;\n};\n\n/**\n * Builds the navbar actions including companion icons, separator, and main menu dropdown.\n * Derives everything from graph connection atoms for proper reactivity.\n */\nexport const useNavbarActions = (): NavbarActions => {\n const { t } = useTranslation(meta.id);\n const { graph } = useAppGraph();\n const runAction = useActionRunner();\n const stateAtom = useCapability(SimpleLayoutState);\n const { updateState } = useSimpleLayoutState();\n\n // Create a computed atom that derives everything from graph connections and state.\n const actionsAtom = useMemo(\n () =>\n Atom.make((get): ActionGraphProps => {\n // Add companion actions.\n const { nodes, edges } = createCompanionActions(graph, stateAtom, get, {\n idPrefix: 'navbar',\n updateState,\n });\n\n // Add gap separator.\n const gapSeparator = createGapSeparator('navbar-gap');\n nodes.push(...gapSeparator.nodes);\n edges.push(...gapSeparator.edges);\n\n // Add main menu dropdown group.\n const mainMenuGroup = createMenuItemGroup(MAIN_MENU_GROUP_ID, {\n variant: 'dropdownMenu',\n icon: 'ph--list--regular',\n iconOnly: true,\n label: t('main menu label'),\n testId: 'simpleLayoutPlugin.addSpace',\n });\n nodes.push(mainMenuGroup);\n edges.push({ source: 'root', target: mainMenuGroup.id, relation: 'child' });\n\n // Get menu actions from root actions (on 'action' edge relation).\n const rootActions = get(graph.actions(Node.RootId));\n const menuActions = rootActions.filter((node) => node.properties.disposition === 'menu');\n\n // Add menu actions as children of the dropdown group.\n menuActions.forEach((menuAction) => {\n nodes.push(menuAction as ActionGraphProps['nodes'][number]);\n edges.push({ source: MAIN_MENU_GROUP_ID, target: menuAction.id, relation: 'child' });\n });\n\n return { nodes, edges };\n }),\n [graph, stateAtom, updateState, t],\n );\n\n return { actions: actionsAtom, onAction: runAction };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { AlertDialog, Dialog as NaturalDialog } from '@dxos/react-ui';\nimport { ErrorFallback } from '@dxos/react-ui';\n\nimport { useSimpleLayoutState } from '../../hooks';\n\nexport const Dialog = () => {\n const { state, updateState } = useSimpleLayoutState();\n\n const DialogRoot = state.dialogType === 'alert' ? AlertDialog.Root : NaturalDialog.Root;\n const DialogOverlay = state.dialogType === 'alert' ? AlertDialog.Overlay : NaturalDialog.Overlay;\n\n return (\n <DialogRoot\n modal={state.dialogBlockAlign !== 'end'}\n open={state.dialogOpen}\n onOpenChange={(nextOpen) => updateState((state) => ({ ...state, dialogOpen: nextOpen }))}\n >\n {state.dialogBlockAlign === 'end' ? (\n <Surface.Surface role='dialog' data={state.dialogContent} limit={1} fallback={ErrorFallback} />\n ) : (\n <DialogOverlay\n blockAlign={state.dialogBlockAlign}\n classNames={state.dialogOverlayClasses}\n style={state.dialogOverlayStyle}\n >\n <Surface.Surface role='dialog' data={state.dialogContent} limit={1} fallback={ErrorFallback} />\n </DialogOverlay>\n )}\n </DialogRoot>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useMemo } from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { getCompanionVariant } from '@dxos/app-toolkit';\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { type Node, useNode } from '@dxos/plugin-graph';\nimport { ErrorFallback, Panel } from '@dxos/react-ui';\nimport { Menu, useMenuActions } from '@dxos/react-ui-menu';\n\nimport { useCompanions, useDrawerActions, useSimpleLayoutState } from '../../hooks';\nimport { ContentLoading } from '../ContentLoading';\n\nconst DRAWER_NAME = 'SimpleLayout.Drawer';\n\n/**\n * Companion drawer component.\n */\nexport const Drawer = () => {\n const { graph } = useAppGraph();\n const { state: layoutState } = useSimpleLayoutState();\n\n const placeholder = useMemo(() => <ContentLoading />, []);\n\n // Get all companions for the current active (primary) item.\n const activeId = layoutState.active ?? layoutState.workspace;\n const companions = useCompanions(activeId);\n const { companionId, variant } = useSelectedCompanion(companions, layoutState.companionVariant);\n\n // Get node for the selected companion.\n const node = useNode(graph, companionId);\n const parentNode = useNode(graph, activeId);\n\n // Build Surface data for the companion content.\n const data = useMemo(() => {\n return (\n node && {\n attendableId: companionId,\n subject: node.data,\n companionTo: parentNode?.data,\n properties: node.properties,\n variant,\n }\n );\n }, [companionId, node, parentNode, variant]);\n\n // Get drawer actions (tabs + toolbar buttons).\n const { actions, onAction } = useDrawerActions(DRAWER_NAME);\n const menu = useMenuActions(actions);\n\n return (\n <Panel.Root>\n <Panel.Toolbar>\n <Menu.Root {...menu} alwaysActive onAction={onAction}>\n <Menu.Toolbar density='coarse' />\n </Menu.Root>\n </Panel.Toolbar>\n <Panel.Content asChild>\n <Surface.Surface role='article' data={data} limit={1} fallback={ErrorFallback} placeholder={placeholder} />\n </Panel.Content>\n </Panel.Root>\n );\n};\n\nDrawer.displayName = DRAWER_NAME;\n\n/**\n * Resolves which companion to show based on variant preference.\n * Falls back to first available if preferred variant not available.\n */\nconst useSelectedCompanion = (companions: Node.Node[], preferredVariant?: string) => {\n const selectedCompanion = useMemo(() => {\n if (companions.length === 0) {\n return undefined;\n }\n\n // Try to find companion matching the preferred variant.\n if (preferredVariant) {\n const preferred = companions.find((c) => getCompanionVariant(c.id) === preferredVariant);\n if (preferred) {\n return preferred;\n }\n }\n\n // Fallback to first companion.\n return companions[0];\n }, [companions, preferredVariant]);\n\n const companionId = selectedCompanion?.id;\n const variant = companionId ? getCompanionVariant(companionId) : undefined;\n\n return { selectedCompanion, companionId, variant };\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useCallback", "useEffect", "useMemo", "useRef", "useOperationInvoker", "LayoutOperation", "useAppGraph", "Node", "useConnections", "Avatar", "Icon", "Panel", "ScrollArea", "Toolbar", "toLocalizedString", "useTranslation", "Card", "Mosaic", "SearchList", "useSearchListItem", "useSearchListResults", "mx", "byPosition", "useEffect", "expandAttendableId", "useAppGraph", "Graph", "useExpandPath", "nodeId", "graph", "useAppGraph", "useEffect", "prefix", "expandAttendableId", "Graph", "expand", "Home", "_", "t", "useTranslation", "meta", "id", "userAccountItem", "useItemsByDisposition", "pinnedItems", "workspaceItems", "useExpandPath", "Node", "RootId", "items", "useMemo", "results", "handleSearch", "useSearchListResults", "extract", "node", "toLocalizedString", "properties", "label", "SearchList", "Root", "onSearch", "Panel", "Toolbar", "asChild", "Input", "placeholder", "autoFocus", "Content", "Mosaic", "Container", "ScrollArea", "orientation", "Viewport", "classNames", "Stack", "getId", "Tile", "WorkspaceTile", "props", "data", "invokePromise", "useOperationInvoker", "selectedValue", "registerItem", "unregisterItem", "useSearchListItem", "name", "isSelected", "cardRef", "useRef", "handleSelect", "useCallback", "LayoutOperation", "SwitchWorkspace", "subject", "useEffect", "current", "scrollIntoView", "block", "behavior", "Card", "role", "fullWidth", "tabIndex", "data-selected", "mx", "onClick", "ref", "density", "Avatar", "icon", "hue", "hueVariant", "variant", "size", "fallback", "Label", "Icon", "filterItems", "disposition", "sort", "graph", "useAppGraph", "connections", "useConnections", "filtered", "filter", "toSorted", "a", "b", "byPosition", "React", "useEffect", "useRef", "useState", "Splitter", "Mosaic", "Atom", "useAtomValue", "Effect", "Option", "useCallback", "useMemo", "useCapability", "useOperationInvoker", "LayoutOperation", "useAppGraph", "Graph", "Node", "useActionRunner", "useNode", "toLocalizedString", "useTranslation", "useAppBarProps", "t", "useTranslation", "meta", "id", "stateAtom", "useCapability", "SimpleLayoutStateCapability", "state", "useAtomValue", "graph", "useAppGraph", "invokeSync", "useOperationInvoker", "runAction", "useActionRunner", "activeId", "active", "workspace", "node", "useNode", "title", "toLocalizedString", "properties", "label", "undefined", "actionsAtom", "useMemo", "Atom", "make", "get", "allActions", "actions", "filtered", "filter", "action", "includes", "disposition", "nodes", "edges", "map", "source", "target", "relation", "workspaceConnections", "connections", "alternateTreeNode", "find", "settingsAction", "type", "Node", "ActionType", "data", "sync", "LayoutOperation", "Open", "subject", "icon", "push", "showBackButton", "RootId", "onBack", "useCallback", "isWorkspace", "Graph", "getNode", "pipe", "getOrElse", "history", "length", "SwitchWorkspace", "Close", "popoverAnchorId", "onAction", "useMemo", "useAppGraph", "useConnections", "byPosition", "Effect", "getCompanionVariant", "Node", "byPosition", "PLANK_COMPANION_TYPE", "createCompanionActions", "graph", "stateAtom", "get", "config", "idPrefix", "selectedVariant", "updateState", "state", "activeId", "active", "workspace", "activeConnections", "connections", "companions", "filter", "node", "type", "toSorted", "a", "b", "byPosition", "properties", "nodes", "edges", "forEach", "companion", "companionVariant", "getCompanionVariant", "id", "companionAction", "Node", "ActionType", "icon", "label", "iconOnly", "undefined", "variant", "data", "sync", "current", "closing", "drawerState", "push", "source", "target", "relation", "useCompanions", "nodeId", "graph", "useAppGraph", "nodes", "useConnections", "companions", "filter", "node", "type", "PLANK_COMPANION_TYPE", "useMemo", "toSorted", "a", "b", "byPosition", "properties", "Atom", "Effect", "useMemo", "useCapability", "useAppGraph", "Node", "useActionRunner", "useTranslation", "createGapSeparator", "React", "ContentLoading", "React", "div", "role", "className", "createContext", "React", "forwardRef", "useEffect", "useState", "addEventListener", "combine", "log", "mx", "MOBILE_LAYOUT_NAME", "MOBILE_LAYOUT_ROOT_NAME", "MOBILE_LAYOUT_PANEL_NAME", "MobileLayoutProvider", "useMobileLayout", "MobileLayoutRoot", "classNames", "children", "transition", "onKeyboardOpenChange", "props", "forwardedRef", "open", "keyboardOpen", "useIOSKeyboard", "useAutoScroll", "useLockBodyScroll", "div", "role", "style", "blockSize", "className", "ref", "displayName", "MobileLayoutPanel", "safe", "paddingTop", "top", "undefined", "paddingBottom", "bottom", "MobileLayout", "Root", "Panel", "useAutoScroll", "useEffect", "addEventListener", "document", "event", "target", "tagName", "isContentEditable", "preventDefault", "focus", "preventScroll", "scrollX", "window", "scrollY", "requestAnimationFrame", "scrollTo", "capture", "useLockBodyScroll", "enabled", "isScrollable", "el", "axis", "body", "style", "getComputedStyle", "overflow", "overflowY", "scrollHeight", "clientHeight", "overflowX", "scrollWidth", "clientWidth", "parentElement", "touchStartX", "touchStartY", "combine", "touch", "touches", "clientX", "clientY", "passive", "dx", "Math", "abs", "dy", "useIOSKeyboard", "open", "setOpen", "useState", "height", "setHeight", "viewport", "visualViewport", "initialHeight", "innerHeight", "updateState", "keyboardHeight", "keyboardOpen", "vvh", "documentElement", "setProperty", "log", "info", "type", "detail", "createContext", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "Surface", "useObjectNavigate", "Popover", "toLocalizedString", "useTranslation", "Card", "DEBOUNCE_DELAY", "LayoutPopoverProvider", "useLayoutPopoverContext", "createContext", "PopoverRoot", "children", "state", "useSimpleLayoutState", "open", "setOpen", "useState", "virtualRef", "useRef", "virtualIter", "setVirtualIter", "debounceRef", "useEffect", "popoverOpen", "current", "clearTimeout", "popoverAnchor", "iter", "setTimeout", "popoverAnchorId", "popoverContent", "React", "Popover", "Root", "modal", "VirtualTrigger", "key", "getPopoverSubject", "content", "subject", "PopoverContent", "t", "useTranslation", "meta", "id", "updateState", "handleNavigate", "useObjectNavigate", "handleClose", "useCallback", "s", "undefined", "popoverSide", "handleInteractOutside", "event", "type", "currentTarget", "classList", "contains", "preventDefault", "collisionBoundaries", "useMemo", "closest", "Portal", "Content", "side", "sticky", "hideWhenDetached", "collisionBoundary", "onInteractOutside", "onEscapeKeyDown", "Viewport", "popoverKind", "Surface", "role", "data", "limit", "Card", "border", "classNames", "Toolbar", "span", "popoverTitle", "Title", "onClick", "toLocalizedString", "CloseIconButton", "Arrow", "useAtomValue", "React", "Fragment", "IconButton", "Popover", "Toolbar", "useTranslation", "Menu", "useMenuActions", "mx", "osTranslations", "APP_BAR_NAME", "AppBar", "classNames", "title", "actions", "showBackButton", "popoverAnchorId", "onAction", "onBack", "t", "useTranslation", "meta", "id", "menu", "useMenuActions", "actionsValue", "useAtomValue", "hasActions", "nodes", "length", "keyboardOpen", "useMobileLayout", "displayTitle", "ns", "osTranslations", "AnchorRoot", "Popover", "Anchor", "Fragment", "React", "Toolbar", "Root", "role", "mx", "IconButton", "variant", "icon", "iconOnly", "label", "onClick", "div", "h1", "className", "Menu", "caller", "Trigger", "asChild", "Content", "span", "displayName", "React", "useMemo", "Surface", "useAppGraph", "useNode", "ErrorFallback", "useAttentionAttributes", "mx", "React", "Menu", "useMenuActions", "mx", "NAVBAR_NAME", "NavBar", "classNames", "actions", "onAction", "menu", "useMenuActions", "React", "Menu", "Root", "alwaysActive", "Toolbar", "density", "mx", "displayName", "MAIN_NAME", "Main", "state", "useSimpleLayoutState", "id", "active", "workspace", "attentionAttrs", "useAttentionAttributes", "keyboardOpen", "useMobileLayout", "actions", "onAction", "useNavbarActions", "appBarProps", "useAppBarProps", "placeholder", "useMemo", "React", "ContentLoading", "graph", "useAppGraph", "node", "useNode", "data", "attendableId", "subject", "properties", "popoverAnchorId", "useExpandPath", "showNavBar", "isPopover", "drawerState", "div", "role", "className", "mx", "AppBar", "article", "Surface", "key", "limit", "fallback", "ErrorFallback", "NavBar", "classNames", "displayName", "React", "useCallback", "useEffect", "useMemo", "useRef", "useOperationInvoker", "LayoutOperation", "useAppGraph", "useConnections", "Avatar", "Icon", "Panel", "ScrollArea", "Toolbar", "toLocalizedString", "useTranslation", "Card", "Mosaic", "SearchList", "useSearchListItem", "useSearchListResults", "mx", "NavBranch", "id", "t", "useTranslation", "meta", "graph", "useAppGraph", "useExpandPath", "children", "useConnections", "visibleChildren", "useMemo", "filter", "node", "properties", "disposition", "results", "handleSearch", "useSearchListResults", "items", "extract", "child", "toLocalizedString", "label", "React", "SearchList", "Root", "onSearch", "Panel", "Toolbar", "asChild", "Input", "placeholder", "autoFocus", "Content", "Mosaic", "Container", "ScrollArea", "orientation", "Viewport", "classNames", "Stack", "getId", "Tile", "NavBranchTile", "props", "data", "invokeSync", "useOperationInvoker", "ref", "useRef", "selectedValue", "registerItem", "unregisterItem", "useSearchListItem", "isSelected", "name", "handleSelect", "useCallback", "LayoutOperation", "Open", "subject", "useEffect", "current", "scrollIntoView", "block", "behavior", "Card", "role", "fullWidth", "tabIndex", "data-selected", "mx", "onClick", "density", "Avatar", "hue", "icon", "hueVariant", "variant", "size", "fallback", "Label", "Icon", "RegistryContext", "useAtomValue", "useCallback", "useContext", "useCapability", "useSimpleLayoutState", "registry", "useContext", "RegistryContext", "stateAtom", "useCapability", "SimpleLayoutState", "state", "useAtomValue", "updateState", "useCallback", "fn", "set", "get", "useDrawerActions", "consumerName", "t", "useTranslation", "meta", "id", "stateAtom", "useCapability", "SimpleLayoutStateCapability", "graph", "useAppGraph", "runAction", "useActionRunner", "updateState", "useSimpleLayoutState", "keyboardOpen", "useMobileLayout", "actionsAtom", "useMemo", "Atom", "make", "get", "state", "nodes", "edges", "createCompanionActions", "idPrefix", "selectedVariant", "companionVariant", "gapSeparator", "createGapSeparator", "push", "isExpanded", "drawerState", "toggleExpandAction", "type", "Node", "ActionType", "properties", "icon", "label", "iconOnly", "data", "sync", "source", "target", "relation", "closeAction", "undefined", "actions", "onAction", "Atom", "useMemo", "useCapability", "useAppGraph", "Node", "useActionRunner", "useTranslation", "createGapSeparator", "createMenuItemGroup", "MAIN_MENU_GROUP_ID", "useNavbarActions", "t", "useTranslation", "meta", "id", "graph", "useAppGraph", "runAction", "useActionRunner", "stateAtom", "useCapability", "SimpleLayoutState", "updateState", "useSimpleLayoutState", "actionsAtom", "useMemo", "Atom", "make", "get", "nodes", "edges", "createCompanionActions", "idPrefix", "gapSeparator", "createGapSeparator", "push", "mainMenuGroup", "createMenuItemGroup", "variant", "icon", "iconOnly", "label", "testId", "source", "target", "relation", "rootActions", "actions", "Node", "RootId", "menuActions", "filter", "node", "properties", "disposition", "forEach", "menuAction", "onAction", "React", "Surface", "AlertDialog", "Dialog", "NaturalDialog", "ErrorFallback", "Dialog", "state", "updateState", "useSimpleLayoutState", "DialogRoot", "dialogType", "AlertDialog", "Root", "NaturalDialog", "DialogOverlay", "Overlay", "React", "modal", "dialogBlockAlign", "open", "dialogOpen", "onOpenChange", "nextOpen", "Surface", "role", "data", "dialogContent", "limit", "fallback", "ErrorFallback", "blockAlign", "classNames", "dialogOverlayClasses", "style", "dialogOverlayStyle", "React", "useMemo", "Surface", "getCompanionVariant", "useAppGraph", "useNode", "ErrorFallback", "Panel", "Menu", "useMenuActions", "DRAWER_NAME", "Drawer", "graph", "useAppGraph", "state", "layoutState", "useSimpleLayoutState", "placeholder", "useMemo", "React", "ContentLoading", "activeId", "active", "workspace", "companions", "useCompanions", "companionId", "variant", "useSelectedCompanion", "companionVariant", "node", "useNode", "parentNode", "data", "attendableId", "subject", "companionTo", "properties", "actions", "onAction", "useDrawerActions", "menu", "useMenuActions", "Panel", "Root", "Toolbar", "Menu", "alwaysActive", "density", "Content", "asChild", "Surface", "role", "limit", "fallback", "ErrorFallback", "displayName", "preferredVariant", "selectedCompanion", "length", "undefined", "preferred", "find", "c", "getCompanionVariant", "id", "SimpleLayout", "state", "useSimpleLayoutState", "keyboardOpen", "setKeyboardOpen", "useState", "splitterMode", "setSplitterMode", "drawerRef", "useRef", "useEffect", "activeElement", "document", "drawerHasFocus", "current", "contains", "drawerState", "React", "Mosaic", "Root", "classNames", "MobileLayout", "onKeyboardOpenChange", "Panel", "safe", "top", "bottom", "PopoverRoot", "Splitter", "mode", "ratio", "position", "Main", "ref", "Drawer", "Dialog", "PopoverContent"]
7
+ }
@@ -1,7 +1,7 @@
1
1
  // src/meta.ts
2
2
  import { trim } from "@dxos/util";
3
3
  var meta = {
4
- id: "dxos.org/plugin/simple-layout",
4
+ id: "org.dxos.plugin.simple-layout",
5
5
  name: "Simple Layout",
6
6
  description: trim`
7
7
  Minimal layout plugin for simplified UI contexts like popover windows.
@@ -12,7 +12,7 @@ var meta = {
12
12
 
13
13
  // src/types/capabilities.ts
14
14
  import { Capability } from "@dxos/app-framework";
15
- var SimpleLayoutState = Capability.make(`${meta.id}/state`);
15
+ var SimpleLayoutState = Capability.make(`${meta.id}.state`);
16
16
 
17
17
  // src/types/events.ts
18
18
  import { AppActivationEvents } from "@dxos/app-toolkit";
@@ -26,4 +26,4 @@ export {
26
26
  SimpleLayoutState,
27
27
  SimpleLayoutEvents
28
28
  };
29
- //# sourceMappingURL=chunk-7VLT3S46.mjs.map
29
+ //# sourceMappingURL=chunk-MRR7PXSM.mjs.map