@dxos/plugin-explorer 0.6.12-staging.e11e696 → 0.6.12

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 (58) hide show
  1. package/dist/lib/browser/{ExplorerArticle-5SNS2WNJ.mjs → ExplorerArticle-2LF7QANN.mjs} +2 -2
  2. package/dist/lib/browser/{ExplorerMain-ZEXQSLWN.mjs → ExplorerMain-K6Z6UVZR.mjs} +2 -2
  3. package/dist/lib/browser/{chunk-DOI4BI5E.mjs → chunk-JIDPF2GF.mjs} +2 -2
  4. package/dist/lib/browser/{chunk-5OVYH5FD.mjs → chunk-TL6ADY3P.mjs} +5 -2
  5. package/dist/lib/browser/chunk-TL6ADY3P.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-WNQNMDOO.mjs → chunk-XKITKIPQ.mjs} +2 -2
  7. package/dist/lib/browser/{chunk-WNQNMDOO.mjs.map → chunk-XKITKIPQ.mjs.map} +3 -3
  8. package/dist/lib/browser/index.mjs +10 -7
  9. package/dist/lib/browser/index.mjs.map +3 -3
  10. package/dist/lib/browser/meta.json +1 -1
  11. package/dist/lib/browser/meta.mjs +1 -1
  12. package/dist/lib/browser/types/index.mjs +2 -2
  13. package/dist/lib/node/{ExplorerArticle-QWLRFTJ3.cjs → ExplorerArticle-PQEEN244.cjs} +6 -6
  14. package/dist/lib/node/{ExplorerMain-YHTGV7H5.cjs → ExplorerMain-IGUMYIAN.cjs} +6 -6
  15. package/dist/lib/node/{chunk-OJOGTJXQ.cjs → chunk-HYXFS3AG.cjs} +6 -6
  16. package/dist/lib/node/{chunk-B3DD7UMY.cjs → chunk-K4PB5A4K.cjs} +4 -4
  17. package/dist/lib/node/{chunk-B3DD7UMY.cjs.map → chunk-K4PB5A4K.cjs.map} +1 -1
  18. package/dist/lib/node/{chunk-BODO2FF3.cjs → chunk-UJZYAOD2.cjs} +18 -5
  19. package/dist/lib/node/chunk-UJZYAOD2.cjs.map +7 -0
  20. package/dist/lib/node/index.cjs +36 -33
  21. package/dist/lib/node/index.cjs.map +3 -3
  22. package/dist/lib/node/meta.cjs +3 -3
  23. package/dist/lib/node/meta.cjs.map +1 -1
  24. package/dist/lib/node/meta.json +1 -1
  25. package/dist/lib/node/types/index.cjs +4 -4
  26. package/dist/lib/node/types/index.cjs.map +1 -1
  27. package/dist/types/src/ExplorerPlugin.d.ts.map +1 -1
  28. package/dist/types/src/meta.d.ts +4 -1
  29. package/dist/types/src/meta.d.ts.map +1 -1
  30. package/package.json +29 -33
  31. package/src/ExplorerPlugin.tsx +5 -2
  32. package/src/components/Graph/graph-model.ts +1 -1
  33. package/src/meta.tsx +5 -1
  34. package/dist/lib/browser/chunk-5OVYH5FD.mjs.map +0 -7
  35. package/dist/lib/node/chunk-BODO2FF3.cjs.map +0 -7
  36. package/dist/lib/node-esm/ExplorerArticle-5NBIKSBJ.mjs +0 -28
  37. package/dist/lib/node-esm/ExplorerArticle-5NBIKSBJ.mjs.map +0 -7
  38. package/dist/lib/node-esm/ExplorerMain-2M5RWFU4.mjs +0 -34
  39. package/dist/lib/node-esm/ExplorerMain-2M5RWFU4.mjs.map +0 -7
  40. package/dist/lib/node-esm/chunk-2A6TYAA2.mjs +0 -28
  41. package/dist/lib/node-esm/chunk-2A6TYAA2.mjs.map +0 -7
  42. package/dist/lib/node-esm/chunk-T6BPVYCJ.mjs +0 -476
  43. package/dist/lib/node-esm/chunk-T6BPVYCJ.mjs.map +0 -7
  44. package/dist/lib/node-esm/chunk-ZYRYGGWK.mjs +0 -20
  45. package/dist/lib/node-esm/chunk-ZYRYGGWK.mjs.map +0 -7
  46. package/dist/lib/node-esm/index.mjs +0 -10995
  47. package/dist/lib/node-esm/index.mjs.map +0 -7
  48. package/dist/lib/node-esm/meta.json +0 -1
  49. package/dist/lib/node-esm/meta.mjs +0 -10
  50. package/dist/lib/node-esm/meta.mjs.map +0 -7
  51. package/dist/lib/node-esm/types/index.mjs +0 -11
  52. package/dist/lib/node-esm/types/index.mjs.map +0 -7
  53. /package/dist/lib/browser/{ExplorerArticle-5SNS2WNJ.mjs.map → ExplorerArticle-2LF7QANN.mjs.map} +0 -0
  54. /package/dist/lib/browser/{ExplorerMain-ZEXQSLWN.mjs.map → ExplorerMain-K6Z6UVZR.mjs.map} +0 -0
  55. /package/dist/lib/browser/{chunk-DOI4BI5E.mjs.map → chunk-JIDPF2GF.mjs.map} +0 -0
  56. /package/dist/lib/node/{ExplorerArticle-QWLRFTJ3.cjs.map → ExplorerArticle-PQEEN244.cjs.map} +0 -0
  57. /package/dist/lib/node/{ExplorerMain-YHTGV7H5.cjs.map → ExplorerMain-IGUMYIAN.cjs.map} +0 -0
  58. /package/dist/lib/node/{chunk-OJOGTJXQ.cjs.map → chunk-HYXFS3AG.cjs.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Graph
3
- } from "./chunk-WNQNMDOO.mjs";
3
+ } from "./chunk-XKITKIPQ.mjs";
4
4
 
5
5
  // packages/plugins/experimental/plugin-explorer/src/components/ExplorerArticle.tsx
6
6
  import React from "react";
@@ -24,4 +24,4 @@ var ExplorerArticle_default = ExplorerArticle;
24
24
  export {
25
25
  ExplorerArticle_default as default
26
26
  };
27
- //# sourceMappingURL=ExplorerArticle-5SNS2WNJ.mjs.map
27
+ //# sourceMappingURL=ExplorerArticle-2LF7QANN.mjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Graph
3
- } from "./chunk-WNQNMDOO.mjs";
3
+ } from "./chunk-XKITKIPQ.mjs";
4
4
 
5
5
  // packages/plugins/experimental/plugin-explorer/src/components/ExplorerMain.tsx
6
6
  import React from "react";
@@ -30,4 +30,4 @@ var ExplorerMain_default = ExplorerMain;
30
30
  export {
31
31
  ExplorerMain_default as default
32
32
  };
33
- //# sourceMappingURL=ExplorerMain-ZEXQSLWN.mjs.map
33
+ //# sourceMappingURL=ExplorerMain-K6Z6UVZR.mjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  EXPLORER_PLUGIN
3
- } from "./chunk-5OVYH5FD.mjs";
3
+ } from "./chunk-TL6ADY3P.mjs";
4
4
 
5
5
  // packages/plugins/experimental/plugin-explorer/src/types/view.ts
6
6
  import { S, TypedObject } from "@dxos/echo-schema";
@@ -24,4 +24,4 @@ export {
24
24
  ViewType,
25
25
  ExplorerAction
26
26
  };
27
- //# sourceMappingURL=chunk-DOI4BI5E.mjs.map
27
+ //# sourceMappingURL=chunk-JIDPF2GF.mjs.map
@@ -1,4 +1,6 @@
1
1
  // packages/plugins/experimental/plugin-explorer/src/meta.tsx
2
+ import { Graph } from "@phosphor-icons/react";
3
+ import React from "react";
2
4
  import { pluginMeta } from "@dxos/app-framework";
3
5
  var EXPLORER_PLUGIN = "dxos.org/plugin/explorer";
