chartlet 0.21.0

Compile structured data into deterministic, accessible static charts
Documentation
1
<div class="chartlet-wrapper"><style>.chartlet-stage{position:relative;display:inline-block;max-width:100%;vertical-align:top}.chartlet-stage>svg{display:block}.chartlet-hotspot{position:absolute;border-radius:8px;cursor:pointer}.chartlet-focus{margin:0 0 12px 0;font-size:13px}.chartlet-focus summary{cursor:pointer;min-height:24px}.chartlet-focus fieldset{border:none;padding:0;margin:4px 0 0 0}.chartlet-focus label{display:inline-flex;align-items:center;min-height:44px;margin-right:14px;cursor:pointer;white-space:nowrap}.chartlet-focus input{margin-right:4px}.chartlet-focus input:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.chartlet-wrapper:has(.chartlet-focus-node:checked) #chartlet-6dde3ab5de8f2092 .chartlet-f{opacity:.18}#chartlet-6dde3ab5de8f2092-hs-0{left:43.807%;top:5.263%;width:12.387%;height:9.737%}#chartlet-6dde3ab5de8f2092-hs-1{left:43.133%;top:26.663%;width:13.733%;height:13.289%}#chartlet-6dde3ab5de8f2092-hs-2{left:19.107%;top:59.649%;width:13.88%;height:13.289%}#chartlet-6dde3ab5de8f2092-hs-3{left:42.027%;top:61.426%;width:12.187%;height:9.737%}#chartlet-6dde3ab5de8f2092-hs-4{left:65.867%;top:61.426%;width:15.027%;height:9.737%}#chartlet-6dde3ab5de8f2092-hs-5{left:43.787%;top:88.158%;width:12.427%;height:9.737%}.chartlet-wrapper:has(#chartlet-6dde3ab5de8f2092-focus-0:checked) #chartlet-6dde3ab5de8f2092 .chartlet-f-0{opacity:1}.chartlet-wrapper:has(#chartlet-6dde3ab5de8f2092-focus-0:checked) #chartlet-6dde3ab5de8f2092 .chartlet-n-0 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-6dde3ab5de8f2092-focus-0:checked) #chartlet-6dde3ab5de8f2092 .chartlet-n-0 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-6dde3ab5de8f2092-focus-1:checked) #chartlet-6dde3ab5de8f2092 .chartlet-f-1{opacity:1}.chartlet-wrapper:has(#chartlet-6dde3ab5de8f2092-focus-1:checked) #chartlet-6dde3ab5de8f2092 .chartlet-n-1 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-6dde3ab5de8f2092-focus-1:checked) #chartlet-6dde3ab5de8f2092 .chartlet-n-1 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-6dde3ab5de8f2092-focus-2:checked) #chartlet-6dde3ab5de8f2092 .chartlet-f-2{opacity:1}.chartlet-wrapper:has(#chartlet-6dde3ab5de8f2092-focus-2:checked) #chartlet-6dde3ab5de8f2092 .chartlet-n-2 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-6dde3ab5de8f2092-focus-2:checked) #chartlet-6dde3ab5de8f2092 .chartlet-n-2 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-6dde3ab5de8f2092-focus-3:checked) #chartlet-6dde3ab5de8f2092 .chartlet-f-3{opacity:1}.chartlet-wrapper:has(#chartlet-6dde3ab5de8f2092-focus-3:checked) #chartlet-6dde3ab5de8f2092 .chartlet-n-3 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-6dde3ab5de8f2092-focus-3:checked) #chartlet-6dde3ab5de8f2092 .chartlet-n-3 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-6dde3ab5de8f2092-focus-4:checked) #chartlet-6dde3ab5de8f2092 .chartlet-f-4{opacity:1}.chartlet-wrapper:has(#chartlet-6dde3ab5de8f2092-focus-4:checked) #chartlet-6dde3ab5de8f2092 .chartlet-n-4 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-6dde3ab5de8f2092-focus-4:checked) #chartlet-6dde3ab5de8f2092 .chartlet-n-4 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-6dde3ab5de8f2092-focus-5:checked) #chartlet-6dde3ab5de8f2092 .chartlet-f-5{opacity:1}.chartlet-wrapper:has(#chartlet-6dde3ab5de8f2092-focus-5:checked) #chartlet-6dde3ab5de8f2092 .chartlet-n-5 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-6dde3ab5de8f2092-focus-5:checked) #chartlet-6dde3ab5de8f2092 .chartlet-n-5 .chartlet-seq-box{stroke-width:3}</style><details class="chartlet-focus"><summary>Focus</summary><fieldset><label><input type="radio" name="chartlet-6dde3ab5de8f2092-focus" checked> Show all</label><label><input type="radio" name="chartlet-6dde3ab5de8f2092-focus" class="chartlet-focus-node" id="chartlet-6dde3ab5de8f2092-focus-0"> Customer</label><label><input type="radio" name="chartlet-6dde3ab5de8f2092-focus" class="chartlet-focus-node" id="chartlet-6dde3ab5de8f2092-focus-1"> Order</label><label><input type="radio" name="chartlet-6dde3ab5de8f2092-focus" class="chartlet-focus-node" id="chartlet-6dde3ab5de8f2092-focus-2"> Invoice</label><label><input type="radio" name="chartlet-6dde3ab5de8f2092-focus" class="chartlet-focus-node" id="chartlet-6dde3ab5de8f2092-focus-3"> InvoiceLine</label><label><input type="radio" name="chartlet-6dde3ab5de8f2092-focus" class="chartlet-focus-node" id="chartlet-6dde3ab5de8f2092-focus-4"> TaxRate</label><label><input type="radio" name="chartlet-6dde3ab5de8f2092-focus" class="chartlet-focus-node" id="chartlet-6dde3ab5de8f2092-focus-5"> Reminder</label></fieldset></details><figure class="chartlet-figure" data-viz="chart"><figcaption>Orders and their invoices</figcaption><div class="chartlet-stage"><svg xmlns="http://www.w3.org/2000/svg" width="900" height="760" viewBox="0 0 900 760" id="chartlet-6dde3ab5de8f2092" role="img" aria-labelledby="chartlet-6dde3ab5de8f2092-title chartlet-6dde3ab5de8f2092-description" class="chartlet-root"><title id="chartlet-6dde3ab5de8f2092-title">Orders and their invoices</title><desc id="chartlet-6dde3ab5de8f2092-description">Class diagram with 6 classes and 5 relations in 2 packages. Sales: Customer, Order. Billing: Invoice, InvoiceLine, TaxRate. Most connected: Invoice (3 connections). Bottleneck: Invoice; without it the diagram falls apart. Customer: 2 attributes, 0 methods. Customer is associated with Order (1 : 0..*) [places]. Order: 2 attributes, 1 method. Order is associated with Invoice (1 : 1..*) [billed as]. Invoice: 2 attributes, 1 method. Invoice is composed of InvoiceLine (1 : 1..*) [lists]; is associated with Reminder (1 : 0..3) [dunned by]. InvoiceLine: 2 attributes, 0 methods. InvoiceLine is associated with TaxRate (* : 1) [taxed at]. TaxRate: 2 attributes, 0 methods. Reminder: 2 attributes, 0 methods.</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-6dde3ab5de8f2092 .chartlet-title{font-size:22px;font-weight:650;fill:var(--chartlet-text)}#chartlet-6dde3ab5de8f2092 .chartlet-label,#chartlet-6dde3ab5de8f2092 .chartlet-tick,#chartlet-6dde3ab5de8f2092 .chartlet-value,#chartlet-6dde3ab5de8f2092 .chartlet-value-inverse,#chartlet-6dde3ab5de8f2092 .chartlet-axis-title{font-size:12px;fill:var(--chartlet-muted)}#chartlet-6dde3ab5de8f2092 .chartlet-value,#chartlet-6dde3ab5de8f2092 .chartlet-value-inverse{font-weight:600}#chartlet-6dde3ab5de8f2092 .chartlet-value{fill:var(--chartlet-text)}#chartlet-6dde3ab5de8f2092 .chartlet-value-inverse{fill:var(--chartlet-background)}#chartlet-6dde3ab5de8f2092 .chartlet-axis-title{font-weight:600}#chartlet-6dde3ab5de8f2092 .chartlet-grid{stroke:var(--chartlet-grid);stroke-width:1}#chartlet-6dde3ab5de8f2092 .chartlet-zero{stroke:var(--chartlet-zero);stroke-width:1.5}#chartlet-6dde3ab5de8f2092 .chartlet-bar,#chartlet-6dde3ab5de8f2092 .chartlet-point{fill:var(--chartlet-accent)}#chartlet-6dde3ab5de8f2092 .chartlet-line{fill:none;stroke:var(--chartlet-accent);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}#chartlet-6dde3ab5de8f2092 .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-6dde3ab5de8f2092 .chartlet-role-blue{fill:var(--chartlet-role-blue-fill);stroke:var(--chartlet-role-blue)}#chartlet-6dde3ab5de8f2092 .chartlet-role-green{fill:var(--chartlet-role-green-fill);stroke:var(--chartlet-role-green)}#chartlet-6dde3ab5de8f2092 .chartlet-role-amber{fill:var(--chartlet-role-amber-fill);stroke:var(--chartlet-role-amber)}#chartlet-6dde3ab5de8f2092 .chartlet-role-teal{fill:var(--chartlet-role-teal-fill);stroke:var(--chartlet-role-teal)}#chartlet-6dde3ab5de8f2092 .chartlet-role-violet{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet)}#chartlet-6dde3ab5de8f2092 .chartlet-role-gray{fill:var(--chartlet-role-gray-fill);stroke:var(--chartlet-role-gray)}#chartlet-6dde3ab5de8f2092 .chartlet-role-red{fill:var(--chartlet-role-red-fill);stroke:var(--chartlet-role-red)}#chartlet-6dde3ab5de8f2092 .chartlet-diagram-rim{fill:none;stroke:var(--chartlet-role-teal);stroke-width:1.5}#chartlet-6dde3ab5de8f2092 .chartlet-diagram-shadow{fill:var(--chartlet-shadow);stroke:none;rx:7px}#chartlet-6dde3ab5de8f2092 .chartlet-diagram-chip{fill:var(--chartlet-background);stroke:var(--chartlet-grid);stroke-width:1;rx:4px}#chartlet-6dde3ab5de8f2092 .chartlet-diagram-chip-text{font-size:12px;fill:var(--chartlet-text)}#chartlet-6dde3ab5de8f2092 .chartlet-diagram-badge{fill:var(--chartlet-accent);stroke:var(--chartlet-background);stroke-width:2}#chartlet-6dde3ab5de8f2092 .chartlet-diagram-badge-text{font-size:10px;font-weight:700;fill:var(--chartlet-background)}#chartlet-6dde3ab5de8f2092 .chartlet-flow-node{stroke-width:1.5;stroke-linejoin:round;rx:7px}#chartlet-6dde3ab5de8f2092 .chartlet-flow-start{stroke-width:2}#chartlet-6dde3ab5de8f2092 .chartlet-flow-end{stroke-width:3}#chartlet-6dde3ab5de8f2092 .chartlet-flow-external{stroke-dasharray:5 3}#chartlet-6dde3ab5de8f2092 .chartlet-flow-inner{stroke:var(--chartlet-role-blue);stroke-width:1}#chartlet-6dde3ab5de8f2092 .chartlet-flow-label{font-size:13px;font-weight:600;fill:var(--chartlet-text)}#chartlet-6dde3ab5de8f2092 .chartlet-flow-sublabel{font-size:11px;fill:var(--chartlet-muted)}#chartlet-6dde3ab5de8f2092 .chartlet-flow-edge{fill:none;stroke:var(--chartlet-zero);stroke-width:1.4;stroke-linejoin:round}#chartlet-6dde3ab5de8f2092 .chartlet-flow-dashed{stroke-dasharray:5 4}#chartlet-6dde3ab5de8f2092 .chartlet-flow-dotted{stroke-dasharray:1 4;stroke-linecap:round}#chartlet-6dde3ab5de8f2092 .chartlet-flow-main{stroke:var(--chartlet-accent);stroke-width:2.2}#chartlet-6dde3ab5de8f2092 .chartlet-flow-head{fill:var(--chartlet-zero);stroke:var(--chartlet-zero);stroke-width:1;stroke-linejoin:round}#chartlet-6dde3ab5de8f2092 .chartlet-flow-main-head{fill:var(--chartlet-accent);stroke:var(--chartlet-accent)}#chartlet-6dde3ab5de8f2092 .chartlet-flow-lane{fill:var(--chartlet-lane);stroke:var(--chartlet-grid);stroke-width:1}#chartlet-6dde3ab5de8f2092 .chartlet-flow-lane-alt{fill:var(--chartlet-background)}#chartlet-6dde3ab5de8f2092 .chartlet-flow-lane-head{fill:var(--chartlet-lane-head);stroke:none}#chartlet-6dde3ab5de8f2092 .chartlet-flow-lane-label{font-size:11px;font-weight:650;fill:var(--chartlet-muted);letter-spacing:.04em}#chartlet-6dde3ab5de8f2092 .chartlet-flow-group{fill:var(--chartlet-accent);fill-opacity:.04;stroke:var(--chartlet-zero);stroke-width:1;stroke-dasharray:4 3;rx:10px}#chartlet-6dde3ab5de8f2092 .chartlet-flow-group-label{font-size:11px;font-weight:600;fill:var(--chartlet-muted)}#chartlet-6dde3ab5de8f2092 .chartlet-class-member{font-size:12px;fill:var(--chartlet-text)}#chartlet-6dde3ab5de8f2092 .chartlet-flow-card{font-size:11px;fill:var(--chartlet-muted)}#chartlet-6dde3ab5de8f2092 .chartlet-flow-hollow{fill:var(--chartlet-background)}#chartlet-6dde3ab5de8f2092 .chartlet-flow-solid{fill:var(--chartlet-zero)}#chartlet-6dde3ab5de8f2092 .chartlet-flow-open{fill:none;stroke:var(--chartlet-zero);stroke-width:1.4;stroke-linejoin:round}</style><rect x="376.2" y="12" width="147.6" height="303.641" class="chartlet-flow-group"/><text x="384.2" y="25" text-anchor="start" class="chartlet-flow-group-label">Sales</text><g class="chartlet-f chartlet-f-0 chartlet-f-1"><polyline points="450,114 450,202.641" class="chartlet-flow-edge"><title>Customer → Order: places</title></polyline><text x="438" y="198.641" text-anchor="end" class="chartlet-flow-card">0..*</text><text x="438" y="126" text-anchor="end" class="chartlet-flow-card">1</text></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><polyline points="450,303.641 450,389.278 234.42,389.278 234.42,425.335 234.42,453.335" class="chartlet-flow-edge"><title>Order → Invoice: billed as</title></polyline><text x="222.42" y="449.335" text-anchor="end" class="chartlet-flow-card">1..*</text><text x="438" y="315.641" text-anchor="end" class="chartlet-flow-card">1</text></g><g class="chartlet-f chartlet-f-2 chartlet-f-5"><polyline points="234.42,554.335 234.42,566.335 234.42,633.943 450,633.943 450,670" class="chartlet-flow-edge"><title>Invoice → Reminder: dunned by</title></polyline><text x="438" y="666" text-anchor="end" class="chartlet-flow-card">0..3</text><text x="222.42" y="566.335" text-anchor="end" class="chartlet-flow-card">1</text></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-5 chartlet-f-2 chartlet-f-5"></g><g class="chartlet-f chartlet-f-0 chartlet-f-1"><rect x="454" y="119" width="47.2" height="21" class="chartlet-diagram-chip"/><text x="459" y="133" text-anchor="start" class="chartlet-diagram-chip-text">places</text></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><rect x="454" y="318.641" width="58.24" height="21" class="chartlet-diagram-chip"/><text x="459" y="332.641" text-anchor="start" class="chartlet-diagram-chip-text">billed as</text></g><g class="chartlet-f chartlet-f-2 chartlet-f-5"><rect x="162.82" y="571.335" width="67.6" height="21" class="chartlet-diagram-chip"/><text x="225.42" y="585.335" text-anchor="end" class="chartlet-diagram-chip-text">dunned by</text></g><g class="chartlet-f chartlet-n-0 chartlet-f-0 chartlet-f-1"><rect x="394.26" y="42.5" width="111.48" height="74" class="chartlet-diagram-shadow"/><rect x="394.26" y="40" width="111.48" height="74" class="chartlet-flow-node chartlet-role-blue chartlet-class"><title>Customer</title></rect><text x="450" y="66" text-anchor="middle" class="chartlet-flow-label">Customer</text><line x1="394.26" y1="72" x2="505.74" y2="72" class="chartlet-flow-inner"/><text x="406.26" y="89" text-anchor="start" class="chartlet-class-member">+ id: Int</text><text x="406.26" y="104" text-anchor="start" class="chartlet-class-member">+ name: String</text></g><g class="chartlet-f chartlet-n-1 chartlet-f-0 chartlet-f-1 chartlet-f-2"><rect x="388.2" y="205.141" width="123.6" height="101" class="chartlet-diagram-shadow"/><rect x="388.2" y="202.641" width="123.6" height="101" class="chartlet-flow-node chartlet-role-blue chartlet-class"><title>Order</title></rect><text x="450" y="228.641" text-anchor="middle" class="chartlet-flow-label">Order</text><line x1="388.2" y1="234.641" x2="511.8" y2="234.641" class="chartlet-flow-inner"/><text x="400.2" y="251.641" text-anchor="start" class="chartlet-class-member">+ id: Int</text><text x="400.2" y="266.641" text-anchor="start" class="chartlet-class-member">+ placedAt: Date</text><line x1="388.2" y1="276.641" x2="511.8" y2="276.641" class="chartlet-flow-inner"/><text x="400.2" y="293.641" text-anchor="start" class="chartlet-class-member">+ total(): Money</text></g><rect x="159.96" y="425.335" width="580.08" height="141" class="chartlet-flow-group"/><text x="167.96" y="438.335" text-anchor="start" class="chartlet-flow-group-label">Billing</text><g class="chartlet-f chartlet-f-2 chartlet-f-3"><polyline points="312.88,503.835 378.24,503.835" class="chartlet-flow-edge"><title>Invoice → InvoiceLine: lists</title></polyline><text x="370.24" y="495.835" text-anchor="start" class="chartlet-flow-card">1..*</text><polyline points="296.88,503.835 304.88,498.835 312.88,503.835 304.88,508.835 296.88,503.835" class="chartlet-flow-head chartlet-flow-solid"/><text x="320.88" y="495.835" text-anchor="start" class="chartlet-flow-card">1</text></g><g class="chartlet-f chartlet-f-3 chartlet-f-4"><polyline points="487.92,503.835 592.8,503.835" class="chartlet-flow-edge"><title>InvoiceLine → TaxRate: taxed at</title></polyline><text x="584.8" y="495.835" text-anchor="start" class="chartlet-flow-card">1</text><text x="495.92" y="495.835" text-anchor="start" class="chartlet-flow-card">*</text></g><g class="chartlet-f chartlet-n-2 chartlet-f-1 chartlet-f-2 chartlet-f-3 chartlet-f-5"></g><g class="chartlet-f chartlet-n-3 chartlet-f-2 chartlet-f-3 chartlet-f-4"></g><g class="chartlet-f chartlet-n-4 chartlet-f-3 chartlet-f-4"></g><g class="chartlet-f chartlet-f-2 chartlet-f-3"><rect x="300.88" y="478.835" width="37.36" height="21" class="chartlet-diagram-chip"/><text x="305.88" y="492.835" text-anchor="start" class="chartlet-diagram-chip-text">lists</text></g><g class="chartlet-f chartlet-f-3 chartlet-f-4"><rect x="491.92" y="478.835" width="60.88" height="21" class="chartlet-diagram-chip"/><text x="496.92" y="492.835" text-anchor="start" class="chartlet-diagram-chip-text">taxed at</text></g><g class="chartlet-f chartlet-n-2 chartlet-f-1 chartlet-f-2 chartlet-f-3 chartlet-f-5"><rect x="171.96" y="455.835" width="124.92" height="101" class="chartlet-diagram-shadow"/><rect x="171.96" y="453.335" width="124.92" height="101" class="chartlet-flow-node chartlet-role-blue chartlet-class"><title>Invoice</title></rect><text x="234.42" y="479.335" text-anchor="middle" class="chartlet-flow-label">Invoice</text><line x1="171.96" y1="485.335" x2="296.88" y2="485.335" class="chartlet-flow-inner"/><text x="183.96" y="502.335" text-anchor="start" class="chartlet-class-member">+ number: String</text><text x="183.96" y="517.335" text-anchor="start" class="chartlet-class-member">+ issuedAt: Date</text><line x1="171.96" y1="527.335" x2="296.88" y2="527.335" class="chartlet-flow-inner"/><text x="183.96" y="544.335" text-anchor="start" class="chartlet-class-member">+ total(): Money</text></g><g class="chartlet-f chartlet-n-3 chartlet-f-2 chartlet-f-3 chartlet-f-4"><rect x="378.24" y="469.335" width="109.68" height="74" class="chartlet-diagram-shadow"/><rect x="378.24" y="466.835" width="109.68" height="74" class="chartlet-flow-node chartlet-role-blue chartlet-class"><title>InvoiceLine</title></rect><text x="433.08" y="492.835" text-anchor="middle" class="chartlet-flow-label">InvoiceLine</text><line x1="378.24" y1="498.835" x2="487.92" y2="498.835" class="chartlet-flow-inner"/><text x="390.24" y="515.835" text-anchor="start" class="chartlet-class-member">+ quantity: Int</text><text x="390.24" y="530.835" text-anchor="start" class="chartlet-class-member">+ net: Money</text></g><g class="chartlet-f chartlet-n-4 chartlet-f-3 chartlet-f-4"><rect x="592.8" y="469.335" width="135.24" height="74" class="chartlet-diagram-shadow"/><rect x="592.8" y="466.835" width="135.24" height="74" class="chartlet-flow-node chartlet-role-blue chartlet-class"><title>TaxRate</title></rect><text x="660.42" y="492.835" text-anchor="middle" class="chartlet-flow-label">TaxRate</text><line x1="592.8" y1="498.835" x2="728.04" y2="498.835" class="chartlet-flow-inner"/><text x="604.8" y="515.835" text-anchor="start" class="chartlet-class-member">+ code: String</text><text x="604.8" y="530.835" text-anchor="start" class="chartlet-class-member">+ percent: Decimal</text></g><g class="chartlet-f chartlet-n-5 chartlet-f-2 chartlet-f-5"><rect x="394.08" y="672.5" width="111.84" height="74" class="chartlet-diagram-shadow"/><rect x="394.08" y="670" width="111.84" height="74" class="chartlet-flow-node chartlet-role-blue chartlet-class"><title>Reminder</title></rect><text x="450" y="696" text-anchor="middle" class="chartlet-flow-label">Reminder</text><line x1="394.08" y1="702" x2="505.92" y2="702" class="chartlet-flow-inner"/><text x="406.08" y="719" text-anchor="start" class="chartlet-class-member">+ level: Int</text><text x="406.08" y="734" text-anchor="start" class="chartlet-class-member">+ sentAt: Date</text></g></svg><label class="chartlet-hotspot" id="chartlet-6dde3ab5de8f2092-hs-0" for="chartlet-6dde3ab5de8f2092-focus-0"></label><label class="chartlet-hotspot" id="chartlet-6dde3ab5de8f2092-hs-1" for="chartlet-6dde3ab5de8f2092-focus-1"></label><label class="chartlet-hotspot" id="chartlet-6dde3ab5de8f2092-hs-2" for="chartlet-6dde3ab5de8f2092-focus-2"></label><label class="chartlet-hotspot" id="chartlet-6dde3ab5de8f2092-hs-3" for="chartlet-6dde3ab5de8f2092-focus-3"></label><label class="chartlet-hotspot" id="chartlet-6dde3ab5de8f2092-hs-4" for="chartlet-6dde3ab5de8f2092-focus-4"></label><label class="chartlet-hotspot" id="chartlet-6dde3ab5de8f2092-hs-5" for="chartlet-6dde3ab5de8f2092-focus-5"></label></div><p class="chartlet-source">Source: Illustrative domain model</p><details class="chartlet-data" data-viz-text><summary>Show chart data</summary><table><caption>Data for Orders and their invoices</caption><thead><tr><th scope="col">Item</th><th scope="col">Kind</th><th scope="col">Package</th><th scope="col">Attributes</th><th scope="col">Methods</th><th scope="col">Relations</th></tr></thead><tbody><tr><th scope="row">Customer</th><td>Class</td><td>Sales</td><td>+ id: Int; + name: String</td><td></td><td>is associated with Order (1 : 0..*) [places]</td></tr><tr><th scope="row">Order</th><td>Class</td><td>Sales</td><td>+ id: Int; + placedAt: Date</td><td>+ total(): Money</td><td>is associated with Invoice (1 : 1..*) [billed as]</td></tr><tr><th scope="row">Invoice</th><td>Class</td><td>Billing</td><td>+ number: String; + issuedAt: Date</td><td>+ total(): Money</td><td>is composed of InvoiceLine (1 : 1..*) [lists]; is associated with Reminder (1 : 0..3) [dunned by]</td></tr><tr><th scope="row">InvoiceLine</th><td>Class</td><td>Billing</td><td>+ quantity: Int; + net: Money</td><td></td><td>is associated with TaxRate (* : 1) [taxed at]</td></tr><tr><th scope="row">TaxRate</th><td>Class</td><td>Billing</td><td>+ code: String; + percent: Decimal</td><td></td><td></td></tr><tr><th scope="row">Reminder</th><td>Class</td><td></td><td>+ level: Int; + sentAt: Date</td><td></td><td></td></tr></tbody></table></details></figure></div>