@dxos/plugin-explorer 0.8.4-main.f9ba587 → 0.8.4-main.fcfe5033a5

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 (145) hide show
  1. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  2. package/dist/lib/browser/chunk-J5LGTIGS.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-LSUP47BZ.mjs +24 -0
  4. package/dist/lib/browser/chunk-LSUP47BZ.mjs.map +7 -0
  5. package/dist/lib/browser/index.mjs +11347 -83
  6. package/dist/lib/browser/index.mjs.map +4 -4
  7. package/dist/lib/browser/meta.json +1 -1
  8. package/dist/lib/browser/meta.mjs +2 -3
  9. package/dist/lib/browser/types/index.mjs +66 -6
  10. package/dist/lib/browser/types/index.mjs.map +4 -4
  11. package/dist/lib/node-esm/{chunk-PIAXA43R.mjs → chunk-EN3JZNEY.mjs} +8 -5
  12. package/dist/lib/node-esm/chunk-EN3JZNEY.mjs.map +7 -0
  13. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  14. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  15. package/dist/lib/node-esm/index.mjs +11347 -83
  16. package/dist/lib/node-esm/index.mjs.map +4 -4
  17. package/dist/lib/node-esm/meta.json +1 -1
  18. package/dist/lib/node-esm/meta.mjs +2 -3
  19. package/dist/lib/node-esm/types/index.mjs +66 -6
  20. package/dist/lib/node-esm/types/index.mjs.map +4 -4
  21. package/dist/types/src/ExplorerPlugin.d.ts +2 -1
  22. package/dist/types/src/ExplorerPlugin.d.ts.map +1 -1
  23. package/dist/types/src/capabilities/index.d.ts +2 -2
  24. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  25. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  26. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  27. package/dist/types/src/components/Chart/Chart.d.ts.map +1 -1
  28. package/dist/types/src/components/Chart/Chart.stories.d.ts +8 -4
  29. package/dist/types/src/components/Chart/Chart.stories.d.ts.map +1 -1
  30. package/dist/types/src/components/Globe/Globe.d.ts.map +1 -1
  31. package/dist/types/src/components/Globe/Globe.stories.d.ts +8 -4
  32. package/dist/types/src/components/Globe/Globe.stories.d.ts.map +1 -1
  33. package/dist/types/src/components/Graph/D3ForceGraph.d.ts +6 -5
  34. package/dist/types/src/components/Graph/D3ForceGraph.d.ts.map +1 -1
  35. package/dist/types/src/components/Graph/D3ForceGraph.stories.d.ts +15 -4
  36. package/dist/types/src/components/Graph/D3ForceGraph.stories.d.ts.map +1 -1
  37. package/dist/types/src/components/Graph/ForceGraph.stories.d.ts +13 -4
  38. package/dist/types/src/components/Graph/ForceGraph.stories.d.ts.map +1 -1
  39. package/dist/types/src/components/Graph/adapter.d.ts +1 -1
  40. package/dist/types/src/components/Graph/adapter.d.ts.map +1 -1
  41. package/dist/types/src/components/Graph/testing.d.ts +1 -1
  42. package/dist/types/src/components/Graph/testing.d.ts.map +1 -1
  43. package/dist/types/src/components/Tree/Tree.d.ts.map +1 -1
  44. package/dist/types/src/components/Tree/Tree.stories.d.ts +13 -16
  45. package/dist/types/src/components/Tree/Tree.stories.d.ts.map +1 -1
  46. package/dist/types/src/components/Tree/testing/generator.d.ts.map +1 -1
  47. package/dist/types/src/components/Tree/types/tree.d.ts +19 -17
  48. package/dist/types/src/components/Tree/types/tree.d.ts.map +1 -1
  49. package/dist/types/src/components/Tree/types/types.d.ts +1 -1
  50. package/dist/types/src/components/Tree/types/types.d.ts.map +1 -1
  51. package/dist/types/src/components/index.d.ts +0 -4
  52. package/dist/types/src/components/index.d.ts.map +1 -1
  53. package/dist/types/src/containers/ExplorerContainer/ExplorerContainer.d.ts +6 -0
  54. package/dist/types/src/containers/ExplorerContainer/ExplorerContainer.d.ts.map +1 -0
  55. package/dist/types/src/containers/ExplorerContainer/index.d.ts +2 -0
  56. package/dist/types/src/containers/ExplorerContainer/index.d.ts.map +1 -0
  57. package/dist/types/src/containers/index.d.ts +3 -0
  58. package/dist/types/src/containers/index.d.ts.map +1 -0
  59. package/dist/types/src/hooks/useGraphModel.d.ts +2 -2
  60. package/dist/types/src/hooks/useGraphModel.d.ts.map +1 -1
  61. package/dist/types/src/meta.d.ts +2 -3
  62. package/dist/types/src/meta.d.ts.map +1 -1
  63. package/dist/types/src/translations.d.ts +34 -11
  64. package/dist/types/src/translations.d.ts.map +1 -1
  65. package/dist/types/src/types/ExplorerAction.d.ts +6 -0
  66. package/dist/types/src/types/ExplorerAction.d.ts.map +1 -0
  67. package/dist/types/src/types/Graph.d.ts +23 -0
  68. package/dist/types/src/types/Graph.d.ts.map +1 -0
  69. package/dist/types/src/types/index.d.ts +2 -2
  70. package/dist/types/src/types/index.d.ts.map +1 -1
  71. package/dist/types/tsconfig.tsbuildinfo +1 -1
  72. package/package.json +62 -44
  73. package/src/ExplorerPlugin.tsx +43 -53
  74. package/src/capabilities/index.ts +2 -3
  75. package/src/capabilities/react-surface.tsx +24 -15
  76. package/src/components/Chart/Chart.stories.tsx +9 -8
  77. package/src/components/Chart/Chart.tsx +1 -1
  78. package/src/components/Globe/Globe.stories.tsx +13 -12
  79. package/src/components/Globe/Globe.tsx +1 -1
  80. package/src/components/Graph/D3ForceGraph.stories.tsx +47 -28
  81. package/src/components/Graph/D3ForceGraph.tsx +83 -76
  82. package/src/components/Graph/ForceGraph.stories.tsx +47 -28
  83. package/src/components/Graph/ForceGraph.tsx +5 -5
  84. package/src/components/Graph/adapter.ts +14 -8
  85. package/src/components/Graph/testing.ts +13 -10
  86. package/src/components/Tree/Tree.stories.tsx +34 -25
  87. package/src/components/Tree/Tree.tsx +11 -6
  88. package/src/components/Tree/testing/generator.ts +4 -2
  89. package/src/components/Tree/types/tree.test.ts +9 -7
  90. package/src/components/Tree/types/tree.ts +42 -21
  91. package/src/components/Tree/types/types.ts +1 -1
  92. package/src/components/index.ts +0 -4
  93. package/src/containers/ExplorerContainer/ExplorerContainer.tsx +53 -0
  94. package/src/containers/ExplorerContainer/index.ts +5 -0
  95. package/src/containers/index.ts +7 -0
  96. package/src/hooks/useGraphModel.ts +19 -11
  97. package/src/meta.ts +9 -6
  98. package/src/translations.ts +17 -10
  99. package/src/types/ExplorerAction.ts +20 -0
  100. package/src/types/Graph.ts +49 -0
  101. package/src/types/index.ts +2 -2
  102. package/src/typings.d.ts +8 -0
  103. package/dist/lib/browser/ExplorerContainer-WYPM7YXU.mjs +0 -37
  104. package/dist/lib/browser/ExplorerContainer-WYPM7YXU.mjs.map +0 -7
  105. package/dist/lib/browser/chunk-4UVJNXCE.mjs +0 -11329
  106. package/dist/lib/browser/chunk-4UVJNXCE.mjs.map +0 -7
  107. package/dist/lib/browser/chunk-EF4BFHTI.mjs +0 -38
  108. package/dist/lib/browser/chunk-EF4BFHTI.mjs.map +0 -7
  109. package/dist/lib/browser/chunk-OAOY7SHY.mjs +0 -30
  110. package/dist/lib/browser/chunk-OAOY7SHY.mjs.map +0 -7
  111. package/dist/lib/browser/chunk-UL5EDJPE.mjs +0 -21
  112. package/dist/lib/browser/chunk-UL5EDJPE.mjs.map +0 -7
  113. package/dist/lib/browser/chunk-ZZX52LNU.mjs +0 -187
  114. package/dist/lib/browser/chunk-ZZX52LNU.mjs.map +0 -7
  115. package/dist/lib/browser/intent-resolver-XH2UO2FM.mjs +0 -24
  116. package/dist/lib/browser/intent-resolver-XH2UO2FM.mjs.map +0 -7
  117. package/dist/lib/browser/react-surface-5ENPAK3V.mjs +0 -31
  118. package/dist/lib/browser/react-surface-5ENPAK3V.mjs.map +0 -7
  119. package/dist/lib/node-esm/ExplorerContainer-S5GL733T.mjs +0 -38
  120. package/dist/lib/node-esm/ExplorerContainer-S5GL733T.mjs.map +0 -7
  121. package/dist/lib/node-esm/chunk-6M6W7DKH.mjs +0 -189
  122. package/dist/lib/node-esm/chunk-6M6W7DKH.mjs.map +0 -7
  123. package/dist/lib/node-esm/chunk-HCV3J2HM.mjs +0 -11331
  124. package/dist/lib/node-esm/chunk-HCV3J2HM.mjs.map +0 -7
  125. package/dist/lib/node-esm/chunk-PIAXA43R.mjs.map +0 -7
  126. package/dist/lib/node-esm/chunk-PPBUWC7F.mjs +0 -32
  127. package/dist/lib/node-esm/chunk-PPBUWC7F.mjs.map +0 -7
  128. package/dist/lib/node-esm/chunk-VKCOKQRG.mjs +0 -39
  129. package/dist/lib/node-esm/chunk-VKCOKQRG.mjs.map +0 -7
  130. package/dist/lib/node-esm/intent-resolver-AGBBNA67.mjs +0 -25
  131. package/dist/lib/node-esm/intent-resolver-AGBBNA67.mjs.map +0 -7
  132. package/dist/lib/node-esm/react-surface-4MDNPYQ6.mjs +0 -32
  133. package/dist/lib/node-esm/react-surface-4MDNPYQ6.mjs.map +0 -7
  134. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  135. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  136. package/dist/types/src/components/ExplorerContainer.d.ts +0 -9
  137. package/dist/types/src/components/ExplorerContainer.d.ts.map +0 -1
  138. package/dist/types/src/types/schema.d.ts +0 -12
  139. package/dist/types/src/types/schema.d.ts.map +0 -1
  140. package/dist/types/src/types/types.d.ts +0 -18
  141. package/dist/types/src/types/types.d.ts.map +0 -1
  142. package/src/capabilities/intent-resolver.ts +0 -19
  143. package/src/components/ExplorerContainer.tsx +0 -36
  144. package/src/types/schema.ts +0 -16
  145. package/src/types/types.ts +0 -21
