@dxos/plugin-explorer 0.8.4-main.c1de068 → 0.8.4-main.c351d160a8

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 (160) hide show
  1. package/dist/lib/browser/ExplorerContainer-JBCVWH3M.mjs +48 -0
  2. package/dist/lib/browser/ExplorerContainer-JBCVWH3M.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-6KEHUEEZ.mjs +71 -0
  4. package/dist/lib/browser/chunk-6KEHUEEZ.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  6. package/dist/lib/browser/chunk-J5LGTIGS.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-LSUP47BZ.mjs +24 -0
  8. package/dist/lib/browser/chunk-LSUP47BZ.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-PVFZFKQ6.mjs → chunk-WX7QIZMF.mjs} +345 -396
  10. package/dist/lib/{node-esm/chunk-S5A2EUSJ.mjs.map → browser/chunk-WX7QIZMF.mjs.map} +4 -4
  11. package/dist/lib/browser/index.mjs +56 -71
  12. package/dist/lib/browser/index.mjs.map +4 -4
  13. package/dist/lib/browser/meta.json +1 -1
  14. package/dist/lib/browser/meta.mjs +2 -3
  15. package/dist/lib/browser/react-surface-4ZMQAZRT.mjs +38 -0
  16. package/dist/lib/browser/react-surface-4ZMQAZRT.mjs.map +7 -0
  17. package/dist/lib/browser/types/index.mjs +6 -6
  18. package/dist/lib/node-esm/ExplorerContainer-5JTSMOCL.mjs +49 -0
  19. package/dist/lib/node-esm/ExplorerContainer-5JTSMOCL.mjs.map +7 -0
  20. package/dist/lib/node-esm/{chunk-S5A2EUSJ.mjs → chunk-3Z2WBI3N.mjs} +345 -396
  21. package/dist/lib/{browser/chunk-PVFZFKQ6.mjs.map → node-esm/chunk-3Z2WBI3N.mjs.map} +4 -4
  22. package/dist/lib/node-esm/{chunk-PIAXA43R.mjs → chunk-EN3JZNEY.mjs} +8 -5
  23. package/dist/lib/node-esm/chunk-EN3JZNEY.mjs.map +7 -0
  24. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  25. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  26. package/dist/lib/node-esm/chunk-WSE2Z4OT.mjs +72 -0
  27. package/dist/lib/node-esm/chunk-WSE2Z4OT.mjs.map +7 -0
  28. package/dist/lib/node-esm/index.mjs +56 -71
  29. package/dist/lib/node-esm/index.mjs.map +4 -4
  30. package/dist/lib/node-esm/meta.json +1 -1
  31. package/dist/lib/node-esm/meta.mjs +2 -3
  32. package/dist/lib/node-esm/react-surface-SDDTZDSI.mjs +39 -0
  33. package/dist/lib/node-esm/react-surface-SDDTZDSI.mjs.map +7 -0
  34. package/dist/lib/node-esm/types/index.mjs +6 -6
  35. package/dist/types/src/ExplorerPlugin.d.ts +2 -1
  36. package/dist/types/src/ExplorerPlugin.d.ts.map +1 -1
  37. package/dist/types/src/capabilities/index.d.ts +1 -2
  38. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  39. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  40. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  41. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  42. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  43. package/dist/types/src/components/Chart/Chart.d.ts.map +1 -1
  44. package/dist/types/src/components/Chart/Chart.stories.d.ts +8 -4
  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 +8 -4
  48. package/dist/types/src/components/Globe/Globe.stories.d.ts.map +1 -1
  49. package/dist/types/src/components/Graph/D3ForceGraph.d.ts +3 -3
  50. package/dist/types/src/components/Graph/D3ForceGraph.d.ts.map +1 -1
  51. package/dist/types/src/components/Graph/D3ForceGraph.stories.d.ts +13 -4
  52. package/dist/types/src/components/Graph/D3ForceGraph.stories.d.ts.map +1 -1
  53. package/dist/types/src/components/Graph/ForceGraph.stories.d.ts +13 -4
  54. package/dist/types/src/components/Graph/ForceGraph.stories.d.ts.map +1 -1
  55. package/dist/types/src/components/Graph/adapter.d.ts +1 -1
  56. package/dist/types/src/components/Graph/adapter.d.ts.map +1 -1
  57. package/dist/types/src/components/Graph/testing.d.ts +1 -1
  58. package/dist/types/src/components/Graph/testing.d.ts.map +1 -1
  59. package/dist/types/src/components/Tree/Tree.d.ts.map +1 -1
  60. package/dist/types/src/components/Tree/Tree.stories.d.ts +13 -16
  61. package/dist/types/src/components/Tree/Tree.stories.d.ts.map +1 -1
  62. package/dist/types/src/components/Tree/testing/generator.d.ts.map +1 -1
  63. package/dist/types/src/components/Tree/types/tree.d.ts +19 -17
  64. package/dist/types/src/components/Tree/types/tree.d.ts.map +1 -1
  65. package/dist/types/src/components/Tree/types/types.d.ts +1 -1
  66. package/dist/types/src/components/Tree/types/types.d.ts.map +1 -1
  67. package/dist/types/src/components/index.d.ts +0 -4
  68. package/dist/types/src/components/index.d.ts.map +1 -1
  69. package/dist/types/src/containers/ExplorerContainer/ExplorerContainer.d.ts +6 -0
  70. package/dist/types/src/containers/ExplorerContainer/ExplorerContainer.d.ts.map +1 -0
  71. package/dist/types/src/containers/ExplorerContainer/index.d.ts +3 -0
  72. package/dist/types/src/containers/ExplorerContainer/index.d.ts.map +1 -0
  73. package/dist/types/src/containers/index.d.ts +3 -0
  74. package/dist/types/src/containers/index.d.ts.map +1 -0
  75. package/dist/types/src/hooks/useGraphModel.d.ts +2 -2
  76. package/dist/types/src/hooks/useGraphModel.d.ts.map +1 -1
  77. package/dist/types/src/meta.d.ts +2 -3
  78. package/dist/types/src/meta.d.ts.map +1 -1
  79. package/dist/types/src/translations.d.ts +26 -5
  80. package/dist/types/src/translations.d.ts.map +1 -1
  81. package/dist/types/src/types/ExplorerAction.d.ts +6 -0
  82. package/dist/types/src/types/ExplorerAction.d.ts.map +1 -0
  83. package/dist/types/src/types/Graph.d.ts +23 -0
  84. package/dist/types/src/types/Graph.d.ts.map +1 -0
  85. package/dist/types/src/types/index.d.ts +2 -2
  86. package/dist/types/src/types/index.d.ts.map +1 -1
  87. package/dist/types/tsconfig.tsbuildinfo +1 -1
  88. package/package.json +54 -44
  89. package/src/ExplorerPlugin.tsx +31 -52
  90. package/src/capabilities/index.ts +1 -4
  91. package/src/capabilities/react-surface/index.ts +7 -0
  92. package/src/capabilities/react-surface/react-surface.tsx +31 -0
  93. package/src/components/Chart/Chart.stories.tsx +10 -8
  94. package/src/components/Chart/Chart.tsx +1 -1
  95. package/src/components/Globe/Globe.stories.tsx +14 -12
  96. package/src/components/Globe/Globe.tsx +1 -1
  97. package/src/components/Graph/D3ForceGraph.stories.tsx +43 -24
  98. package/src/components/Graph/D3ForceGraph.tsx +10 -9
  99. package/src/components/Graph/ForceGraph.stories.tsx +43 -24
  100. package/src/components/Graph/ForceGraph.tsx +4 -4
  101. package/src/components/Graph/adapter.ts +14 -8
  102. package/src/components/Graph/testing.ts +13 -10
  103. package/src/components/Tree/Tree.stories.tsx +29 -22
  104. package/src/components/Tree/Tree.tsx +11 -6
  105. package/src/components/Tree/testing/generator.ts +4 -2
  106. package/src/components/Tree/types/tree.test.ts +7 -4
  107. package/src/components/Tree/types/tree.ts +42 -21
  108. package/src/components/Tree/types/types.ts +1 -1
  109. package/src/components/index.ts +0 -4
  110. package/src/containers/ExplorerContainer/ExplorerContainer.tsx +53 -0
  111. package/src/containers/ExplorerContainer/index.ts +7 -0
  112. package/src/containers/index.ts +7 -0
  113. package/src/hooks/useGraphModel.ts +9 -5
  114. package/src/meta.ts +9 -6
  115. package/src/translations.ts +7 -2
  116. package/src/types/ExplorerAction.ts +20 -0
  117. package/src/types/Graph.ts +49 -0
  118. package/src/types/index.ts +2 -2
  119. package/dist/lib/browser/ExplorerContainer-OGHSHZD5.mjs +0 -37
  120. package/dist/lib/browser/ExplorerContainer-OGHSHZD5.mjs.map +0 -7
  121. package/dist/lib/browser/chunk-EF4BFHTI.mjs +0 -38
  122. package/dist/lib/browser/chunk-EF4BFHTI.mjs.map +0 -7
  123. package/dist/lib/browser/chunk-J2BBZOSF.mjs +0 -187
  124. package/dist/lib/browser/chunk-J2BBZOSF.mjs.map +0 -7
  125. package/dist/lib/browser/chunk-OAOY7SHY.mjs +0 -30
  126. package/dist/lib/browser/chunk-OAOY7SHY.mjs.map +0 -7
  127. package/dist/lib/browser/chunk-UL5EDJPE.mjs +0 -21
  128. package/dist/lib/browser/chunk-UL5EDJPE.mjs.map +0 -7
  129. package/dist/lib/browser/intent-resolver-XH2UO2FM.mjs +0 -24
  130. package/dist/lib/browser/intent-resolver-XH2UO2FM.mjs.map +0 -7
  131. package/dist/lib/browser/react-surface-65VQ42HX.mjs +0 -31
  132. package/dist/lib/browser/react-surface-65VQ42HX.mjs.map +0 -7
  133. package/dist/lib/node-esm/ExplorerContainer-6ON5NA2P.mjs +0 -38
  134. package/dist/lib/node-esm/ExplorerContainer-6ON5NA2P.mjs.map +0 -7
  135. package/dist/lib/node-esm/chunk-4VMSNXYL.mjs +0 -189
  136. package/dist/lib/node-esm/chunk-4VMSNXYL.mjs.map +0 -7
  137. package/dist/lib/node-esm/chunk-PIAXA43R.mjs.map +0 -7
  138. package/dist/lib/node-esm/chunk-PPBUWC7F.mjs +0 -32
  139. package/dist/lib/node-esm/chunk-PPBUWC7F.mjs.map +0 -7
  140. package/dist/lib/node-esm/chunk-VKCOKQRG.mjs +0 -39
  141. package/dist/lib/node-esm/chunk-VKCOKQRG.mjs.map +0 -7
  142. package/dist/lib/node-esm/intent-resolver-AGBBNA67.mjs +0 -25
  143. package/dist/lib/node-esm/intent-resolver-AGBBNA67.mjs.map +0 -7
  144. package/dist/lib/node-esm/react-surface-IJIMYAST.mjs +0 -32
  145. package/dist/lib/node-esm/react-surface-IJIMYAST.mjs.map +0 -7
  146. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  147. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  148. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  149. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  150. package/dist/types/src/components/ExplorerContainer.d.ts +0 -9
  151. package/dist/types/src/components/ExplorerContainer.d.ts.map +0 -1
  152. package/dist/types/src/types/schema.d.ts +0 -12
  153. package/dist/types/src/types/schema.d.ts.map +0 -1
  154. package/dist/types/src/types/types.d.ts +0 -18
  155. package/dist/types/src/types/types.d.ts.map +0 -1
  156. package/src/capabilities/intent-resolver.ts +0 -19
  157. package/src/capabilities/react-surface.tsx +0 -23
  158. package/src/components/ExplorerContainer.tsx +0 -36
  159. package/src/types/schema.ts +0 -16
  160. package/src/types/types.ts +0 -21
