@dxos/plugin-explorer 0.8.3 → 0.8.4-main.1068cf700f

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 (181) hide show
  1. package/dist/lib/browser/ExplorerContainer-46BHUF6R.mjs +45 -0
  2. package/dist/lib/browser/ExplorerContainer-46BHUF6R.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-HIFLWHXR.mjs +83 -0
  4. package/dist/lib/browser/chunk-HIFLWHXR.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-JRKQNHS6.mjs → chunk-JZSBQYJQ.mjs} +152 -405
  8. package/dist/lib/{node-esm/chunk-IUFYOE44.mjs.map → browser/chunk-JZSBQYJQ.mjs.map} +3 -3
  9. package/dist/lib/browser/chunk-KIXHZZ2C.mjs +35 -0
  10. package/dist/lib/browser/chunk-KIXHZZ2C.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-MGBT2ZFU.mjs +177 -0
  12. package/dist/lib/browser/chunk-MGBT2ZFU.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-YNQF4CPY.mjs +24 -0
  14. package/dist/lib/browser/chunk-YNQF4CPY.mjs.map +7 -0
  15. package/dist/lib/browser/index.mjs +60 -70
  16. package/dist/lib/browser/index.mjs.map +4 -4
  17. package/dist/lib/browser/meta.json +1 -1
  18. package/dist/lib/browser/meta.mjs +2 -3
  19. package/dist/lib/browser/react-surface-TPQAT5EI.mjs +36 -0
  20. package/dist/lib/browser/react-surface-TPQAT5EI.mjs.map +7 -0
  21. package/dist/lib/browser/types/index.mjs +6 -6
  22. package/dist/lib/node-esm/ExplorerContainer-OZNG47QB.mjs +46 -0
  23. package/dist/lib/node-esm/ExplorerContainer-OZNG47QB.mjs.map +7 -0
  24. package/dist/lib/node-esm/chunk-3OE6TBJI.mjs +84 -0
  25. package/dist/lib/node-esm/chunk-3OE6TBJI.mjs.map +7 -0
  26. package/dist/lib/node-esm/{chunk-VSORIAHH.mjs → chunk-ASRWO2N5.mjs} +12 -7
  27. package/dist/lib/node-esm/chunk-ASRWO2N5.mjs.map +7 -0
  28. package/dist/lib/node-esm/{chunk-3CMBLK6W.mjs → chunk-DK77RB6M.mjs} +9 -6
  29. package/dist/lib/node-esm/chunk-DK77RB6M.mjs.map +7 -0
  30. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  31. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  32. package/dist/lib/node-esm/{chunk-IUFYOE44.mjs → chunk-K5BYG7BW.mjs} +152 -405
  33. package/dist/lib/{browser/chunk-JRKQNHS6.mjs.map → node-esm/chunk-K5BYG7BW.mjs.map} +3 -3
  34. package/dist/lib/node-esm/chunk-YWJBDETV.mjs +179 -0
  35. package/dist/lib/node-esm/chunk-YWJBDETV.mjs.map +7 -0
  36. package/dist/lib/node-esm/index.mjs +60 -70
  37. package/dist/lib/node-esm/index.mjs.map +4 -4
  38. package/dist/lib/node-esm/meta.json +1 -1
  39. package/dist/lib/node-esm/meta.mjs +2 -3
  40. package/dist/lib/node-esm/react-surface-CYHGJJDU.mjs +37 -0
  41. package/dist/lib/node-esm/react-surface-CYHGJJDU.mjs.map +7 -0
  42. package/dist/lib/node-esm/types/index.mjs +6 -6
  43. package/dist/types/src/ExplorerPlugin.d.ts +2 -1
  44. package/dist/types/src/ExplorerPlugin.d.ts.map +1 -1
  45. package/dist/types/src/capabilities/index.d.ts +1 -2
  46. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  47. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  48. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  49. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  50. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  51. package/dist/types/src/components/Chart/Chart.d.ts.map +1 -1
  52. package/dist/types/src/components/Chart/Chart.stories.d.ts +8 -4
  53. package/dist/types/src/components/Chart/Chart.stories.d.ts.map +1 -1
  54. package/dist/types/src/components/ExplorerContainer.d.ts +4 -6
  55. package/dist/types/src/components/ExplorerContainer.d.ts.map +1 -1
  56. package/dist/types/src/components/Globe/Globe.d.ts.map +1 -1
  57. package/dist/types/src/components/Globe/Globe.stories.d.ts +8 -4
  58. package/dist/types/src/components/Globe/Globe.stories.d.ts.map +1 -1
  59. package/dist/types/src/components/Graph/D3ForceGraph.d.ts +2 -2
  60. package/dist/types/src/components/Graph/D3ForceGraph.d.ts.map +1 -1
  61. package/dist/types/src/components/Graph/D3ForceGraph.stories.d.ts +13 -4
  62. package/dist/types/src/components/Graph/D3ForceGraph.stories.d.ts.map +1 -1
  63. package/dist/types/src/components/Graph/ForceGraph.stories.d.ts +13 -4
  64. package/dist/types/src/components/Graph/ForceGraph.stories.d.ts.map +1 -1
  65. package/dist/types/src/components/Graph/adapter.d.ts +1 -1
  66. package/dist/types/src/components/Graph/adapter.d.ts.map +1 -1
  67. package/dist/types/src/components/Graph/testing.d.ts +1 -1
  68. package/dist/types/src/components/Graph/testing.d.ts.map +1 -1
  69. package/dist/types/src/components/Tree/Tree.d.ts.map +1 -1
  70. package/dist/types/src/components/Tree/Tree.stories.d.ts +13 -16
  71. package/dist/types/src/components/Tree/Tree.stories.d.ts.map +1 -1
  72. package/dist/types/src/components/Tree/testing/generator.d.ts.map +1 -1
  73. package/dist/types/src/components/Tree/types/tree.d.ts +18 -16
  74. package/dist/types/src/components/Tree/types/tree.d.ts.map +1 -1
  75. package/dist/types/src/components/Tree/types/types.d.ts +1 -1
  76. package/dist/types/src/components/Tree/types/types.d.ts.map +1 -1
  77. package/dist/types/src/components/index.d.ts +2 -4
  78. package/dist/types/src/components/index.d.ts.map +1 -1
  79. package/dist/types/src/hooks/useGraphModel.d.ts +2 -2
  80. package/dist/types/src/hooks/useGraphModel.d.ts.map +1 -1
  81. package/dist/types/src/meta.d.ts +2 -3
  82. package/dist/types/src/meta.d.ts.map +1 -1
  83. package/dist/types/src/translations.d.ts +34 -22
  84. package/dist/types/src/translations.d.ts.map +1 -1
  85. package/dist/types/src/types/ExplorerAction.d.ts +6 -0
  86. package/dist/types/src/types/ExplorerAction.d.ts.map +1 -0
  87. package/dist/types/src/types/Graph.d.ts +30 -0
  88. package/dist/types/src/types/Graph.d.ts.map +1 -0
  89. package/dist/types/src/types/index.d.ts +2 -2
  90. package/dist/types/src/types/index.d.ts.map +1 -1
  91. package/dist/types/tsconfig.tsbuildinfo +1 -1
  92. package/package.json +61 -44
  93. package/src/ExplorerPlugin.tsx +31 -53
  94. package/src/capabilities/index.ts +1 -4
  95. package/src/capabilities/react-surface/index.ts +7 -0
  96. package/src/capabilities/react-surface/react-surface.tsx +31 -0
  97. package/src/components/Chart/Chart.stories.tsx +10 -8
  98. package/src/components/Chart/Chart.tsx +1 -1
  99. package/src/components/ExplorerContainer.tsx +30 -14
  100. package/src/components/Globe/Globe.stories.tsx +15 -13
  101. package/src/components/Globe/Globe.tsx +1 -1
  102. package/src/components/Graph/D3ForceGraph.stories.tsx +40 -21
  103. package/src/components/Graph/D3ForceGraph.tsx +6 -6
  104. package/src/components/Graph/ForceGraph.stories.tsx +40 -21
  105. package/src/components/Graph/ForceGraph.tsx +5 -5
  106. package/src/components/Graph/adapter.ts +14 -8
  107. package/src/components/Graph/testing.ts +13 -10
  108. package/src/components/Tree/Tree.stories.tsx +29 -22
  109. package/src/components/Tree/Tree.tsx +11 -6
  110. package/src/components/Tree/testing/generator.ts +4 -2
  111. package/src/components/Tree/types/tree.test.ts +8 -5
  112. package/src/components/Tree/types/tree.ts +40 -19
  113. package/src/components/Tree/types/types.ts +1 -1
  114. package/src/components/index.ts +3 -3
  115. package/src/hooks/useGraphModel.ts +9 -5
  116. package/src/meta.ts +9 -6
  117. package/src/translations.ts +12 -6
  118. package/src/types/ExplorerAction.ts +21 -0
  119. package/src/types/Graph.ts +62 -0
  120. package/src/types/index.ts +2 -2
  121. package/dist/lib/browser/ExplorerContainer-DXL34I3F.mjs +0 -37
  122. package/dist/lib/browser/ExplorerContainer-DXL34I3F.mjs.map +0 -7
  123. package/dist/lib/browser/chunk-73YTQHOT.mjs +0 -38
  124. package/dist/lib/browser/chunk-73YTQHOT.mjs.map +0 -7
  125. package/dist/lib/browser/chunk-OBAFAA5V.mjs +0 -21
  126. package/dist/lib/browser/chunk-OBAFAA5V.mjs.map +0 -7
  127. package/dist/lib/browser/chunk-SLB2F5AO.mjs +0 -30
  128. package/dist/lib/browser/chunk-SLB2F5AO.mjs.map +0 -7
  129. package/dist/lib/browser/chunk-Z5BGAHLD.mjs +0 -187
  130. package/dist/lib/browser/chunk-Z5BGAHLD.mjs.map +0 -7
  131. package/dist/lib/browser/intent-resolver-JZKYVFQJ.mjs +0 -24
  132. package/dist/lib/browser/intent-resolver-JZKYVFQJ.mjs.map +0 -7
  133. package/dist/lib/browser/react-surface-IAEP2GBT.mjs +0 -31
  134. package/dist/lib/browser/react-surface-IAEP2GBT.mjs.map +0 -7
  135. package/dist/lib/node/ExplorerContainer-VUXH55VV.cjs +0 -61
  136. package/dist/lib/node/ExplorerContainer-VUXH55VV.cjs.map +0 -7
  137. package/dist/lib/node/chunk-4T4LCT5R.cjs +0 -52
  138. package/dist/lib/node/chunk-4T4LCT5R.cjs.map +0 -7
  139. package/dist/lib/node/chunk-BCDVG2CH.cjs +0 -44
  140. package/dist/lib/node/chunk-BCDVG2CH.cjs.map +0 -7
  141. package/dist/lib/node/chunk-MLRYW4WQ.cjs +0 -56
  142. package/dist/lib/node/chunk-MLRYW4WQ.cjs.map +0 -7
  143. package/dist/lib/node/chunk-SVU4VMYX.cjs +0 -11339
  144. package/dist/lib/node/chunk-SVU4VMYX.cjs.map +0 -7
  145. package/dist/lib/node/chunk-TY543HPV.cjs +0 -214
  146. package/dist/lib/node/chunk-TY543HPV.cjs.map +0 -7
  147. package/dist/lib/node/index.cjs +0 -130
  148. package/dist/lib/node/index.cjs.map +0 -7
  149. package/dist/lib/node/intent-resolver-G2MFNIXA.cjs +0 -39
  150. package/dist/lib/node/intent-resolver-G2MFNIXA.cjs.map +0 -7
  151. package/dist/lib/node/meta.cjs +0 -31
  152. package/dist/lib/node/meta.cjs.map +0 -7
  153. package/dist/lib/node/meta.json +0 -1
  154. package/dist/lib/node/react-surface-UJD5RGRZ.cjs +0 -53
  155. package/dist/lib/node/react-surface-UJD5RGRZ.cjs.map +0 -7
  156. package/dist/lib/node/types/index.cjs +0 -32
  157. package/dist/lib/node/types/index.cjs.map +0 -7
  158. package/dist/lib/node-esm/ExplorerContainer-MFE7PXF4.mjs +0 -38
  159. package/dist/lib/node-esm/ExplorerContainer-MFE7PXF4.mjs.map +0 -7
  160. package/dist/lib/node-esm/chunk-3CMBLK6W.mjs.map +0 -7
  161. package/dist/lib/node-esm/chunk-AE7VHUJM.mjs +0 -189
  162. package/dist/lib/node-esm/chunk-AE7VHUJM.mjs.map +0 -7
  163. package/dist/lib/node-esm/chunk-N6VEANUZ.mjs +0 -39
  164. package/dist/lib/node-esm/chunk-N6VEANUZ.mjs.map +0 -7
  165. package/dist/lib/node-esm/chunk-VSORIAHH.mjs.map +0 -7
  166. package/dist/lib/node-esm/intent-resolver-7G6ZKM6E.mjs +0 -25
  167. package/dist/lib/node-esm/intent-resolver-7G6ZKM6E.mjs.map +0 -7
  168. package/dist/lib/node-esm/react-surface-XBH3WZDL.mjs +0 -32
  169. package/dist/lib/node-esm/react-surface-XBH3WZDL.mjs.map +0 -7
  170. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  171. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  172. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  173. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  174. package/dist/types/src/types/schema.d.ts +0 -12
  175. package/dist/types/src/types/schema.d.ts.map +0 -1
  176. package/dist/types/src/types/types.d.ts +0 -18
  177. package/dist/types/src/types/types.d.ts.map +0 -1
  178. package/src/capabilities/intent-resolver.ts +0 -19
  179. package/src/capabilities/react-surface.tsx +0 -23
  180. package/src/types/schema.ts +0 -16
  181. package/src/types/types.ts +0 -21
