<div id="sigma-container"></div>
<div id="sigma-logs"></div>
#sigma-container .sigma-mouse {
:global(#sigma-logs > div) {
:global(#sigma-logs > div > span) {
import Graph from "graphology";
import Sigma from "sigma";
type SigmaEdgeEventPayload,
type SigmaEdgeLabelEventPayload,
type SigmaNodeEventPayload,
type SigmaNodeLabelEventPayload,
type SigmaStageEventPayload,
import data from "../_data/data.json";
const container = document.getElementById("sigma-container") as HTMLElement;
const logsDOM = document.getElementById("sigma-logs") as HTMLElement;
const graph = new Graph();
graph.forEachEdge((edge, attributes) => {
graph.setEdgeAttribute(edge, "label", `cooccurences: ${attributes.size}`);
function logEvent(event: string, itemType: "node" | "edge" | "positions", item: string | MouseCoords): void {
const div = document.createElement("div");
let message = `"${event}"`;
if (itemType === "positions") {
item = item as MouseCoords;
message += `, x ${item.x}, y ${item.y}`;
itemType === "node" ? graph.getNodeAttribute(item, "label") : graph.getEdgeAttribute(item, "label");
message += `, ${itemType} ${label || "with no label"} (id "${item}")`;
if (itemType === "edge") {
message += `, source ${graph.getSourceAttribute(item, "label")}, target: ${graph.getTargetAttribute(
div.innerHTML = `<span>${message}</span>`;
logsDOM.appendChild(div);
logsDOM.scrollTo({ top: logsDOM.scrollHeight });
if (logsDOM.children.length > 50) logsDOM.children[0].remove();
const renderer = new Sigma(graph, container, {
nodeLabelEvents: "separate",
edgeLabelEvents: "separate",
{ labelPosition: "above" },
{ whenState: "isHovered", then: { color: "#cc0000" } },
{ whenState: "isLabelHovered", then: { labelColor: "#cc0000", labelDepth: "topEdges" } },
{ whenState: "isLabelHovered", then: { labelColor: "#cc0000", depth: "topNodes" } },
const nodeLabelEvents = [
const edgeLabelEvents = [
const stageEvents = ["downStage", "clickStage", "doubleClickStage", "wheelStage"] as const;
nodeEvents.forEach((eventType) => {
renderer.on(eventType, ({ node }: SigmaNodeEventPayload) => {
logEvent(eventType, "node", node);
edgeEvents.forEach((eventType) => {
renderer.on(eventType, ({ edge }: SigmaEdgeEventPayload) => {
logEvent(eventType, "edge", edge);
nodeLabelEvents.forEach((eventType) => {
renderer.on(eventType, ({ node }: SigmaNodeLabelEventPayload) => {
logEvent(eventType, "node", node);
edgeLabelEvents.forEach((eventType) => {
renderer.on(eventType, ({ edge }: SigmaEdgeLabelEventPayload) => {
logEvent(eventType, "edge", edge);
stageEvents.forEach((eventType) => {
renderer.on(eventType, ({ event }: SigmaStageEventPayload) => {
logEvent(eventType, "positions", event);