@dxos/plugin-explorer 0.8.4-main.3c1ae3b → 0.8.4-main.3fbcb4aa9b

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 (186) hide show
  1. package/dist/lib/neutral/ExplorerContainer-5TOK2ZEY.mjs +40 -0
  2. package/dist/lib/neutral/ExplorerContainer-5TOK2ZEY.mjs.map +7 -0
  3. package/dist/lib/neutral/ExplorerPlugin.mjs +26 -0
  4. package/dist/lib/neutral/ExplorerPlugin.mjs.map +7 -0
  5. package/dist/lib/neutral/capabilities/index.mjs +11 -0
  6. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  7. package/dist/lib/neutral/chunk-5X5ATGCS.mjs +73 -0
  8. package/dist/lib/neutral/chunk-5X5ATGCS.mjs.map +7 -0
  9. package/dist/lib/{browser/chunk-UBHZGWZQ.mjs → neutral/chunk-HPIS2WXY.mjs} +2 -2
  10. package/dist/lib/neutral/chunk-HPIS2WXY.mjs.map +7 -0
  11. package/dist/lib/{browser/chunk-ARBGXQFH.mjs → neutral/components/index.mjs} +341 -156
  12. package/dist/lib/{browser/chunk-ARBGXQFH.mjs.map → neutral/components/index.mjs.map} +4 -4
  13. package/dist/lib/neutral/containers/index.mjs +9 -0
  14. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  15. package/dist/lib/neutral/create-object-F6TKVAGV.mjs +39 -0
  16. package/dist/lib/neutral/create-object-F6TKVAGV.mjs.map +7 -0
  17. package/dist/lib/neutral/hooks/index.mjs +40 -0
  18. package/dist/lib/neutral/hooks/index.mjs.map +7 -0
  19. package/dist/lib/neutral/index.mjs +14 -0
  20. package/dist/lib/neutral/meta.json +1 -0
  21. package/dist/lib/{browser → neutral}/meta.mjs +1 -1
  22. package/dist/lib/neutral/plugin.mjs +12 -0
  23. package/dist/lib/neutral/plugin.mjs.map +7 -0
  24. package/dist/lib/neutral/react-surface-U3JEY7V7.mjs +26 -0
  25. package/dist/lib/neutral/react-surface-U3JEY7V7.mjs.map +7 -0
  26. package/dist/lib/neutral/translations.mjs +33 -0
  27. package/dist/lib/neutral/translations.mjs.map +7 -0
  28. package/dist/lib/{browser → neutral}/types/index.mjs +1 -2
  29. package/dist/types/data/cities.d.ts +4 -4
  30. package/dist/types/data/cities.d.ts.map +1 -1
  31. package/dist/types/data/countries-110m.d.ts +19 -22
  32. package/dist/types/data/countries-110m.d.ts.map +1 -1
  33. package/dist/types/src/ExplorerPlugin.d.ts +3 -1
  34. package/dist/types/src/ExplorerPlugin.d.ts.map +1 -1
  35. package/dist/types/src/ExplorerPlugin.test.d.ts +2 -0
  36. package/dist/types/src/ExplorerPlugin.test.d.ts.map +1 -0
  37. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  38. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  39. package/dist/types/src/capabilities/index.d.ts +8 -2
  40. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  41. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  42. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  43. package/dist/types/src/components/Chart/Chart.d.ts.map +1 -1
  44. package/dist/types/src/components/Chart/Chart.stories.d.ts +4 -1
  45. package/dist/types/src/components/Chart/Chart.stories.d.ts.map +1 -1
  46. package/dist/types/src/components/Globe/Globe.d.ts.map +1 -1
  47. package/dist/types/src/components/Globe/Globe.stories.d.ts +5 -2
  48. package/dist/types/src/components/Globe/Globe.stories.d.ts.map +1 -1
  49. package/dist/types/src/components/Graph/CanvasForceGraph.d.ts +13 -0
  50. package/dist/types/src/components/Graph/CanvasForceGraph.d.ts.map +1 -0
  51. package/dist/types/src/components/Graph/CanvasForceGraph.stories.d.ts +17 -0
  52. package/dist/types/src/components/Graph/CanvasForceGraph.stories.d.ts.map +1 -0
  53. package/dist/types/src/components/Graph/ForceGraph.d.ts +12 -5
  54. package/dist/types/src/components/Graph/ForceGraph.d.ts.map +1 -1
  55. package/dist/types/src/components/Graph/ForceGraph.stories.d.ts +4 -2
  56. package/dist/types/src/components/Graph/ForceGraph.stories.d.ts.map +1 -1
  57. package/dist/types/src/components/Graph/{adapter.d.ts → graph-adapter.d.ts} +2 -2
  58. package/dist/types/src/components/Graph/graph-adapter.d.ts.map +1 -0
  59. package/dist/types/src/components/Graph/index.d.ts +1 -1
  60. package/dist/types/src/components/Graph/index.d.ts.map +1 -1
  61. package/dist/types/src/components/Graph/testing.d.ts.map +1 -1
  62. package/dist/types/src/components/Tree/Tree.d.ts.map +1 -1
  63. package/dist/types/src/components/Tree/Tree.stories.d.ts +5 -1
  64. package/dist/types/src/components/Tree/Tree.stories.d.ts.map +1 -1
  65. package/dist/types/src/components/Tree/layout/HierarchicalEdgeBundling.d.ts.map +1 -1
  66. package/dist/types/src/components/Tree/layout/RadialTree.d.ts.map +1 -1
  67. package/dist/types/src/components/Tree/layout/TidyTree.d.ts.map +1 -1
  68. package/dist/types/src/components/Tree/testing/generator.d.ts.map +1 -1
  69. package/dist/types/src/components/Tree/types/tree.d.ts +18 -16
  70. package/dist/types/src/components/Tree/types/tree.d.ts.map +1 -1
  71. package/dist/types/src/components/Tree/types/types.d.ts +1 -1
  72. package/dist/types/src/components/Tree/types/types.d.ts.map +1 -1
  73. package/dist/types/src/components/index.d.ts +0 -2
  74. package/dist/types/src/components/index.d.ts.map +1 -1
  75. package/dist/types/src/components/plot.d.ts.map +1 -1
  76. package/dist/types/src/containers/ExplorerContainer/ExplorerContainer.d.ts +6 -0
  77. package/dist/types/src/containers/ExplorerContainer/ExplorerContainer.d.ts.map +1 -0
  78. package/dist/types/src/containers/ExplorerContainer/index.d.ts +2 -0
  79. package/dist/types/src/containers/ExplorerContainer/index.d.ts.map +1 -0
  80. package/dist/types/src/containers/index.d.ts +3 -0
  81. package/dist/types/src/containers/index.d.ts.map +1 -0
  82. package/dist/types/src/hooks/useGraphModel.d.ts.map +1 -1
  83. package/dist/types/src/index.d.ts +1 -3
  84. package/dist/types/src/index.d.ts.map +1 -1
  85. package/dist/types/src/meta.d.ts +2 -2
  86. package/dist/types/src/meta.d.ts.map +1 -1
  87. package/dist/types/src/plugin.d.ts +3 -0
  88. package/dist/types/src/plugin.d.ts.map +1 -0
  89. package/dist/types/src/translations.d.ts +29 -27
  90. package/dist/types/src/translations.d.ts.map +1 -1
  91. package/dist/types/src/types/ExplorerAction.d.ts +0 -17
  92. package/dist/types/src/types/ExplorerAction.d.ts.map +1 -1
  93. package/dist/types/src/types/Graph.d.ts +10 -19
  94. package/dist/types/src/types/Graph.d.ts.map +1 -1
  95. package/dist/types/tsconfig.tsbuildinfo +1 -1
  96. package/package.json +107 -61
  97. package/src/ExplorerPlugin.test.ts +26 -0
  98. package/src/ExplorerPlugin.tsx +15 -45
  99. package/src/capabilities/create-object.ts +36 -0
  100. package/src/capabilities/index.ts +3 -3
  101. package/src/capabilities/react-surface.tsx +24 -18
  102. package/src/components/Chart/Chart.stories.tsx +16 -23
  103. package/src/components/Globe/Globe.stories.tsx +19 -22
  104. package/src/components/Graph/CanvasForceGraph.stories.tsx +83 -0
  105. package/src/components/Graph/CanvasForceGraph.tsx +124 -0
  106. package/src/components/Graph/ForceGraph.stories.tsx +78 -43
  107. package/src/components/Graph/ForceGraph.tsx +104 -85
  108. package/src/components/Graph/{adapter.ts → graph-adapter.ts} +14 -8
  109. package/src/components/Graph/index.ts +1 -1
  110. package/src/components/Graph/testing.ts +3 -3
  111. package/src/components/Tree/Tree.stories.tsx +44 -36
  112. package/src/components/Tree/Tree.tsx +8 -3
  113. package/src/components/Tree/testing/generator.ts +4 -2
  114. package/src/components/Tree/types/tree.test.ts +5 -4
  115. package/src/components/Tree/types/tree.ts +41 -20
  116. package/src/components/Tree/types/types.ts +1 -1
  117. package/src/components/index.ts +0 -4
  118. package/src/containers/ExplorerContainer/ExplorerContainer.tsx +51 -0
  119. package/src/containers/ExplorerContainer/index.ts +5 -0
  120. package/src/containers/index.ts +7 -0
  121. package/src/hooks/useGraphModel.ts +17 -10
  122. package/src/index.ts +1 -4
  123. package/src/meta.ts +3 -3
  124. package/src/plugin.ts +9 -0
  125. package/src/translations.ts +14 -13
  126. package/src/types/ExplorerAction.ts +1 -18
  127. package/src/types/Graph.ts +14 -28
  128. package/src/typings.d.ts +8 -0
  129. package/dist/lib/browser/ExplorerContainer-NOLLVUTE.mjs +0 -50
  130. package/dist/lib/browser/ExplorerContainer-NOLLVUTE.mjs.map +0 -7
  131. package/dist/lib/browser/chunk-2MKBRIUT.mjs +0 -31
  132. package/dist/lib/browser/chunk-2MKBRIUT.mjs.map +0 -7
  133. package/dist/lib/browser/chunk-6BVXZQPP.mjs +0 -188
  134. package/dist/lib/browser/chunk-6BVXZQPP.mjs.map +0 -7
  135. package/dist/lib/browser/chunk-P6FFFVPM.mjs +0 -100
  136. package/dist/lib/browser/chunk-P6FFFVPM.mjs.map +0 -7
  137. package/dist/lib/browser/chunk-UBHZGWZQ.mjs.map +0 -7
  138. package/dist/lib/browser/index.mjs +0 -112
  139. package/dist/lib/browser/index.mjs.map +0 -7
  140. package/dist/lib/browser/intent-resolver-XAMO4BLV.mjs +0 -32
  141. package/dist/lib/browser/intent-resolver-XAMO4BLV.mjs.map +0 -7
  142. package/dist/lib/browser/meta.json +0 -1
  143. package/dist/lib/browser/react-surface-BY2DYCTH.mjs +0 -34
  144. package/dist/lib/browser/react-surface-BY2DYCTH.mjs.map +0 -7
  145. package/dist/lib/node-esm/ExplorerContainer-N3S5KSUX.mjs +0 -51
  146. package/dist/lib/node-esm/ExplorerContainer-N3S5KSUX.mjs.map +0 -7
  147. package/dist/lib/node-esm/chunk-3ODK27PU.mjs +0 -33
  148. package/dist/lib/node-esm/chunk-3ODK27PU.mjs.map +0 -7
  149. package/dist/lib/node-esm/chunk-4BY2XZET.mjs +0 -101
  150. package/dist/lib/node-esm/chunk-4BY2XZET.mjs.map +0 -7
  151. package/dist/lib/node-esm/chunk-CRSVAZNA.mjs +0 -190
  152. package/dist/lib/node-esm/chunk-CRSVAZNA.mjs.map +0 -7
  153. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +0 -11
  154. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +0 -7
  155. package/dist/lib/node-esm/chunk-NPIP4VEH.mjs +0 -11091
  156. package/dist/lib/node-esm/chunk-NPIP4VEH.mjs.map +0 -7
  157. package/dist/lib/node-esm/chunk-UXZM5VJB.mjs +0 -26
  158. package/dist/lib/node-esm/chunk-UXZM5VJB.mjs.map +0 -7
  159. package/dist/lib/node-esm/index.mjs +0 -113
  160. package/dist/lib/node-esm/index.mjs.map +0 -7
  161. package/dist/lib/node-esm/intent-resolver-YNS4MM2C.mjs +0 -33
  162. package/dist/lib/node-esm/intent-resolver-YNS4MM2C.mjs.map +0 -7
  163. package/dist/lib/node-esm/meta.json +0 -1
  164. package/dist/lib/node-esm/meta.mjs +0 -9
  165. package/dist/lib/node-esm/meta.mjs.map +0 -7
  166. package/dist/lib/node-esm/react-surface-7AAV7GBG.mjs +0 -35
  167. package/dist/lib/node-esm/react-surface-7AAV7GBG.mjs.map +0 -7
  168. package/dist/lib/node-esm/types/index.mjs +0 -12
  169. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  170. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  171. package/dist/types/src/components/ExplorerContainer.d.ts +0 -9
  172. package/dist/types/src/components/ExplorerContainer.d.ts.map +0 -1
  173. package/dist/types/src/components/Graph/D3ForceGraph.d.ts +0 -14
  174. package/dist/types/src/components/Graph/D3ForceGraph.d.ts.map +0 -1
  175. package/dist/types/src/components/Graph/D3ForceGraph.stories.d.ts +0 -15
  176. package/dist/types/src/components/Graph/D3ForceGraph.stories.d.ts.map +0 -1
  177. package/dist/types/src/components/Graph/adapter.d.ts.map +0 -1
  178. package/src/capabilities/intent-resolver.ts +0 -21
  179. package/src/components/ExplorerContainer.tsx +0 -54
  180. package/src/components/Graph/D3ForceGraph.stories.tsx +0 -80
  181. package/src/components/Graph/D3ForceGraph.tsx +0 -101
  182. /package/dist/lib/{browser → neutral}/chunk-J5LGTIGS.mjs +0 -0
  183. /package/dist/lib/{browser → neutral}/chunk-J5LGTIGS.mjs.map +0 -0
  184. /package/dist/lib/{browser/types → neutral}/index.mjs.map +0 -0
  185. /package/dist/lib/{browser → neutral}/meta.mjs.map +0 -0
  186. /package/dist/lib/{node-esm → neutral}/types/index.mjs.map +0 -0
