function updateLabel(piece, figure, delta) {
piece.metadata.label.text = Number(piece.metadata.label.text) + delta;
figure.label.text(piece.metadata.label.text);
const dynamic = new headbreaker.Canvas('dynamic-canvas', {
width: 700, height: 700, pieceSize: 100,
proximity: 20, borderFill: 10, lineSoftness: 0.2, strokeWidth: 0
dynamic.defineTemplate('A', {
metadata: { label: { text: '0', x: 22 }, color: '#DB7BBF' }
dynamic.defineTemplate('B', {
metadata: { label: { text: '0', x: 22 }, color: '#438D8F' }
dynamic.defineTemplate('C', {
metadata: { label: { text: '0', x: 22 }, color: '#DBC967' }
// ... more templates ...
dynamic.sketchPieceUsingTemplate('a', 'A');
dynamic.sketchPieceUsingTemplate('b', 'A');
dynamic.sketchPieceUsingTemplate('c', 'B');
dynamic.sketchPieceUsingTemplate('d', 'C');
dynamic.sketchPieceUsingTemplate('e', 'C');
dynamic.sketchPieceUsingTemplate('f', 'D');
dynamic.sketchPieceUsingTemplate('g', 'E');
dynamic.onConnect((piece, figure, target, targetFigure) => {
updateLabel(piece, figure, 1);
updateLabel(target, targetFigure, 1);
dynamic.onDisconnect((piece, figure, target, targetFigure) => {
updateLabel(piece, figure, -1);
updateLabel(target, targetFigure, -1);