@@ -1,5 +1,4 @@
1
1
  // src/components/Chart/Chart.tsx
2
- import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
3
2
  import * as Plot from "@observablehq/plot";
4
3
  import React, { useEffect } from "react";
5
4
  import { useResizeDetector } from "react-resize-detector";
@@ -17,49 +16,43 @@ var defaultOptions = {
17
16
  fillOpacity: 0.2
18
17
  };
19
18
  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,
19
+ const { ref: containerRef, width = 0, height = 0 } = useResizeDetector({
20
+ refreshRate: 200
21
+ });
22
+ useEffect(() => {
23
+ if (!width || !height) {
24
+ return;
25
+ }
26
+ const plot3 = Plot.plot({
27
+ grid: true,
49
28
  width,
50
- height
51
- ]);
52
- return /* @__PURE__ */ React.createElement("div", {
53
- ref: containerRef,
54
- className: "grow"
29
+ height,
30
+ style: {
31
+ background: "transparent"
32
+ },
33
+ marks: [
34
+ Plot.frame(),
35
+ Plot.dot(items, {
36
+ x: createAdapter("x", accessor),
37
+ y: createAdapter("y", accessor),
38
+ ...options
39
+ })
40
+ ]
55
41
  });
56
- } finally {
57
- _effect.f();
58
- }
42
+ containerRef.current.append(plot3);
43
+ return () => plot3?.remove();
44
+ }, [
45
+ items,
46
+ width,
47
+ height
48
+ ]);
49
+ return /* @__PURE__ */ React.createElement("div", {
50
+ ref: containerRef,
51
+ className: "grow"
52
+ });
59
53
  };