@@ -1,5 +1,6 @@
1
+ import "../chunk-J5LGTIGS.mjs";
2
+
1
3
  // src/components/Chart/Chart.tsx
2
- import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
3
4
  import * as Plot from "@observablehq/plot";
4
5
  import React, { useEffect } from "react";
5
6
  import { useResizeDetector } from "react-resize-detector";
@@ -17,49 +18,43 @@ var defaultOptions = {
17
18
  fillOpacity: 0.2
18
19
  };
19
20
  var Chart = ({ items = [], accessor, options = defaultOptions }) => {
20
- var _effect = _useSignals();
21
- try {
22
- const { ref: containerRef, width = 0, height = 0 } = useResizeDetector({
23
- refreshRate: 200
24
- });
25
- useEffect(() => {
26
- if (!width || !height) {
27
- return;
28
- }
29
- const plot3 = Plot.plot({
30
- grid: true,
31
- width,
32
- height,
33
- style: {
34
- background: "transparent"
35
- },
36
- marks: [
37
- Plot.frame(),
38
- Plot.dot(items, {
39
- x: createAdapter("x", accessor),
40
- y: createAdapter("y", accessor),
41
- ...options
42
- })
43
- ]
44
- });
45
- containerRef.current.append(plot3);
46
- return () => plot3?.remove();
47
- }, [
48
- items,
21
+ const { ref: containerRef, width = 0, height = 0 } = useResizeDetector({
22
+ refreshRate: 200
23
+ });
24
+ useEffect(() => {
25
+ if (!width || !height) {
26
+ return;
27
+ }
28
+ const plot3 = Plot.plot({
29
+ grid: true,
49
30
  width,
50
- height
51
- ]);
52
- return /* @__PURE__ */ React.createElement("div", {
53
- ref: containerRef,
54
- className: "grow"
31
+ height,
32
+ style: {
33
+ background: "transparent"
34
+ },
35
+ marks: [
36
+ Plot.frame(),
37
+ Plot.dot(items, {
38
+ x: createAdapter("x", accessor),
39
+ y: createAdapter("y", accessor),
40
+ ...options
41
+ })
42
+ ]
55
43
  });
56
- } finally {
57
- _effect.f();
58
- }
44
+ containerRef.current.append(plot3);
45
+ return () => plot3?.remove();
46
+ }, [
47
+ items,
48
+ width,
49
+ height
50
+ ]);
51
+ return /* @__PURE__ */ React.createElement("div", {
52
+ ref: containerRef,
53
+ className: "grow"
54
+ });
59
55
  };
60
56
 
61
57
  // src/components/Globe/Globe.tsx
62
- import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
63
58
  import * as Plot2 from "@observablehq/plot";
64
59
  import React2, { useEffect as useEffect2 } from "react";
65
60
  import { useResizeDetector as useResizeDetector2 } from "react-resize-detector";
@@ -10773,70 +10768,265 @@ var defaultOptions2 = {
10773
10768
  fill: "#003300"
10774
10769
  };
10775
10770
  var Globe = ({ items = [], accessor, projection = "orthographic", options = defaultOptions2 }) => {
10776
- var _effect = _useSignals2();
10777
- try {
10778
- const { ref: containerRef, width = 0, height = 0 } = useResizeDetector2({
10779
- refreshRate: 200
10780
- });
10781
- const land = topojson.feature(countries_110m_default, countries_110m_default.objects.land);
10782
- useEffect2(() => {
10783
- if (!width || !height) {
10784
- return;
10785
- }
10786
- const plot3 = Plot2.plot({
10787
- // https://observablehq.com/plot/features/projections
10788
- projection: {
10789
- type: projection,
10790
- rotate: [
10791
- -100,
10792
- -20
10793
- ]
10794
- },
10795
- // projection: { type: 'equirectangular', rotate: [-140, -30] },
10796
- width,
10797
- height,
10798
- style: {
10799
- background: "transparent"
10800
- },
10801
- // TODO(burdon): Create simple wrapper for Plot with good defaults.
10802
- marks: [
10803
- Plot2.sphere({
10804
- fill: "lightblue",
10805
- fillOpacity: 0.5
10806
- }),
10807
- Plot2.geo(land, {
10808
- fill: "darkgreen",
10809
- fillOpacity: 0.5
10810
- }),
10811
- Plot2.graticule(),
10812
- Plot2.dot(items, {
10813
- x: createAdapter("lat", accessor),
10814
- y: createAdapter("lng", accessor),
10815
- ...options
10816
- })
10771
+ const { ref: containerRef, width = 0, height = 0 } = useResizeDetector2({
10772
+ refreshRate: 200
10773
+ });
10774
+ const land = topojson.feature(countries_110m_default, countries_110m_default.objects.land);
10775
+ useEffect2(() => {
10776
+ if (!width || !height) {
10777
+ return;
10778
+ }
10779
+ const plot3 = Plot2.plot({
10780
+ // https://observablehq.com/plot/features/projections
10781
+ projection: {
10782
+ type: projection,
10783
+ rotate: [
10784
+ -100,
10785
+ -20
10817
10786
  ]
10818
- });
10819
- containerRef.current.append(plot3);
10820
- return () => plot3?.remove();
10821
- }, [
10822
- items,
10787
+ },
10788
+ // projection: { type: 'equirectangular', rotate: [-140, -30] },
10823
10789
  width,
10824
- height
10825
- ]);
10826
- return /* @__PURE__ */ React2.createElement("div", {
10827
- ref: containerRef,
10828
- className: "grow p-4"
10790
+ height,
10791
+ style: {
10792
+ background: "transparent"
10793
+ },
10794
+ // TODO(burdon): Create simple wrapper for Plot with good defaults.
10795
+ marks: [
10796
+ Plot2.sphere({
10797
+ fill: "lightblue",
10798
+ fillOpacity: 0.5
10799
+ }),
10800
+ Plot2.geo(land, {
10801
+ fill: "darkgreen",
10802
+ fillOpacity: 0.5
10803
+ }),
10804
+ Plot2.graticule(),
10805
+ Plot2.dot(items, {
10806
+ x: createAdapter("lat", accessor),
10807
+ y: createAdapter("lng", accessor),
10808
+ ...options
10809
+ })
10810
+ ]
10829
10811
  });
10830
- } finally {
10831
- _effect.f();
10812
+ containerRef.current.append(plot3);
10813
+ return () => plot3?.remove();
10814
+ }, [
10815
+ items,
10816
+ width,
10817
+ height
10818
+ ]);
10819
+ return /* @__PURE__ */ React2.createElement("div", {
10820
+ ref: containerRef,
10821
+ className: "grow p-4"
10822
+ });
10823
+ };
10824
+
10825
+ // src/components/Graph/CanvasForceGraph.tsx
10826
+ import { forceLink, forceManyBody } from "d3";
10827
+ import NativeForceGraph from "force-graph";
10828
+ import React3, { useCallback, useEffect as useEffect3, useRef, useState } from "react";
10829
+ import { useResizeDetector as useResizeDetector3 } from "react-resize-detector";
10830
+ import { composable, composableProps } from "@dxos/ui-theme";
10831
+
10832
+ // src/components/Graph/graph-adapter.ts
10833
+ var GraphAdapter = class {
10834
+ graph;
10835
+ _nodes = [];
10836
+ _links = [];
10837
+ constructor(graph) {
10838
+ this.graph = graph;
10839
+ this._nodes = graph.nodes.map((node) => ({
10840
+ id: node.id,
10841
+ type: node.type,
10842
+ data: node.data
10843
+ }));
10844
+ const nodeIds = new Set(this._nodes.map((node) => node.id));
10845
+ this._links = graph.edges.filter((edge) => nodeIds.has(edge.source) && nodeIds.has(edge.target)).map((edge) => ({
10846
+ type: edge.type,
10847
+ source: edge.source,
10848
+ target: edge.target,
10849
+ data: edge.data
10850
+ }));
10851
+ }
10852
+ get nodes() {
10853
+ return this._nodes;
10854
+ }
10855
+ get links() {
10856
+ return this._links;
10832
10857
  }
10833
10858
  };
10834
10859
 
10860
+ // src/components/Graph/CanvasForceGraph.tsx
10861
+ var CanvasForceGraph = composable(({ model, match, onClick, ...props }, forwardedRef) => {
10862
+ const { ref: resizeRef, width, height } = useResizeDetector3({
10863
+ refreshRate: 200
10864
+ });
10865
+ const setRef = useCallback((node) => {
10866
+ resizeRef(node);
10867
+ assignRef(forwardedRef, node);
10868
+ }, [
10869
+ resizeRef,
10870
+ forwardedRef
10871
+ ]);
10872
+ const rootRef = useRef(null);
10873
+ const forceGraph = useRef(null);
10874
+ const [data, setData] = useState();
10875
+ useEffect3(() => {
10876
+ return model?.subscribe((model2) => setData(new GraphAdapter(model2.graph)));
10877
+ }, [
10878
+ model
10879
+ ]);
10880
+ useEffect3(() => {
10881
+ if (rootRef.current) {
10882
+ forceGraph.current = new NativeForceGraph(rootRef.current).nodeRelSize(6).nodeLabel((node) => node.type === "schema" ? node.data.typename : node.data.label ?? node.id).nodeAutoColorBy((node) => node.type === "schema" ? "schema" : node.data.typename).linkAutoColorBy((link2) => link2.type);
10883
+ }
10884
+ return () => {
10885
+ forceGraph.current?.pauseAnimation().graphData({
10886
+ nodes: [],
10887
+ links: []
10888
+ });
10889
+ forceGraph.current = null;
10890
+ };
10891
+ }, []);
10892
+ useEffect3(() => {
10893
+ if (!data || !width || !height || !forceGraph.current) {
10894
+ return;
10895
+ }
10896
+ forceGraph.current.pauseAnimation().width(width).height(height).onEngineStop(() => handleZoomToFit()).onNodeClick((node) => {
10897
+ forceGraph.current?.emitParticle(node);
10898
+ }).d3Force("link", forceLink().distance(160).strength(0.5)).d3Force("charge", forceManyBody().strength(-30)).graphData(data).warmupTicks(100).cooldownTime(1e3).resumeAnimation();
10899
+ }, [
10900
+ data,
10901
+ width,
10902
+ height
10903
+ ]);
10904
+ const handleZoomToFit = () => {
10905
+ forceGraph.current?.zoomToFit(400, 40);
10906
+ };
10907
+ const handleClick = useCallback((event) => {
10908
+ onClick?.(event);
10909
+ if (!event.defaultPrevented) {
10910
+ handleZoomToFit();
10911
+ }
10912
+ }, [
10913
+ onClick
10914
+ ]);
10915
+ return /* @__PURE__ */ React3.createElement("div", {
10916
+ ...composableProps(props, {
10917
+ classNames: "relative grow"
10918
+ }),
10919
+ onClick: handleClick,
10920
+ ref: setRef
10921
+ }, /* @__PURE__ */ React3.createElement("div", {
10922
+ ref: rootRef,
10923
+ className: "absolute inset-0"
10924
+ }));
10925
+ });
10926
+ var assignRef = (ref, value) => {
10927
+ if (typeof ref === "function") {
10928
+ ref(value);
10929
+ } else if (ref) {
10930
+ ref.current = value;
10931
+ }
10932
+ };
10933
+
10934
+ // src/components/Graph/ForceGraph.tsx
10935
+ import { Atom, useAtomValue } from "@effect-atom/atom-react";
10936
+ import React4, { useCallback as useCallback2, useEffect as useEffect4, useMemo, useRef as useRef2, useState as useState2 } from "react";
10937
+ import { Obj } from "@dxos/echo";
10938
+ import { SelectionModel } from "@dxos/graph";
10939
+ import { GraphForceProjector, SVG } from "@dxos/react-ui-graph";
10940
+ import { composable as composable2, composableProps as composableProps2, getHashStyles } from "@dxos/ui-theme";
10941
+ import "@dxos/react-ui-graph/styles/graph.css";
10942
+ var EMPTY_ATOM = Atom.make({
10943
+ nodes: [],
10944
+ edges: []
10945
+ });
10946
+ var ForceGraph = composable2(({ model, selection: selectionProp, grid, drag, onInspect, ...props }, forwardedRef) => {
10947
+ useAtomValue(model?.graphAtom ?? EMPTY_ATOM);
10948
+ const graph = useRef2(null);
10949
+ const selection = useMemo(() => selectionProp ?? new SelectionModel(), [
10950
+ selectionProp
10951
+ ]);
10952
+ useEffect4(() => {
10953
+ const unsubscribe = selection.subscribe(() => graph.current?.repaint());
10954
+ return unsubscribe;
10955
+ }, [
10956
+ selection
10957
+ ]);
10958
+ const svgRef = useRef2(null);
10959
+ const [projector, setProjector] = useState2();
10960
+ useEffect4(() => {
10961
+ if (svgRef.current) {
10962
+ setProjector(new GraphForceProjector(svgRef.current, {
10963
+ attributes: {
10964
+ // TODO(burdon): Check type (currently assumes Employee property).
10965
+ // Edge shouldn't contribute to force if it's not active.
10966
+ linkForce: (edge) => edge.data?.object?.active !== false
10967
+ },
10968
+ forces: {
10969
+ point: {
10970
+ strength: 0.01
10971
+ }
10972
+ }
10973
+ }));
10974
+ }
10975
+ }, []);
10976
+ const handleSelect = useCallback2((node) => {
10977
+ if (selection.contains(node.id)) {
10978
+ selection.remove(node.id);
10979
+ } else {
10980
+ selection.add(node.id);
10981
+ }
10982
+ }, [
10983
+ selection
10984
+ ]);
10985
+ return /* @__PURE__ */ React4.createElement("div", {
10986
+ ...composableProps2(props, {
10987
+ classNames: "dx-container"
10988
+ }),
10989
+ ref: forwardedRef
10990
+ }, /* @__PURE__ */ React4.createElement(SVG.Root, {
10991
+ ref: svgRef
10992
+ }, /* @__PURE__ */ React4.createElement(SVG.Markers, null), grid && /* @__PURE__ */ React4.createElement(SVG.Grid, {
10993
+ axis: true
10994
+ }), /* @__PURE__ */ React4.createElement(SVG.Zoom, {
10995
+ extent: [
10996
+ 1 / 2,
10997
+ 2
10998
+ ]
10999
+ }, /* @__PURE__ */ React4.createElement(SVG.Graph, {
11000
+ drag,
11001
+ ref: graph,
11002
+ model,
11003
+ projector,
11004
+ labels: {
11005
+ text: (node) => node.data?.data.label ?? node.id
11006
+ },
11007
+ attributes: {
11008
+ node: (node) => {
11009
+ const obj = node.data?.data.object;
11010
+ return {
11011
+ data: {
11012
+ color: getHashStyles(obj && Obj.getTypename(obj))?.hue
11013
+ },
11014
+ classes: {
11015
+ "dx-selected": selection.contains(node.id)
11016
+ }
11017
+ };
11018
+ }
11019
+ },
11020
+ onSelect: handleSelect,
11021
+ onInspect
11022
+ }))));
11023
+ });
11024
+
10835
11025
  // src/components/Tree/Tree.tsx
10836
- import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
10837
- import React3, { useEffect as useEffect3, useRef, useState } from "react";
11026
+ import { RegistryContext } from "@effect-atom/atom-react";
11027
+ import React5, { useContext, useEffect as useEffect5, useRef as useRef3, useState as useState3 } from "react";
10838
11028
  import { useAsyncState } from "@dxos/react-ui";
10839
- import { SVG } from "@dxos/react-ui-graph";
11029
+ import { SVG as SVG2 } from "@dxos/react-ui-graph";
10840
11030
  import { SpaceGraphModel } from "@dxos/schema";
10841
11031
 
10842
11032
  // src/components/Tree/layout/HierarchicalEdgeBundling.ts
@@ -10974,7 +11164,8 @@ var TidyTree_default = TidyTree;
10974
11164
 
10975
11165
  // src/components/Tree/types/tree.ts
10976
11166
  import * as Schema from "effect/Schema";
10977
- import { Key, Obj, Type } from "@dxos/echo";
11167
+ import { Key, Obj as Obj2, Ref, Type } from "@dxos/echo";
11168
+ import { TestSchema } from "@dxos/echo/testing";
10978
11169
  import { invariant } from "@dxos/invariant";
10979
11170
  var TreeNodeType = Schema.Struct({
10980
11171
  id: Key.ObjectId,
@@ -10983,7 +11174,7 @@ var TreeNodeType = Schema.Struct({
10983
11174
  key: Schema.String,
10984
11175
  value: Schema.Any
10985
11176
  })),
10986
- ref: Schema.optional(Type.Ref(Type.Expando))
11177
+ ref: Schema.optional(Ref.Ref(TestSchema.Expando))
10987
11178
  }).pipe(Schema.mutable);
10988
11179
  var TreeType = Schema.Struct({
10989
11180
  root: Key.ObjectId,
@@ -10991,8 +11182,8 @@ var TreeType = Schema.Struct({
10991
11182
  key: Key.ObjectId,
10992
11183
  value: TreeNodeType
10993
11184
  }))
10994
- }).pipe(Type.Obj({
10995
- typename: "dxos.org/type/Tree",
11185
+ }).pipe(Type.object({
11186
+ typename: "org.dxos.type.tree",
10996
11187
  version: "0.1.0"
10997
11188
  }));
10998
11189
 
@@ -11023,67 +11214,61 @@ var renderers = /* @__PURE__ */ new Map([
11023
11214
  ]
11024
11215
  ]);
11025
11216
  var Tree = ({ space, selected, variant = "tidy", onNodeClick }) => {
11026
- var _effect = _useSignals3();
11027
- try {
11028
- const [model] = useAsyncState(async () => space ? new SpaceGraphModel().open(space) : void 0, [
11029
- space,
11030
- selected
11031
- ]);
11032
- const [tree3, setTree] = useState();
11033
- useEffect3(() => {
11034
- return model?.subscribe(() => {
11035
- const tree4 = mapGraphToTreeData(model);
11036
- setTree(tree4);
11037
- }, true);
11038
- }, [
11039
- model
11040
- ]);
11041
- const context = useRef(null);
11042
- useEffect3(() => {
11043
- if (context.current?.size) {
11044
- const { width, height } = context.current.size;
11045
- const size = Math.min(width, height);
11046
- const radius = size * 0.4;
11047
- const options = {
11048
- // TODO(burdon): Type.
11049
- label: (d) => d.label ?? d.id,
11050
- width,
11051
- height,
11052
- radius,
11053
- marginLeft: (width - radius * 2) / 2,
11054
- marginRight: (width - radius * 2) / 2,
11055
- marginTop: (height - radius * 2) / 2,
11056
- marginBottom: (height - radius * 2) / 2,
11057
- slots: defaultTreeLayoutSlots
11058
- };
11059
- if (tree3) {
11060
- const renderer = renderers.get(variant);
11061
- renderer?.(context.current.svg, tree3, options);
11062
- }
11217
+ const registry = useContext(RegistryContext);
11218
+ const [model] = useAsyncState(async () => space ? new SpaceGraphModel(registry).open(space.db) : void 0, [
11219
+ space,
11220
+ selected,
11221
+ registry
11222
+ ]);
11223
+ const [tree3, setTree] = useState3();
11224
+ useEffect5(() => {
11225
+ return model?.subscribe(() => {
11226
+ const tree4 = mapGraphToTreeData(model);
11227
+ setTree(tree4);
11228
+ }, true);
11229
+ }, [
11230
+ model
11231
+ ]);
11232
+ const context = useRef3(null);
11233
+ useEffect5(() => {
11234
+ if (context.current?.size) {
11235
+ const { width, height } = context.current.size;
11236
+ const size = Math.min(width, height);
11237
+ const radius = size * 0.4;
11238
+ const options = {
11239
+ // TODO(burdon): Type.
11240
+ label: (d) => d.label ?? d.id,
11241
+ width,
11242
+ height,
11243
+ radius,
11244
+ marginLeft: (width - radius * 2) / 2,
11245
+ marginRight: (width - radius * 2) / 2,
11246
+ marginTop: (height - radius * 2) / 2,
11247
+ marginBottom: (height - radius * 2) / 2,
11248
+ slots: defaultTreeLayoutSlots
11249
+ };
11250
+ if (tree3) {
11251
+ const renderer = renderers.get(variant);
11252
+ renderer?.(context.current.svg, tree3, options);
11063
11253
  }
11064
- }, [
11065
- context.current,
11066
- tree3
11067
- ]);
11068
- return /* @__PURE__ */ React3.createElement("div", {
11069
- onClick: () => onNodeClick?.()
11070
- }, /* @__PURE__ */ React3.createElement(SVG.Root, {
11071
- ref: context
11072
- }));
11073
- } finally {
11074
- _effect.f();
11075
- }
11254
+ }
11255
+ }, [
11256
+ context.current,
11257
+ tree3
11258
+ ]);
11259
+ return /* @__PURE__ */ React5.createElement("div", {
11260
+ className: "grow",
11261
+ onClick: () => onNodeClick?.()
11262
+ }, /* @__PURE__ */ React5.createElement(SVG2.Root, {
11263
+ ref: context
11264
+ }));
11076
11265
  };
11077
-
11078
- // src/components/index.ts
11079
- import { lazy } from "react";
11080
- var ExplorerContainer = lazy(() => import("./ExplorerContainer-NOLLVUTE.mjs"));
11081
-
11082
11266
  export {
11267
+ CanvasForceGraph,
11083
11268
  Chart,
11269
+ ForceGraph,
11084
11270
  Globe,
11085
- defaultTreeLayoutSlots,
11086
11271
  Tree,
11087
- ExplorerContainer
11272
+ defaultTreeLayoutSlots
11088
11273
  };
11089
- //# sourceMappingURL=chunk-ARBGXQFH.mjs.map
11274
+ //# sourceMappingURL=index.mjs.map