@@ -0,0 +1,35 @@
1
+ // src/hooks/useGraphModel.ts
2
+ import { useEffect, useState } from "react";
3
+ import { Capabilities } from "@dxos/app-framework";
4
+ import { useCapability } from "@dxos/app-framework/ui";
5
+ import { SpaceGraphModel } from "@dxos/schema";
6
+ var useGraphModel = (space, filter, options, queue) => {
7
+ const registry = useCapability(Capabilities.AtomRegistry);
8
+ const [model, setModel] = useState(void 0);
9
+ useEffect(() => {
10
+ if (!space) {
11
+ void model?.close();
12
+ setModel(void 0);
13
+ return;
14
+ }
15
+ if (!model || model.queue !== queue) {
16
+ const model2 = new SpaceGraphModel(registry).setFilter(filter).setOptions(options);
17
+ void model2.open(space.db, queue);
18
+ setModel(model2);
19
+ } else {
20
+ model.setFilter(filter).setOptions(options);
21
+ }
22
+ }, [
23
+ space,
24
+ filter,
25
+ options,
26
+ queue,
27
+ registry
28
+ ]);
29
+ return model;
30
+ };
31
+
32
+ export {
33
+ useGraphModel
34
+ };
35
+ //# sourceMappingURL=chunk-KIXHZZ2C.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/hooks/useGraphModel.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { Capabilities } from '@dxos/app-framework';\nimport { useCapability } from '@dxos/app-framework/ui';\nimport { type Filter, type Queue, type Space } from '@dxos/client/echo';\nimport { SpaceGraphModel, type SpaceGraphModelOptions } from '@dxos/schema';\n\n// TODO(burdon): Factor out.\nexport const useGraphModel = (\n space: Space | undefined,\n filter?: Filter.Any | undefined,\n options?: SpaceGraphModelOptions,\n queue?: Queue,\n): SpaceGraphModel | undefined => {\n const registry = useCapability(Capabilities.AtomRegistry);\n const [model, setModel] = useState<SpaceGraphModel | undefined>(undefined);\n useEffect(() => {\n if (!space) {\n void model?.close();\n setModel(undefined);\n return;\n }\n\n // TODO(burdon): Does this need to be a dependency?\n if (!model || model.queue !== queue) {\n const model = new SpaceGraphModel(registry).setFilter(filter).setOptions(options);\n void model.open(space.db, queue);\n setModel(model);\n } else {\n model.setFilter(filter).setOptions(options);\n }\n }, [space, filter, options, queue, registry]);\n\n return model;\n};\n"],
5
+ "mappings": ";AAIA,SAASA,WAAWC,gBAAgB;AAEpC,SAASC,oBAAoB;AAC7B,SAASC,qBAAqB;AAE9B,SAASC,uBAAoD;AAGtD,IAAMC,gBAAgB,CAC3BC,OACAC,QACAC,SACAC,UAAAA;AAEA,QAAMC,WAAWC,cAAcC,aAAaC,YAAY;AACxD,QAAM,CAACC,OAAOC,QAAAA,IAAYC,SAAsCC,MAAAA;AAChEC,YAAU,MAAA;AACR,QAAI,CAACZ,OAAO;AACV,WAAKQ,OAAOK,MAAAA;AACZJ,eAASE,MAAAA;AACT;IACF;AAGA,QAAI,CAACH,SAASA,MAAML,UAAUA,OAAO;AACnC,YAAMK,SAAQ,IAAIM,gBAAgBV,QAAAA,EAAUW,UAAUd,MAAAA,EAAQe,WAAWd,OAAAA;AACzE,WAAKM,OAAMS,KAAKjB,MAAMkB,IAAIf,KAAAA;AAC1BM,eAASD,MAAAA;IACX,OAAO;AACLA,YAAMO,UAAUd,MAAAA,EAAQe,WAAWd,OAAAA;IACrC;EACF,GAAG;IAACF;IAAOC;IAAQC;IAASC;IAAOC;GAAS;AAE5C,SAAOI;AACT;",
6
+ "names": ["useEffect", "useState", "Capabilities", "useCapability", "SpaceGraphModel", "useGraphModel", "space", "filter", "options", "queue", "registry", "useCapability", "Capabilities", "AtomRegistry", "model", "setModel", "useState", "undefined", "useEffect", "close", "SpaceGraphModel", "setFilter", "setOptions", "open", "db"]
7
+ }
@@ -0,0 +1,177 @@
1
+ // src/components/Graph/D3ForceGraph.tsx
2
+ import React, { useCallback, useEffect, useMemo, useRef } from "react";
3
+ import { Obj } from "@dxos/echo";
4
+ import { SelectionModel } from "@dxos/graph";
5
+ import { GraphForceProjector, SVG } from "@dxos/react-ui-graph";
6
+ import { getHashStyles } from "@dxos/ui-theme";
7
+ import "@dxos/react-ui-graph/styles/graph.css";
8
+ var D3ForceGraph = ({ classNames, model, selection: _selection, grid, ...props }) => {
9
+ const context = useRef(null);
10
+ const projector = useMemo(() => {
11
+ if (context.current) {
12
+ return new GraphForceProjector(context.current, {
13
+ attributes: {
14
+ linkForce: (edge) => {
15
+ return edge.data?.object?.active !== false;
16
+ }
17
+ },
18
+ forces: {
19
+ point: {
20
+ strength: 0.01
21
+ }
22
+ }
23
+ });
24
+ }
25
+ }, [
26
+ context.current
27
+ ]);
28
+ const graph = useRef(null);
29
+ const selection = useMemo(() => _selection ?? new SelectionModel(), [
30
+ _selection
31
+ ]);
32
+ useEffect(() => selection.subscribe(() => graph.current?.repaint()), [
33
+ selection
34
+ ]);
35
+ const handleSelect = useCallback((node) => {
36
+ if (selection.contains(node.id)) {
37
+ selection.remove(node.id);
38
+ } else {
39
+ selection.add(node.id);
40
+ }
41
+ }, [
42
+ selection
43
+ ]);
44
+ return /* @__PURE__ */ React.createElement(SVG.Root, {
45
+ ref: context,
46
+ classNames
47
+ }, /* @__PURE__ */ React.createElement(SVG.Markers, null), grid && /* @__PURE__ */ React.createElement(SVG.Grid, {
48
+ axis: true
49
+ }), /* @__PURE__ */ React.createElement(SVG.Zoom, {
50
+ extent: [
51
+ 1 / 2,
52
+ 2
53
+ ]
54
+ }, /* @__PURE__ */ React.createElement(SVG.Graph, {
55
+ ...props,
56
+ ref: graph,
57
+ model,
58
+ projector,
59
+ labels: {
60
+ text: (node) => {
61
+ return node.data?.data.label ?? node.id;
62
+ }
63
+ },
64
+ attributes: {
65
+ node: (node) => {
66
+ const obj = node.data?.data.object;
67
+ return {
68
+ data: {
69
+ color: getHashStyles(obj && Obj.getTypename(obj))?.hue
70
+ },
71
+ classes: {
72
+ "dx-selected": selection.contains(node.id)
73
+ }
74
+ };
75
+ }
76
+ },
77
+ onSelect: handleSelect
78
+ })));
79
+ };
80
+
81
+ // src/components/Graph/ForceGraph.tsx
82
+ import { forceLink, forceManyBody } from "d3";
83
+ import NativeForceGraph from "force-graph";
84
+ import React2, { useEffect as useEffect2, useRef as useRef2, useState } from "react";
85
+ import { useResizeDetector } from "react-resize-detector";
86
+ import { filterObjectsSync } from "@dxos/plugin-search";
87
+
88
+ // src/components/Graph/adapter.ts
89
+ var GraphAdapter = class {
90
+ graph;
91
+ _nodes = [];
92
+ _links = [];
93
+ constructor(graph) {
94
+ this.graph = graph;
95
+ this._nodes = graph.nodes.map((node) => ({
96
+ id: node.id,
97
+ type: node.type,
98
+ data: node.data
99
+ }));
100
+ const nodeIds = new Set(this._nodes.map((node) => node.id));
101
+ this._links = graph.edges.filter((edge) => nodeIds.has(edge.source) && nodeIds.has(edge.target)).map((edge) => ({
102
+ type: edge.type,
103
+ source: edge.source,
104
+ target: edge.target,
105
+ data: edge.data
106
+ }));
107
+ }
108
+ get nodes() {
109
+ return this._nodes;
110
+ }
111
+ get links() {
112
+ return this._links;
113
+ }
114
+ };
115
+
116
+ // src/components/Graph/ForceGraph.tsx
117
+ var ForceGraph = ({ model, match }) => {
118
+ const { ref, width, height } = useResizeDetector({
119
+ refreshRate: 200
120
+ });
121
+ const rootRef = useRef2(null);
122
+ const forceGraph = useRef2(null);
123
+ const filteredRef = useRef2([]);
124
+ filteredRef.current = filterObjectsSync(model?.objects ?? [], match);
125
+ const [data, setData] = useState();
126
+ useEffect2(() => {
127
+ return model?.subscribe((model2) => {
128
+ setData(new GraphAdapter(model2.graph));
129
+ });
130
+ }, [
131
+ model
132
+ ]);
133
+ useEffect2(() => {
134
+ if (rootRef.current) {
135
+ 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((link) => link.type);
136
+ }
137
+ return () => {
138
+ forceGraph.current?.pauseAnimation().graphData({
139
+ nodes: [],
140
+ links: []
141
+ });
142
+ forceGraph.current = null;
143
+ };
144
+ }, []);
145
+ useEffect2(() => {
146
+ if (!data || !width || !height || !forceGraph.current) {
147
+ return;
148
+ }
149
+ forceGraph.current.pauseAnimation().width(width).height(height).onEngineStop(() => {
150
+ handleZoomToFit();
151
+ }).onNodeClick((node) => {
152
+ forceGraph.current?.emitParticle(node);
153
+ }).d3Force("link", forceLink().distance(160).strength(0.5)).d3Force("charge", forceManyBody().strength(-30)).graphData(data).warmupTicks(100).cooldownTime(1e3).resumeAnimation();
154
+ }, [
155
+ data,
156
+ width,
157
+ height,
158
+ forceGraph.current
159
+ ]);
160
+ const handleZoomToFit = () => {
161
+ forceGraph.current?.zoomToFit(400, 40);
162
+ };
163
+ return /* @__PURE__ */ React2.createElement("div", {
164
+ ref,
165
+ className: "relative grow",
166
+ onClick: handleZoomToFit
167
+ }, /* @__PURE__ */ React2.createElement("div", {
168
+ ref: rootRef,
169
+ className: "absolute inset-0"
170
+ }));
171
+ };
172
+
173
+ export {
174
+ D3ForceGraph,
175
+ ForceGraph
176
+ };
177
+ //# sourceMappingURL=chunk-MGBT2ZFU.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/Graph/D3ForceGraph.tsx", "../../../src/components/Graph/ForceGraph.tsx", "../../../src/components/Graph/adapter.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useMemo, useRef } from 'react';\n\nimport { Obj } from '@dxos/echo';\nimport { SelectionModel } from '@dxos/graph';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport {\n type GraphController,\n GraphForceProjector,\n type GraphLayoutNode,\n type GraphProps,\n SVG,\n type SVGContext,\n} from '@dxos/react-ui-graph';\nimport { type SpaceGraphEdge, type SpaceGraphModel, type SpaceGraphNode } from '@dxos/schema';\nimport { getHashStyles } from '@dxos/ui-theme';\n\nimport '@dxos/react-ui-graph/styles/graph.css';\n\nexport type D3ForceGraphProps = ThemedClassName<\n {\n model?: SpaceGraphModel;\n match?: RegExp;\n selection?: SelectionModel;\n grid?: boolean;\n } & Pick<GraphProps, 'drag'>\n>;\n\nexport const D3ForceGraph = ({ classNames, model, selection: _selection, grid, ...props }: D3ForceGraphProps) => {\n const context = useRef<SVGContext>(null);\n const projector = useMemo<GraphForceProjector | undefined>(() => {\n if (context.current) {\n return new GraphForceProjector(context.current, {\n attributes: {\n linkForce: (edge) => {\n // TODO(burdon): Check type (currently assumes Employee property).\n // Edge shouldn't contribute to force if it's not active.\n return edge.data?.object?.active !== false;\n },\n },\n forces: {\n point: {\n strength: 0.01,\n },\n },\n });\n }\n }, [context.current]);\n\n const graph = useRef<GraphController>(null);\n const selection = useMemo(() => _selection ?? new SelectionModel(), [_selection]);\n useEffect(() => selection.subscribe(() => graph.current?.repaint()), [selection]);\n\n const handleSelect = useCallback<NonNullable<GraphProps['onSelect']>>(\n (node) => {\n if (selection.contains(node.id)) {\n selection.remove(node.id);\n } else {\n selection.add(node.id);\n }\n },\n [selection],\n );\n\n return (\n <SVG.Root ref={context} classNames={classNames}>\n <SVG.Markers />\n {grid && <SVG.Grid axis />}\n <SVG.Zoom extent={[1 / 2, 2]}>\n <SVG.Graph<SpaceGraphNode, SpaceGraphEdge>\n {...props}\n ref={graph}\n model={model}\n projector={projector}\n labels={{\n text: (node) => {\n return node.data?.data.label ?? node.id;\n },\n }}\n attributes={{\n node: (node: GraphLayoutNode<SpaceGraphNode>) => {\n const obj = node.data?.data.object;\n return {\n data: {\n color: getHashStyles(obj && Obj.getTypename(obj))?.hue,\n },\n classes: {\n 'dx-selected': selection.contains(node.id),\n },\n };\n },\n }}\n onSelect={handleSelect}\n />\n </SVG.Zoom>\n </SVG.Root>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { forceLink, forceManyBody } from 'd3';\nimport NativeForceGraph from 'force-graph';\nimport React, { type FC, useEffect, useRef, useState } from 'react';\nimport { useResizeDetector } from 'react-resize-detector';\n\nimport { type SearchResult, filterObjectsSync } from '@dxos/plugin-search';\nimport { type SpaceGraphModel } from '@dxos/schema';\n\nimport { GraphAdapter } from './adapter';\n\nexport type ForceGraphProps = {\n model?: SpaceGraphModel;\n match?: RegExp;\n};\n\nexport const ForceGraph: FC<ForceGraphProps> = ({ model, match }) => {\n const { ref, width, height } = useResizeDetector({ refreshRate: 200 });\n const rootRef = useRef<HTMLDivElement>(null);\n const forceGraph = useRef<NativeForceGraph>(null);\n\n const filteredRef = useRef<SearchResult[]>([]);\n filteredRef.current = filterObjectsSync(model?.objects ?? [], match);\n\n const [data, setData] = useState<GraphAdapter>();\n useEffect(() => {\n return model?.subscribe((model) => {\n setData(new GraphAdapter(model.graph));\n });\n }, [model]);\n\n useEffect(() => {\n if (rootRef.current) {\n // https://github.com/vasturiano/force-graph\n // https://github.com/vasturiano/3d-force-graph\n forceGraph.current = new NativeForceGraph(rootRef.current)\n // https://github.com/vasturiano/force-graph?tab=readme-ov-file#node-styling\n .nodeRelSize(6)\n .nodeLabel((node: any) => (node.type === 'schema' ? node.data.typename : (node.data.label ?? node.id)))\n .nodeAutoColorBy((node: any) => (node.type === 'schema' ? 'schema' : node.data.typename))\n\n // https://github.com/vasturiano/force-graph?tab=readme-ov-file#link-styling\n .linkAutoColorBy((link: any) => link.type);\n }\n\n return () => {\n forceGraph.current?.pauseAnimation().graphData({ nodes: [], links: [] });\n forceGraph.current = null;\n };\n }, []);\n\n useEffect(() => {\n if (!data || !width || !height || !forceGraph.current) {\n return;\n }\n\n // https://github.com/vasturiano/force-graph?tab=readme-ov-file#container-layout\n forceGraph.current\n .pauseAnimation()\n .width(width)\n .height(height)\n .onEngineStop(() => {\n handleZoomToFit();\n })\n .onNodeClick((node: any) => {\n forceGraph.current?.emitParticle(node);\n })\n\n // https://github.com/vasturiano/force-graph?tab=readme-ov-file#force-engine-d3-force-configuration\n // .d3Force('center', forceCenter().strength(0.9))\n .d3Force('link', forceLink().distance(160).strength(0.5))\n .d3Force('charge', forceManyBody().strength(-30))\n\n .graphData(data)\n .warmupTicks(100)\n .cooldownTime(1_000)\n .resumeAnimation();\n }, [data, width, height, forceGraph.current]);\n\n const handleZoomToFit = () => {\n forceGraph.current?.zoomToFit(400, 40);\n };\n\n return (\n <div ref={ref} className='relative grow' onClick={handleZoomToFit}>\n <div ref={rootRef} className='absolute inset-0' />\n </div>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Graph } from '@dxos/graph';\n\nexport type GraphNode = {\n id?: string;\n};\n\nexport type GraphLink = {\n source?: string;\n target?: string;\n};\n\nexport type GraphData = {\n nodes: GraphNode[];\n links: GraphLink[];\n};\n\n/**\n * Map common graph to force-graph format.\n */\nexport class GraphAdapter implements GraphData {\n private readonly _nodes: GraphNode[] = [];\n private readonly _links: GraphLink[] = [];\n\n constructor(private readonly graph: Graph.Any) {\n this._nodes = graph.nodes.map((node: Graph.Node.Any) => ({\n id: node.id,\n type: node.type,\n data: node.data,\n }));\n\n // Build a set of node IDs for efficient lookup.\n const nodeIds = new Set(this._nodes.map((node) => node.id));\n\n // Filter out edges where source or target node doesn't exist.\n this._links = graph.edges\n .filter((edge: Graph.Edge.Any) => nodeIds.has(edge.source) && nodeIds.has(edge.target))\n .map((edge: Graph.Edge.Any) => ({\n type: edge.type,\n source: edge.source,\n target: edge.target,\n data: edge.data,\n }));\n }\n\n get nodes() {\n return this._nodes;\n }\n\n get links() {\n return this._links;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useCallback", "useEffect", "useMemo", "useRef", "Obj", "SelectionModel", "GraphForceProjector", "SVG", "getHashStyles", "D3ForceGraph", "classNames", "model", "selection", "_selection", "grid", "props", "context", "useRef", "projector", "useMemo", "current", "GraphForceProjector", "attributes", "linkForce", "edge", "data", "object", "active", "forces", "point", "strength", "graph", "SelectionModel", "useEffect", "subscribe", "repaint", "handleSelect", "useCallback", "node", "contains", "id", "remove", "add", "SVG", "Root", "ref", "Markers", "Grid", "axis", "Zoom", "extent", "Graph", "labels", "text", "label", "obj", "color", "getHashStyles", "Obj", "getTypename", "hue", "classes", "onSelect", "forceLink", "forceManyBody", "NativeForceGraph", "React", "useEffect", "useRef", "useState", "useResizeDetector", "filterObjectsSync", "GraphAdapter", "_nodes", "_links", "graph", "nodes", "map", "node", "id", "type", "data", "nodeIds", "Set", "edges", "filter", "edge", "has", "source", "target", "links", "ForceGraph", "model", "match", "ref", "width", "height", "useResizeDetector", "refreshRate", "rootRef", "useRef", "forceGraph", "filteredRef", "current", "filterObjectsSync", "objects", "data", "setData", "useState", "useEffect", "subscribe", "GraphAdapter", "graph", "NativeForceGraph", "nodeRelSize", "nodeLabel", "node", "type", "typename", "label", "id", "nodeAutoColorBy", "linkAutoColorBy", "link", "pauseAnimation", "graphData", "nodes", "links", "onEngineStop", "handleZoomToFit", "onNodeClick", "emitParticle", "d3Force", "forceLink", "distance", "strength", "forceManyBody", "warmupTicks", "cooldownTime", "resumeAnimation", "zoomToFit", "React", "div", "className", "onClick"]
7
+ }
@@ -0,0 +1,24 @@
1
+ // src/meta.ts
2
+ import { trim } from "@dxos/util";
3
+ var meta = {
4
+ id: "dxos.org/plugin/explorer",
5
+ name: "Explorer",
6
+ description: trim`
7
+ Interactive hypergraph visualization that reveals relationships between objects in your workspace.
8
+ Navigate complex data structures and discover connections through a dynamic network view.
9
+ `,
10
+ icon: "ph--graph--regular",
11
+ iconHue: "green",
12
+ source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-explorer",
13
+ tags: [
14
+ "labs"
15
+ ],
16
+ screenshots: [
17
+ "https://dxos.network/plugin-details-explorer-dark.png"
18
+ ]
19
+ };
20
+
21
+ export {
22
+ meta
23
+ };
24
+ //# sourceMappingURL=chunk-YNQF4CPY.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/meta.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Plugin } from '@dxos/app-framework';\nimport { trim } from '@dxos/util';\n\nexport const meta: Plugin.Meta = {\n id: 'dxos.org/plugin/explorer',\n name: 'Explorer',\n description: trim`\n Interactive hypergraph visualization that reveals relationships between objects in your workspace.\n Navigate complex data structures and discover connections through a dynamic network view.\n `,\n icon: 'ph--graph--regular',\n iconHue: 'green',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-explorer',\n tags: ['labs'],\n screenshots: ['https://dxos.network/plugin-details-explorer-dark.png'],\n};\n"],
5
+ "mappings": ";AAKA,SAASA,YAAY;AAEd,IAAMC,OAAoB;EAC/BC,IAAI;EACJC,MAAM;EACNC,aAAaC;;;;EAIbC,MAAM;EACNC,SAAS;EACTC,QAAQ;EACRC,MAAM;IAAC;;EACPC,aAAa;IAAC;;AAChB;",
6
+ "names": ["trim", "meta", "id", "name", "description", "trim", "icon", "iconHue", "source", "tags", "screenshots"]
7
+ }
@@ -1,104 +1,94 @@
1
1
  import {
2
2
  useGraphModel
3
- } from "./chunk-SLB2F5AO.mjs";
3
+ } from "./chunk-KIXHZZ2C.mjs";
4
4
  import {
5
5
  Chart,
6
6
  ExplorerContainer,
7
7
  Globe,
8
8
  Tree,
9
9
  defaultTreeLayoutSlots
10
- } from "./chunk-JRKQNHS6.mjs";
10
+ } from "./chunk-JZSBQYJQ.mjs";
11
11
  import {
12
- D3ForceGraph,
13
- ForceGraph
14
- } from "./chunk-Z5BGAHLD.mjs";
12
+ meta
13
+ } from "./chunk-YNQF4CPY.mjs";
15
14
  import {
16
- ExplorerAction,
17
- ViewType
18
- } from "./chunk-73YTQHOT.mjs";
15
+ ExplorerAction_exports,
16
+ Graph_exports
17
+ } from "./chunk-HIFLWHXR.mjs";
19
18
  import {
20
- EXPLORER_PLUGIN,
21
- meta
22
- } from "./chunk-OBAFAA5V.mjs";
19
+ D3ForceGraph,
20
+ ForceGraph
21
+ } from "./chunk-MGBT2ZFU.mjs";
22
+ import "./chunk-J5LGTIGS.mjs";
23
23
 