4
6
  var meta_default = pluginMeta({
@@ -8,11 +10,12 @@ var meta_default = pluginMeta({
8
10
  tags: [
9
11
  "experimental"
10
12
  ],
11
- icon: "ph--graph--regular"
13
+ iconComponent: (props) => /* @__PURE__ */ React.createElement(Graph, props),
14
+ iconSymbol: "ph--graph--regular"
12
15
  });
13
16
 
14
17
  export {
15
18
  EXPLORER_PLUGIN,
16
19
  meta_default
17
20
  };
18
- //# sourceMappingURL=chunk-5OVYH5FD.mjs.map
21
+ //# sourceMappingURL=chunk-TL6ADY3P.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/meta.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Graph, type IconProps } from '@phosphor-icons/react';\nimport React from 'react';\n\nimport { pluginMeta } from '@dxos/app-framework';\n\nexport const EXPLORER_PLUGIN = 'dxos.org/plugin/explorer';\n\nexport default pluginMeta({\n id: EXPLORER_PLUGIN,\n name: 'Explorer',\n description: 'Explore the ECHO hypergraph.',\n tags: ['experimental'],\n iconComponent: (props: IconProps) => <Graph {...props} />,\n iconSymbol: 'ph--graph--regular',\n});\n"],
5
+ "mappings": ";AAIA,SAASA,aAA6B;AACtC,OAAOC,WAAW;AAElB,SAASC,kBAAkB;AAEpB,IAAMC,kBAAkB;AAE/B,IAAA,eAAeC,WAAW;EACxBC,IAAIF;EACJG,MAAM;EACNC,aAAa;EACbC,MAAM;IAAC;;EACPC,eAAe,CAACC,UAAqB,sBAAA,cAACC,OAAUD,KAAAA;EAChDE,YAAY;AACd,CAAA;",
6
+ "names": ["Graph", "React", "pluginMeta", "EXPLORER_PLUGIN", "pluginMeta", "id", "name", "description", "tags", "iconComponent", "props", "Graph", "iconSymbol"]
7
+ }
@@ -1,5 +1,5 @@
1
1
  // packages/plugins/experimental/plugin-explorer/src/components/Graph/graph-model.ts
2
- import { AST, getSchema, getType, DynamicSchema, ReferenceAnnotationId, SchemaValidator, StoredSchema } from "@dxos/echo-schema";
2
+ import { AST, DynamicSchema, getSchema, getType, ReferenceAnnotationId, SchemaValidator, StoredSchema } from "@dxos/echo-schema";
3
3
  import { GraphModel } from "@dxos/gem-spore";
4
4
  import { log } from "@dxos/log";
5
5
  import { CollectionType } from "@dxos/plugin-space/types";
@@ -471,4 +471,4 @@ export {
471
471
  Tree,
472
472
  Graph
473
473
  };
474
- //# sourceMappingURL=chunk-WNQNMDOO.mjs.map
474
+ //# sourceMappingURL=chunk-XKITKIPQ.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/Graph/graph-model.ts", "../../../src/components/Tree/Tree.tsx", "../../../src/components/Tree/layout/HierarchicalEdgeBundling.ts", "../../../src/components/Tree/layout/RadialTree.ts", "../../../src/components/Tree/layout/TidyTree.ts", "../../../src/components/Tree/types.ts", "../../../src/components/Graph/Graph.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport {\n AST,\n getSchema,\n getType,\n DynamicSchema,\n ReferenceAnnotationId,\n type S,\n SchemaValidator,\n StoredSchema,\n} from '@dxos/echo-schema';\nimport { type GraphData, type GraphLink, GraphModel } from '@dxos/gem-spore';\nimport { log } from '@dxos/log';\nimport { CollectionType } from '@dxos/plugin-space/types';\nimport { type EchoReactiveObject, type Space, type Subscription } from '@dxos/react-client/echo';\n\nexport type SpaceGraphModelOptions = {\n schema?: boolean;\n};\n\nexport type EchoGraphNode = SchemaGraphNode | EchoObjectGraphNode;\n\ntype EchoObjectGraphNode = {\n id: string;\n type: 'echo-object';\n object: EchoReactiveObject<any>;\n};\n\ntype SchemaGraphNode = {\n id: string;\n type: 'schema';\n schema: S.Schema<any>;\n};\n\n/**\n * Converts ECHO objects to a graph.\n */\nexport class SpaceGraphModel extends GraphModel<EchoGraphNode> {\n private readonly _graph: GraphData<EchoGraphNode> = {\n nodes: [],\n links: [],\n };\n\n private _subscription?: Subscription;\n private _objects?: EchoReactiveObject<any>[];\n\n constructor(private readonly _options: SpaceGraphModelOptions = {}) {\n super();\n }\n\n override get graph(): GraphData<EchoGraphNode> {\n return this._graph;\n }\n\n get objects(): EchoReactiveObject<any>[] {\n return this._objects ?? [];\n }\n\n open(space: Space, objectId?: string) {\n if (!this._subscription) {\n // TODO(burdon): Filter.\n const query = space.db.query((object: EchoReactiveObject<any>) => !(object instanceof CollectionType));\n\n this._subscription = query.subscribe(\n ({ objects }) => {\n this._objects = objects;\n this._graph.nodes = objects.map((object) => {\n if (object instanceof StoredSchema) {\n const effectSchema = space.db.schema.getSchemaById(object.id)!;\n return { type: 'schema', id: object.id, schema: effectSchema.schema };\n }\n return { type: 'echo-object', id: object.id, object };\n });\n this._graph.links = objects.reduce<GraphLink[]>((links, object) => {\n const objectSchema = getSchema(object);\n const typename = getType(object)?.objectId;\n if (objectSchema == null || typename == null) {\n log.info('no schema for object:', { id: object.id.slice(0, 8) });\n return links;\n }\n\n if (!(objectSchema instanceof DynamicSchema)) {\n const idx = objects.findIndex((obj) => obj.id === typename);\n if (idx === -1) {\n this._graph.nodes.push({\n id: typename,\n type: 'schema',\n schema: objectSchema,\n });\n }\n }\n\n // Link to schema.\n if (this._options.schema) {\n links.push({\n id: `${object.id}-${typename}`,\n source: object.id,\n target: typename,\n });\n }\n\n // Parse schema to follow referenced objects.\n AST.getPropertySignatures(objectSchema.ast).forEach((prop) => {\n if (!SchemaValidator.hasTypeAnnotation(objectSchema, prop.name.toString(), ReferenceAnnotationId)) {\n return;\n }\n const value = object[String(prop.name)];\n if (value) {\n const refs = Array.isArray(value) ? value : [value];\n for (const ref of refs) {\n if (objects.findIndex((obj) => obj.id === ref.id) !== -1) {\n links.push({\n id: `${object.id}-${String(prop.name)}-${ref.id}`,\n source: object.id,\n target: ref.id,\n });\n }\n }\n }\n });\n\n return links;\n }, []);\n\n this.triggerUpdate();\n },\n { fire: true },\n );\n }\n\n this.setSelected(objectId);\n return this;\n }\n\n close() {\n if (this._subscription) {\n this._subscription();\n this._subscription = undefined;\n }\n\n return this;\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { useResizeDetector } from 'react-resize-detector';\n\nimport { type Space } from '@dxos/client/echo';\nimport { createSvgContext, SVG, SVGRoot } from '@dxos/gem-core';\n\nimport { HierarchicalEdgeBundling, RadialTree, TidyTree } from './layout';\nimport { mapGraphToTreeData, type TreeNode } from './types';\nimport { SpaceGraphModel } from '../Graph';\n\n// TODO(burdon): Create dge bundling graph using d3.hierarchy.\n// https://observablehq.com/@d3/hierarchical-edge-bundling?intent=fork\n\ntype Renderer = (svg: SVGSVGElement, data: any, options: any) => void;\n\nexport type LayoutVariant = 'tidy' | 'radial' | 'edge';\n\n// TODO(burdon): Remove slots?\nexport type TreeLayoutSlots = {\n node?: string;\n path?: string;\n text?: string;\n};\n\nexport type TreeOptions = {\n label: (d: any) => string;\n\n slots?: TreeLayoutSlots;\n radius?: number;\n\n width: number;\n height: number;\n margin?: number;\n\n padding?: number;\n // Radius of nodes.\n r?: number;\n};\n\nexport const defaultTreeLayoutSlots: TreeLayoutSlots = {\n node: 'fill-blue-600',\n path: 'fill-none stroke-blue-400 stroke-[0.5px]',\n text: 'stroke-[0.5px] stroke-neutral-700 text-xs', // TODO(burdon): Create box instead of halo.\n};\n\nconst renderers = new Map<LayoutVariant, Renderer>([\n ['tidy', TidyTree],\n ['radial', RadialTree],\n ['edge', HierarchicalEdgeBundling],\n]);\n\nexport type TreeComponentProps<N = unknown> = {\n space: Space;\n selected?: string;\n variant?: LayoutVariant;\n onNodeClick?: (node?: N) => void;\n};\n\n// TODO(burdon): Label accessor.\nexport const Tree = <N,>({ space, selected, variant = 'tidy', onNodeClick }: TreeComponentProps<N>) => {\n const model = useMemo(() => (space ? new SpaceGraphModel().open(space, selected) : undefined), [space, selected]);\n const [tree, setTree] = useState<TreeNode>();\n useEffect(() => {\n return model?.subscribe(() => {\n const tree = mapGraphToTreeData(model);\n setTree(tree);\n }, true);\n }, [model]);\n\n const context = createSvgContext();\n const { ref, width = 0, height = 0 } = useResizeDetector();\n\n useEffect(() => {\n if (width && height) {\n const size = Math.min(width, height);\n const radius = size * 0.4;\n const options = {\n // TODO(burdon): Type.\n label: (d: any) => d.label ?? d.id,\n width,\n height,\n radius,\n marginLeft: (width - radius * 2) / 2,\n marginRight: (width - radius * 2) / 2,\n marginTop: (height - radius * 2) / 2,\n marginBottom: (height - radius * 2) / 2,\n slots: defaultTreeLayoutSlots,\n };\n\n if (tree) {\n const renderer = renderers.get(variant);\n renderer?.(context.ref.current!, tree, options);\n }\n }\n }, [tree, width, height]);\n\n // TODO(burdon): Provider should expand.\n return (\n <div ref={ref} className='flex grow overflow-hidden' onClick={() => onNodeClick?.()}>\n <SVGRoot context={context}>\n <SVG />\n </SVGRoot>\n </div>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n// Copyright 2022 Observable, Inc.\n//\n\nimport * as d3 from 'd3';\nimport { type HierarchyNode } from 'd3-hierarchy';\n\nimport { type TreeOptions } from '../Tree';\nimport { type TreeNode } from '../types';\n\n// Create hierarchical ID.\n// eslint-disable-next-line unused-imports/no-unused-vars\nconst getId = (node: HierarchyNode<TreeNode>): string =>\n `${node.parent ? getId(node.parent) + '/' : ''}${node.data.id.slice(0, 4)}`;\n\n// https://github.com/d3/d3-hierarchy\n// https://observablehq.com/@d3/hierarchical-edge-bundling?intent=fork\nconst HierarchicalEdgeBundling = (s: SVGSVGElement, data: TreeNode, options: TreeOptions) => {\n const svg = d3.select(s);\n svg.selectAll('*').remove();\n\n const { radius = 600, padding = 100, slots } = options;\n\n // https://d3js.org/d3-hierarchy/hierarchy\n const root = d3.hierarchy(flatten(data));\n // .sort((a, b) => d3.ascending(a.height, b.height) || d3.ascending(getName(a.data), getName(b.data)));\n\n const tree = d3.cluster<TreeNode>().size([2 * Math.PI, radius - padding]);\n const layout = tree(addLinks(root));\n\n // eslint-disable-next-line unused-imports/no-unused-vars\n const node = svg\n .append('g')\n .selectAll()\n .data(layout.leaves())\n .join('g')\n .attr('transform', (d) => `rotate(${d.x * (180 / Math.PI) - 90}) translate(${d.y},0)`)\n .append('text')\n .attr('class', slots?.text ?? '')\n .attr('dy', '0.31em') // TODO(burdon): Based on font size.\n .attr('x', (d) => (d.x < Math.PI ? 6 : -6))\n .attr('text-anchor', (d) => (d.x < Math.PI ? 'start' : 'end'))\n .attr('transform', (d) => (d.x >= Math.PI ? 'rotate(180)' : null))\n // .text((d: any) => d.data.id)\n // .each(function (d: any) {\n // d.text = this;\n // })\n // .on('mouseover', overed)\n // .on('mouseout', outed)\n .call(\n (text) => text.text((d: any) => d.data.id.slice(0, 8)),\n // .text((d: any) => `${getId(d)} [${[(d as any).outgoing?.length ?? 0]}]`),\n );\n\n // https://d3js.org/d3-shape/radial-line\n const line = d3\n .lineRadial()\n .curve(d3.curveBundle.beta(0.85))\n .radius((d: any) => d.y)\n .angle((d: any) => d.x);\n\n // eslint-disable-next-line unused-imports/no-unused-vars\n const links = svg\n .append('g')\n .selectAll()\n .data(layout.leaves().flatMap((leaf: any) => leaf.outgoing))\n .join('path')\n .style('mix-blend-mode', 'multiply')\n .attr('class', slots?.path ?? '')\n .attr('d', ([i, o]) => {\n return line(i.path(o));\n })\n .each(function (d) {\n d.path = this;\n });\n\n // function overed(event: any, d: X) {\n // link.style('mix-blend-mode', null);\n // d3.select(this).attr('font-weight', 'bold');\n // d3.selectAll(d.incoming.map((d) => d.path))\n // .attr('stroke', color.in)\n // .raise();\n // d3.selectAll((d as any).incoming.map(([d]) => d.text))\n // .attr('fill', color.in)\n // .attr('font-weight', 'bold');\n // d3.selectAll(d.outgoing.map((d) => d.path))\n // .attr('stroke', color.out)\n // .raise();\n // d3.selectAll(d.outgoing.map(([, d]) => d.text))\n // .attr('fill', color.out)\n // .attr('font-weight', 'bold');\n // }\n\n // function outed(event: any, d: HierarchyNode<Datum>) {\n // // @ts-ignore\n // d3.select(this).attr('font-weight', null);\n // d3.selectAll(d.incoming.map((d) => d.path)).attr('stroke', null);\n // d3.selectAll(d.incoming.map(([d]) => d.text))\n // .attr('fill', null)\n // .attr('font-weight', null);\n // d3.selectAll(d.outgoing.map((d) => d.path)).attr('stroke', null);\n // d3.selectAll(d.outgoing.map(([, d]) => d.text))\n // .attr('fill', null)\n // .attr('font-weight', null);\n // }\n};\n\n// Monkey-patch with incoming/outgoing nodes.\nconst addLinks = (root: HierarchyNode<TreeNode>) => {\n // Map of nodes indexed by ID.\n const nodes = new Map(root.descendants().map((d) => [d.data.id, d]));\n const parents = root.descendants().reduce((map, d) => {\n if (d.children?.length) {\n map.set(d.data.id, d);\n }\n return map;\n }, new Map<string, HierarchyNode<TreeNode>>());\n\n for (const d of root.leaves()) {\n // (d as any).incoming = [];\n\n const parent = parents.get(d.data.id);\n if (parent) {\n // Skip the first node which is a placeholder created by flatten().\n (d as any).outgoing =\n parent.data.children?.slice(1).map((child) => {\n return [d, nodes.get(child.id)!];\n }) ?? [];\n } else {\n (d as any).outgoing = [];\n }\n }\n\n // for (const d of root.leaves()) {\n // for (const [_, o] of (d as any).outgoing) {\n // o.incoming.push(o);\n // }\n // }\n\n return root;\n};\n\n/**\n * We are using a hierarchy in order to group nodes by parent, but we want the parent\n * nodes to be positioned at the first level along with all descendents.\n * So we add a placeholder for all parents at the head of each group.\n * @param node\n */\nconst flatten = (node: TreeNode) => {\n const clone: TreeNode = {\n id: node.id,\n };\n\n // TODO(burdon): NOTE: Should exclude schema (since requires a tree).\n if (node.children?.length) {\n const children = node.children.map((child) => flatten(child));\n clone.children = [{ id: node.id }, ...children];\n }\n\n return clone;\n};\n\nexport default HierarchicalEdgeBundling;\n", "//\n// Copyright 2023 DXOS.org\n// Copyright 2022 Observable, Inc.\n//\n\nimport * as d3 from 'd3';\n\nimport { type TreeOptions } from '../Tree';\n\n// Released under the ISC license.\n// https://observablehq.com/@d3/radial-tree\n// https://observablehq.com/@d3/tree\nconst RadialTree = (s: SVGSVGElement, data: any, options: TreeOptions) => {\n const svg = d3.select(s);\n svg.selectAll('*').remove();\n\n const {\n label, // given a node d, returns the display name\n radius = 400,\n r = 4, // radius of nodes\n slots,\n } = options;\n\n const arc = 2 * Math.PI;\n\n const root = d3.hierarchy(data);\n\n // Sort the nodes.\n // if (sort) {\n // root.sort(sort);\n // }\n\n // Compute labels and titles.\n const descendants = root.descendants();\n const getLabel = label === null ? null : descendants.map((d) => label(d.data));\n\n // Compute the layout.\n const layout = d3\n .tree()\n .size([arc, radius])\n .separation((a: any, b: any) => (a.parent === b.parent ? 1 : 2) / a.depth);\n layout(root);\n\n // Links.\n svg\n .append('g')\n .selectAll('path')\n .data(root.links())\n .join('path')\n .attr('class', slots?.path ?? '')\n .attr(\n 'd',\n d3\n .linkRadial()\n .angle((d: any) => d.x + Math.PI / 2)\n .radius((d: any) => d.y) as any,\n );\n\n // Nodes.\n const node = svg\n .append('g')\n .selectAll('a')\n .data(root.descendants())\n .join('a')\n // .attr('xlink:href', link == null ? null : (d) => link(d.data, d))\n // .attr('target', link == null ? null : linkTarget)\n .attr('transform', (d: any) => `rotate(${(d.x * 180) / Math.PI}) translate(${d.y},0)`);\n\n node\n .append('circle')\n .attr('class', slots?.node ?? '')\n .attr('r', r);\n\n // if (title != null) {\n // node.append('title').text((d) => title(d.data, d));\n // }\n\n // Text.\n if (getLabel) {\n node\n .append('text')\n .attr('transform', (d: any) => `rotate(${d.x >= Math.PI ? 180 : 0})`)\n .attr('dy', '0.32em')\n // eslint-disable-next-line no-mixed-operators\n .attr('x', (d: any) => (d.x < Math.PI === !d.children ? 6 : -6))\n // eslint-disable-next-line no-mixed-operators\n .attr('text-anchor', (d: any) => (d.x < Math.PI === !d.children ? 'start' : 'end'))\n // .attr('paint-order', 'stroke')\n .attr('class', slots?.text ?? '')\n .text((d, i) => getLabel[i]);\n }\n\n return svg.node();\n};\n\nexport default RadialTree;\n", "//\n// Copyright 2023 DXOS.org\n// Copyright 2021 Observable, Inc.\n//\n\nimport * as d3 from 'd3';\n\nimport { type TreeOptions } from '../Tree';\n\n// Released under the ISC license.\n// https://observablehq.com/@d3/tree\nconst TidyTree = (s: SVGSVGElement, data: any, options: TreeOptions) => {\n const svg = d3.select(s);\n svg.selectAll('*').remove();\n\n const { label, width, height, r = 4, padding = 4, margin = 60, slots } = options;\n\n const root = d3.hierarchy(data);\n\n // Compute labels and titles.\n const descendants = root.descendants();\n const getLabel = label == null ? null : descendants.map((d) => label(d.data));\n\n // Compute the layout.\n const dx = 16;\n const dy = width / (root.height + padding);\n const layout = d3.tree().nodeSize([dx, dy]);\n layout(root);\n\n // Center the tree.\n let x0 = Infinity;\n let x1 = -x0;\n let y0 = Infinity;\n let y1 = -y0;\n root.each((d: any) => {\n if (d.x > x1) {\n x1 = d.x;\n }\n if (d.x < x0) {\n x0 = d.x;\n }\n if (d.y > y1) {\n y1 = d.y;\n }\n if (d.y < y0) {\n y0 = d.y;\n }\n });\n\n // TODO(burdon): Option to expand.\n // NOTE: x and y are flipped.\n const sx = Math.min(2, Math.max(1, (height - margin * 2) / (x1 - x0)));\n const oy = -(width - (y1 - y0)) / 2;\n\n // Links.\n svg\n .append('g')\n .selectAll('path')\n .data(root.links())\n .join('path')\n .attr('class', slots?.path ?? '')\n .attr(\n 'd',\n d3\n .link(d3.curveBumpX)\n .x((d: any) => d.y + oy)\n .y((d: any) => d.x * sx) as any,\n );\n\n // Nodes.\n const node = svg\n .append('g')\n .selectAll('a')\n .data(root.descendants())\n .join('a')\n // .attr('xlink:href', link == null ? null : (d) => link(d.data, d))\n // .attr('target', link == null ? null : linkTarget)\n .attr('transform', (d: any) => `translate(${d.y + oy},${d.x * sx})`);\n\n node\n .append('circle')\n .attr('class', slots?.node ?? '')\n .attr('r', r);\n\n // if (title != null) {\n // node.append('title').text((d) => title(d.data, d));\n // }\n\n if (getLabel) {\n node\n .append('text')\n\n .attr('dy', '0.32em')\n .attr('x', (d) => (d.children ? -6 : 6))\n .attr('text-anchor', (d) => (d.children ? 'end' : 'start'))\n // .attr('paint-order', 'stroke')\n .attr('class', slots?.text ?? '')\n .text((d, i) => getLabel[i]);\n }\n};\n\nexport default TidyTree;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport type { GraphModel } from '@dxos/gem-spore';\n\nexport type TreeNode = {\n id: string;\n label?: string;\n children?: TreeNode[];\n};\n\nexport const mapGraphToTreeData = <N>(model: GraphModel<N>, maxDepth = 8): TreeNode | undefined => {\n const mapNode = (node: N, depth = 0): TreeNode => {\n const treeNode: TreeNode = {\n id: model.idAccessor(node),\n label: model.idAccessor(node).slice(0, 8),\n };\n\n const links = model.graph.links.filter((link) => link.source === treeNode.id);\n if (depth < maxDepth) {\n treeNode.children = links.map((link) =>\n mapNode(model.graph.nodes.find((node) => model.idAccessor(node) === link.target)!, depth + 1),\n );\n }\n\n return treeNode;\n };\n\n let data: TreeNode | undefined;\n if (model.selected) {\n const node = model.graph.nodes.find((node) => model.idAccessor(node) === model.selected);\n if (node) {\n data = mapNode(node);\n }\n }\n\n return data;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { type FC, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { type Space } from '@dxos/client/echo';\nimport { type EchoReactiveObject, getType } from '@dxos/echo-schema';\nimport { createSvgContext, defaultGridStyles, Grid, SVG, SVGRoot, Zoom } from '@dxos/gem-core';\nimport {\n defaultStyles,\n Graph as GraphComponent,\n GraphForceProjector,\n type GraphLayoutNode,\n Markers,\n} from '@dxos/gem-spore';\nimport { filterObjectsSync, type SearchResult } from '@dxos/plugin-search';\nimport { useThemeContext } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport '@dxos/gem-spore/styles';\n\nimport { type EchoGraphNode, SpaceGraphModel } from './graph-model';\nimport { Tree } from '../Tree';\n\ntype Slots = {\n root?: { className?: string };\n grid?: { className?: string };\n};\n\nconst slots: Slots = {};\n\nconst colors = [\n '[&>circle]:!fill-black-300 [&>circle]:!stroke-black-600',\n '[&>circle]:!fill-slate-300 [&>circle]:!stroke-slate-600',\n '[&>circle]:!fill-green-300 [&>circle]:!stroke-green-600',\n '[&>circle]:!fill-sky-300 [&>circle]:!stroke-sky-600',\n '[&>circle]:!fill-cyan-300 [&>circle]:!stroke-cyan-600',\n '[&>circle]:!fill-rose-300 [&>circle]:!stroke-rose-600',\n '[&>circle]:!fill-purple-300 [&>circle]:!stroke-purple-600',\n '[&>circle]:!fill-orange-300 [&>circle]:!stroke-orange-600',\n '[&>circle]:!fill-teal-300 [&>circle]:!stroke-teal-600',\n '[&>circle]:!fill-indigo-300 [&>circle]:!stroke-indigo-600',\n];\n\nexport type GraphProps = {\n space: Space;\n match?: RegExp;\n};\n\nexport const Graph: FC<GraphProps> = ({ space, match }) => {\n const model = useMemo(() => (space ? new SpaceGraphModel({ schema: true }).open(space) : undefined), [space]);\n const [selected, setSelected] = useState<string>();\n const { themeMode } = useThemeContext();\n\n const context = createSvgContext();\n const projector = useMemo(\n () =>\n new GraphForceProjector<EchoGraphNode>(context, {\n forces: {\n manyBody: {\n strength: -100,\n },\n link: {\n distance: 180,\n },\n radial: {\n radius: 200,\n strength: 0.05,\n },\n },\n attributes: {\n radius: (node: GraphLayoutNode<EchoGraphNode>) => (node.data?.type === 'schema' ? 24 : 12),\n },\n }),\n [],\n );\n\n const filteredRef = useRef<SearchResult[]>();\n filteredRef.current = filterObjectsSync(model?.objects ?? [], match);\n useEffect(() => {\n void projector.start();\n }, [match]);\n\n const [colorMap] = useState(new Map<string, string>());\n\n if (!model) {\n return null;\n }\n\n if (selected) {\n return <Tree space={space} selected={selected} variant='tidy' onNodeClick={() => setSelected(undefined)} />;\n }\n\n return (\n <SVGRoot context={context}>\n <SVG className={mx(defaultStyles, slots?.root?.className)}>\n <Markers arrowSize={6} />\n <Grid className={slots?.grid?.className ?? defaultGridStyles(themeMode)} />\n <Zoom extent={[1 / 2, 4]}>\n <GraphComponent\n model={model}\n projector={projector}\n drag\n arrows\n onSelect={(node) => setSelected(node?.data?.id)}\n labels={{\n text: (node: GraphLayoutNode<EchoReactiveObject<any>>) => {\n if (filteredRef.current?.length && !filteredRef.current.some((object) => object.id === node.data?.id)) {\n return undefined;\n }\n\n // TODO(burdon): Use schema.\n return node.data?.label ?? node.data?.title ?? node.data?.name ?? node.data?.id.slice(0, 8);\n },\n }}\n attributes={{\n node: (node: GraphLayoutNode<EchoReactiveObject<any>>) => {\n let className: string | undefined;\n if (node.data) {\n const typename = getType(node.data)?.objectId;\n if (typename) {\n className = colorMap.get(typename);\n if (!className) {\n className = colors[colorMap.size % colors.length];\n colorMap.set(typename, className);\n }\n }\n }\n\n const selected = filteredRef.current?.some((object) => object.id === node.data?.id);\n return {\n class: mx(\n filteredRef.current?.length\n ? selected\n ? [className]\n : '[&>text]:!fill-neutral-300'\n : ['[&>text]:!fill-neutral-700', className],\n ),\n };\n },\n link: () => ({\n class: '[&>path]:!stroke-neutral-300',\n }),\n }}\n />\n </Zoom>\n </SVG>\n </SVGRoot>\n );\n};\n"],
5
- "mappings": "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",
6
- "names": ["AST", "getSchema", "getType", "DynamicSchema", "ReferenceAnnotationId", "SchemaValidator", "StoredSchema", "GraphModel", "log", "CollectionType", "SpaceGraphModel", "constructor", "_options", "_graph", "nodes", "links", "graph", "objects", "_objects", "open", "space", "objectId", "_subscription", "query", "db", "object", "subscribe", "map", "effectSchema", "schema", "getSchemaById", "id", "type", "reduce", "objectSchema", "typename", "info", "slice", "idx", "findIndex", "obj", "push", "source", "target", "getPropertySignatures", "ast", "forEach", "prop", "hasTypeAnnotation", "name", "toString", "value", "String", "refs", "Array", "isArray", "ref", "triggerUpdate", "fire", "setSelected", "close", "undefined", "React", "useEffect", "useMemo", "useState", "useResizeDetector", "createSvgContext", "SVG", "SVGRoot", "d3", "HierarchicalEdgeBundling", "s", "data", "options", "svg", "select", "selectAll", "remove", "radius", "padding", "slots", "root", "hierarchy", "flatten", "tree", "cluster", "size", "Math", "PI", "layout", "addLinks", "node", "append", "leaves", "join", "attr", "d", "x", "y", "text", "call", "id", "slice", "line", "lineRadial", "curve", "curveBundle", "beta", "angle", "links", "flatMap", "leaf", "outgoing", "style", "path", "i", "o", "each", "nodes", "Map", "descendants", "map", "parents", "reduce", "children", "length", "set", "parent", "get", "child", "clone", "d3", "RadialTree", "s", "data", "options", "svg", "select", "selectAll", "remove", "label", "radius", "r", "slots", "arc", "Math", "PI", "root", "hierarchy", "descendants", "getLabel", "map", "d", "layout", "tree", "size", "separation", "a", "b", "parent", "depth", "append", "links", "join", "attr", "path", "linkRadial", "angle", "x", "y", "node", "children", "text", "i", "d3", "TidyTree", "s", "data", "options", "svg", "select", "selectAll", "remove", "label", "width", "height", "r", "padding", "margin", "slots", "root", "hierarchy", "descendants", "getLabel", "map", "d", "dx", "dy", "layout", "tree", "nodeSize", "x0", "Infinity", "x1", "y0", "y1", "each", "x", "y", "sx", "Math", "min", "max", "oy", "append", "links", "join", "attr", "path", "link", "curveBumpX", "node", "children", "text", "i", "mapGraphToTreeData", "model", "maxDepth", "mapNode", "node", "depth", "treeNode", "id", "idAccessor", "label", "slice", "links", "graph", "filter", "link", "source", "children", "map", "nodes", "find", "target", "data", "selected", "React", "useEffect", "useMemo", "useRef", "useState", "getType", "createSvgContext", "defaultGridStyles", "Grid", "SVG", "SVGRoot", "Zoom", "defaultStyles", "Graph", "GraphComponent", "GraphForceProjector", "Markers", "filterObjectsSync", "useThemeContext", "mx", "slots", "colors", "Graph", "space", "match", "model", "useMemo", "SpaceGraphModel", "schema", "open", "undefined", "selected", "setSelected", "useState", "themeMode", "useThemeContext", "context", "createSvgContext", "projector", "GraphForceProjector", "forces", "manyBody", "strength", "link", "distance", "radial", "radius", "attributes", "node", "data", "type", "filteredRef", "useRef", "current", "filterObjectsSync", "objects", "useEffect", "start", "colorMap", "Map", "Tree", "variant", "onNodeClick", "SVGRoot", "SVG", "className", "mx", "defaultStyles", "root", "Markers", "arrowSize", "Grid", "grid", "defaultGridStyles", "Zoom", "extent", "GraphComponent", "drag", "arrows", "onSelect", "id", "labels", "text", "length", "some", "object", "label", "title", "name", "slice", "typename", "getType", "objectId", "get", "size", "set", "class", "defaultTreeLayoutSlots", "node", "path", "text", "renderers", "Map", "TidyTree", "RadialTree", "HierarchicalEdgeBundling", "Tree", "space", "selected", "variant", "onNodeClick", "model", "useMemo", "SpaceGraphModel", "open", "undefined", "tree", "setTree", "useState", "useEffect", "subscribe", "mapGraphToTreeData", "context", "createSvgContext", "ref", "width", "height", "useResizeDetector", "size", "Math", "min", "radius", "options", "label", "d", "id", "marginLeft", "marginRight", "marginTop", "marginBottom", "slots", "renderer", "get", "current", "React", "div", "className", "onClick", "SVGRoot", "SVG"]
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport {\n AST,\n DynamicSchema,\n getSchema,\n getType,\n ReferenceAnnotationId,\n type S,\n SchemaValidator,\n StoredSchema,\n} from '@dxos/echo-schema';\nimport { type GraphData, type GraphLink, GraphModel } from '@dxos/gem-spore';\nimport { log } from '@dxos/log';\nimport { CollectionType } from '@dxos/plugin-space/types';\nimport { type EchoReactiveObject, type Space, type Subscription } from '@dxos/react-client/echo';\n\nexport type SpaceGraphModelOptions = {\n schema?: boolean;\n};\n\nexport type EchoGraphNode = SchemaGraphNode | EchoObjectGraphNode;\n\ntype EchoObjectGraphNode = {\n id: string;\n type: 'echo-object';\n object: EchoReactiveObject<any>;\n};\n\ntype SchemaGraphNode = {\n id: string;\n type: 'schema';\n schema: S.Schema<any>;\n};\n\n/**\n * Converts ECHO objects to a graph.\n */\nexport class SpaceGraphModel extends GraphModel<EchoGraphNode> {\n private readonly _graph: GraphData<EchoGraphNode> = {\n nodes: [],\n links: [],\n };\n\n private _subscription?: Subscription;\n private _objects?: EchoReactiveObject<any>[];\n\n constructor(private readonly _options: SpaceGraphModelOptions = {}) {\n super();\n }\n\n override get graph(): GraphData<EchoGraphNode> {\n return this._graph;\n }\n\n get objects(): EchoReactiveObject<any>[] {\n return this._objects ?? [];\n }\n\n open(space: Space, objectId?: string) {\n if (!this._subscription) {\n // TODO(burdon): Filter.\n const query = space.db.query((object: EchoReactiveObject<any>) => !(object instanceof CollectionType));\n\n this._subscription = query.subscribe(\n ({ objects }) => {\n this._objects = objects;\n this._graph.nodes = objects.map((object) => {\n if (object instanceof StoredSchema) {\n const effectSchema = space.db.schema.getSchemaById(object.id)!;\n return { type: 'schema', id: object.id, schema: effectSchema.schema };\n }\n return { type: 'echo-object', id: object.id, object };\n });\n this._graph.links = objects.reduce<GraphLink[]>((links, object) => {\n const objectSchema = getSchema(object);\n const typename = getType(object)?.objectId;\n if (objectSchema == null || typename == null) {\n log.info('no schema for object:', { id: object.id.slice(0, 8) });\n return links;\n }\n\n if (!(objectSchema instanceof DynamicSchema)) {\n const idx = objects.findIndex((obj) => obj.id === typename);\n if (idx === -1) {\n this._graph.nodes.push({\n id: typename,\n type: 'schema',\n schema: objectSchema,\n });\n }\n }\n\n // Link to schema.\n if (this._options.schema) {\n links.push({\n id: `${object.id}-${typename}`,\n source: object.id,\n target: typename,\n });\n }\n\n // Parse schema to follow referenced objects.\n AST.getPropertySignatures(objectSchema.ast).forEach((prop) => {\n if (!SchemaValidator.hasTypeAnnotation(objectSchema, prop.name.toString(), ReferenceAnnotationId)) {\n return;\n }\n const value = object[String(prop.name)];\n if (value) {\n const refs = Array.isArray(value) ? value : [value];\n for (const ref of refs) {\n if (objects.findIndex((obj) => obj.id === ref.id) !== -1) {\n links.push({\n id: `${object.id}-${String(prop.name)}-${ref.id}`,\n source: object.id,\n target: ref.id,\n });\n }\n }\n }\n });\n\n return links;\n }, []);\n\n this.triggerUpdate();\n },\n { fire: true },\n );\n }\n\n this.setSelected(objectId);\n return this;\n }\n\n close() {\n if (this._subscription) {\n this._subscription();\n this._subscription = undefined;\n }\n\n return this;\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { useResizeDetector } from 'react-resize-detector';\n\nimport { type Space } from '@dxos/client/echo';\nimport { createSvgContext, SVG, SVGRoot } from '@dxos/gem-core';\n\nimport { HierarchicalEdgeBundling, RadialTree, TidyTree } from './layout';\nimport { mapGraphToTreeData, type TreeNode } from './types';\nimport { SpaceGraphModel } from '../Graph';\n\n// TODO(burdon): Create dge bundling graph using d3.hierarchy.\n// https://observablehq.com/@d3/hierarchical-edge-bundling?intent=fork\n\ntype Renderer = (svg: SVGSVGElement, data: any, options: any) => void;\n\nexport type LayoutVariant = 'tidy' | 'radial' | 'edge';\n\n// TODO(burdon): Remove slots?\nexport type TreeLayoutSlots = {\n node?: string;\n path?: string;\n text?: string;\n};\n\nexport type TreeOptions = {\n label: (d: any) => string;\n\n slots?: TreeLayoutSlots;\n radius?: number;\n\n width: number;\n height: number;\n margin?: number;\n\n padding?: number;\n // Radius of nodes.\n r?: number;\n};\n\nexport const defaultTreeLayoutSlots: TreeLayoutSlots = {\n node: 'fill-blue-600',\n path: 'fill-none stroke-blue-400 stroke-[0.5px]',\n text: 'stroke-[0.5px] stroke-neutral-700 text-xs', // TODO(burdon): Create box instead of halo.\n};\n\nconst renderers = new Map<LayoutVariant, Renderer>([\n ['tidy', TidyTree],\n ['radial', RadialTree],\n ['edge', HierarchicalEdgeBundling],\n]);\n\nexport type TreeComponentProps<N = unknown> = {\n space: Space;\n selected?: string;\n variant?: LayoutVariant;\n onNodeClick?: (node?: N) => void;\n};\n\n// TODO(burdon): Label accessor.\nexport const Tree = <N,>({ space, selected, variant = 'tidy', onNodeClick }: TreeComponentProps<N>) => {\n const model = useMemo(() => (space ? new SpaceGraphModel().open(space, selected) : undefined), [space, selected]);\n const [tree, setTree] = useState<TreeNode>();\n useEffect(() => {\n return model?.subscribe(() => {\n const tree = mapGraphToTreeData(model);\n setTree(tree);\n }, true);\n }, [model]);\n\n const context = createSvgContext();\n const { ref, width = 0, height = 0 } = useResizeDetector();\n\n useEffect(() => {\n if (width && height) {\n const size = Math.min(width, height);\n const radius = size * 0.4;\n const options = {\n // TODO(burdon): Type.\n label: (d: any) => d.label ?? d.id,\n width,\n height,\n radius,\n marginLeft: (width - radius * 2) / 2,\n marginRight: (width - radius * 2) / 2,\n marginTop: (height - radius * 2) / 2,\n marginBottom: (height - radius * 2) / 2,\n slots: defaultTreeLayoutSlots,\n };\n\n if (tree) {\n const renderer = renderers.get(variant);\n renderer?.(context.ref.current!, tree, options);\n }\n }\n }, [tree, width, height]);\n\n // TODO(burdon): Provider should expand.\n return (\n <div ref={ref} className='flex grow overflow-hidden' onClick={() => onNodeClick?.()}>\n <SVGRoot context={context}>\n <SVG />\n </SVGRoot>\n </div>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n// Copyright 2022 Observable, Inc.\n//\n\nimport * as d3 from 'd3';\nimport { type HierarchyNode } from 'd3-hierarchy';\n\nimport { type TreeOptions } from '../Tree';\nimport { type TreeNode } from '../types';\n\n// Create hierarchical ID.\n// eslint-disable-next-line unused-imports/no-unused-vars\nconst getId = (node: HierarchyNode<TreeNode>): string =>\n `${node.parent ? getId(node.parent) + '/' : ''}${node.data.id.slice(0, 4)}`;\n\n// https://github.com/d3/d3-hierarchy\n// https://observablehq.com/@d3/hierarchical-edge-bundling?intent=fork\nconst HierarchicalEdgeBundling = (s: SVGSVGElement, data: TreeNode, options: TreeOptions) => {\n const svg = d3.select(s);\n svg.selectAll('*').remove();\n\n const { radius = 600, padding = 100, slots } = options;\n\n // https://d3js.org/d3-hierarchy/hierarchy\n const root = d3.hierarchy(flatten(data));\n // .sort((a, b) => d3.ascending(a.height, b.height) || d3.ascending(getName(a.data), getName(b.data)));\n\n const tree = d3.cluster<TreeNode>().size([2 * Math.PI, radius - padding]);\n const layout = tree(addLinks(root));\n\n // eslint-disable-next-line unused-imports/no-unused-vars\n const node = svg\n .append('g')\n .selectAll()\n .data(layout.leaves())\n .join('g')\n .attr('transform', (d) => `rotate(${d.x * (180 / Math.PI) - 90}) translate(${d.y},0)`)\n .append('text')\n .attr('class', slots?.text ?? '')\n .attr('dy', '0.31em') // TODO(burdon): Based on font size.\n .attr('x', (d) => (d.x < Math.PI ? 6 : -6))\n .attr('text-anchor', (d) => (d.x < Math.PI ? 'start' : 'end'))\n .attr('transform', (d) => (d.x >= Math.PI ? 'rotate(180)' : null))\n // .text((d: any) => d.data.id)\n // .each(function (d: any) {\n // d.text = this;\n // })\n // .on('mouseover', overed)\n // .on('mouseout', outed)\n .call(\n (text) => text.text((d: any) => d.data.id.slice(0, 8)),\n // .text((d: any) => `${getId(d)} [${[(d as any).outgoing?.length ?? 0]}]`),\n );\n\n // https://d3js.org/d3-shape/radial-line\n const line = d3\n .lineRadial()\n .curve(d3.curveBundle.beta(0.85))\n .radius((d: any) => d.y)\n .angle((d: any) => d.x);\n\n // eslint-disable-next-line unused-imports/no-unused-vars\n const links = svg\n .append('g')\n .selectAll()\n .data(layout.leaves().flatMap((leaf: any) => leaf.outgoing))\n .join('path')\n .style('mix-blend-mode', 'multiply')\n .attr('class', slots?.path ?? '')\n .attr('d', ([i, o]) => {\n return line(i.path(o));\n })\n .each(function (d) {\n d.path = this;\n });\n\n // function overed(event: any, d: X) {\n // link.style('mix-blend-mode', null);\n // d3.select(this).attr('font-weight', 'bold');\n // d3.selectAll(d.incoming.map((d) => d.path))\n // .attr('stroke', color.in)\n // .raise();\n // d3.selectAll((d as any).incoming.map(([d]) => d.text))\n // .attr('fill', color.in)\n // .attr('font-weight', 'bold');\n // d3.selectAll(d.outgoing.map((d) => d.path))\n // .attr('stroke', color.out)\n // .raise();\n // d3.selectAll(d.outgoing.map(([, d]) => d.text))\n // .attr('fill', color.out)\n // .attr('font-weight', 'bold');\n // }\n\n // function outed(event: any, d: HierarchyNode<Datum>) {\n // // @ts-ignore\n // d3.select(this).attr('font-weight', null);\n // d3.selectAll(d.incoming.map((d) => d.path)).attr('stroke', null);\n // d3.selectAll(d.incoming.map(([d]) => d.text))\n // .attr('fill', null)\n // .attr('font-weight', null);\n // d3.selectAll(d.outgoing.map((d) => d.path)).attr('stroke', null);\n // d3.selectAll(d.outgoing.map(([, d]) => d.text))\n // .attr('fill', null)\n // .attr('font-weight', null);\n // }\n};\n\n// Monkey-patch with incoming/outgoing nodes.\nconst addLinks = (root: HierarchyNode<TreeNode>) => {\n // Map of nodes indexed by ID.\n const nodes = new Map(root.descendants().map((d) => [d.data.id, d]));\n const parents = root.descendants().reduce((map, d) => {\n if (d.children?.length) {\n map.set(d.data.id, d);\n }\n return map;\n }, new Map<string, HierarchyNode<TreeNode>>());\n\n for (const d of root.leaves()) {\n // (d as any).incoming = [];\n\n const parent = parents.get(d.data.id);\n if (parent) {\n // Skip the first node which is a placeholder created by flatten().\n (d as any).outgoing =\n parent.data.children?.slice(1).map((child) => {\n return [d, nodes.get(child.id)!];\n }) ?? [];\n } else {\n (d as any).outgoing = [];\n }\n }\n\n // for (const d of root.leaves()) {\n // for (const [_, o] of (d as any).outgoing) {\n // o.incoming.push(o);\n // }\n // }\n\n return root;\n};\n\n/**\n * We are using a hierarchy in order to group nodes by parent, but we want the parent\n * nodes to be positioned at the first level along with all descendents.\n * So we add a placeholder for all parents at the head of each group.\n * @param node\n */\nconst flatten = (node: TreeNode) => {\n const clone: TreeNode = {\n id: node.id,\n };\n\n // TODO(burdon): NOTE: Should exclude schema (since requires a tree).\n if (node.children?.length) {\n const children = node.children.map((child) => flatten(child));\n clone.children = [{ id: node.id }, ...children];\n }\n\n return clone;\n};\n\nexport default HierarchicalEdgeBundling;\n", "//\n// Copyright 2023 DXOS.org\n// Copyright 2022 Observable, Inc.\n//\n\nimport * as d3 from 'd3';\n\nimport { type TreeOptions } from '../Tree';\n\n// Released under the ISC license.\n// https://observablehq.com/@d3/radial-tree\n// https://observablehq.com/@d3/tree\nconst RadialTree = (s: SVGSVGElement, data: any, options: TreeOptions) => {\n const svg = d3.select(s);\n svg.selectAll('*').remove();\n\n const {\n label, // given a node d, returns the display name\n radius = 400,\n r = 4, // radius of nodes\n slots,\n } = options;\n\n const arc = 2 * Math.PI;\n\n const root = d3.hierarchy(data);\n\n // Sort the nodes.\n // if (sort) {\n // root.sort(sort);\n // }\n\n // Compute labels and titles.\n const descendants = root.descendants();\n const getLabel = label === null ? null : descendants.map((d) => label(d.data));\n\n // Compute the layout.\n const layout = d3\n .tree()\n .size([arc, radius])\n .separation((a: any, b: any) => (a.parent === b.parent ? 1 : 2) / a.depth);\n layout(root);\n\n // Links.\n svg\n .append('g')\n .selectAll('path')\n .data(root.links())\n .join('path')\n .attr('class', slots?.path ?? '')\n .attr(\n 'd',\n d3\n .linkRadial()\n .angle((d: any) => d.x + Math.PI / 2)\n .radius((d: any) => d.y) as any,\n );\n\n // Nodes.\n const node = svg\n .append('g')\n .selectAll('a')\n .data(root.descendants())\n .join('a')\n // .attr('xlink:href', link == null ? null : (d) => link(d.data, d))\n // .attr('target', link == null ? null : linkTarget)\n .attr('transform', (d: any) => `rotate(${(d.x * 180) / Math.PI}) translate(${d.y},0)`);\n\n node\n .append('circle')\n .attr('class', slots?.node ?? '')\n .attr('r', r);\n\n // if (title != null) {\n // node.append('title').text((d) => title(d.data, d));\n // }\n\n // Text.\n if (getLabel) {\n node\n .append('text')\n .attr('transform', (d: any) => `rotate(${d.x >= Math.PI ? 180 : 0})`)\n .attr('dy', '0.32em')\n // eslint-disable-next-line no-mixed-operators\n .attr('x', (d: any) => (d.x < Math.PI === !d.children ? 6 : -6))\n // eslint-disable-next-line no-mixed-operators\n .attr('text-anchor', (d: any) => (d.x < Math.PI === !d.children ? 'start' : 'end'))\n // .attr('paint-order', 'stroke')\n .attr('class', slots?.text ?? '')\n .text((d, i) => getLabel[i]);\n }\n\n return svg.node();\n};\n\nexport default RadialTree;\n", "//\n// Copyright 2023 DXOS.org\n// Copyright 2021 Observable, Inc.\n//\n\nimport * as d3 from 'd3';\n\nimport { type TreeOptions } from '../Tree';\n\n// Released under the ISC license.\n// https://observablehq.com/@d3/tree\nconst TidyTree = (s: SVGSVGElement, data: any, options: TreeOptions) => {\n const svg = d3.select(s);\n svg.selectAll('*').remove();\n\n const { label, width, height, r = 4, padding = 4, margin = 60, slots } = options;\n\n const root = d3.hierarchy(data);\n\n // Compute labels and titles.\n const descendants = root.descendants();\n const getLabel = label == null ? null : descendants.map((d) => label(d.data));\n\n // Compute the layout.\n const dx = 16;\n const dy = width / (root.height + padding);\n const layout = d3.tree().nodeSize([dx, dy]);\n layout(root);\n\n // Center the tree.\n let x0 = Infinity;\n let x1 = -x0;\n let y0 = Infinity;\n let y1 = -y0;\n root.each((d: any) => {\n if (d.x > x1) {\n x1 = d.x;\n }\n if (d.x < x0) {\n x0 = d.x;\n }\n if (d.y > y1) {\n y1 = d.y;\n }\n if (d.y < y0) {\n y0 = d.y;\n }\n });\n\n // TODO(burdon): Option to expand.\n // NOTE: x and y are flipped.\n const sx = Math.min(2, Math.max(1, (height - margin * 2) / (x1 - x0)));\n const oy = -(width - (y1 - y0)) / 2;\n\n // Links.\n svg\n .append('g')\n .selectAll('path')\n .data(root.links())\n .join('path')\n .attr('class', slots?.path ?? '')\n .attr(\n 'd',\n d3\n .link(d3.curveBumpX)\n .x((d: any) => d.y + oy)\n .y((d: any) => d.x * sx) as any,\n );\n\n // Nodes.\n const node = svg\n .append('g')\n .selectAll('a')\n .data(root.descendants())\n .join('a')\n // .attr('xlink:href', link == null ? null : (d) => link(d.data, d))\n // .attr('target', link == null ? null : linkTarget)\n .attr('transform', (d: any) => `translate(${d.y + oy},${d.x * sx})`);\n\n node\n .append('circle')\n .attr('class', slots?.node ?? '')\n .attr('r', r);\n\n // if (title != null) {\n // node.append('title').text((d) => title(d.data, d));\n // }\n\n if (getLabel) {\n node\n .append('text')\n\n .attr('dy', '0.32em')\n .attr('x', (d) => (d.children ? -6 : 6))\n .attr('text-anchor', (d) => (d.children ? 'end' : 'start'))\n // .attr('paint-order', 'stroke')\n .attr('class', slots?.text ?? '')\n .text((d, i) => getLabel[i]);\n }\n};\n\nexport default TidyTree;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport type { GraphModel } from '@dxos/gem-spore';\n\nexport type TreeNode = {\n id: string;\n label?: string;\n children?: TreeNode[];\n};\n\nexport const mapGraphToTreeData = <N>(model: GraphModel<N>, maxDepth = 8): TreeNode | undefined => {\n const mapNode = (node: N, depth = 0): TreeNode => {\n const treeNode: TreeNode = {\n id: model.idAccessor(node),\n label: model.idAccessor(node).slice(0, 8),\n };\n\n const links = model.graph.links.filter((link) => link.source === treeNode.id);\n if (depth < maxDepth) {\n treeNode.children = links.map((link) =>\n mapNode(model.graph.nodes.find((node) => model.idAccessor(node) === link.target)!, depth + 1),\n );\n }\n\n return treeNode;\n };\n\n let data: TreeNode | undefined;\n if (model.selected) {\n const node = model.graph.nodes.find((node) => model.idAccessor(node) === model.selected);\n if (node) {\n data = mapNode(node);\n }\n }\n\n return data;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { type FC, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { type Space } from '@dxos/client/echo';\nimport { type EchoReactiveObject, getType } from '@dxos/echo-schema';\nimport { createSvgContext, defaultGridStyles, Grid, SVG, SVGRoot, Zoom } from '@dxos/gem-core';\nimport {\n defaultStyles,\n Graph as GraphComponent,\n GraphForceProjector,\n type GraphLayoutNode,\n Markers,\n} from '@dxos/gem-spore';\nimport { filterObjectsSync, type SearchResult } from '@dxos/plugin-search';\nimport { useThemeContext } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport '@dxos/gem-spore/styles';\n\nimport { type EchoGraphNode, SpaceGraphModel } from './graph-model';\nimport { Tree } from '../Tree';\n\ntype Slots = {\n root?: { className?: string };\n grid?: { className?: string };\n};\n\nconst slots: Slots = {};\n\nconst colors = [\n '[&>circle]:!fill-black-300 [&>circle]:!stroke-black-600',\n '[&>circle]:!fill-slate-300 [&>circle]:!stroke-slate-600',\n '[&>circle]:!fill-green-300 [&>circle]:!stroke-green-600',\n '[&>circle]:!fill-sky-300 [&>circle]:!stroke-sky-600',\n '[&>circle]:!fill-cyan-300 [&>circle]:!stroke-cyan-600',\n '[&>circle]:!fill-rose-300 [&>circle]:!stroke-rose-600',\n '[&>circle]:!fill-purple-300 [&>circle]:!stroke-purple-600',\n '[&>circle]:!fill-orange-300 [&>circle]:!stroke-orange-600',\n '[&>circle]:!fill-teal-300 [&>circle]:!stroke-teal-600',\n '[&>circle]:!fill-indigo-300 [&>circle]:!stroke-indigo-600',\n];\n\nexport type GraphProps = {\n space: Space;\n match?: RegExp;\n};\n\nexport const Graph: FC<GraphProps> = ({ space, match }) => {\n const model = useMemo(() => (space ? new SpaceGraphModel({ schema: true }).open(space) : undefined), [space]);\n const [selected, setSelected] = useState<string>();\n const { themeMode } = useThemeContext();\n\n const context = createSvgContext();\n const projector = useMemo(\n () =>\n new GraphForceProjector<EchoGraphNode>(context, {\n forces: {\n manyBody: {\n strength: -100,\n },\n link: {\n distance: 180,\n },\n radial: {\n radius: 200,\n strength: 0.05,\n },\n },\n attributes: {\n radius: (node: GraphLayoutNode<EchoGraphNode>) => (node.data?.type === 'schema' ? 24 : 12),\n },\n }),\n [],\n );\n\n const filteredRef = useRef<SearchResult[]>();\n filteredRef.current = filterObjectsSync(model?.objects ?? [], match);\n useEffect(() => {\n void projector.start();\n }, [match]);\n\n const [colorMap] = useState(new Map<string, string>());\n\n if (!model) {\n return null;\n }\n\n if (selected) {\n return <Tree space={space} selected={selected} variant='tidy' onNodeClick={() => setSelected(undefined)} />;\n }\n\n return (\n <SVGRoot context={context}>\n <SVG className={mx(defaultStyles, slots?.root?.className)}>\n <Markers arrowSize={6} />\n <Grid className={slots?.grid?.className ?? defaultGridStyles(themeMode)} />\n <Zoom extent={[1 / 2, 4]}>\n <GraphComponent\n model={model}\n projector={projector}\n drag\n arrows\n onSelect={(node) => setSelected(node?.data?.id)}\n labels={{\n text: (node: GraphLayoutNode<EchoReactiveObject<any>>) => {\n if (filteredRef.current?.length && !filteredRef.current.some((object) => object.id === node.data?.id)) {\n return undefined;\n }\n\n // TODO(burdon): Use schema.\n return node.data?.label ?? node.data?.title ?? node.data?.name ?? node.data?.id.slice(0, 8);\n },\n }}\n attributes={{\n node: (node: GraphLayoutNode<EchoReactiveObject<any>>) => {\n let className: string | undefined;\n if (node.data) {\n const typename = getType(node.data)?.objectId;\n if (typename) {\n className = colorMap.get(typename);\n if (!className) {\n className = colors[colorMap.size % colors.length];\n colorMap.set(typename, className);\n }\n }\n }\n\n const selected = filteredRef.current?.some((object) => object.id === node.data?.id);\n return {\n class: mx(\n filteredRef.current?.length\n ? selected\n ? [className]\n : '[&>text]:!fill-neutral-300'\n : ['[&>text]:!fill-neutral-700', className],\n ),\n };\n },\n link: () => ({\n class: '[&>path]:!stroke-neutral-300',\n }),\n }}\n />\n </Zoom>\n </SVG>\n </SVGRoot>\n );\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["AST", "DynamicSchema", "getSchema", "getType", "ReferenceAnnotationId", "SchemaValidator", "StoredSchema", "GraphModel", "log", "CollectionType", "SpaceGraphModel", "constructor", "_options", "_graph", "nodes", "links", "graph", "objects", "_objects", "open", "space", "objectId", "_subscription", "query", "db", "object", "subscribe", "map", "effectSchema", "schema", "getSchemaById", "id", "type", "reduce", "objectSchema", "typename", "info", "slice", "idx", "findIndex", "obj", "push", "source", "target", "getPropertySignatures", "ast", "forEach", "prop", "hasTypeAnnotation", "name", "toString", "value", "String", "refs", "Array", "isArray", "ref", "triggerUpdate", "fire", "setSelected", "close", "undefined", "React", "useEffect", "useMemo", "useState", "useResizeDetector", "createSvgContext", "SVG", "SVGRoot", "d3", "HierarchicalEdgeBundling", "s", "data", "options", "svg", "select", "selectAll", "remove", "radius", "padding", "slots", "root", "hierarchy", "flatten", "tree", "cluster", "size", "Math", "PI", "layout", "addLinks", "node", "append", "leaves", "join", "attr", "d", "x", "y", "text", "call", "id", "slice", "line", "lineRadial", "curve", "curveBundle", "beta", "angle", "links", "flatMap", "leaf", "outgoing", "style", "path", "i", "o", "each", "nodes", "Map", "descendants", "map", "parents", "reduce", "children", "length", "set", "parent", "get", "child", "clone", "d3", "RadialTree", "s", "data", "options", "svg", "select", "selectAll", "remove", "label", "radius", "r", "slots", "arc", "Math", "PI", "root", "hierarchy", "descendants", "getLabel", "map", "d", "layout", "tree", "size", "separation", "a", "b", "parent", "depth", "append", "links", "join", "attr", "path", "linkRadial", "angle", "x", "y", "node", "children", "text", "i", "d3", "TidyTree", "s", "data", "options", "svg", "select", "selectAll", "remove", "label", "width", "height", "r", "padding", "margin", "slots", "root", "hierarchy", "descendants", "getLabel", "map", "d", "dx", "dy", "layout", "tree", "nodeSize", "x0", "Infinity", "x1", "y0", "y1", "each", "x", "y", "sx", "Math", "min", "max", "oy", "append", "links", "join", "attr", "path", "link", "curveBumpX", "node", "children", "text", "i", "mapGraphToTreeData", "model", "maxDepth", "mapNode", "node", "depth", "treeNode", "id", "idAccessor", "label", "slice", "links", "graph", "filter", "link", "source", "children", "map", "nodes", "find", "target", "data", "selected", "React", "useEffect", "useMemo", "useRef", "useState", "getType", "createSvgContext", "defaultGridStyles", "Grid", "SVG", "SVGRoot", "Zoom", "defaultStyles", "Graph", "GraphComponent", "GraphForceProjector", "Markers", "filterObjectsSync", "useThemeContext", "mx", "slots", "colors", "Graph", "space", "match", "model", "useMemo", "SpaceGraphModel", "schema", "open", "undefined", "selected", "setSelected", "useState", "themeMode", "useThemeContext", "context", "createSvgContext", "projector", "GraphForceProjector", "forces", "manyBody", "strength", "link", "distance", "radial", "radius", "attributes", "node", "data", "type", "filteredRef", "useRef", "current", "filterObjectsSync", "objects", "useEffect", "start", "colorMap", "Map", "Tree", "variant", "onNodeClick", "SVGRoot", "SVG", "className", "mx", "defaultStyles", "root", "Markers", "arrowSize", "Grid", "grid", "defaultGridStyles", "Zoom", "extent", "GraphComponent", "drag", "arrows", "onSelect", "id", "labels", "text", "length", "some", "object", "label", "title", "name", "slice", "typename", "getType", "objectId", "get", "size", "set", "class", "defaultTreeLayoutSlots", "node", "path", "text", "renderers", "Map", "TidyTree", "RadialTree", "HierarchicalEdgeBundling", "Tree", "space", "selected", "variant", "onNodeClick", "model", "useMemo", "SpaceGraphModel", "open", "undefined", "tree", "setTree", "useState", "useEffect", "subscribe", "mapGraphToTreeData", "context", "createSvgContext", "ref", "width", "height", "useResizeDetector", "size", "Math", "min", "radius", "options", "label", "d", "id", "marginLeft", "marginRight", "marginTop", "marginBottom", "slots", "renderer", "get", "current", "React", "div", "className", "onClick", "SVGRoot", "SVG"]
7
7
  }
@@ -1,19 +1,20 @@
1
1
  import {
2
2
  ExplorerAction,
3
3
  ViewType
4
- } from "./chunk-DOI4BI5E.mjs";
4
+ } from "./chunk-JIDPF2GF.mjs";
5
5
  import {
6
6
  EXPLORER_PLUGIN,
7
7
  meta_default
8
- } from "./chunk-5OVYH5FD.mjs";
8
+ } from "./chunk-TL6ADY3P.mjs";
9
9
  import {
10
10
  Graph,
11
11
  SpaceGraphModel,
12
12
  Tree,
13
13
  defaultTreeLayoutSlots
14
- } from "./chunk-WNQNMDOO.mjs";
14
+ } from "./chunk-XKITKIPQ.mjs";
15
15
 
