@dxos/app-framework 0.8.4-main.2e9d522 → 0.8.4-main.3c1ae3b

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 (231) hide show
  1. package/.storybook/main.mts +11 -0
  2. package/.storybook/preview.mts +8 -0
  3. package/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
  4. package/.swc/plugins/{v7_linux_x86_64_13.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429 → linux_x86_64_19.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429.wasmer-v7} +0 -0
  5. package/dist/lib/browser/{app-graph-builder-LYF7EKNN.mjs → app-graph-builder-7HSPOVXY.mjs} +32 -31
  6. package/dist/lib/browser/app-graph-builder-7HSPOVXY.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-256DQP2E.mjs +627 -0
  8. package/dist/lib/browser/chunk-256DQP2E.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-ORWHM7CO.mjs → chunk-SCPE4ZO2.mjs} +11 -8
  10. package/dist/lib/browser/chunk-SCPE4ZO2.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-FMN65HSW.mjs → chunk-ZP65K47V.mjs} +397 -265
  12. package/dist/lib/browser/chunk-ZP65K47V.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +20 -56
  14. package/dist/lib/browser/index.mjs.map +3 -3
  15. package/dist/lib/browser/{intent-dispatcher-LSYQZSEB.mjs → intent-dispatcher-MGSN6NWK.mjs} +2 -2
  16. package/dist/lib/browser/{intent-resolver-ZTNOSO3A.mjs → intent-resolver-UGFUFECV.mjs} +7 -7
  17. package/dist/lib/browser/intent-resolver-UGFUFECV.mjs.map +7 -0
  18. package/dist/lib/browser/meta.json +1 -1
  19. package/dist/lib/browser/react/index.mjs +36 -0
  20. package/dist/lib/browser/{store-KML2R4IE.mjs → store-TF6FXKUY.mjs} +5 -5
  21. package/dist/lib/browser/store-TF6FXKUY.mjs.map +7 -0
  22. package/dist/lib/browser/testing/index.mjs +17 -21
  23. package/dist/lib/browser/testing/index.mjs.map +3 -3
  24. package/dist/lib/node-esm/{app-graph-builder-SAOWGJDK.mjs → app-graph-builder-SD2CIDSL.mjs} +32 -31
  25. package/dist/lib/node-esm/app-graph-builder-SD2CIDSL.mjs.map +7 -0
  26. package/dist/lib/node-esm/chunk-AKNEI7PK.mjs +628 -0
  27. package/dist/lib/node-esm/chunk-AKNEI7PK.mjs.map +7 -0
  28. package/dist/lib/node-esm/{chunk-ZEZ4FVEU.mjs → chunk-GVTAHU3L.mjs} +397 -265
  29. package/dist/lib/node-esm/chunk-GVTAHU3L.mjs.map +7 -0
  30. package/dist/lib/node-esm/{chunk-UMZQERLE.mjs → chunk-ZX63QUGE.mjs} +11 -8
  31. package/dist/lib/node-esm/chunk-ZX63QUGE.mjs.map +7 -0
  32. package/dist/lib/node-esm/index.mjs +20 -56
  33. package/dist/lib/node-esm/index.mjs.map +3 -3
  34. package/dist/lib/node-esm/{intent-dispatcher-6CYNGPSW.mjs → intent-dispatcher-2M6HMLXG.mjs} +2 -2
  35. package/dist/lib/node-esm/{intent-resolver-W7Z7WFFM.mjs → intent-resolver-IFG2IKBH.mjs} +7 -7
  36. package/dist/lib/node-esm/intent-resolver-IFG2IKBH.mjs.map +7 -0
  37. package/dist/lib/node-esm/meta.json +1 -1
  38. package/dist/lib/node-esm/react/index.mjs +37 -0
  39. package/dist/lib/node-esm/{store-QEXGXLWZ.mjs → store-2CNGWED2.mjs} +5 -5
  40. package/dist/lib/node-esm/store-2CNGWED2.mjs.map +7 -0
  41. package/dist/lib/node-esm/testing/index.mjs +17 -21
  42. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  43. package/dist/types/src/common/capabilities.d.ts +110 -39
  44. package/dist/types/src/common/capabilities.d.ts.map +1 -1
  45. package/dist/types/src/common/collaboration.d.ts +10 -9
  46. package/dist/types/src/common/collaboration.d.ts.map +1 -1
  47. package/dist/types/src/common/events.d.ts.map +1 -1
  48. package/dist/types/src/common/file.d.ts +1 -1
  49. package/dist/types/src/common/file.d.ts.map +1 -1
  50. package/dist/types/src/common/index.d.ts +1 -1
  51. package/dist/types/src/common/index.d.ts.map +1 -1
  52. package/dist/types/src/common/layout.d.ts +1 -3
  53. package/dist/types/src/common/layout.d.ts.map +1 -1
  54. package/dist/types/src/common/surface.d.ts +21 -16
  55. package/dist/types/src/common/surface.d.ts.map +1 -1
  56. package/dist/types/src/common/translations.d.ts +1 -1
  57. package/dist/types/src/common/translations.d.ts.map +1 -1
  58. package/dist/types/src/core/capabilities.d.ts +19 -16
  59. package/dist/types/src/core/capabilities.d.ts.map +1 -1
  60. package/dist/types/src/core/manager.d.ts +7 -3
  61. package/dist/types/src/core/manager.d.ts.map +1 -1
  62. package/dist/types/src/core/plugin.d.ts +8 -1
  63. package/dist/types/src/core/plugin.d.ts.map +1 -1
  64. package/dist/types/src/index.d.ts +0 -2
  65. package/dist/types/src/index.d.ts.map +1 -1
  66. package/dist/types/src/playground/debug/Debug.d.ts +1 -1
  67. package/dist/types/src/playground/debug/plugin.d.ts +1 -1
  68. package/dist/types/src/playground/debug/plugin.d.ts.map +1 -1
  69. package/dist/types/src/playground/generator/Main.d.ts +1 -1
  70. package/dist/types/src/playground/generator/Main.d.ts.map +1 -1
  71. package/dist/types/src/playground/generator/Toolbar.d.ts +1 -1
  72. package/dist/types/src/playground/generator/Toolbar.d.ts.map +1 -1
  73. package/dist/types/src/playground/generator/generator.d.ts +1 -1
  74. package/dist/types/src/playground/generator/generator.d.ts.map +1 -1
  75. package/dist/types/src/playground/generator/plugin.d.ts +1 -1
  76. package/dist/types/src/playground/generator/plugin.d.ts.map +1 -1
  77. package/dist/types/src/playground/layout/Layout.d.ts +2 -2
  78. package/dist/types/src/playground/layout/plugin.d.ts +1 -1
  79. package/dist/types/src/playground/layout/plugin.d.ts.map +1 -1
  80. package/dist/types/src/playground/logger/Toolbar.d.ts +1 -1
  81. package/dist/types/src/playground/logger/Toolbar.d.ts.map +1 -1
  82. package/dist/types/src/playground/logger/plugin.d.ts +1 -1
  83. package/dist/types/src/playground/logger/plugin.d.ts.map +1 -1
  84. package/dist/types/src/playground/logger/schema.d.ts +1 -1
  85. package/dist/types/src/playground/logger/schema.d.ts.map +1 -1
  86. package/dist/types/src/playground/playground.stories.d.ts +5 -4
  87. package/dist/types/src/playground/playground.stories.d.ts.map +1 -1
  88. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +1 -1
  89. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +1 -1
  90. package/dist/types/src/plugin-intent/actions.d.ts +5 -7
  91. package/dist/types/src/plugin-intent/actions.d.ts.map +1 -1
  92. package/dist/types/src/plugin-intent/errors.d.ts.map +1 -1
  93. package/dist/types/src/plugin-intent/index.d.ts +1 -0
  94. package/dist/types/src/plugin-intent/index.d.ts.map +1 -1
  95. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +7 -7
  96. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +1 -1
  97. package/dist/types/src/plugin-intent/intent.d.ts +1 -1
  98. package/dist/types/src/plugin-intent/intent.d.ts.map +1 -1
  99. package/dist/types/src/plugin-intent/meta.d.ts +3 -0
  100. package/dist/types/src/plugin-intent/meta.d.ts.map +1 -0
  101. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +1 -1
  102. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +1 -1
  103. package/dist/types/src/plugin-settings/actions.d.ts +5 -7
  104. package/dist/types/src/plugin-settings/actions.d.ts.map +1 -1
  105. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +1 -1
  106. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +1 -1
  107. package/dist/types/src/plugin-settings/intent-resolver.d.ts +1 -1
  108. package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +1 -1
  109. package/dist/types/src/plugin-settings/meta.d.ts +3 -0
  110. package/dist/types/src/plugin-settings/meta.d.ts.map +1 -0
  111. package/dist/types/src/plugin-settings/store.d.ts +1 -1
  112. package/dist/types/src/plugin-settings/store.d.ts.map +1 -1
  113. package/dist/types/src/plugin-settings/translations.d.ts +2 -1
  114. package/dist/types/src/plugin-settings/translations.d.ts.map +1 -1
  115. package/dist/types/src/react/App.d.ts +10 -0
  116. package/dist/types/src/react/App.d.ts.map +1 -0
  117. package/dist/types/src/react/App.stories.d.ts +14 -0
  118. package/dist/types/src/react/App.stories.d.ts.map +1 -0
  119. package/dist/types/src/react/DefaultFallback.d.ts +8 -0
  120. package/dist/types/src/react/DefaultFallback.d.ts.map +1 -0
  121. package/dist/types/src/react/ErrorBoundary.d.ts +13 -14
  122. package/dist/types/src/react/ErrorBoundary.d.ts.map +1 -1
  123. package/dist/types/src/react/IntentContext.d.ts.map +1 -1
  124. package/dist/types/src/react/Surface.d.ts +7 -5
  125. package/dist/types/src/react/Surface.d.ts.map +1 -1
  126. package/dist/types/src/react/Surface.stories.d.ts +8 -10
  127. package/dist/types/src/react/Surface.stories.d.ts.map +1 -1
  128. package/dist/types/src/react/SurfaceInfo.d.ts +11 -0
  129. package/dist/types/src/react/SurfaceInfo.d.ts.map +1 -0
  130. package/dist/types/src/react/common.d.ts.map +1 -1
  131. package/dist/types/src/react/index.d.ts +2 -0
  132. package/dist/types/src/react/index.d.ts.map +1 -1
  133. package/dist/types/src/react/types.d.ts +14 -0
  134. package/dist/types/src/react/types.d.ts.map +1 -0
  135. package/dist/types/src/{App.d.ts → react/useApp.d.ts} +7 -6
  136. package/dist/types/src/react/useApp.d.ts.map +1 -0
  137. package/dist/types/src/react/useCapabilities.d.ts.map +1 -1
  138. package/dist/types/src/react/useLoading.d.ts +19 -0
  139. package/dist/types/src/react/useLoading.d.ts.map +1 -0
  140. package/dist/types/src/testing/withPluginManager.d.ts +9 -8
  141. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  142. package/dist/types/src/testing/withPluginManager.stories.d.ts +9 -3
  143. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  144. package/dist/types/tsconfig.tsbuildinfo +1 -1
  145. package/moon.yml +5 -1
  146. package/package.json +48 -38
  147. package/src/common/capabilities.ts +116 -20
  148. package/src/common/collaboration.ts +6 -9
  149. package/src/common/events.ts +3 -1
  150. package/src/common/file.ts +1 -1
  151. package/src/common/index.ts +1 -1
  152. package/src/common/layout.ts +3 -4
  153. package/src/common/surface.ts +23 -20
  154. package/src/common/translations.ts +1 -1
  155. package/src/core/capabilities.test.ts +3 -3
  156. package/src/core/capabilities.ts +36 -27
  157. package/src/core/manager.test.ts +22 -21
  158. package/src/core/manager.ts +141 -56
  159. package/src/core/plugin.ts +13 -2
  160. package/src/helpers.test.ts +1 -1
  161. package/src/index.ts +0 -2
  162. package/src/playground/debug/Debug.tsx +1 -1
  163. package/src/playground/debug/plugin.ts +7 -8
  164. package/src/playground/generator/Main.tsx +0 -1
  165. package/src/playground/generator/Toolbar.tsx +2 -1
  166. package/src/playground/generator/generator.ts +4 -4
  167. package/src/playground/generator/plugin.ts +12 -13
  168. package/src/playground/layout/plugin.ts +10 -9
  169. package/src/playground/logger/Toolbar.tsx +2 -1
  170. package/src/playground/logger/plugin.ts +30 -25
  171. package/src/playground/logger/schema.ts +1 -1
  172. package/src/playground/playground.stories.tsx +30 -17
  173. package/src/plugin-intent/IntentPlugin.ts +13 -13
  174. package/src/plugin-intent/actions.ts +4 -6
  175. package/src/plugin-intent/errors.ts +2 -1
  176. package/src/plugin-intent/index.ts +1 -0
  177. package/src/plugin-intent/intent-dispatcher.test.ts +10 -3
  178. package/src/plugin-intent/intent-dispatcher.ts +21 -12
  179. package/src/plugin-intent/intent.ts +1 -1
  180. package/src/plugin-intent/meta.ts +10 -0
  181. package/src/plugin-settings/SettingsPlugin.ts +27 -28
  182. package/src/plugin-settings/actions.ts +9 -13
  183. package/src/plugin-settings/app-graph-builder.ts +25 -22
  184. package/src/plugin-settings/intent-resolver.ts +5 -4
  185. package/src/plugin-settings/meta.ts +10 -0
  186. package/src/plugin-settings/store.ts +3 -3
  187. package/src/plugin-settings/translations.ts +4 -4
  188. package/src/react/App.stories.tsx +34 -0
  189. package/src/react/App.tsx +59 -0
  190. package/src/react/DefaultFallback.tsx +26 -0
  191. package/src/react/ErrorBoundary.tsx +26 -15
  192. package/src/react/IntentContext.tsx +3 -2
  193. package/src/react/Surface.stories.tsx +100 -55
  194. package/src/react/Surface.tsx +134 -43
  195. package/src/react/SurfaceInfo.tsx +107 -0
  196. package/src/react/common.ts +2 -1
  197. package/src/react/index.ts +4 -0
  198. package/src/react/types.ts +38 -0
  199. package/src/react/useApp.tsx +165 -0
  200. package/src/react/useCapabilities.ts +4 -3
  201. package/src/react/useLoading.tsx +70 -0
  202. package/src/testing/withPluginManager.stories.tsx +9 -5
  203. package/src/testing/withPluginManager.tsx +33 -32
  204. package/tsconfig.json +11 -9
  205. package/vitest.config.ts +8 -6
  206. package/.swc/plugins/v7_linux_x86_64_13.0.0/f45bdff002284d9e8f9ef3f0be909de12da36c049cbcf261ac78fc00abb09a2d +0 -0
  207. package/dist/lib/browser/app-graph-builder-LYF7EKNN.mjs.map +0 -7
  208. package/dist/lib/browser/chunk-FMN65HSW.mjs.map +0 -7
  209. package/dist/lib/browser/chunk-FO2PH7M3.mjs +0 -415
  210. package/dist/lib/browser/chunk-FO2PH7M3.mjs.map +0 -7
  211. package/dist/lib/browser/chunk-ORWHM7CO.mjs.map +0 -7
  212. package/dist/lib/browser/intent-resolver-ZTNOSO3A.mjs.map +0 -7
  213. package/dist/lib/browser/store-KML2R4IE.mjs.map +0 -7
  214. package/dist/lib/browser/worker.mjs +0 -79
  215. package/dist/lib/node-esm/app-graph-builder-SAOWGJDK.mjs.map +0 -7
  216. package/dist/lib/node-esm/chunk-73HGSHKE.mjs +0 -416
  217. package/dist/lib/node-esm/chunk-73HGSHKE.mjs.map +0 -7
  218. package/dist/lib/node-esm/chunk-UMZQERLE.mjs.map +0 -7
  219. package/dist/lib/node-esm/chunk-ZEZ4FVEU.mjs.map +0 -7
  220. package/dist/lib/node-esm/intent-resolver-W7Z7WFFM.mjs.map +0 -7
  221. package/dist/lib/node-esm/store-QEXGXLWZ.mjs.map +0 -7
  222. package/dist/lib/node-esm/worker.mjs +0 -80
  223. package/dist/types/src/App.d.ts.map +0 -1
  224. package/dist/types/src/worker.d.ts +0 -4
  225. package/dist/types/src/worker.d.ts.map +0 -1
  226. package/src/App.tsx +0 -276
  227. package/src/worker.ts +0 -11
  228. /package/dist/lib/browser/{intent-dispatcher-LSYQZSEB.mjs.map → intent-dispatcher-MGSN6NWK.mjs.map} +0 -0
  229. /package/dist/lib/browser/{worker.mjs.map → react/index.mjs.map} +0 -0
  230. /package/dist/lib/node-esm/{intent-dispatcher-6CYNGPSW.mjs.map → intent-dispatcher-2M6HMLXG.mjs.map} +0 -0
  231. /package/dist/lib/node-esm/{worker.mjs.map → react/index.mjs.map} +0 -0