24
- // packages/plugins/plugin-explorer/src/ExplorerPlugin.tsx
25
- import { Capabilities, contributes, createIntent, defineModule, definePlugin, Events } from "@dxos/app-framework";
26
- import { ClientCapabilities, ClientEvents } from "@dxos/plugin-client";
27
- import { SpaceCapabilities } from "@dxos/plugin-space";
28
- import { defineObjectForm } from "@dxos/plugin-space/types";
24
+ // src/ExplorerPlugin.tsx
25
+ import * as Effect from "effect/Effect";
26
+ import { Plugin } from "@dxos/app-framework";
27
+ import { AppPlugin } from "@dxos/app-toolkit";
28
+ import { Type as Type2 } from "@dxos/echo";
29
+ import { View } from "@dxos/schema";
29
30
 
30
- // packages/plugins/plugin-explorer/src/capabilities/index.ts
31
- import { lazy } from "@dxos/app-framework";
32
- var IntentResolver = lazy(() => import("./intent-resolver-JZKYVFQJ.mjs"));
33
- var ReactSurface = lazy(() => import("./react-surface-IAEP2GBT.mjs"));
31
+ // src/capabilities/react-surface/index.ts
32
+ import { Capability } from "@dxos/app-framework";
33
+ var ReactSurface = Capability.lazy("ReactSurface", () => import("./react-surface-TPQAT5EI.mjs"));
34
34
 