16
16
  // packages/plugins/experimental/plugin-explorer/src/ExplorerPlugin.tsx
17
+ import { Graph as Graph2 } from "@phosphor-icons/react";
17
18
  import React4 from "react";
18
19
  import { NavigationAction, parseIntentPlugin, resolvePlugin } from "@dxos/app-framework";
19
20
  import { parseClientPlugin } from "@dxos/plugin-client";
@@ -10847,8 +10848,8 @@ var Globe = ({ items = [], accessor, projection = "orthographic", options = defa
10847
10848
  };
10848
10849
 
10849
10850
  // packages/plugins/experimental/plugin-explorer/src/components/index.ts
10850
- var ExplorerMain = React3.lazy(() => import("./ExplorerMain-ZEXQSLWN.mjs"));
10851
- var ExplorerArticle = React3.lazy(() => import("./ExplorerArticle-5SNS2WNJ.mjs"));
10851
+ var ExplorerMain = React3.lazy(() => import("./ExplorerMain-K6Z6UVZR.mjs"));
10852
+ var ExplorerArticle = React3.lazy(() => import("./ExplorerArticle-2LF7QANN.mjs"));
10852
10853
 
10853
10854
  // packages/plugins/experimental/plugin-explorer/src/translations.ts
10854
10855
  var translations_default = [
@@ -10878,7 +10879,8 @@ var ExplorerPlugin = () => {
10878
10879
  ns: EXPLORER_PLUGIN
10879
10880
  }
10880
10881
  ],
10881
- icon: "ph--graph--regular"
10882
+ icon: (props) => /* @__PURE__ */ React4.createElement(Graph2, props),
10883
+ iconSymbol: "ph--graph--regular"
10882
10884
  }
10883
10885
  }
10884
10886
  },
@@ -10934,7 +10936,8 @@ var ExplorerPlugin = () => {
10934
10936
  ns: EXPLORER_PLUGIN
10935
10937
  }
10936
10938
  ],
10937
- icon: "ph--graph--regular",
10939
+ icon: (props) => /* @__PURE__ */ React4.createElement(Graph2, props),
10940
+ iconSymbol: "ph--graph--regular",
10938
10941
  testId: "explorerPlugin.createObject"
10939
10942
  }
10940
10943
  }