Skip to content

dsnchz/solid-g6

Repository files navigation

solid-g6

@dschz/solid-g6

License @antv/g6 npm Bundle Size JSR CI Discord

SolidJS + AntV

Bringing together SolidJS reactivity with AntV G6's powerful graph visualization capabilities

A comprehensive graph visualization library for SolidJS built on top of AntV G6. Create interactive, customizable graph visualizations with powerful layout algorithms and real-time controls.

To see the kinds of graphs you can create using G6, ckeck out their Playground page.

📚 Table of Contents

🚀 Features

  • 13+ Layout Algorithms: Comprehensive collection of graph layout algorithms for different visualization needs
  • Real-time Controls: Interactive parameter adjustment with immediate visual feedback
  • Physics Simulation: Advanced force-directed layouts with customizable physics parameters
  • Clustering Support: Built-in clustering capabilities for organizing related nodes
  • TypeScript Support: Full type safety with comprehensive TypeScript definitions
  • Responsive Design: Mobile-friendly layouts that adapt to different screen sizes
  • Educational Content: Detailed explanations of algorithms and use cases
  • Performance Optimized: Efficient rendering for large graphs with thousands of nodes
  • Extensible Architecture: Easy to add custom layouts and behaviors
  • SolidJS Integration: Leverages SolidJS reactivity for optimal performance

🛠️ Developer Experience

Solid G6 significantly enhances the developer experience when working with AntV G6 by providing:

🎯 Enhanced Type Safety

  • Generic Type Support: Adds generics and data type inference that G6's TypeScript definitions lack
  • Cross-field Type Inference: Utility functions automatically infer types across data structures and configurations
  • Enhanced IntelliSense: Improved autocomplete that understands your specific data shapes
  • Type-safe Data Access: Strong typing for node/edge/combo data properties throughout the API

🔧 Simplified Configuration

  • Utility Functions: Type-safe helpers that eliminate guesswork and reduce boilerplate
  • Consistent Patterns: Standardized approach to creating graphs, layouts, and styling
  • Composition-friendly: Easy to compose and reuse configurations across your application
  • Zero Runtime Overhead: All utilities are compile-time only - no bundle size impact

📚 Improved Documentation

  • Inline Documentation: JSDoc comments with examples for every option and parameter
  • Type Definitions as Documentation: Your IDE shows exactly what options are available
  • Real-world Examples: Comprehensive playground with 13+ layout examples and use cases

🚀 Productivity Benefits

// Before: G6 with TypeScript (lacks generics & data inference)
const graph = new G6Graph({
  container: containerRef,
  data: myData, // Basic typing, no data shape inference
  layout: { type: "force", gravity: 1 }, // Layout options typed, but not connected to data
  node: {
    style: {
      labelText: (d) => d.data?.label, // 'd.data' is 'unknown' - no autocomplete
    },
  },
});

// After: Solid G6 (adds generics & cross-field inference)
const data = createGraphData({
  nodes: [{ id: "1", data: { label: "Node 1", category: "important" } }],
  edges: [{ source: "1", target: "2" }],
});

const nodeConfig = createGraphNodeOptions<typeof data>({
  style: {
    labelText: (d) => d.data.label, // Full autocomplete - knows 'label' exists
    fill: (d) => (d.data.category === "important" ? "red" : "blue"), // 'category' typed
  },
});

<Graph data={data} node={nodeConfig} />;

Result: Builds upon G6's solid TypeScript foundation by adding the missing generics and data inference for a significantly improved developer experience.

🚀 Roadmap & Future Enhancements

SolidJS JSX Custom Nodes (Coming Soon)

A community-driven effort is underway to add g6-extension-solid (very much inspired by g6-extension-react) to the core G6 library, which will enable Solid JSX-Powered Custom Nodes

Key Benefits

  • True JSX Integration: Use familiar SolidJS components for complex node designs
  • Fine-Grained Reactivity: Leverage SolidJS's superior reactivity for real-time updates
  • Zero Virtual DOM Overhead: Maximum performance with direct DOM manipulation
  • Component Reusability: Share node components across different graphs
  • CSS-in-JS Support: Full styling capabilities with your preferred CSS solution