60
54
 
61
55
  // src/components/Globe/Globe.tsx
62
- import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
63
56
  import * as Plot2 from "@observablehq/plot";
64
57
  import React2, { useEffect as useEffect2 } from "react";
65
58
  import { useResizeDetector as useResizeDetector2 } from "react-resize-detector";
@@ -10773,70 +10766,238 @@ var defaultOptions2 = {
10773
10766
  fill: "#003300"
10774
10767
  };
10775
10768
  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
- })
10769
+ const { ref: containerRef, width = 0, height = 0 } = useResizeDetector2({
10770
+ refreshRate: 200
10771
+ });
10772
+ const land = topojson.feature(countries_110m_default, countries_110m_default.objects.land);
10773
+ useEffect2(() => {
10774
+ if (!width || !height) {
10775
+ return;
10776
+ }
10777
+ const plot3 = Plot2.plot({
10778
+ // https://observablehq.com/plot/features/projections
10779
+ projection: {
10780
+ type: projection,
10781
+ rotate: [
10782
+ -100,
10783
+ -20
10817
10784
  ]
10818
- });
10819
- containerRef.current.append(plot3);
10820
- return () => plot3?.remove();
10821
- }, [
10822
- items,
10785
+ },
10786
+ // projection: { type: 'equirectangular', rotate: [-140, -30] },
10823
10787
  width,
10824
- height
10825
- ]);
10826
- return /* @__PURE__ */ React2.createElement("div", {
10827
- ref: containerRef,
10828
- className: "grow p-4"
10788
+ height,
10789
+ style: {
10790
+ background: "transparent"
10791
+ },
10792
+ // TODO(burdon): Create simple wrapper for Plot with good defaults.
10793
+ marks: [
10794
+ Plot2.sphere({
10795
+ fill: "lightblue",
10796
+ fillOpacity: 0.5
10797
+ }),
10798
+ Plot2.geo(land, {
10799
+ fill: "darkgreen",
10800
+ fillOpacity: 0.5
10801
+ }),
10802
+ Plot2.graticule(),
10803
+ Plot2.dot(items, {
10804
+ x: createAdapter("lat", accessor),
10805
+ y: createAdapter("lng", accessor),
10806
+ ...options
10807
+ })
10808
+ ]
10829
10809
  });
