chartlet 0.23.0

Compile structured data into deterministic, accessible static charts
Documentation
1
<div class="chartlet-wrapper chartlet-responsive chartlet-bp-640"><style>.chartlet-wrapper.chartlet-responsive{display:block;width:100%;container-type:inline-size}.chartlet-variant-mobile{display:none}@container (max-width:639px){.chartlet-bp-640 .chartlet-variant-desktop{display:none}.chartlet-bp-640 .chartlet-variant-mobile{display:block}}</style><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-393fca24add6aeed .chartlet-f{opacity:.18}#chartlet-393fca24add6aeed-hs-0{left:1.852%;top:56%;width:8.025%;height:21.333%}#chartlet-393fca24add6aeed-hs-1{left:18.519%;top:54.667%;width:8.025%;height:24%}#chartlet-393fca24add6aeed-hs-2{left:40.432%;top:57.333%;width:8.025%;height:18.667%}#chartlet-393fca24add6aeed-hs-3{left:65.432%;top:28%;width:8.025%;height:21.333%}#chartlet-393fca24add6aeed-hs-4{left:65.123%;top:60%;width:8.642%;height:13.333%}#chartlet-393fca24add6aeed-hs-5{left:86.728%;top:60%;width:11.111%;height:13.333%}.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-0:checked) #chartlet-393fca24add6aeed .chartlet-f-0{opacity:1}.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-0:checked) #chartlet-393fca24add6aeed .chartlet-n-0 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-0:checked) #chartlet-393fca24add6aeed .chartlet-n-0 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-1:checked) #chartlet-393fca24add6aeed .chartlet-f-1{opacity:1}.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-1:checked) #chartlet-393fca24add6aeed .chartlet-n-1 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-1:checked) #chartlet-393fca24add6aeed .chartlet-n-1 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-2:checked) #chartlet-393fca24add6aeed .chartlet-f-2{opacity:1}.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-2:checked) #chartlet-393fca24add6aeed .chartlet-n-2 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-2:checked) #chartlet-393fca24add6aeed .chartlet-n-2 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-3:checked) #chartlet-393fca24add6aeed .chartlet-f-3{opacity:1}.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-3:checked) #chartlet-393fca24add6aeed .chartlet-n-3 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-3:checked) #chartlet-393fca24add6aeed .chartlet-n-3 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-4:checked) #chartlet-393fca24add6aeed .chartlet-f-4{opacity:1}.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-4:checked) #chartlet-393fca24add6aeed .chartlet-n-4 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-4:checked) #chartlet-393fca24add6aeed .chartlet-n-4 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-5:checked) #chartlet-393fca24add6aeed .chartlet-f-5{opacity:1}.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-5:checked) #chartlet-393fca24add6aeed .chartlet-n-5 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-5:checked) #chartlet-393fca24add6aeed .chartlet-n-5 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(.chartlet-focus-node:checked) #chartlet-393fca24add6aeed-m .chartlet-f{opacity:.18}#chartlet-393fca24add6aeed-m-hs-0{left:50%;top:6.667%;width:26.667%;height:7.111%}#chartlet-393fca24add6aeed-m-hs-1{left:51.111%;top:24.444%;width:24.444%;height:8%}#chartlet-393fca24add6aeed-m-hs-2{left:51.111%;top:48%;width:24.444%;height:6.222%}#chartlet-393fca24add6aeed-m-hs-3{left:21.111%;top:66.667%;width:22.222%;height:7.111%}#chartlet-393fca24add6aeed-m-hs-4{left:47.778%;top:68%;width:31.111%;height:4.444%}#chartlet-393fca24add6aeed-m-hs-5{left:51.111%;top:86.222%;width:24.444%;height:6.222%}.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-0:checked) #chartlet-393fca24add6aeed-m .chartlet-f-0{opacity:1}.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-0:checked) #chartlet-393fca24add6aeed-m .chartlet-n-0 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-0:checked) #chartlet-393fca24add6aeed-m .chartlet-n-0 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-1:checked) #chartlet-393fca24add6aeed-m .chartlet-f-1{opacity:1}.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-1:checked) #chartlet-393fca24add6aeed-m .chartlet-n-1 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-1:checked) #chartlet-393fca24add6aeed-m .chartlet-n-1 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-2:checked) #chartlet-393fca24add6aeed-m .chartlet-f-2{opacity:1}.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-2:checked) #chartlet-393fca24add6aeed-m .chartlet-n-2 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-2:checked) #chartlet-393fca24add6aeed-m .chartlet-n-2 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-3:checked) #chartlet-393fca24add6aeed-m .chartlet-f-3{opacity:1}.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-3:checked) #chartlet-393fca24add6aeed-m .chartlet-n-3 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-3:checked) #chartlet-393fca24add6aeed-m .chartlet-n-3 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-4:checked) #chartlet-393fca24add6aeed-m .chartlet-f-4{opacity:1}.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-4:checked) #chartlet-393fca24add6aeed-m .chartlet-n-4 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-4:checked) #chartlet-393fca24add6aeed-m .chartlet-n-4 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-5:checked) #chartlet-393fca24add6aeed-m .chartlet-f-5{opacity:1}.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-5:checked) #chartlet-393fca24add6aeed-m .chartlet-n-5 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-393fca24add6aeed-focus-5:checked) #chartlet-393fca24add6aeed-m .chartlet-n-5 .chartlet-seq-box{stroke-width:3}</style><details class="chartlet-focus"><summary>Focus</summary><fieldset><label><input type="radio" name="chartlet-393fca24add6aeed-focus" checked> Show all</label><label><input type="radio" name="chartlet-393fca24add6aeed-focus" class="chartlet-focus-node" id="chartlet-393fca24add6aeed-focus-0"> Customer</label><label><input type="radio" name="chartlet-393fca24add6aeed-focus" class="chartlet-focus-node" id="chartlet-393fca24add6aeed-focus-1"> Web shop</label><label><input type="radio" name="chartlet-393fca24add6aeed-focus" class="chartlet-focus-node" id="chartlet-393fca24add6aeed-focus-2"> Shop API</label><label><input type="radio" name="chartlet-393fca24add6aeed-focus" class="chartlet-focus-node" id="chartlet-393fca24add6aeed-focus-3"> Orders</label><label><input type="radio" name="chartlet-393fca24add6aeed-focus" class="chartlet-focus-node" id="chartlet-393fca24add6aeed-focus-4"> Order events</label><label><input type="radio" name="chartlet-393fca24add6aeed-focus" class="chartlet-focus-node" id="chartlet-393fca24add6aeed-focus-5"> Payment provider</label></fieldset></details><figure class="chartlet-figure" data-viz="chart"><figcaption>A shop on one cloud region</figcaption><div class="chartlet-variant-desktop"><div class="chartlet-stage"><svg xmlns="http://www.w3.org/2000/svg" width="1296" height="300" viewBox="0 0 1296 300" id="chartlet-393fca24add6aeed" role="img" aria-labelledby="chartlet-393fca24add6aeed-title chartlet-393fca24add6aeed-description" class="chartlet-root chartlet-look-editorial"><title id="chartlet-393fca24add6aeed-title">A shop on one cloud region</title><desc id="chartlet-393fca24add6aeed-description">Architecture diagram with 6 components and 5 connections in 1 boundary. Cloud region eu-central-1: Shop API, Orders, Order events. Main path: Customer → Web shop → Shop API → Order events → Payment provider. Most connected: Shop API (3 connections). Nothing leads into Customer. Nothing leads out of Orders and Payment provider. Bottleneck: Shop API; without it the diagram falls apart. Customer (person): connects to Web shop (browses). Web shop (frontend): connects to Shop API (calls, via HTTPS/JSON). Shop API (service): connects to Orders (reads, writes, via SQL/TLS) and Order events (publishes, via AMQP). Orders (database): no outgoing connection. Order events (queue): connects to Payment provider (charges, via HTTPS). Payment provider (external system): no outgoing connection.</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-393fca24add6aeed .chartlet-title{font-size:22px;font-weight:650;fill:var(--chartlet-text)}#chartlet-393fca24add6aeed .chartlet-label,#chartlet-393fca24add6aeed .chartlet-tick,#chartlet-393fca24add6aeed .chartlet-value,#chartlet-393fca24add6aeed .chartlet-value-inverse,#chartlet-393fca24add6aeed .chartlet-axis-title{font-size:12px;fill:var(--chartlet-muted)}#chartlet-393fca24add6aeed .chartlet-value,#chartlet-393fca24add6aeed .chartlet-value-inverse{font-weight:600}#chartlet-393fca24add6aeed .chartlet-value{fill:var(--chartlet-text)}#chartlet-393fca24add6aeed .chartlet-value-inverse{fill:var(--chartlet-background)}#chartlet-393fca24add6aeed .chartlet-axis-title{font-weight:600}#chartlet-393fca24add6aeed .chartlet-grid{stroke:var(--chartlet-grid);stroke-width:1}#chartlet-393fca24add6aeed .chartlet-zero{stroke:var(--chartlet-zero);stroke-width:1.5}#chartlet-393fca24add6aeed .chartlet-bar,#chartlet-393fca24add6aeed .chartlet-point{fill:var(--chartlet-accent)}#chartlet-393fca24add6aeed .chartlet-line{fill:none;stroke:var(--chartlet-accent);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}#chartlet-393fca24add6aeed .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-393fca24add6aeed .chartlet-role-blue{fill:var(--chartlet-role-blue-fill);stroke:var(--chartlet-role-blue)}#chartlet-393fca24add6aeed .chartlet-role-green{fill:var(--chartlet-role-green-fill);stroke:var(--chartlet-role-green)}#chartlet-393fca24add6aeed .chartlet-role-amber{fill:var(--chartlet-role-amber-fill);stroke:var(--chartlet-role-amber)}#chartlet-393fca24add6aeed .chartlet-role-teal{fill:var(--chartlet-role-teal-fill);stroke:var(--chartlet-role-teal)}#chartlet-393fca24add6aeed .chartlet-role-violet{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet)}#chartlet-393fca24add6aeed .chartlet-role-gray{fill:var(--chartlet-role-gray-fill);stroke:var(--chartlet-role-gray)}#chartlet-393fca24add6aeed .chartlet-role-red{fill:var(--chartlet-role-red-fill);stroke:var(--chartlet-role-red)}#chartlet-393fca24add6aeed .chartlet-diagram-rim{fill:none;stroke:var(--chartlet-role-teal);stroke-width:1.5}#chartlet-393fca24add6aeed .chartlet-diagram-shadow{fill:var(--chartlet-shadow);stroke:none;rx:7px}#chartlet-393fca24add6aeed .chartlet-diagram-chip{fill:var(--chartlet-background);stroke:var(--chartlet-grid);stroke-width:1;rx:4px}#chartlet-393fca24add6aeed .chartlet-diagram-chip-text{font-size:12px;fill:var(--chartlet-text)}#chartlet-393fca24add6aeed .chartlet-diagram-badge{fill:var(--chartlet-accent);stroke:var(--chartlet-background);stroke-width:2}#chartlet-393fca24add6aeed .chartlet-diagram-badge-text{font-size:10px;font-weight:700;fill:var(--chartlet-background)}#chartlet-393fca24add6aeed .chartlet-flow-node{stroke-width:1.5;stroke-linejoin:round;rx:7px}#chartlet-393fca24add6aeed .chartlet-flow-start{stroke-width:2}#chartlet-393fca24add6aeed .chartlet-flow-end{stroke-width:3}#chartlet-393fca24add6aeed .chartlet-flow-external{stroke-dasharray:5 3}#chartlet-393fca24add6aeed .chartlet-flow-inner{stroke:var(--chartlet-role-blue);stroke-width:1}#chartlet-393fca24add6aeed .chartlet-flow-label{font-size:13px;font-weight:600;fill:var(--chartlet-text)}#chartlet-393fca24add6aeed .chartlet-flow-sublabel{font-size:11px;fill:var(--chartlet-muted)}#chartlet-393fca24add6aeed .chartlet-flow-edge{fill:none;stroke:var(--chartlet-zero);stroke-width:1.4;stroke-linejoin:round}#chartlet-393fca24add6aeed .chartlet-flow-dashed{stroke-dasharray:5 4}#chartlet-393fca24add6aeed .chartlet-flow-dotted{stroke-dasharray:1 4;stroke-linecap:round}#chartlet-393fca24add6aeed .chartlet-flow-main{stroke:var(--chartlet-accent);stroke-width:2.2}#chartlet-393fca24add6aeed .chartlet-flow-head{fill:var(--chartlet-zero);stroke:var(--chartlet-zero);stroke-width:1;stroke-linejoin:round}#chartlet-393fca24add6aeed .chartlet-flow-main-head{fill:var(--chartlet-accent);stroke:var(--chartlet-accent)}#chartlet-393fca24add6aeed .chartlet-flow-lane{fill:var(--chartlet-lane);stroke:var(--chartlet-grid);stroke-width:1}#chartlet-393fca24add6aeed .chartlet-flow-lane-alt{fill:var(--chartlet-background)}#chartlet-393fca24add6aeed .chartlet-flow-lane-head{fill:var(--chartlet-lane-head);stroke:none}#chartlet-393fca24add6aeed .chartlet-flow-lane-label{font-size:11px;font-weight:650;fill:var(--chartlet-muted);letter-spacing:.04em}#chartlet-393fca24add6aeed .chartlet-flow-group{fill:var(--chartlet-accent);fill-opacity:.04;stroke:var(--chartlet-zero);stroke-width:1;stroke-dasharray:4 3;rx:10px}#chartlet-393fca24add6aeed .chartlet-flow-group-label{font-size:11px;font-weight:600;fill:var(--chartlet-muted)}#chartlet-393fca24add6aeed .chartlet-arch-head{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet);stroke-width:1.5}#chartlet-393fca24add6aeed .chartlet-arch-dot{fill:var(--chartlet-role-blue);stroke:none}.chartlet-root.chartlet-look-editorial{--chartlet-text:#1d1c1a;--chartlet-muted:#4d4a44;--chartlet-grid:#d8d4ca;--chartlet-zero:#6b665c;--chartlet-accent:#0b6a88;--chartlet-background:#fcfbf8;--chartlet-color-1:#0b6a88;--chartlet-color-2:#a8431a;--chartlet-color-3:#6b665c;--chartlet-color-4:#1d1c1a;--chartlet-node:#f2efe8;--chartlet-lane:#fcfbf8;--chartlet-lane-head:#f2efe8;--chartlet-shadow:rgba(0,0,0,0);--chartlet-role-blue:#6b665c;--chartlet-role-blue-fill:#f2efe8;--chartlet-role-green:#6b665c;--chartlet-role-green-fill:#f2efe8;--chartlet-role-amber:#6b665c;--chartlet-role-amber-fill:#f2efe8;--chartlet-role-teal:#6b665c;--chartlet-role-teal-fill:#f2efe8;--chartlet-role-violet:#4d4a44;--chartlet-role-violet-fill:#f2efe8;--chartlet-role-gray:#6b665c;--chartlet-role-gray-fill:#f2efe8;--chartlet-role-red:#a8281c;--chartlet-role-red-fill:#fbefec}.chartlet-root.chartlet-look-editorial.chartlet-theme-dark:not(.chartlet-blueprint){--chartlet-text:#ece8df;--chartlet-muted:#b7b2a7;--chartlet-grid:#3a3840;--chartlet-zero:#8f8a80;--chartlet-accent:#62b8d4;--chartlet-background:#17161a;--chartlet-color-1:#62b8d4;--chartlet-color-2:#e0916a;--chartlet-color-3:#9a958a;--chartlet-color-4:#ece8df;--chartlet-node:#222127;--chartlet-lane:#17161a;--chartlet-lane-head:#222127;--chartlet-shadow:rgba(0,0,0,0);--chartlet-role-blue:#8f8a80;--chartlet-role-blue-fill:#222127;--chartlet-role-green:#8f8a80;--chartlet-role-green-fill:#222127;--chartlet-role-amber:#8f8a80;--chartlet-role-amber-fill:#222127;--chartlet-role-teal:#8f8a80;--chartlet-role-teal-fill:#222127;--chartlet-role-violet:#c9c4b8;--chartlet-role-violet-fill:#222127;--chartlet-role-gray:#8f8a80;--chartlet-role-gray-fill:#222127;--chartlet-role-red:#f08a7e;--chartlet-role-red-fill:#2d1f1e}#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-role-blue,#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-role-green,#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-role-amber,#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-role-teal,#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-role-violet,#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-role-gray,#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-role-red{fill:var(--chartlet-node);stroke:var(--chartlet-zero)}#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-flow-node{stroke-width:1;rx:6px}#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-flow-start{stroke-width:1}#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-flow-end{stroke-width:2}#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-flow-inner{stroke:var(--chartlet-zero)}#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-flow-edge{stroke:var(--chartlet-zero);stroke-width:1}#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-flow-main{stroke:var(--chartlet-accent);stroke-width:2}#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-flow-group{fill:none;stroke:var(--chartlet-zero);stroke-width:1;stroke-dasharray:3 3;rx:8px}#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-diagram-shadow{display:none}#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-diagram-chip{fill:var(--chartlet-background);stroke:none;rx:2px}#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-diagram-badge{fill:var(--chartlet-text);stroke:var(--chartlet-background)}#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-diagram-badge-text{fill:var(--chartlet-background)}#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-diagram-tag{fill:var(--chartlet-background);stroke:var(--chartlet-zero);stroke-width:1;rx:3px}#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-diagram-tech{font-size:11px;fill:var(--chartlet-text)}#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-diagram-tag-text{font-size:9px;font-weight:600;letter-spacing:.5px;fill:var(--chartlet-text)}#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-seq-box{stroke-width:1;rx:6px}#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-seq-message{stroke:var(--chartlet-zero);stroke-width:1}#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-seq-activation{stroke:var(--chartlet-zero)}#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-seq-frame{rx:8px}#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-state{rx:8px}#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-state-inner{stroke:var(--chartlet-zero);rx:6px}#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-arch-head{fill:var(--chartlet-node);stroke:var(--chartlet-zero)}#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-flow-sublabel,#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-flow-group-label,#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-flow-card,#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-diagram-tag-text,#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-diagram-tech,#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-arch-interface,#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-seq-sublabel,#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-seq-tag,#chartlet-393fca24add6aeed.chartlet-look-editorial .chartlet-seq-guard{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,"JetBrains Mono","DejaVu Sans Mono",monospace}</style><rect x="512" y="56" width="456" height="184" class="chartlet-flow-group"/><text x="520" y="69" text-anchor="start" class="chartlet-flow-group-label">Cloud region eu-central-1</text><g class="chartlet-f chartlet-f-0 chartlet-f-1"><polyline points="128,200 232,200" class="chartlet-flow-edge chartlet-flow-main"><title>Customer → Web shop: browses</title></polyline><polyline points="232,203.5 240,200 232,196.5 232,203.5" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><polyline points="344,200 516,200" class="chartlet-flow-edge chartlet-flow-main"><title>Web shop → Shop API: calls [HTTPS/JSON]</title></polyline><polyline points="516,203.5 524,200 516,196.5 516,203.5" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-2 chartlet-f-3"><polyline points="628,180 814.014,180 814.014,116 840,116" class="chartlet-flow-edge"><title>Shop API → Orders: reads, writes [SQL/TLS]</title></polyline><polyline points="840,119.5 848,116 840,112.5 840,119.5" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-2 chartlet-f-4"><polyline points="628,200 836,200" class="chartlet-flow-edge chartlet-flow-main"><title>Shop API → Order events: publishes [AMQP]</title></polyline><polyline points="836,203.5 844,200 836,196.5 836,203.5" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-4 chartlet-f-5"><polyline points="956,200 1116,200" class="chartlet-flow-edge chartlet-flow-main"><title>Order events → Payment provider: charges [HTTPS]</title></polyline><polyline points="1116,203.5 1124,200 1116,196.5 1116,203.5" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-n-0 chartlet-f-0 chartlet-f-1"></g><g class="chartlet-f chartlet-n-1 chartlet-f-0 chartlet-f-1 chartlet-f-2"></g><g class="chartlet-f chartlet-n-2 chartlet-f-1 chartlet-f-2 chartlet-f-3 chartlet-f-4"></g><g class="chartlet-f chartlet-n-3 chartlet-f-2 chartlet-f-3"></g><g class="chartlet-f chartlet-n-4 chartlet-f-2 chartlet-f-4 chartlet-f-5"></g><g class="chartlet-f chartlet-n-5 chartlet-f-4 chartlet-f-5"></g><g class="chartlet-f chartlet-f-0 chartlet-f-1"><rect x="136" y="171" width="61.12" height="21" class="chartlet-diagram-chip"/><text x="141" y="185" text-anchor="start" class="chartlet-diagram-chip-text">browses</text></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><rect x="352" y="171" width="117.76" height="21" class="chartlet-diagram-chip"/><text x="357" y="185" text-anchor="start" class="chartlet-diagram-chip-text">calls · </text><text x="398.76" y="185" text-anchor="start" class="chartlet-diagram-tech">HTTPS/JSON</text></g><g class="chartlet-f chartlet-f-2 chartlet-f-3"><rect x="636" y="151" width="152.92" height="21" class="chartlet-diagram-chip"/><text x="641" y="165" text-anchor="start" class="chartlet-diagram-chip-text">reads, writes · </text><text x="737.72" y="165" text-anchor="start" class="chartlet-diagram-tech">SQL/TLS</text></g><g class="chartlet-f chartlet-f-2 chartlet-f-4"><rect x="636" y="208" width="105.04" height="21" class="chartlet-diagram-chip"/><text x="641" y="222" text-anchor="start" class="chartlet-diagram-chip-text">publishes · </text><text x="709.64" y="222" text-anchor="start" class="chartlet-diagram-tech">AMQP</text></g><g class="chartlet-f chartlet-f-4 chartlet-f-5"><rect x="964" y="243" width="104.44" height="21" class="chartlet-diagram-chip"/><text x="969" y="257" text-anchor="start" class="chartlet-diagram-chip-text">charges · </text><text x="1030.44" y="257" text-anchor="start" class="chartlet-diagram-tech">HTTPS</text></g><g class="chartlet-f chartlet-n-0 chartlet-f-0 chartlet-f-1"><rect x="24" y="170.5" width="104" height="64" class="chartlet-diagram-shadow"/><rect x="24" y="168" width="104" height="64" class="chartlet-flow-node chartlet-role-violet"><title>Customer</title></rect><circle cx="76" cy="179" r="6" class="chartlet-arch-head"/><rect x="32" y="161" width="34" height="14" class="chartlet-diagram-tag"/><text x="49" y="171" text-anchor="middle" class="chartlet-diagram-tag-text">USER</text><text x="76" y="212.5" text-anchor="middle" class="chartlet-flow-label">Customer</text></g><g class="chartlet-f chartlet-n-1 chartlet-f-0 chartlet-f-1 chartlet-f-2"><rect x="240" y="166.5" width="104" height="72" class="chartlet-diagram-shadow"/><rect x="240" y="164" width="104" height="72" class="chartlet-flow-node chartlet-role-blue"><title>Web shop – browser</title></rect><line x1="240" y1="176" x2="344" y2="176" class="chartlet-flow-inner"/><circle cx="248" cy="170" r="1.8" class="chartlet-arch-dot"/><circle cx="254" cy="170" r="1.8" class="chartlet-arch-dot"/><circle cx="260" cy="170" r="1.8" class="chartlet-arch-dot"/><rect x="248" y="157" width="22" height="14" class="chartlet-diagram-tag"/><text x="259" y="167" text-anchor="middle" class="chartlet-diagram-tag-text">UI</text><text x="292" y="203.5" text-anchor="middle" class="chartlet-flow-label">Web shop</text><text x="292" y="217.5" text-anchor="middle" class="chartlet-flow-sublabel">browser</text></g><g class="chartlet-f chartlet-n-2 chartlet-f-1 chartlet-f-2 chartlet-f-3 chartlet-f-4"><rect x="524" y="174.5" width="104" height="56" class="chartlet-diagram-shadow"/><rect x="524" y="172" width="104" height="56" class="chartlet-flow-node chartlet-role-blue"><title>Shop API – Node.js</title></rect><rect x="532" y="165" width="28" height="14" class="chartlet-diagram-tag"/><text x="546" y="175" text-anchor="middle" class="chartlet-diagram-tag-text">SVC</text><text x="576" y="197.5" text-anchor="middle" class="chartlet-flow-label">Shop API</text><text x="576" y="211.5" text-anchor="middle" class="chartlet-flow-sublabel">Node.js</text></g><g class="chartlet-f chartlet-n-3 chartlet-f-2 chartlet-f-3"><polyline points="848,91.5 848,145.5 849.772,146.794 854.967,148 863.23,149.036 874,149.83 886.541,150.33 900,150.5 913.459,150.33 926,149.83 936.77,149.036 945.033,148 950.228,146.794 952,145.5 952,91.5 950.228,90.206 945.033,89 936.77,87.964 926,87.17 913.459,86.67 900,86.5 886.541,86.67 874,87.17 863.23,87.964 854.967,89 849.772,90.206 848,91.5 848,91.5" class="chartlet-diagram-shadow"/><polyline points="848,89 848,143 849.772,144.294 854.967,145.5 863.23,146.536 874,147.33 886.541,147.83 900,148 913.459,147.83 926,147.33 936.77,146.536 945.033,145.5 950.228,144.294 952,143 952,89 950.228,87.706 945.033,86.5 936.77,85.464 926,84.67 913.459,84.17 900,84 886.541,84.17 874,84.67 863.23,85.464 854.967,86.5 849.772,87.706 848,89 848,89" class="chartlet-flow-node chartlet-role-teal"><title>Orders – Postgres</title></polyline><polyline points="848,89 849.772,90.294 854.967,91.5 863.23,92.536 874,93.33 886.541,93.83 900,94 913.459,93.83 926,93.33 936.77,92.536 945.033,91.5 950.228,90.294 952,89" class="chartlet-diagram-rim"/><rect x="856" y="77" width="22" height="14" class="chartlet-diagram-tag"/><text x="867" y="87" text-anchor="middle" class="chartlet-diagram-tag-text">DB</text><text x="900" y="116.5" text-anchor="middle" class="chartlet-flow-label">Orders</text><text x="900" y="130.5" text-anchor="middle" class="chartlet-flow-sublabel">Postgres</text></g><g class="chartlet-f chartlet-n-4 chartlet-f-2 chartlet-f-4 chartlet-f-5"><rect x="848" y="178.5" width="112" height="40" class="chartlet-diagram-shadow"/><rect x="848" y="176" width="112" height="40" class="chartlet-flow-node chartlet-role-violet"/><rect x="844" y="182.5" width="112" height="40" class="chartlet-diagram-shadow"/><rect x="844" y="180" width="112" height="40" class="chartlet-flow-node chartlet-role-violet"><title>Order events</title></rect><rect x="852" y="173" width="40" height="14" class="chartlet-diagram-tag"/><text x="872" y="183" text-anchor="middle" class="chartlet-diagram-tag-text">QUEUE</text><text x="900" y="204.5" text-anchor="middle" class="chartlet-flow-label">Order events</text></g><g class="chartlet-f chartlet-n-5 chartlet-f-4 chartlet-f-5"><rect x="1124" y="182.5" width="144" height="40" class="chartlet-diagram-shadow"/><rect x="1124" y="180" width="144" height="40" class="chartlet-flow-node chartlet-flow-external chartlet-role-gray"><title>Payment provider</title></rect><rect x="1132" y="173" width="28" height="14" class="chartlet-diagram-tag"/><text x="1146" y="183" text-anchor="middle" class="chartlet-diagram-tag-text">EXT</text><text x="1196" y="204.5" text-anchor="middle" class="chartlet-flow-label">Payment provider</text></g></svg><label class="chartlet-hotspot" id="chartlet-393fca24add6aeed-hs-0" for="chartlet-393fca24add6aeed-focus-0"></label><label class="chartlet-hotspot" id="chartlet-393fca24add6aeed-hs-1" for="chartlet-393fca24add6aeed-focus-1"></label><label class="chartlet-hotspot" id="chartlet-393fca24add6aeed-hs-2" for="chartlet-393fca24add6aeed-focus-2"></label><label class="chartlet-hotspot" id="chartlet-393fca24add6aeed-hs-3" for="chartlet-393fca24add6aeed-focus-3"></label><label class="chartlet-hotspot" id="chartlet-393fca24add6aeed-hs-4" for="chartlet-393fca24add6aeed-focus-4"></label><label class="chartlet-hotspot" id="chartlet-393fca24add6aeed-hs-5" for="chartlet-393fca24add6aeed-focus-5"></label></div></div><div class="chartlet-variant-mobile"><div class="chartlet-stage"><svg xmlns="http://www.w3.org/2000/svg" width="360" height="900" viewBox="0 0 360 900" id="chartlet-393fca24add6aeed-m" role="img" aria-labelledby="chartlet-393fca24add6aeed-m-title chartlet-393fca24add6aeed-m-description" class="chartlet-root chartlet-look-editorial"><title id="chartlet-393fca24add6aeed-m-title">A shop on one cloud region</title><desc id="chartlet-393fca24add6aeed-m-description">Architecture diagram with 6 components and 5 connections in 1 boundary. Cloud region eu-central-1: Shop API, Orders, Order events. Main path: Customer → Web shop → Shop API → Order events → Payment provider. Most connected: Shop API (3 connections). Nothing leads into Customer. Nothing leads out of Orders and Payment provider. Bottleneck: Shop API; without it the diagram falls apart. Customer (person): connects to Web shop (browses). Web shop (frontend): connects to Shop API (calls, via HTTPS/JSON). Shop API (service): connects to Orders (reads, writes, via SQL/TLS) and Order events (publishes, via AMQP). Orders (database): no outgoing connection. Order events (queue): connects to Payment provider (charges, via HTTPS). Payment provider (external system): no outgoing connection.</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-393fca24add6aeed-m .chartlet-title{font-size:22px;font-weight:650;fill:var(--chartlet-text)}#chartlet-393fca24add6aeed-m .chartlet-label,#chartlet-393fca24add6aeed-m .chartlet-tick,#chartlet-393fca24add6aeed-m .chartlet-value,#chartlet-393fca24add6aeed-m .chartlet-value-inverse,#chartlet-393fca24add6aeed-m .chartlet-axis-title{font-size:12px;fill:var(--chartlet-muted)}#chartlet-393fca24add6aeed-m .chartlet-value,#chartlet-393fca24add6aeed-m .chartlet-value-inverse{font-weight:600}#chartlet-393fca24add6aeed-m .chartlet-value{fill:var(--chartlet-text)}#chartlet-393fca24add6aeed-m .chartlet-value-inverse{fill:var(--chartlet-background)}#chartlet-393fca24add6aeed-m .chartlet-axis-title{font-weight:600}#chartlet-393fca24add6aeed-m .chartlet-grid{stroke:var(--chartlet-grid);stroke-width:1}#chartlet-393fca24add6aeed-m .chartlet-zero{stroke:var(--chartlet-zero);stroke-width:1.5}#chartlet-393fca24add6aeed-m .chartlet-bar,#chartlet-393fca24add6aeed-m .chartlet-point{fill:var(--chartlet-accent)}#chartlet-393fca24add6aeed-m .chartlet-line{fill:none;stroke:var(--chartlet-accent);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}#chartlet-393fca24add6aeed-m .chartlet-background{fill:var(--chartlet-background)}#chartlet-393fca24add6aeed-m .chartlet-title-small{font-size:18px}.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-393fca24add6aeed-m .chartlet-role-blue{fill:var(--chartlet-role-blue-fill);stroke:var(--chartlet-role-blue)}#chartlet-393fca24add6aeed-m .chartlet-role-green{fill:var(--chartlet-role-green-fill);stroke:var(--chartlet-role-green)}#chartlet-393fca24add6aeed-m .chartlet-role-amber{fill:var(--chartlet-role-amber-fill);stroke:var(--chartlet-role-amber)}#chartlet-393fca24add6aeed-m .chartlet-role-teal{fill:var(--chartlet-role-teal-fill);stroke:var(--chartlet-role-teal)}#chartlet-393fca24add6aeed-m .chartlet-role-violet{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet)}#chartlet-393fca24add6aeed-m .chartlet-role-gray{fill:var(--chartlet-role-gray-fill);stroke:var(--chartlet-role-gray)}#chartlet-393fca24add6aeed-m .chartlet-role-red{fill:var(--chartlet-role-red-fill);stroke:var(--chartlet-role-red)}#chartlet-393fca24add6aeed-m .chartlet-diagram-rim{fill:none;stroke:var(--chartlet-role-teal);stroke-width:1.5}#chartlet-393fca24add6aeed-m .chartlet-diagram-shadow{fill:var(--chartlet-shadow);stroke:none;rx:7px}#chartlet-393fca24add6aeed-m .chartlet-diagram-chip{fill:var(--chartlet-background);stroke:var(--chartlet-grid);stroke-width:1;rx:4px}#chartlet-393fca24add6aeed-m .chartlet-diagram-chip-text{font-size:12px;fill:var(--chartlet-text)}#chartlet-393fca24add6aeed-m .chartlet-diagram-badge{fill:var(--chartlet-accent);stroke:var(--chartlet-background);stroke-width:2}#chartlet-393fca24add6aeed-m .chartlet-diagram-badge-text{font-size:10px;font-weight:700;fill:var(--chartlet-background)}#chartlet-393fca24add6aeed-m .chartlet-flow-node{stroke-width:1.5;stroke-linejoin:round;rx:7px}#chartlet-393fca24add6aeed-m .chartlet-flow-start{stroke-width:2}#chartlet-393fca24add6aeed-m .chartlet-flow-end{stroke-width:3}#chartlet-393fca24add6aeed-m .chartlet-flow-external{stroke-dasharray:5 3}#chartlet-393fca24add6aeed-m .chartlet-flow-inner{stroke:var(--chartlet-role-blue);stroke-width:1}#chartlet-393fca24add6aeed-m .chartlet-flow-label{font-size:13px;font-weight:600;fill:var(--chartlet-text)}#chartlet-393fca24add6aeed-m .chartlet-flow-sublabel{font-size:11px;fill:var(--chartlet-muted)}#chartlet-393fca24add6aeed-m .chartlet-flow-edge{fill:none;stroke:var(--chartlet-zero);stroke-width:1.4;stroke-linejoin:round}#chartlet-393fca24add6aeed-m .chartlet-flow-dashed{stroke-dasharray:5 4}#chartlet-393fca24add6aeed-m .chartlet-flow-dotted{stroke-dasharray:1 4;stroke-linecap:round}#chartlet-393fca24add6aeed-m .chartlet-flow-main{stroke:var(--chartlet-accent);stroke-width:2.2}#chartlet-393fca24add6aeed-m .chartlet-flow-head{fill:var(--chartlet-zero);stroke:var(--chartlet-zero);stroke-width:1;stroke-linejoin:round}#chartlet-393fca24add6aeed-m .chartlet-flow-main-head{fill:var(--chartlet-accent);stroke:var(--chartlet-accent)}#chartlet-393fca24add6aeed-m .chartlet-flow-lane{fill:var(--chartlet-lane);stroke:var(--chartlet-grid);stroke-width:1}#chartlet-393fca24add6aeed-m .chartlet-flow-lane-alt{fill:var(--chartlet-background)}#chartlet-393fca24add6aeed-m .chartlet-flow-lane-head{fill:var(--chartlet-lane-head);stroke:none}#chartlet-393fca24add6aeed-m .chartlet-flow-lane-label{font-size:11px;font-weight:650;fill:var(--chartlet-muted);letter-spacing:.04em}#chartlet-393fca24add6aeed-m .chartlet-flow-group{fill:var(--chartlet-accent);fill-opacity:.04;stroke:var(--chartlet-zero);stroke-width:1;stroke-dasharray:4 3;rx:10px}#chartlet-393fca24add6aeed-m .chartlet-flow-group-label{font-size:11px;font-weight:600;fill:var(--chartlet-muted)}#chartlet-393fca24add6aeed-m .chartlet-arch-head{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet);stroke-width:1.5}#chartlet-393fca24add6aeed-m .chartlet-arch-dot{fill:var(--chartlet-role-blue);stroke:none}.chartlet-root.chartlet-look-editorial{--chartlet-text:#1d1c1a;--chartlet-muted:#4d4a44;--chartlet-grid:#d8d4ca;--chartlet-zero:#6b665c;--chartlet-accent:#0b6a88;--chartlet-background:#fcfbf8;--chartlet-color-1:#0b6a88;--chartlet-color-2:#a8431a;--chartlet-color-3:#6b665c;--chartlet-color-4:#1d1c1a;--chartlet-node:#f2efe8;--chartlet-lane:#fcfbf8;--chartlet-lane-head:#f2efe8;--chartlet-shadow:rgba(0,0,0,0);--chartlet-role-blue:#6b665c;--chartlet-role-blue-fill:#f2efe8;--chartlet-role-green:#6b665c;--chartlet-role-green-fill:#f2efe8;--chartlet-role-amber:#6b665c;--chartlet-role-amber-fill:#f2efe8;--chartlet-role-teal:#6b665c;--chartlet-role-teal-fill:#f2efe8;--chartlet-role-violet:#4d4a44;--chartlet-role-violet-fill:#f2efe8;--chartlet-role-gray:#6b665c;--chartlet-role-gray-fill:#f2efe8;--chartlet-role-red:#a8281c;--chartlet-role-red-fill:#fbefec}.chartlet-root.chartlet-look-editorial.chartlet-theme-dark:not(.chartlet-blueprint){--chartlet-text:#ece8df;--chartlet-muted:#b7b2a7;--chartlet-grid:#3a3840;--chartlet-zero:#8f8a80;--chartlet-accent:#62b8d4;--chartlet-background:#17161a;--chartlet-color-1:#62b8d4;--chartlet-color-2:#e0916a;--chartlet-color-3:#9a958a;--chartlet-color-4:#ece8df;--chartlet-node:#222127;--chartlet-lane:#17161a;--chartlet-lane-head:#222127;--chartlet-shadow:rgba(0,0,0,0);--chartlet-role-blue:#8f8a80;--chartlet-role-blue-fill:#222127;--chartlet-role-green:#8f8a80;--chartlet-role-green-fill:#222127;--chartlet-role-amber:#8f8a80;--chartlet-role-amber-fill:#222127;--chartlet-role-teal:#8f8a80;--chartlet-role-teal-fill:#222127;--chartlet-role-violet:#c9c4b8;--chartlet-role-violet-fill:#222127;--chartlet-role-gray:#8f8a80;--chartlet-role-gray-fill:#222127;--chartlet-role-red:#f08a7e;--chartlet-role-red-fill:#2d1f1e}#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-role-blue,#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-role-green,#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-role-amber,#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-role-teal,#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-role-violet,#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-role-gray,#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-role-red{fill:var(--chartlet-node);stroke:var(--chartlet-zero)}#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-flow-node{stroke-width:1;rx:6px}#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-flow-start{stroke-width:1}#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-flow-end{stroke-width:2}#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-flow-inner{stroke:var(--chartlet-zero)}#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-flow-edge{stroke:var(--chartlet-zero);stroke-width:1}#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-flow-main{stroke:var(--chartlet-accent);stroke-width:2}#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-flow-group{fill:none;stroke:var(--chartlet-zero);stroke-width:1;stroke-dasharray:3 3;rx:8px}#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-diagram-shadow{display:none}#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-diagram-chip{fill:var(--chartlet-background);stroke:none;rx:2px}#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-diagram-badge{fill:var(--chartlet-text);stroke:var(--chartlet-background)}#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-diagram-badge-text{fill:var(--chartlet-background)}#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-diagram-tag{fill:var(--chartlet-background);stroke:var(--chartlet-zero);stroke-width:1;rx:3px}#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-diagram-tech{font-size:11px;fill:var(--chartlet-text)}#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-diagram-tag-text{font-size:9px;font-weight:600;letter-spacing:.5px;fill:var(--chartlet-text)}#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-seq-box{stroke-width:1;rx:6px}#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-seq-message{stroke:var(--chartlet-zero);stroke-width:1}#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-seq-activation{stroke:var(--chartlet-zero)}#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-seq-frame{rx:8px}#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-state{rx:8px}#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-state-inner{stroke:var(--chartlet-zero);rx:6px}#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-arch-head{fill:var(--chartlet-node);stroke:var(--chartlet-zero)}#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-flow-sublabel,#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-flow-group-label,#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-flow-card,#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-diagram-tag-text,#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-diagram-tech,#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-arch-interface,#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-seq-sublabel,#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-seq-tag,#chartlet-393fca24add6aeed-m.chartlet-look-editorial .chartlet-seq-guard{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,"JetBrains Mono","DejaVu Sans Mono",monospace}</style><rect x="64" y="404" width="232" height="272" class="chartlet-flow-group"/><text x="72" y="417" text-anchor="start" class="chartlet-flow-group-label">Cloud region eu-central-1</text><g class="chartlet-f chartlet-f-0 chartlet-f-1"><polyline points="228,124 228,212" class="chartlet-flow-edge chartlet-flow-main"><title>Customer → Web shop: browses</title></polyline><polyline points="224.5,212 228,220 231.5,212 224.5,212" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><polyline points="228,292 228,424" class="chartlet-flow-edge chartlet-flow-main"><title>Web shop → Shop API: calls [HTTPS/JSON]</title></polyline><polyline points="224.5,424 228,432 231.5,424 224.5,424" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-2 chartlet-f-3"><polyline points="204,488 204,560 116,560 116,592" class="chartlet-flow-edge"><title>Shop API → Orders: reads, writes [SQL/TLS]</title></polyline><polyline points="112.5,592 116,600 119.5,592 112.5,592" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-2 chartlet-f-4"><polyline points="228,488 228,604" class="chartlet-flow-edge chartlet-flow-main"><title>Shop API → Order events: publishes [AMQP]</title></polyline><polyline points="224.5,604 228,612 231.5,604 224.5,604" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-4 chartlet-f-5"><polyline points="228,652 228,768" class="chartlet-flow-edge chartlet-flow-main"><title>Order events → Payment provider: charges [HTTPS]</title></polyline><polyline points="224.5,768 228,776 231.5,768 224.5,768" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-n-0 chartlet-f-0 chartlet-f-1"></g><g class="chartlet-f chartlet-n-1 chartlet-f-0 chartlet-f-1 chartlet-f-2"></g><g class="chartlet-f chartlet-n-2 chartlet-f-1 chartlet-f-2 chartlet-f-3 chartlet-f-4"></g><g class="chartlet-f chartlet-n-3 chartlet-f-2 chartlet-f-3"></g><g class="chartlet-f chartlet-n-4 chartlet-f-2 chartlet-f-4 chartlet-f-5"></g><g class="chartlet-f chartlet-n-5 chartlet-f-4 chartlet-f-5"></g><g class="chartlet-f chartlet-f-0 chartlet-f-1"><rect x="236" y="129" width="61.12" height="21" class="chartlet-diagram-chip"/><text x="241" y="143" text-anchor="start" class="chartlet-diagram-chip-text">browses</text></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><rect x="236" y="297" width="117.76" height="21" class="chartlet-diagram-chip"/><text x="241" y="311" text-anchor="start" class="chartlet-diagram-chip-text">calls · </text><text x="282.76" y="311" text-anchor="start" class="chartlet-diagram-tech">HTTPS/JSON</text></g><g class="chartlet-f chartlet-f-2 chartlet-f-3"><rect x="43.08" y="493" width="152.92" height="21" class="chartlet-diagram-chip"/><text x="48.08" y="507" text-anchor="start" class="chartlet-diagram-chip-text">reads, writes · </text><text x="144.8" y="507" text-anchor="start" class="chartlet-diagram-tech">SQL/TLS</text></g><g class="chartlet-f chartlet-f-2 chartlet-f-4"><rect x="236" y="493" width="105.04" height="21" class="chartlet-diagram-chip"/><text x="241" y="507" text-anchor="start" class="chartlet-diagram-chip-text">publishes · </text><text x="309.64" y="507" text-anchor="start" class="chartlet-diagram-tech">AMQP</text></g><g class="chartlet-f chartlet-f-4 chartlet-f-5"><rect x="236" y="679" width="104.44" height="21" class="chartlet-diagram-chip"/><text x="241" y="693" text-anchor="start" class="chartlet-diagram-chip-text">charges · </text><text x="302.44" y="693" text-anchor="start" class="chartlet-diagram-tech">HTTPS</text></g><g class="chartlet-f chartlet-n-0 chartlet-f-0 chartlet-f-1"><rect x="180" y="62.5" width="96" height="64" class="chartlet-diagram-shadow"/><rect x="180" y="60" width="96" height="64" class="chartlet-flow-node chartlet-role-violet"><title>Customer</title></rect><circle cx="228" cy="71" r="6" class="chartlet-arch-head"/><text x="228" y="104.5" text-anchor="middle" class="chartlet-flow-label">Customer</text></g><g class="chartlet-f chartlet-n-1 chartlet-f-0 chartlet-f-1 chartlet-f-2"><rect x="184" y="222.5" width="88" height="72" class="chartlet-diagram-shadow"/><rect x="184" y="220" width="88" height="72" class="chartlet-flow-node chartlet-role-blue"><title>Web shop – browser</title></rect><line x1="184" y1="232" x2="272" y2="232" class="chartlet-flow-inner"/><circle cx="192" cy="226" r="1.8" class="chartlet-arch-dot"/><circle cx="198" cy="226" r="1.8" class="chartlet-arch-dot"/><circle cx="204" cy="226" r="1.8" class="chartlet-arch-dot"/><text x="228" y="259.5" text-anchor="middle" class="chartlet-flow-label">Web shop</text><text x="228" y="273.5" text-anchor="middle" class="chartlet-flow-sublabel">browser</text></g><g class="chartlet-f chartlet-n-2 chartlet-f-1 chartlet-f-2 chartlet-f-3 chartlet-f-4"><rect x="184" y="434.5" width="88" height="56" class="chartlet-diagram-shadow"/><rect x="184" y="432" width="88" height="56" class="chartlet-flow-node chartlet-role-blue"><title>Shop API – Node.js</title></rect><text x="228" y="457.5" text-anchor="middle" class="chartlet-flow-label">Shop API</text><text x="228" y="471.5" text-anchor="middle" class="chartlet-flow-sublabel">Node.js</text></g><g class="chartlet-f chartlet-n-3 chartlet-f-2 chartlet-f-3"><polyline points="76,607.5 76,661.5 77.363,662.794 81.359,664 87.716,665.036 96,665.83 105.647,666.33 116,666.5 126.353,666.33 136,665.83 144.284,665.036 150.641,664 154.637,662.794 156,661.5 156,607.5 154.637,606.206 150.641,605 144.284,603.964 136,603.17 126.353,602.67 116,602.5 105.647,602.67 96,603.17 87.716,603.964 81.359,605 77.363,606.206 76,607.5 76,607.5" class="chartlet-diagram-shadow"/><polyline points="76,605 76,659 77.363,660.294 81.359,661.5 87.716,662.536 96,663.33 105.647,663.83 116,664 126.353,663.83 136,663.33 144.284,662.536 150.641,661.5 154.637,660.294 156,659 156,605 154.637,603.706 150.641,602.5 144.284,601.464 136,600.67 126.353,600.17 116,600 105.647,600.17 96,600.67 87.716,601.464 81.359,602.5 77.363,603.706 76,605 76,605" class="chartlet-flow-node chartlet-role-teal"><title>Orders – Postgres</title></polyline><polyline points="76,605 77.363,606.294 81.359,607.5 87.716,608.536 96,609.33 105.647,609.83 116,610 126.353,609.83 136,609.33 144.284,608.536 150.641,607.5 154.637,606.294 156,605" class="chartlet-diagram-rim"/><text x="116" y="632.5" text-anchor="middle" class="chartlet-flow-label">Orders</text><text x="116" y="646.5" text-anchor="middle" class="chartlet-flow-sublabel">Postgres</text></g><g class="chartlet-f chartlet-n-4 chartlet-f-2 chartlet-f-4 chartlet-f-5"><rect x="176" y="610.5" width="112" height="40" class="chartlet-diagram-shadow"/><rect x="176" y="608" width="112" height="40" class="chartlet-flow-node chartlet-role-violet"/><rect x="172" y="614.5" width="112" height="40" class="chartlet-diagram-shadow"/><rect x="172" y="612" width="112" height="40" class="chartlet-flow-node chartlet-role-violet"><title>Order events</title></rect><text x="228" y="636.5" text-anchor="middle" class="chartlet-flow-label">Order events</text></g><g class="chartlet-f chartlet-n-5 chartlet-f-4 chartlet-f-5"><rect x="184" y="778.5" width="88" height="56" class="chartlet-diagram-shadow"/><rect x="184" y="776" width="88" height="56" class="chartlet-flow-node chartlet-flow-external chartlet-role-gray"><title>Payment provider</title></rect><text x="228" y="800.5" text-anchor="middle" class="chartlet-flow-label">Payment</text><text x="228" y="816.5" text-anchor="middle" class="chartlet-flow-label">provider</text></g></svg><label class="chartlet-hotspot" id="chartlet-393fca24add6aeed-m-hs-0" for="chartlet-393fca24add6aeed-focus-0"></label><label class="chartlet-hotspot" id="chartlet-393fca24add6aeed-m-hs-1" for="chartlet-393fca24add6aeed-focus-1"></label><label class="chartlet-hotspot" id="chartlet-393fca24add6aeed-m-hs-2" for="chartlet-393fca24add6aeed-focus-2"></label><label class="chartlet-hotspot" id="chartlet-393fca24add6aeed-m-hs-3" for="chartlet-393fca24add6aeed-focus-3"></label><label class="chartlet-hotspot" id="chartlet-393fca24add6aeed-m-hs-4" for="chartlet-393fca24add6aeed-focus-4"></label><label class="chartlet-hotspot" id="chartlet-393fca24add6aeed-m-hs-5" for="chartlet-393fca24add6aeed-focus-5"></label></div></div><p class="chartlet-source">Source: Illustrative reference architecture</p><details class="chartlet-data" data-viz-text><summary>Show chart data</summary><table><caption>Data for A shop on one cloud region</caption><thead><tr><th scope="col">Component</th><th scope="col">Kind</th><th scope="col">Boundary</th><th scope="col">Connects to</th></tr></thead><tbody><tr><th scope="row">Customer</th><td>person</td><td></td><td>Web shop (browses)</td></tr><tr><th scope="row">Web shop</th><td>frontend</td><td></td><td>Shop API (calls, via HTTPS/JSON)</td></tr><tr><th scope="row">Shop API</th><td>service</td><td>Cloud region eu-central-1</td><td>Orders (reads, writes, via SQL/TLS), Order events (publishes, via AMQP)</td></tr><tr><th scope="row">Orders</th><td>database</td><td>Cloud region eu-central-1</td><td></td></tr><tr><th scope="row">Order events</th><td>queue</td><td>Cloud region eu-central-1</td><td>Payment provider (charges, via HTTPS)</td></tr><tr><th scope="row">Payment provider</th><td>external system</td><td></td><td></td></tr></tbody></table></details></figure></div>