chartlet 0.21.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-d5472d7361b74f66 .chartlet-f{opacity:.18}#chartlet-d5472d7361b74f66-hs-0{left:43.278%;top:1.003%;width:10.4%;height:4.511%}#chartlet-d5472d7361b74f66-hs-1{left:43.278%;top:12.83%;width:10.4%;height:4.01%}#chartlet-d5472d7361b74f66-hs-2{left:43.235%;top:27.629%;width:10.486%;height:3.008%}#chartlet-d5472d7361b74f66-hs-3{left:41.851%;top:41.842%;width:13.255%;height:3.008%}#chartlet-d5472d7361b74f66-hs-4{left:29.278%;top:59.9%;width:10.4%;height:4.511%}#chartlet-d5472d7361b74f66-hs-5{left:33.678%;top:80.42%;width:10.4%;height:3.843%}#chartlet-d5472d7361b74f66-hs-6{left:42.8%;top:89.223%;width:11.357%;height:3.008%}#chartlet-d5472d7361b74f66-hs-7{left:20.688%;top:69.124%;width:17.892%;height:5.096%}#chartlet-d5472d7361b74f66-hs-8{left:59.74%;top:41.425%;width:19.572%;height:3.843%}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-0:checked) #chartlet-d5472d7361b74f66 .chartlet-f-0{opacity:1}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-0:checked) #chartlet-d5472d7361b74f66 .chartlet-n-0 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-0:checked) #chartlet-d5472d7361b74f66 .chartlet-n-0 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-1:checked) #chartlet-d5472d7361b74f66 .chartlet-f-1{opacity:1}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-1:checked) #chartlet-d5472d7361b74f66 .chartlet-n-1 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-1:checked) #chartlet-d5472d7361b74f66 .chartlet-n-1 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-2:checked) #chartlet-d5472d7361b74f66 .chartlet-f-2{opacity:1}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-2:checked) #chartlet-d5472d7361b74f66 .chartlet-n-2 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-2:checked) #chartlet-d5472d7361b74f66 .chartlet-n-2 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-3:checked) #chartlet-d5472d7361b74f66 .chartlet-f-3{opacity:1}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-3:checked) #chartlet-d5472d7361b74f66 .chartlet-n-3 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-3:checked) #chartlet-d5472d7361b74f66 .chartlet-n-3 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-4:checked) #chartlet-d5472d7361b74f66 .chartlet-f-4{opacity:1}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-4:checked) #chartlet-d5472d7361b74f66 .chartlet-n-4 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-4:checked) #chartlet-d5472d7361b74f66 .chartlet-n-4 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-5:checked) #chartlet-d5472d7361b74f66 .chartlet-f-5{opacity:1}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-5:checked) #chartlet-d5472d7361b74f66 .chartlet-n-5 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-5:checked) #chartlet-d5472d7361b74f66 .chartlet-n-5 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-6:checked) #chartlet-d5472d7361b74f66 .chartlet-f-6{opacity:1}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-6:checked) #chartlet-d5472d7361b74f66 .chartlet-n-6 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-6:checked) #chartlet-d5472d7361b74f66 .chartlet-n-6 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-7:checked) #chartlet-d5472d7361b74f66 .chartlet-f-7{opacity:1}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-7:checked) #chartlet-d5472d7361b74f66 .chartlet-n-7 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-7:checked) #chartlet-d5472d7361b74f66 .chartlet-n-7 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-8:checked) #chartlet-d5472d7361b74f66 .chartlet-f-8{opacity:1}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-8:checked) #chartlet-d5472d7361b74f66 .chartlet-n-8 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-8:checked) #chartlet-d5472d7361b74f66 .chartlet-n-8 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(.chartlet-focus-node:checked) #chartlet-d5472d7361b74f66-m .chartlet-f{opacity:.18}#chartlet-d5472d7361b74f66-m-hs-0{left:41.792%;top:0.908%;width:17.361%;height:4.085%}#chartlet-d5472d7361b74f66-m-hs-1{left:40.965%;top:11.949%;width:19.016%;height:3.631%}#chartlet-d5472d7361b74f66-m-hs-2{left:38.557%;top:25.837%;width:23.832%;height:2.723%}#chartlet-d5472d7361b74f66-m-hs-3{left:41.29%;top:39.725%;width:18.366%;height:3.933%}#chartlet-d5472d7361b74f66-m-hs-4{left:11.403%;top:58.478%;width:22.502%;height:4.085%}#chartlet-d5472d7361b74f66-m-hs-5{left:28.402%;top:78.643%;width:15.707%;height:3.48%}#chartlet-d5472d7361b74f66-m-hs-6{left:37.567%;top:86.838%;width:25.811%;height:2.723%}#chartlet-d5472d7361b74f66-m-hs-7{left:9.481%;top:65.864%;width:26.345%;height:6.884%}#chartlet-d5472d7361b74f66-m-hs-8{left:65.401%;top:38.817%;width:25.118%;height:5.749%}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-0:checked) #chartlet-d5472d7361b74f66-m .chartlet-f-0{opacity:1}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-0:checked) #chartlet-d5472d7361b74f66-m .chartlet-n-0 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-0:checked) #chartlet-d5472d7361b74f66-m .chartlet-n-0 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-1:checked) #chartlet-d5472d7361b74f66-m .chartlet-f-1{opacity:1}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-1:checked) #chartlet-d5472d7361b74f66-m .chartlet-n-1 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-1:checked) #chartlet-d5472d7361b74f66-m .chartlet-n-1 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-2:checked) #chartlet-d5472d7361b74f66-m .chartlet-f-2{opacity:1}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-2:checked) #chartlet-d5472d7361b74f66-m .chartlet-n-2 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-2:checked) #chartlet-d5472d7361b74f66-m .chartlet-n-2 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-3:checked) #chartlet-d5472d7361b74f66-m .chartlet-f-3{opacity:1}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-3:checked) #chartlet-d5472d7361b74f66-m .chartlet-n-3 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-3:checked) #chartlet-d5472d7361b74f66-m .chartlet-n-3 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-4:checked) #chartlet-d5472d7361b74f66-m .chartlet-f-4{opacity:1}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-4:checked) #chartlet-d5472d7361b74f66-m .chartlet-n-4 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-4:checked) #chartlet-d5472d7361b74f66-m .chartlet-n-4 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-5:checked) #chartlet-d5472d7361b74f66-m .chartlet-f-5{opacity:1}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-5:checked) #chartlet-d5472d7361b74f66-m .chartlet-n-5 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-5:checked) #chartlet-d5472d7361b74f66-m .chartlet-n-5 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-6:checked) #chartlet-d5472d7361b74f66-m .chartlet-f-6{opacity:1}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-6:checked) #chartlet-d5472d7361b74f66-m .chartlet-n-6 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-6:checked) #chartlet-d5472d7361b74f66-m .chartlet-n-6 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-7:checked) #chartlet-d5472d7361b74f66-m .chartlet-f-7{opacity:1}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-7:checked) #chartlet-d5472d7361b74f66-m .chartlet-n-7 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-7:checked) #chartlet-d5472d7361b74f66-m .chartlet-n-7 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-8:checked) #chartlet-d5472d7361b74f66-m .chartlet-f-8{opacity:1}.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-8:checked) #chartlet-d5472d7361b74f66-m .chartlet-n-8 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d5472d7361b74f66-focus-8:checked) #chartlet-d5472d7361b74f66-m .chartlet-n-8 .chartlet-seq-box{stroke-width:3}</style><details class="chartlet-focus"><summary>Focus</summary><fieldset><label><input type="radio" name="chartlet-d5472d7361b74f66-focus" checked> Show all</label><label><input type="radio" name="chartlet-d5472d7361b74f66-focus" class="chartlet-focus-node" id="chartlet-d5472d7361b74f66-focus-0"> Shopper</label><label><input type="radio" name="chartlet-d5472d7361b74f66-focus" class="chartlet-focus-node" id="chartlet-d5472d7361b74f66-focus-1"> Checkout</label><label><input type="radio" name="chartlet-d5472d7361b74f66-focus" class="chartlet-focus-node" id="chartlet-d5472d7361b74f66-focus-2"> API gateway</label><label><input type="radio" name="chartlet-d5472d7361b74f66-focus" class="chartlet-focus-node" id="chartlet-d5472d7361b74f66-focus-3"> Payment service</label><label><input type="radio" name="chartlet-d5472d7361b74f66-focus" class="chartlet-focus-node" id="chartlet-d5472d7361b74f66-focus-4"> Token vault</label><label><input type="radio" name="chartlet-d5472d7361b74f66-focus" class="chartlet-focus-node" id="chartlet-d5472d7361b74f66-focus-5"> Ledger</label><label><input type="radio" name="chartlet-d5472d7361b74f66-focus" class="chartlet-focus-node" id="chartlet-d5472d7361b74f66-focus-6"> Card provider</label><label><input type="radio" name="chartlet-d5472d7361b74f66-focus" class="chartlet-focus-node" id="chartlet-d5472d7361b74f66-focus-7"> Card numbers never leave the vault; everything else sees tokens.</label><label><input type="radio" name="chartlet-d5472d7361b74f66-focus" class="chartlet-focus-node" id="chartlet-d5472d7361b74f66-focus-8"> Audited once a year; changes need a second reviewer.</label></fieldset></details><figure class="chartlet-figure" data-viz="chart"><figcaption>Payments and what to know about them</figcaption><div class="chartlet-variant-desktop"><div class="chartlet-stage"><svg xmlns="http://www.w3.org/2000/svg" width="1000" height="1197" viewBox="0 0 1000 1197" id="chartlet-d5472d7361b74f66" role="img" aria-labelledby="chartlet-d5472d7361b74f66-title chartlet-d5472d7361b74f66-description" class="chartlet-root"><title id="chartlet-d5472d7361b74f66-title">Payments and what to know about them</title><desc id="chartlet-d5472d7361b74f66-description">Architecture diagram with 7 components and 6 connections in 2 boundaries. Cloud account: API gateway, Ledger, Card data zone. Card data zone (in Cloud account): Payment service, Token vault. Main path: Shopper → Checkout → API gateway → Payment service → Card provider. Most connected: Payment service (4 connections). Nothing leads into Shopper. Nothing leads out of Token vault, Ledger and Card provider. Bottleneck: API gateway; without it the diagram falls apart. Shopper (person): connects to Checkout (pays). Checkout (frontend): connects to API gateway (via HTTPS). API gateway (service): connects to Payment service (charge). Payment service (service): connects to Token vault (tokenizes), Card provider (authorizes, via HTTPS) and Ledger (records, via SQL). Token vault (security): no outgoing connection. Ledger (database): no outgoing connection. Card provider (external system): no outgoing connection. Note on Token vault: Card numbers never leave the vault; everything else sees tokens. Note on Card data zone: Audited once a year; changes need a second reviewer. Note: Figures and names are illustrative; the diagram shows the target state.</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-d5472d7361b74f66 .chartlet-title{font-size:22px;font-weight:650;fill:var(--chartlet-text)}#chartlet-d5472d7361b74f66 .chartlet-label,#chartlet-d5472d7361b74f66 .chartlet-tick,#chartlet-d5472d7361b74f66 .chartlet-value,#chartlet-d5472d7361b74f66 .chartlet-value-inverse,#chartlet-d5472d7361b74f66 .chartlet-axis-title{font-size:12px;fill:var(--chartlet-muted)}#chartlet-d5472d7361b74f66 .chartlet-value,#chartlet-d5472d7361b74f66 .chartlet-value-inverse{font-weight:600}#chartlet-d5472d7361b74f66 .chartlet-value{fill:var(--chartlet-text)}#chartlet-d5472d7361b74f66 .chartlet-value-inverse{fill:var(--chartlet-background)}#chartlet-d5472d7361b74f66 .chartlet-axis-title{font-weight:600}#chartlet-d5472d7361b74f66 .chartlet-grid{stroke:var(--chartlet-grid);stroke-width:1}#chartlet-d5472d7361b74f66 .chartlet-zero{stroke:var(--chartlet-zero);stroke-width:1.5}#chartlet-d5472d7361b74f66 .chartlet-bar,#chartlet-d5472d7361b74f66 .chartlet-point{fill:var(--chartlet-accent)}#chartlet-d5472d7361b74f66 .chartlet-line{fill:none;stroke:var(--chartlet-accent);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}#chartlet-d5472d7361b74f66 .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-d5472d7361b74f66 .chartlet-role-blue{fill:var(--chartlet-role-blue-fill);stroke:var(--chartlet-role-blue)}#chartlet-d5472d7361b74f66 .chartlet-role-green{fill:var(--chartlet-role-green-fill);stroke:var(--chartlet-role-green)}#chartlet-d5472d7361b74f66 .chartlet-role-amber{fill:var(--chartlet-role-amber-fill);stroke:var(--chartlet-role-amber)}#chartlet-d5472d7361b74f66 .chartlet-role-teal{fill:var(--chartlet-role-teal-fill);stroke:var(--chartlet-role-teal)}#chartlet-d5472d7361b74f66 .chartlet-role-violet{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet)}#chartlet-d5472d7361b74f66 .chartlet-role-gray{fill:var(--chartlet-role-gray-fill);stroke:var(--chartlet-role-gray)}#chartlet-d5472d7361b74f66 .chartlet-role-red{fill:var(--chartlet-role-red-fill);stroke:var(--chartlet-role-red)}#chartlet-d5472d7361b74f66 .chartlet-diagram-rim{fill:none;stroke:var(--chartlet-role-teal);stroke-width:1.5}#chartlet-d5472d7361b74f66 .chartlet-diagram-shadow{fill:var(--chartlet-shadow);stroke:none;rx:7px}#chartlet-d5472d7361b74f66 .chartlet-diagram-chip{fill:var(--chartlet-background);stroke:var(--chartlet-grid);stroke-width:1;rx:4px}#chartlet-d5472d7361b74f66 .chartlet-diagram-chip-text{font-size:12px;fill:var(--chartlet-text)}#chartlet-d5472d7361b74f66 .chartlet-diagram-badge{fill:var(--chartlet-accent);stroke:var(--chartlet-background);stroke-width:2}#chartlet-d5472d7361b74f66 .chartlet-diagram-badge-text{font-size:10px;font-weight:700;fill:var(--chartlet-background)}#chartlet-d5472d7361b74f66 .chartlet-flow-node{stroke-width:1.5;stroke-linejoin:round;rx:7px}#chartlet-d5472d7361b74f66 .chartlet-flow-start{stroke-width:2}#chartlet-d5472d7361b74f66 .chartlet-flow-end{stroke-width:3}#chartlet-d5472d7361b74f66 .chartlet-flow-external{stroke-dasharray:5 3}#chartlet-d5472d7361b74f66 .chartlet-flow-inner{stroke:var(--chartlet-role-blue);stroke-width:1}#chartlet-d5472d7361b74f66 .chartlet-flow-label{font-size:13px;font-weight:600;fill:var(--chartlet-text)}#chartlet-d5472d7361b74f66 .chartlet-flow-sublabel{font-size:11px;fill:var(--chartlet-muted)}#chartlet-d5472d7361b74f66 .chartlet-flow-edge{fill:none;stroke:var(--chartlet-zero);stroke-width:1.4;stroke-linejoin:round}#chartlet-d5472d7361b74f66 .chartlet-flow-dashed{stroke-dasharray:5 4}#chartlet-d5472d7361b74f66 .chartlet-flow-dotted{stroke-dasharray:1 4;stroke-linecap:round}#chartlet-d5472d7361b74f66 .chartlet-flow-main{stroke:var(--chartlet-accent);stroke-width:2.2}#chartlet-d5472d7361b74f66 .chartlet-flow-head{fill:var(--chartlet-zero);stroke:var(--chartlet-zero);stroke-width:1;stroke-linejoin:round}#chartlet-d5472d7361b74f66 .chartlet-flow-main-head{fill:var(--chartlet-accent);stroke:var(--chartlet-accent)}#chartlet-d5472d7361b74f66 .chartlet-flow-lane{fill:var(--chartlet-lane);stroke:var(--chartlet-grid);stroke-width:1}#chartlet-d5472d7361b74f66 .chartlet-flow-lane-alt{fill:var(--chartlet-background)}#chartlet-d5472d7361b74f66 .chartlet-flow-lane-head{fill:var(--chartlet-lane-head);stroke:none}#chartlet-d5472d7361b74f66 .chartlet-flow-lane-label{font-size:11px;font-weight:650;fill:var(--chartlet-muted);letter-spacing:.04em}#chartlet-d5472d7361b74f66 .chartlet-flow-group{fill:var(--chartlet-accent);fill-opacity:.04;stroke:var(--chartlet-zero);stroke-width:1;stroke-dasharray:4 3;rx:10px}#chartlet-d5472d7361b74f66 .chartlet-flow-group-label{font-size:11px;font-weight:600;fill:var(--chartlet-muted)}#chartlet-d5472d7361b74f66 .chartlet-arch-head{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet);stroke-width:1.5}#chartlet-d5472d7361b74f66 .chartlet-arch-dot{fill:var(--chartlet-role-blue);stroke:none}</style><rect x="182.882" y="302.714" width="634.235" height="717.912" class="chartlet-flow-group"/><text x="190.882" y="315.714" text-anchor="start" class="chartlet-flow-group-label">Cloud account</text><rect x="194.882" y="467.852" width="610.235" height="432.557" class="chartlet-flow-group"/><text x="202.882" y="480.852" text-anchor="start" class="chartlet-flow-group-label">Card data zone</text><g class="chartlet-f chartlet-f-0 chartlet-f-1"><polyline points="484.782,66 484.782,145.576" class="chartlet-flow-edge chartlet-flow-main"><title>Shopper → Checkout: pays</title></polyline><polyline points="481.282,145.576 484.782,153.576 488.282,145.576 481.282,145.576" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><polyline points="484.782,201.576 484.782,322.714" class="chartlet-flow-edge chartlet-flow-main"><title>Checkout → API gateway: [HTTPS]</title></polyline><polyline points="481.282,322.714 484.782,330.714 488.282,322.714 481.282,322.714" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-2 chartlet-f-3"><polyline points="484.782,366.714 484.782,492.852" class="chartlet-flow-edge chartlet-flow-main"><title>API gateway → Payment service: charge</title></polyline><polyline points="481.282,492.852 484.782,500.852 488.282,492.852 481.282,492.852" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-3 chartlet-f-4"><polyline points="436.782,536.852 436.782,666.537 344.782,666.537 344.782,709.004" class="chartlet-flow-edge"><title>Payment service → Token vault: tokenizes</title></polyline><polyline points="341.282,709.004 344.782,717.004 348.282,709.004 341.282,709.004" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-3 chartlet-f-6"><polyline points="484.782,536.852 484.782,1060" class="chartlet-flow-edge chartlet-flow-main"><title>Payment service → Card provider: authorizes [HTTPS]</title></polyline><polyline points="481.282,1060 484.782,1068 488.282,1060 481.282,1060" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-3 chartlet-f-5"><polyline points="460.782,536.852 460.782,681.38 440.782,681.38 440.782,927.002 388.782,927.002 388.782,954.626" class="chartlet-flow-edge"><title>Payment service → Ledger: records [SQL]</title></polyline><polyline points="385.282,954.626 388.782,962.626 392.282,954.626 385.282,954.626" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-4 chartlet-f-7"><polyline points="344.782,771.004 344.782,791.785 296.342,791.785 296.342,827.409" class="chartlet-flow-edge chartlet-flow-dotted"/></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"></g><g class="chartlet-f chartlet-n-3 chartlet-f-2 chartlet-f-3 chartlet-f-4 chartlet-f-5 chartlet-f-6"></g><g class="chartlet-f chartlet-n-4 chartlet-f-3 chartlet-f-4 chartlet-f-7"></g><g class="chartlet-f chartlet-n-5 chartlet-f-3 chartlet-f-5"></g><g class="chartlet-f chartlet-n-6 chartlet-f-3 chartlet-f-6"></g><g class="chartlet-f chartlet-n-7 chartlet-f-4 chartlet-f-7"></g><g class="chartlet-f chartlet-n-8 chartlet-f-8"></g><g class="chartlet-f chartlet-f-0 chartlet-f-1"><rect x="488.782" y="71" width="36.88" height="21" class="chartlet-diagram-chip"/><text x="493.782" y="85" text-anchor="start" class="chartlet-diagram-chip-text">pays</text></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><rect x="488.782" y="206.576" width="63.64" height="21" class="chartlet-diagram-chip"/><text x="493.782" y="220.576" text-anchor="start" class="chartlet-diagram-chip-text">[HTTPS]</text></g><g class="chartlet-f chartlet-f-2 chartlet-f-3"><rect x="488.782" y="371.714" width="50.32" height="21" class="chartlet-diagram-chip"/><text x="493.782" y="385.714" text-anchor="start" class="chartlet-diagram-chip-text">charge</text></g><g class="chartlet-f chartlet-f-3 chartlet-f-4"><rect x="365.422" y="541.852" width="67.36" height="21" class="chartlet-diagram-chip"/><text x="427.782" y="555.852" text-anchor="end" class="chartlet-diagram-chip-text">tokenizes</text></g><g class="chartlet-f chartlet-f-3 chartlet-f-6"><rect x="488.782" y="541.852" width="74.08" height="36" class="chartlet-diagram-chip"/><text x="493.782" y="555.852" text-anchor="start" class="chartlet-diagram-chip-text">authorizes</text><text x="493.782" y="570.852" text-anchor="start" class="chartlet-diagram-chip-text">[HTTPS]</text></g><g class="chartlet-f chartlet-f-3 chartlet-f-5"><rect x="386.262" y="1023.626" width="57.04" height="36" class="chartlet-diagram-chip"/><text x="414.782" y="1037.626" text-anchor="middle" class="chartlet-diagram-chip-text">records</text><text x="414.782" y="1052.626" text-anchor="middle" class="chartlet-diagram-chip-text">[SQL]</text></g><g class="chartlet-f chartlet-n-0 chartlet-f-0 chartlet-f-1"><rect x="432.782" y="14.5" width="104" height="54" class="chartlet-diagram-shadow"/><rect x="432.782" y="12" width="104" height="54" class="chartlet-flow-node chartlet-role-violet"><title>Shopper</title></rect><circle cx="484.782" cy="23" r="6" class="chartlet-arch-head"/><text x="484.782" y="51.5" text-anchor="middle" class="chartlet-flow-label">Shopper</text></g><g class="chartlet-f chartlet-n-1 chartlet-f-0 chartlet-f-1 chartlet-f-2"><rect x="432.782" y="156.076" width="104" height="48" class="chartlet-diagram-shadow"/><rect x="432.782" y="153.576" width="104" height="48" class="chartlet-flow-node chartlet-role-blue"><title>Checkout</title></rect><line x1="432.782" y1="165.576" x2="536.782" y2="165.576" class="chartlet-flow-inner"/><circle cx="440.782" cy="159.576" r="1.8" class="chartlet-arch-dot"/><circle cx="446.782" cy="159.576" r="1.8" class="chartlet-arch-dot"/><circle cx="452.782" cy="159.576" r="1.8" class="chartlet-arch-dot"/><text x="484.782" y="188.076" text-anchor="middle" class="chartlet-flow-label">Checkout</text></g><g class="chartlet-f chartlet-n-2 chartlet-f-1 chartlet-f-2 chartlet-f-3"><rect x="432.352" y="333.214" width="104.86" height="36" class="chartlet-diagram-shadow"/><rect x="432.352" y="330.714" width="104.86" height="36" class="chartlet-flow-node chartlet-role-blue"><title>API gateway</title></rect><text x="484.782" y="353.214" text-anchor="middle" class="chartlet-flow-label">API gateway</text></g><g class="chartlet-f chartlet-n-3 chartlet-f-2 chartlet-f-3 chartlet-f-4 chartlet-f-5 chartlet-f-6"><rect x="418.507" y="503.352" width="132.55" height="36" class="chartlet-diagram-shadow"/><rect x="418.507" y="500.852" width="132.55" height="36" class="chartlet-flow-node chartlet-role-blue"><title>Payment service</title></rect><text x="484.782" y="523.352" text-anchor="middle" class="chartlet-flow-label">Payment service</text></g><g class="chartlet-f chartlet-n-4 chartlet-f-3 chartlet-f-4 chartlet-f-7"><polyline points="292.782,719.504 396.782,719.504 396.782,751.904 344.782,773.504 292.782,751.904 292.782,719.504" class="chartlet-diagram-shadow"/><polyline points="292.782,717.004 396.782,717.004 396.782,749.404 344.782,771.004 292.782,749.404 292.782,717.004" class="chartlet-flow-node chartlet-role-red"><title>Token vault</title></polyline><text x="344.782" y="742.504" text-anchor="middle" class="chartlet-flow-label">Token vault</text></g><g class="chartlet-f chartlet-n-5 chartlet-f-3 chartlet-f-5"><polyline points="336.782,970.126 336.782,1006.126 338.554,1007.42 343.749,1008.626 352.013,1009.662 362.782,1010.456 375.324,1010.956 388.782,1011.126 402.241,1010.956 414.782,1010.456 425.552,1009.662 433.816,1008.626 439.01,1007.42 440.782,1006.126 440.782,970.126 439.01,968.832 433.816,967.626 425.552,966.591 414.782,965.796 402.241,965.297 388.782,965.126 375.324,965.297 362.782,965.796 352.013,966.591 343.749,967.626 338.554,968.832 336.782,970.126 336.782,970.126" class="chartlet-diagram-shadow"/><polyline points="336.782,967.626 336.782,1003.626 338.554,1004.92 343.749,1006.126 352.013,1007.162 362.782,1007.956 375.324,1008.456 388.782,1008.626 402.241,1008.456 414.782,1007.956 425.552,1007.162 433.816,1006.126 439.01,1004.92 440.782,1003.626 440.782,967.626 439.01,966.332 433.816,965.126 425.552,964.091 414.782,963.296 402.241,962.797 388.782,962.626 375.324,962.797 362.782,963.296 352.013,964.091 343.749,965.126 338.554,966.332 336.782,967.626 336.782,967.626" class="chartlet-flow-node chartlet-role-teal"><title>Ledger</title></polyline><polyline points="336.782,967.626 338.554,968.92 343.749,970.126 352.013,971.162 362.782,971.956 375.324,972.456 388.782,972.626 402.241,972.456 414.782,971.956 425.552,971.162 433.816,970.126 439.01,968.92 440.782,967.626" class="chartlet-diagram-rim"/><text x="388.782" y="993.126" text-anchor="middle" class="chartlet-flow-label">Ledger</text></g><g class="chartlet-f chartlet-n-6 chartlet-f-3 chartlet-f-6"><rect x="427.997" y="1070.5" width="113.57" height="36" class="chartlet-diagram-shadow"/><rect x="427.997" y="1068" width="113.57" height="36" class="chartlet-flow-node chartlet-flow-external chartlet-role-gray"><title>Card provider</title></rect><text x="484.782" y="1090.5" text-anchor="middle" class="chartlet-flow-label">Card provider</text></g><g class="chartlet-f chartlet-n-7 chartlet-f-4 chartlet-f-7"><polyline points="206.882,827.409 375.802,827.409 385.802,837.409 385.802,888.409 206.882,888.409 206.882,827.409" class="chartlet-flow-node chartlet-role-amber"><title>Card numbers never leave the vault; everything else sees tokens.</title></polyline><polyline points="375.802,827.409 375.802,837.409 385.802,837.409" class="chartlet-flow-node chartlet-role-amber"/><text x="218.882" y="846.409" text-anchor="start" class="chartlet-diagram-chip-text">Card numbers never leave</text><text x="218.882" y="861.409" text-anchor="start" class="chartlet-diagram-chip-text">the vault; everything else</text><text x="218.882" y="876.409" text-anchor="start" class="chartlet-diagram-chip-text">sees tokens.</text></g><g class="chartlet-f chartlet-n-8 chartlet-f-8"><polyline points="597.398,495.852 783.118,495.852 793.118,505.852 793.118,541.852 597.398,541.852 597.398,495.852" class="chartlet-flow-node chartlet-role-amber"><title>Audited once a year; changes need a second reviewer.</title></polyline><polyline points="783.118,495.852 783.118,505.852 793.118,505.852" class="chartlet-flow-node chartlet-role-amber"/><text x="609.398" y="514.852" text-anchor="start" class="chartlet-diagram-chip-text">Audited once a year; changes</text><text x="609.398" y="529.852" text-anchor="start" class="chartlet-diagram-chip-text">need a second reviewer.</text></g><polyline points="24,1120 185.6,1120 195.6,1130 195.6,1181 24,1181 24,1120" class="chartlet-flow-node chartlet-role-amber"><title>Figures and names are illustrative; the diagram shows the target state.</title></polyline><polyline points="185.6,1120 185.6,1130 195.6,1130" class="chartlet-flow-node chartlet-role-amber"/><text x="36" y="1139" text-anchor="start" class="chartlet-diagram-chip-text">Figures and names are</text><text x="36" y="1154" text-anchor="start" class="chartlet-diagram-chip-text">illustrative; the diagram</text><text x="36" y="1169" text-anchor="start" class="chartlet-diagram-chip-text">shows the target state.</text></svg><label class="chartlet-hotspot" id="chartlet-d5472d7361b74f66-hs-0" for="chartlet-d5472d7361b74f66-focus-0"></label><label class="chartlet-hotspot" id="chartlet-d5472d7361b74f66-hs-1" for="chartlet-d5472d7361b74f66-focus-1"></label><label class="chartlet-hotspot" id="chartlet-d5472d7361b74f66-hs-2" for="chartlet-d5472d7361b74f66-focus-2"></label><label class="chartlet-hotspot" id="chartlet-d5472d7361b74f66-hs-3" for="chartlet-d5472d7361b74f66-focus-3"></label><label class="chartlet-hotspot" id="chartlet-d5472d7361b74f66-hs-4" for="chartlet-d5472d7361b74f66-focus-4"></label><label class="chartlet-hotspot" id="chartlet-d5472d7361b74f66-hs-5" for="chartlet-d5472d7361b74f66-focus-5"></label><label class="chartlet-hotspot" id="chartlet-d5472d7361b74f66-hs-6" for="chartlet-d5472d7361b74f66-focus-6"></label><label class="chartlet-hotspot" id="chartlet-d5472d7361b74f66-hs-7" for="chartlet-d5472d7361b74f66-focus-7"></label><label class="chartlet-hotspot" id="chartlet-d5472d7361b74f66-hs-8" for="chartlet-d5472d7361b74f66-focus-8"></label></div></div><div class="chartlet-variant-mobile"><div class="chartlet-stage"><svg xmlns="http://www.w3.org/2000/svg" width="440" height="1322" viewBox="0 0 440 1322" id="chartlet-d5472d7361b74f66-m" role="img" aria-labelledby="chartlet-d5472d7361b74f66-m-title chartlet-d5472d7361b74f66-m-description" class="chartlet-root"><title id="chartlet-d5472d7361b74f66-m-title">Payments and what to know about them</title><desc id="chartlet-d5472d7361b74f66-m-description">Architecture diagram with 7 components and 6 connections in 2 boundaries. Cloud account: API gateway, Ledger, Card data zone. Card data zone (in Cloud account): Payment service, Token vault. Main path: Shopper → Checkout → API gateway → Payment service → Card provider. Most connected: Payment service (4 connections). Nothing leads into Shopper. Nothing leads out of Token vault, Ledger and Card provider. Bottleneck: API gateway; without it the diagram falls apart. Shopper (person): connects to Checkout (pays). Checkout (frontend): connects to API gateway (via HTTPS). API gateway (service): connects to Payment service (charge). Payment service (service): connects to Token vault (tokenizes), Card provider (authorizes, via HTTPS) and Ledger (records, via SQL). Token vault (security): no outgoing connection. Ledger (database): no outgoing connection. Card provider (external system): no outgoing connection. Note on Token vault: Card numbers never leave the vault; everything else sees tokens. Note on Card data zone: Audited once a year; changes need a second reviewer. Note: Figures and names are illustrative; the diagram shows the target state.</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-d5472d7361b74f66-m .chartlet-title{font-size:22px;font-weight:650;fill:var(--chartlet-text)}#chartlet-d5472d7361b74f66-m .chartlet-label,#chartlet-d5472d7361b74f66-m .chartlet-tick,#chartlet-d5472d7361b74f66-m .chartlet-value,#chartlet-d5472d7361b74f66-m .chartlet-value-inverse,#chartlet-d5472d7361b74f66-m .chartlet-axis-title{font-size:12px;fill:var(--chartlet-muted)}#chartlet-d5472d7361b74f66-m .chartlet-value,#chartlet-d5472d7361b74f66-m .chartlet-value-inverse{font-weight:600}#chartlet-d5472d7361b74f66-m .chartlet-value{fill:var(--chartlet-text)}#chartlet-d5472d7361b74f66-m .chartlet-value-inverse{fill:var(--chartlet-background)}#chartlet-d5472d7361b74f66-m .chartlet-axis-title{font-weight:600}#chartlet-d5472d7361b74f66-m .chartlet-grid{stroke:var(--chartlet-grid);stroke-width:1}#chartlet-d5472d7361b74f66-m .chartlet-zero{stroke:var(--chartlet-zero);stroke-width:1.5}#chartlet-d5472d7361b74f66-m .chartlet-bar,#chartlet-d5472d7361b74f66-m .chartlet-point{fill:var(--chartlet-accent)}#chartlet-d5472d7361b74f66-m .chartlet-line{fill:none;stroke:var(--chartlet-accent);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}#chartlet-d5472d7361b74f66-m .chartlet-background{fill:var(--chartlet-background)}#chartlet-d5472d7361b74f66-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-d5472d7361b74f66-m .chartlet-role-blue{fill:var(--chartlet-role-blue-fill);stroke:var(--chartlet-role-blue)}#chartlet-d5472d7361b74f66-m .chartlet-role-green{fill:var(--chartlet-role-green-fill);stroke:var(--chartlet-role-green)}#chartlet-d5472d7361b74f66-m .chartlet-role-amber{fill:var(--chartlet-role-amber-fill);stroke:var(--chartlet-role-amber)}#chartlet-d5472d7361b74f66-m .chartlet-role-teal{fill:var(--chartlet-role-teal-fill);stroke:var(--chartlet-role-teal)}#chartlet-d5472d7361b74f66-m .chartlet-role-violet{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet)}#chartlet-d5472d7361b74f66-m .chartlet-role-gray{fill:var(--chartlet-role-gray-fill);stroke:var(--chartlet-role-gray)}#chartlet-d5472d7361b74f66-m .chartlet-role-red{fill:var(--chartlet-role-red-fill);stroke:var(--chartlet-role-red)}#chartlet-d5472d7361b74f66-m .chartlet-diagram-rim{fill:none;stroke:var(--chartlet-role-teal);stroke-width:1.5}#chartlet-d5472d7361b74f66-m .chartlet-diagram-shadow{fill:var(--chartlet-shadow);stroke:none;rx:7px}#chartlet-d5472d7361b74f66-m .chartlet-diagram-chip{fill:var(--chartlet-background);stroke:var(--chartlet-grid);stroke-width:1;rx:4px}#chartlet-d5472d7361b74f66-m .chartlet-diagram-chip-text{font-size:12px;fill:var(--chartlet-text)}#chartlet-d5472d7361b74f66-m .chartlet-diagram-badge{fill:var(--chartlet-accent);stroke:var(--chartlet-background);stroke-width:2}#chartlet-d5472d7361b74f66-m .chartlet-diagram-badge-text{font-size:10px;font-weight:700;fill:var(--chartlet-background)}#chartlet-d5472d7361b74f66-m .chartlet-flow-node{stroke-width:1.5;stroke-linejoin:round;rx:7px}#chartlet-d5472d7361b74f66-m .chartlet-flow-start{stroke-width:2}#chartlet-d5472d7361b74f66-m .chartlet-flow-end{stroke-width:3}#chartlet-d5472d7361b74f66-m .chartlet-flow-external{stroke-dasharray:5 3}#chartlet-d5472d7361b74f66-m .chartlet-flow-inner{stroke:var(--chartlet-role-blue);stroke-width:1}#chartlet-d5472d7361b74f66-m .chartlet-flow-label{font-size:13px;font-weight:600;fill:var(--chartlet-text)}#chartlet-d5472d7361b74f66-m .chartlet-flow-sublabel{font-size:11px;fill:var(--chartlet-muted)}#chartlet-d5472d7361b74f66-m .chartlet-flow-edge{fill:none;stroke:var(--chartlet-zero);stroke-width:1.4;stroke-linejoin:round}#chartlet-d5472d7361b74f66-m .chartlet-flow-dashed{stroke-dasharray:5 4}#chartlet-d5472d7361b74f66-m .chartlet-flow-dotted{stroke-dasharray:1 4;stroke-linecap:round}#chartlet-d5472d7361b74f66-m .chartlet-flow-main{stroke:var(--chartlet-accent);stroke-width:2.2}#chartlet-d5472d7361b74f66-m .chartlet-flow-head{fill:var(--chartlet-zero);stroke:var(--chartlet-zero);stroke-width:1;stroke-linejoin:round}#chartlet-d5472d7361b74f66-m .chartlet-flow-main-head{fill:var(--chartlet-accent);stroke:var(--chartlet-accent)}#chartlet-d5472d7361b74f66-m .chartlet-flow-lane{fill:var(--chartlet-lane);stroke:var(--chartlet-grid);stroke-width:1}#chartlet-d5472d7361b74f66-m .chartlet-flow-lane-alt{fill:var(--chartlet-background)}#chartlet-d5472d7361b74f66-m .chartlet-flow-lane-head{fill:var(--chartlet-lane-head);stroke:none}#chartlet-d5472d7361b74f66-m .chartlet-flow-lane-label{font-size:11px;font-weight:650;fill:var(--chartlet-muted);letter-spacing:.04em}#chartlet-d5472d7361b74f66-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-d5472d7361b74f66-m .chartlet-flow-group-label{font-size:11px;font-weight:600;fill:var(--chartlet-muted)}#chartlet-d5472d7361b74f66-m .chartlet-arch-head{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet);stroke-width:1.5}#chartlet-d5472d7361b74f66-m .chartlet-arch-dot{fill:var(--chartlet-role-blue);stroke:none}</style><rect x="17.717" y="313.561" width="404.565" height="784.094" class="chartlet-flow-group"/><text x="25.717" y="326.561" text-anchor="start" class="chartlet-flow-group-label">Cloud account</text><rect x="29.717" y="485.162" width="380.565" height="488.561" class="chartlet-flow-group"/><text x="37.717" y="498.162" text-anchor="start" class="chartlet-flow-group-label">Card data zone</text><g class="chartlet-f chartlet-f-0 chartlet-f-1"><polyline points="222.079,66 222.079,149.959" class="chartlet-flow-edge chartlet-flow-main"><title>Shopper → Checkout: pays</title></polyline><polyline points="218.579,149.959 222.079,157.959 225.579,149.959 218.579,149.959" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><polyline points="222.079,205.959 222.079,333.561" class="chartlet-flow-edge chartlet-flow-main"><title>Checkout → API gateway: [HTTPS]</title></polyline><polyline points="218.579,333.561 222.079,341.561 225.579,333.561 218.579,333.561" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-2 chartlet-f-3"><polyline points="222.079,377.561 222.079,517.162" class="chartlet-flow-edge chartlet-flow-main"><title>API gateway → Payment service: charge</title></polyline><polyline points="218.579,517.162 222.079,525.162 225.579,517.162 218.579,517.162" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-3 chartlet-f-4"><polyline points="189.674,577.162 189.674,720.087 99.677,720.087 99.677,765.081" class="chartlet-flow-edge"><title>Payment service → Token vault: tokenizes</title></polyline><polyline points="96.177,765.081 99.677,773.081 103.177,765.081 96.177,765.081" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-3 chartlet-f-6"><polyline points="222.079,577.162 222.079,1140" class="chartlet-flow-edge chartlet-flow-main"><title>Payment service → Card provider: authorizes [HTTPS]</title></polyline><polyline points="218.579,1140 222.079,1148 225.579,1140 218.579,1140" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-3 chartlet-f-5"><polyline points="205.877,577.162 205.877,735.674 194.079,735.674 194.079,1002.247 159.524,1002.247 159.524,1031.655" class="chartlet-flow-edge"><title>Payment service → Ledger: records [SQL]</title></polyline><polyline points="156.024,1031.655 159.524,1039.655 163.024,1031.655 156.024,1031.655" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-4 chartlet-f-7"><polyline points="99.677,827.081 99.677,870.723" class="chartlet-flow-edge chartlet-flow-dotted"/></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"></g><g class="chartlet-f chartlet-n-3 chartlet-f-2 chartlet-f-3 chartlet-f-4 chartlet-f-5 chartlet-f-6"></g><g class="chartlet-f chartlet-n-4 chartlet-f-3 chartlet-f-4 chartlet-f-7"></g><g class="chartlet-f chartlet-n-5 chartlet-f-3 chartlet-f-5"></g><g class="chartlet-f chartlet-n-6 chartlet-f-3 chartlet-f-6"></g><g class="chartlet-f chartlet-n-7 chartlet-f-4 chartlet-f-7"></g><g class="chartlet-f chartlet-n-8 chartlet-f-8"></g><g class="chartlet-f chartlet-f-0 chartlet-f-1"><rect x="226.079" y="71" width="36.88" height="21" class="chartlet-diagram-chip"/><text x="231.079" y="85" text-anchor="start" class="chartlet-diagram-chip-text">pays</text></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><rect x="226.079" y="210.959" width="63.64" height="21" class="chartlet-diagram-chip"/><text x="231.079" y="224.959" text-anchor="start" class="chartlet-diagram-chip-text">[HTTPS]</text></g><g class="chartlet-f chartlet-f-2 chartlet-f-3"><rect x="226.079" y="382.561" width="50.32" height="21" class="chartlet-diagram-chip"/><text x="231.079" y="396.561" text-anchor="start" class="chartlet-diagram-chip-text">charge</text></g><g class="chartlet-f chartlet-f-3 chartlet-f-4"><rect x="118.314" y="582.162" width="67.36" height="21" class="chartlet-diagram-chip"/><text x="180.674" y="596.162" text-anchor="end" class="chartlet-diagram-chip-text">tokenizes</text></g><g class="chartlet-f chartlet-f-3 chartlet-f-6"><rect x="226.079" y="592.162" width="74.08" height="36" class="chartlet-diagram-chip"/><text x="231.079" y="606.162" text-anchor="start" class="chartlet-diagram-chip-text">authorizes</text><text x="231.079" y="621.162" text-anchor="start" class="chartlet-diagram-chip-text">[HTTPS]</text></g><g class="chartlet-f chartlet-f-3 chartlet-f-5"><rect x="148.282" y="1100.655" width="57.04" height="36" class="chartlet-diagram-chip"/><text x="176.802" y="1114.655" text-anchor="middle" class="chartlet-diagram-chip-text">records</text><text x="176.802" y="1129.655" text-anchor="middle" class="chartlet-diagram-chip-text">[SQL]</text></g><g class="chartlet-f chartlet-n-0 chartlet-f-0 chartlet-f-1"><rect x="183.884" y="14.5" width="76.39" height="54" class="chartlet-diagram-shadow"/><rect x="183.884" y="12" width="76.39" height="54" class="chartlet-flow-node chartlet-role-violet"><title>Shopper</title></rect><circle cx="222.079" cy="23" r="6" class="chartlet-arch-head"/><text x="222.079" y="51.5" text-anchor="middle" class="chartlet-flow-label">Shopper</text></g><g class="chartlet-f chartlet-n-1 chartlet-f-0 chartlet-f-1 chartlet-f-2"><rect x="180.244" y="160.459" width="83.67" height="48" class="chartlet-diagram-shadow"/><rect x="180.244" y="157.959" width="83.67" height="48" class="chartlet-flow-node chartlet-role-blue"><title>Checkout</title></rect><line x1="180.244" y1="169.959" x2="263.914" y2="169.959" class="chartlet-flow-inner"/><circle cx="188.244" cy="163.959" r="1.8" class="chartlet-arch-dot"/><circle cx="194.244" cy="163.959" r="1.8" class="chartlet-arch-dot"/><circle cx="200.244" cy="163.959" r="1.8" class="chartlet-arch-dot"/><text x="222.079" y="192.459" text-anchor="middle" class="chartlet-flow-label">Checkout</text></g><g class="chartlet-f chartlet-n-2 chartlet-f-1 chartlet-f-2 chartlet-f-3"><rect x="169.649" y="344.061" width="104.86" height="36" class="chartlet-diagram-shadow"/><rect x="169.649" y="341.561" width="104.86" height="36" class="chartlet-flow-node chartlet-role-blue"><title>API gateway</title></rect><text x="222.079" y="364.061" text-anchor="middle" class="chartlet-flow-label">API gateway</text></g><g class="chartlet-f chartlet-n-3 chartlet-f-2 chartlet-f-3 chartlet-f-4 chartlet-f-5 chartlet-f-6"><rect x="181.674" y="527.662" width="80.81" height="52" class="chartlet-diagram-shadow"/><rect x="181.674" y="525.162" width="80.81" height="52" class="chartlet-flow-node chartlet-role-blue"><title>Payment service</title></rect><text x="222.079" y="547.662" text-anchor="middle" class="chartlet-flow-label">Payment</text><text x="222.079" y="563.662" text-anchor="middle" class="chartlet-flow-label">service</text></g><g class="chartlet-f chartlet-n-4 chartlet-f-3 chartlet-f-4 chartlet-f-7"><polyline points="50.172,775.581 149.182,775.581 149.182,807.981 99.677,829.581 50.172,807.981 50.172,775.581" class="chartlet-diagram-shadow"/><polyline points="50.172,773.081 149.182,773.081 149.182,805.481 99.677,827.081 50.172,805.481 50.172,773.081" class="chartlet-flow-node chartlet-role-red"><title>Token vault</title></polyline><text x="99.677" y="798.581" text-anchor="middle" class="chartlet-flow-label">Token vault</text></g><g class="chartlet-f chartlet-n-5 chartlet-f-3 chartlet-f-5"><polyline points="124.969,1047.155 124.969,1083.155 126.147,1084.449 129.599,1085.655 135.09,1086.69 142.247,1087.485 150.581,1087.984 159.524,1088.155 168.468,1087.984 176.802,1087.485 183.958,1086.69 189.45,1085.655 192.902,1084.449 194.079,1083.155 194.079,1047.155 192.902,1045.86 189.45,1044.655 183.958,1043.619 176.802,1042.824 168.468,1042.325 159.524,1042.155 150.581,1042.325 142.247,1042.824 135.09,1043.619 129.599,1044.655 126.147,1045.86 124.969,1047.155 124.969,1047.155" class="chartlet-diagram-shadow"/><polyline points="124.969,1044.655 124.969,1080.655 126.147,1081.949 129.599,1083.155 135.09,1084.19 142.247,1084.985 150.581,1085.484 159.524,1085.655 168.468,1085.484 176.802,1084.985 183.958,1084.19 189.45,1083.155 192.902,1081.949 194.079,1080.655 194.079,1044.655 192.902,1043.36 189.45,1042.155 183.958,1041.119 176.802,1040.324 168.468,1039.825 159.524,1039.655 150.581,1039.825 142.247,1040.324 135.09,1041.119 129.599,1042.155 126.147,1043.36 124.969,1044.655 124.969,1044.655" class="chartlet-flow-node chartlet-role-teal"><title>Ledger</title></polyline><polyline points="124.969,1044.655 126.147,1045.949 129.599,1047.155 135.09,1048.19 142.247,1048.985 150.581,1049.484 159.524,1049.655 168.468,1049.484 176.802,1048.985 183.958,1048.19 189.45,1047.155 192.902,1045.949 194.079,1044.655" class="chartlet-diagram-rim"/><text x="159.524" y="1070.155" text-anchor="middle" class="chartlet-flow-label">Ledger</text></g><g class="chartlet-f chartlet-n-6 chartlet-f-3 chartlet-f-6"><rect x="165.294" y="1150.5" width="113.57" height="36" class="chartlet-diagram-shadow"/><rect x="165.294" y="1148" width="113.57" height="36" class="chartlet-flow-node chartlet-flow-external chartlet-role-gray"><title>Card provider</title></rect><text x="222.079" y="1170.5" text-anchor="middle" class="chartlet-flow-label">Card provider</text></g><g class="chartlet-f chartlet-n-7 chartlet-f-4 chartlet-f-7"><polyline points="41.717,870.723 147.637,870.723 157.637,880.723 157.637,961.723 41.717,961.723 41.717,870.723" class="chartlet-flow-node chartlet-role-amber"><title>Card numbers never leave the vault; everything else sees tokens.</title></polyline><polyline points="147.637,870.723 147.637,880.723 157.637,880.723" class="chartlet-flow-node chartlet-role-amber"/><text x="53.717" y="889.723" text-anchor="start" class="chartlet-diagram-chip-text">Card numbers</text><text x="53.717" y="904.723" text-anchor="start" class="chartlet-diagram-chip-text">never leave the</text><text x="53.717" y="919.723" text-anchor="start" class="chartlet-diagram-chip-text">vault;</text><text x="53.717" y="934.723" text-anchor="start" class="chartlet-diagram-chip-text">everything else</text><text x="53.717" y="949.723" text-anchor="start" class="chartlet-diagram-chip-text">sees tokens.</text></g><g class="chartlet-f chartlet-n-8 chartlet-f-8"><polyline points="287.763,513.162 388.283,513.162 398.283,523.162 398.283,589.162 287.763,589.162 287.763,513.162" class="chartlet-flow-node chartlet-role-amber"><title>Audited once a year; changes need a second reviewer.</title></polyline><polyline points="388.283,513.162 388.283,523.162 398.283,523.162" class="chartlet-flow-node chartlet-role-amber"/><text x="299.763" y="532.162" text-anchor="start" class="chartlet-diagram-chip-text">Audited once a</text><text x="299.763" y="547.162" text-anchor="start" class="chartlet-diagram-chip-text">year; changes</text><text x="299.763" y="562.162" text-anchor="start" class="chartlet-diagram-chip-text">need a second</text><text x="299.763" y="577.162" text-anchor="start" class="chartlet-diagram-chip-text">reviewer.</text></g><polyline points="12,1200 121.76,1200 131.76,1210 131.76,1306 12,1306 12,1200" class="chartlet-flow-node chartlet-role-amber"><title>Figures and names are illustrative; the diagram shows the target state.</title></polyline><polyline points="121.76,1200 121.76,1210 131.76,1210" class="chartlet-flow-node chartlet-role-amber"/><text x="24" y="1219" text-anchor="start" class="chartlet-diagram-chip-text">Figures and</text><text x="24" y="1234" text-anchor="start" class="chartlet-diagram-chip-text">names are</text><text x="24" y="1249" text-anchor="start" class="chartlet-diagram-chip-text">illustrative; the</text><text x="24" y="1264" text-anchor="start" class="chartlet-diagram-chip-text">diagram shows</text><text x="24" y="1279" text-anchor="start" class="chartlet-diagram-chip-text">the target</text><text x="24" y="1294" text-anchor="start" class="chartlet-diagram-chip-text">state.</text></svg><label class="chartlet-hotspot" id="chartlet-d5472d7361b74f66-m-hs-0" for="chartlet-d5472d7361b74f66-focus-0"></label><label class="chartlet-hotspot" id="chartlet-d5472d7361b74f66-m-hs-1" for="chartlet-d5472d7361b74f66-focus-1"></label><label class="chartlet-hotspot" id="chartlet-d5472d7361b74f66-m-hs-2" for="chartlet-d5472d7361b74f66-focus-2"></label><label class="chartlet-hotspot" id="chartlet-d5472d7361b74f66-m-hs-3" for="chartlet-d5472d7361b74f66-focus-3"></label><label class="chartlet-hotspot" id="chartlet-d5472d7361b74f66-m-hs-4" for="chartlet-d5472d7361b74f66-focus-4"></label><label class="chartlet-hotspot" id="chartlet-d5472d7361b74f66-m-hs-5" for="chartlet-d5472d7361b74f66-focus-5"></label><label class="chartlet-hotspot" id="chartlet-d5472d7361b74f66-m-hs-6" for="chartlet-d5472d7361b74f66-focus-6"></label><label class="chartlet-hotspot" id="chartlet-d5472d7361b74f66-m-hs-7" for="chartlet-d5472d7361b74f66-focus-7"></label><label class="chartlet-hotspot" id="chartlet-d5472d7361b74f66-m-hs-8" for="chartlet-d5472d7361b74f66-focus-8"></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 Payments and what to know about them. Note on Card data zone: Audited once a year; changes need a second reviewer. Note: Figures and names are illustrative; the diagram shows the target state.</caption><thead><tr><th scope="col">Component</th><th scope="col">Kind</th><th scope="col">Boundary</th><th scope="col">Connects to</th><th scope="col">Notes</th></tr></thead><tbody><tr><th scope="row">Shopper</th><td>person</td><td></td><td>Checkout (pays)</td><td></td></tr><tr><th scope="row">Checkout</th><td>frontend</td><td></td><td>API gateway (via HTTPS)</td><td></td></tr><tr><th scope="row">API gateway</th><td>service</td><td>Cloud account</td><td>Payment service (charge)</td><td></td></tr><tr><th scope="row">Payment service</th><td>service</td><td>Cloud account › Card data zone</td><td>Token vault (tokenizes), Card provider (authorizes, via HTTPS), Ledger (records, via SQL)</td><td></td></tr><tr><th scope="row">Token vault</th><td>security</td><td>Cloud account › Card data zone</td><td></td><td>Card numbers never leave the vault; everything else sees tokens.</td></tr><tr><th scope="row">Ledger</th><td>database</td><td>Cloud account</td><td></td><td></td></tr><tr><th scope="row">Card provider</th><td>external system</td><td></td><td></td><td></td></tr></tbody></table></details></figure></div>