@dxos/plugin-simple-layout 0.8.4-main.69d29f4 → 0.8.4-main.74a063c4e0

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 (247) hide show
  1. package/dist/lib/browser/index.mjs +44 -58
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +44 -57
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/SimpleLayoutPlugin.d.ts +1 -1
  8. package/dist/types/src/SimpleLayoutPlugin.d.ts.map +1 -1
  9. package/dist/types/src/capabilities/app-graph-builder.d.ts +6 -0
  10. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  11. package/dist/types/src/capabilities/index.d.ts +21 -6
  12. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  13. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  14. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  15. package/dist/types/src/capabilities/{react-root/react-root.d.ts → react-root.d.ts} +1 -1
  16. package/dist/types/src/capabilities/react-root.d.ts.map +1 -0
  17. package/dist/types/src/capabilities/react-surface.d.ts +5 -0
  18. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  19. package/dist/types/src/capabilities/{spotlight-dismiss/spotlight-dismiss.d.ts → spotlight-dismiss.d.ts} +1 -1
  20. package/dist/types/src/capabilities/spotlight-dismiss.d.ts.map +1 -0
  21. package/dist/types/src/capabilities/{state/state.d.ts → state.d.ts} +2 -2
  22. package/dist/types/src/capabilities/state.d.ts.map +1 -0
  23. package/dist/types/src/capabilities/url-handler.d.ts +12 -0
  24. package/dist/types/src/capabilities/url-handler.d.ts.map +1 -0
  25. package/dist/types/src/components/ContentError.stories.d.ts +26 -15
  26. package/dist/types/src/components/ContentError.stories.d.ts.map +1 -1
  27. package/dist/types/src/components/DebugOverlay/DebugOverlay.d.ts +19 -0
  28. package/dist/types/src/components/DebugOverlay/DebugOverlay.d.ts.map +1 -0
  29. package/dist/types/src/components/DebugOverlay/index.d.ts +2 -0
  30. package/dist/types/src/components/DebugOverlay/index.d.ts.map +1 -0
  31. package/dist/types/src/components/Home/Home.d.ts.map +1 -1
  32. package/dist/types/src/components/Loading/Loading.d.ts +3 -0
  33. package/dist/types/src/components/Loading/Loading.d.ts.map +1 -0
  34. package/dist/types/src/components/{ContentLoading.stories.d.ts → Loading/Loading.stories.d.ts} +1 -1
  35. package/dist/types/src/components/Loading/Loading.stories.d.ts.map +1 -0
  36. package/dist/types/src/components/Loading/index.d.ts +2 -0
  37. package/dist/types/src/components/Loading/index.d.ts.map +1 -0
  38. package/dist/types/src/components/MobileLayout/MobileLayout.d.ts +35 -0
  39. package/dist/types/src/components/MobileLayout/MobileLayout.d.ts.map +1 -0
  40. package/dist/types/src/components/MobileLayout/MobileLayout.stories.d.ts +7 -0
  41. package/dist/types/src/components/MobileLayout/MobileLayout.stories.d.ts.map +1 -0
  42. package/dist/types/src/components/MobileLayout/index.d.ts +2 -0
  43. package/dist/types/src/components/MobileLayout/index.d.ts.map +1 -0
  44. package/dist/types/src/components/NavBranch/NavBranch.d.ts +11 -0
  45. package/dist/types/src/components/NavBranch/NavBranch.d.ts.map +1 -0
  46. package/dist/types/src/components/NavBranch/index.d.ts +2 -0
  47. package/dist/types/src/components/NavBranch/index.d.ts.map +1 -0
  48. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  49. package/dist/types/src/components/SimpleLayout/AppBar.d.ts +28 -0
  50. package/dist/types/src/components/SimpleLayout/AppBar.d.ts.map +1 -0
  51. package/dist/types/src/components/SimpleLayout/AppBar.stories.d.ts +54 -0
  52. package/dist/types/src/components/SimpleLayout/AppBar.stories.d.ts.map +1 -0
  53. package/dist/types/src/components/SimpleLayout/Drawer.d.ts +9 -0
  54. package/dist/types/src/components/SimpleLayout/Drawer.d.ts.map +1 -0
  55. package/dist/types/src/components/SimpleLayout/Main.d.ts +1 -1
  56. package/dist/types/src/components/SimpleLayout/Main.d.ts.map +1 -1
  57. package/dist/types/src/components/SimpleLayout/NavBar.d.ts +18 -6
  58. package/dist/types/src/components/SimpleLayout/NavBar.d.ts.map +1 -1
  59. package/dist/types/src/components/SimpleLayout/NavBar.stories.d.ts +35 -21
  60. package/dist/types/src/components/SimpleLayout/NavBar.stories.d.ts.map +1 -1
  61. package/dist/types/src/components/SimpleLayout/SimpleLayout.d.ts.map +1 -1
  62. package/dist/types/src/components/SimpleLayout/SimpleLayout.stories.d.ts +26 -15
  63. package/dist/types/src/components/SimpleLayout/SimpleLayout.stories.d.ts.map +1 -1
  64. package/dist/types/src/components/SimpleLayout/index.d.ts +3 -0
  65. package/dist/types/src/components/SimpleLayout/index.d.ts.map +1 -1
  66. package/dist/types/src/components/hooks.d.ts +4 -2
  67. package/dist/types/src/components/hooks.d.ts.map +1 -1
  68. package/dist/types/src/components/index.d.ts +4 -2
  69. package/dist/types/src/components/index.d.ts.map +1 -1
  70. package/dist/types/src/hooks/actions.d.ts +19 -0
  71. package/dist/types/src/hooks/actions.d.ts.map +1 -0
  72. package/dist/types/src/hooks/index.d.ts +5 -0
  73. package/dist/types/src/hooks/index.d.ts.map +1 -1
  74. package/dist/types/src/hooks/useAppBarProps.d.ts +7 -0
  75. package/dist/types/src/hooks/useAppBarProps.d.ts.map +1 -0
  76. package/dist/types/src/hooks/useCompanions.d.ts +12 -0
  77. package/dist/types/src/hooks/useCompanions.d.ts.map +1 -0
  78. package/dist/types/src/hooks/useDrawerActions.d.ts +13 -0
  79. package/dist/types/src/hooks/useDrawerActions.d.ts.map +1 -0
  80. package/dist/types/src/hooks/useNavbarActions.d.ts +14 -0
  81. package/dist/types/src/hooks/useNavbarActions.d.ts.map +1 -0
  82. package/dist/types/src/hooks/useSimpleLayoutState.d.ts +3 -3
  83. package/dist/types/src/hooks/useSimpleLayoutState.d.ts.map +1 -1
  84. package/dist/types/src/operations/close.d.ts +5 -0
  85. package/dist/types/src/operations/close.d.ts.map +1 -0
  86. package/dist/types/src/operations/index.d.ts +3 -0
  87. package/dist/types/src/operations/index.d.ts.map +1 -0
  88. package/dist/types/src/operations/open.d.ts +5 -0
  89. package/dist/types/src/operations/open.d.ts.map +1 -0
  90. package/dist/types/src/operations/revert-workspace.d.ts +5 -0
  91. package/dist/types/src/operations/revert-workspace.d.ts.map +1 -0
  92. package/dist/types/src/operations/set-layout-mode.d.ts +5 -0
  93. package/dist/types/src/operations/set-layout-mode.d.ts.map +1 -0
  94. package/dist/types/src/operations/set.d.ts +5 -0
  95. package/dist/types/src/operations/set.d.ts.map +1 -0
  96. package/dist/types/src/operations/state-access.d.ts +8 -0
  97. package/dist/types/src/operations/state-access.d.ts.map +1 -0
  98. package/dist/types/src/operations/switch-workspace.d.ts +5 -0
  99. package/dist/types/src/operations/switch-workspace.d.ts.map +1 -0
  100. package/dist/types/src/operations/update-complementary.d.ts +5 -0
  101. package/dist/types/src/operations/update-complementary.d.ts.map +1 -0
  102. package/dist/types/src/operations/update-dialog.d.ts +5 -0
  103. package/dist/types/src/operations/update-dialog.d.ts.map +1 -0
  104. package/dist/types/src/operations/update-popover.d.ts +5 -0
  105. package/dist/types/src/operations/update-popover.d.ts.map +1 -0
  106. package/dist/types/src/operations/update-sidebar.d.ts +5 -0
  107. package/dist/types/src/operations/update-sidebar.d.ts.map +1 -0
  108. package/dist/types/src/translations.d.ts +26 -13
  109. package/dist/types/src/translations.d.ts.map +1 -1
  110. package/dist/types/src/types/capabilities.d.ts +18 -5
  111. package/dist/types/src/types/capabilities.d.ts.map +1 -1
  112. package/dist/types/src/types/events.d.ts.map +1 -1
  113. package/dist/types/tsconfig.tsbuildinfo +1 -1
  114. package/package.json +46 -30
  115. package/src/SimpleLayoutPlugin.ts +24 -13
  116. package/src/capabilities/app-graph-builder.ts +21 -0
  117. package/src/capabilities/index.ts +13 -6
  118. package/src/capabilities/operation-handler.ts +14 -0
  119. package/src/capabilities/{react-root/react-root.tsx → react-root.tsx} +4 -4
  120. package/src/capabilities/react-surface.tsx +50 -0
  121. package/src/capabilities/{spotlight-dismiss/spotlight-dismiss.ts → spotlight-dismiss.ts} +2 -2
  122. package/src/capabilities/{state/state.tsx → state.tsx} +8 -5
  123. package/src/capabilities/url-handler.ts +161 -0
  124. package/src/components/ContentError.stories.tsx +8 -7
  125. package/src/components/DebugOverlay/DebugOverlay.tsx +96 -0
  126. package/src/components/DebugOverlay/index.ts +5 -0
  127. package/src/components/Dialog/Dialog.tsx +6 -6
  128. package/src/components/Home/Home.tsx +51 -43
  129. package/src/components/{ContentLoading.stories.tsx → Loading/Loading.stories.tsx} +5 -5
  130. package/src/components/{ContentLoading.tsx → Loading/Loading.tsx} +2 -2
  131. package/src/components/Loading/index.ts +5 -0
  132. package/src/components/MobileLayout/MobileLayout.stories.tsx +133 -0
  133. package/src/components/MobileLayout/MobileLayout.tsx +374 -0
  134. package/src/components/MobileLayout/index.ts +5 -0
  135. package/src/components/NavBranch/NavBranch.tsx +128 -0
  136. package/src/components/{Workspace → NavBranch}/index.ts +1 -1
  137. package/src/components/Popover/Popover.tsx +10 -9
  138. package/src/components/SimpleLayout/AppBar.stories.tsx +143 -0
  139. package/src/components/SimpleLayout/AppBar.tsx +94 -0
  140. package/src/components/SimpleLayout/Drawer.tsx +98 -0
  141. package/src/components/SimpleLayout/Main.tsx +45 -48
  142. package/src/components/SimpleLayout/NavBar.stories.tsx +131 -27
  143. package/src/components/SimpleLayout/NavBar.tsx +21 -62
  144. package/src/components/SimpleLayout/SimpleLayout.stories.tsx +45 -55
  145. package/src/components/SimpleLayout/SimpleLayout.tsx +45 -7
  146. package/src/components/SimpleLayout/index.ts +3 -0
  147. package/src/components/hooks.ts +10 -14
  148. package/src/components/index.ts +4 -2
  149. package/src/hooks/actions.ts +84 -0
  150. package/src/hooks/index.ts +5 -0
  151. package/src/hooks/useAppBarProps.ts +115 -0
  152. package/src/hooks/useCompanions.ts +22 -0
  153. package/src/hooks/useDrawerActions.ts +100 -0
  154. package/src/hooks/useNavbarActions.ts +87 -0
  155. package/src/hooks/useSimpleLayoutState.ts +5 -5
  156. package/src/meta.ts +1 -1
  157. package/src/operations/close.ts +34 -0
  158. package/src/operations/index.ts +16 -0
  159. package/src/operations/open.ts +63 -0
  160. package/src/operations/revert-workspace.ts +22 -0
  161. package/src/operations/set-layout-mode.ts +12 -0
  162. package/src/operations/set.ts +23 -0
  163. package/src/operations/state-access.ts +19 -0
  164. package/src/operations/switch-workspace.ts +26 -0
  165. package/src/operations/update-complementary.ts +35 -0
  166. package/src/operations/update-dialog.ts +28 -0
  167. package/src/operations/update-popover.ts +35 -0
  168. package/src/operations/update-sidebar.ts +12 -0
  169. package/src/translations.ts +21 -13
  170. package/src/types/capabilities.ts +16 -7
  171. package/src/types/events.ts +3 -2
  172. package/dist/lib/browser/chunk-CLPGTNWJ.mjs +0 -29
  173. package/dist/lib/browser/chunk-CLPGTNWJ.mjs.map +0 -7
  174. package/dist/lib/browser/chunk-FK4M7GJV.mjs +0 -613
  175. package/dist/lib/browser/chunk-FK4M7GJV.mjs.map +0 -7
  176. package/dist/lib/browser/operation-resolver-LTB63NKP.mjs +0 -168
  177. package/dist/lib/browser/operation-resolver-LTB63NKP.mjs.map +0 -7
  178. package/dist/lib/browser/react-root-6ARAPH3O.mjs +0 -21
  179. package/dist/lib/browser/react-root-6ARAPH3O.mjs.map +0 -7
  180. package/dist/lib/browser/react-surface-SO7B23GS.mjs +0 -39
  181. package/dist/lib/browser/react-surface-SO7B23GS.mjs.map +0 -7
  182. package/dist/lib/browser/spotlight-dismiss-VSNOPETH.mjs +0 -66
  183. package/dist/lib/browser/spotlight-dismiss-VSNOPETH.mjs.map +0 -7
  184. package/dist/lib/browser/state-H4IGICBB.mjs +0 -45
  185. package/dist/lib/browser/state-H4IGICBB.mjs.map +0 -7
  186. package/dist/lib/browser/url-handler-7CFGTLNG.mjs +0 -54
  187. package/dist/lib/browser/url-handler-7CFGTLNG.mjs.map +0 -7
  188. package/dist/lib/node-esm/chunk-EGFZAVBD.mjs +0 -614
  189. package/dist/lib/node-esm/chunk-EGFZAVBD.mjs.map +0 -7
  190. package/dist/lib/node-esm/chunk-MUVVYBUE.mjs +0 -31
  191. package/dist/lib/node-esm/chunk-MUVVYBUE.mjs.map +0 -7
  192. package/dist/lib/node-esm/operation-resolver-7O6O7T4Q.mjs +0 -169
  193. package/dist/lib/node-esm/operation-resolver-7O6O7T4Q.mjs.map +0 -7
  194. package/dist/lib/node-esm/react-root-2CPA2ZUS.mjs +0 -22
  195. package/dist/lib/node-esm/react-root-2CPA2ZUS.mjs.map +0 -7
  196. package/dist/lib/node-esm/react-surface-FKAV56MO.mjs +0 -40
  197. package/dist/lib/node-esm/react-surface-FKAV56MO.mjs.map +0 -7
  198. package/dist/lib/node-esm/spotlight-dismiss-L5PCWIJG.mjs +0 -68
  199. package/dist/lib/node-esm/spotlight-dismiss-L5PCWIJG.mjs.map +0 -7
  200. package/dist/lib/node-esm/state-QIU2LMLT.mjs +0 -46
  201. package/dist/lib/node-esm/state-QIU2LMLT.mjs.map +0 -7
  202. package/dist/lib/node-esm/url-handler-4LYP3JM7.mjs +0 -55
  203. package/dist/lib/node-esm/url-handler-4LYP3JM7.mjs.map +0 -7
  204. package/dist/types/src/capabilities/operation-resolver/index.d.ts +0 -3
  205. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +0 -1
  206. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +0 -5
  207. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +0 -1
  208. package/dist/types/src/capabilities/react-root/index.d.ts +0 -6
  209. package/dist/types/src/capabilities/react-root/index.d.ts.map +0 -1
  210. package/dist/types/src/capabilities/react-root/react-root.d.ts.map +0 -1
  211. package/dist/types/src/capabilities/react-surface/index.d.ts +0 -3
  212. package/dist/types/src/capabilities/react-surface/index.d.ts.map +0 -1
  213. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +0 -5
  214. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +0 -1
  215. package/dist/types/src/capabilities/spotlight-dismiss/index.d.ts +0 -3
  216. package/dist/types/src/capabilities/spotlight-dismiss/index.d.ts.map +0 -1
  217. package/dist/types/src/capabilities/spotlight-dismiss/spotlight-dismiss.d.ts.map +0 -1
  218. package/dist/types/src/capabilities/state/index.d.ts +0 -13
  219. package/dist/types/src/capabilities/state/index.d.ts.map +0 -1
  220. package/dist/types/src/capabilities/state/state.d.ts.map +0 -1
  221. package/dist/types/src/capabilities/url-handler/index.d.ts +0 -3
  222. package/dist/types/src/capabilities/url-handler/index.d.ts.map +0 -1
  223. package/dist/types/src/capabilities/url-handler/url-handler.d.ts +0 -10
  224. package/dist/types/src/capabilities/url-handler/url-handler.d.ts.map +0 -1
  225. package/dist/types/src/components/ContentError.d.ts +0 -5
  226. package/dist/types/src/components/ContentError.d.ts.map +0 -1
  227. package/dist/types/src/components/ContentLoading.d.ts +0 -3
  228. package/dist/types/src/components/ContentLoading.d.ts.map +0 -1
  229. package/dist/types/src/components/ContentLoading.stories.d.ts.map +0 -1
  230. package/dist/types/src/components/SimpleLayout/Banner.d.ts +0 -8
  231. package/dist/types/src/components/SimpleLayout/Banner.d.ts.map +0 -1
  232. package/dist/types/src/components/Workspace/Workspace.d.ts +0 -9
  233. package/dist/types/src/components/Workspace/Workspace.d.ts.map +0 -1
  234. package/dist/types/src/components/Workspace/index.d.ts +0 -2
  235. package/dist/types/src/components/Workspace/index.d.ts.map +0 -1
  236. package/src/capabilities/operation-resolver/index.ts +0 -10
  237. package/src/capabilities/operation-resolver/operation-resolver.ts +0 -178
  238. package/src/capabilities/react-root/index.ts +0 -7
  239. package/src/capabilities/react-surface/index.ts +0 -7
  240. package/src/capabilities/react-surface/react-surface.tsx +0 -40
  241. package/src/capabilities/spotlight-dismiss/index.ts +0 -7
  242. package/src/capabilities/state/index.ts +0 -9
  243. package/src/capabilities/url-handler/index.ts +0 -7
  244. package/src/capabilities/url-handler/url-handler.ts +0 -80
  245. package/src/components/ContentError.tsx +0 -23
  246. package/src/components/SimpleLayout/Banner.tsx +0 -82
  247. package/src/components/Workspace/Workspace.tsx +0 -115