10830
- } finally {
10831
- _effect.f();
10810
+ containerRef.current.append(plot3);
10811
+ return () => plot3?.remove();
10812
+ }, [
10813
+ items,
10814
+ width,
10815
+ height
10816
+ ]);
10817
+ return /* @__PURE__ */ React2.createElement("div", {
10818
+ ref: containerRef,
10819
+ className: "grow p-4"
10820
+ });
10821
+ };
10822
+
10823
+ // src/components/Graph/D3ForceGraph.tsx
10824
+ import React3, { useCallback, useEffect as useEffect3, useMemo, useRef } from "react";
10825
+ import { Obj } from "@dxos/echo";
10826
+ import { SelectionModel } from "@dxos/graph";
10827
+ import { GraphForceProjector, SVG } from "@dxos/react-ui-graph";
10828
+ import { getHashStyles } from "@dxos/ui-theme";
10829
+ import "@dxos/react-ui-graph/styles/graph.css";
10830
+ var D3ForceGraph = ({ classNames, model, selection: _selection, grid, drag, ...props }) => {
10831
+ const context = useRef(null);
10832
+ const projector = useMemo(() => {
10833
+ if (context.current) {
10834
+ return new GraphForceProjector(context.current, {
10835
+ attributes: {
10836
+ linkForce: (edge) => {
10837
+ return edge.data?.object?.active !== false;
10838
+ }
10839
+ },
10840
+ forces: {
10841
+ point: {
10842
+ strength: 0.01
10843
+ }
10844
+ }
10845
+ });
10846
+ }
10847
+ }, [
10848
+ context.current
10849
+ ]);
10850
+ const graph = useRef(null);
10851
+ const selection = useMemo(() => _selection ?? new SelectionModel(), [
10852
+ _selection
10853
+ ]);
10854
+ useEffect3(() => selection.subscribe(() => graph.current?.repaint()), [
10855
+ selection
10856
+ ]);
10857
+ const handleSelect = useCallback((node) => {
10858
+ if (selection.contains(node.id)) {
10859
+ selection.remove(node.id);
10860
+ } else {
10861
+ selection.add(node.id);
10862
+ }
10863
+ }, [
10864
+ selection
10865
+ ]);
10866
+ return /* @__PURE__ */ React3.createElement(SVG.Root, {
10867
+ ref: context,
10868
+ classNames,
10869
+ ...props
10870
+ }, /* @__PURE__ */ React3.createElement(SVG.Markers, null), grid && /* @__PURE__ */ React3.createElement(SVG.Grid, {
10871
+ axis: true
10872
+ }), /* @__PURE__ */ React3.createElement(SVG.Zoom, {
10873
+ extent: [
10874
+ 1 / 2,
10875
+ 2
10876
+ ]
10877
+ }, /* @__PURE__ */ React3.createElement(SVG.Graph, {
10878
+ drag,
10879
+ ref: graph,
10880
+ model,
10881
+ projector,
10882
+ labels: {
10883
+ text: (node) => {
10884
+ return node.data?.data.label ?? node.id;
10885
+ }
10886
+ },
10887
+ attributes: {
10888
+ node: (node) => {
10889
+ const obj = node.data?.data.object;
10890
+ return {
10891
+ data: {
10892
+ color: getHashStyles(obj && Obj.getTypename(obj))?.hue
10893
+ },
10894
+ classes: {
10895
+ "dx-selected": selection.contains(node.id)
10896
+ }
10897
+ };
10898
+ }
10899
+ },
10900
+ onSelect: handleSelect
10901
+ })));
10902
+ };
10903
+
10904
+ // src/components/Graph/ForceGraph.tsx
10905
+ import { forceLink, forceManyBody } from "d3";
10906
+ import NativeForceGraph from "force-graph";
10907
+ import React4, { useEffect as useEffect4, useRef as useRef2, useState } from "react";
10908
+ import { useResizeDetector as useResizeDetector3 } from "react-resize-detector";
10909
+ import { filterObjectsSync } from "@dxos/plugin-search";
10910
+
10911
+ // src/components/Graph/adapter.ts
10912
+ var GraphAdapter = class {
10913
+ graph;
10914
+ _nodes = [];
10915
+ _links = [];
10916
+ constructor(graph) {
10917
+ this.graph = graph;
10918
+ this._nodes = graph.nodes.map((node) => ({
10919
+ id: node.id,
10920
+ type: node.type,
10921
+ data: node.data
10922
+ }));
10923
+ const nodeIds = new Set(this._nodes.map((node) => node.id));
10924
+ this._links = graph.edges.filter((edge) => nodeIds.has(edge.source) && nodeIds.has(edge.target)).map((edge) => ({
10925
+ type: edge.type,
10926
+ source: edge.source,
10927
+ target: edge.target,
10928
+ data: edge.data
10929
+ }));
10930
+ }
10931
+ get nodes() {
10932
+ return this._nodes;
10933
+ }
10934
+ get links() {
10935
+ return this._links;
10832
10936
  }
10833
10937
  };
