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