JSFiddle - React, Tailwind, and code Playground

CSS

svg {
    border: 1px dashed #ccc;
}

JavaScript

(function(){
    /// generate some ipsum data ///

    var id = 0;
    function generateFakeData(depth, childrenMin, childrenMax)
    {   
        var data = {
            id: id++,
            children: []
        };

        if ( --depth > 0 ) {
            var childrenCount = Math.floor(Math.random()*(childrenMax-childrenMin)+childrenMin);
            for (var i=0; i < childrenCount; i++) {
                data.children.push(generateFakeData(depth, childrenMin, childrenMax));
            };
        };

        return data;
    }

    var data = generateFakeData(5, 3, 5);
    
    /// actual code ///    
    
    var margin = 20,
        width  = 350 - margin*2,
        height = 500 - margin*2;
    
    var container = d3.select('body');
    var svg = container.append('svg')
        .attr('width', width+margin*2)
        .attr('height', height+margin*2)
        .call(d3.behavior.zoom().on('zoom', zoom).scaleExtent([0.2, 2]))
        .append('g')
            .attr('transform', 'translate('+margin+','+margin+')');
    
    var diagonal = d3.svg.diagonal()
        .projection(function(d) { return [d.y, d.x]; });
    
    var tree = d3.layout.tree()
        .size([height, width]);
    
    var nodes = tree.nodes(data),
        links = tree.links(nodes);
    
    svg.selectAll('.link')
        .data(links)
        .enter()
            .append('path')
            .attr('class', 'link')
            .attr('fill', 'none')
            .attr('stroke', '#ccc')
            .attr('d', diagonal);    
    
    var node = svg.selectAll('.node')
        .data(nodes)
        .enter()
            .append('g')
            .attr('class', 'node')
            .attr('transform', function(d){
                return 'translate('+d.y+','+d.x+')'
            });
    
    node.append('circle')
        .attr('r', 5)
        .attr('fill', 'none')
        .attr('stroke', 'red');

    function zoom() {
        var scale = d3.event.scale;
        svg.attr('transform',...