Skip to content

Styling

Comprehensive guide to styling nodes, edges, and labels.

Overview

Graphty uses a CSS-like layer-based styling system. Styles are applied through layers, with later layers overriding earlier ones. JMESPath selectors target specific elements.

Style Templates

The quickest way to style your graph is with built-in templates:

html
<graphty-element style-template="dark"></graphty-element>

Available templates:

  • dark - Dark theme with light elements
  • light - Light theme with dark elements

Style Layers

Styles are organized in layers with priorities. Higher priority layers override lower ones:

typescript
// Add a style layer
graph.styleManager.addLayer({
  selector: '*',          // Apply to all elements
  priority: 10,           // Higher = applied later
  styles: {
    node: {
      color: '#3498db',
      size: 1.0
    },
    edge: {
      line: { color: '#ffffff' }
    }
  }
});

Layer Precedence

  1. Default styles (priority 0)
  2. Template styles (priority 5)
  3. Custom layers (your priority)
  4. Selection styles (priority 100)

Selectors

Selectors use JMESPath syntax to target elements:

typescript
// All elements
{ selector: '*' }

// Specific node by ID
{ selector: "[?id == 'node1']" }

// Nodes with a property value
{ selector: "[?category == 'important']" }

// Numeric comparison
{ selector: "[?weight > `5`]" }

// Multiple conditions (AND)
{ selector: "[?category == 'type-a' && weight > `3`]" }

// Based on algorithm results
{ selector: "[?algorithmResults.'graphty:degree' > `10`]" }

Node Styles

Available Properties

PropertyTypeDefaultDescription
colorstring'#ffffff'Node color (hex or CSS color)
sizenumber1.0Size multiplier
shapestring'sphere'Node shape
opacitynumber1.0Transparency (0-1)
texturestringundefinedImage URL for texture
labelobject{}Label configuration

Node Shapes

Available shapes:

  • sphere (default)
  • box
  • cylinder
  • cone
  • torus
  • tetrahedron
  • octahedron
  • icosahedron
  • dodecahedron
typescript
graph.styleManager.addLayer({
  selector: "[?category == 'server']",
  styles: {
    node: {
      shape: 'box',
      color: '#2ecc71',
      size: 1.5
    }
  }
});

Node Examples

typescript
// Color by category
graph.styleManager.addLayer({
  selector: "[?category == 'primary']",
  styles: { node: { color: '#e74c3c' } }
});

graph.styleManager.addLayer({
  selector: "[?category == 'secondary']",
  styles: { node: { color: '#3498db' } }
});

// Size by importance
graph.styleManager.addLayer({
  selector: "[?importance == 'high']",
  styles: { node: { size: 2.0 } }
});

Edge Styles

Line Properties

PropertyTypeDefaultDescription
line.typestring'solid'Line pattern
line.widthnumber0.5Line width
line.colorstring'#ffffff'Line color
line.opacitynumber1.0Transparency (0-1)
line.bezierbooleanfalseCurved edges

Line Types

  • solid (default)
  • dash
  • dot
  • dash-dot
  • zigzag
  • sinewave
  • star
  • diamond

Arrow Properties

PropertyTypeDefaultDescription
arrowHead.typestring'normal'Arrow head style
arrowHead.sizenumber1.0Size multiplier
arrowHead.colorstringundefinedColor (defaults to line color)
arrowTail.typestring'none'Arrow tail style

Arrow Types

  • none - No arrow
  • normal - Standard triangle
  • inverted - Reversed triangle
  • vee - Open triangle
  • diamond - Diamond shape
  • box - Square
  • dot - Circle
  • sphere - 3D sphere
  • tee - T-shape
  • crow - Crow's foot (for ER diagrams)
  • half-open - Partial triangle

Edge Examples

typescript
// Dashed edges for weak connections
graph.styleManager.addLayer({
  selector: "[?weight < `0.5`]",
  styles: {
    edge: {
      line: { type: 'dash', opacity: 0.5 }
    }
  }
});

// Bidirectional arrows
graph.styleManager.addLayer({
  selector: "[?bidirectional == `true`]",
  styles: {
    edge: {
      arrowHead: { type: 'normal' },
      arrowTail: { type: 'normal' }
    }
  }
});

// Curved edges
graph.styleManager.addLayer({
  selector: '*',
  styles: {
    edge: {
      line: { bezier: true }
    }
  }
});

Label Styles

Label Properties

PropertyTypeDefaultDescription
textstringundefinedLabel text
fontSizenumber12Font size
fontColorstring'#ffffff'Text color
positionstring'top'Position relative to node
offsetobject{x:0,y:0,z:0}Position offset
typescript
graph.styleManager.addLayer({
  selector: '*',
  styles: {
    label: {
      text: (node) => node.label || node.id,
      fontSize: 14,
      fontColor: '#ffffff',
      position: 'top'
    }
  }
});

Dynamic Styling

Use functions to compute styles dynamically:

typescript
graph.styleManager.addLayer({
  selector: '*',
  styles: {
    node: {
      color: (node) => {
        const degree = node.algorithmResults['graphty:degree'] || 0;
        return degree > 5 ? '#e74c3c' : '#3498db';
      },
      size: (node) => {
        const degree = node.algorithmResults['graphty:degree'] || 0;
        return 0.5 + (degree * 0.1);
      }
    }
  }
});

StyleManager API

typescript
// Add a layer
const layerId = graph.styleManager.addLayer(layerConfig);

// Remove a layer
graph.styleManager.removeLayer(layerId);

// Clear all custom layers
graph.styleManager.clearLayers();

// Get computed style for a node
const nodeStyle = graph.styleManager.getNodeStyle(node);
const edgeStyle = graph.styleManager.getEdgeStyle(edge);

Interactive Examples