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

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 (114) hide show
  1. package/dist/lib/browser/{ExplorerContainer-OGHSHZD5.mjs → ExplorerContainer-S66JDOAF.mjs} +18 -6
  2. package/dist/lib/browser/ExplorerContainer-S66JDOAF.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-UL5EDJPE.mjs → chunk-2DGFNLRO.mjs} +2 -4
  4. package/dist/lib/browser/chunk-2DGFNLRO.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-OAOY7SHY.mjs → chunk-2MKBRIUT.mjs} +6 -5
  6. package/dist/lib/browser/chunk-2MKBRIUT.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-EF4BFHTI.mjs → chunk-4ETQJYX4.mjs} +7 -7
  8. package/dist/lib/browser/chunk-4ETQJYX4.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-J2BBZOSF.mjs → chunk-NXGP6NTP.mjs} +28 -12
  10. package/dist/lib/browser/chunk-NXGP6NTP.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-PVFZFKQ6.mjs → chunk-UCDNCIRV.mjs} +36 -24
  12. package/dist/lib/browser/{chunk-PVFZFKQ6.mjs.map → chunk-UCDNCIRV.mjs.map} +3 -3
  13. package/dist/lib/browser/index.mjs +12 -12
  14. package/dist/lib/browser/index.mjs.map +3 -3
  15. package/dist/lib/browser/{intent-resolver-XH2UO2FM.mjs → intent-resolver-OXJJ3PII.mjs} +6 -6
  16. package/dist/lib/browser/{intent-resolver-XH2UO2FM.mjs.map → intent-resolver-OXJJ3PII.mjs.map} +3 -3
  17. package/dist/lib/browser/meta.json +1 -1
  18. package/dist/lib/browser/meta.mjs +1 -3
  19. package/dist/lib/browser/{react-surface-65VQ42HX.mjs → react-surface-C4EC6ZDZ.mjs} +9 -9
  20. package/dist/lib/browser/react-surface-C4EC6ZDZ.mjs.map +7 -0
  21. package/dist/lib/browser/types/index.mjs +2 -2
  22. package/dist/lib/node-esm/{ExplorerContainer-6ON5NA2P.mjs → ExplorerContainer-GIJN67DO.mjs} +18 -6
  23. package/dist/lib/node-esm/ExplorerContainer-GIJN67DO.mjs.map +7 -0
  24. package/dist/lib/node-esm/{chunk-PPBUWC7F.mjs → chunk-3ODK27PU.mjs} +6 -5
  25. package/dist/lib/node-esm/chunk-3ODK27PU.mjs.map +7 -0
  26. package/dist/lib/node-esm/{chunk-4VMSNXYL.mjs → chunk-6JACZE7E.mjs} +28 -12
  27. package/dist/lib/node-esm/chunk-6JACZE7E.mjs.map +7 -0
  28. package/dist/lib/node-esm/{chunk-VKCOKQRG.mjs → chunk-AGHU3KVI.mjs} +7 -7
  29. package/dist/lib/node-esm/chunk-AGHU3KVI.mjs.map +7 -0
  30. package/dist/lib/node-esm/{chunk-PIAXA43R.mjs → chunk-PX6LHR2N.mjs} +2 -4
  31. package/dist/lib/node-esm/chunk-PX6LHR2N.mjs.map +7 -0
  32. package/dist/lib/node-esm/{chunk-S5A2EUSJ.mjs → chunk-WHKUQG5M.mjs} +36 -24
  33. package/dist/lib/node-esm/{chunk-S5A2EUSJ.mjs.map → chunk-WHKUQG5M.mjs.map} +3 -3
  34. package/dist/lib/node-esm/index.mjs +12 -12
  35. package/dist/lib/node-esm/index.mjs.map +3 -3
  36. package/dist/lib/node-esm/{intent-resolver-AGBBNA67.mjs → intent-resolver-GVM36TJX.mjs} +6 -6
  37. package/dist/lib/node-esm/{intent-resolver-AGBBNA67.mjs.map → intent-resolver-GVM36TJX.mjs.map} +3 -3
  38. package/dist/lib/node-esm/meta.json +1 -1
  39. package/dist/lib/node-esm/meta.mjs +1 -3
  40. package/dist/lib/node-esm/{react-surface-IJIMYAST.mjs → react-surface-YGGLTBF3.mjs} +9 -9
  41. package/dist/lib/node-esm/react-surface-YGGLTBF3.mjs.map +7 -0
  42. package/dist/lib/node-esm/types/index.mjs +2 -2
  43. package/dist/types/src/ExplorerPlugin.d.ts +1 -1
  44. package/dist/types/src/ExplorerPlugin.d.ts.map +1 -1
  45. package/dist/types/src/capabilities/index.d.ts +2 -2
  46. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  47. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  48. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  49. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  50. package/dist/types/src/components/Chart/Chart.d.ts.map +1 -1
  51. package/dist/types/src/components/Chart/Chart.stories.d.ts +8 -4
  52. package/dist/types/src/components/Chart/Chart.stories.d.ts.map +1 -1
  53. package/dist/types/src/components/ExplorerContainer.d.ts.map +1 -1
  54. package/dist/types/src/components/Globe/Globe.d.ts.map +1 -1
  55. package/dist/types/src/components/Globe/Globe.stories.d.ts +8 -4
  56. package/dist/types/src/components/Globe/Globe.stories.d.ts.map +1 -1
  57. package/dist/types/src/components/Graph/D3ForceGraph.d.ts +2 -2
  58. package/dist/types/src/components/Graph/D3ForceGraph.d.ts.map +1 -1
  59. package/dist/types/src/components/Graph/D3ForceGraph.stories.d.ts +13 -4
  60. package/dist/types/src/components/Graph/D3ForceGraph.stories.d.ts.map +1 -1
  61. package/dist/types/src/components/Graph/ForceGraph.stories.d.ts +13 -4
  62. package/dist/types/src/components/Graph/ForceGraph.stories.d.ts.map +1 -1
  63. package/dist/types/src/components/Graph/testing.d.ts +1 -1
  64. package/dist/types/src/components/Graph/testing.d.ts.map +1 -1
  65. package/dist/types/src/components/Tree/Tree.stories.d.ts +13 -16
  66. package/dist/types/src/components/Tree/Tree.stories.d.ts.map +1 -1
  67. package/dist/types/src/components/Tree/types/tree.d.ts +1 -1
  68. package/dist/types/src/components/Tree/types/tree.d.ts.map +1 -1
  69. package/dist/types/src/hooks/useGraphModel.d.ts +2 -2
  70. package/dist/types/src/hooks/useGraphModel.d.ts.map +1 -1
  71. package/dist/types/src/meta.d.ts +0 -1
  72. package/dist/types/src/meta.d.ts.map +1 -1
  73. package/dist/types/src/translations.d.ts +12 -0
  74. package/dist/types/src/translations.d.ts.map +1 -1
  75. package/dist/types/src/types/schema.d.ts +3 -3
  76. package/dist/types/src/types/schema.d.ts.map +1 -1
  77. package/dist/types/src/types/types.d.ts +3 -3
  78. package/dist/types/src/types/types.d.ts.map +1 -1
  79. package/dist/types/tsconfig.tsbuildinfo +1 -1
  80. package/package.json +40 -36
  81. package/src/ExplorerPlugin.tsx +46 -47
  82. package/src/capabilities/intent-resolver.ts +1 -1
  83. package/src/capabilities/react-surface.tsx +2 -2
  84. package/src/components/Chart/Chart.stories.tsx +9 -7
  85. package/src/components/Chart/Chart.tsx +1 -1
  86. package/src/components/ExplorerContainer.tsx +18 -4
  87. package/src/components/Globe/Globe.stories.tsx +14 -12
  88. package/src/components/Globe/Globe.tsx +1 -1
  89. package/src/components/Graph/D3ForceGraph.stories.tsx +15 -11
  90. package/src/components/Graph/D3ForceGraph.tsx +5 -5
  91. package/src/components/Graph/ForceGraph.stories.tsx +15 -11
  92. package/src/components/Graph/ForceGraph.tsx +4 -4
  93. package/src/components/Graph/testing.ts +2 -2
  94. package/src/components/Tree/Tree.stories.tsx +28 -22
  95. package/src/components/Tree/Tree.tsx +3 -3
  96. package/src/components/Tree/types/tree.test.ts +2 -1
  97. package/src/components/Tree/types/tree.ts +1 -1
  98. package/src/hooks/useGraphModel.ts +5 -4
  99. package/src/meta.ts +1 -3
  100. package/src/translations.ts +2 -0
  101. package/src/types/schema.ts +2 -2
  102. package/src/types/types.ts +4 -3
  103. package/dist/lib/browser/ExplorerContainer-OGHSHZD5.mjs.map +0 -7
  104. package/dist/lib/browser/chunk-EF4BFHTI.mjs.map +0 -7
  105. package/dist/lib/browser/chunk-J2BBZOSF.mjs.map +0 -7
  106. package/dist/lib/browser/chunk-OAOY7SHY.mjs.map +0 -7
  107. package/dist/lib/browser/chunk-UL5EDJPE.mjs.map +0 -7
  108. package/dist/lib/browser/react-surface-65VQ42HX.mjs.map +0 -7
  109. package/dist/lib/node-esm/ExplorerContainer-6ON5NA2P.mjs.map +0 -7
  110. package/dist/lib/node-esm/chunk-4VMSNXYL.mjs.map +0 -7
  111. package/dist/lib/node-esm/chunk-PIAXA43R.mjs.map +0 -7
  112. package/dist/lib/node-esm/chunk-PPBUWC7F.mjs.map +0 -7
  113. package/dist/lib/node-esm/chunk-VKCOKQRG.mjs.map +0 -7
  114. package/dist/lib/node-esm/react-surface-IJIMYAST.mjs.map +0 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/plugin-explorer",
