A TypeScript library implementing 5 tree layout algorithms based on the Non-Layered Tidy Tree algorithm (van der Ploeg, 2014). Zero dependencies, O(n) time complexity, supports variable-size nodes.
pnpm add auto-tree-layoutimport { createTree, layout, getNodes, getEdges, getBoundingBox } from "auto-tree-layout";
const data = {
id: "root",
width: 80,
height: 40,
children: [
{ id: "a", width: 60, height: 30 },
{
id: "b",
width: 60,
height: 30,
children: [
{ id: "b1", width: 50, height: 25 },
{ id: "b2", width: 50, height: 25 },
],
},
],
};
const root = createTree(data);
layout.downward(root);
const nodes = getNodes(root); // [{ id, x, y, width, height, ... }]
const edges = getEdges(root); // [{ source, target }]
const bb = getBoundingBox(root); // { left, top, width, height }| Layout | Description |
|---|---|
layout.rightLogical(root) |
Root on the left, children expand right |
layout.leftLogical(root) |
Root on the right, children expand left |
layout.downward(root) |
Root on top, children expand downward |
layout.upward(root) |
Root on bottom, children expand upward |
layout.standard(root) |
Root centered, children split left/right (mindmap) |
Build a TidyNode tree from input data.
interface InputNode {
id?: string;
width?: number;
height?: number;
children?: InputNode[];
collapsed?: boolean;
}
interface LayoutOptions {
getId?: (data: InputNode) => string;
getWidth?: (data: InputNode) => number;
getHeight?: (data: InputNode) => number;
getHGap?: (data: InputNode) => number;
getVGap?: (data: InputNode) => number;
}Incremental relayout after toggling collapsed.
import { relayout } from "auto-tree-layout";
node.data.collapsed = true;
relayout(node, layout.downward);getNodes(root)— flat array ofNodeInfowith computedx,y,centerX,centerYgetEdges(root)— array of{ source, target }edgesgetBoundingBox(root)—{ left, top, width, height }
pnpm install # install dependencies
vp test # run tests (45 tests)
vp check # lint + type check
vp pack # buildcd example/playground
pnpm devInteractive Canvas 2D demo with layout switching, node count slider, H/V gap controls, pan/zoom, and node collapse/expand.
- A. van der Ploeg, "Drawing Non-layered Tidy Trees in Linear Time" (2014)
- zxch3n/tidy — Rust/WASM implementation
- leungwensen/mindmap-layouts — Original JS layouts
MIT