@@ -0,0 +1,627 @@
1
+ import {
2
+ Capabilities,
3
+ Events,
4
+ PluginManager
5
+ } from "./chunk-ZP65K47V.mjs";
6
+
7
+ // src/react/useCapabilities.ts
8
+ import { useAtomValue } from "@effect-atom/atom-react";
9
+ import { invariant } from "@dxos/invariant";
10
+
11
+ // src/react/PluginManagerProvider.ts
12
+ import { createContext, useContext } from "react";
13
+ import { raise } from "@dxos/debug";
14
+ var PluginManagerContext = createContext(void 0);
15
+ var usePluginManager = () => useContext(PluginManagerContext) ?? raise(new Error("Missing PluginManagerContext"));
16
+ var PluginManagerProvider = PluginManagerContext.Provider;
17
+
18
+ // src/react/useCapabilities.ts
19
+ var __dxlog_file = "/__w/dxos/dxos/packages/sdk/app-framework/src/react/useCapabilities.ts";
20
+ var useCapabilities = (interfaceDef) => {
21
+ const manager = usePluginManager();
22
+ return useAtomValue(manager.context.capabilities(interfaceDef));
23
+ };
24
+ var useCapability = (interfaceDef) => {
25
+ const capabilities = useCapabilities(interfaceDef);
26
+ invariant(capabilities.length > 0, `No capability found for ${interfaceDef.identifier}`, {
27
+ F: __dxlog_file,
28
+ L: 29,
29
+ S: void 0,
30
+ A: [
31
+ "capabilities.length > 0",
32
+ "`No capability found for ${interfaceDef.identifier}`"
33
+ ]
34
+ });
35
+ return capabilities[0];
36
+ };
37
+
38
+ // src/react/common.ts
39
+ var useIntentDispatcher = () => useCapability(Capabilities.IntentDispatcher);
40
+ var useAppGraph = () => useCapability(Capabilities.AppGraph);
41
+ var useLayout = () => useCapability(Capabilities.Layout);
42
+
43
+ // src/react/types.ts
44
+ import * as Schema from "effect/Schema";
45
+ var SurfaceCardRole = Schema.Literal("card", "card--popover", "card--intrinsic", "card--extrinsic", "card--transclusion");
46
+
47
+ // src/react/ErrorBoundary.tsx
48
+ import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
49
+ import React, { Component } from "react";
50
+ var ErrorBoundary = class extends Component {
51
+ static getDerivedStateFromError(error) {
52
+ return {
53
+ error
54
+ };
55
+ }
56
+ state = {
57
+ error: void 0
58
+ };
59
+ componentDidUpdate(prevProps) {
60
+ if (prevProps.data !== this.props.data) {
61
+ this.resetError();
62
+ }
63
+ }
64
+ render() {
65
+ if (this.state.error) {
66
+ const Fallback = this.props.fallback ?? DefaultFallback;
67
+ return /* @__PURE__ */ React.createElement(Fallback, {
68
+ data: this.props.data,
69
+ error: this.state.error
70
+ });
71
+ }
72
+ return this.props.children;
73
+ }
74
+ resetError() {
75
+ this.setState({
76
+ error: void 0
77
+ });
78
+ }
79
+ };
80
+ var DefaultFallback = ({ data, error }) => {
81
+ var _effect = _useSignals();
82
+ try {
83
+ return /* @__PURE__ */ React.createElement("div", {
84
+ className: "flex flex-col gap-2 overflow-hidden border border-red-500 rounded-sm"
85
+ }, /* @__PURE__ */ React.createElement("h1", {
86
+ className: "p-2"
87
+ }, "ERROR: ", error.message), /* @__PURE__ */ React.createElement("pre", {
88
+ className: "p-2 overflow-y-auto text-sm text-subdued"
89
+ }, JSON.stringify(data, null, 2)));
90
+ } finally {
91
+ _effect.f();
92
+ }
93
+ };
94
+
95
+ // src/react/Surface.tsx
96
+ import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
97
+ import React3, { Fragment, Suspense, createContext as createContext2, forwardRef as forwardRef2, memo, useContext as useContext2, useMemo } from "react";
98
+ import { raise as raise2 } from "@dxos/debug";
99
+ import { log } from "@dxos/log";
100
+ import { useDefaultValue } from "@dxos/react-hooks";
101
+ import { byPosition } from "@dxos/util";
102
+
103
+ // src/react/SurfaceInfo.tsx
104
+ import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
105
+ import React2, { cloneElement, forwardRef, useCallback, useLayoutEffect, useState } from "react";
106
+ import { createPortal } from "react-dom";
107
+ import { addEventListener, combine } from "@dxos/async";
108
+ import { useMergeRefs } from "@dxos/react-hooks";
109
+ var SurfaceInfo = /* @__PURE__ */ forwardRef(({ children }, forwardedRef) => {
110
+ var _effect = _useSignals2();
111
+ try {
112
+ const [rect, setRect] = useState(null);
113
+ const [expand, setExpand] = useState(false);
114
+ const info = useSurface();
115
+ const [root, setRoot] = useState(null);
116
+ const measureRef = useCallback((node) => setRoot(node), []);
117
+ const mergedRef = useMergeRefs([
118
+ measureRef,
119
+ forwardedRef
120
+ ]);
121
+ const childWithRef = /* @__PURE__ */ cloneElement(children, {
122
+ ref: mergedRef
123
+ });
124
+ useLayoutEffect(() => {
125
+ if (!root) {
126
+ setRect(null);
127
+ return;
128
+ }
129
+ const measure = () => {
130
+ setRect(root.getBoundingClientRect());
131
+ };
132
+ const observer = new ResizeObserver(measure);
133
+ observer.observe(root);
134
+ measure();
135
+ return combine(addEventListener(window, "scroll", measure, true), addEventListener(window, "resize", measure), () => {
136
+ observer.disconnect();
137
+ });
138
+ }, [
139
+ root
140
+ ]);
141
+ const padding = 0;
142
+ return /* @__PURE__ */ React2.createElement(React2.Fragment, null, childWithRef, rect && /* @__PURE__ */ createPortal(
143
+ /* @__PURE__ */ React2.createElement("div", {
144
+ role: "none",
145
+ className: "z-[100] fixed flex flex-col-reverse scrollbar-none overflow-auto pointer-events-none",
146
+ style: {
147
+ top: rect.top + padding,
148
+ left: rect.left + padding,
149
+ width: rect.width - padding * 2,
150
+ height: rect.height - padding * 2
151
+ }
152
+ }, expand ? /* @__PURE__ */ React2.createElement("div", {
153
+ className: "absolute inset-0 bg-deckSurface border border-green-500 cursor-pointer pointer-events-auto overflow-auto",
154
+ onPointerDown: (ev) => ev.stopPropagation(),
155
+ onClick: (ev) => {
156
+ ev.stopPropagation();
157
+ setExpand(false);
158
+ }
159
+ }, /* @__PURE__ */ React2.createElement("pre", {
160
+ className: "p-2 text-xs text-description font-mono"
161
+ }, JSON.stringify({
162
+ info
163
+ }, null, 2))) : /* @__PURE__ */ React2.createElement("span", {
164
+ className: "absolute right-1 bottom-0 flex items-center p-1 text-green-500 opacity-80 hover:opacity-100 text-xl cursor-pointer pointer-events-auto",
165
+ title: info.id,
166
+ onPointerDown: (ev) => ev.stopPropagation(),
167
+ onClick: (ev) => {
168
+ ev.stopPropagation();
169
+ setExpand(true);
170
+ }
171
+ }, "\u24D8")),
172
+ // TODO(burdon): Create well-known element to gather all debug portals.
173
+ document.body
174
+ ));
175
+ } finally {
176
+ _effect.f();
177
+ }
178
+ });
179
+
180
+ // src/react/Surface.tsx
181
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/sdk/app-framework/src/react/Surface.tsx";
182
+ var DEFAULT_PLACEHOLDER = /* @__PURE__ */ React3.createElement(Fragment, null);
183
+ var DEBUG = import.meta.env.VITE_DEBUG;
184
+ var SurfaceContext = /* @__PURE__ */ createContext2(void 0);
185
+ var SurfaceContextProvider = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef2(({ id, role, data, limit, fallback = DefaultFallback2, component: Component2, ...rest }, forwardedRef) => {
186
+ var _effect = _useSignals3();
187
+ try {
188
+ const contextValue = useMemo(() => ({
189
+ id,
190
+ role,
191
+ data
192
+ }), [
193
+ id,
194
+ role,
195
+ data
196
+ ]);
197
+ const active = DEBUG || "__DX_DEBUG__" in window;
198
+ if (active) {
199
+ return /* @__PURE__ */ React3.createElement(ErrorBoundary, {
200
+ data,
201
+ fallback
202
+ }, /* @__PURE__ */ React3.createElement(SurfaceContext.Provider, {
203
+ value: contextValue
204
+ }, /* @__PURE__ */ React3.createElement(SurfaceInfo, {
205
+ ref: forwardedRef
206
+ }, /* @__PURE__ */ React3.createElement(Component2, {
207
+ id,
208
+ role,
209
+ data,
210
+ limit,
211
+ ...rest
212
+ }))));
213
+ }
214
+ return /* @__PURE__ */ React3.createElement(ErrorBoundary, {
215
+ data,
216
+ fallback
217
+ }, /* @__PURE__ */ React3.createElement(SurfaceContext.Provider, {
218
+ value: contextValue
219
+ }, /* @__PURE__ */ React3.createElement(Component2, {
220
+ id,
221
+ role,
222
+ data,
223
+ limit,
224
+ ...rest,
225
+ ref: forwardedRef
226
+ })));
227
+ } finally {
228
+ _effect.f();
229
+ }
230
+ }));
231
+ SurfaceContextProvider.displayName = "SurfaceContextProvider";
232
+ var useSurface = () => {
233
+ const context = useContext2(SurfaceContext) ?? raise2(new Error("Missing SurfaceContext"));
234
+ return context;
235
+ };
236
+ var Surface = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef2(({ id: _id, role, data: dataParam, limit, placeholder = DEFAULT_PLACEHOLDER, ...rest }, forwardedRef) => {
237
+ var _effect = _useSignals3();
238
+ try {
239
+ const data = useDefaultValue(dataParam, () => ({}));
240
+ const surfaces = useSurfaces();
241
+ const definitions = findCandidates(surfaces, {
242
+ role,
243
+ data
244
+ });
245
+ const candidates = limit ? definitions.slice(0, limit) : definitions;
246
+ if (DEBUG && candidates.length === 0) {
247
+ log.warn("no candidates for surface", {
248
+ role,
249
+ data
250
+ }, {
251
+ F: __dxlog_file2,
252
+ L: 98,
253
+ S: void 0,
254
+ C: (f, a) => f(...a)
255
+ });
256
+ return null;
257
+ }
258
+ return /* @__PURE__ */ React3.createElement(Suspense, {
259
+ fallback: placeholder
260
+ }, candidates.map(({ id, component }) => /* @__PURE__ */ React3.createElement(SurfaceContextProvider, {
261
+ key: id,
262
+ id,
263
+ role,
264
+ data,
265
+ limit,
266
+ component,
267
+ ref: forwardedRef,
268
+ ...rest
269
+ })));
270
+ } finally {
271
+ _effect.f();
272
+ }
273
+ }));
274
+ Surface.displayName = "Surface";
275
+ var findCandidates = (surfaces, { role, data }) => {
276
+ return Object.values(surfaces).filter((definition) => Array.isArray(definition.role) ? definition.role.includes(role) : definition.role === role).filter(({ filter }) => filter ? filter(data ?? {}) : true).toSorted(byPosition);
277
+ };
278
+ var DefaultFallback2 = ({ data, error, dev }) => {
279
+ var _effect = _useSignals3();
280
+ try {
281
+ if (dev) {
282
+ return /* @__PURE__ */ React3.createElement("div", {
283
+ className: "flex flex-col gap-4 p-4 is-full overflow-y-auto"
284
+ }, /* @__PURE__ */ React3.createElement("h1", {
285
+ className: "flex gap-2 text-sm mbs-2"
286
+ }, error.message), /* @__PURE__ */ React3.createElement("pre", {
287
+ className: "overflow-auto text-xs text-description"
288
+ }, JSON.stringify(data, null, 2)));
289
+ }
290
+ return /* @__PURE__ */ React3.createElement("div", {
291
+ className: "flex flex-col gap-4 p-4 is-full overflow-y-auto border border-roseFill"
292
+ }, /* @__PURE__ */ React3.createElement("h1", {
293
+ className: "flex gap-2 text-sm mbs-2 text-rose-500"
294
+ }, error.message), /* @__PURE__ */ React3.createElement("pre", {
295
+ className: "overflow-auto text-xs text-description"
296
+ }, error.stack), /* @__PURE__ */ React3.createElement("pre", {
297
+ className: "overflow-auto text-xs text-description"
298
+ }, JSON.stringify(data, null, 2)));
299
+ } finally {
300
+ _effect.f();
301
+ }
302
+ };
303
+ var useSurfaces = () => {
304
+ const surfaces = useCapabilities(Capabilities.ReactSurface);
305
+ return useMemo(() => surfaces.flat(), [
306
+ surfaces
307
+ ]);
308
+ };
309
+ var isSurfaceAvailable = (context, { role, data }) => {
310
+ const surfaces = context.getCapabilities(Capabilities.ReactSurface);
311
+ const candidates = findCandidates(surfaces.flat(), {
312
+ role,
313
+ data
314
+ });
315
+ return candidates.length > 0;
316
+ };
317
+
318
+ // src/react/useApp.tsx
319
+ import { RegistryContext } from "@effect-atom/atom-react";
320
+ import { effect } from "@preact/signals-core";
321
+ import React6, { useCallback as useCallback2, useEffect as useEffect2, useMemo as useMemo2 } from "react";
322
+ import { invariant as invariant2 } from "@dxos/invariant";
323
+ import { live } from "@dxos/live-object";
324
+ import { useAsyncEffect, useDefaultValue as useDefaultValue2 } from "@dxos/react-hooks";
325
+
326
+ // src/react/App.tsx
327
+ import { useSignals as _useSignals4 } from "@preact-signals/safe-react/tracking";
328
+ import React4 from "react";
329
+
330
+ // src/helpers.ts
331
+ var topologicalSort = (nodes) => {
332
+ const getDependencies = (nodeId, seen = /* @__PURE__ */ new Set(), path = /* @__PURE__ */ new Set()) => {
333
+ if (path.has(nodeId)) {
334
+ throw new Error(`Circular dependency detected involving ${nodeId}`);
335
+ }
336
+ if (seen.has(nodeId)) {
337
+ return [];
338
+ }
339
+ const node = nodes.find((n) => n.id === nodeId);
340
+ if (!node) {
341
+ throw new Error(`Node ${nodeId} not found but is listed as a dependency`);
342
+ }
343
+ const newPath = /* @__PURE__ */ new Set([
344
+ ...path,
345
+ nodeId
346
+ ]);
347
+ const newSeen = /* @__PURE__ */ new Set([
348
+ ...seen,
349
+ nodeId
350
+ ]);
351
+ const dependsOn = node.dependsOn ?? [];
352
+ return [
353
+ ...dependsOn.flatMap((depId) => getDependencies(depId, newSeen, newPath)),
354
+ nodeId
355
+ ];
356
+ };
357
+ const allDependencies = nodes.map((node) => node.id).flatMap((id) => getDependencies(id)).filter((id, index, self) => self.indexOf(id) === index);
358
+ return allDependencies.map((id) => nodes.find((node) => node.id === id)).filter((node) => node !== void 0);
359
+ };
360
+
361
+ // src/react/useLoading.tsx
362
+ import { useEffect, useState as useState2 } from "react";
363
+ var LoadingState = /* @__PURE__ */ (function(LoadingState2) {
364
+ LoadingState2[LoadingState2["Loading"] = 0] = "Loading";
365
+ LoadingState2[LoadingState2["FadeIn"] = 1] = "FadeIn";
366
+ LoadingState2[LoadingState2["FadeOut"] = 2] = "FadeOut";
367
+ LoadingState2[LoadingState2["Done"] = 3] = "Done";
368
+ return LoadingState2;
369
+ })({});
370
+ var useLoading = (state, debounce = 0) => {
371
+ const [stage, setStage] = useState2(0);
372
+ useEffect(() => {
373
+ if (!debounce) {
374
+ return;
375
+ }
376
+ const i = setInterval(() => {
377
+ setStage((stage2) => {
378
+ switch (stage2) {
379
+ case 0: {
380
+ if (!state.ready) {
381
+ return 1;
382
+ } else {
383
+ clearInterval(i);
384
+ return 3;
385
+ }
386
+ }
387
+ case 1: {
388
+ if (state.ready) {
389
+ return 2;
390
+ }
391
+ break;
392
+ }
393
+ case 2: {
394
+ clearInterval(i);
395
+ return 3;
396
+ }
397
+ }
398
+ return stage2;
399
+ });
400
+ }, debounce);
401
+ return () => clearInterval(i);
402
+ }, [
403
+ debounce
404
+ ]);
405
+ if (!debounce) {
406
+ return state.ready ? 3 : 0;
407
+ }
408
+ return stage;
409
+ };
410
+
411
+ // src/react/App.tsx
412
+ var App = ({ placeholder: Placeholder, state, debounce }) => {
413
+ var _effect = _useSignals4();
414
+ try {
415
+ const reactContexts = useCapabilities(Capabilities.ReactContext);
416
+ const reactRoots = useCapabilities(Capabilities.ReactRoot);
417
+ const stage = useLoading(state, debounce);
418
+ if (state.error) {
419
+ throw state.error;
420
+ }
421
+ if (stage < LoadingState.Done) {
422
+ if (!Placeholder) {
423
+ return null;
424
+ }
425
+ return /* @__PURE__ */ React4.createElement(Placeholder, {
426
+ stage
427
+ });
428
+ }
429
+ const ComposedContext = composeContexts(reactContexts);
430
+ return /* @__PURE__ */ React4.createElement(ComposedContext, null, reactRoots.map(({ id, root: Component2 }) => /* @__PURE__ */ React4.createElement(Component2, {
431
+ key: id
432
+ })));
433
+ } finally {
434
+ _effect.f();
435
+ }
436
+ };
437
+ var composeContexts = (contexts) => {
438
+ if (contexts.length === 0) {
439
+ return ({ children }) => /* @__PURE__ */ React4.createElement(React4.Fragment, null, children);
440
+ }
441
+ return topologicalSort(contexts).map(({ context }) => context).reduce((Acc, Next) => ({ children }) => /* @__PURE__ */ React4.createElement(Acc, null, /* @__PURE__ */ React4.createElement(Next, null, children)));
442
+ };
443
+
444
+ // src/react/DefaultFallback.tsx
445
+ import { useSignals as _useSignals5 } from "@preact-signals/safe-react/tracking";
446
+ import React5 from "react";
447
+ var DefaultFallback3 = ({ error }) => {
448
+ var _effect = _useSignals5();
449
+ try {
450
+ return /* @__PURE__ */ React5.createElement("div", {
451
+ style: {
452
+ margin: "1rem",
453
+ padding: "1rem",
454
+ overflow: "hidden",
455
+ border: "4px solid teal",
456
+ borderRadius: "1rem"
457
+ }
458
+ }, /* @__PURE__ */ React5.createElement("h1", {
459
+ style: {
460
+ margin: "0.5rem 0",
461
+ fontSize: "1.2rem"
462
+ }
463
+ }, "ERROR: ", error.message), /* @__PURE__ */ React5.createElement("pre", {
464
+ style: {
465
+ overflow: "auto",
466
+ fontSize: "1rem",
467
+ whiteSpace: "pre-wrap",
468
+ color: "#888888"
469
+ }
470
+ }, error.stack));
471
+ } finally {
472
+ _effect.f();
473
+ }
474
+ };
475
+
476
+ // src/react/useApp.tsx
477
+ var __dxlog_file3 = "/__w/dxos/dxos/packages/sdk/app-framework/src/react/useApp.tsx";
478
+ var ENABLED_KEY = "dxos.org/app-framework/enabled";
479
+ var useApp = ({ pluginManager, pluginLoader: pluginLoaderParam, plugins: pluginsParam, core: coreParam, defaults: defaultsParam, placeholder, fallback = DefaultFallback3, cacheEnabled = false, safeMode = false, debounce = 0 }) => {
480
+ const plugins = useDefaultValue2(pluginsParam, () => []);
481
+ const core = useDefaultValue2(coreParam, () => plugins.map(({ meta }) => meta.id));
482
+ const defaults = useDefaultValue2(defaultsParam, () => []);
483
+ const pluginLoader = useMemo2(() => pluginLoaderParam ?? ((id) => {
484
+ const plugin = plugins.find((plugin2) => plugin2.meta.id === id);
485
+ invariant2(plugin, `Plugin not found: ${id}`, {
486
+ F: __dxlog_file3,
487
+ L: 83,
488
+ S: void 0,
489
+ A: [
490
+ "plugin",
491
+ "`Plugin not found: ${id}`"
492
+ ]
493
+ });
494
+ return plugin;
495
+ }), [
496
+ pluginLoaderParam,
497
+ plugins
498
+ ]);
499
+ const state = useMemo2(() => live({
500
+ ready: false,
501
+ error: null
502
+ }), []);
503
+ const cached = useMemo2(() => JSON.parse(localStorage.getItem(ENABLED_KEY) ?? "[]"), []);
504
+ const enabled = useMemo2(() => safeMode ? [] : cacheEnabled && cached.length > 0 ? cached : defaults, [
505
+ safeMode,
506
+ cacheEnabled,
507
+ cached,
508
+ defaults
509
+ ]);
510
+ const manager = useMemo2(() => pluginManager ?? new PluginManager({
511
+ pluginLoader,
512
+ plugins,
513
+ core,
514
+ enabled
515
+ }), [
516
+ pluginManager,
517
+ pluginLoader,
518
+ plugins,
519
+ core,
520
+ enabled
521
+ ]);
522
+ useEffect2(() => {
523
+ return manager.activation.on(({ event, state: _state, error }) => {
524
+ if (!state.ready && event === Events.Startup.id) {
525
+ state.ready = _state === "activated";
526
+ }
527
+ if (error && !state.ready && !state.error) {
528
+ state.error = error;
529
+ }
530
+ });
531
+ }, [
532
+ manager,
533
+ state
534
+ ]);
535
+ useEffect2(() => {
536
+ effect(() => {
537
+ cacheEnabled && localStorage.setItem(ENABLED_KEY, JSON.stringify(manager.enabled));
538
+ });
539
+ }, [
540
+ cacheEnabled,
541
+ manager
542
+ ]);
543
+ useEffect2(() => {
544
+ setupDevtools(manager);
545
+ }, [
546
+ manager
547
+ ]);
548
+ useAsyncEffect(async () => {
549
+ manager.context.contributeCapability({
550
+ interface: Capabilities.PluginManager,
551
+ implementation: manager,
552
+ module: "dxos.org/app-framework/plugin-manager"
553
+ });
554
+ manager.context.contributeCapability({
555
+ interface: Capabilities.AtomRegistry,
556
+ implementation: manager.registry,
557
+ module: "dxos.org/app-framework/atom-registry"
558
+ });
559
+ await Promise.all([
560
+ // TODO(wittjosiah): Factor out such that this could be called per surface role when attempting to render.
561
+ manager.activate(Events.SetupReactSurface),
562
+ manager.activate(Events.Startup)
563
+ ]);
564
+ return () => {
565
+ manager.context.removeCapability(Capabilities.PluginManager, manager);
566
+ manager.context.removeCapability(Capabilities.AtomRegistry, manager.registry);
567
+ };
568
+ }, [
569
+ manager
570
+ ]);
571
+ return useCallback2(() => /* @__PURE__ */ React6.createElement(ErrorBoundary, {
572
+ fallback
573
+ }, /* @__PURE__ */ React6.createElement(PluginManagerProvider, {
574
+ value: manager
575
+ }, /* @__PURE__ */ React6.createElement(RegistryContext.Provider, {
576
+ value: manager.registry
577
+ }, /* @__PURE__ */ React6.createElement(App, {
578
+ placeholder,
579
+ state,
580
+ debounce
581
+ })))), [
582
+ fallback,
583
+ manager,
584
+ placeholder,
585
+ state
586
+ ]);
587
+ };
588
+ var setupDevtools = (manager) => {
589
+ globalThis.composer ??= {};
590
+ globalThis.composer.manager = manager;
591
+ };
592
+
593
+ // src/react/useIntentResolver.ts
594
+ import { useEffect as useEffect3 } from "react";
595
+ var useIntentResolver = (module, resolver) => {
596
+ const manager = usePluginManager();
597
+ useEffect3(() => {
598
+ manager.context.contributeCapability({
599
+ module,
600
+ interface: Capabilities.IntentResolver,
601
+ implementation: resolver
602
+ });
603
+ return () => manager.context.removeCapability(Capabilities.IntentResolver, resolver);
604
+ }, [
605
+ module,
606
+ resolver
607
+ ]);
608
+ };
609
+
610
+ export {
611
+ usePluginManager,
612
+ PluginManagerProvider,
613
+ useCapabilities,
614
+ useCapability,
615
+ useIntentDispatcher,
616
+ useAppGraph,
617
+ useLayout,
618
+ SurfaceCardRole,
619
+ ErrorBoundary,
620
+ useSurface,
621
+ Surface,
622
+ useSurfaces,
623
+ isSurfaceAvailable,
624
+ useApp,
625
+ useIntentResolver
626
+ };
627
+ //# sourceMappingURL=chunk-256DQP2E.mjs.map