🎨 Advanced Use Cases

  • Rich Data Visualizations: Embed charts, progress bars, and complex layouts within nodes
  • Interactive Elements: Buttons, forms, and controls directly in graph nodes
  • Real-Time Data Binding: Live updates without manual re-rendering
  • Responsive Node Design: Nodes that adapt to zoom levels and screen sizes

This extension will make @dschz/solid-g6 an even more powerful and flexible graph visualization library for SolidJS applications.

Status: 🚧 Work in Progress G6 PR #7199

📦 Installation

Install Dependencies

# Using npm
npm install @antv/g6 @dschz/solid-g6

# Using pnpm
pnpm install @antv/g6 @dschz/solid-g6

# Using yarn
yarn install @antv/g6 @dschz/solid-g6

# Using bun
bun install @antv/g6 @dschz/solid-g6

📚 Library Exports

Solid G6 provides a comprehensive set of components, utilities, and types for graph visualization:

Core Components & Hooks

  • Graph - Main graph visualization component
  • useGraph - SolidJS hook for accessing graph context and methods

Utility Functions (Type-Safe)

  • createGraphData - Create type-safe graph data structures
  • createGraphOptions - Configure complete graph options
  • createGraphLayout - Set up layout algorithms with type inference
  • createGraphBehaviors - Define interaction behaviors
  • createGraphNodeOptions - Configure node styling and behavior
  • createGraphEdgeOptions - Configure edge styling and behavior
  • createGraphComboOptions - Configure combo (group) styling and behavior

TypeScript Types

All TypeScript interfaces and types are exported for advanced usage scenarios, including G6GraphData, G6GraphOptions, NodeData, EdgeData, and layout-specific types.

⚡ Quick Start

import { Graph, createGraphData } from "@dschz/solid-g6";
import { createSignal } from "solid-js";

function App() {
  const [graphData] = createSignal(
    createGraphData({
      nodes: [
        { id: "node1", data: { label: "Node 1" } },
        { id: "node2", data: { label: "Node 2" } },
        { id: "node3", data: { label: "Node 3" } },
      ],
      edges: [
        { source: "node1", target: "node2" },
        { source: "node2", target: "node3" },
      ],
    }),
  );

  return (
    <Graph
      data={graphData()}
      layout={{
        type: "force",
        gravity: 1,
        edgeStrength: 0.5,
        nodeStrength: -10,
      }}
      style={{ width: "800px", height: "600px" }}
    />
  );
}

🎮 Interactive Playground

The best way to explore Solid G6 is through our comprehensive interactive playground!

🚀 Run Locally for Full Experience

We highly recommend cloning the repository and running the playground locally to access:

  • Live Interactive Examples - 13+ layout algorithms with real-time parameter controls
  • Complete Source Code - View and copy implementation details for each example
  • Multiple Demo Scenarios - Each layout includes 2-3 different use cases and data structures
  • Educational Content - Algorithm explanations, physics concepts, and best practice guides
  • Responsive Testing - See how layouts adapt to different screen sizes
  • Performance Insights - Test with larger datasets and observe behavior

📥 Get Started in 2 Minutes

# Clone the repository
git clone https://github.com/dsnchz/solid-g6.git
cd solid-g6

# Install dependencies
bun install

# Start the playground
bun start

# Open http://localhost:3000 in your browser

🎯 What You'll Find

The playground includes comprehensive examples for:

  • Force-Directed Layouts (4 types) - Physics simulations with clustering
  • Hierarchical Layouts (2 types) - Tree structures and organizational charts
  • Circular Layouts (3 types) - Radial arrangements and concentric circles
  • Grid-Based Layouts (1 type) - Regular matrix arrangements
  • Specialized Layouts (3 types) - MDS, Fishbone diagrams, and sequential flows

Each example features:

  • 🎛️ Interactive Controls - Sliders, toggles, and dropdowns for real-time adjustment
  • 📊 Demo Scenarios - Multiple pre-configured datasets showing different use cases
  • 📖 Algorithm Explanations - Educational content about how each layout works
  • 💾 Copy-Ready Code - Implementation snippets you can use directly
  • 🔗 Official Documentation Links - Direct links to G6's layout documentation