@@ -1,38 +0,0 @@
1
- import {
2
- EXPLORER_PLUGIN
3
- } from "./chunk-UL5EDJPE.mjs";
4
-
5
- // src/types/schema.ts
6
- import { Schema } from "effect";
7
- import { TypedObject } from "@dxos/echo-schema";
8
- var ViewType = class extends TypedObject({
9
- typename: "dxos.org/type/ExplorerView",
10
- version: "0.1.0"
11
- })({
12
- name: Schema.optional(Schema.String),
13
- type: Schema.String
14
- }) {
15
- };
16
-
17
- // src/types/types.ts
18
- import { Schema as Schema2 } from "effect";
19
- (function(ExplorerAction2) {
20
- const EXPLORER_ACTION = `${EXPLORER_PLUGIN}/action`;
21
- class Create extends Schema2.TaggedClass()(`${EXPLORER_ACTION}/create`, {
22
- input: Schema2.Struct({
23
- name: Schema2.optional(Schema2.String)
24
- }),
25
- output: Schema2.Struct({
26
- object: ViewType
27
- })
28
- }) {
29
- }
30
- ExplorerAction2.Create = Create;
31
- })(ExplorerAction || (ExplorerAction = {}));
32
- var ExplorerAction;
33
-
34
- export {
35
- ViewType,
36
- ExplorerAction
37
- };
38
- //# sourceMappingURL=chunk-EF4BFHTI.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/types/schema.ts", "../../../src/types/types.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Schema } from 'effect';\n\nimport { TypedObject } from '@dxos/echo-schema';\n\n// TODO(burdon): Clashes with sdk/view.\nexport class ViewType extends TypedObject({\n typename: 'dxos.org/type/ExplorerView',\n version: '0.1.0',\n})({\n name: Schema.optional(Schema.String),\n type: Schema.String,\n}) {}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Schema } from 'effect';\n\nimport { ViewType } from './schema';\nimport { EXPLORER_PLUGIN } from '../meta';\n\nexport namespace ExplorerAction {\n const EXPLORER_ACTION = `${EXPLORER_PLUGIN}/action`;\n\n export class Create extends Schema.TaggedClass<Create>()(`${EXPLORER_ACTION}/create`, {\n input: Schema.Struct({\n name: Schema.optional(Schema.String),\n }),\n output: Schema.Struct({\n object: ViewType,\n }),\n }) {}\n}\n"],
5
- "mappings": ";;;;;AAIA,SAASA,cAAc;AAEvB,SAASC,mBAAmB;AAGrB,IAAMC,WAAN,cAAuBC,YAAY;EACxCC,UAAU;EACVC,SAAS;AACX,CAAA,EAAG;EACDC,MAAMC,OAAOC,SAASD,OAAOE,MAAM;EACnCC,MAAMH,OAAOE;AACf,CAAA,EAAA;AAAI;;;ACXJ,SAASE,UAAAA,eAAc;UAKNC,iBAAAA;AACf,QAAMC,kBAAkB,GAAGC,eAAAA;EAEpB,MAAMC,eAAeC,QAAOC,YAAW,EAAW,GAAGJ,eAAAA,WAA0B;IACpFK,OAAOF,QAAOG,OAAO;MACnBC,MAAMJ,QAAOK,SAASL,QAAOM,MAAM;IACrC,CAAA;IACAC,QAAQP,QAAOG,OAAO;MACpBK,QAAQC;IACV,CAAA;EACF,CAAA,EAAA;EAAI;kBAPSV,SAAAA;AAQf,GAXiBH,mBAAAA,iBAAAA,CAAAA,EAAAA;;",
6
- "names": ["Schema", "TypedObject", "ViewType", "TypedObject", "typename", "version", "name", "Schema", "optional", "String", "type", "Schema", "ExplorerAction", "EXPLORER_ACTION", "EXPLORER_PLUGIN", "Create", "Schema", "TaggedClass", "input", "Struct", "name", "optional", "String", "output", "object", "ViewType"]
7
- }
@@ -1,30 +0,0 @@
1
- // src/hooks/useGraphModel.ts
2
- import { useEffect, useState } from "react";
3
- import { SpaceGraphModel } from "@dxos/schema";
4
- var useGraphModel = (space, filter, options) => {
5
- const [model, setModel] = useState(void 0);
6
- useEffect(() => {
7
- if (!space) {
8
- void model?.close();
9
- setModel(void 0);
10
- return;
11
- }
12
- if (!model) {
13
- const model2 = new SpaceGraphModel().setFilter(filter).setOptions(options);
14
- void model2.open(space);
15
- setModel(model2);
16
- } else {
17
- model.setFilter(filter).setOptions(options);
18
- }
19
- }, [
20
- space,
21
- filter,
22
- options
23
- ]);
24
- return model;
25
- };
26
-
27
- export {
28
- useGraphModel
29
- };
30
- //# sourceMappingURL=chunk-OAOY7SHY.mjs.map
@@ -1,7 +0,0 @@
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 { type Filter, 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): SpaceGraphModel | undefined => {\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) {\n const model = new SpaceGraphModel().setFilter(filter).setOptions(options);\n void model.open(space);\n setModel(model);\n } else {\n model.setFilter(filter).setOptions(options);\n }\n }, [space, filter, options]);\n\n return model;\n};\n"],
5
- "mappings": ";AAIA,SAASA,WAAWC,gBAAgB;AAGpC,SAASC,uBAAoD;AAGtD,IAAMC,gBAAgB,CAC3BC,OACAC,QACAC,YAAAA;AAEA,QAAM,CAACC,OAAOC,QAAAA,IAAYC,SAAsCC,MAAAA;AAChEC,YAAU,MAAA;AACR,QAAI,CAACP,OAAO;AACV,WAAKG,OAAOK,MAAAA;AACZJ,eAASE,MAAAA;AACT;IACF;AAGA,QAAI,CAACH,OAAO;AACV,YAAMA,SAAQ,IAAIM,gBAAAA,EAAkBC,UAAUT,MAAAA,EAAQU,WAAWT,OAAAA;AACjE,WAAKC,OAAMS,KAAKZ,KAAAA;AAChBI,eAASD,MAAAA;IACX,OAAO;AACLA,YAAMO,UAAUT,MAAAA,EAAQU,WAAWT,OAAAA;IACrC;EACF,GAAG;IAACF;IAAOC;IAAQC;GAAQ;AAE3B,SAAOC;AACT;",
6
- "names": ["useEffect", "useState", "SpaceGraphModel", "useGraphModel", "space", "filter", "options", "model", "setModel", "useState", "undefined", "useEffect", "close", "SpaceGraphModel", "setFilter", "setOptions", "open"]
7
- }
@@ -1,21 +0,0 @@
1
- // src/meta.ts
2
- var EXPLORER_PLUGIN = "dxos.org/plugin/explorer";
3
- var meta = {
4
- id: EXPLORER_PLUGIN,
5
- name: "Explorer",
6
- description: "Install this plugin to view a hypergraph of all objects inside of your Space.",
7
- icon: "ph--graph--regular",
8
- source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-explorer",
9
- tags: [
10
- "labs"
11
- ],
12
- screenshots: [
13
- "https://dxos.network/plugin-details-explorer-dark.png"
14
- ]
15
- };
16
-
17
- export {
18
- EXPLORER_PLUGIN,
19
- meta
20
- };
21
- //# sourceMappingURL=chunk-UL5EDJPE.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/meta.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\n\nexport const EXPLORER_PLUGIN = 'dxos.org/plugin/explorer';\n\nexport const meta: PluginMeta = {\n id: EXPLORER_PLUGIN,\n name: 'Explorer',\n description: 'Install this plugin to view a hypergraph of all objects inside of your Space.',\n icon: 'ph--graph--regular',\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": ";AAMO,IAAMA,kBAAkB;AAExB,IAAMC,OAAmB;EAC9BC,IAAIF;EACJG,MAAM;EACNC,aAAa;EACbC,MAAM;EACNC,QAAQ;EACRC,MAAM;IAAC;;EACPC,aAAa;IAAC;;AAChB;",
6
- "names": ["EXPLORER_PLUGIN", "meta", "id", "name", "description", "icon", "source", "tags", "screenshots"]
7
- }
@@ -1,187 +0,0 @@
1
- // src/components/Graph/D3ForceGraph.tsx
2
- import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
3
- import React, { useCallback, useEffect, useMemo, useRef } from "react";
4
- import { Obj } from "@dxos/echo";
5
- import { SelectionModel } from "@dxos/graph";
6
- import { GraphForceProjector, SVG } from "@dxos/react-ui-graph";
7
- import { getHashColor } from "@dxos/react-ui-theme";
8
- import "@dxos/react-ui-graph/styles/graph.css";
9
- var D3ForceGraph = ({ classNames, model, selection: _selection, grid, ...props }) => {
10
- var _effect = _useSignals();
11
- try {
12
- const context = useRef(null);
13
- const projector = useMemo(() => {
14
- if (context.current) {
15
- return new GraphForceProjector(context.current, {
16
- attributes: {
17
- linkForce: (edge) => {
18
- return edge.data?.object?.active !== false;
19
- }
20
- },
21
- forces: {
22
- point: {
23
- strength: 0.01
24
- }
25
- }
26
- });
27
- }
28
- }, [
29
- context.current
30
- ]);
31
- const graph = useRef(null);
32
- const selection = useMemo(() => _selection ?? new SelectionModel(), [
33
- _selection
34
- ]);
35
- useEffect(() => graph.current?.repaint(), [
36
- selection.selected.value
37
- ]);
38
- const handleSelect = useCallback((node) => {
39
- if (selection.contains(node.id)) {
40
- selection.remove(node.id);
41
- } else {
42
- selection.add(node.id);
43
- }
44
- }, [
45
- selection
46
- ]);
47
- return /* @__PURE__ */ React.createElement(SVG.Root, {
48
- ref: context,
49
- classNames
50
- }, /* @__PURE__ */ React.createElement(SVG.Markers, null), grid && /* @__PURE__ */ React.createElement(SVG.Grid, {
51
- axis: true
52
- }), /* @__PURE__ */ React.createElement(SVG.Zoom, {
53
- extent: [
54
- 1 / 2,
55
- 2
56
- ]
57
- }, /* @__PURE__ */ React.createElement(SVG.Graph, {
58
- ...props,
59
- ref: graph,
60
- model,
61
- projector,
62
- labels: {
63
- text: (node) => {
64
- return node.data?.data.label ?? node.id;
65
- }
66
- },
67
- attributes: {
68
- node: (node) => {
69
- const obj = node.data?.data.object;
70
- return {
71
- data: {
72
- color: getHashColor(obj && Obj.getTypename(obj))?.color
73
- },
74
- classes: {
75
- "dx-selected": selection.contains(node.id)
76
- }
77
- };
78
- }
79
- },
80
- onSelect: handleSelect
81
- })));
82
- } finally {
83
- _effect.f();
84
- }
85
- };
86
-
87
- // src/components/Graph/ForceGraph.tsx
88
- import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
89
- import { forceLink, forceManyBody } from "d3";
90
- import NativeForceGraph from "force-graph";
91
- import React2, { useEffect as useEffect2, useRef as useRef2, useState } from "react";
92
- import { useResizeDetector } from "react-resize-detector";
93
- import { filterObjectsSync } from "@dxos/plugin-search";
94
-
95
- // src/components/Graph/adapter.ts
96
- var GraphAdapter = class {
97
- constructor(graph) {
98
- this.graph = graph;
99
- this._nodes = [];
100
- this._links = [];
101
- this._nodes = graph.nodes.map((node) => ({
102
- id: node.id,
103
- type: node.type,
104
- data: node.data
105
- }));
106
- this._links = graph.edges.map((edge) => ({
107
- type: edge.type,
108
- source: edge.source,
109
- target: edge.target,
110
- data: edge.data
111
- }));
112
- }
113
- get nodes() {
114
- return this._nodes;
115
- }
116
- get links() {
117
- return this._links;
118
- }
119
- };
120
-
121
- // src/components/Graph/ForceGraph.tsx
122
- var ForceGraph = ({ model, match }) => {
123
- var _effect = _useSignals2();
124
- try {
125
- const { ref, width, height } = useResizeDetector({
126
- refreshRate: 200
127
- });
128
- const rootRef = useRef2(null);
129
- const forceGraph = useRef2();
130
- const filteredRef = useRef2();
131
- filteredRef.current = filterObjectsSync(model?.objects ?? [], match);
132
- const [data, setData] = useState();
133
- useEffect2(() => {
134
- return model?.subscribe((model2) => {
135
- setData(new GraphAdapter(model2.graph));
136
- });
137
- }, [
138
- model
139
- ]);
140
- useEffect2(() => {
141
- if (rootRef.current) {
142
- 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);
143
- }
144
- return () => {
145
- forceGraph.current?.pauseAnimation().graphData({
146
- nodes: [],
147
- links: []
148
- });
149
- forceGraph.current = void 0;
150
- };
151
- }, []);
152
- useEffect2(() => {
153
- if (!data || !width || !height || !forceGraph.current) {
154
- return;
155
- }
156
- forceGraph.current.pauseAnimation().width(width).height(height).onEngineStop(() => {
157
- handleZoomToFit();
158
- }).onNodeClick((node) => {
159
- forceGraph.current?.emitParticle(node);
160
- }).d3Force("link", forceLink().distance(160).strength(0.5)).d3Force("charge", forceManyBody().strength(-30)).graphData(data).warmupTicks(100).cooldownTime(1e3).resumeAnimation();
161
- }, [
162
- data,
163
- width,
164
- height,
165
- forceGraph.current
166
- ]);
167
- const handleZoomToFit = () => {
168
- forceGraph.current?.zoomToFit(400, 40);
169
- };
170
- return /* @__PURE__ */ React2.createElement("div", {
171
- ref,
172
- className: "relative grow",
173
- onClick: handleZoomToFit
174
- }, /* @__PURE__ */ React2.createElement("div", {
175
- ref: rootRef,
176
- className: "absolute inset-0"
177
- }));
178
- } finally {
179
- _effect.f();
180
- }
181
- };
182
-
183
- export {
184
- D3ForceGraph,
185
- ForceGraph
186
- };
187
- //# sourceMappingURL=chunk-ZZX52LNU.mjs.map
@@ -1,7 +0,0 @@
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, { type FC, 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 { getHashColor } from '@dxos/react-ui-theme';\nimport { type SpaceGraphNode, type SpaceGraphModel, type SpaceGraphEdge } from '@dxos/schema';\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: FC<D3ForceGraphProps> = ({ classNames, model, selection: _selection, grid, ...props }) => {\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(() => graph.current?.repaint(), [selection.selected.value]);\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: getHashColor(obj && Obj.getTypename(obj))?.color,\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 { filterObjectsSync, type SearchResult } 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>();\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 = undefined;\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) {\n this._nodes = graph.nodes.map((node) => ({\n id: node.id,\n type: node.type,\n data: node.data,\n }));\n\n this._links = graph.edges.map((edge) => ({\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", "getHashColor", "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", "repaint", "selected", "value", "handleSelect", "useCallback", "node", "contains", "id", "remove", "add", "SVG", "Root", "ref", "Markers", "Grid", "axis", "Zoom", "extent", "Graph", "labels", "text", "label", "obj", "color", "getHashColor", "Obj", "getTypename", "classes", "onSelect", "forceLink", "forceManyBody", "NativeForceGraph", "React", "useEffect", "useRef", "useState", "useResizeDetector", "filterObjectsSync", "GraphAdapter", "graph", "_nodes", "_links", "nodes", "map", "node", "id", "type", "data", "edges", "edge", "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", "undefined", "onEngineStop", "handleZoomToFit", "onNodeClick", "emitParticle", "d3Force", "forceLink", "distance", "strength", "forceManyBody", "warmupTicks", "cooldownTime", "resumeAnimation", "zoomToFit", "React", "div", "className", "onClick"]
7
- }
@@ -1,24 +0,0 @@
1
- import {
2
- ExplorerAction,
3
- ViewType
4
- } from "./chunk-EF4BFHTI.mjs";
5
- import "./chunk-UL5EDJPE.mjs";
6
-
7
- // src/capabilities/intent-resolver.ts
8
- import { contributes, Capabilities, createResolver } from "@dxos/app-framework";
9
- import { Obj } from "@dxos/echo";
10
- var intent_resolver_default = () => contributes(Capabilities.IntentResolver, createResolver({
11
- intent: ExplorerAction.Create,
12
- resolve: ({ name }) => ({
13
- data: {
14
- object: Obj.make(ViewType, {
15
- name,
16
- type: ""
17
- })
18
- }
19
- })
20
- }));
21
- export {
22
- intent_resolver_default as default
23
- };
24
- //# sourceMappingURL=intent-resolver-XH2UO2FM.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/intent-resolver.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { contributes, Capabilities, createResolver } from '@dxos/app-framework';\nimport { Obj } from '@dxos/echo';\n\nimport { ExplorerAction, ViewType } from '../types';\n\nexport default () =>\n contributes(\n Capabilities.IntentResolver,\n createResolver({\n intent: ExplorerAction.Create,\n resolve: ({ name }) => ({\n data: { object: Obj.make(ViewType, { name, type: '' }) },\n }),\n }),\n );\n"],
5
- "mappings": ";;;;;;;AAIA,SAASA,aAAaC,cAAcC,sBAAsB;AAC1D,SAASC,WAAW;AAIpB,IAAA,0BAAe,MACbC,YACEC,aAAaC,gBACbC,eAAe;EACbC,QAAQC,eAAeC;EACvBC,SAAS,CAAC,EAAEC,KAAI,OAAQ;IACtBC,MAAM;MAAEC,QAAQC,IAAIC,KAAKC,UAAU;QAAEL;QAAMM,MAAM;MAAG,CAAA;IAAG;EACzD;AACF,CAAA,CAAA;",
6
- "names": ["contributes", "Capabilities", "createResolver", "Obj", "contributes", "Capabilities", "IntentResolver", "createResolver", "intent", "ExplorerAction", "Create", "resolve", "name", "data", "object", "Obj", "make", "ViewType", "type"]
7
- }
@@ -1,31 +0,0 @@
1
- import {
2
- ExplorerContainer
3
- } from "./chunk-4UVJNXCE.mjs";
4
- import "./chunk-ZZX52LNU.mjs";
5
- import {
6
- ViewType
7
- } from "./chunk-EF4BFHTI.mjs";
8
- import {
9
- EXPLORER_PLUGIN
10
- } from "./chunk-UL5EDJPE.mjs";
11
-
12
- // src/capabilities/react-surface.tsx
13
- import React from "react";
14
- import { Capabilities, contributes, createSurface } from "@dxos/app-framework";
15
- import { Obj } from "@dxos/echo";
16
- var react_surface_default = () => contributes(Capabilities.ReactSurface, createSurface({
17
- id: `${EXPLORER_PLUGIN}/article`,
18
- role: [
19
- "article",
20
- "section"
21
- ],
22
- filter: (data) => Obj.instanceOf(ViewType, data.subject),
23
- component: ({ data, role }) => /* @__PURE__ */ React.createElement(ExplorerContainer, {
24
- view: data.subject,
25
- role
26
- })
27
- }));
28
- export {
29
- react_surface_default as default
30
- };
31
- //# sourceMappingURL=react-surface-5ENPAK3V.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/react-surface.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Capabilities, contributes, createSurface } from '@dxos/app-framework';\nimport { Obj } from '@dxos/echo';\n\nimport { ExplorerContainer } from '../components';\nimport { EXPLORER_PLUGIN } from '../meta';\nimport { ViewType } from '../types';\n\nexport default () =>\n contributes(\n Capabilities.ReactSurface,\n createSurface({\n id: `${EXPLORER_PLUGIN}/article`,\n role: ['article', 'section'],\n filter: (data): data is { subject: ViewType } => Obj.instanceOf(ViewType, data.subject),\n component: ({ data, role }) => <ExplorerContainer view={data.subject} role={role} />,\n }),\n );\n"],
5
- "mappings": ";;;;;;;;;;;;AAIA,OAAOA,WAAW;AAElB,SAASC,cAAcC,aAAaC,qBAAqB;AACzD,SAASC,WAAW;AAMpB,IAAA,wBAAe,MACbC,YACEC,aAAaC,cACbC,cAAc;EACZC,IAAI,GAAGC,eAAAA;EACPC,MAAM;IAAC;IAAW;;EAClBC,QAAQ,CAACC,SAAwCC,IAAIC,WAAWC,UAAUH,KAAKI,OAAO;EACtFC,WAAW,CAAC,EAAEL,MAAMF,KAAI,MAAO,sBAAA,cAACQ,mBAAAA;IAAkBC,MAAMP,KAAKI;IAASN;;AACxE,CAAA,CAAA;",
6
- "names": ["React", "Capabilities", "contributes", "createSurface", "Obj", "contributes", "Capabilities", "ReactSurface", "createSurface", "id", "EXPLORER_PLUGIN", "role", "filter", "data", "Obj", "instanceOf", "ViewType", "subject", "component", "ExplorerContainer", "view"]
7
- }
@@ -1,38 +0,0 @@
1
- import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
- import {
3
- useGraphModel
4
- } from "./chunk-PPBUWC7F.mjs";
5
- import {
6
- D3ForceGraph
7
- } from "./chunk-6M6W7DKH.mjs";
8
-
9
- // src/components/ExplorerContainer.tsx
10
- import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
11
- import React from "react";
12
- import { useGlobalSearch } from "@dxos/plugin-search";
13
- import { getSpace } from "@dxos/react-client/echo";
14
- import { StackItem } from "@dxos/react-ui-stack";
15
- var ExplorerContainer = ({ role, view }) => {
16
- var _effect = _useSignals();
17
- try {
18
- const space = getSpace(view);
19
- const model = useGraphModel(space);
20
- const { match } = useGlobalSearch();
21
- if (!space || !model) {
22
- return null;
23
- }
24
- return /* @__PURE__ */ React.createElement(StackItem.Content, {
25
- size: role === "section" ? "square" : "intrinsic"
26
- }, /* @__PURE__ */ React.createElement(D3ForceGraph, {
27
- model,
28
- match
29
- }));
30
- } finally {
31
- _effect.f();
32
- }
33
- };
34
- var ExplorerContainer_default = ExplorerContainer;
35
- export {
36
- ExplorerContainer_default as default
37
- };
38
- //# sourceMappingURL=ExplorerContainer-S5GL733T.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/ExplorerContainer.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { useGlobalSearch } from '@dxos/plugin-search';\nimport { getSpace } from '@dxos/react-client/echo';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { D3ForceGraph } from './Graph';\nimport { useGraphModel } from '../hooks';\nimport { type ViewType } from '../types';\n\ntype ExplorerContainerProps = {\n role: string;\n view: ViewType;\n};\n\nconst ExplorerContainer = ({ role, view }: ExplorerContainerProps) => {\n const space = getSpace(view);\n const model = useGraphModel(space);\n const { match } = useGlobalSearch();\n\n if (!space || !model) {\n return null;\n }\n\n return (\n <StackItem.Content size={role === 'section' ? 'square' : 'intrinsic'}>\n <D3ForceGraph model={model} match={match} />\n </StackItem.Content>\n );\n};\n\nexport default ExplorerContainer;\n"],
5
- "mappings": ";;;;;;;;;;AAIA,OAAOA,WAAW;AAElB,SAASC,uBAAuB;AAChC,SAASC,gBAAgB;AACzB,SAASC,iBAAiB;AAW1B,IAAMC,oBAAoB,CAAC,EAAEC,MAAMC,KAAI,MAA0B;;;AAC/D,UAAMC,QAAQC,SAASF,IAAAA;AACvB,UAAMG,QAAQC,cAAcH,KAAAA;AAC5B,UAAM,EAAEI,MAAK,IAAKC,gBAAAA;AAElB,QAAI,CAACL,SAAS,CAACE,OAAO;AACpB,aAAO;IACT;AAEA,WACE,sBAAA,cAACI,UAAUC,SAAO;MAACC,MAAMV,SAAS,YAAY,WAAW;OACvD,sBAAA,cAACW,cAAAA;MAAaP;MAAcE;;;;;AAGlC;AAEA,IAAA,4BAAeP;",
6
- "names": ["React", "useGlobalSearch", "getSpace", "StackItem", "ExplorerContainer", "role", "view", "space", "getSpace", "model", "useGraphModel", "match", "useGlobalSearch", "StackItem", "Content", "size", "D3ForceGraph"]
7
- }
@@ -1,189 +0,0 @@
1
- import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
-
3
- // src/components/Graph/D3ForceGraph.tsx
4
- import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
5
- import React, { useCallback, useEffect, useMemo, useRef } from "react";
6
- import { Obj } from "@dxos/echo";
7
- import { SelectionModel } from "@dxos/graph";
8
- import { GraphForceProjector, SVG } from "@dxos/react-ui-graph";
9
- import { getHashColor } from "@dxos/react-ui-theme";
10
- import "@dxos/react-ui-graph/styles/graph.css";
11
- var D3ForceGraph = ({ classNames, model, selection: _selection, grid, ...props }) => {
12
- var _effect = _useSignals();
13
- try {
14
- const context = useRef(null);
15
- const projector = useMemo(() => {
16
- if (context.current) {
17
- return new GraphForceProjector(context.current, {
18
- attributes: {
19
- linkForce: (edge) => {
20
- return edge.data?.object?.active !== false;
21
- }
22
- },
23
- forces: {
24
- point: {
25
- strength: 0.01
26
- }
27
- }
28
- });
29
- }
30
- }, [
31
- context.current
32
- ]);
33
- const graph = useRef(null);
34
- const selection = useMemo(() => _selection ?? new SelectionModel(), [
35
- _selection
36
- ]);
37
- useEffect(() => graph.current?.repaint(), [
38
- selection.selected.value
39
- ]);
40
- const handleSelect = useCallback((node) => {
41
- if (selection.contains(node.id)) {
42
- selection.remove(node.id);
43
- } else {
44
- selection.add(node.id);
45
- }
46
- }, [
47
- selection
48
- ]);
49
- return /* @__PURE__ */ React.createElement(SVG.Root, {
50
- ref: context,
51
- classNames
52
- }, /* @__PURE__ */ React.createElement(SVG.Markers, null), grid && /* @__PURE__ */ React.createElement(SVG.Grid, {
53
- axis: true
54
- }), /* @__PURE__ */ React.createElement(SVG.Zoom, {
55
- extent: [
56
- 1 / 2,
57
- 2
58
- ]
59
- }, /* @__PURE__ */ React.createElement(SVG.Graph, {
60
- ...props,
61
- ref: graph,
62
- model,
63
- projector,
64
- labels: {
65
- text: (node) => {
66
- return node.data?.data.label ?? node.id;
67
- }
68
- },
69
- attributes: {
70
- node: (node) => {
71
- const obj = node.data?.data.object;
72
- return {
73
- data: {
74
- color: getHashColor(obj && Obj.getTypename(obj))?.color
75
- },
76
- classes: {
77
- "dx-selected": selection.contains(node.id)
78
- }
79
- };
80
- }
81
- },
82
- onSelect: handleSelect
83
- })));
84
- } finally {
85
- _effect.f();
86
- }
87
- };
88
-
89
- // src/components/Graph/ForceGraph.tsx
90
- import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
91
- import { forceLink, forceManyBody } from "d3";
92
- import NativeForceGraph from "force-graph";
93
- import React2, { useEffect as useEffect2, useRef as useRef2, useState } from "react";
94
- import { useResizeDetector } from "react-resize-detector";
95
- import { filterObjectsSync } from "@dxos/plugin-search";
96
-
97
- // src/components/Graph/adapter.ts
98
- var GraphAdapter = class {
99
- constructor(graph) {
100
- this.graph = graph;
101
- this._nodes = [];
102
- this._links = [];
103
- this._nodes = graph.nodes.map((node) => ({
104
- id: node.id,
105
- type: node.type,
106
- data: node.data
107
- }));
108
- this._links = graph.edges.map((edge) => ({
109
- type: edge.type,
110
- source: edge.source,
111
- target: edge.target,
112
- data: edge.data
113
- }));
114
- }
115
- get nodes() {
116
- return this._nodes;
117
- }
118
- get links() {
119
- return this._links;
120
- }
121
- };
122
-
123
- // src/components/Graph/ForceGraph.tsx
124
- var ForceGraph = ({ model, match }) => {
125
- var _effect = _useSignals2();
126
- try {
127
- const { ref, width, height } = useResizeDetector({
128
- refreshRate: 200
129
- });
130
- const rootRef = useRef2(null);
131
- const forceGraph = useRef2();
132
- const filteredRef = useRef2();
133
- filteredRef.current = filterObjectsSync(model?.objects ?? [], match);
134
- const [data, setData] = useState();
135
- useEffect2(() => {
136
- return model?.subscribe((model2) => {
137
- setData(new GraphAdapter(model2.graph));
138
- });
139
- }, [
140
- model
141
- ]);
142
- useEffect2(() => {
143
- if (rootRef.current) {
144
- 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);
145
- }
146
- return () => {
147
- forceGraph.current?.pauseAnimation().graphData({
148
- nodes: [],
149
- links: []
150
- });
151
- forceGraph.current = void 0;
152
- };
153
- }, []);
154
- useEffect2(() => {
155
- if (!data || !width || !height || !forceGraph.current) {
156
- return;
157
- }
158
- forceGraph.current.pauseAnimation().width(width).height(height).onEngineStop(() => {
159
- handleZoomToFit();
160
- }).onNodeClick((node) => {
161
- forceGraph.current?.emitParticle(node);
162
- }).d3Force("link", forceLink().distance(160).strength(0.5)).d3Force("charge", forceManyBody().strength(-30)).graphData(data).warmupTicks(100).cooldownTime(1e3).resumeAnimation();
163
- }, [
164
- data,
165
- width,
166
- height,
167
- forceGraph.current
168
- ]);
169
- const handleZoomToFit = () => {
170
- forceGraph.current?.zoomToFit(400, 40);
171
- };
172
- return /* @__PURE__ */ React2.createElement("div", {
173
- ref,
174
- className: "relative grow",
175
- onClick: handleZoomToFit
176
- }, /* @__PURE__ */ React2.createElement("div", {
177
- ref: rootRef,
178
- className: "absolute inset-0"
179
- }));
180
- } finally {
181
- _effect.f();
182
- }
183
- };
184
-
185
- export {
186
- D3ForceGraph,
187
- ForceGraph
188
- };
189
- //# sourceMappingURL=chunk-6M6W7DKH.mjs.map