10834
10938
 
10939
+ // src/components/Graph/ForceGraph.tsx
10940
+ var ForceGraph = ({ model, match }) => {
10941
+ const { ref, width, height } = useResizeDetector3({
10942
+ refreshRate: 200
10943
+ });
10944
+ const rootRef = useRef2(null);
10945
+ const forceGraph = useRef2(null);
10946
+ const filteredRef = useRef2([]);
10947
+ filteredRef.current = filterObjectsSync(model?.objects ?? [], match);
10948
+ const [data, setData] = useState();
10949
+ useEffect4(() => {
10950
+ return model?.subscribe((model2) => {
10951
+ setData(new GraphAdapter(model2.graph));
10952
+ });
10953
+ }, [
10954
+ model
10955
+ ]);
10956
+ useEffect4(() => {
10957
+ if (rootRef.current) {
10958
+ 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);
10959
+ }
10960
+ return () => {
10961
+ forceGraph.current?.pauseAnimation().graphData({
10962
+ nodes: [],
10963
+ links: []
10964
+ });
10965
+ forceGraph.current = null;
10966
+ };
10967
+ }, []);
10968
+ useEffect4(() => {
10969
+ if (!data || !width || !height || !forceGraph.current) {
10970
+ return;
10971
+ }
10972
+ forceGraph.current.pauseAnimation().width(width).height(height).onEngineStop(() => {
10973
+ handleZoomToFit();
10974
+ }).onNodeClick((node) => {
10975
+ forceGraph.current?.emitParticle(node);
10976
+ }).d3Force("link", forceLink().distance(160).strength(0.5)).d3Force("charge", forceManyBody().strength(-30)).graphData(data).warmupTicks(100).cooldownTime(1e3).resumeAnimation();
10977
+ }, [
10978
+ data,
10979
+ width,
10980
+ height,
10981
+ forceGraph.current
10982
+ ]);
10983
+ const handleZoomToFit = () => {
10984
+ forceGraph.current?.zoomToFit(400, 40);
10985
+ };
10986
+ return /* @__PURE__ */ React4.createElement("div", {
10987
+ ref,
10988
+ className: "relative grow",
10989
+ onClick: handleZoomToFit
10990
+ }, /* @__PURE__ */ React4.createElement("div", {
10991
+ ref: rootRef,
10992
+ className: "absolute inset-0"
10993
+ }));
10994
+ };
10995
+
10835
10996
  // 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";
10997
+ import { RegistryContext } from "@effect-atom/atom-react";
10998
+ import React5, { useContext, useEffect as useEffect5, useRef as useRef3, useState as useState2 } from "react";
10838
10999
  import { useAsyncState } from "@dxos/react-ui";
10839
- import { SVG } from "@dxos/react-ui-graph";
11000
+ import { SVG as SVG2 } from "@dxos/react-ui-graph";
10840
11001
  import { SpaceGraphModel } from "@dxos/schema";
10841
11002
 
10842
11003
  // src/components/Tree/layout/HierarchicalEdgeBundling.ts
@@ -10973,10 +11134,10 @@ var TidyTree = (s, data, options) => {
10973
11134
  var TidyTree_default = TidyTree;
10974
11135
 
10975
11136
  // src/components/Tree/types/tree.ts
10976
- import { Schema } from "effect";
10977
- import { Key, Obj, Type } from "@dxos/echo";
11137
+ import * as Schema from "effect/Schema";
11138
+ import { Key, Obj as Obj2, Ref, Type } from "@dxos/echo";
11139
+ import { TestSchema } from "@dxos/echo/testing";
10978
11140
  import { invariant } from "@dxos/invariant";
10979
- var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-explorer/src/components/Tree/types/tree.ts";
10980
11141
  var TreeNodeType = Schema.Struct({
10981
11142
  id: Key.ObjectId,
10982
11143
  children: Schema.mutable(Schema.Array(Key.ObjectId)),
@@ -10984,7 +11145,7 @@ var TreeNodeType = Schema.Struct({
10984
11145
  key: Schema.String,
10985
11146
  value: Schema.Any
10986
11147
  })),
10987
- ref: Schema.optional(Type.Ref(Type.Expando))
11148
+ ref: Schema.optional(Ref.Ref(TestSchema.Expando))
10988
11149
  }).pipe(Schema.mutable);