💡 Why Run Locally?

While this README provides comprehensive information, the interactive playground offers the most effective learning experience:

  • Visual Learning - See algorithms in action with your own data
  • Parameter Understanding - Experiment with settings to understand their impact
  • Implementation Clarity - Full source code with TypeScript types
  • Real-world Context - Multiple scenarios showing practical applications

Start exploring: bun start and visit http://localhost:3000 🚀

🎨 Visual Elements

🔵 Nodes

Individual graph elements with comprehensive styling and interaction capabilities:

  • Built-in Shapes: circle, rect, ellipse, diamond, triangle, star, image, donut, 3d-sphere
  • Custom Node Types: Create fully custom node renderers with unique shapes, behaviors, and interactions
  • Custom Styling: Colors, sizes, borders, shadows, opacity, and CSS properties
  • Interactive States: Hover, selected, disabled with automatic state management
  • Rich Labels: Text positioning, formatting, multi-line support, and custom fonts
  • Data Binding: Automatic visual mapping from node data properties

🔗 Edges

Connections between nodes with flexible routing and styling:

  • Edge Types: line, polyline, cubic, quadratic, cubic-horizontal, cubic-vertical, loop-edge
  • Custom Edge Types: Build custom edge renderers with unique routing algorithms and visual effects
  • Visual Styling: Colors, thickness, dash patterns, opacity, and gradients
  • Smart Routing: Automatic collision avoidance and optimal path calculation
  • Directional Flow: Arrows, labels, and markers for directed relationships
  • Curved Connections: Bezier curves and custom bend points for complex routing

📦 Combos

Grouping containers for organizing related nodes:

  • Flexible Grouping: Logical organization of related nodes with visual boundaries
  • Custom Combo Types: Design custom group containers with specialized layouts and behaviors
  • Interactive Management: Expand/collapse, drag groups, and nested hierarchies
  • Custom Styling: Background colors, borders, padding, and visual themes
  • Dynamic Updates: Real-time group membership changes and visual updates
  • Label Support: Group titles, descriptions, and metadata display

🖼️ Canvas

Rendering context and interaction surface:

  • Multiple Renderers: SVG, Canvas, and WebGL rendering backends for different performance needs
  • Custom Canvas Types: Implement specialized rendering engines or interaction layers
  • Zoom & Pan: Built-in viewport controls with smooth animations and boundaries
  • Event Handling: Comprehensive event system for mouse, touch, and keyboard interactions
  • Performance Optimization: Automatic LOD (Level of Detail) and viewport culling

🎯 Styling & Themes

All elements support comprehensive customization:

<Graph
  node={{
    style: { fill: "#1890ff", stroke: "#096dd9", lineWidth: 2 },
    labelStyle: { fontSize: 12, fontWeight: "bold" },
    state: {
      hover: { fill: "#40a9ff" },
      selected: { stroke: "#722ed1", lineWidth: 3 },
    },
  }}
  edge={{
    style: { stroke: "#d9d9d9", lineWidth: 1 },
    labelStyle: { background: "white", padding: [2, 4] },
  }}
  combo={{
    style: { fill: "#f0f0f0", stroke: "#d9d9d9" },
    labelStyle: { fontSize: 14, fontWeight: "bold" },
  }}
/>

🎨 Explore Styling: See all visual customization options in the interactive playground with live style editors and preset themes.

🎯 Supported Layouts

Solid G6 supports 13+ built-in layout algorithms covering all major visualization patterns:

Force-Directed Layouts

  • force - Classic physics simulation with gravity and clustering
  • d3-force - Advanced D3 force system with 5 configurable force types
  • forceAtlas2 - High-performance algorithm for large networks
  • fruchterman - Aesthetic force-directed with community detection

🌳 Hierarchical Layouts

  • dagre - Directed graphs with sophisticated edge routing
  • antv-dagre - Enhanced Dagre with improved visual appeal