@@ -1,55 +0,0 @@
1
- import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
- import {
3
- SimpleLayoutState
4
- } from "./chunk-MUVVYBUE.mjs";
5
-
6
- // src/capabilities/url-handler/url-handler.ts
7
- import * as Effect from "effect/Effect";
8
- import { Capability, Common } from "@dxos/app-framework";
9
- import { Node } from "@dxos/plugin-graph";
10
- var url_handler_default = Capability.makeModule(Effect.fnUntraced(function* () {
11
- const { invokeSync } = yield* Capability.get(Common.Capability.OperationInvoker);
12
- const handleNavigation = () => {
13
- const pathname = window.location.pathname;
14
- const [_, nextWorkspace, nextActive] = pathname.split("/");
15
- const targetWorkspace = !nextWorkspace || nextWorkspace === "root" ? Node.RootId : nextWorkspace;
16
- invokeSync(Common.LayoutOperation.SwitchWorkspace, {
17
- subject: targetWorkspace
18
- });
19
- if (nextActive) {
20
- invokeSync(Common.LayoutOperation.Open, {
21
- subject: [
22
- nextActive
23
- ]
24
- });
25
- }
26
- };
27
- yield* Effect.sync(() => handleNavigation());
28
- window.addEventListener("popstate", handleNavigation);
29
- let lastWorkspace;
30
- let lastActive;
31
- const unsubscribe = yield* Common.Capability.subscribeAtom(SimpleLayoutState, (state) => {
32
- const { workspace, active } = state;
33
- if (workspace !== lastWorkspace || active !== lastActive) {
34
- lastWorkspace = workspace;
35
- lastActive = active;
36
- let path;
37
- if (workspace === Node.RootId) {
38
- path = active ? `/${Node.RootId}/${active}` : "/";
39
- } else {
40
- path = active ? `/${workspace}/${active}` : `/${workspace}`;
41
- }
42
- if (window.location.pathname !== path) {
43
- history.pushState(null, "", `${path}${window.location.search}`);
44
- }
45
- }
46
- });
47
- return Capability.contributes(Common.Capability.Null, null, () => Effect.sync(() => {
48
- window.removeEventListener("popstate", handleNavigation);
49
- unsubscribe();
50
- }));
51
- }));
52
- export {
53
- url_handler_default as default
54
- };
55
- //# sourceMappingURL=url-handler-4LYP3JM7.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/url-handler/url-handler.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability, Common } from '@dxos/app-framework';\nimport { Node } from '@dxos/plugin-graph';\n\nimport { type SimpleLayoutState, SimpleLayoutState as SimpleLayoutStateCapability } from '../../types';\n\n/**\n * URL handler for simple layout that syncs browser URL with layout state.\n * URL format: /{workspace} or /{workspace}/{active}\n * Root is represented as / or /root.\n */\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const { invokeSync } = yield* Capability.get(Common.Capability.OperationInvoker);\n\n /**\n * Handle navigation events (initial load and popstate).\n * Parses URL and updates state accordingly.\n */\n const handleNavigation = () => {\n const pathname = window.location.pathname;\n\n // Parse URL segments: /{workspace}/{active}\n const [_, nextWorkspace, nextActive] = pathname.split('/');\n\n // Determine target workspace (empty or 'root' means Node.RootId).\n const targetWorkspace = !nextWorkspace || nextWorkspace === 'root' ? Node.RootId : nextWorkspace;\n\n // Navigate via operations (they will update state accordingly).\n invokeSync(Common.LayoutOperation.SwitchWorkspace, { subject: targetWorkspace });\n if (nextActive) {\n invokeSync(Common.LayoutOperation.Open, { subject: [nextActive] });\n }\n };\n\n // Handle initial URL and listen for browser navigation.\n yield* Effect.sync(() => handleNavigation());\n window.addEventListener('popstate', handleNavigation);\n\n // Subscribe to state changes to update the URL.\n let lastWorkspace: string | undefined;\n let lastActive: string | undefined;\n const unsubscribe = yield* Common.Capability.subscribeAtom(\n SimpleLayoutStateCapability,\n (state: SimpleLayoutState) => {\n const { workspace, active } = state;\n\n // Only update URL if relevant state changed.\n if (workspace !== lastWorkspace || active !== lastActive) {\n lastWorkspace = workspace;\n lastActive = active;\n\n // Build path: root is represented as /, other workspaces as /{workspace}.\n let path: string;\n if (workspace === Node.RootId) {\n path = active ? `/${Node.RootId}/${active}` : '/';\n } else {\n path = active ? `/${workspace}/${active}` : `/${workspace}`;\n }\n\n if (window.location.pathname !== path) {\n history.pushState(null, '', `${path}${window.location.search}`);\n }\n }\n },\n );\n\n return Capability.contributes(Common.Capability.Null, null, () =>\n Effect.sync(() => {\n window.removeEventListener('popstate', handleNavigation);\n unsubscribe();\n }),\n );\n }),\n);\n"],
5
- "mappings": ";;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,YAAYC,cAAc;AACnC,SAASC,YAAY;AASrB,IAAA,sBAAeC,WAAWC,WACjBC,kBAAW,aAAA;AAChB,QAAM,EAAEC,WAAU,IAAK,OAAOH,WAAWI,IAAIC,OAAOL,WAAWM,gBAAgB;AAM/E,QAAMC,mBAAmB,MAAA;AACvB,UAAMC,WAAWC,OAAOC,SAASF;AAGjC,UAAM,CAACG,GAAGC,eAAeC,UAAAA,IAAcL,SAASM,MAAM,GAAA;AAGtD,UAAMC,kBAAkB,CAACH,iBAAiBA,kBAAkB,SAASI,KAAKC,SAASL;AAGnFT,eAAWE,OAAOa,gBAAgBC,iBAAiB;MAAEC,SAASL;IAAgB,CAAA;AAC9E,QAAIF,YAAY;AACdV,iBAAWE,OAAOa,gBAAgBG,MAAM;QAAED,SAAS;UAACP;;MAAY,CAAA;IAClE;EACF;AAGA,SAAcS,YAAK,MAAMf,iBAAAA,CAAAA;AACzBE,SAAOc,iBAAiB,YAAYhB,gBAAAA;AAGpC,MAAIiB;AACJ,MAAIC;AACJ,QAAMC,cAAc,OAAOrB,OAAOL,WAAW2B,cAC3CC,mBACA,CAACC,UAAAA;AACC,UAAM,EAAEC,WAAWC,OAAM,IAAKF;AAG9B,QAAIC,cAAcN,iBAAiBO,WAAWN,YAAY;AACxDD,sBAAgBM;AAChBL,mBAAaM;AAGb,UAAIC;AACJ,UAAIF,cAAcd,KAAKC,QAAQ;AAC7Be,eAAOD,SAAS,IAAIf,KAAKC,MAAM,IAAIc,MAAAA,KAAW;MAChD,OAAO;AACLC,eAAOD,SAAS,IAAID,SAAAA,IAAaC,MAAAA,KAAW,IAAID,SAAAA;MAClD;AAEA,UAAIrB,OAAOC,SAASF,aAAawB,MAAM;AACrCC,gBAAQC,UAAU,MAAM,IAAI,GAAGF,IAAAA,GAAOvB,OAAOC,SAASyB,MAAM,EAAE;MAChE;IACF;EACF,CAAA;AAGF,SAAOnC,WAAWoC,YAAY/B,OAAOL,WAAWqC,MAAM,MAAM,MACnDf,YAAK,MAAA;AACVb,WAAO6B,oBAAoB,YAAY/B,gBAAAA;AACvCmB,gBAAAA;EACF,CAAA,CAAA;AAEJ,CAAA,CAAA;",
6
- "names": ["Effect", "Capability", "Common", "Node", "Capability", "makeModule", "fnUntraced", "invokeSync", "get", "Common", "OperationInvoker", "handleNavigation", "pathname", "window", "location", "_", "nextWorkspace", "nextActive", "split", "targetWorkspace", "Node", "RootId", "LayoutOperation", "SwitchWorkspace", "subject", "Open", "sync", "addEventListener", "lastWorkspace", "lastActive", "unsubscribe", "subscribeAtom", "SimpleLayoutStateCapability", "state", "workspace", "active", "path", "history", "pushState", "search", "contributes", "Null", "removeEventListener"]
7
- }
@@ -1,3 +0,0 @@
1
- import { type Capability } from '@dxos/app-framework';
2
- export declare const OperationResolver: Capability.LazyCapability;
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/capabilities/operation-resolver/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAA6B,MAAM,qBAAqB,CAAC;AAEjF,eAAO,MAAM,iBAAiB,EAAE,UAAU,CAAC,cAG1C,CAAC"}
@@ -1,5 +0,0 @@
1
- import * as Effect from 'effect/Effect';
2
- import { Capability, Common } from '@dxos/app-framework';
3
- declare const _default: (props?: void | undefined) => Effect.Effect<Capability.Capability<Capability.InterfaceDef<Common.Capability.OperationResolver[]>>, Error, Capability.Service>;
4
- export default _default;
5
- //# sourceMappingURL=operation-resolver.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"operation-resolver.d.ts","sourceRoot":"","sources":["../../../../../src/capabilities/operation-resolver/operation-resolver.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;;AAQzD,wBAmKE"}
@@ -1,6 +0,0 @@
1
- import { Capability } from '@dxos/app-framework';
2
- export declare const ReactRoot: Capability.LazyCapability<void, Capability.Capability<Capability.InterfaceDef<Readonly<{
3
- id: string;
4
- root: import("react").FC<import("react").PropsWithChildren>;
5
- }>>>, Error>;
6
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/capabilities/react-root/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,eAAO,MAAM,SAAS;;;YAA6D,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"react-root.d.ts","sourceRoot":"","sources":["../../../../../src/capabilities/react-root/react-root.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAU,MAAM,qBAAqB,CAAC;;;;;AAKzD,wBASE"}
@@ -1,3 +0,0 @@
1
- import { Capability } from '@dxos/app-framework';
2
- export declare const ReactSurface: Capability.LazyCapability<void, Capability.Capability<Capability.InterfaceDef<import("@dxos/app-framework/Common").Capability.ReactSurface>>, Error>;
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/capabilities/react-surface/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,eAAO,MAAM,YAAY,sJAAmE,CAAC"}
@@ -1,5 +0,0 @@
1
- import * as Effect from 'effect/Effect';
2
- import { Capability, Common } from '@dxos/app-framework';
3
- declare const _default: (props?: void | undefined) => Effect.Effect<Capability.Capability<Capability.InterfaceDef<Common.Capability.ReactSurface>>, never, never>;
4
- export default _default;
5
- //# sourceMappingURL=react-surface.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"react-surface.d.ts","sourceRoot":"","sources":["../../../../../src/capabilities/react-surface/react-surface.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;;AAazD,wBAmBE"}
@@ -1,3 +0,0 @@
1
- import { Capability } from '@dxos/app-framework';
2
- export declare const SpotlightDismiss: Capability.LazyCapability<import("./spotlight-dismiss").SpotlightDismissOptions, [] | Capability.Capability<Capability.InterfaceDef<null>>, Error>;
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/capabilities/spotlight-dismiss/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,eAAO,MAAM,gBAAgB,oJAA2E,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"spotlight-dismiss.d.ts","sourceRoot":"","sources":["../../../../../src/capabilities/spotlight-dismiss/spotlight-dismiss.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,UAAU,EAAU,MAAM,qBAAqB,CAAC;AAoBzD,MAAM,MAAM,uBAAuB,GAAG;IACpC,iDAAiD;IACjD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF;;;;GAIG;;AACH,wBA8CE"}
@@ -1,13 +0,0 @@
1
- import { Capability } from '@dxos/app-framework';
2
- export declare const State: Capability.LazyCapability<import("./state").SimpleLayoutStateOptions, [Capability.Capability<Capability.InterfaceDef<import("@effect-atom/atom/Atom").Writable<import("../../types").SimpleLayoutState, import("../../types").SimpleLayoutState>>>, Capability.Capability<Capability.InterfaceDef<import("@effect-atom/atom/Atom").Atom<Readonly<{
3
- mode: string;
4
- dialogOpen: boolean;
5
- sidebarOpen: boolean;
6
- complementarySidebarOpen: boolean;
7
- workspace: string;
8
- active: string[];
9
- inactive: string[];
10
- scrollIntoView: string | undefined;
11
- }>>>>], Error>;
12
- export type { SimpleLayoutStateOptions } from './state';
13
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/capabilities/state/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,eAAO,MAAM,KAAK;;;;;;;;;cAAoD,CAAC;AAEvE,YAAY,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../../src/capabilities/state/state.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAC/C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,UAAU,EAAU,MAAM,qBAAqB,CAAC;AAGzD,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAWrD,MAAM,MAAM,wBAAwB,GAAG;IACrC,YAAY,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC3C,CAAC;;;;;;;;;;;AAEF,wBAuBE"}
@@ -1,3 +0,0 @@
1
- import { Capability } from '@dxos/app-framework';
2
- export declare const UrlHandler: Capability.LazyCapability<void, Capability.Capability<Capability.InterfaceDef<null>>, Error>;
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/capabilities/url-handler/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,eAAO,MAAM,UAAU,8FAA+D,CAAC"}
@@ -1,10 +0,0 @@
1
- import * as Effect from 'effect/Effect';
2
- import { Capability } from '@dxos/app-framework';
3
- /**
4
- * URL handler for simple layout that syncs browser URL with layout state.
5
- * URL format: /{workspace} or /{workspace}/{active}
6
- * Root is represented as / or /root.
7
- */
8
- declare const _default: (props?: void | undefined) => Effect.Effect<Capability.Capability<Capability.InterfaceDef<null>>, Error, Capability.Service>;
9
- export default _default;
10
- //# sourceMappingURL=url-handler.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"url-handler.d.ts","sourceRoot":"","sources":["../../../../../src/capabilities/url-handler/url-handler.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,UAAU,EAAU,MAAM,qBAAqB,CAAC;AAKzD;;;;GAIG;;AACH,wBA+DE"}
@@ -1,5 +0,0 @@
1
- import React from 'react';
2
- export declare const ContentError: ({ error }: {
3
- error?: Error;
4
- }) => React.JSX.Element;
5
- //# sourceMappingURL=ContentError.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ContentError.d.ts","sourceRoot":"","sources":["../../../../src/components/ContentError.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,eAAO,MAAM,YAAY,GAAI,WAAW;IAAE,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,sBAUxD,CAAC"}
@@ -1,3 +0,0 @@
1
- import React from 'react';
2
- export declare const ContentLoading: () => React.JSX.Element;
3
- //# sourceMappingURL=ContentLoading.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ContentLoading.d.ts","sourceRoot":"","sources":["../../../../src/components/ContentLoading.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,eAAO,MAAM,cAAc,yBAE1B,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ContentLoading.stories.d.ts","sourceRoot":"","sources":["../../../../src/components/ContentLoading.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAMjE,QAAA,MAAM,IAAI;;;;;;;CAO6B,CAAC;AAExC,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC"}
@@ -1,8 +0,0 @@
1
- import React from 'react';
2
- import { Node } from '@dxos/plugin-graph';
3
- import { type ThemedClassName } from '@dxos/react-ui';
4
- export type BannerProps = ThemedClassName<{
5
- node?: Node.Node;
6
- }>;
7
- export declare const Banner: ({ node, classNames }: BannerProps) => React.JSX.Element | null;
8
- //# sourceMappingURL=Banner.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Banner.d.ts","sourceRoot":"","sources":["../../../../../src/components/SimpleLayout/Banner.tsx"],"names":[],"mappings":"AAIA,OAAO,KAA+B,MAAM,OAAO,CAAC;AAIpD,OAAO,EAAS,IAAI,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAc,KAAK,eAAe,EAA8C,MAAM,gBAAgB,CAAC;AAiB9G,MAAM,MAAM,WAAW,GAAG,eAAe,CAAC;IACxC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC;CAClB,CAAC,CAAC;AAEH,eAAO,MAAM,MAAM,GAAI,sBAAsB,WAAW,6BAmDvD,CAAC"}
@@ -1,9 +0,0 @@
1
- import React from 'react';
2
- export type WorkspaceProps = {
3
- id: string;
4
- };
5
- /**
6
- *
7
- */
8
- export declare const Workspace: ({ id }: WorkspaceProps) => React.JSX.Element;
9
- //# sourceMappingURL=Workspace.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Workspace.d.ts","sourceRoot":"","sources":["../../../../../src/components/Workspace/Workspace.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAa9D,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF;;GAEG;AAEH,eAAO,MAAM,SAAS,GAAI,QAAQ,cAAc,sBA+B/C,CAAC"}
@@ -1,2 +0,0 @@
1
- export * from './Workspace';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/Workspace/index.ts"],"names":[],"mappings":"AAIA,cAAc,aAAa,CAAC"}
@@ -1,10 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { type Capability, Capability as Capability$ } from '@dxos/app-framework';
6
-
7
- export const OperationResolver: Capability.LazyCapability = Capability$.lazy(
8
- 'OperationResolver',
9
- () => import('./operation-resolver'),
10
- );
@@ -1,178 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import * as Effect from 'effect/Effect';
6
-
7
- import { Capability, Common } from '@dxos/app-framework';
8
- import { Operation, OperationResolver } from '@dxos/operation';
9
-
10
- import { type SimpleLayoutState, SimpleLayoutState as SimpleLayoutStateCapability } from '../../types';
11
-
12
- /** Maximum number of items to keep in navigation history. */
13
- const MAX_HISTORY_LENGTH = 50;
14
-
15
- export default Capability.makeModule(
16
- Effect.fnUntraced(function* () {
17
- const registry = yield* Capability.get(Common.Capability.AtomRegistry);
18
- const stateAtom = yield* Capability.get(SimpleLayoutStateCapability);
19
-
20
- const getState = () => registry.get(stateAtom);
21
- const updateState = (fn: (current: SimpleLayoutState) => SimpleLayoutState) => {
22
- registry.set(stateAtom, fn(getState()));
23
- };
24
-
25
- return Capability.contributes(Common.Capability.OperationResolver, [
26
- //
27
- // UpdateSidebar - No-op for simple layout.
28
- //
29
- OperationResolver.make({
30
- operation: Common.LayoutOperation.UpdateSidebar,
31
- handler: () => Effect.void,
32
- }),
33
-
34
- //
35
- // UpdateComplementary - No-op for simple layout.
36
- //
37
- OperationResolver.make({
38
- operation: Common.LayoutOperation.UpdateComplementary,
39
- handler: () => Effect.void,
40
- }),
41
-
42
- //
43
- // UpdateDialog
44
- //
45
- OperationResolver.make({
46
- operation: Common.LayoutOperation.UpdateDialog,
47
- handler: Effect.fnUntraced(function* (input) {
48
- updateState((state) => ({
49
- ...state,
50
- dialogOpen: input.state ?? Boolean(input.subject),
51
- dialogType: input.type ?? 'default',
52
- dialogBlockAlign: input.blockAlign ?? 'center',
53
- dialogOverlayClasses: input.overlayClasses,
54
- dialogOverlayStyle: input.overlayStyle,
55
- dialogContent: input.subject ? { component: input.subject, props: input.props } : undefined,
56
- }));
57
- }),
58
- }),
59
-
60
- //
61
- // UpdatePopover
62
- //
63
- OperationResolver.make({
64
- operation: Common.LayoutOperation.UpdatePopover,
65
- handler: Effect.fnUntraced(function* (input) {
66
- updateState((state) => ({
67
- ...state,
68
- popoverOpen: input.state ?? Boolean(input.subject),
69
- popoverKind: input.kind ?? 'base',
70
- popoverTitle: input.kind === 'card' ? input.title : undefined,
71
- popoverContent:
72
- typeof input.subject === 'string'
73
- ? { component: input.subject, props: input.props }
74
- : input.subject
75
- ? { subject: input.subject }
76
- : undefined,
77
- popoverSide: input.side,
78
- popoverVariant: input.variant,
79
- popoverAnchor: input.variant === 'virtual' ? input.anchor : state.popoverAnchor,
80
- popoverAnchorId: input.variant !== 'virtual' ? input.anchorId : state.popoverAnchorId,
81
- }));
82
- }),
83
- }),
84
-
85
- //
86
- // SwitchWorkspace
87
- //
88
- OperationResolver.make({
89
- operation: Common.LayoutOperation.SwitchWorkspace,
90
- handler: Effect.fnUntraced(function* (input) {
91
- updateState((state) => ({
92
- ...state,
93
- // TODO(wittjosiah): This is a hack to prevent the previous deck from being set for pinned items.
94
- // Ideally this should be worked into the data model in a generic way.
95
- previousWorkspace: !state.workspace.startsWith('!') ? state.workspace : state.previousWorkspace,
96
- workspace: input.subject,
97
- active: undefined,
98
- // Clear history when switching workspaces.
99
- history: [],
100
- }));
101
- }),
102
- }),
103
-
104
- //
105
- // RevertWorkspace
106
- //
107
- OperationResolver.make({
108
- operation: Common.LayoutOperation.RevertWorkspace,
109
- handler: Effect.fnUntraced(function* () {
110
- const state = getState();
111
- yield* Operation.invoke(Common.LayoutOperation.SwitchWorkspace, {
112
- subject: state.previousWorkspace,
113
- });
114
- }),
115
- }),
116
-
117
- //
118
- // Open
119
- //
120
- OperationResolver.make({
121
- operation: Common.LayoutOperation.Open,
122
- handler: Effect.fnUntraced(function* (input) {
123
- updateState((state) => {
124
- // Push current active to history if it exists.
125
- const newHistory = state.active ? [...state.history, state.active] : state.history;
126
- // Limit history length to prevent memory issues.
127
- const trimmedHistory =
128
- newHistory.length > MAX_HISTORY_LENGTH ? newHistory.slice(-MAX_HISTORY_LENGTH) : newHistory;
129
- return {
130
- ...state,
131
- active: input.subject[0],
132
- history: trimmedHistory,
133
- };
134
- });
135
- }),
136
- }),
137
-
138
- //
139
- // Close
140
- //
141
- OperationResolver.make({
142
- operation: Common.LayoutOperation.Close,
143
- handler: Effect.fnUntraced(function* () {
144
- updateState((state) => {
145
- // Pop from history if available.
146
- if (state.history.length > 0) {
147
- const newHistory = [...state.history];
148
- const previousActive = newHistory.pop();
149
- return {
150
- ...state,
151
- active: previousActive,
152
- history: newHistory,
153
- };
154
- }
155
- // No history, just clear active.
156
- return {
157
- ...state,
158
- active: undefined,
159
- };
160
- });
161
- }),
162
- }),
163
-
164
- //
165
- // Set
166
- //
167
- OperationResolver.make({
168
- operation: Common.LayoutOperation.Set,
169
- handler: Effect.fnUntraced(function* (input) {
170
- updateState((state) => ({
171
- ...state,
172
- active: input.subject[0],
173
- }));
174
- }),
175
- }),
176
- ]);
177
- }),
178
- );
@@ -1,7 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { Capability } from '@dxos/app-framework';
6
-
7
- export const ReactRoot = Capability.lazy('ReactRoot', () => import('./react-root'));
@@ -1,7 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { Capability } from '@dxos/app-framework';
6
-
7
- export const ReactSurface = Capability.lazy('ReactSurface', () => import('./react-surface'));
@@ -1,40 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import * as Effect from 'effect/Effect';
6
- import React from 'react';
7
-
8
- import { Capability, Common } from '@dxos/app-framework';
9
- import { Node } from '@dxos/plugin-graph';
10
-
11
- import { Home, Workspace } from '../../components';
12
- import { meta } from '../../meta';
13
-
14
- type SurfaceData = {
15
- attendableId: string;
16
- properties: Record<string, any>;
17
- };
18
-
19
- const ALLOWED_DISPOSITIONS = ['workspace', 'user-account', 'pin-end'];
20
-
21
- export default Capability.makeModule(() =>
22
- Effect.succeed(
23
- Capability.contributes(Common.Capability.ReactSurface, [
24
- Common.createSurface({
25
- id: `${meta.id}/home`,
26
- role: 'article',
27
- filter: (data): data is SurfaceData => data.attendableId === Node.RootId,
28
- component: () => <Home />,
29
- }),
30
- Common.createSurface({
31
- id: `${meta.id}/workspace-article`,
32
- role: 'article',
33
- position: 'fallback',
34
- filter: (data): data is SurfaceData =>
35
- ALLOWED_DISPOSITIONS.includes((data.properties as Record<string, any>)?.disposition),
36
- component: ({ data }) => <Workspace id={data.attendableId} />,
37
- }),
38
- ]),
39
- ),
40
- );
@@ -1,7 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { Capability } from '@dxos/app-framework';
6
-
7
- export const SpotlightDismiss = Capability.lazy('SpotlightDismiss', () => import('./spotlight-dismiss'));
@@ -1,9 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { Capability } from '@dxos/app-framework';
6
-
7
- export const State = Capability.lazy('State', () => import('./state'));
8
-
9
- export type { SimpleLayoutStateOptions } from './state';
@@ -1,7 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { Capability } from '@dxos/app-framework';
6
-
7
- export const UrlHandler = Capability.lazy('UrlHandler', () => import('./url-handler'));
@@ -1,80 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import * as Effect from 'effect/Effect';
6
-
7
- import { Capability, Common } from '@dxos/app-framework';
8
- import { Node } from '@dxos/plugin-graph';
9
-
10
- import { type SimpleLayoutState, SimpleLayoutState as SimpleLayoutStateCapability } from '../../types';
11
-
12
- /**
13
- * URL handler for simple layout that syncs browser URL with layout state.
14
- * URL format: /{workspace} or /{workspace}/{active}
15
- * Root is represented as / or /root.
16
- */
17
- export default Capability.makeModule(
18
- Effect.fnUntraced(function* () {
19
- const { invokeSync } = yield* Capability.get(Common.Capability.OperationInvoker);
20
-
21
- /**
22
- * Handle navigation events (initial load and popstate).
23
- * Parses URL and updates state accordingly.
24
- */
25
- const handleNavigation = () => {
26
- const pathname = window.location.pathname;
27
-
28
- // Parse URL segments: /{workspace}/{active}
29
- const [_, nextWorkspace, nextActive] = pathname.split('/');
30
-
31
- // Determine target workspace (empty or 'root' means Node.RootId).
32
- const targetWorkspace = !nextWorkspace || nextWorkspace === 'root' ? Node.RootId : nextWorkspace;
33
-
34
- // Navigate via operations (they will update state accordingly).
35
- invokeSync(Common.LayoutOperation.SwitchWorkspace, { subject: targetWorkspace });
36
- if (nextActive) {
37
- invokeSync(Common.LayoutOperation.Open, { subject: [nextActive] });
38
- }
39
- };
40
-
41
- // Handle initial URL and listen for browser navigation.
42
- yield* Effect.sync(() => handleNavigation());
43
- window.addEventListener('popstate', handleNavigation);
44
-
45
- // Subscribe to state changes to update the URL.
46
- let lastWorkspace: string | undefined;
47
- let lastActive: string | undefined;
48
- const unsubscribe = yield* Common.Capability.subscribeAtom(
49
- SimpleLayoutStateCapability,
50
- (state: SimpleLayoutState) => {
51
- const { workspace, active } = state;
52
-
53
- // Only update URL if relevant state changed.
54
- if (workspace !== lastWorkspace || active !== lastActive) {
55
- lastWorkspace = workspace;
56
- lastActive = active;
57
-
58
- // Build path: root is represented as /, other workspaces as /{workspace}.
59
- let path: string;
60
- if (workspace === Node.RootId) {
61
- path = active ? `/${Node.RootId}/${active}` : '/';
62
- } else {
63
- path = active ? `/${workspace}/${active}` : `/${workspace}`;
64
- }
65
-
66
- if (window.location.pathname !== path) {
67
- history.pushState(null, '', `${path}${window.location.search}`);
68
- }
69
- }
70
- },
71
- );
72
-
73
- return Capability.contributes(Common.Capability.Null, null, () =>
74
- Effect.sync(() => {
75
- window.removeEventListener('popstate', handleNavigation);
76
- unsubscribe();
77
- }),
78
- );
79
- }),
80
- );
@@ -1,23 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import React from 'react';
6
-
7
- import { useTranslation } from '@dxos/react-ui';
8
- import { descriptionMessage, mx } from '@dxos/ui-theme';
9
-
10
- import { meta } from '../meta';
11
-
12
- // TODO(burdon): Factor out.
13
- export const ContentError = ({ error }: { error?: Error }) => {
14
- const { t } = useTranslation(meta.id);
15
- const errorString = error?.toString() ?? '';
16
- return (
17
- <div role='none' className='grid place-items-center overflow-y-auto attention-surface'>
18
- <p role='alert' className={mx(descriptionMessage, 'p-2 break-all rounded-sm')}>
19
- {error ? errorString : t('error fallback message')}
20
- </p>
21
- </div>
22
- );
23
- };