chartlet 0.22.0

Compile structured data into deterministic, accessible static charts
Documentation
1
<div class="chartlet-wrapper"><style>.chartlet-stage{position:relative;display:inline-block;max-width:100%;vertical-align:top}.chartlet-stage>svg{display:block}.chartlet-hotspot{position:absolute;border-radius:8px;cursor:pointer}.chartlet-focus{margin:0 0 12px 0;font-size:13px}.chartlet-focus summary{cursor:pointer;min-height:24px}.chartlet-focus fieldset{border:none;padding:0;margin:4px 0 0 0}.chartlet-focus label{display:inline-flex;align-items:center;min-height:44px;margin-right:14px;cursor:pointer;white-space:nowrap}.chartlet-focus input{margin-right:4px}.chartlet-focus input:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.chartlet-wrapper:has(.chartlet-focus-node:checked) #chartlet-eaffa39c016cf37c .chartlet-f{opacity:.18}#chartlet-eaffa39c016cf37c-hs-0{left:3.846%;top:8.05%;width:7.923%;height:8.5%}#chartlet-eaffa39c016cf37c-hs-1{left:1.846%;top:26.65%;width:9.923%;height:8.5%}#chartlet-eaffa39c016cf37c-hs-2{left:1.846%;top:45.25%;width:9.923%;height:8.5%}#chartlet-eaffa39c016cf37c-hs-3{left:1.846%;top:63.85%;width:9.923%;height:8.5%}#chartlet-eaffa39c016cf37c-hs-4{left:1.846%;top:82.45%;width:9.923%;height:8.5%}.chartlet-wrapper:has(#chartlet-eaffa39c016cf37c-focus-0:checked) #chartlet-eaffa39c016cf37c .chartlet-f-0{opacity:1}.chartlet-wrapper:has(#chartlet-eaffa39c016cf37c-focus-0:checked) #chartlet-eaffa39c016cf37c .chartlet-n-0 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-eaffa39c016cf37c-focus-0:checked) #chartlet-eaffa39c016cf37c .chartlet-n-0 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-eaffa39c016cf37c-focus-1:checked) #chartlet-eaffa39c016cf37c .chartlet-f-1{opacity:1}.chartlet-wrapper:has(#chartlet-eaffa39c016cf37c-focus-1:checked) #chartlet-eaffa39c016cf37c .chartlet-n-1 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-eaffa39c016cf37c-focus-1:checked) #chartlet-eaffa39c016cf37c .chartlet-n-1 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-eaffa39c016cf37c-focus-2:checked) #chartlet-eaffa39c016cf37c .chartlet-f-2{opacity:1}.chartlet-wrapper:has(#chartlet-eaffa39c016cf37c-focus-2:checked) #chartlet-eaffa39c016cf37c .chartlet-n-2 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-eaffa39c016cf37c-focus-2:checked) #chartlet-eaffa39c016cf37c .chartlet-n-2 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-eaffa39c016cf37c-focus-3:checked) #chartlet-eaffa39c016cf37c .chartlet-f-3{opacity:1}.chartlet-wrapper:has(#chartlet-eaffa39c016cf37c-focus-3:checked) #chartlet-eaffa39c016cf37c .chartlet-n-3 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-eaffa39c016cf37c-focus-3:checked) #chartlet-eaffa39c016cf37c .chartlet-n-3 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-eaffa39c016cf37c-focus-4:checked) #chartlet-eaffa39c016cf37c .chartlet-f-4{opacity:1}.chartlet-wrapper:has(#chartlet-eaffa39c016cf37c-focus-4:checked) #chartlet-eaffa39c016cf37c .chartlet-n-4 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-eaffa39c016cf37c-focus-4:checked) #chartlet-eaffa39c016cf37c .chartlet-n-4 .chartlet-seq-box{stroke-width:3}</style><details class="chartlet-focus"><summary>Focus</summary><fieldset><label><input type="radio" name="chartlet-eaffa39c016cf37c-focus" checked> Show all</label><label><input type="radio" name="chartlet-eaffa39c016cf37c-focus" class="chartlet-focus-node" id="chartlet-eaffa39c016cf37c-focus-0"> Browser</label><label><input type="radio" name="chartlet-eaffa39c016cf37c-focus" class="chartlet-focus-node" id="chartlet-eaffa39c016cf37c-focus-1"> Export API</label><label><input type="radio" name="chartlet-eaffa39c016cf37c-focus" class="chartlet-focus-node" id="chartlet-eaffa39c016cf37c-focus-2"> Jobs</label><label><input type="radio" name="chartlet-eaffa39c016cf37c-focus" class="chartlet-focus-node" id="chartlet-eaffa39c016cf37c-focus-3"> Worker</label><label><input type="radio" name="chartlet-eaffa39c016cf37c-focus" class="chartlet-focus-node" id="chartlet-eaffa39c016cf37c-focus-4"> File storage</label></fieldset></details><figure class="chartlet-figure" data-viz="chart"><figcaption>Exporting a report in the background</figcaption><div class="chartlet-stage"><svg xmlns="http://www.w3.org/2000/svg" width="1300" height="400" viewBox="0 0 1300 400" id="chartlet-eaffa39c016cf37c" role="img" aria-labelledby="chartlet-eaffa39c016cf37c-title chartlet-eaffa39c016cf37c-description" class="chartlet-root"><title id="chartlet-eaffa39c016cf37c-title">Exporting a report in the background</title><desc id="chartlet-eaffa39c016cf37c-description">Sequence diagram with 5 participants: Browser (actor), Export API, Jobs (queue), Worker and File storage (external). 10 messages, in order: 1. Browser to Export API: POST /exports. 2. Export API to Jobs: enqueue (asynchronous). 3. Export API to Browser: 202, job id (reply). 4. Worker to Jobs: take job. 5. Worker to File storage: write report. 6. Browser to Export API: GET /exports/7. 7. Export API to Browser: running (reply). 8. Worker to Export API: done (asynchronous). 9. Browser to Export API: GET /exports/7. 10. Export API to Browser: download link (reply). Fragment loop &quot;every 5 s&quot; spans messages 6–7.</desc><style>.chartlet-root{--chartlet-text:#172033;--chartlet-muted:#344054;--chartlet-grid:#d9dee8;--chartlet-zero:#667085;--chartlet-accent:#2563eb;--chartlet-background:#fff;--chartlet-color-1:#2563eb;--chartlet-color-2:#c2410c;--chartlet-color-3:#475569;--chartlet-color-4:#111827;max-width:100%;height:auto;font-family:Inter,ui-sans-serif,system-ui,sans-serif;color:var(--chartlet-text)}#chartlet-eaffa39c016cf37c .chartlet-title{font-size:22px;font-weight:650;fill:var(--chartlet-text)}#chartlet-eaffa39c016cf37c .chartlet-label,#chartlet-eaffa39c016cf37c .chartlet-tick,#chartlet-eaffa39c016cf37c .chartlet-value,#chartlet-eaffa39c016cf37c .chartlet-value-inverse,#chartlet-eaffa39c016cf37c .chartlet-axis-title{font-size:12px;fill:var(--chartlet-muted)}#chartlet-eaffa39c016cf37c .chartlet-value,#chartlet-eaffa39c016cf37c .chartlet-value-inverse{font-weight:600}#chartlet-eaffa39c016cf37c .chartlet-value{fill:var(--chartlet-text)}#chartlet-eaffa39c016cf37c .chartlet-value-inverse{fill:var(--chartlet-background)}#chartlet-eaffa39c016cf37c .chartlet-axis-title{font-weight:600}#chartlet-eaffa39c016cf37c .chartlet-grid{stroke:var(--chartlet-grid);stroke-width:1}#chartlet-eaffa39c016cf37c .chartlet-zero{stroke:var(--chartlet-zero);stroke-width:1.5}#chartlet-eaffa39c016cf37c .chartlet-bar,#chartlet-eaffa39c016cf37c .chartlet-point{fill:var(--chartlet-accent)}#chartlet-eaffa39c016cf37c .chartlet-line{fill:none;stroke:var(--chartlet-accent);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}#chartlet-eaffa39c016cf37c .chartlet-background{fill:var(--chartlet-background)}.chartlet-root{--chartlet-node:#eef3fd;--chartlet-lane:#f7f9fc;--chartlet-lane-head:#eef1f6;--chartlet-shadow:rgba(16,24,40,.09);--chartlet-role-blue:#2563eb;--chartlet-role-blue-fill:#eef3fd;--chartlet-role-green:#15803d;--chartlet-role-green-fill:#ecfdf3;--chartlet-role-amber:#b45309;--chartlet-role-amber-fill:#fff7e8;--chartlet-role-teal:#0f766e;--chartlet-role-teal-fill:#e9faf7;--chartlet-role-violet:#6d28d9;--chartlet-role-violet-fill:#f3efff;--chartlet-role-gray:#667085;--chartlet-role-gray-fill:#f7f8fa;--chartlet-role-red:#b42318;--chartlet-role-red-fill:#fef3f2}.chartlet-root.chartlet-theme-dark{--chartlet-node:#1a2436;--chartlet-lane:#121925;--chartlet-lane-head:#18212f;--chartlet-shadow:rgba(0,0,0,.45);--chartlet-role-blue:#7ea6ff;--chartlet-role-blue-fill:#1a2436;--chartlet-role-green:#4ade80;--chartlet-role-green-fill:#132a1d;--chartlet-role-amber:#fbbf24;--chartlet-role-amber-fill:#2b2210;--chartlet-role-teal:#2dd4bf;--chartlet-role-teal-fill:#0f2a27;--chartlet-role-violet:#b69cff;--chartlet-role-violet-fill:#231c38;--chartlet-role-gray:#9aa7bd;--chartlet-role-gray-fill:#161d29;--chartlet-role-red:#f97066;--chartlet-role-red-fill:#2d1616}#chartlet-eaffa39c016cf37c .chartlet-role-blue{fill:var(--chartlet-role-blue-fill);stroke:var(--chartlet-role-blue)}#chartlet-eaffa39c016cf37c .chartlet-role-green{fill:var(--chartlet-role-green-fill);stroke:var(--chartlet-role-green)}#chartlet-eaffa39c016cf37c .chartlet-role-amber{fill:var(--chartlet-role-amber-fill);stroke:var(--chartlet-role-amber)}#chartlet-eaffa39c016cf37c .chartlet-role-teal{fill:var(--chartlet-role-teal-fill);stroke:var(--chartlet-role-teal)}#chartlet-eaffa39c016cf37c .chartlet-role-violet{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet)}#chartlet-eaffa39c016cf37c .chartlet-role-gray{fill:var(--chartlet-role-gray-fill);stroke:var(--chartlet-role-gray)}#chartlet-eaffa39c016cf37c .chartlet-role-red{fill:var(--chartlet-role-red-fill);stroke:var(--chartlet-role-red)}#chartlet-eaffa39c016cf37c .chartlet-diagram-rim{fill:none;stroke:var(--chartlet-role-teal);stroke-width:1.5}#chartlet-eaffa39c016cf37c .chartlet-diagram-shadow{fill:var(--chartlet-shadow);stroke:none;rx:7px}#chartlet-eaffa39c016cf37c .chartlet-diagram-chip{fill:var(--chartlet-background);stroke:var(--chartlet-grid);stroke-width:1;rx:4px}#chartlet-eaffa39c016cf37c .chartlet-diagram-chip-text{font-size:12px;fill:var(--chartlet-text)}#chartlet-eaffa39c016cf37c .chartlet-diagram-badge{fill:var(--chartlet-accent);stroke:var(--chartlet-background);stroke-width:2}#chartlet-eaffa39c016cf37c .chartlet-diagram-badge-text{font-size:10px;font-weight:700;fill:var(--chartlet-background)}#chartlet-eaffa39c016cf37c .chartlet-seq-box{stroke-width:1.5;stroke-linejoin:round;rx:7px}#chartlet-eaffa39c016cf37c .chartlet-seq-external{stroke-dasharray:5 3}#chartlet-eaffa39c016cf37c .chartlet-seq-hit{fill:transparent;stroke:none}#chartlet-eaffa39c016cf37c .chartlet-seq-actor{stroke:var(--chartlet-text);stroke-width:1.5;stroke-linecap:round}#chartlet-eaffa39c016cf37c .chartlet-seq-actor-head{fill:var(--chartlet-background);stroke:var(--chartlet-text);stroke-width:1.5}#chartlet-eaffa39c016cf37c .chartlet-seq-label{font-size:13px;font-weight:600;fill:var(--chartlet-text)}#chartlet-eaffa39c016cf37c .chartlet-seq-sublabel{font-size:11px;fill:var(--chartlet-muted)}#chartlet-eaffa39c016cf37c .chartlet-seq-lifeline{stroke:var(--chartlet-zero);stroke-width:1;stroke-dasharray:3 4}#chartlet-eaffa39c016cf37c .chartlet-seq-activation{fill:var(--chartlet-node);stroke:var(--chartlet-accent);stroke-width:1;rx:2px}#chartlet-eaffa39c016cf37c .chartlet-seq-message{fill:none;stroke:var(--chartlet-zero);stroke-width:1.4;stroke-linejoin:round}#chartlet-eaffa39c016cf37c .chartlet-seq-reply{stroke-dasharray:5 4}#chartlet-eaffa39c016cf37c .chartlet-seq-head{fill:var(--chartlet-zero);stroke:var(--chartlet-zero);stroke-width:1;stroke-linejoin:round}#chartlet-eaffa39c016cf37c .chartlet-seq-head-open{fill:none;stroke:var(--chartlet-zero);stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round}#chartlet-eaffa39c016cf37c .chartlet-seq-frame{fill:none;stroke:var(--chartlet-zero);stroke-width:1;rx:6px}#chartlet-eaffa39c016cf37c .chartlet-seq-tab{fill:var(--chartlet-node);stroke:var(--chartlet-zero);stroke-width:1;rx:4px}#chartlet-eaffa39c016cf37c .chartlet-seq-tag{font-size:11px;font-weight:650;fill:var(--chartlet-text)}#chartlet-eaffa39c016cf37c .chartlet-seq-guard{font-size:11px;fill:var(--chartlet-muted);paint-order:stroke;stroke:var(--chartlet-background);stroke-width:3px;stroke-linejoin:round}#chartlet-eaffa39c016cf37c .chartlet-seq-branch{stroke:var(--chartlet-zero);stroke-width:1;stroke-dasharray:5 4}</style><g class="chartlet-f chartlet-n-0 chartlet-f-0 chartlet-f-1"><line x1="153" y1="49.2" x2="1276" y2="49.2" class="chartlet-seq-lifeline"/></g><g class="chartlet-f chartlet-n-1 chartlet-f-0 chartlet-f-1 chartlet-f-2 chartlet-f-3"><line x1="153" y1="123.6" x2="1276" y2="123.6" class="chartlet-seq-lifeline"/></g><g class="chartlet-f chartlet-n-2 chartlet-f-1 chartlet-f-2 chartlet-f-3"><line x1="153" y1="198" x2="1276" y2="198" class="chartlet-seq-lifeline"/></g><g class="chartlet-f chartlet-n-3 chartlet-f-1 chartlet-f-2 chartlet-f-3 chartlet-f-4"><line x1="153" y1="272.4" x2="1276" y2="272.4" class="chartlet-seq-lifeline"/></g><g class="chartlet-f chartlet-n-4 chartlet-f-3 chartlet-f-4"><line x1="153" y1="346.8" x2="1276" y2="346.8" class="chartlet-seq-lifeline"/></g><g class="chartlet-f chartlet-n-1 chartlet-f-0 chartlet-f-1 chartlet-f-2 chartlet-f-3"><rect x="175.058" y="118.6" width="218.911" height="10" class="chartlet-seq-activation"/></g><g class="chartlet-f chartlet-n-2 chartlet-f-1 chartlet-f-2 chartlet-f-3"><rect x="493.732" y="193" width="12" height="10" class="chartlet-seq-activation"/></g><g class="chartlet-f chartlet-n-4 chartlet-f-3 chartlet-f-4"><rect x="582.347" y="341.8" width="12" height="10" class="chartlet-seq-activation"/></g><g class="chartlet-f chartlet-n-1 chartlet-f-0 chartlet-f-1 chartlet-f-2 chartlet-f-3"><rect x="716.359" y="118.6" width="136.476" height="10" class="chartlet-seq-activation"/></g><g class="chartlet-f chartlet-n-1 chartlet-f-0 chartlet-f-1 chartlet-f-2 chartlet-f-3"><rect x="1017.221" y="118.6" width="136.476" height="10" class="chartlet-seq-activation"/></g><rect x="696.165" y="16" width="239.35" height="140.8" class="chartlet-seq-frame"/><rect x="696.165" y="16" width="33.78" height="16" class="chartlet-seq-tab"/><text x="702.165" y="28" text-anchor="start" class="chartlet-seq-tag">loop</text><text x="735.945" y="28" text-anchor="start" class="chartlet-seq-guard">[every 5 s]</text><g class="chartlet-f chartlet-f-0 chartlet-f-1"><polyline points="175.058,49.2 175.058,110.6" class="chartlet-seq-message"><title>1. Browser → Export API: POST /exports</title></polyline><polyline points="171.558,110.6 175.058,118.6 178.558,110.6 171.558,110.6" class="chartlet-seq-head"/><rect x="179.058" y="76.4" width="99.76" height="21" class="chartlet-diagram-chip"/><text x="184.058" y="90.4" text-anchor="start" class="chartlet-diagram-chip-text">POST /exports</text></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><polyline points="306.082,128.6 306.082,190" class="chartlet-seq-message"><title>2. Export API → Jobs: enqueue</title></polyline><polyline points="302.582,190 306.082,198 309.582,190" class="chartlet-seq-head-open"/><rect x="310.082" y="150.8" width="57.04" height="21" class="chartlet-diagram-chip"/><text x="315.082" y="164.8" text-anchor="start" class="chartlet-diagram-chip-text">enqueue</text></g><g class="chartlet-f chartlet-f-0 chartlet-f-1"><polyline points="393.97,118.6 393.97,57.2" class="chartlet-seq-message chartlet-seq-reply"><title>3. Export API → Browser: 202, job id</title></polyline><polyline points="397.47,57.2 393.97,49.2 390.47,57.2" class="chartlet-seq-head-open"/><rect x="397.97" y="76.4" width="68.8" height="21" class="chartlet-diagram-chip"/><text x="402.97" y="90.4" text-anchor="start" class="chartlet-diagram-chip-text">202, job id</text></g><g class="chartlet-f chartlet-f-2 chartlet-f-3"><polyline points="493.732,272.4 493.732,211" class="chartlet-seq-message"><title>4. Worker → Jobs: take job</title></polyline><polyline points="497.232,211 493.732,203 490.232,211 497.232,211" class="chartlet-seq-head"/><rect x="497.732" y="225.2" width="57.76" height="21" class="chartlet-diagram-chip"/><text x="502.732" y="239.2" text-anchor="start" class="chartlet-diagram-chip-text">take job</text></g><g class="chartlet-f chartlet-f-3 chartlet-f-4"><polyline points="582.347,272.4 582.347,333.8" class="chartlet-seq-message"><title>5. Worker → File storage: write report</title></polyline><polyline points="578.847,333.8 582.347,341.8 585.847,333.8 578.847,333.8" class="chartlet-seq-head"/><rect x="586.347" y="299.6" width="88.72" height="21" class="chartlet-diagram-chip"/><text x="591.347" y="313.6" text-anchor="start" class="chartlet-diagram-chip-text">write report</text></g><g class="chartlet-f chartlet-f-0 chartlet-f-1"><polyline points="716.359,49.2 716.359,110.6" class="chartlet-seq-message"><title>6. Browser → Export API: GET /exports/7</title></polyline><polyline points="712.859,110.6 716.359,118.6 719.859,110.6 712.859,110.6" class="chartlet-seq-head"/><rect x="720.359" y="76.4" width="105.16" height="21" class="chartlet-diagram-chip"/><text x="725.359" y="90.4" text-anchor="start" class="chartlet-diagram-chip-text">GET /exports/7</text></g><g class="chartlet-f chartlet-f-0 chartlet-f-1"><polyline points="852.836,118.6 852.836,57.2" class="chartlet-seq-message chartlet-seq-reply"><title>7. Export API → Browser: running</title></polyline><polyline points="856.336,57.2 852.836,49.2 849.336,57.2" class="chartlet-seq-head-open"/><rect x="856.836" y="76.4" width="53.92" height="21" class="chartlet-diagram-chip"/><text x="861.836" y="90.4" text-anchor="start" class="chartlet-diagram-chip-text">running</text></g><g class="chartlet-f chartlet-f-1 chartlet-f-3"><polyline points="949.69,272.4 949.69,131.6" class="chartlet-seq-message"><title>8. Worker → Export API: done</title></polyline><polyline points="953.19,131.6 949.69,123.6 946.19,131.6" class="chartlet-seq-head-open"/><rect x="953.69" y="225.2" width="36.88" height="21" class="chartlet-diagram-chip"/><text x="958.69" y="239.2" text-anchor="start" class="chartlet-diagram-chip-text">done</text></g><g class="chartlet-f chartlet-f-0 chartlet-f-1"><polyline points="1017.221,49.2 1017.221,110.6" class="chartlet-seq-message"><title>9. Browser → Export API: GET /exports/7</title></polyline><polyline points="1013.721,110.6 1017.221,118.6 1020.721,110.6 1013.721,110.6" class="chartlet-seq-head"/><rect x="1021.221" y="76.4" width="105.16" height="21" class="chartlet-diagram-chip"/><text x="1026.221" y="90.4" text-anchor="start" class="chartlet-diagram-chip-text">GET /exports/7</text></g><g class="chartlet-f chartlet-f-0 chartlet-f-1"><polyline points="1153.698,118.6 1153.698,57.2" class="chartlet-seq-message chartlet-seq-reply"><title>10. Export API → Browser: download link</title></polyline><polyline points="1157.198,57.2 1153.698,49.2 1150.198,57.2" class="chartlet-seq-head-open"/><rect x="1157.698" y="76.4" width="89.2" height="21" class="chartlet-diagram-chip"/><text x="1162.698" y="90.4" text-anchor="start" class="chartlet-diagram-chip-text">download link</text></g><g class="chartlet-f chartlet-n-0 chartlet-f-0 chartlet-f-1"><circle cx="37" cy="41.7" r="4.5" class="chartlet-seq-actor-head"/><line x1="37" y1="46.2" x2="37" y2="53.2" class="chartlet-seq-actor"/><line x1="30" y1="48.7" x2="44" y2="48.7" class="chartlet-seq-actor"/><line x1="37" y1="53.2" x2="31" y2="59.2" class="chartlet-seq-actor"/><line x1="37" y1="53.2" x2="43" y2="59.2" class="chartlet-seq-actor"/><rect x="50" y="32.2" width="103" height="34" class="chartlet-seq-hit"><title>Browser</title></rect><text x="101.5" y="53.7" text-anchor="middle" class="chartlet-seq-label">Browser</text></g><g class="chartlet-f chartlet-n-1 chartlet-f-0 chartlet-f-1 chartlet-f-2 chartlet-f-3"><rect x="24" y="109.1" width="129" height="34" class="chartlet-diagram-shadow"/><rect x="24" y="106.6" width="129" height="34" class="chartlet-seq-box chartlet-role-blue"><title>Export API</title></rect><text x="88.5" y="128.1" text-anchor="middle" class="chartlet-seq-label">Export API</text></g><g class="chartlet-f chartlet-n-2 chartlet-f-1 chartlet-f-2 chartlet-f-3"><rect x="28" y="179.5" width="129" height="34" class="chartlet-diagram-shadow"/><rect x="28" y="177" width="129" height="34" class="chartlet-seq-box chartlet-role-violet"/><rect x="24" y="183.5" width="129" height="34" class="chartlet-diagram-shadow"/><rect x="24" y="181" width="129" height="34" class="chartlet-seq-box chartlet-role-violet"><title>Jobs</title></rect><text x="88.5" y="202.5" text-anchor="middle" class="chartlet-seq-label">Jobs</text></g><g class="chartlet-f chartlet-n-3 chartlet-f-1 chartlet-f-2 chartlet-f-3 chartlet-f-4"><rect x="24" y="257.9" width="129" height="34" class="chartlet-diagram-shadow"/><rect x="24" y="255.4" width="129" height="34" class="chartlet-seq-box chartlet-role-blue"><title>Worker</title></rect><text x="88.5" y="276.9" text-anchor="middle" class="chartlet-seq-label">Worker</text></g><g class="chartlet-f chartlet-n-4 chartlet-f-3 chartlet-f-4"><rect x="24" y="332.3" width="129" height="34" class="chartlet-diagram-shadow"/><rect x="24" y="329.8" width="129" height="34" class="chartlet-seq-box chartlet-seq-external chartlet-role-gray"><title>File storage</title></rect><text x="88.5" y="351.3" text-anchor="middle" class="chartlet-seq-label">File storage</text></g></svg><label class="chartlet-hotspot" id="chartlet-eaffa39c016cf37c-hs-0" for="chartlet-eaffa39c016cf37c-focus-0"></label><label class="chartlet-hotspot" id="chartlet-eaffa39c016cf37c-hs-1" for="chartlet-eaffa39c016cf37c-focus-1"></label><label class="chartlet-hotspot" id="chartlet-eaffa39c016cf37c-hs-2" for="chartlet-eaffa39c016cf37c-focus-2"></label><label class="chartlet-hotspot" id="chartlet-eaffa39c016cf37c-hs-3" for="chartlet-eaffa39c016cf37c-focus-3"></label><label class="chartlet-hotspot" id="chartlet-eaffa39c016cf37c-hs-4" for="chartlet-eaffa39c016cf37c-focus-4"></label></div><p class="chartlet-source">Source: Service handbook, export flow</p><details class="chartlet-data" data-viz-text><summary>Show chart data</summary><table><caption>Data for Exporting a report in the background</caption><thead><tr><th scope="col">No.</th><th scope="col">From</th><th scope="col">To</th><th scope="col">Message</th><th scope="col">Kind</th><th scope="col">Fragment</th></tr></thead><tbody><tr><th scope="row">1</th><td>Browser</td><td>Export API</td><td>POST /exports</td><td>call</td><td></td></tr><tr><th scope="row">2</th><td>Export API</td><td>Jobs</td><td>enqueue</td><td>asynchronous</td><td></td></tr><tr><th scope="row">3</th><td>Export API</td><td>Browser</td><td>202, job id</td><td>reply</td><td></td></tr><tr><th scope="row">4</th><td>Worker</td><td>Jobs</td><td>take job</td><td>call</td><td></td></tr><tr><th scope="row">5</th><td>Worker</td><td>File storage</td><td>write report</td><td>call</td><td></td></tr><tr><th scope="row">6</th><td>Browser</td><td>Export API</td><td>GET /exports/7</td><td>call</td><td>loop [every 5 s]</td></tr><tr><th scope="row">7</th><td>Export API</td><td>Browser</td><td>running</td><td>reply</td><td>loop [every 5 s]</td></tr><tr><th scope="row">8</th><td>Worker</td><td>Export API</td><td>done</td><td>asynchronous</td><td></td></tr><tr><th scope="row">9</th><td>Browser</td><td>Export API</td><td>GET /exports/7</td><td>call</td><td></td></tr><tr><th scope="row">10</th><td>Export API</td><td>Browser</td><td>download link</td><td>reply</td><td></td></tr></tbody></table></details></figure></div>