Circular Layouts

  • circular - Even distribution around a circle
  • radial - Tree structures in concentric circles
  • concentric - Multiple circles based on node properties

📊 Grid & Specialized Layouts

  • grid - Regular matrix arrangement
  • mds - Multidimensional scaling for similarity visualization
  • fishbone - Cause-and-effect diagrams
  • snake - Sequential flow arrangements

🔧 Custom Layouts

Register your own layout algorithms for specialized use cases:

import { BaseLayout, register, type GraphData }
import { Graph } from "@dschz/solid-g6";

class DiagonalLayout extends BaseLayout {
  id = 'diagonal-layout';

  async execute(data: GraphData): Promise<GraphData> {
    const { nodes = [] } = data;
    return {
      nodes: nodes.map((node, index) => ({
        id: node.id,
        style: {
          x: 50 * index + 25,
          y: 50 * index + 25,
        },
      })),
    };
  }
}

// Register custom layout
register("diagonal-layout", DiagonalLayout);

// Use in graph
<Graph layout={{ type: "diagonal-layout", customParam: "value" }} />;

📚 Interactive Examples

Explore all layouts with live examples and controls in our interactive playground - the best way to understand each algorithm's capabilities and use cases.

📖 API Reference

Graph Component

The main component for rendering graphs.

interface GraphProps<D extends G6GraphData = G6GraphData> {
  // Graph data
  data: D;

  // Layout configuration
  layout?: LayoutOptions;

  // Visual styling
  node?: NodeStyle;
  edge?: EdgeStyle;
  combo?: ComboStyle;

  // Event handlers
  events?: G6EventsMap;
  onInit?: (graph: G6Graph) => void;
  onReady?: (graph: G6Graph) => void;
  onDestroy?: () => void;

  // Container properties
  id?: string;
  class?: string;
  style?: JSX.CSSProperties;
}

Context API

Access graph instance and data within components.

import { useGraph } from "@dschz/solid-g6";

function GraphComponent() {
  const { graph, graphData, setGraphOptions } = useGraph();

  // Access graph instance
  const g = graph();

  // Get current data
  const data = graphData();

  // Update options
  await setGraphOptions({ layout: { type: "circular" } });
}

Utility Functions

Solid G6 provides a comprehensive set of utility functions for type-safe graph creation and configuration. These utilities provide:

  • Type Safety: Full TypeScript support with generic type inference
  • Consistency: Standardized patterns across your application
  • Developer Experience: Better autocomplete and error detection
  • Flexibility: Easy composition and reusability

Core Utilities

import {
  createGraphData,
  createGraphOptions,
  createGraphLayout,
  createGraphBehaviors,
  createGraphNodeOptions,
  createGraphEdgeOptions,
  createGraphComboOptions,
} from "@dschz/solid-g6";

// Create type-safe graph data
const data = createGraphData({
  nodes: [
    { id: "node1", data: { label: "Node 1", category: "important" } },
    { id: "node2", data: { label: "Node 2", category: "normal" } },
  ],
  edges: [{ source: "node1", target: "node2" }],
  combos: [{ id: "group1", data: { label: "Group 1" } }],
});

// Create layout configuration with type inference
const layout = createGraphLayout({
  type: "force",
  gravity: 1,
  clustering: true,
  clusterNodeStrength: -5,
});

// Create node styling with proper typing
const nodeConfig = createGraphNodeOptions<typeof data>({
  style: {
    fill: (node) => (node.data.category === "important" ? "#ff4d4f" : "#1890ff"),
    stroke: "#fff",
    r: 20,
    labelText: (node) => node.data.label,
  },
});

// Create edge styling
const edgeConfig = createGraphEdgeOptions<typeof data>({
  style: {
    stroke: "#e6f7ff",
    strokeWidth: 2,
  },
});

// Create interaction behaviors
const behaviors = createGraphBehaviors(["drag-canvas", "zoom-canvas", "drag-element"]);

// Combine into complete graph options
const graphOptions = createGraphOptions({
  data,
  layout,
  node: nodeConfig,
  edge: edgeConfig,
  behaviors,
});

