<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-50825df0f2710c49 .chartlet-f{opacity:.18}#chartlet-50825df0f2710c49-hs-0{left:35.926%;top:1.395%;width:17.307%;height:13.488%}#chartlet-50825df0f2710c49-hs-1{left:37.692%;top:31.207%;width:13.773%;height:15.233%}#chartlet-50825df0f2710c49-hs-2{left:17.834%;top:64.185%;width:12.24%;height:8.605%}#chartlet-50825df0f2710c49-hs-3{left:17.761%;top:85%;width:12.387%;height:10.349%}#chartlet-50825df0f2710c49-hs-4{left:57.959%;top:64.243%;width:25.613%;height:8.488%}#chartlet-50825df0f2710c49-hs-5{left:57.959%;top:85.174%;width:25.613%;height:10%}#chartlet-50825df0f2710c49-hs-6{left:33.186%;top:61.627%;width:11.662%;height:13.721%}.chartlet-wrapper:has(#chartlet-50825df0f2710c49-focus-0:checked) #chartlet-50825df0f2710c49 .chartlet-f-0{opacity:1}.chartlet-wrapper:has(#chartlet-50825df0f2710c49-focus-0:checked) #chartlet-50825df0f2710c49 .chartlet-n-0 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-50825df0f2710c49-focus-0:checked) #chartlet-50825df0f2710c49 .chartlet-n-0 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-50825df0f2710c49-focus-1:checked) #chartlet-50825df0f2710c49 .chartlet-f-1{opacity:1}.chartlet-wrapper:has(#chartlet-50825df0f2710c49-focus-1:checked) #chartlet-50825df0f2710c49 .chartlet-n-1 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-50825df0f2710c49-focus-1:checked) #chartlet-50825df0f2710c49 .chartlet-n-1 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-50825df0f2710c49-focus-2:checked) #chartlet-50825df0f2710c49 .chartlet-f-2{opacity:1}.chartlet-wrapper:has(#chartlet-50825df0f2710c49-focus-2:checked) #chartlet-50825df0f2710c49 .chartlet-n-2 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-50825df0f2710c49-focus-2:checked) #chartlet-50825df0f2710c49 .chartlet-n-2 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-50825df0f2710c49-focus-3:checked) #chartlet-50825df0f2710c49 .chartlet-f-3{opacity:1}.chartlet-wrapper:has(#chartlet-50825df0f2710c49-focus-3:checked) #chartlet-50825df0f2710c49 .chartlet-n-3 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-50825df0f2710c49-focus-3:checked) #chartlet-50825df0f2710c49 .chartlet-n-3 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-50825df0f2710c49-focus-4:checked) #chartlet-50825df0f2710c49 .chartlet-f-4{opacity:1}.chartlet-wrapper:has(#chartlet-50825df0f2710c49-focus-4:checked) #chartlet-50825df0f2710c49 .chartlet-n-4 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-50825df0f2710c49-focus-4:checked) #chartlet-50825df0f2710c49 .chartlet-n-4 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-50825df0f2710c49-focus-5:checked) #chartlet-50825df0f2710c49 .chartlet-f-5{opacity:1}.chartlet-wrapper:has(#chartlet-50825df0f2710c49-focus-5:checked) #chartlet-50825df0f2710c49 .chartlet-n-5 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-50825df0f2710c49-focus-5:checked) #chartlet-50825df0f2710c49 .chartlet-n-5 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-50825df0f2710c49-focus-6:checked) #chartlet-50825df0f2710c49 .chartlet-f-6{opacity:1}.chartlet-wrapper:has(#chartlet-50825df0f2710c49-focus-6:checked) #chartlet-50825df0f2710c49 .chartlet-n-6 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-50825df0f2710c49-focus-6:checked) #chartlet-50825df0f2710c49 .chartlet-n-6 .chartlet-seq-box{stroke-width:3}</style><details class="chartlet-focus"><summary>Focus</summary><fieldset><label><input type="radio" name="chartlet-50825df0f2710c49-focus" checked> Show all</label><label><input type="radio" name="chartlet-50825df0f2710c49-focus" class="chartlet-focus-node" id="chartlet-50825df0f2710c49-focus-0"> Customer</label><label><input type="radio" name="chartlet-50825df0f2710c49-focus" class="chartlet-focus-node" id="chartlet-50825df0f2710c49-focus-1"> Order</label><label><input type="radio" name="chartlet-50825df0f2710c49-focus" class="chartlet-focus-node" id="chartlet-50825df0f2710c49-focus-2"> OrderLine</label><label><input type="radio" name="chartlet-50825df0f2710c49-focus" class="chartlet-focus-node" id="chartlet-50825df0f2710c49-focus-3"> Product</label><label><input type="radio" name="chartlet-50825df0f2710c49-focus" class="chartlet-focus-node" id="chartlet-50825df0f2710c49-focus-4"> Payment</label><label><input type="radio" name="chartlet-50825df0f2710c49-focus" class="chartlet-focus-node" id="chartlet-50825df0f2710c49-focus-5"> CardPayment</label><label><input type="radio" name="chartlet-50825df0f2710c49-focus" class="chartlet-focus-node" id="chartlet-50825df0f2710c49-focus-6"> Status</label></fieldset></details><figure class="chartlet-figure" data-viz="chart"><figcaption>Shop modules</figcaption><div class="chartlet-stage"><svg xmlns="http://www.w3.org/2000/svg" width="900" height="860" viewBox="0 0 900 860" id="chartlet-50825df0f2710c49" role="img" aria-labelledby="chartlet-50825df0f2710c49-title chartlet-50825df0f2710c49-description" class="chartlet-root"><title id="chartlet-50825df0f2710c49-title">Shop modules</title><desc id="chartlet-50825df0f2710c49-description">Class diagram with 7 classes and 6 relations in 4 packages. Shop: Ordering, Catalog. Ordering (in Shop): Order, OrderLine, Status. Catalog (in Shop): Product. Billing: Payment, CardPayment. Most connected: Order (4 connections). Bottleneck: Order; without it the diagram falls apart. Customer: 3 attributes, 1 method. Customer is associated with Order (1 : 0..*) [places]. Order: 3 attributes, 2 methods. Order is composed of OrderLine (1 : 1..*); depends on Payment [paid by]; depends on Status. OrderLine: 2 attributes, 0 methods. OrderLine is associated with Product (* : 1). Product: 3 attributes, 0 methods. Payment: 0 attributes, 1 method. CardPayment: 1 attribute, 1 method. CardPayment implements Payment. Status: 4 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-50825df0f2710c49 .chartlet-title{font-size:22px;font-weight:650;fill:var(--chartlet-text)}#chartlet-50825df0f2710c49 .chartlet-label,#chartlet-50825df0f2710c49 .chartlet-tick,#chartlet-50825df0f2710c49 .chartlet-value,#chartlet-50825df0f2710c49 .chartlet-value-inverse,#chartlet-50825df0f2710c49 .chartlet-axis-title{font-size:12px;fill:var(--chartlet-muted)}#chartlet-50825df0f2710c49 .chartlet-value,#chartlet-50825df0f2710c49 .chartlet-value-inverse{font-weight:600}#chartlet-50825df0f2710c49 .chartlet-value{fill:var(--chartlet-text)}#chartlet-50825df0f2710c49 .chartlet-value-inverse{fill:var(--chartlet-background)}#chartlet-50825df0f2710c49 .chartlet-axis-title{font-weight:600}#chartlet-50825df0f2710c49 .chartlet-grid{stroke:var(--chartlet-grid);stroke-width:1}#chartlet-50825df0f2710c49 .chartlet-zero{stroke:var(--chartlet-zero);stroke-width:1.5}#chartlet-50825df0f2710c49 .chartlet-bar,#chartlet-50825df0f2710c49 .chartlet-point{fill:var(--chartlet-accent)}#chartlet-50825df0f2710c49 .chartlet-line{fill:none;stroke:var(--chartlet-accent);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}#chartlet-50825df0f2710c49 .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-50825df0f2710c49 .chartlet-role-blue{fill:var(--chartlet-role-blue-fill);stroke:var(--chartlet-role-blue)}#chartlet-50825df0f2710c49 .chartlet-role-green{fill:var(--chartlet-role-green-fill);stroke:var(--chartlet-role-green)}#chartlet-50825df0f2710c49 .chartlet-role-amber{fill:var(--chartlet-role-amber-fill);stroke:var(--chartlet-role-amber)}#chartlet-50825df0f2710c49 .chartlet-role-teal{fill:var(--chartlet-role-teal-fill);stroke:var(--chartlet-role-teal)}#chartlet-50825df0f2710c49 .chartlet-role-violet{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet)}#chartlet-50825df0f2710c49 .chartlet-role-gray{fill:var(--chartlet-role-gray-fill);stroke:var(--chartlet-role-gray)}#chartlet-50825df0f2710c49 .chartlet-role-red{fill:var(--chartlet-role-red-fill);stroke:var(--chartlet-role-red)}#chartlet-50825df0f2710c49 .chartlet-diagram-rim{fill:none;stroke:var(--chartlet-role-teal);stroke-width:1.5}#chartlet-50825df0f2710c49 .chartlet-diagram-shadow{fill:var(--chartlet-shadow);stroke:none;rx:7px}#chartlet-50825df0f2710c49 .chartlet-diagram-chip{fill:var(--chartlet-background);stroke:var(--chartlet-grid);stroke-width:1;rx:4px}#chartlet-50825df0f2710c49 .chartlet-diagram-chip-text{font-size:12px;fill:var(--chartlet-text)}#chartlet-50825df0f2710c49 .chartlet-diagram-badge{fill:var(--chartlet-accent);stroke:var(--chartlet-background);stroke-width:2}#chartlet-50825df0f2710c49 .chartlet-diagram-badge-text{font-size:10px;font-weight:700;fill:var(--chartlet-background)}#chartlet-50825df0f2710c49 .chartlet-flow-node{stroke-width:1.5;stroke-linejoin:round;rx:7px}#chartlet-50825df0f2710c49 .chartlet-flow-start{stroke-width:2}#chartlet-50825df0f2710c49 .chartlet-flow-end{stroke-width:3}#chartlet-50825df0f2710c49 .chartlet-flow-external{stroke-dasharray:5 3}#chartlet-50825df0f2710c49 .chartlet-flow-inner{stroke:var(--chartlet-role-blue);stroke-width:1}#chartlet-50825df0f2710c49 .chartlet-flow-label{font-size:13px;font-weight:600;fill:var(--chartlet-text)}#chartlet-50825df0f2710c49 .chartlet-flow-sublabel{font-size:11px;fill:var(--chartlet-muted)}#chartlet-50825df0f2710c49 .chartlet-flow-edge{fill:none;stroke:var(--chartlet-zero);stroke-width:1.4;stroke-linejoin:round}#chartlet-50825df0f2710c49 .chartlet-flow-dashed{stroke-dasharray:5 4}#chartlet-50825df0f2710c49 .chartlet-flow-dotted{stroke-dasharray:1 4;stroke-linecap:round}#chartlet-50825df0f2710c49 .chartlet-flow-main{stroke:var(--chartlet-accent);stroke-width:2.2}#chartlet-50825df0f2710c49 .chartlet-flow-head{fill:var(--chartlet-zero);stroke:var(--chartlet-zero);stroke-width:1;stroke-linejoin:round}#chartlet-50825df0f2710c49 .chartlet-flow-main-head{fill:var(--chartlet-accent);stroke:var(--chartlet-accent)}#chartlet-50825df0f2710c49 .chartlet-flow-lane{fill:var(--chartlet-lane);stroke:var(--chartlet-grid);stroke-width:1}#chartlet-50825df0f2710c49 .chartlet-flow-lane-alt{fill:var(--chartlet-background)}#chartlet-50825df0f2710c49 .chartlet-flow-lane-head{fill:var(--chartlet-lane-head);stroke:none}#chartlet-50825df0f2710c49 .chartlet-flow-lane-label{font-size:11px;font-weight:650;fill:var(--chartlet-muted);letter-spacing:.04em}#chartlet-50825df0f2710c49 .chartlet-flow-group{fill:var(--chartlet-accent);fill-opacity:.04;stroke:var(--chartlet-zero);stroke-width:1;stroke-dasharray:4 3;rx:10px}#chartlet-50825df0f2710c49 .chartlet-flow-group-label{font-size:11px;font-weight:600;fill:var(--chartlet-muted)}#chartlet-50825df0f2710c49 .chartlet-class-member{font-size:12px;fill:var(--chartlet-text)}#chartlet-50825df0f2710c49 .chartlet-flow-card{font-size:11px;fill:var(--chartlet-muted)}#chartlet-50825df0f2710c49 .chartlet-flow-hollow{fill:var(--chartlet-background)}#chartlet-50825df0f2710c49 .chartlet-flow-solid{fill:var(--chartlet-zero)}#chartlet-50825df0f2710c49 .chartlet-flow-open{fill:none;stroke:var(--chartlet-zero);stroke-width:1.4;stroke-linejoin:round}</style><rect x="509.63" y="524.493" width="254.52" height="306.007" class="chartlet-flow-group"/><text x="517.63" y="537.493" text-anchor="start" class="chartlet-flow-group-label">Billing</text><rect x="135.85" y="212.379" width="351.34" height="631.621" class="chartlet-flow-group"/><text x="143.85" y="225.379" text-anchor="start" class="chartlet-flow-group-label">Shop</text><rect x="147.85" y="703" width="135.48" height="129" class="chartlet-flow-group"/><text x="155.85" y="716" text-anchor="start" class="chartlet-flow-group-label">Catalog</text><rect x="148.51" y="240.379" width="326.68" height="419.614" class="chartlet-flow-group"/><text x="156.51" y="253.379" text-anchor="start" class="chartlet-flow-group-label">Ordering</text><g class="chartlet-f chartlet-f-0 chartlet-f-1"><polyline points="401.21,128 401.21,268.379" class="chartlet-flow-edge"><title>Customer → Order: places</title></polyline><text x="389.21" y="264.379" text-anchor="end" class="chartlet-flow-card">0..*</text><text x="389.21" y="140" text-anchor="end" class="chartlet-flow-card">1</text></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><polyline points="377.21,415.379 377.21,454.31 215.59,454.31 215.59,551.993" class="chartlet-flow-edge"><title>Order → OrderLine</title></polyline><text x="203.59" y="547.993" text-anchor="end" class="chartlet-flow-card">1..*</text><polyline points="377.21,399.379 382.21,407.379 377.21,415.379 372.21,407.379 377.21,399.379" class="chartlet-flow-head chartlet-flow-solid"/><text x="365.21" y="427.379" text-anchor="end" class="chartlet-flow-card">1</text></g><g class="chartlet-f chartlet-f-2 chartlet-f-3"><polyline points="215.59,625.993 215.59,731" class="chartlet-flow-edge"><title>OrderLine → Product</title></polyline><text x="203.59" y="727" text-anchor="end" class="chartlet-flow-card">1</text><text x="203.59" y="637.993" text-anchor="end" class="chartlet-flow-card">*</text></g><g class="chartlet-f chartlet-f-4 chartlet-f-5"><polyline points="636.89,637.493 636.89,732.5" class="chartlet-flow-edge chartlet-flow-dashed"><title>Payment → CardPayment</title></polyline><polyline points="636.89,625.493 642.89,637.493 630.89,637.493 636.89,625.493" class="chartlet-flow-head chartlet-flow-hollow"/></g><g class="chartlet-f chartlet-f-1 chartlet-f-4"><polyline points="425.21,399.379 425.21,454.31 636.89,454.31 636.89,544.493" class="chartlet-flow-edge chartlet-flow-dashed"><title>Order → Payment: paid by</title></polyline><polyline points="633.39,544.493 636.89,552.493 640.39,544.493" class="chartlet-flow-open"/></g><g class="chartlet-f chartlet-f-1 chartlet-f-6"><polyline points="401.21,399.379 401.21,466.517 351.15,466.517 351.15,521.993" class="chartlet-flow-edge chartlet-flow-dashed"><title>Order → Status</title></polyline><polyline points="347.65,521.993 351.15,529.993 354.65,521.993" class="chartlet-flow-open"/></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 chartlet-f-4 chartlet-f-6"></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"></g><g class="chartlet-f chartlet-n-4 chartlet-f-1 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-n-6 chartlet-f-1 chartlet-f-6"></g><g class="chartlet-f chartlet-f-0 chartlet-f-1"><rect x="405.21" y="133" width="47.2" height="21" class="chartlet-diagram-chip"/><text x="410.21" y="147" text-anchor="start" class="chartlet-diagram-chip-text">places</text></g><g class="chartlet-f chartlet-f-1 chartlet-f-4"><rect x="429.21" y="404.379" width="51.04" height="21" class="chartlet-diagram-chip"/><text x="434.21" y="418.379" text-anchor="start" class="chartlet-diagram-chip-text">paid by</text></g><g class="chartlet-f chartlet-n-0 chartlet-f-0 chartlet-f-1"><rect x="323.33" y="14.5" width="155.76" height="116" class="chartlet-diagram-shadow"/><rect x="323.33" y="12" width="155.76" height="116" class="chartlet-flow-node chartlet-role-blue chartlet-class"><title>Customer</title></rect><text x="401.21" y="38" text-anchor="middle" class="chartlet-flow-label">Customer</text><line x1="323.33" y1="44" x2="479.09" y2="44" class="chartlet-flow-inner"/><text x="335.33" y="61" text-anchor="start" class="chartlet-class-member">+ id: Int</text><text x="335.33" y="76" text-anchor="start" class="chartlet-class-member">+ name: String</text><text x="335.33" y="91" text-anchor="start" class="chartlet-class-member">+ email: String</text><line x1="323.33" y1="101" x2="479.09" y2="101" class="chartlet-flow-inner"/><text x="335.33" y="118" text-anchor="start" class="chartlet-class-member">+ placeOrder(): Order</text></g><g class="chartlet-f chartlet-n-1 chartlet-f-0 chartlet-f-1 chartlet-f-2 chartlet-f-4 chartlet-f-6"><rect x="339.23" y="270.879" width="123.96" height="131" class="chartlet-diagram-shadow"/><rect x="339.23" y="268.379" width="123.96" height="131" class="chartlet-flow-node chartlet-role-blue chartlet-class"><title>Order</title></rect><text x="401.21" y="294.379" text-anchor="middle" class="chartlet-flow-label">Order</text><line x1="339.23" y1="300.379" x2="463.19" y2="300.379" class="chartlet-flow-inner"/><text x="351.23" y="317.379" text-anchor="start" class="chartlet-class-member">+ id: Int</text><text x="351.23" y="332.379" text-anchor="start" class="chartlet-class-member">+ placedAt: Date</text><text x="351.23" y="347.379" text-anchor="start" class="chartlet-class-member">+ status: Status</text><line x1="339.23" y1="357.379" x2="463.19" y2="357.379" class="chartlet-flow-inner"/><text x="351.23" y="374.379" text-anchor="start" class="chartlet-class-member">+ total(): Money</text><text x="351.23" y="389.379" text-anchor="start" class="chartlet-class-member">+ cancel()</text></g><g class="chartlet-f chartlet-n-2 chartlet-f-1 chartlet-f-2 chartlet-f-3"><rect x="160.51" y="554.493" width="110.16" height="74" class="chartlet-diagram-shadow"/><rect x="160.51" y="551.993" width="110.16" height="74" class="chartlet-flow-node chartlet-role-blue chartlet-class"><title>OrderLine</title></rect><text x="215.59" y="577.993" text-anchor="middle" class="chartlet-flow-label">OrderLine</text><line x1="160.51" y1="583.993" x2="270.67" y2="583.993" class="chartlet-flow-inner"/><text x="172.51" y="600.993" text-anchor="start" class="chartlet-class-member">+ quantity: Int</text><text x="172.51" y="615.993" text-anchor="start" class="chartlet-class-member">+ price: Money</text></g><g class="chartlet-f chartlet-n-3 chartlet-f-2 chartlet-f-3"><rect x="159.85" y="733.5" width="111.48" height="89" class="chartlet-diagram-shadow"/><rect x="159.85" y="731" width="111.48" height="89" class="chartlet-flow-node chartlet-role-blue chartlet-class"><title>Product</title></rect><text x="215.59" y="757" text-anchor="middle" class="chartlet-flow-label">Product</text><line x1="159.85" y1="763" x2="271.33" y2="763" class="chartlet-flow-inner"/><text x="171.85" y="780" text-anchor="start" class="chartlet-class-member">+ sku: String</text><text x="171.85" y="795" text-anchor="start" class="chartlet-class-member">+ name: String</text><text x="171.85" y="810" text-anchor="start" class="chartlet-class-member">+ price: Money</text></g><g class="chartlet-f chartlet-n-4 chartlet-f-1 chartlet-f-4 chartlet-f-5"><rect x="521.63" y="554.993" width="230.52" height="73" class="chartlet-diagram-shadow"/><rect x="521.63" y="552.493" width="230.52" height="73" class="chartlet-flow-node chartlet-role-blue chartlet-class"><title>Payment – «interface»</title></rect><text x="636.89" y="575.493" text-anchor="middle" class="chartlet-flow-sublabel">«interface»</text><text x="636.89" y="592.493" text-anchor="middle" class="chartlet-flow-label">Payment</text><line x1="521.63" y1="598.493" x2="752.15" y2="598.493" class="chartlet-flow-inner"/><text x="533.63" y="615.493" text-anchor="start" class="chartlet-class-member">+ charge(amount: Money): Receipt</text></g><g class="chartlet-f chartlet-n-5 chartlet-f-4 chartlet-f-5"><rect x="521.63" y="735" width="230.52" height="86" class="chartlet-diagram-shadow"/><rect x="521.63" y="732.5" width="230.52" height="86" class="chartlet-flow-node chartlet-role-blue chartlet-class"><title>CardPayment</title></rect><text x="636.89" y="758.5" text-anchor="middle" class="chartlet-flow-label">CardPayment</text><line x1="521.63" y1="764.5" x2="752.15" y2="764.5" class="chartlet-flow-inner"/><text x="533.63" y="781.5" text-anchor="start" class="chartlet-class-member">- number: String</text><line x1="521.63" y1="791.5" x2="752.15" y2="791.5" class="chartlet-flow-inner"/><text x="533.63" y="808.5" text-anchor="start" class="chartlet-class-member">+ charge(amount: Money): Receipt</text></g><g class="chartlet-f chartlet-n-6 chartlet-f-1 chartlet-f-6"><rect x="298.67" y="532.493" width="104.96" height="118" class="chartlet-diagram-shadow"/><rect x="298.67" y="529.993" width="104.96" height="118" class="chartlet-flow-node chartlet-role-blue chartlet-class"><title>Status – «enumeration»</title></rect><text x="351.15" y="552.993" text-anchor="middle" class="chartlet-flow-sublabel">«enumeration»</text><text x="351.15" y="569.993" text-anchor="middle" class="chartlet-flow-label">Status</text><line x1="298.67" y1="575.993" x2="403.63" y2="575.993" class="chartlet-flow-inner"/><text x="310.67" y="592.993" text-anchor="start" class="chartlet-class-member">PLACED</text><text x="310.67" y="607.993" text-anchor="start" class="chartlet-class-member">PAID</text><text x="310.67" y="622.993" text-anchor="start" class="chartlet-class-member">SHIPPED</text><text x="310.67" y="637.993" text-anchor="start" class="chartlet-class-member">CANCELLED</text></g></svg><label class="chartlet-hotspot" id="chartlet-50825df0f2710c49-hs-0" for="chartlet-50825df0f2710c49-focus-0"></label><label class="chartlet-hotspot" id="chartlet-50825df0f2710c49-hs-1" for="chartlet-50825df0f2710c49-focus-1"></label><label class="chartlet-hotspot" id="chartlet-50825df0f2710c49-hs-2" for="chartlet-50825df0f2710c49-focus-2"></label><label class="chartlet-hotspot" id="chartlet-50825df0f2710c49-hs-3" for="chartlet-50825df0f2710c49-focus-3"></label><label class="chartlet-hotspot" id="chartlet-50825df0f2710c49-hs-4" for="chartlet-50825df0f2710c49-focus-4"></label><label class="chartlet-hotspot" id="chartlet-50825df0f2710c49-hs-5" for="chartlet-50825df0f2710c49-focus-5"></label><label class="chartlet-hotspot" id="chartlet-50825df0f2710c49-hs-6" for="chartlet-50825df0f2710c49-focus-6"></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 Shop modules</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></td><td>+ id: Int; + name: String; + email: String</td><td>+ placeOrder(): Order</td><td>is associated with Order (1 : 0..*) [places]</td></tr><tr><th scope="row">Order</th><td>Class</td><td>Shop › Ordering</td><td>+ id: Int; + placedAt: Date; + status: Status</td><td>+ total(): Money; + cancel()</td><td>is composed of OrderLine (1 : 1..*); depends on Payment [paid by]; depends on Status</td></tr><tr><th scope="row">OrderLine</th><td>Class</td><td>Shop › Ordering</td><td>+ quantity: Int; + price: Money</td><td></td><td>is associated with Product (* : 1)</td></tr><tr><th scope="row">Product</th><td>Class</td><td>Shop › Catalog</td><td>+ sku: String; + name: String; + price: Money</td><td></td><td></td></tr><tr><th scope="row">Payment</th><td>Interface</td><td>Billing</td><td></td><td>+ charge(amount: Money): Receipt</td><td></td></tr><tr><th scope="row">CardPayment</th><td>Class</td><td>Billing</td><td>- number: String</td><td>+ charge(amount: Money): Receipt</td><td>implements Payment</td></tr><tr><th scope="row">Status</th><td>Enumeration</td><td>Shop › Ordering</td><td>PLACED; PAID; SHIPPED; CANCELLED</td><td></td><td></td></tr></tbody></table></details></figure></div>