3
- "version": "0.8.4-main.c1de068",
3
+ "version": "0.8.4-main.c4373fc",
4
4
  "description": "Braneframe data visualization plugin",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -10,16 +10,19 @@
10
10
  "type": "module",
11
11
  "exports": {
12
12
  ".": {
13
+ "source": "./src/index.ts",
13
14
  "types": "./dist/types/src/index.d.ts",
14
15
  "browser": "./dist/lib/browser/index.mjs",
15
16
  "node": "./dist/lib/node-esm/index.mjs"
16
17
  },
17
18
  "./meta": {
19
+ "source": "./src/meta.ts",
18
20
  "types": "./dist/types/src/meta.d.ts",
19
21
  "browser": "./dist/lib/browser/meta.mjs",
20
22
  "node": "./dist/lib/node-esm/meta.mjs"
21
23
  },
22
24
  "./types": {
25
+ "source": "./src/types/index.ts",
23
26
  "types": "./dist/types/src/types/index.d.ts",
24
27
  "browser": "./dist/lib/browser/types/index.mjs",
25
28
  "node": "./dist/lib/node-esm/types/index.mjs"
@@ -44,57 +47,58 @@
44
47
  "3d-force-graph": "^1.76.1",
45
48
  "@observablehq/plot": "^0.6.11",
46
49
  "@preact-signals/safe-react": "^0.9.0",
47
- "@preact/signals-core": "^1.9.0",
50
+ "@preact/signals-core": "^1.12.1",
48
51
  "d3": "^7.9.0",
49
- "effect": "3.17.0",
52
+ "effect": "3.18.3",
50
53
  "force-graph": "^1.49.4",
51
54
  "lodash.defaultsdeep": "^4.6.1",
52
55
  "react-resize-detector": "^11.0.1",
53
56
  "three": "^0.178.0",
54
57
  "topojson-client": "^3.1.0",
55
- "@dxos/app-framework": "0.8.4-main.c1de068",
56
- "@dxos/async": "0.8.4-main.c1de068",
57
- "@dxos/client": "0.8.4-main.c1de068",
58
- "@dxos/echo": "0.8.4-main.c1de068",
59
- "@dxos/echo-schema": "0.8.4-main.c1de068",
60
- "@dxos/invariant": "0.8.4-main.c1de068",
61
- "@dxos/graph": "0.8.4-main.c1de068",
62
- "@dxos/live-object": "0.8.4-main.c1de068",
63
- "@dxos/log": "0.8.4-main.c1de068",
64
- "@dxos/plugin-client": "0.8.4-main.c1de068",
65
- "@dxos/plugin-graph": "0.8.4-main.c1de068",
66
- "@dxos/plugin-space": "0.8.4-main.c1de068",
67
- "@dxos/plugin-search": "0.8.4-main.c1de068",
68
- "@dxos/react-client": "0.8.4-main.c1de068",
69
- "@dxos/react-ui-attention": "0.8.4-main.c1de068",
70
- "@dxos/react-ui-graph": "0.8.4-main.c1de068",
71
- "@dxos/react-ui-stack": "0.8.4-main.c1de068",
72
- "@dxos/util": "0.8.4-main.c1de068",
73
- "@dxos/schema": "0.8.4-main.c1de068"
58
+ "@dxos/app-framework": "0.8.4-main.c4373fc",
59
+ "@dxos/async": "0.8.4-main.c4373fc",
60
+ "@dxos/echo": "0.8.4-main.c4373fc",
61
+ "@dxos/echo-query": "0.8.4-main.c4373fc",
62
+ "@dxos/client": "0.8.4-main.c4373fc",
63
+ "@dxos/graph": "0.8.4-main.c4373fc",
64
+ "@dxos/invariant": "0.8.4-main.c4373fc",
65
+ "@dxos/live-object": "0.8.4-main.c4373fc",
66
+ "@dxos/log": "0.8.4-main.c4373fc",
67
+ "@dxos/plugin-graph": "0.8.4-main.c4373fc",
68
+ "@dxos/plugin-search": "0.8.4-main.c4373fc",
69
+ "@dxos/plugin-client": "0.8.4-main.c4373fc",
70
+ "@dxos/react-client": "0.8.4-main.c4373fc",
71
+ "@dxos/plugin-space": "0.8.4-main.c4373fc",
72
+ "@dxos/react-ui-attention": "0.8.4-main.c4373fc",
73
+ "@dxos/react-ui-graph": "0.8.4-main.c4373fc",
74
+ "@dxos/react-ui-components": "0.8.4-main.c4373fc",
75
+ "@dxos/schema": "0.8.4-main.c4373fc",
76
+ "@dxos/util": "0.8.4-main.c4373fc",
77
+ "@dxos/react-ui-stack": "0.8.4-main.c4373fc"
74
78
  },
75
79
  "devDependencies": {
76
80
  "@types/d3": "^7.4.3",
77
81
  "@types/d3-hierarchy": "^3.1.6",
78
82
  "@types/lodash.defaultsdeep": "^4.6.6",
79
- "@types/react": "~18.2.0",
80
- "@types/react-dom": "~18.2.0",
83
+ "@types/react": "~19.2.2",
84
+ "@types/react-dom": "~19.2.1",
81
85
  "@types/topojson-client": "^3.1.4",
82
86
  "@types/topojson-specification": "^1.0.5",
83
- "react": "~18.2.0",
84
- "react-dom": "~18.2.0",
85
- "vite": "5.4.7",
86
- "@dxos/echo-generator": "0.8.4-main.c1de068",
87
- "@dxos/random": "0.8.4-main.c1de068",
88
- "@dxos/react-ui": "0.8.4-main.c1de068",
89
- "@dxos/storybook-utils": "0.8.4-main.c1de068",
90
- "@dxos/react-ui-theme": "0.8.4-main.c1de068"
87
+ "react": "~19.2.0",
88
+ "react-dom": "~19.2.0",
89
+ "vite": "7.1.9",
90
+ "@dxos/echo-generator": "0.8.4-main.c4373fc",
91
+ "@dxos/random": "0.8.4-main.c4373fc",
92
+ "@dxos/react-ui": "0.8.4-main.c4373fc",
93
+ "@dxos/react-ui-theme": "0.8.4-main.c4373fc",
94
+ "@dxos/storybook-utils": "0.8.4-main.c4373fc"
91
95
  },
92
96
  "peerDependencies": {
93
97
  "effect": "^3.13.3",
94
- "react": "~18.2.0",
95
- "react-dom": "~18.2.0",
96
- "@dxos/react-ui": "0.8.4-main.c1de068",
97
- "@dxos/react-ui-theme": "0.8.4-main.c1de068"
98
+ "react": "^19.0.0",
99
+ "react-dom": "^19.0.0",
100
+ "@dxos/react-ui": "0.8.4-main.c4373fc",
101
+ "@dxos/react-ui-theme": "0.8.4-main.c4373fc"
98
102
  },
99
103
  "publishConfig": {
100
104
  "access": "public"
@@ -2,7 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { Capabilities, contributes, createIntent, defineModule, definePlugin, Events } from '@dxos/app-framework';
5
+ import { Capabilities, Events, contributes, createIntent, defineModule, definePlugin } from '@dxos/app-framework';
6
6
  import { ClientCapabilities, ClientEvents } from '@dxos/plugin-client';
7
7
  import { SpaceCapabilities } from '@dxos/plugin-space';
8
8
  import { defineObjectForm } from '@dxos/plugin-space/types';
@@ -10,51 +10,50 @@ import { defineObjectForm } from '@dxos/plugin-space/types';
10
10
  import { IntentResolver, ReactSurface } from './capabilities';
11
11
  import { meta } from './meta';
12
12
  import { translations } from './translations';
13
- import { ViewType, ExplorerAction } from './types';
13
+ import { ExplorerAction, ViewType } from './types';
14
14
 
15
- export const ExplorerPlugin = () =>
16
- definePlugin(meta, [
17
- defineModule({
18
- id: `${meta.id}/module/translations`,
19
- activatesOn: Events.SetupTranslations,
20
- activate: () => contributes(Capabilities.Translations, translations),
21
- }),
22
- defineModule({
23
- id: `${meta.id}/module/metadata`,
24
- activatesOn: Events.SetupMetadata,
25
- activate: () =>
26
- contributes(Capabilities.Metadata, {
27
- id: ViewType.typename,
28
- metadata: {
29
- icon: 'ph--graph--regular',
30
- },
15
+ export const ExplorerPlugin = definePlugin(meta, () => [
16
+ defineModule({
17
+ id: `${meta.id}/module/translations`,
18
+ activatesOn: Events.SetupTranslations,
19
+ activate: () => contributes(Capabilities.Translations, translations),
20
+ }),
21
+ defineModule({
22
+ id: `${meta.id}/module/metadata`,
23
+ activatesOn: Events.SetupMetadata,
24
+ activate: () =>
25
+ contributes(Capabilities.Metadata, {
26
+ id: ViewType.typename,
27
+ metadata: {
28
+ icon: 'ph--graph--regular',
29
+ },
30
+ }),
31
+ }),
32
+ defineModule({
33
+ id: `${meta.id}/module/object-form`,
34
+ activatesOn: ClientEvents.SetupSchema,
35
+ activate: () =>
36
+ contributes(
37
+ SpaceCapabilities.ObjectForm,
38
+ defineObjectForm({
39
+ objectSchema: ViewType,
40
+ getIntent: () => createIntent(ExplorerAction.Create),
31
41
  }),
32
- }),
33
- defineModule({
34
- id: `${meta.id}/module/object-form`,
35
- activatesOn: ClientEvents.SetupSchema,
36
- activate: () =>
37
- contributes(
38
- SpaceCapabilities.ObjectForm,
39
- defineObjectForm({
40
- objectSchema: ViewType,
41
- getIntent: () => createIntent(ExplorerAction.Create),
42
- }),
43
- ),
44
- }),
45
- defineModule({
46
- id: `${meta.id}/module/schema`,
47
- activatesOn: ClientEvents.SetupSchema,
48
- activate: () => contributes(ClientCapabilities.Schema, [ViewType]),
49
- }),
50
- defineModule({
51
- id: `${meta.id}/module/react-surface`,
52
- activatesOn: Events.SetupReactSurface,
53
- activate: ReactSurface,
54
- }),
55
- defineModule({
56
- id: `${meta.id}/module/intent-resolver`,
57
- activatesOn: Events.SetupIntentResolver,
58
- activate: IntentResolver,
59
- }),
60
- ]);
42
+ ),
43
+ }),
44
+ defineModule({
45
+ id: `${meta.id}/module/schema`,
46
+ activatesOn: ClientEvents.SetupSchema,
47
+ activate: () => contributes(ClientCapabilities.Schema, [ViewType]),
48
+ }),
49
+ defineModule({
50
+ id: `${meta.id}/module/react-surface`,
51
+ activatesOn: Events.SetupReactSurface,
52
+ activate: ReactSurface,
53
+ }),
54
+ defineModule({
55
+ id: `${meta.id}/module/intent-resolver`,
56
+ activatesOn: Events.SetupIntentResolver,
57
+ activate: IntentResolver,
58
+ }),
59
+ ]);
@@ -2,7 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { contributes, Capabilities, createResolver } from '@dxos/app-framework';
5
+ import { Capabilities, contributes, createResolver } from '@dxos/app-framework';
6
6
  import { Obj } from '@dxos/echo';
7
7
 
8
8
  import { ExplorerAction, ViewType } from '../types';
@@ -8,14 +8,14 @@ import { Capabilities, contributes, createSurface } from '@dxos/app-framework';
8
8
  import { Obj } from '@dxos/echo';
9
9
 
10
10
  import { ExplorerContainer } from '../components';
11
- import { EXPLORER_PLUGIN } from '../meta';
11
+ import { meta } from '../meta';
12
12
  import { ViewType } from '../types';
13
13
 
14
14
  export default () =>
15
15
  contributes(
16
16
  Capabilities.ReactSurface,
17
17
  createSurface({
18
- id: `${EXPLORER_PLUGIN}/article`,
18
+ id: `${meta.id}/article`,
19
19
  role: ['article', 'section'],
20
20
  filter: (data): data is { subject: ViewType } => Obj.instanceOf(ViewType, data.subject),
21
21
  component: ({ data, role }) => <ExplorerContainer view={data.subject} role={role} />,
@@ -2,17 +2,16 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Meta } from '@storybook/react-vite';
8
6
  import React from 'react';
9
7
 
10
8
  import { ClientRepeater } from '@dxos/react-client/testing';
11
- import { withLayout, withTheme } from '@dxos/storybook-utils';
9
+ import { withTheme } from '@dxos/react-ui/testing';
12
10
 
13
- import { Chart } from './Chart';
14
11
  import CitiesData from '../../../data/cities.js';
15
12
 
13
+ import { Chart } from './Chart';
14
+
16
15
  // TODO(burdon): Generate data with geo lat/lng.
17
16
  // TODO(burdon): How to provide geo service via agent?
18
17
 
@@ -32,10 +31,13 @@ const Story = () => {
32
31
  // TODO(burdon): Change to decorator.
33
32
  export const Default = () => <ClientRepeater component={Story} />;
34
33
 
35
- const meta: Meta<typeof Chart> = {
34
+ const meta = {
36
35
  title: 'plugins/plugin-explorer/Chart',
37
36
  component: Chart,
38
- decorators: [withTheme, withLayout({ fullscreen: true })],
39
- };
37
+ decorators: [withTheme],
38
+ parameters: {
39
+ layout: 'fullscreen',
40
+ },
41
+ } satisfies Meta<typeof Chart>;
40
42
 
41
43
  export default meta;
@@ -7,7 +7,7 @@ import { type DotOptions } from '@observablehq/plot';
7
7
  import React, { useEffect } from 'react';
8
8
  import { useResizeDetector } from 'react-resize-detector';
9
9
 
10
- import { type Accessor, createAdapter, type Point } from '../plot';
10
+ import { type Accessor, type Point, createAdapter } from '../plot';
11
11
 
12
12
  const defaultOptions: DotOptions = {
13
13
  r: 4,
@@ -2,16 +2,21 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import React from 'react';
5
+ import React, { useCallback, useMemo, useState } from 'react';
6
6
 
7
+ import { type Filter } from '@dxos/echo';
8
+ import { QueryBuilder } from '@dxos/echo-query';
7
9
  import { useGlobalSearch } from '@dxos/plugin-search';
8
10
  import { getSpace } from '@dxos/react-client/echo';
11
+ import { Toolbar } from '@dxos/react-ui';
12
+ import { QueryEditor, type QueryEditorProps } from '@dxos/react-ui-components';
9
13
  import { StackItem } from '@dxos/react-ui-stack';
10
14
 
11
- import { D3ForceGraph } from './Graph';
12
15
  import { useGraphModel } from '../hooks';
13
16
  import { type ViewType } from '../types';
14
17
 
18
+ import { D3ForceGraph } from './Graph';
19
+
15
20
  type ExplorerContainerProps = {
16
21
  role: string;
17
22
  view: ViewType;
@@ -19,15 +24,24 @@ type ExplorerContainerProps = {
19
24
 
20
25
  const ExplorerContainer = ({ role, view }: ExplorerContainerProps) => {
21
26
  const space = getSpace(view);
22
- const model = useGraphModel(space);
27
+ const [filter, setFilter] = useState<Filter.Any>();
28
+ const model = useGraphModel(space, filter);
23
29
  const { match } = useGlobalSearch();
24
30
 
31
+ const builder = useMemo(() => new QueryBuilder(), []);
32
+ const handleChange = useCallback<NonNullable<QueryEditorProps['onChange']>>((value) => {
33
+ setFilter(builder.build(value));
34
+ }, []);
35
+
25
36
  if (!space || !model) {
26
37
  return null;
27
38
  }
28
39
 
29
40
  return (
30
- <StackItem.Content size={role === 'section' ? 'square' : 'intrinsic'}>
41
+ <StackItem.Content toolbar size={role === 'section' ? 'square' : 'intrinsic'}>
42
+ <Toolbar.Root>
43
+ <QueryEditor space={space} onChange={handleChange} />
44
+ </Toolbar.Root>
31
45
  <D3ForceGraph model={model} match={match} />
32
46
  </StackItem.Content>
33
47
  );
@@ -2,9 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
- import { plot, sphere, geo, graticule, dot } from '@observablehq/plot';
5
+ import { dot, geo, graticule, plot, sphere } from '@observablehq/plot';
8
6
  import { type Meta } from '@storybook/react-vite';
9
7
  import { geoCircle } from 'd3';
10
8
  import React, { useEffect } from 'react';
@@ -12,12 +10,13 @@ import { useResizeDetector } from 'react-resize-detector';
12
10
  import { feature } from 'topojson-client';
13
11
 
14
12
  import { ClientRepeater } from '@dxos/react-client/testing';
15
- import { withLayout, withTheme } from '@dxos/storybook-utils';
13
+ import { withTheme } from '@dxos/react-ui/testing';
16
14
 
17
- import { Globe } from './Globe';
18
15
  import CitiesData from '../../../data/cities.js';
19
16
  import CountriesData from '../../../data/countries-110m.js';
20
17
 
18
+ import { Globe } from './Globe';
19
+
21
20
  // TODO(burdon): Generate data with geo lat/lng.
22
21
  // TODO(burdon): How to provide geo service via agent?
23
22
 
@@ -80,13 +79,16 @@ const ExtendedStory = () => {
80
79
  return <div ref={containerRef} className='grow p-8' />;
81
80
  };
82
81
 
83
- export const Default = () => <ClientRepeater component={DefaultStory} createSpace />;
84
-
85
- export const Extended = () => <ClientRepeater component={ExtendedStory} createSpace />;
86
-
87
- const meta: Meta = {
82
+ const meta = {
88
83
  title: 'plugins/plugin-explorer/Globe',
89
- decorators: [withTheme, withLayout({ fullscreen: true })],
90
- };
84
+ decorators: [withTheme],
85
+ parameters: {
86
+ layout: 'fullscreen',
87
+ },
88
+ } satisfies Meta;
91
89
 
92
90
  export default meta;
91
+
92
+ export const Default = () => <ClientRepeater component={DefaultStory} createSpace />;
93
+
94
+ export const Extended = () => <ClientRepeater component={ExtendedStory} createSpace />;
@@ -9,7 +9,7 @@ import { useResizeDetector } from 'react-resize-detector';
9
9
  import * as topojson from 'topojson-client';
10
10
 
11
11
  import CountriesData from '../../../data/countries-110m.js';
12
- import { type Accessor, createAdapter, type GeoLocation } from '../plot';
12
+ import { type Accessor, type GeoLocation, createAdapter } from '../plot';
13
13
 
14
14
  const defaultOptions: DotOptions = {
15
15
  r: 4,
@@ -2,9 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
- import { type Meta } from '@storybook/react-vite';
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
  import React, { useEffect, useState } from 'react';
9
7
 
10
8
  import { Obj } from '@dxos/echo';
@@ -12,15 +10,17 @@ import { faker } from '@dxos/random';
12
10
  import { useClient } from '@dxos/react-client';
13
11
  import { type Space } from '@dxos/react-client/echo';
14
12
  import { withClientProvider } from '@dxos/react-client/testing';
13
+ import { withTheme } from '@dxos/react-ui/testing';
15
14
  import { DataType } from '@dxos/schema';
16
15
  import { type ValueGenerator } from '@dxos/schema/testing';
17
- import { withLayout, withTheme, render } from '@dxos/storybook-utils';
16
+ import { render } from '@dxos/storybook-utils';
18
17
 
19
- import { D3ForceGraph } from './D3ForceGraph';
20
- import { generate } from './testing';
21
18
  import { useGraphModel } from '../../hooks';
22
19
  import { ViewType } from '../../types';
23
20
 
21
+ import { D3ForceGraph } from './D3ForceGraph';
22
+ import { generate } from './testing';
23
+
24
24
  const generator = faker as any as ValueGenerator;
25
25
 
26
26
  faker.seed(1);
@@ -45,20 +45,24 @@ const DefaultStory = () => {
45
45
  return <D3ForceGraph model={model} />;
46
46
  };
47
47
 
48
- const meta: Meta = {
48
+ const meta = {
49
49
  title: 'plugins/plugin-explorer/D3ForceGraph',
50
50
  component: D3ForceGraph,
51
51
  render: render(DefaultStory),
52
52
  decorators: [
53
+ withTheme,
53
54
  withClientProvider({
54
55
  createSpace: true,
55
56
  types: [ViewType, DataType.Organization, DataType.Project, DataType.Person, DataType.HasRelationship],
56
57
  }),
57
- withTheme,
58
- withLayout({ fullscreen: true }),
59
58
  ],
60
- };
59
+ parameters: {
60
+ layout: 'fullscreen',
61
+ },
62
+ } satisfies Meta<typeof D3ForceGraph>;
61
63
 
62
64
  export default meta;
63
65
 
64
- export const Default = {};
66
+ type Story = StoryObj<typeof meta>;
67
+
68
+ export const Default: Story = {};
@@ -2,7 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import React, { type FC, useCallback, useEffect, useMemo, useRef } from 'react';
5
+ import React, { useCallback, useEffect, useMemo, useRef } from 'react';
6
6
 
7
7
  import { Obj } from '@dxos/echo';
8
8
  import { SelectionModel } from '@dxos/graph';
@@ -15,8 +15,8 @@ import {
15
15
  SVG,
16
16
  type SVGContext,
17
17
  } from '@dxos/react-ui-graph';
18
- import { getHashColor } from '@dxos/react-ui-theme';
19
- import { type SpaceGraphNode, type SpaceGraphModel, type SpaceGraphEdge } from '@dxos/schema';
18
+ import { getHashStyles } from '@dxos/react-ui-theme';
19
+ import { type SpaceGraphEdge, type SpaceGraphModel, type SpaceGraphNode } from '@dxos/schema';
20
20
 
21
21
  import '@dxos/react-ui-graph/styles/graph.css';
22
22
 
@@ -29,7 +29,7 @@ export type D3ForceGraphProps = ThemedClassName<
29
29
  } & Pick<GraphProps, 'drag'>
30
30
  >;
31
31
 
32
- export const D3ForceGraph: FC<D3ForceGraphProps> = ({ classNames, model, selection: _selection, grid, ...props }) => {
32
+ export const D3ForceGraph = ({ classNames, model, selection: _selection, grid, ...props }: D3ForceGraphProps) => {
33
33
  const context = useRef<SVGContext>(null);
34
34
  const projector = useMemo<GraphForceProjector | undefined>(() => {
35
35
  if (context.current) {
@@ -85,7 +85,7 @@ export const D3ForceGraph: FC<D3ForceGraphProps> = ({ classNames, model, selecti
85
85
  const obj = node.data?.data.object;
86
86
  return {
87
87
  data: {
88
- color: getHashColor(obj && Obj.getTypename(obj))?.color,
88
+ color: getHashStyles(obj && Obj.getTypename(obj))?.hue,
89
89
  },
90
90
  classes: {
91
91
  'dx-selected': selection.contains(node.id),
@@ -2,9 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
- import { type Meta } from '@storybook/react-vite';
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
  import React, { useEffect, useState } from 'react';
9
7
 
10
8
  import { Obj } from '@dxos/echo';
@@ -12,15 +10,17 @@ import { faker } from '@dxos/random';
12
10
  import { useClient } from '@dxos/react-client';
13
11
  import { type Space } from '@dxos/react-client/echo';
14
12
  import { withClientProvider } from '@dxos/react-client/testing';
13
+ import { withTheme } from '@dxos/react-ui/testing';
15
14
  import { DataType } from '@dxos/schema';
16
15
  import { type ValueGenerator } from '@dxos/schema/testing';
17
- import { withLayout, withTheme, render } from '@dxos/storybook-utils';
16
+ import { render } from '@dxos/storybook-utils';
18
17
 
19
- import { ForceGraph } from './ForceGraph';
20
- import { generate } from './testing';
21
18
  import { useGraphModel } from '../../hooks';
22
19
  import { ViewType } from '../../types';
23
20
 
21
+ import { ForceGraph } from './ForceGraph';
22
+ import { generate } from './testing';
23
+
24
24
  const generator = faker as any as ValueGenerator;
25
25
 
26
26
  faker.seed(1);
@@ -45,20 +45,24 @@ const DefaultStory = () => {
45
45
  return <ForceGraph model={model} />;
46
46
  };
47
47
 
48
- const meta: Meta = {
48
+ const meta = {
49
49
  title: 'plugins/plugin-explorer/ForceGraph',
50
50
  component: ForceGraph,
51
51
  render: render(DefaultStory),
52
52
  decorators: [
53
+ withTheme,
53
54
  withClientProvider({
54
55
  createSpace: true,
55
56
  types: [ViewType, DataType.HasRelationship, DataType.Organization, DataType.Project, DataType.Person],
56
57
  }),
57
- withTheme,
58
- withLayout({ fullscreen: true }),
59
58
  ],
60
- };
59
+ parameters: {
60
+ layout: 'fullscreen',
61
+ },
62
+ } satisfies Meta<typeof ForceGraph>;
61
63
 
62
64
  export default meta;
63
65
 
64
- export const Default = {};
66
+ type Story = StoryObj<typeof meta>;
67
+
68
+ export const Default: Story = {};
@@ -7,7 +7,7 @@ import NativeForceGraph from 'force-graph';
7
7
  import React, { type FC, useEffect, useRef, useState } from 'react';
8
8
  import { useResizeDetector } from 'react-resize-detector';
9
9
 
10
- import { filterObjectsSync, type SearchResult } from '@dxos/plugin-search';
10
+ import { type SearchResult, filterObjectsSync } from '@dxos/plugin-search';
11
11
  import { type SpaceGraphModel } from '@dxos/schema';
12
12
 
13
13
  import { GraphAdapter } from './adapter';
@@ -20,9 +20,9 @@ export type ForceGraphProps = {
20
20
  export const ForceGraph: FC<ForceGraphProps> = ({ model, match }) => {
21
21
  const { ref, width, height } = useResizeDetector({ refreshRate: 200 });
22
22
  const rootRef = useRef<HTMLDivElement>(null);
23
- const forceGraph = useRef<NativeForceGraph>();
23
+ const forceGraph = useRef<NativeForceGraph>(null);
24
24
 
25
- const filteredRef = useRef<SearchResult[]>();
25
+ const filteredRef = useRef<SearchResult[]>([]);
26
26
  filteredRef.current = filterObjectsSync(model?.objects ?? [], match);
27
27
 
28
28
  const [data, setData] = useState<GraphAdapter>();
@@ -48,7 +48,7 @@ export const ForceGraph: FC<ForceGraphProps> = ({ model, match }) => {
48
48
 
49
49
  return () => {
50
50
  forceGraph.current?.pauseAnimation().graphData({ nodes: [], links: [] });
51
- forceGraph.current = undefined;
51
+ forceGraph.current = null;
52
52
  };
53
53
  }, []);
54
54
 
@@ -3,9 +3,9 @@
3
3
  //
4
4
 
5
5
  import { type Space } from '@dxos/client/echo';
6
- import { Query, Relation, type Obj } from '@dxos/echo';
6
+ import { type Obj, Query, Relation } from '@dxos/echo';
7
7
  import { DataType } from '@dxos/schema';
8
- import { createObjectFactory, type ValueGenerator, type TypeSpec } from '@dxos/schema/testing';
8
+ import { type TypeSpec, type ValueGenerator, createObjectFactory } from '@dxos/schema/testing';
9
9
  import { range } from '@dxos/util';
10
10
 
11
11
  const getObject = (objects: Obj.Any[]) => objects[Math.floor(Math.random() * objects.length)];