feat(graph): enable radial mode (#1738)
This commit is contained in:
		@@ -18,6 +18,7 @@ export interface D3Config {
 | 
			
		||||
  removeTags: string[]
 | 
			
		||||
  showTags: boolean
 | 
			
		||||
  focusOnHover?: boolean
 | 
			
		||||
  enableRadial?: boolean
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface GraphOptions {
 | 
			
		||||
@@ -39,6 +40,7 @@ const defaultOptions: GraphOptions = {
 | 
			
		||||
    showTags: true,
 | 
			
		||||
    removeTags: [],
 | 
			
		||||
    focusOnHover: false,
 | 
			
		||||
    enableRadial: false,
 | 
			
		||||
  },
 | 
			
		||||
  globalGraph: {
 | 
			
		||||
    drag: true,
 | 
			
		||||
@@ -53,10 +55,11 @@ const defaultOptions: GraphOptions = {
 | 
			
		||||
    showTags: true,
 | 
			
		||||
    removeTags: [],
 | 
			
		||||
    focusOnHover: true,
 | 
			
		||||
    enableRadial: true,
 | 
			
		||||
  },
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default ((opts?: GraphOptions) => {
 | 
			
		||||
export default ((opts?: Partial<GraphOptions>) => {
 | 
			
		||||
  const Graph: QuartzComponent = ({ displayClass, cfg }: QuartzComponentProps) => {
 | 
			
		||||
    const localGraph = { ...defaultOptions.localGraph, ...opts?.localGraph }
 | 
			
		||||
    const globalGraph = { ...defaultOptions.globalGraph, ...opts?.globalGraph }
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,7 @@ import {
 | 
			
		||||
  forceCenter,
 | 
			
		||||
  forceLink,
 | 
			
		||||
  forceCollide,
 | 
			
		||||
  forceRadial,
 | 
			
		||||
  zoomIdentity,
 | 
			
		||||
  select,
 | 
			
		||||
  drag,
 | 
			
		||||
@@ -87,6 +88,7 @@ async function renderGraph(container: string, fullSlug: FullSlug) {
 | 
			
		||||
    removeTags,
 | 
			
		||||
    showTags,
 | 
			
		||||
    focusOnHover,
 | 
			
		||||
    enableRadial,
 | 
			
		||||
  } = JSON.parse(graph.dataset["cfg"]!) as D3Config
 | 
			
		||||
 | 
			
		||||
  const data: Map<SimpleSlug, ContentDetails> = new Map(
 | 
			
		||||
@@ -161,15 +163,20 @@ async function renderGraph(container: string, fullSlug: FullSlug) {
 | 
			
		||||
      })),
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const width = graph.offsetWidth
 | 
			
		||||
  const height = Math.max(graph.offsetHeight, 250)
 | 
			
		||||
 | 
			
		||||
  // we virtualize the simulation and use pixi to actually render it
 | 
			
		||||
  // Calculate the radius of the container circle
 | 
			
		||||
  const radius = Math.min(width, height) / 2 - 40 // 40px padding
 | 
			
		||||
  const simulation: Simulation<NodeData, LinkData> = forceSimulation<NodeData>(graphData.nodes)
 | 
			
		||||
    .force("charge", forceManyBody().strength(-100 * repelForce))
 | 
			
		||||
    .force("center", forceCenter().strength(centerForce))
 | 
			
		||||
    .force("link", forceLink(graphData.links).distance(linkDistance))
 | 
			
		||||
    .force("collide", forceCollide<NodeData>((n) => nodeRadius(n)).iterations(3))
 | 
			
		||||
 | 
			
		||||
  const width = graph.offsetWidth
 | 
			
		||||
  const height = Math.max(graph.offsetHeight, 250)
 | 
			
		||||
  if (enableRadial)
 | 
			
		||||
    simulation.force("radial", forceRadial(radius * 0.8, width / 2, height / 2).strength(0.3))
 | 
			
		||||
 | 
			
		||||
  // precompute style prop strings as pixi doesn't support css variables
 | 
			
		||||
  const cssVars = [
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user