35
- // packages/plugins/plugin-explorer/src/translations.ts
35
+ // src/translations.ts
36
36
  import { Type } from "@dxos/echo";
37
- var translations_default = [
37
+ import { translations as componentsTranslations } from "@dxos/react-ui-components";
38
+ var translations = [
38
39
  {
39
40
  "en-US": {
40
- [Type.getTypename(ViewType)]: {
41
+ [Type.getTypename(Graph_exports.Graph)]: {
41
42
  "typename label": "Explorer",
42
43
  "typename label_zero": "Explorers",
43
44
  "typename label_one": "Explorer",
44
45
  "typename label_other": "Explorers",
45
- "object name placeholder": "New explorer"
46
+ "object name placeholder": "New explorer",
47
+ "rename object label": "Rename explorer",
48
+ "delete object label": "Delete explorer",
49
+ "object deleted label": "Explorer deleted"
46
50
  },
47
- [EXPLORER_PLUGIN]: {
51
+ [meta.id]: {
48
52
  "plugin name": "Explorer",
49
53
  "object title label": "Title"
50
54
  }
51
55
  }
52
- }
56
+ },
57
+ ...componentsTranslations
53
58
  ];
54
59
 
55
- // packages/plugins/plugin-explorer/src/ExplorerPlugin.tsx
56
- var ExplorerPlugin = () => definePlugin(meta, [
57
- defineModule({
58
- id: `${meta.id}/module/translations`,
59
- activatesOn: Events.SetupTranslations,
60
- activate: () => contributes(Capabilities.Translations, translations_default)
61
- }),
62
- defineModule({
63
- id: `${meta.id}/module/metadata`,
64
- activatesOn: Events.SetupMetadata,
65
- activate: () => contributes(Capabilities.Metadata, {
66
- id: ViewType.typename,
67
- metadata: {
68
- icon: "ph--graph--regular"
69
- }
70
- })
71
- }),
72
- defineModule({
73
- id: `${meta.id}/module/object-form`,
74
- activatesOn: ClientEvents.SetupSchema,
75
- activate: () => contributes(SpaceCapabilities.ObjectForm, defineObjectForm({
76
- objectSchema: ViewType,
77
- getIntent: () => createIntent(ExplorerAction.Create)
78
- }))
79
- }),
80
- defineModule({
81
- id: `${meta.id}/module/schema`,
82
- activatesOn: ClientEvents.SetupSchema,
83
- activate: () => contributes(ClientCapabilities.Schema, [
84
- ViewType
85
- ])
86
- }),
87
- defineModule({
88
- id: `${meta.id}/module/react-surface`,
89
- activatesOn: Events.SetupReactSurface,
90
- activate: ReactSurface
91
- }),
92
- defineModule({
93
- id: `${meta.id}/module/intent-resolver`,
94
- activatesOn: Events.SetupIntentResolver,
95
- activate: IntentResolver
96
- })
97
- ]);
60
+ // src/ExplorerPlugin.tsx
61
+ var ExplorerPlugin = Plugin.define(meta).pipe(AppPlugin.addMetadataModule({
62
+ metadata: {
63
+ id: Type2.getTypename(Graph_exports.Graph),
64
+ metadata: {
65
+ icon: "ph--graph--regular",
66
+ iconHue: "green",
67
+ inputSchema: ExplorerAction_exports.GraphProps,
68
+ createObject: (props, { db }) => Effect.promise(async () => {
69
+ const { view } = await View.makeFromDatabase({
70
+ db,
71
+ typename: props.typename
72
+ });
73
+ return Graph_exports.make({
74
+ name: props.name,
75
+ view
76
+ });
77
+ })
78
+ }
79
+ }
80
+ }), AppPlugin.addSchemaModule({
81
+ schema: [
82
+ Graph_exports.Graph
83
+ ]
84
+ }), AppPlugin.addSurfaceModule({
85
+ activate: ReactSurface
86
+ }), AppPlugin.addTranslationsModule({
87
+ translations
88
+ }), Plugin.make);
98
89
  export {
99
90
  Chart,
100
91
  D3ForceGraph,
101
- EXPLORER_PLUGIN,
102
92
  ExplorerContainer,
103
93
  ExplorerPlugin,
104
94
  ForceGraph,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../src/ExplorerPlugin.tsx", "../../../src/capabilities/index.ts", "../../../src/translations.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Capabilities, contributes, createIntent, defineModule, definePlugin, Events } from '@dxos/app-framework';\nimport { ClientCapabilities, ClientEvents } from '@dxos/plugin-client';\nimport { SpaceCapabilities } from '@dxos/plugin-space';\nimport { defineObjectForm } from '@dxos/plugin-space/types';\n\nimport { IntentResolver, ReactSurface } from './capabilities';\nimport { meta } from './meta';\nimport translations from './translations';\nimport { ViewType, ExplorerAction } from './types';\n\nexport const ExplorerPlugin = () =>\n definePlugin(meta, [\n defineModule({\n id: `${meta.id}/module/translations`,\n activatesOn: Events.SetupTranslations,\n activate: () => contributes(Capabilities.Translations, translations),\n }),\n defineModule({\n id: `${meta.id}/module/metadata`,\n activatesOn: Events.SetupMetadata,\n activate: () =>\n contributes(Capabilities.Metadata, {\n id: ViewType.typename,\n metadata: {\n icon: 'ph--graph--regular',\n },\n }),\n }),\n defineModule({\n id: `${meta.id}/module/object-form`,\n activatesOn: ClientEvents.SetupSchema,\n activate: () =>\n contributes(\n SpaceCapabilities.ObjectForm,\n defineObjectForm({\n objectSchema: ViewType,\n getIntent: () => createIntent(ExplorerAction.Create),\n }),\n ),\n }),\n defineModule({\n id: `${meta.id}/module/schema`,\n activatesOn: ClientEvents.SetupSchema,\n activate: () => contributes(ClientCapabilities.Schema, [ViewType]),\n }),\n defineModule({\n id: `${meta.id}/module/react-surface`,\n activatesOn: Events.SetupReactSurface,\n activate: ReactSurface,\n }),\n defineModule({\n id: `${meta.id}/module/intent-resolver`,\n activatesOn: Events.SetupIntentResolver,\n activate: IntentResolver,\n }),\n ]);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { lazy } from '@dxos/app-framework';\n\nexport const IntentResolver = lazy(() => import('./intent-resolver'));\nexport const ReactSurface = lazy(() => import('./react-surface'));\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Type } from '@dxos/echo';\n\nimport { EXPLORER_PLUGIN } from './meta';\nimport { ViewType } from './types';\n\nexport default [\n {\n 'en-US': {\n [Type.getTypename(ViewType)]: {\n 'typename label': 'Explorer',\n 'typename label_zero': 'Explorers',\n 'typename label_one': 'Explorer',\n 'typename label_other': 'Explorers',\n 'object name placeholder': 'New explorer',\n },\n [EXPLORER_PLUGIN]: {\n 'plugin name': 'Explorer',\n 'object title label': 'Title',\n },\n },\n },\n];\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAIA,SAASA,cAAcC,aAAaC,cAAcC,cAAcC,cAAcC,cAAc;AAC5F,SAASC,oBAAoBC,oBAAoB;AACjD,SAASC,yBAAyB;AAClC,SAASC,wBAAwB;;;ACHjC,SAASC,YAAY;AAEd,IAAMC,iBAAiBC,KAAK,MAAM,OAAO,gCAAA,CAAA;AACzC,IAAMC,eAAeD,KAAK,MAAM,OAAO,8BAAA,CAAA;;;ACH9C,SAASE,YAAY;AAKrB,IAAA,uBAAe;EACb;IACE,SAAS;MACP,CAACC,KAAKC,YAAYC,QAAAA,CAAAA,GAAY;QAC5B,kBAAkB;QAClB,uBAAuB;QACvB,sBAAsB;QACtB,wBAAwB;QACxB,2BAA2B;MAC7B;MACA,CAACC,eAAAA,GAAkB;QACjB,eAAe;QACf,sBAAsB;MACxB;IACF;EACF;;;;AFVK,IAAMC,iBAAiB,MAC5BC,aAAaC,MAAM;EACjBC,aAAa;IACXC,IAAI,GAAGF,KAAKE,EAAE;IACdC,aAAaC,OAAOC;IACpBC,UAAU,MAAMC,YAAYC,aAAaC,cAAcC,oBAAAA;EACzD,CAAA;EACAT,aAAa;IACXC,IAAI,GAAGF,KAAKE,EAAE;IACdC,aAAaC,OAAOO;IACpBL,UAAU,MACRC,YAAYC,aAAaI,UAAU;MACjCV,IAAIW,SAASC;MACbC,UAAU;QACRC,MAAM;MACR;IACF,CAAA;EACJ,CAAA;EACAf,aAAa;IACXC,IAAI,GAAGF,KAAKE,EAAE;IACdC,aAAac,aAAaC;IAC1BZ,UAAU,MACRC,YACEY,kBAAkBC,YAClBC,iBAAiB;MACfC,cAAcT;MACdU,WAAW,MAAMC,aAAaC,eAAeC,MAAM;IACrD,CAAA,CAAA;EAEN,CAAA;EACAzB,aAAa;IACXC,IAAI,GAAGF,KAAKE,EAAE;IACdC,aAAac,aAAaC;IAC1BZ,UAAU,MAAMC,YAAYoB,mBAAmBC,QAAQ;MAACf;KAAS;EACnE,CAAA;EACAZ,aAAa;IACXC,IAAI,GAAGF,KAAKE,EAAE;IACdC,aAAaC,OAAOyB;IACpBvB,UAAUwB;EACZ,CAAA;EACA7B,aAAa;IACXC,IAAI,GAAGF,KAAKE,EAAE;IACdC,aAAaC,OAAO2B;IACpBzB,UAAU0B;EACZ,CAAA;CACD;",
6
- "names": ["Capabilities", "contributes", "createIntent", "defineModule", "definePlugin", "Events", "ClientCapabilities", "ClientEvents", "SpaceCapabilities", "defineObjectForm", "lazy", "IntentResolver", "lazy", "ReactSurface", "Type", "Type", "getTypename", "ViewType", "EXPLORER_PLUGIN", "ExplorerPlugin", "definePlugin", "meta", "defineModule", "id", "activatesOn", "Events", "SetupTranslations", "activate", "contributes", "Capabilities", "Translations", "translations", "SetupMetadata", "Metadata", "ViewType", "typename", "metadata", "icon", "ClientEvents", "SetupSchema", "SpaceCapabilities", "ObjectForm", "defineObjectForm", "objectSchema", "getIntent", "createIntent", "ExplorerAction", "Create", "ClientCapabilities", "Schema", "SetupReactSurface", "ReactSurface", "SetupIntentResolver", "IntentResolver"]
3
+ "sources": ["../../../src/ExplorerPlugin.tsx", "../../../src/capabilities/react-surface/index.ts", "../../../src/translations.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Plugin } from '@dxos/app-framework';\nimport { AppPlugin } from '@dxos/app-toolkit';\nimport { Type } from '@dxos/echo';\nimport { type CreateObject } from '@dxos/plugin-space/types';\nimport { View } from '@dxos/schema';\n\nimport { ReactSurface } from './capabilities';\nimport { meta } from './meta';\nimport { translations } from './translations';\nimport { ExplorerAction, Graph } from './types';\n\nexport const ExplorerPlugin = Plugin.define(meta).pipe(\n AppPlugin.addMetadataModule({\n metadata: {\n id: Type.getTypename(Graph.Graph),\n metadata: {\n icon: 'ph--graph--regular',\n iconHue: 'green',\n inputSchema: ExplorerAction.GraphProps,\n createObject: ((props, { db }) =>\n Effect.promise(async () => {\n const { view } = await View.makeFromDatabase({ db, typename: props.typename });\n return Graph.make({ name: props.name, view });\n })) satisfies CreateObject,\n },\n },\n }),\n AppPlugin.addSchemaModule({ schema: [Graph.Graph] }),\n AppPlugin.addSurfaceModule({ activate: ReactSurface }),\n AppPlugin.addTranslationsModule({ translations }),\n Plugin.make,\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capability } from '@dxos/app-framework';\n\nexport const ReactSurface = Capability.lazy('ReactSurface', () => import('./react-surface'));\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Type } from '@dxos/echo';\nimport { type Resource } from '@dxos/react-ui';\nimport { translations as componentsTranslations } from '@dxos/react-ui-components';\n\nimport { meta } from './meta';\nimport { Graph } from './types';\n\nexport const translations = [\n {\n 'en-US': {\n [Type.getTypename(Graph.Graph)]: {\n 'typename label': 'Explorer',\n 'typename label_zero': 'Explorers',\n 'typename label_one': 'Explorer',\n 'typename label_other': 'Explorers',\n 'object name placeholder': 'New explorer',\n 'rename object label': 'Rename explorer',\n 'delete object label': 'Delete explorer',\n 'object deleted label': 'Explorer deleted',\n },\n [meta.id]: {\n 'plugin name': 'Explorer',\n 'object title label': 'Title',\n },\n },\n },\n ...componentsTranslations,\n] as const satisfies Resource[];\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,cAAc;AACvB,SAASC,iBAAiB;AAC1B,SAASC,QAAAA,aAAY;AAErB,SAASC,YAAY;;;ACNrB,SAASC,kBAAkB;AAEpB,IAAMC,eAAeC,WAAWC,KAAK,gBAAgB,MAAM,OAAO,8BAAA,CAAA;;;ACFzE,SAASC,YAAY;AAErB,SAASC,gBAAgBC,8BAA8B;AAKhD,IAAMC,eAAe;EAC1B;IACE,SAAS;MACP,CAACC,KAAKC,YAAYC,cAAMA,KAAK,CAAA,GAAI;QAC/B,kBAAkB;QAClB,uBAAuB;QACvB,sBAAsB;QACtB,wBAAwB;QACxB,2BAA2B;QAC3B,uBAAuB;QACvB,uBAAuB;QACvB,wBAAwB;MAC1B;MACA,CAACC,KAAKC,EAAE,GAAG;QACT,eAAe;QACf,sBAAsB;MACxB;IACF;EACF;KACGC;;;;AFbE,IAAMC,iBAAiBC,OAAOC,OAAOC,IAAAA,EAAMC,KAChDC,UAAUC,kBAAkB;EAC1BC,UAAU;IACRC,IAAIC,MAAKC,YAAYC,cAAMA,KAAK;IAChCJ,UAAU;MACRK,MAAM;MACNC,SAAS;MACTC,aAAaC,uBAAeC;MAC5BC,cAAe,CAACC,OAAO,EAAEC,GAAE,MAClBC,eAAQ,YAAA;AACb,cAAM,EAAEC,KAAI,IAAK,MAAMC,KAAKC,iBAAiB;UAAEJ;UAAIK,UAAUN,MAAMM;QAAS,CAAA;AAC5E,eAAOb,cAAMc,KAAK;UAAEC,MAAMR,MAAMQ;UAAML;QAAK,CAAA;MAC7C,CAAA;IACJ;EACF;AACF,CAAA,GACAhB,UAAUsB,gBAAgB;EAAEC,QAAQ;IAACjB,cAAMA;;AAAO,CAAA,GAClDN,UAAUwB,iBAAiB;EAAEC,UAAUC;AAAa,CAAA,GACpD1B,UAAU2B,sBAAsB;EAAEC;AAAa,CAAA,GAC/ChC,OAAOwB,IAAI;",
6
+ "names": ["Effect", "Plugin", "AppPlugin", "Type", "View", "Capability", "ReactSurface", "Capability", "lazy", "Type", "translations", "componentsTranslations", "translations", "Type", "getTypename", "Graph", "meta", "id", "componentsTranslations", "ExplorerPlugin", "Plugin", "define", "meta", "pipe", "AppPlugin", "addMetadataModule", "metadata", "id", "Type", "getTypename", "Graph", "icon", "iconHue", "inputSchema", "ExplorerAction", "GraphProps", "createObject", "props", "db", "promise", "view", "View", "makeFromDatabase", "typename", "make", "name", "addSchemaModule", "schema", "addSurfaceModule", "activate", "ReactSurface", "addTranslationsModule", "translations"]
7
7
  }