How the SVG rendering is structured — from data fetch to pixels
<div class="process-diagram"> /* wrapper div */ <svg viewBox="0 0 {w} {h}"> /* zoom = viewBox transform */ <g class="diagram-content"> /* pan offset */ <!-- Main Route section --> <g class="section section--main"> <g class="edges"> <path d="M 100 40 C ..." /> /* cubic bezier edge */ <marker>...</marker> /* arrowhead def */ </g> <g class="nodes"> <g transform="translate(x, y)"> /* positioned by ELK */ <rect .../> /* card background */ <rect .../> /* color top bar */ <text>LOG</text> /* label */ <g class="badges">...</g> /* config indicators */ </g> </g> </g> <!-- Error Handler section --> <g class="section section--error" transform="translate(0, {mainH + gap})"> <text>onException</text> /* section label */ <line .../> /* divider line */ <g class="edges">...</g> <g class="nodes">...</g> </g> </g> </svg> <div class="zoom-controls">...</div> /* HTML overlay */ </div>
GET /diagrams/{hash}/render?direction=LR │ ▼ DiagramLayout { nodes[], edges[], width, height } │ ▼ separateFlows(nodes) → mainNodes[] + errorSections[] │ │ ▼ ▼ renderMainSection() renderErrorSection() │ │ ▼ ▼ SVG groups with SVG groups offset below ELK x/y coordinates main section by mainHeight + gap