10989
11150
  var TreeType = Schema.Struct({
10990
11151
  root: Key.ObjectId,
@@ -10992,249 +11153,10 @@ var TreeType = Schema.Struct({
10992
11153
  key: Key.ObjectId,
10993
11154
  value: TreeNodeType
10994
11155
  }))
10995
- }).pipe(Type.Obj({
10996
- typename: "dxos.org/type/Tree",
11156
+ }).pipe(Type.object({
11157
+ typename: "org.dxos.type.tree",
10997
11158
  version: "0.1.0"
10998
11159
  }));
10999
- var Tree = class _Tree {
11000
- static {
11001
- this.create = () => {
11002
- const id = Key.ObjectId.random();
11003
- return Obj.make(TreeType, {
11004
- root: id,
11005
- nodes: {
11006
- [id]: {
11007
- id,
11008
- children: [],
11009
- data: {
11010
- text: ""
11011
- }
11012
- }
11013
- }
11014
- });
11015
- };
11016
- }
11017
- constructor(tree3) {
11018
- this._tree = tree3 ?? _Tree.create();
11019
- }
11020
- get tree() {
11021
- return this._tree;
11022
- }
11023
- // TODO(burdon): Make reactive.
11024
- get size() {
11025
- return Object.keys(this._tree.nodes).length;
11026
- }
11027
- get root() {
11028
- return this.getNode(this._tree.root);
11029
- }
11030
- //
11031
- // Traversal
11032
- //
11033
- /**
11034
- * Recursively traverse the tree until the callback returns a value.
11035
- */
11036
- tranverse(callback, root = this._tree.root, depth = 0) {
11037
- const node = this._tree.nodes[root];
11038
- const result = callback(node, depth);
11039
- if (result !== void 0) {
11040
- return result;
11041
- }
11042
- for (const childId of node.children) {
11043
- const result2 = this.tranverse(callback, childId, depth + 1);
11044
- if (result2 !== void 0) {
11045
- return result2;
11046
- }
11047
- }
11048
- }
11049
- getNode(id) {
11050
- const node = this._tree.nodes[id];
11051
- invariant(node, void 0, {
11052
- F: __dxlog_file,
11053
- L: 98,
11054
- S: this,
11055
- A: [
11056
- "node",
11057
- ""
11058
- ]
11059
- });
11060
- return node;
11061
- }
11062
- /**
11063
- * Get the children of a node.
11064
- */
11065
- getChildNodes(node) {
11066
- return node.children.map((id) => this.getNode(id));
11067
- }
11068
- /**
11069
- * Get the parent of a node.
11070
- */
11071
- getParent(node) {
11072
- const parent = this.tranverse((n) => {
11073
- if (n.children.includes(node.id)) {
11074
- return n;
11075
- }
11076
- });
11077
- return parent ?? null;
11078
- }
11079
- /**
11080
- * Get the next node in the tree.
11081
- */
11082
- getNext(node, hierarchical = true) {
11083
- if (hierarchical && node.children.length) {
11084
- return this.getChildNodes(node)[0];
11085
- } else {
11086
- const parent = this.getParent(node);
11087
- if (parent) {
11088
- const idx = this.getChildNodes(parent).findIndex(({ id }) => id === node.id);
11089
- if (idx < parent.children.length - 1) {
11090
- return this.getNode(parent.children[idx + 1]);
11091
- } else {
11092
- return this.getNext(parent, false);
11093
- }
11094
- }
11095
- }
11096
- }
11097
- /**
11098
- * Get the previous node in the tree.
11099
- */
11100
- getPrevious(node, hierarchical = true) {
11101
- const parent = this.getParent(node);
11102
- const idx = this.getChildNodes(parent).findIndex(({ id }) => id === node.id);
11103
- if (idx === 0) {
11104
- if (hierarchical) {
11105
- return parent;
11106
- }
11107
- } else {
11108
- const previous = this.getNode(parent.children[idx - 1]);
11109
- if (hierarchical && previous.children.length) {
11110
- return this.getLastDescendent(previous);
11111
- }
11112
- return previous;
11113
- }
11114
- }
11115
- /**
11116
- * Get the last descendent of a node.
11117
- */
11118
- getLastDescendent(node) {
11119
- const children = this.getChildNodes(node);
11120
- const last = children.length ? children[children.length - 1] : void 0;
11121
- if (last) {
11122
- return this.getLastDescendent(last);
11123
- }
11124
- return node;
11125
- }
11126
- //
11127
- // Mutations
11128
- //
11129
- /**
11130
- * Clear tree.
11131
- */
11132
- clear() {
11133
- const root = this._tree.nodes[this._tree.root];
11134
- root.children.length = 0;
11135
- this._tree.nodes = {
11136
- [root.id]: root
11137
- };
11138
- }
11139
- /**
11140
- * Add node.
11141
- */
11142
- addNode(parent, node, index) {
11143
- if (!node) {
11144
- const id = Key.ObjectId.random();
11145
- node = {
11146
- id,
11147
- children: [],
11148
- data: {
11149
- text: ""
11150
- }
11151
- };
11152
- }
11153
- this._tree.nodes[node.id] = node;
11154
- parent.children.splice(index ?? parent.children.length, 0, node.id);
11155
- return node;
11156
- }
11157
- /**
11158
- * Delete node.
11159
- */
11160
- deleteNode(parent, id) {
11161
- const node = this._tree.nodes[id];
11162
- if (!node) {
11163
- return void 0;
11164
- }
11165
- delete this._tree.nodes[node.id];
11166
- const idx = parent.children.findIndex((child) => child === id);
11167
- if (idx !== -1) {
11168
- parent.children.splice(idx, 1);
11169
- }
11170
- return node;
11171
- }
11172
- /**
11173
- * Move child node.
11174
- */
11175
- moveNode(node, from, to) {
11176
- invariant(from >= 0 && from < node.children.length, void 0, {
11177
- F: __dxlog_file,
11178
- L: 228,
11179
- S: this,
11180
- A: [
11181
- "from >= 0 && from < node.children.length",
11182
- ""
11183
- ]
11184
- });
11185
- invariant(to >= 0 && to < node.children.length, void 0, {
11186
- F: __dxlog_file,
11187
- L: 229,
11188
- S: this,
11189
- A: [
11190
- "to >= 0 && to < node.children.length",
11191
- ""
11192
- ]
11193
- });
11194
- if (from === to) {
11195
- return null;
11196
- }
11197
- const child = node.children[from];
11198
- node.children.splice(from, 1);
11199
- node.children.splice(to, 0, child);
11200
- return this.getNode(child);
11201
- }
11202
- /**
11203
- * Indent node.
11204
- */
11205
- indentNode(node) {
11206
- const parent = this.getParent(node);
11207
- if (!parent) {
11208
- return;
11209
- }
11210
- const idx = parent.children.findIndex((child) => child === node.id);
11211
- if (idx < 1 || idx >= parent.children.length) {
11212
- return;
11213
- }
11214
- const previous = this.getNode(parent.children[idx - 1]);
11215
- parent.children.splice(idx, 1);
11216
- previous.children.push(node.id);
11217
- }
11218
- /**
11219
- * Unindent node.
11220
- */
11221
- unindentNode(node) {
11222
- const parent = this.getParent(node);
11223
- if (!parent) {
11224
- return;
11225
- }
11226
- const ancestor = this.getParent(parent);
11227
- if (!ancestor) {
11228
- return;
11229
- }
11230
- const nodeIdx = parent.children.findIndex((id) => id === node.id);
11231
- const [_, ...rest] = parent.children.splice(nodeIdx, parent.children.length - nodeIdx);
11232
- parent.children.splice(nodeIdx, parent.children.length - nodeIdx);
11233
- const parentIdx = this.getChildNodes(ancestor).findIndex((n) => n.id === parent.id);
11234
- ancestor.children.splice(parentIdx + 1, 0, node.id);
11235
- node.children.push(...rest);
11236
- }
11237
- };
11238
11160
 
11239
11161
  // src/components/Tree/types/types.ts
11240
11162
  var mapGraphToTreeData = (model, maxDepth = 8) => {
@@ -11262,68 +11184,95 @@ var renderers = /* @__PURE__ */ new Map([
11262
11184
  HierarchicalEdgeBundling_default
11263
11185
  ]
11264
11186
  ]);
11265
- var Tree2 = ({ space, selected, variant = "tidy", onNodeClick }) => {
11266
- var _effect = _useSignals3();
11267
- try {
11268
- const [model] = useAsyncState(async () => space ? new SpaceGraphModel().open(space) : void 0, [
11269
- space,
11270
- selected
11271
- ]);
11272
- const [tree3, setTree] = useState();
11273
- useEffect3(() => {
11274
- return model?.subscribe(() => {
11275
- const tree4 = mapGraphToTreeData(model);
11276
- setTree(tree4);
11277
- }, true);
11278
- }, [
11279
- model
11280
- ]);
11281
- const context = useRef(null);
11282
- useEffect3(() => {
11283
- if (context.current) {
11284
- const { width, height } = context.current.size;
11285
- const size = Math.min(width, height);
11286
- const radius = size * 0.4;
11287
- const options = {
11288
- // TODO(burdon): Type.
11289
- label: (d) => d.label ?? d.id,
11290
- width,
11291
- height,
11292
- radius,
11293
- marginLeft: (width - radius * 2) / 2,
11294
- marginRight: (width - radius * 2) / 2,
11295
- marginTop: (height - radius * 2) / 2,
11296
- marginBottom: (height - radius * 2) / 2,
11297
- slots: defaultTreeLayoutSlots
11298
- };
11299
- if (tree3) {
11300
- const renderer = renderers.get(variant);
11301
- renderer?.(context.current.svg, tree3, options);
11302
- }
11187
+ var Tree = ({ space, selected, variant = "tidy", onNodeClick }) => {
11188
+ const registry = useContext(RegistryContext);
11189
+ const [model] = useAsyncState(async () => space ? new SpaceGraphModel(registry).open(space.db) : void 0, [
11190
+ space,
11191
+ selected,
11192
+ registry
11193
+ ]);
11194
+ const [tree3, setTree] = useState2();
11195
+ useEffect5(() => {
11196
+ return model?.subscribe(() => {
11197
+ const tree4 = mapGraphToTreeData(model);
11198
+ setTree(tree4);
11199
+ }, true);
11200
+ }, [
11201
+ model
11202
+ ]);
11203
+ const context = useRef3(null);
11204
+ useEffect5(() => {
11205
+ if (context.current?.size) {
11206
+ const { width, height } = context.current.size;
11207
+ const size = Math.min(width, height);
11208
+ const radius = size * 0.4;
11209
+ const options = {
11210
+ // TODO(burdon): Type.
11211
+ label: (d) => d.label ?? d.id,
11212
+ width,
11213
+ height,
11214
+ radius,
11215
+ marginLeft: (width - radius * 2) / 2,
11216
+ marginRight: (width - radius * 2) / 2,
11217
+ marginTop: (height - radius * 2) / 2,
11218
+ marginBottom: (height - radius * 2) / 2,
11219
+ slots: defaultTreeLayoutSlots
11220
+ };
11221
+ if (tree3) {
11222
+ const renderer = renderers.get(variant);
11223
+ renderer?.(context.current.svg, tree3, options);
11303
11224
  }
11304
- }, [
11305
- context.current,
11306
- tree3
11307
- ]);
11308
- return /* @__PURE__ */ React3.createElement("div", {
11309
- onClick: () => onNodeClick?.()
11310
- }, /* @__PURE__ */ React3.createElement(SVG.Root, {
11311
- ref: context
11312
- }));
11313
- } finally {
11314
- _effect.f();
11315
- }
11225
+ }
11226
+ }, [
11227
+ context.current,
11228
+ tree3
11229
+ ]);
11230
+ return /* @__PURE__ */ React5.createElement("div", {
11231
+ className: "grow",
11232
+ onClick: () => onNodeClick?.()
11233
+ }, /* @__PURE__ */ React5.createElement(SVG2.Root, {
11234
+ ref: context
11235
+ }));
11316
11236
  };
11317
11237
 
11318
- // src/components/index.ts
11319
- import { lazy } from "react";
11320
- var ExplorerContainer = lazy(() => import("./ExplorerContainer-OGHSHZD5.mjs"));
11238
+ // src/hooks/useGraphModel.ts
11239
+ import { useEffect as useEffect6, useState as useState3 } from "react";
11240
+ import { Capabilities } from "@dxos/app-framework";
11241
+ import { useCapability } from "@dxos/app-framework/ui";
11242
+ import { SpaceGraphModel as SpaceGraphModel2 } from "@dxos/schema";
11243
+ var useGraphModel = (space, filter, options, queue) => {
11244
+ const registry = useCapability(Capabilities.AtomRegistry);
11245
+ const [model, setModel] = useState3(void 0);
11246
+ useEffect6(() => {
11247
+ if (!space) {
11248
+ void model?.close();
11249
+ setModel(void 0);
11250
+ return;
11251
+ }
11252
+ if (!model || model.queue !== queue) {
11253
+ const model2 = new SpaceGraphModel2(registry).setFilter(filter).setOptions(options);
11254
+ void model2.open(space.db, queue);
11255
+ setModel(model2);
11256
+ } else {
11257
+ model.setFilter(filter).setOptions(options);
11258
+ }
11259
+ }, [
11260
+ space,
11261
+ filter,
11262
+ options,
11263
+ queue,
11264
+ registry
11265
+ ]);
11266
+ return model;
11267
+ };
11321
11268
 
11322
11269
  export {
11323
11270
  Chart,
11324
11271
  Globe,
11272
+ D3ForceGraph,
11273
+ ForceGraph,
11325
11274
  defaultTreeLayoutSlots,
11326
- Tree2 as Tree,
11327
- ExplorerContainer
11275
+ Tree,
11276
+ useGraphModel
11328
11277
  };
11329
- //# sourceMappingURL=chunk-PVFZFKQ6.mjs.map
11278
+ //# sourceMappingURL=chunk-WX7QIZMF.mjs.map