Why Use Utility Functions?

  1. Type Safety: Utilities provide full TypeScript support with generic type inference
  2. Consistency: Standardized patterns ensure consistent configuration across your app
  3. Validation: Runtime validation of configuration options (where applicable)
  4. Composition: Easy to compose and reuse configurations
  5. IDE Support: Better autocomplete, IntelliSense, and error detection
  6. Future-proof: Updates to G6 options are handled through utility updates

Types

Comprehensive TypeScript definitions for all components.

interface G6GraphData {
  nodes: NodeData[];
  edges: EdgeData[];
  combos?: ComboData[];
}

interface NodeData {
  id: string;
  data?: {
    label?: string;
    cluster?: string;
    size?: number;
    type?: string;
    [key: string]: any;
  };
}

interface EdgeData {
  source: string;
  target: string;
  data?: {
    weight?: number;
    label?: string;
    [key: string]: any;
  };
}

🎨 Styling & Theming

Custom Node Styles

<Graph
  node={{
    style: (node) => ({
      fill: getNodeColor(node),
      stroke: "#333",
      strokeWidth: 2,
      r: getNodeSize(node),
    }),
    labelText: (node) => node.data?.label,
    labelStyle: {
      fontSize: 12,
      fill: "#333",
      fontWeight: "bold",
    },
  }}
/>

Edge Customization

<Graph
  edge={{
    style: (edge) => ({
      stroke: getEdgeColor(edge),
      strokeWidth: getEdgeWidth(edge),
      strokeOpacity: 0.8,
    }),
    labelText: (edge) => edge.data?.label,
  }}
/>

🔧 Advanced Usage

Custom Layout Implementation

// Register custom layout
import { Graph, register } from "@dschz/solid-g6";

register("custom-layout", CustomLayoutAlgorithm);

// Use in graph
<Graph
  layout={{
    type: "custom-layout",
    customParam: "value",
  }}
/>;

Dynamic Data Updates

import { createGraphData } from "@dschz/solid-g6";

function DynamicGraph() {
  const [data, setData] = createSignal(
    createGraphData({
      nodes: [{ id: "node1", data: { label: "Initial Node" } }],
      edges: [],
    }),
  );

  // Update data reactively
  createEffect(() => {
    const newGraphData = createGraphData({
      nodes: [
        { id: "node1", data: { label: "Updated Node" } },
        { id: "node2", data: { label: "New Node" } },
      ],
      edges: [{ source: "node1", target: "node2" }],
    });
    setData(newGraphData);
  });

  return <Graph data={data()} />;
}

Event Handling

<Graph
  events={{
    "node:click": (event) => {
      console.log("Node clicked:", event.itemId);
    },
    "edge:hover": (event) => {
      console.log("Edge hovered:", event.itemId);
    },
    "canvas:drag": (event) => {
      console.log("Canvas dragged");
    },
  }}
/>

📱 Responsive Design

All layouts automatically adapt to different screen sizes:

<Graph
  style={{
    width: "100%",
    height: "60vh",
    "min-width": "300px",
    "min-height": "400px",
  }}
  layout={{
    type: "force",
    // Layout automatically adjusts for container size
  }}
/>

🤝 Contributing

Code contributions are welcome! Please follow these guidelines:

Development Setup

# Clone the repository
git clone https://github.com/dsnchz/solid-g6.git

# Install dependencies
bun install

# Run playground app
bun start

Code Quality

# Lint code
bun run lint

# Format code
bun run format

# Fix linting issues
bun run lint:fix

# Fix formatting issues
bun run format:fix

Commit Guidelines

  • Use conventional commits
  • Keep git history clean with rebasing
  • Ensure CI checks pass before merging

Adding New Layouts

  1. Create layout example in playground/pages/layouts/examples/
  2. Register in LayoutExampleRegistry.ts
  3. Add comprehensive documentation
  4. Include multiple demo scenarios
  5. Add interactive controls
  6. Update this README

📄 License

MIT License - see LICENSE for details.


⬆ Back to Top

Made with ❤️ using SolidJS and AntV G6

About

A SolidJS component library for graph visualization, powered by @antv/g6

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages